@remnic/core 9.7.7 → 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 (383) 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 +6 -6
  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-service-CxDZXTKt.d.ts → access-service-DSuzikHQ.d.ts} +4 -4
  24. package/dist/access-service.d.ts +6 -6
  25. package/dist/access-service.js +31 -29
  26. package/dist/access-surface-catalog.d.ts +6 -6
  27. package/dist/action-confidence.d.ts +1 -1
  28. package/dist/active-memory-bridge.d.ts +1 -1
  29. package/dist/active-recall.d.ts +1 -1
  30. package/dist/active-recall.js +1 -1
  31. package/dist/adapters/index.js +4 -4
  32. package/dist/adapters/registry.js +2 -2
  33. package/dist/{auto-sync-676N6N6Y.js → auto-sync-AAMTVZMK.js} +5 -5
  34. package/dist/behavior-learner.d.ts +1 -1
  35. package/dist/behavior-signals.d.ts +1 -1
  36. package/dist/bootstrap.d.ts +5 -5
  37. package/dist/briefing.d.ts +2 -2
  38. package/dist/briefing.js +14 -12
  39. package/dist/buffer-surprise-report.d.ts +1 -1
  40. package/dist/buffer.d.ts +2 -2
  41. package/dist/bulk-import/index.d.ts +3 -3
  42. package/dist/calibration.d.ts +1 -1
  43. package/dist/calibration.js +2 -2
  44. package/dist/capabilities.d.ts +1 -1
  45. package/dist/{capsule-merge-GK5E647P.js → capsule-merge-Z2HUO6IK.js} +10 -2
  46. package/dist/capsule-merge-Z2HUO6IK.js.map +1 -0
  47. package/dist/{catalog-DzU9HowE.d.ts → catalog-BNwjACa5.d.ts} +1 -1
  48. package/dist/causal-behavior.d.ts +1 -1
  49. package/dist/causal-consolidation.d.ts +1 -1
  50. package/dist/causal-consolidation.js +15 -13
  51. package/dist/causal-consolidation.js.map +1 -1
  52. package/dist/causal-trajectory-graph.d.ts +1 -1
  53. package/dist/{chunk-TZJVTH3F.js → chunk-27VEKQQA.js} +14 -14
  54. package/dist/{chunk-JO5AT6QT.js → chunk-3ZVFLMFQ.js} +1 -1
  55. package/dist/chunk-3ZVFLMFQ.js.map +1 -0
  56. package/dist/{chunk-AD2KK5MT.js → chunk-5CFHYQU3.js} +9 -3
  57. package/dist/chunk-5CFHYQU3.js.map +1 -0
  58. package/dist/{chunk-7XH7VJN4.js → chunk-5S7Z5SHA.js} +2 -2
  59. package/dist/{chunk-TVVEYCNW.js → chunk-7K5Q6COX.js} +4 -4
  60. package/dist/{chunk-EJCVMPIM.js → chunk-7LMEY5KZ.js} +15 -1
  61. package/dist/chunk-7LMEY5KZ.js.map +1 -0
  62. package/dist/{chunk-3F4N4WDH.js → chunk-AHLPZ2SF.js} +2 -2
  63. package/dist/{chunk-AH3M6F4X.js → chunk-CDGGQGUU.js} +2 -2
  64. package/dist/{chunk-ZHKD4EZM.js → chunk-CK6RI52P.js} +3 -3
  65. package/dist/{chunk-6C35R7P4.js → chunk-DJCKXI4M.js} +2 -2
  66. package/dist/{chunk-GL3SMLMZ.js → chunk-DLPXS7BE.js} +109 -85
  67. package/dist/chunk-DLPXS7BE.js.map +1 -0
  68. package/dist/{chunk-NMMKRVUF.js → chunk-EIKBKQ6L.js} +6 -6
  69. package/dist/{chunk-O3BZ6PFY.js → chunk-F3FC7SMO.js} +2 -2
  70. package/dist/{chunk-ZW6OKHVX.js → chunk-FKCJH7KP.js} +2 -2
  71. package/dist/{chunk-DQPPRXFO.js → chunk-HQ7QZJM5.js} +2 -2
  72. package/dist/{chunk-UYZUJ4EB.js → chunk-I2THZUAF.js} +2 -2
  73. package/dist/{chunk-RKNJBZ55.js → chunk-JBPKEARU.js} +4 -4
  74. package/dist/{chunk-KIPLG7S7.js → chunk-JKLJ6A7W.js} +2 -2
  75. package/dist/{chunk-HXDKC3BI.js → chunk-JU3GHO6J.js} +2 -2
  76. package/dist/{chunk-74MJH7I3.js → chunk-KGNFFCZJ.js} +12 -3
  77. package/dist/chunk-KGNFFCZJ.js.map +1 -0
  78. package/dist/{chunk-Q6JPMCPO.js → chunk-KKASNHGF.js} +62 -57
  79. package/dist/chunk-KKASNHGF.js.map +1 -0
  80. package/dist/{chunk-R2SJDIPO.js → chunk-KPXAJ77O.js} +9 -7
  81. package/dist/chunk-KPXAJ77O.js.map +1 -0
  82. package/dist/{chunk-SYNYI4ZM.js → chunk-L5HJQC36.js} +2 -2
  83. package/dist/{chunk-VXMWDXIJ.js → chunk-LC7OODWZ.js} +2 -2
  84. package/dist/{chunk-CNWC274T.js → chunk-MLT5EG6K.js} +28 -28
  85. package/dist/{chunk-M5QKGHCR.js → chunk-OC35KQIN.js} +6 -2
  86. package/dist/chunk-OC35KQIN.js.map +1 -0
  87. package/dist/chunk-OKUEZOGW.js +27 -0
  88. package/dist/chunk-OKUEZOGW.js.map +1 -0
  89. package/dist/{chunk-PKGWJFNR.js → chunk-OVMS3DCB.js} +2 -2
  90. package/dist/chunk-PDJTHRAW.js +36 -0
  91. package/dist/chunk-PDJTHRAW.js.map +1 -0
  92. package/dist/{chunk-ZUFJ7ZTR.js → chunk-PHXCPVSX.js} +6 -2
  93. package/dist/chunk-PHXCPVSX.js.map +1 -0
  94. package/dist/{chunk-57INMZ6F.js → chunk-POUD5BLV.js} +2 -2
  95. package/dist/{chunk-KTOH7EJE.js → chunk-PV7E2FGY.js} +307 -43
  96. package/dist/chunk-PV7E2FGY.js.map +1 -0
  97. package/dist/{chunk-LRGSLV7M.js → chunk-PYHOAXTI.js} +4 -4
  98. package/dist/{chunk-WKE4VXSZ.js → chunk-QKVX4Y6D.js} +2 -2
  99. package/dist/{chunk-FXGC5UUH.js → chunk-RT7IP3D3.js} +2 -2
  100. package/dist/{chunk-CHVU4RE5.js → chunk-SKXBOZDF.js} +3 -3
  101. package/dist/{chunk-TVRPRFUB.js → chunk-TY43GBX2.js} +9 -7
  102. package/dist/chunk-TY43GBX2.js.map +1 -0
  103. package/dist/{chunk-UVIQHSS7.js → chunk-UP25ZZCN.js} +9 -3
  104. package/dist/chunk-UP25ZZCN.js.map +1 -0
  105. package/dist/{chunk-GKCCHHZK.js → chunk-UXKMMNJD.js} +4 -4
  106. package/dist/{chunk-XFTPUXCE.js → chunk-UXWGPODH.js} +4 -4
  107. package/dist/{chunk-2FSHROYK.js → chunk-V53GJUSL.js} +8 -8
  108. package/dist/{chunk-LKT755LP.js → chunk-VA4WSW54.js} +2 -2
  109. package/dist/{chunk-FYKIEOG6.js → chunk-VCFADTFS.js} +3 -3
  110. package/dist/{chunk-VF4XKTX3.js → chunk-VZ5OJE4X.js} +10 -2
  111. package/dist/chunk-VZ5OJE4X.js.map +1 -0
  112. package/dist/{chunk-AWJ2FHCF.js → chunk-X47LWMKA.js} +49 -21
  113. package/dist/chunk-X47LWMKA.js.map +1 -0
  114. package/dist/{chunk-VMGMY2AI.js → chunk-XG5CGR3K.js} +8 -8
  115. package/dist/{chunk-VMGMY2AI.js.map → chunk-XG5CGR3K.js.map} +1 -1
  116. package/dist/{chunk-T7VNN3ZM.js → chunk-XVLEGMJI.js} +2 -2
  117. package/dist/{chunk-CRFTLUWT.js → chunk-Y5U35ZVS.js} +2 -2
  118. package/dist/{chunk-UHGHTOR5.js → chunk-YGAOLHKN.js} +7 -7
  119. package/dist/{chunk-QDCJNRKK.js → chunk-YXOAQAH2.js} +3 -3
  120. package/dist/{cli-BqyGVyOe.d.ts → cli-DACyuK8-.d.ts} +5 -5
  121. package/dist/cli.d.ts +8 -8
  122. package/dist/cli.js +65 -63
  123. package/dist/compounding/engine.d.ts +2 -2
  124. package/dist/compounding/engine.js +14 -12
  125. package/dist/compounding/preference-consolidator.d.ts +1 -1
  126. package/dist/compression-optimizer.d.ts +1 -1
  127. package/dist/config.d.ts +1 -1
  128. package/dist/config.js +1 -1
  129. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  130. package/dist/connectors/codex-materialize-runner.js +14 -12
  131. package/dist/connectors/codex-materialize.d.ts +1 -1
  132. package/dist/connectors/index.d.ts +1 -1
  133. package/dist/connectors/index.js +14 -12
  134. package/dist/consolidation-provenance-check.d.ts +2 -2
  135. package/dist/consolidation-provenance-check.js +6 -2
  136. package/dist/consolidation-undo.d.ts +2 -2
  137. package/dist/consolidation-undo.js +8 -1
  138. package/dist/consolidation-undo.js.map +1 -1
  139. package/dist/contradiction/index.d.ts +2 -2
  140. package/dist/conversation-index/backend.d.ts +1 -1
  141. package/dist/conversation-index/chunker.d.ts +1 -1
  142. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  143. package/dist/conversation-index/indexer.d.ts +1 -1
  144. package/dist/conversation-index/search.d.ts +1 -1
  145. package/dist/day-summary.d.ts +1 -1
  146. package/dist/delinearize.d.ts +1 -1
  147. package/dist/direct-answer-wiring.d.ts +1 -1
  148. package/dist/direct-answer.d.ts +1 -1
  149. package/dist/embedding-fallback.d.ts +1 -1
  150. package/dist/enrichment/index.d.ts +1 -1
  151. package/dist/entity-retrieval.d.ts +2 -2
  152. package/dist/entity-retrieval.js +14 -12
  153. package/dist/entity-schema.d.ts +1 -1
  154. package/dist/explicit-capture.d.ts +5 -5
  155. package/dist/extraction-faithfulness.d.ts +1 -1
  156. package/dist/extraction-faithfulness.js +3 -3
  157. package/dist/extraction-judge-telemetry.d.ts +1 -1
  158. package/dist/extraction-judge-training.d.ts +1 -1
  159. package/dist/extraction-judge.d.ts +1 -1
  160. package/dist/extraction-judge.js +3 -3
  161. package/dist/extraction.d.ts +1 -1
  162. package/dist/extraction.js +3 -3
  163. package/dist/fallback-llm.d.ts +1 -1
  164. package/dist/fallback-llm.js +2 -2
  165. package/dist/{forget-KHF7A44H.js → forget-CQCLB5LB.js} +2 -2
  166. package/dist/graph-dashboard-diff.d.ts +1 -1
  167. package/dist/graph-dashboard-key.d.ts +1 -1
  168. package/dist/graph-dashboard-parser.d.ts +1 -1
  169. package/dist/graph-edge-reinforcement.d.ts +1 -1
  170. package/dist/graph-snapshot.d.ts +1 -1
  171. package/dist/graph.d.ts +1 -1
  172. package/dist/identity-continuity.d.ts +1 -1
  173. package/dist/importance.d.ts +1 -1
  174. package/dist/importers/index.d.ts +1 -1
  175. package/dist/in-flight-reads.d.ts +19 -0
  176. package/dist/in-flight-reads.js +16 -0
  177. package/dist/in-flight-reads.js.map +1 -0
  178. package/dist/index.d.ts +13 -13
  179. package/dist/index.js +105 -103
  180. package/dist/intent.d.ts +1 -1
  181. package/dist/lcm/engine.d.ts +1 -1
  182. package/dist/lcm/engine.js +2 -2
  183. package/dist/lcm/index.d.ts +1 -1
  184. package/dist/lcm/index.js +7 -7
  185. package/dist/lcm/tools.d.ts +1 -1
  186. package/dist/lifecycle.d.ts +1 -1
  187. package/dist/live-connectors-runner.d.ts +1 -1
  188. package/dist/local-llm.d.ts +1 -1
  189. package/dist/local-model-endpoint.d.ts +1 -1
  190. package/dist/maintenance/memory-governance.d.ts +1 -1
  191. package/dist/maintenance/memory-governance.js +14 -12
  192. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +14 -12
  193. package/dist/maintenance/rebuild-memory-projection.js +15 -13
  194. package/dist/mcp-memory-inspector-app.d.ts +6 -6
  195. package/dist/memory-action-policy.d.ts +1 -1
  196. package/dist/memory-cache.d.ts +24 -13
  197. package/dist/memory-cache.js +3 -1
  198. package/dist/memory-corpus-version.d.ts +19 -0
  199. package/dist/memory-corpus-version.js +13 -0
  200. package/dist/memory-corpus-version.js.map +1 -0
  201. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  202. package/dist/memory-projection-store.d.ts +1 -1
  203. package/dist/memory-provenance.d.ts +1 -1
  204. package/dist/memory-worth-outcomes.d.ts +2 -2
  205. package/dist/models-json.d.ts +1 -1
  206. package/dist/namespaces/migrate.d.ts +3 -3
  207. package/dist/namespaces/migrate.js +21 -19
  208. package/dist/namespaces/principal.d.ts +1 -1
  209. package/dist/namespaces/search.d.ts +1 -1
  210. package/dist/namespaces/search.js +7 -7
  211. package/dist/namespaces/storage.d.ts +3 -3
  212. package/dist/namespaces/storage.js +14 -12
  213. package/dist/native-knowledge.d.ts +1 -1
  214. package/dist/operator-toolkit.d.ts +2 -2
  215. package/dist/operator-toolkit.js +26 -24
  216. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  217. package/dist/orchestration/maintenance.d.ts +2 -2
  218. package/dist/orchestration/maintenance.js +16 -14
  219. package/dist/{orchestrator-37Cx7yyw.d.ts → orchestrator-D83AvrPf.d.ts} +4 -4
  220. package/dist/orchestrator.d.ts +5 -5
  221. package/dist/orchestrator.js +88 -86
  222. package/dist/page-versioning.js +5 -1
  223. package/dist/patterns-cli.d.ts +1 -1
  224. package/dist/{pipeline-C6onljHc.d.ts → pipeline-BSqGpYl1.d.ts} +1 -1
  225. package/dist/policy-runtime.d.ts +1 -1
  226. package/dist/provenance.d.ts +1 -1
  227. package/dist/{qmd-J08G7MEm.d.ts → qmd-CutnpRVe.d.ts} +1 -1
  228. package/dist/qmd-preflight.d.ts +2 -2
  229. package/dist/qmd-recall-cache.d.ts +1 -1
  230. package/dist/qmd.d.ts +2 -2
  231. package/dist/qmd.js +2 -2
  232. package/dist/recall-disclosure-escalation.d.ts +1 -1
  233. package/dist/recall-explain-renderer.d.ts +1 -1
  234. package/dist/recall-explain-renderer.js +3 -3
  235. package/dist/recall-planner-llm.d.ts +1 -1
  236. package/dist/recall-planner-llm.js +2 -2
  237. package/dist/recall-state.d.ts +1 -1
  238. package/dist/recall-tag-filter.d.ts +1 -1
  239. package/dist/recall-timings.d.ts +1 -1
  240. package/dist/recall-xray-cli.d.ts +1 -1
  241. package/dist/recall-xray-cli.js +4 -4
  242. package/dist/recall-xray-renderer.d.ts +1 -1
  243. package/dist/recall-xray-renderer.js +3 -3
  244. package/dist/recall-xray.d.ts +1 -1
  245. package/dist/recall-xray.js +2 -2
  246. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  247. package/dist/replay/normalizers/claude.d.ts +1 -1
  248. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  249. package/dist/replay/normalizers/shared.d.ts +1 -1
  250. package/dist/replay/runner.d.ts +1 -1
  251. package/dist/replay/types.d.ts +1 -1
  252. package/dist/resolve-auth-token.d.ts +1 -1
  253. package/dist/resume-bundles.js +2 -2
  254. package/dist/retrieval-agents.d.ts +2 -2
  255. package/dist/retrieval-tiers.d.ts +1 -1
  256. package/dist/routing/engine.d.ts +1 -1
  257. package/dist/routing/store.d.ts +1 -1
  258. package/dist/search/embed-helper.d.ts +1 -1
  259. package/dist/search/factory.d.ts +1 -1
  260. package/dist/search/factory.js +6 -6
  261. package/dist/search/index.d.ts +1 -1
  262. package/dist/search/index.js +12 -12
  263. package/dist/search/lancedb-backend.d.ts +1 -1
  264. package/dist/search/meilisearch-backend.d.ts +1 -1
  265. package/dist/search/noop-backend.d.ts +1 -1
  266. package/dist/search/orama-backend.d.ts +1 -1
  267. package/dist/search/port.d.ts +1 -1
  268. package/dist/search/remote-backend.d.ts +1 -1
  269. package/dist/{semantic-consolidation-BFtoVosl.d.ts → semantic-consolidation-btIVRC4l.d.ts} +1 -1
  270. package/dist/semantic-consolidation.d.ts +2 -2
  271. package/dist/semantic-consolidation.js +15 -13
  272. package/dist/semantic-rule-promotion.js +14 -12
  273. package/dist/semantic-rule-verifier.d.ts +5 -1
  274. package/dist/semantic-rule-verifier.js +14 -12
  275. package/dist/session-observer-bands.d.ts +1 -1
  276. package/dist/session-observer-state.d.ts +1 -1
  277. package/dist/shared-context/manager.d.ts +1 -1
  278. package/dist/signal.d.ts +1 -1
  279. package/dist/{storage-CXjwBr69.d.ts → storage-BVv_Mqa0.d.ts} +133 -3
  280. package/dist/storage.d.ts +2 -2
  281. package/dist/storage.js +13 -11
  282. package/dist/summarizer.d.ts +1 -1
  283. package/dist/summarizer.js +3 -3
  284. package/dist/summary-snapshot.d.ts +1 -1
  285. package/dist/temporal-supersession.d.ts +2 -2
  286. package/dist/temporal-timeline-recall.d.ts +1 -1
  287. package/dist/temporal-validity.d.ts +1 -1
  288. package/dist/threading.d.ts +1 -1
  289. package/dist/tier-migration.d.ts +2 -2
  290. package/dist/tier-routing.d.ts +1 -1
  291. package/dist/topics.d.ts +1 -1
  292. package/dist/transcript.d.ts +1 -1
  293. package/dist/transfer/capsule-import.js +6 -2
  294. package/dist/transfer/import-sqlite.js +2 -2
  295. package/dist/trust-score-stage.d.ts +1 -1
  296. package/dist/trust-score.d.ts +1 -1
  297. package/dist/{types-DpxqC8dI.d.ts → types-Cmkz7csa.d.ts} +27 -0
  298. package/dist/types.d.ts +1 -1
  299. package/dist/types.js +1 -1
  300. package/dist/utility-runtime.d.ts +1 -1
  301. package/dist/verified-recall.d.ts +4 -0
  302. package/dist/verified-recall.js +14 -12
  303. package/package.json +12 -2
  304. package/src/binary-lifecycle/pipeline.ts +22 -0
  305. package/src/cli.ts +8 -0
  306. package/src/compounding/engine.ts +9 -1
  307. package/src/config.ts +14 -0
  308. package/src/consolidation-undo.ts +8 -0
  309. package/src/curation/index.ts +9 -0
  310. package/src/in-flight-reads.ts +63 -0
  311. package/src/maintenance/memory-governance.ts +6 -0
  312. package/src/memory-cache-hot.test.ts +131 -0
  313. package/src/memory-cache.ts +146 -22
  314. package/src/memory-corpus-version.ts +45 -0
  315. package/src/namespaces/storage.ts +20 -1
  316. package/src/operator-toolkit.ts +7 -1
  317. package/src/orchestration/recall-internal.ts +6 -3
  318. package/src/orchestrator.ts +25 -1
  319. package/src/page-versioning.ts +14 -1
  320. package/src/provenance-frontmatter.test.ts +6 -0
  321. package/src/review/index.ts +16 -8
  322. package/src/semantic-rule-promotion.ts +9 -1
  323. package/src/semantic-rule-verifier.ts +19 -6
  324. package/src/spaces/index.ts +10 -0
  325. package/src/storage/memory-read-store.ts +9 -2
  326. package/src/storage-contract/cache-coherence.test.ts +242 -0
  327. package/src/storage-contract/namespace-routing.test.ts +26 -1
  328. package/src/storage.ts +513 -31
  329. package/src/transfer/capsule-cache-coherence.test.ts +107 -0
  330. package/src/transfer/capsule-import.ts +8 -0
  331. package/src/transfer/capsule-merge.ts +7 -0
  332. package/src/types.ts +27 -0
  333. package/src/verified-recall.ts +20 -6
  334. package/dist/capsule-merge-GK5E647P.js.map +0 -1
  335. package/dist/chunk-74MJH7I3.js.map +0 -1
  336. package/dist/chunk-AD2KK5MT.js.map +0 -1
  337. package/dist/chunk-AWJ2FHCF.js.map +0 -1
  338. package/dist/chunk-EJCVMPIM.js.map +0 -1
  339. package/dist/chunk-GL3SMLMZ.js.map +0 -1
  340. package/dist/chunk-JO5AT6QT.js.map +0 -1
  341. package/dist/chunk-KTOH7EJE.js.map +0 -1
  342. package/dist/chunk-M5QKGHCR.js.map +0 -1
  343. package/dist/chunk-Q6JPMCPO.js.map +0 -1
  344. package/dist/chunk-R2SJDIPO.js.map +0 -1
  345. package/dist/chunk-TVRPRFUB.js.map +0 -1
  346. package/dist/chunk-UVIQHSS7.js.map +0 -1
  347. package/dist/chunk-VF4XKTX3.js.map +0 -1
  348. package/dist/chunk-ZUFJ7ZTR.js.map +0 -1
  349. /package/dist/{auto-sync-676N6N6Y.js.map → auto-sync-AAMTVZMK.js.map} +0 -0
  350. /package/dist/{chunk-TZJVTH3F.js.map → chunk-27VEKQQA.js.map} +0 -0
  351. /package/dist/{chunk-7XH7VJN4.js.map → chunk-5S7Z5SHA.js.map} +0 -0
  352. /package/dist/{chunk-TVVEYCNW.js.map → chunk-7K5Q6COX.js.map} +0 -0
  353. /package/dist/{chunk-3F4N4WDH.js.map → chunk-AHLPZ2SF.js.map} +0 -0
  354. /package/dist/{chunk-AH3M6F4X.js.map → chunk-CDGGQGUU.js.map} +0 -0
  355. /package/dist/{chunk-ZHKD4EZM.js.map → chunk-CK6RI52P.js.map} +0 -0
  356. /package/dist/{chunk-6C35R7P4.js.map → chunk-DJCKXI4M.js.map} +0 -0
  357. /package/dist/{chunk-NMMKRVUF.js.map → chunk-EIKBKQ6L.js.map} +0 -0
  358. /package/dist/{chunk-O3BZ6PFY.js.map → chunk-F3FC7SMO.js.map} +0 -0
  359. /package/dist/{chunk-ZW6OKHVX.js.map → chunk-FKCJH7KP.js.map} +0 -0
  360. /package/dist/{chunk-DQPPRXFO.js.map → chunk-HQ7QZJM5.js.map} +0 -0
  361. /package/dist/{chunk-UYZUJ4EB.js.map → chunk-I2THZUAF.js.map} +0 -0
  362. /package/dist/{chunk-RKNJBZ55.js.map → chunk-JBPKEARU.js.map} +0 -0
  363. /package/dist/{chunk-KIPLG7S7.js.map → chunk-JKLJ6A7W.js.map} +0 -0
  364. /package/dist/{chunk-HXDKC3BI.js.map → chunk-JU3GHO6J.js.map} +0 -0
  365. /package/dist/{chunk-SYNYI4ZM.js.map → chunk-L5HJQC36.js.map} +0 -0
  366. /package/dist/{chunk-VXMWDXIJ.js.map → chunk-LC7OODWZ.js.map} +0 -0
  367. /package/dist/{chunk-CNWC274T.js.map → chunk-MLT5EG6K.js.map} +0 -0
  368. /package/dist/{chunk-PKGWJFNR.js.map → chunk-OVMS3DCB.js.map} +0 -0
  369. /package/dist/{chunk-57INMZ6F.js.map → chunk-POUD5BLV.js.map} +0 -0
  370. /package/dist/{chunk-LRGSLV7M.js.map → chunk-PYHOAXTI.js.map} +0 -0
  371. /package/dist/{chunk-WKE4VXSZ.js.map → chunk-QKVX4Y6D.js.map} +0 -0
  372. /package/dist/{chunk-FXGC5UUH.js.map → chunk-RT7IP3D3.js.map} +0 -0
  373. /package/dist/{chunk-CHVU4RE5.js.map → chunk-SKXBOZDF.js.map} +0 -0
  374. /package/dist/{chunk-GKCCHHZK.js.map → chunk-UXKMMNJD.js.map} +0 -0
  375. /package/dist/{chunk-XFTPUXCE.js.map → chunk-UXWGPODH.js.map} +0 -0
  376. /package/dist/{chunk-2FSHROYK.js.map → chunk-V53GJUSL.js.map} +0 -0
  377. /package/dist/{chunk-LKT755LP.js.map → chunk-VA4WSW54.js.map} +0 -0
  378. /package/dist/{chunk-FYKIEOG6.js.map → chunk-VCFADTFS.js.map} +0 -0
  379. /package/dist/{chunk-T7VNN3ZM.js.map → chunk-XVLEGMJI.js.map} +0 -0
  380. /package/dist/{chunk-CRFTLUWT.js.map → chunk-Y5U35ZVS.js.map} +0 -0
  381. /package/dist/{chunk-UHGHTOR5.js.map → chunk-YGAOLHKN.js.map} +0 -0
  382. /package/dist/{chunk-QDCJNRKK.js.map → chunk-YXOAQAH2.js.map} +0 -0
  383. /package/dist/{forget-KHF7A44H.js.map → forget-CQCLB5LB.js.map} +0 -0
