@remnic/core 9.69.23 → 9.69.24

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 (440) hide show
  1. package/dist/abstraction-nodes.js +3 -2
  2. package/dist/access-admin-ops-surface.d.ts +1 -1
  3. package/dist/access-admin-ops-surface.js +53 -53
  4. package/dist/access-authorization-probe.d.ts +1 -1
  5. package/dist/access-authorization-probe.js +54 -54
  6. package/dist/access-boundary.d.ts +1 -1
  7. package/dist/access-boundary.js +53 -53
  8. package/dist/access-citation-namespace.js +3 -3
  9. package/dist/access-cli.js +112 -112
  10. package/dist/access-extraction-force-flush.d.ts +1 -1
  11. package/dist/access-extraction-force-flush.js +53 -53
  12. package/dist/access-http-briefing.d.ts +1 -1
  13. package/dist/access-http-briefing.js +54 -54
  14. package/dist/access-http-lcm-compaction.d.ts +1 -1
  15. package/dist/access-http-lifecycle-flush.d.ts +1 -1
  16. package/dist/access-http-offline-stream.d.ts +1 -1
  17. package/dist/access-http-query.js +55 -55
  18. package/dist/access-http.d.ts +2 -2
  19. package/dist/access-http.js +72 -72
  20. package/dist/access-identity-continuity-surface.js +53 -53
  21. package/dist/access-lcm-surface.d.ts +1 -1
  22. package/dist/access-lcm-surface.js +53 -53
  23. package/dist/access-mcp.d.ts +1 -1
  24. package/dist/access-mcp.js +64 -64
  25. package/dist/access-namespace-preflight.js +53 -53
  26. package/dist/access-observe-write-surface.d.ts +1 -1
  27. package/dist/access-observe-write-surface.js +53 -53
  28. package/dist/access-offline-manifest.js +10 -10
  29. package/dist/access-operations-batch.js +58 -58
  30. package/dist/access-operations.d.ts +6 -6
  31. package/dist/access-operations.js +63 -63
  32. package/dist/access-recall-concurrency.d.ts +1 -1
  33. package/dist/access-recall-concurrency.js +53 -53
  34. package/dist/access-recall-response.d.ts +1 -1
  35. package/dist/access-recall-response.js +53 -53
  36. package/dist/access-recall-surface.d.ts +1 -1
  37. package/dist/access-recall-surface.js +53 -53
  38. package/dist/access-schema.d.ts +91 -91
  39. package/dist/access-schema.js +6 -5
  40. package/dist/access-service-helpers.d.ts +1 -1
  41. package/dist/access-service.d.ts +1 -1
  42. package/dist/access-service.js +53 -53
  43. package/dist/access-surface-catalog.d.ts +1 -1
  44. package/dist/access-surface-catalog.js +55 -55
  45. package/dist/active-recall.js +12 -11
  46. package/dist/active-recall.js.map +1 -1
  47. package/dist/{auto-sync-TTIEWJ5X.js → auto-sync-WNGG2GC2.js} +7 -7
  48. package/dist/briefing.js +20 -20
  49. package/dist/buffer.js +9 -9
  50. package/dist/calibration.js +2 -1
  51. package/dist/calibration.js.map +1 -1
  52. package/dist/{capsule-merge-CU6QJBSV.js → capsule-merge-IPG4IOFP.js} +4 -4
  53. package/dist/causal-behavior.js +4 -3
  54. package/dist/causal-behavior.js.map +1 -1
  55. package/dist/causal-chain.js +4 -3
  56. package/dist/causal-consolidation.js +25 -25
  57. package/dist/causal-retrieval.js +4 -3
  58. package/dist/causal-retrieval.js.map +1 -1
  59. package/dist/causal-trajectory-graph.js +2 -1
  60. package/dist/causal-trajectory-graph.js.map +1 -1
  61. package/dist/causal-trajectory.js +3 -2
  62. package/dist/{chunk-5RWHODVF.js → chunk-27QVNSQ3.js} +2 -2
  63. package/dist/{chunk-2MX7RU7B.js → chunk-2EKJDQZB.js} +2 -2
  64. package/dist/{chunk-XLRM6PPI.js → chunk-2IOHTUP3.js} +4 -4
  65. package/dist/{chunk-ZGQDTD5T.js → chunk-2ITE4C2Z.js} +2 -2
  66. package/dist/{chunk-O5ZR7SXV.js → chunk-2SGLMP2E.js} +2 -2
  67. package/dist/{chunk-FYWLSFFS.js → chunk-2Z4GS5E6.js} +2 -2
  68. package/dist/{chunk-WELP4CG6.js → chunk-37KUQPX4.js} +6 -6
  69. package/dist/{chunk-DDQQY2E3.js → chunk-3BTFBQLO.js} +7 -7
  70. package/dist/chunk-3BTFBQLO.js.map +1 -0
  71. package/dist/{chunk-UR6PBX2J.js → chunk-3K7V3HE6.js} +35 -60
  72. package/dist/chunk-3K7V3HE6.js.map +1 -0
  73. package/dist/{chunk-MRSLR6TB.js → chunk-3QQTXYZ6.js} +2 -2
  74. package/dist/{chunk-DJUKBGAD.js → chunk-46EST7JO.js} +5 -5
  75. package/dist/chunk-46EST7JO.js.map +1 -0
  76. package/dist/{chunk-CI6C33EO.js → chunk-46ZPIGWI.js} +3 -3
  77. package/dist/{chunk-HTIIXNJQ.js → chunk-4FIH6MPS.js} +6 -3
  78. package/dist/chunk-4FIH6MPS.js.map +1 -0
  79. package/dist/{chunk-MCA2X4WH.js → chunk-4IHBN6WU.js} +2 -2
  80. package/dist/{chunk-W7IGLX4G.js → chunk-4O6WRBGE.js} +7 -7
  81. package/dist/chunk-4O6WRBGE.js.map +1 -0
  82. package/dist/{chunk-TOZCM7WN.js → chunk-4TKJGOCJ.js} +2 -2
  83. package/dist/{chunk-3ADRFFRO.js → chunk-54WHLA65.js} +4 -4
  84. package/dist/{chunk-Z2N2AHEM.js → chunk-56Y6EKZN.js} +2 -2
  85. package/dist/{chunk-2H2N5UQW.js → chunk-5ATKSPEQ.js} +2 -2
  86. package/dist/{chunk-MSOXFXCA.js → chunk-5FAGCOZD.js} +5 -5
  87. package/dist/chunk-5FAGCOZD.js.map +1 -0
  88. package/dist/{chunk-ZVZHG7AI.js → chunk-5UBH37SL.js} +3 -3
  89. package/dist/{chunk-YZYZ2BEU.js → chunk-66OJSCI6.js} +2 -2
  90. package/dist/{chunk-HNPE66LB.js → chunk-6CVNSDCZ.js} +4 -4
  91. package/dist/{chunk-ERVJFFTR.js → chunk-6NXSYYGP.js} +2 -2
  92. package/dist/{chunk-2HIJHXB3.js → chunk-6WHJ2EAB.js} +2 -2
  93. package/dist/{chunk-34VTBPNE.js → chunk-6XL73HQ4.js} +4 -4
  94. package/dist/{chunk-YK3UIF7X.js → chunk-AQ7SYDVO.js} +2 -2
  95. package/dist/{chunk-DSCCM66R.js → chunk-B3O3IRZN.js} +2 -2
  96. package/dist/{chunk-P77QX3ID.js → chunk-B6O2YLUR.js} +21 -20
  97. package/dist/chunk-B6O2YLUR.js.map +1 -0
  98. package/dist/{chunk-N37X5RU7.js → chunk-BD7JTBYP.js} +2 -2
  99. package/dist/{chunk-VO43BJ2F.js → chunk-BLJWYCNO.js} +5 -5
  100. package/dist/{chunk-ACPCA4NO.js → chunk-BMWN7B3Y.js} +6 -6
  101. package/dist/chunk-BMWN7B3Y.js.map +1 -0
  102. package/dist/{chunk-HSKSVY3Q.js → chunk-C553ZTLF.js} +15 -15
  103. package/dist/{chunk-GCASGYIO.js → chunk-C7HJ3NEI.js} +2 -2
  104. package/dist/{chunk-WVGXCBOC.js → chunk-D5F7TKMH.js} +2 -2
  105. package/dist/{chunk-UFT2XNBW.js → chunk-DGS34QSY.js} +2 -2
  106. package/dist/{chunk-VAOL3SOT.js → chunk-DZD3WGCD.js} +4 -4
  107. package/dist/{chunk-KHMS2FQS.js → chunk-E2P7TZTF.js} +2 -2
  108. package/dist/{chunk-6FC3IZ26.js → chunk-EBA5DA77.js} +2 -2
  109. package/dist/{chunk-E6EANYLD.js → chunk-EOQ6FSQP.js} +2 -2
  110. package/dist/{chunk-7RPPCA26.js → chunk-FVOP3NT7.js} +2 -2
  111. package/dist/{chunk-NRLELHAY.js → chunk-G7NYVKD6.js} +2 -2
  112. package/dist/{chunk-QY34X2QJ.js → chunk-GHTSNGBZ.js} +2 -2
  113. package/dist/{chunk-SLIOMMPF.js → chunk-H272ZPQ3.js} +5 -5
  114. package/dist/{chunk-ZZBQNQS6.js → chunk-H3TKENU4.js} +2 -2
  115. package/dist/{chunk-5OPNUUBX.js → chunk-H4SEGIZY.js} +2 -2
  116. package/dist/{chunk-F2HMDGLC.js → chunk-H54VWRPS.js} +13 -13
  117. package/dist/{chunk-HTP6XRUI.js → chunk-HM7RHKS4.js} +2 -2
  118. package/dist/{chunk-O7H3P2SJ.js → chunk-HWLIMQE2.js} +2 -2
  119. package/dist/{chunk-62WZDHTW.js → chunk-ICKJ52PE.js} +33 -33
  120. package/dist/chunk-ICKJ52PE.js.map +1 -0
  121. package/dist/{chunk-I3FDDCY3.js → chunk-JEC4DVM3.js} +8 -8
  122. package/dist/chunk-JEC4DVM3.js.map +1 -0
  123. package/dist/{chunk-ET2CNMLD.js → chunk-JN72EPOE.js} +2 -2
  124. package/dist/{chunk-E7UQOS4C.js → chunk-JPKK466T.js} +2 -2
  125. package/dist/{chunk-JCCWJHOP.js → chunk-JYZSRNR7.js} +2 -2
  126. package/dist/{chunk-7IUESBLV.js → chunk-K7724CH2.js} +2 -2
  127. package/dist/{chunk-UK7HXNNJ.js → chunk-KAXCYM66.js} +3 -3
  128. package/dist/{chunk-7XVP4P4O.js → chunk-KB2G2I6Q.js} +3 -3
  129. package/dist/{chunk-K7LTRJZU.js → chunk-KEF46KL2.js} +2 -2
  130. package/dist/{chunk-5UZXUTVO.js → chunk-KNA3BXXL.js} +6 -2
  131. package/dist/chunk-KNA3BXXL.js.map +1 -0
  132. package/dist/{chunk-JYYTWCPU.js → chunk-KTWG7CNY.js} +6 -6
  133. package/dist/{chunk-XTYDEO7M.js → chunk-L7Z57SID.js} +2 -2
  134. package/dist/{chunk-EYMPUXAN.js → chunk-LO4UKPKX.js} +3 -3
  135. package/dist/{chunk-LDWIPYJ6.js → chunk-LS2FHUML.js} +3 -3
  136. package/dist/{chunk-GDB4J2H3.js → chunk-MPC7TYTZ.js} +2 -2
  137. package/dist/{chunk-2GF27PGH.js → chunk-MRPOZBJC.js} +3 -3
  138. package/dist/{chunk-7OLKAQMG.js → chunk-MWN6QEI2.js} +2 -2
  139. package/dist/{chunk-J62HG52Z.js → chunk-MY5EDR46.js} +4 -4
  140. package/dist/{chunk-IZRMWPGS.js → chunk-N3ZOP7KC.js} +2 -2
  141. package/dist/{chunk-N6A2RP5S.js → chunk-NB3LRY4T.js} +3 -3
  142. package/dist/{chunk-4N5BIR2U.js → chunk-ND6IQGSZ.js} +2 -2
  143. package/dist/{chunk-NOB2T2FC.js → chunk-NHLLKEKK.js} +2 -2
  144. package/dist/{chunk-WW6B7NQJ.js → chunk-NLYVH66G.js} +6 -6
  145. package/dist/chunk-NLYVH66G.js.map +1 -0
  146. package/dist/{chunk-M5CQNOQN.js → chunk-O6ZNNVSP.js} +2 -2
  147. package/dist/{chunk-NNBZS3DY.js → chunk-OB3XMWX5.js} +2 -2
  148. package/dist/{chunk-TXJNRGMI.js → chunk-OEYZXDQI.js} +6 -6
  149. package/dist/chunk-OEYZXDQI.js.map +1 -0
  150. package/dist/{chunk-SIBVIP2Y.js → chunk-PAZY2ZKP.js} +2 -2
  151. package/dist/{chunk-LXESHEBP.js → chunk-PX4UMA5Z.js} +2 -2
  152. package/dist/{chunk-4KNRKJXQ.js → chunk-QOOBICJF.js} +5 -5
  153. package/dist/chunk-QOOBICJF.js.map +1 -0
  154. package/dist/{chunk-NNZFPYYX.js → chunk-R7QY5ZVB.js} +2 -2
  155. package/dist/{chunk-WTRTFIIN.js → chunk-R7RTXEYG.js} +2 -2
  156. package/dist/{chunk-XRBJ5R3P.js → chunk-RBCQVOVJ.js} +3 -3
  157. package/dist/{chunk-WFZNT4KB.js → chunk-RC5DXXWC.js} +2 -2
  158. package/dist/{chunk-OH7LZHGJ.js → chunk-RJYJ7KR7.js} +52 -52
  159. package/dist/{chunk-OH7LZHGJ.js.map → chunk-RJYJ7KR7.js.map} +1 -1
  160. package/dist/{chunk-5QZR2RA3.js → chunk-ROBHL3GL.js} +2 -2
  161. package/dist/{chunk-6PST2SFW.js → chunk-SCXURCVT.js} +3 -3
  162. package/dist/{chunk-AYG7ML7O.js → chunk-SJDQ5RSN.js} +3 -3
  163. package/dist/{chunk-3ZBLKIHJ.js → chunk-SMWTZLHE.js} +51 -41
  164. package/dist/{chunk-3ZBLKIHJ.js.map → chunk-SMWTZLHE.js.map} +1 -1
  165. package/dist/{chunk-IQXDSKTL.js → chunk-SVXJLDDC.js} +6 -6
  166. package/dist/{chunk-SEF4IOFE.js → chunk-SWIKABKI.js} +2 -2
  167. package/dist/{chunk-ZJABRLCZ.js → chunk-TBXAY2SS.js} +4 -4
  168. package/dist/{chunk-GIC6BASP.js → chunk-TNSCIPBQ.js} +2 -2
  169. package/dist/{chunk-ZMDMHSV2.js → chunk-TVEONGBU.js} +2 -2
  170. package/dist/{chunk-4FSEZRGK.js → chunk-TWF35IC6.js} +2 -2
  171. package/dist/{chunk-LS2SGMQE.js → chunk-U6N5IBVY.js} +2 -2
  172. package/dist/{chunk-62YW6OYI.js → chunk-UCKYTA2T.js} +3 -3
  173. package/dist/{chunk-YFCHNOGJ.js → chunk-UNNPNBR2.js} +9 -9
  174. package/dist/{chunk-Z2M7F4QM.js → chunk-VVX5PZFS.js} +3 -3
  175. package/dist/{chunk-NTYLZXDX.js → chunk-VYCOJKSX.js} +2 -2
  176. package/dist/{chunk-UICSQESY.js → chunk-W24T5YMW.js} +2 -2
  177. package/dist/{chunk-HDQUQBPW.js → chunk-W3K3HITK.js} +2 -2
  178. package/dist/{chunk-GDASG7NC.js → chunk-W4F3C7N7.js} +2 -2
  179. package/dist/{chunk-YBLZFNIQ.js → chunk-WJHGDE7X.js} +2 -2
  180. package/dist/{chunk-ZBPXG5PJ.js → chunk-WMLEPWMO.js} +9 -9
  181. package/dist/chunk-WMLEPWMO.js.map +1 -0
  182. package/dist/{chunk-4F24PHNX.js → chunk-WQZZDN5M.js} +2 -2
  183. package/dist/{chunk-CDZEUCV7.js → chunk-X5K5TAQZ.js} +4 -4
  184. package/dist/{chunk-5AUODSOQ.js → chunk-XM24CDZX.js} +3 -3
  185. package/dist/{chunk-6VML2LII.js → chunk-XOVKXJEP.js} +3 -3
  186. package/dist/{chunk-OU5TIWDQ.js → chunk-XSGUMQQQ.js} +12 -12
  187. package/dist/{chunk-7CFVBWDC.js → chunk-XUE46UYW.js} +3 -3
  188. package/dist/{chunk-DJORULH3.js → chunk-YRLHEEQT.js} +2 -2
  189. package/dist/{chunk-YRWDPE32.js → chunk-Z3O53WZR.js} +2 -2
  190. package/dist/{chunk-CSY5DA7O.js → chunk-Z6COGHHN.js} +2 -2
  191. package/dist/{chunk-OYR3IPHD.js → chunk-ZIW5JVRM.js} +2 -2
  192. package/dist/{cli-B_YwqoIr.d.ts → cli-DD0P-lu8.d.ts} +1 -1
  193. package/dist/cli.d.ts +2 -2
  194. package/dist/cli.js +94 -94
  195. package/dist/coding/export-okf-codegraph.js +21 -21
  196. package/dist/coding/pre-action-gate.js +4 -3
  197. package/dist/commitment-ledger.js +3 -2
  198. package/dist/compounding/engine.js +21 -21
  199. package/dist/config.js +12 -11
  200. package/dist/connectors/codex-materialize-runner.js +21 -21
  201. package/dist/connectors/codex-materialize.js +3 -3
  202. package/dist/connectors/index.js +21 -21
  203. package/dist/consolidation-provenance-check.js +4 -4
  204. package/dist/consolidation-undo.js +3 -3
  205. package/dist/contradiction/index.js +7 -7
  206. package/dist/convergence-refresh.js +22 -22
  207. package/dist/corpus-watermark.js +22 -22
  208. package/dist/cue-anchors.js +4 -3
  209. package/dist/deep-recall-http-glue.d.ts +1 -1
  210. package/dist/deep-recall-http-glue.js +7 -6
  211. package/dist/deep-recall-mcp-tools.d.ts +1 -1
  212. package/dist/entity-retrieval.js +20 -20
  213. package/dist/eval-trajectory-store.js +4 -3
  214. package/dist/eval-trajectory.js +4 -3
  215. package/dist/evals.js +3 -2
  216. package/dist/explicit-capture.js +8 -8
  217. package/dist/external-wiki-access.d.ts +1 -1
  218. package/dist/external-wiki-access.js +54 -54
  219. package/dist/external-wiki-mcp-tools.d.ts +1 -1
  220. package/dist/extraction.js +25 -25
  221. package/dist/{first-start-migration-KHIMCBIC.js → first-start-migration-RC345GPL.js} +6 -5
  222. package/dist/{first-start-migration-KHIMCBIC.js.map → first-start-migration-RC345GPL.js.map} +1 -1
  223. package/dist/{graph-edge-decay-CJW4OT2X.js → graph-edge-decay-MKIRZ762.js} +5 -4
  224. package/dist/graph-jsonl.js +3 -2
  225. package/dist/graph-snapshot.js +3 -2
  226. package/dist/graph.js +2 -1
  227. package/dist/harmonic-construction.js +5 -4
  228. package/dist/harmonic-retrieval.js +5 -4
  229. package/dist/index.d.ts +693 -681
  230. package/dist/index.js +114 -112
  231. package/dist/json-store.js +2 -1
  232. package/dist/live-connectors-runner.js +3 -2
  233. package/dist/location/index.js +23 -23
  234. package/dist/maintenance/memory-governance.js +20 -20
  235. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +20 -20
  236. package/dist/maintenance/rebuild-memory-projection.js +21 -21
  237. package/dist/mcp-memory-inspector-app.d.ts +1 -1
  238. package/dist/memory-projection-mutations.js +3 -3
  239. package/dist/memory-subject-cli.d.ts +1 -1
  240. package/dist/memory-subject.d.ts +1 -1
  241. package/dist/memory-subject.js +4 -4
  242. package/dist/namespaces/migrate.js +21 -21
  243. package/dist/namespaces/search.js +8 -8
  244. package/dist/namespaces/storage.js +20 -20
  245. package/dist/objective-state-writers.js +4 -3
  246. package/dist/objective-state.js +3 -2
  247. package/dist/offline-sync-file-io.js +4 -3
  248. package/dist/offline-sync-impression-drain.js +5 -5
  249. package/dist/offline-sync.js +5 -4
  250. package/dist/operator-doctor-corpus.js +23 -23
  251. package/dist/operator-toolkit.js +38 -38
  252. package/dist/orchestration/maintenance.js +29 -29
  253. package/dist/orchestrator.js +112 -112
  254. package/dist/page-versioning.js +3 -3
  255. package/dist/{public-http-D6d4W8x-.d.ts → public-http-C4i8Opxc.d.ts} +1 -1
  256. package/dist/{purge-OP6BEDFY.js → purge-TZKRE6ZQ.js} +5 -5
  257. package/dist/purge-TZKRE6ZQ.js.map +1 -0
  258. package/dist/recall-state.js +3 -3
  259. package/dist/reconcile/manifest.js +4 -4
  260. package/dist/{resolution-U5O4QANY.js → resolution-VKATP2HT.js} +8 -8
  261. package/dist/resume-bundles.js +16 -15
  262. package/dist/salvage-envelope.js +6 -6
  263. package/dist/schemas.d.ts +176 -176
  264. package/dist/search/document-scanner.js +3 -3
  265. package/dist/search/factory.js +7 -7
  266. package/dist/search/index.js +7 -7
  267. package/dist/search/lancedb-backend.js +4 -4
  268. package/dist/search/meilisearch-backend.js +4 -4
  269. package/dist/search/orama-backend.js +4 -4
  270. package/dist/secure-store/index.js +3 -3
  271. package/dist/semantic-consolidation.js +22 -22
  272. package/dist/semantic-rule-promotion.js +20 -20
  273. package/dist/semantic-rule-verifier.js +20 -20
  274. package/dist/shared-context/manager.d.ts +6 -6
  275. package/dist/source-agent-qualifier.js +24 -24
  276. package/dist/standup/build.js +20 -20
  277. package/dist/storage.js +19 -19
  278. package/dist/subject-config.js +5 -5
  279. package/dist/support-passport/index.d.ts +4 -4
  280. package/dist/support-passport/index.js +56 -56
  281. package/dist/{tier-stats-2TOW3QNL.js → tier-stats-KA6OZX2C.js} +6 -5
  282. package/dist/{tier-stats-2TOW3QNL.js.map → tier-stats-KA6OZX2C.js.map} +1 -1
  283. package/dist/transfer/capsule-import.js +4 -4
  284. package/dist/transfer/export-okf.js +21 -21
  285. package/dist/transfer/types.d.ts +78 -78
  286. package/dist/trust-zones.js +3 -2
  287. package/dist/utility-learner.js +4 -3
  288. package/dist/utility-runtime.js +5 -4
  289. package/dist/utility-telemetry.js +3 -2
  290. package/dist/verified-recall.js +20 -20
  291. package/dist/who-knows-cli.d.ts +1 -1
  292. package/dist/who-knows-cli.js +21 -21
  293. package/dist/who-knows.d.ts +1 -1
  294. package/dist/who-knows.js +20 -20
  295. package/dist/work/board.js +3 -3
  296. package/dist/work/storage.js +2 -2
  297. package/dist/work-product-ledger.js +3 -2
  298. package/dist/write-envelope.js +5 -5
  299. package/package.json +2 -2
  300. package/src/abstraction-nodes.ts +1 -4
  301. package/src/binary-lifecycle/backend.ts +2 -1
  302. package/src/connectors/live/github.ts +10 -17
  303. package/src/connectors/live/gmail.ts +8 -19
  304. package/src/connectors/live/google-drive.ts +6 -13
  305. package/src/connectors/live/notion.ts +11 -21
  306. package/src/cue-anchors.ts +1 -6
  307. package/src/graph.ts +2 -4
  308. package/src/json-store.ts +17 -20
  309. package/src/live-connectors-runner.ts +2 -1
  310. package/src/location/store.ts +1 -4
  311. package/src/maintenance/purge.ts +2 -5
  312. package/src/maintenance/rebuild-memory-lifecycle-ledger.ts +3 -6
  313. package/src/maintenance/rebuild-memory-projection.ts +2 -5
  314. package/src/namespaces/catalog.ts +1 -9
  315. package/src/offline-sync-file-io.test.ts +39 -0
  316. package/src/offline-sync-file-io.ts +3 -7
  317. package/src/procedural/procedure-miner.ts +1 -9
  318. package/src/search/document-scanner.ts +3 -6
  319. package/src/semantic-rule-promotion.ts +1 -4
  320. package/src/utils/errno.test.ts +31 -0
  321. package/src/utils/errno.ts +5 -0
  322. package/src/wearables/index.ts +1 -0
  323. package/src/wearables/registry.ts +23 -0
  324. package/dist/chunk-4KNRKJXQ.js.map +0 -1
  325. package/dist/chunk-5UZXUTVO.js.map +0 -1
  326. package/dist/chunk-62WZDHTW.js.map +0 -1
  327. package/dist/chunk-ACPCA4NO.js.map +0 -1
  328. package/dist/chunk-DDQQY2E3.js.map +0 -1
  329. package/dist/chunk-DJUKBGAD.js.map +0 -1
  330. package/dist/chunk-HTIIXNJQ.js.map +0 -1
  331. package/dist/chunk-I3FDDCY3.js.map +0 -1
  332. package/dist/chunk-MSOXFXCA.js.map +0 -1
  333. package/dist/chunk-P77QX3ID.js.map +0 -1
  334. package/dist/chunk-TXJNRGMI.js.map +0 -1
  335. package/dist/chunk-UR6PBX2J.js.map +0 -1
  336. package/dist/chunk-W7IGLX4G.js.map +0 -1
  337. package/dist/chunk-WW6B7NQJ.js.map +0 -1
  338. package/dist/chunk-ZBPXG5PJ.js.map +0 -1
  339. package/dist/purge-OP6BEDFY.js.map +0 -1
  340. package/dist/{access-service-Cv8Rizo0.d.ts → access-service-DWdY9Mlk.d.ts} +64 -64
  341. /package/dist/{auto-sync-TTIEWJ5X.js.map → auto-sync-WNGG2GC2.js.map} +0 -0
  342. /package/dist/{capsule-merge-CU6QJBSV.js.map → capsule-merge-IPG4IOFP.js.map} +0 -0
  343. /package/dist/{chunk-5RWHODVF.js.map → chunk-27QVNSQ3.js.map} +0 -0
  344. /package/dist/{chunk-2MX7RU7B.js.map → chunk-2EKJDQZB.js.map} +0 -0
  345. /package/dist/{chunk-XLRM6PPI.js.map → chunk-2IOHTUP3.js.map} +0 -0
  346. /package/dist/{chunk-ZGQDTD5T.js.map → chunk-2ITE4C2Z.js.map} +0 -0
  347. /package/dist/{chunk-O5ZR7SXV.js.map → chunk-2SGLMP2E.js.map} +0 -0
  348. /package/dist/{chunk-FYWLSFFS.js.map → chunk-2Z4GS5E6.js.map} +0 -0
  349. /package/dist/{chunk-WELP4CG6.js.map → chunk-37KUQPX4.js.map} +0 -0
  350. /package/dist/{chunk-MRSLR6TB.js.map → chunk-3QQTXYZ6.js.map} +0 -0
  351. /package/dist/{chunk-CI6C33EO.js.map → chunk-46ZPIGWI.js.map} +0 -0
  352. /package/dist/{chunk-MCA2X4WH.js.map → chunk-4IHBN6WU.js.map} +0 -0
  353. /package/dist/{chunk-TOZCM7WN.js.map → chunk-4TKJGOCJ.js.map} +0 -0
  354. /package/dist/{chunk-3ADRFFRO.js.map → chunk-54WHLA65.js.map} +0 -0
  355. /package/dist/{chunk-Z2N2AHEM.js.map → chunk-56Y6EKZN.js.map} +0 -0
  356. /package/dist/{chunk-2H2N5UQW.js.map → chunk-5ATKSPEQ.js.map} +0 -0
  357. /package/dist/{chunk-ZVZHG7AI.js.map → chunk-5UBH37SL.js.map} +0 -0
  358. /package/dist/{chunk-YZYZ2BEU.js.map → chunk-66OJSCI6.js.map} +0 -0
  359. /package/dist/{chunk-HNPE66LB.js.map → chunk-6CVNSDCZ.js.map} +0 -0
  360. /package/dist/{chunk-ERVJFFTR.js.map → chunk-6NXSYYGP.js.map} +0 -0
  361. /package/dist/{chunk-2HIJHXB3.js.map → chunk-6WHJ2EAB.js.map} +0 -0
  362. /package/dist/{chunk-34VTBPNE.js.map → chunk-6XL73HQ4.js.map} +0 -0
  363. /package/dist/{chunk-YK3UIF7X.js.map → chunk-AQ7SYDVO.js.map} +0 -0
  364. /package/dist/{chunk-DSCCM66R.js.map → chunk-B3O3IRZN.js.map} +0 -0
  365. /package/dist/{chunk-N37X5RU7.js.map → chunk-BD7JTBYP.js.map} +0 -0
  366. /package/dist/{chunk-VO43BJ2F.js.map → chunk-BLJWYCNO.js.map} +0 -0
  367. /package/dist/{chunk-HSKSVY3Q.js.map → chunk-C553ZTLF.js.map} +0 -0
  368. /package/dist/{chunk-GCASGYIO.js.map → chunk-C7HJ3NEI.js.map} +0 -0
  369. /package/dist/{chunk-WVGXCBOC.js.map → chunk-D5F7TKMH.js.map} +0 -0
  370. /package/dist/{chunk-UFT2XNBW.js.map → chunk-DGS34QSY.js.map} +0 -0
  371. /package/dist/{chunk-VAOL3SOT.js.map → chunk-DZD3WGCD.js.map} +0 -0
  372. /package/dist/{chunk-KHMS2FQS.js.map → chunk-E2P7TZTF.js.map} +0 -0
  373. /package/dist/{chunk-6FC3IZ26.js.map → chunk-EBA5DA77.js.map} +0 -0
  374. /package/dist/{chunk-E6EANYLD.js.map → chunk-EOQ6FSQP.js.map} +0 -0
  375. /package/dist/{chunk-7RPPCA26.js.map → chunk-FVOP3NT7.js.map} +0 -0
  376. /package/dist/{chunk-NRLELHAY.js.map → chunk-G7NYVKD6.js.map} +0 -0
  377. /package/dist/{chunk-QY34X2QJ.js.map → chunk-GHTSNGBZ.js.map} +0 -0
  378. /package/dist/{chunk-SLIOMMPF.js.map → chunk-H272ZPQ3.js.map} +0 -0
  379. /package/dist/{chunk-ZZBQNQS6.js.map → chunk-H3TKENU4.js.map} +0 -0
  380. /package/dist/{chunk-5OPNUUBX.js.map → chunk-H4SEGIZY.js.map} +0 -0
  381. /package/dist/{chunk-F2HMDGLC.js.map → chunk-H54VWRPS.js.map} +0 -0
  382. /package/dist/{chunk-HTP6XRUI.js.map → chunk-HM7RHKS4.js.map} +0 -0
  383. /package/dist/{chunk-O7H3P2SJ.js.map → chunk-HWLIMQE2.js.map} +0 -0
  384. /package/dist/{chunk-ET2CNMLD.js.map → chunk-JN72EPOE.js.map} +0 -0
  385. /package/dist/{chunk-E7UQOS4C.js.map → chunk-JPKK466T.js.map} +0 -0
  386. /package/dist/{chunk-JCCWJHOP.js.map → chunk-JYZSRNR7.js.map} +0 -0
  387. /package/dist/{chunk-7IUESBLV.js.map → chunk-K7724CH2.js.map} +0 -0
  388. /package/dist/{chunk-UK7HXNNJ.js.map → chunk-KAXCYM66.js.map} +0 -0
  389. /package/dist/{chunk-7XVP4P4O.js.map → chunk-KB2G2I6Q.js.map} +0 -0
  390. /package/dist/{chunk-K7LTRJZU.js.map → chunk-KEF46KL2.js.map} +0 -0
  391. /package/dist/{chunk-JYYTWCPU.js.map → chunk-KTWG7CNY.js.map} +0 -0
  392. /package/dist/{chunk-XTYDEO7M.js.map → chunk-L7Z57SID.js.map} +0 -0
  393. /package/dist/{chunk-EYMPUXAN.js.map → chunk-LO4UKPKX.js.map} +0 -0
  394. /package/dist/{chunk-LDWIPYJ6.js.map → chunk-LS2FHUML.js.map} +0 -0
  395. /package/dist/{chunk-GDB4J2H3.js.map → chunk-MPC7TYTZ.js.map} +0 -0
  396. /package/dist/{chunk-2GF27PGH.js.map → chunk-MRPOZBJC.js.map} +0 -0
  397. /package/dist/{chunk-7OLKAQMG.js.map → chunk-MWN6QEI2.js.map} +0 -0
  398. /package/dist/{chunk-J62HG52Z.js.map → chunk-MY5EDR46.js.map} +0 -0
  399. /package/dist/{chunk-IZRMWPGS.js.map → chunk-N3ZOP7KC.js.map} +0 -0
  400. /package/dist/{chunk-N6A2RP5S.js.map → chunk-NB3LRY4T.js.map} +0 -0
  401. /package/dist/{chunk-4N5BIR2U.js.map → chunk-ND6IQGSZ.js.map} +0 -0
  402. /package/dist/{chunk-NOB2T2FC.js.map → chunk-NHLLKEKK.js.map} +0 -0
  403. /package/dist/{chunk-M5CQNOQN.js.map → chunk-O6ZNNVSP.js.map} +0 -0
  404. /package/dist/{chunk-NNBZS3DY.js.map → chunk-OB3XMWX5.js.map} +0 -0
  405. /package/dist/{chunk-SIBVIP2Y.js.map → chunk-PAZY2ZKP.js.map} +0 -0
  406. /package/dist/{chunk-LXESHEBP.js.map → chunk-PX4UMA5Z.js.map} +0 -0
  407. /package/dist/{chunk-NNZFPYYX.js.map → chunk-R7QY5ZVB.js.map} +0 -0
  408. /package/dist/{chunk-WTRTFIIN.js.map → chunk-R7RTXEYG.js.map} +0 -0
  409. /package/dist/{chunk-XRBJ5R3P.js.map → chunk-RBCQVOVJ.js.map} +0 -0
  410. /package/dist/{chunk-WFZNT4KB.js.map → chunk-RC5DXXWC.js.map} +0 -0
  411. /package/dist/{chunk-5QZR2RA3.js.map → chunk-ROBHL3GL.js.map} +0 -0
  412. /package/dist/{chunk-6PST2SFW.js.map → chunk-SCXURCVT.js.map} +0 -0
  413. /package/dist/{chunk-AYG7ML7O.js.map → chunk-SJDQ5RSN.js.map} +0 -0
  414. /package/dist/{chunk-IQXDSKTL.js.map → chunk-SVXJLDDC.js.map} +0 -0
  415. /package/dist/{chunk-SEF4IOFE.js.map → chunk-SWIKABKI.js.map} +0 -0
  416. /package/dist/{chunk-ZJABRLCZ.js.map → chunk-TBXAY2SS.js.map} +0 -0
  417. /package/dist/{chunk-GIC6BASP.js.map → chunk-TNSCIPBQ.js.map} +0 -0
  418. /package/dist/{chunk-ZMDMHSV2.js.map → chunk-TVEONGBU.js.map} +0 -0
  419. /package/dist/{chunk-4FSEZRGK.js.map → chunk-TWF35IC6.js.map} +0 -0
  420. /package/dist/{chunk-LS2SGMQE.js.map → chunk-U6N5IBVY.js.map} +0 -0
  421. /package/dist/{chunk-62YW6OYI.js.map → chunk-UCKYTA2T.js.map} +0 -0
  422. /package/dist/{chunk-YFCHNOGJ.js.map → chunk-UNNPNBR2.js.map} +0 -0
  423. /package/dist/{chunk-Z2M7F4QM.js.map → chunk-VVX5PZFS.js.map} +0 -0
  424. /package/dist/{chunk-NTYLZXDX.js.map → chunk-VYCOJKSX.js.map} +0 -0
  425. /package/dist/{chunk-UICSQESY.js.map → chunk-W24T5YMW.js.map} +0 -0
  426. /package/dist/{chunk-HDQUQBPW.js.map → chunk-W3K3HITK.js.map} +0 -0
  427. /package/dist/{chunk-GDASG7NC.js.map → chunk-W4F3C7N7.js.map} +0 -0
  428. /package/dist/{chunk-YBLZFNIQ.js.map → chunk-WJHGDE7X.js.map} +0 -0
  429. /package/dist/{chunk-4F24PHNX.js.map → chunk-WQZZDN5M.js.map} +0 -0
  430. /package/dist/{chunk-CDZEUCV7.js.map → chunk-X5K5TAQZ.js.map} +0 -0
  431. /package/dist/{chunk-5AUODSOQ.js.map → chunk-XM24CDZX.js.map} +0 -0
  432. /package/dist/{chunk-6VML2LII.js.map → chunk-XOVKXJEP.js.map} +0 -0
  433. /package/dist/{chunk-OU5TIWDQ.js.map → chunk-XSGUMQQQ.js.map} +0 -0
  434. /package/dist/{chunk-7CFVBWDC.js.map → chunk-XUE46UYW.js.map} +0 -0
  435. /package/dist/{chunk-DJORULH3.js.map → chunk-YRLHEEQT.js.map} +0 -0
  436. /package/dist/{chunk-YRWDPE32.js.map → chunk-Z3O53WZR.js.map} +0 -0
  437. /package/dist/{chunk-CSY5DA7O.js.map → chunk-Z6COGHHN.js.map} +0 -0
  438. /package/dist/{chunk-OYR3IPHD.js.map → chunk-ZIW5JVRM.js.map} +0 -0
  439. /package/dist/{graph-edge-decay-CJW4OT2X.js.map → graph-edge-decay-MKIRZ762.js.map} +0 -0
  440. /package/dist/{resolution-U5O4QANY.js.map → resolution-VKATP2HT.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/location/intervals.ts","../src/location/matching.ts","../src/location/store.ts","../src/location/tagging.ts"],"sourcesContent":["/**\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 ...(current.confidence !== undefined ? { confidence: current.confidence } : {}),\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 * Core location matcher (issue #2046) — the ONE place that decides whether a\n * memory or wearable conversation gets provider location context.\n *\n * Pure and deterministic: no IO, no clocks, no randomness. Inputs are UTC\n * ISO-8601 instants and half-open [start, end) intervals everywhere.\n *\n * Rules (issue #2046 / umbrella #2043 decision D):\n * 1. A valid memory interval is required — derived ONLY from the memory's own\n * bi-temporal frontmatter (`valid_at` / `observedAt` / `invalid_at`), never\n * from wall-clock time or message order. Untimed memories stay untagged.\n * 2. Intervals longer than 24h describe long-lived facts, not events at a\n * place; they stay untagged.\n * 3. A place is tagged only when it is DOMINANT (strictly the longest overlap\n * among candidate places; ties are conflicts and leave the memory untagged)\n * and meets `minimumOverlapSeconds` and `minimumConfidence`.\n * 4. Only resolved named places participate (`kind` home/work/poi): transit\n * legs and unnamed visits never tag a memory.\n * 5. No address is ever inferred from text, coordinates, IP, or proximity —\n * only provider-supplied place metadata is echoed, and coordinates only\n * when `retainCoordinates` is enabled.\n *\n * Provider-owned metadata contract: the tag is `location:<stable-place-slug>`\n * and the opaque provider place id lives in structured attributes. Every\n * field the matcher writes is provider-owned; a memory that carries\n * location-ish metadata WITHOUT the `locationSource` marker is treated as\n * manual/user-authored and is never touched.\n */\n\nimport { TAG_LIMITS, STRUCTURED_ATTRIBUTE_LIMITS } from \"../write-envelope.js\";\nimport type { LocationPlace, LocationSegment } from \"./types.js\";\n\n/** Maximum memory span eligible for location tagging. */\nexport const LOCATION_MATCH_MAX_MEMORY_SPAN_MS = 24 * 60 * 60 * 1000;\n\n/** Prefix of provider-owned location tags. */\nexport const LOCATION_TAG_PREFIX = \"location:\";\n\n/** Structured-attribute keys owned by the tagging pipeline (never manual). */\nexport const LOCATION_ATTRIBUTE_KEYS = [\n \"locationSource\",\n \"locationPlaceId\",\n \"locationPlace\",\n \"locationConfidence\",\n \"locationVisitStart\",\n \"locationVisitEnd\",\n \"locationLatitude\",\n \"locationLongitude\",\n] as const;\n\n/** Place kinds eligible for tagging: resolved, named places only. */\nconst TAGGABLE_PLACE_KINDS: Record<string, true> = { home: true, work: true, poi: true };\n\nexport interface LocationTagPolicy {\n minimumOverlapSeconds: number;\n minimumConfidence: number;\n retainCoordinates: boolean;\n}\n\n/** The memory side of a match: a half-open interval, or a single instant. */\nexport type MemoryLocationWindow =\n | { kind: \"interval\"; startUtc: string; endUtc: string }\n | { kind: \"instant\"; atUtc: string };\n\n/** Why a window was rejected before matching. */\nexport type WindowRejectReason = \"untimed\" | \"span-too-long\";\n\nexport interface WindowResult {\n window?: MemoryLocationWindow;\n /** Local days (YYYY-MM-DD in the tag policy timezone) the window touches. */\n days?: string[];\n rejected?: WindowRejectReason;\n}\n\n/**\n * Derive the match window from a memory's own frontmatter. `validAt` (the\n * event start; assumed copies carry the ingestion anchor) opens the window;\n * `invalid_at` closes it. An end-only memory (no start bound) is untimed.\n */\nexport function memoryLocationWindow(\n frontmatter: { valid_at?: string; observedAt?: string; invalid_at?: string },\n localDay: (instantUtc: string) => string,\n): WindowResult {\n const start = frontmatter.valid_at ?? frontmatter.observedAt;\n if (start === undefined || Number.isNaN(Date.parse(start))) {\n return { rejected: \"untimed\" };\n }\n const end = frontmatter.invalid_at;\n if (end === undefined || Number.isNaN(Date.parse(end)) || Date.parse(end) <= Date.parse(start)) {\n return { window: { kind: \"instant\", atUtc: start }, days: [localDay(start)] };\n }\n if (Date.parse(end) - Date.parse(start) > LOCATION_MATCH_MAX_MEMORY_SPAN_MS) {\n return { rejected: \"span-too-long\" };\n }\n // The interval is half-open [start, end): its last instant is end-1ms, so a\n // memory ending exactly at local midnight never touches the next day.\n const lastInstant = new Date(Date.parse(end) - 1).toISOString();\n const days = [localDay(start)];\n const endDay = localDay(lastInstant);\n if (endDay !== days[0]) days.push(endDay);\n return { window: { kind: \"interval\", startUtc: start, endUtc: end }, days };\n}\n\n/** One source's segments for a day, keyed by the configured source id. */\nexport interface LocationSourceSegments {\n sourceId: string;\n segments: LocationSegment[];\n}\n\nexport interface LocationMatch {\n sourceId: string;\n place: LocationPlace;\n /** Overlap (ms) with the window — interval mode; see `visitMs` otherwise. */\n overlapMs: number;\n /** Total dwell (ms) of the dominant place inside the window's day(s). */\n visitMs: number;\n /** Minimum contributing segment confidence, when any source reported one. */\n confidence?: number;\n /** Envelope [start, end) of the segments that produced the match. */\n visitStartUtc: string;\n visitEndUtc: string;\n}\n\nexport type MatchOutcome =\n | { status: \"matched\"; match: LocationMatch }\n | { status: \"unmatched\"; reason: \"no-overlap\" | \"ambiguous\" | \"below-minimum-overlap\" | \"below-minimum-confidence\" };\n\ninterface PlaceAccumulator {\n sourceId: string;\n place: LocationPlace;\n overlapMs: number;\n visitMs: number;\n confidence: number | undefined;\n startUtc: string;\n endUtc: string;\n}\n\nfunction overlapMsOf(\n window: MemoryLocationWindow,\n segment: { startUtc: string; endUtc: string },\n): number {\n if (window.kind === \"instant\") {\n const at = Date.parse(window.atUtc);\n return at >= Date.parse(segment.startUtc) && at < Date.parse(segment.endUtc) ? 1 : 0;\n }\n return Math.max(\n 0,\n Math.min(Date.parse(window.endUtc), Date.parse(segment.endUtc)) -\n Math.max(Date.parse(window.startUtc), Date.parse(segment.startUtc)),\n );\n}\n\n/**\n * The dominant qualifying place for a window, across every source's\n * segments. Deterministic: strict overlap comparison, ties (conflicts) are\n * rejected, and equal-place contributions merge across sources.\n */\nexport function matchDominantPlace(\n window: MemoryLocationWindow,\n sources: readonly LocationSourceSegments[],\n policy: LocationTagPolicy,\n): MatchOutcome {\n const byPlace = new Map<string, PlaceAccumulator>();\n for (const source of sources) {\n for (const segment of source.segments) {\n if (TAGGABLE_PLACE_KINDS[segment.place.kind ?? \"\"] !== true) continue;\n const overlap = overlapMsOf(window, segment);\n if (overlap <= 0) continue;\n const duration = Date.parse(segment.endUtc) - Date.parse(segment.startUtc);\n const existing = byPlace.get(segment.place.id);\n if (existing === undefined) {\n byPlace.set(segment.place.id, {\n sourceId: source.sourceId,\n place: segment.place,\n overlapMs: overlap,\n visitMs: duration,\n confidence: segment.confidence,\n startUtc: segment.startUtc,\n endUtc: segment.endUtc,\n });\n continue;\n }\n // Same place from another source (or a revisit): accumulate.\n existing.overlapMs += overlap;\n existing.visitMs += duration;\n existing.confidence =\n existing.confidence === undefined\n ? segment.confidence\n : segment.confidence === undefined\n ? existing.confidence\n : Math.min(existing.confidence, segment.confidence);\n if (segment.startUtc < existing.startUtc) existing.startUtc = segment.startUtc;\n if (segment.endUtc > existing.endUtc) existing.endUtc = segment.endUtc;\n }\n }\n if (byPlace.size === 0) return { status: \"unmatched\", reason: \"no-overlap\" };\n\n let best: PlaceAccumulator | null = null;\n let tie = false;\n for (const candidate of byPlace.values()) {\n if (best === null || candidate.overlapMs > best.overlapMs) {\n best = candidate;\n tie = false;\n continue;\n }\n if (candidate.overlapMs === best.overlapMs) tie = true;\n }\n if (best === null || tie) return { status: \"unmatched\", reason: \"ambiguous\" };\n\n const overlapForThreshold = window.kind === \"instant\" ? best.visitMs : best.overlapMs;\n if (policy.minimumOverlapSeconds > 0 && overlapForThreshold < policy.minimumOverlapSeconds * 1000) {\n return { status: \"unmatched\", reason: \"below-minimum-overlap\" };\n }\n if (best.confidence !== undefined && best.confidence < policy.minimumConfidence) {\n return { status: \"unmatched\", reason: \"below-minimum-confidence\" };\n }\n return {\n status: \"matched\",\n match: {\n sourceId: best.sourceId,\n place: best.place,\n overlapMs: best.overlapMs,\n visitMs: best.visitMs,\n ...(best.confidence !== undefined ? { confidence: best.confidence } : {}),\n visitStartUtc: best.startUtc,\n visitEndUtc: best.endUtc,\n },\n };\n}\n\n/** Deterministic tag slug for a provider place id (`reitti:place:7` → `reitti-place-7`). */\nexport function locationTagSlug(placeId: string): string {\n const slug = placeId\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n // The collapse above leaves at most one dash at each edge, so single-char\n // strips are complete. The old /^-+|-+$/ alternation backtracked\n // quadratically on unsanitized dash runs (CodeQL js/polynomial-redos);\n // single-character anchors are linear.\n .replace(/^-/, \"\")\n .replace(/-$/, \"\");\n return slug.slice(0, TAG_LIMITS.maxTagLength - LOCATION_TAG_PREFIX.length);\n}\n\n/** The provider-owned tag for a matched place. */\nexport function locationTagForPlace(placeId: string): string {\n return `${LOCATION_TAG_PREFIX}${locationTagSlug(placeId)}`;\n}\n\nfunction boundedAttributeValue(value: string): string {\n return value.slice(0, STRUCTURED_ATTRIBUTE_LIMITS.maxValueLength);\n}\n\n/** Provider-owned structured attributes describing a match. */\nexport function locationAttributesForMatch(\n match: LocationMatch,\n policy: LocationTagPolicy,\n): Record<string, string> {\n const attributes: Record<string, string> = {\n locationSource: match.sourceId,\n locationPlaceId: boundedAttributeValue(match.place.id),\n locationPlace: boundedAttributeValue(match.place.label),\n ...(match.confidence !== undefined ? { locationConfidence: match.confidence.toFixed(3) } : {}),\n locationVisitStart: match.visitStartUtc,\n locationVisitEnd: match.visitEndUtc,\n };\n if (policy.retainCoordinates && match.place.latitude !== undefined && match.place.longitude !== undefined) {\n attributes.locationLatitude = String(match.place.latitude);\n attributes.locationLongitude = String(match.place.longitude);\n }\n return attributes;\n}\n\nexport interface LocationUpdatePlan {\n /** Patch for `writeMemoryFrontmatter`; absent when nothing changes. */\n patch?: { tags: string[]; structuredAttributes: Record<string, string> };\n /** Outcome for reporting. */\n outcome:\n | \"tagged\"\n | \"updated\"\n | \"removed\"\n | \"unchanged\"\n | \"manual-metadata\"\n | \"unmatched\"\n | \"untimed\"\n | \"span-too-long\";\n}\n\nfunction frontmatterHasLocationMetadata(\n frontmatter: { tags?: string[]; structuredAttributes?: Record<string, string> },\n): boolean {\n if ((frontmatter.tags ?? []).some((tag) => tag.startsWith(LOCATION_TAG_PREFIX))) return true;\n return Object.keys(frontmatter.structuredAttributes ?? {}).some((key) =>\n (LOCATION_ATTRIBUTE_KEYS as readonly string[]).includes(key),\n );\n}\n\nfunction isProviderOwned(frontmatter: { structuredAttributes?: Record<string, string> }): boolean {\n const source = frontmatter.structuredAttributes?.locationSource;\n return typeof source === \"string\" && source.length > 0;\n}\n\n/**\n * Plan the provider-owned update for one memory: a match adds/replaces ONLY\n * provider-owned fields; a lost match removes them (corrected observations);\n * manual location metadata (no `locationSource` marker) always wins and is\n * never touched. Unrelated tags and attributes survive every path.\n */\nexport function planLocationUpdate(\n frontmatter: { tags?: string[]; structuredAttributes?: Record<string, string> },\n outcome: MatchOutcome,\n policy: LocationTagPolicy,\n): LocationUpdatePlan {\n if (frontmatterHasLocationMetadata(frontmatter) && !isProviderOwned(frontmatter)) {\n return { outcome: \"manual-metadata\" };\n }\n const tags = [...(frontmatter.tags ?? [])];\n const attributes = { ...(frontmatter.structuredAttributes ?? {}) };\n const providerTagIndex = tags.findIndex((tag) => tag.startsWith(LOCATION_TAG_PREFIX));\n const stripProviderFields = (): void => {\n if (providerTagIndex >= 0) tags.splice(providerTagIndex, 1);\n for (const key of LOCATION_ATTRIBUTE_KEYS) delete attributes[key];\n };\n\n if (outcome.status !== \"matched\") {\n if (!isProviderOwned(frontmatter)) return { outcome: \"unmatched\" };\n if (providerTagIndex < 0 && !(\"locationPlaceId\" in attributes)) {\n return { outcome: \"unchanged\" };\n }\n stripProviderFields();\n return { patch: { tags, structuredAttributes: attributes }, outcome: \"removed\" };\n }\n\n const desiredTag = locationTagForPlace(outcome.match.place.id);\n const desiredAttributes = locationAttributesForMatch(outcome.match, policy);\n if (tags.length >= TAG_LIMITS.maxTags && providerTagIndex < 0) {\n // Full tag budget with no provider slot to reuse — leave the memory alone.\n return { outcome: \"unchanged\" };\n }\n const alreadyCurrent =\n providerTagIndex >= 0 &&\n tags[providerTagIndex] === desiredTag &&\n LOCATION_ATTRIBUTE_KEYS.every((key) => {\n const want = desiredAttributes[key];\n const have = attributes[key];\n return want === undefined ? have === undefined : have === want;\n });\n if (alreadyCurrent) return { outcome: \"unchanged\" };\n\n if (providerTagIndex >= 0) tags[providerTagIndex] = desiredTag;\n else tags.push(desiredTag);\n for (const key of LOCATION_ATTRIBUTE_KEYS) delete attributes[key];\n Object.assign(attributes, desiredAttributes);\n const wasProviderOwned = isProviderOwned(frontmatter);\n return {\n patch: { tags, structuredAttributes: attributes },\n outcome: wasProviderOwned ? \"updated\" : \"tagged\",\n };\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 { isErrnoCode } from \"../utils/errno.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\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 tagging service (issue #2046) — the IO half around the pure\n * matcher in `matching.ts`. Three consumers share it so the policy can never\n * fork:\n *\n * 1. Write-time enrichment: after an extraction batch has cleared the\n * trust/importance/content-hash gates and persisted, the caller tags the\n * new memories (post-write, best-effort, never fails the extraction).\n * 2. Historical backfill (`location/backfill.ts`): the same plan/apply core\n * over a bounded date range, idempotent by construction.\n * 3. Wearable conversation fill: `WearableConversation.location` is filled\n * ONLY when the source did not provide one and the match passes policy.\n *\n * Segment data comes from the machine-global location sync state\n * (`state/locations/sync.json`, ≤ 90 tracked days — matching the bounded\n * backfill range). Reads are plain file loads; every memory mutation goes\n * through `StorageManager.writeMemoryFrontmatter`, the atomic frontmatter\n * chokepoint that preserves content (and therefore the content hash),\n * lifecycle, and versioning invariants.\n */\n\nimport type { StorageManager } from \"../index.js\";\nimport { log } from \"../logger.js\";\nimport type { MemoryFile } from \"../types.js\";\nimport type { WearableConversation } from \"../wearables/types.js\";\nimport { localDayKey, placeDurations } from \"./intervals.js\";\nimport {\n matchDominantPlace,\n memoryLocationWindow,\n planLocationUpdate,\n type LocationSourceSegments,\n type LocationTagPolicy,\n type LocationUpdatePlan,\n} from \"./matching.js\";\nimport { loadLocationSyncState } from \"./store.js\";\nimport type { LocationConfig } from \"./types.js\";\n\n/** Segments for one local day, per source id, from the sync state. */\nexport type DaySegmentIndex = Map<string, LocationSourceSegments[]>;\n\n/** Load every tracked day's per-source segments (one file read). */\nexport async function loadDaySegmentIndex(memoryDir: string): Promise<DaySegmentIndex> {\n const state = await loadLocationSyncState(memoryDir);\n const index: DaySegmentIndex = new Map();\n for (const [sourceId, source] of Object.entries(state.sources)) {\n for (const [date, payload] of Object.entries(source.days ?? {})) {\n const entry: LocationSourceSegments = { sourceId, segments: payload.segments ?? [] };\n const existing = index.get(date);\n if (existing === undefined) index.set(date, [entry]);\n else existing.push(entry);\n }\n }\n return index;\n}\n\nexport function locationTagPolicy(config: LocationConfig): LocationTagPolicy {\n return {\n minimumOverlapSeconds: config.minimumOverlapSeconds,\n minimumConfidence: config.minimumConfidence,\n retainCoordinates: config.retainCoordinates,\n };\n}\n\n/** Every tagging path is off unless BOTH gates are on. */\nexport function locationTaggingEnabled(config: LocationConfig): boolean {\n return config.enabled && config.tagging.enabled;\n}\n\n/**\n * Write-time post-persist hook (issue #2046): tag the memories an extraction\n * batch just made durable. Best-effort by contract — gated on both location\n * gates, and a location failure must never fail the extraction that already\n * persisted.\n */\nexport async function tagPersistedMemories(\n storage: StorageManager,\n memoryIds: string[],\n config: { memoryDir: string; location?: LocationConfig },\n): Promise<void> {\n if (memoryIds.length === 0 || !config.location || !locationTaggingEnabled(config.location)) return;\n try {\n await enrichMemoriesWithLocation({\n storage,\n memoryIds,\n memoryDir: config.memoryDir,\n config: config.location,\n });\n } catch (locationError) {\n log.warn(\"[location] post-write tagging failed (non-fatal)\", locationError);\n }\n}\n\nfunction segmentsForDays(index: DaySegmentIndex, days: readonly string[]): LocationSourceSegments[] {\n const merged = new Map<string, LocationSourceSegments>();\n for (const day of days) {\n for (const entry of index.get(day) ?? []) {\n const existing = merged.get(entry.sourceId);\n if (existing === undefined) {\n merged.set(entry.sourceId, { sourceId: entry.sourceId, segments: [...entry.segments] });\n continue;\n }\n existing.segments.push(...entry.segments);\n }\n }\n return [...merged.values()];\n}\n\n/** The full plan for one memory: window → segments → match → provider-owned diff. */\nfunction planForMemory(\n frontmatter: Pick<MemoryFile[\"frontmatter\"], \"valid_at\" | \"observedAt\" | \"invalid_at\" | \"tags\" | \"structuredAttributes\">,\n index: DaySegmentIndex,\n config: LocationConfig,\n): LocationUpdatePlan {\n const policy = locationTagPolicy(config);\n const result = memoryLocationWindow(frontmatter, (instant) => localDayKey(instant, config.timezone));\n if (result.rejected === \"span-too-long\") return { outcome: \"span-too-long\" };\n if (result.rejected === \"untimed\" || result.window === undefined || result.days === undefined) {\n return { outcome: \"untimed\" };\n }\n const sources = segmentsForDays(index, result.days);\n return planLocationUpdate(frontmatter, matchDominantPlace(result.window, sources, policy), policy);\n}\n\nexport interface LocationEnrichmentCounts {\n tagged: number;\n updated: number;\n removed: number;\n unchanged: number;\n unmatched: number;\n manual: number;\n untimed: number;\n spanTooLong: number;\n failed: number;\n}\n\nexport function emptyEnrichmentCounts(): LocationEnrichmentCounts {\n return {\n tagged: 0,\n updated: 0,\n removed: 0,\n unchanged: 0,\n unmatched: 0,\n manual: 0,\n untimed: 0,\n spanTooLong: 0,\n failed: 0,\n };\n}\n\nfunction countOutcome(counts: LocationEnrichmentCounts, outcome: LocationUpdatePlan[\"outcome\"]): void {\n if (outcome === \"tagged\") counts.tagged += 1;\n else if (outcome === \"updated\") counts.updated += 1;\n else if (outcome === \"removed\") counts.removed += 1;\n else if (outcome === \"unchanged\") counts.unchanged += 1;\n else if (outcome === \"manual-metadata\") counts.manual += 1;\n else if (outcome === \"unmatched\") counts.unmatched += 1;\n else if (outcome === \"untimed\") counts.untimed += 1;\n else if (outcome === \"span-too-long\") counts.spanTooLong += 1;\n}\n\nexport interface EnrichMemoriesOptions {\n storage: Pick<StorageManager, \"getMemoryById\" | \"writeMemoryFrontmatter\">;\n memoryDir: string;\n config: LocationConfig;\n /** Enrich exactly these memory ids (write-time path). */\n memoryIds?: string[];\n /** Pre-loaded memories (backfill path — one readAllMemories per run). */\n memories?: MemoryFile[];\n /** Reuse a caller-loaded segment index (backfill). */\n index?: DaySegmentIndex;\n /** Skip every mutation and only report (dry-run). */\n dryRun?: boolean;\n}\n\n/**\n * Apply the matcher to a set of memories and patch provider-owned location\n * metadata. A failure on ONE memory is counted and skipped — it never blocks\n * the others (failure isolation, issue #2046).\n */\nexport async function enrichMemoriesWithLocation(\n options: EnrichMemoriesOptions,\n): Promise<LocationEnrichmentCounts> {\n if (!locationTaggingEnabled(options.config)) return emptyEnrichmentCounts();\n const counts = emptyEnrichmentCounts();\n const index = options.index ?? (await loadDaySegmentIndex(options.memoryDir));\n\n let memories = options.memories;\n if (memories === undefined && options.memoryIds !== undefined) {\n memories = [];\n for (const id of options.memoryIds) {\n const memory = await options.storage.getMemoryById(id);\n if (memory !== null) memories.push(memory);\n }\n }\n if (memories === undefined) return counts;\n\n for (const memory of memories) {\n try {\n const plan = planForMemory(memory.frontmatter, index, options.config);\n // Count patch outcomes (tagged/updated/removed) only after the write\n // lands — a rejected write is `failed`, never also `tagged`.\n if (plan.patch === undefined || options.dryRun === true) {\n countOutcome(counts, plan.outcome);\n continue;\n }\n await options.storage.writeMemoryFrontmatter(memory, plan.patch, { actor: \"location-tagging\" });\n countOutcome(counts, plan.outcome);\n } catch {\n counts.failed += 1;\n }\n }\n return counts;\n}\n\n/**\n * Fill `WearableConversation.location` for conversations whose source did not\n * provide one. Missing-only and source-aware: a provider-supplied value is\n * never overwritten, and a failing conversation never blocks the others.\n */\nexport async function fillWearableConversationLocations(\n conversations: WearableConversation[],\n deps: { memoryDir: string; config: LocationConfig },\n): Promise<void> {\n if (!locationTaggingEnabled(deps.config) || conversations.length === 0) return;\n let index: DaySegmentIndex;\n try {\n index = await loadDaySegmentIndex(deps.memoryDir);\n } catch {\n return;\n }\n const policy = locationTagPolicy(deps.config);\n for (const conversation of conversations) {\n if (conversation.location !== undefined && conversation.location.length > 0) continue;\n try {\n const startMs = Date.parse(conversation.startIso);\n const endMs = conversation.endIso !== undefined ? Date.parse(conversation.endIso) : Number.NaN;\n const window =\n Number.isFinite(startMs) && Number.isFinite(endMs) && endMs > startMs\n ? { kind: \"interval\" as const, startUtc: conversation.startIso, endUtc: conversation.endIso as string }\n : { kind: \"instant\" as const, atUtc: conversation.startIso };\n const anchor = window.kind === \"interval\" ? new Date(Date.parse(window.endUtc) - 1).toISOString() : window.atUtc;\n const days = [...new Set([localDayKey(anchor, deps.config.timezone), localDayKey(conversation.startIso, deps.config.timezone)])];\n const outcome = matchDominantPlace(window, segmentsForDays(index, days), policy);\n if (outcome.status === \"matched\") {\n conversation.location = outcome.match.place.label;\n }\n } catch {\n // One bad conversation never blocks the rest of the day's fill.\n }\n }\n}\n\n/** Render an opt-in, labels-only location context section for a day summary. */\nexport async function renderDayLocationContext(\n memoryDir: string,\n date: string,\n config: LocationConfig,\n): Promise<string | null> {\n if (!locationTaggingEnabled(config)) return null;\n const state = await loadLocationSyncState(memoryDir);\n const segments = [];\n for (const source of Object.values(state.sources)) {\n for (const segment of source.days?.[date]?.segments ?? []) segments.push(segment);\n }\n if (segments.length === 0) return null;\n const durations = placeDurations(segments)\n .filter((duration) => [\"home\", \"work\", \"poi\"].includes(duration.place.kind ?? \"poi\"))\n .sort((a, b) => (a.totalMs !== b.totalMs ? b.totalMs - a.totalMs : a.place.id < b.place.id ? -1 : 1));\n if (durations.length === 0) return null;\n const lines = durations.map((duration) => {\n const minutes = Math.round(duration.totalMs / 60_000);\n const hours = Math.floor(minutes / 60);\n const rendered = hours <= 0 ? `${minutes}m` : `${hours}h ${String(minutes % 60).padStart(2, \"0\")}m`;\n return `- ${duration.place.label.replace(/\\s+/g, \" \").replace(/[`*_]/g, \"\").trim()}: ${rendered}`;\n });\n return `## Location context\\n\\n${lines.join(\"\\n\")}`;\n}\n"],"mappings":"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","names":[]}
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-7T4TOGMS.js";
4
4
  import {
5
5
  defineOperation
6
- } from "./chunk-62WZDHTW.js";
6
+ } from "./chunk-ICKJ52PE.js";
7
7
 
