@remnic/core 9.45.4 → 9.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (460) hide show
  1. package/dist/access-admin-ops-surface.d.ts +10 -10
  2. package/dist/access-admin-ops-surface.js +30 -29
  3. package/dist/access-authorization-probe.d.ts +10 -10
  4. package/dist/access-authorization-probe.js +31 -30
  5. package/dist/access-boundary.d.ts +10 -10
  6. package/dist/access-boundary.js +30 -29
  7. package/dist/access-cli.js +91 -87
  8. package/dist/access-cli.js.map +1 -1
  9. package/dist/access-coding-context-resolution.d.ts +1 -1
  10. package/dist/access-extraction-force-flush.d.ts +10 -10
  11. package/dist/access-extraction-force-flush.js +30 -29
  12. package/dist/access-health-types.d.ts +1 -1
  13. package/dist/access-http-lcm-compaction.d.ts +10 -10
  14. package/dist/access-http-lifecycle-flush.d.ts +10 -10
  15. package/dist/access-http-offline-stream.d.ts +10 -10
  16. package/dist/access-http-offline-stream.js +1 -1
  17. package/dist/access-http-query.js +30 -29
  18. package/dist/access-http.d.ts +10 -11
  19. package/dist/access-http.js +42 -41
  20. package/dist/access-identity-continuity-surface.d.ts +8 -8
  21. package/dist/access-identity-continuity-surface.js +30 -29
  22. package/dist/access-lcm-surface.d.ts +10 -10
  23. package/dist/access-lcm-surface.js +30 -29
  24. package/dist/access-mcp.d.ts +10 -10
  25. package/dist/access-mcp.js +36 -35
  26. package/dist/access-memory-search-fanout.d.ts +2 -2
  27. package/dist/{access-namespace-preflight-CWUDwB4M.d.ts → access-namespace-preflight--H6HwN85.d.ts} +1 -1
  28. package/dist/access-namespace-preflight.d.ts +3 -3
  29. package/dist/access-namespace-preflight.js +30 -29
  30. package/dist/access-observe-write-surface.d.ts +10 -10
  31. package/dist/access-observe-write-surface.js +30 -29
  32. package/dist/access-offline-manifest.d.ts +8 -8
  33. package/dist/access-operations-batch.js +31 -30
  34. package/dist/access-operations.d.ts +13 -13
  35. package/dist/access-operations.js +35 -34
  36. package/dist/access-recall-concurrency.d.ts +10 -10
  37. package/dist/access-recall-concurrency.js +30 -29
  38. package/dist/access-recall-response.d.ts +10 -10
  39. package/dist/access-recall-response.js +30 -29
  40. package/dist/access-recall-surface.d.ts +10 -10
  41. package/dist/access-recall-surface.js +30 -29
  42. package/dist/access-schema.d.ts +84 -84
  43. package/dist/access-service-helpers.d.ts +10 -10
  44. package/dist/{access-service-CsU-ljFD.d.ts → access-service-loJadYd7.d.ts} +7 -7
  45. package/dist/access-service.d.ts +10 -10
  46. package/dist/access-service.js +30 -29
  47. package/dist/access-surface-catalog.d.ts +10 -10
  48. package/dist/access-wearables-meetings-surface.d.ts +3 -3
  49. package/dist/action-confidence.d.ts +1 -1
  50. package/dist/active-memory-bridge.d.ts +1 -1
  51. package/dist/active-recall.d.ts +1 -1
  52. package/dist/adapters/index.js +4 -4
  53. package/dist/adapters/registry.js +2 -2
  54. package/dist/ambient-provenance.d.ts +109 -0
  55. package/dist/ambient-provenance.js +22 -0
  56. package/dist/ambient-provenance.js.map +1 -0
  57. package/dist/{auto-sync-UPTUVE4X.js → auto-sync-7O6RP2RT.js} +3 -2
  58. package/dist/{auto-sync-UPTUVE4X.js.map → auto-sync-7O6RP2RT.js.map} +1 -1
  59. package/dist/behavior-learner.d.ts +1 -1
  60. package/dist/behavior-signals.d.ts +1 -1
  61. package/dist/bootstrap.d.ts +8 -8
  62. package/dist/briefing.d.ts +2 -2
  63. package/dist/briefing.js +6 -5
  64. package/dist/buffer-surprise-report.d.ts +1 -1
  65. package/dist/buffer-turn-helpers.d.ts +1 -1
  66. package/dist/buffer-turn-helpers.js +1 -1
  67. package/dist/buffer.d.ts +2 -2
  68. package/dist/buffer.js +5 -5
  69. package/dist/bulk-import/index.d.ts +3 -3
  70. package/dist/calibration.d.ts +1 -1
  71. package/dist/capabilities.d.ts +1 -1
  72. package/dist/{catalog-bctMURhN.d.ts → catalog-Iwbk9h5E.d.ts} +1 -1
  73. package/dist/causal-behavior.d.ts +1 -1
  74. package/dist/causal-consolidation.d.ts +1 -1
  75. package/dist/causal-consolidation.js +7 -6
  76. package/dist/causal-consolidation.js.map +1 -1
  77. package/dist/causal-trajectory-graph.d.ts +1 -1
  78. package/dist/{chunk-7RZJWZ46.js → chunk-227UFSEQ.js} +5 -5
  79. package/dist/{chunk-ER7W6H4T.js → chunk-2AD5SXO4.js} +5 -2
  80. package/dist/chunk-2AD5SXO4.js.map +1 -0
  81. package/dist/{chunk-XSFHWBQO.js → chunk-2DSUT7DZ.js} +10 -64
  82. package/dist/{chunk-XSFHWBQO.js.map → chunk-2DSUT7DZ.js.map} +1 -1
  83. package/dist/{chunk-DZPFMQZ7.js → chunk-3S63QIFQ.js} +1 -1
  84. package/dist/chunk-3S63QIFQ.js.map +1 -0
  85. package/dist/{chunk-UQWIKLQK.js → chunk-47J4EDGR.js} +9 -9
  86. package/dist/{chunk-5SNZSWWR.js → chunk-5LRDM4R7.js} +42 -42
  87. package/dist/{chunk-7YERSTN7.js → chunk-5R6S4DJZ.js} +7 -7
  88. package/dist/{chunk-C26TE27X.js → chunk-5VQPZ4GV.js} +3 -3
  89. package/dist/{chunk-U2VLVBBH.js → chunk-64BHFFKZ.js} +3 -3
  90. package/dist/{chunk-AJQ57VV3.js → chunk-6H744ZBH.js} +4 -4
  91. package/dist/chunk-6H744ZBH.js.map +1 -0
  92. package/dist/{chunk-7CITSYSH.js → chunk-7T4TOGMS.js} +2 -2
  93. package/dist/{chunk-ZMAYKGPN.js → chunk-7YQ6ESEA.js} +12 -41
  94. package/dist/chunk-7YQ6ESEA.js.map +1 -0
  95. package/dist/{chunk-YMAQDHQM.js → chunk-BDNL34CT.js} +2 -2
  96. package/dist/{chunk-GQL52GQ5.js → chunk-CDKHKZL5.js} +15 -12
  97. package/dist/chunk-CDKHKZL5.js.map +1 -0
  98. package/dist/{chunk-WGP57SR3.js → chunk-CK5KOVHW.js} +3 -2
  99. package/dist/{chunk-WGP57SR3.js.map → chunk-CK5KOVHW.js.map} +1 -1
  100. package/dist/{chunk-JH6BPLOP.js → chunk-E4FOAENZ.js} +4 -4
  101. package/dist/{chunk-ZFGZ6PZ2.js → chunk-FULKGK7P.js} +2 -2
  102. package/dist/{chunk-BGHFOD5A.js → chunk-HJ3SVHUW.js} +3 -3
  103. package/dist/{chunk-TYISDI6B.js → chunk-HXXTXLKA.js} +2 -2
  104. package/dist/{chunk-FZP32336.js → chunk-IDE5AR5W.js} +53 -31
  105. package/dist/chunk-IDE5AR5W.js.map +1 -0
  106. package/dist/{chunk-7SHJHPTY.js → chunk-ILBLZ5Y5.js} +2 -2
  107. package/dist/chunk-J7T4MX7P.js +131 -0
  108. package/dist/chunk-J7T4MX7P.js.map +1 -0
  109. package/dist/{chunk-DSUAAZZX.js → chunk-JFO5QZ7N.js} +2 -2
  110. package/dist/{chunk-EJHEWCGQ.js → chunk-KA47C7BF.js} +2 -2
  111. package/dist/{chunk-NUEQKLNB.js → chunk-KMWYZTIE.js} +2 -2
  112. package/dist/{chunk-TQ4GD737.js → chunk-L7G72WY4.js} +2 -2
  113. package/dist/{chunk-CLB32OHM.js → chunk-LI7OE7G6.js} +2 -2
  114. package/dist/{chunk-TN76AKO3.js → chunk-M2INOSTA.js} +2 -2
  115. package/dist/{chunk-DYVMXPCF.js → chunk-M32URQXV.js} +665 -614
  116. package/dist/chunk-M32URQXV.js.map +1 -0
  117. package/dist/{chunk-WQIHRA5F.js → chunk-N3LL5NEU.js} +2 -2
  118. package/dist/{chunk-HFPASSFV.js → chunk-P2OTGMTR.js} +2 -2
  119. package/dist/{chunk-Y7HRYCNW.js → chunk-PFJXPOD4.js} +2 -2
  120. package/dist/{chunk-MDISBSYA.js → chunk-PKCLQ7KM.js} +43 -143
  121. package/dist/chunk-PKCLQ7KM.js.map +1 -0
  122. package/dist/chunk-QW27DOHG.js +84 -0
  123. package/dist/chunk-QW27DOHG.js.map +1 -0
  124. package/dist/{chunk-ZI32MKDW.js → chunk-RCU25Z66.js} +32 -35
  125. package/dist/chunk-RCU25Z66.js.map +1 -0
  126. package/dist/{chunk-2QSZNTDO.js → chunk-RKNJBZ55.js} +4 -4
  127. package/dist/{chunk-QCECHYZL.js → chunk-RVO6TCTU.js} +6 -6
  128. package/dist/{chunk-D3I2MCN7.js → chunk-RVPTS4U5.js} +3 -3
  129. package/dist/{chunk-W3IC7QOY.js → chunk-RVYVMQK4.js} +3 -3
  130. package/dist/chunk-S2HLHAZ4.js +16 -0
  131. package/dist/chunk-S2HLHAZ4.js.map +1 -0
  132. package/dist/{chunk-2MRHJNWL.js → chunk-ST5IEK3H.js} +2 -2
  133. package/dist/{chunk-O4KMGRXE.js → chunk-SXWHN7GC.js} +2 -2
  134. package/dist/{chunk-KXEFRMCF.js → chunk-T6JRMVOV.js} +2 -2
  135. package/dist/{chunk-R5RFK3CB.js → chunk-U6JGQ37L.js} +2 -2
  136. package/dist/{chunk-UV72DEZD.js → chunk-UYUYZ4WY.js} +36 -10
  137. package/dist/chunk-UYUYZ4WY.js.map +1 -0
  138. package/dist/{chunk-EITZHSX6.js → chunk-V5FE3UAI.js} +2 -2
  139. package/dist/chunk-VL35ZFSZ.js +102 -0
  140. package/dist/chunk-VL35ZFSZ.js.map +1 -0
  141. package/dist/{chunk-NTOIP2E6.js → chunk-W2ZSNIBP.js} +2 -2
  142. package/dist/{chunk-QVSBTCVP.js → chunk-WHWDBTCJ.js} +2 -2
  143. package/dist/{chunk-5CEECY6P.js → chunk-WOC6DXP5.js} +3 -3
  144. package/dist/{chunk-XTAUXTDO.js → chunk-XBMJ35IP.js} +2 -2
  145. package/dist/{chunk-VOUOLGIP.js → chunk-YRFAYOFQ.js} +11 -13
  146. package/dist/chunk-YRFAYOFQ.js.map +1 -0
  147. package/dist/{chunk-P7NGM24P.js → chunk-YWCOJOUI.js} +2 -2
  148. package/dist/{chunk-6NNNURLK.js → chunk-Z54EM5YZ.js} +4 -4
  149. package/dist/{chunk-ULVR5KG7.js → chunk-ZDAYWJV6.js} +2 -2
  150. package/dist/chunk-ZDAYWJV6.js.map +1 -0
  151. package/dist/{cli-BBHDtG36.d.ts → cli-D_RcqXfZ.d.ts} +5 -5
  152. package/dist/cli.d.ts +12 -12
  153. package/dist/cli.js +61 -60
  154. package/dist/compat/checks.js +1 -1
  155. package/dist/compounding/engine.d.ts +2 -2
  156. package/dist/compounding/engine.js +6 -5
  157. package/dist/compounding/preference-consolidator.d.ts +1 -1
  158. package/dist/compression-optimizer.d.ts +1 -1
  159. package/dist/config.d.ts +1 -1
  160. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  161. package/dist/connectors/codex-materialize-runner.js +6 -5
  162. package/dist/connectors/codex-materialize.d.ts +1 -1
  163. package/dist/connectors/index.d.ts +1 -1
  164. package/dist/connectors/index.js +6 -5
  165. package/dist/consolidation-provenance-check.d.ts +2 -2
  166. package/dist/consolidation-undo.d.ts +2 -2
  167. package/dist/contradiction/index.d.ts +2 -2
  168. package/dist/converge-config.d.ts +1 -1
  169. package/dist/convergence-refresh.d.ts +2 -2
  170. package/dist/convergence-refresh.js +8 -7
  171. package/dist/conversation-index/backend.d.ts +1 -1
  172. package/dist/conversation-index/backend.js +2 -2
  173. package/dist/conversation-index/chunker.d.ts +1 -1
  174. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  175. package/dist/conversation-index/indexer.d.ts +1 -1
  176. package/dist/conversation-index/search.d.ts +1 -1
  177. package/dist/corpus-watermark.d.ts +1 -1
  178. package/dist/corpus-watermark.js +17 -16
  179. package/dist/day-summary.d.ts +1 -1
  180. package/dist/delinearize.d.ts +1 -1
  181. package/dist/direct-answer-wiring.d.ts +1 -1
  182. package/dist/direct-answer.d.ts +1 -1
  183. package/dist/embedding-fallback.d.ts +1 -1
  184. package/dist/enrichment/index.d.ts +1 -1
  185. package/dist/entity-retrieval.d.ts +2 -2
  186. package/dist/entity-retrieval.js +6 -5
  187. package/dist/entity-schema.d.ts +1 -1
  188. package/dist/explicit-capture.d.ts +8 -8
  189. package/dist/external-wiki-access.d.ts +10 -10
  190. package/dist/external-wiki-access.js +33 -32
  191. package/dist/external-wiki-cli.js +4 -90
  192. package/dist/external-wiki-cli.js.map +1 -1
  193. package/dist/external-wiki-collection-registration.d.ts +1 -1
  194. package/dist/external-wiki-collection.d.ts +1 -1
  195. package/dist/external-wiki-mcp-tools.d.ts +10 -10
  196. package/dist/external-wiki-search.js +2 -2
  197. package/dist/external-wiki.d.ts +1 -5
  198. package/dist/external-wiki.js +1 -3
  199. package/dist/extraction-error-classification.d.ts +1 -1
  200. package/dist/extraction-faithfulness.d.ts +1 -1
  201. package/dist/extraction-judge-telemetry.d.ts +1 -1
  202. package/dist/extraction-judge-training.d.ts +1 -1
  203. package/dist/extraction-judge.d.ts +1 -1
  204. package/dist/extraction-liveness.d.ts +1 -1
  205. package/dist/extraction-prompt.d.ts +36 -0
  206. package/dist/extraction-prompt.js +16 -0
  207. package/dist/extraction-prompt.js.map +1 -0
  208. package/dist/extraction-source-grounding-rules.d.ts +1 -1
  209. package/dist/extraction-source-grounding.d.ts +1 -1
  210. package/dist/extraction.d.ts +6 -14
  211. package/dist/extraction.js +13 -10
  212. package/dist/fallback-llm.d.ts +1 -1
  213. package/dist/{first-start-migration-F2QJD66E.js → first-start-migration-ZSHEFEI3.js} +10 -12
  214. package/dist/{first-start-migration-F2QJD66E.js.map → first-start-migration-ZSHEFEI3.js.map} +1 -1
  215. package/dist/graph-dashboard-diff.d.ts +1 -1
  216. package/dist/graph-dashboard-key.d.ts +1 -1
  217. package/dist/graph-dashboard-parser.d.ts +1 -1
  218. package/dist/graph-edge-reinforcement.d.ts +1 -1
  219. package/dist/graph-snapshot.d.ts +1 -1
  220. package/dist/graph.d.ts +1 -1
  221. package/dist/importance.d.ts +1 -1
  222. package/dist/importers/index.d.ts +1 -1
  223. package/dist/in-flight-reads.d.ts +1 -1
  224. package/dist/index.d.ts +701 -697
  225. package/dist/index.js +133 -128
  226. package/dist/intent.d.ts +1 -1
  227. package/dist/lcm/engine.d.ts +1 -1
  228. package/dist/lcm/engine.js +2 -2
  229. package/dist/lcm/index.d.ts +1 -1
  230. package/dist/lcm/index.js +2 -2
  231. package/dist/lcm/tools.d.ts +1 -1
  232. package/dist/lifecycle.d.ts +1 -1
  233. package/dist/live-connectors-runner.d.ts +1 -1
  234. package/dist/local-llm.d.ts +1 -1
  235. package/dist/local-model-endpoint.d.ts +1 -1
  236. package/dist/maintenance/memory-governance.d.ts +1 -1
  237. package/dist/maintenance/memory-governance.js +6 -5
  238. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
  239. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +6 -5
  240. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
  241. package/dist/maintenance/rebuild-memory-projection.js +7 -6
  242. package/dist/{maintenance-D2mveyCd.d.ts → maintenance-DQrL93Uu.d.ts} +3 -3
  243. package/dist/mcp-memory-inspector-app.d.ts +10 -10
  244. package/dist/memory-action-policy.d.ts +1 -1
  245. package/dist/memory-cache.d.ts +1 -1
  246. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  247. package/dist/memory-projection-store.d.ts +1 -1
  248. package/dist/memory-provenance.d.ts +1 -1
  249. package/dist/memory-snapshot.d.ts +10 -0
  250. package/dist/memory-snapshot.js +8 -0
  251. package/dist/memory-snapshot.js.map +1 -0
  252. package/dist/memory-worth-outcomes.d.ts +2 -2
  253. package/dist/models-json.d.ts +1 -1
  254. package/dist/namespaces/migrate.d.ts +3 -3
  255. package/dist/namespaces/migrate.js +16 -15
  256. package/dist/namespaces/principal.d.ts +1 -1
  257. package/dist/namespaces/search.d.ts +1 -1
  258. package/dist/namespaces/search.js +9 -9
  259. package/dist/namespaces/storage.d.ts +3 -3
  260. package/dist/namespaces/storage.js +6 -5
  261. package/dist/native-knowledge.d.ts +1 -1
  262. package/dist/offline-sync-impression-drain.d.ts +1 -1
  263. package/dist/operator-doctor-corpus.d.ts +1 -1
  264. package/dist/operator-doctor-corpus.js +18 -17
  265. package/dist/operator-doctor-replica.d.ts +1 -1
  266. package/dist/operator-toolkit.d.ts +3 -3
  267. package/dist/operator-toolkit.js +22 -21
  268. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  269. package/dist/orchestration/maintenance.d.ts +4 -4
  270. package/dist/orchestration/maintenance.js +11 -10
  271. package/dist/{orchestrator-DJYlwiUv.d.ts → orchestrator-LPGegii3.d.ts} +8 -8
  272. package/dist/orchestrator.d.ts +8 -8
  273. package/dist/orchestrator.js +93 -89
  274. package/dist/patterns-cli.d.ts +1 -1
  275. package/dist/{pipeline-CNjY4wk3.d.ts → pipeline-1h2GpiHP.d.ts} +1 -1
  276. package/dist/policy-runtime.d.ts +1 -1
  277. package/dist/proactive-contention.d.ts +1 -1
  278. package/dist/provenance.d.ts +1 -1
  279. package/dist/{qmd-C0UDZidt.d.ts → qmd-UdwoF71D.d.ts} +1 -1
  280. package/dist/qmd-preflight.d.ts +2 -2
  281. package/dist/qmd-recall-cache.d.ts +1 -1
  282. package/dist/qmd.d.ts +2 -2
  283. package/dist/qmd.js +4 -4
  284. package/dist/recall-concurrency-config.d.ts +1 -1
  285. package/dist/recall-disclosure-escalation.d.ts +1 -1
  286. package/dist/recall-explain-renderer.d.ts +1 -1
  287. package/dist/recall-explain-renderer.js +3 -3
  288. package/dist/recall-memory-map.d.ts +1 -1
  289. package/dist/recall-planner-llm.d.ts +1 -1
  290. package/dist/recall-state.d.ts +1 -1
  291. package/dist/recall-tag-filter.d.ts +1 -1
  292. package/dist/recall-timings.d.ts +1 -1
  293. package/dist/recall-xray-cli.d.ts +1 -1
  294. package/dist/recall-xray-cli.js +4 -4
  295. package/dist/recall-xray-renderer.d.ts +1 -1
  296. package/dist/recall-xray-renderer.js +3 -3
  297. package/dist/recall-xray.d.ts +1 -1
  298. package/dist/recall-xray.js +2 -2
  299. package/dist/reconcile/cursor.d.ts +1 -1
  300. package/dist/reconcile/manifest.d.ts +1 -1
  301. package/dist/reconcile/plan.d.ts +1 -1
  302. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  303. package/dist/replay/normalizers/claude.d.ts +1 -1
  304. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  305. package/dist/replay/normalizers/shared.d.ts +1 -1
  306. package/dist/replay/runner.d.ts +1 -1
  307. package/dist/replay/types.d.ts +1 -1
  308. package/dist/replica-divergence.d.ts +1 -1
  309. package/dist/replica-peers-config.d.ts +1 -1
  310. package/dist/resolve-auth-token.d.ts +1 -1
  311. package/dist/retrieval-agents.d.ts +2 -2
  312. package/dist/retrieval-tiers.d.ts +1 -1
  313. package/dist/routing/engine.d.ts +1 -1
  314. package/dist/routing/store.d.ts +1 -1
  315. package/dist/salvage-envelope.d.ts +1 -1
  316. package/dist/schemas.d.ts +76 -76
  317. package/dist/{scope-profiles-BJzp2F5A.d.ts → scope-profiles-APjhSe-w.d.ts} +1 -1
  318. package/dist/sdk-compat.js.map +1 -1
  319. package/dist/search/embed-helper.d.ts +1 -1
  320. package/dist/search/factory.d.ts +1 -1
  321. package/dist/search/factory.js +8 -8
  322. package/dist/search/index.d.ts +1 -1
  323. package/dist/search/index.js +14 -14
  324. package/dist/search/lancedb-backend.d.ts +1 -1
  325. package/dist/search/meilisearch-backend.d.ts +1 -1
  326. package/dist/search/noop-backend.d.ts +1 -1
  327. package/dist/search/orama-backend.d.ts +1 -1
  328. package/dist/search/port.d.ts +1 -1
  329. package/dist/search/remote-backend.d.ts +1 -1
  330. package/dist/{semantic-consolidation-D4KAZO2G.d.ts → semantic-consolidation-CrySDbk3.d.ts} +1 -1
  331. package/dist/semantic-consolidation.d.ts +2 -2
  332. package/dist/semantic-consolidation.js +7 -6
  333. package/dist/semantic-rule-promotion.js +6 -5
  334. package/dist/semantic-rule-verifier.d.ts +1 -1
  335. package/dist/semantic-rule-verifier.js +6 -5
  336. package/dist/{service-BeDxSqE-.d.ts → service-DJ0LDyuN.d.ts} +2 -2
  337. package/dist/session-observer-bands.d.ts +1 -1
  338. package/dist/session-observer-state.d.ts +1 -1
  339. package/dist/shared-context/manager.d.ts +9 -9
  340. package/dist/signal.d.ts +1 -1
  341. package/dist/source-agent-qualifier.d.ts +4 -1
  342. package/dist/source-agent-qualifier.js +10 -9
  343. package/dist/{storage-DfjxusTE.d.ts → storage-y340tYKb.d.ts} +5 -2
  344. package/dist/storage.d.ts +2 -2
  345. package/dist/storage.js +5 -4
  346. package/dist/summarizer.d.ts +1 -1
  347. package/dist/summary-snapshot.d.ts +1 -1
  348. package/dist/temporal-supersession.d.ts +2 -2
  349. package/dist/temporal-timeline-recall.d.ts +1 -1
  350. package/dist/temporal-validity.d.ts +1 -1
  351. package/dist/threading.d.ts +1 -1
  352. package/dist/tier-migration.d.ts +2 -2
  353. package/dist/tier-migration.js +1 -1
  354. package/dist/tier-routing.d.ts +1 -1
  355. package/dist/topics.d.ts +1 -1
  356. package/dist/transcript.d.ts +1 -1
  357. package/dist/transfer/types.d.ts +66 -66
  358. package/dist/trust-score-stage.d.ts +1 -1
  359. package/dist/trust-score.d.ts +1 -1
  360. package/dist/{types-yX_FwERf.d.ts → types-D_Au9qJO.d.ts} +13 -2
  361. package/dist/types.d.ts +1 -1
  362. package/dist/types.js +1 -1
  363. package/dist/utility-runtime.d.ts +1 -1
  364. package/dist/verified-recall.js +6 -5
  365. package/dist/write-envelope.d.ts +1 -1
  366. package/package.json +2 -12
  367. package/src/access-http-offline-stream.ts +1 -0
  368. package/src/access-http.ts +0 -57
  369. package/src/access-operations-batch.ts +1 -1
  370. package/src/access-service-observe-lcm-parity.test.ts +45 -20
  371. package/src/access-service.ts +3 -4
  372. package/src/ambient-provenance.test.ts +510 -0
  373. package/src/ambient-provenance.ts +229 -0
  374. package/src/buffer-turn-helpers.ts +17 -1
  375. package/src/compat/checks.test.ts +45 -1
  376. package/src/compat/checks.ts +16 -16
  377. package/src/external-wiki-cli.ts +28 -20
  378. package/src/external-wiki-search.test.ts +68 -2
  379. package/src/external-wiki.ts +12 -38
  380. package/src/extraction-prompt.ts +142 -0
  381. package/src/extraction.ts +37 -148
  382. package/src/index.ts +1 -5
  383. package/src/maintenance/first-start-migration.ts +11 -11
  384. package/src/meetings/memory-gen.test.ts +51 -0
  385. package/src/meetings/memory-gen.ts +36 -8
  386. package/src/meetings/summary-extractor.ts +4 -2
  387. package/src/memory-snapshot.ts +15 -0
  388. package/src/orchestration/recall-internal.ts +5 -148
  389. package/src/orchestration/recall-profile-storage.ts +194 -0
  390. package/src/orchestration/recall-search-pipeline.ts +13 -182
  391. package/src/orchestration/recall-search-prefilter.ts +254 -0
  392. package/src/orchestration/session-context.ts +1 -1
  393. package/src/orchestrator.ts +1 -1
  394. package/src/sdk-compat.ts +2 -4
  395. package/src/source-agent-qualifier.ts +3 -0
  396. package/src/storage-contract/cache-coherence.test.ts +99 -0
  397. package/src/storage-fact-hash-index-defer.test.ts +14 -7
  398. package/src/storage.ts +47 -48
  399. package/src/testing/subjects/first-start-tier-migration.test.ts +75 -0
  400. package/src/testing/subjects/recall-profile-storage.test.ts +362 -0
  401. package/src/testing/subjects/recall-search-prefilter.test.ts +365 -0
  402. package/src/tier-migration.ts +10 -12
  403. package/src/types.ts +2 -2
  404. package/src/wearables/memory-gen.test.ts +82 -0
  405. package/src/wearables/memory-gen.ts +54 -5
  406. package/src/wearables/trust.ts +19 -2
  407. package/dist/chunk-AJQ57VV3.js.map +0 -1
  408. package/dist/chunk-DYVMXPCF.js.map +0 -1
  409. package/dist/chunk-DZPFMQZ7.js.map +0 -1
  410. package/dist/chunk-ER7W6H4T.js.map +0 -1
  411. package/dist/chunk-FZP32336.js.map +0 -1
  412. package/dist/chunk-GQL52GQ5.js.map +0 -1
  413. package/dist/chunk-MDISBSYA.js.map +0 -1
  414. package/dist/chunk-ULVR5KG7.js.map +0 -1
  415. package/dist/chunk-UV72DEZD.js.map +0 -1
  416. package/dist/chunk-VOUOLGIP.js.map +0 -1
  417. package/dist/chunk-ZI32MKDW.js.map +0 -1
  418. package/dist/chunk-ZMAYKGPN.js.map +0 -1
  419. package/dist/legacy-hook-compat.d.ts +0 -3
  420. package/dist/legacy-hook-compat.js +0 -36
  421. package/dist/legacy-hook-compat.js.map +0 -1
  422. package/src/legacy-hook-compat.test.ts +0 -20
  423. package/src/legacy-hook-compat.ts +0 -45
  424. /package/dist/{chunk-7RZJWZ46.js.map → chunk-227UFSEQ.js.map} +0 -0
  425. /package/dist/{chunk-UQWIKLQK.js.map → chunk-47J4EDGR.js.map} +0 -0
  426. /package/dist/{chunk-5SNZSWWR.js.map → chunk-5LRDM4R7.js.map} +0 -0
  427. /package/dist/{chunk-7YERSTN7.js.map → chunk-5R6S4DJZ.js.map} +0 -0
  428. /package/dist/{chunk-C26TE27X.js.map → chunk-5VQPZ4GV.js.map} +0 -0
  429. /package/dist/{chunk-U2VLVBBH.js.map → chunk-64BHFFKZ.js.map} +0 -0
  430. /package/dist/{chunk-7CITSYSH.js.map → chunk-7T4TOGMS.js.map} +0 -0
  431. /package/dist/{chunk-YMAQDHQM.js.map → chunk-BDNL34CT.js.map} +0 -0
  432. /package/dist/{chunk-JH6BPLOP.js.map → chunk-E4FOAENZ.js.map} +0 -0
  433. /package/dist/{chunk-ZFGZ6PZ2.js.map → chunk-FULKGK7P.js.map} +0 -0
  434. /package/dist/{chunk-BGHFOD5A.js.map → chunk-HJ3SVHUW.js.map} +0 -0
  435. /package/dist/{chunk-TYISDI6B.js.map → chunk-HXXTXLKA.js.map} +0 -0
  436. /package/dist/{chunk-7SHJHPTY.js.map → chunk-ILBLZ5Y5.js.map} +0 -0
  437. /package/dist/{chunk-DSUAAZZX.js.map → chunk-JFO5QZ7N.js.map} +0 -0
  438. /package/dist/{chunk-EJHEWCGQ.js.map → chunk-KA47C7BF.js.map} +0 -0
  439. /package/dist/{chunk-NUEQKLNB.js.map → chunk-KMWYZTIE.js.map} +0 -0
  440. /package/dist/{chunk-TQ4GD737.js.map → chunk-L7G72WY4.js.map} +0 -0
  441. /package/dist/{chunk-CLB32OHM.js.map → chunk-LI7OE7G6.js.map} +0 -0
  442. /package/dist/{chunk-TN76AKO3.js.map → chunk-M2INOSTA.js.map} +0 -0
  443. /package/dist/{chunk-WQIHRA5F.js.map → chunk-N3LL5NEU.js.map} +0 -0
  444. /package/dist/{chunk-HFPASSFV.js.map → chunk-P2OTGMTR.js.map} +0 -0
  445. /package/dist/{chunk-Y7HRYCNW.js.map → chunk-PFJXPOD4.js.map} +0 -0
  446. /package/dist/{chunk-2QSZNTDO.js.map → chunk-RKNJBZ55.js.map} +0 -0
  447. /package/dist/{chunk-QCECHYZL.js.map → chunk-RVO6TCTU.js.map} +0 -0
  448. /package/dist/{chunk-D3I2MCN7.js.map → chunk-RVPTS4U5.js.map} +0 -0
  449. /package/dist/{chunk-W3IC7QOY.js.map → chunk-RVYVMQK4.js.map} +0 -0
  450. /package/dist/{chunk-2MRHJNWL.js.map → chunk-ST5IEK3H.js.map} +0 -0
  451. /package/dist/{chunk-O4KMGRXE.js.map → chunk-SXWHN7GC.js.map} +0 -0
  452. /package/dist/{chunk-KXEFRMCF.js.map → chunk-T6JRMVOV.js.map} +0 -0
  453. /package/dist/{chunk-R5RFK3CB.js.map → chunk-U6JGQ37L.js.map} +0 -0
  454. /package/dist/{chunk-EITZHSX6.js.map → chunk-V5FE3UAI.js.map} +0 -0
  455. /package/dist/{chunk-NTOIP2E6.js.map → chunk-W2ZSNIBP.js.map} +0 -0
  456. /package/dist/{chunk-QVSBTCVP.js.map → chunk-WHWDBTCJ.js.map} +0 -0
  457. /package/dist/{chunk-5CEECY6P.js.map → chunk-WOC6DXP5.js.map} +0 -0
  458. /package/dist/{chunk-XTAUXTDO.js.map → chunk-XBMJ35IP.js.map} +0 -0
  459. /package/dist/{chunk-P7NGM24P.js.map → chunk-YWCOJOUI.js.map} +0 -0
  460. /package/dist/{chunk-6NNNURLK.js.map → chunk-Z54EM5YZ.js.map} +0 -0
