@remnic/core 9.7.8 → 9.7.9

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 (386) hide show
  1. package/dist/access-admin-ops-surface.d.ts +6 -6
  2. package/dist/access-admin-ops-surface.js +31 -29
  3. package/dist/access-audit.js +2 -2
  4. package/dist/access-boundary.d.ts +6 -6
  5. package/dist/access-boundary.js +32 -30
  6. package/dist/access-cli.js +88 -86
  7. package/dist/access-cli.js.map +1 -1
  8. package/dist/access-http.d.ts +6 -6
  9. package/dist/access-http.js +39 -37
  10. package/dist/access-identity-continuity-surface.d.ts +5 -5
  11. package/dist/access-identity-continuity-surface.js +31 -29
  12. package/dist/access-lcm-surface.d.ts +6 -6
  13. package/dist/access-lcm-surface.js +31 -29
  14. package/dist/access-mcp.d.ts +6 -6
  15. package/dist/access-mcp.js +36 -34
  16. package/dist/access-observe-write-surface.d.ts +6 -6
  17. package/dist/access-observe-write-surface.js +31 -29
  18. package/dist/access-operations-batch.js +34 -32
  19. package/dist/access-operations.d.ts +9 -9
  20. package/dist/access-operations.js +35 -33
  21. package/dist/access-recall-surface.d.ts +6 -6
  22. package/dist/access-recall-surface.js +31 -29
  23. package/dist/access-schema.d.ts +64 -64
  24. package/dist/{access-service-CxDZXTKt.d.ts → access-service-DSuzikHQ.d.ts} +4 -4
  25. package/dist/access-service.d.ts +6 -6
  26. package/dist/access-service.js +31 -29
  27. package/dist/access-surface-catalog.d.ts +6 -6
  28. package/dist/action-confidence.d.ts +1 -1
  29. package/dist/active-memory-bridge.d.ts +1 -1
  30. package/dist/active-recall.d.ts +1 -1
  31. package/dist/active-recall.js +1 -1
  32. package/dist/adapters/index.js +4 -4
  33. package/dist/adapters/registry.js +2 -2
  34. package/dist/{auto-sync-676N6N6Y.js → auto-sync-AAMTVZMK.js} +5 -5
  35. package/dist/behavior-learner.d.ts +1 -1
  36. package/dist/behavior-signals.d.ts +1 -1
  37. package/dist/bootstrap.d.ts +5 -5
  38. package/dist/briefing.d.ts +2 -2
  39. package/dist/briefing.js +14 -12
  40. package/dist/buffer-surprise-report.d.ts +1 -1
  41. package/dist/buffer.d.ts +2 -2
  42. package/dist/bulk-import/index.d.ts +3 -3
  43. package/dist/calibration.d.ts +1 -1
  44. package/dist/calibration.js +2 -2
  45. package/dist/capabilities.d.ts +1 -1
  46. package/dist/{capsule-merge-GK5E647P.js → capsule-merge-Z2HUO6IK.js} +10 -2
  47. package/dist/capsule-merge-Z2HUO6IK.js.map +1 -0
  48. package/dist/{catalog-DzU9HowE.d.ts → catalog-BNwjACa5.d.ts} +1 -1
  49. package/dist/causal-behavior.d.ts +1 -1
  50. package/dist/causal-consolidation.d.ts +1 -1
  51. package/dist/causal-consolidation.js +15 -13
  52. package/dist/causal-consolidation.js.map +1 -1
  53. package/dist/causal-trajectory-graph.d.ts +1 -1
  54. package/dist/{chunk-TZJVTH3F.js → chunk-27VEKQQA.js} +14 -14
  55. package/dist/{chunk-JO5AT6QT.js → chunk-3ZVFLMFQ.js} +1 -1
  56. package/dist/chunk-3ZVFLMFQ.js.map +1 -0
  57. package/dist/{chunk-AD2KK5MT.js → chunk-5CFHYQU3.js} +9 -3
  58. package/dist/chunk-5CFHYQU3.js.map +1 -0
  59. package/dist/{chunk-7XH7VJN4.js → chunk-5S7Z5SHA.js} +2 -2
  60. package/dist/{chunk-TVVEYCNW.js → chunk-7K5Q6COX.js} +4 -4
  61. package/dist/{chunk-EJCVMPIM.js → chunk-7LMEY5KZ.js} +15 -1
  62. package/dist/chunk-7LMEY5KZ.js.map +1 -0
  63. package/dist/{chunk-3F4N4WDH.js → chunk-AHLPZ2SF.js} +2 -2
  64. package/dist/{chunk-AH3M6F4X.js → chunk-CDGGQGUU.js} +2 -2
  65. package/dist/{chunk-ZHKD4EZM.js → chunk-CK6RI52P.js} +3 -3
  66. package/dist/{chunk-6C35R7P4.js → chunk-DJCKXI4M.js} +2 -2
  67. package/dist/{chunk-GL3SMLMZ.js → chunk-DLPXS7BE.js} +109 -85
  68. package/dist/chunk-DLPXS7BE.js.map +1 -0
  69. package/dist/{chunk-NMMKRVUF.js → chunk-EIKBKQ6L.js} +6 -6
  70. package/dist/{chunk-O3BZ6PFY.js → chunk-F3FC7SMO.js} +2 -2
  71. package/dist/{chunk-ZW6OKHVX.js → chunk-FKCJH7KP.js} +2 -2
  72. package/dist/{chunk-DQPPRXFO.js → chunk-HQ7QZJM5.js} +2 -2
  73. package/dist/{chunk-UYZUJ4EB.js → chunk-I2THZUAF.js} +2 -2
  74. package/dist/{chunk-RKNJBZ55.js → chunk-JBPKEARU.js} +4 -4
  75. package/dist/{chunk-KIPLG7S7.js → chunk-JKLJ6A7W.js} +2 -2
  76. package/dist/{chunk-HXDKC3BI.js → chunk-JU3GHO6J.js} +2 -2
  77. package/dist/{chunk-74MJH7I3.js → chunk-KGNFFCZJ.js} +12 -3
  78. package/dist/chunk-KGNFFCZJ.js.map +1 -0
  79. package/dist/{chunk-Q6JPMCPO.js → chunk-KKASNHGF.js} +62 -57
  80. package/dist/chunk-KKASNHGF.js.map +1 -0
  81. package/dist/{chunk-R2SJDIPO.js → chunk-KPXAJ77O.js} +9 -7
  82. package/dist/chunk-KPXAJ77O.js.map +1 -0
  83. package/dist/{chunk-SYNYI4ZM.js → chunk-L5HJQC36.js} +2 -2
  84. package/dist/{chunk-VXMWDXIJ.js → chunk-LC7OODWZ.js} +2 -2
  85. package/dist/{chunk-CNWC274T.js → chunk-MLT5EG6K.js} +28 -28
  86. package/dist/{chunk-M5QKGHCR.js → chunk-OC35KQIN.js} +6 -2
  87. package/dist/chunk-OC35KQIN.js.map +1 -0
  88. package/dist/chunk-OKUEZOGW.js +27 -0
  89. package/dist/chunk-OKUEZOGW.js.map +1 -0
  90. package/dist/{chunk-PKGWJFNR.js → chunk-OVMS3DCB.js} +2 -2
  91. package/dist/chunk-PDJTHRAW.js +36 -0
  92. package/dist/chunk-PDJTHRAW.js.map +1 -0
  93. package/dist/{chunk-ZUFJ7ZTR.js → chunk-PHXCPVSX.js} +6 -2
  94. package/dist/chunk-PHXCPVSX.js.map +1 -0
  95. package/dist/{chunk-57INMZ6F.js → chunk-POUD5BLV.js} +2 -2
  96. package/dist/{chunk-KTOH7EJE.js → chunk-PV7E2FGY.js} +307 -43
  97. package/dist/chunk-PV7E2FGY.js.map +1 -0
  98. package/dist/{chunk-LRGSLV7M.js → chunk-PYHOAXTI.js} +4 -4
  99. package/dist/{chunk-WKE4VXSZ.js → chunk-QKVX4Y6D.js} +2 -2
  100. package/dist/{chunk-FXGC5UUH.js → chunk-RT7IP3D3.js} +2 -2
  101. package/dist/{chunk-CHVU4RE5.js → chunk-SKXBOZDF.js} +3 -3
  102. package/dist/{chunk-TVRPRFUB.js → chunk-TY43GBX2.js} +9 -7
  103. package/dist/chunk-TY43GBX2.js.map +1 -0
  104. package/dist/{chunk-UVIQHSS7.js → chunk-UP25ZZCN.js} +9 -3
  105. package/dist/chunk-UP25ZZCN.js.map +1 -0
  106. package/dist/{chunk-GKCCHHZK.js → chunk-UXKMMNJD.js} +4 -4
  107. package/dist/{chunk-XFTPUXCE.js → chunk-UXWGPODH.js} +4 -4
  108. package/dist/{chunk-2FSHROYK.js → chunk-V53GJUSL.js} +8 -8
  109. package/dist/{chunk-LKT755LP.js → chunk-VA4WSW54.js} +2 -2
  110. package/dist/{chunk-FYKIEOG6.js → chunk-VCFADTFS.js} +3 -3
  111. package/dist/{chunk-VF4XKTX3.js → chunk-VZ5OJE4X.js} +10 -2
  112. package/dist/chunk-VZ5OJE4X.js.map +1 -0
  113. package/dist/{chunk-AWJ2FHCF.js → chunk-X47LWMKA.js} +49 -21
  114. package/dist/chunk-X47LWMKA.js.map +1 -0
  115. package/dist/{chunk-VMGMY2AI.js → chunk-XG5CGR3K.js} +8 -8
  116. package/dist/{chunk-VMGMY2AI.js.map → chunk-XG5CGR3K.js.map} +1 -1
  117. package/dist/{chunk-T7VNN3ZM.js → chunk-XVLEGMJI.js} +2 -2
  118. package/dist/{chunk-CRFTLUWT.js → chunk-Y5U35ZVS.js} +2 -2
  119. package/dist/{chunk-UHGHTOR5.js → chunk-YGAOLHKN.js} +7 -7
  120. package/dist/{chunk-QDCJNRKK.js → chunk-YXOAQAH2.js} +3 -3
  121. package/dist/{cli-BqyGVyOe.d.ts → cli-DACyuK8-.d.ts} +5 -5
  122. package/dist/cli.d.ts +8 -8
  123. package/dist/cli.js +65 -63
  124. package/dist/compounding/engine.d.ts +2 -2
  125. package/dist/compounding/engine.js +14 -12
  126. package/dist/compounding/preference-consolidator.d.ts +1 -1
  127. package/dist/compression-optimizer.d.ts +1 -1
  128. package/dist/config.d.ts +1 -1
  129. package/dist/config.js +1 -1
  130. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  131. package/dist/connectors/codex-materialize-runner.js +14 -12
  132. package/dist/connectors/codex-materialize.d.ts +1 -1
  133. package/dist/connectors/index.d.ts +1 -1
  134. package/dist/connectors/index.js +14 -12
  135. package/dist/consolidation-provenance-check.d.ts +2 -2
  136. package/dist/consolidation-provenance-check.js +6 -2
  137. package/dist/consolidation-undo.d.ts +2 -2
  138. package/dist/consolidation-undo.js +8 -1
  139. package/dist/consolidation-undo.js.map +1 -1
  140. package/dist/contradiction/index.d.ts +2 -2
  141. package/dist/conversation-index/backend.d.ts +1 -1
  142. package/dist/conversation-index/chunker.d.ts +1 -1
  143. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  144. package/dist/conversation-index/indexer.d.ts +1 -1
  145. package/dist/conversation-index/search.d.ts +1 -1
  146. package/dist/day-summary.d.ts +1 -1
  147. package/dist/delinearize.d.ts +1 -1
  148. package/dist/direct-answer-wiring.d.ts +1 -1
  149. package/dist/direct-answer.d.ts +1 -1
  150. package/dist/embedding-fallback.d.ts +1 -1
  151. package/dist/enrichment/index.d.ts +1 -1
  152. package/dist/entity-retrieval.d.ts +2 -2
  153. package/dist/entity-retrieval.js +14 -12
  154. package/dist/entity-schema.d.ts +1 -1
  155. package/dist/explicit-capture.d.ts +5 -5
  156. package/dist/extraction-faithfulness.d.ts +1 -1
  157. package/dist/extraction-faithfulness.js +3 -3
  158. package/dist/extraction-judge-telemetry.d.ts +1 -1
  159. package/dist/extraction-judge-training.d.ts +1 -1
  160. package/dist/extraction-judge.d.ts +1 -1
  161. package/dist/extraction-judge.js +3 -3
  162. package/dist/extraction.d.ts +1 -1
  163. package/dist/extraction.js +3 -3
  164. package/dist/fallback-llm.d.ts +1 -1
  165. package/dist/fallback-llm.js +2 -2
  166. package/dist/{forget-KHF7A44H.js → forget-CQCLB5LB.js} +2 -2
  167. package/dist/graph-dashboard-diff.d.ts +1 -1
  168. package/dist/graph-dashboard-key.d.ts +1 -1
  169. package/dist/graph-dashboard-parser.d.ts +1 -1
  170. package/dist/graph-edge-reinforcement.d.ts +1 -1
  171. package/dist/graph-snapshot.d.ts +1 -1
  172. package/dist/graph.d.ts +1 -1
  173. package/dist/identity-continuity.d.ts +1 -1
  174. package/dist/importance.d.ts +1 -1
  175. package/dist/importers/index.d.ts +1 -1
  176. package/dist/in-flight-reads.d.ts +19 -0
  177. package/dist/in-flight-reads.js +16 -0
  178. package/dist/in-flight-reads.js.map +1 -0
  179. package/dist/index.d.ts +13 -13
  180. package/dist/index.js +105 -103
  181. package/dist/intent.d.ts +1 -1
  182. package/dist/lcm/engine.d.ts +1 -1
  183. package/dist/lcm/engine.js +2 -2
  184. package/dist/lcm/index.d.ts +1 -1
  185. package/dist/lcm/index.js +7 -7
  186. package/dist/lcm/tools.d.ts +1 -1
  187. package/dist/lifecycle.d.ts +1 -1
  188. package/dist/live-connectors-runner.d.ts +1 -1
  189. package/dist/local-llm.d.ts +1 -1
  190. package/dist/local-model-endpoint.d.ts +1 -1
  191. package/dist/maintenance/memory-governance.d.ts +1 -1
  192. package/dist/maintenance/memory-governance.js +14 -12
  193. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +14 -12
  194. package/dist/maintenance/rebuild-memory-projection.js +15 -13
  195. package/dist/mcp-memory-inspector-app.d.ts +6 -6
  196. package/dist/memory-action-policy.d.ts +1 -1
  197. package/dist/memory-cache.d.ts +24 -13
  198. package/dist/memory-cache.js +3 -1
  199. package/dist/memory-corpus-version.d.ts +19 -0
  200. package/dist/memory-corpus-version.js +13 -0
  201. package/dist/memory-corpus-version.js.map +1 -0
  202. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  203. package/dist/memory-projection-store.d.ts +1 -1
  204. package/dist/memory-provenance.d.ts +1 -1
  205. package/dist/memory-worth-outcomes.d.ts +2 -2
  206. package/dist/models-json.d.ts +1 -1
  207. package/dist/namespaces/migrate.d.ts +3 -3
  208. package/dist/namespaces/migrate.js +21 -19
  209. package/dist/namespaces/principal.d.ts +1 -1
  210. package/dist/namespaces/search.d.ts +1 -1
  211. package/dist/namespaces/search.js +7 -7
  212. package/dist/namespaces/storage.d.ts +3 -3
  213. package/dist/namespaces/storage.js +14 -12
  214. package/dist/native-knowledge.d.ts +1 -1
  215. package/dist/operator-toolkit.d.ts +2 -2
  216. package/dist/operator-toolkit.js +26 -24
  217. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  218. package/dist/orchestration/maintenance.d.ts +2 -2
  219. package/dist/orchestration/maintenance.js +16 -14
  220. package/dist/{orchestrator-37Cx7yyw.d.ts → orchestrator-D83AvrPf.d.ts} +4 -4
  221. package/dist/orchestrator.d.ts +5 -5
  222. package/dist/orchestrator.js +88 -86
  223. package/dist/page-versioning.js +5 -1
  224. package/dist/patterns-cli.d.ts +1 -1
  225. package/dist/{pipeline-C6onljHc.d.ts → pipeline-BSqGpYl1.d.ts} +1 -1
  226. package/dist/policy-runtime.d.ts +1 -1
  227. package/dist/provenance.d.ts +1 -1
  228. package/dist/{qmd-J08G7MEm.d.ts → qmd-CutnpRVe.d.ts} +1 -1
  229. package/dist/qmd-preflight.d.ts +2 -2
  230. package/dist/qmd-recall-cache.d.ts +1 -1
  231. package/dist/qmd.d.ts +2 -2
  232. package/dist/qmd.js +2 -2
  233. package/dist/recall-disclosure-escalation.d.ts +1 -1
  234. package/dist/recall-explain-renderer.d.ts +1 -1
  235. package/dist/recall-explain-renderer.js +3 -3
  236. package/dist/recall-planner-llm.d.ts +1 -1
  237. package/dist/recall-planner-llm.js +2 -2
  238. package/dist/recall-state.d.ts +1 -1
  239. package/dist/recall-tag-filter.d.ts +1 -1
  240. package/dist/recall-timings.d.ts +1 -1
  241. package/dist/recall-xray-cli.d.ts +1 -1
  242. package/dist/recall-xray-cli.js +4 -4
  243. package/dist/recall-xray-renderer.d.ts +1 -1
  244. package/dist/recall-xray-renderer.js +3 -3
  245. package/dist/recall-xray.d.ts +1 -1
  246. package/dist/recall-xray.js +2 -2
  247. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  248. package/dist/replay/normalizers/claude.d.ts +1 -1
  249. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  250. package/dist/replay/normalizers/shared.d.ts +1 -1
  251. package/dist/replay/runner.d.ts +1 -1
  252. package/dist/replay/types.d.ts +1 -1
  253. package/dist/resolve-auth-token.d.ts +1 -1
  254. package/dist/resume-bundles.js +2 -2
  255. package/dist/retrieval-agents.d.ts +2 -2
  256. package/dist/retrieval-tiers.d.ts +1 -1
  257. package/dist/routing/engine.d.ts +1 -1
  258. package/dist/routing/store.d.ts +1 -1
  259. package/dist/schemas.d.ts +74 -74
  260. package/dist/search/embed-helper.d.ts +1 -1
  261. package/dist/search/factory.d.ts +1 -1
  262. package/dist/search/factory.js +6 -6
  263. package/dist/search/index.d.ts +1 -1
  264. package/dist/search/index.js +12 -12
  265. package/dist/search/lancedb-backend.d.ts +1 -1
  266. package/dist/search/meilisearch-backend.d.ts +1 -1
  267. package/dist/search/noop-backend.d.ts +1 -1
  268. package/dist/search/orama-backend.d.ts +1 -1
  269. package/dist/search/port.d.ts +1 -1
  270. package/dist/search/remote-backend.d.ts +1 -1
  271. package/dist/{semantic-consolidation-BFtoVosl.d.ts → semantic-consolidation-btIVRC4l.d.ts} +1 -1
  272. package/dist/semantic-consolidation.d.ts +2 -2
  273. package/dist/semantic-consolidation.js +15 -13
  274. package/dist/semantic-rule-promotion.js +14 -12
  275. package/dist/semantic-rule-verifier.d.ts +5 -1
  276. package/dist/semantic-rule-verifier.js +14 -12
  277. package/dist/session-observer-bands.d.ts +1 -1
  278. package/dist/session-observer-state.d.ts +1 -1
  279. package/dist/shared-context/manager.d.ts +9 -9
  280. package/dist/signal.d.ts +1 -1
  281. package/dist/{storage-CXjwBr69.d.ts → storage-BVv_Mqa0.d.ts} +133 -3
  282. package/dist/storage.d.ts +2 -2
  283. package/dist/storage.js +13 -11
  284. package/dist/summarizer.d.ts +1 -1
  285. package/dist/summarizer.js +3 -3
  286. package/dist/summary-snapshot.d.ts +1 -1
  287. package/dist/temporal-supersession.d.ts +2 -2
  288. package/dist/temporal-timeline-recall.d.ts +1 -1
  289. package/dist/temporal-validity.d.ts +1 -1
  290. package/dist/threading.d.ts +1 -1
  291. package/dist/tier-migration.d.ts +2 -2
  292. package/dist/tier-routing.d.ts +1 -1
  293. package/dist/topics.d.ts +1 -1
  294. package/dist/transcript.d.ts +1 -1
  295. package/dist/transfer/capsule-import.js +6 -2
  296. package/dist/transfer/import-sqlite.js +2 -2
  297. package/dist/transfer/types.d.ts +66 -66
  298. package/dist/trust-score-stage.d.ts +1 -1
  299. package/dist/trust-score.d.ts +1 -1
  300. package/dist/{types-DpxqC8dI.d.ts → types-Cmkz7csa.d.ts} +27 -0
  301. package/dist/types.d.ts +1 -1
  302. package/dist/types.js +1 -1
  303. package/dist/utility-runtime.d.ts +1 -1
  304. package/dist/verified-recall.d.ts +4 -0
  305. package/dist/verified-recall.js +14 -12
  306. package/package.json +12 -2
  307. package/src/binary-lifecycle/pipeline.ts +22 -0
  308. package/src/cli.ts +8 -0
  309. package/src/compounding/engine.ts +9 -1
  310. package/src/config.ts +14 -0
  311. package/src/consolidation-undo.ts +8 -0
  312. package/src/curation/index.ts +9 -0
  313. package/src/in-flight-reads.ts +63 -0
  314. package/src/maintenance/memory-governance.ts +6 -0
  315. package/src/memory-cache-hot.test.ts +131 -0
  316. package/src/memory-cache.ts +146 -22
  317. package/src/memory-corpus-version.ts +45 -0
  318. package/src/namespaces/storage.ts +20 -1
  319. package/src/operator-toolkit.ts +7 -1
  320. package/src/orchestration/recall-internal.ts +6 -3
  321. package/src/orchestrator.ts +25 -1
  322. package/src/page-versioning.ts +14 -1
  323. package/src/provenance-frontmatter.test.ts +6 -0
  324. package/src/review/index.ts +16 -8
  325. package/src/semantic-rule-promotion.ts +9 -1
  326. package/src/semantic-rule-verifier.ts +19 -6
  327. package/src/spaces/index.ts +10 -0
  328. package/src/storage/memory-read-store.ts +9 -2
  329. package/src/storage-contract/cache-coherence.test.ts +242 -0
  330. package/src/storage-contract/namespace-routing.test.ts +26 -1
  331. package/src/storage.ts +513 -31
  332. package/src/transfer/capsule-cache-coherence.test.ts +107 -0
  333. package/src/transfer/capsule-import.ts +8 -0
  334. package/src/transfer/capsule-merge.ts +7 -0
  335. package/src/types.ts +27 -0
  336. package/src/verified-recall.ts +20 -6
  337. package/dist/capsule-merge-GK5E647P.js.map +0 -1
  338. package/dist/chunk-74MJH7I3.js.map +0 -1
  339. package/dist/chunk-AD2KK5MT.js.map +0 -1
  340. package/dist/chunk-AWJ2FHCF.js.map +0 -1
  341. package/dist/chunk-EJCVMPIM.js.map +0 -1
  342. package/dist/chunk-GL3SMLMZ.js.map +0 -1
  343. package/dist/chunk-JO5AT6QT.js.map +0 -1
  344. package/dist/chunk-KTOH7EJE.js.map +0 -1
  345. package/dist/chunk-M5QKGHCR.js.map +0 -1
  346. package/dist/chunk-Q6JPMCPO.js.map +0 -1
  347. package/dist/chunk-R2SJDIPO.js.map +0 -1
  348. package/dist/chunk-TVRPRFUB.js.map +0 -1
  349. package/dist/chunk-UVIQHSS7.js.map +0 -1
  350. package/dist/chunk-VF4XKTX3.js.map +0 -1
  351. package/dist/chunk-ZUFJ7ZTR.js.map +0 -1
  352. /package/dist/{auto-sync-676N6N6Y.js.map → auto-sync-AAMTVZMK.js.map} +0 -0
  353. /package/dist/{chunk-TZJVTH3F.js.map → chunk-27VEKQQA.js.map} +0 -0
  354. /package/dist/{chunk-7XH7VJN4.js.map → chunk-5S7Z5SHA.js.map} +0 -0
  355. /package/dist/{chunk-TVVEYCNW.js.map → chunk-7K5Q6COX.js.map} +0 -0
  356. /package/dist/{chunk-3F4N4WDH.js.map → chunk-AHLPZ2SF.js.map} +0 -0
  357. /package/dist/{chunk-AH3M6F4X.js.map → chunk-CDGGQGUU.js.map} +0 -0
  358. /package/dist/{chunk-ZHKD4EZM.js.map → chunk-CK6RI52P.js.map} +0 -0
  359. /package/dist/{chunk-6C35R7P4.js.map → chunk-DJCKXI4M.js.map} +0 -0
  360. /package/dist/{chunk-NMMKRVUF.js.map → chunk-EIKBKQ6L.js.map} +0 -0
  361. /package/dist/{chunk-O3BZ6PFY.js.map → chunk-F3FC7SMO.js.map} +0 -0
  362. /package/dist/{chunk-ZW6OKHVX.js.map → chunk-FKCJH7KP.js.map} +0 -0
  363. /package/dist/{chunk-DQPPRXFO.js.map → chunk-HQ7QZJM5.js.map} +0 -0
  364. /package/dist/{chunk-UYZUJ4EB.js.map → chunk-I2THZUAF.js.map} +0 -0
  365. /package/dist/{chunk-RKNJBZ55.js.map → chunk-JBPKEARU.js.map} +0 -0
  366. /package/dist/{chunk-KIPLG7S7.js.map → chunk-JKLJ6A7W.js.map} +0 -0
  367. /package/dist/{chunk-HXDKC3BI.js.map → chunk-JU3GHO6J.js.map} +0 -0
  368. /package/dist/{chunk-SYNYI4ZM.js.map → chunk-L5HJQC36.js.map} +0 -0
  369. /package/dist/{chunk-VXMWDXIJ.js.map → chunk-LC7OODWZ.js.map} +0 -0
  370. /package/dist/{chunk-CNWC274T.js.map → chunk-MLT5EG6K.js.map} +0 -0
  371. /package/dist/{chunk-PKGWJFNR.js.map → chunk-OVMS3DCB.js.map} +0 -0
  372. /package/dist/{chunk-57INMZ6F.js.map → chunk-POUD5BLV.js.map} +0 -0
  373. /package/dist/{chunk-LRGSLV7M.js.map → chunk-PYHOAXTI.js.map} +0 -0
  374. /package/dist/{chunk-WKE4VXSZ.js.map → chunk-QKVX4Y6D.js.map} +0 -0
  375. /package/dist/{chunk-FXGC5UUH.js.map → chunk-RT7IP3D3.js.map} +0 -0
  376. /package/dist/{chunk-CHVU4RE5.js.map → chunk-SKXBOZDF.js.map} +0 -0
  377. /package/dist/{chunk-GKCCHHZK.js.map → chunk-UXKMMNJD.js.map} +0 -0
  378. /package/dist/{chunk-XFTPUXCE.js.map → chunk-UXWGPODH.js.map} +0 -0
  379. /package/dist/{chunk-2FSHROYK.js.map → chunk-V53GJUSL.js.map} +0 -0
  380. /package/dist/{chunk-LKT755LP.js.map → chunk-VA4WSW54.js.map} +0 -0
  381. /package/dist/{chunk-FYKIEOG6.js.map → chunk-VCFADTFS.js.map} +0 -0
  382. /package/dist/{chunk-T7VNN3ZM.js.map → chunk-XVLEGMJI.js.map} +0 -0
  383. /package/dist/{chunk-CRFTLUWT.js.map → chunk-Y5U35ZVS.js.map} +0 -0
  384. /package/dist/{chunk-UHGHTOR5.js.map → chunk-YGAOLHKN.js.map} +0 -0
  385. /package/dist/{chunk-QDCJNRKK.js.map → chunk-YXOAQAH2.js.map} +0 -0
  386. /package/dist/{forget-KHF7A44H.js.map → forget-CQCLB5LB.js.map} +0 -0
