@remnic/core 9.4.0 → 9.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (329) hide show
  1. package/dist/access-admin-ops-surface.d.ts +5 -5
  2. package/dist/access-admin-ops-surface.js +22 -21
  3. package/dist/access-boundary.d.ts +5 -5
  4. package/dist/access-boundary.js +23 -22
  5. package/dist/access-cli.js +63 -62
  6. package/dist/access-cli.js.map +1 -1
  7. package/dist/access-http.d.ts +5 -5
  8. package/dist/access-http.js +31 -30
  9. package/dist/access-identity-continuity-surface.d.ts +4 -4
  10. package/dist/access-identity-continuity-surface.js +22 -21
  11. package/dist/access-lcm-surface.d.ts +5 -5
  12. package/dist/access-lcm-surface.js +22 -21
  13. package/dist/access-mcp.d.ts +5 -5
  14. package/dist/access-mcp.js +27 -26
  15. package/dist/access-observe-write-surface.d.ts +5 -5
  16. package/dist/access-observe-write-surface.js +22 -21
  17. package/dist/access-operations-batch.js +24 -23
  18. package/dist/access-operations.d.ts +9 -9
  19. package/dist/access-operations.js +26 -25
  20. package/dist/access-recall-surface.d.ts +5 -5
  21. package/dist/access-recall-surface.js +22 -21
  22. package/dist/access-schema.d.ts +68 -68
  23. package/dist/access-schema.js +3 -3
  24. package/dist/{access-service-CdW6B2qQ.d.ts → access-service-m-2VO_Ig.d.ts} +3 -3
  25. package/dist/access-service.d.ts +5 -5
  26. package/dist/access-service.js +22 -21
  27. package/dist/access-surface-catalog.d.ts +5 -5
  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-M47VTCFI.js → auto-sync-HMHQHUAG.js} +4 -4
  35. package/dist/behavior-learner.d.ts +1 -1
  36. package/dist/behavior-signals.d.ts +1 -1
  37. package/dist/bootstrap.d.ts +4 -4
  38. package/dist/briefing.d.ts +1 -1
  39. package/dist/briefing.js +5 -5
  40. package/dist/buffer-surprise-report.d.ts +1 -1
  41. package/dist/buffer.d.ts +1 -1
  42. package/dist/calibration.d.ts +1 -1
  43. package/dist/capabilities.d.ts +1 -1
  44. package/dist/{catalog-bflYNWsM.d.ts → catalog-BxWokdC2.d.ts} +1 -1
  45. package/dist/causal-behavior.d.ts +1 -1
  46. package/dist/causal-consolidation.d.ts +1 -1
  47. package/dist/causal-consolidation.js +6 -6
  48. package/dist/causal-trajectory-graph.d.ts +1 -1
  49. package/dist/{chunk-TKUQSXU4.js → chunk-27FLVMDC.js} +12 -12
  50. package/dist/{chunk-XXEOGY77.js → chunk-2FOD2YY3.js} +7 -7
  51. package/dist/{chunk-6Y4JTNX7.js → chunk-2MR3MFQB.js} +2 -2
  52. package/dist/{chunk-AU7Q3LSC.js → chunk-2QSZNTDO.js} +4 -4
  53. package/dist/{chunk-64ZYXSCO.js → chunk-2U2A5HF4.js} +10 -4
  54. package/dist/chunk-2U2A5HF4.js.map +1 -0
  55. package/dist/{chunk-RBGL4MKQ.js → chunk-3F4N4WDH.js} +75 -110
  56. package/dist/chunk-3F4N4WDH.js.map +1 -0
  57. package/dist/{chunk-4NMATTXV.js → chunk-4BFRBP45.js} +2 -2
  58. package/dist/{chunk-L4UZBJNM.js → chunk-4P4626RY.js} +4 -4
  59. package/dist/{chunk-XZJMIJLW.js → chunk-5QZDMSSN.js} +29 -29
  60. package/dist/chunk-64UDOIMI.js +121 -0
  61. package/dist/chunk-64UDOIMI.js.map +1 -0
  62. package/dist/{chunk-H2EJNV2Z.js → chunk-66FLU5BT.js} +2 -2
  63. package/dist/{chunk-MWH5MAFP.js → chunk-6BISDEN6.js} +5 -5
  64. package/dist/{chunk-VBVSN2TV.js → chunk-6ZIETXZ2.js} +2 -2
  65. package/dist/{chunk-42BBIR33.js → chunk-7N2RUBAP.js} +2 -2
  66. package/dist/{chunk-UQI2NHTY.js → chunk-7QWMTOIF.js} +37 -37
  67. package/dist/{chunk-QICQ35K5.js → chunk-7Z2DZNWN.js} +17 -8
  68. package/dist/{chunk-QICQ35K5.js.map → chunk-7Z2DZNWN.js.map} +1 -1
  69. package/dist/{chunk-JI5AVXYO.js → chunk-AKUCU7CI.js} +5 -5
  70. package/dist/{chunk-FT37KV7R.js → chunk-BGTAL46Y.js} +2 -2
  71. package/dist/{chunk-7VFZTJ7K.js → chunk-BV2TIZ4F.js} +2 -2
  72. package/dist/{chunk-FWPHPN3V.js → chunk-CLX5VDNY.js} +5 -5
  73. package/dist/{chunk-TH2KIPP7.js → chunk-CZAA5N5S.js} +2 -2
  74. package/dist/{chunk-7BAJAXGB.js → chunk-CZAZX7JP.js} +4 -4
  75. package/dist/{chunk-APMGGGTY.js → chunk-DGYCWCQ7.js} +2 -2
  76. package/dist/{chunk-GEVIE5NV.js → chunk-DR6PEJU3.js} +4 -4
  77. package/dist/{chunk-2TCZE3C2.js → chunk-EPGWWCZF.js} +2 -2
  78. package/dist/{chunk-OUXPVWTZ.js → chunk-FLVL4L3L.js} +5 -5
  79. package/dist/{chunk-YPL66L3U.js → chunk-FZGGZAAU.js} +2 -2
  80. package/dist/{chunk-XOE5DYQL.js → chunk-HRCACVHL.js} +2 -2
  81. package/dist/{chunk-KS4PRHRD.js → chunk-IC6QX5TC.js} +2 -2
  82. package/dist/{chunk-H25TAODC.js → chunk-ILFJ7AVS.js} +4 -4
  83. package/dist/{chunk-UQMCR5RW.js → chunk-JLR3JSTL.js} +3 -3
  84. package/dist/{chunk-5H56JAHW.js → chunk-KCJ5H6XQ.js} +2 -2
  85. package/dist/{chunk-H5IT5JL7.js → chunk-LOR6ZM5R.js} +3 -3
  86. package/dist/{chunk-VBBMTSOV.js → chunk-M7GGMGMZ.js} +6 -6
  87. package/dist/{chunk-G47FEGGK.js → chunk-NG7YBCJO.js} +4 -4
  88. package/dist/{chunk-QGS7Z7YU.js → chunk-OHDJ34CC.js} +2 -2
  89. package/dist/{chunk-UAOZJX5J.js → chunk-P6SYWE4G.js} +53 -6
  90. package/dist/chunk-P6SYWE4G.js.map +1 -0
  91. package/dist/{chunk-LLMZK53N.js → chunk-PUBTHW5O.js} +2 -2
  92. package/dist/{chunk-AGNBY3VG.js → chunk-PYHOAXTI.js} +2 -2
  93. package/dist/{chunk-SXN3LCUT.js → chunk-RHOZ5LLO.js} +100 -4
  94. package/dist/chunk-RHOZ5LLO.js.map +1 -0
  95. package/dist/{chunk-6KYMPV2O.js → chunk-RL6NEVXT.js} +45 -2
  96. package/dist/chunk-RL6NEVXT.js.map +1 -0
  97. package/dist/{chunk-7WV3F5DQ.js → chunk-V7IZKJI3.js} +2 -2
  98. package/dist/{chunk-IGF4DII6.js → chunk-X4A62ET7.js} +9 -9
  99. package/dist/{chunk-OH6BKCPB.js → chunk-XN3TUUX2.js} +2 -2
  100. package/dist/{chunk-5K5VEDFY.js → chunk-YDSWRD33.js} +4 -4
  101. package/dist/{chunk-ABGDGBDT.js → chunk-YPEMNNNY.js} +2 -2
  102. package/dist/{chunk-YM7IEUO7.js → chunk-ZPOROUTX.js} +2 -2
  103. package/dist/{cli-Dfnc66gs.d.ts → cli-EiBBOt3r.d.ts} +3 -3
  104. package/dist/cli.d.ts +6 -6
  105. package/dist/cli.js +51 -50
  106. package/dist/compounding/engine.d.ts +1 -1
  107. package/dist/compounding/engine.js +5 -5
  108. package/dist/compounding/preference-consolidator.d.ts +1 -1
  109. package/dist/compression-optimizer.d.ts +1 -1
  110. package/dist/config.d.ts +1 -1
  111. package/dist/config.js +1 -1
  112. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  113. package/dist/connectors/codex-materialize-runner.js +5 -5
  114. package/dist/connectors/codex-materialize.d.ts +1 -1
  115. package/dist/connectors/index.d.ts +1 -1
  116. package/dist/connectors/index.js +5 -5
  117. package/dist/consolidation-provenance-check.d.ts +1 -1
  118. package/dist/consolidation-undo.d.ts +1 -1
  119. package/dist/contradiction/index.d.ts +1 -1
  120. package/dist/conversation-index/backend.d.ts +1 -1
  121. package/dist/conversation-index/backend.js +2 -2
  122. package/dist/conversation-index/chunker.d.ts +1 -1
  123. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  124. package/dist/conversation-index/indexer.d.ts +1 -1
  125. package/dist/conversation-index/search.d.ts +1 -1
  126. package/dist/day-summary.d.ts +1 -1
  127. package/dist/delinearize.d.ts +1 -1
  128. package/dist/direct-answer-wiring.d.ts +1 -1
  129. package/dist/direct-answer.d.ts +1 -1
  130. package/dist/embedding-fallback.d.ts +1 -1
  131. package/dist/enrichment/index.d.ts +1 -1
  132. package/dist/entity-retrieval.d.ts +1 -1
  133. package/dist/entity-retrieval.js +5 -5
  134. package/dist/entity-schema.d.ts +1 -1
  135. package/dist/explicit-capture.d.ts +4 -4
  136. package/dist/extraction-faithfulness.d.ts +1 -1
  137. package/dist/extraction-judge-telemetry.d.ts +1 -1
  138. package/dist/extraction-judge-training.d.ts +1 -1
  139. package/dist/extraction-judge.d.ts +1 -1
  140. package/dist/extraction.d.ts +1 -1
  141. package/dist/fallback-llm.d.ts +1 -1
  142. package/dist/graph-dashboard-diff.d.ts +1 -1
  143. package/dist/graph-dashboard-key.d.ts +1 -1
  144. package/dist/graph-dashboard-parser.d.ts +1 -1
  145. package/dist/graph-edge-reinforcement.d.ts +1 -1
  146. package/dist/graph-snapshot.d.ts +1 -1
  147. package/dist/graph.d.ts +1 -1
  148. package/dist/identity-continuity.d.ts +1 -1
  149. package/dist/importance.d.ts +1 -1
  150. package/dist/index.d.ts +17 -12
  151. package/dist/index.js +79 -78
  152. package/dist/intent.d.ts +1 -1
  153. package/dist/lcm/engine.d.ts +1 -1
  154. package/dist/lcm/engine.js +4 -4
  155. package/dist/lcm/index.d.ts +1 -1
  156. package/dist/lcm/index.js +6 -6
  157. package/dist/lcm/schema.js +2 -2
  158. package/dist/lcm/tools.d.ts +1 -1
  159. package/dist/lifecycle.d.ts +1 -1
  160. package/dist/live-connectors-runner.d.ts +1 -1
  161. package/dist/local-llm.d.ts +1 -1
  162. package/dist/local-model-endpoint.d.ts +1 -1
  163. package/dist/maintenance/memory-governance.d.ts +1 -1
  164. package/dist/maintenance/memory-governance.js +5 -5
  165. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +5 -5
  166. package/dist/maintenance/rebuild-memory-projection.js +6 -6
  167. package/dist/mcp-memory-inspector-app.d.ts +5 -5
  168. package/dist/memory-action-policy.d.ts +1 -1
  169. package/dist/memory-cache.d.ts +1 -1
  170. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  171. package/dist/memory-projection-store.d.ts +23 -3
  172. package/dist/memory-projection-store.js +9 -2
  173. package/dist/memory-provenance.d.ts +1 -1
  174. package/dist/memory-worth-outcomes.d.ts +1 -1
  175. package/dist/models-json.d.ts +1 -1
  176. package/dist/namespaces/migrate.d.ts +2 -2
  177. package/dist/namespaces/migrate.js +17 -16
  178. package/dist/namespaces/principal.d.ts +1 -1
  179. package/dist/namespaces/search.d.ts +1 -1
  180. package/dist/namespaces/search.js +11 -10
  181. package/dist/namespaces/storage.d.ts +2 -2
  182. package/dist/namespaces/storage.js +5 -5
  183. package/dist/native-knowledge.d.ts +1 -1
  184. package/dist/operator-toolkit.d.ts +11 -2
  185. package/dist/operator-toolkit.js +23 -20
  186. package/dist/orchestration/compression-guideline-coordinator.d.ts +1 -1
  187. package/dist/orchestration/maintenance.d.ts +2 -2
  188. package/dist/orchestration/maintenance.js +7 -7
  189. package/dist/{orchestrator-Y9wyG4jK.d.ts → orchestrator-B2Y28Z9t.d.ts} +3 -3
  190. package/dist/orchestrator.d.ts +4 -4
  191. package/dist/orchestrator.js +63 -62
  192. package/dist/patterns-cli.d.ts +1 -1
  193. package/dist/policy-runtime.d.ts +1 -1
  194. package/dist/provenance.d.ts +1 -1
  195. package/dist/{purge-IHRX4Z7X.js → purge-NDWV6WYD.js} +4 -3
  196. package/dist/{purge-IHRX4Z7X.js.map → purge-NDWV6WYD.js.map} +1 -1
  197. package/dist/qmd-Db9mOkzB.d.ts +330 -0
  198. package/dist/qmd-preflight.d.ts +5 -0
  199. package/dist/qmd-preflight.js +31 -0
  200. package/dist/qmd-preflight.js.map +1 -0
  201. package/dist/qmd-recall-cache.d.ts +1 -1
  202. package/dist/qmd.d.ts +3 -305
  203. package/dist/qmd.js +10 -8
  204. package/dist/recall-disclosure-escalation.d.ts +1 -1
  205. package/dist/recall-explain-renderer.d.ts +1 -1
  206. package/dist/recall-planner-llm.d.ts +1 -1
  207. package/dist/recall-state.d.ts +1 -1
  208. package/dist/recall-tag-filter.d.ts +1 -1
  209. package/dist/recall-timings.d.ts +1 -1
  210. package/dist/recall-xray-cli.d.ts +1 -1
  211. package/dist/recall-xray-renderer.d.ts +1 -1
  212. package/dist/recall-xray.d.ts +1 -1
  213. package/dist/resolve-auth-token.d.ts +1 -1
  214. package/dist/resume-bundles.js +2 -2
  215. package/dist/retrieval-agents.d.ts +2 -2
  216. package/dist/retrieval-tiers.d.ts +1 -1
  217. package/dist/routing/engine.d.ts +1 -1
  218. package/dist/routing/store.d.ts +1 -1
  219. package/dist/runtime/better-sqlite.d.ts +17 -1
  220. package/dist/runtime/better-sqlite.js +5 -3
  221. package/dist/schemas.d.ts +62 -62
  222. package/dist/search/embed-helper.d.ts +1 -1
  223. package/dist/search/factory.d.ts +1 -1
  224. package/dist/search/factory.js +10 -9
  225. package/dist/search/index.d.ts +1 -1
  226. package/dist/search/index.js +15 -14
  227. package/dist/search/lancedb-backend.d.ts +1 -1
  228. package/dist/search/lancedb-backend.js +2 -2
  229. package/dist/search/meilisearch-backend.d.ts +1 -1
  230. package/dist/search/meilisearch-backend.js +2 -2
  231. package/dist/search/noop-backend.d.ts +1 -1
  232. package/dist/search/orama-backend.d.ts +1 -1
  233. package/dist/search/orama-backend.js +2 -2
  234. package/dist/search/port.d.ts +1 -1
  235. package/dist/search/remote-backend.d.ts +1 -1
  236. package/dist/{semantic-consolidation-bfXJNKVf.d.ts → semantic-consolidation-BDVIbLRw.d.ts} +1 -1
  237. package/dist/semantic-consolidation.d.ts +2 -2
  238. package/dist/semantic-consolidation.js +6 -6
  239. package/dist/semantic-rule-promotion.js +5 -5
  240. package/dist/semantic-rule-verifier.d.ts +1 -1
  241. package/dist/semantic-rule-verifier.js +5 -5
  242. package/dist/session-observer-bands.d.ts +1 -1
  243. package/dist/session-observer-state.d.ts +1 -1
  244. package/dist/session-transcript-migration.js +2 -2
  245. package/dist/shared-context/manager.d.ts +9 -9
  246. package/dist/signal.d.ts +1 -1
  247. package/dist/storage.d.ts +1 -1
  248. package/dist/storage.js +4 -4
  249. package/dist/summarizer.d.ts +1 -1
  250. package/dist/summary-snapshot.d.ts +1 -1
  251. package/dist/temporal-supersession.d.ts +1 -1
  252. package/dist/temporal-validity.d.ts +1 -1
  253. package/dist/threading.d.ts +1 -1
  254. package/dist/tier-migration.d.ts +1 -1
  255. package/dist/tier-routing.d.ts +1 -1
  256. package/dist/topics.d.ts +1 -1
  257. package/dist/transcript.d.ts +1 -1
  258. package/dist/transfer/autodetect.js +1 -1
  259. package/dist/transfer/backup.js +1 -1
  260. package/dist/transfer/capsule-export.js +2 -2
  261. package/dist/transfer/export-sqlite.js +2 -2
  262. package/dist/transfer/import-sqlite.js +2 -2
  263. package/dist/transfer/types.d.ts +66 -66
  264. package/dist/trust-score-stage.d.ts +1 -1
  265. package/dist/trust-score.d.ts +1 -1
  266. package/dist/{types-D1iBqhJA.d.ts → types-ljkd82rn.d.ts} +13 -1
  267. package/dist/types.d.ts +1 -1
  268. package/dist/utility-runtime.d.ts +1 -1
  269. package/dist/verified-recall.js +5 -5
  270. package/package.json +2 -2
  271. package/src/memory-projection-open-failure.test.ts +322 -0
  272. package/src/memory-projection-store.ts +179 -2
  273. package/src/operator-toolkit.ts +64 -0
  274. package/src/qmd-preflight.test.ts +197 -0
  275. package/src/qmd-preflight.ts +167 -0
  276. package/src/qmd.ts +115 -129
  277. package/src/runtime/better-sqlite.test.ts +54 -0
  278. package/src/runtime/better-sqlite.ts +83 -3
  279. package/src/wearables/cleanup.test.ts +56 -0
  280. package/src/wearables/cleanup.ts +22 -1
  281. package/src/wearables/config.test.ts +25 -0
  282. package/src/wearables/config.ts +31 -4
  283. package/src/wearables/types.ts +12 -1
  284. package/dist/chunk-64ZYXSCO.js.map +0 -1
  285. package/dist/chunk-6KYMPV2O.js.map +0 -1
  286. package/dist/chunk-RBGL4MKQ.js.map +0 -1
  287. package/dist/chunk-SXN3LCUT.js.map +0 -1
  288. package/dist/chunk-UAOZJX5J.js.map +0 -1
  289. /package/dist/{auto-sync-M47VTCFI.js.map → auto-sync-HMHQHUAG.js.map} +0 -0
  290. /package/dist/{chunk-TKUQSXU4.js.map → chunk-27FLVMDC.js.map} +0 -0
  291. /package/dist/{chunk-XXEOGY77.js.map → chunk-2FOD2YY3.js.map} +0 -0
  292. /package/dist/{chunk-6Y4JTNX7.js.map → chunk-2MR3MFQB.js.map} +0 -0
  293. /package/dist/{chunk-AU7Q3LSC.js.map → chunk-2QSZNTDO.js.map} +0 -0
  294. /package/dist/{chunk-4NMATTXV.js.map → chunk-4BFRBP45.js.map} +0 -0
  295. /package/dist/{chunk-L4UZBJNM.js.map → chunk-4P4626RY.js.map} +0 -0
  296. /package/dist/{chunk-XZJMIJLW.js.map → chunk-5QZDMSSN.js.map} +0 -0
  297. /package/dist/{chunk-H2EJNV2Z.js.map → chunk-66FLU5BT.js.map} +0 -0
  298. /package/dist/{chunk-MWH5MAFP.js.map → chunk-6BISDEN6.js.map} +0 -0
  299. /package/dist/{chunk-VBVSN2TV.js.map → chunk-6ZIETXZ2.js.map} +0 -0
  300. /package/dist/{chunk-42BBIR33.js.map → chunk-7N2RUBAP.js.map} +0 -0
  301. /package/dist/{chunk-UQI2NHTY.js.map → chunk-7QWMTOIF.js.map} +0 -0
  302. /package/dist/{chunk-JI5AVXYO.js.map → chunk-AKUCU7CI.js.map} +0 -0
  303. /package/dist/{chunk-FT37KV7R.js.map → chunk-BGTAL46Y.js.map} +0 -0
  304. /package/dist/{chunk-7VFZTJ7K.js.map → chunk-BV2TIZ4F.js.map} +0 -0
  305. /package/dist/{chunk-FWPHPN3V.js.map → chunk-CLX5VDNY.js.map} +0 -0
  306. /package/dist/{chunk-TH2KIPP7.js.map → chunk-CZAA5N5S.js.map} +0 -0
  307. /package/dist/{chunk-7BAJAXGB.js.map → chunk-CZAZX7JP.js.map} +0 -0
  308. /package/dist/{chunk-APMGGGTY.js.map → chunk-DGYCWCQ7.js.map} +0 -0
  309. /package/dist/{chunk-GEVIE5NV.js.map → chunk-DR6PEJU3.js.map} +0 -0
  310. /package/dist/{chunk-2TCZE3C2.js.map → chunk-EPGWWCZF.js.map} +0 -0
  311. /package/dist/{chunk-OUXPVWTZ.js.map → chunk-FLVL4L3L.js.map} +0 -0
  312. /package/dist/{chunk-YPL66L3U.js.map → chunk-FZGGZAAU.js.map} +0 -0
  313. /package/dist/{chunk-XOE5DYQL.js.map → chunk-HRCACVHL.js.map} +0 -0
  314. /package/dist/{chunk-KS4PRHRD.js.map → chunk-IC6QX5TC.js.map} +0 -0
  315. /package/dist/{chunk-H25TAODC.js.map → chunk-ILFJ7AVS.js.map} +0 -0
  316. /package/dist/{chunk-UQMCR5RW.js.map → chunk-JLR3JSTL.js.map} +0 -0
  317. /package/dist/{chunk-5H56JAHW.js.map → chunk-KCJ5H6XQ.js.map} +0 -0
  318. /package/dist/{chunk-H5IT5JL7.js.map → chunk-LOR6ZM5R.js.map} +0 -0
  319. /package/dist/{chunk-VBBMTSOV.js.map → chunk-M7GGMGMZ.js.map} +0 -0
  320. /package/dist/{chunk-G47FEGGK.js.map → chunk-NG7YBCJO.js.map} +0 -0
  321. /package/dist/{chunk-QGS7Z7YU.js.map → chunk-OHDJ34CC.js.map} +0 -0
  322. /package/dist/{chunk-LLMZK53N.js.map → chunk-PUBTHW5O.js.map} +0 -0
  323. /package/dist/{chunk-AGNBY3VG.js.map → chunk-PYHOAXTI.js.map} +0 -0
  324. /package/dist/{chunk-7WV3F5DQ.js.map → chunk-V7IZKJI3.js.map} +0 -0
  325. /package/dist/{chunk-IGF4DII6.js.map → chunk-X4A62ET7.js.map} +0 -0
  326. /package/dist/{chunk-OH6BKCPB.js.map → chunk-XN3TUUX2.js.map} +0 -0
  327. /package/dist/{chunk-5K5VEDFY.js.map → chunk-YDSWRD33.js.map} +0 -0
  328. /package/dist/{chunk-ABGDGBDT.js.map → chunk-YPEMNNNY.js.map} +0 -0
  329. /package/dist/{chunk-YM7IEUO7.js.map → chunk-ZPOROUTX.js.map} +0 -0
