@remnic/core 9.65.8 → 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 (637) hide show
  1. package/dist/access-admin-ops-surface.d.ts +11 -12
  2. package/dist/access-admin-ops-surface.js +49 -46
  3. package/dist/access-authorization-probe.d.ts +11 -12
  4. package/dist/access-authorization-probe.js +50 -47
  5. package/dist/access-boundary.d.ts +11 -12
  6. package/dist/access-boundary.js +49 -46
  7. package/dist/access-citation-namespace.js +3 -3
  8. package/dist/access-cli.js +111 -106
  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 +49 -46
  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 +51 -48
  20. package/dist/access-http.d.ts +12 -13
  21. package/dist/access-http.js +68 -65
  22. package/dist/access-identity-continuity-surface.d.ts +9 -10
  23. package/dist/access-identity-continuity-surface.js +49 -46
  24. package/dist/access-lcm-surface.d.ts +11 -12
  25. package/dist/access-lcm-surface.js +49 -46
  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 +62 -59
  29. package/dist/access-memory-search-fanout.d.ts +2 -3
  30. package/dist/{access-namespace-preflight-CpAOrS-9.d.ts → access-namespace-preflight-CLWUoMyW.d.ts} +1 -1
  31. package/dist/access-namespace-preflight.d.ts +3 -4
  32. package/dist/access-namespace-preflight.js +49 -46
  33. package/dist/access-observe-write-surface.d.ts +11 -12
  34. package/dist/access-observe-write-surface.js +49 -46
  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 +54 -51
  38. package/dist/access-operations.d.ts +17 -18
  39. package/dist/access-operations.js +59 -56
  40. package/dist/access-recall-concurrency.d.ts +11 -12
  41. package/dist/access-recall-concurrency.js +49 -46
  42. package/dist/access-recall-response.d.ts +11 -12
  43. package/dist/access-recall-response.js +49 -46
  44. package/dist/access-recall-surface.d.ts +11 -12
  45. package/dist/access-recall-surface.js +49 -46
  46. package/dist/access-schema.d.ts +83 -83
  47. package/dist/access-schema.js +7 -7
  48. package/dist/{access-service-Diu61Cfv.d.ts → access-service-CEUE1Isj.d.ts} +66 -66
  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 +49 -46
  52. package/dist/access-surface-catalog.d.ts +11 -12
  53. package/dist/access-surface-catalog.js +53 -48
  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/ambient-provenance.d.ts +1 -2
  62. package/dist/artifact-search.d.ts +1 -2
  63. package/dist/{auto-sync-2YPITIWN.js → auto-sync-Q6Q2FVSC.js} +9 -9
  64. package/dist/behavior-learner.d.ts +1 -2
  65. package/dist/behavior-signals.d.ts +1 -2
  66. package/dist/bootstrap.d.ts +9 -10
  67. package/dist/briefing-window.d.ts +2 -3
  68. package/dist/briefing.d.ts +2 -3
  69. package/dist/briefing.js +23 -23
  70. package/dist/buffer-surprise-report.d.ts +1 -2
  71. package/dist/buffer-turn-helpers.d.ts +1 -2
  72. package/dist/buffer.d.ts +2 -3
  73. package/dist/buffer.js +20 -4
  74. package/dist/bulk-import/index.d.ts +3 -4
  75. package/dist/calibration.d.ts +1 -2
  76. package/dist/calibration.js +1 -1
  77. package/dist/capabilities.d.ts +1 -2
  78. package/dist/{capsule-merge-SGIVB3WA.js → capsule-merge-SEHERWWP.js} +4 -4
  79. package/dist/{catalog-9f-vEQLS.d.ts → catalog-D1HgugTA.d.ts} +1 -1
  80. package/dist/causal-behavior.d.ts +1 -2
  81. package/dist/causal-consolidation.d.ts +1 -2
  82. package/dist/causal-consolidation.js +24 -24
  83. package/dist/causal-trajectory-graph.d.ts +1 -2
  84. package/dist/{chunk-LEPOP46W.js → chunk-227UFSEQ.js} +4 -4
  85. package/dist/{chunk-NPFUNWNX.js → chunk-23CVL7HS.js} +2 -2
  86. package/dist/{chunk-PO7NXBG2.js → chunk-2GF27PGH.js} +5 -5
  87. package/dist/{chunk-MY2BC6UE.js → chunk-2LBAFHOQ.js} +11 -11
  88. package/dist/{chunk-AZMLH5UT.js → chunk-33MFRY25.js} +2 -2
  89. package/dist/{chunk-UEBDCMOO.js → chunk-3TSU662L.js} +3 -3
  90. package/dist/{chunk-CAMNRAJF.js → chunk-4FHRZD5T.js} +2 -2
  91. package/dist/{chunk-FP7YTTVO.js → chunk-4OFKZAJG.js} +2 -1
  92. package/dist/chunk-4OFKZAJG.js.map +1 -0
  93. package/dist/{chunk-S5XOSTYM.js → chunk-4STAANV7.js} +3 -3
  94. package/dist/{chunk-LKYIOCWL.js → chunk-56IV4J5W.js} +546 -96
  95. package/dist/chunk-56IV4J5W.js.map +1 -0
  96. package/dist/{chunk-4F4AQFWL.js → chunk-6CEGSTBD.js} +10 -10
  97. package/dist/{chunk-JYSN42VN.js → chunk-6QDXA26G.js} +235 -181
  98. package/dist/chunk-6QDXA26G.js.map +1 -0
  99. package/dist/{chunk-MDD2RINF.js → chunk-6RUHELWR.js} +3 -3
  100. package/dist/{chunk-WNXYT4MK.js → chunk-72OIT7KS.js} +4 -4
  101. package/dist/{chunk-KQAFEZQX.js → chunk-7LCGFUMB.js} +4 -4
  102. package/dist/{chunk-SNOIKAHM.js → chunk-7UTDHQZ5.js} +3 -3
  103. package/dist/{chunk-5HK3CJAR.js → chunk-7XOG75AU.js} +3 -3
  104. package/dist/{chunk-7BDZTALN.js → chunk-AJTG3CP7.js} +12 -2
  105. package/dist/chunk-AJTG3CP7.js.map +1 -0
  106. package/dist/{chunk-2LWQSV6A.js → chunk-AL3UYZ5N.js} +3 -2
  107. package/dist/chunk-AL3UYZ5N.js.map +1 -0
  108. package/dist/{chunk-UPFNQJC7.js → chunk-CN4VKV3S.js} +2 -2
  109. package/dist/{chunk-PMVPCZJZ.js → chunk-CTCGHNWN.js} +6 -6
  110. package/dist/{chunk-EGBDFJ36.js → chunk-DD5JFCWM.js} +2 -2
  111. package/dist/{chunk-XBGHAAKR.js → chunk-DDX6KIXF.js} +2 -2
  112. package/dist/{chunk-JIYDRBVZ.js → chunk-DJORULH3.js} +2 -2
  113. package/dist/{chunk-UENKPWCS.js → chunk-DMEHOEC7.js} +6 -6
  114. package/dist/{chunk-7KQB4EBS.js → chunk-DUAJKRR2.js} +2 -2
  115. package/dist/{chunk-XDL5CYZN.js → chunk-EEOUMG3J.js} +2 -1
  116. package/dist/{chunk-XDL5CYZN.js.map → chunk-EEOUMG3J.js.map} +1 -1
  117. package/dist/{chunk-SEEJOGQX.js → chunk-EFQCDJZ2.js} +4 -4
  118. package/dist/{chunk-Q57GOHLF.js → chunk-EGALNSZ4.js} +3 -3
  119. package/dist/{chunk-KCT36JAW.js → chunk-ESNFSSO4.js} +2 -2
  120. package/dist/{chunk-XQ3HXAQH.js → chunk-ET2CNMLD.js} +4 -4
  121. package/dist/{chunk-PU56CXZA.js → chunk-EZSCW4EM.js} +2 -2
  122. package/dist/{chunk-HMZKGHMD.js → chunk-FESUGFIL.js} +3 -3
  123. package/dist/{chunk-3A2NJP2U.js → chunk-FKKGCGYL.js} +3 -3
  124. package/dist/{chunk-BWGCOLEL.js → chunk-FTTJRVB7.js} +2 -2
  125. package/dist/{chunk-ODU2CNNX.js → chunk-FYWLSFFS.js} +2 -2
  126. package/dist/{chunk-W2BAGGEW.js → chunk-GEJKYA7D.js} +33 -24
  127. package/dist/{chunk-W2BAGGEW.js.map → chunk-GEJKYA7D.js.map} +1 -1
  128. package/dist/chunk-GSKINLAK.js +267 -0
  129. package/dist/chunk-GSKINLAK.js.map +1 -0
  130. package/dist/{chunk-3PKAS6VL.js → chunk-GX6FTSYH.js} +2 -2
  131. package/dist/{chunk-76DIF5KT.js → chunk-H7VDIF2V.js} +2 -2
  132. package/dist/{chunk-F7XUD3PL.js → chunk-HJXA6ZM7.js} +2 -2
  133. package/dist/{chunk-4QEYREAV.js → chunk-HNPE66LB.js} +2 -2
  134. package/dist/{chunk-P36Z4JRA.js → chunk-I5VB44ZK.js} +2 -2
  135. package/dist/{chunk-EUYWQ7TS.js → chunk-IEZ6CGTW.js} +2 -2
  136. package/dist/{chunk-OXRRJXPR.js → chunk-IHGMRDEE.js} +275 -1678
  137. package/dist/chunk-IHGMRDEE.js.map +1 -0
  138. package/dist/{chunk-5DHKCO52.js → chunk-IVIAHQBR.js} +2 -2
  139. package/dist/{chunk-TFR3HG4K.js → chunk-J3OND5QT.js} +4 -4
  140. package/dist/{chunk-UW5NPZJ2.js → chunk-JALOAKSZ.js} +59 -7
  141. package/dist/chunk-JALOAKSZ.js.map +1 -0
  142. package/dist/{chunk-5ACCD4L7.js → chunk-JRRQ747T.js} +7 -7
  143. package/dist/{chunk-V4IDF3EZ.js → chunk-JTWZKNUH.js} +5 -5
  144. package/dist/chunk-K66OY4EI.js +202 -0
  145. package/dist/chunk-K66OY4EI.js.map +1 -0
  146. package/dist/{chunk-XAB6STPO.js → chunk-KODXCHXJ.js} +17 -3
  147. package/dist/chunk-KODXCHXJ.js.map +1 -0
  148. package/dist/{chunk-KZIF6XHX.js → chunk-KXIXO76C.js} +28 -15
  149. package/dist/chunk-KXIXO76C.js.map +1 -0
  150. package/dist/{chunk-5RWZH6PH.js → chunk-L4X4PJYK.js} +2 -2
  151. package/dist/{chunk-UTQUEHC7.js → chunk-LUDBXTBJ.js} +8 -8
  152. package/dist/{chunk-XNWXSGHS.js → chunk-MAH64N55.js} +28 -10
  153. package/dist/chunk-MAH64N55.js.map +1 -0
  154. package/dist/{chunk-LDKPDODJ.js → chunk-ME35HVDJ.js} +2 -2
  155. package/dist/{chunk-DPCXDG7G.js → chunk-MJRGVXPQ.js} +2 -2
  156. package/dist/{chunk-773TRRGT.js → chunk-MJUCDM3C.js} +2 -2
  157. package/dist/{chunk-T6ILXUAH.js → chunk-MN5NOOI7.js} +2 -2
  158. package/dist/{chunk-AHPIFKNG.js → chunk-N4F7ZSSG.js} +2 -2
  159. package/dist/{chunk-JOZUBF4A.js → chunk-NACLNNFQ.js} +2 -2
  160. package/dist/{chunk-LC2BDILZ.js → chunk-NBP4EX5N.js} +2 -2
  161. package/dist/{chunk-ZVPVTPGI.js → chunk-NNZFPYYX.js} +4 -4
  162. package/dist/{chunk-DA7ITC5Z.js → chunk-O57GM3FR.js} +2 -2
  163. package/dist/{chunk-7VZFRUQU.js → chunk-O7ERGZDA.js} +5 -5
  164. package/dist/{chunk-3SZD4CYO.js → chunk-OAJMQKQR.js} +3 -3
  165. package/dist/{chunk-HSZMX3ZJ.js → chunk-ODW5GDFE.js} +2 -2
  166. package/dist/{chunk-7WOWGRAU.js → chunk-PEBH5DCK.js} +10 -7
  167. package/dist/{chunk-7WOWGRAU.js.map → chunk-PEBH5DCK.js.map} +1 -1
  168. package/dist/{chunk-J2WC5LF4.js → chunk-QBC33MPY.js} +2 -1
  169. package/dist/{chunk-T7XP6IZE.js → chunk-QCRJMU5V.js} +2 -2
  170. package/dist/chunk-QJCWK2A7.js +1466 -0
  171. package/dist/chunk-QJCWK2A7.js.map +1 -0
  172. package/dist/{chunk-YEUXERJ6.js → chunk-RDGKVH6T.js} +7 -3
  173. package/dist/{chunk-YEUXERJ6.js.map → chunk-RDGKVH6T.js.map} +1 -1
  174. package/dist/{chunk-OA2O2GJ4.js → chunk-RZ3IZIJG.js} +3 -3
  175. package/dist/{chunk-UL4MKZHI.js → chunk-SN4JXNLL.js} +2 -2
  176. package/dist/chunk-TB2MJRI6.js +866 -0
  177. package/dist/chunk-TB2MJRI6.js.map +1 -0
  178. package/dist/{chunk-7PHI6GUI.js → chunk-TEZ2HTC7.js} +42 -2
  179. package/dist/chunk-TEZ2HTC7.js.map +1 -0
  180. package/dist/{chunk-CPA5NBHN.js → chunk-TNGH4ZYI.js} +2 -2
  181. package/dist/{chunk-F3NVYTTA.js → chunk-TNXNECAN.js} +6 -6
  182. package/dist/{chunk-BEC4YBNA.js → chunk-TVW4C7PV.js} +2 -2
  183. package/dist/{chunk-UFKPQBXH.js → chunk-U62OK7BB.js} +2 -2
  184. package/dist/{chunk-AX7UXCHJ.js → chunk-UYA36DQ7.js} +2 -1
  185. package/dist/chunk-UYA36DQ7.js.map +1 -0
  186. package/dist/{chunk-DEACDKE3.js → chunk-VCKWULAK.js} +112 -87
  187. package/dist/chunk-VCKWULAK.js.map +1 -0
  188. package/dist/chunk-VOSWUO3K.js +100 -0
  189. package/dist/chunk-VOSWUO3K.js.map +1 -0
  190. package/dist/{chunk-TUHBYJXL.js → chunk-VQ4AMTGZ.js} +1 -1
  191. package/dist/{chunk-3BCULS4U.js → chunk-VQNRICAQ.js} +145 -507
  192. package/dist/chunk-VQNRICAQ.js.map +1 -0
  193. package/dist/{chunk-H2YSH3DG.js → chunk-WKAXBXVA.js} +2 -2
  194. package/dist/{chunk-HRHO3ZNG.js → chunk-WKJFIMVN.js} +2 -2
  195. package/dist/{chunk-SXIMQLGV.js → chunk-WVGXCBOC.js} +2 -2
  196. package/dist/{chunk-CRML27CO.js → chunk-X5YYSAZX.js} +4 -4
  197. package/dist/{chunk-FZEEWOI2.js → chunk-XJJYSX6F.js} +2 -2
  198. package/dist/{chunk-U7EW2W4W.js → chunk-XKNHFDTT.js} +26 -6
  199. package/dist/chunk-XKNHFDTT.js.map +1 -0
  200. package/dist/{chunk-UG6VXIOK.js → chunk-XSTNGNJP.js} +2 -2
  201. package/dist/{chunk-YDPAE2RD.js → chunk-YFLLGRXO.js} +2 -2
  202. package/dist/{chunk-LPNCR4QK.js → chunk-YXFCALVT.js} +12 -12
  203. package/dist/{chunk-Q4WONDMJ.js → chunk-YYGZJPOK.js} +2 -2
  204. package/dist/{chunk-GTO56JY5.js → chunk-ZJPM7GZ3.js} +2 -2
  205. package/dist/{chunk-LOXHYCVS.js → chunk-ZW4VXELZ.js} +2 -2
  206. package/dist/{cli-O3F-ht3i.d.ts → cli-BEkm2MEf.d.ts} +5 -5
  207. package/dist/cli.d.ts +13 -14
  208. package/dist/cli.js +90 -85
  209. package/dist/coding/export-okf-codegraph.d.ts +56 -0
  210. package/dist/coding/export-okf-codegraph.js +526 -0
  211. package/dist/coding/export-okf-codegraph.js.map +1 -0
  212. package/dist/coding/pre-action-gate.d.ts +1 -2
  213. package/dist/compounding/engine.d.ts +2 -3
  214. package/dist/compounding/engine.js +24 -24
  215. package/dist/compounding/preference-consolidator.d.ts +1 -2
  216. package/dist/compression-optimizer.d.ts +1 -2
  217. package/dist/config.d.ts +1 -2
  218. package/dist/config.js +11 -11
  219. package/dist/connectors/codex-materialize-runner.d.ts +1 -2
  220. package/dist/connectors/codex-materialize-runner.js +23 -23
  221. package/dist/connectors/codex-materialize.d.ts +1 -2
  222. package/dist/connectors/index.d.ts +1 -2
  223. package/dist/connectors/index.js +23 -23
  224. package/dist/consolidation-provenance-check.d.ts +2 -3
  225. package/dist/consolidation-provenance-check.js +4 -4
  226. package/dist/consolidation-undo.d.ts +2 -3
  227. package/dist/consolidation-undo.js +3 -3
  228. package/dist/contradiction/index.d.ts +3 -4
  229. package/dist/contradiction/index.js +9 -9
  230. package/dist/{contradiction-scan-AKUWPX5N.js → contradiction-scan-NOYMFG66.js} +3 -3
  231. package/dist/converge-config.d.ts +1 -2
  232. package/dist/convergence-refresh.d.ts +2 -3
  233. package/dist/convergence-refresh.js +25 -25
  234. package/dist/conversation-index/backend.d.ts +1 -2
  235. package/dist/conversation-index/backend.js +2 -2
  236. package/dist/conversation-index/chunker.d.ts +1 -2
  237. package/dist/conversation-index/faiss-adapter.d.ts +1 -2
  238. package/dist/conversation-index/indexer.d.ts +1 -2
  239. package/dist/conversation-index/search.d.ts +1 -2
  240. package/dist/corpus-watermark.d.ts +1 -2
  241. package/dist/corpus-watermark.js +25 -25
  242. package/dist/cross-lingual-recall.d.ts +1 -2
  243. package/dist/day-summary.d.ts +1 -2
  244. package/dist/delinearize.d.ts +1 -2
  245. package/dist/dependency-propagation-config.d.ts +1 -2
  246. package/dist/{dependency-propagation-delivery-CL6RWXTA.d.ts → dependency-propagation-delivery-BCpeo14F.d.ts} +1 -1
  247. package/dist/direct-answer-wiring.d.ts +1 -2
  248. package/dist/direct-answer.d.ts +1 -2
  249. package/dist/embedding-fallback.d.ts +1 -2
  250. package/dist/enrichment/index.d.ts +1 -2
  251. package/dist/entity-origin-fields.d.ts +1 -2
  252. package/dist/entity-retrieval.d.ts +2 -3
  253. package/dist/entity-retrieval.js +23 -23
  254. package/dist/entity-schema.d.ts +1 -2
  255. package/dist/episodic-context.d.ts +1 -2
  256. package/dist/eval-trajectory-contracts.d.ts +1 -2
  257. package/dist/eval-trajectory-store.d.ts +1 -2
  258. package/dist/eval-trajectory.d.ts +1 -2
  259. package/dist/explicit-capture.d.ts +9 -10
  260. package/dist/explicit-capture.js +11 -11
  261. package/dist/external-wiki-access.d.ts +11 -12
  262. package/dist/external-wiki-access.js +50 -47
  263. package/dist/external-wiki-collection-registration.d.ts +1 -2
  264. package/dist/external-wiki-collection.d.ts +1 -2
  265. package/dist/external-wiki-mcp-tools.d.ts +11 -12
  266. package/dist/extraction-error-classification.d.ts +1 -2
  267. package/dist/extraction-faithfulness.d.ts +1 -2
  268. package/dist/extraction-faithfulness.js +2 -2
  269. package/dist/extraction-judge-telemetry.d.ts +1 -2
  270. package/dist/extraction-judge-training.d.ts +1 -2
  271. package/dist/extraction-judge.d.ts +1 -2
  272. package/dist/extraction-judge.js +2 -2
  273. package/dist/extraction-liveness.d.ts +1 -2
  274. package/dist/extraction-normalization.d.ts +1 -2
  275. package/dist/extraction-prompt.d.ts +1 -2
  276. package/dist/extraction-source-grounding-rules.d.ts +1 -2
  277. package/dist/extraction-source-grounding.d.ts +1 -2
  278. package/dist/extraction.d.ts +1 -2
  279. package/dist/extraction.js +32 -29
  280. package/dist/fallback-llm.d.ts +7 -2
  281. package/dist/fallback-llm.js +1 -1
  282. package/dist/{first-start-migration-4NETATFF.js → first-start-migration-KHIMCBIC.js} +3 -3
  283. package/dist/graph-dashboard-diff.d.ts +1 -2
  284. package/dist/graph-dashboard-key.d.ts +1 -2
  285. package/dist/graph-dashboard-parser.d.ts +1 -2
  286. package/dist/graph-edge-reinforcement.d.ts +1 -2
  287. package/dist/graph-path-reconstruction.d.ts +1 -2
  288. package/dist/graph-path-scoring.d.ts +1 -2
  289. package/dist/graph-snapshot.d.ts +1 -2
  290. package/dist/graph.d.ts +1 -2
  291. package/dist/harmonic-retrieval.js +1 -1
  292. package/dist/importance.d.ts +1 -2
  293. package/dist/importers/index.d.ts +1 -2
  294. package/dist/in-flight-reads.d.ts +1 -2
  295. package/dist/{index-C7Xep6S9.d.ts → index-D_pyMUaP.d.ts} +2 -2
  296. package/dist/index.d.ts +929 -700
  297. package/dist/index.js +167 -132
  298. package/dist/intent.d.ts +1 -2
  299. package/dist/lcm/engine.d.ts +1 -2
  300. package/dist/lcm/index.d.ts +1 -2
  301. package/dist/lcm/tools.d.ts +1 -2
  302. package/dist/lifecycle.d.ts +1 -2
  303. package/dist/live-connectors-runner.d.ts +1 -2
  304. package/dist/local-llm.d.ts +1 -2
  305. package/dist/local-model-endpoint.d.ts +1 -2
  306. package/dist/location/index.d.ts +315 -6
  307. package/dist/location/index.js +151 -19
  308. package/dist/maintenance/memory-governance.d.ts +1 -2
  309. package/dist/maintenance/memory-governance.js +23 -23
  310. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -3
  311. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +23 -23
  312. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -3
  313. package/dist/maintenance/rebuild-memory-projection.js +24 -24
  314. package/dist/{maintenance-CJ-xqFp0.d.ts → maintenance-DDUX9d6D.d.ts} +3 -3
  315. package/dist/mcp-memory-inspector-app.d.ts +11 -12
  316. package/dist/mcp-read-only-tools.js +1 -1
  317. package/dist/memory-action-policy.d.ts +1 -2
  318. package/dist/memory-cache.d.ts +1 -2
  319. package/dist/memory-controller.d.ts +1 -2
  320. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -2
  321. package/dist/memory-projection-mutations.js +3 -3
  322. package/dist/memory-projection-store.d.ts +1 -2
  323. package/dist/memory-projection-store.js +1 -1
  324. package/dist/memory-provenance.d.ts +1 -2
  325. package/dist/memory-snapshot.d.ts +1 -2
  326. package/dist/memory-subject-cli.d.ts +11 -12
  327. package/dist/memory-subject.d.ts +11 -12
  328. package/dist/memory-subject.js +4 -4
  329. package/dist/memory-worth-outcomes.d.ts +2 -3
  330. package/dist/models-json.d.ts +1 -2
  331. package/dist/namespaces/migrate.d.ts +3 -4
  332. package/dist/namespaces/migrate.js +24 -24
  333. package/dist/namespaces/principal.d.ts +1 -2
  334. package/dist/namespaces/search.d.ts +1 -2
  335. package/dist/namespaces/search.js +5 -5
  336. package/dist/namespaces/storage.d.ts +3 -4
  337. package/dist/namespaces/storage.js +23 -23
  338. package/dist/native-knowledge.d.ts +1 -2
  339. package/dist/offline-sync-file-io.js +3 -3
  340. package/dist/offline-sync-impression-drain.d.ts +1 -2
  341. package/dist/offline-sync-impression-drain.js +9 -9
  342. package/dist/offline-sync.js +4 -4
  343. package/dist/operator-doctor-corpus.d.ts +1 -2
  344. package/dist/operator-doctor-corpus.js +26 -26
  345. package/dist/operator-doctor-replica.d.ts +1 -2
  346. package/dist/operator-toolkit.d.ts +3 -4
  347. package/dist/operator-toolkit.js +42 -42
  348. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -3
  349. package/dist/orchestration/maintenance.d.ts +4 -5
  350. package/dist/orchestration/maintenance.js +37 -36
  351. package/dist/{orchestrator-BsntWxLy.d.ts → orchestrator-3F4jihCo.d.ts} +8 -8
  352. package/dist/orchestrator.d.ts +9 -10
  353. package/dist/orchestrator.js +111 -106
  354. package/dist/page-versioning.js +3 -3
  355. package/dist/patterns-cli.d.ts +1 -2
  356. package/dist/{pipeline-CVoysPm2.d.ts → pipeline-CB1dj6Uh.d.ts} +1 -1
  357. package/dist/policy-runtime.d.ts +1 -2
  358. package/dist/proactive-contention.d.ts +1 -2
  359. package/dist/provenance.d.ts +1 -2
  360. package/dist/{public-http-CuOxlTC2.d.ts → public-http-34-JIAGQ.d.ts} +1 -1
  361. package/dist/{purge-GB7PZHT2.js → purge-OP6BEDFY.js} +2 -2
  362. package/dist/{qmd-DWMAGA5l.d.ts → qmd-edLLZXc5.d.ts} +1 -1
  363. package/dist/qmd-preflight.d.ts +2 -3
  364. package/dist/qmd-recall-cache.d.ts +1 -2
  365. package/dist/qmd.d.ts +2 -3
  366. package/dist/recall-concurrency-config.d.ts +1 -2
  367. package/dist/recall-disclosure-escalation.d.ts +1 -2
  368. package/dist/recall-explain-renderer.d.ts +1 -2
  369. package/dist/recall-memory-map.d.ts +1 -2
  370. package/dist/recall-planner-llm.d.ts +1 -2
  371. package/dist/recall-planner-llm.js +1 -1
  372. package/dist/recall-state.d.ts +1 -2
  373. package/dist/recall-tag-filter.d.ts +1 -2
  374. package/dist/recall-timings.d.ts +1 -2
  375. package/dist/recall-xray-cli.d.ts +1 -2
  376. package/dist/recall-xray-renderer.d.ts +1 -2
  377. package/dist/recall-xray.d.ts +1 -2
  378. package/dist/reconcile/cursor.d.ts +1 -2
  379. package/dist/reconcile/manifest.d.ts +1 -2
  380. package/dist/reconcile/manifest.js +4 -4
  381. package/dist/reconcile/plan.d.ts +1 -2
  382. package/dist/replay/normalizers/chatgpt.d.ts +1 -2
  383. package/dist/replay/normalizers/claude.d.ts +1 -2
  384. package/dist/replay/normalizers/openclaw.d.ts +1 -2
  385. package/dist/replay/normalizers/shared.d.ts +1 -2
  386. package/dist/replay/runner.d.ts +1 -2
  387. package/dist/replay/types.d.ts +1 -2
  388. package/dist/replica-divergence.d.ts +1 -2
  389. package/dist/replica-peers-config.d.ts +1 -2
  390. package/dist/{resolution-XWBPKYFB.js → resolution-4DLI3IOR.js} +10 -10
  391. package/dist/resolve-auth-token.d.ts +1 -2
  392. package/dist/resume-bundles.js +12 -12
  393. package/dist/retrieval-agents.d.ts +2 -3
  394. package/dist/retrieval-tiers.d.ts +1 -2
  395. package/dist/routing/engine.d.ts +1 -2
  396. package/dist/routing/store.d.ts +1 -2
  397. package/dist/salvage-envelope.d.ts +1 -2
  398. package/dist/salvage-envelope.js +6 -6
  399. package/dist/schemas.d.ts +639 -174
  400. package/dist/schemas.js +3 -1
  401. package/dist/{scope-profiles-CPWkW_dI.d.ts → scope-profiles-BF2lu81V.d.ts} +1 -1
  402. package/dist/search/document-scanner.js +1 -1
  403. package/dist/search/embed-helper.d.ts +1 -2
  404. package/dist/search/factory.d.ts +1 -2
  405. package/dist/search/factory.js +4 -4
  406. package/dist/search/index.d.ts +1 -2
  407. package/dist/search/index.js +4 -4
  408. package/dist/search/lancedb-backend.d.ts +1 -2
  409. package/dist/search/lancedb-backend.js +1 -1
  410. package/dist/search/meilisearch-backend.d.ts +1 -2
  411. package/dist/search/meilisearch-backend.js +1 -1
  412. package/dist/search/noop-backend.d.ts +1 -2
  413. package/dist/search/orama-backend.d.ts +1 -2
  414. package/dist/search/orama-backend.js +1 -1
  415. package/dist/search/port.d.ts +1 -2
  416. package/dist/search/remote-backend.d.ts +1 -2
  417. package/dist/secure-store/index.js +3 -3
  418. package/dist/{semantic-consolidation-CNFVBXFc.d.ts → semantic-consolidation-5OuWXBRt.d.ts} +1 -1
  419. package/dist/semantic-consolidation.d.ts +2 -3
  420. package/dist/semantic-consolidation.js +24 -24
  421. package/dist/semantic-rule-promotion.js +23 -23
  422. package/dist/semantic-rule-verifier.d.ts +1 -2
  423. package/dist/semantic-rule-verifier.js +23 -23
  424. package/dist/{service-Bb-JIdQ0.d.ts → service-CrqEhLXD.d.ts} +2 -2
  425. package/dist/session-observer-bands.d.ts +1 -2
  426. package/dist/session-observer-state.d.ts +1 -2
  427. package/dist/shared-context/manager.d.ts +7 -8
  428. package/dist/signal.d.ts +1 -2
  429. package/dist/source-agent-qualifier.d.ts +1 -2
  430. package/dist/source-agent-qualifier.js +30 -27
  431. package/dist/standup/build.d.ts +16 -0
  432. package/dist/standup/build.js +17 -0
  433. package/dist/standup/build.js.map +1 -0
  434. package/dist/{storage-CukrlNKk.d.ts → storage-BQn-xnxm.d.ts} +1 -1
  435. package/dist/storage.d.ts +2 -3
  436. package/dist/storage.js +22 -22
  437. package/dist/subject-config.d.ts +1 -2
  438. package/dist/subject-config.js +5 -5
  439. package/dist/summarizer.d.ts +1 -2
  440. package/dist/summarizer.js +2 -2
  441. package/dist/summary-snapshot.d.ts +1 -2
  442. package/dist/support-passport/index.d.ts +16 -17
  443. package/dist/support-passport/index.js +52 -49
  444. package/dist/temporal-supersession.d.ts +2 -3
  445. package/dist/temporal-timeline-recall.d.ts +1 -2
  446. package/dist/temporal-validity.d.ts +1 -2
  447. package/dist/threading.d.ts +1 -2
  448. package/dist/tier-migration.d.ts +2 -3
  449. package/dist/tier-routing.d.ts +1 -2
  450. package/dist/tier-routing.js +2 -2
  451. package/dist/{tier-stats-4B5IJ3NE.js → tier-stats-2TOW3QNL.js} +3 -3
  452. package/dist/topics.d.ts +1 -2
  453. package/dist/transcript.d.ts +1 -2
  454. package/dist/transfer/capsule-export.js +2 -2
  455. package/dist/transfer/capsule-import.js +5 -5
  456. package/dist/transfer/export-okf.d.ts +39 -0
  457. package/dist/transfer/export-okf.js +112 -0
  458. package/dist/transfer/export-okf.js.map +1 -0
  459. package/dist/transfer/types.d.ts +78 -78
  460. package/dist/trust-score-stage.d.ts +1 -2
  461. package/dist/trust-score.d.ts +1 -2
  462. package/dist/{types-djxQlxJ7.d.ts → types-BRpcNjHZ.d.ts} +117 -2
  463. package/dist/types.d.ts +1 -2
  464. package/dist/utility-runtime.d.ts +1 -2
  465. package/dist/verified-recall.js +23 -23
  466. package/dist/who-knows-cli.d.ts +11 -12
  467. package/dist/who-knows-cli.js +24 -24
  468. package/dist/who-knows.d.ts +11 -12
  469. package/dist/who-knows.js +23 -23
  470. package/dist/write-envelope.d.ts +1 -2
  471. package/dist/write-envelope.js +5 -5
  472. package/package.json +34 -3
  473. package/src/access-admin-ops-surface.ts +6 -1
  474. package/src/access-boundary.ts +1 -0
  475. package/src/access-http.ts +3 -1
  476. package/src/access-mcp-output-schemas.ts +1 -0
  477. package/src/access-mcp.ts +3 -3
  478. package/src/access-operations.ts +1 -0
  479. package/src/access-service-offline-file-content.test.ts +63 -0
  480. package/src/access-surface-catalog.ts +2 -0
  481. package/src/activity/config.test.ts +1 -0
  482. package/src/activity/config.ts +21 -1
  483. package/src/activity/index.ts +1 -0
  484. package/src/activity/timeline/build.ts +279 -0
  485. package/src/activity/timeline/categories.ts +111 -0
  486. package/src/activity/timeline/classify.ts +110 -0
  487. package/src/activity/timeline/corrections.ts +145 -0
  488. package/src/activity/timeline/index.ts +6 -0
  489. package/src/activity/timeline/timeline.test.ts +277 -0
  490. package/src/activity/timeline/types.ts +106 -0
  491. package/src/activity/types.ts +6 -0
  492. package/src/cli/okf-commands.ts +45 -0
  493. package/src/cli.ts +2 -2
  494. package/src/coding/export-okf-codegraph.test.ts +381 -0
  495. package/src/coding/export-okf-codegraph.ts +565 -0
  496. package/src/config.test.ts +1 -0
  497. package/src/extraction-prompt-safety.test.ts +14 -2
  498. package/src/extraction.ts +21 -1
  499. package/src/fallback-llm.test.ts +134 -0
  500. package/src/fallback-llm.ts +77 -5
  501. package/src/location/access-operations.ts +17 -8
  502. package/src/location/backfill.ts +137 -0
  503. package/src/location/config.test.ts +3 -0
  504. package/src/location/config.ts +46 -2
  505. package/src/location/http-glue.ts +1 -1
  506. package/src/location/index.ts +3 -0
  507. package/src/location/intervals.ts +1 -0
  508. package/src/location/matching.test.ts +65 -0
  509. package/src/location/matching.ts +354 -0
  510. package/src/location/mcp-tools.ts +2 -1
  511. package/src/location/surfaces.test.ts +15 -2
  512. package/src/location/surfaces.ts +95 -18
  513. package/src/location/tagging.test.ts +119 -0
  514. package/src/location/tagging.ts +277 -0
  515. package/src/location/types.ts +23 -1
  516. package/src/mcp-read-only-tools.ts +1 -0
  517. package/src/memory-projection-store.ts +3 -1
  518. package/src/okf/cli.ts +18 -5
  519. package/src/okf/config.ts +5 -0
  520. package/src/okf/index-files.test.ts +60 -0
  521. package/src/okf/index-files.ts +114 -0
  522. package/src/okf/render.ts +133 -0
  523. package/src/okf/type-mapping.test.ts +3 -0
  524. package/src/okf/type-mapping.ts +2 -0
  525. package/src/orchestration/extraction-run.ts +2 -1
  526. package/src/orchestration/generic-recall-paths.ts +4 -3
  527. package/src/schemas.ts +17 -1
  528. package/src/standup/access-operations.ts +14 -0
  529. package/src/standup/build.test.ts +34 -0
  530. package/src/standup/build.ts +115 -0
  531. package/src/standup/http-glue.ts +15 -0
  532. package/src/standup/mcp-tools.ts +16 -0
  533. package/src/support-passport/card-projection.ts +1 -0
  534. package/src/support-passport/card-service-commit-forwarding.test.ts +1 -0
  535. package/src/support-passport/card-service.test.ts +75 -1
  536. package/src/support-passport/card-service.ts +6 -3
  537. package/src/support-passport/card-state.ts +5 -1
  538. package/src/support-passport/offline-sync-guard.ts +14 -1
  539. package/src/transfer/export-okf.test.ts +164 -0
  540. package/src/transfer/export-okf.ts +286 -0
  541. package/dist/chunk-2LWQSV6A.js.map +0 -1
  542. package/dist/chunk-3BCULS4U.js.map +0 -1
  543. package/dist/chunk-7BDZTALN.js.map +0 -1
  544. package/dist/chunk-7PHI6GUI.js.map +0 -1
  545. package/dist/chunk-AX7UXCHJ.js.map +0 -1
  546. package/dist/chunk-DEACDKE3.js.map +0 -1
  547. package/dist/chunk-FP7YTTVO.js.map +0 -1
  548. package/dist/chunk-JYSN42VN.js.map +0 -1
  549. package/dist/chunk-KZIF6XHX.js.map +0 -1
  550. package/dist/chunk-LKYIOCWL.js.map +0 -1
  551. package/dist/chunk-OXRRJXPR.js.map +0 -1
  552. package/dist/chunk-U7EW2W4W.js.map +0 -1
  553. package/dist/chunk-UW5NPZJ2.js.map +0 -1
  554. package/dist/chunk-XAB6STPO.js.map +0 -1
  555. package/dist/chunk-XNWXSGHS.js.map +0 -1
  556. package/dist/types-CM86alG1.d.ts +0 -89
  557. /package/dist/{auto-sync-2YPITIWN.js.map → auto-sync-Q6Q2FVSC.js.map} +0 -0
  558. /package/dist/{capsule-merge-SGIVB3WA.js.map → capsule-merge-SEHERWWP.js.map} +0 -0
  559. /package/dist/{chunk-LEPOP46W.js.map → chunk-227UFSEQ.js.map} +0 -0
  560. /package/dist/{chunk-NPFUNWNX.js.map → chunk-23CVL7HS.js.map} +0 -0
  561. /package/dist/{chunk-PO7NXBG2.js.map → chunk-2GF27PGH.js.map} +0 -0
  562. /package/dist/{chunk-MY2BC6UE.js.map → chunk-2LBAFHOQ.js.map} +0 -0
  563. /package/dist/{chunk-AZMLH5UT.js.map → chunk-33MFRY25.js.map} +0 -0
  564. /package/dist/{chunk-UEBDCMOO.js.map → chunk-3TSU662L.js.map} +0 -0
  565. /package/dist/{chunk-CAMNRAJF.js.map → chunk-4FHRZD5T.js.map} +0 -0
  566. /package/dist/{chunk-S5XOSTYM.js.map → chunk-4STAANV7.js.map} +0 -0
  567. /package/dist/{chunk-4F4AQFWL.js.map → chunk-6CEGSTBD.js.map} +0 -0
  568. /package/dist/{chunk-MDD2RINF.js.map → chunk-6RUHELWR.js.map} +0 -0
  569. /package/dist/{chunk-WNXYT4MK.js.map → chunk-72OIT7KS.js.map} +0 -0
  570. /package/dist/{chunk-KQAFEZQX.js.map → chunk-7LCGFUMB.js.map} +0 -0
  571. /package/dist/{chunk-SNOIKAHM.js.map → chunk-7UTDHQZ5.js.map} +0 -0
  572. /package/dist/{chunk-5HK3CJAR.js.map → chunk-7XOG75AU.js.map} +0 -0
  573. /package/dist/{chunk-UPFNQJC7.js.map → chunk-CN4VKV3S.js.map} +0 -0
  574. /package/dist/{chunk-PMVPCZJZ.js.map → chunk-CTCGHNWN.js.map} +0 -0
  575. /package/dist/{chunk-EGBDFJ36.js.map → chunk-DD5JFCWM.js.map} +0 -0
  576. /package/dist/{chunk-XBGHAAKR.js.map → chunk-DDX6KIXF.js.map} +0 -0
  577. /package/dist/{chunk-JIYDRBVZ.js.map → chunk-DJORULH3.js.map} +0 -0
  578. /package/dist/{chunk-UENKPWCS.js.map → chunk-DMEHOEC7.js.map} +0 -0
  579. /package/dist/{chunk-7KQB4EBS.js.map → chunk-DUAJKRR2.js.map} +0 -0
  580. /package/dist/{chunk-SEEJOGQX.js.map → chunk-EFQCDJZ2.js.map} +0 -0
  581. /package/dist/{chunk-Q57GOHLF.js.map → chunk-EGALNSZ4.js.map} +0 -0
  582. /package/dist/{chunk-KCT36JAW.js.map → chunk-ESNFSSO4.js.map} +0 -0
  583. /package/dist/{chunk-XQ3HXAQH.js.map → chunk-ET2CNMLD.js.map} +0 -0
  584. /package/dist/{chunk-PU56CXZA.js.map → chunk-EZSCW4EM.js.map} +0 -0
  585. /package/dist/{chunk-HMZKGHMD.js.map → chunk-FESUGFIL.js.map} +0 -0
  586. /package/dist/{chunk-3A2NJP2U.js.map → chunk-FKKGCGYL.js.map} +0 -0
  587. /package/dist/{chunk-BWGCOLEL.js.map → chunk-FTTJRVB7.js.map} +0 -0
  588. /package/dist/{chunk-ODU2CNNX.js.map → chunk-FYWLSFFS.js.map} +0 -0
  589. /package/dist/{chunk-3PKAS6VL.js.map → chunk-GX6FTSYH.js.map} +0 -0
  590. /package/dist/{chunk-76DIF5KT.js.map → chunk-H7VDIF2V.js.map} +0 -0
  591. /package/dist/{chunk-F7XUD3PL.js.map → chunk-HJXA6ZM7.js.map} +0 -0
  592. /package/dist/{chunk-4QEYREAV.js.map → chunk-HNPE66LB.js.map} +0 -0
  593. /package/dist/{chunk-P36Z4JRA.js.map → chunk-I5VB44ZK.js.map} +0 -0
  594. /package/dist/{chunk-EUYWQ7TS.js.map → chunk-IEZ6CGTW.js.map} +0 -0
  595. /package/dist/{chunk-5DHKCO52.js.map → chunk-IVIAHQBR.js.map} +0 -0
  596. /package/dist/{chunk-TFR3HG4K.js.map → chunk-J3OND5QT.js.map} +0 -0
  597. /package/dist/{chunk-5ACCD4L7.js.map → chunk-JRRQ747T.js.map} +0 -0
  598. /package/dist/{chunk-V4IDF3EZ.js.map → chunk-JTWZKNUH.js.map} +0 -0
  599. /package/dist/{chunk-5RWZH6PH.js.map → chunk-L4X4PJYK.js.map} +0 -0
  600. /package/dist/{chunk-UTQUEHC7.js.map → chunk-LUDBXTBJ.js.map} +0 -0
  601. /package/dist/{chunk-LDKPDODJ.js.map → chunk-ME35HVDJ.js.map} +0 -0
  602. /package/dist/{chunk-DPCXDG7G.js.map → chunk-MJRGVXPQ.js.map} +0 -0
  603. /package/dist/{chunk-773TRRGT.js.map → chunk-MJUCDM3C.js.map} +0 -0
  604. /package/dist/{chunk-T6ILXUAH.js.map → chunk-MN5NOOI7.js.map} +0 -0
  605. /package/dist/{chunk-AHPIFKNG.js.map → chunk-N4F7ZSSG.js.map} +0 -0
  606. /package/dist/{chunk-JOZUBF4A.js.map → chunk-NACLNNFQ.js.map} +0 -0
  607. /package/dist/{chunk-LC2BDILZ.js.map → chunk-NBP4EX5N.js.map} +0 -0
  608. /package/dist/{chunk-ZVPVTPGI.js.map → chunk-NNZFPYYX.js.map} +0 -0
  609. /package/dist/{chunk-DA7ITC5Z.js.map → chunk-O57GM3FR.js.map} +0 -0
  610. /package/dist/{chunk-7VZFRUQU.js.map → chunk-O7ERGZDA.js.map} +0 -0
  611. /package/dist/{chunk-3SZD4CYO.js.map → chunk-OAJMQKQR.js.map} +0 -0
  612. /package/dist/{chunk-HSZMX3ZJ.js.map → chunk-ODW5GDFE.js.map} +0 -0
  613. /package/dist/{chunk-J2WC5LF4.js.map → chunk-QBC33MPY.js.map} +0 -0
  614. /package/dist/{chunk-T7XP6IZE.js.map → chunk-QCRJMU5V.js.map} +0 -0
  615. /package/dist/{chunk-OA2O2GJ4.js.map → chunk-RZ3IZIJG.js.map} +0 -0
  616. /package/dist/{chunk-UL4MKZHI.js.map → chunk-SN4JXNLL.js.map} +0 -0
  617. /package/dist/{chunk-CPA5NBHN.js.map → chunk-TNGH4ZYI.js.map} +0 -0
  618. /package/dist/{chunk-F3NVYTTA.js.map → chunk-TNXNECAN.js.map} +0 -0
  619. /package/dist/{chunk-BEC4YBNA.js.map → chunk-TVW4C7PV.js.map} +0 -0
  620. /package/dist/{chunk-UFKPQBXH.js.map → chunk-U62OK7BB.js.map} +0 -0
  621. /package/dist/{chunk-TUHBYJXL.js.map → chunk-VQ4AMTGZ.js.map} +0 -0
  622. /package/dist/{chunk-H2YSH3DG.js.map → chunk-WKAXBXVA.js.map} +0 -0
  623. /package/dist/{chunk-HRHO3ZNG.js.map → chunk-WKJFIMVN.js.map} +0 -0
  624. /package/dist/{chunk-SXIMQLGV.js.map → chunk-WVGXCBOC.js.map} +0 -0
  625. /package/dist/{chunk-CRML27CO.js.map → chunk-X5YYSAZX.js.map} +0 -0
  626. /package/dist/{chunk-FZEEWOI2.js.map → chunk-XJJYSX6F.js.map} +0 -0
  627. /package/dist/{chunk-UG6VXIOK.js.map → chunk-XSTNGNJP.js.map} +0 -0
  628. /package/dist/{chunk-YDPAE2RD.js.map → chunk-YFLLGRXO.js.map} +0 -0
  629. /package/dist/{chunk-LPNCR4QK.js.map → chunk-YXFCALVT.js.map} +0 -0
  630. /package/dist/{chunk-Q4WONDMJ.js.map → chunk-YYGZJPOK.js.map} +0 -0
  631. /package/dist/{chunk-GTO56JY5.js.map → chunk-ZJPM7GZ3.js.map} +0 -0
  632. /package/dist/{chunk-LOXHYCVS.js.map → chunk-ZW4VXELZ.js.map} +0 -0
  633. /package/dist/{contradiction-scan-AKUWPX5N.js.map → contradiction-scan-NOYMFG66.js.map} +0 -0
  634. /package/dist/{first-start-migration-4NETATFF.js.map → first-start-migration-KHIMCBIC.js.map} +0 -0
  635. /package/dist/{purge-GB7PZHT2.js.map → purge-OP6BEDFY.js.map} +0 -0
  636. /package/dist/{resolution-XWBPKYFB.js.map → resolution-4DLI3IOR.js.map} +0 -0
  637. /package/dist/{tier-stats-4B5IJ3NE.js.map → tier-stats-2TOW3QNL.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/memory-projection-store.ts"],"sourcesContent":["import path from \"node:path\";\nimport fs from \"node:fs\";\nimport type {\n MemoryGovernanceAppliedAction,\n MemoryGovernanceMetrics,\n MemoryGovernanceReviewQueueEntry,\n MemoryGovernanceSummary,\n} from \"./maintenance/memory-governance.js\";\nimport type {\n MemoryCategory,\n MemoryLifecycleEvent,\n MemoryProjectionCurrentState,\n MemoryStatus,\n} from \"./types.js\";\nimport { log } from \"./logger.js\";\nimport {\n displayErrorDetail,\n isLikelyBetterSqlite3NativeBindingError,\n openBetterSqlite3,\n type BetterSqlite3Database,\n} from \"./runtime/better-sqlite.js\";\n\nexport const MEMORY_PROJECTION_SCHEMA_VERSION = 4;\n\nexport interface ProjectedMemoryBrowseOptions {\n query?: string; status?: string; category?: string;\n excludeTags?: readonly string[]; excludePrivateRecords?: boolean;\n sort?: \"updated_desc\" | \"updated_asc\" | \"created_desc\" | \"created_asc\";\n limit: number;\n offset: number;\n}\n\nexport interface ProjectedMemoryBrowseRow {\n id: string;\n path: string;\n category: MemoryCategory;\n status: MemoryStatus;\n created?: string;\n updated?: string;\n tags: string[];\n entityRef?: string;\n preview: string;\n}\n\nexport interface ProjectedMemoryBrowsePage {\n total: number;\n memories: ProjectedMemoryBrowseRow[];\n}\n\nexport interface ProjectedEntityMentionRow {\n memoryId: string;\n entityRef: string;\n mentionSource: string;\n created: string;\n updated: string;\n}\n\nexport interface ProjectedNativeKnowledgeChunkRow {\n chunkId: string;\n sourcePath: string;\n title: string;\n sourceKind: string;\n startLine: number;\n endLine: number;\n derivedDate?: string;\n sessionKey?: string;\n workflowKey?: string;\n author?: string;\n agent?: string;\n namespace?: string;\n privacyClass?: string;\n sourceHash?: string;\n preview: string;\n}\n\nexport interface MemoryProjectionGovernanceReviewQueueRow {\n runId: string;\n entryId: string;\n memoryId: string;\n path: string;\n reasonCode: MemoryGovernanceReviewQueueEntry[\"reasonCode\"];\n severity: MemoryGovernanceReviewQueueEntry[\"severity\"];\n suggestedAction: MemoryGovernanceReviewQueueEntry[\"suggestedAction\"];\n suggestedStatus?: MemoryGovernanceReviewQueueEntry[\"suggestedStatus\"];\n relatedMemoryIds: string[];\n}\n\nexport interface MemoryProjectionGovernanceAppliedActionRow {\n runId: string;\n rowKey: string;\n action: MemoryGovernanceAppliedAction[\"action\"];\n memoryId: string;\n reasonCode: MemoryGovernanceAppliedAction[\"reasonCode\"];\n beforeStatus: MemoryGovernanceAppliedAction[\"beforeStatus\"];\n afterStatus?: MemoryGovernanceAppliedAction[\"afterStatus\"];\n originalPath: string;\n currentPath: string;\n}\n\nexport interface ProjectedReviewQueueSnapshot {\n found: boolean;\n runId?: string;\n summary?: MemoryGovernanceSummary;\n metrics?: MemoryGovernanceMetrics;\n reviewQueue?: MemoryGovernanceReviewQueueEntry[];\n appliedActions?: MemoryGovernanceAppliedAction[];\n report?: string;\n}\n\nexport function getMemoryProjectionPath(memoryDir: string): string {\n return path.join(memoryDir, \"state\", \"memory-projection.sqlite\");\n}\n\nfunction listTableColumns(db: BetterSqlite3Database, tableName: string): Set<string> {\n try {\n const rows = db.prepare(`PRAGMA table_info(${tableName})`).all() as Array<{ name?: unknown }>;\n return new Set(rows.map((row) => row.name).filter((name): name is string => typeof name === \"string\"));\n } catch {\n return new Set<string>();\n }\n}\n\nfunction migrateMemoryCurrentTable(db: BetterSqlite3Database): void {\n const columns = listTableColumns(db, \"memory_current\");\n if (columns.size === 0) return;\n\n if (!columns.has(\"tags_json\")) {\n db.exec(`ALTER TABLE memory_current ADD COLUMN tags_json TEXT NOT NULL DEFAULT '[]'`);\n }\n if (!columns.has(\"preview_text\")) {\n db.exec(`ALTER TABLE memory_current ADD COLUMN preview_text TEXT NOT NULL DEFAULT ''`);\n }\n}\n\nfunction memoryCurrentRequiresMigration(db: BetterSqlite3Database): boolean {\n const columns = listTableColumns(db, \"memory_current\");\n return columns.size > 0 && (!columns.has(\"tags_json\") || !columns.has(\"preview_text\"));\n}\n\nfunction migrateProjectionSchemaIfNeeded(memoryDir: string): void {\n const dbPath = getMemoryProjectionPath(memoryDir);\n try {\n const db = openBetterSqlite3(dbPath, { fileMustExist: true });\n try {\n if (!memoryCurrentRequiresMigration(db)) return;\n initializeMemoryProjectionDb(db);\n } finally {\n db.close();\n }\n } catch {\n // Fail open on migration attempts so readonly consumers can still use legacy rows.\n }\n}\n\nexport function memoryCurrentSelectExpressions(db: BetterSqlite3Database): {\n tagsJson: string; previewText: string; hasPathValid: boolean;\n privateRecord: string; hasPrivateRecord: boolean;\n} {\n const columns = listTableColumns(db, \"memory_current\");\n return {\n tagsJson: columns.has(\"tags_json\") ? \"tags_json\" : `'[]' AS tags_json`,\n previewText: columns.has(\"preview_text\") ? \"preview_text\" : `'' AS preview_text`, hasPathValid: columns.has(\"path_valid\"),\n privateRecord: columns.has(\"private_record\") ? \"private_record\" : \"0 AS private_record\",\n hasPrivateRecord: columns.has(\"private_record\"),\n };\n}\n\nexport function initializeMemoryProjectionDb(db: BetterSqlite3Database): void {\n db.exec(`\n CREATE TABLE IF NOT EXISTS meta (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS memory_current (\n memory_id TEXT PRIMARY KEY,\n category TEXT NOT NULL,\n status TEXT NOT NULL,\n lifecycle_state TEXT,\n path_rel TEXT NOT NULL,\n path_valid INTEGER NOT NULL DEFAULT 0 CHECK (path_valid IN (0, 1)),\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n archived_at TEXT,\n superseded_at TEXT,\n entity_ref TEXT,\n source TEXT NOT NULL,\n confidence REAL NOT NULL,\n confidence_tier TEXT NOT NULL,\n memory_kind TEXT,\n access_count INTEGER,\n last_accessed TEXT,\n tags_json TEXT NOT NULL DEFAULT '[]',\n preview_text TEXT NOT NULL DEFAULT '',\n private_record INTEGER NOT NULL DEFAULT 0 CHECK (private_record IN (0, 1))\n );\n\n CREATE INDEX IF NOT EXISTS idx_memory_current_status\n ON memory_current(status);\n\n CREATE INDEX IF NOT EXISTS idx_memory_current_category\n ON memory_current(category);\n\n\n CREATE TABLE IF NOT EXISTS memory_timeline (\n event_id TEXT PRIMARY KEY,\n memory_id TEXT NOT NULL,\n event_type TEXT NOT NULL,\n timestamp TEXT NOT NULL,\n event_order INTEGER NOT NULL,\n actor TEXT NOT NULL,\n reason_code TEXT,\n rule_version TEXT NOT NULL,\n related_memory_ids_json TEXT,\n before_json TEXT,\n after_json TEXT,\n correlation_id TEXT\n );\n\n CREATE INDEX IF NOT EXISTS idx_memory_timeline_memory_ts\n ON memory_timeline(memory_id, timestamp, event_order);\n\n CREATE TABLE IF NOT EXISTS memory_entity_mentions (\n memory_id TEXT NOT NULL,\n entity_ref TEXT NOT NULL,\n mention_source TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (memory_id, entity_ref, mention_source)\n );\n\n CREATE INDEX IF NOT EXISTS idx_memory_entity_mentions_entity\n ON memory_entity_mentions(entity_ref, updated_at DESC);\n\n CREATE TABLE IF NOT EXISTS native_knowledge_chunks (\n chunk_id TEXT PRIMARY KEY,\n source_path TEXT NOT NULL,\n title TEXT NOT NULL,\n source_kind TEXT NOT NULL,\n start_line INTEGER NOT NULL,\n end_line INTEGER NOT NULL,\n derived_date TEXT,\n session_key TEXT,\n workflow_key TEXT,\n author TEXT,\n agent TEXT,\n namespace TEXT,\n privacy_class TEXT,\n source_hash TEXT,\n preview_text TEXT NOT NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_native_knowledge_source_kind\n ON native_knowledge_chunks(source_kind);\n\n CREATE INDEX IF NOT EXISTS idx_native_knowledge_namespace\n ON native_knowledge_chunks(namespace);\n\n CREATE TABLE IF NOT EXISTS memory_review_runs (\n run_id TEXT PRIMARY KEY,\n created_at TEXT NOT NULL,\n mode TEXT NOT NULL,\n summary_json TEXT NOT NULL,\n metrics_json TEXT NOT NULL,\n applied_actions_json TEXT NOT NULL,\n report_markdown TEXT NOT NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_memory_review_runs_created\n ON memory_review_runs(created_at DESC);\n\n CREATE TABLE IF NOT EXISTS memory_review_queue (\n entry_id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n memory_id TEXT NOT NULL,\n path TEXT NOT NULL,\n reason_code TEXT NOT NULL,\n severity TEXT NOT NULL,\n suggested_action TEXT NOT NULL,\n suggested_status TEXT,\n related_memory_ids_json TEXT NOT NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_memory_review_queue_run\n ON memory_review_queue(run_id, reason_code, memory_id);\n\n CREATE TABLE IF NOT EXISTS memory_review_actions (\n row_key TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n action TEXT NOT NULL,\n memory_id TEXT NOT NULL,\n reason_code TEXT NOT NULL,\n before_status TEXT NOT NULL,\n after_status TEXT,\n original_path TEXT NOT NULL,\n current_path TEXT NOT NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_memory_review_actions_run\n ON memory_review_actions(run_id, memory_id);\n `);\n\n migrateMemoryCurrentTable(db);\n if (listTableColumns(db, \"memory_current\").has(\"path_valid\")) {\n db.exec(`\n CREATE INDEX IF NOT EXISTS idx_memory_current_browse_updated_desc\n ON memory_current(path_valid, updated_at DESC, created_at DESC, memory_id ASC);\n CREATE INDEX IF NOT EXISTS idx_memory_current_browse_updated_asc\n ON memory_current(path_valid, updated_at ASC, created_at ASC, memory_id ASC);\n CREATE INDEX IF NOT EXISTS idx_memory_current_browse_created_desc\n ON memory_current(path_valid, created_at DESC, updated_at DESC, memory_id ASC);\n CREATE INDEX IF NOT EXISTS idx_memory_current_browse_created_asc\n ON memory_current(path_valid, created_at ASC, updated_at ASC, memory_id ASC);\n `);\n }\n db.prepare(\"INSERT OR REPLACE INTO meta(key, value) VALUES (?, ?)\")\n .run(\"schemaVersion\", String(MEMORY_PROJECTION_SCHEMA_VERSION));\n}\n\n// Test seam (issue #1829): the readonly projection opener is overridable so\n// tests can inject an ABI-style throw against a PRESENT file without faking a\n// corrupt native binding. Default delegates to the shared opener.\ntype ProjectionReadonlyOpener = typeof openBetterSqlite3;\nlet projectionReadonlyOpener: ProjectionReadonlyOpener = openBetterSqlite3;\n\n/** @internal Test seam: override the readonly projection opener; returns a restore fn. */\nexport function __setProjectionReadonlyOpenerForTest(\n opener: ProjectionReadonlyOpener | null,\n): () => void {\n const previous = projectionReadonlyOpener;\n projectionReadonlyOpener = opener ?? openBetterSqlite3;\n return () => {\n projectionReadonlyOpener = previous;\n };\n}\n\n// Rate-limited suppression for open failures — mirrors warnProjectionFallback\n// in storage-guards.ts (5-min dedup per memoryDir). A present-but-unopenable\n// projection is a real failure that must surface, but it repeats on every\n// browse, so the log is throttled to keep output actionable (issue #1829).\nconst PROJECTION_OPEN_FAILURE_LOG_INTERVAL_MS = 5 * 60_000;\nconst projectionOpenFailureLoggedAt = new Map<string, number>();\n\n/** @internal Test seam: clear the rate-limit dedup map. */\nexport function __resetProjectionOpenFailureSuppressionForTest(): void {\n projectionOpenFailureLoggedAt.clear();\n}\n\nfunction logProjectionOpenFailure(memoryDir: string, error: unknown): void {\n const now = Date.now();\n const warnedAt = projectionOpenFailureLoggedAt.get(memoryDir) ?? 0;\n if (now - warnedAt < PROJECTION_OPEN_FAILURE_LOG_INTERVAL_MS) return;\n projectionOpenFailureLoggedAt.set(memoryDir, now);\n // Path-free detail only (rule 11 / CodeQL js/stack-trace-exposure): the raw\n // message can embed absolute loader paths; displayErrorDetail returns class +\n // code. This is the DISTINCT signal that was missing before #1829, when a\n // wrong-ABI build collapsed into the same silent null as a missing file.\n const detail = displayErrorDetail(error);\n const nativeMismatch = isLikelyBetterSqlite3NativeBindingError(error);\n const detailSuffix = detail ? ` (${detail})` : \"\";\n const abiSuffix = nativeMismatch\n ? \" — native binding built for the wrong Node.js ABI; rebuild better-sqlite3 for this process\"\n : \"\";\n log.warn(\n `storage.memory-projection: index present but could not be opened${detailSuffix}${abiSuffix}; falling back to full-corpus scan`,\n );\n}\n\nexport function openProjectionReadonly(memoryDir: string): BetterSqlite3Database | null {\n const dbPath = getMemoryProjectionPath(memoryDir);\n // A MISSING file is a normal fallback (cold install, never built). A file\n // that EXISTS but cannot open (wrong ABI / corrupt / bad perms) is a real\n // failure that must surface (issue #1829): previously both collapsed into\n // the same silent null, hiding native-binding mismatches behind 17-27s\n // full-corpus scans on every memory list.\n if (!fs.existsSync(dbPath)) return null;\n try {\n return projectionReadonlyOpener(dbPath, { readonly: true, fileMustExist: true });\n } catch (error) {\n logProjectionOpenFailure(memoryDir, error);\n return null;\n }\n}\n\nexport type ProjectionHealthState = \"absent\" | \"openable\" | \"present-but-invalid\" | \"unopenable\";\n\nexport interface ProjectionHealthProbe {\n state: ProjectionHealthState;\n /** Path-free detail (class + code) when state !== \"absent\"/\"openable\"; \"\" otherwise. */\n detail: string;\n /** true when the open failure is classified as a native-binding ABI mismatch. */\n nativeBindingMismatch: boolean;\n}\n\n/**\n * Confirm the projection schema is present and queryable, not just that the\n * sqlite file opens (issue #1848 round 2). A file that opens but has the\n * projection tables missing — or is corrupt and only fails on first statement\n * — previously reported `openable`/ok, so `remnic doctor` said healthy while\n * browse silently fell back to full-corpus scans. `memory_current` is the\n * core browse table; if it is absent or unreadable the projection cannot\n * serve any query. Throws so the probe can report a distinct state.\n */\n// Named so displayErrorDetail surfaces a clear, path-free identifier in the\n// doctor report rather than a generic \"Error\".\nclass ProjectionSchemaError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ProjectionSchemaError\";\n }\n}\n\n/**\n * Columns `readProjectedMemoryBrowse` SELECTs from `memory_current` with no\n * graceful fallback. `tags_json`/`preview_text` fall back via\n * memoryCurrentSelectExpressions and `path_valid` falls back via the legacy\n * full-scan branch — none of those make a browse query throw. A projection\n * whose `memory_current` lacks any of these columns cannot serve browse\n * queries: the SELECT throws and browse silently falls back to a full-corpus\n * scan. Enumerated directly from readProjectedMemoryBrowse's SELECT list +\n * ORDER BY references (issue #1848 round 3).\n */\nconst REQUIRED_MEMORY_CURRENT_COLUMNS = [\n \"memory_id\",\n \"path_rel\",\n \"category\",\n \"status\",\n \"created_at\",\n \"updated_at\",\n \"entity_ref\",\n \"private_record\",\n] as const;\n\nfunction assertProjectionSchemaReadable(db: BetterSqlite3Database): void {\n const row = db\n .prepare(\n \"SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'memory_current'\",\n )\n .get() as { name: string } | undefined;\n if (!row?.name) {\n throw new ProjectionSchemaError(\n \"projection schema is missing or was not initialized (memory_current table not found)\",\n );\n }\n // Round 3 (issue #1848): verify the columns readProjectedMemoryBrowse\n // actually SELECT are present, not just that the table exists. A file like\n // `CREATE TABLE memory_current (x INTEGER)` passed the round-2 table-existence\n // + SELECT-1 check but cannot serve browse queries, so browse silently fell\n // back to full-corpus scans while `remnic doctor` reported healthy. Classify\n // such a stale/half-built table as present-but-invalid so the operator gets a\n // rebuild hint instead of a false-clean bill of health.\n const columns = listTableColumns(db, \"memory_current\");\n const missing = REQUIRED_MEMORY_CURRENT_COLUMNS.filter((c) => !columns.has(c));\n if (missing.length > 0) {\n throw new ProjectionSchemaError(\n `projection memory_current table is missing required column(s): ${missing.join(\", \")}`,\n );\n }\n // Also confirm the table is queryable — catches physical corruption that\n // only surfaces on first read (the file opens but statements fail).\n db.prepare(\"SELECT 1 FROM memory_current LIMIT 1\").get();\n}\n\n/**\n * Stat + attempt-open + schema-validate the memory projection WITHOUT keeping\n * a handle, for the `remnic doctor` health check (issue #1829 / #1848).\n * Distinguishes four states so operators can tell \"not built yet\" (normal) from\n * \"exists but broken\" (needs a rebuild / native-binding rebuild). Never throws.\n */\nexport function probeProjectionHealth(memoryDir: string): ProjectionHealthProbe {\n const dbPath = getMemoryProjectionPath(memoryDir);\n if (!fs.existsSync(dbPath)) {\n return { state: \"absent\", detail: \"\", nativeBindingMismatch: false };\n }\n let db: BetterSqlite3Database | null = null;\n try {\n db = projectionReadonlyOpener(dbPath, { readonly: true, fileMustExist: true });\n // Validate the projection is actually USABLE, not just that the file\n // opens (issue #1848 round 2): a file that opens but has the schema\n // missing/corrupt previously reported ok, so doctor said healthy while\n // browse silently fell back to full-corpus scans.\n assertProjectionSchemaReadable(db);\n return { state: \"openable\", detail: \"\", nativeBindingMismatch: false };\n } catch (error) {\n // If the file OPENED (db assigned) but the schema query failed, the\n // native binding is fine — the projection itself is stale/corrupt.\n if (db) {\n return {\n state: \"present-but-invalid\",\n detail: displayErrorDetail(error),\n nativeBindingMismatch: false,\n };\n }\n return {\n state: \"unopenable\",\n detail: displayErrorDetail(error),\n nativeBindingMismatch: isLikelyBetterSqlite3NativeBindingError(error),\n };\n } finally {\n db?.close();\n }\n}\nfunction updateProjectionBestEffort(\n memoryDir: string,\n sql: string,\n params: unknown[],\n): void {\n let db: BetterSqlite3Database | null = null;\n try {\n db = openBetterSqlite3(getMemoryProjectionPath(memoryDir), { fileMustExist: true });\n db.prepare(sql).run(...params);\n } catch {\n // Projection updates must never block the canonical filesystem mutation.\n } finally {\n db?.close();\n }\n}\n\nexport function markProjectedMemoryPathInvalid(memoryDir: string, memoryId: string): void {\n updateProjectionBestEffort(\n memoryDir,\n \"UPDATE memory_current SET path_valid = 0 WHERE memory_id = ?\",\n [memoryId],\n );\n}\n\nexport function updateProjectedMemoryPath(\n memoryDir: string,\n memoryId: string,\n pathRel: string,\n): void {\n const pathValid = isProjectedMemoryPathValid(memoryDir, pathRel) ? 1 : 0;\n updateProjectionBestEffort(\n memoryDir,\n \"UPDATE memory_current SET path_rel = ?, path_valid = ? WHERE memory_id = ?\",\n [pathRel, pathValid, memoryId],\n );\n}\n\nfunction withProjectionReadonly<T>(\n memoryDir: string,\n reader: (db: BetterSqlite3Database) => T,\n): T | null {\n const db = openProjectionReadonly(memoryDir);\n if (!db) return null;\n\n let needsMigration = false;\n try {\n needsMigration = memoryCurrentRequiresMigration(db);\n return reader(db);\n } catch {\n return null;\n } finally {\n db.close();\n if (needsMigration) {\n migrateProjectionSchemaIfNeeded(memoryDir);\n }\n }\n}\n\nfunction parseStringArray(value: unknown): string[] {\n if (typeof value !== \"string\" || value.length === 0) return [];\n try {\n const parsed = JSON.parse(value);\n return Array.isArray(parsed) ? parsed.filter((entry): entry is string => typeof entry === \"string\") : [];\n } catch {\n return [];\n }\n}\n\nfunction parseJsonObject<T>(value: unknown): T | undefined {\n if (typeof value !== \"string\" || value.length === 0) return undefined;\n try {\n return JSON.parse(value) as T;\n } catch {\n return undefined;\n }\n}\n\nfunction resolveMemoryDirRoot(memoryDir: string): string {\n try {\n return fs.realpathSync(memoryDir);\n } catch {\n return path.resolve(memoryDir);\n }\n}\n\nfunction isPathInsideRoot(candidatePath: string, rootPath: string): boolean {\n const relative = path.relative(rootPath, candidatePath);\n return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative));\n}\n\nfunction resolveProjectedMemoryPath(\n memoryDir: string,\n pathRel: string,\n requireExisting = false,\n): string | null {\n if (path.isAbsolute(pathRel)) return null;\n const root = resolveMemoryDirRoot(memoryDir);\n const candidate = path.resolve(root, pathRel);\n if (!isPathInsideRoot(candidate, root)) return null;\n try {\n const realCandidate = fs.realpathSync(candidate);\n if (!isPathInsideRoot(realCandidate, root)) return null;\n } catch {\n if (requireExisting) return null;\n // Missing files are handled by callers. Still keep the lexical guard above.\n }\n return candidate;\n}\n\nexport function isProjectedMemoryPathValid(memoryDir: string, pathRel: string): boolean {\n return resolveProjectedMemoryPath(memoryDir, pathRel) !== null;\n}\n\nfunction projectedBrowseRowFromCurrentRow(\n memoryDir: string,\n row: Record<string, unknown>,\n resolvedFilePath?: string,\n requireExisting = false,\n): ProjectedMemoryBrowseRow | null {\n if (\n typeof row.memory_id !== \"string\" ||\n typeof row.path_rel !== \"string\" ||\n typeof row.category !== \"string\" ||\n typeof row.status !== \"string\"\n ) {\n return null;\n }\n const filePath = resolvedFilePath ?? resolveProjectedMemoryPath(memoryDir, row.path_rel, requireExisting);\n if (!filePath) return null;\n return {\n id: row.memory_id,\n path: filePath,\n category: row.category as MemoryCategory,\n status: row.status as MemoryStatus,\n created: typeof row.created_at === \"string\" ? row.created_at : undefined,\n updated: typeof row.updated_at === \"string\" ? row.updated_at : undefined,\n tags: parseStringArray(row.tags_json),\n entityRef: typeof row.entity_ref === \"string\" ? row.entity_ref : undefined,\n preview: typeof row.preview_text === \"string\" ? row.preview_text : \"\",\n };\n}\n\nfunction projectedBrowsePathSqlClauses(): string[] {\n return [\n \"path_rel <> ''\",\n \"path_rel NOT LIKE '/%'\",\n \"path_rel <> '..'\",\n \"path_rel NOT LIKE '../%'\",\n \"path_rel NOT LIKE '%/../%'\",\n ];\n}\n\nexport function parseCurrentRow(\n memoryDir: string,\n row: Record<string, unknown> | undefined,\n): MemoryProjectionCurrentState | null {\n if (!row) return null;\n if (\n typeof row.memory_id !== \"string\" ||\n typeof row.category !== \"string\" ||\n typeof row.status !== \"string\" ||\n typeof row.path_rel !== \"string\" ||\n typeof row.created_at !== \"string\" ||\n typeof row.updated_at !== \"string\" ||\n typeof row.source !== \"string\" ||\n typeof row.confidence !== \"number\" ||\n typeof row.confidence_tier !== \"string\"\n ) {\n return null;\n }\n const filePath = resolveProjectedMemoryPath(memoryDir, row.path_rel);\n if (!filePath) return null;\n\n return {\n memoryId: row.memory_id,\n category: row.category as MemoryProjectionCurrentState[\"category\"],\n status: row.status as MemoryStatus,\n lifecycleState:\n typeof row.lifecycle_state === \"string\"\n ? (row.lifecycle_state as MemoryProjectionCurrentState[\"lifecycleState\"])\n : undefined,\n path: filePath,\n pathRel: row.path_rel,\n created: row.created_at,\n updated: row.updated_at,\n archivedAt: typeof row.archived_at === \"string\" ? row.archived_at : undefined,\n supersededAt: typeof row.superseded_at === \"string\" ? row.superseded_at : undefined,\n entityRef: typeof row.entity_ref === \"string\" ? row.entity_ref : undefined,\n source: row.source,\n confidence: row.confidence,\n confidenceTier: row.confidence_tier as MemoryProjectionCurrentState[\"confidenceTier\"],\n memoryKind:\n typeof row.memory_kind === \"string\"\n ? (row.memory_kind as MemoryProjectionCurrentState[\"memoryKind\"])\n : undefined,\n accessCount: typeof row.access_count === \"number\" ? row.access_count : undefined,\n lastAccessed: typeof row.last_accessed === \"string\" ? row.last_accessed : undefined,\n tags: parseStringArray(row.tags_json),\n preview: typeof row.preview_text === \"string\" ? row.preview_text : \"\",\n privateRecord: row.private_record === 1,\n };\n}\n\nexport function parseTimelineRows(rows: Array<Record<string, unknown>>): MemoryLifecycleEvent[] {\n const out: MemoryLifecycleEvent[] = [];\n for (const row of rows) {\n if (\n typeof row.event_id !== \"string\" ||\n typeof row.memory_id !== \"string\" ||\n typeof row.event_type !== \"string\" ||\n typeof row.timestamp !== \"string\" ||\n typeof row.actor !== \"string\" ||\n typeof row.rule_version !== \"string\"\n ) {\n continue;\n }\n\n out.push({\n eventId: row.event_id,\n memoryId: row.memory_id,\n eventType: row.event_type as MemoryLifecycleEvent[\"eventType\"],\n timestamp: row.timestamp,\n actor: row.actor,\n reasonCode: typeof row.reason_code === \"string\" ? row.reason_code : undefined,\n ruleVersion: row.rule_version,\n relatedMemoryIds: parseStringArray(row.related_memory_ids_json),\n before: parseJsonObject<MemoryLifecycleEvent[\"before\"]>(row.before_json),\n after: parseJsonObject<MemoryLifecycleEvent[\"after\"]>(row.after_json),\n correlationId: typeof row.correlation_id === \"string\" ? row.correlation_id : undefined,\n });\n }\n\n return out;\n}\n\nexport function readProjectedMemoryState(\n memoryDir: string,\n memoryId: string,\n): MemoryProjectionCurrentState | null {\n return withProjectionReadonly(memoryDir, (db) => {\n const currentSelect = memoryCurrentSelectExpressions(db);\n const row = db\n .prepare(\n `\n SELECT\n memory_id,\n category,\n status,\n lifecycle_state,\n path_rel,\n created_at,\n updated_at,\n archived_at,\n superseded_at,\n entity_ref,\n source,\n confidence,\n confidence_tier,\n memory_kind,\n access_count,\n last_accessed,\n ${currentSelect.tagsJson},\n ${currentSelect.previewText},\n ${currentSelect.privateRecord}\n FROM memory_current\n WHERE memory_id = ?\n `,\n )\n .get(memoryId) as Record<string, unknown> | undefined;\n return parseCurrentRow(memoryDir, row);\n });\n}\n\nexport function readProjectedMemoryTimeline(\n memoryDir: string,\n memoryId: string,\n limit: number,\n): MemoryLifecycleEvent[] | null {\n const db = openProjectionReadonly(memoryDir);\n if (!db) return null;\n\n try {\n const rows = db\n .prepare(\n `\n SELECT * FROM (\n SELECT\n event_id,\n memory_id,\n event_type,\n timestamp,\n event_order,\n actor,\n reason_code,\n rule_version,\n related_memory_ids_json,\n before_json,\n after_json,\n correlation_id\n FROM memory_timeline\n WHERE memory_id = ?\n ORDER BY timestamp DESC, event_order DESC\n LIMIT ?\n )\n ORDER BY timestamp ASC, event_order ASC\n `,\n )\n .all(memoryId, limit) as Array<Record<string, unknown>>;\n if (rows.length === 0) return null;\n return parseTimelineRows(rows);\n } catch {\n return null;\n } finally {\n db.close();\n }\n}\n\nexport function readProjectedMemoryBrowse(\n memoryDir: string,\n options: ProjectedMemoryBrowseOptions,\n): ProjectedMemoryBrowsePage | null {\n return withProjectionReadonly(memoryDir, (db) => {\n const normalizedQuery = options.query?.trim().toLowerCase() ?? \"\";\n const currentSelect = memoryCurrentSelectExpressions(db);\n if ((options.excludeTags?.length ?? 0) > 0 && currentSelect.tagsJson.startsWith(\"'[]'\"))\n throw new Error(\"tag exclusions require tags_json\");\n if (options.excludePrivateRecords && !currentSelect.hasPrivateRecord)\n throw new Error(\"private-record exclusions require private_record\");\n const whereClauses: string[] = [];\n const params: unknown[] = [];\n if (options.status) { whereClauses.push(\"status = ?\"); params.push(options.status); }\n if (options.category) { whereClauses.push(\"category = ?\"); params.push(options.category); }\n for (const tag of options.excludeTags ?? []) {\n whereClauses.push(\"NOT EXISTS (SELECT 1 FROM json_each(memory_current.tags_json) WHERE value = ?)\");\n params.push(tag);\n }\n if (options.excludePrivateRecords) whereClauses.push(\"private_record = 0\");\n const orderBySql = (() => {\n switch (options.sort ?? \"updated_desc\") {\n case \"updated_asc\":\n return \"updated_at ASC, created_at ASC, memory_id ASC\";\n case \"created_desc\":\n return \"created_at DESC, updated_at DESC, memory_id ASC\";\n case \"created_asc\":\n return \"created_at ASC, updated_at ASC, memory_id ASC\";\n default:\n return \"updated_at DESC, created_at DESC, memory_id ASC\";\n }\n })();\n if (normalizedQuery) {\n const queryWhereClauses = currentSelect.hasPathValid\n ? [...whereClauses, ...projectedBrowsePathSqlClauses(), \"path_valid = 1\"]\n : whereClauses;\n const queryWhereSql = queryWhereClauses.length > 0\n ? `WHERE ${queryWhereClauses.join(\" AND \")}`\n : \"\";\n const rows = db\n .prepare(`\n SELECT\n memory_id,\n path_rel,\n category,\n status,\n created_at,\n updated_at,\n entity_ref,\n ${currentSelect.tagsJson},\n ${currentSelect.previewText}\n FROM memory_current\n ${queryWhereSql}\n ORDER BY ${orderBySql}\n `)\n .iterate(...params) as Iterable<Record<string, unknown>>;\n const pageRows: ProjectedMemoryBrowseRow[] = [];\n let total = 0;\n\n for (const row of rows) {\n if (typeof row.memory_id !== \"string\" || typeof row.path_rel !== \"string\") continue;\n const filePath = resolveProjectedMemoryPath(\n memoryDir,\n row.path_rel,\n currentSelect.hasPathValid,\n );\n if (!filePath) continue;\n const preview = typeof row.preview_text === \"string\" ? row.preview_text.toLowerCase() : \"\";\n const category = typeof row.category === \"string\" ? row.category.toLowerCase() : \"\";\n const entityRef = typeof row.entity_ref === \"string\" ? row.entity_ref.toLowerCase() : \"\";\n const tags = typeof row.tags_json === \"string\" ? row.tags_json.toLowerCase() : \"\";\n let matches = preview.includes(normalizedQuery) || category.includes(normalizedQuery) ||\n entityRef.includes(normalizedQuery) || tags.includes(normalizedQuery);\n if (!matches) {\n try {\n matches = fs.readFileSync(filePath, \"utf-8\").toLowerCase().includes(normalizedQuery);\n } catch {\n matches = false;\n }\n }\n if (!matches) continue;\n if (total >= options.offset && pageRows.length < options.limit) {\n const browseRow = projectedBrowseRowFromCurrentRow(memoryDir, row, filePath);\n if (browseRow) pageRows.push(browseRow);\n }\n total += 1;\n }\n\n return { total, memories: pageRows };\n }\n\n const browseWhereClauses = [...whereClauses, ...projectedBrowsePathSqlClauses()];\n if (currentSelect.hasPathValid) {\n browseWhereClauses.push(\"path_valid = 1\");\n }\n const browseWhereSql = `WHERE ${browseWhereClauses.join(\" AND \")}`;\n\n if (currentSelect.hasPathValid) {\n const rows = db\n .prepare(`\n SELECT\n memory_id,\n path_rel,\n category,\n status,\n created_at,\n updated_at,\n entity_ref,\n ${currentSelect.tagsJson},\n ${currentSelect.previewText}\n FROM memory_current\n ${browseWhereSql}\n ORDER BY ${orderBySql}\n `)\n .iterate(...params) as Iterable<Record<string, unknown>>;\n const pageRows: ProjectedMemoryBrowseRow[] = [];\n let validRowsSeen = 0;\n for (const row of rows) {\n const browseRow = projectedBrowseRowFromCurrentRow(memoryDir, row, undefined, true);\n if (!browseRow) continue;\n if (validRowsSeen >= options.offset) {\n pageRows.push(browseRow);\n if (pageRows.length >= options.limit) break;\n }\n validRowsSeen += 1;\n }\n const totalRow = db\n .prepare(`SELECT COUNT(*) AS total FROM memory_current ${browseWhereSql}`)\n .get(...params) as { total: number };\n return { total: totalRow.total, memories: pageRows };\n }\n\n // Legacy projections have no materialized path validity. Preserve the\n // realpath-aware full scan rather than trusting rows from an older writer.\n const pageRows: ProjectedMemoryBrowseRow[] = [];\n const fetchSize = Math.max(options.limit * 2, 50);\n let validRowsSeen = 0;\n let scanOffset = 0;\n\n while (true) {\n const rows = db\n .prepare(`\n SELECT\n memory_id,\n path_rel,\n category,\n status,\n created_at,\n updated_at,\n entity_ref,\n ${currentSelect.tagsJson},\n ${currentSelect.previewText}\n FROM memory_current\n ${browseWhereSql}\n ORDER BY ${orderBySql}\n LIMIT ? OFFSET ?\n `)\n .all(...params, fetchSize, scanOffset) as Array<Record<string, unknown>>;\n if (rows.length === 0) break;\n scanOffset += rows.length;\n for (const row of rows) {\n const browseRow = projectedBrowseRowFromCurrentRow(memoryDir, row);\n if (!browseRow) continue;\n if (validRowsSeen >= options.offset && pageRows.length < options.limit) {\n pageRows.push(browseRow);\n }\n validRowsSeen += 1;\n }\n if (rows.length < fetchSize) break;\n }\n\n return {\n total: validRowsSeen,\n memories: pageRows,\n };\n });\n}\n\nexport function readProjectedEntityMentions(\n memoryDir: string,\n memoryIds?: Set<string>,\n): ProjectedEntityMentionRow[] | null {\n const db = openProjectionReadonly(memoryDir);\n if (!db) return null;\n\n try {\n const rows = db\n .prepare(`\n SELECT\n memory_id,\n entity_ref,\n mention_source,\n created_at,\n updated_at\n FROM memory_entity_mentions\n ORDER BY entity_ref ASC, updated_at DESC, memory_id ASC\n `)\n .all() as Array<Record<string, unknown>>;\n\n return rows\n .filter(\n (row) =>\n typeof row.memory_id === \"string\" &&\n typeof row.entity_ref === \"string\" &&\n typeof row.mention_source === \"string\" &&\n typeof row.created_at === \"string\" &&\n typeof row.updated_at === \"string\" &&\n (!memoryIds || memoryIds.has(row.memory_id)),\n )\n .map((row) => ({\n memoryId: row.memory_id as string,\n entityRef: row.entity_ref as string,\n mentionSource: row.mention_source as string,\n created: row.created_at as string,\n updated: row.updated_at as string,\n }));\n } catch {\n return null;\n } finally {\n db.close();\n }\n}\n\nexport function readProjectedNativeKnowledgeChunks(\n memoryDir: string,\n): ProjectedNativeKnowledgeChunkRow[] | null {\n const db = openProjectionReadonly(memoryDir);\n if (!db) return null;\n\n try {\n const rows = db\n .prepare(`\n SELECT\n chunk_id,\n source_path,\n title,\n source_kind,\n start_line,\n end_line,\n derived_date,\n session_key,\n workflow_key,\n author,\n agent,\n namespace,\n privacy_class,\n source_hash,\n preview_text\n FROM native_knowledge_chunks\n ORDER BY source_kind ASC, source_path ASC, start_line ASC\n `)\n .all() as Array<Record<string, unknown>>;\n\n return rows\n .filter(\n (row) =>\n typeof row.chunk_id === \"string\" &&\n typeof row.source_path === \"string\" &&\n typeof row.title === \"string\" &&\n typeof row.source_kind === \"string\" &&\n typeof row.start_line === \"number\" &&\n typeof row.end_line === \"number\" &&\n typeof row.preview_text === \"string\",\n )\n .map((row) => ({\n chunkId: row.chunk_id as string,\n sourcePath: row.source_path as string,\n title: row.title as string,\n sourceKind: row.source_kind as string,\n startLine: row.start_line as number,\n endLine: row.end_line as number,\n derivedDate: typeof row.derived_date === \"string\" ? row.derived_date : undefined,\n sessionKey: typeof row.session_key === \"string\" ? row.session_key : undefined,\n workflowKey: typeof row.workflow_key === \"string\" ? row.workflow_key : undefined,\n author: typeof row.author === \"string\" ? row.author : undefined,\n agent: typeof row.agent === \"string\" ? row.agent : undefined,\n namespace: typeof row.namespace === \"string\" ? row.namespace : undefined,\n privacyClass: typeof row.privacy_class === \"string\" ? row.privacy_class : undefined,\n sourceHash: typeof row.source_hash === \"string\" ? row.source_hash : undefined,\n preview: row.preview_text as string,\n }));\n } catch {\n return null;\n } finally {\n db.close();\n }\n}\n\nexport function readProjectedLatestReviewQueue(\n memoryDir: string,\n): ProjectedReviewQueueSnapshot | null {\n const db = openProjectionReadonly(memoryDir);\n if (!db) return null;\n\n try {\n const latestRunId =\n (db.prepare(`SELECT value FROM meta WHERE key = 'latestGovernanceRunId'`).get() as { value?: string } | undefined)\n ?.value\n ?? (db.prepare(`SELECT run_id AS value FROM memory_review_runs ORDER BY created_at DESC LIMIT 1`).get() as {\n value?: string;\n } | undefined)?.value;\n if (!latestRunId) {\n return { found: false };\n }\n\n const runRow = db\n .prepare(`\n SELECT\n run_id,\n summary_json,\n metrics_json,\n applied_actions_json,\n report_markdown\n FROM memory_review_runs\n WHERE run_id = ?\n `)\n .get(latestRunId) as Record<string, unknown> | undefined;\n if (!runRow || typeof runRow.run_id !== \"string\") {\n return { found: false };\n }\n\n const queueRows = db\n .prepare(`\n SELECT\n entry_id,\n memory_id,\n path,\n reason_code,\n severity,\n suggested_action,\n suggested_status,\n related_memory_ids_json\n FROM memory_review_queue\n WHERE run_id = ?\n ORDER BY reason_code ASC, memory_id ASC\n `)\n .all(latestRunId) as Array<Record<string, unknown>>;\n\n const actionRows = db\n .prepare(`\n SELECT\n row_key,\n action,\n memory_id,\n reason_code,\n before_status,\n after_status,\n original_path,\n current_path\n FROM memory_review_actions\n WHERE run_id = ?\n ORDER BY memory_id ASC, action ASC\n `)\n .all(latestRunId) as Array<Record<string, unknown>>;\n\n const reviewQueue: MemoryGovernanceReviewQueueEntry[] = queueRows\n .filter(\n (row) =>\n typeof row.entry_id === \"string\" &&\n typeof row.memory_id === \"string\" &&\n typeof row.path === \"string\" &&\n typeof row.reason_code === \"string\" &&\n typeof row.severity === \"string\" &&\n typeof row.suggested_action === \"string\",\n )\n .map((row) => ({\n entryId: row.entry_id as string,\n memoryId: row.memory_id as string,\n path: row.path as string,\n reasonCode: row.reason_code as MemoryGovernanceReviewQueueEntry[\"reasonCode\"],\n severity: row.severity as MemoryGovernanceReviewQueueEntry[\"severity\"],\n suggestedAction: row.suggested_action as MemoryGovernanceReviewQueueEntry[\"suggestedAction\"],\n suggestedStatus:\n typeof row.suggested_status === \"string\"\n ? (row.suggested_status as MemoryGovernanceReviewQueueEntry[\"suggestedStatus\"])\n : undefined,\n relatedMemoryIds: parseStringArray(row.related_memory_ids_json),\n }));\n\n return {\n found: true,\n runId: latestRunId,\n summary: parseJsonObject<MemoryGovernanceSummary>(runRow.summary_json),\n metrics: parseJsonObject<MemoryGovernanceMetrics>(runRow.metrics_json),\n reviewQueue,\n appliedActions:\n actionRows.length > 0\n ? actionRows\n .filter(\n (row) =>\n typeof row.action === \"string\" &&\n typeof row.memory_id === \"string\" &&\n typeof row.reason_code === \"string\" &&\n typeof row.before_status === \"string\" &&\n typeof row.original_path === \"string\" &&\n typeof row.current_path === \"string\",\n )\n .map((row) => ({\n action: row.action as MemoryGovernanceAppliedAction[\"action\"],\n memoryId: row.memory_id as string,\n reasonCode: row.reason_code as MemoryGovernanceAppliedAction[\"reasonCode\"],\n beforeStatus: row.before_status as MemoryGovernanceAppliedAction[\"beforeStatus\"],\n afterStatus:\n typeof row.after_status === \"string\"\n ? (row.after_status as MemoryGovernanceAppliedAction[\"afterStatus\"])\n : undefined,\n originalPath: row.original_path as string,\n currentPath: row.current_path as string,\n }))\n : (parseJsonObject<MemoryGovernanceAppliedAction[]>(runRow.applied_actions_json) ?? []),\n report: typeof runRow.report_markdown === \"string\" ? runRow.report_markdown : undefined,\n };\n } catch {\n return null;\n } finally {\n db.close();\n }\n}\n\nexport function readProjectedGovernanceRecord(\n memoryDir: string,\n): {\n runId: string;\n summary: unknown;\n metrics: unknown;\n reviewQueueRows: MemoryProjectionGovernanceReviewQueueRow[];\n appliedActionRows: MemoryProjectionGovernanceAppliedActionRow[];\n report: string;\n} | null {\n const snapshot = readProjectedLatestReviewQueue(memoryDir);\n if (!snapshot?.found || !snapshot.runId) return null;\n\n return {\n runId: snapshot.runId,\n summary: snapshot.summary ?? {},\n metrics: snapshot.metrics ?? {},\n reviewQueueRows: (snapshot.reviewQueue ?? []).map((entry) => ({\n runId: snapshot.runId as string,\n entryId: entry.entryId,\n memoryId: entry.memoryId,\n path: entry.path,\n reasonCode: entry.reasonCode,\n severity: entry.severity,\n suggestedAction: entry.suggestedAction,\n suggestedStatus: entry.suggestedStatus,\n relatedMemoryIds: [...entry.relatedMemoryIds],\n })),\n appliedActionRows: (snapshot.appliedActions ?? []).map((action) => ({\n runId: snapshot.runId as string,\n rowKey: [\n action.action,\n action.memoryId,\n action.reasonCode,\n action.originalPath,\n action.currentPath,\n ].join(\"::\"),\n action: action.action,\n memoryId: action.memoryId,\n reasonCode: action.reasonCode,\n beforeStatus: action.beforeStatus,\n afterStatus: action.afterStatus,\n originalPath: action.originalPath,\n currentPath: action.currentPath,\n })),\n report: snapshot.report ?? \"\",\n };\n}\n"],"mappings":"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","names":["pageRows","validRowsSeen"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/location/registry.ts","../src/location/intervals.ts","../src/location/store.ts","../src/location/pipeline.ts","../src/location/cli.ts","../src/location/provider-setup.ts","../src/location/surfaces.ts"],"sourcesContent":["/**\n * Location provider registry (issue #2044).\n *\n * In-memory only: host adapters register provider implementations at startup.\n * Core never statically imports an optional provider package — the registry\n * holds whatever the host wired in, and a configured source whose provider is\n * not registered is skipped (not an error), so partial installs keep working.\n */\n\nimport type { LocationProvider } from \"./types.js\";\n\nconst PROVIDER_ID_PATTERN = /^[a-z0-9][a-z0-9-]*$/;\n\nconst providers = new Map<string, LocationProvider>();\n\nfunction assertValidProvider(provider: LocationProvider): void {\n if (typeof provider !== \"object\" || provider === null) {\n throw new TypeError(\"location provider must be an object\");\n }\n if (typeof provider.id !== \"string\" || !PROVIDER_ID_PATTERN.test(provider.id)) {\n throw new RangeError(\n \"location provider id must be a non-empty lowercase kebab string (a-z, 0-9, hyphens)\",\n );\n }\n if (typeof provider.displayName !== \"string\" || provider.displayName.trim().length === 0) {\n throw new TypeError(`location provider '${provider.id}' must declare a non-empty displayName`);\n }\n if (typeof provider.verify !== \"function\" || typeof provider.fetchObservations !== \"function\") {\n throw new TypeError(\n `location provider '${provider.id}' must implement verify() and fetchObservations()`,\n );\n }\n}\n\nexport function registerLocationProvider(provider: LocationProvider): void {\n assertValidProvider(provider);\n if (providers.has(provider.id)) {\n throw new Error(`location provider '${provider.id}' is already registered`);\n }\n providers.set(provider.id, provider);\n}\n\nexport function getLocationProvider(id: string): LocationProvider | undefined {\n return typeof id === \"string\" ? providers.get(id) : undefined;\n}\n\nexport function listLocationProviders(): string[] {\n return [...providers.keys()].sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));\n}\n\n/** Test-only: reset the registry between cases. */\nexport function clearLocationProviders(): void {\n providers.clear();\n}\n","/**\n * Location interval math (issue #2044).\n *\n * Pure, deterministic helpers over UTC ISO-8601 instants: half-open\n * [start, end) day windows (reusing the DST-correct activity day-window), IANA\n * local-day bucketing, overlap, observation→segment dwell, and dominant-place\n * selection with stable tie-breaking. No IO, no clocks, no randomness.\n */\n\nimport { activityDayWindow, isValidActivityDate } from \"../activity/digest.js\";\nimport type { LocationObservation, LocationPlace, LocationSegment } from \"./types.js\";\n\nexport function isValidLocationDate(date: string): boolean {\n return isValidActivityDate(date);\n}\n\n/** Half-open [start, end) UTC ISO bounds of a local day. */\nexport function locationDayWindow(date: string, timezone: string): { startUtc: string; endUtc: string } {\n if (!isValidActivityDate(date)) {\n throw new RangeError(`Invalid location date \"${date}\"; expected a real YYYY-MM-DD day.`);\n }\n return activityDayWindow(date, timezone);\n}\n\nfunction assertFiniteInstant(iso: string, what: string): number {\n const ms = Date.parse(iso);\n if (typeof iso !== \"string\" || !Number.isFinite(ms)) {\n throw new RangeError(`${what} must be a UTC ISO-8601 instant; got \"${String(iso)}\"`);\n }\n return ms;\n}\n\n/** The IANA local calendar day (YYYY-MM-DD) an instant falls in. */\nexport function localDayKey(instantUtc: string, timezone: string): string {\n assertFiniteInstant(instantUtc, \"instantUtc\");\n return new Intl.DateTimeFormat(\"en-CA\", {\n timeZone: timezone,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n }).format(new Date(instantUtc));\n}\n\nfunction compareObservations(a: LocationObservation, b: LocationObservation): number {\n if (a.observedAtUtc !== b.observedAtUtc) {\n return a.observedAtUtc < b.observedAtUtc ? -1 : 1;\n }\n // Total comparator (§12): equal-key observations fall back to place id so\n // ordering — and therefore dwell attribution — is deterministic.\n if (a.place.id !== b.place.id) {\n return a.place.id < b.place.id ? -1 : 1;\n }\n return 0;\n}\n\n/** Bucket observations into their IANA local days, sorted within each day. */\nexport function bucketObservationsByDay(\n observations: readonly LocationObservation[],\n timezone: string,\n): Map<string, LocationObservation[]> {\n const buckets = new Map<string, LocationObservation[]>();\n for (const observation of observations) {\n assertFiniteInstant(observation.observedAtUtc, \"observation observedAtUtc\");\n const key = localDayKey(observation.observedAtUtc, timezone);\n const bucket = buckets.get(key);\n if (bucket === undefined) buckets.set(key, [observation]);\n else bucket.push(observation);\n }\n for (const bucket of buckets.values()) bucket.sort(compareObservations);\n return buckets;\n}\n\n/** Overlap in ms of two half-open intervals; 0 when disjoint. */\nexport function intervalOverlapMs(\n a: { startUtc: string; endUtc: string },\n b: { startUtc: string; endUtc: string },\n): number {\n const overlap =\n Math.min(Date.parse(a.endUtc), Date.parse(b.endUtc)) - Math.max(Date.parse(a.startUtc), Date.parse(b.startUtc));\n return Math.max(0, overlap);\n}\n\nfunction placeForSegment(place: LocationPlace, retainCoordinates: boolean): LocationPlace {\n if (retainCoordinates || place.latitude === undefined || place.longitude === undefined) {\n return place;\n }\n return {\n id: place.id,\n label: place.label,\n ...(place.kind === undefined ? {} : { kind: place.kind }),\n };\n}\n\n/**\n * Derive place-visit segments from a day's observations: each observation\n * covers [its instant, the next observation's instant ∩ window end). The last\n * observation is capped by the window end, so dwell never crosses the day\n * boundary. Out-of-window observations are a provider contract violation and\n * are rejected loudly rather than silently reshaping the day. Coordinates are\n * stripped unless `retainCoordinates` is set.\n */\nexport function observationSegments(\n observations: readonly LocationObservation[],\n window: { startUtc: string; endUtc: string },\n options: { retainCoordinates: boolean },\n): LocationSegment[] {\n const startMs = assertFiniteInstant(window.startUtc, \"window startUtc\");\n const endMs = assertFiniteInstant(window.endUtc, \"window endUtc\");\n if (startMs >= endMs) {\n throw new RangeError(\"location window must satisfy startUtc < endUtc\");\n }\n const ordered = [...observations].sort(compareObservations);\n const segments: LocationSegment[] = [];\n for (let index = 0; index < ordered.length; index += 1) {\n const current = ordered[index]!;\n const currentMs = Date.parse(current.observedAtUtc);\n if (currentMs < startMs || currentMs >= endMs) {\n throw new RangeError(\n `location observation at \"${current.observedAtUtc}\" falls outside the requested [${window.startUtc}, ${window.endUtc}) window`,\n );\n }\n const nextMs =\n index + 1 < ordered.length ? Date.parse(ordered[index + 1]!.observedAtUtc) : endMs;\n const segmentEndMs = Math.min(nextMs, endMs);\n if (currentMs >= segmentEndMs) continue;\n segments.push({\n startUtc: new Date(currentMs).toISOString(),\n endUtc: new Date(segmentEndMs).toISOString(),\n place: placeForSegment(current.place, options.retainCoordinates),\n });\n }\n return segments;\n}\n\n/** Total time a place was occupied (union of its segment intervals, ms). */\nexport interface PlaceDuration {\n place: LocationPlace;\n totalMs: number;\n /** Earliest segment start contributing to this place's total. */\n firstStartUtc: string;\n}\n\nfunction unionIntervalMs(segments: readonly LocationSegment[]): number {\n // Merge overlapping [start, end) intervals per place so two providers\n // observing the same visit do not double-count its duration.\n const bounds = segments\n .map((segment) => ({ start: Date.parse(segment.startUtc), end: Date.parse(segment.endUtc) }))\n .sort((a, b) => (a.start !== b.start ? a.start - b.start : a.end - b.end));\n let total = 0;\n let sweepStart: number | null = null;\n let sweepEnd = 0;\n for (const bound of bounds) {\n if (sweepStart === null || bound.start > sweepEnd) {\n if (sweepStart !== null) total += sweepEnd - sweepStart;\n sweepStart = bound.start;\n sweepEnd = bound.end;\n } else if (bound.end > sweepEnd) {\n sweepEnd = bound.end;\n }\n }\n if (sweepStart !== null) total += sweepEnd - sweepStart;\n return total;\n}\n\n/** Per-place totals across every segment given (multi-source safe). */\nexport function placeDurations(segments: readonly LocationSegment[]): PlaceDuration[] {\n const byPlace = new Map<string, { place: LocationPlace; segments: LocationSegment[]; firstStartUtc: string }>();\n for (const segment of segments) {\n const existing = byPlace.get(segment.place.id);\n if (existing === undefined) {\n byPlace.set(segment.place.id, { place: segment.place, segments: [segment], firstStartUtc: segment.startUtc });\n continue;\n }\n existing.segments.push(segment);\n if (segment.startUtc < existing.firstStartUtc) existing.firstStartUtc = segment.startUtc;\n // Two providers may label the same place id differently; keep the\n // lexicographically smallest label so rendering stays deterministic.\n if (segment.place.label < existing.place.label) existing.place = segment.place;\n }\n const durations: PlaceDuration[] = [...byPlace.values()].map((entry) => ({\n place: entry.place,\n totalMs: unionIntervalMs(entry.segments),\n firstStartUtc: entry.firstStartUtc,\n }));\n durations.sort((a, b) => {\n if (a.place.id !== b.place.id) return a.place.id < b.place.id ? -1 : 1;\n return 0;\n });\n return durations;\n}\n\nexport interface DominantPlaceResult {\n place: LocationPlace;\n totalMs: number;\n}\n\n/**\n * The place with the longest total occupancy. Ties are stable and\n * deterministic: earlier first start wins, then the lexicographically smaller\n * place id — never insertion order.\n */\nexport function dominantPlace(segments: readonly LocationSegment[]): DominantPlaceResult | null {\n const durations = placeDurations(segments);\n let best: PlaceDuration | null = null;\n for (const duration of durations) {\n if (best === null) {\n best = duration;\n continue;\n }\n if (duration.totalMs !== best.totalMs) {\n if (duration.totalMs > best.totalMs) best = duration;\n continue;\n }\n if (duration.firstStartUtc !== best.firstStartUtc) {\n if (duration.firstStartUtc < best.firstStartUtc) best = duration;\n continue;\n }\n if (duration.place.id < best.place.id) best = duration;\n }\n return best === null ? null : { place: best.place, totalMs: best.totalMs };\n}\n","/**\n * Location day-file + sync-state store (issue #2044).\n *\n * Day documents live at `<memoryDir>/locations/<YYYY-MM-DD>.md` — OUTSIDE the\n * memory scan roots (facts/, entities/, …) so raw location history never\n * surfaces as a memory in recall or governance passes, and INSIDE the QMD\n * collection root so the markdown stays full-text searchable once an index\n * update runs. Per-source sync state lives at\n * `<memoryDir>/state/locations/sync.json` and is written only after the day\n * document is durable (see pipeline.ts).\n *\n * Both writes are atomic (temp file + rename) and containment-checked: a\n * symlinked `locations/` root or day file is rejected even when it resolves\n * inside the memory dir (AGENTS.md pattern #3), and a path that escapes the\n * memory dir is refused outright.\n */\n\nimport { createHash } from \"node:crypto\";\nimport { lstat, mkdir, readFile, readdir, realpath } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { writeFileAtomically } from \"../maintenance/atomic-file.js\";\nimport { pathIsInside } from \"../utils/path-containment.js\";\nimport { isValidLocationDate, placeDurations } from \"./intervals.js\";\nimport type { LocationSegment } from \"./types.js\";\n\nexport const LOCATIONS_DIR_NAME = \"locations\";\nexport const LOCATION_DAY_KIND = \"location-day\";\nexport const LOCATION_DAY_FORMAT_VERSION = 1;\n\n/** Cap on remembered day payloads per source (~3 months of days). */\nconst MAX_TRACKED_LOCATION_DAYS = 90;\n\nconst DAY_FILE_NAME_PATTERN = /^\\d{4}-\\d{2}-\\d{2}\\.md$/;\n\n// Serializes state load→mutate→save sections per state file so two sources\n// syncing concurrently cannot lose-update each other's entries.\nconst stateLocks = new Map<string, Promise<unknown>>();\n\nfunction withStateLock<T>(key: string, fn: () => Promise<T>): Promise<T> {\n const prior = stateLocks.get(key) ?? Promise.resolve();\n const next = prior.then(fn, fn);\n const tail = next.then(\n () => undefined,\n () => undefined,\n );\n stateLocks.set(key, tail);\n void tail.then(() => {\n if (stateLocks.get(key) === tail) stateLocks.delete(key);\n });\n return next;\n}\n\nexport function locationDayFilePath(memoryDir: string, date: string): string {\n if (!isValidLocationDate(date)) {\n // Never interpolate an unvalidated date into a filesystem path (a `../`\n // would escape <memoryDir>/locations/). Reject loudly.\n throw new RangeError(`Invalid location date \"${date}\"; expected a real YYYY-MM-DD day.`);\n }\n return path.join(memoryDir, LOCATIONS_DIR_NAME, `${date}.md`);\n}\n\nexport function locationSyncStateFilePath(memoryDir: string): string {\n return path.join(memoryDir, \"state\", \"locations\", \"sync.json\");\n}\n\n/** A source's derived day payload, kept in sync state for multi-source merges. */\nexport interface LocationSourceDayPayload {\n observationCount: number;\n segments: LocationSegment[];\n providerDisplayName?: string;\n}\n\nexport interface LocationSourceSyncState {\n lastSyncedAtUtc?: string;\n days?: Record<string, LocationSourceDayPayload>;\n}\n\nexport interface LocationSyncStateFile {\n version: 1;\n sources: Record<string, LocationSourceSyncState>;\n}\n\nexport function emptyLocationSyncState(): LocationSyncStateFile {\n return { version: 1, sources: {} };\n}\n\nexport async function loadLocationSyncState(memoryDir: string): Promise<LocationSyncStateFile> {\n let raw: string;\n try {\n raw = await readFile(locationSyncStateFilePath(memoryDir), \"utf-8\");\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return emptyLocationSyncState();\n throw err;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n // A corrupt state file must not brick syncing forever; treat it as a cold\n // start. The worst case is re-syncing days already on disk, and the day\n // file's contentHash makes that rewrite idempotent.\n return emptyLocationSyncState();\n }\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n Array.isArray(parsed) ||\n typeof (parsed as LocationSyncStateFile).sources !== \"object\" ||\n (parsed as LocationSyncStateFile).sources === null\n ) {\n return emptyLocationSyncState();\n }\n return { version: 1, sources: (parsed as LocationSyncStateFile).sources };\n}\n\nexport async function saveLocationSyncState(\n memoryDir: string,\n state: LocationSyncStateFile,\n): Promise<void> {\n await mkdir(path.dirname(locationSyncStateFilePath(memoryDir)), { recursive: true, mode: 0o700 });\n await writeFileAtomically(\n locationSyncStateFilePath(memoryDir),\n `${JSON.stringify(state, null, 2)}\\n`,\n );\n}\n\nfunction pruneSourceDays(source: LocationSourceSyncState): void {\n const days = source.days;\n if (days === undefined) return;\n const keys = Object.keys(days).sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));\n for (const key of keys.slice(0, Math.max(0, keys.length - MAX_TRACKED_LOCATION_DAYS))) {\n delete days[key];\n }\n}\n\n/**\n * Record one source's completed day sync. Runs the whole read-modify-write\n * under the per-directory state lock so concurrent sources cannot clobber\n * each other, and prunes day payloads beyond the retention cap.\n */\nexport async function updateLocationSourceDay(\n memoryDir: string,\n sourceId: string,\n date: string,\n payload: LocationSourceDayPayload,\n completedAtUtc: string,\n): Promise<LocationSyncStateFile> {\n if (!isValidLocationDate(date)) {\n throw new RangeError(`Invalid location date \"${date}\"; expected a real YYYY-MM-DD day.`);\n }\n return withStateLock(locationSyncStateFilePath(memoryDir), async () => {\n const state = await loadLocationSyncState(memoryDir);\n const source = state.sources[sourceId] ?? {};\n const days = source.days ?? {};\n days[date] = payload;\n source.days = days;\n source.lastSyncedAtUtc = completedAtUtc;\n state.sources[sourceId] = source;\n for (const candidate of Object.values(state.sources)) pruneSourceDays(candidate);\n await saveLocationSyncState(memoryDir, state);\n return state;\n });\n}\n/** Frontmatter persisted on a rendered day document. */\nexport interface LocationDayMeta {\n kind: typeof LOCATION_DAY_KIND;\n date: string;\n timezone: string;\n formatVersion: number;\n sources: string[];\n observationCount: number;\n /** SHA-256 of the rendered body (rebuild idempotency). */\n contentHash: string;\n}\n\n/** A parsed day document (frontmatter + rendered body). */\nexport interface LocationDayDocument {\n meta: LocationDayMeta;\n body: string;\n}\n\n/** The per-source view a day document is composed from. */\nexport interface LocationDaySourceEntry extends LocationSourceDayPayload {\n /** Provider display name for the timeline heading; falls back to the id. */\n providerDisplayName?: string;\n}\n\nexport function hashLocationBody(body: string): string {\n return createHash(\"sha256\").update(body, \"utf8\").digest(\"hex\");\n}\n\nfunction clockHhMm(iso: string, timezone: string): string {\n return new Intl.DateTimeFormat(\"en-GB\", {\n timeZone: timezone,\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n }).format(new Date(iso));\n}\n\nfunction formatDuration(ms: number): string {\n const totalMinutes = Math.round(ms / 60_000);\n const hours = Math.floor(totalMinutes / 60);\n const minutes = totalMinutes % 60;\n if (hours <= 0) return `${minutes}m`;\n return `${hours}h ${String(minutes).padStart(2, \"0\")}m`;\n}\n\n/** Collapse whitespace and strip markdown emphasis/backticks from a label. */\nfunction safeLabel(label: string): string {\n return label.replace(/\\s+/g, \" \").replace(/[`*_]/g, \"\").trim();\n}\n\nfunction formatPlaceLabel(segment: LocationSegment): string {\n const label = safeLabel(segment.place.label);\n return segment.place.kind === undefined ? label : `${label} (${segment.place.kind})`;\n}\n\nfunction formatCoordinates(segment: LocationSegment): string {\n if (segment.place.latitude === undefined || segment.place.longitude === undefined) return \"\";\n return ` @ ${segment.place.latitude.toFixed(4)},${segment.place.longitude.toFixed(4)}`;\n}\n\nexport function composeLocationDayBody(\n date: string,\n timezone: string,\n sources: Record<string, LocationDaySourceEntry>,\n): string {\n const lines: string[] = [`# Location day — ${date} (${timezone})`, \"\"];\n const allSegments: LocationSegment[] = [];\n let observationCount = 0;\n for (const entry of Object.values(sources)) {\n allSegments.push(...entry.segments);\n observationCount += entry.observationCount;\n }\n\n lines.push(\"## Summary\", \"\");\n if (observationCount === 0) {\n lines.push(\"No location observations recorded.\", \"\");\n } else {\n const durations = placeDurations(allSegments).sort((a, b) => b.totalMs - a.totalMs);\n lines.push(\n `- Places visited: ${durations.length}`,\n ...durations.map(\n (duration) => `- ${safeLabel(duration.place.label)}: ${formatDuration(duration.totalMs)}`,\n ),\n \"\",\n );\n }\n\n const sourceIds = Object.keys(sources).sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));\n for (const sourceId of sourceIds) {\n const entry = sources[sourceId]!;\n lines.push(`## Timeline — ${safeLabel(entry.providerDisplayName ?? sourceId)}`, \"\");\n if (entry.segments.length === 0) {\n lines.push(\"No observations.\", \"\");\n continue;\n }\n for (const segment of entry.segments) {\n lines.push(\n `- ${clockHhMm(segment.startUtc, timezone)}–${clockHhMm(segment.endUtc, timezone)} — ${formatPlaceLabel(segment)}${formatCoordinates(segment)}`,\n );\n }\n lines.push(\"\");\n }\n return `${lines.join(\"\\n\").trimEnd()}\\n`;\n}\n\nexport function composeLocationDayMeta(\n date: string,\n timezone: string,\n sources: Record<string, LocationDaySourceEntry>,\n body: string,\n): LocationDayMeta {\n let observationCount = 0;\n for (const entry of Object.values(sources)) observationCount += entry.observationCount;\n return {\n kind: LOCATION_DAY_KIND,\n date,\n timezone,\n formatVersion: LOCATION_DAY_FORMAT_VERSION,\n sources: Object.keys(sources).sort((a, b) => (a < b ? -1 : a > b ? 1 : 0)),\n observationCount,\n contentHash: hashLocationBody(body),\n };\n}\n\nfunction frontmatterScalar(key: string, value: string | number): string {\n return `${key}: ${typeof value === \"number\" ? value : JSON.stringify(value)}`;\n}\n\nfunction frontmatterList(key: string, values: readonly string[]): string[] {\n if (values.length === 0) return [`${key}: []`];\n const lines = [`${key}:`];\n for (const value of values) lines.push(` - ${JSON.stringify(value)}`);\n return lines;\n}\n\nexport function serializeLocationDay(meta: LocationDayMeta, body: string): string {\n const lines: string[] = [\"---\"];\n lines.push(frontmatterScalar(\"kind\", meta.kind));\n lines.push(frontmatterScalar(\"date\", meta.date));\n lines.push(frontmatterScalar(\"timezone\", meta.timezone));\n lines.push(frontmatterScalar(\"formatVersion\", meta.formatVersion));\n lines.push(...frontmatterList(\"sources\", meta.sources));\n lines.push(frontmatterScalar(\"observationCount\", meta.observationCount));\n lines.push(frontmatterScalar(\"contentHash\", meta.contentHash));\n lines.push(\"---\", \"\", body);\n return lines.join(\"\\n\");\n}\n\nfunction parseScalar(raw: string): string {\n try {\n const parsed = JSON.parse(raw);\n return typeof parsed === \"string\" ? parsed : raw;\n } catch {\n return raw;\n }\n}\n\n/** A day document's frontmatter, parsed for idempotency checks and status. */\nexport interface LocationDaySummary {\n date: string;\n timezone: string;\n sources: string[];\n observationCount: number;\n contentHash: string;\n}\n\n/**\n * Parse a day document's frontmatter. Returns null when the content is not a\n * location day document (wrong kind, missing frontmatter) so callers can\n * distinguish a foreign file from a corrupt one.\n */\nexport function parseLocationDaySummary(raw: string): LocationDaySummary | null {\n if (!raw.startsWith(\"---\\n\")) return null;\n const closeIndex = raw.indexOf(\"\\n---\\n\", 4);\n if (closeIndex === -1) return null;\n const scalars: Record<string, string> = {};\n const lists: Record<string, string[]> = {};\n let currentList: string | null = null;\n for (const line of raw.slice(4, closeIndex).split(\"\\n\")) {\n const listItem = /^ {2}- (.*)$/.exec(line);\n if (listItem !== null && currentList !== null) {\n lists[currentList]!.push(parseScalar(listItem[1]!));\n continue;\n }\n currentList = null;\n const separator = line.indexOf(\":\");\n if (separator === -1) continue;\n const key = line.slice(0, separator);\n const value = line.slice(separator + 1).trim();\n if (value === \"\" || value === \"[]\") {\n lists[key] = [];\n currentList = key;\n continue;\n }\n if (value.startsWith(\"[\")) {\n lists[key] = [parseScalar(value)];\n currentList = key;\n continue;\n }\n scalars[key] = value;\n }\n if (scalars.kind === undefined || parseScalar(scalars.kind) !== LOCATION_DAY_KIND) return null;\n if (scalars.date === undefined || scalars.contentHash === undefined) return null;\n return {\n date: parseScalar(scalars.date),\n timezone: scalars.timezone === undefined ? \"UTC\" : parseScalar(scalars.timezone),\n sources: lists.sources ?? [],\n observationCount: scalars.observationCount === undefined ? 0 : Number(scalars.observationCount) || 0,\n contentHash: parseScalar(scalars.contentHash),\n };\n}\n\n// ── Containment-checked day-file IO ─────────────────────────────────────────\n\nfunction isErrnoCode(err: unknown, code: string): boolean {\n return err instanceof Error && (err as NodeJS.ErrnoException).code === code;\n}\n\nasync function assertNotSymlink(target: string, kind: \"directory\" | \"day file\"): Promise<void> {\n let stat: { isSymbolicLink(): boolean };\n try {\n stat = await lstat(target);\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) return;\n throw err;\n }\n if (stat.isSymbolicLink()) {\n throw new Error(\n `locations ${kind} '${path.basename(target)}' is a symbolic link — refusing to follow it even when it resolves inside the memory dir (AGENTS.md pattern #3)`,\n );\n }\n}\n\nasync function assertNoEscape(rootReal: string, candidate: string): Promise<void> {\n let candidateReal: string;\n try {\n candidateReal = await realpath(candidate);\n } catch {\n return;\n }\n if (!pathIsInside(rootReal, candidateReal)) {\n throw new Error(\n \"location day path resolves outside the memory dir — refusing to follow a symlink/traversal (AGENTS.md pattern #3)\",\n );\n }\n}\n\nasync function assertDayPathContained(memoryDir: string, targetPath: string): Promise<void> {\n let rootReal: string;\n try {\n rootReal = await realpath(memoryDir);\n } catch {\n rootReal = path.resolve(memoryDir);\n }\n const locationsDir = path.join(memoryDir, LOCATIONS_DIR_NAME);\n await assertNoEscape(rootReal, locationsDir);\n await assertNoEscape(rootReal, targetPath);\n // Reject a symlinked locations root or day file outright — even when the\n // link resolves inside the memory dir (aliasing / tampering) — before IO.\n await assertNotSymlink(locationsDir, \"directory\");\n await assertNotSymlink(targetPath, \"day file\");\n}\n\n/**\n * Idempotently persist a day document: skip the write when the on-disk\n * contentHash already matches. The write is atomic and containment-checked;\n * the caller (pipeline) advances sync state only after this resolves.\n */\nexport async function writeLocationDay(\n memoryDir: string,\n date: string,\n serialized: string,\n): Promise<boolean> {\n const target = locationDayFilePath(memoryDir, date);\n await assertDayPathContained(memoryDir, target);\n try {\n if ((await readFile(target, \"utf-8\")) === serialized) return false;\n } catch (err) {\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\n }\n await mkdir(path.dirname(target), { recursive: true, mode: 0o700 });\n await writeFileAtomically(target, serialized);\n return true;\n}\n\n/** Read a stored day document's raw markdown; null when absent. */\nexport async function readLocationDay(memoryDir: string, date: string): Promise<string | null> {\n const target = locationDayFilePath(memoryDir, date);\n await assertDayPathContained(memoryDir, target);\n try {\n return await readFile(target, \"utf-8\");\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) return null;\n throw err;\n }\n}\n\n/** List dates that have a stored day document, newest first. */\nexport async function listLocationDayDates(memoryDir: string): Promise<string[]> {\n const locationsDir = path.join(memoryDir, LOCATIONS_DIR_NAME);\n await assertDayPathContained(memoryDir, locationsDir);\n let entries: string[];\n try {\n entries = await readdir(locationsDir);\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) return [];\n throw err;\n }\n const dates = entries\n .filter((entry) => DAY_FILE_NAME_PATTERN.test(entry))\n .map((entry) => entry.slice(0, -3));\n dates.sort((a, b) => (a > b ? -1 : a < b ? 1 : 0));\n return dates;\n}\n","/**\n * Location day-sync pipeline (issue #2044).\n *\n * For one local day, each configured (enabled, registered) provider's\n * observations are fetched over the day's half-open UTC window, folded into\n * place-visit segments, merged with the other sources' last-known day\n * payloads from sync state, and rendered to the day document. Sync state\n * advances only AFTER the day document (when any) is durable, so a failed\n * write never moves the watermark past data that did not land. An empty\n * fetch is a successful sync — never conflated with a provider failure\n * (AGENTS.md rule 22).\n */\n\nimport { getLocationProvider } from \"./registry.js\";\nimport { locationDayWindow, observationSegments } from \"./intervals.js\";\nimport {\n composeLocationDayBody,\n composeLocationDayMeta,\n loadLocationSyncState,\n serializeLocationDay,\n updateLocationSourceDay,\n writeLocationDay,\n type LocationDaySourceEntry,\n} from \"./store.js\";\nimport type { LocationConfig, LocationObservation, LocationProvider, LocationSegment } from \"./types.js\";\n\nconst MAX_SYNC_PAGES = 10_000;\n\nexport interface LocationDaySyncOptions {\n config: LocationConfig;\n memoryDir: string;\n date: string;\n signal?: AbortSignal;\n /** Runaway-pagination guard; defaults to MAX_SYNC_PAGES. */\n maxPages?: number;\n now?: () => Date;\n /** Provider lookup seam (defaults to the registry); tests inject doubles. */\n getProvider?: (id: string) => LocationProvider | undefined;\n}\n\nexport interface LocationSourceSyncResult {\n sourceId: string;\n status: \"synced\" | \"skipped\" | \"failed\";\n skipReason?: \"source-disabled\" | \"provider-not-registered\";\n fetched: number;\n dayWritten: boolean;\n stateSaved: boolean;\n /** Sanitized provider error (no tokens, URLs, or coordinates). */\n error?: string;\n}\n\n/** Redact credential, URL query, and coordinate shapes from a provider error. */\nexport function sanitizeProviderError(error: unknown): string {\n const raw = error instanceof Error ? error.message : String(error);\n return raw\n .replace(/Bearer\\s+[A-Za-z0-9._~+/=-]+/gi, \"Bearer [redacted]\")\n .replace(/[?#][^ \\t\"']*/g, \"[redacted]\")\n .replace(/[+-]?\\d+\\.\\d{3,},\\s?[+-]?\\d+\\.\\d{3,}/g, \"[coordinates]\")\n .slice(0, 300);\n}\n\nfunction assertValidObservation(observation: LocationObservation): void {\n if (typeof observation !== \"object\" || observation === null) {\n throw new TypeError(\"location provider returned a non-object observation\");\n }\n if (typeof observation.observedAtUtc !== \"string\" || !Number.isFinite(Date.parse(observation.observedAtUtc))) {\n throw new TypeError(\"location provider returned an observation with an invalid observedAtUtc\");\n }\n const place = observation.place;\n if (typeof place !== \"object\" || place === null || typeof place.id !== \"string\" || place.id.length === 0) {\n throw new TypeError(\"location provider returned an observation without a valid place\");\n }\n if (typeof place.label !== \"string\" || place.label.trim().length === 0) {\n throw new TypeError(`location provider returned place '${place.id}' without a label`);\n }\n}\n\n/** Fetch every observation one provider holds for the window, all pages. */\nasync function fetchWindow(\n provider: LocationProvider,\n window: { startUtc: string; endUtc: string },\n options: LocationDaySyncOptions,\n): Promise<LocationObservation[]> {\n const maxPages = options.maxPages ?? MAX_SYNC_PAGES;\n if (!Number.isInteger(maxPages) || maxPages < 1) {\n throw new RangeError(\"location sync maxPages must be a positive integer\");\n }\n const observations: LocationObservation[] = [];\n const seenCursors = new Set<string>();\n let cursor: string | null = null;\n let pages = 0;\n let completed = false;\n while (pages < maxPages) {\n options.signal?.throwIfAborted();\n const page = await provider.fetchObservations({\n startUtc: window.startUtc,\n endUtc: window.endUtc,\n cursor,\n signal: options.signal,\n });\n pages += 1;\n for (const observation of page.observations) assertValidObservation(observation);\n observations.push(...page.observations);\n if (page.nextCursor === null) {\n completed = true;\n break;\n }\n if (typeof page.nextCursor !== \"string\" || page.nextCursor.length === 0) {\n throw new TypeError(\"location provider returned an invalid cursor\");\n }\n if (seenCursors.has(page.nextCursor)) {\n throw new Error(\"location provider returned a repeated cursor\");\n }\n seenCursors.add(page.nextCursor);\n cursor = page.nextCursor;\n }\n // Only a loop that ran out of its page budget without a terminal null\n // cursor is a runaway; completing on the final allowed page is normal.\n if (!completed) {\n throw new Error(`location provider exceeded ${maxPages} pages`);\n }\n return observations;\n}\n\n/**\n * Sync every configured source for one local day. The master gate\n * (`config.enabled === false`) short-circuits every path: no providers are\n * contacted and nothing touches the filesystem. A provider failure fails\n * that source only (state not advanced) and never blocks the others.\n */\nexport async function syncLocationDay(options: LocationDaySyncOptions): Promise<LocationSourceSyncResult[]> {\n if (!options.config.enabled) return [];\n const window = locationDayWindow(options.date, options.config.timezone);\n const now = options.now ?? (() => new Date());\n const resolveProvider = options.getProvider ?? getLocationProvider;\n\n const results: LocationSourceSyncResult[] = [];\n for (const source of options.config.sources) {\n if (!source.enabled) {\n results.push({\n sourceId: source.id,\n status: \"skipped\",\n skipReason: \"source-disabled\",\n fetched: 0,\n dayWritten: false,\n stateSaved: false,\n });\n continue;\n }\n const provider = resolveProvider(source.id);\n if (provider === undefined) {\n results.push({\n sourceId: source.id,\n status: \"skipped\",\n skipReason: \"provider-not-registered\",\n fetched: 0,\n dayWritten: false,\n stateSaved: false,\n });\n continue;\n }\n\n let observations: LocationObservation[];\n try {\n observations = await fetchWindow(provider, window, options);\n } catch (error) {\n results.push({\n sourceId: source.id,\n status: \"failed\",\n fetched: 0,\n dayWritten: false,\n stateSaved: false,\n ...(error instanceof Error && error.name === \"AbortError\"\n ? { error: \"aborted\" }\n : { error: sanitizeProviderError(error) }),\n });\n continue;\n }\n\n try {\n options.signal?.throwIfAborted();\n const segments = observationSegments(observations, window, {\n retainCoordinates: options.config.retainCoordinates,\n });\n const payload = { observationCount: observations.length, segments, providerDisplayName: provider.displayName };\n const merged = await mergeDaySources(options.memoryDir, source.id, options.date, payload);\n let dayWritten = false;\n if (Object.values(merged).some((entry) => entry.observationCount > 0)) {\n const body = composeLocationDayBody(options.date, options.config.timezone, merged);\n const meta = composeLocationDayMeta(options.date, options.config.timezone, merged, body);\n dayWritten = await writeLocationDay(options.memoryDir, options.date, serializeLocationDay(meta, body));\n }\n // State advances only after the durable day write above succeeded.\n await updateLocationSourceDay(\n options.memoryDir,\n source.id,\n options.date,\n payload,\n now().toISOString(),\n );\n results.push({\n sourceId: source.id,\n status: \"synced\",\n fetched: observations.length,\n dayWritten,\n stateSaved: true,\n });\n } catch (error) {\n results.push({\n sourceId: source.id,\n status: \"failed\",\n fetched: observations.length,\n dayWritten: false,\n stateSaved: false,\n ...(error instanceof Error && error.name === \"AbortError\"\n ? { error: \"aborted\" }\n : { error: sanitizeProviderError(error) }),\n });\n }\n }\n return results;\n}\n\n/**\n * The day-document source map: this source's fresh payload plus every OTHER\n * source's last-known payload from sync state. Rendered documents therefore\n * survive a re-sync of one source without re-fetching the others.\n */\nasync function mergeDaySources(\n memoryDir: string,\n sourceId: string,\n date: string,\n payload: { observationCount: number; segments: LocationSegment[] },\n): Promise<Record<string, LocationDaySourceEntry>> {\n const state = await loadLocationSyncState(memoryDir);\n const merged: Record<string, LocationDaySourceEntry> = {};\n for (const [otherId, otherState] of Object.entries(state.sources)) {\n if (otherId === sourceId) continue;\n const day = otherState.days?.[date];\n if (day === undefined) continue;\n merged[otherId] = { ...day, segments: [...day.segments] };\n }\n merged[sourceId] = payload;\n return merged;\n}\n","/**\n * Location surface helpers (issue #2044): status, provider health checks, and\n * multi-day sync. Pure `@remnic/core` — no optional packages, no host CLI\n * wiring; a host adapter (or the core CLI, in a later slice) renders these\n * structured results into its own command surface.\n */\n\nimport { getLocationProvider } from \"./registry.js\";\nimport { isValidLocationDate, localDayKey } from \"./intervals.js\";\nimport { listLocationDayDates, loadLocationSyncState, parseLocationDaySummary, readLocationDay } from \"./store.js\";\nimport { syncLocationDay, type LocationDaySyncOptions, type LocationSourceSyncResult } from \"./pipeline.js\";\nimport type { LocationConfig, LocationProvider } from \"./types.js\";\n\nexport interface LocationSourceStatus {\n id: string;\n enabled: boolean;\n providerRegistered: boolean;\n lastSyncedAtUtc?: string;\n trackedDays: number;\n}\n\nexport interface LocationDayStatus {\n date: string;\n sources: string[];\n observationCount: number;\n}\n\nexport interface LocationStatusReport {\n enabled: boolean;\n timezone: string;\n sources: LocationSourceStatus[];\n /** Stored day documents, newest first (at most `maxDays`). */\n recentDays: LocationDayStatus[];\n}\n\nexport interface LocationStatusOptions {\n /** Provider lookup seam (defaults to the registry); tests inject doubles. */\n getProvider?: (id: string) => LocationProvider | undefined;\n /** Cap on day documents listed; defaults to 7. */\n maxDays?: number;\n now?: () => Date;\n}\n\nexport async function locationStatus(\n config: LocationConfig,\n memoryDir: string,\n options: LocationStatusOptions = {},\n): Promise<LocationStatusReport> {\n const resolveProvider = options.getProvider ?? getLocationProvider;\n const state = await loadLocationSyncState(memoryDir);\n const sources: LocationSourceStatus[] = config.sources.map((source) => {\n const sourceState = state.sources[source.id];\n return {\n id: source.id,\n enabled: source.enabled,\n providerRegistered: resolveProvider(source.id) !== undefined,\n ...(sourceState?.lastSyncedAtUtc === undefined ? {} : { lastSyncedAtUtc: sourceState.lastSyncedAtUtc }),\n trackedDays: Object.keys(sourceState?.days ?? {}).length,\n };\n });\n\n const maxDays = options.maxDays ?? 7;\n const recentDays: LocationDayStatus[] = [];\n for (const date of (await listLocationDayDates(memoryDir)).slice(0, Math.max(0, maxDays))) {\n const raw = await readLocationDay(memoryDir, date);\n const summary = raw === null ? null : parseLocationDaySummary(raw);\n recentDays.push({\n date,\n sources: summary?.sources ?? [],\n observationCount: summary?.observationCount ?? 0,\n });\n }\n return { enabled: config.enabled, timezone: config.timezone, sources, recentDays };\n}\n\nexport interface LocationSourceCheckResult {\n id: string;\n ok: boolean;\n detail?: string;\n skipped?: \"location-disabled\" | \"source-disabled\" | \"provider-not-registered\";\n}\n\nexport interface LocationCheckOptions {\n signal?: AbortSignal;\n getProvider?: (id: string) => LocationProvider | undefined;\n}\n\n/** Probe every configured provider's health. The master gate short-circuits. */\nexport async function checkLocationSources(\n config: LocationConfig,\n options: LocationCheckOptions = {},\n): Promise<LocationSourceCheckResult[]> {\n if (!config.enabled) {\n return config.sources.map((source) => ({ id: source.id, ok: false, skipped: \"location-disabled\" as const }));\n }\n const resolveProvider = options.getProvider ?? getLocationProvider;\n const results: LocationSourceCheckResult[] = [];\n for (const source of config.sources) {\n if (!source.enabled) {\n results.push({ id: source.id, ok: false, skipped: \"source-disabled\" });\n continue;\n }\n const provider = resolveProvider(source.id);\n if (provider === undefined) {\n results.push({ id: source.id, ok: false, skipped: \"provider-not-registered\" });\n continue;\n }\n try {\n const check = await provider.verify(options.signal);\n results.push({\n id: source.id,\n ok: check.ok,\n ...(check.detail === undefined || check.detail.length === 0 ? {} : { detail: check.detail }),\n });\n } catch (error) {\n results.push({ id: source.id, ok: false, detail: error instanceof Error ? error.name : \"provider error\" });\n }\n }\n return results;\n}\n\nfunction shiftIsoDate(date: string, days: number): string {\n const parsed = new Date(`${date}T00:00:00Z`);\n parsed.setUTCDate(parsed.getUTCDate() + days);\n return parsed.toISOString().slice(0, 10);\n}\n\nexport interface LocationSyncRunOptions\n extends Omit<LocationDaySyncOptions, \"config\" | \"date\" | \"memoryDir\"> {\n config: LocationConfig;\n memoryDir: string;\n /** Exclusive end date (local YYYY-MM-DD); defaults to today in config.timezone. */\n endDate?: string;\n /** Number of days to sync ending at endDate; defaults to config.syncDays. */\n days?: number;\n now?: () => Date;\n}\n/**\n * Sync the trailing `days` local days ending AT `endDate` (inclusive).\n * `endDate` defaults to yesterday in config.timezone (today is incomplete);\n * days run oldest-first so a failure stops before newer days, matching the\n * incremental-sync intent of `syncDays`.\n */\nexport async function syncLocation(\n options: LocationSyncRunOptions,\n): Promise<Array<{ date: string; results: LocationSourceSyncResult[] }>> {\n const { config, memoryDir, endDate, days, ...rest } = options;\n if (endDate !== undefined && !isValidLocationDate(endDate)) {\n throw new RangeError(`Invalid location endDate \"${endDate}\"; expected a real YYYY-MM-DD day.`);\n }\n const now = rest.now ?? (() => new Date());\n const end = endDate ?? shiftIsoDate(localDayKey(now().toISOString(), config.timezone), -1);\n const count = days ?? config.syncDays;\n if (!Number.isInteger(count) || count < 1 || count > 90) {\n throw new RangeError(\"location sync days must be an integer from 1 to 90\");\n }\n const runs: Array<{ date: string; results: LocationSourceSyncResult[] }> = [];\n for (let offset = count; offset >= 1; offset -= 1) {\n const date = shiftIsoDate(end, -(offset - 1));\n runs.push({ date, results: await syncLocationDay({ ...rest, config, memoryDir, date, now }) });\n }\n return runs;\n}\n","/**\n * Location provider bootstrapping (issue #2047).\n *\n * Core never statically imports a provider package (adapter-isolation test),\n * so every surface calls this before status/check/sync: it registers\n * configured providers from optional packages via computed-specifier dynamic\n * imports, with credentials read from environment variables — tokens never\n * enter config files, errors, or logs. A source whose package or credentials\n * are absent stays unregistered and the pipeline reports\n * `provider-not-registered`; that is a skip reason, never an error (the\n * connector-reitti package's README contract).\n */\n\nimport { readEnvVar } from \"../runtime/env.js\";\nimport { log } from \"../logger.js\";\nimport { getLocationProvider } from \"./registry.js\";\nimport type { LocationConfig } from \"./types.js\";\n\n/** Environment shape the setup reads for the `reitti` source. */\nexport interface LocationProviderEnv {\n baseUrl?: string;\n token?: string;\n authMode?: string;\n}\n\nexport interface LocationProviderSetupDeps {\n /** Injectable env (tests); defaults to REITTI_* process variables. */\n env?: LocationProviderEnv;\n /** Injectable module loader (tests); defaults to a dynamic import. */\n importModule?: (specifier: string) => Promise<unknown>;\n}\n\ninterface ReittiProviderModule {\n ensureReittiProviderRegistered(options: {\n baseUrl: string;\n token: string;\n timezone: string;\n authMode?: \"x-api-token\" | \"bearer\";\n }): boolean;\n}\n\nconst loadFailuresWarned = new Set<string>();\n\nfunction readReittiEnv(): LocationProviderEnv {\n return {\n baseUrl: readEnvVar(\"REITTI_BASE_URL\"),\n token: readEnvVar(\"REITTI_TOKEN\"),\n authMode: readEnvVar(\"REITTI_AUTH_MODE\"),\n };\n}\n\n/**\n * Register every configured+enabled source's provider when its optional\n * package and credentials are available. Idempotent; returns the ids this\n * call registered. Never throws — a missing package or credential set is\n * reported downstream as `provider-not-registered`.\n */\nexport async function ensureConfiguredLocationProviders(\n config: LocationConfig,\n deps: LocationProviderSetupDeps = {},\n): Promise<string[]> {\n const registered: string[] = [];\n if (!config.enabled) return registered;\n for (const source of config.sources) {\n if (!source.enabled) continue;\n if (getLocationProvider(source.id) !== undefined) continue;\n // ponytail: only the `reitti` built-in exists today; add cases here as\n // provider packages land — a registry table when there is more than one.\n if (source.id !== \"reitti\") continue;\n const env = deps.env ?? readReittiEnv();\n const baseUrl = env.baseUrl?.trim();\n const token = env.token?.trim();\n if (!baseUrl || !token) continue;\n const authMode =\n env.authMode === \"x-api-token\" || env.authMode === \"bearer\" ? env.authMode : undefined;\n const specifier = \"@remnic/\" + \"connector-reitti\";\n const load = deps.importModule ?? ((s: string) => import(s));\n try {\n const mod = (await load(specifier)) as ReittiProviderModule;\n if (\n mod.ensureReittiProviderRegistered({\n baseUrl,\n token,\n timezone: config.timezone,\n ...(authMode !== undefined ? { authMode } : {}),\n })\n ) {\n registered.push(\"reitti\");\n }\n } catch (err) {\n // Absent optional package is the common case (skip silently); a real\n // load failure is worth one warn line, never credentials.\n const message = err instanceof Error ? err.message : String(err);\n if (!message.includes(specifier)) {\n if (!loadFailuresWarned.has(specifier)) {\n loadFailuresWarned.add(specifier);\n log.warn(`location: failed to load optional provider package ${specifier}: ${message}`);\n }\n }\n }\n }\n return registered;\n}\n","/**\n * Location surface runners (issue #2047) — ONE implementation shared by the\n * CLI (`remnic location ...`), the MCP tools, the HTTP routes, and the\n * scheduler, so no surface can fork validation or disabled/empty/failure\n * semantics (same rule as the wearables runner). Parsing here is strict:\n * unknown flags reject with the valid list, invalid values reject loudly.\n */\n\nimport { EngramAccessInputError } from \"../access-errors.js\";\nimport {\n checkLocationSources,\n locationStatus,\n syncLocation,\n type LocationSourceCheckResult,\n type LocationStatusReport,\n} from \"./cli.js\";\nimport { isValidLocationDate } from \"./intervals.js\";\nimport type { LocationSourceSyncResult } from \"./pipeline.js\";\nimport { ensureConfiguredLocationProviders } from \"./provider-setup.js\";\nimport { parseLocationDaySummary, readLocationDay } from \"./store.js\";\nimport type { LocationConfig } from \"./types.js\";\n\nexport interface LocationSurfaceDeps {\n config: LocationConfig;\n memoryDir: string;\n}\n\nexport interface LocationSyncRun {\n date: string;\n results: LocationSourceSyncResult[];\n}\n\nexport type LocationSyncRuns = LocationSyncRun[];\n\nexport async function runLocationStatus(\n deps: LocationSurfaceDeps,\n): Promise<LocationStatusReport> {\n await ensureConfiguredLocationProviders(deps.config);\n return locationStatus(deps.config, deps.memoryDir);\n}\n\nexport async function runLocationCheck(\n deps: LocationSurfaceDeps,\n signal?: AbortSignal,\n): Promise<LocationSourceCheckResult[]> {\n await ensureConfiguredLocationProviders(deps.config);\n return checkLocationSources(deps.config, signal !== undefined ? { signal } : {});\n}\n\nexport async function runLocationSync(\n deps: LocationSurfaceDeps,\n request: { endDate?: string; days?: number } = {},\n): Promise<LocationSyncRuns> {\n await ensureConfiguredLocationProviders(deps.config);\n const runs = await syncLocation({ ...deps, ...validatedSyncWindow(request) });\n return runs as LocationSyncRuns;\n}\n\nexport interface LocationDayView {\n date: string;\n found: boolean;\n sources: string[];\n observationCount: number;\n body: string | null;\n}\n\nexport async function runLocationDay(memoryDir: string, rawDate: unknown): Promise<LocationDayView> {\n const date = requireLocationDate(rawDate, \"date\");\n const body = await readLocationDay(memoryDir, date);\n const summary = body === null ? null : parseLocationDaySummary(body);\n return {\n date,\n found: body !== null,\n sources: summary?.sources ?? [],\n observationCount: summary?.observationCount ?? 0,\n body,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Shared validation (CLI, MCP, HTTP all reject identically)\n// ---------------------------------------------------------------------------\n\nfunction requireLocationDate(raw: unknown, label: string): string {\n if (typeof raw !== \"string\" || !isValidLocationDate(raw)) {\n throw new EngramAccessInputError(`location: ${label} is required (YYYY-MM-DD)`);\n }\n return raw;\n}\n\nfunction optionalLocationDays(raw: unknown): number | undefined {\n if (raw === undefined || raw === null || raw === \"\") return undefined;\n const parsed = typeof raw === \"number\" ? raw : Number(raw);\n if (!Number.isInteger(parsed) || parsed < 1 || parsed > 90) {\n throw new EngramAccessInputError(\"location: days expects an integer from 1 to 90\");\n }\n return parsed;\n}\n\nfunction validatedSyncWindow(request: { endDate?: string; days?: number }): {\n endDate?: string;\n days?: number;\n} {\n const days = optionalLocationDays(request.days);\n const endDate =\n request.endDate === undefined || request.endDate === null || request.endDate === \"\"\n ? undefined\n : requireLocationDate(request.endDate, \"date\");\n return { ...(endDate !== undefined ? { endDate } : {}), ...(days !== undefined ? { days } : {}) };\n}\n\n/** Day span between two inclusive local dates (from ≤ to, ≤ 90 days). */\nexport function parseLocationBackfillRange(\n rawFrom: unknown,\n rawTo: unknown,\n): { endDate: string; days: number } {\n const from = requireLocationDate(rawFrom, \"from\");\n const to = requireLocationDate(rawTo, \"to\");\n const fromMs = Date.parse(`${from}T00:00:00Z`);\n const toMs = Date.parse(`${to}T00:00:00Z`);\n if (toMs < fromMs) {\n throw new EngramAccessInputError(\"location: backfill --from must not be after --to\");\n }\n const days = Math.round((toMs - fromMs) / 86_400_000) + 1;\n if (days > 90) {\n throw new EngramAccessInputError(\"location: backfill range is capped at 90 days\");\n }\n return { endDate: to, days };\n}\n\n// ---------------------------------------------------------------------------\n// CLI command (shared by every CLI host)\n// ---------------------------------------------------------------------------\n\nexport interface LocationCliIo {\n stdout: { write(chunk: string): unknown };\n stderr: { write(chunk: string): unknown };\n}\n\nconst USAGE = `Usage: location <command> [options]\n\nCommands:\n status Configured sources, registration, last sync\n check Probe every enabled provider (auth/connectivity)\n sync [options] Sync recent local days (default: config.syncDays\n ending yesterday)\n --date <YYYY-MM-DD> End the window on this day (inclusive)\n --days <n> Window size, 1..90 (default: location.syncDays)\n backfill --from <date> --to <date>\n Sync an explicit historical range (≤ 90 days)\n day <YYYY-MM-DD> Print one stored location day\n\nAdd --json to status/sync/backfill/day for machine-readable output.\nCredentials for built-in providers come from the environment:\n reitti: REITTI_BASE_URL, REITTI_TOKEN[, REITTI_AUTH_MODE=x-api-token|bearer]\n`;\n\nconst VALUE_FLAGS = new Set([\"--date\", \"--days\", \"--from\", \"--to\"]);\nconst BOOLEAN_FLAGS = new Set([\"--json\"]);\n\ninterface ParsedCliFlags {\n flags: Map<string, string | true>;\n positional: string[];\n}\n\nfunction parseCliFlags(args: string[]): ParsedCliFlags {\n const flags = new Map<string, string | true>();\n const positional: string[] = [];\n for (let index = 0; index < args.length; index++) {\n const arg = args[index];\n if (!arg.startsWith(\"--\")) {\n positional.push(arg);\n continue;\n }\n if (BOOLEAN_FLAGS.has(arg)) {\n flags.set(arg, true);\n continue;\n }\n if (VALUE_FLAGS.has(arg)) {\n const value = args[index + 1];\n if (value === undefined || value.startsWith(\"--\")) {\n throw new EngramAccessInputError(`location: ${arg} requires a value`);\n }\n flags.set(arg, value);\n index++;\n continue;\n }\n throw new EngramAccessInputError(\n `location: unknown flag '${arg}' — valid flags: ${[...VALUE_FLAGS, ...BOOLEAN_FLAGS].join(\", \")}`,\n );\n }\n return { flags, positional };\n}\n\nfunction flagString(parsed: ParsedCliFlags, name: string): string | undefined {\n const value = parsed.flags.get(name);\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction renderStatus(report: LocationStatusReport): string {\n const lines = [\n `Location: ${report.enabled ? \"enabled\" : \"disabled\"} (timezone ${report.timezone})`,\n ];\n if (report.sources.length === 0) {\n lines.push(\"No sources configured. Add location.sources to the plugin config.\");\n return `${lines.join(\"\\n\")}\\n`;\n }\n for (const source of report.sources) {\n lines.push(\n ` ${source.id}: ${source.enabled ? \"enabled\" : \"disabled\"}, ` +\n `provider ${source.providerRegistered ? \"registered\" : \"not registered\"}, ` +\n `${source.trackedDays} tracked day${source.trackedDays === 1 ? \"\" : \"s\"}, ` +\n `last sync ${source.lastSyncedAtUtc ?? \"never\"}`,\n );\n }\n if (report.recentDays.length > 0) {\n lines.push(\" recent days:\");\n for (const day of report.recentDays) {\n lines.push(\n ` ${day.date} ${day.observationCount} observation${day.observationCount === 1 ? \"\" : \"s\"} [${day.sources.join(\", \")}]`,\n );\n }\n }\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction anySourceFailed(runs: LocationSyncRuns): boolean {\n return runs.some((run) => run.results.some((result) => result.status === \"failed\"));\n}\n\nfunction renderRuns(io: LocationCliIo, runs: LocationSyncRuns): void {\n for (const run of runs) {\n for (const result of run.results) {\n io.stdout.write(\n `${run.date} ${result.sourceId}: ${result.status}${result.error ? ` — ${result.error}` : \"\"} (${result.fetched} fetched)\\n`,\n );\n }\n }\n}\n\n/** Run a `remnic location ...` command; returns a process exit code. */\nexport async function runLocationCliCommand(\n deps: LocationSurfaceDeps,\n args: string[],\n io: LocationCliIo,\n): Promise<number> {\n const [command, ...rest] = args;\n try {\n switch (command) {\n case undefined:\n case \"help\":\n case \"--help\": {\n io.stdout.write(USAGE);\n return command === undefined ? 1 : 0;\n }\n case \"status\": {\n const parsed = parseCliFlags(rest);\n const report = await runLocationStatus(deps);\n if (parsed.flags.has(\"--json\")) {\n io.stdout.write(`${JSON.stringify(report, null, 2)}\\n`);\n return 0;\n }\n io.stdout.write(renderStatus(report));\n return 0;\n }\n case \"check\": {\n const results = await runLocationCheck(deps);\n for (const result of results) {\n const skipped = result.skipped === undefined ? \"\" : ` (skipped: ${result.skipped})`;\n io.stdout.write(\n `${result.id}: ${result.ok ? \"OK\" : \"FAILED\"}${skipped}${result.detail ? ` — ${result.detail}` : \"\"}\\n`,\n );\n }\n return results.every((result) => result.ok) ? 0 : 1;\n }\n case \"sync\": {\n const parsed = parseCliFlags(rest);\n if (parsed.positional.length > 0) {\n throw new EngramAccessInputError(\n `location: unexpected argument '${parsed.positional[0]}' — sync takes flags only`,\n );\n }\n const daysValue = flagString(parsed, \"--days\");\n const runs = await runLocationSync(deps, {\n endDate: flagString(parsed, \"--date\"),\n ...(daysValue !== undefined ? { days: Number(daysValue) } : {}),\n });\n if (parsed.flags.has(\"--json\")) {\n io.stdout.write(`${JSON.stringify({ days: runs }, null, 2)}\\n`);\n } else {\n renderRuns(io, runs);\n }\n return anySourceFailed(runs) ? 1 : 0;\n }\n case \"backfill\": {\n const parsed = parseCliFlags(rest);\n const range = parseLocationBackfillRange(flagString(parsed, \"--from\"), flagString(parsed, \"--to\"));\n const runs = await runLocationSync(deps, range);\n if (parsed.flags.has(\"--json\")) {\n io.stdout.write(`${JSON.stringify({ days: runs }, null, 2)}\\n`);\n } else {\n renderRuns(io, runs);\n }\n return anySourceFailed(runs) ? 1 : 0;\n }\n case \"day\": {\n const parsed = parseCliFlags(rest);\n const date = parsed.positional[0] ?? flagString(parsed, \"--date\");\n const view = await runLocationDay(deps.memoryDir, date);\n if (!view.found) {\n io.stderr.write(`No stored location day for ${view.date}.\\n`);\n return 1;\n }\n if (parsed.flags.has(\"--json\")) {\n io.stdout.write(`${JSON.stringify(view, null, 2)}\\n`);\n return 0;\n }\n io.stdout.write(`${view.body}\\n`);\n return 0;\n }\n default:\n io.stderr.write(`location: unknown command '${command}'\\n${USAGE}`);\n return 1;\n }\n } catch (err) {\n io.stderr.write(`${err instanceof Error ? err.message : String(err)}\\n`);\n return 1;\n }\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/schemas.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport const MemoryActionTypeSchema = z.enum([\n \"store_episode\",\n \"store_note\",\n \"update_note\",\n \"create_artifact\",\n \"summarize_node\",\n \"discard\",\n \"link_graph\",\n]);\n\nexport const MemoryActionEligibilityContextSchema = z\n .object({\n confidence: z.number().min(0).max(1),\n lifecycleState: z.enum([\"active\", \"validated\", \"candidate\", \"stale\", \"archived\"]),\n importance: z.number().min(0).max(1),\n source: z.enum([\"extraction\", \"consolidation\", \"replay\", \"manual\", \"unknown\"]),\n })\n .strict();\n\nexport function parseMemoryActionType(value: unknown): z.infer<typeof MemoryActionTypeSchema> {\n const parsed = MemoryActionTypeSchema.safeParse(value);\n return parsed.success ? parsed.data : \"discard\";\n}\n\nexport function parseMemoryActionEligibilityContext(\n value: unknown,\n): z.infer<typeof MemoryActionEligibilityContextSchema> {\n const parsed = MemoryActionEligibilityContextSchema.safeParse(value);\n if (parsed.success) return parsed.data;\n return {\n confidence: 0,\n lifecycleState: \"candidate\",\n importance: 0,\n source: \"unknown\",\n };\n}\n\nexport const ProcedureStepExtractSchema = z.object({\n order: z.number(),\n intent: z.string(),\n toolCall: z\n .object({\n kind: z.string(),\n signature: z.string(),\n })\n .optional()\n .nullable(),\n expectedOutcome: z.string().optional().nullable(),\n optional: z.boolean().optional().nullable(),\n});\n\nexport const ExtractedFactSchema = z.object({\n category: z.enum([\n \"fact\",\n \"preference\",\n \"correction\",\n \"entity\",\n \"decision\",\n \"relationship\",\n \"principle\",\n \"commitment\",\n \"moment\",\n \"skill\",\n \"rule\",\n \"procedure\",\n \"reasoning_trace\",\n ]),\n content: z\n .string()\n .describe(\"The memory content — a clear, standalone statement\"),\n confidence: z\n .number()\n .min(0)\n .max(1)\n .describe(\"How confident are you this is correct (0-1)\"),\n tags: z.array(z.string()).describe(\"Relevant tags for categorization\"),\n entityRef: z\n .string()\n .optional()\n .nullable()\n .describe(\"If about an entity, its normalized name (e.g. person-jane-doe)\"),\n cueAnchors: z\n .array(\n z.object({\n type: z.enum([\"entity\", \"file\", \"tool\", \"outcome\", \"constraint\", \"date\"]),\n value: z.string(),\n }),\n )\n .optional()\n .nullable()\n .describe(\"Up to three short retrieval cues for this fact.\"),\n promptedByQuestion: z\n .string()\n .optional()\n .nullable()\n .describe(\"Optional proactive follow-up question that surfaced this fact.\"),\n scope: z\n .enum([\"project\", \"global\"])\n .optional()\n .nullable()\n .describe(\n 'Scope classification: \"global\" for cross-project knowledge (framework bugs, library behavior, API patterns, user preferences, general coding patterns); \"project\" for project-specific knowledge (file paths, env configs, deployment details, project workarounds) and for tool, command, or CLI-flag instructions tied to one agent, since the same tool name can mean different things across agents. When keeping such an agent-tied instruction, begin the fact with a leading \"In <agent>,\" clause naming that agent. Defaults to \"project\" when a coding context is active.',\n ),\n subject: z\n .enum([\"user\", \"agent\"])\n .optional()\n .nullable()\n .describe(\n 'Memory subject: \"user\" when the fact models the person (preferences, relationships, biography, moments, commitments about their life); \"agent\" when it is reusable operating knowledge (procedures, principles, tool-usage lessons, debugging strategies, environment facts with no personal content). Emit only for fact/decision-like facts; the category defaults cover preference, relationship, moment, commitment, procedure, principle, and skill.',\n ),\n quote: z\n .string()\n .optional()\n .nullable()\n .describe(\n \"The EXACT verbatim words from the conversation that support this fact. Copy a contiguous span from a single speaker turn (not a paraphrase). Cap at ~300 characters. This is the grounding evidence for downstream faithfulness verification (issue #1575).\",\n ),\n structuredAttributes: z\n .record(z.string(), z.string())\n .optional()\n .nullable()\n .describe(\"Structured key-value attributes when the fact contains measurable or categorical data (e.g., {\\\"price\\\": \\\"29.99\\\", \\\"color\\\": \\\"blue\\\", \\\"date\\\": \\\"2024-03-15\\\"}).\"),\n procedureSteps: z\n .array(ProcedureStepExtractSchema)\n .optional()\n .nullable()\n .describe(\n 'For category \"procedure\" only: ordered steps (intent per step). At least two steps; include explicit trigger phrasing in content (e.g. \"When you deploy…\").',\n ),\n reasoningTrace: z\n .object({\n steps: z\n .array(\n z.object({\n order: z.number(),\n description: z.string(),\n }),\n )\n // Prompts and normalizer require >=2 ordered steps; enforce it at\n // the schema layer so gateway-path parsing rejects malformed traces\n // rather than persisting them (local/direct-client normalization\n // already enforces this, keeping the two paths symmetric).\n .min(2)\n .describe(\"Ordered reasoning steps the user walked through (require >=2).\"),\n // Accept snake_case aliases so a loose gateway model using\n // `final_answer` / `observed_outcome` does not fail schema parsing\n // and drop the entire extraction result. Local/direct-client\n // normalization already tolerates these keys; the gateway path must\n // too. Zod's `union` keeps the parse successful either way.\n finalAnswer: z\n .string()\n .optional()\n .nullable()\n .describe(\"The conclusion, decision, or answer the chain arrived at.\"),\n final_answer: z\n .string()\n .optional()\n .nullable()\n .describe(\"Alias for finalAnswer (snake_case). Gateway-tolerance shim.\"),\n observedOutcome: z\n .string()\n .optional()\n .nullable()\n .describe(\"Optional note about how the answer actually played out.\"),\n observed_outcome: z\n .string()\n .optional()\n .nullable()\n .describe(\"Alias for observedOutcome (snake_case). Gateway-tolerance shim.\"),\n })\n // Either finalAnswer OR final_answer must be present — enforce here so\n // the rest of the pipeline can assume a usable string downstream.\n .refine(\n (v) =>\n (typeof v.finalAnswer === \"string\" && v.finalAnswer.trim().length > 0) ||\n (typeof v.final_answer === \"string\" && v.final_answer.trim().length > 0),\n { message: \"reasoningTrace requires finalAnswer (or final_answer)\" },\n )\n .optional()\n .nullable()\n .describe(\n 'For category \"reasoning_trace\" only: a stored solution chain with ordered steps, a final answer, and an optional observed outcome. Require at least two steps.',\n ),\n eventTime: z\n .string()\n .optional()\n .nullable()\n .describe(\n 'Optional event-time expression for bi-temporal validity (#1578). An ISO date (\"2025-03-01\") or a relative expression verbatim (\"last March\", \"yesterday\", \"since 2024\", \"until 2025-06-01\"). Resolved against the source turn timestamp at write time — NOT wall-clock. Omit when the fact has no explicit temporal anchor.',\n ),\n event_time: z\n .string()\n .optional()\n .nullable()\n .describe(\"Alias for eventTime (snake_case). Gateway-tolerance shim (#1578).\"),\n}).superRefine((value, ctx) => {\n if (value.category === \"procedure\" && (!Array.isArray(value.procedureSteps) || value.procedureSteps.length < 2)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"procedureSteps\"],\n message: \"procedure facts require at least two procedureSteps\",\n });\n }\n\n if (value.category === \"reasoning_trace\" && value.reasoningTrace == null) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"reasoningTrace\"],\n message: \"reasoning_trace facts require reasoningTrace\",\n });\n }\n});\n\nexport const EntityMentionSchema = z.object({\n name: z\n .string()\n .describe(\"Normalized entity name (e.g. jane-doe, acme-corp, my-project)\"),\n type: z.enum([\"person\", \"project\", \"tool\", \"company\", \"place\", \"other\"]),\n facts: z\n .array(z.string())\n .describe(\"New facts learned about this entity in this conversation\"),\n promptedByQuestion: z\n .string()\n .optional()\n .nullable()\n .describe(\"Optional proactive follow-up question that surfaced this entity.\"),\n structuredSections: z\n .array(z.object({\n key: z.string(),\n title: z.string(),\n facts: z.array(z.string()),\n }))\n .optional()\n .nullable()\n .describe(\"Optional named sections for entity-specific facts. Use when facts clearly belong under a durable heading such as Beliefs or Building / Working On.\"),\n});\n\nexport const ExtractedQuestionSchema = z.object({\n question: z.string().describe(\"A genuine question the AI is curious about based on this conversation\"),\n context: z.string().describe(\"Why this question matters or what prompted it\"),\n priority: z.number().min(0).max(1).describe(\"How important/urgent this question is (0-1)\"),\n});\n\nexport const ProactiveQuestionsResultSchema = z.object({\n questions: z\n .array(ExtractedQuestionSchema)\n .describe(\"Additional follow-up questions discovered in a proactive second-pass extraction.\"),\n});\n\nexport const ExtractedRelationshipSchema = z.object({\n source: z.string().describe(\"Source entity name (normalized, e.g. person-jane-doe)\"),\n target: z.string().describe(\"Target entity name (normalized, e.g. company-acme-corp)\"),\n label: z.string().describe(\"Relationship label (e.g. 'works at', 'created', 'manages')\"),\n promptedByQuestion: z\n .string()\n .optional()\n .nullable()\n .describe(\"Optional proactive follow-up question that surfaced this relationship.\"),\n});\n\nexport const ProactiveExtractionResultSchema = z.object({\n facts: z\n .array(ExtractedFactSchema)\n .describe(\n \"Additional high-confidence memories recovered only after answering proactive follow-up questions from the same buffered conversation.\",\n ),\n profileUpdates: z\n .array(z.string())\n .describe(\n \"Additional profile updates directly supported by the buffered conversation. Omit anything speculative.\",\n ),\n entities: z\n .array(EntityMentionSchema)\n .describe(\n \"Additional entities or entity facts surfaced by the proactive follow-up pass.\",\n ),\n relationships: z\n .array(ExtractedRelationshipSchema)\n .optional()\n .nullable()\n .describe(\n \"Additional relationships surfaced by the proactive follow-up pass.\",\n ),\n});\n\n/**\n * Salvage array for model-produced extraction output (issue #2455).\n *\n * Mixed valid+invalid items parse to the valid subset so one malformed\n * element no longer discards the whole extraction. A non-empty array with\n * zero valid items still fails, so bounded retry stays effective and wholly\n * malformed output is never silently accepted as empty. Empty arrays stay\n * valid. Consolidation schemas intentionally stay strict — do not use this\n * for them.\n */\nfunction salvageArray<T extends z.ZodTypeAny>(itemSchema: T) {\n return z\n .array(z.unknown())\n .transform((items, ctx) => {\n const valid: z.infer<T>[] = [];\n for (const raw of items) {\n const parsed = itemSchema.safeParse(raw);\n if (parsed.success) {\n valid.push(parsed.data);\n }\n }\n if (items.length > 0 && valid.length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"array contains no items matching the schema\",\n });\n return z.NEVER;\n }\n return valid;\n });\n}\n\nexport const ExtractionResultSchema = z.object({\n facts: salvageArray(ExtractedFactSchema).describe(\n \"Extracted memories from the conversation. Include facts, preferences, corrections, and decisions. Only extract genuinely new, durable information — skip transient task state.\",\n ),\n profileUpdates: salvageArray(z.string()).describe(\n \"Updates to the user's behavioral profile. Each string is a standalone statement about the user's preferences, habits, or personality. Only include genuinely new insights.\",\n ),\n entities: salvageArray(EntityMentionSchema).describe(\n \"Entities mentioned in the conversation with new facts about them.\",\n ),\n questions: salvageArray(ExtractedQuestionSchema).describe(\n \"Zero to three source-grounded questions useful in future sessions. Return an empty array when the conversation supports none.\",\n ),\n identityReflection: z\n .string()\n .optional()\n .nullable()\n .describe(\n \"A brief reflection on what you learned about yourself as an agent in this interaction — patterns in your behavior, growth, things you did well or could improve.\",\n ),\n episodeTitle: z\n .string()\n .optional()\n .nullable()\n .describe(\"A six-to-eight word title for this conversation segment.\"),\n relationships: salvageArray(ExtractedRelationshipSchema)\n .optional()\n .nullable()\n .describe(\n \"Relationships between entities discovered in this conversation. Max 5 per extraction. Format: {source, target, label}.\",\n ),\n});\n\nexport const ConsolidationItemSchema = z.object({\n existingId: z\n .string()\n .describe(\"The ID of the existing memory being evaluated\"),\n action: z.enum([\"ADD\", \"MERGE\", \"UPDATE\", \"INVALIDATE\", \"SKIP\"]),\n mergeWith: z\n .string()\n .optional()\n .nullable()\n .describe(\"If MERGE, the ID of the memory to merge with\"),\n updatedContent: z\n .string()\n .optional()\n .nullable()\n .describe(\"If UPDATE or MERGE, the new content\"),\n reason: z.string().describe(\"Brief reason for this decision\"),\n});\n\nexport const ConsolidationResultSchema = z.object({\n items: z\n .array(ConsolidationItemSchema)\n .describe(\n \"Decisions for each existing memory: ADD (keep as-is), MERGE (combine with another), UPDATE (revise content), INVALIDATE (mark as outdated/wrong), SKIP (no action needed)\",\n ),\n profileUpdates: z\n .array(z.string())\n .describe(\"New profile statements to add or update\"),\n entityUpdates: z\n .array(EntityMentionSchema)\n .describe(\"Entity updates from consolidation analysis\"),\n});\n\nexport function buildProfileConsolidationResultSchema(targetLines: number) {\n return z.object({\n consolidatedProfile: z\n .string()\n .describe(\n `The full consolidated profile as markdown. Preserve all ## section headers. Merge duplicate or near-duplicate bullets into single clear statements. Remove stale or superseded information. Keep the most important and durable observations. Target roughly ${targetLines} lines.`,\n ),\n removedCount: z\n .number()\n .describe(\"Number of bullets removed or merged during consolidation\"),\n summary: z\n .string()\n .describe(\"Brief summary of what was consolidated\"),\n });\n}\n\nexport const ProfileConsolidationResultSchema = buildProfileConsolidationResultSchema(50);\n\nexport const IdentityConsolidationResultSchema = z.object({\n learnedPatterns: z\n .array(z.string())\n .describe(\n \"Consolidated behavioral patterns and lessons learned, each a concise standalone statement\",\n ),\n summary: z\n .string()\n .describe(\n \"A brief paragraph summarizing the agent's core identity insights\",\n ),\n});\n\nexport type IdentityConsolidationResultParsed = z.infer<\n typeof IdentityConsolidationResultSchema\n>;\n\n// Contradiction Verification (Phase 2B)\nexport const ContradictionVerificationSchema = z.object({\n isContradiction: z\n .boolean()\n .describe(\"Whether the two memories truly contradict each other\"),\n confidence: z\n .number()\n .min(0)\n .max(1)\n .describe(\"How confident are you in this assessment (0-1)\"),\n reasoning: z\n .string()\n .describe(\"Explanation of why these are or are not contradictory\"),\n whichIsNewer: z\n .enum([\"first\", \"second\", \"unclear\"])\n .describe(\"Which memory represents the more recent/current state\"),\n});\n\nexport type ContradictionVerificationResult = z.infer<\n typeof ContradictionVerificationSchema\n>;\n\n// Memory Linking (Phase 3A)\nexport const MemoryLinkSchema = z.object({\n targetId: z\n .string()\n .describe(\"The ID of the memory this links to\"),\n linkType: z\n .enum([\"follows\", \"references\", \"contradicts\", \"supports\", \"related\"])\n .describe(\"The type of relationship\"),\n strength: z\n .number()\n .min(0)\n .max(1)\n .describe(\"How strong is this relationship (0-1)\"),\n reason: z\n .string()\n .optional()\n .nullable()\n .describe(\"Why this link exists\"),\n});\n\nexport const SuggestedLinksSchema = z.object({\n links: z\n .array(MemoryLinkSchema)\n .describe(\"Suggested links between memories based on semantic analysis\"),\n});\n\nexport type MemoryLink = z.infer<typeof MemoryLinkSchema>;\nexport type SuggestedLinks = z.infer<typeof SuggestedLinksSchema>;\n\n// Memory Summarization (Phase 4A)\nexport const MemorySummarySchema = z.object({\n summaryText: z\n .string()\n .describe(\"A concise summary of the batch of memories\"),\n keyFacts: z\n .array(z.string())\n .describe(\"The most important facts extracted from these memories\"),\n keyEntities: z\n .array(z.string())\n .describe(\"Key entities mentioned across these memories\"),\n});\n\nexport type MemorySummaryResult = z.infer<typeof MemorySummarySchema>;\n\nexport const DaySummaryResultSchema = z.object({\n summary: z.string().min(1).describe(\"A concise end-of-day summary paragraph.\"),\n bullets: z.array(z.string()).default([]).describe(\"The most important moments from the day.\"),\n next_actions: z.array(z.string()).default([]).describe(\"Concrete next actions for tomorrow.\"),\n risks_or_open_loops: z.array(z.string()).default([]).describe(\"Open loops, blockers, or fragile assumptions still needing attention.\"),\n});\n\n// v8.15 behavior-loop auto-tuning state contracts\nexport const BehaviorLoopAdjustmentSchema = z.object({\n parameter: z.string().min(1),\n previousValue: z.number(),\n nextValue: z.number(),\n delta: z.number(),\n evidenceCount: z.number().int().min(0),\n confidence: z.number().min(0).max(1),\n reason: z.string(),\n appliedAt: z.string(),\n});\n\nexport const BehaviorLoopPolicyStateSchema = z.object({\n version: z.number().int().min(0),\n windowDays: z.number().int().min(0),\n minSignalCount: z.number().int().min(0),\n maxDeltaPerCycle: z.number().min(0).max(1),\n protectedParams: z.array(z.string()),\n adjustments: z.array(BehaviorLoopAdjustmentSchema),\n updatedAt: z.string(),\n});\n\nexport type BehaviorLoopAdjustmentParsed = z.infer<typeof BehaviorLoopAdjustmentSchema>;\nexport type BehaviorLoopPolicyStateParsed = z.infer<typeof BehaviorLoopPolicyStateSchema>;\n\nexport type MemoryActionTypeParsed = z.infer<typeof MemoryActionTypeSchema>;\nexport type MemoryActionEligibilityContextParsed = z.infer<typeof MemoryActionEligibilityContextSchema>;\nexport type ExtractedFactParsed = z.infer<typeof ExtractedFactSchema>;\nexport type EntityMentionParsed = z.infer<typeof EntityMentionSchema>;\nexport type ExtractedQuestionParsed = z.infer<typeof ExtractedQuestionSchema>;\nexport type ProactiveQuestionsResultParsed = z.infer<typeof ProactiveQuestionsResultSchema>;\nexport type ExtractionResultParsed = z.infer<typeof ExtractionResultSchema>;\nexport type ConsolidationItemParsed = z.infer<typeof ConsolidationItemSchema>;\nexport type ConsolidationResultParsed = z.infer<\n typeof ConsolidationResultSchema\n>;\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/location/config.ts"],"sourcesContent":["import { coerceBooleanLike, coerceNumber } from \"../connectors/coerce.js\";\nimport { assertValidTimezone } from \"../activity/digest.js\";\nimport type { LocationConfig, LocationSourceConfig } from \"./types.js\";\n\nconst PROVIDER_ID_PATTERN = /^[a-z0-9][a-z0-9-]*$/;\n\n/** The inert default: disabled, UTC days, one day per run, no sources, no coordinates. */\nexport function defaultLocationConfig(): LocationConfig {\n return {\n enabled: false,\n timezone: \"UTC\",\n syncDays: 1,\n retainCoordinates: false,\n sources: [],\n };\n}\n\nfunction asRecord(value: unknown, name: string): Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new TypeError(`${name} must be an object`);\n }\n return value as Record<string, unknown>;\n}\n\nfunction optionalNonEmptyString(value: unknown, name: string): string | undefined {\n if (value === undefined) return undefined;\n if (typeof value !== \"string\" || value.length === 0) throw new TypeError(`${name} must be a non-empty string`);\n return value;\n}\n\nfunction parseLocationSource(value: unknown): LocationSourceConfig {\n const raw = asRecord(value, \"location source\");\n const id = optionalNonEmptyString(raw.id, \"location source id\");\n if (id === undefined) {\n throw new TypeError(\"location source requires id\");\n }\n if (!PROVIDER_ID_PATTERN.test(id)) {\n throw new RangeError(\n `location source id must be a lowercase kebab string (a-z, 0-9, hyphens): got \"${id}\"`,\n );\n }\n const enabledValue = coerceBooleanLike(raw.enabled, \"location source enabled\");\n if (raw.enabled !== undefined && enabledValue === undefined) {\n throw new TypeError(`location source '${id}' enabled must be a boolean`);\n }\n return { id, enabled: enabledValue ?? true };\n}\n\n/**\n * Parse the unified `location.*` block. `enabled` gates everything and\n * requires at least one source; a source's own `enabled` gates that source\n * only. `retainCoordinates` defaults to `false` — coordinates are privacy\n * data and are dropped everywhere unless explicitly retained.\n */\nexport function parseLocationConfig(raw: unknown): LocationConfig {\n const defaults = defaultLocationConfig();\n if (raw === undefined || raw === null) {\n return { ...defaults };\n }\n const config = asRecord(raw, \"location\");\n const enabledValue = coerceBooleanLike(config.enabled, \"location.enabled\");\n if (config.enabled !== undefined && enabledValue === undefined) {\n throw new TypeError(\"location.enabled must be a boolean\");\n }\n const enabled = enabledValue ?? false;\n\n const timezone = optionalNonEmptyString(config.timezone, \"location.timezone\") ?? \"UTC\";\n // Validate the IANA zone at parse so a typo fails at config load, not\n // mid-sync after some sources may already have advanced their state.\n assertValidTimezone(timezone);\n\n const syncDaysValue = coerceNumber(config.syncDays, \"location.syncDays\");\n if (config.syncDays !== undefined && syncDaysValue === undefined) {\n throw new TypeError(\"location.syncDays must be a finite number\");\n }\n const syncDays = syncDaysValue ?? 1;\n if (!Number.isInteger(syncDays) || syncDays < 1 || syncDays > 90) {\n throw new RangeError(\"location.syncDays must be an integer from 1 to 90\");\n }\n\n const retainCoordinatesValue = coerceBooleanLike(config.retainCoordinates, \"location.retainCoordinates\");\n if (config.retainCoordinates !== undefined && retainCoordinatesValue === undefined) {\n throw new TypeError(\"location.retainCoordinates must be a boolean\");\n }\n const retainCoordinates = retainCoordinatesValue ?? false;\n\n if (config.sources !== undefined && !Array.isArray(config.sources)) {\n throw new TypeError(\"location.sources must be an array\");\n }\n const sources = (config.sources ?? []).map(parseLocationSource);\n // Day payloads and sync state are keyed on source id; two sources sharing\n // an id would overwrite each other's state. Reject the collision at parse.\n const ids = new Set<string>();\n for (const source of sources) {\n if (ids.has(source.id)) {\n throw new RangeError(`location source id must be unique: ${source.id}`);\n }\n ids.add(source.id);\n }\n if (enabled && sources.length === 0) {\n throw new RangeError(\"location.enabled requires at least one source\");\n }\n\n return { enabled, timezone, syncDays, retainCoordinates, sources };\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/access-mcp-output-schemas.ts"],"sourcesContent":["/**\n * Output-schema registry for MCP tools — extracted from access-mcp.ts to\n * keep that file under the 3000-LOC structural ratchet.\n *\n * Contains the per-suffix JSON-Schema declarations (derived from\n * production TS return contracts) and the application helper that\n * assigns schemas to tool objects.\n */\n\nconst T_STRING = { type: \"string\" } as const;\nconst T_NUMBER = { type: \"number\" } as const;\nconst T_BOOLEAN = { type: \"boolean\" } as const;\nconst T_ARRAY = { type: \"array\" } as const;\nconst T_OBJECT = { type: \"object\" } as const;\nconst T_NULLABLE_OBJECT = { type: [\"object\", \"null\"] } as const;\nconst T_NULLABLE_STRING = { type: [\"string\", \"null\"] } as const;\n\n/** Build a JSON Schema object type with the given properties. */\nfunction objectSchema(\n properties: Record<string, Readonly<Record<string, unknown>>>,\n required?: readonly string[],\n): Record<string, unknown> {\n return {\n type: \"object\",\n properties,\n ...(required && required.length > 0 ? { required } : {}),\n additionalProperties: true,\n };\n}\n\n/**\n * Per-suffix outputSchema registry. Tools not present here fall back to\n * `{ type: \"object\", additionalProperties: true }` in the constructor pass.\n * The `chatgpt_memory_inspector` tool ships its own precise schema and is\n * intentionally absent — the apply pass skips tools that already have one.\n */\nconst TOOL_OUTPUT_SCHEMAS: Readonly<Record<string, Record<string, unknown>>> = {\n recall: objectSchema({\n query: T_STRING,\n namespace: T_STRING,\n context: T_STRING,\n contextComposition: objectSchema({ context: T_STRING, footer: T_STRING }),\n count: T_NUMBER,\n memoryIds: T_ARRAY,\n results: T_ARRAY,\n fallbackUsed: T_BOOLEAN,\n sourcesUsed: T_ARRAY,\n }),\n recall_explain: objectSchema({\n found: T_BOOLEAN,\n snapshot: T_OBJECT,\n intent: T_NULLABLE_OBJECT,\n graph: T_NULLABLE_OBJECT,\n }),\n recall_tier_explain: objectSchema({ snapshotFound: T_BOOLEAN, tierExplain: T_NULLABLE_OBJECT }),\n recall_xray: objectSchema({ snapshotFound: T_BOOLEAN, snapshot: T_OBJECT }),\n who_knows: objectSchema({ topic: T_STRING, results: T_ARRAY }),\n promotion_candidates: objectSchema({ namespace: T_STRING, targetNamespace: T_STRING, candidates: T_ARRAY }),\n set_coding_context: objectSchema({ ok: T_BOOLEAN }),\n wearables_status: objectSchema({\n enabled: T_BOOLEAN,\n timezone: T_STRING,\n sources: T_ARRAY,\n connectorsInstalled: T_ARRAY,\n }),\n wearables_sync: objectSchema({ summaries: T_ARRAY }, [\"summaries\"]),\n transcript_day: objectSchema({ transcripts: T_ARRAY }, [\"transcripts\"]),\n transcript_search: objectSchema({ results: T_ARRAY }, [\"results\"]),\n transcript_memories: objectSchema({ memories: T_ARRAY }, [\"memories\"]),\n location_status: objectSchema({ enabled: T_BOOLEAN, timezone: T_STRING, sources: T_ARRAY, recentDays: T_ARRAY }),\n location_check: objectSchema({ results: T_ARRAY }, [\"results\"]),\n location_sync: objectSchema({ days: T_ARRAY }, [\"days\"]),\n location_backfill: objectSchema({ days: T_ARRAY }, [\"days\"]),\n location_day: objectSchema({ date: T_STRING, found: T_BOOLEAN, sources: T_ARRAY, observationCount: T_NUMBER }),\n meetings_list: objectSchema({ enabled: T_BOOLEAN, days: T_ARRAY }),\n meetings_get: objectSchema({ enabled: T_BOOLEAN, found: T_BOOLEAN, id: T_STRING, record: T_NULLABLE_STRING }),\n meetings_build: objectSchema({\n date: T_STRING,\n enabled: T_BOOLEAN,\n meetings: T_ARRAY,\n built: T_NUMBER,\n skipped: T_NUMBER,\n removed: T_ARRAY,\n }),\n action_confidence: objectSchema({\n schemaVersion: T_NUMBER,\n decision: T_STRING,\n confidence: T_NUMBER,\n risk: T_STRING,\n contextReadiness: T_STRING,\n intendedAction: T_STRING,\n attentionPolicy: T_STRING,\n principle: T_STRING,\n reasons: T_ARRAY,\n blockers: T_ARRAY,\n factors: T_ARRAY,\n retrievedMemoryCount: T_NUMBER,\n scopeMismatchCount: T_NUMBER,\n safeToAct: T_BOOLEAN,\n }),\n day_summary: objectSchema({\n summary: T_STRING,\n bullets: T_ARRAY,\n next_actions: T_ARRAY,\n risks_or_open_loops: T_ARRAY,\n }),\n capsule_export: objectSchema({\n archivePath: T_STRING,\n manifestPath: T_STRING,\n encryptedArchivePath: T_NULLABLE_STRING,\n manifest: T_OBJECT,\n }),\n capsule_import: objectSchema({ imported: T_ARRAY, skipped: T_ARRAY, manifest: T_OBJECT }),\n capsule_list: objectSchema({ namespace: T_STRING, capsulesDir: T_STRING, capsules: T_ARRAY }),\n entity_synthesis_run: objectSchema({\n namespace: T_STRING,\n requested: T_NUMBER,\n processed: T_NUMBER,\n remaining: T_NUMBER,\n }),\n memory_governance_run: objectSchema({\n namespace: T_STRING,\n runId: T_STRING,\n traceId: T_STRING,\n mode: T_STRING,\n reviewQueueCount: T_NUMBER,\n proposedActionCount: T_NUMBER,\n appliedActionCount: T_NUMBER,\n summaryPath: T_STRING,\n reportPath: T_STRING,\n }),\n procedure_mining_run: objectSchema({ namespace: T_STRING, clustersProcessed: T_NUMBER, proceduresWritten: T_NUMBER }),\n pattern_reinforcement_run: objectSchema({\n namespace: T_STRING,\n ran: T_BOOLEAN,\n clustersFound: T_NUMBER,\n canonicalsUpdated: T_NUMBER,\n duplicatesSuperseded: T_NUMBER,\n }),\n procedural_stats: objectSchema({ namespace: T_STRING, counts: T_OBJECT, recent: T_OBJECT }),\n procedure_library_maintenance: objectSchema({\n enabled: T_BOOLEAN,\n namespace: T_STRING,\n report: T_OBJECT,\n }),\n memory_get: objectSchema({ found: T_BOOLEAN, namespace: T_STRING, memory: T_NULLABLE_OBJECT }),\n memory_timeline: objectSchema({ found: T_BOOLEAN, namespace: T_STRING, count: T_NUMBER, timeline: T_ARRAY }),\n memory_store: objectSchema({\n schemaVersion: T_NUMBER,\n operation: T_STRING,\n namespace: T_STRING,\n dryRun: T_BOOLEAN,\n accepted: T_BOOLEAN,\n queued: T_BOOLEAN,\n status: T_STRING,\n memoryId: T_STRING,\n }),\n suggestion_submit: objectSchema({\n schemaVersion: T_NUMBER,\n operation: T_STRING,\n namespace: T_STRING,\n dryRun: T_BOOLEAN,\n accepted: T_BOOLEAN,\n queued: T_BOOLEAN,\n status: T_STRING,\n memoryId: T_STRING,\n }),\n entity_get: objectSchema({ found: T_BOOLEAN, namespace: T_STRING, entity: T_NULLABLE_OBJECT }),\n review_queue_list: objectSchema({ found: T_BOOLEAN, runId: T_STRING, reviewQueue: T_ARRAY }),\n observe: objectSchema({\n accepted: T_NUMBER,\n sessionKey: T_STRING,\n namespace: T_STRING,\n effectiveNamespace: T_STRING,\n lcmArchived: T_BOOLEAN,\n extractionQueued: T_BOOLEAN,\n }),\n lcm_search: objectSchema({\n query: T_STRING,\n namespace: T_STRING,\n results: T_ARRAY,\n count: T_NUMBER,\n lcmEnabled: T_BOOLEAN,\n }),\n lcm_compaction_flush: objectSchema({\n enabled: T_BOOLEAN,\n flushed: T_BOOLEAN,\n sessionKey: T_STRING,\n namespace: T_STRING,\n }),\n extraction_force_flush: objectSchema({\n flushed: T_BOOLEAN,\n sessionKey: T_STRING,\n namespace: T_STRING,\n effectiveNamespace: T_STRING,\n }),\n lcm_compaction_record: objectSchema({\n enabled: T_BOOLEAN,\n recorded: T_BOOLEAN,\n sessionKey: T_STRING,\n namespace: T_STRING,\n }),\n continuity_audit_generate: objectSchema({ enabled: T_BOOLEAN, period: T_STRING, reportPath: T_STRING }),\n continuity_incident_open: objectSchema({ created: T_BOOLEAN, incident: T_NULLABLE_OBJECT }),\n continuity_incident_close: objectSchema({ closed: T_BOOLEAN, incident: T_NULLABLE_OBJECT }),\n continuity_incident_list: objectSchema({ incidents: T_ARRAY }),\n continuity_loop_add_or_update: objectSchema({ saved: T_BOOLEAN, loop: T_NULLABLE_OBJECT }),\n continuity_loop_review: objectSchema({ reviewed: T_BOOLEAN, loop: T_NULLABLE_OBJECT }),\n identity_anchor_get: objectSchema({ found: T_BOOLEAN, anchor: T_NULLABLE_STRING }),\n identity_anchor_update: objectSchema({ updated: T_BOOLEAN, sections: T_ARRAY }),\n memory_identity: objectSchema({ found: T_BOOLEAN, identity: T_NULLABLE_STRING, message: T_STRING }),\n work_task: objectSchema({\n action: T_STRING,\n task: T_NULLABLE_OBJECT,\n tasks: T_ARRAY,\n count: T_NUMBER,\n deleted: T_BOOLEAN,\n }),\n work_project: objectSchema({\n action: T_STRING,\n project: T_NULLABLE_OBJECT,\n projects: T_ARRAY,\n count: T_NUMBER,\n deleted: T_BOOLEAN,\n }),\n work_board: objectSchema({ action: T_STRING, markdown: T_STRING, snapshot: T_OBJECT, result: T_OBJECT }),\n shared_context_write_output: objectSchema({ written: T_BOOLEAN, path: T_STRING }),\n shared_feedback_record: objectSchema({ recorded: T_BOOLEAN }),\n shared_priorities_append: objectSchema({ appended: T_BOOLEAN }),\n shared_context_cross_signals_run: objectSchema({\n crossSignalsMarkdownPath: T_STRING,\n crossSignalsPath: T_STRING,\n sourceCount: T_NUMBER,\n feedbackCount: T_NUMBER,\n overlapCount: T_NUMBER,\n }),\n shared_context_curate_daily: objectSchema({\n roundtablePath: T_STRING,\n crossSignalsMarkdownPath: T_STRING,\n crossSignalsPath: T_STRING,\n overlapCount: T_NUMBER,\n }),\n compounding_weekly_synthesize: objectSchema({\n weekId: T_STRING,\n reportPath: T_STRING,\n reportJsonPath: T_STRING,\n rubricsPath: T_STRING,\n rubricsIndexPath: T_STRING,\n mistakesCount: T_NUMBER,\n promotionCandidateCount: T_NUMBER,\n }),\n compounding_promote_candidate: objectSchema({\n enabled: T_BOOLEAN,\n dryRun: T_BOOLEAN,\n weekId: T_STRING,\n promoted: T_ARRAY,\n skipped: T_ARRAY,\n tombstoneBlocked: T_ARRAY,\n }),\n compression_guidelines_optimize: objectSchema({\n enabled: T_BOOLEAN,\n dryRun: T_BOOLEAN,\n eventCount: T_NUMBER,\n nextGuidelineVersion: T_NUMBER,\n changedRules: T_NUMBER,\n semanticRefinementApplied: T_BOOLEAN,\n persisted: T_BOOLEAN,\n }),\n compression_guidelines_activate: objectSchema({\n enabled: T_BOOLEAN,\n activated: T_BOOLEAN,\n guidelineVersion: { type: [\"number\", \"null\"] } as const,\n }),\n memory_search: objectSchema({ query: T_STRING, results: T_ARRAY, count: T_NUMBER }),\n external_wiki_search: objectSchema({\n query: T_STRING,\n hits: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n wikiId: T_STRING,\n title: T_STRING,\n path: T_STRING,\n snippet: T_STRING,\n score: T_NUMBER,\n rank: T_NUMBER,\n citations: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n path: T_STRING,\n lineStart: T_NUMBER,\n lineEnd: T_NUMBER,\n note: T_STRING,\n },\n required: [\"path\", \"lineStart\", \"lineEnd\", \"note\"],\n additionalProperties: false,\n },\n },\n indexBlurb: T_STRING,\n },\n required: [\"wikiId\", \"title\", \"path\", \"snippet\", \"score\", \"rank\", \"citations\"],\n additionalProperties: false,\n },\n },\n count: T_NUMBER,\n degradedWikiIds: T_ARRAY,\n }, [\"query\", \"hits\", \"count\", \"degradedWikiIds\"]),\n memory_profile: objectSchema({ profile: T_STRING }),\n memory_entities_list: objectSchema({ entities: T_ARRAY, count: T_NUMBER }),\n memory_questions: objectSchema({ questions: T_ARRAY, count: T_NUMBER }),\n memory_last_recall: objectSchema({\n sessionKey: T_STRING,\n recordedAt: T_STRING,\n queryHash: T_STRING,\n queryLen: T_NUMBER,\n memoryIds: T_ARRAY,\n namespace: T_STRING,\n recallNamespaces: T_ARRAY,\n plannerMode: T_STRING,\n requestedMode: T_STRING,\n source: T_STRING,\n fallbackUsed: T_BOOLEAN,\n sourcesUsed: T_ARRAY,\n latencyMs: T_NUMBER,\n includedMemories: T_ARRAY,\n message: T_NULLABLE_STRING,\n }),\n memory_intent_debug: objectSchema({\n recordedAt: T_STRING,\n promptHash: T_STRING,\n promptLength: T_NUMBER,\n retrievalQueryHash: T_STRING,\n retrievalQueryLength: T_NUMBER,\n plannerEnabled: T_BOOLEAN,\n plannedMode: T_STRING,\n effectiveMode: T_STRING,\n recallResultLimit: T_NUMBER,\n queryIntent: T_OBJECT,\n graphExpandedIntentDetected: T_BOOLEAN,\n graphDecision: T_OBJECT,\n message: T_NULLABLE_STRING,\n }),\n memory_qmd_debug: objectSchema({\n recordedAt: T_STRING,\n queryHash: T_STRING,\n queryLength: T_NUMBER,\n collection: T_STRING,\n namespaces: T_ARRAY,\n fetchLimit: T_NUMBER,\n primaryResultCount: T_NUMBER,\n hybridResultCount: T_NUMBER,\n queryAwareSeedCount: T_NUMBER,\n resultCount: T_NUMBER,\n intentHint: T_STRING,\n explainEnabled: T_BOOLEAN,\n hybridTopUpUsed: T_BOOLEAN,\n hybridTopUpSkippedReason: T_STRING,\n results: T_ARRAY,\n message: T_NULLABLE_STRING,\n }),\n memory_graph_explain: objectSchema({ explanation: T_STRING }),\n graph_snapshot: objectSchema({ nodes: T_ARRAY, edges: T_ARRAY }),\n memory_feedback: objectSchema({ recorded: T_BOOLEAN, enabled: T_BOOLEAN }),\n memory_promote: objectSchema({ promoted: T_BOOLEAN, memoryId: T_STRING }),\n memory_outcome: objectSchema({\n ok: T_BOOLEAN,\n memoryId: T_STRING,\n mw_success: T_NUMBER,\n mw_fail: T_NUMBER,\n reason: T_STRING,\n message: T_STRING,\n }),\n memory_action_apply: objectSchema({ recorded: T_BOOLEAN, event: T_OBJECT }),\n context_checkpoint: objectSchema({ saved: T_BOOLEAN }),\n briefing: objectSchema({\n markdown: T_STRING,\n json: T_OBJECT,\n window: T_OBJECT,\n format: T_STRING,\n namespace: T_STRING,\n }),\n review_list: objectSchema({ pairs: T_ARRAY, total: T_NUMBER, durationMs: T_NUMBER }),\n review_resolve: objectSchema({ pairId: T_STRING, verb: T_STRING, affectedIds: T_ARRAY, message: T_STRING }),\n contradiction_scan_run: objectSchema({\n scanned: T_NUMBER,\n candidates: T_NUMBER,\n judged: T_NUMBER,\n queued: T_NUMBER,\n cooledDown: T_NUMBER,\n elapsedMs: T_NUMBER,\n }),\n preference_drift_scan: objectSchema({\n schemaVersion: T_NUMBER,\n generatedAt: T_STRING,\n mode: T_STRING,\n namespace: T_STRING,\n scanned: T_NUMBER,\n eligible: T_NUMBER,\n findings: T_ARRAY,\n counts: T_OBJECT,\n appliedCount: T_NUMBER,\n reviewItemsOpened: T_NUMBER,\n elapsedMs: T_NUMBER,\n skippedReason: T_STRING,\n }),\n memory_summarize_hourly: objectSchema({ ok: T_BOOLEAN, message: T_STRING }),\n conversation_index_update: objectSchema({\n enabled: T_BOOLEAN,\n sessions: T_NUMBER,\n chunks: T_NUMBER,\n skipped: T_NUMBER,\n embeddedRuns: T_NUMBER,\n }),\n profiling_report: objectSchema({\n enabled: T_BOOLEAN,\n format: T_STRING,\n traces: T_ARRAY,\n stats: T_OBJECT,\n bottleneck: T_NULLABLE_STRING,\n }),\n graph_edge_decay_run: objectSchema({ ranAt: T_STRING, disabled: T_BOOLEAN, reason: T_STRING, results: T_ARRAY }),\n live_connectors_run: objectSchema({\n ranAt: T_STRING,\n force: T_BOOLEAN,\n totalDocsImported: T_NUMBER,\n ranCount: T_NUMBER,\n skippedCount: T_NUMBER,\n errorCount: T_NUMBER,\n results: T_ARRAY,\n }),\n peer_list: objectSchema({ peers: T_ARRAY }),\n peer_get: objectSchema({ found: T_BOOLEAN, peer: T_NULLABLE_OBJECT }),\n peer_set: objectSchema({ ok: T_BOOLEAN, created: T_BOOLEAN, peer: T_OBJECT }),\n peer_delete: objectSchema({ ok: T_BOOLEAN, deleted: T_BOOLEAN }),\n peer_profile_get: objectSchema({\n found: T_BOOLEAN,\n profile: {\n type: \"object\",\n properties: {\n peerId: T_STRING,\n updatedAt: T_STRING,\n fields: { type: \"object\", additionalProperties: T_STRING },\n provenance: {\n type: \"object\",\n additionalProperties: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n observedAt: T_STRING,\n signal: T_STRING,\n sourceSessionId: T_STRING,\n note: T_STRING,\n },\n required: [\"observedAt\", \"signal\"],\n additionalProperties: true,\n },\n },\n },\n },\n required: [\"peerId\", \"updatedAt\", \"fields\", \"provenance\"],\n additionalProperties: true,\n },\n }),\n peer_forget: objectSchema({ ok: T_BOOLEAN, purged: T_BOOLEAN }),\n console_state: objectSchema({\n capturedAt: T_STRING,\n bufferState: T_OBJECT,\n extractionQueue: T_OBJECT,\n dedupRecent: T_ARRAY,\n maintenanceLedgerTail: T_ARRAY,\n qmdProbe: T_OBJECT,\n daemon: T_OBJECT,\n errors: T_ARRAY,\n }),\n dreams_status: objectSchema({ phases: T_OBJECT, windowStart: T_STRING, windowEnd: T_STRING }),\n dreams_run: objectSchema({ phase: T_STRING, durationMs: T_NUMBER, itemsProcessed: T_NUMBER }),\n coding_decision: objectSchema({\n subcommand: T_STRING,\n records: T_ARRAY,\n count: T_NUMBER,\n found: T_BOOLEAN,\n memoryId: T_STRING,\n status: T_STRING,\n supersededMemoryId: T_STRING,\n replacementMemoryId: T_STRING,\n }),\n coding_architecture: objectSchema({\n subcommand: T_STRING,\n found: T_BOOLEAN,\n refreshed: T_BOOLEAN,\n memoryId: T_STRING,\n }),\n coding_delta: objectSchema({\n subcommand: T_STRING,\n ok: T_BOOLEAN,\n kind: T_STRING,\n delta: T_OBJECT,\n nextState: T_OBJECT,\n }),\n memory_correct_plan: objectSchema({\n planId: T_STRING,\n namespace: T_STRING,\n diff: T_STRING,\n actions: T_ARRAY,\n confidence: T_NUMBER,\n }),\n memory_correct_apply: objectSchema({\n planId: T_STRING,\n status: T_STRING,\n results: T_ARRAY,\n auditMemoryId: T_STRING,\n appliedAt: T_STRING,\n }),\n memory_chat: objectSchema({\n reply: T_STRING,\n chatSessionId: T_STRING,\n pendingPlan: {\n type: \"object\",\n properties: { planId: T_STRING, preview: T_STRING },\n required: [\"planId\", \"preview\"],\n additionalProperties: true,\n },\n skippedTools: { type: \"array\", items: T_STRING },\n }),\n codegraph_index: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_list_projects: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_delete_project: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_index_status: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_search_graph: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_trace_path: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_detect_changes: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_query_graph: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_get_schema: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_get_snippet: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_get_architecture: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_search_code: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_manage_adr: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_ingest_traces: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n};\n\n/**\n * Apply outputSchema from the registry to every tool that lacks one.\n * Suffix resolution strips the canonical or legacy prefix so both\n * `remnic.*` and `engram.*` aliases inherit the same schema.\n * Tools that already have an explicit outputSchema are skipped.\n */\nexport function applyToolOutputSchemas<T extends { name: string; outputSchema?: unknown }>(\n tools: ReadonlyArray<T>,\n canonicalPrefix: string,\n legacyPrefix: string\n): T[] {\n return tools.map((tool) => {\n if (tool.outputSchema) return tool;\n const name = tool.name as string;\n const suffix = name.startsWith(canonicalPrefix)\n ? name.slice(canonicalPrefix.length)\n : name.startsWith(legacyPrefix)\n ? name.slice(legacyPrefix.length)\n : name;\n return { ...tool, outputSchema: TOOL_OUTPUT_SCHEMAS[suffix] ?? { type: \"object\", additionalProperties: true } };\n });\n}\n"],"mappings":"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","names":[]}