@@ -7,11 +7,11 @@ import {
7
7
  } from "./chunk-ZBJMUXZH.js";
8
8
  import {
9
9
  StorageManager
10
- } from "./chunk-KTOH7EJE.js";
10
+ } from "./chunk-PV7E2FGY.js";
11
11
  import {
12
12
  getCachedEpisodeMap,
13
13
  setCachedEpisodeMap
14
- } from "./chunk-AWJ2FHCF.js";
14
+ } from "./chunk-X47LWMKA.js";
15
15
 
16
16
  // src/verified-recall.ts
17
17
  function createReadOnlyBoxBuilder(memoryDir) {
@@ -73,12 +73,14 @@ function compareVerifiedEpisodeResults(left, right) {
73
73
  async function searchVerifiedEpisodes(options) {
74
74
  const queryTokens = new Set(normalizeRecallTokens(options.query, ["what", "which"]));
75
75
  if (queryTokens.size === 0 || options.maxResults <= 0) return [];
76
- const storage = new StorageManager(options.memoryDir);
77
- const version = storage.getMemoryStatusVersion();
78
- let verifiedMemoryById = getCachedEpisodeMap(storage.dir, version);
76
+ const storage = new StorageManager(options.memoryDir, void 0, options.hotMemoriesCacheEnabled);
77
+ const version = storage.getMemoryCorpusVersion();
78
+ const cacheEnabled = storage.isHotCacheEnabled();
79
+ const keyId = storage.hotCacheKeyId();
80
+ let verifiedMemoryById = cacheEnabled ? getCachedEpisodeMap(storage.dir, version, keyId, storage.hotCacheTtlMs()) : null;
79
81
  if (!verifiedMemoryById) {
80
82
  const allMemories = await storage.readAllMemories();
81
- verifiedMemoryById = setCachedEpisodeMap(storage.dir, allMemories, version);
83
+ verifiedMemoryById = setCachedEpisodeMap(storage.dir, allMemories, version, cacheEnabled, keyId);
82
84
  }
83
85
  const boxes = await createReadOnlyBoxBuilder(options.memoryDir).readRecentBoxes(Math.max(1, Math.floor(options.boxRecallDays ?? 3))).catch(() => []);
84
86
  const candidates = [];
@@ -107,4 +109,4 @@ export {
107
109
  compareVerifiedEpisodeResults,
108
110
  searchVerifiedEpisodes
109
111
  };
110
- //# sourceMappingURL=chunk-R2SJDIPO.js.map
112
+ //# sourceMappingURL=chunk-KPXAJ77O.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/verified-recall.ts"],"sourcesContent":["import { BoxBuilder, type BoxFrontmatter } from \"./boxes.js\";\nimport { getCachedEpisodeMap, setCachedEpisodeMap } from \"./memory-cache.js\";\nimport { StorageManager } from \"./storage.js\";\nimport type { MemoryFile } from \"./types.js\";\nimport { countRecallTokenOverlap, normalizeRecallTokens } from \"./recall-tokenization.js\";\n\nexport interface VerifiedEpisodeResult {\n box: BoxFrontmatter;\n score: number;\n verifiedEpisodeCount: number;\n verifiedMemoryIds: string[];\n matchedFields: string[];\n}\n\ninterface VerifiedEpisodeCandidate {\n box: BoxFrontmatter;\n score: number;\n matchedFields: Set<string>;\n verifiedMemories: MemoryFile[];\n}\n\nfunction createReadOnlyBoxBuilder(memoryDir: string): BoxBuilder {\n return new BoxBuilder(memoryDir, {\n memoryBoxesEnabled: true,\n traceWeaverEnabled: false,\n boxTopicShiftThreshold: 0.35,\n boxTimeGapMs: 30 * 60 * 1000,\n boxMaxMemories: 50,\n traceWeaverLookbackDays: 7,\n traceWeaverOverlapThreshold: 0.4,\n });\n}\n\nfunction scoreVerifiedEpisodeCandidate(box: BoxFrontmatter, verifiedMemories: MemoryFile[], queryTokens: Set<string>) {\n const matchedFields = new Set<string>();\n let score = 0;\n\n const topicMatches = countRecallTokenOverlap(queryTokens, box.topics.join(\" \"));\n if (topicMatches > 0) {\n score += topicMatches * 3;\n matchedFields.add(\"topics\");\n }\n\n const goalMatches = countRecallTokenOverlap(queryTokens, box.goal);\n if (goalMatches > 0) {\n score += goalMatches * 4;\n matchedFields.add(\"goal\");\n }\n\n const toolMatches = countRecallTokenOverlap(queryTokens, box.toolsUsed?.join(\" \"));\n if (toolMatches > 0) {\n score += toolMatches * 2;\n matchedFields.add(\"toolsUsed\");\n }\n\n let episodeContentMatches = 0;\n for (const memory of verifiedMemories) {\n episodeContentMatches += countRecallTokenOverlap(queryTokens, memory.content);\n }\n if (episodeContentMatches > 0) {\n score += episodeContentMatches * 4;\n matchedFields.add(\"episodeContent\");\n }\n\n return { score, matchedFields };\n}\n\nfunction resolveVerifiedEpisodeMemoriesFromMap(\n memoryById: ReadonlyMap<string, MemoryFile>,\n memoryIds: string[],\n): MemoryFile[] {\n const verified: MemoryFile[] = [];\n for (const memoryId of memoryIds) {\n try {\n const memory = memoryById.get(memoryId);\n if (!memory) continue;\n if (memory.frontmatter.status === \"archived\" || memory.frontmatter.status === \"forgotten\") continue;\n if (memory.frontmatter.memoryKind !== \"episode\") continue;\n verified.push(memory);\n } catch {\n // fail-open: malformed or unreadable memories should not abort recall\n }\n }\n return verified;\n}\n\nexport function compareVerifiedEpisodeResults(left: VerifiedEpisodeResult, right: VerifiedEpisodeResult): number {\n return (\n right.score - left.score ||\n right.verifiedEpisodeCount - left.verifiedEpisodeCount ||\n right.box.sealedAt.localeCompare(left.box.sealedAt) ||\n left.box.id.localeCompare(right.box.id)\n );\n}\n\nexport async function searchVerifiedEpisodes(options: {\n memoryDir: string;\n query: string;\n maxResults: number;\n boxRecallDays?: number;\n /** Hot-memories cache gate (issue #1902, Codex P2). Threaded from the caller\n * so a named-namespace root (never registered in the per-dir default map)\n * honors the owning daemon's config instead of the process-wide default. */\n hotMemoriesCacheEnabled?: boolean;\n}): Promise<VerifiedEpisodeResult[]> {\n const queryTokens = new Set(normalizeRecallTokens(options.query, [\"what\", \"which\"]));\n if (queryTokens.size === 0 || options.maxResults <= 0) return [];\n\n const storage = new StorageManager(options.memoryDir, undefined, options.hotMemoriesCacheEnabled);\n // Key the derived episode cache on the CORPUS version, not memory-status\n // (Codex P1, #1902): the episode map is derived from the full corpus, and\n // plain creates/writeChunk bump only the corpus sentinel (memory-status is\n // deliberately left unchanged to keep the entity cache warm). Keying on\n // memory-status would let a peer process serve a stale episode map that omits\n // newly created memories.\n const version = storage.getMemoryCorpusVersion();\n\n // Use derived episode cache to avoid O(146K) filter+map on every call — but\n // honor the hotMemoriesCacheEnabled opt-out (Codex P2): when disabled, never\n // read or retain the derived map, always rebuild from a fresh scan.\n const cacheEnabled = storage.isHotCacheEnabled();\n const keyId = storage.hotCacheKeyId();\n let verifiedMemoryById = cacheEnabled ? getCachedEpisodeMap(storage.dir, version, keyId, storage.hotCacheTtlMs()) : null;\n if (!verifiedMemoryById) {\n const allMemories = await storage.readAllMemories();\n verifiedMemoryById = setCachedEpisodeMap(storage.dir, allMemories, version, cacheEnabled, keyId);\n }\n const boxes = await createReadOnlyBoxBuilder(options.memoryDir)\n .readRecentBoxes(Math.max(1, Math.floor(options.boxRecallDays ?? 3)))\n .catch(() => [] as BoxFrontmatter[]);\n\n const candidates: VerifiedEpisodeCandidate[] = [];\n for (const box of boxes) {\n const verifiedMemories = resolveVerifiedEpisodeMemoriesFromMap(verifiedMemoryById, box.memoryIds);\n if (verifiedMemories.length === 0) continue;\n const { score, matchedFields } = scoreVerifiedEpisodeCandidate(box, verifiedMemories, queryTokens);\n if (score <= 0) continue;\n candidates.push({\n box,\n score,\n matchedFields,\n verifiedMemories,\n });\n }\n\n return candidates\n .map((candidate) => ({\n box: candidate.box,\n score: candidate.score,\n verifiedEpisodeCount: candidate.verifiedMemories.length,\n verifiedMemoryIds: candidate.verifiedMemories.map((memory) => memory.frontmatter.id),\n matchedFields: [...candidate.matchedFields].sort(),\n }))\n .sort(compareVerifiedEpisodeResults)\n .slice(0, options.maxResults);\n}\n"],"mappings":"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","names":[]}
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-QDW3E4RD.js";
4
4
  import {
5
5
  gatewayTaskChainOptions
6
- } from "./chunk-GKCCHHZK.js";
6
+ } from "./chunk-UXKMMNJD.js";
7
7
  import {
8
8
  extractJsonCandidates
9
9
  } from "./chunk-RGMVMVMF.js";
@@ -486,4 +486,4 @@ export {
486
486
  createVerdictCache,
487
487
  createDeferCountMap
488
488
  };
489
- //# sourceMappingURL=chunk-SYNYI4ZM.js.map
489
+ //# sourceMappingURL=chunk-L5HJQC36.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getVerdictKind
3
- } from "./chunk-SYNYI4ZM.js";
3
+ } from "./chunk-L5HJQC36.js";
4
4
  import {
5
5
  scoreImportance
6
6
  } from "./chunk-JXS5PDQ7.js";