@@ -8,7 +8,7 @@ import './summarizer.js';
8
8
  import './local-llm.js';
9
9
  import './fallback-llm.js';
10
10
  import './orchestration/maintenance.js';
11
- export { Q as BulkImportBatchIngestResult, T as BulkImportBatchPartialFailureError, U as COMPACTION_SIGNAL_MAX_AGE_MS, V as DaySummaryGatherOptions, X as ExtractionRunResult, Y as GraphRecallRankedResult, Z as GraphRecallShadowComparison, G as GraphRecallSnapshot, I as IntentDebugSnapshot, O as Orchestrator, _ as QmdRecallSnapshot, $ as QueryAwarePrefilter, a0 as RecallInvocationOptions, a1 as RecallModeDecision, a2 as appendMemoryToGraphContext, a3 as applyQueryAwareCandidateFilter, a4 as blendGraphExpandedRecallScore, a5 as buildCompressionGuidelinesMarkdown, a6 as buildMemoryPathById, a7 as computeArtifactCandidateFetchLimit, a8 as computeArtifactRecallLimit, a9 as computeQmdHybridFetchLimit, t as defaultWorkspaceDir, aa as deriveTopicsFromExtraction, ab as filterHourlySummaryMarkdownForLocalDay, ac as filterRecallCandidates, ad as formatDateInTimeZone, ae as graphPathRelativeToStorage, af as hasIdentityRecoveryIntent, ag as isArtifactMemoryPath, ah as lifecycleRecallScoreAdjustment, ai as mapRecallSourceToXrayServedBy, aj as mergeArtifactRecallCandidates, ak as mergeGraphExpandedResults, al as normalizeIanaTimeZone, am as parseFiniteDate, an as parseGraphRecallRankedResults, ao as parseMemoryIntentSnapshot, ap as parseQmdRecallResults, aq as qmdStartupCollectionCheckWithTimeout, ar as raceRecallAbort, as as resolveEffectiveIdentityInjectionMode, at as resolveEffectiveRecallMode, au as resolvePersistedMemoryRelativePath, av as resolveRecallModeDecision, aw as resolveRecallModeDecisionAsync, ax as resolveRecentThreadMemoryPaths, E as sanitizeSessionKeyForFilename, ay as shouldFilterLifecycleRecallCandidate, az as splitTurnsBySourceValidAt, aA as summarizeGraphShadowComparison, aB as targetSourceValidAtSortMs, aC as throwIfRecallAborted, aD as tokenizeRecallQuery, aE as utcDateKeysForLocalDay } from './orchestrator-Y9wyG4jK.js';
11
+ export { Q as BulkImportBatchIngestResult, T as BulkImportBatchPartialFailureError, U as COMPACTION_SIGNAL_MAX_AGE_MS, V as DaySummaryGatherOptions, X as ExtractionRunResult, Y as GraphRecallRankedResult, Z as GraphRecallShadowComparison, G as GraphRecallSnapshot, I as IntentDebugSnapshot, O as Orchestrator, _ as QmdRecallSnapshot, $ as QueryAwarePrefilter, a0 as RecallInvocationOptions, a1 as RecallModeDecision, a2 as appendMemoryToGraphContext, a3 as applyQueryAwareCandidateFilter, a4 as blendGraphExpandedRecallScore, a5 as buildCompressionGuidelinesMarkdown, a6 as buildMemoryPathById, a7 as computeArtifactCandidateFetchLimit, a8 as computeArtifactRecallLimit, a9 as computeQmdHybridFetchLimit, t as defaultWorkspaceDir, aa as deriveTopicsFromExtraction, ab as filterHourlySummaryMarkdownForLocalDay, ac as filterRecallCandidates, ad as formatDateInTimeZone, ae as graphPathRelativeToStorage, af as hasIdentityRecoveryIntent, ag as isArtifactMemoryPath, ah as lifecycleRecallScoreAdjustment, ai as mapRecallSourceToXrayServedBy, aj as mergeArtifactRecallCandidates, ak as mergeGraphExpandedResults, al as normalizeIanaTimeZone, am as parseFiniteDate, an as parseGraphRecallRankedResults, ao as parseMemoryIntentSnapshot, ap as parseQmdRecallResults, aq as qmdStartupCollectionCheckWithTimeout, ar as raceRecallAbort, as as resolveEffectiveIdentityInjectionMode, at as resolveEffectiveRecallMode, au as resolvePersistedMemoryRelativePath, av as resolveRecallModeDecision, aw as resolveRecallModeDecisionAsync, ax as resolveRecentThreadMemoryPaths, E as sanitizeSessionKeyForFilename, ay as shouldFilterLifecycleRecallCandidate, az as splitTurnsBySourceValidAt, aA as summarizeGraphShadowComparison, aB as targetSourceValidAtSortMs, aC as throwIfRecallAborted, aD as tokenizeRecallQuery, aE as utcDateKeysForLocalDay } from './orchestrator-B2Y28Z9t.js';
12
12
  export { formatCompressionGuidelinesForRecall } from './orchestration/compression-guideline-coordinator.js';
