@remnic/core 10.0.3 → 10.0.5

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 (410) hide show
  1. package/dist/access-admin-ops-surface.js +62 -62
  2. package/dist/access-authorization-probe.js +63 -63
  3. package/dist/access-boundary.js +62 -62
  4. package/dist/access-cli.d.ts.map +1 -1
  5. package/dist/access-cli.js +146 -139
  6. package/dist/access-cli.js.map +1 -1
  7. package/dist/access-extraction-force-flush.js +62 -62
  8. package/dist/access-http-briefing.js +63 -63
  9. package/dist/access-http-query.js +64 -64
  10. package/dist/access-http.d.ts.map +1 -1
  11. package/dist/access-http.js +86 -85
  12. package/dist/access-identity-continuity-surface.js +62 -62
  13. package/dist/access-lcm-surface.js +62 -62
  14. package/dist/access-mcp-correction-tools.d.ts +10 -0
  15. package/dist/access-mcp-correction-tools.d.ts.map +1 -0
  16. package/dist/access-mcp-correction-tools.js +8 -0
  17. package/dist/access-mcp.d.ts.map +1 -1
  18. package/dist/access-mcp.js +76 -75
  19. package/dist/access-namespace-preflight.js +62 -62
  20. package/dist/access-observe-write-category.js +5 -5
  21. package/dist/access-observe-write-surface.js +62 -62
  22. package/dist/access-offline-manifest.js +8 -8
  23. package/dist/access-operations-batch.js +65 -65
  24. package/dist/access-operations.d.ts +1 -0
  25. package/dist/access-operations.d.ts.map +1 -1
  26. package/dist/access-operations.js +72 -72
  27. package/dist/access-recall-concurrency.js +62 -62
  28. package/dist/access-recall-diagnostics.js +2 -2
  29. package/dist/access-recall-response.js +62 -62
  30. package/dist/access-recall-surface.js +62 -62
  31. package/dist/access-service.d.ts.map +1 -1
  32. package/dist/access-service.js +62 -62
  33. package/dist/access-surface-catalog.js +64 -64
  34. package/dist/active-recall.js +31 -30
  35. package/dist/active-recall.js.map +1 -1
  36. package/dist/adapters/index.js +7 -7
  37. package/dist/adapters/registry.js +3 -3
  38. package/dist/{auto-sync-PAWBFQWL.js → auto-sync-FN7E3OTO.js} +6 -6
  39. package/dist/briefing.js +26 -26
  40. package/dist/buffer.js +8 -8
  41. package/dist/causal-consolidation.js +26 -26
  42. package/dist/{chunk-YQSWNFZE.js → chunk-2CP577K6.js} +2 -2
  43. package/dist/{chunk-6JIHC5AS.js → chunk-37HCPM56.js} +78 -67
  44. package/dist/chunk-37HCPM56.js.map +1 -0
  45. package/dist/{chunk-345MEMRU.js → chunk-3OUGSOJP.js} +2 -2
  46. package/dist/{chunk-CHI37EHP.js → chunk-4CWUZBPF.js} +8 -6
  47. package/dist/chunk-4CWUZBPF.js.map +1 -0
  48. package/dist/{chunk-G2STTRYB.js → chunk-4D2YH47Z.js} +2 -2
  49. package/dist/{chunk-IXYIW3MZ.js → chunk-4K2H4KTR.js} +5 -5
  50. package/dist/{chunk-UVVSOSHL.js → chunk-52CQKST6.js} +53 -53
  51. package/dist/{chunk-H7BZBSP6.js → chunk-52II7PB6.js} +4 -4
  52. package/dist/{chunk-BLHPADUX.js → chunk-5BPXMAUP.js} +22 -78
  53. package/dist/chunk-5BPXMAUP.js.map +1 -0
  54. package/dist/{chunk-ZS7RK6H6.js → chunk-5BY3IA2U.js} +16 -53
  55. package/dist/chunk-5BY3IA2U.js.map +1 -0
  56. package/dist/{chunk-2QZFZNXO.js → chunk-5CQO6LVM.js} +2 -2
  57. package/dist/{chunk-NLDMTXWV.js → chunk-5LNPW7NE.js} +2 -2
  58. package/dist/{chunk-WHTMVTU4.js → chunk-5X4ZJESN.js} +2 -2
  59. package/dist/{chunk-WI37MWRZ.js → chunk-63UNVGZW.js} +5 -5
  60. package/dist/{chunk-G3T6YMBO.js → chunk-64S6X4IU.js} +7 -7
  61. package/dist/{chunk-CFCEJNOE.js → chunk-6KHF6PAB.js} +2 -2
  62. package/dist/{chunk-5GINB5LC.js → chunk-6MKLMEBE.js} +1 -1
  63. package/dist/{chunk-5GINB5LC.js.map → chunk-6MKLMEBE.js.map} +1 -1
  64. package/dist/{chunk-35A7GCHG.js → chunk-6T42L5FI.js} +2 -2
  65. package/dist/{chunk-JDOBIFBK.js → chunk-7CXL25AA.js} +2 -2
  66. package/dist/{chunk-YLBE6PLR.js → chunk-7IGMKQWK.js} +2 -2
  67. package/dist/{chunk-CSLK7BN6.js → chunk-7LYRFI5A.js} +2 -2
  68. package/dist/{chunk-IB63OVUB.js → chunk-AJ6ORARY.js} +6 -6
  69. package/dist/{chunk-CGOKNQDK.js → chunk-ANZXWOYD.js} +2 -2
  70. package/dist/{chunk-5QXMESS7.js → chunk-AXC7UTLM.js} +2 -2
  71. package/dist/{chunk-RFIJRZ4K.js → chunk-B657ZGDH.js} +2 -2
  72. package/dist/{chunk-AW4QUFQF.js → chunk-BTNNL7ZW.js} +3 -2
  73. package/dist/{chunk-AW4QUFQF.js.map → chunk-BTNNL7ZW.js.map} +1 -1
  74. package/dist/{chunk-MY7B3HYC.js → chunk-CLCMDKTB.js} +2 -2
  75. package/dist/{chunk-QPWUG2S3.js → chunk-CYEK6Z3P.js} +4 -4
  76. package/dist/{chunk-IHCYCE6D.js → chunk-DJMVSUPK.js} +4 -4
  77. package/dist/{chunk-HP4CU2ZA.js → chunk-DST7HRSG.js} +2 -2
  78. package/dist/{chunk-IIFFC3RL.js → chunk-EDR6CVWZ.js} +2 -2
  79. package/dist/{chunk-AUWMKDKL.js → chunk-EMVJU7WC.js} +2 -2
  80. package/dist/{chunk-O6AYMAPJ.js → chunk-ENNC3RZ6.js} +2 -2
  81. package/dist/{chunk-2JRB3Z5N.js → chunk-EP5WXE2G.js} +3 -3
  82. package/dist/{chunk-QLK3SL7Q.js → chunk-ETSJD5IV.js} +131 -12
  83. package/dist/chunk-ETSJD5IV.js.map +1 -0
  84. package/dist/chunk-EWMRFW3F.js +38 -0
  85. package/dist/chunk-EWMRFW3F.js.map +1 -0
  86. package/dist/{chunk-I2KEH2LS.js → chunk-FC6RCOIU.js} +2 -2
  87. package/dist/{chunk-OZVHLBH6.js → chunk-FLV7M7CT.js} +2 -2
  88. package/dist/{chunk-Q6GI7HEC.js → chunk-FRH2UC7Q.js} +2 -2
  89. package/dist/{chunk-3SL52JKD.js → chunk-FZVROZKC.js} +5 -5
  90. package/dist/{chunk-2EZB2DL5.js → chunk-GE6HETIF.js} +3 -3
  91. package/dist/{chunk-2DHJTJIY.js → chunk-GEGUBU3D.js} +2 -2
  92. package/dist/{chunk-6AA7XFMO.js → chunk-GF4H3B3R.js} +8 -8
  93. package/dist/{chunk-NGOZH7R5.js → chunk-GVUW5XK5.js} +311 -142
  94. package/dist/chunk-GVUW5XK5.js.map +1 -0
  95. package/dist/{chunk-ME2LMFHF.js → chunk-HPAOMYKM.js} +92 -92
  96. package/dist/{chunk-4NRZ7BRS.js → chunk-I25RINZK.js} +2 -2
  97. package/dist/{chunk-XG4XXI66.js → chunk-I25RQA65.js} +2 -2
  98. package/dist/chunk-I56MTWE7.js +80 -0
  99. package/dist/chunk-I56MTWE7.js.map +1 -0
  100. package/dist/{chunk-EJJMDLVB.js → chunk-IJ4FEGZR.js} +2 -2
  101. package/dist/{chunk-EUL3S3LE.js → chunk-J5WI4QRP.js} +4 -4
  102. package/dist/{chunk-LMMC55WM.js → chunk-JA54KIYD.js} +4 -4
  103. package/dist/{chunk-5FLFPTDK.js → chunk-JA72X46J.js} +2 -2
  104. package/dist/{chunk-6GU3TNJJ.js → chunk-JMF5Q4JY.js} +246 -49
  105. package/dist/chunk-JMF5Q4JY.js.map +1 -0
  106. package/dist/{chunk-IDSSDL4W.js → chunk-JXSYWTFK.js} +21 -4
  107. package/dist/{chunk-IDSSDL4W.js.map → chunk-JXSYWTFK.js.map} +1 -1
  108. package/dist/{chunk-NLYOOGZ7.js → chunk-KE5PWLI6.js} +3 -3
  109. package/dist/chunk-KIUVEMBI.js +49 -0
  110. package/dist/chunk-KIUVEMBI.js.map +1 -0
  111. package/dist/{chunk-4DDIWRT7.js → chunk-KQI2PKYP.js} +2 -2
  112. package/dist/{chunk-Y2ADLCB3.js → chunk-KSUOM3YU.js} +9 -9
  113. package/dist/{chunk-BTOHGPHC.js → chunk-KZEMFD6E.js} +3 -3
  114. package/dist/{chunk-NXVD46HT.js → chunk-L2VS27PZ.js} +4 -4
  115. package/dist/{chunk-MYYHACOW.js → chunk-L34W4W4I.js} +2 -2
  116. package/dist/{chunk-KRTIHXWC.js → chunk-L3PWXD73.js} +2 -2
  117. package/dist/{chunk-NQHSXHJP.js → chunk-L6GNS5GB.js} +2 -2
  118. package/dist/{chunk-44PBRUXB.js → chunk-M47Q6566.js} +2 -2
  119. package/dist/{chunk-E7FN5N5E.js → chunk-MQNOIH2C.js} +7 -7
  120. package/dist/{chunk-IDSZNHIP.js → chunk-MULNBSPP.js} +4 -4
  121. package/dist/{chunk-RKSGUMVL.js → chunk-NBQIFCJE.js} +2 -2
  122. package/dist/{chunk-I6WFBNA4.js → chunk-NHSVW7UT.js} +15 -15
  123. package/dist/{chunk-32HO62I4.js → chunk-OFEHITAZ.js} +2 -2
  124. package/dist/{chunk-PCO3P7WJ.js → chunk-OGVJXIHX.js} +2 -2
  125. package/dist/{chunk-RYN4AIRM.js → chunk-OZABSIOV.js} +4 -4
  126. package/dist/{chunk-HO7IQP7G.js → chunk-QMFKW4OU.js} +3 -3
  127. package/dist/{chunk-34G4U6HS.js → chunk-QRZMJ2WN.js} +2 -2
  128. package/dist/{chunk-RKDSELA3.js → chunk-QWWMS4AE.js} +1 -1
  129. package/dist/chunk-QWWMS4AE.js.map +1 -0
  130. package/dist/{chunk-GUD6FYQG.js → chunk-RSMIRLKM.js} +2 -2
  131. package/dist/{chunk-TNVZCLJU.js → chunk-S5TGRZWY.js} +2 -2
  132. package/dist/{chunk-O24EWFPQ.js → chunk-SNXBXYUE.js} +3 -3
  133. package/dist/{chunk-KW77LGDX.js → chunk-SUAX5JWY.js} +2 -2
  134. package/dist/{chunk-PNFWIB4X.js → chunk-SWRN6U7Q.js} +2 -2
  135. package/dist/{chunk-X6X4UASX.js → chunk-SZXPKUMN.js} +232 -83
  136. package/dist/chunk-SZXPKUMN.js.map +1 -0
  137. package/dist/{chunk-R4NGLTUS.js → chunk-TDMNADPI.js} +2 -2
  138. package/dist/{chunk-QCP75JGO.js → chunk-TFA6HPOA.js} +5 -5
  139. package/dist/{chunk-LI76ESJL.js → chunk-TZQOCQXB.js} +2 -2
  140. package/dist/{chunk-OV7EYM6M.js → chunk-U6OXJQEH.js} +12 -12
  141. package/dist/{chunk-OWHPA4JS.js → chunk-V32NHP2R.js} +2 -2
  142. package/dist/{chunk-JSUA4YFE.js → chunk-WG4TMZJ2.js} +2 -2
  143. package/dist/{chunk-DQTCGVFK.js → chunk-WHCD4Z3D.js} +2 -2
  144. package/dist/{chunk-GBA4N2SG.js → chunk-WRICYGYG.js} +27 -26
  145. package/dist/chunk-WRICYGYG.js.map +1 -0
  146. package/dist/{chunk-KATEWTQJ.js → chunk-X7J56GPG.js} +2 -2
  147. package/dist/{chunk-7KICGR5W.js → chunk-XPRAOTJY.js} +2 -2
  148. package/dist/{chunk-2NV7MMMM.js → chunk-XQSJXNWC.js} +2 -2
  149. package/dist/{chunk-22DYJLFN.js → chunk-XVC7JU2N.js} +39 -18
  150. package/dist/chunk-XVC7JU2N.js.map +1 -0
  151. package/dist/{chunk-RXT6UB25.js → chunk-YJAOYEWI.js} +2 -2
  152. package/dist/{chunk-L6DJJEFW.js → chunk-YJEUHGZZ.js} +2 -2
  153. package/dist/{chunk-AXFWMRKI.js → chunk-YQJCWR4R.js} +2 -2
  154. package/dist/cli.js +110 -108
  155. package/dist/coding/export-okf-codegraph.js +25 -25
  156. package/dist/compounding/engine.js +25 -25
  157. package/dist/config.d.ts.map +1 -1
  158. package/dist/config.js +31 -30
  159. package/dist/connectors/codex-materialize-runner.js +25 -25
  160. package/dist/connectors/index.js +25 -25
  161. package/dist/consolidation-provenance-check.js +2 -2
  162. package/dist/contradiction/index.js +7 -7
  163. package/dist/convergence-refresh.js +27 -27
  164. package/dist/conversation-index/backend.js +2 -2
  165. package/dist/corpus-read-cancellation.d.ts +7 -0
  166. package/dist/corpus-read-cancellation.d.ts.map +1 -1
  167. package/dist/corpus-read-cancellation.js +1 -1
  168. package/dist/corpus-watermark.js +27 -27
  169. package/dist/correction/correction-access-wiring.d.ts +6 -6
  170. package/dist/correction/correction-access-wiring.d.ts.map +1 -1
  171. package/dist/correction/correction-classify.d.ts +25 -0
  172. package/dist/correction/correction-classify.d.ts.map +1 -0
  173. package/dist/correction/correction-config.d.ts +11 -0
  174. package/dist/correction/correction-config.d.ts.map +1 -0
  175. package/dist/correction/correction-contract.d.ts +13 -1
  176. package/dist/correction/correction-contract.d.ts.map +1 -1
  177. package/dist/correction/correction-executor.d.ts +2 -0
  178. package/dist/correction/correction-executor.d.ts.map +1 -1
  179. package/dist/correction/correction-planner.d.ts +24 -3
  180. package/dist/correction/correction-planner.d.ts.map +1 -1
  181. package/dist/directory-sidecars.js +2 -2
  182. package/dist/entity-retrieval.js +25 -25
  183. package/dist/event-order-recall.js +2 -2
  184. package/dist/explicit-capture.js +2 -2
  185. package/dist/external-wiki-access.js +63 -63
  186. package/dist/extraction-span-materialize.js +2 -2
  187. package/dist/extraction.js +34 -34
  188. package/dist/harmonic-retrieval.js +25 -25
  189. package/dist/index.js +221 -218
  190. package/dist/lcm/index.js +3 -3
  191. package/dist/local-llm.d.ts.map +1 -1
  192. package/dist/local-llm.js +1 -1
  193. package/dist/location/index.js +28 -28
  194. package/dist/maintenance/archive-observations.js +2 -2
  195. package/dist/maintenance/atomic-file.d.ts +1 -1
  196. package/dist/maintenance/atomic-file.d.ts.map +1 -1
  197. package/dist/maintenance/atomic-file.js +1 -1
  198. package/dist/maintenance/memory-governance.js +25 -25
  199. package/dist/maintenance/migrate-observations.js +3 -3
  200. package/dist/maintenance/observation-ledger-utils.js +2 -2
  201. package/dist/maintenance/projection-rebuild-abort.d.ts +17 -0
  202. package/dist/maintenance/projection-rebuild-abort.d.ts.map +1 -0
  203. package/dist/maintenance/projection-timeline.d.ts +19 -0
  204. package/dist/maintenance/projection-timeline.d.ts.map +1 -0
  205. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +25 -25
  206. package/dist/maintenance/rebuild-memory-projection-runner.d.ts +8 -0
  207. package/dist/maintenance/rebuild-memory-projection-runner.d.ts.map +1 -0
  208. package/dist/maintenance/rebuild-memory-projection-runner.js +113 -0
  209. package/dist/maintenance/rebuild-memory-projection-runner.js.map +1 -0
  210. package/dist/maintenance/rebuild-memory-projection.d.ts +8 -0
  211. package/dist/maintenance/rebuild-memory-projection.d.ts.map +1 -1
  212. package/dist/maintenance/rebuild-memory-projection.js +26 -26
  213. package/dist/maintenance/rebuild-observations.js +3 -3
  214. package/dist/memory-browse-operations.js +63 -63
  215. package/dist/memory-browse.js +7 -7
  216. package/dist/memory-subject.js +1 -1
  217. package/dist/namespaces/migrate.js +26 -26
  218. package/dist/namespaces/search.js +10 -10
  219. package/dist/namespaces/storage.js +25 -25
  220. package/dist/offline-sync-impression-drain.js +3 -3
  221. package/dist/operator-doctor-corpus.js +28 -28
  222. package/dist/operator-toolkit.js +41 -40
  223. package/dist/orchestration/full-corpus-heap-guard.d.ts +25 -0
  224. package/dist/orchestration/full-corpus-heap-guard.d.ts.map +1 -0
  225. package/dist/orchestration/maintenance.d.ts.map +1 -1
  226. package/dist/orchestration/maintenance.js +38 -36
  227. package/dist/orchestration/projection-rebuild-schedule.d.ts +40 -0
  228. package/dist/orchestration/projection-rebuild-schedule.d.ts.map +1 -1
  229. package/dist/orchestration/session-context.d.ts.map +1 -1
  230. package/dist/orchestrator.js +142 -139
  231. package/dist/projection-rebuild-config.d.ts +52 -0
  232. package/dist/projection-rebuild-config.d.ts.map +1 -0
  233. package/dist/projection-rebuild-config.js +14 -0
  234. package/dist/projection-rebuild-config.js.map +1 -0
  235. package/dist/qmd.js +4 -4
  236. package/dist/recall-explain-renderer.js +3 -3
  237. package/dist/recall-navigate-access.js +2 -2
  238. package/dist/recall-navigate-disclosure.js +2 -2
  239. package/dist/recall-navigate.js +2 -2
  240. package/dist/recall-navigation-operations.js +63 -63
  241. package/dist/recall-navigation.js +62 -62
  242. package/dist/recall-state-view-admission.js +7 -7
  243. package/dist/recall-state.js +2 -2
  244. package/dist/recall-why-service.js +8 -8
  245. package/dist/recall-xray-cli.js +4 -4
  246. package/dist/recall-xray-renderer.js +3 -3
  247. package/dist/recall-xray.js +2 -2
  248. package/dist/reconcile/manifest.js +3 -3
  249. package/dist/relevance.js +2 -2
  250. package/dist/{resolution-RSG4HZTL.js → resolution-TV3F7ZTH.js} +7 -7
  251. package/dist/resolution-TV3F7ZTH.js.map +1 -0
  252. package/dist/resume-bundles.js +32 -31
  253. package/dist/salvage-envelope.js +1 -1
  254. package/dist/search/factory.js +9 -9
  255. package/dist/search/index.js +17 -17
  256. package/dist/semantic-consolidation.js +31 -31
  257. package/dist/semantic-rule-promotion.js +25 -25
  258. package/dist/semantic-rule-verifier.js +25 -25
  259. package/dist/source-agent-qualifier.js +29 -29
  260. package/dist/standup/build.js +25 -25
  261. package/dist/storage/memory-lifecycle-ledger-access.d.ts +5 -3
  262. package/dist/storage/memory-lifecycle-ledger-access.d.ts.map +1 -1
  263. package/dist/storage/memory-read-store.d.ts +2 -2
  264. package/dist/storage/memory-read-store.d.ts.map +1 -1
  265. package/dist/storage.d.ts +4 -2
  266. package/dist/storage.d.ts.map +1 -1
  267. package/dist/storage.js +24 -24
  268. package/dist/subject-config.js +1 -1
  269. package/dist/summarizer.js +3 -3
  270. package/dist/support-passport/index.js +78 -78
  271. package/dist/transfer/export-okf.js +26 -26
  272. package/dist/types.d.ts +8 -40
  273. package/dist/types.d.ts.map +1 -1
  274. package/dist/types.js +1 -1
  275. package/dist/verified-recall.js +25 -25
  276. package/dist/who-knows-cli.js +26 -26
  277. package/dist/who-knows.js +25 -25
  278. package/dist/write-envelope.js +1 -1
  279. package/package.json +2 -2
  280. package/src/access-cli.ts +4 -0
  281. package/src/access-http.ts +1 -0
  282. package/src/access-mcp-correction-tools.ts +56 -0
  283. package/src/access-mcp.ts +4 -49
  284. package/src/access-operations.ts +3 -0
  285. package/src/access-service.ts +12 -21
  286. package/src/config.test.ts +35 -0
  287. package/src/config.ts +6 -65
  288. package/src/corpus-read-cancellation.ts +7 -0
  289. package/src/correction/correction-access-wiring.ts +56 -16
  290. package/src/correction/correction-classify.test.ts +185 -0
  291. package/src/correction/correction-classify.ts +157 -0
  292. package/src/correction/correction-config.ts +93 -0
  293. package/src/correction/correction-contract.ts +61 -14
  294. package/src/correction/correction-executor.test.ts +102 -2
  295. package/src/correction/correction-executor.ts +19 -1
  296. package/src/correction/correction-planner.test.ts +141 -0
  297. package/src/correction/correction-planner.ts +117 -11
  298. package/src/correction/correction-surfaces.test.ts +22 -1
  299. package/src/local-llm-qos.test.ts +36 -0
  300. package/src/local-llm.ts +20 -3
  301. package/src/maintenance/atomic-file.ts +2 -0
  302. package/src/maintenance/projection-rebuild-abort.ts +40 -0
  303. package/src/maintenance/projection-timeline.ts +209 -0
  304. package/src/maintenance/rebuild-memory-projection-runner.ts +94 -0
  305. package/src/maintenance/rebuild-memory-projection.memory.test.ts +159 -0
  306. package/src/maintenance/rebuild-memory-projection.retain-raw.test.ts +202 -0
  307. package/src/maintenance/rebuild-memory-projection.ts +63 -91
  308. package/src/orchestration/full-corpus-heap-guard.ts +38 -0
  309. package/src/orchestration/maintenance.test.ts +2 -2
  310. package/src/orchestration/maintenance.ts +2 -0
  311. package/src/orchestration/projection-rebuild-schedule.test.ts +498 -0
  312. package/src/orchestration/projection-rebuild-schedule.ts +280 -9
  313. package/src/orchestration/session-context.ts +0 -15
  314. package/src/projection-rebuild-config.ts +82 -0
  315. package/src/recall-handles-wiring.test.ts +24 -0
  316. package/src/storage/memory-lifecycle-ledger-access.ts +61 -33
  317. package/src/storage/memory-read-store.ts +10 -4
  318. package/src/storage.ts +45 -33
  319. package/src/types.ts +8 -41
  320. package/dist/chunk-22DYJLFN.js.map +0 -1
  321. package/dist/chunk-6GU3TNJJ.js.map +0 -1
  322. package/dist/chunk-6JIHC5AS.js.map +0 -1
  323. package/dist/chunk-BLHPADUX.js.map +0 -1
  324. package/dist/chunk-CHI37EHP.js.map +0 -1
  325. package/dist/chunk-GBA4N2SG.js.map +0 -1
  326. package/dist/chunk-NGOZH7R5.js.map +0 -1
  327. package/dist/chunk-QLK3SL7Q.js.map +0 -1
  328. package/dist/chunk-RKDSELA3.js.map +0 -1
  329. package/dist/chunk-X6X4UASX.js.map +0 -1
  330. package/dist/chunk-ZS7RK6H6.js.map +0 -1
  331. /package/dist/{resolution-RSG4HZTL.js.map → access-mcp-correction-tools.js.map} +0 -0
  332. /package/dist/{auto-sync-PAWBFQWL.js.map → auto-sync-FN7E3OTO.js.map} +0 -0
  333. /package/dist/{chunk-YQSWNFZE.js.map → chunk-2CP577K6.js.map} +0 -0
  334. /package/dist/{chunk-345MEMRU.js.map → chunk-3OUGSOJP.js.map} +0 -0
  335. /package/dist/{chunk-G2STTRYB.js.map → chunk-4D2YH47Z.js.map} +0 -0
  336. /package/dist/{chunk-IXYIW3MZ.js.map → chunk-4K2H4KTR.js.map} +0 -0
  337. /package/dist/{chunk-UVVSOSHL.js.map → chunk-52CQKST6.js.map} +0 -0
  338. /package/dist/{chunk-H7BZBSP6.js.map → chunk-52II7PB6.js.map} +0 -0
  339. /package/dist/{chunk-2QZFZNXO.js.map → chunk-5CQO6LVM.js.map} +0 -0
  340. /package/dist/{chunk-NLDMTXWV.js.map → chunk-5LNPW7NE.js.map} +0 -0
  341. /package/dist/{chunk-WHTMVTU4.js.map → chunk-5X4ZJESN.js.map} +0 -0
  342. /package/dist/{chunk-WI37MWRZ.js.map → chunk-63UNVGZW.js.map} +0 -0
  343. /package/dist/{chunk-G3T6YMBO.js.map → chunk-64S6X4IU.js.map} +0 -0
  344. /package/dist/{chunk-CFCEJNOE.js.map → chunk-6KHF6PAB.js.map} +0 -0
  345. /package/dist/{chunk-35A7GCHG.js.map → chunk-6T42L5FI.js.map} +0 -0
  346. /package/dist/{chunk-JDOBIFBK.js.map → chunk-7CXL25AA.js.map} +0 -0
  347. /package/dist/{chunk-YLBE6PLR.js.map → chunk-7IGMKQWK.js.map} +0 -0
  348. /package/dist/{chunk-CSLK7BN6.js.map → chunk-7LYRFI5A.js.map} +0 -0
  349. /package/dist/{chunk-IB63OVUB.js.map → chunk-AJ6ORARY.js.map} +0 -0
  350. /package/dist/{chunk-CGOKNQDK.js.map → chunk-ANZXWOYD.js.map} +0 -0
  351. /package/dist/{chunk-5QXMESS7.js.map → chunk-AXC7UTLM.js.map} +0 -0
  352. /package/dist/{chunk-RFIJRZ4K.js.map → chunk-B657ZGDH.js.map} +0 -0
  353. /package/dist/{chunk-MY7B3HYC.js.map → chunk-CLCMDKTB.js.map} +0 -0
  354. /package/dist/{chunk-QPWUG2S3.js.map → chunk-CYEK6Z3P.js.map} +0 -0
  355. /package/dist/{chunk-IHCYCE6D.js.map → chunk-DJMVSUPK.js.map} +0 -0
  356. /package/dist/{chunk-HP4CU2ZA.js.map → chunk-DST7HRSG.js.map} +0 -0
  357. /package/dist/{chunk-IIFFC3RL.js.map → chunk-EDR6CVWZ.js.map} +0 -0
  358. /package/dist/{chunk-AUWMKDKL.js.map → chunk-EMVJU7WC.js.map} +0 -0
  359. /package/dist/{chunk-O6AYMAPJ.js.map → chunk-ENNC3RZ6.js.map} +0 -0
  360. /package/dist/{chunk-2JRB3Z5N.js.map → chunk-EP5WXE2G.js.map} +0 -0
  361. /package/dist/{chunk-I2KEH2LS.js.map → chunk-FC6RCOIU.js.map} +0 -0
  362. /package/dist/{chunk-OZVHLBH6.js.map → chunk-FLV7M7CT.js.map} +0 -0
  363. /package/dist/{chunk-Q6GI7HEC.js.map → chunk-FRH2UC7Q.js.map} +0 -0
  364. /package/dist/{chunk-3SL52JKD.js.map → chunk-FZVROZKC.js.map} +0 -0
  365. /package/dist/{chunk-2EZB2DL5.js.map → chunk-GE6HETIF.js.map} +0 -0
  366. /package/dist/{chunk-2DHJTJIY.js.map → chunk-GEGUBU3D.js.map} +0 -0
  367. /package/dist/{chunk-6AA7XFMO.js.map → chunk-GF4H3B3R.js.map} +0 -0
  368. /package/dist/{chunk-ME2LMFHF.js.map → chunk-HPAOMYKM.js.map} +0 -0
  369. /package/dist/{chunk-4NRZ7BRS.js.map → chunk-I25RINZK.js.map} +0 -0
  370. /package/dist/{chunk-XG4XXI66.js.map → chunk-I25RQA65.js.map} +0 -0
  371. /package/dist/{chunk-EJJMDLVB.js.map → chunk-IJ4FEGZR.js.map} +0 -0
  372. /package/dist/{chunk-EUL3S3LE.js.map → chunk-J5WI4QRP.js.map} +0 -0
  373. /package/dist/{chunk-LMMC55WM.js.map → chunk-JA54KIYD.js.map} +0 -0
  374. /package/dist/{chunk-5FLFPTDK.js.map → chunk-JA72X46J.js.map} +0 -0
  375. /package/dist/{chunk-NLYOOGZ7.js.map → chunk-KE5PWLI6.js.map} +0 -0
  376. /package/dist/{chunk-4DDIWRT7.js.map → chunk-KQI2PKYP.js.map} +0 -0
  377. /package/dist/{chunk-Y2ADLCB3.js.map → chunk-KSUOM3YU.js.map} +0 -0
  378. /package/dist/{chunk-BTOHGPHC.js.map → chunk-KZEMFD6E.js.map} +0 -0
  379. /package/dist/{chunk-NXVD46HT.js.map → chunk-L2VS27PZ.js.map} +0 -0
  380. /package/dist/{chunk-MYYHACOW.js.map → chunk-L34W4W4I.js.map} +0 -0
  381. /package/dist/{chunk-KRTIHXWC.js.map → chunk-L3PWXD73.js.map} +0 -0
  382. /package/dist/{chunk-NQHSXHJP.js.map → chunk-L6GNS5GB.js.map} +0 -0
  383. /package/dist/{chunk-44PBRUXB.js.map → chunk-M47Q6566.js.map} +0 -0
  384. /package/dist/{chunk-E7FN5N5E.js.map → chunk-MQNOIH2C.js.map} +0 -0
  385. /package/dist/{chunk-IDSZNHIP.js.map → chunk-MULNBSPP.js.map} +0 -0
  386. /package/dist/{chunk-RKSGUMVL.js.map → chunk-NBQIFCJE.js.map} +0 -0
  387. /package/dist/{chunk-I6WFBNA4.js.map → chunk-NHSVW7UT.js.map} +0 -0
  388. /package/dist/{chunk-32HO62I4.js.map → chunk-OFEHITAZ.js.map} +0 -0
  389. /package/dist/{chunk-PCO3P7WJ.js.map → chunk-OGVJXIHX.js.map} +0 -0
  390. /package/dist/{chunk-RYN4AIRM.js.map → chunk-OZABSIOV.js.map} +0 -0
  391. /package/dist/{chunk-HO7IQP7G.js.map → chunk-QMFKW4OU.js.map} +0 -0
  392. /package/dist/{chunk-34G4U6HS.js.map → chunk-QRZMJ2WN.js.map} +0 -0
  393. /package/dist/{chunk-GUD6FYQG.js.map → chunk-RSMIRLKM.js.map} +0 -0
  394. /package/dist/{chunk-TNVZCLJU.js.map → chunk-S5TGRZWY.js.map} +0 -0
  395. /package/dist/{chunk-O24EWFPQ.js.map → chunk-SNXBXYUE.js.map} +0 -0
  396. /package/dist/{chunk-KW77LGDX.js.map → chunk-SUAX5JWY.js.map} +0 -0
  397. /package/dist/{chunk-PNFWIB4X.js.map → chunk-SWRN6U7Q.js.map} +0 -0
  398. /package/dist/{chunk-R4NGLTUS.js.map → chunk-TDMNADPI.js.map} +0 -0
  399. /package/dist/{chunk-QCP75JGO.js.map → chunk-TFA6HPOA.js.map} +0 -0
  400. /package/dist/{chunk-LI76ESJL.js.map → chunk-TZQOCQXB.js.map} +0 -0
  401. /package/dist/{chunk-OV7EYM6M.js.map → chunk-U6OXJQEH.js.map} +0 -0
  402. /package/dist/{chunk-OWHPA4JS.js.map → chunk-V32NHP2R.js.map} +0 -0
  403. /package/dist/{chunk-JSUA4YFE.js.map → chunk-WG4TMZJ2.js.map} +0 -0
  404. /package/dist/{chunk-DQTCGVFK.js.map → chunk-WHCD4Z3D.js.map} +0 -0
  405. /package/dist/{chunk-KATEWTQJ.js.map → chunk-X7J56GPG.js.map} +0 -0
  406. /package/dist/{chunk-7KICGR5W.js.map → chunk-XPRAOTJY.js.map} +0 -0
  407. /package/dist/{chunk-2NV7MMMM.js.map → chunk-XQSJXNWC.js.map} +0 -0
  408. /package/dist/{chunk-RXT6UB25.js.map → chunk-YJAOYEWI.js.map} +0 -0
  409. /package/dist/{chunk-L6DJJEFW.js.map → chunk-YJEUHGZZ.js.map} +0 -0
  410. /package/dist/{chunk-AXFWMRKI.js.map → chunk-YQJCWR4R.js.map} +0 -0