@@ -1182,4 +1182,4 @@ export {
1182
1182
  syncWearableSource,
1183
1183
  defaultTimezone
1184
1184
  };
1185
- //# sourceMappingURL=chunk-VXMWDXIJ.js.map
1185
+ //# sourceMappingURL=chunk-LC7OODWZ.js.map
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-GDB4J2H3.js";
9
9
  import {
10
10
  importCapsule
11
- } from "./chunk-M5QKGHCR.js";
11
+ } from "./chunk-OC35KQIN.js";
12
12
  import {
13
13
  getTrustZoneStoreStatus,
14
14
  isTrustZoneName,
@@ -29,21 +29,15 @@ import {
29
29
  normalizeTags,
30
30
  parseTagMatch
31
31
  } from "./chunk-BT7NVCML.js";
32
- import {
33
- toRecallExplainJson
34
- } from "./chunk-PKGWJFNR.js";
35
- import {
36
- estimateRecallTokens
37
- } from "./chunk-DQPPRXFO.js";
38
32
  import {
39
33
  decideDisclosureEscalation
40
34
  } from "./chunk-H7XKCNR6.js";
41
35
  import {
42
- recordObjectiveStateSnapshotsFromObservedMessages
43
- } from "./chunk-ICP53SKG.js";
36
+ toRecallExplainJson
37
+ } from "./chunk-OVMS3DCB.js";
44
38
  import {
45
- objectiveStateStoreOverrideForNamespace
46
- } from "./chunk-6HMYUWXR.js";
39
+ estimateRecallTokens
40
+ } from "./chunk-HQ7QZJM5.js";
47
41
  import {
48
42
  combineNamespaces,
49
43
  defaultGitInvoker,
@@ -59,7 +53,7 @@ import {
59
53
  } from "./chunk-7PND4PUC.js";
60
54
  import {
61
55
  namespaceCollectionName
62
- } from "./chunk-T7VNN3ZM.js";
56
+ } from "./chunk-XVLEGMJI.js";
63
57
  import {
64
58
  namespaceIdentityFromToken
65
59
  } from "./chunk-EGGE52UU.js";
@@ -70,7 +64,13 @@ import {
70
64
  listMemoryGovernanceRuns,
71
65
  readMemoryGovernanceRunArtifact,
72
66
  runMemoryGovernance
73
- } from "./chunk-ZUFJ7ZTR.js";
67
+ } from "./chunk-PHXCPVSX.js";
68
+ import {
69
+ recordObjectiveStateSnapshotsFromObservedMessages
70
+ } from "./chunk-ICP53SKG.js";
71
+ import {
72
+ objectiveStateStoreOverrideForNamespace
73
+ } from "./chunk-6HMYUWXR.js";
74
74
  import {
75
75
  recordMemoryOutcome
76
76
  } from "./chunk-EIR5VLIH.js";
@@ -111,30 +111,24 @@ import {
111
111
  enqueuePassiveCorrectionNotification,
112
112
  parseBriefingFocus,
113
113
  parseBriefingWindow
114
- } from "./chunk-CRFTLUWT.js";
114
+ } from "./chunk-Y5U35ZVS.js";
115
115
  import {
116
116
  parseEntityFile,
117
117
  selfDeps
118
- } from "./chunk-KTOH7EJE.js";
118
+ } from "./chunk-PV7E2FGY.js";
119
+ import {
120
+ serializeMutations
121
+ } from "./chunk-LTJAMRGI.js";
119
122
  import {
120
123
  supersessionKeysForFact
121
124
  } from "./chunk-EHK6KZHK.js";
122
125
  import {
123
126
  stripAttributesSuffix
124
127
  } from "./chunk-SVOZFLIQ.js";
125
- import {
126
- serializeMutations
127
- } from "./chunk-LTJAMRGI.js";
128
128
  import {
129
129
  DEFAULT_RECALL_DISCLOSURE,
130
130
  isRecallDisclosure
131
- } from "./chunk-JO5AT6QT.js";
132
- import {
133
- getMemoryProjectionPath
134
- } from "./chunk-RHOZ5LLO.js";
135
- import {
136
- displayErrorDetail
137
- } from "./chunk-RL6NEVXT.js";
131
+ } from "./chunk-3ZVFLMFQ.js";
138
132
  import {
139
133
  inferMemoryStatus,
140
134
  toMemoryPathRel
@@ -143,9 +137,15 @@ import {
143
137
  normalizeProjectionPreview,
144
138
  normalizeProjectionTags
145
139
  } from "./chunk-SCU65EZI.js";
140
+ import {
141
+ getMemoryProjectionPath
142
+ } from "./chunk-RHOZ5LLO.js";
143
+ import {
144
+ displayErrorDetail
145
+ } from "./chunk-RL6NEVXT.js";
146
146
  import {
147
147
  createVersion
148
- } from "./chunk-VF4XKTX3.js";
148
+ } from "./chunk-VZ5OJE4X.js";
149
149
  import {
150
150
  computeContentHash
151
151
  } from "./chunk-W5H6ZRPT.js";
@@ -212,7 +212,7 @@ import {
212
212
  } from "./chunk-PVGDJXVK.js";
213
213
  import {
214
214
  AccessAuditAdapter
215
- } from "./chunk-TVVEYCNW.js";
215
+ } from "./chunk-7K5Q6COX.js";
216
216
 
217
217
  // src/access-observe-write-surface.ts
218
218
  import { createHash as createHash6 } from "crypto";
@@ -11250,4 +11250,4 @@ export {
11250
11250
  EngramAccessService,
11251
11251
  AccessAdminOpsSurface
11252
11252
  };
11253
- //# sourceMappingURL=chunk-CNWC274T.js.map
11253
+ //# sourceMappingURL=chunk-MLT5EG6K.js.map
@@ -1,6 +1,9 @@
1
1
  import {
2
2
  createVersion
3
- } from "./chunk-VF4XKTX3.js";
3
+ } from "./chunk-VZ5OJE4X.js";
4
+ import {
5
+ bumpMemoryCorpusVersionForDir
6
+ } from "./chunk-OKUEZOGW.js";
4
7
  import {
5
8
  parseExportBundle
6
9
  } from "./chunk-WEHSQBFR.js";
@@ -176,6 +179,7 @@ async function importCapsule(opts) {
176
179
  }
177
180
  await mkdir(path.dirname(targetAbs), { recursive: true });
178
181
  await writeFile(targetAbs, contentToWrite, "utf-8");