13
13
  import './live-connectors-runner.js';
14
14
  import './model-registry.js';
@@ -22,10 +22,10 @@ import './semantic-DJR8_DMQ.js';
22
22
  import './replay/types.js';
23
23
  import './types-gb_SNtjR.js';
24
24
  import './lcm/engine.js';
25
- import './semantic-consolidation-bfXJNKVf.js';
25
+ import './semantic-consolidation-BDVIbLRw.js';
26
26
  import './conversation-index/backend.js';
27
- import './catalog-bflYNWsM.js';
28
- import './types-D1iBqhJA.js';
27
+ import './catalog-BxWokdC2.js';
28
+ import './types-ljkd82rn.js';
29
29
  import './namespaces/search.js';
30
30
  import './shared-context/manager.js';
31
31
  import './compounding/engine.js';
@@ -43,12 +43,12 @@ import {
43
43
  throwIfRecallAborted,
44
44
  tokenizeRecallQuery,
45
45
  utcDateKeysForLocalDay
46
- } from "./chunk-XZJMIJLW.js";
47
- import "./chunk-64ZYXSCO.js";
46
+ } from "./chunk-5QZDMSSN.js";
47
+ import "./chunk-2U2A5HF4.js";
48
48
  import {
49
49
  formatCompressionGuidelinesForRecall
50
50
  } from "./chunk-BRDJ2HFP.js";
51
- import "./chunk-VBVSN2TV.js";
51
+ import "./chunk-6ZIETXZ2.js";
52
52
  import "./chunk-I74SUMNI.js";
53
53
  import "./chunk-ILNPU5W5.js";
54
54
  import "./chunk-7HYPN2GC.js";
@@ -57,20 +57,21 @@ import "./chunk-KBL3JJR6.js";
57
57
  import "./chunk-ABP6QMVM.js";
58
58
  import "./chunk-HHLLAQGZ.js";
59
59
  import "./chunk-UWK5OXUJ.js";