8
8
  // src/external-wiki-access.ts
9
9
  import { z } from "zod";
@@ -26,4 +26,4 @@ var externalWikiSearchOperation = defineOperation({
26
26
  export {
27
27
  externalWikiSearchOperation
28
28
  };
29
- //# sourceMappingURL=chunk-M5CQNOQN.js.map
29
+ //# sourceMappingURL=chunk-O6ZNNVSP.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  scanMemoryDir
3
- } from "./chunk-W7IGLX4G.js";
3
+ } from "./chunk-4O6WRBGE.js";
4
4
  import {
5
5
  isSearchAborted,
6
6
  throwIfSearchAborted
@@ -253,4 +253,4 @@ function isMeilisearchIndexNotFoundError(err) {
253
253
  export {
254
254
  MeilisearchBackend
255
255
  };
256
- //# sourceMappingURL=chunk-NNBZS3DY.js.map
256
+ //# sourceMappingURL=chunk-OB3XMWX5.js.map
@@ -1,9 +1,12 @@
1
1
  import {
2
2
  StorageManager
3
- } from "./chunk-OU5TIWDQ.js";
3
+ } from "./chunk-XSGUMQQQ.js";
4
4
  import {
5
5
  composeMemoryEnvelope
6
- } from "./chunk-MRSLR6TB.js";
6
+ } from "./chunk-3QQTXYZ6.js";
7
+ import {
8
+ isErrnoCode
9
+ } from "./chunk-KNA3BXXL.js";
7
10
  import {
8
11
  log
9
12
  } from "./chunk-3WCASNQZ.js";