182
+ bumpMemoryCorpusVersionForDir(rootReal);
179
183
  imported.push({
180
184
  sourcePath: rec.path,
181
185
  targetPath: targetRel,
@@ -227,4 +231,4 @@ function mintForkId(capsuleId, originalId, now) {
227
231
  export {
228
232
  importCapsule
229
233
  };
230
- //# sourceMappingURL=chunk-M5QKGHCR.js.map
234
+ //# sourceMappingURL=chunk-OC35KQIN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/transfer/capsule-import.ts"],"sourcesContent":["import { lstat, mkdir, readFile, realpath, stat, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport { gunzipSync } from \"node:zlib\";\nimport { bumpMemoryCorpusVersionForDir } from \"../memory-corpus-version.js\";\nimport {\n createVersion,\n type VersioningConfig,\n type VersioningLogger,\n} from \"../page-versioning.js\";\nimport {\n assertIsDirectoryNotSymlink,\n assertRealpathInsideRoot,\n fromPosixRelPath,\n isPathInsideRoot,\n sha256String,\n} from \"./fs-utils.js\";\nimport {\n parseExportBundle,\n type CapsuleBlock,\n type ExportManifestV2,\n type ExportMemoryRecordV1,\n} from \"./types.js\";\nimport { isEncryptedCapsuleFile, decryptCapsuleFileInMemory } from \"./capsule-crypto.js\";\n\n/**\n * Conflict-resolution mode for {@link importCapsule}. Inverse of the\n * `mode` selector in PR 4/6's CLI surface.\n *\n * - `\"skip\"` (default) — when a target file already exists at the same\n * relative path, leave it untouched. The corresponding record is reported\n * via {@link ImportCapsuleResult.skipped}.\n * - `\"overwrite\"` — when a target file exists, snapshot the prior content\n * via {@link createVersion} (gotcha #54: write-before-delete; gotcha #25:\n * don't destroy old state until new state is confirmed), then write the\n * incoming content. The snapshot's `note` includes the source capsule id.\n * - `\"fork\"` — never overwrite. Every record is rebased under\n * `forks/<capsule-id>/<original-path>` and any YAML-frontmatter `id:`\n * field is rewritten to a new fork-scoped value. The original tree is\n * not touched.\n *\n * The mode is selected once per call and applied uniformly to every record\n * in the bundle. Mixed-mode imports are not supported by design — that\n * would let a single corrupted manifest silently land partial state.\n */\nexport type ImportCapsuleMode = \"skip\" | \"overwrite\" | \"fork\";\n\n/**\n * Options accepted by {@link importCapsule}.\n *\n * `archivePath` — absolute or cwd-relative path to a `.capsule.json.gz`\n * archive produced by `exportCapsule`. The archive must contain a V2\n * bundle (`schemaVersion: 2`); V1 archives are rejected.\n *\n * `root` — absolute or cwd-relative path to the memory directory that\n * will receive the records. Must be an existing directory.\n *\n * `mode` — see {@link ImportCapsuleMode}. Defaults to `\"skip\"`.\n *\n * `versioning` — optional page-versioning config used by `mode: \"overwrite\"`\n * to snapshot prior content before replacing it. Snapshots are skipped when\n * not provided or when `enabled === false`. Tests pass an enabled config\n * to assert snapshot creation; production callers thread the\n * orchestrator's resolved versioning config.\n *\n * `log` — optional logger forwarded to {@link createVersion}.\n *\n * `now` — optional clock override (ms epoch) used to derive deterministic\n * fork ids in tests. Production callers omit this.\n */\nexport interface ImportCapsuleOptions {\n archivePath: string;\n root: string;\n mode?: ImportCapsuleMode;\n versioning?: VersioningConfig;\n log?: VersioningLogger;\n now?: number;\n /**\n * Memory directory whose secure-store keyring is used when the archive is\n * encrypted. Required when `archivePath` ends with `.enc` or when the file\n * starts with the REMNIC-ENC magic header. If `memoryDir` is omitted and the\n * archive turns out to be encrypted, `importCapsule` throws a clear error\n * rather than silently failing.\n *\n * When provided and the archive is NOT encrypted, the value is ignored.\n */\n memoryDir?: string;\n /**\n * Original secure-store passphrase for encrypted format-v2 archives. When\n * supplied, the importer derives the archive key from the embedded KDF\n * header, enabling restore without the source machine's unlocked keyring.\n */\n passphrase?: string;\n}\n\nexport interface ImportCapsuleSkippedRecord {\n /** Original record path (capsule-relative, posix). */\n path: string;\n /**\n * Why this record was not written.\n *\n * `\"exists\"` — the target path already existed and the mode was `\"skip\"`,\n * OR the computed fork path already existed in fork mode.\n *\n * `\"checksum_mismatch\"` is intentionally absent: a checksum failure aborts\n * the import entirely (fail-closed) rather than skipping the offending\n * record, so no `ImportCapsuleSkippedRecord` is ever produced for it.\n */\n reason: \"exists\";\n}\n\nexport interface ImportCapsuleImportedRecord {\n /** Capsule-relative posix path the record carried. */\n sourcePath: string;\n /** Memory-dir-relative posix path the file was written to. */\n targetPath: string;\n /** Whether a prior version snapshot was taken (overwrite-mode only). */\n snapshotted: boolean;\n /** Whether the frontmatter `id:` field was rewritten (fork-mode only). */\n rewroteId: boolean;\n}\n\nexport interface ImportCapsuleResult {\n /** Records that landed on disk. */\n imported: ImportCapsuleImportedRecord[];\n /** Records that were not written. */\n skipped: ImportCapsuleSkippedRecord[];\n /** The manifest decoded from the archive. */\n manifest: ExportManifestV2;\n}\n\n/**\n * Pure async function that imports a capsule archive into a memory\n * directory. Inverse of {@link import(\"./capsule-export.js\").exportCapsule}.\n *\n * Sequence:\n * 1. Read + gunzip + JSON.parse the archive.\n * 2. Validate the bundle through `parseExportBundle` (V1 rejected).\n * 3. Verify each record's content sha256 against the manifest entry.\n * Any mismatch aborts the import BEFORE any file is written —\n * partial-write recovery would require a full rollback we cannot\n * offer cheaply, so we fail closed (gotcha #25).\n * 4. Apply the selected {@link ImportCapsuleMode} to every record.\n *\n * Determinism guarantees:\n * - Imported records are returned sorted by `sourcePath`.\n * - Skipped records are returned sorted by `path`.\n * - Fork-mode rebases under a stable `forks/<capsule-id>/` prefix so\n * repeated fork imports of the same capsule shape land in predictable\n * locations (subsequent fork imports still skip-on-exist because the\n * target tree is computed from the source path).\n */\nexport async function importCapsule(\n opts: ImportCapsuleOptions,\n): Promise<ImportCapsuleResult> {\n const archiveAbs = path.resolve(opts.archivePath);\n const rootAbs = path.resolve(opts.root);\n await assertIsDirectoryNotSymlink(rootAbs, \"importCapsule\", \"root\");\n\n const mode: ImportCapsuleMode = opts.mode ?? \"skip\";\n // Reject unknown mode values up-front (rule 51). TypeScript callers get a\n // compile-time check via the union type; JS/CLI callers get a runtime error\n // here before any write begins — not a silent destructive fallback.\n if (mode !== \"skip\" && mode !== \"overwrite\" && mode !== \"fork\") {\n throw new Error(\n `importCapsule: unknown mode ${JSON.stringify(mode)}; expected \"skip\", \"overwrite\", or \"fork\"`,\n );\n }\n\n // Auto-detect encrypted archives. If the file ends with `.enc` or starts\n // with the REMNIC-ENC magic header, decrypt it first before gunzip+parse.\n // Rule 48: default is \"not encrypted\"; we only attempt decryption when the\n // header is definitively present, never on ambiguous content.\n const encrypted = await isEncryptedCapsuleFile(archiveAbs);\n let raw: Buffer;\n if (encrypted) {\n if (!opts.memoryDir && !opts.passphrase) {\n throw new Error(\n `importCapsule: archive is encrypted but 'memoryDir' was not provided. ` +\n `Pass the memory directory so the secure-store key can be retrieved, ` +\n `provide the original passphrase for a format-v2 archive restore, ` +\n `or run \\`remnic secure-store unlock\\` before importing.`,\n );\n }\n raw = await decryptCapsuleFileInMemory(archiveAbs, opts.memoryDir, {\n passphrase: opts.passphrase,\n });\n } else {\n raw = await readFile(archiveAbs);\n }\n const json = gunzipSync(raw).toString(\"utf-8\");\n let parsedJson: unknown;\n try {\n parsedJson = JSON.parse(json);\n } catch (cause) {\n throw new Error(\n `importCapsule: archive is not valid JSON after gunzip: ${archiveAbs}`,\n { cause: cause as Error },\n );\n }\n\n const parsed = parseExportBundle(parsedJson);\n if (parsed.capsuleVersion !== 2) {\n // PR 1/6 ships a V1 reader; capsule import is V2-only by design. A V1\n // bundle does not carry a capsule block, so fork-mode (which depends on\n // `capsule.id` for the rebase prefix) cannot work. Reject up-front per\n // gotcha #51 instead of silently routing to a different code path.\n throw new Error(\n \"importCapsule: archive is V1; only V2 capsule archives are supported\",\n );\n }\n const bundle = parsed.bundle as { manifest: ExportManifestV2; records: ExportMemoryRecordV1[] };\n const manifest = bundle.manifest;\n const capsule = manifest.capsule;\n\n // Build a path → manifest-entry index for O(1) checksum lookup. The\n // manifest is the source of truth; records-without-manifest-entries and\n // manifest-entries-without-records are both treated as corruption.\n const manifestIndex = new Map<string, ExportManifestV2[\"files\"][number]>();\n for (const f of manifest.files) {\n manifestIndex.set(f.path, f);\n }\n if (manifestIndex.size !== manifest.files.length) {\n throw new Error(\n \"importCapsule: manifest contains duplicate file paths\",\n );\n }\n const recordPaths = new Set<string>();\n for (const rec of bundle.records) {\n if (recordPaths.has(rec.path)) {\n throw new Error(\n `importCapsule: bundle contains duplicate record path: ${rec.path}`,\n );\n }\n recordPaths.add(rec.path);\n }\n\n // Phase 1: verify every record matches its manifest entry AND validate all\n // target paths before any filesystem mutation. We do both in a single pass\n // so a corrupted or malicious archive cannot leave the memory dir partially\n // written (fail-closed per gotcha #25).\n //\n // The real root is resolved once via realpath so the subsequent per-record\n // inside-root checks are symlink-aware: a record path like `facts/a.md`\n // cannot write outside the intended sandbox via a symlinked subdirectory\n // (Codex P1 feedback). If realpath fails (root does not exist) the earlier\n // assertIsDirectoryNotSymlink call already threw, so this should always succeed.\n const rootReal = await realpath(rootAbs).catch(() => rootAbs);\n\n // Tracks normalized, case-folded target paths seen so far in phase 1. Maps\n // targetAbs.toLowerCase() → first source path so the collision error can name\n // both offending entries. Two manifest entries whose computed target paths\n // normalize to the same absolute path (e.g. `subdir/file.md` and\n // `subdir/./file.md`, or differing case on case-insensitive filesystems such\n // as macOS and Windows) would both try to write the same inode — the second\n // would silently overwrite the first. We reject the import up-front before\n // any write (Codex P2 thread on PR #741, line 283).\n const seenTargetPaths = new Map<string, string>();\n\n for (const rec of bundle.records) {\n // Checksum validation.\n const entry = manifestIndex.get(rec.path);\n if (!entry) {\n throw new Error(\n `importCapsule: archive checksum mismatch (record without manifest entry: ${rec.path})`,\n );\n }\n const { sha256, bytes } = sha256String(rec.content);\n if (sha256 !== entry.sha256 || bytes !== entry.bytes) {\n throw new Error(\n `importCapsule: archive checksum mismatch for ${rec.path}: ` +\n `expected sha256=${entry.sha256} bytes=${entry.bytes}, ` +\n `got sha256=${sha256} bytes=${bytes}`,\n );\n }\n\n // Source path validation: reject any record whose posix source path\n // contains a `..` segment, an absolute prefix, or any component that would\n // let fork-mode bypass its isolation invariant. This check runs before\n // `computeTargetPath` so that fork mode's `forks/<id>/` rebase cannot be\n // bypassed by a path like `../../profile.md` (which `path.join` would\n // silently collapse, landing the file inside root but outside the fork\n // prefix — Cursor medium thread #741). Rejecting `..` up-front is simpler\n // and more robust than normalising after the fact.\n //\n // Extended guard (Codex P1 #741 round 5): also reject paths containing\n // backslash separators (`\\`), which are Windows path separators. On Windows\n // a path like `..\\\\escape.md` or `subdir\\\\..\\\\..\\\\escape.md` would resolve\n // to a parent traversal but would bypass a purely posix-split check.\n // Additionally, after posix-normalizing the path we re-check for a leading\n // `..` or `/` — this catches edge-cases such as `subdir/../..` where the\n // individual split segments are not `..` but the normalized result is.\n if (rec.path.includes(\"\\\\\")) {\n throw new Error(\n `importCapsule: record path contains backslash separators (Windows-style paths are not allowed): ${rec.path}`,\n );\n }\n const posixNormalized = path.posix.normalize(rec.path);\n if (\n rec.path.startsWith(\"/\") ||\n rec.path.split(\"/\").some((seg) => seg === \"..\") ||\n posixNormalized.startsWith(\"..\") ||\n posixNormalized.startsWith(\"/\")\n ) {\n throw new Error(\n `importCapsule: record path escapes target root: ${rec.path}`,\n );\n }\n\n // Path-traversal validation (moved here from phase 2 per Cursor feedback:\n // the traversal check must run before ANY write so a malicious archive\n // with an escaping path that sorts last cannot land partial writes).\n //\n // We build targetAbs relative to the real-resolved root (rootReal) so\n // that the inside-root check is symlink-aware: if `rootReal !== rootAbs`\n // (the import root is itself behind a symlink), we still compare against\n // the canonical path (Codex P1).\n const targetRel = computeTargetPath(rec.path, mode, capsule.id);\n const targetAbs = path.join(rootReal, fromPosixRelPath(targetRel));\n if (!isPathInsideRoot(rootReal, targetAbs)) {\n throw new Error(\n `importCapsule: record path escapes target root: ${rec.path}`,\n );\n }\n\n // Symlink-aware containment check (Cursor thread #741 line 247/264).\n // The lexical check above handles `..`-traversal but cannot detect\n // symlinked subdirectories that point outside the root. We resolve the\n // nearest existing ancestor of the target via realpath to catch symlinks\n // anywhere in the path components. If any resolved prefix escapes rootReal,\n // the import is rejected before any write. This applies to ALL modes,\n // including fork mode whose rebase prefix may itself traverse a symlink.\n await assertRealpathInsideRoot(rootReal, targetAbs, rec.path, \"importCapsule\");\n\n // Target-file symlink check (Codex P1 #741 round 4, line 260).\n // `assertRealpathInsideRoot` resolves the nearest existing *ancestor* to\n // catch symlinked parent directories, but if the TARGET FILE itself already\n // exists and is a symlink, that check passes (the parent is real) while the\n // write would silently follow the symlink to a path outside root. We\n // therefore lstat the target directly: if it exists and is a symlink we\n // reject the record up-front. For new files the parent-canonicalization\n // performed above is sufficient; no realpath of a non-existent file is\n // needed.\n const targetLstat = await lstat(targetAbs).catch(() => null);\n if (targetLstat !== null && targetLstat.isSymbolicLink()) {\n throw new Error(\n `importCapsule: record target is a symlink and cannot be written to safely: ${rec.path}`,\n );\n }\n\n // Duplicate normalized target path detection (Codex P2 #741, line 283).\n // `path.join` already normalises `.` segments (e.g. `subdir/./file.md` →\n // `subdir/file.md`). On case-insensitive filesystems (macOS default,\n // Windows), two paths that differ only in case would resolve to the same\n // inode. We fold the dedup key to lowercase so that `subdir/File.md` and\n // `subdir/file.md` are detected as duplicates before any write occurs.\n // This is intentionally unconditional: the cost of an extra `.toLowerCase()`\n // on case-sensitive filesystems is negligible, and a defensive lowercase\n // is far simpler than probing filesystem case-sensitivity at runtime.\n const dedupKey = targetAbs.toLowerCase();\n const firstSourcePath = seenTargetPaths.get(dedupKey);\n if (firstSourcePath !== undefined) {\n throw new Error(\n `importCapsule: manifest contains two entries that resolve to the same target path: ` +\n `\"${firstSourcePath}\" and \"${rec.path}\" both map to \"${targetRel}\"`,\n );\n }\n seenTargetPaths.set(dedupKey, rec.path);\n }\n // Detect manifest-only entries (missing record). Treat as corruption.\n for (const f of manifest.files) {\n if (!recordPaths.has(f.path)) {\n throw new Error(\n `importCapsule: archive checksum mismatch (manifest entry without record: ${f.path})`,\n );\n }\n }\n\n // Phase 2: apply the mode. All records were validated in phase 1; we now\n // write to disk. Per-record errors propagate; each individual write is\n // atomic (mkdir + writeFile pair).\n const imported: ImportCapsuleImportedRecord[] = [];\n const skipped: ImportCapsuleSkippedRecord[] = [];\n\n // Sort by source path so the imported/skipped lists are deterministic\n // regardless of bundle order. (`exportCapsule` already sorts; we re-sort\n // defensively in case a hand-edited archive ships records in another order.)\n const sortedRecords = [...bundle.records].sort((a, b) =>\n a.path.localeCompare(b.path),\n );\n\n for (const rec of sortedRecords) {\n const targetRel = computeTargetPath(rec.path, mode, capsule.id);\n // Use rootReal (realpath-resolved) to stay consistent with phase 1's\n // traversal validation and avoid writing through stale symlinks.\n const targetAbs = path.join(rootReal, fromPosixRelPath(targetRel));\n\n const exists = await fileExistsAt(targetAbs);\n\n // Skip logic applies to both `skip` mode (explicit) and `fork` mode\n // (Cursor medium: fork mode must also be skip-on-exist for the computed\n // fork path, because production imports generate non-deterministic IDs —\n // so re-importing the same capsule should not overwrite user edits in the\n // fork tree or silently change file identities by generating new IDs).\n if ((mode === \"skip\" || mode === \"fork\") && exists) {\n skipped.push({ path: rec.path, reason: \"exists\" });\n continue;\n }\n\n let snapshotted = false;\n if (mode === \"overwrite\" && exists) {\n // Gotcha #54: snapshot BEFORE overwriting. If snapshot creation fails\n // we abort this record's import rather than silently destroying\n // history. The page-versioning module is responsible for atomic\n // sidecar writes; we just call it.\n if (opts.versioning && opts.versioning.enabled) {\n const prior = await readFile(targetAbs, \"utf-8\").catch(() => \"\");\n await createVersion(\n targetAbs,\n prior,\n \"manual\",\n opts.versioning,\n opts.log,\n `capsule-import: ${capsule.id}`,\n rootReal,\n );\n snapshotted = true;\n }\n }\n\n let contentToWrite = rec.content;\n let rewroteId = false;\n if (mode === \"fork\") {\n const forked = rewriteFrontmatterIdForFork(rec.content, capsule.id, opts.now);\n contentToWrite = forked.content;\n rewroteId = forked.rewrote;\n }\n\n await mkdir(path.dirname(targetAbs), { recursive: true });\n await writeFile(targetAbs, contentToWrite, \"utf-8\");\n // Bump the corpus sentinel per write (Cursor Medium, #1902): a concurrent\n // readAllMemories during the import must rescan and see records already on\n // disk, never the pre-import corpus, mid-batch.\n bumpMemoryCorpusVersionForDir(rootReal);\n imported.push({\n sourcePath: rec.path,\n targetPath: targetRel,\n snapshotted,\n rewroteId,\n });\n }\n\n // Sort skipped for stable output (see comment above).\n skipped.sort((a, b) => a.path.localeCompare(b.path));\n\n // Per-record corpus bumps happen inside the loop above (Cursor Medium,\n // #1902); no after-batch bump needed here.\n\n return { imported, skipped, manifest };\n}\n\n// ---------------------------------------------------------------------------\n// Path helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Compute the destination relative path for a record under the chosen\n * mode.\n *\n * - `skip` / `overwrite` — identity: the record's posix path is used as-is.\n * - `fork` — rebased under `forks/<capsule-id>/<original-path>` so the\n * original tree is never modified.\n */\nfunction computeTargetPath(\n sourcePosix: string,\n mode: ImportCapsuleMode,\n capsuleId: string,\n): string {\n if (mode === \"fork\") return `forks/${capsuleId}/${sourcePosix}`;\n return sourcePosix;\n}\n\nasync function fileExistsAt(absPath: string): Promise<boolean> {\n const st = await stat(absPath).catch(() => null);\n return st !== null && st.isFile();\n}\n\n// ---------------------------------------------------------------------------\n// Fork-mode id rewriting\n// ---------------------------------------------------------------------------\n\n/**\n * Rewrite a YAML-frontmatter `id:` field to a fork-scoped value.\n *\n * Strategy: we deliberately do NOT parse the entire YAML — memory files\n * use a deterministic top-of-file frontmatter delimited by `---` lines,\n * and the orchestrator's `parseFrontmatter` reads `id` as a top-level\n * key with a single-line scalar value. We mirror that contract:\n *\n * - Detect a leading `---\\n` … `\\n---` block at the top of the file.\n * - Within that block, locate the first `id:` line that is not nested\n * under another key (cheap heuristic: line starts at column 0).\n * - Replace its value with a new fork-id derived from `capsuleId` and\n * a short random suffix (or {@link opts.now} when provided for tests).\n *\n * Files without a frontmatter block, or without an `id:` key inside one,\n * are returned unchanged with `rewrote: false`. This keeps non-memory\n * artifacts (READMEs, transcripts) byte-identical to the source.\n */\nfunction rewriteFrontmatterIdForFork(\n content: string,\n capsuleId: string,\n now: number | undefined,\n): { content: string; rewrote: boolean } {\n // Detect the dominant line ending in the file so we can preserve it when\n // rebuilding the frontmatter delimiters. Splitting/joining on `\\n` silently\n // drops `\\r` from CRLF files, changing the byte content (Cursor thread #741\n // line 467). We detect the ending of the very first line (the opening `---`)\n // and use that as the canonical separator for the reconstructed delimiters.\n // All three cases are covered: CRLF (\\r\\n), LF (\\n), and bare CR (\\r).\n const crlfMatch = /^---(\\r\\n|\\r|\\n)/.exec(content);\n // Fall back to LF if the file starts with `---` but has no newline (EOF).\n const eol = crlfMatch ? crlfMatch[1] : \"\\n\";\n\n // Frontmatter block detection: `---` on its own line at the very start,\n // followed by content, followed by `---` on its own line. The closing\n // delimiter must be at column 0. We capture the trailing terminator\n // (`\\r?\\n` or end-of-string) as a separate group so we can re-emit it\n // verbatim, preserving CRLF/LF/EOF shape from the original file.\n const fmMatch = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---(\\r?\\n|$)/.exec(content);\n if (!fmMatch) return { content, rewrote: false };\n const fmBody = fmMatch[1];\n const fmTrailer = fmMatch[2];\n const fmStart = fmMatch.index;\n const fmEnd = fmStart + fmMatch[0].length;\n\n // Find a top-level `id:` line. Top-level means the line begins at\n // column 0 inside the frontmatter body (no leading whitespace) and the\n // key is exactly `id`. We deliberately accept `id:` and `id : ` shapes\n // but reject `nested_id:` to avoid touching unrelated keys.\n const idLineRe = /^id:[ \\t]*([^\\r\\n]*)$/m;\n const idMatch = idLineRe.exec(fmBody);\n if (!idMatch) return { content, rewrote: false };\n\n const newId = mintForkId(capsuleId, idMatch[1]?.trim() ?? \"\", now);\n const replacedBody = fmBody.replace(idLineRe, `id: ${newId}`);\n // Reconstruct the file: original prefix (always empty here, fmStart === 0\n // by the `^` anchor) + frontmatter delimiters around the rewritten body.\n // Use the detected `eol` for the opening/closing `---` lines so that CRLF\n // files remain CRLF and LF files remain LF, preserving byte-content fidelity\n // (Cursor thread #741 line 467). The captured `fmTrailer` (the newline\n // immediately after the closing `---`, or end-of-string) is re-emitted\n // verbatim so the byte immediately after the closing fence is unchanged.\n const prefix = content.slice(0, fmStart);\n const tail = content.slice(fmEnd);\n const rebuilt = `${prefix}---${eol}${replacedBody}${eol}---${fmTrailer}${tail}`;\n return { content: rebuilt, rewrote: true };\n}\n\n/**\n * Derive a deterministic-when-`now`-is-set fork id from the capsule id and\n * the original record id. Production callers omit `now` and get a UUID\n * suffix; tests pass `now` for byte-stable assertions.\n */\nfunction mintForkId(capsuleId: string, originalId: string, now: number | undefined): string {\n const base = originalId.length > 0 ? originalId : \"fork\";\n if (now === undefined) {\n const suffix = randomUUID().slice(0, 8);\n return `${base}-fork-${capsuleId}-${suffix}`;\n }\n // Deterministic suffix: short hash of (capsuleId, originalId, now). Using\n // sha256 over a sorted-key serialization (gotcha #38) so the suffix does\n // not depend on Object.entries order.\n const payload = JSON.stringify({ c: capsuleId, i: originalId, n: now });\n const suffix = createHash(\"sha256\").update(payload, \"utf-8\").digest(\"hex\").slice(0, 8);\n return `${base}-fork-${capsuleId}-${suffix}`;\n}\n\n// Note: `CapsuleBlock` is re-exported here purely so callers that want to\n// inspect the manifest block don't have to deep-import from `./types.js`.\nexport type { CapsuleBlock };\n"],"mappings":"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","names":["suffix"]}
@@ -0,0 +1,27 @@
1
+ import {
2
+ invalidateDerivedAndGlobalForDir
3
+ } from "./chunk-X47LWMKA.js";
4
+ import {
5
+ deleteInFlightReadsForDir
6
+ } from "./chunk-PDJTHRAW.js";
7
+
8
+ // src/memory-corpus-version.ts
9
+ import { appendFileSync, mkdirSync } from "fs";
10
+ import path from "path";
11
+ var MEMORY_CORPUS_VERSION_SENTINEL = ".memory-corpus-version.log";
12
+ function bumpMemoryCorpusVersionForDir(memoryDir) {
13
+ try {
14
+ const stateDir = path.join(memoryDir, "state");
15
+ mkdirSync(stateDir, { recursive: true });
16
+ appendFileSync(path.join(stateDir, MEMORY_CORPUS_VERSION_SENTINEL), "x");
17
+ } catch {
18
+ }
19
+ deleteInFlightReadsForDir(memoryDir);
20
+ invalidateDerivedAndGlobalForDir(memoryDir);
21
+ }
22
+
23
+ export {
24
+ MEMORY_CORPUS_VERSION_SENTINEL,
25
+ bumpMemoryCorpusVersionForDir
26
+ };
27
+ //# sourceMappingURL=chunk-OKUEZOGW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/memory-corpus-version.ts"],"sourcesContent":["import { appendFileSync, mkdirSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { deleteInFlightReadsForDir } from \"./in-flight-reads.js\";\nimport { invalidateDerivedAndGlobalForDir } from \"./memory-cache.js\";\n\n/**\n * Filename of the memory-corpus version sentinel (issue #1902). MUST stay in\n * sync with `StorageManager.versionFilePath(\"memory-corpus\")` in storage.ts —\n * the byte size of this append-only file IS the corpus version, and the\n * version-keyed hot-memories result cache keys on it.\n */\nexport const MEMORY_CORPUS_VERSION_SENTINEL = \".memory-corpus-version.log\";\n\n/**\n * Out-of-band corpus-version bump (issue #1902) for code paths that write or\n * modify memory files WITHOUT going through a StorageManager mutation method\n * — review approval, governance restore, migration. Appends one byte to the\n * on-disk sentinel so any process's version-keyed hot-memories cache rescans\n * on its next read (StorageManager.readSharedVersion reads the file size, so\n * the growth is observed immediately). Fail-open: a bump failure must never\n * crash the caller — a stale-cache window self-heals on the next real write.\n */\nexport function bumpMemoryCorpusVersionForDir(memoryDir: string): void {\n try {\n const stateDir = path.join(memoryDir, \"state\");\n mkdirSync(stateDir, { recursive: true });\n appendFileSync(path.join(stateDir, MEMORY_CORPUS_VERSION_SENTINEL), \"x\");\n } catch {\n /* fail-open: never let a cache-coherence bump crash the primary operation */\n }\n // Drop any in-flight readAllMemories scan for this dir (Cursor Medium, #1902):\n // after the sentinel advances, a concurrent read that missed the version-keyed\n // hot entry must not attach to a scan that began BEFORE this out-of-band write\n // and receive a pre-write corpus. Clearing forces a fresh scan of disk truth.\n deleteInFlightReadsForDir(memoryDir);\n // Also evict the TTL-keyed derived (episode/rule) and global (QMD search/recall)\n // caches for this dir (issue #1902, Codex Medium). The sentinel bump self-heals\n // the version-keyed hot cache, but the QMD caches are TTL-keyed, NOT\n // corpus-version-keyed — without this, an out-of-band writer (capsule\n // import/merge, review, spaces, governance restore, page revert, binary\n // redirect) would leave a warm process serving pre-write recall/search results\n // for the remainder of the QMD cache TTL. Route the bump through the same\n // invalidation chokepoint the in-process mutation paths use.\n invalidateDerivedAndGlobalForDir(memoryDir);\n}\n"],"mappings":";;;;;;;;AAAA,SAAS,gBAAgB,iBAAiB;AAC1C,OAAO,UAAU;AAUV,IAAM,iCAAiC;AAWvC,SAAS,8BAA8B,WAAyB;AACrE,MAAI;AACF,UAAM,WAAW,KAAK,KAAK,WAAW,OAAO;AAC7C,cAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AACvC,mBAAe,KAAK,KAAK,UAAU,8BAA8B,GAAG,GAAG;AAAA,EACzE,QAAQ;AAAA,EAER;AAKA,4BAA0B,SAAS;AASnC,mCAAiC,SAAS;AAC5C;","names":[]}
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-SOBJ6NEY.js";
4
4
  import {
5
5
  summarizeDisclosureTokens
6
- } from "./chunk-DQPPRXFO.js";
6
+ } from "./chunk-HQ7QZJM5.js";
7
7
  import {
8
8
  summarizeRetrievedMemoryProvenance
9
9
  } from "./chunk-I4WBNM3M.js";
@@ -587,4 +587,4 @@ export {
587
587
  renderRecallExplain,
588
588
  parseRecallExplainFormat
589
589
  };
590
- //# sourceMappingURL=chunk-PKGWJFNR.js.map
590
+ //# sourceMappingURL=chunk-OVMS3DCB.js.map
@@ -0,0 +1,36 @@
1
+ // src/in-flight-reads.ts
2
+ var inFlightReadsByKey = /* @__PURE__ */ new Map();
3
+ var DIR_SEP = "\0";
4
+ function composeKey(baseDir, keyId) {
5
+ return `${baseDir}${DIR_SEP}${keyId}`;
6
+ }
7
+ function getInFlightRead(baseDir, keyId = "") {
8
+ return inFlightReadsByKey.get(composeKey(baseDir, keyId));
9
+ }
10
+ function setInFlightRead(baseDir, keyId, read) {
11
+ inFlightReadsByKey.set(composeKey(baseDir, keyId), read);
12
+ }
13
+ function deleteInFlightRead(baseDir, keyId = "", expected) {
14
+ const key = composeKey(baseDir, keyId);
15
+ if (expected === void 0 || inFlightReadsByKey.get(key) === expected) {
16
+ inFlightReadsByKey.delete(key);
17
+ }
18
+ }
19
+ function deleteInFlightReadsForDir(baseDir) {
20
+ const prefix = `${baseDir}${DIR_SEP}`;
21
+ for (const key of inFlightReadsByKey.keys()) {
22
+ if (key.startsWith(prefix)) inFlightReadsByKey.delete(key);
23
+ }
24
+ }
25
+ function clearInFlightReads() {
26
+ inFlightReadsByKey.clear();
27
+ }
28
+
29
+ export {
30
+ getInFlightRead,
31
+ setInFlightRead,
32
+ deleteInFlightRead,
33
+ deleteInFlightReadsForDir,
34
+ clearInFlightReads
35
+ };
36
+ //# sourceMappingURL=chunk-PDJTHRAW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/in-flight-reads.ts"],"sourcesContent":["import type { MemoryFile } from \"./types.js\";\n\n/**\n * In-flight readAllMemories() dedup registry (issue #1902).\n *\n * NOT a cache layer — it holds transient per-(directory, secure-store key) scan\n * promises so temporally-overlapping reads collapse onto ONE disk scan; the slot\n * is deleted when the promise settles. It lives in its own module (not\n * memory-cache.ts) so it is not swept by the ALL_CACHE_LAYERS invalidation\n * contract, yet remains importable by both StorageManager and the out-of-band\n * corpus-bump helper (memory-corpus-version.ts).\n *\n * Keyed by baseDir AND secure-store key identity (Codex P1 / Cursor Medium):\n * an unlocked manager's decrypted scan must NOT be handed to a locked or\n * differently-keyed manager for the same dir — that would bypass the keyId\n * isolation getCachedMemories enforces. Locked/plaintext stores use keyId \"\".\n */\nconst inFlightReadsByKey = new Map<string, Promise<MemoryFile[]>>();\n\nconst DIR_SEP = \"\\u0000\";\n\nfunction composeKey(baseDir: string, keyId: string): string {\n return `${baseDir}${DIR_SEP}${keyId}`;\n}\n\nexport function getInFlightRead(baseDir: string, keyId = \"\"): Promise<MemoryFile[]> | undefined {\n return inFlightReadsByKey.get(composeKey(baseDir, keyId));\n}\n\nexport function setInFlightRead(baseDir: string, keyId: string, read: Promise<MemoryFile[]>): void {\n inFlightReadsByKey.set(composeKey(baseDir, keyId), read);\n}\n\n/**\n * Delete the in-flight slot for one (baseDir, keyId). When `expected` is given,\n * only deletes if the slot still holds that exact promise (owner-only clear).\n */\nexport function deleteInFlightRead(\n baseDir: string,\n keyId = \"\",\n expected?: Promise<MemoryFile[]>,\n): void {\n const key = composeKey(baseDir, keyId);\n if (expected === undefined || inFlightReadsByKey.get(key) === expected) {\n inFlightReadsByKey.delete(key);\n }\n}\n\n/**\n * Drop EVERY in-flight slot for `baseDir` across all secure-store identities.\n * Used by mutations / invalidation / out-of-band corpus bumps: after the corpus\n * changes, no reader of any key identity may attach to a pre-mutation scan.\n */\nexport function deleteInFlightReadsForDir(baseDir: string): void {\n const prefix = `${baseDir}${DIR_SEP}`;\n for (const key of inFlightReadsByKey.keys()) {\n if (key.startsWith(prefix)) inFlightReadsByKey.delete(key);\n }\n}\n\nexport function clearInFlightReads(): void {\n inFlightReadsByKey.clear();\n}\n"],"mappings":";AAiBA,IAAM,qBAAqB,oBAAI,IAAmC;AAElE,IAAM,UAAU;AAEhB,SAAS,WAAW,SAAiB,OAAuB;AAC1D,SAAO,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK;AACrC;AAEO,SAAS,gBAAgB,SAAiB,QAAQ,IAAuC;AAC9F,SAAO,mBAAmB,IAAI,WAAW,SAAS,KAAK,CAAC;AAC1D;AAEO,SAAS,gBAAgB,SAAiB,OAAe,MAAmC;AACjG,qBAAmB,IAAI,WAAW,SAAS,KAAK,GAAG,IAAI;AACzD;AAMO,SAAS,mBACd,SACA,QAAQ,IACR,UACM;AACN,QAAM,MAAM,WAAW,SAAS,KAAK;AACrC,MAAI,aAAa,UAAa,mBAAmB,IAAI,GAAG,MAAM,UAAU;AACtE,uBAAmB,OAAO,GAAG;AAAA,EAC/B;AACF;AAOO,SAAS,0BAA0B,SAAuB;AAC/D,QAAM,SAAS,GAAG,OAAO,GAAG,OAAO;AACnC,aAAW,OAAO,mBAAmB,KAAK,GAAG;AAC3C,QAAI,IAAI,WAAW,MAAM,EAAG,oBAAmB,OAAO,GAAG;AAAA,EAC3D;AACF;AAEO,SAAS,qBAA2B;AACzC,qBAAmB,MAAM;AAC3B;","names":[]}
@@ -3,10 +3,13 @@ import {
3
3
  } from "./chunk-TBBDFYXW.js";
4
4
  import {
5
5
  StorageManager
6
- } from "./chunk-KTOH7EJE.js";
6
+ } from "./chunk-PV7E2FGY.js";
7
7
  import {
8
8
  assertPathInsideRoot
9
9
  } from "./chunk-VSMRDBFT.js";
10
+ import {
11
+ bumpMemoryCorpusVersionForDir
12
+ } from "./chunk-OKUEZOGW.js";
10
13
  import {
11
14
  RECALL_FALLBACK_DIRS
12
15
  } from "./chunk-VS2IYZRU.js";
@@ -689,6 +692,7 @@ async function restoreMemoryGovernanceRun(options) {
689
692
  await mkdir(path.dirname(entry.originalPath), { recursive: true });
690
693
  await writeFile(entry.originalPath, entry.beforeRaw, "utf-8");
691
694
  restoredActions += 1;
695
+ bumpMemoryCorpusVersionForDir(options.memoryDir);
692
696
  }
693
697
  return {
694
698
  runId: raw.runId,
@@ -751,4 +755,4 @@ export {
751
755
  listMemoryGovernanceRuns,
752
756
  readMemoryGovernanceRunArtifact
753
757
  };
754
- //# sourceMappingURL=chunk-ZUFJ7ZTR.js.map
758
+ //# sourceMappingURL=chunk-PHXCPVSX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/maintenance/memory-governance.ts"],"sourcesContent":["import path from \"node:path\";\nimport { lstat, mkdir, readFile, readdir, realpath, rm, writeFile } from \"node:fs/promises\";\nimport { StorageManager } from \"../storage.js\";\nimport { decideLifecycleTransition } from \"../lifecycle.js\";\nimport type { MemoryFile, MemoryStatus } from \"../types.js\";\nimport { RECALL_FALLBACK_DIRS } from \"../utils/category-dir.js\";\nimport { bumpMemoryCorpusVersionForDir } from \"../memory-corpus-version.js\";\nimport { assertPathInsideRoot } from \"../utils/path-containment.js\";\n\nexport type MemoryGovernanceMode = \"shadow\" | \"apply\";\nexport type MemoryGovernanceReasonCode =\n | \"exact_duplicate\"\n | \"semantic_duplicate_candidate\"\n | \"disputed_memory\"\n | \"speculative_low_confidence\"\n | \"archive_candidate\"\n | \"explicit_capture_review\"\n | \"malformed_import\";\n\nexport interface MemoryGovernanceReviewQueueEntry {\n entryId: string;\n memoryId: string;\n path: string;\n reasonCode: MemoryGovernanceReasonCode;\n severity: \"low\" | \"medium\" | \"high\";\n suggestedAction: \"set_status\" | \"archive\";\n suggestedStatus?: Extract<MemoryStatus, \"pending_review\" | \"quarantined\" | \"rejected\">;\n relatedMemoryIds: string[];\n}\n\nexport interface MemoryGovernanceAppliedAction {\n action: \"set_status\" | \"archive\";\n memoryId: string;\n reasonCode: MemoryGovernanceReviewQueueEntry[\"reasonCode\"];\n beforeStatus: MemoryStatus;\n afterStatus?: MemoryStatus;\n originalPath: string;\n currentPath: string;\n}\n\ninterface MemoryGovernanceRestoreEntry {\n action: MemoryGovernanceAppliedAction[\"action\"];\n memoryId: string;\n reasonCode: MemoryGovernanceReviewQueueEntry[\"reasonCode\"];\n originalPath: string;\n currentPath: string;\n beforeRaw: string;\n expectedCurrentRaw?: string;\n applied: boolean;\n}\n\nexport interface MemoryGovernanceRestoreManifest {\n runId: string;\n createdAt: string;\n entries: MemoryGovernanceRestoreEntry[];\n}\n\nexport interface MemoryGovernanceSummary {\n schemaVersion: 1;\n runId: string;\n traceId: string;\n mode: MemoryGovernanceMode;\n createdAt: string;\n scannedMemories: number;\n reviewQueueCount: number;\n proposedActionCount: number;\n appliedActionCount: number;\n ruleVersion: string;\n}\n\nexport interface MemoryGovernanceMetrics {\n reviewReasons: Record<MemoryGovernanceReasonCode, number>;\n proposedStatuses: Record<string, number>;\n keptMemoryCount: number;\n qualityScore: MemoryGovernanceQualityScore;\n}\n\nexport interface MemoryGovernanceQualityScore {\n score: number;\n maxScore: 100;\n grade: \"excellent\" | \"good\" | \"fair\" | \"poor\";\n deductions: Array<{\n reasonCode: MemoryGovernanceReasonCode;\n count: number;\n pointsLost: number;\n }>;\n}\n\nexport interface MemoryGovernanceTransitionReport {\n proposed: Record<string, MemoryGovernanceAppliedAction[]>;\n applied: Record<string, MemoryGovernanceAppliedAction[]>;\n}\n\nexport interface MemoryGovernanceManifest {\n schemaVersion: 1;\n runId: string;\n traceId: string;\n mode: MemoryGovernanceMode;\n createdAt: string;\n ruleVersion: string;\n artifacts: Record<string, string>;\n}\n\nexport interface MemoryGovernanceRunResult {\n runId: string;\n traceId: string;\n mode: MemoryGovernanceMode;\n summary: MemoryGovernanceSummary;\n summaryPath: string;\n reviewQueuePath: string;\n qualityScorePath: string;\n transitionReportPath: string;\n reportPath: string;\n keptMemoriesPath: string;\n appliedActionsPath: string;\n metricsPath: string;\n manifestPath: string;\n restorePath?: string;\n reviewQueue: MemoryGovernanceReviewQueueEntry[];\n proposedActions: MemoryGovernanceAppliedAction[];\n appliedActions: MemoryGovernanceAppliedAction[];\n}\n\nexport interface RestoreMemoryGovernanceRunResult {\n runId: string;\n restoredActions: number;\n restorePath: string;\n}\n\nexport interface RunMemoryGovernanceOptions {\n memoryDir: string;\n mode: MemoryGovernanceMode;\n now?: Date;\n maxMemories?: number;\n batchSize?: number;\n recentDays?: number;\n}\n\nexport interface RestoreMemoryGovernanceRunOptions {\n memoryDir: string;\n runId: string;\n now?: Date;\n}\n\nexport const RULE_VERSION = \"memory-governance.v2\";\nconst SEMANTIC_DUPLICATE_MIN_TOKENS = 6;\nconst SEMANTIC_DUPLICATE_MIN_JACCARD = 0.66;\nconst QUALITY_SCORE_WEIGHTS: Record<MemoryGovernanceReasonCode, number> = {\n exact_duplicate: 6,\n semantic_duplicate_candidate: 4,\n disputed_memory: 15,\n speculative_low_confidence: 8,\n archive_candidate: 2,\n explicit_capture_review: 5,\n malformed_import: 12,\n};\n\nfunction governanceRunsDir(memoryDir: string): string {\n return path.join(memoryDir, \"state\", \"memory-governance\", \"runs\");\n}\n\nfunction governanceRunDir(memoryDir: string, runId: string): string {\n return path.join(governanceRunsDir(memoryDir), runId);\n}\n\nfunction governanceRestorePath(memoryDir: string, runId: string): string {\n return path.join(governanceRunDir(memoryDir, runId), \"restore.json\");\n}\n\nfunction buildRunId(now: Date): string {\n return `gov-${now.toISOString().replace(/[:.]/g, \"-\")}`;\n}\n\nfunction plannedArchivePath(memoryDir: string, originalPath: string, now: Date): string {\n return path.join(\n memoryDir,\n \"archive\",\n now.toISOString().slice(0, 10),\n path.basename(originalPath),\n );\n}\n\nfunction normalizeContent(content: string): string {\n return content.trim().replace(/\\s+/g, \" \").toLowerCase();\n}\n\nfunction statusOf(memory: MemoryFile): MemoryStatus {\n return memory.frontmatter.status ?? \"active\";\n}\n\nfunction parseIsoMs(value?: string): number | null {\n if (!value) return null;\n const ms = Date.parse(value);\n return Number.isFinite(ms) ? ms : null;\n}\n\nfunction daysSince(value: string | undefined, now: Date): number {\n const ts = parseIsoMs(value);\n if (ts === null) return 365;\n return Math.max(0, (now.getTime() - ts) / 86_400_000);\n}\n\nfunction compareCanonicalPreference(left: MemoryFile, right: MemoryFile): number {\n if (left.frontmatter.confidence !== right.frontmatter.confidence) {\n return (right.frontmatter.confidence ?? 0) - (left.frontmatter.confidence ?? 0);\n }\n return left.frontmatter.created.localeCompare(right.frontmatter.created);\n}\n\nfunction proposedStatusPriority(status: MemoryStatus): number {\n switch (status) {\n case \"quarantined\":\n return 4;\n case \"rejected\":\n return 3;\n case \"archived\":\n return 2;\n case \"pending_review\":\n return 1;\n default:\n return 0;\n }\n}\n\nfunction proposedActionPriority(action: MemoryGovernanceAppliedAction): number {\n if (action.action === \"archive\") {\n return proposedStatusPriority(\"archived\");\n }\n return proposedStatusPriority(action.afterStatus ?? \"active\");\n}\n\nfunction tokenizeSemanticContent(content: string): string[] {\n return Array.from(\n new Set(\n normalizeContent(content)\n .replaceAll(/[^\\p{L}\\p{N}]+/gu, \" \")\n .split(\" \")\n .filter((token) => token.length >= 4),\n ),\n );\n}\n\nfunction jaccardSimilarity(left: string[], right: string[]): number {\n if (left.length === 0 || right.length === 0) return 0;\n const leftSet = new Set(left);\n const rightSet = new Set(right);\n let intersection = 0;\n for (const token of leftSet) {\n if (rightSet.has(token)) intersection += 1;\n }\n const union = new Set([...leftSet, ...rightSet]).size;\n return union > 0 ? intersection / union : 0;\n}\n\nfunction sameSemanticDuplicateScope(left: MemoryFile, right: MemoryFile): boolean {\n if (left.frontmatter.category !== right.frontmatter.category) return false;\n const leftEntityRef = left.frontmatter.entityRef?.trim();\n const rightEntityRef = right.frontmatter.entityRef?.trim();\n if (leftEntityRef && rightEntityRef && leftEntityRef !== rightEntityRef) return false;\n return true;\n}\n\nfunction buildSemanticDuplicateEntries(activeMemories: MemoryFile[]): MemoryGovernanceReviewQueueEntry[] {\n const reviewQueue: MemoryGovernanceReviewQueueEntry[] = [];\n const ordered = [...activeMemories].sort(compareCanonicalPreference);\n const tokensByMemoryId = new Map(\n ordered.map((memory) => [memory.frontmatter.id, tokenizeSemanticContent(memory.content)] as const),\n );\n const claimed = new Set<string>();\n\n for (let candidateIndex = 1; candidateIndex < ordered.length; candidateIndex += 1) {\n const candidate = ordered[candidateIndex];\n if (claimed.has(candidate.frontmatter.id)) continue;\n const candidateTokens = tokensByMemoryId.get(candidate.frontmatter.id) ?? [];\n if (candidateTokens.length < SEMANTIC_DUPLICATE_MIN_TOKENS) continue;\n const candidateNormalized = normalizeContent(candidate.content);\n\n for (let canonicalIndex = 0; canonicalIndex < candidateIndex; canonicalIndex += 1) {\n const canonical = ordered[canonicalIndex];\n if (!sameSemanticDuplicateScope(canonical, candidate)) continue;\n const canonicalNormalized = normalizeContent(canonical.content);\n if (canonicalNormalized === candidateNormalized) continue;\n const canonicalTokens = tokensByMemoryId.get(canonical.frontmatter.id) ?? [];\n if (canonicalTokens.length < SEMANTIC_DUPLICATE_MIN_TOKENS) continue;\n\n const shorter = Math.min(candidateTokens.length, canonicalTokens.length);\n const longer = Math.max(candidateTokens.length, canonicalTokens.length);\n if (shorter / longer < 0.6) continue;\n if (jaccardSimilarity(candidateTokens, canonicalTokens) < SEMANTIC_DUPLICATE_MIN_JACCARD) continue;\n\n reviewQueue.push({\n entryId: `review:${candidate.frontmatter.id}:semantic_duplicate_candidate`,\n memoryId: candidate.frontmatter.id,\n path: candidate.path,\n reasonCode: \"semantic_duplicate_candidate\",\n severity: \"medium\",\n suggestedAction: \"set_status\",\n suggestedStatus: \"pending_review\",\n relatedMemoryIds: [canonical.frontmatter.id],\n });\n claimed.add(candidate.frontmatter.id);\n break;\n }\n }\n\n return reviewQueue;\n}\n\nfunction buildExplicitCaptureReviewEntries(\n memories: MemoryFile[],\n lifecycleEvents: Array<{\n memoryId: string;\n eventType: string;\n reasonCode?: string;\n }>,\n): MemoryGovernanceReviewQueueEntry[] {\n const explicitQueuedIds = new Set(\n lifecycleEvents\n .filter((event) => event.eventType === \"explicit_capture_queued\")\n .map((event) => event.memoryId),\n );\n\n return memories\n .filter((memory) => {\n if (statusOf(memory) !== \"pending_review\") return false;\n const tags = memory.frontmatter.tags ?? [];\n if (tags.includes(\"queued-review\")) return true;\n if (explicitQueuedIds.has(memory.frontmatter.id)) return true;\n return memory.frontmatter.source === \"explicit-review\" || memory.frontmatter.source === \"explicit-inline-review\";\n })\n .map((memory) => ({\n entryId: `review:${memory.frontmatter.id}:explicit_capture_review`,\n memoryId: memory.frontmatter.id,\n path: memory.path,\n reasonCode: \"explicit_capture_review\" as const,\n severity: \"medium\" as const,\n suggestedAction: \"set_status\" as const,\n suggestedStatus: \"pending_review\" as const,\n relatedMemoryIds: [],\n }));\n}\n\n/**\n * List every `*.md` under `root`, refusing to follow symlinked directories or\n * entries that resolve outside `containmentRoot` (a realpath-resolved memory\n * store root). Mirrors the containment guard in consolidation-provenance's\n * walkMarkdownFiles / the CLI walker, reusing the shared assertPathInsideRoot\n * (rule 22). Without this, a symlinked category dir (e.g. decisions/ → outside\n * memoryDir) would be walked and its files surfaced by the malformed-import\n * governance sweep — an out-of-store info leak.\n */\nasync function listMarkdownFiles(root: string, containmentRoot: string): Promise<string[]> {\n const files: string[] = [];\n const walk = async (dir: string) => {\n try {\n const dirStat = await lstat(dir);\n if (dirStat.isSymbolicLink() || !dirStat.isDirectory()) return;\n assertPathInsideRoot(containmentRoot, await realpath(dir), dir);\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isSymbolicLink()) continue; // never follow symlinked entries\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n await walk(fullPath);\n continue;\n }\n if (entry.isFile() && entry.name.endsWith(\".md\")) {\n try {\n assertPathInsideRoot(containmentRoot, await realpath(fullPath), fullPath);\n } catch {\n continue; // poisoned entry escaping the root — skip it.\n }\n files.push(fullPath);\n }\n }\n } catch {\n // Absent dir (ENOENT), symlinked/out-of-root dir, or containment\n // violation — skip this subtree without aborting the sweep.\n }\n };\n\n await walk(root);\n return files;\n}\n\nfunction malformedMemoryId(memoryDir: string, filePath: string): string {\n return `malformed:${path.relative(memoryDir, filePath).replaceAll(path.sep, \"/\")}`;\n}\n\nasync function buildMalformedImportEntries(\n memoryDir: string,\n storage: StorageManager,\n parsedMemories: MemoryFile[],\n candidateFiles?: string[],\n): Promise<MemoryGovernanceReviewQueueEntry[]> {\n const parsedPaths = new Set(parsedMemories.map((memory) => memory.path));\n // Inspect every recall category directory (RECALL_FALLBACK_DIRS — the single\n // source of truth) so malformed files under newly-routed categories\n // (decisions/, preferences/, ...) are surfaced too, not just facts/ (#1546).\n // Resolve the containment root (realpath) once and thread it into the walker\n // so a symlinked category dir can't escape memoryDir. If memoryDir itself\n // can't be resolved, there is nothing valid to inspect.\n let containmentRoot: string | null = null;\n try {\n containmentRoot = await realpath(memoryDir);\n } catch {\n containmentRoot = null;\n }\n const filesToInspect =\n candidateFiles ??\n (containmentRoot === null\n ? []\n : (\n await Promise.all(\n RECALL_FALLBACK_DIRS.map((dir) =>\n listMarkdownFiles(path.join(memoryDir, dir), containmentRoot as string),\n ),\n )\n ).flat());\n const entries: MemoryGovernanceReviewQueueEntry[] = [];\n\n for (const filePath of filesToInspect) {\n if (parsedPaths.has(filePath)) continue;\n const parsed = await storage.readMemoryByPath(filePath);\n if (parsed) continue;\n entries.push({\n entryId: `review:${malformedMemoryId(memoryDir, filePath)}:malformed_import`,\n memoryId: malformedMemoryId(memoryDir, filePath),\n path: filePath,\n reasonCode: \"malformed_import\",\n severity: \"high\",\n suggestedAction: \"set_status\",\n suggestedStatus: \"quarantined\",\n relatedMemoryIds: [],\n });\n }\n\n return entries;\n}\n\nasync function buildReviewQueue(\n memoryDir: string,\n storage: StorageManager,\n memories: MemoryFile[],\n now: Date,\n options: {\n malformedCandidateFiles?: string[];\n } = {},\n): Promise<MemoryGovernanceReviewQueueEntry[]> {\n const reviewQueue: MemoryGovernanceReviewQueueEntry[] = [];\n const activeMemories = memories.filter((memory) => statusOf(memory) === \"active\");\n const duplicateBuckets = new Map<string, MemoryFile[]>();\n\n for (const memory of activeMemories) {\n const key = `${memory.frontmatter.category}:${normalizeContent(memory.content)}`;\n const bucket = duplicateBuckets.get(key) ?? [];\n bucket.push(memory);\n duplicateBuckets.set(key, bucket);\n }\n\n for (const bucket of duplicateBuckets.values()) {\n if (bucket.length < 2) continue;\n const ordered = [...bucket].sort(compareCanonicalPreference);\n const canonical = ordered[0];\n for (const duplicate of ordered.slice(1)) {\n reviewQueue.push({\n entryId: `review:${duplicate.frontmatter.id}:exact_duplicate`,\n memoryId: duplicate.frontmatter.id,\n path: duplicate.path,\n reasonCode: \"exact_duplicate\",\n severity: \"medium\",\n suggestedAction: \"set_status\",\n suggestedStatus: \"pending_review\",\n relatedMemoryIds: canonical ? [canonical.frontmatter.id] : [],\n });\n }\n }\n\n reviewQueue.push(...buildSemanticDuplicateEntries(activeMemories));\n\n for (const memory of activeMemories) {\n if (memory.frontmatter.verificationState === \"disputed\") {\n reviewQueue.push({\n entryId: `review:${memory.frontmatter.id}:disputed_memory`,\n memoryId: memory.frontmatter.id,\n path: memory.path,\n reasonCode: \"disputed_memory\",\n severity: \"high\",\n suggestedAction: \"set_status\",\n suggestedStatus: \"quarantined\",\n relatedMemoryIds: [],\n });\n }\n\n if (\n memory.frontmatter.confidenceTier === \"speculative\"\n && (memory.frontmatter.confidence ?? 0) <= 0.25\n ) {\n reviewQueue.push({\n entryId: `review:${memory.frontmatter.id}:speculative_low_confidence`,\n memoryId: memory.frontmatter.id,\n path: memory.path,\n reasonCode: \"speculative_low_confidence\",\n severity: \"medium\",\n suggestedAction: \"set_status\",\n suggestedStatus: \"pending_review\",\n relatedMemoryIds: [],\n });\n }\n\n const lifecycle = decideLifecycleTransition(memory, {}, now);\n const staleForArchive = memory.frontmatter.lifecycleState === \"stale\"\n && daysSince(memory.frontmatter.updated ?? memory.frontmatter.created, now) >= 180;\n if ((lifecycle.nextState === \"archived\" && lifecycle.changed) || staleForArchive) {\n reviewQueue.push({\n entryId: `review:${memory.frontmatter.id}:archive_candidate`,\n memoryId: memory.frontmatter.id,\n path: memory.path,\n reasonCode: \"archive_candidate\",\n severity: \"low\",\n suggestedAction: \"archive\",\n relatedMemoryIds: [],\n });\n }\n }\n\n const lifecycleEvents = await storage.readMemoryLifecycleEvents(Number.MAX_SAFE_INTEGER);\n reviewQueue.push(...buildExplicitCaptureReviewEntries(memories, lifecycleEvents));\n reviewQueue.push(...await buildMalformedImportEntries(\n memoryDir,\n storage,\n memories,\n options.malformedCandidateFiles,\n ));\n\n return reviewQueue;\n}\n\nexport function buildProposedActions(\n reviewQueue: MemoryGovernanceReviewQueueEntry[],\n memories: MemoryFile[],\n): MemoryGovernanceAppliedAction[] {\n const byMemory = new Map(memories.map((memory) => [memory.frontmatter.id, memory]));\n const selected = new Map<string, MemoryGovernanceAppliedAction>();\n\n for (const entry of reviewQueue) {\n const memory = byMemory.get(entry.memoryId);\n if (!memory) continue;\n const currentStatus = statusOf(memory);\n if (\n entry.suggestedAction === \"set_status\"\n && entry.suggestedStatus\n && entry.suggestedStatus === currentStatus\n ) {\n continue;\n }\n const candidate: MemoryGovernanceAppliedAction = {\n action: entry.suggestedAction,\n memoryId: entry.memoryId,\n reasonCode: entry.reasonCode,\n beforeStatus: currentStatus,\n afterStatus: entry.suggestedStatus,\n originalPath: memory.path,\n currentPath: memory.path,\n };\n\n const existing = selected.get(entry.memoryId);\n if (!existing) {\n selected.set(entry.memoryId, candidate);\n continue;\n }\n\n const existingPriority = proposedActionPriority(existing);\n const candidatePriority = proposedActionPriority(candidate);\n if (candidatePriority > existingPriority) {\n selected.set(entry.memoryId, candidate);\n }\n }\n\n return [...selected.values()];\n}\n\nfunction buildMetrics(\n reviewQueue: MemoryGovernanceReviewQueueEntry[],\n proposedActions: MemoryGovernanceAppliedAction[],\n scannedMemories: number,\n): MemoryGovernanceMetrics {\n const reviewReasons: MemoryGovernanceMetrics[\"reviewReasons\"] = {\n exact_duplicate: 0,\n semantic_duplicate_candidate: 0,\n disputed_memory: 0,\n speculative_low_confidence: 0,\n archive_candidate: 0,\n explicit_capture_review: 0,\n malformed_import: 0,\n };\n const proposedStatuses: Record<string, number> = {};\n\n for (const entry of reviewQueue) {\n reviewReasons[entry.reasonCode] += 1;\n }\n\n for (const action of proposedActions) {\n const effectiveStatus = action.afterStatus ?? (action.action === \"archive\" ? \"archived\" : undefined);\n if (!effectiveStatus) continue;\n proposedStatuses[effectiveStatus] = (proposedStatuses[effectiveStatus] ?? 0) + 1;\n }\n\n return {\n reviewReasons,\n proposedStatuses,\n keptMemoryCount: Math.max(0, scannedMemories - proposedActions.length),\n qualityScore: buildQualityScore(reviewReasons),\n };\n}\n\nexport function buildQualityScore(\n reviewReasons: Record<MemoryGovernanceReasonCode, number>,\n): MemoryGovernanceQualityScore {\n const deductions = Object.entries(reviewReasons)\n .map(([reasonCode, count]) => ({\n reasonCode: reasonCode as MemoryGovernanceReasonCode,\n count,\n pointsLost: count * QUALITY_SCORE_WEIGHTS[reasonCode as MemoryGovernanceReasonCode],\n }))\n .filter((entry) => entry.count > 0)\n .sort((left, right) => right.pointsLost - left.pointsLost);\n const totalPointsLost = deductions.reduce((sum, entry) => sum + entry.pointsLost, 0);\n const score = Math.max(0, 100 - totalPointsLost);\n const grade = score >= 90 ? \"excellent\"\n : score >= 75 ? \"good\"\n : score >= 50 ? \"fair\"\n : \"poor\";\n return {\n score,\n maxScore: 100,\n grade,\n deductions,\n };\n}\n\nexport function groupActionsByStatus(\n actions: MemoryGovernanceAppliedAction[],\n): Record<string, MemoryGovernanceAppliedAction[]> {\n const grouped: Record<string, MemoryGovernanceAppliedAction[]> = {};\n for (const action of actions) {\n const status = action.afterStatus ?? (action.action === \"archive\" ? \"archived\" : \"unchanged\");\n const bucket = grouped[status] ?? [];\n bucket.push(action);\n grouped[status] = bucket;\n }\n return grouped;\n}\n\nasync function safeRead(filePath: string): Promise<string | null> {\n try {\n return await readFile(filePath, \"utf-8\");\n } catch {\n return null;\n }\n}\n\nasync function persistRestoreManifest(\n memoryDir: string,\n manifest: MemoryGovernanceRestoreManifest,\n): Promise<string> {\n const restorePath = governanceRestorePath(memoryDir, manifest.runId);\n await mkdir(path.dirname(restorePath), { recursive: true });\n await writeFile(restorePath, JSON.stringify(manifest, null, 2), \"utf-8\");\n return restorePath;\n}\n\nasync function writeGovernanceArtifacts(options: {\n memoryDir: string;\n runId: string;\n traceId: string;\n summary: MemoryGovernanceSummary;\n metrics: MemoryGovernanceMetrics;\n qualityScore: MemoryGovernanceQualityScore;\n transitionReport: MemoryGovernanceTransitionReport;\n keptMemoryIds: string[];\n reviewQueue: MemoryGovernanceReviewQueueEntry[];\n proposedActions: MemoryGovernanceAppliedAction[];\n appliedActions: MemoryGovernanceAppliedAction[];\n restoreManifest?: MemoryGovernanceRestoreManifest;\n}): Promise<\n Pick<\n MemoryGovernanceRunResult,\n | \"summaryPath\"\n | \"reviewQueuePath\"\n | \"qualityScorePath\"\n | \"transitionReportPath\"\n | \"reportPath\"\n | \"keptMemoriesPath\"\n | \"appliedActionsPath\"\n | \"metricsPath\"\n | \"manifestPath\"\n | \"restorePath\"\n >\n> {\n const runDir = governanceRunDir(options.memoryDir, options.runId);\n await mkdir(runDir, { recursive: true });\n\n const summaryPath = path.join(runDir, \"summary.json\");\n const reviewQueuePath = path.join(runDir, \"review-queue.json\");\n const qualityScorePath = path.join(runDir, \"quality-score.json\");\n const transitionReportPath = path.join(runDir, \"status-transitions.json\");\n const reportPath = path.join(runDir, \"report.md\");\n const keptMemoriesPath = path.join(runDir, \"kept-memories.json\");\n const appliedActionsPath = path.join(runDir, \"applied-actions.json\");\n const metricsPath = path.join(runDir, \"metrics.json\");\n const manifestPath = path.join(runDir, \"manifest.json\");\n const restorePath = options.restoreManifest ? governanceRestorePath(options.memoryDir, options.runId) : undefined;\n\n await writeFile(summaryPath, JSON.stringify(options.summary, null, 2), \"utf-8\");\n await writeFile(reviewQueuePath, JSON.stringify(options.reviewQueue, null, 2), \"utf-8\");\n await writeFile(qualityScorePath, JSON.stringify(options.qualityScore, null, 2), \"utf-8\");\n await writeFile(transitionReportPath, JSON.stringify(options.transitionReport, null, 2), \"utf-8\");\n await writeFile(keptMemoriesPath, JSON.stringify(options.keptMemoryIds, null, 2), \"utf-8\");\n await writeFile(appliedActionsPath, JSON.stringify(options.appliedActions, null, 2), \"utf-8\");\n await writeFile(metricsPath, JSON.stringify(options.metrics, null, 2), \"utf-8\");\n await writeFile(\n reportPath,\n [\n `# Memory Governance Run ${options.runId}`,\n \"\",\n `- Trace ID: ${options.traceId}`,\n `- Mode: ${options.summary.mode}`,\n `- Scanned memories: ${options.summary.scannedMemories}`,\n `- Kept memories: ${options.metrics.keptMemoryCount}`,\n `- Review queue entries: ${options.summary.reviewQueueCount}`,\n `- Proposed actions: ${options.summary.proposedActionCount}`,\n `- Applied actions: ${options.summary.appliedActionCount}`,\n `- Quality score: ${options.qualityScore.score}/${options.qualityScore.maxScore} (${options.qualityScore.grade})`,\n \"\",\n \"## Metrics\",\n ...Object.entries(options.metrics.reviewReasons).map(([reason, count]) => `- ${reason}: ${count}`),\n ...(Object.entries(options.metrics.proposedStatuses).length > 0\n ? Object.entries(options.metrics.proposedStatuses).map(([status, count]) => `- proposed ${status}: ${count}`)\n : [\"- proposed statuses: (none)\"]),\n \"\",\n \"## Quality Score\",\n ...(options.qualityScore.deductions.length > 0\n ? options.qualityScore.deductions.map((entry) => `- ${entry.reasonCode}: ${entry.count} -> -${entry.pointsLost}`)\n : [\"- no deductions\"]),\n \"\",\n \"## Proposed Actions\",\n ...(options.proposedActions.length > 0\n ? options.proposedActions.map((action) =>\n `- ${action.memoryId}: ${action.action}${action.afterStatus ? ` -> ${action.afterStatus}` : \"\"} [${action.reasonCode}]`,\n )\n : [\"- (empty)\"]),\n \"\",\n \"## Applied Actions\",\n ...(options.appliedActions.length > 0\n ? options.appliedActions.map((action) =>\n `- ${action.memoryId}: ${action.action}${action.afterStatus ? ` -> ${action.afterStatus}` : \"\"} [${action.reasonCode}]`,\n )\n : [\"- (empty)\"]),\n \"\",\n \"## Review Queue\",\n ...(options.reviewQueue.length > 0\n ? options.reviewQueue.map((entry) =>\n `- ${entry.memoryId}: ${entry.reasonCode} -> ${entry.suggestedAction}${entry.suggestedStatus ? ` (${entry.suggestedStatus})` : \"\"}`,\n )\n : [\"- (empty)\"]),\n ].join(\"\\n\"),\n \"utf-8\",\n );\n const manifest: MemoryGovernanceManifest = {\n schemaVersion: 1,\n runId: options.runId,\n traceId: options.traceId,\n mode: options.summary.mode,\n createdAt: options.summary.createdAt,\n ruleVersion: options.summary.ruleVersion,\n artifacts: {\n summary: summaryPath,\n reviewQueue: reviewQueuePath,\n qualityScore: qualityScorePath,\n transitionReport: transitionReportPath,\n report: reportPath,\n keptMemories: keptMemoriesPath,\n appliedActions: appliedActionsPath,\n metrics: metricsPath,\n ...(restorePath ? { restore: restorePath } : {}),\n },\n };\n await writeFile(manifestPath, JSON.stringify(manifest, null, 2), \"utf-8\");\n if (restorePath && options.restoreManifest && await safeRead(restorePath) === null) {\n await writeFile(restorePath, JSON.stringify(options.restoreManifest, null, 2), \"utf-8\");\n }\n\n return {\n summaryPath,\n reviewQueuePath,\n qualityScorePath,\n transitionReportPath,\n reportPath,\n keptMemoriesPath,\n appliedActionsPath,\n metricsPath,\n manifestPath,\n restorePath,\n };\n}\n\nexport async function runMemoryGovernance(\n options: RunMemoryGovernanceOptions,\n): Promise<MemoryGovernanceRunResult> {\n const now = options.now ?? new Date();\n const runId = buildRunId(now);\n const traceId = runId;\n const storage = new StorageManager(options.memoryDir);\n const boundedScan =\n options.maxMemories !== undefined ||\n options.recentDays !== undefined ||\n options.batchSize !== undefined;\n const normalizedRecentDays = typeof options.recentDays === \"number\" && Number.isFinite(options.recentDays)\n ? Math.max(1, Math.floor(options.recentDays))\n : undefined;\n const updatedAfter = normalizedRecentDays !== undefined\n ? new Date(now.getTime() - normalizedRecentDays * 86_400_000)\n : undefined;\n const memoryWindow = boundedScan\n ? await storage.readMemoriesWindow({\n maxMemories: options.maxMemories,\n batchSize: options.batchSize,\n updatedAfter,\n })\n : undefined;\n const memories = memoryWindow?.memories ?? await storage.readAllMemories();\n const reviewQueue = await buildReviewQueue(options.memoryDir, storage, memories, now, {\n malformedCandidateFiles: memoryWindow?.filePaths,\n });\n const proposedActions = buildProposedActions(reviewQueue, memories);\n const reviewEntryByActionKey = new Map(\n reviewQueue.map((entry) => [`${entry.memoryId}:${entry.reasonCode}`, entry] as const),\n );\n const metrics = buildMetrics(reviewQueue, proposedActions, memories.length);\n const transitionReport: MemoryGovernanceTransitionReport = {\n proposed: groupActionsByStatus(proposedActions),\n applied: {},\n };\n const memoryPathById = new Map(memories.map((memory) => [memory.frontmatter.id, memory.path] as const));\n const targetedMemoryIds = new Set(proposedActions.map((action) => action.memoryId));\n const keptMemoryIds = memories\n .map((memory) => memory.frontmatter.id)\n .filter((memoryId) => !targetedMemoryIds.has(memoryId));\n const appliedActions: MemoryGovernanceAppliedAction[] = [];\n const restoreEntries: MemoryGovernanceRestoreEntry[] = [];\n const restoreEntryByMemoryId = new Map<string, MemoryGovernanceRestoreEntry>();\n\n if (options.mode === \"apply\") {\n for (const action of proposedActions) {\n const memoryPath = memoryPathById.get(action.memoryId) ?? null;\n if (!memoryPath) continue;\n const memory = await storage.readMemoryByPath(memoryPath);\n if (!memory) continue;\n if (memory.frontmatter.id !== action.memoryId) continue;\n const beforeRaw = await safeRead(memory.path);\n if (!beforeRaw) continue;\n const entry: MemoryGovernanceRestoreEntry = {\n action: action.action,\n memoryId: action.memoryId,\n reasonCode: action.reasonCode,\n originalPath: memory.path,\n currentPath: action.action === \"archive\"\n ? plannedArchivePath(options.memoryDir, memory.path, now)\n : memory.path,\n beforeRaw,\n applied: false,\n };\n restoreEntries.push(entry);\n restoreEntryByMemoryId.set(action.memoryId, entry);\n }\n\n const restoreManifest: MemoryGovernanceRestoreManifest = {\n runId,\n createdAt: now.toISOString(),\n entries: restoreEntries,\n };\n await persistRestoreManifest(options.memoryDir, restoreManifest);\n\n for (const action of proposedActions) {\n const memoryPath = memoryPathById.get(action.memoryId) ?? null;\n if (!memoryPath) continue;\n const memory = await storage.readMemoryByPath(memoryPath);\n if (!memory) continue;\n if (memory.frontmatter.id !== action.memoryId) continue;\n const restoreEntry = restoreEntryByMemoryId.get(action.memoryId);\n if (!restoreEntry) continue;\n\n if (action.action === \"archive\") {\n const reviewEntry = reviewEntryByActionKey.get(`${action.memoryId}:${action.reasonCode}`);\n restoreEntry.applied = true;\n await persistRestoreManifest(options.memoryDir, restoreManifest);\n const archivedPath = await storage.archiveMemory(memory, {\n at: now,\n actor: \"memory-governance.apply\",\n reasonCode: action.reasonCode,\n ruleVersion: RULE_VERSION,\n relatedMemoryIds: reviewEntry?.relatedMemoryIds ?? [],\n correlationId: traceId,\n });\n if (!archivedPath) {\n restoreEntry.applied = false;\n await persistRestoreManifest(options.memoryDir, restoreManifest);\n continue;\n }\n restoreEntry.currentPath = archivedPath;\n restoreEntry.expectedCurrentRaw = await safeRead(archivedPath) ?? undefined;\n await persistRestoreManifest(options.memoryDir, restoreManifest);\n appliedActions.push({\n ...action,\n currentPath: archivedPath,\n afterStatus: \"archived\",\n });\n continue;\n }\n\n if (!action.afterStatus || action.beforeStatus === action.afterStatus) continue;\n const reviewEntry = reviewEntryByActionKey.get(`${action.memoryId}:${action.reasonCode}`);\n restoreEntry.applied = true;\n await persistRestoreManifest(options.memoryDir, restoreManifest);\n const updated = await storage.writeMemoryFrontmatter(memory, {\n status: action.afterStatus,\n updated: now.toISOString(),\n }, {\n actor: \"memory-governance.apply\",\n reasonCode: action.reasonCode,\n ruleVersion: RULE_VERSION,\n relatedMemoryIds: reviewEntry?.relatedMemoryIds ?? [],\n correlationId: traceId,\n });\n if (!updated) {\n restoreEntry.applied = false;\n await persistRestoreManifest(options.memoryDir, restoreManifest);\n continue;\n }\n restoreEntry.expectedCurrentRaw = await safeRead(memory.path) ?? undefined;\n await persistRestoreManifest(options.memoryDir, restoreManifest);\n appliedActions.push({\n ...action,\n currentPath: memory.path,\n });\n }\n }\n\n const summary: MemoryGovernanceSummary = {\n schemaVersion: 1,\n runId,\n traceId,\n mode: options.mode,\n createdAt: now.toISOString(),\n scannedMemories: memories.length,\n reviewQueueCount: reviewQueue.length,\n proposedActionCount: proposedActions.length,\n appliedActionCount: appliedActions.length,\n ruleVersion: RULE_VERSION,\n };\n const restoreManifest = options.mode === \"apply\"\n ? {\n runId,\n createdAt: now.toISOString(),\n entries: restoreEntries,\n }\n : undefined;\n transitionReport.applied = groupActionsByStatus(appliedActions);\n const paths = await writeGovernanceArtifacts({\n memoryDir: options.memoryDir,\n runId,\n traceId,\n summary,\n metrics,\n qualityScore: metrics.qualityScore,\n transitionReport,\n keptMemoryIds,\n reviewQueue,\n proposedActions,\n appliedActions,\n restoreManifest,\n });\n\n return {\n runId,\n traceId,\n mode: options.mode,\n summary,\n ...paths,\n reviewQueue,\n proposedActions,\n appliedActions,\n };\n}\n\nexport async function restoreMemoryGovernanceRun(\n options: RestoreMemoryGovernanceRunOptions,\n): Promise<RestoreMemoryGovernanceRunResult> {\n void options.now;\n const restorePath = governanceRestorePath(options.memoryDir, options.runId);\n const raw = JSON.parse(await readFile(restorePath, \"utf-8\")) as MemoryGovernanceRestoreManifest;\n let restoredActions = 0;\n\n for (const entry of [...raw.entries].reverse()) {\n if (!entry.applied) {\n continue;\n }\n const currentRaw = await safeRead(entry.currentPath);\n if (entry.expectedCurrentRaw && currentRaw !== entry.expectedCurrentRaw) {\n throw new Error(`restore conflict for ${entry.memoryId}: current contents diverged from governance run`);\n }\n if (entry.action === \"archive\") {\n await rm(entry.currentPath, { force: true });\n }\n await mkdir(path.dirname(entry.originalPath), { recursive: true });\n await writeFile(entry.originalPath, entry.beforeRaw, \"utf-8\");\n restoredActions += 1;\n // Restore writes/removes memory files directly (out-of-band — not through a\n // StorageManager mutation). Bump the corpus sentinel PER entry so a\n // same-process or peer readAllMemories rescans mid-batch and never serves a\n // partially-restored corpus (Cursor Medium, #1902).\n bumpMemoryCorpusVersionForDir(options.memoryDir);\n }\n\n return {\n runId: raw.runId,\n restoredActions,\n restorePath,\n };\n}\n\nexport async function listMemoryGovernanceRuns(memoryDir: string): Promise<string[]> {\n try {\n return (await readdir(governanceRunsDir(memoryDir))).sort().reverse();\n } catch {\n return [];\n }\n}\n\nexport async function readMemoryGovernanceRunArtifact(\n memoryDir: string,\n runId: string,\n): Promise<{\n summary: MemoryGovernanceSummary;\n metrics: MemoryGovernanceMetrics;\n qualityScore: MemoryGovernanceQualityScore;\n keptMemoryIds: string[];\n reviewQueue: MemoryGovernanceReviewQueueEntry[];\n appliedActions: MemoryGovernanceAppliedAction[];\n transitionReport: MemoryGovernanceTransitionReport;\n report: string;\n manifest: MemoryGovernanceManifest;\n restore?: MemoryGovernanceRestoreManifest;\n}> {\n const runDir = governanceRunDir(memoryDir, runId);\n const summary = JSON.parse(await readFile(path.join(runDir, \"summary.json\"), \"utf-8\")) as MemoryGovernanceSummary;\n const metrics = JSON.parse(await readFile(path.join(runDir, \"metrics.json\"), \"utf-8\")) as MemoryGovernanceMetrics;\n metrics.qualityScore ??= buildQualityScore(metrics.reviewReasons);\n const keptMemoryIds = JSON.parse(await readFile(path.join(runDir, \"kept-memories.json\"), \"utf-8\")) as string[];\n const reviewQueue = JSON.parse(\n await readFile(path.join(runDir, \"review-queue.json\"), \"utf-8\"),\n ) as MemoryGovernanceReviewQueueEntry[];\n const appliedActions = JSON.parse(\n await readFile(path.join(runDir, \"applied-actions.json\"), \"utf-8\"),\n ) as MemoryGovernanceAppliedAction[];\n const qualityScoreRaw = await safeRead(path.join(runDir, \"quality-score.json\"));\n const transitionReportRaw = await safeRead(path.join(runDir, \"status-transitions.json\"));\n const manifest = JSON.parse(\n await readFile(path.join(runDir, \"manifest.json\"), \"utf-8\"),\n ) as MemoryGovernanceManifest;\n const report = await readFile(path.join(runDir, \"report.md\"), \"utf-8\");\n const restoreRaw = await safeRead(path.join(runDir, \"restore.json\"));\n const qualityScore = qualityScoreRaw\n ? JSON.parse(qualityScoreRaw) as MemoryGovernanceQualityScore\n : metrics.qualityScore ?? buildQualityScore(metrics.reviewReasons);\n const transitionReport = transitionReportRaw\n ? JSON.parse(transitionReportRaw) as MemoryGovernanceTransitionReport\n : {\n proposed: {},\n applied: groupActionsByStatus(appliedActions),\n };\n return {\n summary,\n metrics,\n qualityScore,\n keptMemoryIds,\n reviewQueue,\n appliedActions,\n transitionReport,\n report,\n manifest,\n restore: restoreRaw ? JSON.parse(restoreRaw) as MemoryGovernanceRestoreManifest : undefined,\n };\n}\n"],"mappings":"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","names":["restoreManifest","reviewEntry"]}
@@ -5,7 +5,7 @@ import {
5
5
  } from "./chunk-D7FOKIY5.js";
6
6
  import {
7
7
  EngramAccessInputError
8
- } from "./chunk-CNWC274T.js";
8
+ } from "./chunk-MLT5EG6K.js";
9
9
  import {
10
10
  expandTildePath
11
11
  } from "./chunk-EYIEWJNI.js";
@@ -274,4 +274,4 @@ export {
274
274
  listRegisteredOperations,
275
275
  __resetRegistryForTest
276
276
  };
277
- //# sourceMappingURL=chunk-57INMZ6F.js.map
277
+ //# sourceMappingURL=chunk-POUD5BLV.js.map