60
- import "./chunk-FWPHPN3V.js";
61
- import "./chunk-42BBIR33.js";
60
+ import "./chunk-CLX5VDNY.js";
61
+ import "./chunk-KCYE2MZM.js";
62
+ import "./chunk-7N2RUBAP.js";
62
63
  import "./chunk-MTR7BZQN.js";
63
64
  import "./chunk-O7BBFJLP.js";
64
65
  import "./chunk-7N4KAIGN.js";
65
66
  import "./chunk-TPDBFYEG.js";
66
- import "./chunk-KCYE2MZM.js";
67
67
  import "./chunk-CGS7UKWM.js";
68
68
  import "./chunk-V5OCT34X.js";
69
69
  import "./chunk-TECVW3JP.js";
70
70
  import "./chunk-RP7YXA67.js";
71
- import "./chunk-TH2KIPP7.js";
71
+ import "./chunk-CZAA5N5S.js";
72
72
  import "./chunk-UI4FVU6T.js";
73
73
  import "./chunk-LXOM6IQU.js";
74
+ import "./chunk-E2SPGGUI.js";
74
75
  import "./chunk-UHGBNIOS.js";
75
76
  import "./chunk-BCDKBDSY.js";
76
77
  import "./chunk-YN2UN7N3.js";
@@ -78,7 +79,6 @@ import "./chunk-4EX5WZ4M.js";
78
79
  import "./chunk-VOUOLGIP.js";
79
80
  import "./chunk-S75M5ZRK.js";
80
81
  import "./chunk-ECZU5BJH.js";
81
- import "./chunk-E2SPGGUI.js";
82
82
  import "./chunk-XZ5I7OZR.js";
83
83
  import "./chunk-3FAMU5TX.js";
84
84
  import "./chunk-4SBW47WK.js";
@@ -90,10 +90,10 @@ import "./chunk-5IZL4DCV.js";
90
90
  import "./chunk-X7XN6YU4.js";
91
91
  import "./chunk-2IZAGAJR.js";
92
92
  import "./chunk-E3VODCC3.js";
93
+ import "./chunk-YDBIWGNI.js";
93
94
  import "./chunk-JZHHREBL.js";
94
95
  import "./chunk-E5BK6CGV.js";
95
96
  import "./chunk-ZZTOURJI.js";
96
- import "./chunk-YDBIWGNI.js";
97
97
  import "./chunk-3GPTTA4J.js";
98
98
  import "./chunk-IISBCCWR.js";
99
99
  import "./chunk-A3GOMRJG.js";
@@ -124,55 +124,55 @@ import "./chunk-VEWZZM3H.js";
124
124
  import "./chunk-Q6IP2ARR.js";
125
125
  import "./chunk-6HEM6HTQ.js";
126
126
  import "./chunk-O2EL7EGG.js";
127
- import "./chunk-YM7IEUO7.js";
128
- import "./chunk-UQI2NHTY.js";
127
+ import "./chunk-ZPOROUTX.js";
128
+ import "./chunk-7QWMTOIF.js";
129
129
  import "./chunk-MC4FJXPA.js";
130
130
  import "./chunk-LQHDIS7L.js";
131
131
  import "./chunk-7F7Z6MOS.js";
132
132
  import "./chunk-JJEJJ7RK.js";
133
+ import "./chunk-PYHOAXTI.js";
133
134
  import "./chunk-UP6MOYCB.js";
134
- import "./chunk-7VFZTJ7K.js";
135
- import "./chunk-HDDRVXX4.js";
136
- import "./chunk-AGNBY3VG.js";
135
+ import "./chunk-BV2TIZ4F.js";
137
136
  import "./chunk-Z734BLO3.js";
137
+ import "./chunk-HDDRVXX4.js";
138
138
  import "./chunk-OZKVVUJB.js";
139
139
  import "./chunk-2DL3OFLD.js";
140
140
  import "./chunk-G4IAEX6D.js";
141
141
  import "./chunk-2BFLDH5F.js";
142
142
  import "./chunk-765K3SAT.js";
143
+ import "./chunk-HOJZMQ4J.js";
144
+ import "./chunk-2PRQG7PV.js";
143
145
  import "./chunk-KQPJLK3X.js";
144
146
  import "./chunk-EEC4PCG5.js";
145
147
  import "./chunk-PYIFUBRK.js";
146
- import "./chunk-HOJZMQ4J.js";
147
- import "./chunk-2PRQG7PV.js";
148
- import "./chunk-XOE5DYQL.js";
149
- import "./chunk-MWH5MAFP.js";
148
+ import "./chunk-D6RIFG4O.js";
149
+ import "./chunk-HRCACVHL.js";
150
+ import "./chunk-6BISDEN6.js";
150
151
  import "./chunk-LZZNTPLR.js";
152
+ import "./chunk-JCK7V6SN.js";
151
153
  import "./chunk-WMWVO45V.js";
152
154
  import "./chunk-KJTKLXTH.js";
153
- import "./chunk-D6RIFG4O.js";
154
- import "./chunk-JCK7V6SN.js";
155
155
  import "./chunk-GQL52GQ5.js";
156
156
  import "./chunk-CKITWVWJ.js";
157
157
  import "./chunk-OUELRE5E.js";
158
- import "./chunk-H2EJNV2Z.js";
159
158
  import "./chunk-2F6NP3NT.js";
160
159
  import "./chunk-TERNBNJB.js";
160
+ import "./chunk-66FLU5BT.js";
161
161
  import "./chunk-DBRYEIGY.js";
162
- import "./chunk-QGS7Z7YU.js";
163
- import "./chunk-ABGDGBDT.js";
164
- import "./chunk-OH6BKCPB.js";
162
+ import "./chunk-OHDJ34CC.js";
163
+ import "./chunk-YPEMNNNY.js";
164
+ import "./chunk-TGQ2NTWH.js";
165
+ import "./chunk-XN3TUUX2.js";
165
166
  import "./chunk-ZRWB5D4H.js";
166
167
  import "./chunk-5EZXHU36.js";
167
168
  import "./chunk-DANV2HTH.js";
168
- import "./chunk-TGQ2NTWH.js";
169
169
  import "./chunk-SFQ6QNL7.js";
170
170
  import "./chunk-3T74IZB3.js";
171
171
  import "./chunk-33JBK2XP.js";
172
- import "./chunk-UAOZJX5J.js";
173
- import "./chunk-H5IT5JL7.js";
174
- import "./chunk-UQMCR5RW.js";
175
- import "./chunk-FT37KV7R.js";
172
+ import "./chunk-P6SYWE4G.js";
173
+ import "./chunk-LOR6ZM5R.js";
174
+ import "./chunk-JLR3JSTL.js";
175
+ import "./chunk-BGTAL46Y.js";
176
176
  import "./chunk-KFY3SGN7.js";
177
177
  import "./chunk-CMTINOFS.js";
178
178
  import "./chunk-HL4DB7TO.js";
@@ -193,8 +193,8 @@ import "./chunk-Y4Z4I6WK.js";
193
193
  import "./chunk-LMDRGRJ2.js";
194
194
  import "./chunk-OD4FM2U7.js";
195
195
  import "./chunk-3I4FUAVJ.js";
196
- import "./chunk-2TCZE3C2.js";
197
- import "./chunk-5H56JAHW.js";
196
+ import "./chunk-EPGWWCZF.js";
197
+ import "./chunk-KCJ5H6XQ.js";
198
198
  import "./chunk-QLULYKWZ.js";
199
199
  import "./chunk-JLNBQWZ2.js";
200
200
  import "./chunk-3UXOZBHV.js";
@@ -208,7 +208,7 @@ import "./chunk-UQ7RN5HK.js";
208
208
  import "./chunk-F53UF7CI.js";
209
209
  import "./chunk-H3FZVNRN.js";
210
210
  import "./chunk-PI23H7FV.js";
211
- import "./chunk-QICQ35K5.js";
211
+ import "./chunk-7Z2DZNWN.js";
212
212
  import "./chunk-NDAH7BJ5.js";
213
213
  import "./chunk-Z5LAYHGJ.js";
214
214
  import "./chunk-G6NKALRN.js";
@@ -216,21 +216,21 @@ import "./chunk-OO42R444.js";
216
216
  import "./chunk-K6MV3TRQ.js";
217
217
  import "./chunk-LBJBNWS2.js";
218
218
  import "./chunk-OADWQ5CR.js";
219
- import "./chunk-XXEOGY77.js";
220
- import "./chunk-7WV3F5DQ.js";
219
+ import "./chunk-2FOD2YY3.js";
220
+ import "./chunk-V7IZKJI3.js";
221
221
  import "./chunk-SEDEKFYQ.js";
222
- import "./chunk-AU7Q3LSC.js";
222
+ import "./chunk-2QSZNTDO.js";
223
+ import "./chunk-RSUYKGGZ.js";
223
224
  import "./chunk-42NQ7AVG.js";
224
225
  import "./chunk-TMSXWOBZ.js";
225
226
  import "./chunk-J64TK33U.js";
226
- import "./chunk-RSUYKGGZ.js";
227
227
  import "./chunk-7RXCMVFQ.js";
228
- import "./chunk-GEVIE5NV.js";
228
+ import "./chunk-DR6PEJU3.js";
229
229
  import "./chunk-D24OXEPB.js";
230
230
  import "./chunk-5RUE3GHQ.js";
231
- import "./chunk-G47FEGGK.js";
232
- import "./chunk-6Y4JTNX7.js";
233
- import "./chunk-H25TAODC.js";
231
+ import "./chunk-NG7YBCJO.js";
232
+ import "./chunk-2MR3MFQB.js";
233
+ import "./chunk-ILFJ7AVS.js";
234
234
  import "./chunk-YF6FMLBT.js";
235
235
  import "./chunk-HLTAPHZZ.js";
236
236
  import "./chunk-PRTA6444.js";
@@ -238,16 +238,16 @@ import "./chunk-KQDNAXOM.js";
238
238
  import "./chunk-35NN3ZFA.js";
239
239
  import "./chunk-FTYDWKO6.js";
240
240
  import "./chunk-T4WDJPEZ.js";
241
- import "./chunk-YPL66L3U.js";
242
- import "./chunk-IGF4DII6.js";
241
+ import "./chunk-FZGGZAAU.js";
242
+ import "./chunk-X4A62ET7.js";
243
243
  import "./chunk-GDASG7NC.js";
244
244
  import "./chunk-GDB4J2H3.js";
245
- import "./chunk-64SE4X5G.js";
246
245
  import "./chunk-M5QKGHCR.js";
246
+ import "./chunk-64SE4X5G.js";
247
247
  import "./chunk-VQ7B2Q6M.js";
248
248
  import "./chunk-ERA5RSMZ.js";