@@ -37,9 +40,6 @@ function promotionLockOwnerlessGraceMs() {
37
40
  function promotionLockHeartbeatMs() {
38
41
  return testHooks?.heartbeatMs ?? PROMOTION_LOCK_HEARTBEAT_MS;
39
42
  }
40
- function isErrnoCode(err, code) {
41
- return typeof err === "object" && err !== null && "code" in err && err.code === code;
42
- }
43
43
  function promotionLockDir(memoryDir, ruleKey) {
44
44
  const digest = createHash("sha256").update(ruleKey).digest("hex");
45
45
  return path.join(path.resolve(memoryDir), "state", "semantic-rule-promotion-locks", `${digest}.lock`);
@@ -546,4 +546,4 @@ export {
546
546
  setSemanticRulePromotionTestHooks,
547
547
  promoteSemanticRuleFromMemory
548
548
  };
549
- //# sourceMappingURL=chunk-TXJNRGMI.js.map
549
+ //# sourceMappingURL=chunk-OEYZXDQI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/semantic-rule-promotion.ts"],"sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport { composeMemoryEnvelope } from \"./write-envelope.js\";\nimport { log } from \"./logger.js\";\nimport { link, mkdir, readFile, rename, rm, stat, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { setTimeout as sleep } from \"node:timers/promises\";\nimport { StorageManager } from \"./storage.js\";\nimport type { MemoryFile, MemoryLink } from \"./types.js\";\nimport { isErrnoCode } from \"./utils/errno.js\";\n\nexport interface SemanticRulePromotionCandidate {\n id: string;\n sourceMemoryId: string;\n content: string;\n confidence: number;\n tags: string[];\n memoryKind: \"note\";\n lineage: string[];\n}\n\nexport interface SemanticRulePromotionSkip {\n sourceMemoryId: string;\n reason:\n | \"disabled\"\n | \"source-memory-missing\"\n | \"source-memory-forgotten\"\n | \"source-memory-not-episode\"\n | \"no-explicit-rule\"\n | \"duplicate-rule\";\n existingRuleId?: string;\n}\n\nexport interface SemanticRulePromotionReport {\n enabled: boolean;\n dryRun: boolean;\n promoted: SemanticRulePromotionCandidate[];\n skipped: SemanticRulePromotionSkip[];\n}\n\nconst PROMOTION_LOCK_TIMEOUT_MS = 10 * 60 * 1000;\nconst PROMOTION_LOCK_RETRY_MS = 25;\nconst PROMOTION_LOCK_STALE_MS = 5 * 60 * 1000;\nconst PROMOTION_LOCK_OWNERLESS_GRACE_MS = 1000;\nconst PROMOTION_LOCK_HEARTBEAT_MS = 30 * 1000;\n\ntype SemanticRulePromotionTestHooks = {\n beforeLockOwnerWrite?: (lockDir: string, ownerToken: string) => Promise<void> | void;\n beforeLockRelease?: (lockDir: string, ownerToken: string) => Promise<void> | void;\n beforePromotedRuleWrite?: (lockDir: string, ownerToken: string) => Promise<void> | void;\n lockTimeoutMs?: number;\n lockRetryMs?: number;\n staleLockMs?: number;\n ownerlessGraceMs?: number;\n heartbeatMs?: number;\n};\n\nlet testHooks: SemanticRulePromotionTestHooks | null = null;\n\nexport function setSemanticRulePromotionTestHooks(hooks: SemanticRulePromotionTestHooks | null): void {\n testHooks = hooks;\n}\n\nfunction promotionLockTimeoutMs(): number {\n return testHooks?.lockTimeoutMs ?? PROMOTION_LOCK_TIMEOUT_MS;\n}\n\nfunction promotionLockRetryMs(): number {\n return testHooks?.lockRetryMs ?? PROMOTION_LOCK_RETRY_MS;\n}\n\nfunction promotionLockStaleMs(): number {\n return testHooks?.staleLockMs ?? PROMOTION_LOCK_STALE_MS;\n}\n\nfunction promotionLockOwnerlessGraceMs(): number {\n return testHooks?.ownerlessGraceMs ?? PROMOTION_LOCK_OWNERLESS_GRACE_MS;\n}\n\nfunction promotionLockHeartbeatMs(): number {\n return testHooks?.heartbeatMs ?? PROMOTION_LOCK_HEARTBEAT_MS;\n}\n\nfunction promotionLockDir(memoryDir: string, ruleKey: string): string {\n const digest = createHash(\"sha256\").update(ruleKey).digest(\"hex\");\n return path.join(path.resolve(memoryDir), \"state\", \"semantic-rule-promotion-locks\", `${digest}.lock`);\n}\n\nfunction promotionHeartbeatPath(lockDir: string, token: string): string {\n return path.join(lockDir, `heartbeat.${token}.json`);\n}\n\nfunction promotionReapDir(lockDir: string): string {\n return `${lockDir}.reap`;\n}\n\nfunction promotionReleaseDir(lockDir: string): string {\n return `${lockDir}.release`;\n}\n\nasync function pathExists(targetPath: string): Promise<boolean> {\n try {\n await stat(targetPath);\n return true;\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) return false;\n throw err;\n }\n}\n\nasync function readPromotionLockOwner(lockDir: string): Promise<{\n acquiredAtMs: number | null;\n heartbeatAtMs: number | null;\n token: string | null;\n}> {\n try {\n const owner = JSON.parse(await readFile(path.join(lockDir, \"owner.json\"), \"utf8\")) as {\n acquiredAt?: unknown;\n heartbeatAt?: unknown;\n token?: unknown;\n };\n const acquiredAtMs = typeof owner.acquiredAt === \"string\" ? Date.parse(owner.acquiredAt) : Number.NaN;\n const heartbeatAtMs = typeof owner.heartbeatAt === \"string\" ? Date.parse(owner.heartbeatAt) : Number.NaN;\n return {\n acquiredAtMs: Number.isFinite(acquiredAtMs) ? acquiredAtMs : null,\n heartbeatAtMs: Number.isFinite(heartbeatAtMs) ? heartbeatAtMs : null,\n token: typeof owner.token === \"string\" ? owner.token : null,\n };\n } catch {\n return {\n acquiredAtMs: null,\n heartbeatAtMs: null,\n token: null,\n };\n }\n}\n\nasync function tryWritePromotionLockOwner(\n lockDir: string,\n owner: { token: string; acquiredAt: string }\n): Promise<boolean> {\n const ownerPath = path.join(lockDir, \"owner.json\");\n const tempPath = path.join(lockDir, `owner.${process.pid}.${randomUUID()}.tmp`);\n await testHooks?.beforeLockOwnerWrite?.(lockDir, owner.token);\n try {\n await writeFile(\n tempPath,\n `${JSON.stringify(\n {\n pid: process.pid,\n token: owner.token,\n acquiredAt: owner.acquiredAt,\n },\n null,\n 2\n )}\\n`\n );\n await link(tempPath, ownerPath);\n return true;\n } catch (err) {\n if (isErrnoCode(err, \"EEXIST\") || isErrnoCode(err, \"ENOENT\")) {\n return false;\n }\n throw err;\n } finally {\n await rm(tempPath, { force: true });\n }\n}\n\nasync function writePromotionLockHeartbeat(lockDir: string, token: string): Promise<void> {\n const heartbeatPath = promotionHeartbeatPath(lockDir, token);\n const tempPath = path.join(lockDir, `heartbeat.${process.pid}.${randomUUID()}.tmp`);\n try {\n await writeFile(\n tempPath,\n `${JSON.stringify(\n {\n pid: process.pid,\n token,\n heartbeatAt: new Date().toISOString(),\n },\n null,\n 2\n )}\\n`\n );\n await rename(tempPath, heartbeatPath);\n } catch (err) {\n await rm(tempPath, { force: true });\n throw err;\n }\n}\n\nasync function refreshPromotionLockHeartbeat(lockDir: string, token: string): Promise<boolean> {\n const owner = await readPromotionLockOwner(lockDir);\n if (owner.token !== token) {\n return false;\n }\n await writePromotionLockHeartbeat(lockDir, token);\n return true;\n}\n\nasync function readPromotionLockHeartbeatMs(lockDir: string, token: string | null): Promise<number | null> {\n if (!token) return null;\n try {\n return (await stat(promotionHeartbeatPath(lockDir, token))).mtimeMs;\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) return null;\n throw err;\n }\n}\n\nasync function reapAbandonedPromotionGuard(guardDir: string): Promise<boolean> {\n let reapStat: { mtimeMs: number };\n try {\n reapStat = await stat(guardDir);\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) return false;\n throw err;\n }\n if (Date.now() - reapStat.mtimeMs < promotionLockStaleMs()) {\n return false;\n }\n\n const staleReapDir = `${guardDir}.stale-${process.pid}-${randomUUID()}`;\n try {\n await rename(guardDir, staleReapDir);\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) return false;\n throw err;\n }\n await rm(staleReapDir, { recursive: true, force: true });\n return true;\n}\n\nasync function reapAbandonedPromotionGuards(lockDir: string): Promise<boolean> {\n const reapedReapGuard = await reapAbandonedPromotionGuard(promotionReapDir(lockDir));\n const reapedReleaseGuard = await reapAbandonedPromotionGuard(promotionReleaseDir(lockDir));\n return reapedReapGuard || reapedReleaseGuard;\n}\n\nasync function hasPromotionGuard(lockDir: string): Promise<boolean> {\n return (await pathExists(promotionReapDir(lockDir))) || (await pathExists(promotionReleaseDir(lockDir)));\n}\n\nasync function reapStalePromotionLock(lockDir: string): Promise<boolean> {\n if (await hasPromotionGuard(lockDir)) {\n await reapAbandonedPromotionGuards(lockDir);\n return false;\n }\n\n const reapDir = promotionReapDir(lockDir);\n try {\n await mkdir(reapDir);\n } catch (err) {\n if (isErrnoCode(err, \"EEXIST\")) return false;\n throw err;\n }\n\n let staleDir: string | null = null;\n try {\n return await reapStalePromotionLockWithGuard(lockDir, (value) => {\n staleDir = value;\n });\n } finally {\n if (staleDir) {\n await rm(staleDir, { recursive: true, force: true });\n }\n await rm(reapDir, { recursive: true, force: true });\n }\n}\n\nasync function reapStalePromotionLockWithGuard(\n lockDir: string,\n setStaleDir: (staleDir: string) => void\n): Promise<boolean> {\n let lockStat: { mtimeMs: number };\n try {\n lockStat = await stat(lockDir);\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) return false;\n throw err;\n }\n\n const owner = await readPromotionLockOwner(lockDir);\n const heartbeatMs = await readPromotionLockHeartbeatMs(lockDir, owner.token);\n const lockedAtMs = heartbeatMs ?? owner.heartbeatAtMs ?? owner.acquiredAtMs ?? lockStat.mtimeMs;\n const ownerlessLock = owner.token === null && owner.heartbeatAtMs === null && owner.acquiredAtMs === null;\n const staleAfterMs = ownerlessLock ? promotionLockOwnerlessGraceMs() : promotionLockStaleMs();\n if (Date.now() - lockedAtMs < staleAfterMs) {\n return false;\n }\n\n const staleDir = `${lockDir}.stale-${process.pid}-${randomUUID()}`;\n try {\n await rename(lockDir, staleDir);\n setStaleDir(staleDir);\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) return false;\n throw err;\n }\n\n const staleOwner = await readPromotionLockOwner(staleDir);\n const staleHeartbeatMs = await readPromotionLockHeartbeatMs(staleDir, staleOwner.token);\n const staleLockedAtMs = staleHeartbeatMs ?? staleOwner.heartbeatAtMs ?? staleOwner.acquiredAtMs ?? lockStat.mtimeMs;\n const staleOwnerlessLock =\n staleOwner.token === null && staleOwner.heartbeatAtMs === null && staleOwner.acquiredAtMs === null;\n const staleAfterRecheckMs = staleOwnerlessLock ? promotionLockOwnerlessGraceMs() : promotionLockStaleMs();\n if (Date.now() - staleLockedAtMs < staleAfterRecheckMs) {\n await rename(staleDir, lockDir);\n setStaleDir(\"\");\n return false;\n }\n\n await rm(staleDir, { recursive: true, force: true });\n setStaleDir(\"\");\n return true;\n}\n\nasync function releasePromotionLock(lockDir: string, token: string): Promise<void> {\n const releaseDir = promotionReleaseDir(lockDir);\n const deadline = Date.now() + promotionLockTimeoutMs();\n await testHooks?.beforeLockRelease?.(lockDir, token);\n for (;;) {\n try {\n await mkdir(releaseDir);\n break;\n } catch (err) {\n if (!isErrnoCode(err, \"EEXIST\")) {\n throw err;\n }\n const owner = await readPromotionLockOwner(lockDir);\n if (owner.token !== token) {\n return;\n }\n await reapAbandonedPromotionGuard(releaseDir);\n if (Date.now() >= deadline) {\n throw new Error(\"Timed out releasing semantic rule promotion lock\");\n }\n await sleep(promotionLockRetryMs());\n }\n }\n\n try {\n const owner = await readPromotionLockOwner(lockDir);\n if (owner.token !== token) {\n return;\n }\n await rm(lockDir, { recursive: true, force: true });\n } finally {\n await rm(releaseDir, { recursive: true, force: true });\n }\n}\n\ntype PromotionLockLease = {\n assertHeld: () => Promise<void>;\n beforePromotedRuleWrite: () => Promise<void>;\n};\n\nasync function withPromotionLock<T>(\n memoryDir: string,\n ruleKey: string,\n fn: (lease: PromotionLockLease) => Promise<T>\n): Promise<T> {\n const lockDir = promotionLockDir(memoryDir, ruleKey);\n const lockRoot = path.dirname(lockDir);\n const deadline = Date.now() + promotionLockTimeoutMs();\n let lockToken: string | null = null;\n let heartbeat: NodeJS.Timeout | null = null;\n\n await mkdir(lockRoot, { recursive: true });\n for (;;) {\n try {\n if (await hasPromotionGuard(lockDir)) {\n await reapAbandonedPromotionGuards(lockDir);\n if (Date.now() >= deadline) {\n throw new Error(\"Timed out acquiring semantic rule promotion lock\");\n }\n await sleep(promotionLockRetryMs());\n continue;\n }\n await mkdir(lockDir);\n if (await hasPromotionGuard(lockDir)) {\n await reapAbandonedPromotionGuards(lockDir);\n if (Date.now() >= deadline) {\n throw new Error(\"Timed out acquiring semantic rule promotion lock\");\n }\n await sleep(promotionLockRetryMs());\n continue;\n }\n try {\n lockToken = randomUUID();\n const lockOwner = {\n token: lockToken,\n acquiredAt: new Date().toISOString(),\n };\n const wroteOwner = await tryWritePromotionLockOwner(lockDir, lockOwner);\n if (!wroteOwner) {\n lockToken = null;\n if (Date.now() >= deadline) {\n throw new Error(\"Timed out acquiring semantic rule promotion lock\");\n }\n await sleep(promotionLockRetryMs());\n continue;\n }\n await writePromotionLockHeartbeat(lockDir, lockToken);\n const heartbeatToken = lockToken;\n const heartbeatMs = promotionLockHeartbeatMs();\n if (heartbeatMs > 0) {\n heartbeat = setInterval(() => {\n void refreshPromotionLockHeartbeat(lockDir, heartbeatToken)\n .then((ownsLock) => {\n if (!ownsLock && heartbeat) {\n clearInterval(heartbeat);\n heartbeat = null;\n }\n })\n .catch(() => undefined);\n }, heartbeatMs);\n }\n } catch (err) {\n lockToken = null;\n if (heartbeat) {\n clearInterval(heartbeat);\n heartbeat = null;\n }\n await rm(lockDir, { recursive: true, force: true });\n throw err;\n }\n break;\n } catch (err) {\n if (!isErrnoCode(err, \"EEXIST\")) {\n throw err;\n }\n if (await reapStalePromotionLock(lockDir)) {\n continue;\n }\n if (Date.now() >= deadline) {\n throw new Error(\"Timed out acquiring semantic rule promotion lock\");\n }\n await sleep(promotionLockRetryMs());\n }\n }\n\n const assertHeld = async () => {\n if (!lockToken) {\n throw new Error(\"Semantic rule promotion lock is no longer held\");\n }\n const ownsLock = await refreshPromotionLockHeartbeat(lockDir, lockToken);\n if (!ownsLock) {\n throw new Error(\"Semantic rule promotion lock is no longer held\");\n }\n };\n\n let hasResult = false;\n let result: T | undefined;\n let callbackError: unknown;\n let releaseError: unknown;\n try {\n await assertHeld();\n result = await fn({\n assertHeld,\n beforePromotedRuleWrite: async () => {\n if (!lockToken) {\n throw new Error(\"Semantic rule promotion lock is no longer held\");\n }\n await testHooks?.beforePromotedRuleWrite?.(lockDir, lockToken);\n await assertHeld();\n },\n });\n hasResult = true;\n } catch (err) {\n callbackError = err;\n } finally {\n if (heartbeat) {\n clearInterval(heartbeat);\n }\n if (lockToken) {\n try {\n await releasePromotionLock(lockDir, lockToken);\n } catch (err) {\n if (!hasResult && !callbackError) {\n releaseError = err;\n }\n }\n }\n }\n if (releaseError) {\n throw releaseError;\n }\n if (callbackError) {\n throw callbackError;\n }\n return result as T;\n}\n\nfunction normalizeRuleWhitespace(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction stripTrailingClausePunctuation(value: string): string {\n // Linear trailing-punctuation strip (no `/[,:;]+$/` — CodeQL flags that as a\n // polynomial-backtracking ReDoS on long runs of ',;:'). Walk back once, O(n).\n let end = value.length;\n while (end > 0) {\n const ch = value[end - 1];\n if (ch === \",\" || ch === \":\" || ch === \";\") end--;\n else break;\n }\n return value.slice(0, end).trim();\n}\n\nfunction canonicalizeRuleContent(value: string): string {\n return extractExplicitIfThenRule(value) ?? normalizeRuleWhitespace(value);\n}\n\nfunction canonicalizeRuleKey(value: string): string {\n return canonicalizeRuleContent(value).toLowerCase();\n}\n\nfunction extractExplicitIfThenRule(content: string): string | null {\n const match = content.match(/\\bif\\b([\\s\\S]+?)\\bthen\\b([\\s\\S]+?)(?:[.!?](?:\\s|$)|$)/i);\n if (!match) return null;\n const condition = stripTrailingClausePunctuation(normalizeRuleWhitespace(match[1] ?? \"\"));\n const outcome = stripTrailingClausePunctuation(normalizeRuleWhitespace(match[2] ?? \"\"));\n if (condition.length === 0 || outcome.length === 0) return null;\n return `IF ${condition} THEN ${outcome}.`;\n}\n\nfunction promotionConfidence(memory: MemoryFile): number {\n const base = Number.isFinite(memory.frontmatter.confidence) ? memory.frontmatter.confidence : 0.8;\n return Math.max(0.6, Math.min(0.98, base));\n}\n\nfunction promotionTags(memory: MemoryFile): string[] {\n return Array.from(new Set([...(memory.frontmatter.tags ?? []), \"semantic-rule\", \"promoted-rule\"]));\n}\n\nfunction buildSupportLinks(sourceMemoryId: string, confidence: number): MemoryLink[] {\n return [\n {\n targetId: sourceMemoryId,\n linkType: \"supports\",\n strength: confidence,\n reason: \"Promoted from verified episodic memory\",\n },\n ];\n}\n\nexport async function promoteSemanticRuleFromMemory(options: {\n memoryDir: string;\n enabled: boolean;\n sourceMemoryId: string;\n dryRun?: boolean;\n}): Promise<SemanticRulePromotionReport> {\n const report: SemanticRulePromotionReport = {\n enabled: options.enabled,\n dryRun: options.dryRun === true,\n promoted: [],\n skipped: [],\n };\n if (!options.enabled) {\n report.skipped.push({\n sourceMemoryId: options.sourceMemoryId,\n reason: \"disabled\",\n });\n return report;\n }\n\n const storage = new StorageManager(options.memoryDir);\n const sourceMemory = await storage.getMemoryById(options.sourceMemoryId);\n if (!sourceMemory) {\n report.skipped.push({\n sourceMemoryId: options.sourceMemoryId,\n reason: \"source-memory-missing\",\n });\n return report;\n }\n if (sourceMemory.frontmatter.status === \"forgotten\") {\n report.skipped.push({\n sourceMemoryId: options.sourceMemoryId,\n reason: \"source-memory-forgotten\",\n });\n return report;\n }\n if (sourceMemory.frontmatter.status === \"archived\" || sourceMemory.frontmatter.memoryKind !== \"episode\") {\n report.skipped.push({\n sourceMemoryId: options.sourceMemoryId,\n reason: \"source-memory-not-episode\",\n });\n return report;\n }\n\n const content = extractExplicitIfThenRule(sourceMemory.content);\n if (!content) {\n report.skipped.push({\n sourceMemoryId: options.sourceMemoryId,\n reason: \"no-explicit-rule\",\n });\n return report;\n }\n\n const ruleKey = canonicalizeRuleKey(content);\n const confidence = promotionConfidence(sourceMemory);\n const candidateBase = {\n sourceMemoryId: options.sourceMemoryId,\n content,\n confidence,\n tags: promotionTags(sourceMemory),\n memoryKind: \"note\" as const,\n lineage: [options.sourceMemoryId],\n };\n\n return withPromotionLock(options.memoryDir, ruleKey, async (lock) => {\n storage.invalidateAllMemoriesCacheForDir();\n const existingRule = (await storage.readAllMemories()).find(\n (memory) =>\n memory.frontmatter.category === \"rule\" &&\n memory.frontmatter.status !== \"archived\" &&\n memory.frontmatter.status !== \"forgotten\" &&\n canonicalizeRuleKey(memory.content) === ruleKey\n );\n if (existingRule) {\n report.skipped.push({\n sourceMemoryId: options.sourceMemoryId,\n reason: \"duplicate-rule\",\n existingRuleId: existingRule.frontmatter.id,\n });\n return report;\n }\n\n if (options.dryRun === true) {\n await lock.assertHeld();\n report.promoted.push({\n id: `dry-run:${options.sourceMemoryId}`,\n ...candidateBase,\n });\n return report;\n }\n\n await lock.beforePromotedRuleWrite();\n // Sealed-envelope write (issue #1989 PR4): rule content and tags are\n // derived from stored/LLM data — salvage; drops are warn-logged.\n const ruleEnvelope = composeMemoryEnvelope(\n { content, category: \"rule\", confidence, tags: candidateBase.tags, origin: sourceMemory.frontmatter.origin },\n { source: \"semantic-rule-promotion\" },\n { salvage: true },\n );\n if (ruleEnvelope.salvageNotes.length > 0) {\n log.warn(`rule-promotion write salvaged invalid fields: ${ruleEnvelope.salvageNotes.join(\"; \")}`);\n }\n const { id: id } = await storage.writeSealedMemory(ruleEnvelope, {\n lineage: candidateBase.lineage,\n sourceMemoryId: options.sourceMemoryId,\n memoryKind: \"note\",\n links: buildSupportLinks(options.sourceMemoryId, confidence),\n });\n report.promoted.push({\n id,\n ...candidateBase,\n });\n return report;\n });\n}\n"],"mappings":"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","names":[]}
@@ -33,7 +33,7 @@ import {
33
33
  } from "./chunk-UHVXE24Y.js";
34
34
  import {
35
35
  composeMemoryEnvelope
36
- } from "./chunk-MRSLR6TB.js";
36
+ } from "./chunk-3QQTXYZ6.js";
37
37
  import {
38
38
  countRecallTokenOverlap,
39
39
  normalizeRecallTokens
@@ -1320,4 +1320,4 @@ export {
1320
1320
  syncWearableSource,
1321
1321
  defaultTimezone
1322
1322
  };
1323
- //# sourceMappingURL=chunk-SIBVIP2Y.js.map
1323
+ //# sourceMappingURL=chunk-PAZY2ZKP.js.map
@@ -3,7 +3,7 @@ import {
3
3
  getOperation,
4
4
  operationRequiresAuthorizedNamespace,
5
5
  operationUsesPrincipalNamespace
6
- } from "./chunk-62WZDHTW.js";
6
+ } from "./chunk-ICKJ52PE.js";
7
7
  import {
8
8
  assertOperationAuthorizationAllowed
9
9
  } from "./chunk-MZWSOLMT.js";
@@ -60,4 +60,4 @@ export {
60
60
  authorizationProbeNamespaces,
61
61
  authorizationProbeRequiresPrincipalNamespace
62
62
  };
63
- //# sourceMappingURL=chunk-LXESHEBP.js.map
63
+ //# sourceMappingURL=chunk-PX4UMA5Z.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  resolveDefaultNamespaceRoot,
3
3
  resolveNamespaceStorageRoot
4
- } from "./chunk-KHMS2FQS.js";
4
+ } from "./chunk-E2P7TZTF.js";
5
5
  import {
6
6
  MutationSerializer,
7
7
  withHeldFileLock
@@ -21,6 +21,9 @@ import {
21
21
  import {
22
22
  ALL_CATEGORY_DIRS
23
23
  } from "./chunk-VS2IYZRU.js";
24
+ import {
25
+ isNotFoundError
26
+ } from "./chunk-KNA3BXXL.js";
24
27
 
25
28
  // src/namespaces/catalog.ts
26
29
  import path from "path";
@@ -73,9 +76,6 @@ function isCatalogEnabled(config) {
73
76
  return config.namespaceCatalogEnabled !== false;
74
77
  }
75
78
  var FILE_MEMORY_DATA_CHILDREN = /* @__PURE__ */ new Set(["profile.md"]);
76
- function isNotFoundError(err) {
77
- return typeof err === "object" && err !== null && "code" in err && err.code === "ENOENT";
78
- }
79
79
  async function inspectMemoryDataMarker(rootDir, child) {
80
80
  const childPath = path.join(rootDir, child);
81
81
  let entry;
@@ -1473,4 +1473,4 @@ export {
1473
1473
  isNamespaceKind,
1474
1474
  NamespaceCatalog
1475
1475
  };
1476
- //# sourceMappingURL=chunk-4KNRKJXQ.js.map
1476
+ //# sourceMappingURL=chunk-QOOBICJF.js.map