@@ -31,7 +31,7 @@ async function withMemoryDir(run: (dir: string) => Promise<void>): Promise<void>
31
31
  try {
32
32
  await run(dir);
33
33
  } finally {
34
- await rm(dir, { recursive: true, force: true });
34
+ await rm(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 50 });
35
35
  }
36
36
  }
37
37
 
@@ -2532,7 +2532,7 @@ test("chunked offline sync scans oversized frontmatter before locking its identi
2532
2532
  semanticThreshold: 0.9,
2533
2533
  namespace: "default",
2534
2534
  });
2535
- const content = `Oversized frontmatter sync ${"x".repeat(900_000)}`;
2535
+ const content = "Oversized frontmatter sync";
2536
2536
  const tombstoneId = await storage.appendTombstone({
2537
2537
  reason: "correction",
2538
2538
  createdBy: "user_correction",
@@ -2548,7 +2548,7 @@ test("chunked offline sync scans oversized frontmatter before locking its identi
2548
2548
  const memory = (await storage.readAllMemories()).find((candidate) => candidate.frontmatter.id === result.id);
2549
2549
  assert.ok(memory);
2550
2550
 
2551
- const largeTags = Array.from({ length: 22_000 }, (_, index) => `"tag-${index}"`).join(", ");
2551
+ const largeTags = Array.from({ length: 100_000 }, (_, index) => `"tag-${index}"`).join(", ");
2552
2552
  const updatedFile = [
2553
2553
  "---",
2554
2554
  `id: ${memory.frontmatter.id}`,
@@ -2567,6 +2567,10 @@ test("chunked offline sync scans oversized frontmatter before locking its identi
2567
2567
  content,
2568
2568
  "",
2569
2569
  ].join("\n");
2570
+ assert.ok(
2571
+ updatedFile.indexOf("\n---\n") > 1_048_576,
2572
+ "the streamed body delimiter must appear after the chunk buffer limit",
2573
+ );
2570
2574
  const chunks = (async function* (): AsyncIterable<Buffer> {
2571
2575
  for (let offset = 0; offset < updatedFile.length; offset += 32 * 1024) {
2572
2576
  yield Buffer.from(updatedFile.slice(offset, offset + 32 * 1024), "utf8");
@@ -2651,7 +2655,7 @@ test("chunked offline sync encrypts oversized staging files when secure storage
2651
2655
  semanticThreshold: 0.9,
2652
2656
  namespace: "default",
2653
2657
  });
2654
- const content = `Oversized encrypted staging content ${"x".repeat(1_048_576)}`;
2658
+ const content = "Oversized encrypted staging content";
2655
2659
  const tombstoneId = await storage.appendTombstone({
2656
2660
  reason: "correction",
2657
2661
  createdBy: "user_correction",
@@ -2666,6 +2670,7 @@ test("chunked offline sync encrypts oversized staging files when secure storage
2666
2670
  assert.equal(result.tombstoneBlocked, true);
2667
2671
  const memory = (await storage.readAllMemories()).find((candidate) => candidate.frontmatter.id === result.id);
2668
2672
  assert.ok(memory);
2673
+ const largeTags = Array.from({ length: 100_000 }, (_, index) => `"tag-${index}"`).join(", ");
2669
2674
 
2670
2675
  const incomingFile = [
2671
2676
  "---",
@@ -2676,7 +2681,7 @@ test("chunked offline sync encrypts oversized staging files when secure storage
2676
2681
  `source: ${memory.frontmatter.source}`,
2677
2682
  `confidence: ${memory.frontmatter.confidence}`,
2678
2683
  `confidenceTier: ${memory.frontmatter.confidenceTier}`,
2679
- "tags: []",
2684
+ `tags: [${largeTags}]`,
2680
2685
  "sourceConnector: provider-a",
2681
2686
  "status: pending_review",
2682
2687
  `blockedBy: ${memory.frontmatter.blockedBy}`,
@@ -2685,6 +2690,7 @@ test("chunked offline sync encrypts oversized staging files when secure storage
2685
2690
  content,
2686
2691
  "",
2687
2692
  ].join("\n");
2693
+ assert.ok(incomingFile.length > 1_048_576, "the encrypted staging fixture must exceed the chunk buffer limit");
2688
2694
  const chunks = (async function* (): AsyncIterable<Buffer> {
2689
2695
  for (let offset = 0; offset < incomingFile.length; offset += 32 * 1024) {
2690
2696
  yield Buffer.from(incomingFile.slice(offset, offset + 32 * 1024), "utf8");
@@ -2960,7 +2966,8 @@ test("large blocked offline sync streams through bounded staging and deduplicate
2960
2966
  semanticThreshold: 0.9,
2961
2967
  namespace: "default",
2962
2968
  });
2963
- const largeContent = "large stream duplicate ".repeat(60_000);
2969
+ const largeContent = "large stream duplicate";
2970
+ const largeTags = Array.from({ length: 100_000 }, (_, index) => `"tag-${index}"`).join(", ");
2964
2971
  const tombstoneId = await storage.appendTombstone({
2965
2972
  reason: "correction",
2966
2973
  createdBy: "user_correction",
@@ -2983,7 +2990,7 @@ test("large blocked offline sync streams through bounded staging and deduplicate
2983
2990
  "source: offline-sync",
2984
2991
  "confidence: 0.8",
2985
2992
  "confidenceTier: implied",
2986
- "tags: []",
2993
+ `tags: [${largeTags}]`,
2987
2994
  "sourceConnector: provider-a",
2988
2995
  "status: pending_review",
2989
2996
  `blockedBy: ${tombstoneId}`,
package/src/storage.ts CHANGED
@@ -18,6 +18,7 @@ import { createHash, randomUUID } from "node:crypto";
18
18
  import { normalizeContent, computeContentHash } from "./content-hash.js";
19
19
  import path from "node:path";
20
20
  import { log } from "./logger.js";
21
+ import { createMemorySnapshot } from "./memory-snapshot.js";
21
22
  import { assertMemoryFrontmatterId, warnProjectionFallback } from "./storage-guards.js";
22
23
  import { MemoryReadStore } from "./storage/memory-read-store.js";
23
24
  import { renderProfileWithLastUpdated } from "./storage/profile-header.js";
@@ -1779,6 +1780,7 @@ export class StorageManager extends TombstoneBlockedCaptureIndexHost {
1779
1780
  private knowledgeIndexCache: { result: string; builtAt: number } | null = null;
1780
1781
  private artifactIndexCache: { memories: MemoryFile[]; loadedAtMs: number; writeVersion: number } | null = null;
1781
1782
  private projectionLedgerLagManager = new ProjectionLedgerLagManager();
1783
+ private static readonly loadedMemorySnapshots = new WeakMap<MemoryFile, string>();
1782
1784
  static readonly KNOWLEDGE_INDEX_CACHE_TTL_MS = 600_000; // 10 minutes (entity mutations invalidate)
1783
1785
  /** Read by storage/memory-read-store.ts (decomposition). */
1784
1786
  static readonly ARTIFACT_INDEX_CACHE_TTL_MS = 60_000; // 1 minute
@@ -4504,13 +4506,19 @@ export class StorageManager extends TombstoneBlockedCaptureIndexHost {
4504
4506
  return lineCount > threshold;
4505
4507
  }
4506
4508
 
4509
+ private rememberMemorySnapshot<T extends MemoryFile | null>(memory: T): T {
4510
+ if (memory !== null && !StorageManager.loadedMemorySnapshots.has(memory)) {
4511
+ StorageManager.loadedMemorySnapshots.set(memory, createMemorySnapshot(memory));
4512
+ }
4513
+ return memory;
4514
+ }
4515
+
4516
+ private rememberMemorySnapshots(memories: MemoryFile[]): MemoryFile[] {
4517
+ for (const memory of memories) this.rememberMemorySnapshot(memory);
4518
+ return memories;
4519
+ }
4520
+
4507
4521
  async readAllMemories(): Promise<MemoryFile[]> {
4508
- // Version-keyed hot-memories cache (issue #1902): once populated, serve the
4509
- // full parsed corpus from memory within a version epoch. getCachedMemories
4510
- // returns null when the sentinel is 0 (fresh/test dirs) or the stored
4511
- // version differs from the current on-disk sentinel (a peer or local write
4512
- // bumped it), so a stale entry is never served — the miss falls through to
4513
- // a fresh disk scan below.
4514
4522
  if (this.hotMemoriesCacheEnabled) {
4515
4523
  const cached = getCachedMemories(
4516
4524
  this.baseDir,
@@ -4518,13 +4526,8 @@ export class StorageManager extends TombstoneBlockedCaptureIndexHost {
4518
4526
  this.hotCacheKeyId(),
4519
4527
  this.hotCacheTtlMs()
4520
4528
  );
4521
- // Null-check, not truthiness (kilo WARNING): getCachedMemories returns []
4522
- // for a cached EMPTY corpus, which is falsy — a truthiness guard would
4523
- // force a full disk scan on every read of an empty/near-empty store.
4524
- if (cached !== null) return cached;
4529
+ if (cached !== null) return this.rememberMemorySnapshots(cached);
4525
4530
  }
4526
- // Deduplicate concurrent reads for the same directory so multiple
4527
- // callers in the same recall share one disk scan.
4528
4531
  // Snapshot the secure-store key identity ONCE (issue #1902, Codex Medium):
4529
4532
  // hotCacheKeyId() can change mid-scan if setSecureStoreKey(null/other) runs
4530
4533
  // during the await. Recomputing it at publish time would store K-decrypted
@@ -4534,13 +4537,9 @@ export class StorageManager extends TombstoneBlockedCaptureIndexHost {
4534
4537
  // key change can't orphan the slot registered under the old identity.
4535
4538
  const keyId = this.hotCacheKeyId();
4536
4539
  const inFlight = getInFlightRead(this.baseDir, keyId);
4537
- if (inFlight) return inFlight;
4540
+ if (inFlight) return this.rememberMemorySnapshots(await inFlight);
4538
4541
 
4539
4542
  const readPromise = (async (): Promise<MemoryFile[]> => {
4540
- // Capture the version BEFORE the scan and store under it. If a concurrent
4541
- // bump (peer or local write) lands during the scan, the stored entry's
4542
- // version is older than the sentinel, so the next getCachedMemories()
4543
- // rejects it (version mismatch → rescan) — correct, never stale.
4544
4543
  const version = this.getMemoryCorpusVersion();
4545
4544
  const memories = await this._readAllMemoriesFromDisk();
4546
4545
  // Publish only if neither the corpus version NOR the key identity changed
@@ -4554,11 +4553,8 @@ export class StorageManager extends TombstoneBlockedCaptureIndexHost {
4554
4553
  })();
4555
4554
  setInFlightRead(this.baseDir, keyId, readPromise);
4556
4555
  try {
4557
- return await readPromise;
4556
+ return this.rememberMemorySnapshots(await readPromise);
4558
4557
  } finally {
4559
- // Only delete if we still own the slot for our snapshot key identity —
4560
- // invalidateAllMemoriesCache() may have already cleared it and a new read
4561
- // may have claimed it (the expected-promise guard enforces owner-only).
4562
4558
  deleteInFlightRead(this.baseDir, keyId, readPromise);
4563
4559
  }
4564
4560
  }
@@ -4993,7 +4989,7 @@ export class StorageManager extends TombstoneBlockedCaptureIndexHost {
4993
4989
  }
4994
4990
 
4995
4991
  async readAllColdMemories(): Promise<MemoryFile[]> {
4996
- return this.memoryReadStore.readAllColdMemories();
4992
+ return this.rememberMemorySnapshots(await this.memoryReadStore.readAllColdMemories());
4997
4993
  }
4998
4994
 
4999
4995
  /**
@@ -5045,11 +5041,11 @@ export class StorageManager extends TombstoneBlockedCaptureIndexHost {
5045
5041
  };
5046
5042
 
5047
5043
  await readDir(root);
5048
- return memories;
5044
+ return this.rememberMemorySnapshots(memories);
5049
5045
  }
5050
5046
 
5051
5047
  async readMemoryByPath(filePath: string): Promise<MemoryFile | null> {
5052
- return this.memoryReadStore.readMemoryByPath(filePath);
5048
+ return this.rememberMemorySnapshot(await this.memoryReadStore.readMemoryByPath(filePath));
5053
5049
  }
5054
5050
 
5055
5051
  private resolveTierRootDir(tier: "hot" | "cold"): string {
@@ -5077,12 +5073,6 @@ export class StorageManager extends TombstoneBlockedCaptureIndexHost {
5077
5073
  // corrections/ is flat (no date subdir); preserved across tier moves.
5078
5074
  return path.join(root, "corrections", `${memory.frontmatter.id}.md`);
5079
5075
  }
5080
- // Every other category — decisions/, preferences/, reasoning-traces/, ...
5081
- // plus the facts/ fallback for fact/entity/unknown — resolves through the
5082
- // shared categoryDirName() chokepoint so tier moves land in the SAME dir the
5083
- // writer used, instead of funneling non-{correction,procedure,reasoning_trace}
5084
- // categories into facts/ (issue #564 PR 3 preserved reasoning-traces/; #1546
5085
- // generalizes it to every category dir).
5086
5076
  const dir = categoryDirName(memory.frontmatter.category);
5087
5077
  return path.join(root, dir, this.resolveMemoryDateDir(memory), `${memory.frontmatter.id}.md`);
5088
5078
  }
@@ -5137,14 +5127,24 @@ export class StorageManager extends TombstoneBlockedCaptureIndexHost {
5137
5127
  this.invalidateAllMemoriesCache();
5138
5128
  this.notifyCatalogWrite();
5139
5129
  }
5140
- async moveMemoryToPath(memory: MemoryFile, targetPath: string): Promise<void> {
5141
- await this.withTombstoneBlockedMemoryPathLock(
5130
+ async moveMemoryToPath(memory: MemoryFile, targetPath: string): Promise<boolean> {
5131
+ const changed = await this.withTombstoneBlockedMemoryPathLock(
5142
5132
  memory.path,
5143
5133
  async (current) => {
5134
+ const destination = await this.readMemoryByPath(targetPath);
5144
5135
  if (current?.frontmatter.id !== memory.frontmatter.id) {
5136
+ if (current === null && destination?.frontmatter.id === memory.frontmatter.id) return false;
5137
+ throw new Error(`memory ${memory.frontmatter.id} changed before its tier move`);
5138
+ }
5139
+ const callerSnapshot = StorageManager.loadedMemorySnapshots.get(memory);
5140
+ const currentSnapshot = createMemorySnapshot(current);
5141
+ if (
5142
+ callerSnapshot === undefined
5143
+ ? current.frontmatter.updated !== memory.frontmatter.updated
5144
+ : currentSnapshot !== callerSnapshot
5145
+ ) {
5145
5146
  throw new Error(`memory ${memory.frontmatter.id} changed before its tier move`);
5146
5147
  }
5147
- const destination = await this.readMemoryByPath(targetPath);
5148
5148
  const coordinate =
5149
5149
  tombstoneBlocked(current.frontmatter) ||
5150
5150
  isQueuedReviewMemory(current) ||
@@ -5152,26 +5152,26 @@ export class StorageManager extends TombstoneBlockedCaptureIndexHost {
5152
5152
  isQueuedReviewMemory(destination);
5153
5153
  const index = this.getTombstoneBlockedCaptureIndex();
5154
5154
  const marker = coordinate ? await index.prepareWrite() : undefined;
5155
+ const projectedPath = toMemoryPathRel(this.baseDir, targetPath);
5155
5156
  let durable = false;
5156
5157
  try {
5157
5158
  if (destination?.frontmatter.id === current.frontmatter.id) {
5158
5159
  await this.deleteManagedStorageFile(current.path);
5159
5160
  durable = true;
5160
5161
  this.invalidateAllMemoriesCache();
5161
- updateProjectedMemoryPath(this.baseDir, current.frontmatter.id, toMemoryPathRel(this.baseDir, targetPath));
5162
+ updateProjectedMemoryPath(this.baseDir, current.frontmatter.id, projectedPath);
5162
5163
  } else {
5163
5164
  await this.writeMemoryFileAtomic(targetPath, current);
5165
+ if (memory.frontmatter.entityRef !== current.frontmatter.entityRef) {
5166
+ memory.frontmatter.entityRef = current.frontmatter.entityRef;
5167
+ }
5164
5168
  durable = true;
5165
5169
  const sourcePath = path.resolve(current.path);
5166
5170
  const destPath = path.resolve(targetPath);
5167
5171
  if (sourcePath !== destPath) {
5168
5172
  await this.deleteManagedStorageFile(current.path);
5169
5173
  this.invalidateAllMemoriesCache();
5170
- updateProjectedMemoryPath(
5171
- this.baseDir,
5172
- current.frontmatter.id,
5173
- toMemoryPathRel(this.baseDir, targetPath)
5174
- );
5174
+ updateProjectedMemoryPath(this.baseDir, current.frontmatter.id, projectedPath);
5175
5175
  }
5176
5176
  }
5177
5177
  if (marker !== undefined) await this.rebuildTombstoneBlockedCaptureAfterInvalidation(marker);
@@ -5180,9 +5180,14 @@ export class StorageManager extends TombstoneBlockedCaptureIndexHost {
5180
5180
  if (marker !== undefined && durable) index.markUntrusted();
5181
5181
  throw error;
5182
5182
  }
5183
+ return true;
5183
5184
  },
5184
5185
  [targetPath]
5185
5186
  );
5187
+ if (this.isColdOrArchiveTierPath(memory.path) || this.isColdOrArchiveTierPath(targetPath)) {
5188
+ this.invalidateColdMemoriesCache();
5189
+ }
5190
+ return changed;
5186
5191
  }
5187
5192
 
5188
5193
  async migrateMemoryToTier(
@@ -5195,16 +5200,10 @@ export class StorageManager extends TombstoneBlockedCaptureIndexHost {
5195
5200
  if (sourcePath === destPath) {
5196
5201
  return { changed: false, targetPath };
5197
5202
  }
5198
-
5199
- await this.moveMemoryToPath(memory, targetPath);
5200
- this.invalidateAllMemoriesCache();
5201
- // If moving to cold, also invalidate the cold-scan cache so the next
5202
- // readAllColdMemories() call sees the newly-demoted file (Finding UOGi fix).
5203
- if (targetTier === "cold") {
5204
- this.invalidateColdMemoriesCache();
5205
- }
5203
+ const changed = await this.moveMemoryToPath(memory, targetPath);
5204
+ if (!changed) return { changed: false, targetPath };
5206
5205
  this.bumpMemoryStatusVersion();
5207
- return { changed: true, targetPath };
5206
+ return { changed, targetPath };
5208
5207
  }
5209
5208
 
5210
5209
  private get archiveDir(): string {
@@ -0,0 +1,75 @@
1
+ import assert from "node:assert/strict";
2
+
3
+ import { parseConfig } from "../../config.js";
4
+ import {
5
+ type FirstStartMigrationResult,
6
+ runFirstStartMigration,
7
+ } from "../../maintenance/first-start-migration.js";
8
+ import { StorageManager } from "../../storage.js";
9
+ import type { PluginConfig } from "../../types.js";
10
+ import { type LifecycleSubject, type MatrixRow, runLifecycleMatrix } from "../lifecycle-matrix.js";
11
+ import { cleanupDir, mkTempMemoryDir } from "../orchestrator-lite.js";
12
+
13
+ interface FirstStartTierMigrationState {
14
+ dir: string;
15
+ id: string;
16
+ storage: StorageManager;
17
+ config: PluginConfig;
18
+ result?: FirstStartMigrationResult;
19
+ }
20
+
21
+ const subject: LifecycleSubject<FirstStartTierMigrationState> = {
22
+ appliesTo(row: MatrixRow): boolean | string {
23
+ return row.id === "restart-reload-recovery"
24
+ ? true
25
+ : "first-start tier migration applies only to startup recovery";
26
+ },
27
+
28
+ async setup(row: MatrixRow): Promise<FirstStartTierMigrationState> {
29
+ const dir = await mkTempMemoryDir(`first-start-tier-${row.id}`);
30
+ try {
31
+ const storage = new StorageManager(dir);
32
+ await storage.ensureDirectories();
33
+ const { id } = await storage.writeMemory("fact", "old low-value fact", {
34
+ confidence: 0.01,
35
+ source: "test",
36
+ });
37
+ const memory = await storage.getMemoryById(id);
38
+ assert.ok(memory);
39
+ await storage.writeMemoryFrontmatter(memory, {
40
+ created: "2020-01-01T00:00:00.000Z",
41
+ updated: "2020-01-01T00:00:00.000Z",
42
+ });
43
+ const config = parseConfig({
44
+ openaiApiKey: "sk-test",
45
+ memoryDir: dir,
46
+ workspaceDir: dir,
47
+ qmdEnabled: false,
48
+ lifecyclePolicyEnabled: true,
49
+ qmdTierMigrationEnabled: true,
50
+ qmdTierDemotionMinAgeDays: 1,
51
+ qmdTierDemotionValueThreshold: 0.99,
52
+ });
53
+ return { dir, id, storage: new StorageManager(dir), config };
54
+ } catch (error) {
55
+ await cleanupDir(dir);
56
+ throw error;
57
+ }
58
+ },
59
+
60
+ async exercise(state: FirstStartTierMigrationState): Promise<void> {
61
+ state.result = await runFirstStartMigration({ storage: state.storage, config: state.config });
62
+ },
63
+
64
+ async invariants(state: FirstStartTierMigrationState): Promise<void> {
65
+ assert.equal(state.result?.demotedCount, 1);
66
+ assert.ok((await state.storage.readAllColdMemories()).some((memory) => memory.frontmatter.id === state.id));
67
+ assert.ok(!(await state.storage.readAllMemories()).some((memory) => memory.frontmatter.id === state.id));
68
+ },
69
+
70
+ async teardown(state: FirstStartTierMigrationState): Promise<void> {
71
+ await cleanupDir(state.dir);
72
+ },
73
+ };
74
+
75
+ runLifecycleMatrix("first-start-tier-migration", subject);