249
249
  import "./chunk-JGSKJHF7.js";
250
- import "./chunk-LLMZK53N.js";
250
+ import "./chunk-PUBTHW5O.js";
251
251
  import "./chunk-S4DDLTPX.js";
252
252
  import "./chunk-FF4KLI5W.js";
253
253
  import "./chunk-BT7NVCML.js";
@@ -259,24 +259,25 @@ import "./chunk-ICP53SKG.js";
259
259
  import "./chunk-AQEJKOKI.js";
260
260
  import "./chunk-6HMYUWXR.js";
261
261
  import "./chunk-BAVVI5GP.js";
262
- import "./chunk-4NMATTXV.js";
263
- import "./chunk-TKUQSXU4.js";
264
- import "./chunk-5K5VEDFY.js";
265
- import "./chunk-L4UZBJNM.js";
266
- import "./chunk-CYEPCZN5.js";
267
- import "./chunk-7BAJAXGB.js";
262
+ import "./chunk-4BFRBP45.js";
263
+ import "./chunk-27FLVMDC.js";
268
264
  import "./chunk-ZIDSD6VC.js";
269
- import "./chunk-AER6MT24.js";
270
265
  import "./chunk-QWGNDWKB.js";
266
+ import "./chunk-YDSWRD33.js";
267
+ import "./chunk-4P4626RY.js";
268
+ import "./chunk-CYEPCZN5.js";
269
+ import "./chunk-CZAZX7JP.js";
271
270
  import "./chunk-CINZGPSJ.js";
271
+ import "./chunk-AER6MT24.js";
272
272
  import "./chunk-EGGE52UU.js";
273
- import "./chunk-KS4PRHRD.js";
274
- import "./chunk-JI5AVXYO.js";
273
+ import "./chunk-IC6QX5TC.js";
274
+ import "./chunk-AKUCU7CI.js";
275
+ import "./chunk-FC77VUX5.js";
275
276
  import "./chunk-TN7THW5U.js";
276
277
  import "./chunk-R5VAVVHP.js";
277
- import "./chunk-FC77VUX5.js";
278
- import "./chunk-RBGL4MKQ.js";
278
+ import "./chunk-3F4N4WDH.js";
279
279
  import "./chunk-WU46YPY6.js";
280
+ import "./chunk-64UDOIMI.js";
280
281
  import "./chunk-EIR5VLIH.js";
281
282
  import "./chunk-HG32URJJ.js";
282
283
  import "./chunk-EI6V5UXY.js";
@@ -291,10 +292,10 @@ import "./chunk-OBMR4VIX.js";
291
292
  import "./chunk-2LSZVONP.js";
292
293
  import "./chunk-DEUNUKTD.js";
293
294
  import "./chunk-CXLNZXG5.js";
294
- import "./chunk-APMGGGTY.js";
295
- import "./chunk-VBBMTSOV.js";
296
- import "./chunk-L2B3EE7B.js";
295
+ import "./chunk-DGYCWCQ7.js";
296
+ import "./chunk-M7GGMGMZ.js";
297
297
  import "./chunk-M7XQSUBB.js";
298
+ import "./chunk-L2B3EE7B.js";
298
299
  import "./chunk-5UZXUTVO.js";
299
300
  import "./chunk-5GPPACXK.js";
300
301
  import "./chunk-EHK6KZHK.js";
@@ -308,8 +309,8 @@ import "./chunk-AWJ2FHCF.js";
308
309
  import "./chunk-42JKGUFJ.js";
309
310
  import "./chunk-RULE4VG5.js";
310
311
  import "./chunk-SCU65EZI.js";
311
- import "./chunk-SXN3LCUT.js";
312
- import "./chunk-6KYMPV2O.js";
312
+ import "./chunk-RHOZ5LLO.js";
313
+ import "./chunk-RL6NEVXT.js";
313
314
  import "./chunk-DM2T26WE.js";
314
315
  import "./chunk-LDXUBPMO.js";
315
316
  import "./chunk-MNUHL34L.js";
@@ -323,13 +324,13 @@ import "./chunk-L2EXJQJP.js";
323
324
  import "./chunk-VFSP73LP.js";
324
325
  import "./chunk-RGMVMVMF.js";
325
326
  import "./chunk-N7RWREIQ.js";
326
- import "./chunk-OUXPVWTZ.js";
327
- import "./chunk-J4EB7DNW.js";
327
+ import "./chunk-FLVL4L3L.js";
328
328
  import "./chunk-WEHSQBFR.js";
329
329
  import "./chunk-437S3G37.js";
330
330
  import "./chunk-GWTFLF2P.js";
331
331
  import "./chunk-UKJAGEXH.js";
332
332
  import "./chunk-FP2373TW.js";
333
+ import "./chunk-J4EB7DNW.js";
333
334
  import "./chunk-Z2YFLXHU.js";
334
335
  import "./chunk-I4WBNM3M.js";
335
336
  import "./chunk-SOAU2OE2.js";
@@ -1,4 +1,4 @@
1
- import { h as MemoryCategory, M as MemoryFile } from './types-D1iBqhJA.js';
1
+ import { h as MemoryCategory, M as MemoryFile } from './types-ljkd82rn.js';
2
2
  import './types-gb_SNtjR.js';
3
3
  import './message-parts/index.js';
4
4
 
@@ -1,4 +1,4 @@
1
- import { P as PluginConfig, g as BehaviorLoopPolicyState } from './types-D1iBqhJA.js';
1
+ import { P as PluginConfig, g as BehaviorLoopPolicyState } from './types-ljkd82rn.js';
2
2
  import './types-gb_SNtjR.js';
3
3
  import './message-parts/index.js';
4
4
 
@@ -1,4 +1,4 @@
1
- import { J as ProvenanceSource, an as ProvenanceConfig, q as MemoryFrontmatter } from './types-D1iBqhJA.js';
1
+ import { J as ProvenanceSource, am as ProvenanceConfig, q as MemoryFrontmatter } from './types-ljkd82rn.js';
2
2
  import './types-gb_SNtjR.js';
3
3
  import './message-parts/index.js';
4
4
 
@@ -1,7 +1,8 @@
1
1
  import {
2
2
  markProjectedMemoryPathInvalid
3
- } from "./chunk-SXN3LCUT.js";
4
- import "./chunk-6KYMPV2O.js";
3
+ } from "./chunk-RHOZ5LLO.js";
4
+ import "./chunk-RL6NEVXT.js";
5
+ import "./chunk-37CTGERM.js";
5
6
  import "./chunk-PZ5AY32C.js";
6
7
 
7
8
  // src/maintenance/purge.ts