@@ -1,10 +1,10 @@
1
+ import {
2
+ SQLITE_SCHEMA_VERSION
3
+ } from "./chunk-Z734BLO3.js";
1
4
  import {
2
5
  parseConflictPolicy,
3
6
  validateManifestRecords
4
7
  } from "./chunk-G4IAEX6D.js";
5
- import {
6
- SQLITE_SCHEMA_VERSION
7
- } from "./chunk-Z734BLO3.js";
8
8
  import {
9
9
  openBetterSqlite3
10
10
  } from "./chunk-RL6NEVXT.js";
@@ -84,4 +84,4 @@ async function importSqlite(opts) {
84
84
  export {
85
85
  importSqlite
86
86
  };
87
- //# sourceMappingURL=chunk-LRGSLV7M.js.map
87
+ //# sourceMappingURL=chunk-PYHOAXTI.js.map
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-3UXOZBHV.js";
8
8
  import {
9
9
  StorageManager
10
- } from "./chunk-KTOH7EJE.js";
10
+ } from "./chunk-PV7E2FGY.js";
11
11
  import {
12
12
  isSafeRouteNamespace
13
13
  } from "./chunk-U3PN77QT.js";
@@ -118,4 +118,4 @@ export {
118
118
  runCodexMaterialize,
119
119
  runPostConsolidationMaterialize
120
120
  };
121
- //# sourceMappingURL=chunk-WKE4VXSZ.js.map
121
+ //# sourceMappingURL=chunk-QKVX4Y6D.js.map
@@ -43,7 +43,7 @@ import {
43
43
  FallbackLlmClient,
44
44
  fallbackLlmRuntimeContextFromConfig,
45
45
  gatewayTaskChainOptions
46
- } from "./chunk-GKCCHHZK.js";
46
+ } from "./chunk-UXKMMNJD.js";
47
47
  import {
48
48
  buildChatCompletionTokenLimit,
49
49
  shouldAssumeOpenAiChatCompletions
@@ -2476,4 +2476,4 @@ export {
2476
2476
  classifyFallbackParseFailure,
2477
2477
  ExtractionEngine
2478
2478
  };
2479
- //# sourceMappingURL=chunk-FXGC5UUH.js.map
2479
+ //# sourceMappingURL=chunk-RT7IP3D3.js.map
@@ -18,7 +18,7 @@ import {
18
18
  } from "./chunk-T4WDJPEZ.js";
19
19
  import {
20
20
  getOperation
21
- } from "./chunk-57INMZ6F.js";
21
+ } from "./chunk-POUD5BLV.js";
22
22
  import {
23
23
  assertOperationAllowed,
24
24
  capabilityAllowsOp,
@@ -27,7 +27,7 @@ import {
27
27
  } from "./chunk-D7FOKIY5.js";
28
28
  import {
29
29
  EngramAccessInputError
30
- } from "./chunk-CNWC274T.js";
30
+ } from "./chunk-MLT5EG6K.js";
31
31
  import {
32
32
  readEnvVar
33
33
  } from "./chunk-JUC24CTX.js";
