@remnic/core 9.48.1 → 9.49.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (616) hide show
  1. package/dist/abstraction-nodes.d.ts +12 -1
  2. package/dist/abstraction-nodes.js +9 -2
  3. package/dist/access-admin-ops-surface.d.ts +11 -10
  4. package/dist/access-admin-ops-surface.js +46 -45
  5. package/dist/access-audit.js +2 -2
  6. package/dist/access-authorization-probe.d.ts +11 -10
  7. package/dist/access-authorization-probe.js +47 -46
  8. package/dist/access-boundary.d.ts +11 -10
  9. package/dist/access-boundary.js +46 -45
  10. package/dist/access-cli.js +127 -121
  11. package/dist/access-cli.js.map +1 -1
  12. package/dist/access-coding-context-resolution.d.ts +1 -1
  13. package/dist/access-extraction-force-flush.d.ts +11 -10
  14. package/dist/access-extraction-force-flush.js +46 -45
  15. package/dist/access-health-types.d.ts +1 -1
  16. package/dist/access-http-lcm-compaction.d.ts +11 -10
  17. package/dist/access-http-lifecycle-flush.d.ts +11 -10
  18. package/dist/access-http-offline-stream.d.ts +11 -10
  19. package/dist/access-http-query.js +46 -45
  20. package/dist/access-http.d.ts +11 -10
  21. package/dist/access-http.js +57 -56
  22. package/dist/access-identity-continuity-surface.d.ts +9 -8
  23. package/dist/access-identity-continuity-surface.js +46 -45
  24. package/dist/access-lcm-surface.d.ts +11 -10
  25. package/dist/access-lcm-surface.js +46 -45
  26. package/dist/access-mcp.d.ts +11 -10
  27. package/dist/access-mcp.js +52 -51
  28. package/dist/access-memory-search-fanout.d.ts +2 -2
  29. package/dist/{access-namespace-preflight--H6HwN85.d.ts → access-namespace-preflight-DuDU301-.d.ts} +1 -1
  30. package/dist/access-namespace-preflight.d.ts +3 -3
  31. package/dist/access-namespace-preflight.js +46 -45
  32. package/dist/access-observe-write-surface.d.ts +11 -10
  33. package/dist/access-observe-write-surface.js +46 -45
  34. package/dist/access-offline-manifest.d.ts +9 -8
  35. package/dist/access-offline-manifest.js +3 -3
  36. package/dist/access-operations-batch.js +48 -47
  37. package/dist/access-operations.d.ts +14 -13
  38. package/dist/access-operations.js +51 -50
  39. package/dist/access-recall-concurrency.d.ts +11 -10
  40. package/dist/access-recall-concurrency.js +46 -45
  41. package/dist/access-recall-response.d.ts +11 -10
  42. package/dist/access-recall-response.js +46 -45
  43. package/dist/access-recall-surface.d.ts +11 -10
  44. package/dist/access-recall-surface.js +46 -45
  45. package/dist/access-schema.d.ts +105 -105
  46. package/dist/access-schema.js +3 -3
  47. package/dist/{access-service-andNjwfD.d.ts → access-service--_3T_v23.d.ts} +7 -7
  48. package/dist/access-service-helpers.d.ts +11 -10
  49. package/dist/access-service.d.ts +11 -10
  50. package/dist/access-service.js +46 -45
  51. package/dist/access-surface-catalog.d.ts +11 -10
  52. package/dist/access-wearables-meetings-surface.d.ts +4 -3
  53. package/dist/action-confidence.d.ts +1 -1
  54. package/dist/active-memory-bridge.d.ts +1 -1
  55. package/dist/active-recall.d.ts +1 -1
  56. package/dist/active-recall.js +3 -2
  57. package/dist/active-recall.js.map +1 -1
  58. package/dist/adapters/index.js +4 -4
  59. package/dist/adapters/registry.js +2 -2
  60. package/dist/ambient-provenance.d.ts +1 -1
  61. package/dist/artifact-search.d.ts +1 -1
  62. package/dist/{auto-sync-7O6RP2RT.js → auto-sync-QFQGOEO2.js} +4 -4
  63. package/dist/behavior-learner.d.ts +1 -1
  64. package/dist/behavior-signals.d.ts +1 -1
  65. package/dist/bootstrap.d.ts +9 -8
  66. package/dist/briefing.d.ts +3 -2
  67. package/dist/briefing.js +15 -14
  68. package/dist/buffer-surprise-report.d.ts +1 -1
  69. package/dist/buffer-turn-helpers.d.ts +1 -1
  70. package/dist/buffer.d.ts +3 -2
  71. package/dist/buffer.js +4 -4
  72. package/dist/bulk-import/index.d.ts +3 -3
  73. package/dist/calibration.d.ts +1 -1
  74. package/dist/calibration.js +1 -1
  75. package/dist/capabilities.d.ts +1 -1
  76. package/dist/{capsule-merge-Q6AR3XL7.js → capsule-merge-KXTRZ23Z.js} +6 -6
  77. package/dist/{catalog-Iwbk9h5E.d.ts → catalog-DjUmUIal.d.ts} +1 -1
  78. package/dist/causal-behavior.d.ts +1 -1
  79. package/dist/causal-behavior.js +3 -3
  80. package/dist/causal-chain.js +3 -3
  81. package/dist/causal-consolidation.d.ts +1 -1
  82. package/dist/causal-consolidation.js +19 -18
  83. package/dist/causal-consolidation.js.map +1 -1
  84. package/dist/causal-retrieval.js +3 -3
  85. package/dist/causal-trajectory-graph.d.ts +1 -1
  86. package/dist/causal-trajectory.d.ts +51 -2
  87. package/dist/causal-trajectory.js +8 -2
  88. package/dist/{chunk-PLCZD3LG.js → chunk-24BKGKGO.js} +91 -45
  89. package/dist/chunk-24BKGKGO.js.map +1 -0
  90. package/dist/{chunk-ICP53SKG.js → chunk-2HIJHXB3.js} +2 -2
  91. package/dist/{chunk-LZGCJSQR.js → chunk-3LD4N2TF.js} +151 -37
  92. package/dist/chunk-3LD4N2TF.js.map +1 -0
  93. package/dist/{chunk-FJ2ND6CZ.js → chunk-47J4EDGR.js} +2 -2
  94. package/dist/{chunk-S55OAS5P.js → chunk-4EABKPZS.js} +4 -4
  95. package/dist/{chunk-GD7UPIBG.js → chunk-4JWJMRPJ.js} +2 -2
  96. package/dist/{chunk-3NDN5P55.js → chunk-4S3ECH3U.js} +2 -2
  97. package/dist/chunk-5GINB5LC.js +13 -0
  98. package/dist/chunk-5GINB5LC.js.map +1 -0
  99. package/dist/{chunk-CGASUJVP.js → chunk-5V6IXHPI.js} +4 -4
  100. package/dist/{chunk-A4JMGKCD.js → chunk-5XCN4XBU.js} +4 -4
  101. package/dist/{chunk-2RPJ4NEE.js → chunk-64BHFFKZ.js} +2 -2
  102. package/dist/{chunk-FQC3DHH2.js → chunk-66SE3BNH.js} +2 -2
  103. package/dist/{chunk-TERNBNJB.js → chunk-6FC3IZ26.js} +2 -2
  104. package/dist/{chunk-53AJILXF.js → chunk-6XGEBQ3R.js} +4 -4
  105. package/dist/{chunk-IP3DHDU2.js → chunk-7BLWBSRL.js} +3 -3
  106. package/dist/{chunk-A2TFK5PG.js → chunk-7NDM2PNK.js} +3 -3
  107. package/dist/{chunk-HRMEYQRO.js → chunk-7VWZ4LRW.js} +2 -2
  108. package/dist/{chunk-RN53QBM4.js → chunk-A4QMKFFO.js} +5 -1
  109. package/dist/chunk-A4QMKFFO.js.map +1 -0
  110. package/dist/chunk-ACPCA4NO.js +321 -0
  111. package/dist/chunk-ACPCA4NO.js.map +1 -0
  112. package/dist/chunk-AMTEYNYK.js +72 -0
  113. package/dist/chunk-AMTEYNYK.js.map +1 -0
  114. package/dist/{chunk-R6YJI3HE.js → chunk-AW4QUFQF.js} +1 -1
  115. package/dist/{chunk-P65YJEEL.js → chunk-AXFWMRKI.js} +2 -2
  116. package/dist/{chunk-WG5HSQ4P.js → chunk-BAKXNQ3C.js} +2 -2
  117. package/dist/{chunk-NM2WP3B7.js → chunk-BJYET5TX.js} +2 -2
  118. package/dist/{chunk-HLKPRWF4.js → chunk-DATDLJAO.js} +6 -6
  119. package/dist/chunk-DJUKBGAD.js +260 -0
  120. package/dist/chunk-DJUKBGAD.js.map +1 -0
  121. package/dist/{chunk-DX3XRGLH.js → chunk-DQTCGVFK.js} +2 -2
  122. package/dist/{chunk-HIDEBEAN.js → chunk-E633OXMH.js} +11 -11
  123. package/dist/{chunk-J7T4MX7P.js → chunk-EEAMSNSG.js} +12 -1
  124. package/dist/chunk-EEAMSNSG.js.map +1 -0
  125. package/dist/{chunk-EZNXW27Q.js → chunk-ELQCS47S.js} +4 -4
  126. package/dist/{chunk-HAYSYUAB.js → chunk-EURCX6PS.js} +2 -2
  127. package/dist/{chunk-RSPSHRZA.js → chunk-FV7YQTN3.js} +2 -2
  128. package/dist/chunk-G73MCJKL.js +20 -0
  129. package/dist/chunk-G73MCJKL.js.map +1 -0
  130. package/dist/{chunk-GWHPQOUC.js → chunk-GGBSF2X7.js} +2 -2
  131. package/dist/{chunk-SYUBB3WM.js → chunk-GKEYXXKX.js} +2 -2
  132. package/dist/{chunk-PELT6ADC.js → chunk-GSEPRIZC.js} +3 -3
  133. package/dist/{chunk-UTVZKHJK.js → chunk-GUKBW4HL.js} +2 -2
  134. package/dist/chunk-GXSOUIA4.js +293 -0
  135. package/dist/chunk-GXSOUIA4.js.map +1 -0
  136. package/dist/{chunk-2F6NP3NT.js → chunk-HDQUQBPW.js} +2 -2
  137. package/dist/{chunk-6HMYUWXR.js → chunk-HTP6XRUI.js} +2 -2
  138. package/dist/{chunk-UYUYZ4WY.js → chunk-IARXXZU4.js} +2 -2
  139. package/dist/{chunk-MNB5RMAY.js → chunk-IIFFC3RL.js} +2 -2
  140. package/dist/{chunk-KQAFEZQX.js → chunk-IPLYGWQF.js} +5 -5
  141. package/dist/{chunk-NZBZ7IS2.js → chunk-JDCQK3C5.js} +2 -2
  142. package/dist/{chunk-ANCC3JJH.js → chunk-JI62YGPI.js} +2 -2
  143. package/dist/{chunk-LULR4IUW.js → chunk-KATEWTQJ.js} +2 -2
  144. package/dist/{chunk-IJ7HK452.js → chunk-KMAP7SNQ.js} +2 -2
  145. package/dist/{chunk-PRVJH7CY.js → chunk-KMWYZTIE.js} +2 -2
  146. package/dist/{chunk-JGSKJHF7.js → chunk-KQS72GCR.js} +2 -2
  147. package/dist/{chunk-3S63QIFQ.js → chunk-LAQ33B5D.js} +1 -1
  148. package/dist/chunk-LAQ33B5D.js.map +1 -0
  149. package/dist/chunk-LNTUXKBT.js +224 -0
  150. package/dist/chunk-LNTUXKBT.js.map +1 -0
  151. package/dist/{chunk-FMCHFSZF.js → chunk-LQKXVQZR.js} +12 -12
  152. package/dist/{chunk-M4DMO67I.js → chunk-LTOAJXZB.js} +4 -4
  153. package/dist/{chunk-NIS256NW.js → chunk-LYMNZZIM.js} +2 -2
  154. package/dist/{chunk-W4FBGYGK.js → chunk-M4MP34AQ.js} +189 -5
  155. package/dist/chunk-M4MP34AQ.js.map +1 -0
  156. package/dist/{chunk-3PY7VHV7.js → chunk-MCA2X4WH.js} +2 -2
  157. package/dist/{chunk-S5NZBKKQ.js → chunk-N3CXAYPJ.js} +3 -3
  158. package/dist/{chunk-WQIHRA5F.js → chunk-N3LL5NEU.js} +2 -2
  159. package/dist/{chunk-G2RBWVFQ.js → chunk-NKL25FCF.js} +2 -2
  160. package/dist/{chunk-LMDRGRJ2.js → chunk-NOB2T2FC.js} +2 -2
  161. package/dist/{chunk-P2OTGMTR.js → chunk-NSGU76YO.js} +2 -2
  162. package/dist/{chunk-D5NGH2EW.js → chunk-O76MWTVS.js} +2 -2
  163. package/dist/{chunk-WZFAPHIK.js → chunk-OIOZ6MOP.js} +3 -3
  164. package/dist/{chunk-DNHVPZOD.js → chunk-P26YHAQH.js} +201 -1
  165. package/dist/chunk-P26YHAQH.js.map +1 -0
  166. package/dist/{chunk-UMOO7IY7.js → chunk-P2KBDJJ6.js} +2 -2
  167. package/dist/{chunk-KVJRXN2E.js → chunk-P4QOYG52.js} +125 -13
  168. package/dist/chunk-P4QOYG52.js.map +1 -0
  169. package/dist/chunk-P77QX3ID.js +332 -0
  170. package/dist/chunk-P77QX3ID.js.map +1 -0
  171. package/dist/{chunk-SXWHN7GC.js → chunk-PDEKQWDV.js} +2 -2
  172. package/dist/{chunk-2EJNXE53.js → chunk-PLCHU56K.js} +3 -3
  173. package/dist/{chunk-45OTV7FZ.js → chunk-PWIMF7LP.js} +38 -38
  174. package/dist/{chunk-7YKVM5H3.js → chunk-PWLB4TRK.js} +3 -3
  175. package/dist/{chunk-RVYVMQK4.js → chunk-QSYL5CXK.js} +3 -3
  176. package/dist/{chunk-NXUJRXSF.js → chunk-QWLW3VQH.js} +2 -2
  177. package/dist/chunk-RBOJCG4T.js +77 -0
  178. package/dist/chunk-RBOJCG4T.js.map +1 -0
  179. package/dist/{chunk-2P3GQVM2.js → chunk-RBPH3GZV.js} +418 -105
  180. package/dist/chunk-RBPH3GZV.js.map +1 -0
  181. package/dist/{chunk-JBPKEARU.js → chunk-RKNJBZ55.js} +4 -4
  182. package/dist/{chunk-QCECHYZL.js → chunk-RVO6TCTU.js} +6 -6
  183. package/dist/{chunk-5L7PTX2Q.js → chunk-S2SJEOTM.js} +2 -2
  184. package/dist/{chunk-52I3YZZ6.js → chunk-S75UQ3T3.js} +3 -3
  185. package/dist/{chunk-LXOM6IQU.js → chunk-SEF4IOFE.js} +2 -2
  186. package/dist/{chunk-DUEEQCTT.js → chunk-SHYIMIX5.js} +2 -2
  187. package/dist/{chunk-KSGEGHYA.js → chunk-T35UJI5R.js} +78 -74
  188. package/dist/chunk-T35UJI5R.js.map +1 -0
  189. package/dist/{chunk-7K5Q6COX.js → chunk-TVVEYCNW.js} +4 -4
  190. package/dist/{chunk-3JUYWPFJ.js → chunk-VFS3MK5F.js} +2 -2
  191. package/dist/chunk-VUDMT5CP.js +86 -0
  192. package/dist/chunk-VUDMT5CP.js.map +1 -0
  193. package/dist/{chunk-CMQZNEIF.js → chunk-WFLBP5GC.js} +8 -1
  194. package/dist/chunk-WFLBP5GC.js.map +1 -0
  195. package/dist/{chunk-WOEVJKKQ.js → chunk-WPZX7MEA.js} +4 -4
  196. package/dist/{chunk-ZRWB5D4H.js → chunk-WT6UL3UA.js} +2 -2
  197. package/dist/{chunk-MC6XO7T4.js → chunk-YLBE6PLR.js} +2 -2
  198. package/dist/{chunk-GF22HWS2.js → chunk-Z54EM5YZ.js} +4 -4
  199. package/dist/{chunk-GVX3NAUU.js → chunk-ZDAYWJV6.js} +2 -2
  200. package/dist/{chunk-4WBGZYZZ.js → chunk-ZJIFYUJI.js} +7 -7
  201. package/dist/chunk-ZJIFYUJI.js.map +1 -0
  202. package/dist/{chunk-JYPO7L3G.js → chunk-ZN4EYMKJ.js} +2 -2
  203. package/dist/{cli-p_WmVo2h.d.ts → cli-BLNmNEMT.d.ts} +16 -14
  204. package/dist/cli.d.ts +14 -13
  205. package/dist/cli.js +90 -87
  206. package/dist/coding/pre-action-gate.d.ts +66 -0
  207. package/dist/coding/pre-action-gate.js +22 -0
  208. package/dist/commitment-ledger.js +2 -2
  209. package/dist/compounding/engine.d.ts +3 -2
  210. package/dist/compounding/engine.js +16 -15
  211. package/dist/compounding/preference-consolidator.d.ts +1 -1
  212. package/dist/compression-optimizer.d.ts +1 -1
  213. package/dist/config.d.ts +1 -1
  214. package/dist/config.js +3 -2
  215. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  216. package/dist/connectors/codex-materialize-runner.js +15 -14
  217. package/dist/connectors/codex-materialize.d.ts +1 -1
  218. package/dist/connectors/index.d.ts +1 -1
  219. package/dist/connectors/index.js +15 -14
  220. package/dist/consolidation-provenance-check.d.ts +3 -2
  221. package/dist/consolidation-provenance-check.js +6 -6
  222. package/dist/consolidation-undo.d.ts +3 -2
  223. package/dist/consolidation-undo.js +5 -5
  224. package/dist/contradiction/index.d.ts +3 -2
  225. package/dist/contradiction/index.js +3 -3
  226. package/dist/converge-config.d.ts +1 -1
  227. package/dist/convergence-refresh.d.ts +3 -2
  228. package/dist/convergence-refresh.js +18 -17
  229. package/dist/conversation-index/backend.d.ts +1 -1
  230. package/dist/conversation-index/chunker.d.ts +1 -1
  231. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  232. package/dist/conversation-index/indexer.d.ts +1 -1
  233. package/dist/conversation-index/search.d.ts +1 -1
  234. package/dist/corpus-read-cancellation.d.ts +38 -0
  235. package/dist/corpus-read-cancellation.js +9 -0
  236. package/dist/corpus-read-cancellation.js.map +1 -0
  237. package/dist/corpus-watermark.d.ts +1 -1
  238. package/dist/corpus-watermark.js +21 -20
  239. package/dist/cue-anchors.d.ts +19 -1
  240. package/dist/cue-anchors.js +10 -2
  241. package/dist/day-summary.d.ts +1 -1
  242. package/dist/delinearize.d.ts +1 -1
  243. package/dist/dependency-propagation-config.d.ts +10 -0
  244. package/dist/dependency-propagation-config.js +10 -0
  245. package/dist/dependency-propagation-config.js.map +1 -0
  246. package/dist/deterministic-order.d.ts +4 -0
  247. package/dist/deterministic-order.js +10 -0
  248. package/dist/deterministic-order.js.map +1 -0
  249. package/dist/direct-answer-wiring.d.ts +1 -1
  250. package/dist/direct-answer.d.ts +1 -1
  251. package/dist/embedding-fallback.d.ts +1 -1
  252. package/dist/enrichment/index.d.ts +1 -1
  253. package/dist/entity-retrieval.d.ts +3 -2
  254. package/dist/entity-retrieval.js +15 -14
  255. package/dist/entity-schema.d.ts +1 -1
  256. package/dist/evals.js +2 -2
  257. package/dist/explicit-capture.d.ts +9 -8
  258. package/dist/explicit-capture.js +6 -6
  259. package/dist/external-wiki-access.d.ts +11 -10
  260. package/dist/external-wiki-access.js +47 -46
  261. package/dist/external-wiki-collection-registration.d.ts +1 -1
  262. package/dist/external-wiki-collection.d.ts +1 -1
  263. package/dist/external-wiki-mcp-tools.d.ts +11 -10
  264. package/dist/extraction-error-classification.d.ts +1 -1
  265. package/dist/extraction-faithfulness.d.ts +1 -1
  266. package/dist/extraction-judge-telemetry.d.ts +1 -1
  267. package/dist/extraction-judge-training.d.ts +1 -1
  268. package/dist/extraction-judge.d.ts +1 -1
  269. package/dist/extraction-liveness.d.ts +1 -1
  270. package/dist/extraction-normalization.d.ts +14 -0
  271. package/dist/extraction-normalization.js +22 -0
  272. package/dist/extraction-normalization.js.map +1 -0
  273. package/dist/extraction-prompt.d.ts +4 -3
  274. package/dist/extraction-prompt.js +3 -1
  275. package/dist/extraction-source-grounding-rules.d.ts +1 -1
  276. package/dist/extraction-source-grounding.d.ts +1 -1
  277. package/dist/extraction.d.ts +18 -1
  278. package/dist/extraction.js +24 -21
  279. package/dist/fallback-llm.d.ts +1 -1
  280. package/dist/{first-start-migration-ZSHEFEI3.js → first-start-migration-626C5554.js} +5 -5
  281. package/dist/{forget-DNAJ66ZD.js → forget-GJ42LCBW.js} +2 -2
  282. package/dist/graph-dashboard-diff.d.ts +1 -1
  283. package/dist/graph-dashboard-key.d.ts +1 -1
  284. package/dist/graph-dashboard-parser.d.ts +1 -1
  285. package/dist/graph-edge-reinforcement.d.ts +1 -1
  286. package/dist/graph-snapshot.d.ts +1 -1
  287. package/dist/graph.d.ts +1 -1
  288. package/dist/harmonic-construction.d.ts +43 -0
  289. package/dist/harmonic-construction.js +26 -0
  290. package/dist/harmonic-construction.js.map +1 -0
  291. package/dist/harmonic-retrieval.d.ts +1 -0
  292. package/dist/harmonic-retrieval.js +10 -4
  293. package/dist/importance.d.ts +1 -1
  294. package/dist/importers/index.d.ts +1 -1
  295. package/dist/in-flight-reads.d.ts +47 -3
  296. package/dist/in-flight-reads.js +5 -3
  297. package/dist/index.d.ts +699 -696
  298. package/dist/index.js +197 -150
  299. package/dist/intent.d.ts +1 -1
  300. package/dist/json-store.d.ts +15 -1
  301. package/dist/json-store.js +11 -3
  302. package/dist/lcm/engine.d.ts +1 -1
  303. package/dist/lcm/engine.js +2 -2
  304. package/dist/lcm/index.d.ts +1 -1
  305. package/dist/lcm/index.js +7 -7
  306. package/dist/lcm/tools.d.ts +1 -1
  307. package/dist/lifecycle.d.ts +1 -1
  308. package/dist/live-connectors-runner.d.ts +1 -1
  309. package/dist/local-llm.d.ts +1 -1
  310. package/dist/local-model-endpoint.d.ts +1 -1
  311. package/dist/maintenance/archive-observations.js +2 -2
  312. package/dist/maintenance/atomic-file.d.ts +5 -0
  313. package/dist/maintenance/atomic-file.js +12 -0
  314. package/dist/maintenance/atomic-file.js.map +1 -0
  315. package/dist/maintenance/memory-governance.d.ts +1 -1
  316. package/dist/maintenance/memory-governance.js +15 -14
  317. package/dist/maintenance/migrate-observations.js +3 -3
  318. package/dist/maintenance/observation-ledger-utils.d.ts +1 -1
  319. package/dist/maintenance/observation-ledger-utils.js +2 -2
  320. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +3 -2
  321. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +16 -15
  322. package/dist/maintenance/rebuild-memory-projection.d.ts +3 -2
  323. package/dist/maintenance/rebuild-memory-projection.js +17 -16
  324. package/dist/maintenance/rebuild-observations.js +3 -3
  325. package/dist/{maintenance-BfcuwfJS.d.ts → maintenance-DKbKZi3u.d.ts} +3 -3
  326. package/dist/mcp-memory-inspector-app.d.ts +11 -10
  327. package/dist/memory-action-policy.d.ts +1 -1
  328. package/dist/memory-cache.d.ts +1 -1
  329. package/dist/memory-corpus-version.js +2 -2
  330. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  331. package/dist/memory-projection-store.d.ts +1 -1
  332. package/dist/memory-provenance.d.ts +1 -1
  333. package/dist/memory-snapshot.d.ts +1 -1
  334. package/dist/memory-worth-outcomes.d.ts +3 -2
  335. package/dist/models-json.d.ts +1 -1
  336. package/dist/namespaces/migrate.d.ts +4 -3
  337. package/dist/namespaces/migrate.js +20 -19
  338. package/dist/namespaces/principal.d.ts +1 -1
  339. package/dist/namespaces/search.d.ts +1 -1
  340. package/dist/namespaces/search.js +4 -4
  341. package/dist/namespaces/storage.d.ts +4 -3
  342. package/dist/namespaces/storage.js +15 -14
  343. package/dist/native-knowledge.d.ts +1 -1
  344. package/dist/objective-state-writers.js +3 -3
  345. package/dist/objective-state.js +2 -2
  346. package/dist/offline-sync-impression-drain.d.ts +1 -1
  347. package/dist/offline-sync-impression-drain.js +2 -2
  348. package/dist/operator-doctor-corpus.d.ts +1 -1
  349. package/dist/operator-doctor-corpus.js +22 -21
  350. package/dist/operator-doctor-replica.d.ts +1 -1
  351. package/dist/operator-toolkit.d.ts +4 -3
  352. package/dist/operator-toolkit.js +31 -29
  353. package/dist/orchestration/compression-guideline-coordinator.d.ts +3 -2
  354. package/dist/orchestration/maintenance.d.ts +5 -4
  355. package/dist/orchestration/maintenance.js +21 -20
  356. package/dist/{orchestrator-B7nLo4z1.d.ts → orchestrator-BRwD7ceU.d.ts} +7 -7
  357. package/dist/orchestrator.d.ts +9 -8
  358. package/dist/orchestrator.js +127 -121
  359. package/dist/page-versioning.js +5 -5
  360. package/dist/patterns-cli.d.ts +1 -1
  361. package/dist/{pipeline-1h2GpiHP.d.ts → pipeline-DC-1C9T8.d.ts} +1 -1
  362. package/dist/policy-runtime.d.ts +1 -1
  363. package/dist/proactive-contention.d.ts +1 -1
  364. package/dist/provenance.d.ts +1 -1
  365. package/dist/{qmd-UdwoF71D.d.ts → qmd-DdeCEZdb.d.ts} +1 -1
  366. package/dist/qmd-preflight.d.ts +2 -2
  367. package/dist/qmd-recall-cache.d.ts +1 -1
  368. package/dist/qmd.d.ts +2 -2
  369. package/dist/qmd.js +4 -4
  370. package/dist/recall-concurrency-config.d.ts +1 -1
  371. package/dist/recall-disclosure-escalation.d.ts +1 -1
  372. package/dist/recall-explain-renderer.d.ts +1 -1
  373. package/dist/recall-explain-renderer.js +3 -3
  374. package/dist/recall-memory-map.d.ts +1 -1
  375. package/dist/recall-planner-llm.d.ts +1 -1
  376. package/dist/recall-state.d.ts +1 -1
  377. package/dist/recall-state.js +2 -2
  378. package/dist/recall-tag-filter.d.ts +1 -1
  379. package/dist/recall-timings.d.ts +1 -1
  380. package/dist/recall-xray-cli.d.ts +1 -1
  381. package/dist/recall-xray-cli.js +4 -4
  382. package/dist/recall-xray-renderer.d.ts +1 -1
  383. package/dist/recall-xray-renderer.js +3 -3
  384. package/dist/recall-xray.d.ts +1 -1
  385. package/dist/recall-xray.js +2 -2
  386. package/dist/reconcile/cursor.d.ts +1 -1
  387. package/dist/reconcile/manifest.d.ts +1 -1
  388. package/dist/reconcile/plan.d.ts +1 -1
  389. package/dist/relevance.js +2 -2
  390. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  391. package/dist/replay/normalizers/claude.d.ts +1 -1
  392. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  393. package/dist/replay/normalizers/shared.d.ts +1 -1
  394. package/dist/replay/runner.d.ts +1 -1
  395. package/dist/replay/types.d.ts +1 -1
  396. package/dist/replica-divergence.d.ts +1 -1
  397. package/dist/replica-peers-config.d.ts +1 -1
  398. package/dist/{resolution-3K27T4VO.js → resolution-MDPNOEG6.js} +4 -4
  399. package/dist/resolution-MDPNOEG6.js.map +1 -0
  400. package/dist/resolve-auth-token.d.ts +1 -1
  401. package/dist/resume-bundles.js +8 -7
  402. package/dist/retrieval-agents.d.ts +2 -2
  403. package/dist/retrieval-tiers.d.ts +1 -1
  404. package/dist/routing/engine.d.ts +1 -1
  405. package/dist/routing/store.d.ts +1 -1
  406. package/dist/salvage-envelope.d.ts +1 -1
  407. package/dist/salvage-envelope.js +3 -3
  408. package/dist/schemas.d.ts +213 -116
  409. package/dist/schemas.js +1 -1
  410. package/dist/{scope-profiles-APjhSe-w.d.ts → scope-profiles-BXVq4Jv0.d.ts} +1 -1
  411. package/dist/search/embed-helper.d.ts +1 -1
  412. package/dist/search/factory.d.ts +1 -1
  413. package/dist/search/factory.js +3 -3
  414. package/dist/search/index.d.ts +1 -1
  415. package/dist/search/index.js +3 -3
  416. package/dist/search/lancedb-backend.d.ts +1 -1
  417. package/dist/search/meilisearch-backend.d.ts +1 -1
  418. package/dist/search/noop-backend.d.ts +1 -1
  419. package/dist/search/orama-backend.d.ts +1 -1
  420. package/dist/search/port.d.ts +1 -1
  421. package/dist/search/remote-backend.d.ts +1 -1
  422. package/dist/{semantic-consolidation-CrySDbk3.d.ts → semantic-consolidation-CGYxfa8F.d.ts} +1 -1
  423. package/dist/semantic-consolidation.d.ts +2 -2
  424. package/dist/semantic-consolidation.js +16 -15
  425. package/dist/semantic-rule-promotion.js +15 -14
  426. package/dist/semantic-rule-verifier.d.ts +1 -1
  427. package/dist/semantic-rule-verifier.js +15 -14
  428. package/dist/{service-B5W5IYCx.d.ts → service-CBDBQFCN.d.ts} +2 -2
  429. package/dist/session-observer-bands.d.ts +1 -1
  430. package/dist/session-observer-state.d.ts +1 -1
  431. package/dist/shared-context/manager.d.ts +11 -11
  432. package/dist/signal.d.ts +1 -1
  433. package/dist/source-agent-qualifier.d.ts +1 -1
  434. package/dist/source-agent-qualifier.js +19 -18
  435. package/dist/{storage-COL907QF.d.ts → storage-V--MQi7w.d.ts} +5 -4
  436. package/dist/storage.d.ts +3 -2
  437. package/dist/storage.js +14 -13
  438. package/dist/summarizer.d.ts +1 -1
  439. package/dist/summary-snapshot.d.ts +1 -1
  440. package/dist/temporal-supersession.d.ts +14 -2
  441. package/dist/temporal-supersession.js +1 -1
  442. package/dist/temporal-timeline-recall.d.ts +1 -1
  443. package/dist/temporal-validity.d.ts +1 -1
  444. package/dist/threading.d.ts +1 -1
  445. package/dist/tier-migration.d.ts +3 -2
  446. package/dist/tier-routing.d.ts +1 -1
  447. package/dist/{tier-stats-OPTSBNRH.js → tier-stats-2JCZYEF7.js} +5 -5
  448. package/dist/topics.d.ts +1 -1
  449. package/dist/transcript.d.ts +1 -1
  450. package/dist/transfer/autodetect.js +1 -1
  451. package/dist/transfer/backup.js +1 -1
  452. package/dist/transfer/capsule-export.js +2 -2
  453. package/dist/transfer/capsule-import.js +6 -6
  454. package/dist/transfer/types.d.ts +66 -66
  455. package/dist/trust-score-stage.d.ts +1 -1
  456. package/dist/trust-score.d.ts +1 -1
  457. package/dist/trust-zones.js +2 -2
  458. package/dist/{types-D_Au9qJO.d.ts → types-D_a6Sqjz.d.ts} +25 -8
  459. package/dist/types.d.ts +1 -1
  460. package/dist/types.js +1 -1
  461. package/dist/utility-learner.js +3 -3
  462. package/dist/utility-runtime.d.ts +1 -1
  463. package/dist/utility-runtime.js +4 -4
  464. package/dist/utility-telemetry.js +2 -2
  465. package/dist/verified-recall.js +15 -14
  466. package/dist/work-product-ledger.js +2 -2
  467. package/dist/write-envelope.d.ts +1 -1
  468. package/dist/write-envelope.js +2 -2
  469. package/package.json +32 -2
  470. package/src/abstraction-nodes.ts +182 -4
  471. package/src/causal-trajectory.ts +258 -3
  472. package/src/cli/harmonic-search.ts +23 -0
  473. package/src/cli/research-status-commands.ts +2 -1
  474. package/src/cli.ts +1 -24
  475. package/src/coding/pre-action-gate.test.ts +516 -0
  476. package/src/coding/pre-action-gate.ts +320 -0
  477. package/src/config.test.ts +85 -0
  478. package/src/config.ts +2 -0
  479. package/src/corpus-read-cancellation.ts +42 -0
  480. package/src/cue-anchors.test.ts +90 -0
  481. package/src/cue-anchors.ts +264 -11
  482. package/src/dependency-frontmatter.test.ts +83 -0
  483. package/src/dependency-propagation-config.ts +94 -0
  484. package/src/deterministic-order.ts +14 -0
  485. package/src/entity-retrieval.ts +4 -4
  486. package/src/extraction-normalization.ts +71 -0
  487. package/src/extraction-prompt.ts +45 -11
  488. package/src/extraction.ts +48 -32
  489. package/src/faithfulness-graph-guard.test.ts +27 -0
  490. package/src/harmonic-construction.test.ts +1799 -0
  491. package/src/harmonic-construction.ts +367 -0
  492. package/src/harmonic-retrieval.ts +166 -25
  493. package/src/in-flight-reads.ts +119 -6
  494. package/src/index.ts +4 -5
  495. package/src/json-store.ts +354 -12
  496. package/src/orchestration/consolidation-run.ts +192 -0
  497. package/src/orchestration/contradiction-linking-coordinator.ts +35 -1
  498. package/src/orchestration/dependency-propagation-triggers.test.ts +286 -0
  499. package/src/orchestration/dependency-propagation.test.ts +487 -0
  500. package/src/orchestration/dependency-propagation.ts +263 -0
  501. package/src/orchestration/dependency-revalidation.ts +173 -0
  502. package/src/orchestration/extraction-persist-deps.ts +93 -0
  503. package/src/orchestration/extraction-persist.ts +101 -94
  504. package/src/orchestration/harmonic-construction-persist.ts +86 -0
  505. package/src/orchestration/namespace-read-fanout.ts +13 -2
  506. package/src/orchestration/recall-internal-deps.ts +2 -0
  507. package/src/orchestration/recall-internal.ts +5 -1
  508. package/src/orchestration/recall-search-pipeline.ts +2 -0
  509. package/src/orchestration/recall-search-prefilter.ts +5 -1
  510. package/src/orchestrator.ts +7 -6
  511. package/src/schemas.ts +15 -0
  512. package/src/storage/entity-store.ts +9 -2
  513. package/src/storage/memory-read-store.ts +33 -4
  514. package/src/storage-contract/corpus-read-cancellation.test.ts +408 -0
  515. package/src/storage.ts +75 -19
  516. package/src/temporal-supersession.ts +29 -1
  517. package/src/testing/orchestrator-lite.ts +27 -8
  518. package/src/testing/subjects/extraction-lifecycle.test.ts +91 -50
  519. package/src/types.ts +22 -7
  520. package/dist/chunk-2P3GQVM2.js.map +0 -1
  521. package/dist/chunk-3S63QIFQ.js.map +0 -1
  522. package/dist/chunk-4WBGZYZZ.js.map +0 -1
  523. package/dist/chunk-CMQZNEIF.js.map +0 -1
  524. package/dist/chunk-DNHVPZOD.js.map +0 -1
  525. package/dist/chunk-FZZ2QTJI.js +0 -111
  526. package/dist/chunk-FZZ2QTJI.js.map +0 -1
  527. package/dist/chunk-J7T4MX7P.js.map +0 -1
  528. package/dist/chunk-KSGEGHYA.js.map +0 -1
  529. package/dist/chunk-KVJRXN2E.js.map +0 -1
  530. package/dist/chunk-LPSF4OQH.js +0 -47
  531. package/dist/chunk-LPSF4OQH.js.map +0 -1
  532. package/dist/chunk-LZGCJSQR.js.map +0 -1
  533. package/dist/chunk-OADWQ5CR.js +0 -115
  534. package/dist/chunk-OADWQ5CR.js.map +0 -1
  535. package/dist/chunk-PDJTHRAW.js +0 -36
  536. package/dist/chunk-PDJTHRAW.js.map +0 -1
  537. package/dist/chunk-PLCZD3LG.js.map +0 -1
  538. package/dist/chunk-RN53QBM4.js.map +0 -1
  539. package/dist/chunk-W4FBGYGK.js.map +0 -1
  540. /package/dist/{auto-sync-7O6RP2RT.js.map → auto-sync-QFQGOEO2.js.map} +0 -0
  541. /package/dist/{capsule-merge-Q6AR3XL7.js.map → capsule-merge-KXTRZ23Z.js.map} +0 -0
  542. /package/dist/{chunk-ICP53SKG.js.map → chunk-2HIJHXB3.js.map} +0 -0
  543. /package/dist/{chunk-FJ2ND6CZ.js.map → chunk-47J4EDGR.js.map} +0 -0
  544. /package/dist/{chunk-S55OAS5P.js.map → chunk-4EABKPZS.js.map} +0 -0
  545. /package/dist/{chunk-GD7UPIBG.js.map → chunk-4JWJMRPJ.js.map} +0 -0
  546. /package/dist/{chunk-3NDN5P55.js.map → chunk-4S3ECH3U.js.map} +0 -0
  547. /package/dist/{chunk-CGASUJVP.js.map → chunk-5V6IXHPI.js.map} +0 -0
  548. /package/dist/{chunk-A4JMGKCD.js.map → chunk-5XCN4XBU.js.map} +0 -0
  549. /package/dist/{chunk-2RPJ4NEE.js.map → chunk-64BHFFKZ.js.map} +0 -0
  550. /package/dist/{chunk-FQC3DHH2.js.map → chunk-66SE3BNH.js.map} +0 -0
  551. /package/dist/{chunk-TERNBNJB.js.map → chunk-6FC3IZ26.js.map} +0 -0
  552. /package/dist/{chunk-53AJILXF.js.map → chunk-6XGEBQ3R.js.map} +0 -0
  553. /package/dist/{chunk-IP3DHDU2.js.map → chunk-7BLWBSRL.js.map} +0 -0
  554. /package/dist/{chunk-A2TFK5PG.js.map → chunk-7NDM2PNK.js.map} +0 -0
  555. /package/dist/{chunk-HRMEYQRO.js.map → chunk-7VWZ4LRW.js.map} +0 -0
  556. /package/dist/{chunk-R6YJI3HE.js.map → chunk-AW4QUFQF.js.map} +0 -0
  557. /package/dist/{chunk-P65YJEEL.js.map → chunk-AXFWMRKI.js.map} +0 -0
  558. /package/dist/{chunk-WG5HSQ4P.js.map → chunk-BAKXNQ3C.js.map} +0 -0
  559. /package/dist/{chunk-NM2WP3B7.js.map → chunk-BJYET5TX.js.map} +0 -0
  560. /package/dist/{chunk-HLKPRWF4.js.map → chunk-DATDLJAO.js.map} +0 -0
  561. /package/dist/{chunk-DX3XRGLH.js.map → chunk-DQTCGVFK.js.map} +0 -0
  562. /package/dist/{chunk-HIDEBEAN.js.map → chunk-E633OXMH.js.map} +0 -0
  563. /package/dist/{chunk-EZNXW27Q.js.map → chunk-ELQCS47S.js.map} +0 -0
  564. /package/dist/{chunk-HAYSYUAB.js.map → chunk-EURCX6PS.js.map} +0 -0
  565. /package/dist/{chunk-RSPSHRZA.js.map → chunk-FV7YQTN3.js.map} +0 -0
  566. /package/dist/{chunk-GWHPQOUC.js.map → chunk-GGBSF2X7.js.map} +0 -0
  567. /package/dist/{chunk-SYUBB3WM.js.map → chunk-GKEYXXKX.js.map} +0 -0
  568. /package/dist/{chunk-PELT6ADC.js.map → chunk-GSEPRIZC.js.map} +0 -0
  569. /package/dist/{chunk-UTVZKHJK.js.map → chunk-GUKBW4HL.js.map} +0 -0
  570. /package/dist/{chunk-2F6NP3NT.js.map → chunk-HDQUQBPW.js.map} +0 -0
  571. /package/dist/{chunk-6HMYUWXR.js.map → chunk-HTP6XRUI.js.map} +0 -0
  572. /package/dist/{chunk-UYUYZ4WY.js.map → chunk-IARXXZU4.js.map} +0 -0
  573. /package/dist/{chunk-MNB5RMAY.js.map → chunk-IIFFC3RL.js.map} +0 -0
  574. /package/dist/{chunk-KQAFEZQX.js.map → chunk-IPLYGWQF.js.map} +0 -0
  575. /package/dist/{chunk-NZBZ7IS2.js.map → chunk-JDCQK3C5.js.map} +0 -0
  576. /package/dist/{chunk-ANCC3JJH.js.map → chunk-JI62YGPI.js.map} +0 -0
  577. /package/dist/{chunk-LULR4IUW.js.map → chunk-KATEWTQJ.js.map} +0 -0
  578. /package/dist/{chunk-IJ7HK452.js.map → chunk-KMAP7SNQ.js.map} +0 -0
  579. /package/dist/{chunk-PRVJH7CY.js.map → chunk-KMWYZTIE.js.map} +0 -0
  580. /package/dist/{chunk-JGSKJHF7.js.map → chunk-KQS72GCR.js.map} +0 -0
  581. /package/dist/{chunk-FMCHFSZF.js.map → chunk-LQKXVQZR.js.map} +0 -0
  582. /package/dist/{chunk-M4DMO67I.js.map → chunk-LTOAJXZB.js.map} +0 -0
  583. /package/dist/{chunk-NIS256NW.js.map → chunk-LYMNZZIM.js.map} +0 -0
  584. /package/dist/{chunk-3PY7VHV7.js.map → chunk-MCA2X4WH.js.map} +0 -0
  585. /package/dist/{chunk-S5NZBKKQ.js.map → chunk-N3CXAYPJ.js.map} +0 -0
  586. /package/dist/{chunk-WQIHRA5F.js.map → chunk-N3LL5NEU.js.map} +0 -0
  587. /package/dist/{chunk-G2RBWVFQ.js.map → chunk-NKL25FCF.js.map} +0 -0
  588. /package/dist/{chunk-LMDRGRJ2.js.map → chunk-NOB2T2FC.js.map} +0 -0
  589. /package/dist/{chunk-P2OTGMTR.js.map → chunk-NSGU76YO.js.map} +0 -0
  590. /package/dist/{chunk-D5NGH2EW.js.map → chunk-O76MWTVS.js.map} +0 -0
  591. /package/dist/{chunk-WZFAPHIK.js.map → chunk-OIOZ6MOP.js.map} +0 -0
  592. /package/dist/{chunk-UMOO7IY7.js.map → chunk-P2KBDJJ6.js.map} +0 -0
  593. /package/dist/{chunk-SXWHN7GC.js.map → chunk-PDEKQWDV.js.map} +0 -0
  594. /package/dist/{chunk-2EJNXE53.js.map → chunk-PLCHU56K.js.map} +0 -0
  595. /package/dist/{chunk-45OTV7FZ.js.map → chunk-PWIMF7LP.js.map} +0 -0
  596. /package/dist/{chunk-7YKVM5H3.js.map → chunk-PWLB4TRK.js.map} +0 -0
  597. /package/dist/{chunk-RVYVMQK4.js.map → chunk-QSYL5CXK.js.map} +0 -0
  598. /package/dist/{chunk-NXUJRXSF.js.map → chunk-QWLW3VQH.js.map} +0 -0
  599. /package/dist/{chunk-JBPKEARU.js.map → chunk-RKNJBZ55.js.map} +0 -0
  600. /package/dist/{chunk-QCECHYZL.js.map → chunk-RVO6TCTU.js.map} +0 -0
  601. /package/dist/{chunk-5L7PTX2Q.js.map → chunk-S2SJEOTM.js.map} +0 -0
  602. /package/dist/{chunk-52I3YZZ6.js.map → chunk-S75UQ3T3.js.map} +0 -0
  603. /package/dist/{chunk-LXOM6IQU.js.map → chunk-SEF4IOFE.js.map} +0 -0
  604. /package/dist/{chunk-DUEEQCTT.js.map → chunk-SHYIMIX5.js.map} +0 -0
  605. /package/dist/{chunk-7K5Q6COX.js.map → chunk-TVVEYCNW.js.map} +0 -0
  606. /package/dist/{chunk-3JUYWPFJ.js.map → chunk-VFS3MK5F.js.map} +0 -0
  607. /package/dist/{chunk-WOEVJKKQ.js.map → chunk-WPZX7MEA.js.map} +0 -0
  608. /package/dist/{chunk-ZRWB5D4H.js.map → chunk-WT6UL3UA.js.map} +0 -0
  609. /package/dist/{chunk-MC6XO7T4.js.map → chunk-YLBE6PLR.js.map} +0 -0
  610. /package/dist/{chunk-GF22HWS2.js.map → chunk-Z54EM5YZ.js.map} +0 -0
  611. /package/dist/{chunk-GVX3NAUU.js.map → chunk-ZDAYWJV6.js.map} +0 -0
  612. /package/dist/{chunk-JYPO7L3G.js.map → chunk-ZN4EYMKJ.js.map} +0 -0
  613. /package/dist/{resolution-3K27T4VO.js.map → coding/pre-action-gate.js.map} +0 -0
  614. /package/dist/{first-start-migration-ZSHEFEI3.js.map → first-start-migration-626C5554.js.map} +0 -0
  615. /package/dist/{forget-DNAJ66ZD.js.map → forget-GJ42LCBW.js.map} +0 -0
  616. /package/dist/{tier-stats-OPTSBNRH.js.map → tier-stats-2JCZYEF7.js.map} +0 -0