@@ -208,4 +209,4 @@ async function purgeMemories(options) {
208
209
  export {
209
210
  purgeMemories
210
211
  };
211
- //# sourceMappingURL=purge-IHRX4Z7X.js.map
212
+ //# sourceMappingURL=purge-NDWV6WYD.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/maintenance/purge.ts"],"sourcesContent":["/**\n * Operator-facing bulk hard-delete (issue #686 retention-completion).\n *\n * `purgeMemories(opts)` hard-deletes memories that are:\n * - older than `olderThanMs` (measured against `updated ?? created`), AND\n * - in the specified tier (`\"cold\"` or `\"all\"`), AND\n * - optionally in `status: \"forgotten\"` only (when `forgottenOnly` is true)\n *\n * Hard-delete means:\n * 1. Remove the file from disk.\n * 2. Trigger a QMD collection update so the index no longer contains it.\n * 3. Append a purge audit entry to the observation ledger.\n *\n * `dryRun: true` (the default) reports what *would* be deleted without\n * actually removing anything — callers must opt into mutations by\n * setting `dryRun: false`.\n *\n * The CLI surface enforces an explicit `--confirm yes` guard and\n * defaults to `--dry-run` to make accidental data loss impossible.\n */\n\nimport path from \"node:path\";\nimport { appendFile, mkdir, unlink } from \"node:fs/promises\";\nimport type { StorageManager } from \"../storage.js\";\nimport type { MemoryFile } from \"../types.js\";\nimport { markProjectedMemoryPathInvalid } from \"../memory-projection-store.js\";\nimport type { SearchBackend } from \"../search/port.js\";\n\nexport type PurgeTierFilter = \"cold\" | \"all\";\n\nexport interface PurgeMemoriesOptions {\n storage: StorageManager;\n /**\n * Only memories whose `updated ?? created` timestamp is older than this\n * value (in milliseconds, Unix epoch) will be candidates.\n */\n olderThanMs: number;\n /**\n * `\"cold\"` — only memories in the cold tier (files under `.../cold/`).\n * `\"all\"` — memories in any tier (hot, cold, or archived).\n * Default: `\"cold\"`.\n */\n tier?: PurgeTierFilter;\n /**\n * When `true`, only memories with `status === \"forgotten\"` are candidates.\n * Default: `false` (purge by age + tier regardless of status).\n */\n forgottenOnly?: boolean;\n /** When `true` (default), report candidates but do not delete. */\n dryRun?: boolean;\n /**\n * Optional QMD backend. When supplied and `dryRun === false`, a\n * `updateCollection` call is issued after each deletion so the index stays\n * consistent. Pass `undefined` or omit to skip index maintenance (e.g. in\n * tests that don't have a live QMD instance).\n */\n qmd?: SearchBackend;\n /** Hot-tier QMD collection name (default: `\"openclaw-engram\"`). */\n hotCollection?: string;\n /** Cold-tier QMD collection name (default: `\"openclaw-engram-cold\"`). */\n coldCollection?: string;\n /** Optional hook for long-lived hosts to clear their live dedupe mirror after purge hash cleanup. */\n afterFactHashRemoval?: () => void | Promise<void>;\n /** Optional shutdown signal forwarded to QMD collection refreshes. */\n signal?: AbortSignal;\n /** Override clock for tests. */\n now?: () => Date;\n}\n\nexport interface PurgeCandidate {\n id: string;\n path: string;\n tier: \"hot\" | \"cold\" | \"archive\";\n status: string;\n updatedOrCreated: string;\n ageMs: number;\n}\n\nexport interface PurgeMemoriesResult {\n dryRun: boolean;\n tier: PurgeTierFilter;\n olderThanMs: number;\n candidates: PurgeCandidate[];\n purgedCount: number;\n alreadyAbsentCount: number;\n errorCount: number;\n errors: Array<{ id: string; path: string; error: string }>;\n}\n\nfunction hasErrorCode(err: unknown, code: string): boolean {\n return typeof err === \"object\" && err !== null && \"code\" in err && (err as { code?: unknown }).code === code;\n}\n\nfunction resolveTimestamp(memory: MemoryFile): string {\n const fm = memory.frontmatter as unknown as Record<string, unknown>;\n const updated = typeof fm.updated === \"string\" ? (fm.updated as string) : \"\";\n const created = typeof fm.created === \"string\" ? (fm.created as string) : \"\";\n return updated.length > 0 ? updated : created;\n}\n\nasync function logPurgeAudit(\n storage: StorageManager,\n candidates: PurgeCandidate[],\n now: Date,\n event: \"PURGE_DELETE_INTENT\" | \"PURGE_HARD_DELETE\" | \"PURGE_ALREADY_ABSENT\" = \"PURGE_HARD_DELETE\",\n): Promise<void> {\n if (candidates.length === 0) return;\n const ledgerDir = path.join(storage.dir, \"state\", \"observation-ledger\");\n await mkdir(ledgerDir, { recursive: true });\n const ledgerPath = path.join(ledgerDir, \"purge-audit.jsonl\");\n const entries = candidates.map((c) =>\n JSON.stringify({\n event,\n timestamp: now.toISOString(),\n memoryId: c.id,\n path: c.path,\n tier: c.tier,\n status: c.status,\n updatedOrCreated: c.updatedOrCreated,\n }),\n );\n if (entries.length > 0) {\n await appendFile(ledgerPath, `${entries.join(\"\\n\")}\\n`, \"utf-8\");\n }\n}\n\nexport async function purgeMemories(\n options: PurgeMemoriesOptions,\n): Promise<PurgeMemoriesResult> {\n const {\n storage,\n olderThanMs,\n tier = \"cold\",\n forgottenOnly = false,\n dryRun = true,\n qmd,\n hotCollection = \"openclaw-engram\",\n coldCollection = \"openclaw-engram-cold\",\n } = options;\n\n if (!Number.isFinite(olderThanMs) || olderThanMs <= 0) {\n throw new Error(\"olderThanMs must be a finite positive number\");\n }\n\n const now = (options.now ?? (() => new Date()))();\n const nowMs = now.getTime();\n\n // Collect all memories from applicable tiers\n const [hotMemories, coldMemories, archivedMemories] = await Promise.all([\n tier === \"all\" ? storage.readAllMemories() : Promise.resolve([]),\n storage.readAllColdMemories(),\n tier === \"all\" ? storage.readArchivedMemories() : Promise.resolve([]),\n ]);\n\n const poolEntries: Array<{ memory: MemoryFile; resolvedTier: \"hot\" | \"cold\" | \"archive\" }> = [];\n\n if (tier === \"all\") {\n for (const m of hotMemories) {\n poolEntries.push({ memory: m, resolvedTier: \"hot\" });\n }\n for (const m of archivedMemories) {\n poolEntries.push({ memory: m, resolvedTier: \"archive\" });\n }\n }\n for (const m of coldMemories) {\n poolEntries.push({ memory: m, resolvedTier: \"cold\" });\n }\n\n // Build candidate list\n const candidates: PurgeCandidate[] = [];\n const candidateMemoriesById = new Map<string, MemoryFile>();\n for (const { memory, resolvedTier } of poolEntries) {\n const ts = resolveTimestamp(memory);\n if (ts.length === 0) continue;\n\n const tsMs = Date.parse(ts);\n if (!Number.isFinite(tsMs)) continue;\n\n const ageMs = nowMs - tsMs;\n if (ageMs < olderThanMs) continue;\n\n const fm = memory.frontmatter as unknown as Record<string, unknown>;\n const status: string =\n typeof fm.status === \"string\" ? (fm.status as string) : \"active\";\n\n if (forgottenOnly && status !== \"forgotten\") continue;\n\n candidates.push({\n id: memory.frontmatter.id,\n path: memory.path,\n tier: resolvedTier,\n status,\n updatedOrCreated: ts,\n ageMs,\n });\n candidateMemoriesById.set(memory.frontmatter.id, memory);\n }\n\n if (dryRun) {\n return {\n dryRun: true,\n tier,\n olderThanMs,\n candidates,\n purgedCount: 0,\n alreadyAbsentCount: 0,\n errorCount: 0,\n errors: [],\n };\n }\n\n // Hard-delete phase\n const errors: Array<{ id: string; path: string; error: string }> = [];\n try {\n await logPurgeAudit(storage, candidates, now, \"PURGE_DELETE_INTENT\");\n } catch (auditErr) {\n errors.push({\n id: \"(purge-audit)\",\n path: path.join(storage.dir, \"state\", \"observation-ledger\", \"purge-audit.jsonl\"),\n error: auditErr instanceof Error ? auditErr.message : String(auditErr),\n });\n }\n\n const actuallyPurged: PurgeCandidate[] = [];\n const alreadyAbsent: PurgeCandidate[] = [];\n const collectionsToUpdate = new Set<string>();\n const addCollectionForCandidate = (candidate: PurgeCandidate) => {\n if (candidate.tier === \"cold\") {\n collectionsToUpdate.add(coldCollection);\n } else if (candidate.tier === \"hot\") {\n collectionsToUpdate.add(hotCollection);\n }\n };\n\n for (const candidate of candidates) {\n try {\n await unlink(candidate.path);\n actuallyPurged.push(candidate);\n addCollectionForCandidate(candidate);\n markProjectedMemoryPathInvalid(storage.dir, candidate.id);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n // ENOENT is fine — already gone\n if (hasErrorCode(err, \"ENOENT\")) {\n alreadyAbsent.push(candidate);\n addCollectionForCandidate(candidate);\n markProjectedMemoryPathInvalid(storage.dir, candidate.id);\n } else {\n errors.push({ id: candidate.id, path: candidate.path, error: message });\n }\n }\n }\n\n const recordPostDeleteAudit = async (\n purgedCandidates: PurgeCandidate[],\n event: \"PURGE_HARD_DELETE\" | \"PURGE_ALREADY_ABSENT\",\n ) => {\n try {\n await logPurgeAudit(storage, purgedCandidates, now, event);\n } catch (auditErr) {\n errors.push({\n id: \"(purge-audit)\",\n path: path.join(storage.dir, \"state\", \"observation-ledger\", \"purge-audit.jsonl\"),\n error: auditErr instanceof Error ? auditErr.message : String(auditErr),\n });\n }\n };\n await recordPostDeleteAudit(actuallyPurged, \"PURGE_HARD_DELETE\");\n await recordPostDeleteAudit(alreadyAbsent, \"PURGE_ALREADY_ABSENT\");\n\n const resolvedPurges = [...actuallyPurged, ...alreadyAbsent];\n\n const invalidateTierCaches = (\n storage as unknown as {\n invalidateMemoryCachesForTiers?: (tiers: Iterable<\"hot\" | \"cold\" | \"archive\">) => void;\n }\n ).invalidateMemoryCachesForTiers;\n if (typeof invalidateTierCaches === \"function\") {\n invalidateTierCaches.call(storage, new Set(resolvedPurges.map((candidate) => candidate.tier)));\n } else if (typeof (storage as unknown as { invalidateAllMemoriesCacheForDir?: () => void }).invalidateAllMemoriesCacheForDir === \"function\") {\n (storage as unknown as { invalidateAllMemoriesCacheForDir: () => void }).invalidateAllMemoriesCacheForDir();\n }\n\n // Update QMD index for affected collections\n if (qmd) {\n for (const collection of collectionsToUpdate) {\n try {\n if (typeof qmd.updateCollectionStrict === \"function\") {\n await qmd.updateCollectionStrict(collection, { signal: options.signal });\n } else {\n await qmd.updateCollection(collection, { signal: options.signal });\n }\n } catch (indexErr) {\n // Non-fatal — operator can re-index manually\n errors.push({\n id: \"(qmd-update)\",\n path: collection,\n error: indexErr instanceof Error ? indexErr.message : String(indexErr),\n });\n }\n }\n }\n\n const purgedFactMemories = resolvedPurges\n .map((candidate) => candidateMemoriesById.get(candidate.id))\n .filter((memory): memory is MemoryFile => memory?.frontmatter.category === \"fact\");\n if (purgedFactMemories.length > 0) {\n const removeFactHashes = (\n storage as unknown as {\n removeFactContentHashesForMemories?: (memories: MemoryFile[]) => Promise<void>;\n }\n ).removeFactContentHashesForMemories;\n if (typeof removeFactHashes === \"function\") {\n try {\n await removeFactHashes.call(storage, purgedFactMemories);\n await options.afterFactHashRemoval?.();\n } catch (hashErr) {\n errors.push({\n id: \"(fact-hash-index)\",\n path: path.join(storage.dir, \"state\", \"fact-hashes.txt\"),\n error: hashErr instanceof Error ? hashErr.message : String(hashErr),\n });\n }\n }\n }\n\n return {\n dryRun: false,\n tier,\n olderThanMs,\n candidates,\n purgedCount: actuallyPurged.length,\n alreadyAbsentCount: alreadyAbsent.length,\n errorCount: errors.length,\n errors,\n };\n}\n"],"mappings":";;;;;;;AAqBA,OAAO,UAAU;AACjB,SAAS,YAAY,OAAO,cAAc;AAmE1C,SAAS,aAAa,KAAc,MAAuB;AACzD,SAAO,OAAO,QAAQ,YAAY,QAAQ,QAAQ,UAAU,OAAQ,IAA2B,SAAS;AAC1G;AAEA,SAAS,iBAAiB,QAA4B;AACpD,QAAM,KAAK,OAAO;AAClB,QAAM,UAAU,OAAO,GAAG,YAAY,WAAY,GAAG,UAAqB;AAC1E,QAAM,UAAU,OAAO,GAAG,YAAY,WAAY,GAAG,UAAqB;AAC1E,SAAO,QAAQ,SAAS,IAAI,UAAU;AACxC;AAEA,eAAe,cACb,SACA,YACA,KACA,QAA8E,qBAC/D;AACf,MAAI,WAAW,WAAW,EAAG;AAC7B,QAAM,YAAY,KAAK,KAAK,QAAQ,KAAK,SAAS,oBAAoB;AACtE,QAAM,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAC1C,QAAM,aAAa,KAAK,KAAK,WAAW,mBAAmB;AAC3D,QAAM,UAAU,WAAW;AAAA,IAAI,CAAC,MAC9B,KAAK,UAAU;AAAA,MACb;AAAA,MACA,WAAW,IAAI,YAAY;AAAA,MAC3B,UAAU,EAAE;AAAA,MACZ,MAAM,EAAE;AAAA,MACR,MAAM,EAAE;AAAA,MACR,QAAQ,EAAE;AAAA,MACV,kBAAkB,EAAE;AAAA,IACtB,CAAC;AAAA,EACH;AACA,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,WAAW,YAAY,GAAG,QAAQ,KAAK,IAAI,CAAC;AAAA,GAAM,OAAO;AAAA,EACjE;AACF;AAEA,eAAsB,cACpB,SAC8B;AAC9B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT;AAAA,IACA,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,EACnB,IAAI;AAEJ,MAAI,CAAC,OAAO,SAAS,WAAW,KAAK,eAAe,GAAG;AACrD,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AAEA,QAAM,OAAO,QAAQ,QAAQ,MAAM,oBAAI,KAAK,IAAI;AAChD,QAAM,QAAQ,IAAI,QAAQ;AAG1B,QAAM,CAAC,aAAa,cAAc,gBAAgB,IAAI,MAAM,QAAQ,IAAI;AAAA,IACtE,SAAS,QAAQ,QAAQ,gBAAgB,IAAI,QAAQ,QAAQ,CAAC,CAAC;AAAA,IAC/D,QAAQ,oBAAoB;AAAA,IAC5B,SAAS,QAAQ,QAAQ,qBAAqB,IAAI,QAAQ,QAAQ,CAAC,CAAC;AAAA,EACtE,CAAC;AAED,QAAM,cAAuF,CAAC;AAE9F,MAAI,SAAS,OAAO;AAClB,eAAW,KAAK,aAAa;AAC3B,kBAAY,KAAK,EAAE,QAAQ,GAAG,cAAc,MAAM,CAAC;AAAA,IACrD;AACA,eAAW,KAAK,kBAAkB;AAChC,kBAAY,KAAK,EAAE,QAAQ,GAAG,cAAc,UAAU,CAAC;AAAA,IACzD;AAAA,EACF;AACA,aAAW,KAAK,cAAc;AAC5B,gBAAY,KAAK,EAAE,QAAQ,GAAG,cAAc,OAAO,CAAC;AAAA,EACtD;AAGA,QAAM,aAA+B,CAAC;AACtC,QAAM,wBAAwB,oBAAI,IAAwB;AAC1D,aAAW,EAAE,QAAQ,aAAa,KAAK,aAAa;AAClD,UAAM,KAAK,iBAAiB,MAAM;AAClC,QAAI,GAAG,WAAW,EAAG;AAErB,UAAM,OAAO,KAAK,MAAM,EAAE;AAC1B,QAAI,CAAC,OAAO,SAAS,IAAI,EAAG;AAE5B,UAAM,QAAQ,QAAQ;AACtB,QAAI,QAAQ,YAAa;AAEzB,UAAM,KAAK,OAAO;AAClB,UAAM,SACJ,OAAO,GAAG,WAAW,WAAY,GAAG,SAAoB;AAE1D,QAAI,iBAAiB,WAAW,YAAa;AAE7C,eAAW,KAAK;AAAA,MACd,IAAI,OAAO,YAAY;AAAA,MACvB,MAAM,OAAO;AAAA,MACb,MAAM;AAAA,MACN;AAAA,MACA,kBAAkB;AAAA,MAClB;AAAA,IACF,CAAC;AACD,0BAAsB,IAAI,OAAO,YAAY,IAAI,MAAM;AAAA,EACzD;AAEA,MAAI,QAAQ;AACV,WAAO;AAAA,MACL,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb,oBAAoB;AAAA,MACpB,YAAY;AAAA,MACZ,QAAQ,CAAC;AAAA,IACX;AAAA,EACF;AAGA,QAAM,SAA6D,CAAC;AACpE,MAAI;AACF,UAAM,cAAc,SAAS,YAAY,KAAK,qBAAqB;AAAA,EACrE,SAAS,UAAU;AACjB,WAAO,KAAK;AAAA,MACV,IAAI;AAAA,MACJ,MAAM,KAAK,KAAK,QAAQ,KAAK,SAAS,sBAAsB,mBAAmB;AAAA,MAC/E,OAAO,oBAAoB,QAAQ,SAAS,UAAU,OAAO,QAAQ;AAAA,IACvE,CAAC;AAAA,EACH;AAEA,QAAM,iBAAmC,CAAC;AAC1C,QAAM,gBAAkC,CAAC;AACzC,QAAM,sBAAsB,oBAAI,IAAY;AAC5C,QAAM,4BAA4B,CAAC,cAA8B;AAC/D,QAAI,UAAU,SAAS,QAAQ;AAC7B,0BAAoB,IAAI,cAAc;AAAA,IACxC,WAAW,UAAU,SAAS,OAAO;AACnC,0BAAoB,IAAI,aAAa;AAAA,IACvC;AAAA,EACF;AAEA,aAAW,aAAa,YAAY;AAClC,QAAI;AACF,YAAM,OAAO,UAAU,IAAI;AAC3B,qBAAe,KAAK,SAAS;AAC7B,gCAA0B,SAAS;AACnC,qCAA+B,QAAQ,KAAK,UAAU,EAAE;AAAA,IAC1D,SAAS,KAAK;AACZ,YAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAE/D,UAAI,aAAa,KAAK,QAAQ,GAAG;AAC/B,sBAAc,KAAK,SAAS;AAC5B,kCAA0B,SAAS;AACnC,uCAA+B,QAAQ,KAAK,UAAU,EAAE;AAAA,MAC1D,OAAO;AACL,eAAO,KAAK,EAAE,IAAI,UAAU,IAAI,MAAM,UAAU,MAAM,OAAO,QAAQ,CAAC;AAAA,MACxE;AAAA,IACF;AAAA,EACF;AAEA,QAAM,wBAAwB,OAC5B,kBACA,UACG;AACH,QAAI;AACF,YAAM,cAAc,SAAS,kBAAkB,KAAK,KAAK;AAAA,IAC3D,SAAS,UAAU;AACjB,aAAO,KAAK;AAAA,QACV,IAAI;AAAA,QACJ,MAAM,KAAK,KAAK,QAAQ,KAAK,SAAS,sBAAsB,mBAAmB;AAAA,QAC/E,OAAO,oBAAoB,QAAQ,SAAS,UAAU,OAAO,QAAQ;AAAA,MACvE,CAAC;AAAA,IACH;AAAA,EACF;AACA,QAAM,sBAAsB,gBAAgB,mBAAmB;AAC/D,QAAM,sBAAsB,eAAe,sBAAsB;AAEjE,QAAM,iBAAiB,CAAC,GAAG,gBAAgB,GAAG,aAAa;AAE3D,QAAM,uBACJ,QAGA;AACF,MAAI,OAAO,yBAAyB,YAAY;AAC9C,yBAAqB,KAAK,SAAS,IAAI,IAAI,eAAe,IAAI,CAAC,cAAc,UAAU,IAAI,CAAC,CAAC;AAAA,EAC/F,WAAW,OAAQ,QAAyE,qCAAqC,YAAY;AAC3I,IAAC,QAAwE,iCAAiC;AAAA,EAC5G;AAGA,MAAI,KAAK;AACP,eAAW,cAAc,qBAAqB;AAC5C,UAAI;AACF,YAAI,OAAO,IAAI,2BAA2B,YAAY;AACpD,gBAAM,IAAI,uBAAuB,YAAY,EAAE,QAAQ,QAAQ,OAAO,CAAC;AAAA,QACzE,OAAO;AACL,gBAAM,IAAI,iBAAiB,YAAY,EAAE,QAAQ,QAAQ,OAAO,CAAC;AAAA,QACnE;AAAA,MACF,SAAS,UAAU;AAEjB,eAAO,KAAK;AAAA,UACV,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,OAAO,oBAAoB,QAAQ,SAAS,UAAU,OAAO,QAAQ;AAAA,QACvE,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,qBAAqB,eACxB,IAAI,CAAC,cAAc,sBAAsB,IAAI,UAAU,EAAE,CAAC,EAC1D,OAAO,CAAC,WAAiC,QAAQ,YAAY,aAAa,MAAM;AACnF,MAAI,mBAAmB,SAAS,GAAG;AACjC,UAAM,mBACJ,QAGA;AACF,QAAI,OAAO,qBAAqB,YAAY;AAC1C,UAAI;AACF,cAAM,iBAAiB,KAAK,SAAS,kBAAkB;AACvD,cAAM,QAAQ,uBAAuB;AAAA,MACvC,SAAS,SAAS;AAChB,eAAO,KAAK;AAAA,UACV,IAAI;AAAA,UACJ,MAAM,KAAK,KAAK,QAAQ,KAAK,SAAS,iBAAiB;AAAA,UACvD,OAAO,mBAAmB,QAAQ,QAAQ,UAAU,OAAO,OAAO;AAAA,QACpE,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,eAAe;AAAA,IAC5B,oBAAoB,cAAc;AAAA,IAClC,YAAY,OAAO;AAAA,IACnB;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/maintenance/purge.ts"],"sourcesContent":["/**\n * Operator-facing bulk hard-delete (issue #686 retention-completion).\n *\n * `purgeMemories(opts)` hard-deletes memories that are:\n * - older than `olderThanMs` (measured against `updated ?? created`), AND\n * - in the specified tier (`\"cold\"` or `\"all\"`), AND\n * - optionally in `status: \"forgotten\"` only (when `forgottenOnly` is true)\n *\n * Hard-delete means:\n * 1. Remove the file from disk.\n * 2. Trigger a QMD collection update so the index no longer contains it.\n * 3. Append a purge audit entry to the observation ledger.\n *\n * `dryRun: true` (the default) reports what *would* be deleted without\n * actually removing anything — callers must opt into mutations by\n * setting `dryRun: false`.\n *\n * The CLI surface enforces an explicit `--confirm yes` guard and\n * defaults to `--dry-run` to make accidental data loss impossible.\n */\n\nimport path from \"node:path\";\nimport { appendFile, mkdir, unlink } from \"node:fs/promises\";\nimport type { StorageManager } from \"../storage.js\";\nimport type { MemoryFile } from \"../types.js\";\nimport { markProjectedMemoryPathInvalid } from \"../memory-projection-store.js\";\nimport type { SearchBackend } from \"../search/port.js\";\n\nexport type PurgeTierFilter = \"cold\" | \"all\";\n\nexport interface PurgeMemoriesOptions {\n storage: StorageManager;\n /**\n * Only memories whose `updated ?? created` timestamp is older than this\n * value (in milliseconds, Unix epoch) will be candidates.\n */\n olderThanMs: number;\n /**\n * `\"cold\"` — only memories in the cold tier (files under `.../cold/`).\n * `\"all\"` — memories in any tier (hot, cold, or archived).\n * Default: `\"cold\"`.\n */\n tier?: PurgeTierFilter;\n /**\n * When `true`, only memories with `status === \"forgotten\"` are candidates.\n * Default: `false` (purge by age + tier regardless of status).\n */\n forgottenOnly?: boolean;\n /** When `true` (default), report candidates but do not delete. */\n dryRun?: boolean;\n /**\n * Optional QMD backend. When supplied and `dryRun === false`, a\n * `updateCollection` call is issued after each deletion so the index stays\n * consistent. Pass `undefined` or omit to skip index maintenance (e.g. in\n * tests that don't have a live QMD instance).\n */\n qmd?: SearchBackend;\n /** Hot-tier QMD collection name (default: `\"openclaw-engram\"`). */\n hotCollection?: string;\n /** Cold-tier QMD collection name (default: `\"openclaw-engram-cold\"`). */\n coldCollection?: string;\n /** Optional hook for long-lived hosts to clear their live dedupe mirror after purge hash cleanup. */\n afterFactHashRemoval?: () => void | Promise<void>;\n /** Optional shutdown signal forwarded to QMD collection refreshes. */\n signal?: AbortSignal;\n /** Override clock for tests. */\n now?: () => Date;\n}\n\nexport interface PurgeCandidate {\n id: string;\n path: string;\n tier: \"hot\" | \"cold\" | \"archive\";\n status: string;\n updatedOrCreated: string;\n ageMs: number;\n}\n\nexport interface PurgeMemoriesResult {\n dryRun: boolean;\n tier: PurgeTierFilter;\n olderThanMs: number;\n candidates: PurgeCandidate[];\n purgedCount: number;\n alreadyAbsentCount: number;\n errorCount: number;\n errors: Array<{ id: string; path: string; error: string }>;\n}\n\nfunction hasErrorCode(err: unknown, code: string): boolean {\n return typeof err === \"object\" && err !== null && \"code\" in err && (err as { code?: unknown }).code === code;\n}\n\nfunction resolveTimestamp(memory: MemoryFile): string {\n const fm = memory.frontmatter as unknown as Record<string, unknown>;\n const updated = typeof fm.updated === \"string\" ? (fm.updated as string) : \"\";\n const created = typeof fm.created === \"string\" ? (fm.created as string) : \"\";\n return updated.length > 0 ? updated : created;\n}\n\nasync function logPurgeAudit(\n storage: StorageManager,\n candidates: PurgeCandidate[],\n now: Date,\n event: \"PURGE_DELETE_INTENT\" | \"PURGE_HARD_DELETE\" | \"PURGE_ALREADY_ABSENT\" = \"PURGE_HARD_DELETE\",\n): Promise<void> {\n if (candidates.length === 0) return;\n const ledgerDir = path.join(storage.dir, \"state\", \"observation-ledger\");\n await mkdir(ledgerDir, { recursive: true });\n const ledgerPath = path.join(ledgerDir, \"purge-audit.jsonl\");\n const entries = candidates.map((c) =>\n JSON.stringify({\n event,\n timestamp: now.toISOString(),\n memoryId: c.id,\n path: c.path,\n tier: c.tier,\n status: c.status,\n updatedOrCreated: c.updatedOrCreated,\n }),\n );\n if (entries.length > 0) {\n await appendFile(ledgerPath, `${entries.join(\"\\n\")}\\n`, \"utf-8\");\n }\n}\n\nexport async function purgeMemories(\n options: PurgeMemoriesOptions,\n): Promise<PurgeMemoriesResult> {\n const {\n storage,\n olderThanMs,\n tier = \"cold\",\n forgottenOnly = false,\n dryRun = true,\n qmd,\n hotCollection = \"openclaw-engram\",\n coldCollection = \"openclaw-engram-cold\",\n } = options;\n\n if (!Number.isFinite(olderThanMs) || olderThanMs <= 0) {\n throw new Error(\"olderThanMs must be a finite positive number\");\n }\n\n const now = (options.now ?? (() => new Date()))();\n const nowMs = now.getTime();\n\n // Collect all memories from applicable tiers\n const [hotMemories, coldMemories, archivedMemories] = await Promise.all([\n tier === \"all\" ? storage.readAllMemories() : Promise.resolve([]),\n storage.readAllColdMemories(),\n tier === \"all\" ? storage.readArchivedMemories() : Promise.resolve([]),\n ]);\n\n const poolEntries: Array<{ memory: MemoryFile; resolvedTier: \"hot\" | \"cold\" | \"archive\" }> = [];\n\n if (tier === \"all\") {\n for (const m of hotMemories) {\n poolEntries.push({ memory: m, resolvedTier: \"hot\" });\n }\n for (const m of archivedMemories) {\n poolEntries.push({ memory: m, resolvedTier: \"archive\" });\n }\n }\n for (const m of coldMemories) {\n poolEntries.push({ memory: m, resolvedTier: \"cold\" });\n }\n\n // Build candidate list\n const candidates: PurgeCandidate[] = [];\n const candidateMemoriesById = new Map<string, MemoryFile>();\n for (const { memory, resolvedTier } of poolEntries) {\n const ts = resolveTimestamp(memory);\n if (ts.length === 0) continue;\n\n const tsMs = Date.parse(ts);\n if (!Number.isFinite(tsMs)) continue;\n\n const ageMs = nowMs - tsMs;\n if (ageMs < olderThanMs) continue;\n\n const fm = memory.frontmatter as unknown as Record<string, unknown>;\n const status: string =\n typeof fm.status === \"string\" ? (fm.status as string) : \"active\";\n\n if (forgottenOnly && status !== \"forgotten\") continue;\n\n candidates.push({\n id: memory.frontmatter.id,\n path: memory.path,\n tier: resolvedTier,\n status,\n updatedOrCreated: ts,\n ageMs,\n });\n candidateMemoriesById.set(memory.frontmatter.id, memory);\n }\n\n if (dryRun) {\n return {\n dryRun: true,\n tier,\n olderThanMs,\n candidates,\n purgedCount: 0,\n alreadyAbsentCount: 0,\n errorCount: 0,\n errors: [],\n };\n }\n\n // Hard-delete phase\n const errors: Array<{ id: string; path: string; error: string }> = [];\n try {\n await logPurgeAudit(storage, candidates, now, \"PURGE_DELETE_INTENT\");\n } catch (auditErr) {\n errors.push({\n id: \"(purge-audit)\",\n path: path.join(storage.dir, \"state\", \"observation-ledger\", \"purge-audit.jsonl\"),\n error: auditErr instanceof Error ? auditErr.message : String(auditErr),\n });\n }\n\n const actuallyPurged: PurgeCandidate[] = [];\n const alreadyAbsent: PurgeCandidate[] = [];\n const collectionsToUpdate = new Set<string>();\n const addCollectionForCandidate = (candidate: PurgeCandidate) => {\n if (candidate.tier === \"cold\") {\n collectionsToUpdate.add(coldCollection);\n } else if (candidate.tier === \"hot\") {\n collectionsToUpdate.add(hotCollection);\n }\n };\n\n for (const candidate of candidates) {\n try {\n await unlink(candidate.path);\n actuallyPurged.push(candidate);\n addCollectionForCandidate(candidate);\n markProjectedMemoryPathInvalid(storage.dir, candidate.id);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n // ENOENT is fine — already gone\n if (hasErrorCode(err, \"ENOENT\")) {\n alreadyAbsent.push(candidate);\n addCollectionForCandidate(candidate);\n markProjectedMemoryPathInvalid(storage.dir, candidate.id);\n } else {\n errors.push({ id: candidate.id, path: candidate.path, error: message });\n }\n }\n }\n\n const recordPostDeleteAudit = async (\n purgedCandidates: PurgeCandidate[],\n event: \"PURGE_HARD_DELETE\" | \"PURGE_ALREADY_ABSENT\",\n ) => {\n try {\n await logPurgeAudit(storage, purgedCandidates, now, event);\n } catch (auditErr) {\n errors.push({\n id: \"(purge-audit)\",\n path: path.join(storage.dir, \"state\", \"observation-ledger\", \"purge-audit.jsonl\"),\n error: auditErr instanceof Error ? auditErr.message : String(auditErr),\n });\n }\n };\n await recordPostDeleteAudit(actuallyPurged, \"PURGE_HARD_DELETE\");\n await recordPostDeleteAudit(alreadyAbsent, \"PURGE_ALREADY_ABSENT\");\n\n const resolvedPurges = [...actuallyPurged, ...alreadyAbsent];\n\n const invalidateTierCaches = (\n storage as unknown as {\n invalidateMemoryCachesForTiers?: (tiers: Iterable<\"hot\" | \"cold\" | \"archive\">) => void;\n }\n ).invalidateMemoryCachesForTiers;\n if (typeof invalidateTierCaches === \"function\") {\n invalidateTierCaches.call(storage, new Set(resolvedPurges.map((candidate) => candidate.tier)));\n } else if (typeof (storage as unknown as { invalidateAllMemoriesCacheForDir?: () => void }).invalidateAllMemoriesCacheForDir === \"function\") {\n (storage as unknown as { invalidateAllMemoriesCacheForDir: () => void }).invalidateAllMemoriesCacheForDir();\n }\n\n // Update QMD index for affected collections\n if (qmd) {\n for (const collection of collectionsToUpdate) {\n try {\n if (typeof qmd.updateCollectionStrict === \"function\") {\n await qmd.updateCollectionStrict(collection, { signal: options.signal });\n } else {\n await qmd.updateCollection(collection, { signal: options.signal });\n }\n } catch (indexErr) {\n // Non-fatal — operator can re-index manually\n errors.push({\n id: \"(qmd-update)\",\n path: collection,\n error: indexErr instanceof Error ? indexErr.message : String(indexErr),\n });\n }\n }\n }\n\n const purgedFactMemories = resolvedPurges\n .map((candidate) => candidateMemoriesById.get(candidate.id))\n .filter((memory): memory is MemoryFile => memory?.frontmatter.category === \"fact\");\n if (purgedFactMemories.length > 0) {\n const removeFactHashes = (\n storage as unknown as {\n removeFactContentHashesForMemories?: (memories: MemoryFile[]) => Promise<void>;\n }\n ).removeFactContentHashesForMemories;\n if (typeof removeFactHashes === \"function\") {\n try {\n await removeFactHashes.call(storage, purgedFactMemories);\n await options.afterFactHashRemoval?.();\n } catch (hashErr) {\n errors.push({\n id: \"(fact-hash-index)\",\n path: path.join(storage.dir, \"state\", \"fact-hashes.txt\"),\n error: hashErr instanceof Error ? hashErr.message : String(hashErr),\n });\n }\n }\n }\n\n return {\n dryRun: false,\n tier,\n olderThanMs,\n candidates,\n purgedCount: actuallyPurged.length,\n alreadyAbsentCount: alreadyAbsent.length,\n errorCount: errors.length,\n errors,\n };\n}\n"],"mappings":"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","names":[]}