@@ -3789,4 +3789,4 @@ export {
3789
3789
  MCP_SUPPORTED_PROTOCOL_VERSIONS,
3790
3790
  EngramMcpServer
3791
3791
  };
3792
- //# sourceMappingURL=chunk-CHVU4RE5.js.map
3792
+ //# sourceMappingURL=chunk-SKXBOZDF.js.map
@@ -4,11 +4,11 @@ import {
4
4
  } from "./chunk-ZBJMUXZH.js";
5
5
  import {
6
6
  StorageManager
7
- } from "./chunk-KTOH7EJE.js";
7
+ } from "./chunk-PV7E2FGY.js";
8
8
  import {
9
9
  getCachedRuleMemories,
10
10
  setCachedRuleMemories
11
- } from "./chunk-AWJ2FHCF.js";
11
+ } from "./chunk-X47LWMKA.js";
12
12
 
13
13
  // src/semantic-rule-verifier.ts
14
14
  var DEFAULT_MIN_EFFECTIVE_CONFIDENCE = 0.45;
@@ -77,12 +77,14 @@ function compareVerifiedSemanticRuleResults(left, right) {
77
77
  async function searchVerifiedSemanticRules(options) {
78
78
  const queryTokens = new Set(normalizeRecallTokens(options.query, ["what", "which"]));
79
79
  if (queryTokens.size === 0 || options.maxResults <= 0) return [];
80
- const storage = new StorageManager(options.memoryDir);
81
- const version = storage.getMemoryStatusVersion();
82
- let cachedRules = getCachedRuleMemories(storage.dir, version);
80
+ const storage = new StorageManager(options.memoryDir, void 0, options.hotMemoriesCacheEnabled);
81
+ const version = storage.getMemoryCorpusVersion();
82
+ const cacheEnabled = storage.isHotCacheEnabled();
83
+ const keyId = storage.hotCacheKeyId();
84
+ let cachedRules = cacheEnabled ? getCachedRuleMemories(storage.dir, version, keyId, storage.hotCacheTtlMs()) : null;
83
85
  if (!cachedRules) {
84
86
  const allMems = await storage.readAllMemories();
85
- cachedRules = setCachedRuleMemories(storage.dir, allMems, version);
87
+ cachedRules = setCachedRuleMemories(storage.dir, allMems, version, cacheEnabled, keyId);
86
88
  }
87
89
  const { all: ruleMemories, byId: memoryById } = cachedRules;
88
90
  const minEffectiveConfidence = options.minEffectiveConfidence ?? DEFAULT_MIN_EFFECTIVE_CONFIDENCE;
@@ -117,4 +119,4 @@ export {
117
119
  compareVerifiedSemanticRuleResults,
118
120
  searchVerifiedSemanticRules
119
121
  };
120
- //# sourceMappingURL=chunk-TVRPRFUB.js.map
122
+ //# sourceMappingURL=chunk-TY43GBX2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/semantic-rule-verifier.ts"],"sourcesContent":["import { getCachedRuleMemories, setCachedRuleMemories } from \"./memory-cache.js\";\nimport { StorageManager } from \"./storage.js\";\nimport type { MemoryFile } from \"./types.js\";\nimport { countRecallTokenOverlap, normalizeRecallTokens } from \"./recall-tokenization.js\";\n\nexport type SemanticRuleVerificationStatus =\n | \"verified\"\n | \"source-memory-missing\"\n | \"source-memory-archived\"\n | \"source-memory-forgotten\"\n | \"source-memory-not-episode\";\n\nexport interface VerifiedSemanticRuleResult {\n rule: MemoryFile;\n score: number;\n sourceMemoryId: string;\n verificationStatus: SemanticRuleVerificationStatus;\n effectiveConfidence: number;\n matchedFields: string[];\n}\n\nconst DEFAULT_MIN_EFFECTIVE_CONFIDENCE = 0.45;\n\nfunction verificationConfidenceMultiplier(status: SemanticRuleVerificationStatus): number {\n switch (status) {\n case \"verified\":\n return 1;\n case \"source-memory-not-episode\":\n return 0.45;\n case \"source-memory-archived\":\n return 0.4;\n case \"source-memory-forgotten\":\n return 0.3;\n case \"source-memory-missing\":\n return 0.35;\n default:\n return 0.35;\n }\n}\n\nfunction resolveVerificationStatus(sourceMemory: MemoryFile | undefined): SemanticRuleVerificationStatus {\n if (!sourceMemory) return \"source-memory-missing\";\n if (sourceMemory.frontmatter.status === \"archived\") {\n return \"source-memory-archived\";\n }\n if (sourceMemory.frontmatter.status === \"forgotten\") return \"source-memory-forgotten\";\n if (sourceMemory.frontmatter.memoryKind !== \"episode\") return \"source-memory-not-episode\";\n return \"verified\";\n}\n\nfunction resolveEffectiveConfidence(rule: MemoryFile, sourceMemory: MemoryFile | undefined): {\n status: SemanticRuleVerificationStatus;\n effectiveConfidence: number;\n} {\n const status = resolveVerificationStatus(sourceMemory);\n const ruleConfidence = Number.isFinite(rule.frontmatter.confidence) ? rule.frontmatter.confidence : 0.8;\n const sourceConfidence = Number.isFinite(sourceMemory?.frontmatter.confidence)\n ? sourceMemory!.frontmatter.confidence\n : ruleConfidence;\n const anchoredConfidence = Math.min(ruleConfidence, sourceConfidence);\n const effectiveConfidence = Math.max(\n 0,\n Math.min(1, anchoredConfidence * verificationConfidenceMultiplier(status)),\n );\n return { status, effectiveConfidence };\n}\n\nfunction scoreVerifiedSemanticRuleCandidate(\n rule: MemoryFile,\n sourceMemory: MemoryFile | undefined,\n queryTokens: Set<string>,\n effectiveConfidence: number,\n): { score: number; matchedFields: Set<string> } {\n const matchedFields = new Set<string>();\n let score = 0;\n\n const ruleContentMatches = countRecallTokenOverlap(queryTokens, rule.content);\n if (ruleContentMatches > 0) {\n score += ruleContentMatches * 5;\n matchedFields.add(\"ruleContent\");\n }\n\n const tagMatches = countRecallTokenOverlap(queryTokens, rule.frontmatter.tags?.join(\" \"));\n if (tagMatches > 0) {\n score += tagMatches * 2;\n matchedFields.add(\"tags\");\n }\n\n const sourceContentMatches = countRecallTokenOverlap(queryTokens, sourceMemory?.content);\n if (sourceContentMatches > 0) {\n score += sourceContentMatches * 2;\n matchedFields.add(\"sourceContent\");\n }\n\n if (score > 0) {\n score += effectiveConfidence;\n }\n\n return { score, matchedFields };\n}\n\nexport function compareVerifiedSemanticRuleResults(\n left: VerifiedSemanticRuleResult,\n right: VerifiedSemanticRuleResult,\n): number {\n return (\n right.score - left.score ||\n right.effectiveConfidence - left.effectiveConfidence ||\n right.rule.frontmatter.updated.localeCompare(left.rule.frontmatter.updated) ||\n left.rule.frontmatter.id.localeCompare(right.rule.frontmatter.id)\n );\n}\n\nexport async function searchVerifiedSemanticRules(options: {\n memoryDir: string;\n query: string;\n maxResults: number;\n minEffectiveConfidence?: 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<VerifiedSemanticRuleResult[]> {\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 rule cache on the CORPUS version, not memory-status (Codex\n // P1, #1902): rule memories are derived from the full corpus, and plain\n // creates/writeChunk bump only the corpus sentinel. Keying on memory-status\n // would let a peer process serve a stale rule set that omits newly created\n // rule memories.\n const version = storage.getMemoryCorpusVersion();\n\n // Use derived rule cache to avoid O(146K) iteration on every call — but honor\n // the hotMemoriesCacheEnabled opt-out (Codex P2): when disabled, never read or\n // retain the derived cache, always rebuild from a fresh scan.\n const cacheEnabled = storage.isHotCacheEnabled();\n const keyId = storage.hotCacheKeyId();\n let cachedRules = cacheEnabled ? getCachedRuleMemories(storage.dir, version, keyId, storage.hotCacheTtlMs()) : null;\n if (!cachedRules) {\n const allMems = await storage.readAllMemories();\n cachedRules = setCachedRuleMemories(storage.dir, allMems, version, cacheEnabled, keyId);\n }\n const { all: ruleMemories, byId: memoryById } = cachedRules;\n const minEffectiveConfidence = options.minEffectiveConfidence ?? DEFAULT_MIN_EFFECTIVE_CONFIDENCE;\n\n const candidates: VerifiedSemanticRuleResult[] = [];\n // ruleMemories is pre-filtered to category=rule and recall-hidden statuses.\n for (const memory of ruleMemories) {\n if (memory.frontmatter.source !== \"semantic-rule-promotion\") continue;\n const sourceMemoryId = memory.frontmatter.sourceMemoryId;\n if (!sourceMemoryId) continue;\n\n const sourceMemory = memoryById.get(sourceMemoryId);\n const { status, effectiveConfidence } = resolveEffectiveConfidence(memory, sourceMemory);\n if (effectiveConfidence < minEffectiveConfidence) continue;\n\n const { score, matchedFields } = scoreVerifiedSemanticRuleCandidate(\n memory,\n sourceMemory,\n queryTokens,\n effectiveConfidence,\n );\n if (score <= 0) continue;\n\n candidates.push({\n rule: memory,\n score,\n sourceMemoryId,\n verificationStatus: status,\n effectiveConfidence,\n matchedFields: [...matchedFields].sort(),\n });\n }\n\n return candidates\n .sort(compareVerifiedSemanticRuleResults)\n .slice(0, options.maxResults);\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  StorageManager
3
- } from "./chunk-KTOH7EJE.js";
3
+ } from "./chunk-PV7E2FGY.js";
4
4
 
5
5
  // src/semantic-rule-promotion.ts
6
6
  import { createHash, randomUUID } from "crypto";
@@ -398,7 +398,13 @@ function normalizeRuleWhitespace(value) {
398
398
  return value.replace(/\s+/g, " ").trim();
399
399
  }
400
400
  function stripTrailingClausePunctuation(value) {
401
- return value.replace(/[,:;]+$/g, "").trim();
401
+ let end = value.length;
402
+ while (end > 0) {
403
+ const ch = value[end - 1];
404
+ if (ch === "," || ch === ":" || ch === ";") end--;
405
+ else break;
406
+ }
407
+ return value.slice(0, end).trim();
402
408
  }