@@ -1,25 +1,114 @@
1
1
  import {
2
2
  resolveCueAnchorStoreDir,
3
3
  validateCueAnchor
4
- } from "./chunk-FZZ2QTJI.js";
4
+ } from "./chunk-ACPCA4NO.js";
5
5
  import {
6
+ HARMONIC_SOURCE_MEMORY_INSERTED_AT_KEY,
6
7
  resolveAbstractionNodeStoreDir,
7
8
  validateAbstractionNode
8
- } from "./chunk-OADWQ5CR.js";
9
+ } from "./chunk-DJUKBGAD.js";
10
+ import {
11
+ compareDeterministicStrings
12
+ } from "./chunk-G73MCJKL.js";
13
+ import {
14
+ stripAttributesSuffix
15
+ } from "./chunk-R3DJVOSM.js";
16
+ import {
17
+ isValidityExpiredNow
18
+ } from "./chunk-6CIAGZ6X.js";
9
19
  import {
10
20
  countRecallTokenOverlap,
11
21
  normalizeRecallTokens
12
22
  } from "./chunk-ZBJMUXZH.js";
23
+ import {
24
+ inferMemoryStatus,
25
+ toMemoryPathRel
26
+ } from "./chunk-7RJUVTVF.js";
13
27
  import {
14
28
  throwIfAborted
15
29
  } from "./chunk-BTTPKDIL.js";