@@ -7,10 +7,10 @@ import {
7
7
  import {
8
8
  listMemoryGovernanceRuns,
9
9
  readMemoryGovernanceRunArtifact
10
- } from "./chunk-IXYIW3MZ.js";
10
+ } from "./chunk-4K2H4KTR.js";
11
11
  import {
12
12
  StorageManager
13
- } from "./chunk-6JIHC5AS.js";
13
+ } from "./chunk-37HCPM56.js";
14
14
  import {
15
15
  normalizeProjectionPreview,
16
16
  normalizeProjectionTags
@@ -21,10 +21,11 @@ import {
21
21
  readProjectedGovernanceRows,
22
22
  readProjectedNativeKnowledgeRows,
23
23
  writeProjectionMetaHighWater
24
- } from "./chunk-22DYJLFN.js";
24
+ } from "./chunk-XVC7JU2N.js";
25
25
  import {
26
26
  MEMORY_LIFECYCLE_EVENT_SORT_ORDER,
27
27
  buildLifecycleEventsForMemory,
28
+ compareMemoryLifecycleEvents,
28
29
  inferMemoryStatus,
29
30
  memoryLifecycleEventProjectionIdentity,
30
31
  sortMemoryLifecycleEvents,
@@ -42,12 +43,15 @@ import {
42
43
  import {
43
44
  openBetterSqlite3
44
45
  } from "./chunk-RL6NEVXT.js";
45
- import {
46
- commitPreparedFileAtomically
47
- } from "./chunk-AW4QUFQF.js";
48
46
  import {
49
47
  isSupportPassportPrivateMemory
50
48
  } from "./chunk-PWPIERBM.js";
49
+ import {
50
+ commitPreparedFileAtomically
51
+ } from "./chunk-BTNNL7ZW.js";
52
+ import {
53
+ throwIfAborted
54
+ } from "./chunk-BTTPKDIL.js";
51
55
  import {
52
56
  isErrnoCode
53
57
  } from "./chunk-KNA3BXXL.js";
@@ -56,8 +60,177 @@ import {
56
60
  } from "./chunk-3WCASNQZ.js";
57
61
 
58
62
  // src/maintenance/rebuild-memory-projection.ts
59
- import path from "path";
63
+ import path2 from "path";
60
64
  import { mkdir, rm, stat } from "fs/promises";
65
+
66
+ // src/maintenance/projection-timeline.ts
67
+ import path from "path";
68
+ function loadTimelineEvents(memories, lifecycleEvents) {
69
+ if (lifecycleEvents.length > 0) {
70
+ return {
71
+ events: sortMemoryLifecycleEvents(lifecycleEvents),
72
+ usedLifecycleLedger: true
73
+ };
74
+ }
75
+ return {
76
+ events: sortMemoryLifecycleEvents(memories.flatMap((memory) => buildLifecycleEventsForMemory(memory))),
77
+ usedLifecycleLedger: false
78
+ };
79
+ }
80
+ function deduplicateTimelineEvents(events, sourcePathFor) {
81
+ const keptById = /* @__PURE__ */ new Map();
82
+ const unique = [];
83
+ const skipped = [];
84
+ const skippedBlankIds = [];
85
+ for (const event of sortMemoryLifecycleEvents(events)) {
86
+ const sourcePath = sourcePathFor(event);
87
+ if (!event.memoryId.trim()) {
88
+ skippedBlankIds.push({ eventId: event.eventId, path: sourcePath });
89
+ log.warn(
90
+ `projection rebuild skipped timeline event with blank memory id: event_id=${event.eventId} path=${sourcePath}`
91
+ );
92
+ continue;
93
+ }
94
+ const kept = keptById.get(event.eventId);
95
+ if (kept) {
96
+ skipped.push({
97
+ eventId: event.eventId,
98
+ keptPath: kept.path,
99
+ skippedPath: sourcePath
100
+ });
101
+ log.warn(
102
+ `projection rebuild skipped duplicate timeline event_id=${event.eventId}: kept=${kept.path} skipped=${sourcePath}`
103
+ );
104
+ continue;
105
+ }
106
+ keptById.set(event.eventId, { event, path: sourcePath });
107
+ unique.push(event);
108
+ }
109
+ return { events: unique, skipped, skippedBlankIds };
110
+ }
111
+ function internPool() {
112
+ const pool = /* @__PURE__ */ new Map();
113
+ return (value) => {
114
+ const existing = pool.get(value);
115
+ if (existing !== void 0) return existing;
116
+ pool.set(value, value);
117
+ return value;
118
+ };
119
+ }
120
+ function internLedgerEvent(event, intern) {
121
+ event.memoryId = intern(event.memoryId);
122
+ event.eventType = intern(event.eventType);
123
+ event.timestamp = intern(event.timestamp);
124
+ event.actor = intern(event.actor);
125
+ event.ruleVersion = intern(event.ruleVersion);
126
+ if (event.reasonCode) event.reasonCode = intern(event.reasonCode);
127
+ if (event.correlationId) event.correlationId = intern(event.correlationId);
128
+ }
129
+ async function consumeLifecycleLedger(events, ledgerPath, signal) {
130
+ const intern = internPool();
131
+ const best = /* @__PURE__ */ new Map();
132
+ const losers = [];
133
+ const blanks = [];
134
+ const identities = /* @__PURE__ */ new Set();
135
+ let sawEvent = false;
136
+ for await (const event of events) {
137
+ throwIfAborted(signal, "projection rebuild aborted");
138
+ sawEvent = true;
139
+ internLedgerEvent(event, intern);
140
+ identities.add(memoryLifecycleEventProjectionIdentity(event));
141
+ if (!event.memoryId.trim()) {
142
+ blanks.push(event);
143
+ continue;
144
+ }
145
+ const prev = best.get(event.eventId);
146
+ if (!prev) {
147
+ best.set(event.eventId, event);
148
+ continue;
149
+ }
150
+ if (compareMemoryLifecycleEvents(event, prev) < 0) {
151
+ losers.push(prev);
152
+ best.set(event.eventId, event);
153
+ } else {
154
+ losers.push(event);
155
+ }
156
+ }
157
+ if (!sawEvent) return null;
158
+ const sourceLifecycleLedgerEventCount = identities.size;
159
+ identities.clear();
160
+ const skippedBlankIds = sortMemoryLifecycleEvents(blanks).map((event) => {
161
+ log.warn(
162
+ `projection rebuild skipped timeline event with blank memory id: event_id=${event.eventId} path=${ledgerPath}`
163
+ );
164
+ return { eventId: event.eventId, path: ledgerPath };
165
+ });
166
+ const skipped = sortMemoryLifecycleEvents(losers).map((event) => {
167
+ log.warn(
168
+ `projection rebuild skipped duplicate timeline event_id=${event.eventId}: kept=${ledgerPath} skipped=${ledgerPath}`
169
+ );
170
+ return {
171
+ eventId: event.eventId,
172
+ keptPath: ledgerPath,
173
+ skippedPath: ledgerPath
174
+ };
175
+ });
176
+ return {
177
+ events: sortMemoryLifecycleEvents([...best.values()]),
178
+ usedLifecycleLedger: true,
179
+ sourceLifecycleLedgerEventCount,
180
+ skipped,
181
+ skippedBlankIds
182
+ };
183
+ }
184
+ async function loadProjectionTimeline(options) {
185
+ const ledgerPath = path.join(options.memoryDir, "state", "memory-lifecycle-ledger.jsonl");
186
+ const streamed = await consumeLifecycleLedger(
187
+ options.storage.iterateMemoryLifecycleEvents(),
188
+ ledgerPath,
189
+ options.signal
190
+ );
191
+ if (streamed) return streamed;
192
+ const timeline = loadTimelineEvents(options.memories, []);
193
+ const memoryPathById = new Map(
194
+ options.memories.map((memory) => [memory.frontmatter.id, memory.path])
195
+ );
196
+ const deduplicated = deduplicateTimelineEvents(
197
+ timeline.events,
198
+ (event) => memoryPathById.get(event.memoryId) ?? ledgerPath
199
+ );
200
+ return {
201
+ events: deduplicated.events,
202
+ usedLifecycleLedger: false,
203
+ sourceLifecycleLedgerEventCount: 0,
204
+ skipped: deduplicated.skipped,
205
+ skippedBlankIds: deduplicated.skippedBlankIds
206
+ };
207
+ }
208
+
209
+ // src/maintenance/projection-rebuild-abort.ts
210
+ function projectionRebuildParentDisconnected() {
211
+ return new Error("projection rebuild runner parent disconnected");
212
+ }
213
+ function watchProjectionRebuildParent() {
214
+ const abort = new AbortController();
215
+ const stop = () => {
216
+ if (abort.signal.aborted) return;
217
+ abort.abort(projectionRebuildParentDisconnected());
218
+ };
219
+ process.on("disconnect", stop);
220
+ if (process.connected === false) stop();
221
+ return abort.signal;
222
+ }
223
+ async function throwIfProjectionRebuildAborted(signal) {
224
+ if (!signal) return;
225
+ await new Promise((resolve) => {
226
+ setImmediate(resolve);
227
+ });
228
+ if (!signal.aborted) return;
229
+ const reason = signal.reason;
230
+ throw reason instanceof Error ? reason : projectionRebuildParentDisconnected();
231
+ }
232
+
233
+ // src/maintenance/rebuild-memory-projection.ts
61
234
  async function backupExistingProjection(memoryDir, outputPath, now) {
62
235
  try {
63
236
  await stat(outputPath);
@@ -67,7 +240,7 @@ async function backupExistingProjection(memoryDir, outputPath, now) {
67
240
  }
68
241
  throw err;
69
242
  }
70
- const backupPath = path.join(
243
+ const backupPath = path2.join(
71
244
  memoryDir,
72
245
  "archive",
73
246
  "memory-projection",
@@ -101,7 +274,8 @@ function toCurrentStateRow(memoryDir, memory) {
101
274
  accessCount: memory.frontmatter.accessCount,
102
275
  lastAccessed: memory.frontmatter.lastAccessed,
103
276
  tags: normalizeProjectionTags(memory.frontmatter.tags),
104
- preview: normalizeProjectionPreview(memory.content),
277
+ // Copy the preview off the source string so the full document can be collected.
278
+ preview: Buffer.from(normalizeProjectionPreview(memory.content), "utf8").toString("utf8"),
105
279
  privateRecord: isSupportPassportPrivateMemory(memory)
106
280
  };
107
281
  }
@@ -176,18 +350,6 @@ async function loadLatestGovernanceProjection(memoryDir) {
176
350
  return null;
177
351
  }
178
352
  }
179
- function loadTimelineEvents(memories, lifecycleEvents) {
180
- if (lifecycleEvents.length > 0) {
181
- return {
182
- events: sortMemoryLifecycleEvents(lifecycleEvents),
183
- usedLifecycleLedger: true
184
- };
185
- }
186
- return {
187
- events: sortMemoryLifecycleEvents(memories.flatMap((memory) => buildLifecycleEventsForMemory(memory))),
188
- usedLifecycleLedger: false
189
- };
190
- }
191
353
  function normalizeScopedIso(value) {
192
354
  if (!value) return null;
193
355
  const trimmed = value.trim();
@@ -337,67 +499,39 @@ function selectProjectionMemories(tiers) {
337
499
  }
338
500
  return { allMemories, memories, skippedDuplicateMemories, skippedBlankIdMemories };
339
501
  }
340
- function deduplicateTimelineEvents(events, sourcePathFor) {
341
- const keptById = /* @__PURE__ */ new Map();
342
- const unique = [];
343
- const skipped = [];
344
- const skippedBlankIds = [];
345
- for (const event of sortMemoryLifecycleEvents(events)) {
346
- const sourcePath = sourcePathFor(event);
347
- if (!event.memoryId.trim()) {
348
- skippedBlankIds.push({ eventId: event.eventId, path: sourcePath });
349
- log.warn(
350
- `projection rebuild skipped timeline event with blank memory id: event_id=${event.eventId} path=${sourcePath}`
351
- );
352
- continue;
353
- }
354
- const kept = keptById.get(event.eventId);
355
- if (kept) {
356
- skipped.push({
357
- eventId: event.eventId,
358
- keptPath: kept.path,
359
- skippedPath: sourcePath
360
- });
361
- log.warn(
362
- `projection rebuild skipped duplicate timeline event_id=${event.eventId}: kept=${kept.path} skipped=${sourcePath}`
363
- );
364
- continue;
365
- }
366
- keptById.set(event.eventId, { event, path: sourcePath });
367
- unique.push(event);
368
- }
369
- return { events: unique, skipped, skippedBlankIds };
370
- }
371
502
  async function loadAuthoritativeProjectionSnapshot(options) {
372
503
  const storage = assertInjectedStorageRooted("rebuildMemoryProjection", options.memoryDir, options.storage) ?? new StorageManager(options.memoryDir);
373
504
  storage.invalidateAllMemoriesCacheForDir({ indexedText: false });
374
- const selected = selectProjectionMemories([
375
- await storage.readAllMemories(),
376
- await storage.readAllColdMemories(),
377
- await storage.readArchivedMemories()
378
- ]);
505
+ const corpusRead = {
506
+ retainRaw: options.retainRaw === true,
507
+ abortSignal: options.signal
508
+ };
509
+ const hot = await storage.readAllMemories(corpusRead);
510
+ await throwIfProjectionRebuildAborted(options.signal);
511
+ const cold = await storage.readAllColdMemories(corpusRead);
512
+ await throwIfProjectionRebuildAborted(options.signal);
513
+ const archived = await storage.readArchivedMemories(corpusRead);
514
+ await throwIfProjectionRebuildAborted(options.signal);
515
+ const selected = selectProjectionMemories([hot, cold, archived]);
379
516
  const allMemories = selected.allMemories;
380
517
  const projectionMemories = selected.memories;
381
- const lifecycleEvents = await storage.readAllMemoryLifecycleEvents();
382
- const timeline = loadTimelineEvents(projectionMemories, lifecycleEvents);
383
- const lifecycleLedgerPath = path.join(
384
- options.memoryDir,
385
- "state",
386
- "memory-lifecycle-ledger.jsonl"
387
- );
388
- const memoryPathById = new Map(
389
- projectionMemories.map((memory) => [memory.frontmatter.id, memory.path])
390
- );
391
- const deduplicatedTimeline = deduplicateTimelineEvents(
392
- timeline.events,
393
- (event) => timeline.usedLifecycleLedger ? lifecycleLedgerPath : memoryPathById.get(event.memoryId) ?? lifecycleLedgerPath
394
- );
395
- const events = deduplicatedTimeline.events;
396
- const usedLifecycleLedger = timeline.usedLifecycleLedger;
397
- const sourceLifecycleLedgerEventCount = new Set(
398
- lifecycleEvents.map(memoryLifecycleEventProjectionIdentity)
399
- ).size;
400
518
  const currentRows = projectionMemories.map((memory) => toCurrentStateRow(options.memoryDir, memory));
519
+ if (options.retainRaw !== true) {
520
+ for (const memory of allMemories) memory.content = "";
521
+ }
522
+ const {
523
+ events,
524
+ usedLifecycleLedger,
525
+ sourceLifecycleLedgerEventCount,
526
+ skipped: skippedDuplicateTimelineEvents,
527
+ skippedBlankIds: skippedBlankIdTimelineEvents
528
+ } = await loadProjectionTimeline({
529
+ storage,
530
+ memoryDir: options.memoryDir,
531
+ memories: projectionMemories,
532
+ signal: options.signal
533
+ });
534
+ await throwIfProjectionRebuildAborted(options.signal);
401
535
  const scope = normalizeProjectionScope(options);
402
536
  const scopedMemories = filterMemoriesForProjectionScope(projectionMemories, scope);
403
537
  const scopedMemoryIds = new Set(scopedMemories.map((memory) => memory.frontmatter.id));
@@ -438,8 +572,8 @@ async function loadAuthoritativeProjectionSnapshot(options) {
438
572
  scope,
439
573
  skippedDuplicateMemories: selected.skippedDuplicateMemories,
440
574
  skippedBlankIdMemories: selected.skippedBlankIdMemories,
441
- skippedDuplicateTimelineEvents: deduplicatedTimeline.skipped,
442
- skippedBlankIdTimelineEvents: deduplicatedTimeline.skippedBlankIds
575
+ skippedDuplicateTimelineEvents,
576
+ skippedBlankIdTimelineEvents
443
577
  };
444
578
  }
445
579
  function readProjectedCurrentRows(memoryDir) {
@@ -513,7 +647,7 @@ function readProjectedTimelineRows(memoryDir) {
513
647
  }
514
648
  function writeProjectionDb(dbPath, nowIso, currentRows, timelineRows, entityMentionRows, nativeKnowledgeRows, governance, usedLifecycleLedger, sourceLifecycleLedgerEventCount, complete) {
515
649
  const db = openBetterSqlite3(dbPath);
516
- const memoryDir = path.dirname(path.dirname(dbPath));
650
+ const memoryDir = path2.dirname(path2.dirname(dbPath));
517
651
  try {
518
652
  initializeMemoryProjectionDb(db);
519
653
  const insertMeta = db.prepare("INSERT OR REPLACE INTO meta(key, value) VALUES (?, ?)");
@@ -774,6 +908,7 @@ async function rebuildMemoryProjection(options) {
774
908
  const now = options.now ?? /* @__PURE__ */ new Date();
775
909
  const outputPath = getMemoryProjectionPath(options.memoryDir);
776
910
  const snapshot = await loadAuthoritativeProjectionSnapshot(options);
911
+ await throwIfProjectionRebuildAborted(options.signal);
777
912
  let backupPath;
778
913
  if (!dryRun) {
779
914
  let nextCurrentRows = snapshot.currentRows;
@@ -824,7 +959,8 @@ async function rebuildMemoryProjection(options) {
824
959
  }
825
960
  }
826
961
  const tempPath = `${outputPath}.tmp`;
827
- await mkdir(path.dirname(outputPath), { recursive: true });
962
+ await mkdir(path2.dirname(outputPath), { recursive: true });
963
+ await throwIfProjectionRebuildAborted(options.signal);
828
964
  await rm(tempPath, { force: true });
829
965
  writeProjectionDb(
830
966
  tempPath,
@@ -838,8 +974,20 @@ async function rebuildMemoryProjection(options) {
838
974
  snapshot.sourceLifecycleLedgerEventCount,
839
975
  !hasScopedProjectionFilter(snapshot.scope)
840
976
  );
841
- backupPath = await backupExistingProjection(options.memoryDir, outputPath, now);
842
- backupPath = await commitPreparedFileAtomically(tempPath, outputPath, backupPath);
977
+ try {
978
+ await throwIfProjectionRebuildAborted(options.signal);
979
+ backupPath = await backupExistingProjection(options.memoryDir, outputPath, now);
980
+ await throwIfProjectionRebuildAborted(options.signal);
981
+ backupPath = await commitPreparedFileAtomically(
982
+ tempPath,
983
+ outputPath,
984
+ backupPath,
985
+ () => throwIfProjectionRebuildAborted(options.signal)
986
+ );
987
+ } catch (err) {
988
+ if (options.signal?.aborted) await rm(tempPath, { force: true });
989
+ throw err;
990
+ }
843
991
  }
844
992
  return {
845
993
  dryRun,
@@ -1002,9 +1150,10 @@ async function repairMemoryProjection(options) {
1002
1150
  }
1003
1151
 
1004
1152
  export {
1153
+ watchProjectionRebuildParent,
1005
1154
  backupExistingProjection,
1006
1155
  rebuildMemoryProjection,
1007
1156
  verifyMemoryProjection,
1008
1157
  repairMemoryProjection
1009
1158
  };
1010
- //# sourceMappingURL=chunk-X6X4UASX.js.map
1159
+ //# sourceMappingURL=chunk-SZXPKUMN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/maintenance/rebuild-memory-projection.ts","../src/maintenance/projection-timeline.ts","../src/maintenance/projection-rebuild-abort.ts"],"sourcesContent":["import path from \"node:path\";\nimport { mkdir, rm, stat } from \"node:fs/promises\";\nimport { StorageManager } from \"../storage.js\";\nimport { log } from \"../logger.js\";\nimport {\n listMemoryGovernanceRuns,\n readMemoryGovernanceRunArtifact,\n} from \"./memory-governance.js\";\nimport { loadPersistedNativeKnowledgeChunks } from \"../native-knowledge.js\";\nimport { toBackupStamp } from \"./backup-stamp.js\";\nimport type {\n MemoryFile,\n MemoryLifecycleEvent,\n MemoryProjectionCurrentState,\n MemoryStatus,\n} from \"../types.js\";\nimport {\n inferMemoryStatus,\n MEMORY_LIFECYCLE_EVENT_SORT_ORDER,\n sortMemoryLifecycleEvents,\n toMemoryPathRel,\n} from \"../memory-lifecycle-ledger-utils.js\";\nimport { loadProjectionTimeline } from \"./projection-timeline.js\";\nimport {\n getMemoryProjectionPath,\n initializeMemoryProjectionDb,\n isProjectedMemoryPathValid,\n type ProjectedEntityMentionRow,\n type MemoryProjectionGovernanceAppliedActionRow,\n type MemoryProjectionGovernanceReviewQueueRow,\n type ProjectedNativeKnowledgeChunkRow,\n MEMORY_PROJECTION_SCHEMA_VERSION,\n memoryCurrentSelectExpressions,\n parseCurrentRow,\n readProjectedEntityMentions,\n readProjectedGovernanceRecord,\n readProjectedNativeKnowledgeChunks,\n parseTimelineRows,\n} from \"../memory-projection-store.js\";\nimport {\n normalizeProjectionPreview,\n normalizeProjectionTags,\n} from \"../memory-projection-format.js\";\nimport { openBetterSqlite3 } from \"../runtime/better-sqlite.js\";\nimport { commitPreparedFileAtomically } from \"./atomic-file.js\";\nimport { throwIfProjectionRebuildAborted } from \"./projection-rebuild-abort.js\";\nimport { isSupportPassportPrivateMemory } from \"../support-passport/card-projection.js\";\n\nexport interface RebuildMemoryProjectionOptions {\n memoryDir: string;\n /** Reuse the caller's live StorageManager (must be rooted at memoryDir). */\n storage?: StorageManager;\n defaultNamespace?: string;\n dryRun?: boolean;\n now?: Date;\n updatedAfter?: string;\n updatedBefore?: string;\n /**\n * When true, corpus reads keep the raw file text. Default false: the\n * projection is built from parsed fields, and skipping the raw copy keeps\n * the rebuild's peak heap down. Output rows stay the same either way.\n */\n retainRaw?: boolean;\n /** When aborted, the rebuild stops before it publishes the projection file. */\n signal?: AbortSignal;\n}\n\nexport type {\n SkippedBlankIdMemory,\n SkippedBlankIdTimelineEvent,\n SkippedDuplicateMemory,\n SkippedDuplicateTimelineEvent,\n} from \"./projection-support.js\";\nimport {\n assertInjectedStorageRooted,\n readProjectedEntityMentionRows,\n readProjectedGovernanceRows,\n readProjectedNativeKnowledgeRows,\n writeProjectionMetaHighWater,\n} from \"./projection-support.js\";\nimport type {\n SkippedBlankIdMemory,\n SkippedBlankIdTimelineEvent,\n SkippedDuplicateMemory,\n SkippedDuplicateTimelineEvent,\n} from \"./projection-support.js\";\nimport { isErrnoCode } from \"../utils/errno.js\";\n\n\nexport interface RebuildMemoryProjectionResult {\n dryRun: boolean;\n scannedMemories: number;\n currentRows: number;\n timelineRows: number;\n entityMentionRows: number;\n nativeKnowledgeRows: number;\n reviewQueueRows: number;\n outputPath: string;\n backupPath?: string;\n usedLifecycleLedger: boolean;\n skippedDuplicateMemories: SkippedDuplicateMemory[];\n skippedBlankIdMemories: SkippedBlankIdMemory[];\n skippedDuplicateTimelineEvents: SkippedDuplicateTimelineEvent[];\n skippedBlankIdTimelineEvents: SkippedBlankIdTimelineEvent[];\n scope: {\n updatedAfter: string | null;\n updatedBefore: string | null;\n };\n}\n\nexport interface VerifyMemoryProjectionOptions {\n memoryDir: string;\n defaultNamespace?: string;\n updatedAfter?: string;\n updatedBefore?: string;\n}\n\nexport interface VerifyMemoryProjectionResult {\n outputPath: string;\n projectionExists: boolean;\n ok: boolean;\n expectedCurrentRows: number;\n actualCurrentRows: number;\n expectedTimelineRows: number;\n actualTimelineRows: number;\n expectedEntityMentionRows: number;\n actualEntityMentionRows: number;\n expectedNativeKnowledgeRows: number;\n actualNativeKnowledgeRows: number;\n expectedReviewQueueRows: number;\n actualReviewQueueRows: number;\n missingCurrentMemoryIds: string[];\n extraCurrentMemoryIds: string[];\n mismatchedCurrentMemoryIds: string[];\n missingTimelineEventIds: string[];\n extraTimelineEventIds: string[];\n missingEntityMentionKeys: string[];\n extraEntityMentionKeys: string[];\n mismatchedEntityMentionKeys: string[];\n missingNativeKnowledgeChunkIds: string[];\n extraNativeKnowledgeChunkIds: string[];\n mismatchedNativeKnowledgeChunkIds: string[];\n missingReviewQueueEntryIds: string[];\n extraReviewQueueEntryIds: string[];\n mismatchedReviewQueueEntryIds: string[];\n usedLifecycleLedger: boolean;\n scope: {\n updatedAfter: string | null;\n updatedBefore: string | null;\n };\n}\n\nexport interface RepairMemoryProjectionOptions extends RebuildMemoryProjectionOptions {}\n\nexport interface RepairMemoryProjectionResult {\n dryRun: boolean;\n repaired: boolean;\n verify: VerifyMemoryProjectionResult;\n rebuild?: RebuildMemoryProjectionResult;\n}\n\nexport async function backupExistingProjection(\n memoryDir: string,\n outputPath: string,\n now: Date,\n): Promise<string | undefined> {\n try {\n await stat(outputPath);\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) {\n return undefined;\n }\n throw err;\n }\n\n const backupPath = path.join(\n memoryDir,\n \"archive\",\n \"memory-projection\",\n toBackupStamp(now),\n \"state\",\n \"memory-projection.sqlite\",\n );\n return backupPath;\n}\n\nfunction inferProjectedStatus(pathRel: string, memory: MemoryFile): MemoryStatus {\n return inferMemoryStatus(memory.frontmatter, pathRel);\n}\n\nfunction toCurrentStateRow(memoryDir: string, memory: MemoryFile): MemoryProjectionCurrentState {\n const pathRel = toMemoryPathRel(memoryDir, memory.path);\n return {\n memoryId: memory.frontmatter.id,\n category: memory.frontmatter.category,\n status: inferProjectedStatus(pathRel, memory),\n lifecycleState: memory.frontmatter.lifecycleState,\n path: memory.path,\n pathRel,\n created: memory.frontmatter.created,\n updated: memory.frontmatter.updated,\n archivedAt: memory.frontmatter.archivedAt,\n supersededAt: memory.frontmatter.supersededAt,\n entityRef: memory.frontmatter.entityRef,\n source: memory.frontmatter.source,\n confidence: memory.frontmatter.confidence,\n confidenceTier: memory.frontmatter.confidenceTier,\n memoryKind: memory.frontmatter.memoryKind,\n accessCount: memory.frontmatter.accessCount,\n lastAccessed: memory.frontmatter.lastAccessed,\n tags: normalizeProjectionTags(memory.frontmatter.tags),\n // Copy the preview off the source string so the full document can be collected.\n preview: Buffer.from(normalizeProjectionPreview(memory.content), \"utf8\").toString(\"utf8\"),\n privateRecord: isSupportPassportPrivateMemory(memory),\n };\n}\n\nfunction buildEntityMentionRows(\n currentRows: MemoryProjectionCurrentState[],\n): ProjectedEntityMentionRow[] {\n return currentRows.flatMap((row) => {\n const mentions: ProjectedEntityMentionRow[] = [];\n if (row.entityRef) {\n mentions.push({\n memoryId: row.memoryId,\n entityRef: row.entityRef,\n mentionSource: \"frontmatter.entityRef\",\n created: row.created,\n updated: row.updated,\n });\n }\n for (const tag of row.tags ?? []) {\n if (!tag.includes(\":\")) continue;\n mentions.push({\n memoryId: row.memoryId,\n entityRef: tag,\n mentionSource: \"tag\",\n created: row.created,\n updated: row.updated,\n });\n }\n return mentions;\n });\n}\n\nfunction buildGovernanceActionRowKey(action: {\n action: string;\n memoryId: string;\n reasonCode: string;\n originalPath: string;\n currentPath: string;\n}): string {\n return [\n action.action,\n action.memoryId,\n action.reasonCode,\n action.originalPath,\n action.currentPath,\n ].join(\"::\");\n}\n\nasync function loadLatestGovernanceProjection(memoryDir: string): Promise<{\n runId: string;\n summary: unknown;\n metrics: unknown;\n reviewQueueRows: MemoryProjectionGovernanceReviewQueueRow[];\n appliedActionRows: MemoryProjectionGovernanceAppliedActionRow[];\n report: string;\n} | null> {\n const runId = (await listMemoryGovernanceRuns(memoryDir))[0];\n if (!runId) return null;\n try {\n const artifact = await readMemoryGovernanceRunArtifact(memoryDir, runId);\n return {\n runId,\n summary: artifact.summary,\n metrics: artifact.metrics,\n reviewQueueRows: artifact.reviewQueue.map((entry) => ({\n runId,\n entryId: entry.entryId,\n memoryId: entry.memoryId,\n path: entry.path,\n reasonCode: entry.reasonCode,\n severity: entry.severity,\n suggestedAction: entry.suggestedAction,\n suggestedStatus: entry.suggestedStatus,\n relatedMemoryIds: [...entry.relatedMemoryIds],\n })),\n appliedActionRows: artifact.appliedActions.map((action) => ({\n runId,\n rowKey: buildGovernanceActionRowKey(action),\n action: action.action,\n memoryId: action.memoryId,\n reasonCode: action.reasonCode,\n beforeStatus: action.beforeStatus,\n afterStatus: action.afterStatus,\n originalPath: action.originalPath,\n currentPath: action.currentPath,\n })),\n report: artifact.report,\n };\n } catch {\n return null;\n }\n}\n\nfunction normalizeScopedIso(value: string | undefined): string | null {\n if (!value) return null;\n const trimmed = value.trim();\n if (!trimmed) return null;\n const parsed = new Date(trimmed);\n if (Number.isNaN(parsed.getTime())) {\n throw new Error(`invalid projection scope timestamp: ${value}`);\n }\n return parsed.toISOString();\n}\n\nfunction normalizeProjectionScope(options: {\n updatedAfter?: string;\n updatedBefore?: string;\n}): {\n updatedAfter: string | null;\n updatedBefore: string | null;\n} {\n const updatedAfter = normalizeScopedIso(options.updatedAfter);\n const updatedBefore = normalizeScopedIso(options.updatedBefore);\n if (\n updatedAfter &&\n updatedBefore &&\n new Date(updatedAfter).getTime() > new Date(updatedBefore).getTime()\n ) {\n throw new Error(\"updatedAfter must be less than or equal to updatedBefore\");\n }\n return {\n updatedAfter,\n updatedBefore,\n };\n}\n\nfunction hasScopedProjectionFilter(scope: {\n updatedAfter: string | null;\n updatedBefore: string | null;\n}): boolean {\n return scope.updatedAfter !== null || scope.updatedBefore !== null;\n}\n\nfunction memoryScopeTimestamp(memory: MemoryFile): string {\n const candidate = memory.frontmatter.updated || memory.frontmatter.created;\n return candidate;\n}\n\nfunction isTimestampInProjectionScope(\n timestamp: string,\n scope: { updatedAfter: string | null; updatedBefore: string | null },\n): boolean {\n if (!scope.updatedAfter && !scope.updatedBefore) return true;\n const parsed = new Date(timestamp);\n if (Number.isNaN(parsed.getTime())) return false;\n if (scope.updatedAfter && parsed.getTime() < new Date(scope.updatedAfter).getTime()) return false;\n if (scope.updatedBefore && parsed.getTime() >= new Date(scope.updatedBefore).getTime()) return false;\n return true;\n}\n\nfunction filterMemoriesForProjectionScope(\n memories: MemoryFile[],\n scope: { updatedAfter: string | null; updatedBefore: string | null },\n): MemoryFile[] {\n if (!scope.updatedAfter && !scope.updatedBefore) return memories;\n return memories.filter((memory) => isTimestampInProjectionScope(memoryScopeTimestamp(memory), scope));\n}\n\nfunction filterCurrentStateRowsForProjectionScope(\n rows: MemoryProjectionCurrentState[],\n scope: { updatedAfter: string | null; updatedBefore: string | null },\n): MemoryProjectionCurrentState[] {\n if (!scope.updatedAfter && !scope.updatedBefore) return rows;\n return rows.filter((row) => isTimestampInProjectionScope(row.updated || row.created, scope));\n}\n\nfunction serializeCurrentStateRow(row: MemoryProjectionCurrentState): string {\n return JSON.stringify({\n memoryId: row.memoryId,\n category: row.category,\n status: row.status,\n lifecycleState: row.lifecycleState ?? null,\n pathRel: row.pathRel,\n created: row.created,\n updated: row.updated,\n archivedAt: row.archivedAt ?? null,\n supersededAt: row.supersededAt ?? null,\n entityRef: row.entityRef ?? null,\n source: row.source,\n confidence: row.confidence,\n confidenceTier: row.confidenceTier,\n memoryKind: row.memoryKind ?? null,\n accessCount: row.accessCount ?? null,\n lastAccessed: row.lastAccessed ?? null,\n tags: row.tags ?? [],\n preview: row.preview ?? \"\",\n privateRecord: row.privateRecord === true,\n });\n}\n\nfunction serializeTimelineEvent(event: MemoryLifecycleEvent): string {\n return JSON.stringify({\n eventId: event.eventId,\n memoryId: event.memoryId,\n eventType: event.eventType,\n timestamp: event.timestamp,\n actor: event.actor,\n reasonCode: event.reasonCode ?? null,\n ruleVersion: event.ruleVersion,\n relatedMemoryIds: event.relatedMemoryIds ?? [],\n before: event.before ?? null,\n after: event.after ?? null,\n correlationId: event.correlationId ?? null,\n });\n}\n\nfunction serializeEntityMentionRow(row: ProjectedEntityMentionRow): string {\n return JSON.stringify(row);\n}\n\nfunction serializeNativeKnowledgeRow(row: ProjectedNativeKnowledgeChunkRow): string {\n return JSON.stringify({\n chunkId: row.chunkId,\n sourceKind: row.sourceKind,\n sourcePath: row.sourcePath,\n title: row.title,\n startLine: row.startLine,\n endLine: row.endLine,\n namespace: row.namespace ?? null,\n privacyClass: row.privacyClass ?? null,\n derivedDate: row.derivedDate ?? null,\n sessionKey: row.sessionKey ?? null,\n workflowKey: row.workflowKey ?? null,\n author: row.author ?? null,\n agent: row.agent ?? null,\n sourceHash: row.sourceHash ?? null,\n preview: row.preview,\n });\n}\n\nfunction serializeGovernanceReviewQueueRow(\n row: MemoryProjectionGovernanceReviewQueueRow,\n): string {\n return JSON.stringify({\n runId: row.runId,\n entryId: row.entryId,\n memoryId: row.memoryId,\n path: row.path,\n reasonCode: row.reasonCode,\n severity: row.severity,\n suggestedAction: row.suggestedAction,\n suggestedStatus: row.suggestedStatus ?? null,\n relatedMemoryIds: row.relatedMemoryIds,\n });\n}\n\nfunction selectProjectionMemories(\n tiers: MemoryFile[][],\n): {\n allMemories: MemoryFile[];\n memories: MemoryFile[];\n skippedDuplicateMemories: SkippedDuplicateMemory[];\n skippedBlankIdMemories: SkippedBlankIdMemory[];\n} {\n const allMemories = tiers.flat();\n const memories: MemoryFile[] = [];\n const keptById = new Map<string, MemoryFile>();\n const skippedDuplicateMemories: SkippedDuplicateMemory[] = [];\n const skippedBlankIdMemories: SkippedBlankIdMemory[] = [];\n\n // Tier order is authoritative: hot wins over cold, and cold wins over archive.\n // Paths break ties within a tier so the winner does not depend on readdir order.\n for (const tier of tiers) {\n for (const memory of [...tier].sort((left, right) => left.path.localeCompare(right.path))) {\n const memoryId = memory.frontmatter.id.trim();\n if (!memoryId) {\n skippedBlankIdMemories.push({ path: memory.path });\n log.warn(`projection rebuild skipped blank memory id: path=${memory.path}`);\n continue;\n }\n const kept = keptById.get(memoryId);\n if (kept) {\n skippedDuplicateMemories.push({\n memoryId,\n keptPath: kept.path,\n skippedPath: memory.path,\n });\n log.warn(\n `projection rebuild skipped duplicate memory id=${memoryId}: kept=${kept.path} skipped=${memory.path}`,\n );\n continue;\n }\n keptById.set(memoryId, memory);\n memories.push(memory);\n }\n }\n\n return { allMemories, memories, skippedDuplicateMemories, skippedBlankIdMemories };\n}\n\nasync function loadAuthoritativeProjectionSnapshot(options: {\n memoryDir: string;\n defaultNamespace?: string;\n storage?: StorageManager;\n updatedAfter?: string;\n updatedBefore?: string;\n retainRaw?: boolean;\n signal?: AbortSignal;\n}): Promise<{\n allMemories: MemoryFile[];\n currentRows: MemoryProjectionCurrentState[];\n timelineRows: MemoryLifecycleEvent[];\n scopedCurrentRows: MemoryProjectionCurrentState[];\n scopedTimelineRows: MemoryLifecycleEvent[];\n entityMentionRows: ProjectedEntityMentionRow[];\n scopedEntityMentionRows: ProjectedEntityMentionRow[];\n nativeKnowledgeRows: ProjectedNativeKnowledgeChunkRow[];\n governance:\n | {\n runId: string;\n summary: unknown;\n metrics: unknown;\n reviewQueueRows: MemoryProjectionGovernanceReviewQueueRow[];\n appliedActionRows: MemoryProjectionGovernanceAppliedActionRow[];\n report: string;\n }\n | null;\n usedLifecycleLedger: boolean;\n sourceLifecycleLedgerEventCount: number;\n scope: {\n updatedAfter: string | null;\n updatedBefore: string | null;\n };\n skippedDuplicateMemories: SkippedDuplicateMemory[];\n skippedBlankIdMemories: SkippedBlankIdMemory[];\n skippedDuplicateTimelineEvents: SkippedDuplicateTimelineEvent[];\n skippedBlankIdTimelineEvents: SkippedBlankIdTimelineEvent[];\n}> {\n const storage = assertInjectedStorageRooted(\"rebuildMemoryProjection\", options.memoryDir, options.storage) ?? new StorageManager(options.memoryDir);\n // Force a fresh disk read — projection verify/rebuild must see the true\n // on-disk state, not a potentially stale in-process cache.\n storage.invalidateAllMemoriesCacheForDir({ indexedText: false });\n const corpusRead = {\n retainRaw: options.retainRaw === true,\n abortSignal: options.signal,\n };\n const hot = await storage.readAllMemories(corpusRead);\n await throwIfProjectionRebuildAborted(options.signal);\n const cold = await storage.readAllColdMemories(corpusRead);\n await throwIfProjectionRebuildAborted(options.signal);\n const archived = await storage.readArchivedMemories(corpusRead);\n await throwIfProjectionRebuildAborted(options.signal);\n const selected = selectProjectionMemories([hot, cold, archived]);\n const allMemories = selected.allMemories;\n const projectionMemories = selected.memories;\n const currentRows = projectionMemories.map((memory) => toCurrentStateRow(options.memoryDir, memory));\n // Preview is already a detached copy. Drop the document bodies before the\n // ledger scan so peak heap is the larger of the corpus and the timeline,\n // not both. These objects bypass the shared caches when retainRaw is off,\n // so clearing them cannot strip a raw copy another caller is holding.\n if (options.retainRaw !== true) {\n for (const memory of allMemories) memory.content = \"\";\n }\n const {\n events,\n usedLifecycleLedger,\n sourceLifecycleLedgerEventCount,\n skipped: skippedDuplicateTimelineEvents,\n skippedBlankIds: skippedBlankIdTimelineEvents,\n } = await loadProjectionTimeline({\n storage,\n memoryDir: options.memoryDir,\n memories: projectionMemories,\n signal: options.signal,\n });\n await throwIfProjectionRebuildAborted(options.signal);\n const scope = normalizeProjectionScope(options);\n const scopedMemories = filterMemoriesForProjectionScope(projectionMemories, scope);\n const scopedMemoryIds = new Set(scopedMemories.map((memory) => memory.frontmatter.id));\n const nativeKnowledgeRows = await loadPersistedNativeKnowledgeChunks({\n memoryDir: options.memoryDir,\n defaultNamespace: options.defaultNamespace ?? \"default\",\n }).then((rows) => rows.map((row) => ({\n chunkId: row.chunkId,\n sourceKind: row.sourceKind,\n sourcePath: row.sourcePath,\n title: row.title,\n startLine: row.startLine,\n endLine: row.endLine,\n namespace: row.namespace ?? options.defaultNamespace ?? \"default\",\n privacyClass: row.privacyClass,\n derivedDate: row.derivedDate,\n sessionKey: row.sessionKey,\n workflowKey: row.workflowKey,\n author: row.author,\n agent: row.agent,\n sourceHash: row.sourceHash,\n preview: normalizeProjectionPreview(row.content),\n })));\n const governance = await loadLatestGovernanceProjection(options.memoryDir);\n const entityMentionRows = buildEntityMentionRows(currentRows);\n\n return {\n allMemories,\n currentRows,\n timelineRows: events,\n scopedCurrentRows: currentRows.filter((row) => scopedMemoryIds.has(row.memoryId)),\n scopedTimelineRows: events.filter((event) => scopedMemoryIds.has(event.memoryId)),\n entityMentionRows,\n scopedEntityMentionRows: entityMentionRows.filter((row) => scopedMemoryIds.has(row.memoryId)),\n nativeKnowledgeRows,\n governance,\n usedLifecycleLedger,\n sourceLifecycleLedgerEventCount,\n scope,\n skippedDuplicateMemories: selected.skippedDuplicateMemories,\n skippedBlankIdMemories: selected.skippedBlankIdMemories,\n skippedDuplicateTimelineEvents,\n skippedBlankIdTimelineEvents,\n };\n}\n\nfunction readProjectedCurrentRows(\n memoryDir: string,\n): { projectionExists: boolean; rows: MemoryProjectionCurrentState[] } {\n const dbPath = getMemoryProjectionPath(memoryDir);\n try {\n const db = openBetterSqlite3(dbPath, { readonly: true, fileMustExist: true });\n try {\n const selectExpressions = memoryCurrentSelectExpressions(db);\n const rows = db.prepare(`\n SELECT\n memory_id,\n category,\n status,\n lifecycle_state,\n path_rel,\n created_at,\n updated_at,\n archived_at,\n superseded_at,\n entity_ref,\n source,\n confidence,\n confidence_tier,\n memory_kind,\n access_count,\n last_accessed,\n ${selectExpressions.tagsJson}, ${selectExpressions.previewText}, ${selectExpressions.privateRecord}\n FROM memory_current\n `).all() as Array<Record<string, unknown>>;\n\n return {\n projectionExists: true,\n rows: rows\n .map((row) => parseCurrentRow(memoryDir, row))\n .filter((row): row is MemoryProjectionCurrentState => row !== null),\n };\n } finally {\n db.close();\n }\n } catch {\n return { projectionExists: false, rows: [] };\n }\n}\n\nfunction readProjectedTimelineRows(\n memoryDir: string,\n): { projectionExists: boolean; rows: MemoryLifecycleEvent[] } {\n const dbPath = getMemoryProjectionPath(memoryDir);\n try {\n const db = openBetterSqlite3(dbPath, { readonly: true, fileMustExist: true });\n try {\n const rows = db.prepare(`\n SELECT\n event_id,\n memory_id,\n event_type,\n timestamp,\n actor,\n reason_code,\n rule_version,\n related_memory_ids_json,\n before_json,\n after_json,\n correlation_id\n FROM memory_timeline\n `).all() as Array<Record<string, unknown>>;\n\n return {\n projectionExists: true,\n rows: parseTimelineRows(rows),\n };\n } finally {\n db.close();\n }\n } catch {\n return { projectionExists: false, rows: [] };\n }\n}\n\n\nfunction writeProjectionDb(\n dbPath: string,\n nowIso: string,\n currentRows: MemoryProjectionCurrentState[],\n timelineRows: MemoryLifecycleEvent[],\n entityMentionRows: ProjectedEntityMentionRow[],\n nativeKnowledgeRows: ProjectedNativeKnowledgeChunkRow[],\n governance: Awaited<ReturnType<typeof loadLatestGovernanceProjection>>,\n usedLifecycleLedger: boolean,\n sourceLifecycleLedgerEventCount: number,\n complete: boolean,\n): void {\n const db = openBetterSqlite3(dbPath);\n const memoryDir = path.dirname(path.dirname(dbPath));\n try {\n initializeMemoryProjectionDb(db);\n\n const insertMeta = db.prepare(\"INSERT OR REPLACE INTO meta(key, value) VALUES (?, ?)\");\n insertMeta.run(\"schemaVersion\", String(MEMORY_PROJECTION_SCHEMA_VERSION));\n insertMeta.run(\"rebuiltAt\", nowIso);\n insertMeta.run(\"usedLifecycleLedger\", usedLifecycleLedger ? \"true\" : \"false\");\n insertMeta.run(\"complete\", complete ? \"true\" : \"false\");\n writeProjectionMetaHighWater(insertMeta, sourceLifecycleLedgerEventCount, timelineRows);\n insertMeta.run(\"latestGovernanceRunId\", governance?.runId ?? \"\");\n\n const insertCurrent = db.prepare(`\n INSERT INTO memory_current (\n memory_id,\n category,\n status,\n lifecycle_state,\n path_rel,\n path_valid,\n created_at,\n updated_at,\n archived_at,\n superseded_at,\n entity_ref,\n source,\n confidence,\n confidence_tier,\n memory_kind,\n access_count,\n last_accessed,\n tags_json, preview_text, private_record\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n const insertTimeline = db.prepare(`\n INSERT INTO memory_timeline (\n event_id,\n memory_id,\n event_type,\n timestamp,\n event_order,\n actor,\n reason_code,\n rule_version,\n related_memory_ids_json,\n before_json,\n after_json,\n correlation_id\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n const insertEntityMention = db.prepare(`\n INSERT INTO memory_entity_mentions (\n memory_id,\n entity_ref,\n mention_source,\n created_at,\n updated_at\n ) VALUES (?, ?, ?, ?, ?)\n `);\n\n const insertNativeKnowledge = db.prepare(`\n INSERT INTO native_knowledge_chunks (\n chunk_id,\n source_kind,\n source_path,\n title,\n start_line,\n end_line,\n namespace,\n privacy_class,\n derived_date,\n session_key,\n workflow_key,\n author,\n agent,\n source_hash,\n preview_text\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n const insertGovernanceReviewQueue = db.prepare(`\n INSERT INTO memory_review_queue (\n entry_id,\n run_id,\n memory_id,\n path,\n reason_code,\n severity,\n suggested_action,\n suggested_status,\n related_memory_ids_json\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n const insertGovernanceAppliedAction = db.prepare(`\n INSERT INTO memory_review_actions (\n row_key,\n run_id,\n action,\n memory_id,\n reason_code,\n before_status,\n after_status,\n original_path,\n current_path\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n const insertGovernanceRun = db.prepare(`\n INSERT INTO memory_review_runs (\n run_id,\n created_at,\n mode,\n summary_json,\n metrics_json,\n applied_actions_json,\n report_markdown\n ) VALUES (?, ?, ?, ?, ?, ?, ?)\n `);\n\n const writeTx = db.transaction(() => {\n for (const row of currentRows) {\n insertCurrent.run(\n row.memoryId,\n row.category,\n row.status,\n row.lifecycleState ?? null,\n row.pathRel,\n isProjectedMemoryPathValid(memoryDir, row.pathRel) ? 1 : 0,\n row.created,\n row.updated,\n row.archivedAt ?? null,\n row.supersededAt ?? null,\n row.entityRef ?? null,\n row.source,\n row.confidence,\n row.confidenceTier,\n row.memoryKind ?? null,\n row.accessCount ?? null,\n row.lastAccessed ?? null, JSON.stringify(row.tags ?? []), row.preview ?? \"\",\n row.privateRecord === true ? 1 : 0,\n );\n }\n\n for (const event of timelineRows) {\n insertTimeline.run(\n event.eventId,\n event.memoryId,\n event.eventType,\n event.timestamp,\n MEMORY_LIFECYCLE_EVENT_SORT_ORDER[event.eventType],\n event.actor,\n event.reasonCode ?? null,\n event.ruleVersion,\n JSON.stringify(event.relatedMemoryIds ?? []),\n event.before ? JSON.stringify(event.before) : null,\n event.after ? JSON.stringify(event.after) : null,\n event.correlationId ?? null,\n );\n }\n\n for (const row of entityMentionRows) {\n insertEntityMention.run(\n row.memoryId,\n row.entityRef,\n row.mentionSource,\n row.created,\n row.updated,\n );\n }\n\n for (const row of nativeKnowledgeRows) {\n insertNativeKnowledge.run(\n row.chunkId,\n row.sourceKind,\n row.sourcePath,\n row.title,\n row.startLine,\n row.endLine,\n row.namespace ?? null,\n row.privacyClass ?? null,\n row.derivedDate ?? null,\n row.sessionKey ?? null,\n row.workflowKey ?? null,\n row.author ?? null,\n row.agent ?? null,\n row.sourceHash ?? null,\n row.preview,\n );\n }\n\n for (const row of governance?.reviewQueueRows ?? []) {\n insertGovernanceReviewQueue.run(\n row.entryId,\n row.runId,\n row.memoryId,\n row.path,\n row.reasonCode,\n row.severity,\n row.suggestedAction,\n row.suggestedStatus ?? null,\n JSON.stringify(row.relatedMemoryIds),\n );\n }\n\n for (const row of governance?.appliedActionRows ?? []) {\n insertGovernanceAppliedAction.run(\n row.rowKey,\n row.runId,\n row.action,\n row.memoryId,\n row.reasonCode,\n row.beforeStatus,\n row.afterStatus ?? null,\n row.originalPath,\n row.currentPath,\n );\n }\n\n if (governance) {\n const createdAt =\n typeof (governance.summary as { createdAt?: unknown } | undefined)?.createdAt === \"string\"\n ? (governance.summary as { createdAt: string }).createdAt\n : nowIso;\n const mode =\n typeof (governance.summary as { mode?: unknown } | undefined)?.mode === \"string\"\n ? (governance.summary as { mode: string }).mode\n : \"shadow\";\n insertGovernanceRun.run(\n governance.runId,\n createdAt,\n mode,\n JSON.stringify(governance.summary ?? null),\n JSON.stringify(governance.metrics ?? null),\n JSON.stringify(\n (governance.appliedActionRows ?? []).map((row) => ({\n action: row.action,\n memoryId: row.memoryId,\n reasonCode: row.reasonCode,\n beforeStatus: row.beforeStatus,\n afterStatus: row.afterStatus,\n originalPath: row.originalPath,\n currentPath: row.currentPath,\n })),\n ),\n governance.report,\n );\n }\n });\n\n writeTx();\n } finally {\n db.close();\n }\n}\n\nfunction mergeScopedCurrentRows(\n existingRows: MemoryProjectionCurrentState[],\n replacementRows: MemoryProjectionCurrentState[],\n scopedMemoryIds: Set<string>,\n): MemoryProjectionCurrentState[] {\n return [...existingRows.filter((row) => !scopedMemoryIds.has(row.memoryId)), ...replacementRows]\n .sort((a, b) => a.memoryId.localeCompare(b.memoryId));\n}\n\nfunction mergeScopedTimelineRows(\n existingRows: MemoryLifecycleEvent[],\n replacementRows: MemoryLifecycleEvent[],\n scopedMemoryIds: Set<string>,\n): MemoryLifecycleEvent[] {\n return sortMemoryLifecycleEvents([\n ...existingRows.filter((event) => !scopedMemoryIds.has(event.memoryId)),\n ...replacementRows,\n ]);\n}\n\nfunction mergeScopedEntityMentionRows(\n existingRows: ProjectedEntityMentionRow[],\n replacementRows: ProjectedEntityMentionRow[],\n scopedMemoryIds: Set<string>,\n): ProjectedEntityMentionRow[] {\n return [\n ...existingRows.filter((row) => !scopedMemoryIds.has(row.memoryId)),\n ...replacementRows,\n ].sort((left, right) =>\n [left.entityRef, left.memoryId, left.mentionSource].join(\"::\").localeCompare(\n [right.entityRef, right.memoryId, right.mentionSource].join(\"::\"),\n )\n );\n}\n\nexport async function rebuildMemoryProjection(\n options: RebuildMemoryProjectionOptions,\n): Promise<RebuildMemoryProjectionResult> {\n const dryRun = options.dryRun !== false;\n const now = options.now ?? new Date();\n const outputPath = getMemoryProjectionPath(options.memoryDir);\n const snapshot = await loadAuthoritativeProjectionSnapshot(options);\n await throwIfProjectionRebuildAborted(options.signal);\n\n let backupPath: string | undefined;\n if (!dryRun) {\n let nextCurrentRows = snapshot.currentRows;\n let nextTimelineRows = snapshot.timelineRows;\n let nextEntityMentionRows = snapshot.entityMentionRows;\n let nextNativeKnowledgeRows = snapshot.nativeKnowledgeRows;\n let nextGovernance = snapshot.governance;\n if (hasScopedProjectionFilter(snapshot.scope)) {\n nextCurrentRows = snapshot.scopedCurrentRows;\n nextTimelineRows = snapshot.scopedTimelineRows;\n nextEntityMentionRows = snapshot.scopedEntityMentionRows;\n const projectedCurrent = readProjectedCurrentRows(options.memoryDir);\n const projectedTimeline = readProjectedTimelineRows(options.memoryDir);\n const projectedEntityMentions = readProjectedEntityMentionRows(options.memoryDir);\n const projectedNativeKnowledge = readProjectedNativeKnowledgeRows(options.memoryDir);\n const projectedGovernance = readProjectedGovernanceRows(options.memoryDir);\n if (projectedCurrent.projectionExists && projectedTimeline.projectionExists) {\n const actualScopedCurrentRows = filterCurrentStateRowsForProjectionScope(\n projectedCurrent.rows,\n snapshot.scope,\n );\n const scopedMemoryIds = new Set([\n ...snapshot.scopedCurrentRows.map((row) => row.memoryId),\n ...snapshot.scopedTimelineRows.map((event) => event.memoryId),\n ...actualScopedCurrentRows.map((row) => row.memoryId),\n ]);\n nextCurrentRows = mergeScopedCurrentRows(\n projectedCurrent.rows,\n snapshot.scopedCurrentRows,\n scopedMemoryIds,\n );\n nextTimelineRows = mergeScopedTimelineRows(\n projectedTimeline.rows,\n snapshot.scopedTimelineRows,\n scopedMemoryIds,\n );\n nextEntityMentionRows = mergeScopedEntityMentionRows(\n projectedEntityMentions.rows,\n snapshot.scopedEntityMentionRows,\n scopedMemoryIds,\n );\n }\n if (projectedNativeKnowledge.projectionExists) {\n // Native knowledge rows are always loaded from the full persisted sync state,\n // so scoped memory rebuilds should publish the fresh snapshot instead of\n // pinning the projection to stale previously projected rows.\n nextNativeKnowledgeRows = snapshot.nativeKnowledgeRows;\n }\n if (projectedGovernance.projectionExists && projectedGovernance.runId) {\n // Governance rows are also sourced from standalone artifact snapshots, so\n // scoped memory rebuilds should keep the latest governance artifact data\n // instead of restoring whatever happened to be in the prior projection.\n nextGovernance = snapshot.governance;\n }\n }\n\n const tempPath = `${outputPath}.tmp`;\n await mkdir(path.dirname(outputPath), { recursive: true });\n await throwIfProjectionRebuildAborted(options.signal);\n await rm(tempPath, { force: true });\n writeProjectionDb(\n tempPath,\n now.toISOString(),\n nextCurrentRows,\n nextTimelineRows,\n nextEntityMentionRows,\n nextNativeKnowledgeRows,\n nextGovernance,\n snapshot.usedLifecycleLedger,\n snapshot.sourceLifecycleLedgerEventCount,\n !hasScopedProjectionFilter(snapshot.scope),\n );\n try {\n await throwIfProjectionRebuildAborted(options.signal);\n backupPath = await backupExistingProjection(options.memoryDir, outputPath, now);\n await throwIfProjectionRebuildAborted(options.signal);\n backupPath = await commitPreparedFileAtomically(\n tempPath,\n outputPath,\n backupPath,\n () => throwIfProjectionRebuildAborted(options.signal),\n );\n } catch (err) {\n if (options.signal?.aborted) await rm(tempPath, { force: true });\n throw err;\n }\n }\n\n return {\n dryRun,\n scannedMemories: snapshot.allMemories.length,\n currentRows: snapshot.scopedCurrentRows.length,\n timelineRows: snapshot.scopedTimelineRows.length,\n entityMentionRows: snapshot.scopedEntityMentionRows.length,\n nativeKnowledgeRows: snapshot.nativeKnowledgeRows.length,\n reviewQueueRows: snapshot.governance?.reviewQueueRows.length ?? 0,\n outputPath,\n backupPath,\n usedLifecycleLedger: snapshot.usedLifecycleLedger,\n skippedDuplicateMemories: snapshot.skippedDuplicateMemories,\n skippedBlankIdMemories: snapshot.skippedBlankIdMemories,\n skippedDuplicateTimelineEvents: snapshot.skippedDuplicateTimelineEvents,\n skippedBlankIdTimelineEvents: snapshot.skippedBlankIdTimelineEvents,\n scope: snapshot.scope,\n };\n}\n\nexport async function verifyMemoryProjection(\n options: VerifyMemoryProjectionOptions,\n): Promise<VerifyMemoryProjectionResult> {\n const outputPath = getMemoryProjectionPath(options.memoryDir);\n const snapshot = await loadAuthoritativeProjectionSnapshot(options);\n const projectedCurrent = readProjectedCurrentRows(options.memoryDir);\n const projectedTimeline = readProjectedTimelineRows(options.memoryDir);\n const projectedEntityMentions = readProjectedEntityMentionRows(options.memoryDir);\n const projectedNativeKnowledge = readProjectedNativeKnowledgeRows(options.memoryDir);\n const projectedGovernance = readProjectedGovernanceRows(options.memoryDir);\n const projectionExists = projectedCurrent.projectionExists\n || projectedTimeline.projectionExists\n || projectedEntityMentions.projectionExists\n || projectedNativeKnowledge.projectionExists\n || projectedGovernance.projectionExists;\n\n const actualScopedCurrentRows = filterCurrentStateRowsForProjectionScope(projectedCurrent.rows, snapshot.scope);\n const expectedCurrentById = new Map(\n snapshot.scopedCurrentRows.map((row) => [row.memoryId, serializeCurrentStateRow(row)]),\n );\n const actualCurrentById = new Map(\n actualScopedCurrentRows.map((row) => [row.memoryId, serializeCurrentStateRow(row)]),\n );\n\n const missingCurrentMemoryIds = [...expectedCurrentById.keys()]\n .filter((memoryId) => !actualCurrentById.has(memoryId))\n .sort();\n const extraCurrentMemoryIds = [...actualCurrentById.keys()]\n .filter((memoryId) => !expectedCurrentById.has(memoryId))\n .sort();\n const mismatchedCurrentMemoryIds = [...expectedCurrentById.keys()]\n .filter((memoryId) =>\n actualCurrentById.has(memoryId) && actualCurrentById.get(memoryId) !== expectedCurrentById.get(memoryId)\n )\n .sort();\n\n const selectedMemoryIds = new Set([\n ...snapshot.scopedCurrentRows.map((row) => row.memoryId),\n ...actualScopedCurrentRows.map((row) => row.memoryId),\n ]);\n const expectedTimelineById = new Map(\n snapshot.scopedTimelineRows.map((event) => [event.eventId, serializeTimelineEvent(event)]),\n );\n const actualTimelineRows = projectedTimeline.rows.filter((event) => selectedMemoryIds.has(event.memoryId));\n const actualTimelineById = new Map(\n actualTimelineRows.map((event) => [event.eventId, serializeTimelineEvent(event)]),\n );\n const missingTimelineEventIds = [...expectedTimelineById.keys()]\n .filter((eventId) => !actualTimelineById.has(eventId))\n .sort();\n const extraTimelineEventIds = [...actualTimelineById.keys()]\n .filter((eventId) => !expectedTimelineById.has(eventId))\n .sort();\n\n const expectedEntityMentionsByKey = new Map(\n snapshot.scopedEntityMentionRows.map((row) => [\n `${row.memoryId}::${row.entityRef}::${row.mentionSource}`,\n serializeEntityMentionRow(row),\n ]),\n );\n const actualScopedEntityMentionRows = projectedEntityMentions.rows.filter((row) => selectedMemoryIds.has(row.memoryId));\n const actualEntityMentionsByKey = new Map(\n actualScopedEntityMentionRows.map((row) => [\n `${row.memoryId}::${row.entityRef}::${row.mentionSource}`,\n serializeEntityMentionRow(row),\n ]),\n );\n const missingEntityMentionKeys = [...expectedEntityMentionsByKey.keys()]\n .filter((key) => !actualEntityMentionsByKey.has(key))\n .sort();\n const extraEntityMentionKeys = [...actualEntityMentionsByKey.keys()]\n .filter((key) => !expectedEntityMentionsByKey.has(key))\n .sort();\n const mismatchedEntityMentionKeys = [...expectedEntityMentionsByKey.keys()]\n .filter((key) =>\n actualEntityMentionsByKey.has(key) && actualEntityMentionsByKey.get(key) !== expectedEntityMentionsByKey.get(key)\n )\n .sort();\n\n const expectedNativeKnowledgeById = new Map(\n snapshot.nativeKnowledgeRows.map((row) => [row.chunkId, serializeNativeKnowledgeRow(row)]),\n );\n const actualNativeKnowledgeById = new Map(\n projectedNativeKnowledge.rows.map((row) => [row.chunkId, serializeNativeKnowledgeRow(row)]),\n );\n const missingNativeKnowledgeChunkIds = [...expectedNativeKnowledgeById.keys()]\n .filter((chunkId) => !actualNativeKnowledgeById.has(chunkId))\n .sort();\n const extraNativeKnowledgeChunkIds = [...actualNativeKnowledgeById.keys()]\n .filter((chunkId) => !expectedNativeKnowledgeById.has(chunkId))\n .sort();\n const mismatchedNativeKnowledgeChunkIds = [...expectedNativeKnowledgeById.keys()]\n .filter((chunkId) =>\n actualNativeKnowledgeById.has(chunkId) && actualNativeKnowledgeById.get(chunkId) !== expectedNativeKnowledgeById.get(chunkId)\n )\n .sort();\n\n const expectedReviewQueueById = new Map(\n (snapshot.governance?.reviewQueueRows ?? []).map((row) => [\n `${row.runId}::${row.entryId}`,\n serializeGovernanceReviewQueueRow(row),\n ]),\n );\n const actualReviewQueueById = new Map(\n projectedGovernance.reviewQueueRows.map((row) => [\n `${row.runId}::${row.entryId}`,\n serializeGovernanceReviewQueueRow(row),\n ]),\n );\n const missingReviewQueueEntryIds = [...expectedReviewQueueById.keys()]\n .filter((entryId) => !actualReviewQueueById.has(entryId))\n .sort();\n const extraReviewQueueEntryIds = [...actualReviewQueueById.keys()]\n .filter((entryId) => !expectedReviewQueueById.has(entryId))\n .sort();\n const mismatchedReviewQueueEntryIds = [...expectedReviewQueueById.keys()]\n .filter((entryId) =>\n actualReviewQueueById.has(entryId) && actualReviewQueueById.get(entryId) !== expectedReviewQueueById.get(entryId)\n )\n .sort();\n\n return {\n outputPath,\n projectionExists,\n ok:\n projectionExists &&\n missingCurrentMemoryIds.length === 0 &&\n extraCurrentMemoryIds.length === 0 &&\n mismatchedCurrentMemoryIds.length === 0 &&\n missingTimelineEventIds.length === 0 &&\n extraTimelineEventIds.length === 0 &&\n missingEntityMentionKeys.length === 0 &&\n extraEntityMentionKeys.length === 0 &&\n mismatchedEntityMentionKeys.length === 0 &&\n missingNativeKnowledgeChunkIds.length === 0 &&\n extraNativeKnowledgeChunkIds.length === 0 &&\n mismatchedNativeKnowledgeChunkIds.length === 0 &&\n missingReviewQueueEntryIds.length === 0 &&\n extraReviewQueueEntryIds.length === 0 &&\n mismatchedReviewQueueEntryIds.length === 0,\n expectedCurrentRows: snapshot.scopedCurrentRows.length,\n actualCurrentRows: actualScopedCurrentRows.length,\n expectedTimelineRows: snapshot.scopedTimelineRows.length,\n actualTimelineRows: actualTimelineRows.length,\n expectedEntityMentionRows: snapshot.scopedEntityMentionRows.length,\n actualEntityMentionRows: actualScopedEntityMentionRows.length,\n expectedNativeKnowledgeRows: snapshot.nativeKnowledgeRows.length,\n actualNativeKnowledgeRows: projectedNativeKnowledge.rows.length,\n expectedReviewQueueRows: snapshot.governance?.reviewQueueRows.length ?? 0,\n actualReviewQueueRows: projectedGovernance.reviewQueueRows.length,\n missingCurrentMemoryIds,\n extraCurrentMemoryIds,\n mismatchedCurrentMemoryIds,\n missingTimelineEventIds,\n extraTimelineEventIds,\n missingEntityMentionKeys,\n extraEntityMentionKeys,\n mismatchedEntityMentionKeys,\n missingNativeKnowledgeChunkIds,\n extraNativeKnowledgeChunkIds,\n mismatchedNativeKnowledgeChunkIds,\n missingReviewQueueEntryIds,\n extraReviewQueueEntryIds,\n mismatchedReviewQueueEntryIds,\n usedLifecycleLedger: snapshot.usedLifecycleLedger,\n scope: snapshot.scope,\n };\n}\n\nexport async function repairMemoryProjection(\n options: RepairMemoryProjectionOptions,\n): Promise<RepairMemoryProjectionResult> {\n const dryRun = options.dryRun !== false;\n const verify = await verifyMemoryProjection(options);\n if (verify.ok) {\n return {\n dryRun,\n repaired: false,\n verify,\n };\n }\n if (dryRun) {\n return {\n dryRun: true,\n repaired: false,\n verify,\n };\n }\n\n const rebuild = await rebuildMemoryProjection({\n ...options,\n dryRun: false,\n });\n const verified = await verifyMemoryProjection(options);\n return {\n dryRun: false,\n repaired: verified.ok,\n verify: verified,\n rebuild,\n };\n}\n","/**\n * Projection timeline assembly.\n *\n * The lifecycle ledger is streamed one event at a time. Dedup keeps the same\n * winner as sort-then-first-wins (stable `compareMemoryLifecycleEvents`, file\n * order on ties) without materializing the unsorted ledger beside the result.\n */\nimport path from \"node:path\";\nimport { throwIfAborted } from \"../abort-error.js\";\nimport { log } from \"../logger.js\";\nimport type { MemoryFile, MemoryLifecycleEvent } from \"../types.js\";\nimport {\n buildLifecycleEventsForMemory,\n compareMemoryLifecycleEvents,\n memoryLifecycleEventProjectionIdentity,\n sortMemoryLifecycleEvents,\n} from \"../memory-lifecycle-ledger-utils.js\";\nimport type {\n SkippedBlankIdTimelineEvent,\n SkippedDuplicateTimelineEvent,\n} from \"./projection-support.js\";\n\nexport interface ProjectionLedgerReader {\n iterateMemoryLifecycleEvents(): AsyncIterable<MemoryLifecycleEvent>;\n}\n\nexport interface ProjectionTimeline {\n events: MemoryLifecycleEvent[];\n usedLifecycleLedger: boolean;\n sourceLifecycleLedgerEventCount: number;\n skipped: SkippedDuplicateTimelineEvent[];\n skippedBlankIds: SkippedBlankIdTimelineEvent[];\n}\n\nfunction loadTimelineEvents(\n memories: MemoryFile[],\n lifecycleEvents: MemoryLifecycleEvent[],\n): { events: MemoryLifecycleEvent[]; usedLifecycleLedger: boolean } {\n if (lifecycleEvents.length > 0) {\n return {\n events: sortMemoryLifecycleEvents(lifecycleEvents),\n usedLifecycleLedger: true,\n };\n }\n\n return {\n events: sortMemoryLifecycleEvents(memories.flatMap((memory) => buildLifecycleEventsForMemory(memory))),\n usedLifecycleLedger: false,\n };\n}\n\nfunction deduplicateTimelineEvents(\n events: MemoryLifecycleEvent[],\n sourcePathFor: (event: MemoryLifecycleEvent) => string,\n): {\n events: MemoryLifecycleEvent[];\n skipped: SkippedDuplicateTimelineEvent[];\n skippedBlankIds: SkippedBlankIdTimelineEvent[];\n} {\n const keptById = new Map<string, { event: MemoryLifecycleEvent; path: string }>();\n const unique: MemoryLifecycleEvent[] = [];\n const skipped: SkippedDuplicateTimelineEvent[] = [];\n const skippedBlankIds: SkippedBlankIdTimelineEvent[] = [];\n for (const event of sortMemoryLifecycleEvents(events)) {\n const sourcePath = sourcePathFor(event);\n if (!event.memoryId.trim()) {\n skippedBlankIds.push({ eventId: event.eventId, path: sourcePath });\n log.warn(\n `projection rebuild skipped timeline event with blank memory id: `\n + `event_id=${event.eventId} path=${sourcePath}`,\n );\n continue;\n }\n const kept = keptById.get(event.eventId);\n if (kept) {\n skipped.push({\n eventId: event.eventId,\n keptPath: kept.path,\n skippedPath: sourcePath,\n });\n log.warn(\n `projection rebuild skipped duplicate timeline event_id=${event.eventId}: `\n + `kept=${kept.path} skipped=${sourcePath}`,\n );\n continue;\n }\n keptById.set(event.eventId, { event, path: sourcePath });\n unique.push(event);\n }\n return { events: unique, skipped, skippedBlankIds };\n}\n\nfunction internPool(): <T extends string>(value: T) => T {\n const pool = new Map<string, string>();\n return <T extends string>(value: T): T => {\n const existing = pool.get(value);\n if (existing !== undefined) return existing as T;\n pool.set(value, value);\n return value;\n };\n}\n\n/** Share repeated ledger scalars so a long ledger does not keep one string per row. */\nfunction internLedgerEvent(event: MemoryLifecycleEvent, intern: <T extends string>(value: T) => T): void {\n event.memoryId = intern(event.memoryId);\n event.eventType = intern(event.eventType);\n event.timestamp = intern(event.timestamp);\n event.actor = intern(event.actor);\n event.ruleVersion = intern(event.ruleVersion);\n if (event.reasonCode) event.reasonCode = intern(event.reasonCode);\n if (event.correlationId) event.correlationId = intern(event.correlationId);\n}\n\n/**\n * Stream ledger events into the deduped timeline. Returns null when the ledger\n * contributed no parsable row, so the caller can fall back to frontmatter.\n */\nasync function consumeLifecycleLedger(\n events: AsyncIterable<MemoryLifecycleEvent>,\n ledgerPath: string,\n signal?: AbortSignal,\n): Promise<ProjectionTimeline | null> {\n const intern = internPool();\n const best = new Map<string, MemoryLifecycleEvent>();\n const losers: MemoryLifecycleEvent[] = [];\n const blanks: MemoryLifecycleEvent[] = [];\n const identities = new Set<string>();\n let sawEvent = false;\n for await (const event of events) {\n throwIfAborted(signal, \"projection rebuild aborted\");\n sawEvent = true;\n internLedgerEvent(event, intern);\n identities.add(memoryLifecycleEventProjectionIdentity(event));\n if (!event.memoryId.trim()) {\n blanks.push(event);\n continue;\n }\n const prev = best.get(event.eventId);\n if (!prev) {\n best.set(event.eventId, event);\n continue;\n }\n if (compareMemoryLifecycleEvents(event, prev) < 0) {\n losers.push(prev);\n best.set(event.eventId, event);\n } else {\n losers.push(event);\n }\n }\n if (!sawEvent) return null;\n const sourceLifecycleLedgerEventCount = identities.size;\n identities.clear();\n const skippedBlankIds = sortMemoryLifecycleEvents(blanks).map((event) => {\n log.warn(\n `projection rebuild skipped timeline event with blank memory id: `\n + `event_id=${event.eventId} path=${ledgerPath}`,\n );\n return { eventId: event.eventId, path: ledgerPath };\n });\n const skipped = sortMemoryLifecycleEvents(losers).map((event) => {\n log.warn(\n `projection rebuild skipped duplicate timeline event_id=${event.eventId}: `\n + `kept=${ledgerPath} skipped=${ledgerPath}`,\n );\n return {\n eventId: event.eventId,\n keptPath: ledgerPath,\n skippedPath: ledgerPath,\n };\n });\n return {\n events: sortMemoryLifecycleEvents([...best.values()]),\n usedLifecycleLedger: true,\n sourceLifecycleLedgerEventCount,\n skipped,\n skippedBlankIds,\n };\n}\n\nexport async function loadProjectionTimeline(options: {\n storage: ProjectionLedgerReader;\n memoryDir: string;\n memories: MemoryFile[];\n signal?: AbortSignal;\n}): Promise<ProjectionTimeline> {\n const ledgerPath = path.join(options.memoryDir, \"state\", \"memory-lifecycle-ledger.jsonl\");\n const streamed = await consumeLifecycleLedger(\n options.storage.iterateMemoryLifecycleEvents(),\n ledgerPath,\n options.signal,\n );\n if (streamed) return streamed;\n\n const timeline = loadTimelineEvents(options.memories, []);\n const memoryPathById = new Map(\n options.memories.map((memory) => [memory.frontmatter.id, memory.path]),\n );\n const deduplicated = deduplicateTimelineEvents(\n timeline.events,\n (event) => memoryPathById.get(event.memoryId) ?? ledgerPath,\n );\n return {\n events: deduplicated.events,\n usedLifecycleLedger: false,\n sourceLifecycleLedgerEventCount: 0,\n skipped: deduplicated.skipped,\n skippedBlankIds: deduplicated.skippedBlankIds,\n };\n}\n","/**\n * Stop a projection-rebuild child when its parent is gone.\n *\n * A non-detached fork is reparented, not killed, when the daemon exits. The\n * IPC channel closes first. The child must observe that and refuse to publish,\n * or it can rename `memory-projection.sqlite.tmp` over a projection the\n * replacement daemon has already started serving.\n */\n\nexport function projectionRebuildParentDisconnected(): Error {\n return new Error(\"projection rebuild runner parent disconnected\");\n}\n\n/** Abort when this process loses its parent IPC channel. */\nexport function watchProjectionRebuildParent(): AbortSignal {\n const abort = new AbortController();\n const stop = () => {\n if (abort.signal.aborted) return;\n abort.abort(projectionRebuildParentDisconnected());\n };\n process.on(\"disconnect\", stop);\n if (process.connected === false) stop();\n return abort.signal;\n}\n\n/**\n * Yield so a disconnect that arrived during the previous await is applied,\n * then refuse to continue. No-op when the caller did not pass a signal.\n */\nexport async function throwIfProjectionRebuildAborted(\n signal: AbortSignal | undefined,\n): Promise<void> {\n if (!signal) return;\n await new Promise<void>((resolve) => {\n setImmediate(resolve);\n });\n if (!signal.aborted) return;\n const reason = signal.reason;\n throw reason instanceof Error ? reason : projectionRebuildParentDisconnected();\n}\n"],"mappings":"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","names":["path","path"]}
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-5HFVWYHL.js";
4
4
  import {
5
5
  isGenericRecallExcludedPath
6
- } from "./chunk-2EZB2DL5.js";
6
+ } from "./chunk-GE6HETIF.js";
7
7
  import {
8
8
  planRecallMode
9
9
  } from "./chunk-CSAKJVXW.js";
@@ -132,4 +132,4 @@ async function findExpectedMemory(orchestrator, namespaces, expect) {
132
132
  export {
133
133
  runRecallWhy
134
134
  };
135
- //# sourceMappingURL=chunk-R4NGLTUS.js.map
135
+ //# sourceMappingURL=chunk-TDMNADPI.js.map
@@ -1,7 +1,3 @@
1
- import {
2
- searchConversationIndex,
3
- searchConversationIndexFaissFailOpen
4
- } from "./chunk-A7Q43EUZ.js";
5
1
  import {
6
2
  failOpenFaissHealth
7
3
  } from "./chunk-F4TWWUMP.js";
@@ -9,6 +5,10 @@ import {
9
5
  rebuildConversationChunksFailOpen,
10
6
  upsertConversationChunksFailOpen
11
7
  } from "./chunk-72A4L5JJ.js";
8
+ import {
9
+ searchConversationIndex,
10
+ searchConversationIndexFaissFailOpen
11
+ } from "./chunk-A7Q43EUZ.js";
12
12
 
13
13
  // src/conversation-index/backend.ts
14
14
  function createConversationIndexBackend(options) {
@@ -235,4 +235,4 @@ function createFaissBackend(getFaiss) {
235
235
  export {
236
236
  createConversationIndexBackend
237
237
  };
238
- //# sourceMappingURL=chunk-QCP75JGO.js.map
238
+ //# sourceMappingURL=chunk-TFA6HPOA.js.map
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-C7HJ3NEI.js";
8
8
  import {
9
9
  writeFileAtomically
10
- } from "./chunk-AW4QUFQF.js";
10
+ } from "./chunk-BTNNL7ZW.js";
11
11
  import {
12
12
  withHeldFileLock
13
13
  } from "./chunk-FFAZ2XFU.js";
@@ -689,4 +689,4 @@ export {
689
689
  TierMigrationStatusStore,
690
690
  RecallHandleHistoryStore
691
691
  };
692
- //# sourceMappingURL=chunk-LI76ESJL.js.map
692
+ //# sourceMappingURL=chunk-TZQOCQXB.js.map