403
409
  function canonicalizeRuleContent(value) {
404
410
  return extractExplicitIfThenRule(value) ?? normalizeRuleWhitespace(value);
@@ -529,4 +535,4 @@ export {
529
535
  setSemanticRulePromotionTestHooks,
530
536
  promoteSemanticRuleFromMemory
531
537
  };
532
- //# sourceMappingURL=chunk-UVIQHSS7.js.map
538
+ //# sourceMappingURL=chunk-UP25ZZCN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/semantic-rule-promotion.ts"],"sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport { link, mkdir, readFile, rename, rm, stat, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { setTimeout as sleep } from \"node:timers/promises\";\nimport { StorageManager } from \"./storage.js\";\nimport type { MemoryFile, MemoryLink } from \"./types.js\";\n\nexport interface SemanticRulePromotionCandidate {\n id: string;\n sourceMemoryId: string;\n content: string;\n confidence: number;\n tags: string[];\n memoryKind: \"note\";\n lineage: string[];\n}\n\nexport interface SemanticRulePromotionSkip {\n sourceMemoryId: string;\n reason:\n | \"disabled\"\n | \"source-memory-missing\"\n | \"source-memory-forgotten\"\n | \"source-memory-not-episode\"\n | \"no-explicit-rule\"\n | \"duplicate-rule\";\n existingRuleId?: string;\n}\n\nexport interface SemanticRulePromotionReport {\n enabled: boolean;\n dryRun: boolean;\n promoted: SemanticRulePromotionCandidate[];\n skipped: SemanticRulePromotionSkip[];\n}\n\nconst PROMOTION_LOCK_TIMEOUT_MS = 10 * 60 * 1000;\nconst PROMOTION_LOCK_RETRY_MS = 25;\nconst PROMOTION_LOCK_STALE_MS = 5 * 60 * 1000;\nconst PROMOTION_LOCK_OWNERLESS_GRACE_MS = 1000;\nconst PROMOTION_LOCK_HEARTBEAT_MS = 30 * 1000;\n\ntype SemanticRulePromotionTestHooks = {\n beforeLockOwnerWrite?: (lockDir: string, ownerToken: string) => Promise<void> | void;\n beforeLockRelease?: (lockDir: string, ownerToken: string) => Promise<void> | void;\n beforePromotedRuleWrite?: (lockDir: string, ownerToken: string) => Promise<void> | void;\n lockTimeoutMs?: number;\n lockRetryMs?: number;\n staleLockMs?: number;\n ownerlessGraceMs?: number;\n heartbeatMs?: number;\n};\n\nlet testHooks: SemanticRulePromotionTestHooks | null = null;\n\nexport function setSemanticRulePromotionTestHooks(hooks: SemanticRulePromotionTestHooks | null): void {\n testHooks = hooks;\n}\n\nfunction promotionLockTimeoutMs(): number {\n return testHooks?.lockTimeoutMs ?? PROMOTION_LOCK_TIMEOUT_MS;\n}\n\nfunction promotionLockRetryMs(): number {\n return testHooks?.lockRetryMs ?? PROMOTION_LOCK_RETRY_MS;\n}\n\nfunction promotionLockStaleMs(): number {\n return testHooks?.staleLockMs ?? PROMOTION_LOCK_STALE_MS;\n}\n\nfunction promotionLockOwnerlessGraceMs(): number {\n return testHooks?.ownerlessGraceMs ?? PROMOTION_LOCK_OWNERLESS_GRACE_MS;\n}\n\nfunction promotionLockHeartbeatMs(): number {\n return testHooks?.heartbeatMs ?? PROMOTION_LOCK_HEARTBEAT_MS;\n}\n\nfunction isErrnoCode(err: unknown, code: string): boolean {\n return typeof err === \"object\" && err !== null && \"code\" in err && (err as { code?: unknown }).code === code;\n}\n\nfunction promotionLockDir(memoryDir: string, ruleKey: string): string {\n const digest = createHash(\"sha256\").update(ruleKey).digest(\"hex\");\n return path.join(path.resolve(memoryDir), \"state\", \"semantic-rule-promotion-locks\", `${digest}.lock`);\n}\n\nfunction promotionHeartbeatPath(lockDir: string, token: string): string {\n return path.join(lockDir, `heartbeat.${token}.json`);\n}\n\nfunction promotionReapDir(lockDir: string): string {\n return `${lockDir}.reap`;\n}\n\nfunction promotionReleaseDir(lockDir: string): string {\n return `${lockDir}.release`;\n}\n\nasync function pathExists(targetPath: string): Promise<boolean> {\n try {\n await stat(targetPath);\n return true;\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) return false;\n throw err;\n }\n}\n\nasync function readPromotionLockOwner(lockDir: string): Promise<{\n acquiredAtMs: number | null;\n heartbeatAtMs: number | null;\n token: string | null;\n}> {\n try {\n const owner = JSON.parse(await readFile(path.join(lockDir, \"owner.json\"), \"utf8\")) as {\n acquiredAt?: unknown;\n heartbeatAt?: unknown;\n token?: unknown;\n };\n const acquiredAtMs = typeof owner.acquiredAt === \"string\" ? Date.parse(owner.acquiredAt) : Number.NaN;\n const heartbeatAtMs = typeof owner.heartbeatAt === \"string\" ? Date.parse(owner.heartbeatAt) : Number.NaN;\n return {\n acquiredAtMs: Number.isFinite(acquiredAtMs) ? acquiredAtMs : null,\n heartbeatAtMs: Number.isFinite(heartbeatAtMs) ? heartbeatAtMs : null,\n token: typeof owner.token === \"string\" ? owner.token : null,\n };\n } catch {\n return {\n acquiredAtMs: null,\n heartbeatAtMs: null,\n token: null,\n };\n }\n}\n\nasync function tryWritePromotionLockOwner(\n lockDir: string,\n owner: { token: string; acquiredAt: string }\n): Promise<boolean> {\n const ownerPath = path.join(lockDir, \"owner.json\");\n const tempPath = path.join(lockDir, `owner.${process.pid}.${randomUUID()}.tmp`);\n await testHooks?.beforeLockOwnerWrite?.(lockDir, owner.token);\n try {\n await writeFile(\n tempPath,\n `${JSON.stringify(\n {\n pid: process.pid,\n token: owner.token,\n acquiredAt: owner.acquiredAt,\n },\n null,\n 2\n )}\\n`\n );\n await link(tempPath, ownerPath);\n return true;\n } catch (err) {\n if (isErrnoCode(err, \"EEXIST\") || isErrnoCode(err, \"ENOENT\")) {\n return false;\n }\n throw err;\n } finally {\n await rm(tempPath, { force: true });\n }\n}\n\nasync function writePromotionLockHeartbeat(lockDir: string, token: string): Promise<void> {\n const heartbeatPath = promotionHeartbeatPath(lockDir, token);\n const tempPath = path.join(lockDir, `heartbeat.${process.pid}.${randomUUID()}.tmp`);\n try {\n await writeFile(\n tempPath,\n `${JSON.stringify(\n {\n pid: process.pid,\n token,\n heartbeatAt: new Date().toISOString(),\n },\n null,\n 2\n )}\\n`\n );\n await rename(tempPath, heartbeatPath);\n } catch (err) {\n await rm(tempPath, { force: true });\n throw err;\n }\n}\n\nasync function refreshPromotionLockHeartbeat(lockDir: string, token: string): Promise<boolean> {\n const owner = await readPromotionLockOwner(lockDir);\n if (owner.token !== token) {\n return false;\n }\n await writePromotionLockHeartbeat(lockDir, token);\n return true;\n}\n\nasync function readPromotionLockHeartbeatMs(lockDir: string, token: string | null): Promise<number | null> {\n if (!token) return null;\n try {\n return (await stat(promotionHeartbeatPath(lockDir, token))).mtimeMs;\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) return null;\n throw err;\n }\n}\n\nasync function reapAbandonedPromotionGuard(guardDir: string): Promise<boolean> {\n let reapStat: { mtimeMs: number };\n try {\n reapStat = await stat(guardDir);\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) return false;\n throw err;\n }\n if (Date.now() - reapStat.mtimeMs < promotionLockStaleMs()) {\n return false;\n }\n\n const staleReapDir = `${guardDir}.stale-${process.pid}-${randomUUID()}`;\n try {\n await rename(guardDir, staleReapDir);\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) return false;\n throw err;\n }\n await rm(staleReapDir, { recursive: true, force: true });\n return true;\n}\n\nasync function reapAbandonedPromotionGuards(lockDir: string): Promise<boolean> {\n const reapedReapGuard = await reapAbandonedPromotionGuard(promotionReapDir(lockDir));\n const reapedReleaseGuard = await reapAbandonedPromotionGuard(promotionReleaseDir(lockDir));\n return reapedReapGuard || reapedReleaseGuard;\n}\n\nasync function hasPromotionGuard(lockDir: string): Promise<boolean> {\n return (await pathExists(promotionReapDir(lockDir))) || (await pathExists(promotionReleaseDir(lockDir)));\n}\n\nasync function reapStalePromotionLock(lockDir: string): Promise<boolean> {\n if (await hasPromotionGuard(lockDir)) {\n await reapAbandonedPromotionGuards(lockDir);\n return false;\n }\n\n const reapDir = promotionReapDir(lockDir);\n try {\n await mkdir(reapDir);\n } catch (err) {\n if (isErrnoCode(err, \"EEXIST\")) return false;\n throw err;\n }\n\n let staleDir: string | null = null;\n try {\n return await reapStalePromotionLockWithGuard(lockDir, (value) => {\n staleDir = value;\n });\n } finally {\n if (staleDir) {\n await rm(staleDir, { recursive: true, force: true });\n }\n await rm(reapDir, { recursive: true, force: true });\n }\n}\n\nasync function reapStalePromotionLockWithGuard(\n lockDir: string,\n setStaleDir: (staleDir: string) => void\n): Promise<boolean> {\n let lockStat: { mtimeMs: number };\n try {\n lockStat = await stat(lockDir);\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) return false;\n throw err;\n }\n\n const owner = await readPromotionLockOwner(lockDir);\n const heartbeatMs = await readPromotionLockHeartbeatMs(lockDir, owner.token);\n const lockedAtMs = heartbeatMs ?? owner.heartbeatAtMs ?? owner.acquiredAtMs ?? lockStat.mtimeMs;\n const ownerlessLock = owner.token === null && owner.heartbeatAtMs === null && owner.acquiredAtMs === null;\n const staleAfterMs = ownerlessLock ? promotionLockOwnerlessGraceMs() : promotionLockStaleMs();\n if (Date.now() - lockedAtMs < staleAfterMs) {\n return false;\n }\n\n const staleDir = `${lockDir}.stale-${process.pid}-${randomUUID()}`;\n try {\n await rename(lockDir, staleDir);\n setStaleDir(staleDir);\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) return false;\n throw err;\n }\n\n const staleOwner = await readPromotionLockOwner(staleDir);\n const staleHeartbeatMs = await readPromotionLockHeartbeatMs(staleDir, staleOwner.token);\n const staleLockedAtMs = staleHeartbeatMs ?? staleOwner.heartbeatAtMs ?? staleOwner.acquiredAtMs ?? lockStat.mtimeMs;\n const staleOwnerlessLock =\n staleOwner.token === null && staleOwner.heartbeatAtMs === null && staleOwner.acquiredAtMs === null;\n const staleAfterRecheckMs = staleOwnerlessLock ? promotionLockOwnerlessGraceMs() : promotionLockStaleMs();\n if (Date.now() - staleLockedAtMs < staleAfterRecheckMs) {\n await rename(staleDir, lockDir);\n setStaleDir(\"\");\n return false;\n }\n\n await rm(staleDir, { recursive: true, force: true });\n setStaleDir(\"\");\n return true;\n}\n\nasync function releasePromotionLock(lockDir: string, token: string): Promise<void> {\n const releaseDir = promotionReleaseDir(lockDir);\n const deadline = Date.now() + promotionLockTimeoutMs();\n await testHooks?.beforeLockRelease?.(lockDir, token);\n for (;;) {\n try {\n await mkdir(releaseDir);\n break;\n } catch (err) {\n if (!isErrnoCode(err, \"EEXIST\")) {\n throw err;\n }\n const owner = await readPromotionLockOwner(lockDir);\n if (owner.token !== token) {\n return;\n }\n await reapAbandonedPromotionGuard(releaseDir);\n if (Date.now() >= deadline) {\n throw new Error(\"Timed out releasing semantic rule promotion lock\");\n }\n await sleep(promotionLockRetryMs());\n }\n }\n\n try {\n const owner = await readPromotionLockOwner(lockDir);\n if (owner.token !== token) {\n return;\n }\n await rm(lockDir, { recursive: true, force: true });\n } finally {\n await rm(releaseDir, { recursive: true, force: true });\n }\n}\n\ntype PromotionLockLease = {\n assertHeld: () => Promise<void>;\n beforePromotedRuleWrite: () => Promise<void>;\n};\n\nasync function withPromotionLock<T>(\n memoryDir: string,\n ruleKey: string,\n fn: (lease: PromotionLockLease) => Promise<T>\n): Promise<T> {\n const lockDir = promotionLockDir(memoryDir, ruleKey);\n const lockRoot = path.dirname(lockDir);\n const deadline = Date.now() + promotionLockTimeoutMs();\n let lockToken: string | null = null;\n let heartbeat: NodeJS.Timeout | null = null;\n\n await mkdir(lockRoot, { recursive: true });\n for (;;) {\n try {\n if (await hasPromotionGuard(lockDir)) {\n await reapAbandonedPromotionGuards(lockDir);\n if (Date.now() >= deadline) {\n throw new Error(\"Timed out acquiring semantic rule promotion lock\");\n }\n await sleep(promotionLockRetryMs());\n continue;\n }\n await mkdir(lockDir);\n if (await hasPromotionGuard(lockDir)) {\n await reapAbandonedPromotionGuards(lockDir);\n if (Date.now() >= deadline) {\n throw new Error(\"Timed out acquiring semantic rule promotion lock\");\n }\n await sleep(promotionLockRetryMs());\n continue;\n }\n try {\n lockToken = randomUUID();\n const lockOwner = {\n token: lockToken,\n acquiredAt: new Date().toISOString(),\n };\n const wroteOwner = await tryWritePromotionLockOwner(lockDir, lockOwner);\n if (!wroteOwner) {\n lockToken = null;\n if (Date.now() >= deadline) {\n throw new Error(\"Timed out acquiring semantic rule promotion lock\");\n }\n await sleep(promotionLockRetryMs());\n continue;\n }\n await writePromotionLockHeartbeat(lockDir, lockToken);\n const heartbeatToken = lockToken;\n const heartbeatMs = promotionLockHeartbeatMs();\n if (heartbeatMs > 0) {\n heartbeat = setInterval(() => {\n void refreshPromotionLockHeartbeat(lockDir, heartbeatToken)\n .then((ownsLock) => {\n if (!ownsLock && heartbeat) {\n clearInterval(heartbeat);\n heartbeat = null;\n }\n })\n .catch(() => undefined);\n }, heartbeatMs);\n }\n } catch (err) {\n lockToken = null;\n if (heartbeat) {\n clearInterval(heartbeat);\n heartbeat = null;\n }\n await rm(lockDir, { recursive: true, force: true });\n throw err;\n }\n break;\n } catch (err) {\n if (!isErrnoCode(err, \"EEXIST\")) {\n throw err;\n }\n if (await reapStalePromotionLock(lockDir)) {\n continue;\n }\n if (Date.now() >= deadline) {\n throw new Error(\"Timed out acquiring semantic rule promotion lock\");\n }\n await sleep(promotionLockRetryMs());\n }\n }\n\n const assertHeld = async () => {\n if (!lockToken) {\n throw new Error(\"Semantic rule promotion lock is no longer held\");\n }\n const ownsLock = await refreshPromotionLockHeartbeat(lockDir, lockToken);\n if (!ownsLock) {\n throw new Error(\"Semantic rule promotion lock is no longer held\");\n }\n };\n\n let hasResult = false;\n let result: T | undefined;\n let callbackError: unknown;\n let releaseError: unknown;\n try {\n await assertHeld();\n result = await fn({\n assertHeld,\n beforePromotedRuleWrite: async () => {\n if (!lockToken) {\n throw new Error(\"Semantic rule promotion lock is no longer held\");\n }\n await testHooks?.beforePromotedRuleWrite?.(lockDir, lockToken);\n await assertHeld();\n },\n });\n hasResult = true;\n } catch (err) {\n callbackError = err;\n } finally {\n if (heartbeat) {\n clearInterval(heartbeat);\n }\n if (lockToken) {\n try {\n await releasePromotionLock(lockDir, lockToken);\n } catch (err) {\n if (!hasResult && !callbackError) {\n releaseError = err;\n }\n }\n }\n }\n if (releaseError) {\n throw releaseError;\n }\n if (callbackError) {\n throw callbackError;\n }\n return result as T;\n}\n\nfunction normalizeRuleWhitespace(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction stripTrailingClausePunctuation(value: string): string {\n // Linear trailing-punctuation strip (no `/[,:;]+$/` — CodeQL flags that as a\n // polynomial-backtracking ReDoS on long runs of ',;:'). Walk back once, O(n).\n let end = value.length;\n while (end > 0) {\n const ch = value[end - 1];\n if (ch === \",\" || ch === \":\" || ch === \";\") end--;\n else break;\n }\n return value.slice(0, end).trim();\n}\n\nfunction canonicalizeRuleContent(value: string): string {\n return extractExplicitIfThenRule(value) ?? normalizeRuleWhitespace(value);\n}\n\nfunction canonicalizeRuleKey(value: string): string {\n return canonicalizeRuleContent(value).toLowerCase();\n}\n\nfunction extractExplicitIfThenRule(content: string): string | null {\n const match = content.match(/\\bif\\b([\\s\\S]+?)\\bthen\\b([\\s\\S]+?)(?:[.!?](?:\\s|$)|$)/i);\n if (!match) return null;\n const condition = stripTrailingClausePunctuation(normalizeRuleWhitespace(match[1] ?? \"\"));\n const outcome = stripTrailingClausePunctuation(normalizeRuleWhitespace(match[2] ?? \"\"));\n if (condition.length === 0 || outcome.length === 0) return null;\n return `IF ${condition} THEN ${outcome}.`;\n}\n\nfunction promotionConfidence(memory: MemoryFile): number {\n const base = Number.isFinite(memory.frontmatter.confidence) ? memory.frontmatter.confidence : 0.8;\n return Math.max(0.6, Math.min(0.98, base));\n}\n\nfunction promotionTags(memory: MemoryFile): string[] {\n return Array.from(new Set([...(memory.frontmatter.tags ?? []), \"semantic-rule\", \"promoted-rule\"]));\n}\n\nfunction buildSupportLinks(sourceMemoryId: string, confidence: number): MemoryLink[] {\n return [\n {\n targetId: sourceMemoryId,\n linkType: \"supports\",\n strength: confidence,\n reason: \"Promoted from verified episodic memory\",\n },\n ];\n}\n\nexport async function promoteSemanticRuleFromMemory(options: {\n memoryDir: string;\n enabled: boolean;\n sourceMemoryId: string;\n dryRun?: boolean;\n}): Promise<SemanticRulePromotionReport> {\n const report: SemanticRulePromotionReport = {\n enabled: options.enabled,\n dryRun: options.dryRun === true,\n promoted: [],\n skipped: [],\n };\n if (!options.enabled) {\n report.skipped.push({\n sourceMemoryId: options.sourceMemoryId,\n reason: \"disabled\",\n });\n return report;\n }\n\n const storage = new StorageManager(options.memoryDir);\n const sourceMemory = await storage.getMemoryById(options.sourceMemoryId);\n if (!sourceMemory) {\n report.skipped.push({\n sourceMemoryId: options.sourceMemoryId,\n reason: \"source-memory-missing\",\n });\n return report;\n }\n if (sourceMemory.frontmatter.status === \"forgotten\") {\n report.skipped.push({\n sourceMemoryId: options.sourceMemoryId,\n reason: \"source-memory-forgotten\",\n });\n return report;\n }\n if (sourceMemory.frontmatter.status === \"archived\" || sourceMemory.frontmatter.memoryKind !== \"episode\") {\n report.skipped.push({\n sourceMemoryId: options.sourceMemoryId,\n reason: \"source-memory-not-episode\",\n });\n return report;\n }\n\n const content = extractExplicitIfThenRule(sourceMemory.content);\n if (!content) {\n report.skipped.push({\n sourceMemoryId: options.sourceMemoryId,\n reason: \"no-explicit-rule\",\n });\n return report;\n }\n\n const ruleKey = canonicalizeRuleKey(content);\n const confidence = promotionConfidence(sourceMemory);\n const candidateBase = {\n sourceMemoryId: options.sourceMemoryId,\n content,\n confidence,\n tags: promotionTags(sourceMemory),\n memoryKind: \"note\" as const,\n lineage: [options.sourceMemoryId],\n };\n\n return withPromotionLock(options.memoryDir, ruleKey, async (lock) => {\n storage.invalidateAllMemoriesCacheForDir();\n const existingRule = (await storage.readAllMemories()).find(\n (memory) =>\n memory.frontmatter.category === \"rule\" &&\n memory.frontmatter.status !== \"archived\" &&\n memory.frontmatter.status !== \"forgotten\" &&\n canonicalizeRuleKey(memory.content) === ruleKey\n );\n if (existingRule) {\n report.skipped.push({\n sourceMemoryId: options.sourceMemoryId,\n reason: \"duplicate-rule\",\n existingRuleId: existingRule.frontmatter.id,\n });\n return report;\n }\n\n if (options.dryRun === true) {\n await lock.assertHeld();\n report.promoted.push({\n id: `dry-run:${options.sourceMemoryId}`,\n ...candidateBase,\n });\n return report;\n }\n\n await lock.beforePromotedRuleWrite();\n const { id: id } = await storage.writeMemory(\"rule\", content, {\n confidence,\n tags: candidateBase.tags,\n source: \"semantic-rule-promotion\",\n lineage: candidateBase.lineage,\n sourceMemoryId: options.sourceMemoryId,\n memoryKind: \"note\",\n links: buildSupportLinks(options.sourceMemoryId, confidence),\n });\n report.promoted.push({\n id,\n ...candidateBase,\n });\n return report;\n });\n}\n"],"mappings":";;;;;AAAA,SAAS,YAAY,kBAAkB;AACvC,SAAS,MAAM,OAAO,UAAU,QAAQ,IAAI,MAAM,iBAAiB;AACnE,OAAO,UAAU;AACjB,SAAS,cAAc,aAAa;AAiCpC,IAAM,4BAA4B,KAAK,KAAK;AAC5C,IAAM,0BAA0B;AAChC,IAAM,0BAA0B,IAAI,KAAK;AACzC,IAAM,oCAAoC;AAC1C,IAAM,8BAA8B,KAAK;AAazC,IAAI,YAAmD;AAEhD,SAAS,kCAAkC,OAAoD;AACpG,cAAY;AACd;AAEA,SAAS,yBAAiC;AACxC,SAAO,WAAW,iBAAiB;AACrC;AAEA,SAAS,uBAA+B;AACtC,SAAO,WAAW,eAAe;AACnC;AAEA,SAAS,uBAA+B;AACtC,SAAO,WAAW,eAAe;AACnC;AAEA,SAAS,gCAAwC;AAC/C,SAAO,WAAW,oBAAoB;AACxC;AAEA,SAAS,2BAAmC;AAC1C,SAAO,WAAW,eAAe;AACnC;AAEA,SAAS,YAAY,KAAc,MAAuB;AACxD,SAAO,OAAO,QAAQ,YAAY,QAAQ,QAAQ,UAAU,OAAQ,IAA2B,SAAS;AAC1G;AAEA,SAAS,iBAAiB,WAAmB,SAAyB;AACpE,QAAM,SAAS,WAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK;AAChE,SAAO,KAAK,KAAK,KAAK,QAAQ,SAAS,GAAG,SAAS,iCAAiC,GAAG,MAAM,OAAO;AACtG;AAEA,SAAS,uBAAuB,SAAiB,OAAuB;AACtE,SAAO,KAAK,KAAK,SAAS,aAAa,KAAK,OAAO;AACrD;AAEA,SAAS,iBAAiB,SAAyB;AACjD,SAAO,GAAG,OAAO;AACnB;AAEA,SAAS,oBAAoB,SAAyB;AACpD,SAAO,GAAG,OAAO;AACnB;AAEA,eAAe,WAAW,YAAsC;AAC9D,MAAI;AACF,UAAM,KAAK,UAAU;AACrB,WAAO;AAAA,EACT,SAAS,KAAK;AACZ,QAAI,YAAY,KAAK,QAAQ,EAAG,QAAO;AACvC,UAAM;AAAA,EACR;AACF;AAEA,eAAe,uBAAuB,SAInC;AACD,MAAI;AACF,UAAM,QAAQ,KAAK,MAAM,MAAM,SAAS,KAAK,KAAK,SAAS,YAAY,GAAG,MAAM,CAAC;AAKjF,UAAM,eAAe,OAAO,MAAM,eAAe,WAAW,KAAK,MAAM,MAAM,UAAU,IAAI,OAAO;AAClG,UAAM,gBAAgB,OAAO,MAAM,gBAAgB,WAAW,KAAK,MAAM,MAAM,WAAW,IAAI,OAAO;AACrG,WAAO;AAAA,MACL,cAAc,OAAO,SAAS,YAAY,IAAI,eAAe;AAAA,MAC7D,eAAe,OAAO,SAAS,aAAa,IAAI,gBAAgB;AAAA,MAChE,OAAO,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ;AAAA,IACzD;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,MACL,cAAc;AAAA,MACd,eAAe;AAAA,MACf,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,eAAe,2BACb,SACA,OACkB;AAClB,QAAM,YAAY,KAAK,KAAK,SAAS,YAAY;AACjD,QAAM,WAAW,KAAK,KAAK,SAAS,SAAS,QAAQ,GAAG,IAAI,WAAW,CAAC,MAAM;AAC9E,QAAM,WAAW,uBAAuB,SAAS,MAAM,KAAK;AAC5D,MAAI;AACF,UAAM;AAAA,MACJ;AAAA,MACA,GAAG,KAAK;AAAA,QACN;AAAA,UACE,KAAK,QAAQ;AAAA,UACb,OAAO,MAAM;AAAA,UACb,YAAY,MAAM;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA;AAAA,IACH;AACA,UAAM,KAAK,UAAU,SAAS;AAC9B,WAAO;AAAA,EACT,SAAS,KAAK;AACZ,QAAI,YAAY,KAAK,QAAQ,KAAK,YAAY,KAAK,QAAQ,GAAG;AAC5D,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR,UAAE;AACA,UAAM,GAAG,UAAU,EAAE,OAAO,KAAK,CAAC;AAAA,EACpC;AACF;AAEA,eAAe,4BAA4B,SAAiB,OAA8B;AACxF,QAAM,gBAAgB,uBAAuB,SAAS,KAAK;AAC3D,QAAM,WAAW,KAAK,KAAK,SAAS,aAAa,QAAQ,GAAG,IAAI,WAAW,CAAC,MAAM;AAClF,MAAI;AACF,UAAM;AAAA,MACJ;AAAA,MACA,GAAG,KAAK;AAAA,QACN;AAAA,UACE,KAAK,QAAQ;AAAA,UACb;AAAA,UACA,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,QACtC;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA;AAAA,IACH;AACA,UAAM,OAAO,UAAU,aAAa;AAAA,EACtC,SAAS,KAAK;AACZ,UAAM,GAAG,UAAU,EAAE,OAAO,KAAK,CAAC;AAClC,UAAM;AAAA,EACR;AACF;AAEA,eAAe,8BAA8B,SAAiB,OAAiC;AAC7F,QAAM,QAAQ,MAAM,uBAAuB,OAAO;AAClD,MAAI,MAAM,UAAU,OAAO;AACzB,WAAO;AAAA,EACT;AACA,QAAM,4BAA4B,SAAS,KAAK;AAChD,SAAO;AACT;AAEA,eAAe,6BAA6B,SAAiB,OAA8C;AACzG,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI;AACF,YAAQ,MAAM,KAAK,uBAAuB,SAAS,KAAK,CAAC,GAAG;AAAA,EAC9D,SAAS,KAAK;AACZ,QAAI,YAAY,KAAK,QAAQ,EAAG,QAAO;AACvC,UAAM;AAAA,EACR;AACF;AAEA,eAAe,4BAA4B,UAAoC;AAC7E,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,KAAK,QAAQ;AAAA,EAChC,SAAS,KAAK;AACZ,QAAI,YAAY,KAAK,QAAQ,EAAG,QAAO;AACvC,UAAM;AAAA,EACR;AACA,MAAI,KAAK,IAAI,IAAI,SAAS,UAAU,qBAAqB,GAAG;AAC1D,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,GAAG,QAAQ,UAAU,QAAQ,GAAG,IAAI,WAAW,CAAC;AACrE,MAAI;AACF,UAAM,OAAO,UAAU,YAAY;AAAA,EACrC,SAAS,KAAK;AACZ,QAAI,YAAY,KAAK,QAAQ,EAAG,QAAO;AACvC,UAAM;AAAA,EACR;AACA,QAAM,GAAG,cAAc,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACvD,SAAO;AACT;AAEA,eAAe,6BAA6B,SAAmC;AAC7E,QAAM,kBAAkB,MAAM,4BAA4B,iBAAiB,OAAO,CAAC;AACnF,QAAM,qBAAqB,MAAM,4BAA4B,oBAAoB,OAAO,CAAC;AACzF,SAAO,mBAAmB;AAC5B;AAEA,eAAe,kBAAkB,SAAmC;AAClE,SAAQ,MAAM,WAAW,iBAAiB,OAAO,CAAC,KAAO,MAAM,WAAW,oBAAoB,OAAO,CAAC;AACxG;AAEA,eAAe,uBAAuB,SAAmC;AACvE,MAAI,MAAM,kBAAkB,OAAO,GAAG;AACpC,UAAM,6BAA6B,OAAO;AAC1C,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,iBAAiB,OAAO;AACxC,MAAI;AACF,UAAM,MAAM,OAAO;AAAA,EACrB,SAAS,KAAK;AACZ,QAAI,YAAY,KAAK,QAAQ,EAAG,QAAO;AACvC,UAAM;AAAA,EACR;AAEA,MAAI,WAA0B;AAC9B,MAAI;AACF,WAAO,MAAM,gCAAgC,SAAS,CAAC,UAAU;AAC/D,iBAAW;AAAA,IACb,CAAC;AAAA,EACH,UAAE;AACA,QAAI,UAAU;AACZ,YAAM,GAAG,UAAU,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IACrD;AACA,UAAM,GAAG,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EACpD;AACF;AAEA,eAAe,gCACb,SACA,aACkB;AAClB,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,KAAK,OAAO;AAAA,EAC/B,SAAS,KAAK;AACZ,QAAI,YAAY,KAAK,QAAQ,EAAG,QAAO;AACvC,UAAM;AAAA,EACR;AAEA,QAAM,QAAQ,MAAM,uBAAuB,OAAO;AAClD,QAAM,cAAc,MAAM,6BAA6B,SAAS,MAAM,KAAK;AAC3E,QAAM,aAAa,eAAe,MAAM,iBAAiB,MAAM,gBAAgB,SAAS;AACxF,QAAM,gBAAgB,MAAM,UAAU,QAAQ,MAAM,kBAAkB,QAAQ,MAAM,iBAAiB;AACrG,QAAM,eAAe,gBAAgB,8BAA8B,IAAI,qBAAqB;AAC5F,MAAI,KAAK,IAAI,IAAI,aAAa,cAAc;AAC1C,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,GAAG,OAAO,UAAU,QAAQ,GAAG,IAAI,WAAW,CAAC;AAChE,MAAI;AACF,UAAM,OAAO,SAAS,QAAQ;AAC9B,gBAAY,QAAQ;AAAA,EACtB,SAAS,KAAK;AACZ,QAAI,YAAY,KAAK,QAAQ,EAAG,QAAO;AACvC,UAAM;AAAA,EACR;AAEA,QAAM,aAAa,MAAM,uBAAuB,QAAQ;AACxD,QAAM,mBAAmB,MAAM,6BAA6B,UAAU,WAAW,KAAK;AACtF,QAAM,kBAAkB,oBAAoB,WAAW,iBAAiB,WAAW,gBAAgB,SAAS;AAC5G,QAAM,qBACJ,WAAW,UAAU,QAAQ,WAAW,kBAAkB,QAAQ,WAAW,iBAAiB;AAChG,QAAM,sBAAsB,qBAAqB,8BAA8B,IAAI,qBAAqB;AACxG,MAAI,KAAK,IAAI,IAAI,kBAAkB,qBAAqB;AACtD,UAAM,OAAO,UAAU,OAAO;AAC9B,gBAAY,EAAE;AACd,WAAO;AAAA,EACT;AAEA,QAAM,GAAG,UAAU,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACnD,cAAY,EAAE;AACd,SAAO;AACT;AAEA,eAAe,qBAAqB,SAAiB,OAA8B;AACjF,QAAM,aAAa,oBAAoB,OAAO;AAC9C,QAAM,WAAW,KAAK,IAAI,IAAI,uBAAuB;AACrD,QAAM,WAAW,oBAAoB,SAAS,KAAK;AACnD,aAAS;AACP,QAAI;AACF,YAAM,MAAM,UAAU;AACtB;AAAA,IACF,SAAS,KAAK;AACZ,UAAI,CAAC,YAAY,KAAK,QAAQ,GAAG;AAC/B,cAAM;AAAA,MACR;AACA,YAAM,QAAQ,MAAM,uBAAuB,OAAO;AAClD,UAAI,MAAM,UAAU,OAAO;AACzB;AAAA,MACF;AACA,YAAM,4BAA4B,UAAU;AAC5C,UAAI,KAAK,IAAI,KAAK,UAAU;AAC1B,cAAM,IAAI,MAAM,kDAAkD;AAAA,MACpE;AACA,YAAM,MAAM,qBAAqB,CAAC;AAAA,IACpC;AAAA,EACF;AAEA,MAAI;AACF,UAAM,QAAQ,MAAM,uBAAuB,OAAO;AAClD,QAAI,MAAM,UAAU,OAAO;AACzB;AAAA,IACF;AACA,UAAM,GAAG,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EACpD,UAAE;AACA,UAAM,GAAG,YAAY,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EACvD;AACF;AAOA,eAAe,kBACb,WACA,SACA,IACY;AACZ,QAAM,UAAU,iBAAiB,WAAW,OAAO;AACnD,QAAM,WAAW,KAAK,QAAQ,OAAO;AACrC,QAAM,WAAW,KAAK,IAAI,IAAI,uBAAuB;AACrD,MAAI,YAA2B;AAC/B,MAAI,YAAmC;AAEvC,QAAM,MAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AACzC,aAAS;AACP,QAAI;AACF,UAAI,MAAM,kBAAkB,OAAO,GAAG;AACpC,cAAM,6BAA6B,OAAO;AAC1C,YAAI,KAAK,IAAI,KAAK,UAAU;AAC1B,gBAAM,IAAI,MAAM,kDAAkD;AAAA,QACpE;AACA,cAAM,MAAM,qBAAqB,CAAC;AAClC;AAAA,MACF;AACA,YAAM,MAAM,OAAO;AACnB,UAAI,MAAM,kBAAkB,OAAO,GAAG;AACpC,cAAM,6BAA6B,OAAO;AAC1C,YAAI,KAAK,IAAI,KAAK,UAAU;AAC1B,gBAAM,IAAI,MAAM,kDAAkD;AAAA,QACpE;AACA,cAAM,MAAM,qBAAqB,CAAC;AAClC;AAAA,MACF;AACA,UAAI;AACF,oBAAY,WAAW;AACvB,cAAM,YAAY;AAAA,UAChB,OAAO;AAAA,UACP,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,QACrC;AACA,cAAM,aAAa,MAAM,2BAA2B,SAAS,SAAS;AACtE,YAAI,CAAC,YAAY;AACf,sBAAY;AACZ,cAAI,KAAK,IAAI,KAAK,UAAU;AAC1B,kBAAM,IAAI,MAAM,kDAAkD;AAAA,UACpE;AACA,gBAAM,MAAM,qBAAqB,CAAC;AAClC;AAAA,QACF;AACA,cAAM,4BAA4B,SAAS,SAAS;AACpD,cAAM,iBAAiB;AACvB,cAAM,cAAc,yBAAyB;AAC7C,YAAI,cAAc,GAAG;AACnB,sBAAY,YAAY,MAAM;AAC5B,iBAAK,8BAA8B,SAAS,cAAc,EACvD,KAAK,CAAC,aAAa;AAClB,kBAAI,CAAC,YAAY,WAAW;AAC1B,8BAAc,SAAS;AACvB,4BAAY;AAAA,cACd;AAAA,YACF,CAAC,EACA,MAAM,MAAM,MAAS;AAAA,UAC1B,GAAG,WAAW;AAAA,QAChB;AAAA,MACF,SAAS,KAAK;AACZ,oBAAY;AACZ,YAAI,WAAW;AACb,wBAAc,SAAS;AACvB,sBAAY;AAAA,QACd;AACA,cAAM,GAAG,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAClD,cAAM;AAAA,MACR;AACA;AAAA,IACF,SAAS,KAAK;AACZ,UAAI,CAAC,YAAY,KAAK,QAAQ,GAAG;AAC/B,cAAM;AAAA,MACR;AACA,UAAI,MAAM,uBAAuB,OAAO,GAAG;AACzC;AAAA,MACF;AACA,UAAI,KAAK,IAAI,KAAK,UAAU;AAC1B,cAAM,IAAI,MAAM,kDAAkD;AAAA,MACpE;AACA,YAAM,MAAM,qBAAqB,CAAC;AAAA,IACpC;AAAA,EACF;AAEA,QAAM,aAAa,YAAY;AAC7B,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,gDAAgD;AAAA,IAClE;AACA,UAAM,WAAW,MAAM,8BAA8B,SAAS,SAAS;AACvE,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,gDAAgD;AAAA,IAClE;AAAA,EACF;AAEA,MAAI,YAAY;AAChB,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACF,UAAM,WAAW;AACjB,aAAS,MAAM,GAAG;AAAA,MAChB;AAAA,MACA,yBAAyB,YAAY;AACnC,YAAI,CAAC,WAAW;AACd,gBAAM,IAAI,MAAM,gDAAgD;AAAA,QAClE;AACA,cAAM,WAAW,0BAA0B,SAAS,SAAS;AAC7D,cAAM,WAAW;AAAA,MACnB;AAAA,IACF,CAAC;AACD,gBAAY;AAAA,EACd,SAAS,KAAK;AACZ,oBAAgB;AAAA,EAClB,UAAE;AACA,QAAI,WAAW;AACb,oBAAc,SAAS;AAAA,IACzB;AACA,QAAI,WAAW;AACb,UAAI;AACF,cAAM,qBAAqB,SAAS,SAAS;AAAA,MAC/C,SAAS,KAAK;AACZ,YAAI,CAAC,aAAa,CAAC,eAAe;AAChC,yBAAe;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,cAAc;AAChB,UAAM;AAAA,EACR;AACA,MAAI,eAAe;AACjB,UAAM;AAAA,EACR;AACA,SAAO;AACT;AAEA,SAAS,wBAAwB,OAAuB;AACtD,SAAO,MAAM,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACzC;AAEA,SAAS,+BAA+B,OAAuB;AAG7D,MAAI,MAAM,MAAM;AAChB,SAAO,MAAM,GAAG;AACd,UAAM,KAAK,MAAM,MAAM,CAAC;AACxB,QAAI,OAAO,OAAO,OAAO,OAAO,OAAO,IAAK;AAAA,QACvC;AAAA,EACP;AACA,SAAO,MAAM,MAAM,GAAG,GAAG,EAAE,KAAK;AAClC;AAEA,SAAS,wBAAwB,OAAuB;AACtD,SAAO,0BAA0B,KAAK,KAAK,wBAAwB,KAAK;AAC1E;AAEA,SAAS,oBAAoB,OAAuB;AAClD,SAAO,wBAAwB,KAAK,EAAE,YAAY;AACpD;AAEA,SAAS,0BAA0B,SAAgC;AACjE,QAAM,QAAQ,QAAQ,MAAM,wDAAwD;AACpF,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,YAAY,+BAA+B,wBAAwB,MAAM,CAAC,KAAK,EAAE,CAAC;AACxF,QAAM,UAAU,+BAA+B,wBAAwB,MAAM,CAAC,KAAK,EAAE,CAAC;AACtF,MAAI,UAAU,WAAW,KAAK,QAAQ,WAAW,EAAG,QAAO;AAC3D,SAAO,MAAM,SAAS,SAAS,OAAO;AACxC;AAEA,SAAS,oBAAoB,QAA4B;AACvD,QAAM,OAAO,OAAO,SAAS,OAAO,YAAY,UAAU,IAAI,OAAO,YAAY,aAAa;AAC9F,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,MAAM,IAAI,CAAC;AAC3C;AAEA,SAAS,cAAc,QAA8B;AACnD,SAAO,MAAM,KAAK,oBAAI,IAAI,CAAC,GAAI,OAAO,YAAY,QAAQ,CAAC,GAAI,iBAAiB,eAAe,CAAC,CAAC;AACnG;AAEA,SAAS,kBAAkB,gBAAwB,YAAkC;AACnF,SAAO;AAAA,IACL;AAAA,MACE,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,QAAQ;AAAA,IACV;AAAA,EACF;AACF;AAEA,eAAsB,8BAA8B,SAKX;AACvC,QAAM,SAAsC;AAAA,IAC1C,SAAS,QAAQ;AAAA,IACjB,QAAQ,QAAQ,WAAW;AAAA,IAC3B,UAAU,CAAC;AAAA,IACX,SAAS,CAAC;AAAA,EACZ;AACA,MAAI,CAAC,QAAQ,SAAS;AACpB,WAAO,QAAQ,KAAK;AAAA,MAClB,gBAAgB,QAAQ;AAAA,MACxB,QAAQ;AAAA,IACV,CAAC;AACD,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,IAAI,eAAe,QAAQ,SAAS;AACpD,QAAM,eAAe,MAAM,QAAQ,cAAc,QAAQ,cAAc;AACvE,MAAI,CAAC,cAAc;AACjB,WAAO,QAAQ,KAAK;AAAA,MAClB,gBAAgB,QAAQ;AAAA,MACxB,QAAQ;AAAA,IACV,CAAC;AACD,WAAO;AAAA,EACT;AACA,MAAI,aAAa,YAAY,WAAW,aAAa;AACnD,WAAO,QAAQ,KAAK;AAAA,MAClB,gBAAgB,QAAQ;AAAA,MACxB,QAAQ;AAAA,IACV,CAAC;AACD,WAAO;AAAA,EACT;AACA,MAAI,aAAa,YAAY,WAAW,cAAc,aAAa,YAAY,eAAe,WAAW;AACvG,WAAO,QAAQ,KAAK;AAAA,MAClB,gBAAgB,QAAQ;AAAA,MACxB,QAAQ;AAAA,IACV,CAAC;AACD,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,0BAA0B,aAAa,OAAO;AAC9D,MAAI,CAAC,SAAS;AACZ,WAAO,QAAQ,KAAK;AAAA,MAClB,gBAAgB,QAAQ;AAAA,MACxB,QAAQ;AAAA,IACV,CAAC;AACD,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,oBAAoB,OAAO;AAC3C,QAAM,aAAa,oBAAoB,YAAY;AACnD,QAAM,gBAAgB;AAAA,IACpB,gBAAgB,QAAQ;AAAA,IACxB;AAAA,IACA;AAAA,IACA,MAAM,cAAc,YAAY;AAAA,IAChC,YAAY;AAAA,IACZ,SAAS,CAAC,QAAQ,cAAc;AAAA,EAClC;AAEA,SAAO,kBAAkB,QAAQ,WAAW,SAAS,OAAO,SAAS;AACnE,YAAQ,iCAAiC;AACzC,UAAM,gBAAgB,MAAM,QAAQ,gBAAgB,GAAG;AAAA,MACrD,CAAC,WACC,OAAO,YAAY,aAAa,UAChC,OAAO,YAAY,WAAW,cAC9B,OAAO,YAAY,WAAW,eAC9B,oBAAoB,OAAO,OAAO,MAAM;AAAA,IAC5C;AACA,QAAI,cAAc;AAChB,aAAO,QAAQ,KAAK;AAAA,QAClB,gBAAgB,QAAQ;AAAA,QACxB,QAAQ;AAAA,QACR,gBAAgB,aAAa,YAAY;AAAA,MAC3C,CAAC;AACD,aAAO;AAAA,IACT;AAEA,QAAI,QAAQ,WAAW,MAAM;AAC3B,YAAM,KAAK,WAAW;AACtB,aAAO,SAAS,KAAK;AAAA,QACnB,IAAI,WAAW,QAAQ,cAAc;AAAA,QACrC,GAAG;AAAA,MACL,CAAC;AACD,aAAO;AAAA,IACT;AAEA,UAAM,KAAK,wBAAwB;AACnC,UAAM,EAAE,GAAO,IAAI,MAAM,QAAQ,YAAY,QAAQ,SAAS;AAAA,MAC5D;AAAA,MACA,MAAM,cAAc;AAAA,MACpB,QAAQ;AAAA,MACR,SAAS,cAAc;AAAA,MACvB,gBAAgB,QAAQ;AAAA,MACxB,YAAY;AAAA,MACZ,OAAO,kBAAkB,QAAQ,gBAAgB,UAAU;AAAA,IAC7D,CAAC;AACD,WAAO,SAAS,KAAK;AAAA,MACnB;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AACD,WAAO;AAAA,EACT,CAAC;AACH;","names":[]}
@@ -2,14 +2,14 @@ import {
2
2
  getGatewayRuntimeAuthForModel,
3
3
  resolveProviderApiKey
4
4
  } from "./chunk-K2ZLHESQ.js";
5
+ import {
6
+ loadModelsJsonProviders
7
+ } from "./chunk-VFSP73LP.js";
5
8
  import {
6
9
  buildChatCompletionTemperature,
7
10
  buildChatCompletionTokenLimit,
8
11
  shouldAssumeOpenAiChatCompletions
9
12
  } from "./chunk-L2EXJQJP.js";
10
- import {
11
- loadModelsJsonProviders
12
- } from "./chunk-VFSP73LP.js";
13
13
  import {
14
14
  extractJsonCandidates
15
15
  } from "./chunk-RGMVMVMF.js";
@@ -708,4 +708,4 @@ export {
708
708
  fallbackLlmRuntimeContextFromConfig,
709
709
  FallbackLlmClient
710
710
  };
711
- //# sourceMappingURL=chunk-GKCCHHZK.js.map
711
+ //# sourceMappingURL=chunk-UXKMMNJD.js.map
@@ -1,3 +1,6 @@
1
+ import {
2
+ LcmDag
3
+ } from "./chunk-7N4KAIGN.js";
1
4
  import {
2
5
  LcmWorkQueue
3
6
  } from "./chunk-TPDBFYEG.js";
@@ -14,9 +17,6 @@ import {
14
17
  import {
15
18
  LcmArchive
16
19
  } from "./chunk-O7BBFJLP.js";
17
- import {
18
- LcmDag
19
- } from "./chunk-7N4KAIGN.js";
20
20
  import {
21
21
  log
22
22
  } from "./chunk-37CTGERM.js";
@@ -526,4 +526,4 @@ export {
526
526
  extractLcmConfig,
527
527
  LcmEngine
528
528
  };
529
- //# sourceMappingURL=chunk-XFTPUXCE.js.map
529
+ //# sourceMappingURL=chunk-UXWGPODH.js.map
@@ -1,3 +1,9 @@
1
+ import {
2
+ LanceDbBackend
3
+ } from "./chunk-N3JDIRBW.js";
4
+ import {
5
+ MeilisearchBackend
6
+ } from "./chunk-UTRJFDP2.js";
1
7
  import {
2
8
  NoopSearchBackend
3
9
  } from "./chunk-CYEPCZN5.js";
@@ -10,12 +16,6 @@ import {
10
16
  import {
11
17
  EmbedHelper
12
18
  } from "./chunk-FNMFJWBY.js";
13
- import {
14
- LanceDbBackend
15
- } from "./chunk-N3JDIRBW.js";
16
- import {
17
- MeilisearchBackend
18
- } from "./chunk-UTRJFDP2.js";
19
19
  import {
20
20
  createConversationIndexBackend
21
21
  } from "./chunk-JI5AVXYO.js";
@@ -24,7 +24,7 @@ import {
24
24
  } from "./chunk-TN7THW5U.js";
25
25
  import {
26
26
  QmdClient
27
- } from "./chunk-3F4N4WDH.js";
27
+ } from "./chunk-AHLPZ2SF.js";
28
28
  import {
29
29
  resolveIndexingCapabilities,
30
30
  resolvePipelineProcessingCapabilities,
@@ -175,4 +175,4 @@ export {
175
175
  createConversationSearchBackend,
176
176
  createConversationIndexRuntime
177
177
  };
178
- //# sourceMappingURL=chunk-2FSHROYK.js.map
178
+ //# sourceMappingURL=chunk-V53GJUSL.js.map
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-AAD2ZS6P.js";
5
5
  import {
6
6
  gatewayTaskChainOptions
7
- } from "./chunk-GKCCHHZK.js";
7
+ } from "./chunk-UXKMMNJD.js";
8
8
  import {
9
9
  extractJsonCandidates
10
10
  } from "./chunk-RGMVMVMF.js";
@@ -685,4 +685,4 @@ export {
685
685
  serializeFaithfulnessFields,
686
686
  parseFaithfulnessField
687
687
  };
688
- //# sourceMappingURL=chunk-LKT755LP.js.map
688
+ //# sourceMappingURL=chunk-VA4WSW54.js.map
@@ -3,14 +3,14 @@ import {
3
3
  } from "./chunk-2MR3MFQB.js";
4
4
  import {
5
5
  defineOperation
6
- } from "./chunk-57INMZ6F.js";
6
+ } from "./chunk-POUD5BLV.js";
7
7
  import {
8
8
  CorrectionContractError,
9
9
  DECISION_SUBCOMMANDS,
10
10
  DELTA_SUBCOMMANDS,
11
11
  EngramAccessInputError,
12
12
  isCodegraphToolName
13
- } from "./chunk-CNWC274T.js";
13
+ } from "./chunk-MLT5EG6K.js";
14
14
 