16
30
  import {
17
- listJsonFiles,
31
+ listJsonFilesStrict,
18
32
  readJsonFile
19
- } from "./chunk-LPSF4OQH.js";
33
+ } from "./chunk-P77QX3ID.js";
20
34
 
21
35
  // src/harmonic-retrieval.ts
22
36
  import path from "path";
37
+ async function readSourceMemories(options) {
38
+ const sourceMemories = /* @__PURE__ */ new Map();
39
+ try {
40
+ const { StorageManager } = await import("./storage.js");
41
+ const storage = new StorageManager(options.memoryDir);
42
+ const [hotMemories, coldMemories] = await Promise.all([
43
+ storage.readAllMemories({ abortSignal: options.abortSignal }),
44
+ storage.readAllColdMemories()
45
+ ]);
46
+ for (const memory of [...hotMemories, ...coldMemories]) {
47
+ throwIfAborted(options.abortSignal, "harmonic retrieval aborted");
48
+ sourceMemories.set(memory.frontmatter.id, memory);
49
+ }
50
+ } catch {
51
+ throwIfAborted(options.abortSignal, "harmonic retrieval aborted");
52
+ sourceMemories.clear();
53
+ }
54
+ return sourceMemories;
55
+ }
56
+ function projectSourceBackedNode(node, sourceMemories, memoryDir, temporalExpiredInInjection, nowMs) {
57
+ const sourceMemoryIds = node.sourceMemoryIds ?? [];
58
+ if (sourceMemoryIds.length === 0) return node;
59
+ const activeSourceMemoryIds = sourceMemoryIds.filter((memoryId) => {
60
+ const memory = sourceMemories.get(memoryId);
61
+ return memory !== void 0 && inferMemoryStatus(memory.frontmatter, toMemoryPathRel(memoryDir, memory.path)) === "active" && (temporalExpiredInInjection || !isValidityExpiredNow(memory.frontmatter, nowMs));
62
+ });
63
+ if (activeSourceMemoryIds.length === 0) return null;
64
+ const activeMemories = activeSourceMemoryIds.flatMap((memoryId) => {
65
+ const memory = sourceMemories.get(memoryId);
66
+ return memory ? [memory] : [];
67
+ });
68
+ const activeContents = activeMemories.map(
69
+ (memory) => memory.frontmatter.structuredAttributes ? stripAttributesSuffix(memory.content) : memory.content
70
+ );
71
+ let metadata;
72
+ const insertedAtRaw = node.metadata?.[HARMONIC_SOURCE_MEMORY_INSERTED_AT_KEY];
73
+ if (insertedAtRaw) {
74
+ try {
75
+ const insertedAt = JSON.parse(insertedAtRaw);
76
+ const activeInsertedAt = activeSourceMemoryIds.flatMap((memoryId) => {
77
+ const value = insertedAt[memoryId];
78
+ return typeof value === "string" ? [[memoryId, value]] : [];
79
+ });
80
+ if (activeInsertedAt.length > 0) {
81
+ metadata = {
82
+ [HARMONIC_SOURCE_MEMORY_INSERTED_AT_KEY]: JSON.stringify(Object.fromEntries(activeInsertedAt))
83
+ };
84
+ }
85
+ } catch {
86
+ metadata = void 0;
87
+ }
88
+ }
89
+ return {
90
+ ...node,
91
+ sourceMemoryIds: activeSourceMemoryIds,
92
+ title: activeContents[0]?.slice(0, 80) ?? node.title,
93
+ summary: activeContents.slice(0, 3).join("; ").slice(0, 400),
94
+ tags: [...new Set(activeMemories.flatMap((memory) => memory.frontmatter.tags))].sort(compareDeterministicStrings),
95
+ entityRefs: [
96
+ ...new Set(
97
+ activeMemories.flatMap(
98
+ (memory) => typeof memory.frontmatter.entityRef === "string" ? [memory.frontmatter.entityRef] : []
99
+ )
100
+ )
101
+ ].sort(compareDeterministicStrings),
102
+ metadata
103
+ };
104
+ }
105
+ function anchorMatchesProjectedNode(anchor, nodeRef, node, allowLegacyAttribution) {
106
+ const activeSourceMemoryIds = node.sourceMemoryIds ?? [];
107
+ if (activeSourceMemoryIds.length === 0) return true;
108
+ if (!anchor.sourceMemoryIdsByNodeRef) return allowLegacyAttribution;
109
+ const anchorSourceMemoryIds = anchor.sourceMemoryIdsByNodeRef[nodeRef] ?? [];
110
+ return anchorSourceMemoryIds.some((sourceMemoryId) => activeSourceMemoryIds.includes(sourceMemoryId));
111
+ }
23
112
  function scoreNode(node, queryTokens) {
24
113
  const matchedFields = [];
25
114
  let score = 0;
@@ -50,7 +139,7 @@ function scoreNode(node, queryTokens) {
50
139
  }
51
140
  return { score, matchedFields };
52
141
  }