15
15
  // src/access-operations.ts
16
16
  import { z } from "zod";
@@ -464,4 +464,4 @@ export {
464
464
  codegraphIngestTracesOperation,
465
465
  REGISTERED_OPERATIONS
466
466
  };
467
- //# sourceMappingURL=chunk-FYKIEOG6.js.map
467
+ //# sourceMappingURL=chunk-VCFADTFS.js.map
@@ -1,5 +1,9 @@
1
1
  import {
2
- ALL_CATEGORY_DIRS
2
+ bumpMemoryCorpusVersionForDir
3
+ } from "./chunk-OKUEZOGW.js";
4
+ import {
5
+ ALL_CATEGORY_DIRS,
6
+ RECALL_FALLBACK_DIRS
3
7
  } from "./chunk-VS2IYZRU.js";
4
8
 
5
9
  // src/page-versioning.ts
@@ -163,6 +167,10 @@ async function revertToVersion(pagePath, versionId, config, log = NOOP_LOGGER, m
163
167
  resolvedMemoryDir
164
168
  );
165
169
  await writeFile(pagePath, targetContent, "utf-8");
170
+ const revertedTop = relPath(pagePath, resolvedMemoryDir).split(path.sep)[0];
171
+ if (RECALL_FALLBACK_DIRS.includes(revertedTop)) {
172
+ bumpMemoryCorpusVersionForDir(resolvedMemoryDir);
173
+ }
166
174
  log.debug(`page-versioning: reverted ${pagePath} to version ${versionId}`);
167
175
  return version;
168
176
  }
@@ -263,4 +271,4 @@ export {
263
271
  revertToVersion,
264
272
  diffVersions
265
273
  };
266
- //# sourceMappingURL=chunk-VF4XKTX3.js.map
274
+ //# sourceMappingURL=chunk-VZ5OJE4X.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/page-versioning.ts"],"sourcesContent":["/**\n * Page-level versioning with history and revert (issue #371).\n *\n * Provides snapshot-based versioning for memory files using a sidecar\n * directory layout. Each memory page gets a `.versions/<pageName>/`\n * subdirectory containing numbered snapshots and a `manifest.json` that\n * records the version history.\n *\n * Storage layout:\n * memoryDir/\n * facts/preferences.md <- current file\n * .versions/\n * facts__preferences/\n * manifest.json <- VersionHistory\n * 1.md <- version 1 snapshot\n * 2.md <- version 2 snapshot\n */\n\nimport { createHash } from \"node:crypto\";\nimport path from \"node:path\";\nimport {\n access,\n mkdir,\n readFile,\n writeFile,\n unlink,\n} from \"node:fs/promises\";\nimport { ALL_CATEGORY_DIRS, RECALL_FALLBACK_DIRS } from \"./utils/category-dir.js\";\nimport { bumpMemoryCorpusVersionForDir } from \"./memory-corpus-version.js\";\n\n// ---------------------------------------------------------------------------\n// Public interfaces\n// ---------------------------------------------------------------------------\n\nexport interface PageVersion {\n versionId: string;\n timestamp: string;\n contentHash: string;\n sizeBytes: number;\n trigger: VersionTrigger;\n note?: string;\n}\n\nexport type VersionTrigger = \"write\" | \"consolidation\" | \"revert\" | \"manual\";\n\nexport interface VersionHistory {\n pagePath: string;\n versions: PageVersion[];\n currentVersion: string;\n}\n\nexport interface VersioningConfig {\n enabled: boolean;\n maxVersionsPerPage: number;\n sidecarDir: string;\n}\n\n// ---------------------------------------------------------------------------\n// Logger interface (minimal, avoids coupling to the host logger)\n// ---------------------------------------------------------------------------\n\nexport interface VersioningLogger {\n debug(msg: string): void;\n warn(msg: string): void;\n}\n\nconst NOOP_LOGGER: VersioningLogger = {\n debug: () => {},\n warn: () => {},\n};\n\n// ---------------------------------------------------------------------------\n// Per-page write lock (promise-chain pattern, see gotcha #40)\n// ---------------------------------------------------------------------------\n\nconst writeLocks = new Map<string, Promise<void>>();\n\nfunction withPageLock<T>(pageKey: string, fn: () => Promise<T>): Promise<T> {\n const prev = writeLocks.get(pageKey) ?? Promise.resolve();\n const next = prev.then(fn, fn); // run fn after previous completes, even if previous failed\n writeLocks.set(pageKey, next.then(() => {}, () => {})); // recover chain per gotcha #40\n return next;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction contentHash(content: string): string {\n return createHash(\"sha256\").update(content, \"utf-8\").digest(\"hex\");\n}\n\n/**\n * Derive a filesystem-safe sidecar key from a page path relative to memoryDir.\n *\n * `facts/2026-01-15/pref-001.md` -> `facts__2026-01-15__pref-001`\n *\n * Exported so the `remnic doctor` consolidation-provenance check (issue\n * #561 PR 4) resolves snapshot locations using the canonical algorithm\n * without re-implementing it — preventing silent drift if the key\n * format ever changes.\n */\nexport function sidecarKey(pagePath: string): string {\n const withoutExt = pagePath.replace(/\\.md$/i, \"\");\n return withoutExt.replace(/[\\\\/]/g, \"__\");\n}\n\nfunction sidecarDir(memoryDir: string, sidecar: string, pagePath: string): string {\n return path.join(memoryDir, sidecar, sidecarKey(pagePath));\n}\n\nfunction manifestPath(memoryDir: string, sidecar: string, pagePath: string): string {\n return path.join(sidecarDir(memoryDir, sidecar, pagePath), \"manifest.json\");\n}\n\nasync function fileExists(p: string): Promise<boolean> {\n try {\n await access(p);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function readManifest(\n memoryDir: string,\n sidecar: string,\n pagePath: string,\n): Promise<VersionHistory> {\n const mp = manifestPath(memoryDir, sidecar, pagePath);\n if (!(await fileExists(mp))) {\n return { pagePath, versions: [], currentVersion: \"0\" };\n }\n try {\n const raw = await readFile(mp, \"utf-8\");\n const parsed: unknown = JSON.parse(raw);\n if (typeof parsed !== \"object\" || parsed === null) {\n throw new Error(\"manifest root must be an object\");\n }\n const obj = parsed as Record<string, unknown>;\n if (!Array.isArray(obj.versions)) {\n throw new Error(\"manifest versions must be an array\");\n }\n const versions = obj.versions.map((entry, index) => {\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) {\n throw new Error(`manifest version ${index} must be an object`);\n }\n const version = entry as Record<string, unknown>;\n if (\n typeof version.versionId !== \"string\" ||\n !/^\\d+$/.test(version.versionId) ||\n typeof version.timestamp !== \"string\" ||\n typeof version.contentHash !== \"string\" ||\n typeof version.sizeBytes !== \"number\" ||\n !Number.isFinite(version.sizeBytes) ||\n ![\"write\", \"consolidation\", \"revert\", \"manual\"].includes(String(version.trigger))\n ) {\n throw new Error(`manifest version ${index} has invalid shape`);\n }\n return version as unknown as PageVersion;\n });\n if (typeof obj.currentVersion !== \"string\" || !/^\\d+$/.test(obj.currentVersion)) {\n throw new Error(\"manifest currentVersion must be a numeric string\");\n }\n const currentVersion = obj.currentVersion;\n return { pagePath: typeof obj.pagePath === \"string\" ? obj.pagePath : pagePath, versions, currentVersion };\n } catch (error) {\n throw new Error(`page-versioning: invalid manifest ${mp}: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\nasync function writeManifest(\n memoryDir: string,\n sidecar: string,\n pagePath: string,\n history: VersionHistory,\n): Promise<void> {\n const dir = sidecarDir(memoryDir, sidecar, pagePath);\n await mkdir(dir, { recursive: true });\n const mp = manifestPath(memoryDir, sidecar, pagePath);\n await writeFile(mp, JSON.stringify(history, null, 2) + \"\\n\", \"utf-8\");\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Create a new version snapshot for a page.\n *\n * Call this BEFORE overwriting the current file so the previous content is\n * preserved. If the file does not exist yet (first write), the provided\n * `content` is snapshotted as version 1.\n *\n * Pruning: when the number of versions exceeds `config.maxVersionsPerPage`,\n * the oldest snapshots (and their files) are removed.\n */\nexport async function createVersion(\n pagePath: string,\n content: string,\n trigger: VersionTrigger,\n config: VersioningConfig,\n log: VersioningLogger = NOOP_LOGGER,\n note?: string,\n memoryDir?: string,\n): Promise<PageVersion> {\n const { sidecarDir: sidecar, maxVersionsPerPage } = config;\n const resolvedMemoryDir = memoryDir ?? resolveMemoryDir(pagePath);\n const mPath = manifestPath(resolvedMemoryDir, sidecar, relPath(pagePath, resolvedMemoryDir));\n\n return withPageLock(mPath, async () => {\n const history = await readManifest(resolvedMemoryDir, sidecar, relPath(pagePath, resolvedMemoryDir));\n const nextId = String(history.versions.length > 0\n ? Math.max(...history.versions.map((v) => Number(v.versionId))) + 1\n : 1);\n\n const hash = contentHash(content);\n const version: PageVersion = {\n versionId: nextId,\n timestamp: new Date().toISOString(),\n contentHash: hash,\n sizeBytes: Buffer.byteLength(content, \"utf-8\"),\n trigger,\n ...(note !== undefined ? { note } : {}),\n };\n\n // Write snapshot file\n const dir = sidecarDir(resolvedMemoryDir, sidecar, relPath(pagePath, resolvedMemoryDir));\n await mkdir(dir, { recursive: true });\n const ext = path.extname(pagePath) || \".md\";\n const snapshotPath = path.join(dir, `${nextId}${ext}`);\n await writeFile(snapshotPath, content, \"utf-8\");\n\n history.versions.push(version);\n history.currentVersion = nextId;\n\n // Prune old versions if exceeding max\n if (maxVersionsPerPage > 0 && history.versions.length > maxVersionsPerPage) {\n const toRemove = history.versions.splice(0, history.versions.length - maxVersionsPerPage);\n for (const old of toRemove) {\n const oldPath = path.join(dir, `${old.versionId}${ext}`);\n try {\n await unlink(oldPath);\n } catch {\n log.debug(`page-versioning: could not remove old snapshot ${oldPath}`);\n }\n }\n }\n\n await writeManifest(resolvedMemoryDir, sidecar, relPath(pagePath, resolvedMemoryDir), history);\n log.debug(`page-versioning: created version ${nextId} for ${pagePath} (trigger=${trigger})`);\n\n return version;\n });\n}\n\n/**\n * List all versions for a page.\n */\nexport async function listVersions(\n pagePath: string,\n config: VersioningConfig,\n memoryDir?: string,\n): Promise<VersionHistory> {\n const resolvedMemoryDir = memoryDir ?? resolveMemoryDir(pagePath);\n const rel = relPath(pagePath, resolvedMemoryDir);\n const history = await readManifest(resolvedMemoryDir, config.sidecarDir, rel);\n // Sort ascending by versionId (numeric)\n history.versions.sort((a, b) => Number(a.versionId) - Number(b.versionId));\n return history;\n}\n\n/**\n * Read the content of a specific version.\n */\nexport async function getVersion(\n pagePath: string,\n versionId: string,\n config: VersioningConfig,\n memoryDir?: string,\n): Promise<string> {\n const resolvedMemoryDir = memoryDir ?? resolveMemoryDir(pagePath);\n const rel = relPath(pagePath, resolvedMemoryDir);\n const ext = path.extname(pagePath) || \".md\";\n const dir = sidecarDir(resolvedMemoryDir, config.sidecarDir, rel);\n const snapshotPath = path.join(dir, `${versionId}${ext}`);\n\n if (!(await fileExists(snapshotPath))) {\n throw new Error(`Version ${versionId} not found for ${pagePath}`);\n }\n\n return readFile(snapshotPath, \"utf-8\");\n}\n\n/**\n * Revert a page to a previous version.\n *\n * 1. Reads the target version's content.\n * 2. Snapshots the CURRENT content as a new version (trigger: \"revert\").\n * 3. Writes the reverted content to the page file.\n *\n * Returns the newly created version entry for the revert snapshot.\n */\nexport async function revertToVersion(\n pagePath: string,\n versionId: string,\n config: VersioningConfig,\n log: VersioningLogger = NOOP_LOGGER,\n memoryDir?: string,\n): Promise<PageVersion> {\n const resolvedMemoryDir = memoryDir ?? resolveMemoryDir(pagePath);\n\n // Read target version content\n const targetContent = await getVersion(pagePath, versionId, config, resolvedMemoryDir);\n\n // Snapshot current content before overwriting\n let currentContent = \"\";\n try {\n currentContent = await readFile(pagePath, \"utf-8\");\n } catch {\n // File may not exist; that's okay\n }\n\n const version = await createVersion(\n pagePath,\n currentContent,\n \"revert\",\n config,\n log,\n `reverted to version ${versionId}`,\n resolvedMemoryDir,\n );\n\n // Write the reverted content to the actual page\n await writeFile(pagePath, targetContent, \"utf-8\");\n // A revert overwrites a memory file out-of-band (not via a StorageManager\n // mutation), so bump the corpus sentinel when the reverted page lives under a\n // recall category dir — forcing a warm hot-memories cache to rescan on its\n // next read (issue #1902, Codex P1). Non-recall pages (entities/artifacts/\n // profiles) are not in the corpus scan, so they need no bump.\n // The hot-memories corpus covers the RECALL corpus, which excludes the\n // non-memory queue dirs (questions/). Use RECALL_FALLBACK_DIRS — a revert of a\n // questions/ page must NOT bump the recall corpus sentinel and force a rescan.\n const revertedTop = relPath(pagePath, resolvedMemoryDir).split(path.sep)[0];\n if ((RECALL_FALLBACK_DIRS as readonly string[]).includes(revertedTop)) {\n bumpMemoryCorpusVersionForDir(resolvedMemoryDir);\n }\n log.debug(`page-versioning: reverted ${pagePath} to version ${versionId}`);\n\n return version;\n}\n\n/**\n * Simple line-based diff between two versions.\n *\n * Returns a unified-style diff string showing added (+) and removed (-) lines.\n */\nexport async function diffVersions(\n pagePath: string,\n v1: string,\n v2: string,\n config: VersioningConfig,\n memoryDir?: string,\n): Promise<string> {\n const resolvedMemoryDir = memoryDir ?? resolveMemoryDir(pagePath);\n const content1 = await getVersion(pagePath, v1, config, resolvedMemoryDir);\n const content2 = await getVersion(pagePath, v2, config, resolvedMemoryDir);\n\n const lines1 = content1.split(\"\\n\");\n const lines2 = content2.split(\"\\n\");\n\n const result: string[] = [];\n result.push(`--- version ${v1}`);\n result.push(`+++ version ${v2}`);\n\n // Simple LCS-based diff\n const lcs = computeLCS(lines1, lines2);\n let i = 0;\n let j = 0;\n let k = 0;\n\n while (k < lcs.length) {\n // Emit removed lines before the next common line\n while (i < lines1.length && lines1[i] !== lcs[k]) {\n result.push(`-${lines1[i]}`);\n i++;\n }\n // Emit added lines before the next common line\n while (j < lines2.length && lines2[j] !== lcs[k]) {\n result.push(`+${lines2[j]}`);\n j++;\n }\n // Common line\n result.push(` ${lcs[k]}`);\n i++;\n j++;\n k++;\n }\n // Remaining removed lines\n while (i < lines1.length) {\n result.push(`-${lines1[i]}`);\n i++;\n }\n // Remaining added lines\n while (j < lines2.length) {\n result.push(`+${lines2[j]}`);\n j++;\n }\n\n return result.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// LCS helper for diffVersions\n// ---------------------------------------------------------------------------\n\nfunction computeLCS(a: string[], b: string[]): string[] {\n const m = a.length;\n const n = b.length;\n // Build DP table\n const dp: number[][] = Array.from({ length: m + 1 }, () => new Array<number>(n + 1).fill(0));\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n if (a[i - 1] === b[j - 1]) {\n dp[i][j] = dp[i - 1][j - 1] + 1;\n } else {\n dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);\n }\n }\n }\n // Backtrack to build LCS\n const result: string[] = [];\n let i = m;\n let j = n;\n while (i > 0 && j > 0) {\n if (a[i - 1] === b[j - 1]) {\n result.unshift(a[i - 1]);\n i--;\n j--;\n } else if (dp[i - 1][j] > dp[i][j - 1]) {\n i--;\n } else {\n j--;\n }\n }\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Path helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Legacy fallback: given an absolute page path, heuristically resolve the\n * memory directory by walking up past known subdirectory names.\n *\n * Callers should always pass an explicit `memoryDir` instead of relying on\n * this heuristic. It is retained only for backward compatibility when the\n * optional `memoryDir` parameter is omitted.\n */\nfunction resolveMemoryDir(pagePath: string): string {\n // Derive the recall category dirs from ALL_CATEGORY_DIRS (single source of\n // truth) so newly-routed categories (decisions/, preferences/, ...) are\n // recognized when walking up to the memory root (#1546); the non-category\n // subdirs are listed explicitly.\n const knownSubdirs = new Set<string>([\n ...ALL_CATEGORY_DIRS,\n \"entities\",\n \"state\",\n \"artifacts\",\n \"profiles\",\n ]);\n\n let dir = path.dirname(pagePath);\n // Walk up past date directories (YYYY-MM-DD) and known subdirs\n for (let depth = 0; depth < 5; depth++) {\n const base = path.basename(dir);\n if (knownSubdirs.has(base) || /^\\d{4}-\\d{2}-\\d{2}$/.test(base)) {\n dir = path.dirname(dir);\n } else {\n break;\n }\n }\n return dir;\n}\n\n/**\n * Compute relative path of a page within its memory directory.\n */\nfunction relPath(pagePath: string, memoryDir: string): string {\n return path.relative(memoryDir, pagePath);\n}\n"],"mappings":"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","names":["i","j"]}
@@ -6,35 +6,46 @@ import {
6
6
  // src/memory-cache.ts
7
7
  var hotCacheByDir = /* @__PURE__ */ new Map();
8
8
  var archiveCacheByDir = /* @__PURE__ */ new Map();
9
- function getCachedMemories(baseDir, currentVersion) {
9
+ function sweepExpiredHotEntries(now) {
10
+ for (const [dir, entry] of hotCacheByDir) {
11
+ if (entry.ttlMs > 0 && now - entry.loadedAt > entry.ttlMs) hotCacheByDir.delete(dir);
12
+ }
13
+ }
14
+ function getCachedMemories(baseDir, currentVersion, keyId = "", ttlMs = 0) {
10
15
  if (currentVersion === 0) return null;
11
16
  const entry = hotCacheByDir.get(baseDir);
12
- if (!entry || entry.version !== currentVersion) return null;
17
+ if (!entry || entry.version !== currentVersion || entry.keyId !== keyId) return null;
18
+ if (ttlMs > 0 && Date.now() - entry.loadedAt > ttlMs) {
19
+ hotCacheByDir.delete(baseDir);
20
+ return null;
21
+ }
13
22
  return [...entry.memories.values()];
14
23
  }
15
- function setCachedMemories(baseDir, memories, version) {
24
+ function setCachedMemories(baseDir, memories, version, keyId = "", ttlMs = 0) {
16
25
  const map = /* @__PURE__ */ new Map();
17
26
  for (const m of memories) map.set(m.path, m);
18
- hotCacheByDir.set(baseDir, { memories: map, version, loadedAt: Date.now() });
27
+ const now = Date.now();
28
+ hotCacheByDir.set(baseDir, { memories: map, version, loadedAt: now, keyId, ttlMs });
29
+ sweepExpiredHotEntries(now);
19
30
  }
20
- function updateCacheOnWrite(baseDir, memory) {
31
+ function updateCacheOnWrite(baseDir, memory, keyId = "") {
21
32
  const entry = hotCacheByDir.get(baseDir);
22
- if (entry) entry.memories.set(memory.path, memory);
33
+ if (entry && entry.keyId === keyId) entry.memories.set(memory.path, memory);
23
34
  }
24
- function updateCacheOnDelete(baseDir, filePath) {
35
+ function updateCacheOnDelete(baseDir, filePath, keyId = "") {
25
36
  const entry = hotCacheByDir.get(baseDir);
26
- if (entry) entry.memories.delete(filePath);
37
+ if (entry && entry.keyId === keyId) entry.memories.delete(filePath);
27
38
  }
28
- function getCachedArchivedMemories(baseDir, currentVersion) {
39
+ function getCachedArchivedMemories(baseDir, currentVersion, keyId = "") {
29
40
  if (currentVersion === 0) return null;
30
41
  const entry = archiveCacheByDir.get(baseDir);
31
- if (!entry || entry.version !== currentVersion) return null;
42
+ if (!entry || entry.version !== currentVersion || entry.keyId !== keyId) return null;
32
43
  return [...entry.memories.values()];
33
44
  }
34
- function setCachedArchivedMemories(baseDir, memories, version) {
45
+ function setCachedArchivedMemories(baseDir, memories, version, keyId = "") {
35
46
  const map = /* @__PURE__ */ new Map();
36
47
  for (const m of memories) map.set(m.path, m);
37
- archiveCacheByDir.set(baseDir, { memories: map, version, loadedAt: Date.now() });
48
+ archiveCacheByDir.set(baseDir, { memories: map, version, loadedAt: Date.now(), keyId, ttlMs: 0 });
38
49
  }
39
50
  var entityCacheByDir = /* @__PURE__ */ new Map();
40
51
  function normalizeEntitySchemaKey(schemaKey) {
@@ -67,29 +78,37 @@ function invalidateCachedEntities(baseDir) {
67
78
  }
68
79
  var episodeMapByDir = /* @__PURE__ */ new Map();
69
80
  var ruleMemoriesByDir = /* @__PURE__ */ new Map();
70
- function getCachedEpisodeMap(baseDir, currentVersion) {
81
+ function getCachedEpisodeMap(baseDir, currentVersion, keyId = "", ttlMs = 0) {
71
82
  if (currentVersion === 0) return null;
72
83
  const entry = episodeMapByDir.get(baseDir);
73
- if (!entry || entry.sourceVersion !== currentVersion) return null;
84
+ if (!entry || entry.sourceVersion !== currentVersion || entry.keyId !== keyId) return null;
85
+ if (ttlMs > 0 && Date.now() - entry.loadedAt > ttlMs) {
86
+ episodeMapByDir.delete(baseDir);
87
+ return null;
88
+ }
74
89
  return entry.data;
75
90
  }
76
- function setCachedEpisodeMap(baseDir, memories, version) {
91
+ function setCachedEpisodeMap(baseDir, memories, version, cache = true, keyId = "") {
77
92
  const map = /* @__PURE__ */ new Map();
78
93
  for (const m of memories) {
79
94
  if (m.frontmatter.status === "archived" || m.frontmatter.status === "forgotten") continue;
80
95
  if (m.frontmatter.memoryKind !== "episode") continue;
81
96
  map.set(m.frontmatter.id, m);
82
97
  }
83
- episodeMapByDir.set(baseDir, { data: map, sourceVersion: version });
98
+ if (cache) episodeMapByDir.set(baseDir, { data: map, sourceVersion: version, keyId, loadedAt: Date.now() });
84
99
  return map;
85
100
  }
86
- function getCachedRuleMemories(baseDir, currentVersion) {
101
+ function getCachedRuleMemories(baseDir, currentVersion, keyId = "", ttlMs = 0) {
87
102
  if (currentVersion === 0) return null;
88
103
  const entry = ruleMemoriesByDir.get(baseDir);
89
- if (!entry || entry.sourceVersion !== currentVersion) return null;
104
+ if (!entry || entry.sourceVersion !== currentVersion || entry.keyId !== keyId) return null;
105
+ if (ttlMs > 0 && Date.now() - entry.loadedAt > ttlMs) {
106
+ ruleMemoriesByDir.delete(baseDir);
107
+ return null;
108
+ }
90
109
  return entry.data;
91
110
  }
92
- function setCachedRuleMemories(baseDir, memories, version) {
111
+ function setCachedRuleMemories(baseDir, memories, version, cache = true, keyId = "") {
93
112
  const byId = /* @__PURE__ */ new Map();
94
113
  const all = [];
95
114
  for (const m of memories) {
@@ -99,7 +118,7 @@ function setCachedRuleMemories(baseDir, memories, version) {
99
118
  }
100
119
  }
101
120
  const result = { all, byId };
102
- ruleMemoriesByDir.set(baseDir, { data: result, sourceVersion: version });
121
+ if (cache) ruleMemoriesByDir.set(baseDir, { data: result, sourceVersion: version, keyId, loadedAt: Date.now() });
103
122
  return result;
104
123
  }
105
124
  var QMD_CACHE_TTL_MS = 6e4;
@@ -184,6 +203,14 @@ function invalidateAllForDir(baseDir) {
184
203
  layer.invalidateForDir(baseDir);
185
204
  }
186
205
  }
206
+ function invalidateDerivedAndGlobalForDir(baseDir) {
207
+ for (const layer of ALL_CACHE_LAYERS) {
208
+ if (layer.name === "hot-memories" || layer.name === "entities" || layer.name === "archive-memories") {
209
+ continue;
210
+ }
211
+ layer.invalidateForDir(baseDir);
212
+ }
213
+ }
187
214
  function clearMemoryCache(baseDir) {
188
215
  if (baseDir) {
189
216
  invalidateAllForDir(baseDir);
@@ -222,7 +249,8 @@ export {
222
249
  setCachedQmdSearch,
223
250
  ALL_CACHE_LAYERS,
224
251
  invalidateAllForDir,
252
+ invalidateDerivedAndGlobalForDir,
225
253
  clearMemoryCache,
226
254
  getMemoryCacheStats
227
255
  };
228
- //# sourceMappingURL=chunk-AWJ2FHCF.js.map
256
+ //# sourceMappingURL=chunk-X47LWMKA.js.map