53
- function scoreAnchor(anchor, queryTokens) {
142
+ function scoreAnchor(anchor, queryTokens, eligibleNodeTags) {
54
143
  const matchedFields = [];
55
144
  let score = 0;
56
145
  const valueMatches = countRecallTokenOverlap(queryTokens, anchor.anchorValue);
@@ -66,7 +155,7 @@ function scoreAnchor(anchor, queryTokens) {
66
155
  score += typeMatches;
67
156
  matchedFields.push("anchorType");
68
157
  }
69
- const tagMatches = countRecallTokenOverlap(queryTokens, anchor.tags?.join(" "));
158
+ const tagMatches = countRecallTokenOverlap(queryTokens, eligibleNodeTags.join(" "));
70
159
  if (tagMatches > 0) {
71
160
  score += tagMatches * 2;
72
161
  matchedFields.push("anchorTags");
@@ -75,7 +164,7 @@ function scoreAnchor(anchor, queryTokens) {
75
164
  }
76
165
  async function readAbstractionNodes(options) {
77
166
  const rootDir = resolveAbstractionNodeStoreDir(options.memoryDir, options.abstractionNodeStoreDir);
78
- const files = await listJsonFiles(path.join(rootDir, "nodes"));
167
+ const files = await listJsonFilesStrict(path.join(rootDir, "nodes"), { allowMissingDirectory: true });
79
168
  const nodes = [];
80
169
  for (const filePath of files) {
81
170
  try {
@@ -88,7 +177,7 @@ async function readAbstractionNodes(options) {
88
177
  async function readCueAnchors(options) {
89
178
  const abstractionRoot = resolveAbstractionNodeStoreDir(options.memoryDir, options.abstractionNodeStoreDir);
90
179
  const rootDir = resolveCueAnchorStoreDir(abstractionRoot);
91
- const files = await listJsonFiles(rootDir);
180
+ const files = await listJsonFilesStrict(rootDir, { allowMissingDirectory: true });
92
181
  const anchors = [];
93
182
  for (const filePath of files) {
94
183
  try {
@@ -103,8 +192,25 @@ async function searchHarmonicRetrieval(options) {
103
192
  const queryTokens = new Set(normalizeRecallTokens(options.query, ["what", "which"]));
104
193
  if (queryTokens.size === 0 || options.maxResults <= 0) return [];
105
194
  const nodes = await readAbstractionNodes(options);
195
+ const sourceBackedNodes = nodes.filter((node) => (node.sourceMemoryIds?.length ?? 0) > 0);
196
+ const sourceMemories = sourceBackedNodes.length > 0 ? await readSourceMemories(options) : /* @__PURE__ */ new Map();
197
+ const legacyCompatibleNodeRefs = /* @__PURE__ */ new Set();
198
+ const nowMs = Date.now();
199
+ const eligibleNodes = nodes.flatMap((node) => {
200
+ const projected = projectSourceBackedNode(
201
+ node,
202
+ sourceMemories,
203
+ options.memoryDir,
204
+ options.temporalExpiredInInjection === true,
205
+ nowMs
206
+ );
207
+ if (projected && (node.sourceMemoryIds?.length ?? 0) > 0 && projected.sourceMemoryIds?.length === node.sourceMemoryIds?.length) {
208
+ legacyCompatibleNodeRefs.add(node.nodeId);
209
+ }
210
+ return projected ? [projected] : [];
211
+ });
106
212
  const candidates = /* @__PURE__ */ new Map();
107
- for (const node of nodes) {
213
+ for (const node of eligibleNodes) {
108
214
  throwIfAborted(options.abortSignal, "harmonic retrieval aborted");
109
215
  const { score, matchedFields } = scoreNode(node, queryTokens);
110
216
  if (score <= 0) continue;
@@ -119,12 +225,18 @@ async function searchHarmonicRetrieval(options) {
119
225
  if (options.anchorsEnabled) {
120
226
  throwIfAborted(options.abortSignal, "harmonic retrieval aborted");
121
227
  const anchors = await readCueAnchors(options);
122
- const nodeIndex = new Map(nodes.map((node) => [node.nodeId, node]));
228
+ const nodeIndex = new Map(eligibleNodes.map((node) => [node.nodeId, node]));
123
229
  for (const anchor of anchors) {
124
230
  throwIfAborted(options.abortSignal, "harmonic retrieval aborted");
125
- const { score, matchedFields } = scoreAnchor(anchor, queryTokens);
231
+ const eligibleNodeRefs = anchor.nodeRefs.filter((nodeRef) => {
232
+ const node = nodeIndex.get(nodeRef);
233
+ return node !== void 0 && anchorMatchesProjectedNode(anchor, nodeRef, node, legacyCompatibleNodeRefs.has(nodeRef));
234
+ });
235
+ const eligibleNodeTags = new Set(eligibleNodeRefs.flatMap((nodeRef) => nodeIndex.get(nodeRef)?.tags ?? []));
236
+ const eligibleAnchorTags = anchor.tags?.filter((tag) => eligibleNodeTags.has(tag)) ?? [];
237
+ const { score, matchedFields } = scoreAnchor(anchor, queryTokens, eligibleAnchorTags);
126
238
  if (score <= 0) continue;
127
- for (const nodeRef of anchor.nodeRefs) {
239
+ for (const nodeRef of eligibleNodeRefs) {
128
240
  const node = nodeIndex.get(nodeRef);
129
241
  if (!node) continue;
130
242
  const existing = candidates.get(nodeRef) ?? {
@@ -167,4 +279,4 @@ async function searchHarmonicRetrieval(options) {
167
279
  export {
168
280
  searchHarmonicRetrieval
169
281
  };
170
- //# sourceMappingURL=chunk-KVJRXN2E.js.map
282
+ //# sourceMappingURL=chunk-P4QOYG52.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/harmonic-retrieval.ts"],"sourcesContent":["import path from \"node:path\";\nimport { listJsonFilesStrict, readJsonFile } from \"./json-store.js\";\nimport { throwIfAborted } from \"./abort-error.js\";\nimport { inferMemoryStatus, toMemoryPathRel } from \"./memory-lifecycle-ledger-utils.js\";\n import {\n HARMONIC_SOURCE_MEMORY_INSERTED_AT_KEY,\n resolveAbstractionNodeStoreDir,\n validateAbstractionNode,\n type AbstractionNode,\n } from \"./abstraction-nodes.js\";\nimport { resolveCueAnchorStoreDir, validateCueAnchor, type CueAnchor, type CueAnchorType } from \"./cue-anchors.js\";\nimport { compareDeterministicStrings } from \"./deterministic-order.js\";\nimport { countRecallTokenOverlap, normalizeRecallTokens } from \"./recall-tokenization.js\";\nimport { stripAttributesSuffix } from \"./structured-attributes.js\";\nimport { isValidityExpiredNow } from \"./temporal-validity.js\";\nimport type { MemoryFile } from \"./types.js\";\n\ntype SourceMemoryMap = Map<string, MemoryFile>;\n\nasync function readSourceMemories(options: {\n memoryDir: string;\n abortSignal?: AbortSignal;\n}): Promise<SourceMemoryMap> {\n const sourceMemories: SourceMemoryMap = new Map();\n try {\n const { StorageManager } = await import(\"./storage.js\");\n const storage = new StorageManager(options.memoryDir);\n const [hotMemories, coldMemories] = await Promise.all([\n storage.readAllMemories({ abortSignal: options.abortSignal }),\n storage.readAllColdMemories(),\n ]);\n for (const memory of [...hotMemories, ...coldMemories]) {\n throwIfAborted(options.abortSignal, \"harmonic retrieval aborted\");\n sourceMemories.set(memory.frontmatter.id, memory);\n }\n } catch {\n throwIfAborted(options.abortSignal, \"harmonic retrieval aborted\");\n // Source validation fails closed when the authorized memory directory is\n // unreadable. Source-less nodes remain eligible for retrieval.\n sourceMemories.clear();\n }\n return sourceMemories;\n}\n\nfunction projectSourceBackedNode(\n node: AbstractionNode,\n sourceMemories: SourceMemoryMap,\n memoryDir: string,\n temporalExpiredInInjection: boolean,\n nowMs: number\n): AbstractionNode | null {\n const sourceMemoryIds = node.sourceMemoryIds ?? [];\n if (sourceMemoryIds.length === 0) return node;\n\n const activeSourceMemoryIds = sourceMemoryIds.filter((memoryId) => {\n const memory = sourceMemories.get(memoryId);\n return (\n memory !== undefined &&\n inferMemoryStatus(memory.frontmatter, toMemoryPathRel(memoryDir, memory.path)) === \"active\" &&\n (temporalExpiredInInjection || !isValidityExpiredNow(memory.frontmatter, nowMs))\n );\n });\n if (activeSourceMemoryIds.length === 0) return null;\n\n const activeMemories = activeSourceMemoryIds.flatMap((memoryId) => {\n const memory = sourceMemories.get(memoryId);\n return memory ? [memory] : [];\n });\n const activeContents = activeMemories.map((memory) =>\n memory.frontmatter.structuredAttributes ? stripAttributesSuffix(memory.content) : memory.content\n );\n let metadata: Record<string, string> | undefined;\n const insertedAtRaw = node.metadata?.[HARMONIC_SOURCE_MEMORY_INSERTED_AT_KEY];\n if (insertedAtRaw) {\n try {\n const insertedAt = JSON.parse(insertedAtRaw) as Record<string, unknown>;\n const activeInsertedAt = activeSourceMemoryIds.flatMap((memoryId) => {\n const value = insertedAt[memoryId];\n return typeof value === \"string\" ? [[memoryId, value] as const] : [];\n });\n if (activeInsertedAt.length > 0) {\n metadata = {\n [HARMONIC_SOURCE_MEMORY_INSERTED_AT_KEY]: JSON.stringify(Object.fromEntries(activeInsertedAt)),\n };\n }\n } catch {\n metadata = undefined;\n }\n }\n\n return {\n ...node,\n sourceMemoryIds: activeSourceMemoryIds,\n title: activeContents[0]?.slice(0, 80) ?? node.title,\n summary: activeContents.slice(0, 3).join(\"; \").slice(0, 400),\n tags: [...new Set(activeMemories.flatMap((memory) => memory.frontmatter.tags))].sort(compareDeterministicStrings),\n entityRefs: [\n ...new Set(\n activeMemories.flatMap((memory) =>\n typeof memory.frontmatter.entityRef === \"string\" ? [memory.frontmatter.entityRef] : []\n )\n ),\n ].sort(compareDeterministicStrings),\n metadata,\n };\n}\n\nfunction anchorMatchesProjectedNode(\n anchor: CueAnchor,\n nodeRef: string,\n node: AbstractionNode,\n allowLegacyAttribution: boolean\n): boolean {\n const activeSourceMemoryIds = node.sourceMemoryIds ?? [];\n if (activeSourceMemoryIds.length === 0) return true;\n if (!anchor.sourceMemoryIdsByNodeRef) return allowLegacyAttribution;\n const anchorSourceMemoryIds = anchor.sourceMemoryIdsByNodeRef[nodeRef] ?? [];\n return anchorSourceMemoryIds.some((sourceMemoryId) => activeSourceMemoryIds.includes(sourceMemoryId));\n}\n\nexport interface HarmonicMatchedAnchor {\n anchorId: string;\n anchorType: CueAnchorType;\n anchorValue: string;\n}\n\nexport interface HarmonicRetrievalResult {\n node: AbstractionNode;\n score: number;\n nodeScore: number;\n anchorScore: number;\n matchedFields: string[];\n matchedAnchors: HarmonicMatchedAnchor[];\n}\n\ninterface HarmonicCandidate {\n node: AbstractionNode;\n nodeScore: number;\n anchorScore: number;\n matchedFields: Set<string>;\n matchedAnchors: Map<string, HarmonicMatchedAnchor>;\n}\n\nfunction scoreNode(node: AbstractionNode, queryTokens: Set<string>): { score: number; matchedFields: string[] } {\n const matchedFields: string[] = [];\n let score = 0;\n\n const titleMatches = countRecallTokenOverlap(queryTokens, node.title);\n if (titleMatches > 0) {\n score += titleMatches * 3;\n matchedFields.push(\"title\");\n }\n\n const summaryMatches = countRecallTokenOverlap(queryTokens, node.summary);\n if (summaryMatches > 0) {\n score += summaryMatches * 3;\n matchedFields.push(\"summary\");\n }\n\n const tagMatches = countRecallTokenOverlap(queryTokens, node.tags?.join(\" \"));\n if (tagMatches > 0) {\n score += tagMatches * 2;\n matchedFields.push(\"tags\");\n }\n\n const entityMatches = countRecallTokenOverlap(queryTokens, node.entityRefs?.join(\" \"));\n if (entityMatches > 0) {\n score += entityMatches * 2;\n matchedFields.push(\"entityRefs\");\n }\n\n const kindMatches = countRecallTokenOverlap(queryTokens, `${node.kind} ${node.abstractionLevel}`);\n if (kindMatches > 0) {\n score += kindMatches;\n matchedFields.push(\"kind\");\n }\n\n return { score, matchedFields };\n}\n\nfunction scoreAnchor(\n anchor: CueAnchor,\n queryTokens: Set<string>,\n eligibleNodeTags: readonly string[]\n): { score: number; matchedFields: string[] } {\n const matchedFields: string[] = [];\n let score = 0;\n\n const valueMatches = countRecallTokenOverlap(queryTokens, anchor.anchorValue);\n const normalizedMatches = countRecallTokenOverlap(queryTokens, anchor.normalizedCue);\n const cueMatches = Math.max(valueMatches, normalizedMatches);\n if (cueMatches > 0) {\n score += cueMatches * 4;\n if (valueMatches > 0) matchedFields.push(\"anchorValue\");\n if (normalizedMatches > 0) matchedFields.push(\"anchor\");\n }\n\n const typeMatches = countRecallTokenOverlap(queryTokens, anchor.anchorType);\n if (typeMatches > 0) {\n score += typeMatches;\n matchedFields.push(\"anchorType\");\n }\n\n const tagMatches = countRecallTokenOverlap(queryTokens, eligibleNodeTags.join(\" \"));\n if (tagMatches > 0) {\n score += tagMatches * 2;\n matchedFields.push(\"anchorTags\");\n }\n\n return { score, matchedFields };\n}\n\nasync function readAbstractionNodes(options: {\n memoryDir: string;\n abstractionNodeStoreDir?: string;\n}): Promise<AbstractionNode[]> {\n const rootDir = resolveAbstractionNodeStoreDir(options.memoryDir, options.abstractionNodeStoreDir);\n const files = await listJsonFilesStrict(path.join(rootDir, \"nodes\"), { allowMissingDirectory: true });\n const nodes: AbstractionNode[] = [];\n for (const filePath of files) {\n try {\n nodes.push(validateAbstractionNode(await readJsonFile(filePath)));\n } catch {\n // fail-open: invalid artifacts stay visible via status tooling instead of recall\n }\n }\n return nodes;\n}\n\nasync function readCueAnchors(options: {\n memoryDir: string;\n abstractionNodeStoreDir?: string;\n}): Promise<CueAnchor[]> {\n const abstractionRoot = resolveAbstractionNodeStoreDir(options.memoryDir, options.abstractionNodeStoreDir);\n const rootDir = resolveCueAnchorStoreDir(abstractionRoot);\n const files = await listJsonFilesStrict(rootDir, { allowMissingDirectory: true });\n const anchors: CueAnchor[] = [];\n for (const filePath of files) {\n try {\n anchors.push(validateCueAnchor(await readJsonFile(filePath)));\n } catch {\n // fail-open: invalid artifacts stay visible via status tooling instead of recall\n }\n }\n return anchors;\n}\n\nexport async function searchHarmonicRetrieval(options: {\n memoryDir: string;\n abstractionNodeStoreDir?: string;\n query: string;\n maxResults: number;\n sessionKey?: string;\n anchorsEnabled: boolean;\n abortSignal?: AbortSignal;\n temporalExpiredInInjection?: boolean;\n}): Promise<HarmonicRetrievalResult[]> {\n throwIfAborted(options.abortSignal, \"harmonic retrieval aborted\");\n const queryTokens = new Set(normalizeRecallTokens(options.query, [\"what\", \"which\"]));\n if (queryTokens.size === 0 || options.maxResults <= 0) return [];\n\n const nodes = await readAbstractionNodes(options);\n const sourceBackedNodes = nodes.filter((node) => (node.sourceMemoryIds?.length ?? 0) > 0);\n const sourceMemories: SourceMemoryMap =\n sourceBackedNodes.length > 0 ? await readSourceMemories(options) : new Map<string, MemoryFile>();\n const legacyCompatibleNodeRefs = new Set<string>();\n const nowMs = Date.now();\n const eligibleNodes = nodes.flatMap((node) => {\n const projected = projectSourceBackedNode(\n node,\n sourceMemories,\n options.memoryDir,\n options.temporalExpiredInInjection === true,\n nowMs\n );\n if (\n projected &&\n (node.sourceMemoryIds?.length ?? 0) > 0 &&\n projected.sourceMemoryIds?.length === node.sourceMemoryIds?.length\n ) {\n legacyCompatibleNodeRefs.add(node.nodeId);\n }\n return projected ? [projected] : [];\n });\n const candidates = new Map<string, HarmonicCandidate>();\n\n for (const node of eligibleNodes) {\n throwIfAborted(options.abortSignal, \"harmonic retrieval aborted\");\n const { score, matchedFields } = scoreNode(node, queryTokens);\n if (score <= 0) continue;\n candidates.set(node.nodeId, {\n node,\n nodeScore: score,\n anchorScore: 0,\n matchedFields: new Set(matchedFields),\n matchedAnchors: new Map(),\n });\n }\n\n if (options.anchorsEnabled) {\n throwIfAborted(options.abortSignal, \"harmonic retrieval aborted\");\n const anchors = await readCueAnchors(options);\n const nodeIndex = new Map(eligibleNodes.map((node) => [node.nodeId, node]));\n for (const anchor of anchors) {\n throwIfAborted(options.abortSignal, \"harmonic retrieval aborted\");\n const eligibleNodeRefs = anchor.nodeRefs.filter((nodeRef) => {\n const node = nodeIndex.get(nodeRef);\n return (\n node !== undefined &&\n anchorMatchesProjectedNode(anchor, nodeRef, node, legacyCompatibleNodeRefs.has(nodeRef))\n );\n });\n const eligibleNodeTags = new Set(eligibleNodeRefs.flatMap((nodeRef) => nodeIndex.get(nodeRef)?.tags ?? []));\n const eligibleAnchorTags = anchor.tags?.filter((tag) => eligibleNodeTags.has(tag)) ?? [];\n const { score, matchedFields } = scoreAnchor(anchor, queryTokens, eligibleAnchorTags);\n if (score <= 0) continue;\n for (const nodeRef of eligibleNodeRefs) {\n const node = nodeIndex.get(nodeRef);\n if (!node) continue;\n const existing = candidates.get(nodeRef) ?? {\n node,\n nodeScore: 0,\n anchorScore: 0,\n matchedFields: new Set<string>(),\n matchedAnchors: new Map<string, HarmonicMatchedAnchor>(),\n };\n existing.anchorScore += score;\n existing.matchedFields.add(\"anchor\");\n for (const field of matchedFields) existing.matchedFields.add(field);\n existing.matchedAnchors.set(anchor.anchorId, {\n anchorId: anchor.anchorId,\n anchorType: anchor.anchorType,\n anchorValue: anchor.anchorValue,\n });\n candidates.set(nodeRef, existing);\n }\n }\n }\n\n return [...candidates.values()]\n .map((candidate) => {\n let score = candidate.nodeScore + candidate.anchorScore;\n if (options.sessionKey && candidate.node.sessionKey === options.sessionKey) score += 0.5;\n return {\n node: candidate.node,\n score,\n nodeScore: candidate.nodeScore,\n anchorScore: candidate.anchorScore,\n matchedFields: [...candidate.matchedFields].sort(),\n matchedAnchors: [...candidate.matchedAnchors.values()].sort(\n (left, right) =>\n left.anchorType.localeCompare(right.anchorType) || left.anchorValue.localeCompare(right.anchorValue)\n ),\n };\n })\n .filter((result) => result.nodeScore > 0 || result.anchorScore > 0)\n .sort(\n (left, right) =>\n right.score - left.score ||\n right.anchorScore - left.anchorScore ||\n right.node.recordedAt.localeCompare(left.node.recordedAt)\n )\n .slice(0, options.maxResults);\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,332 @@
1
+ // src/json-store.ts
2
+ import { randomUUID } from "crypto";
3
+ import {
4
+ lstat,
5
+ mkdir,
6
+ open,
7
+ readFile,
8
+ readdir,
9
+ rename,
10
+ unlink,
11
+ utimes,
12
+ writeFile
13
+ } from "fs/promises";
14
+ import path from "path";
15
+ function hasErrorCode(error, code) {
16
+ return typeof error === "object" && error !== null && "code" in error && error.code === code;
17
+ }
18
+ async function listJsonFilesStrictInner(dir, allowMissingDirectory) {
19
+ let entries;
20
+ try {
21
+ entries = await readdir(dir, { withFileTypes: true });
22
+ } catch (error) {
23
+ if (allowMissingDirectory && hasErrorCode(error, "ENOENT")) return [];
24
+ throw error;
25
+ }
26
+ const out = [];
27
+ for (const entry of entries) {
28
+ const fullPath = path.join(dir, entry.name);
29
+ if (entry.isDirectory()) {
30
+ out.push(...await listJsonFilesStrictInner(fullPath, false));
31
+ } else if (entry.isFile() && entry.name.endsWith(".json")) {
32
+ out.push(fullPath);
33
+ }
34
+ }
35
+ return out.sort();
36
+ }
37
+ async function listJsonFilesStrict(dir, options = {}) {
38
+ return listJsonFilesStrictInner(dir, options.allowMissingDirectory === true);
39
+ }
40
+ async function listJsonFiles(dir) {
41
+ try {
42
+ return await listJsonFilesStrict(dir);
43
+ } catch {
44
+ return [];
45
+ }
46
+ }
47
+ async function listNamedFiles(dir, fileName) {
48
+ try {
49
+ const entries = await readdir(dir, { withFileTypes: true });
50
+ const out = [];
51
+ for (const entry of entries) {
52
+ const fullPath = path.join(dir, entry.name);
53
+ if (entry.isDirectory()) {
54
+ out.push(...await listNamedFiles(fullPath, fileName));
55
+ } else if (entry.isFile() && entry.name === fileName) {
56
+ out.push(fullPath);
57
+ }
58
+ }
59
+ return out.sort();
60
+ } catch {
61
+ return [];
62
+ }
63
+ }
64
+ var jsonStoreMutationTails = /* @__PURE__ */ new Map();
65
+ var JSON_STORE_LOCK_RETRY_MS = 25;
66
+ var JSON_STORE_LOCK_STALE_MS = 6e4;
67
+ var JSON_STORE_LOCK_TIMEOUT_MS = 1e4;
68
+ var jsonStoreMutationLockTestHooks = null;
69
+ function setJsonStoreMutationLockTestHooks(hooks) {
70
+ jsonStoreMutationLockTestHooks = hooks;
71
+ }
72
+ function jsonStoreLockRetryMs() {
73
+ return jsonStoreMutationLockTestHooks?.retryMs ?? JSON_STORE_LOCK_RETRY_MS;
74
+ }
75
+ function jsonStoreLockStaleMs() {
76
+ return jsonStoreMutationLockTestHooks?.staleLockMs ?? JSON_STORE_LOCK_STALE_MS;
77
+ }
78
+ function jsonStoreLockTimeoutMs() {
79
+ return jsonStoreMutationLockTestHooks?.timeoutMs ?? JSON_STORE_LOCK_TIMEOUT_MS;
80
+ }
81
+ async function closeAndRemoveJsonStoreReclaimGuard(reclaimPath, reclaimHandle) {
82
+ await reclaimHandle.close().catch(() => void 0);
83
+ await unlink(reclaimPath).catch((error) => {
84
+ if (!hasErrorCode(error, "ENOENT")) throw error;
85
+ });
86
+ }
87
+ async function removeStaleJsonStoreReclaimGuard(reclaimPath) {
88
+ let initial;
89
+ try {
90
+ initial = await readJsonStoreLockState(reclaimPath);
91
+ } catch (error) {
92
+ if (hasErrorCode(error, "ENOENT")) return;
93
+ throw error;
94
+ }
95
+ if (Date.now() - initial.mtimeMs <= jsonStoreLockStaleMs()) return;
96
+ let ownerPid;
97
+ try {
98
+ const metadata = JSON.parse(initial.content);
99
+ ownerPid = typeof metadata.pid === "number" && Number.isInteger(metadata.pid) ? metadata.pid : void 0;
100
+ } catch {
101
+ ownerPid = void 0;
102
+ }
103
+ if (ownerPid !== void 0 && processIsRunning(ownerPid)) return;
104
+ let confirmed;
105
+ try {
106
+ confirmed = await readJsonStoreLockState(reclaimPath);
107
+ } catch (error) {
108
+ if (hasErrorCode(error, "ENOENT")) return;
109
+ throw error;
110
+ }
111
+ if (!sameJsonStoreLockState(initial, confirmed)) return;
112
+ await unlink(reclaimPath).catch((error) => {
113
+ if (!hasErrorCode(error, "ENOENT")) throw error;
114
+ });
115
+ }
116
+ async function acquireJsonStoreReclaimGuard(reclaimPath) {
117
+ try {
118
+ return await open(reclaimPath, "wx", 384);
119
+ } catch (error) {
120
+ if (!hasErrorCode(error, "EEXIST")) throw error;
121
+ await removeStaleJsonStoreReclaimGuard(reclaimPath);
122
+ try {
123
+ return await open(reclaimPath, "wx", 384);
124
+ } catch (retryError) {
125
+ if (hasErrorCode(retryError, "EEXIST")) return void 0;
126
+ throw retryError;
127
+ }
128
+ }
129
+ }
130
+ function waitForJsonStoreLock() {
131
+ const { promise, resolve } = Promise.withResolvers();
132
+ setTimeout(resolve, jsonStoreLockRetryMs());
133
+ return promise;
134
+ }
135
+ function processIsRunning(pid) {
136
+ try {
137
+ process.kill(pid, 0);
138
+ return true;
139
+ } catch (error) {
140
+ return !hasErrorCode(error, "ESRCH");
141
+ }
142
+ }
143
+ async function readJsonStoreLockState(lockPath) {
144
+ const lockStat = await lstat(lockPath);
145
+ if (!lockStat.isFile()) {
146
+ throw new Error(`JSON store mutation lock is not a regular file: ${lockPath}`);
147
+ }
148
+ return {
149
+ mtimeMs: lockStat.mtimeMs,
150
+ size: lockStat.size,
151
+ ino: typeof lockStat.ino === "number" ? lockStat.ino : void 0,
152
+ content: await readFile(lockPath, "utf8")
153
+ };
154
+ }
155
+ function sameJsonStoreLockState(left, right) {
156
+ return left.mtimeMs === right.mtimeMs && left.size === right.size && left.ino === right.ino && left.content === right.content;
157
+ }
158
+ async function removeJsonStoreMutationLockIfOwned(lockPath, token) {
159
+ try {
160
+ const state = await readJsonStoreLockState(lockPath);
161
+ const metadata = JSON.parse(state.content);
162
+ if (metadata.token === token) await unlink(lockPath);
163
+ } catch (error) {
164
+ if (!hasErrorCode(error, "ENOENT") && !(error instanceof SyntaxError)) throw error;
165
+ }
166
+ }
167
+ async function removeStaleJsonStoreLock(lockPath) {
168
+ const reclaimPath = `${lockPath}.reclaim`;
169
+ const reclaimHandle = await acquireJsonStoreReclaimGuard(reclaimPath);
170
+ if (!reclaimHandle) return;
171
+ try {
172
+ await reclaimHandle.writeFile(JSON.stringify({ pid: process.pid }), "utf8");
173
+ await jsonStoreMutationLockTestHooks?.afterReclaimGuardWrite?.(reclaimPath, String(process.pid));
174
+ let initial;
175
+ try {
176
+ initial = await readJsonStoreLockState(lockPath);
177
+ } catch (error) {
178
+ if (hasErrorCode(error, "ENOENT")) return;
179
+ throw error;
180
+ }
181
+ if (Date.now() - initial.mtimeMs <= jsonStoreLockStaleMs()) return;
182
+ let ownerPid;
183
+ try {
184
+ const metadata = JSON.parse(initial.content);
185
+ ownerPid = typeof metadata.pid === "number" && Number.isInteger(metadata.pid) ? metadata.pid : void 0;
186
+ } catch {
187
+ ownerPid = void 0;
188
+ }
189
+ if (ownerPid !== void 0 && processIsRunning(ownerPid)) return;
190
+ let confirmed;
191
+ try {
192
+ confirmed = await readJsonStoreLockState(lockPath);
193
+ } catch (error) {
194
+ if (hasErrorCode(error, "ENOENT")) return;
195
+ throw error;
196
+ }
197
+ if (!sameJsonStoreLockState(initial, confirmed)) return;
198
+ await unlink(lockPath).catch((error) => {
199
+ if (!hasErrorCode(error, "ENOENT")) throw error;
200
+ });
201
+ } finally {
202
+ await closeAndRemoveJsonStoreReclaimGuard(reclaimPath, reclaimHandle);
203
+ }
204
+ }
205
+ async function confirmJsonStoreMutationLockOwnership(lockPath, token, deadline) {
206
+ const reclaimPath = `${lockPath}.reclaim`;
207
+ while (true) {
208
+ const reclaimHandle = await acquireJsonStoreReclaimGuard(reclaimPath);
209
+ if (!reclaimHandle) {
210
+ if (Date.now() >= deadline) return false;
211
+ await waitForJsonStoreLock();
212
+ continue;
213
+ }
214
+ try {
215
+ try {
216
+ const state = await readJsonStoreLockState(lockPath);
217
+ const metadata = JSON.parse(state.content);
218
+ return metadata.token === token;
219
+ } catch (error) {
220
+ if (hasErrorCode(error, "ENOENT") || error instanceof SyntaxError) return false;
221
+ throw error;
222
+ }
223
+ } finally {
224
+ await closeAndRemoveJsonStoreReclaimGuard(reclaimPath, reclaimHandle);
225
+ }
226
+ }
227
+ }
228
+ async function acquireJsonStoreMutationFileLock(key) {
229
+ const lockPath = `${path.resolve(key)}.mutation.lock`;
230
+ await mkdir(path.dirname(lockPath), { recursive: true });
231
+ const token = randomUUID();
232
+ const deadline = Date.now() + jsonStoreLockTimeoutMs();
233
+ while (true) {
234
+ let handle;
235
+ try {
236
+ handle = await open(lockPath, "wx", 384);
237
+ } catch (error) {
238
+ if (!hasErrorCode(error, "EEXIST")) throw error;
239
+ await removeStaleJsonStoreLock(lockPath).catch((staleError) => {
240
+ if (!hasErrorCode(staleError, "ENOENT")) throw staleError;
241
+ });
242
+ if (Date.now() >= deadline) {
243
+ throw new Error(`Timed out acquiring JSON store mutation lock: ${lockPath}`);
244
+ }
245
+ await waitForJsonStoreLock();
246
+ continue;
247
+ }
248
+ try {
249
+ await jsonStoreMutationLockTestHooks?.beforeLockOwnerWrite?.(lockPath, token);
250
+ await handle.writeFile(JSON.stringify({ pid: process.pid, token }), "utf8");
251
+ } finally {
252
+ await handle.close().catch(() => void 0);
253
+ }
254
+ await jsonStoreMutationLockTestHooks?.beforeLockOwnershipConfirm?.(lockPath, token);
255
+ if (!await confirmJsonStoreMutationLockOwnership(lockPath, token, deadline)) {
256
+ await removeJsonStoreMutationLockIfOwned(lockPath, token);
257
+ if (Date.now() >= deadline) {
258
+ throw new Error(`Timed out acquiring JSON store mutation lock: ${lockPath}`);
259
+ }
260
+ await waitForJsonStoreLock();
261
+ continue;
262
+ }
263
+ const heartbeat = setInterval(
264
+ () => {
265
+ void readFile(lockPath, "utf8").then((content) => {
266
+ const metadata = JSON.parse(content);
267
+ if (metadata.token !== token) return;
268
+ const now = /* @__PURE__ */ new Date();
269
+ return utimes(lockPath, now, now);
270
+ }).catch(() => void 0);
271
+ },
272
+ Math.max(1, Math.floor(jsonStoreLockStaleMs() / 3))
273
+ );
274
+ heartbeat.unref();
275
+ return async () => {
276
+ clearInterval(heartbeat);
277
+ try {
278
+ const metadata = JSON.parse(await readFile(lockPath, "utf8"));
279
+ if (metadata.token === token) await unlink(lockPath);
280
+ } catch (error) {
281
+ if (!hasErrorCode(error, "ENOENT")) throw error;
282
+ }
283
+ };
284
+ }
285
+ }
286
+ async function withJsonStoreMutationLock(key, operation) {
287
+ const normalizedKey = path.resolve(key);
288
+ const previous = jsonStoreMutationTails.get(normalizedKey) ?? Promise.resolve();
289
+ const { promise: current, resolve: release } = Promise.withResolvers();
290
+ const tail = previous.catch(() => void 0).then(() => current);
291
+ jsonStoreMutationTails.set(normalizedKey, tail);
292
+ await previous.catch(() => void 0);
293
+ let releaseFileLock;
294
+ try {
295
+ releaseFileLock = await acquireJsonStoreMutationFileLock(normalizedKey);
296
+ return await operation();
297
+ } finally {
298
+ try {
299
+ await releaseFileLock?.();
300
+ } finally {
301
+ release();
302
+ if (jsonStoreMutationTails.get(normalizedKey) === tail) {
303
+ jsonStoreMutationTails.delete(normalizedKey);
304
+ }
305
+ }
306
+ }
307
+ }
308
+ async function readJsonFile(filePath) {
309
+ return JSON.parse(await readFile(filePath, "utf8"));
310
+ }
311
+ async function writeJsonFileAtomic(filePath, value) {
312
+ await mkdir(path.dirname(filePath), { recursive: true });
313
+ const tempPath = `${filePath}.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`;
314
+ try {
315
+ await writeFile(tempPath, JSON.stringify(value, null, 2), "utf8");
316
+ await rename(tempPath, filePath);
317
+ } catch (error) {
318
+ await unlink(tempPath).catch(() => void 0);
319
+ throw error;
320
+ }
321
+ }
322
+
323
+ export {
324
+ listJsonFilesStrict,
325
+ listJsonFiles,
326
+ listNamedFiles,
327
+ setJsonStoreMutationLockTestHooks,
328
+ withJsonStoreMutationLock,
329
+ readJsonFile,
330
+ writeJsonFileAtomic
331
+ };
332
+ //# sourceMappingURL=chunk-P77QX3ID.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/json-store.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport type { Dirent } from \"node:fs\";\nimport {\n lstat,\n mkdir,\n open,\n readFile,\n readdir,\n rename,\n unlink,\n utimes,\n writeFile,\n type FileHandle,\n} from \"node:fs/promises\";\nimport path from \"node:path\";\n\nfunction hasErrorCode(error: unknown, code: string): boolean {\n return typeof error === \"object\" && error !== null && \"code\" in error && (error as { code?: unknown }).code === code;\n}\n\nasync function listJsonFilesStrictInner(dir: string, allowMissingDirectory: boolean): Promise<string[]> {\n let entries: Dirent[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch (error) {\n if (allowMissingDirectory && hasErrorCode(error, \"ENOENT\")) return [];\n throw error;\n }\n const out: string[] = [];\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n out.push(...(await listJsonFilesStrictInner(fullPath, false)));\n } else if (entry.isFile() && entry.name.endsWith(\".json\")) {\n out.push(fullPath);\n }\n }\n return out.sort();\n}\n\nexport async function listJsonFilesStrict(\n dir: string,\n options: { allowMissingDirectory?: boolean } = {}\n): Promise<string[]> {\n return listJsonFilesStrictInner(dir, options.allowMissingDirectory === true);\n}\n\nexport async function listJsonFiles(dir: string): Promise<string[]> {\n try {\n return await listJsonFilesStrict(dir);\n } catch {\n return [];\n }\n}\n\nexport async function listNamedFiles(dir: string, fileName: string): Promise<string[]> {\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n const out: string[] = [];\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n out.push(...(await listNamedFiles(fullPath, fileName)));\n } else if (entry.isFile() && entry.name === fileName) {\n out.push(fullPath);\n }\n }\n return out.sort();\n } catch {\n return [];\n }\n}\n\nconst jsonStoreMutationTails = new Map<string, Promise<void>>();\n\nconst JSON_STORE_LOCK_RETRY_MS = 25;\nconst JSON_STORE_LOCK_STALE_MS = 60_000;\nconst JSON_STORE_LOCK_TIMEOUT_MS = 10_000;\n\ntype JsonStoreMutationLockTestHooks = {\n beforeLockOwnerWrite?: (lockPath: string, ownerToken: string) => Promise<void> | void;\n beforeLockOwnershipConfirm?: (lockPath: string, ownerToken: string) => Promise<void> | void;\n afterReclaimGuardWrite?: (reclaimPath: string, ownerToken: string) => Promise<void> | void;\n retryMs?: number;\n staleLockMs?: number;\n timeoutMs?: number;\n};\n\nlet jsonStoreMutationLockTestHooks: JsonStoreMutationLockTestHooks | null = null;\n\nexport function setJsonStoreMutationLockTestHooks(hooks: JsonStoreMutationLockTestHooks | null): void {\n jsonStoreMutationLockTestHooks = hooks;\n}\n\nfunction jsonStoreLockRetryMs(): number {\n return jsonStoreMutationLockTestHooks?.retryMs ?? JSON_STORE_LOCK_RETRY_MS;\n}\n\nfunction jsonStoreLockStaleMs(): number {\n return jsonStoreMutationLockTestHooks?.staleLockMs ?? JSON_STORE_LOCK_STALE_MS;\n}\n\nfunction jsonStoreLockTimeoutMs(): number {\n return jsonStoreMutationLockTestHooks?.timeoutMs ?? JSON_STORE_LOCK_TIMEOUT_MS;\n}\n\nasync function closeAndRemoveJsonStoreReclaimGuard(reclaimPath: string, reclaimHandle: FileHandle): Promise<void> {\n await reclaimHandle.close().catch(() => undefined);\n await unlink(reclaimPath).catch((error) => {\n if (!hasErrorCode(error, \"ENOENT\")) throw error;\n });\n}\n\nasync function removeStaleJsonStoreReclaimGuard(reclaimPath: string): Promise<void> {\n let initial: JsonStoreLockState;\n try {\n initial = await readJsonStoreLockState(reclaimPath);\n } catch (error) {\n if (hasErrorCode(error, \"ENOENT\")) return;\n throw error;\n }\n if (Date.now() - initial.mtimeMs <= jsonStoreLockStaleMs()) return;\n\n let ownerPid: number | undefined;\n try {\n const metadata = JSON.parse(initial.content) as { pid?: unknown };\n ownerPid = typeof metadata.pid === \"number\" && Number.isInteger(metadata.pid) ? metadata.pid : undefined;\n } catch {\n ownerPid = undefined;\n }\n if (ownerPid !== undefined && processIsRunning(ownerPid)) return;\n\n let confirmed: JsonStoreLockState;\n try {\n confirmed = await readJsonStoreLockState(reclaimPath);\n } catch (error) {\n if (hasErrorCode(error, \"ENOENT\")) return;\n throw error;\n }\n if (!sameJsonStoreLockState(initial, confirmed)) return;\n await unlink(reclaimPath).catch((error) => {\n if (!hasErrorCode(error, \"ENOENT\")) throw error;\n });\n}\n\nasync function acquireJsonStoreReclaimGuard(reclaimPath: string): Promise<FileHandle | undefined> {\n try {\n return await open(reclaimPath, \"wx\", 0o600);\n } catch (error) {\n if (!hasErrorCode(error, \"EEXIST\")) throw error;\n await removeStaleJsonStoreReclaimGuard(reclaimPath);\n try {\n return await open(reclaimPath, \"wx\", 0o600);\n } catch (retryError) {\n if (hasErrorCode(retryError, \"EEXIST\")) return undefined;\n throw retryError;\n }\n }\n}\n\nfunction waitForJsonStoreLock(): Promise<void> {\n const { promise, resolve } = Promise.withResolvers<void>();\n setTimeout(resolve, jsonStoreLockRetryMs());\n return promise;\n}\n\nfunction processIsRunning(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return !hasErrorCode(error, \"ESRCH\");\n }\n}\n\ntype JsonStoreLockState = {\n mtimeMs: number;\n size: number;\n ino: number | undefined;\n content: string;\n};\n\nasync function readJsonStoreLockState(lockPath: string): Promise<JsonStoreLockState> {\n const lockStat = await lstat(lockPath);\n if (!lockStat.isFile()) {\n throw new Error(`JSON store mutation lock is not a regular file: ${lockPath}`);\n }\n return {\n mtimeMs: lockStat.mtimeMs,\n size: lockStat.size,\n ino: typeof lockStat.ino === \"number\" ? lockStat.ino : undefined,\n content: await readFile(lockPath, \"utf8\"),\n };\n}\n\nfunction sameJsonStoreLockState(left: JsonStoreLockState, right: JsonStoreLockState): boolean {\n return (\n left.mtimeMs === right.mtimeMs &&\n left.size === right.size &&\n left.ino === right.ino &&\n left.content === right.content\n );\n}\n\nasync function removeJsonStoreMutationLockIfOwned(lockPath: string, token: string): Promise<void> {\n try {\n const state = await readJsonStoreLockState(lockPath);\n const metadata = JSON.parse(state.content) as { token?: unknown };\n if (metadata.token === token) await unlink(lockPath);\n } catch (error) {\n if (!hasErrorCode(error, \"ENOENT\") && !(error instanceof SyntaxError)) throw error;\n }\n}\n\nasync function removeStaleJsonStoreLock(lockPath: string): Promise<void> {\n const reclaimPath = `${lockPath}.reclaim`;\n const reclaimHandle = await acquireJsonStoreReclaimGuard(reclaimPath);\n if (!reclaimHandle) return;\n try {\n await reclaimHandle.writeFile(JSON.stringify({ pid: process.pid }), \"utf8\");\n await jsonStoreMutationLockTestHooks?.afterReclaimGuardWrite?.(reclaimPath, String(process.pid));\n\n let initial: JsonStoreLockState;\n try {\n initial = await readJsonStoreLockState(lockPath);\n } catch (error) {\n if (hasErrorCode(error, \"ENOENT\")) return;\n throw error;\n }\n if (Date.now() - initial.mtimeMs <= jsonStoreLockStaleMs()) return;\n let ownerPid: number | undefined;\n try {\n const metadata = JSON.parse(initial.content) as { pid?: unknown };\n ownerPid = typeof metadata.pid === \"number\" && Number.isInteger(metadata.pid) ? metadata.pid : undefined;\n } catch {\n ownerPid = undefined;\n }\n if (ownerPid !== undefined && processIsRunning(ownerPid)) return;\n\n let confirmed: JsonStoreLockState;\n try {\n confirmed = await readJsonStoreLockState(lockPath);\n } catch (error) {\n if (hasErrorCode(error, \"ENOENT\")) return;\n throw error;\n }\n if (!sameJsonStoreLockState(initial, confirmed)) return;\n await unlink(lockPath).catch((error) => {\n if (!hasErrorCode(error, \"ENOENT\")) throw error;\n });\n } finally {\n await closeAndRemoveJsonStoreReclaimGuard(reclaimPath, reclaimHandle);\n }\n}\n\nasync function confirmJsonStoreMutationLockOwnership(\n lockPath: string,\n token: string,\n deadline: number\n): Promise<boolean> {\n const reclaimPath = `${lockPath}.reclaim`;\n while (true) {\n const reclaimHandle = await acquireJsonStoreReclaimGuard(reclaimPath);\n if (!reclaimHandle) {\n if (Date.now() >= deadline) return false;\n await waitForJsonStoreLock();\n continue;\n }\n try {\n try {\n const state = await readJsonStoreLockState(lockPath);\n const metadata = JSON.parse(state.content) as { token?: unknown };\n return metadata.token === token;\n } catch (error) {\n if (hasErrorCode(error, \"ENOENT\") || error instanceof SyntaxError) return false;\n throw error;\n }\n } finally {\n await closeAndRemoveJsonStoreReclaimGuard(reclaimPath, reclaimHandle);\n }\n }\n}\n\nasync function acquireJsonStoreMutationFileLock(key: string): Promise<() => Promise<void>> {\n const lockPath = `${path.resolve(key)}.mutation.lock`;\n await mkdir(path.dirname(lockPath), { recursive: true });\n const token = randomUUID();\n const deadline = Date.now() + jsonStoreLockTimeoutMs();\n while (true) {\n let handle: FileHandle;\n try {\n handle = await open(lockPath, \"wx\", 0o600);\n } catch (error) {\n if (!hasErrorCode(error, \"EEXIST\")) throw error;\n await removeStaleJsonStoreLock(lockPath).catch((staleError) => {\n if (!hasErrorCode(staleError, \"ENOENT\")) throw staleError;\n });\n if (Date.now() >= deadline) {\n throw new Error(`Timed out acquiring JSON store mutation lock: ${lockPath}`);\n }\n await waitForJsonStoreLock();\n continue;\n }\n try {\n await jsonStoreMutationLockTestHooks?.beforeLockOwnerWrite?.(lockPath, token);\n await handle.writeFile(JSON.stringify({ pid: process.pid, token }), \"utf8\");\n } finally {\n await handle.close().catch(() => undefined);\n }\n await jsonStoreMutationLockTestHooks?.beforeLockOwnershipConfirm?.(lockPath, token);\n\n if (!(await confirmJsonStoreMutationLockOwnership(lockPath, token, deadline))) {\n await removeJsonStoreMutationLockIfOwned(lockPath, token);\n if (Date.now() >= deadline) {\n throw new Error(`Timed out acquiring JSON store mutation lock: ${lockPath}`);\n }\n await waitForJsonStoreLock();\n continue;\n }\n\n const heartbeat = setInterval(\n () => {\n void readFile(lockPath, \"utf8\")\n .then((content) => {\n const metadata = JSON.parse(content) as { token?: unknown };\n if (metadata.token !== token) return;\n const now = new Date();\n return utimes(lockPath, now, now);\n })\n .catch(() => undefined);\n },\n Math.max(1, Math.floor(jsonStoreLockStaleMs() / 3))\n );\n heartbeat.unref();\n return async () => {\n clearInterval(heartbeat);\n try {\n const metadata = JSON.parse(await readFile(lockPath, \"utf8\")) as { token?: unknown };\n if (metadata.token === token) await unlink(lockPath);\n } catch (error) {\n if (!hasErrorCode(error, \"ENOENT\")) throw error;\n }\n };\n }\n}\n\nexport async function withJsonStoreMutationLock<T>(key: string, operation: () => Promise<T>): Promise<T> {\n const normalizedKey = path.resolve(key);\n const previous = jsonStoreMutationTails.get(normalizedKey) ?? Promise.resolve();\n const { promise: current, resolve: release } = Promise.withResolvers<void>();\n const tail = previous.catch(() => undefined).then(() => current);\n jsonStoreMutationTails.set(normalizedKey, tail);\n await previous.catch(() => undefined);\n let releaseFileLock: (() => Promise<void>) | undefined;\n try {\n releaseFileLock = await acquireJsonStoreMutationFileLock(normalizedKey);\n return await operation();\n } finally {\n try {\n await releaseFileLock?.();\n } finally {\n release();\n if (jsonStoreMutationTails.get(normalizedKey) === tail) {\n jsonStoreMutationTails.delete(normalizedKey);\n }\n }\n }\n}\n\nexport async function readJsonFile(filePath: string): Promise<unknown> {\n return JSON.parse(await readFile(filePath, \"utf8\")) as unknown;\n}\n\nexport async function writeJsonFileAtomic(filePath: string, value: unknown): Promise<void> {\n await mkdir(path.dirname(filePath), { recursive: true });\n const tempPath = `${filePath}.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`;\n try {\n await writeFile(tempPath, JSON.stringify(value, null, 2), \"utf8\");\n await rename(tempPath, filePath);\n } catch (error) {\n await unlink(tempPath).catch(() => undefined);\n throw error;\n }\n}\n"],"mappings":"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","names":[]}
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-SOBJ6NEY.js";
4
4
  import {
5
5
  summarizeDisclosureTokens
6
- } from "./chunk-P2OTGMTR.js";
6
+ } from "./chunk-NSGU76YO.js";
7
7
  import {
8
8
  summarizeRetrievedMemoryProvenance
9
9
  } from "./chunk-I4WBNM3M.js";
@@ -590,4 +590,4 @@ export {
590
590
  renderRecallExplain,
591
591
  parseRecallExplainFormat
592
592
  };
593
- //# sourceMappingURL=chunk-SXWHN7GC.js.map
593
+ //# sourceMappingURL=chunk-PDEKQWDV.js.map
@@ -4,10 +4,10 @@ import {
4
4
  } from "./chunk-M23RF3LJ.js";
5
5
  import {
6
6
  composeSalvagedEnvelope
7
- } from "./chunk-FQC3DHH2.js";
7
+ } from "./chunk-66SE3BNH.js";
8
8
  import {
9
9
  StorageManager
10
- } from "./chunk-PLCZD3LG.js";
10
+ } from "./chunk-24BKGKGO.js";
11
11
  import {
12
12
  parseContinuityImprovementLoops
13
13
  } from "./chunk-LDXUBPMO.js";
@@ -1283,4 +1283,4 @@ export {
1283
1283
  defaultTierMigrationCycleBudget,
1284
1284
  CompoundingEngine
1285
1285
  };
1286
- //# sourceMappingURL=chunk-2EJNXE53.js.map
1286
+ //# sourceMappingURL=chunk-PLCHU56K.js.map