@remnic/core 10.0.13 → 10.0.15

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 (614) hide show
  1. package/dist/abstraction-nodes.js +3 -2
  2. package/dist/access-admin-ops-surface.js +96 -92
  3. package/dist/access-authorization-probe.js +97 -93
  4. package/dist/access-boundary.js +96 -92
  5. package/dist/access-cli.js +203 -198
  6. package/dist/access-cli.js.map +1 -1
  7. package/dist/access-extraction-force-flush.js +96 -92
  8. package/dist/access-http-briefing.js +97 -93
  9. package/dist/access-http-query.js +98 -94
  10. package/dist/access-http.js +121 -117
  11. package/dist/access-idempotency.js +3 -2
  12. package/dist/access-identity-continuity-surface.js +96 -92
  13. package/dist/access-lcm-surface.js +96 -92
  14. package/dist/access-mcp.js +110 -106
  15. package/dist/access-namespace-preflight.js +96 -92
  16. package/dist/access-observe-write-category.js +18 -17
  17. package/dist/access-observe-write-surface.js +96 -92
  18. package/dist/access-offline-manifest.js +17 -15
  19. package/dist/access-operations-batch.js +101 -97
  20. package/dist/access-operations.js +108 -104
  21. package/dist/access-recall-concurrency.js +96 -92
  22. package/dist/access-recall-diagnostics.js +2 -2
  23. package/dist/access-recall-response.js +96 -92
  24. package/dist/access-recall-surface.js +96 -92
  25. package/dist/access-schema.d.ts +2 -2
  26. package/dist/access-schema.js +13 -12
  27. package/dist/access-service.js +96 -92
  28. package/dist/access-surface-catalog.js +98 -94
  29. package/dist/access-surface-catalog.js.map +1 -1
  30. package/dist/active-recall.js +43 -39
  31. package/dist/active-recall.js.map +1 -1
  32. package/dist/adapters/index.js +4 -4
  33. package/dist/adapters/registry.js +2 -2
  34. package/dist/{auto-sync-DGJOZYGT.js → auto-sync-7WWAKW6F.js} +8 -8
  35. package/dist/briefing.js +32 -28
  36. package/dist/buffer.js +13 -13
  37. package/dist/calibration.d.ts.map +1 -1
  38. package/dist/calibration.js +6 -3
  39. package/dist/calibration.js.map +1 -1
  40. package/dist/{capsule-merge-M4HETD27.js → capsule-merge-LGYURS3C.js} +6 -5
  41. package/dist/{capsule-merge-M4HETD27.js.map → capsule-merge-LGYURS3C.js.map} +1 -1
  42. package/dist/capture-write-lock-backoff.d.ts +50 -0
  43. package/dist/capture-write-lock-backoff.d.ts.map +1 -0
  44. package/dist/capture-write-lock-backoff.js +30 -0
  45. package/dist/capture-write-lock.d.ts +6 -0
  46. package/dist/capture-write-lock.d.ts.map +1 -0
  47. package/dist/capture-write-lock.js +15 -0
  48. package/dist/causal-behavior.js +4 -3
  49. package/dist/causal-behavior.js.map +1 -1
  50. package/dist/causal-chain.js +4 -3
  51. package/dist/causal-consolidation.js +36 -32
  52. package/dist/causal-consolidation.js.map +1 -1
  53. package/dist/causal-retrieval.js +4 -3
  54. package/dist/causal-retrieval.js.map +1 -1
  55. package/dist/causal-trajectory-graph.js +7 -6
  56. package/dist/causal-trajectory-graph.js.map +1 -1
  57. package/dist/causal-trajectory.js +3 -2
  58. package/dist/{chunk-KZO43HPY.js → chunk-22RM2ZUJ.js} +112 -112
  59. package/dist/{chunk-ZUMXY4KA.js → chunk-22W2XWGH.js} +3 -3
  60. package/dist/{chunk-MZBWIJJN.js → chunk-23ZQPP2G.js} +24 -19
  61. package/dist/chunk-23ZQPP2G.js.map +1 -0
  62. package/dist/{chunk-PCWXLAJY.js → chunk-2PTH4PRL.js} +2 -2
  63. package/dist/{chunk-ZIZ2G47N.js → chunk-2PYHLSXK.js} +2 -2
  64. package/dist/{chunk-B6O2YLUR.js → chunk-2Z5DIDQD.js} +6 -1
  65. package/dist/chunk-2Z5DIDQD.js.map +1 -0
  66. package/dist/{chunk-7OAIOE5P.js → chunk-33G67YZF.js} +2 -2
  67. package/dist/{chunk-AV2OQF2O.js → chunk-3F3HA3R2.js} +2 -2
  68. package/dist/{chunk-RP5SJ3XR.js → chunk-3GNIJUUE.js} +2 -2
  69. package/dist/{chunk-QZZPUREO.js → chunk-3GYSZHMT.js} +3 -3
  70. package/dist/{chunk-QWWMS4AE.js → chunk-3MO4LWYU.js} +1 -1
  71. package/dist/chunk-3MO4LWYU.js.map +1 -0
  72. package/dist/{chunk-SWIKABKI.js → chunk-3Q3XD3NO.js} +2 -2
  73. package/dist/{chunk-AL6EHLB5.js → chunk-3X3PNU3T.js} +2 -2
  74. package/dist/{chunk-BTJ6CAIA.js → chunk-4IYIGN53.js} +10 -10
  75. package/dist/{chunk-BZTRPCCH.js → chunk-4PDTVVSW.js} +2 -2
  76. package/dist/{chunk-HM7RHKS4.js → chunk-4RNBLLZR.js} +2 -2
  77. package/dist/{chunk-Y3VDGK2O.js → chunk-4SCZZ3U7.js} +282 -84
  78. package/dist/chunk-4SCZZ3U7.js.map +1 -0
  79. package/dist/{chunk-JUWJYXI4.js → chunk-5ATSXCAG.js} +4 -4
  80. package/dist/{chunk-EHRE7ZG3.js → chunk-5B5WYAHQ.js} +2 -2
  81. package/dist/{chunk-WCGJK4NQ.js → chunk-5FNZ3G6X.js} +10 -10
  82. package/dist/{chunk-Y6DZ33PA.js → chunk-5GX5457J.js} +4 -4
  83. package/dist/{chunk-EMFBC7L3.js → chunk-5KGYTX5O.js} +2 -2
  84. package/dist/{chunk-OFCHT2TN.js → chunk-5LRV557D.js} +2 -2
  85. package/dist/{chunk-DXHVD4DS.js → chunk-5SMR542T.js} +3 -3
  86. package/dist/{chunk-S7LWX2PQ.js → chunk-655FVTCD.js} +2 -2
  87. package/dist/{chunk-DGRMWDQY.js → chunk-66BCOVW2.js} +7 -7
  88. package/dist/chunk-6EDW54SQ.js +298 -0
  89. package/dist/chunk-6EDW54SQ.js.map +1 -0
  90. package/dist/{chunk-5MDM7UE4.js → chunk-6WGMZQGG.js} +2 -2
  91. package/dist/chunk-77R7BQZ2.js +152 -0
  92. package/dist/chunk-77R7BQZ2.js.map +1 -0
  93. package/dist/{chunk-IPLYGWQF.js → chunk-7LCGFUMB.js} +6 -6
  94. package/dist/{chunk-5ZJYHOJT.js → chunk-7VQ6AI7H.js} +8 -8
  95. package/dist/{chunk-KYY4EACB.js → chunk-7Z3DLNSD.js} +2 -2
  96. package/dist/{chunk-LNH76ZJX.js → chunk-AIYXVWUH.js} +27 -2
  97. package/dist/{chunk-LNH76ZJX.js.map → chunk-AIYXVWUH.js.map} +1 -1
  98. package/dist/{chunk-G7NYVKD6.js → chunk-B2NXOVZN.js} +2 -2
  99. package/dist/{chunk-B43NMCGQ.js → chunk-BK2BVLZW.js} +2 -2
  100. package/dist/{chunk-QJ622LTI.js → chunk-BQOGQULP.js} +30 -8
  101. package/dist/chunk-BQOGQULP.js.map +1 -0
  102. package/dist/{chunk-BOOFTFFE.js → chunk-C2RW36YR.js} +2 -2
  103. package/dist/{chunk-XERVJYH2.js → chunk-C6JMGAMO.js} +7 -3
  104. package/dist/chunk-C6JMGAMO.js.map +1 -0
  105. package/dist/{chunk-5JMI26Q7.js → chunk-CBH2Z4UA.js} +2 -2
  106. package/dist/{chunk-P2S6P7X6.js → chunk-CFZ4SXXH.js} +2 -2
  107. package/dist/{chunk-YRH3C2OJ.js → chunk-CIIHIAJ2.js} +13 -5
  108. package/dist/chunk-CIIHIAJ2.js.map +1 -0
  109. package/dist/{chunk-6M56RFFJ.js → chunk-CJRENHVZ.js} +3 -3
  110. package/dist/{chunk-EGDYVYU7.js → chunk-CLWBFR7Q.js} +3 -3
  111. package/dist/{chunk-375ARKRS.js → chunk-D5SSBCYY.js} +70 -59
  112. package/dist/chunk-D5SSBCYY.js.map +1 -0
  113. package/dist/{chunk-KI6UOSNR.js → chunk-DEY7B77Y.js} +2 -2
  114. package/dist/chunk-DEY7B77Y.js.map +1 -0
  115. package/dist/{chunk-6VAHJ2F6.js → chunk-DMDWFQMR.js} +2 -2
  116. package/dist/{chunk-BLVHDY2U.js → chunk-DOWACHYO.js} +5 -2
  117. package/dist/chunk-DOWACHYO.js.map +1 -0
  118. package/dist/{chunk-UZSBCQEC.js → chunk-DPSOFK4D.js} +2 -2
  119. package/dist/{chunk-IZT3BVDW.js → chunk-DQR2LD3V.js} +2 -2
  120. package/dist/{chunk-K4QY55XV.js → chunk-EH4BQ7LT.js} +2 -2
  121. package/dist/chunk-EHHQJTAU.js +131 -0
  122. package/dist/chunk-EHHQJTAU.js.map +1 -0
  123. package/dist/{chunk-EBA5DA77.js → chunk-EOU6V4IN.js} +2 -2
  124. package/dist/{chunk-GD7BWGIB.js → chunk-EU6IRUCY.js} +6 -4
  125. package/dist/{chunk-GD7BWGIB.js.map → chunk-EU6IRUCY.js.map} +1 -1
  126. package/dist/{chunk-7KYJNHGM.js → chunk-EUCYTCFP.js} +2 -2
  127. package/dist/{chunk-YNDLCWXS.js → chunk-EZ25VE3G.js} +4 -4
  128. package/dist/{chunk-CKUUP64O.js → chunk-F2772ATT.js} +2 -2
  129. package/dist/{chunk-46EST7JO.js → chunk-F2XNSIPP.js} +2 -2
  130. package/dist/{chunk-2KRNPFPK.js → chunk-FLI6DEIU.js} +2 -2
  131. package/dist/{chunk-OAIWPB2I.js → chunk-FT4UQYOV.js} +2 -2
  132. package/dist/{chunk-HYNEDMYJ.js → chunk-G2OYFTUD.js} +2 -2
  133. package/dist/{chunk-XTN54NML.js → chunk-G3T6YMBO.js} +4 -4
  134. package/dist/{chunk-CNG2XVZG.js → chunk-G3UUAQOD.js} +2 -2
  135. package/dist/{chunk-2ZQJLBV6.js → chunk-GCVDFX66.js} +4 -4
  136. package/dist/{chunk-ON4ILX3G.js → chunk-GFAM2LTC.js} +2 -2
  137. package/dist/{chunk-2LUSQV4U.js → chunk-GKJJNO7C.js} +2 -2
  138. package/dist/{chunk-T2YX56QI.js → chunk-GQJKVQJR.js} +2 -2
  139. package/dist/{chunk-5AOAQR37.js → chunk-GWVNGDJW.js} +3 -3
  140. package/dist/{chunk-YDH2FSDI.js → chunk-GZXXPCWJ.js} +3 -3
  141. package/dist/{chunk-5JCLELOP.js → chunk-H5IUN433.js} +2 -2
  142. package/dist/{chunk-IWHEJXR2.js → chunk-H6FREOYX.js} +8 -8
  143. package/dist/{chunk-B7CANWCA.js → chunk-HBAOOSHU.js} +2 -2
  144. package/dist/{chunk-Q4E24IRR.js → chunk-HDN7IVIO.js} +14 -11
  145. package/dist/chunk-HDN7IVIO.js.map +1 -0
  146. package/dist/{chunk-T3FMRLWQ.js → chunk-HFSPY26A.js} +2 -2
  147. package/dist/{chunk-B657ZGDH.js → chunk-HQSK2INQ.js} +2 -2
  148. package/dist/{chunk-RT6D3WN7.js → chunk-IJMDBYCO.js} +2 -2
  149. package/dist/{chunk-CS2JEHTB.js → chunk-IUCPLBDS.js} +9 -9
  150. package/dist/{chunk-XRBHXUTQ.js → chunk-IWD33CF4.js} +6 -6
  151. package/dist/{chunk-4IHBN6WU.js → chunk-JKMIGCK6.js} +2 -2
  152. package/dist/{chunk-YYO447A7.js → chunk-JNIVZNIB.js} +41 -253
  153. package/dist/chunk-JNIVZNIB.js.map +1 -0
  154. package/dist/{chunk-ROBHL3GL.js → chunk-JWX2Q6HS.js} +2 -2
  155. package/dist/{chunk-3I3U6FFT.js → chunk-K7BN34IA.js} +2 -2
  156. package/dist/{chunk-4O6WRBGE.js → chunk-KJXP6RUG.js} +5 -1
  157. package/dist/chunk-KJXP6RUG.js.map +1 -0
  158. package/dist/{chunk-4THZGKQ2.js → chunk-KLJVTZ3R.js} +3 -3
  159. package/dist/{chunk-4G4B3Z2B.js → chunk-KW4AJ7T3.js} +2 -2
  160. package/dist/{chunk-HT2C4EXO.js → chunk-L5VCT7LU.js} +8 -4
  161. package/dist/chunk-L5VCT7LU.js.map +1 -0
  162. package/dist/{chunk-ZI7LMSNI.js → chunk-LLHZZOIB.js} +2 -2
  163. package/dist/{chunk-LS2FHUML.js → chunk-LQ5SS4OP.js} +3 -3
  164. package/dist/{chunk-NSFOERZQ.js → chunk-LWFWZTWX.js} +3 -3
  165. package/dist/{chunk-BMWN7B3Y.js → chunk-LXATZLSC.js} +3 -3
  166. package/dist/{chunk-OYKQ6T4V.js → chunk-MATDGSJ7.js} +2 -2
  167. package/dist/{chunk-3NFN4Y4P.js → chunk-MGCKZWAE.js} +5 -5
  168. package/dist/{chunk-O4KYRDRT.js → chunk-MJIOGYKX.js} +2 -2
  169. package/dist/{chunk-6OMUHXHP.js → chunk-ML7ZJAKJ.js} +2 -2
  170. package/dist/{chunk-GKIXBH7Y.js → chunk-MO6N4QYY.js} +4 -4
  171. package/dist/{chunk-A2E4WNW4.js → chunk-MWWAQXZ6.js} +2 -2
  172. package/dist/{chunk-VYPFEVOM.js → chunk-NHUX6GXA.js} +6 -6
  173. package/dist/{chunk-AKREOU5F.js → chunk-NZCKG25S.js} +2 -2
  174. package/dist/{chunk-4NDWE44P.js → chunk-NZFFGO5O.js} +2 -2
  175. package/dist/{chunk-WWSRLS4M.js → chunk-O2YPCFJT.js} +17 -17
  176. package/dist/{chunk-ZSJGYC3C.js → chunk-OQJKY3Z5.js} +2 -2
  177. package/dist/{chunk-U7VPOXVM.js → chunk-OQR42XCN.js} +82 -78
  178. package/dist/chunk-OQR42XCN.js.map +1 -0
  179. package/dist/{chunk-OFEHITAZ.js → chunk-OXNTOHL6.js} +2 -2
  180. package/dist/{chunk-FQD2KPQH.js → chunk-P55FACBG.js} +2 -2
  181. package/dist/chunk-PGRZ3FYC.js +34 -0
  182. package/dist/chunk-PGRZ3FYC.js.map +1 -0
  183. package/dist/{chunk-JYZSRNR7.js → chunk-PIITB2YZ.js} +2 -2
  184. package/dist/{chunk-PBVNVKYN.js → chunk-PIN5OPBA.js} +2 -2
  185. package/dist/chunk-PPUNC7UX.js +73 -0
  186. package/dist/chunk-PPUNC7UX.js.map +1 -0
  187. package/dist/{chunk-EQWEIIKQ.js → chunk-PQM3B54K.js} +6 -1
  188. package/dist/chunk-PQM3B54K.js.map +1 -0
  189. package/dist/{chunk-4TTGRETU.js → chunk-PRU7OF3Y.js} +5 -5
  190. package/dist/{chunk-K2FSASGZ.js → chunk-PVHQSLNN.js} +7 -7
  191. package/dist/{chunk-SVDU4OHO.js → chunk-Q35L7TYB.js} +2 -2
  192. package/dist/{chunk-5VC7J76U.js → chunk-QPH52AZB.js} +2 -2
  193. package/dist/{chunk-6T42L5FI.js → chunk-QS3OLP5I.js} +2 -2
  194. package/dist/{chunk-P34FDDB5.js → chunk-QSEUUQUF.js} +2 -2
  195. package/dist/chunk-QUIRIG2P.js +31 -0
  196. package/dist/chunk-QUIRIG2P.js.map +1 -0
  197. package/dist/{chunk-PAAJWQH5.js → chunk-QUMKDRCF.js} +2 -2
  198. package/dist/{chunk-KZEMFD6E.js → chunk-R2H4ZFBJ.js} +3 -3
  199. package/dist/{chunk-X3VID2TT.js → chunk-RI2KCQHP.js} +7 -3
  200. package/dist/chunk-RI2KCQHP.js.map +1 -0
  201. package/dist/{chunk-JFVCDEIC.js → chunk-RP7PQWZM.js} +7 -7
  202. package/dist/{chunk-KC46VZR5.js → chunk-RTTPBBAN.js} +9 -9
  203. package/dist/{chunk-ZQ3WU6JO.js → chunk-RXFCU3CY.js} +2 -2
  204. package/dist/{chunk-CBP4HWCL.js → chunk-RYYVMZBR.js} +3 -3
  205. package/dist/{chunk-2NCBDGND.js → chunk-SA6GMZJY.js} +3 -3
  206. package/dist/{chunk-VFTK5WKI.js → chunk-STBX5X6B.js} +2 -2
  207. package/dist/{chunk-WVHRNAXL.js → chunk-SWWHIJUJ.js} +2 -2
  208. package/dist/{chunk-WADSXS4K.js → chunk-SX4QDWXK.js} +2 -2
  209. package/dist/{chunk-WETFW255.js → chunk-T7ASDYNK.js} +2 -2
  210. package/dist/{chunk-XZLWYZ7C.js → chunk-THEPGZBM.js} +2 -2
  211. package/dist/{chunk-YEM7K3KD.js → chunk-TMC7HBED.js} +6 -6
  212. package/dist/{chunk-RWRQ67OR.js → chunk-TPNCXSXP.js} +2 -2
  213. package/dist/{chunk-LZKOVXMX.js → chunk-TRMJ6BYC.js} +2 -2
  214. package/dist/{chunk-A6TVQ3QP.js → chunk-UGYUBENJ.js} +3 -3
  215. package/dist/{chunk-AAM66QCP.js → chunk-UZRSI6NX.js} +2 -2
  216. package/dist/{chunk-XHWJRUVP.js → chunk-V3TXIXXY.js} +3 -3
  217. package/dist/{chunk-2CXQZXWM.js → chunk-V4MB5ONM.js} +6 -6
  218. package/dist/{chunk-UOKPJFO3.js → chunk-VNZMZPAC.js} +3 -3
  219. package/dist/{chunk-FZB4TS2W.js → chunk-VPXIKBPX.js} +5 -5
  220. package/dist/{chunk-CYEK6Z3P.js → chunk-VW6VIJOS.js} +2 -2
  221. package/dist/{chunk-QUA7RLK6.js → chunk-W3FVQBGF.js} +2 -2
  222. package/dist/{chunk-6OQ6N5RP.js → chunk-WGTR573G.js} +22 -22
  223. package/dist/{chunk-W3K3HITK.js → chunk-WLT6LTQP.js} +2 -2
  224. package/dist/{chunk-6Z2AZ4AJ.js → chunk-XKRXN63M.js} +2 -2
  225. package/dist/{chunk-3J5JKBYD.js → chunk-XLBFX63V.js} +80 -77
  226. package/dist/chunk-XLBFX63V.js.map +1 -0
  227. package/dist/{chunk-FZVROZKC.js → chunk-XVZA6VXC.js} +4 -4
  228. package/dist/{chunk-DA2INEB5.js → chunk-XYGQSDTH.js} +4 -4
  229. package/dist/chunk-YET735EZ.js +99 -0
  230. package/dist/chunk-YET735EZ.js.map +1 -0
  231. package/dist/{chunk-RBJQYMMT.js → chunk-YRULQW5J.js} +4 -4
  232. package/dist/{chunk-QUNDYIYZ.js → chunk-YYEOR4XN.js} +3 -3
  233. package/dist/{chunk-6WHJ2EAB.js → chunk-Z64TS5V4.js} +2 -2
  234. package/dist/{chunk-NHLLKEKK.js → chunk-ZAJLJ35W.js} +2 -2
  235. package/dist/{chunk-M7V65M6H.js → chunk-ZKHSAMTE.js} +2 -2
  236. package/dist/cli.d.ts.map +1 -1
  237. package/dist/cli.js +154 -150
  238. package/dist/coding/export-okf-codegraph.js +32 -28
  239. package/dist/coding/export-okf-codegraph.js.map +1 -1
  240. package/dist/coding/pre-action-gate.js +4 -3
  241. package/dist/commitment-ledger.js +3 -2
  242. package/dist/compounding/engine.js +34 -30
  243. package/dist/config.js +43 -39
  244. package/dist/connectors/codex-materialize-runner.js +32 -28
  245. package/dist/connectors/index.js +32 -28
  246. package/dist/console/trace.d.ts +5 -14
  247. package/dist/console/trace.d.ts.map +1 -1
  248. package/dist/consolidation-provenance-check.d.ts.map +1 -1
  249. package/dist/consolidation-provenance-check.js +8 -6
  250. package/dist/consolidation-undo.js +5 -4
  251. package/dist/consolidation-undo.js.map +1 -1
  252. package/dist/contradiction/index.js +9 -7
  253. package/dist/converge-config.d.ts +2 -0
  254. package/dist/converge-config.d.ts.map +1 -1
  255. package/dist/converge-config.js +7 -3
  256. package/dist/convergence-refresh.js +34 -30
  257. package/dist/corpus-watermark.js +34 -30
  258. package/dist/correction/correction-planner.d.ts.map +1 -1
  259. package/dist/cue-anchors.js +4 -3
  260. package/dist/dashboard-runtime.js +2 -2
  261. package/dist/deep-recall-http-glue.js +14 -13
  262. package/dist/deep-recall.js +2 -2
  263. package/dist/{dreams-ledger-567VKVOU.js → dreams-ledger-UCHHRQ4R.js} +3 -2
  264. package/dist/embedding-fallback.js +5 -4
  265. package/dist/embedding-generation-lock.js +4 -3
  266. package/dist/entity-retrieval.js +33 -29
  267. package/dist/eval-trajectory-store.js +4 -3
  268. package/dist/eval-trajectory.js +4 -3
  269. package/dist/evals.js +3 -2
  270. package/dist/explicit-capture.js +11 -8
  271. package/dist/external-wiki-access.js +97 -93
  272. package/dist/extraction-quote-grounding.d.ts +67 -0
  273. package/dist/extraction-quote-grounding.d.ts.map +1 -0
  274. package/dist/extraction-quote-grounding.js +27 -0
  275. package/dist/extraction-quote-grounding.js.map +1 -0
  276. package/dist/extraction-source-grounding-helpers.d.ts +8 -0
  277. package/dist/extraction-source-grounding-helpers.d.ts.map +1 -1
  278. package/dist/extraction-source-grounding-helpers.js +11 -1
  279. package/dist/extraction-source-grounding-rules.d.ts +3 -1
  280. package/dist/extraction-source-grounding-rules.d.ts.map +1 -1
  281. package/dist/extraction-source-grounding-rules.js +3 -2
  282. package/dist/extraction-source-grounding.d.ts +1 -1
  283. package/dist/extraction-source-grounding.d.ts.map +1 -1
  284. package/dist/extraction-source-grounding.js +4 -3
  285. package/dist/extraction-span-materialize.js +2 -2
  286. package/dist/extraction.js +44 -39
  287. package/dist/{first-start-migration-HYAMKJ6V.js → first-start-migration-QVD22WWS.js} +9 -8
  288. package/dist/{first-start-migration-HYAMKJ6V.js.map → first-start-migration-QVD22WWS.js.map} +1 -1
  289. package/dist/{forget-OHAJ6PSU.js → forget-GXBWFKRC.js} +5 -4
  290. package/dist/{forget-OHAJ6PSU.js.map → forget-GXBWFKRC.js.map} +1 -1
  291. package/dist/{graph-edge-decay-CZ3SYLM4.js → graph-edge-decay-BYPZVJT4.js} +10 -9
  292. package/dist/graph-edge-decay-BYPZVJT4.js.map +1 -0
  293. package/dist/graph-jsonl.js +8 -7
  294. package/dist/graph-snapshot.js +8 -7
  295. package/dist/graph-write-lock.js +4 -3
  296. package/dist/graph.js +9 -8
  297. package/dist/harmonic-construction.js +5 -4
  298. package/dist/harmonic-retrieval.js +36 -32
  299. package/dist/harmonic-source-lookup.js +3 -2
  300. package/dist/http-retry.js +2 -1
  301. package/dist/http-retry.js.map +1 -1
  302. package/dist/index.d.ts +1 -1
  303. package/dist/index.d.ts.map +1 -1
  304. package/dist/index.js +244 -237
  305. package/dist/json-store.d.ts.map +1 -1
  306. package/dist/json-store.js +2 -1
  307. package/dist/lcm/engine.js +4 -4
  308. package/dist/lcm/index.js +12 -12
  309. package/dist/location/index.js +35 -31
  310. package/dist/maintenance/dreams-ledger.d.ts.map +1 -1
  311. package/dist/maintenance/memory-governance.d.ts.map +1 -1
  312. package/dist/maintenance/memory-governance.js +32 -28
  313. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +32 -28
  314. package/dist/maintenance/rebuild-memory-projection-runner.js +34 -30
  315. package/dist/maintenance/rebuild-memory-projection.js +33 -29
  316. package/dist/memory-browse-operations.js +97 -93
  317. package/dist/memory-browse.js +7 -7
  318. package/dist/memory-subject.js +5 -4
  319. package/dist/namespaces/migrate.js +33 -29
  320. package/dist/namespaces/search.js +11 -10
  321. package/dist/namespaces/storage.d.ts.map +1 -1
  322. package/dist/namespaces/storage.js +32 -28
  323. package/dist/objective-state-writers.js +4 -3
  324. package/dist/objective-state.js +3 -2
  325. package/dist/offline-sync-changeset-generations.js +7 -6
  326. package/dist/offline-sync-embedding-generation.js +6 -5
  327. package/dist/offline-sync-impression-drain.js +4 -4
  328. package/dist/offline-sync-snapshot-stream.js +10 -9
  329. package/dist/offline-sync.d.ts.map +1 -1
  330. package/dist/offline-sync.js +11 -10
  331. package/dist/operator-doctor-corpus.js +35 -31
  332. package/dist/operator-toolkit.js +58 -54
  333. package/dist/orchestration/maintenance.js +44 -40
  334. package/dist/orchestrator.js +205 -200
  335. package/dist/page-versioning.js +5 -4
  336. package/dist/profiling.d.ts.map +1 -1
  337. package/dist/profiling.js +2 -1
  338. package/dist/qmd-daemon-session.js +2 -2
  339. package/dist/qmd.js +4 -4
  340. package/dist/recall-explain-renderer.js +3 -3
  341. package/dist/recall-navigate-access.js +2 -2
  342. package/dist/recall-navigate-disclosure.js +2 -2
  343. package/dist/recall-navigate.js +2 -2
  344. package/dist/recall-navigation-operations.js +97 -93
  345. package/dist/recall-navigation.js +96 -92
  346. package/dist/recall-state-view-admission.js +7 -7
  347. package/dist/recall-state.js +4 -3
  348. package/dist/recall-why-service.js +7 -7
  349. package/dist/recall-xray-cli.js +4 -4
  350. package/dist/recall-xray-renderer.js +3 -3
  351. package/dist/recall-xray.js +2 -2
  352. package/dist/reconcile/cursor.js +4 -2
  353. package/dist/reconcile/cursor.js.map +1 -1
  354. package/dist/reconcile/manifest.js +9 -6
  355. package/dist/reconcile/plan.js +4 -2
  356. package/dist/{resolution-EKJHREVJ.js → resolution-ZU5BIAJA.js} +10 -8
  357. package/dist/resolution-ZU5BIAJA.js.map +1 -0
  358. package/dist/resume-bundles.js +48 -44
  359. package/dist/retrieval-agents.d.ts +1 -1
  360. package/dist/retrieval-agents.d.ts.map +1 -1
  361. package/dist/retrieval-agents.js +7 -1
  362. package/dist/salvage-envelope.js +7 -6
  363. package/dist/search/document-scanner.d.ts.map +1 -1
  364. package/dist/search/document-scanner.js +2 -1
  365. package/dist/search/factory.js +10 -9
  366. package/dist/search/index.js +16 -15
  367. package/dist/search/lancedb-backend.js +3 -2
  368. package/dist/search/meilisearch-backend.js +3 -2
  369. package/dist/search/orama-backend.js +3 -2
  370. package/dist/semantic-consolidation.js +37 -33
  371. package/dist/semantic-rule-promotion.js +32 -28
  372. package/dist/semantic-rule-verifier.js +32 -28
  373. package/dist/source-agent-qualifier.js +40 -35
  374. package/dist/standup/build.js +32 -28
  375. package/dist/storage/content-hash-index.d.ts +10 -0
  376. package/dist/storage/content-hash-index.d.ts.map +1 -1
  377. package/dist/storage/entity-canonical-id-migration.d.ts.map +1 -1
  378. package/dist/storage/entity-store.d.ts +32 -1
  379. package/dist/storage/entity-store.d.ts.map +1 -1
  380. package/dist/storage/memory-read-store.d.ts.map +1 -1
  381. package/dist/storage/supersession-audit.d.ts.map +1 -1
  382. package/dist/storage/tombstone-blocked-capture-index.d.ts +3 -0
  383. package/dist/storage/tombstone-blocked-capture-index.d.ts.map +1 -1
  384. package/dist/storage/tombstone-blocked-capture-mutation.d.ts +23 -3
  385. package/dist/storage/tombstone-blocked-capture-mutation.d.ts.map +1 -1
  386. package/dist/storage.d.ts +6 -0
  387. package/dist/storage.d.ts.map +1 -1
  388. package/dist/storage.js +33 -29
  389. package/dist/subject-config.js +6 -5
  390. package/dist/summarizer.js +4 -4
  391. package/dist/summary-snapshot.js +4 -3
  392. package/dist/support-passport/index.js +99 -95
  393. package/dist/{tier-stats-RQM76XYY.js → tier-stats-C3IAMS4X.js} +6 -5
  394. package/dist/{tier-stats-RQM76XYY.js.map → tier-stats-C3IAMS4X.js.map} +1 -1
  395. package/dist/{trace-LXXCMZJA.js → trace-QBQVS5BC.js} +5 -21
  396. package/dist/trace-QBQVS5BC.js.map +1 -0
  397. package/dist/transcript.d.ts.map +1 -1
  398. package/dist/transcript.js +2 -1
  399. package/dist/transfer/autodetect.js +1 -1
  400. package/dist/transfer/backup.js +1 -1
  401. package/dist/transfer/capsule-export.js +3 -3
  402. package/dist/transfer/capsule-import.js +7 -6
  403. package/dist/transfer/export-okf.js +32 -28
  404. package/dist/trust-zones.js +3 -2
  405. package/dist/types.d.ts +9 -0
  406. package/dist/types.d.ts.map +1 -1
  407. package/dist/types.js +1 -1
  408. package/dist/utility-learner.js +4 -3
  409. package/dist/utility-runtime.js +5 -4
  410. package/dist/utility-telemetry.js +3 -2
  411. package/dist/utils/macos-replication-junk.d.ts +32 -0
  412. package/dist/utils/macos-replication-junk.d.ts.map +1 -0
  413. package/dist/utils/malformed-entity-record.d.ts +24 -0
  414. package/dist/utils/malformed-entity-record.d.ts.map +1 -0
  415. package/dist/utils/serialize-mutations.js +3 -2
  416. package/dist/utils/sleep.d.ts +6 -0
  417. package/dist/utils/sleep.d.ts.map +1 -1
  418. package/dist/verified-recall.js +32 -28
  419. package/dist/who-knows-cli.js +33 -29
  420. package/dist/who-knows.js +32 -28
  421. package/dist/work-product-ledger.js +3 -2
  422. package/dist/write-envelope.js +6 -5
  423. package/package.json +22 -2
  424. package/src/calibration.ts +3 -2
  425. package/src/capture-write-lock-backoff.test.ts +534 -0
  426. package/src/capture-write-lock-backoff.ts +140 -0
  427. package/src/capture-write-lock.ts +8 -0
  428. package/src/cli.ts +2 -2
  429. package/src/console/trace.ts +5 -36
  430. package/src/consolidation-provenance-check.ts +2 -0
  431. package/src/converge-config.ts +80 -1
  432. package/src/correction/correction-planner.ts +3 -2
  433. package/src/extraction-quote-grounding.test.ts +546 -0
  434. package/src/extraction-quote-grounding.ts +232 -0
  435. package/src/extraction-source-grounding-helpers.ts +35 -0
  436. package/src/extraction-source-grounding-rules.ts +90 -65
  437. package/src/extraction-source-grounding.ts +11 -2
  438. package/src/index.ts +1 -1
  439. package/src/json-store.ts +3 -0
  440. package/src/macos-replication-junk-scanners.test.ts +275 -0
  441. package/src/maintenance/dreams-ledger.ts +2 -0
  442. package/src/maintenance/memory-governance.ts +2 -0
  443. package/src/namespaces/storage.ts +2 -0
  444. package/src/offline-sync-macos-junk.test.ts +169 -0
  445. package/src/offline-sync.ts +7 -0
  446. package/src/profiling.ts +2 -1
  447. package/src/providers/codex-subscription.test.ts +15 -3
  448. package/src/retrieval-agents.ts +29 -12
  449. package/src/search/document-scanner.ts +4 -0
  450. package/src/storage/content-hash-index.ts +10 -0
  451. package/src/storage/entity-canonical-id-migration.ts +56 -13
  452. package/src/storage/entity-store.ts +173 -15
  453. package/src/storage/memory-read-store.ts +30 -5
  454. package/src/storage/supersession-audit.ts +2 -0
  455. package/src/storage/tombstone-blocked-capture-index.ts +8 -1
  456. package/src/storage/tombstone-blocked-capture-mutation.ts +133 -43
  457. package/src/storage.ts +16 -2
  458. package/src/transcript.ts +11 -10
  459. package/src/types.ts +9 -0
  460. package/src/utils/macos-replication-junk.test.ts +46 -0
  461. package/src/utils/macos-replication-junk.ts +65 -0
  462. package/src/utils/malformed-entity-record.ts +101 -0
  463. package/src/utils/sleep.ts +28 -0
  464. package/dist/chunk-375ARKRS.js.map +0 -1
  465. package/dist/chunk-3J5JKBYD.js.map +0 -1
  466. package/dist/chunk-4O6WRBGE.js.map +0 -1
  467. package/dist/chunk-6MINUTGJ.js +0 -64
  468. package/dist/chunk-6MINUTGJ.js.map +0 -1
  469. package/dist/chunk-7LEQREP2.js +0 -9
  470. package/dist/chunk-7LEQREP2.js.map +0 -1
  471. package/dist/chunk-B6O2YLUR.js.map +0 -1
  472. package/dist/chunk-BLVHDY2U.js.map +0 -1
  473. package/dist/chunk-EQWEIIKQ.js.map +0 -1
  474. package/dist/chunk-HT2C4EXO.js.map +0 -1
  475. package/dist/chunk-KI6UOSNR.js.map +0 -1
  476. package/dist/chunk-MZBWIJJN.js.map +0 -1
  477. package/dist/chunk-Q4E24IRR.js.map +0 -1
  478. package/dist/chunk-QJ622LTI.js.map +0 -1
  479. package/dist/chunk-QWWMS4AE.js.map +0 -1
  480. package/dist/chunk-U7VPOXVM.js.map +0 -1
  481. package/dist/chunk-X3VID2TT.js.map +0 -1
  482. package/dist/chunk-XERVJYH2.js.map +0 -1
  483. package/dist/chunk-Y3VDGK2O.js.map +0 -1
  484. package/dist/chunk-YRH3C2OJ.js.map +0 -1
  485. package/dist/chunk-YYO447A7.js.map +0 -1
  486. package/dist/trace-LXXCMZJA.js.map +0 -1
  487. /package/dist/{auto-sync-DGJOZYGT.js.map → auto-sync-7WWAKW6F.js.map} +0 -0
  488. /package/dist/{dreams-ledger-567VKVOU.js.map → capture-write-lock-backoff.js.map} +0 -0
  489. /package/dist/{graph-edge-decay-CZ3SYLM4.js.map → capture-write-lock.js.map} +0 -0
  490. /package/dist/{chunk-KZO43HPY.js.map → chunk-22RM2ZUJ.js.map} +0 -0
  491. /package/dist/{chunk-ZUMXY4KA.js.map → chunk-22W2XWGH.js.map} +0 -0
  492. /package/dist/{chunk-PCWXLAJY.js.map → chunk-2PTH4PRL.js.map} +0 -0
  493. /package/dist/{chunk-ZIZ2G47N.js.map → chunk-2PYHLSXK.js.map} +0 -0
  494. /package/dist/{chunk-7OAIOE5P.js.map → chunk-33G67YZF.js.map} +0 -0
  495. /package/dist/{chunk-AV2OQF2O.js.map → chunk-3F3HA3R2.js.map} +0 -0
  496. /package/dist/{chunk-RP5SJ3XR.js.map → chunk-3GNIJUUE.js.map} +0 -0
  497. /package/dist/{chunk-QZZPUREO.js.map → chunk-3GYSZHMT.js.map} +0 -0
  498. /package/dist/{chunk-SWIKABKI.js.map → chunk-3Q3XD3NO.js.map} +0 -0
  499. /package/dist/{chunk-AL6EHLB5.js.map → chunk-3X3PNU3T.js.map} +0 -0
  500. /package/dist/{chunk-BTJ6CAIA.js.map → chunk-4IYIGN53.js.map} +0 -0
  501. /package/dist/{chunk-BZTRPCCH.js.map → chunk-4PDTVVSW.js.map} +0 -0
  502. /package/dist/{chunk-HM7RHKS4.js.map → chunk-4RNBLLZR.js.map} +0 -0
  503. /package/dist/{chunk-JUWJYXI4.js.map → chunk-5ATSXCAG.js.map} +0 -0
  504. /package/dist/{chunk-EHRE7ZG3.js.map → chunk-5B5WYAHQ.js.map} +0 -0
  505. /package/dist/{chunk-WCGJK4NQ.js.map → chunk-5FNZ3G6X.js.map} +0 -0
  506. /package/dist/{chunk-Y6DZ33PA.js.map → chunk-5GX5457J.js.map} +0 -0
  507. /package/dist/{chunk-EMFBC7L3.js.map → chunk-5KGYTX5O.js.map} +0 -0
  508. /package/dist/{chunk-OFCHT2TN.js.map → chunk-5LRV557D.js.map} +0 -0
  509. /package/dist/{chunk-DXHVD4DS.js.map → chunk-5SMR542T.js.map} +0 -0
  510. /package/dist/{chunk-S7LWX2PQ.js.map → chunk-655FVTCD.js.map} +0 -0
  511. /package/dist/{chunk-DGRMWDQY.js.map → chunk-66BCOVW2.js.map} +0 -0
  512. /package/dist/{chunk-5MDM7UE4.js.map → chunk-6WGMZQGG.js.map} +0 -0
  513. /package/dist/{chunk-IPLYGWQF.js.map → chunk-7LCGFUMB.js.map} +0 -0
  514. /package/dist/{chunk-5ZJYHOJT.js.map → chunk-7VQ6AI7H.js.map} +0 -0
  515. /package/dist/{chunk-KYY4EACB.js.map → chunk-7Z3DLNSD.js.map} +0 -0
  516. /package/dist/{chunk-G7NYVKD6.js.map → chunk-B2NXOVZN.js.map} +0 -0
  517. /package/dist/{chunk-B43NMCGQ.js.map → chunk-BK2BVLZW.js.map} +0 -0
  518. /package/dist/{chunk-BOOFTFFE.js.map → chunk-C2RW36YR.js.map} +0 -0
  519. /package/dist/{chunk-5JMI26Q7.js.map → chunk-CBH2Z4UA.js.map} +0 -0
  520. /package/dist/{chunk-P2S6P7X6.js.map → chunk-CFZ4SXXH.js.map} +0 -0
  521. /package/dist/{chunk-6M56RFFJ.js.map → chunk-CJRENHVZ.js.map} +0 -0
  522. /package/dist/{chunk-EGDYVYU7.js.map → chunk-CLWBFR7Q.js.map} +0 -0
  523. /package/dist/{chunk-6VAHJ2F6.js.map → chunk-DMDWFQMR.js.map} +0 -0
  524. /package/dist/{chunk-UZSBCQEC.js.map → chunk-DPSOFK4D.js.map} +0 -0
  525. /package/dist/{chunk-IZT3BVDW.js.map → chunk-DQR2LD3V.js.map} +0 -0
  526. /package/dist/{chunk-K4QY55XV.js.map → chunk-EH4BQ7LT.js.map} +0 -0
  527. /package/dist/{chunk-EBA5DA77.js.map → chunk-EOU6V4IN.js.map} +0 -0
  528. /package/dist/{chunk-7KYJNHGM.js.map → chunk-EUCYTCFP.js.map} +0 -0
  529. /package/dist/{chunk-YNDLCWXS.js.map → chunk-EZ25VE3G.js.map} +0 -0
  530. /package/dist/{chunk-CKUUP64O.js.map → chunk-F2772ATT.js.map} +0 -0
  531. /package/dist/{chunk-46EST7JO.js.map → chunk-F2XNSIPP.js.map} +0 -0
  532. /package/dist/{chunk-2KRNPFPK.js.map → chunk-FLI6DEIU.js.map} +0 -0
  533. /package/dist/{chunk-OAIWPB2I.js.map → chunk-FT4UQYOV.js.map} +0 -0
  534. /package/dist/{chunk-HYNEDMYJ.js.map → chunk-G2OYFTUD.js.map} +0 -0
  535. /package/dist/{chunk-XTN54NML.js.map → chunk-G3T6YMBO.js.map} +0 -0
  536. /package/dist/{chunk-CNG2XVZG.js.map → chunk-G3UUAQOD.js.map} +0 -0
  537. /package/dist/{chunk-2ZQJLBV6.js.map → chunk-GCVDFX66.js.map} +0 -0
  538. /package/dist/{chunk-ON4ILX3G.js.map → chunk-GFAM2LTC.js.map} +0 -0
  539. /package/dist/{chunk-2LUSQV4U.js.map → chunk-GKJJNO7C.js.map} +0 -0
  540. /package/dist/{chunk-T2YX56QI.js.map → chunk-GQJKVQJR.js.map} +0 -0
  541. /package/dist/{chunk-5AOAQR37.js.map → chunk-GWVNGDJW.js.map} +0 -0
  542. /package/dist/{chunk-YDH2FSDI.js.map → chunk-GZXXPCWJ.js.map} +0 -0
  543. /package/dist/{chunk-5JCLELOP.js.map → chunk-H5IUN433.js.map} +0 -0
  544. /package/dist/{chunk-IWHEJXR2.js.map → chunk-H6FREOYX.js.map} +0 -0
  545. /package/dist/{chunk-B7CANWCA.js.map → chunk-HBAOOSHU.js.map} +0 -0
  546. /package/dist/{chunk-T3FMRLWQ.js.map → chunk-HFSPY26A.js.map} +0 -0
  547. /package/dist/{chunk-B657ZGDH.js.map → chunk-HQSK2INQ.js.map} +0 -0
  548. /package/dist/{chunk-RT6D3WN7.js.map → chunk-IJMDBYCO.js.map} +0 -0
  549. /package/dist/{chunk-CS2JEHTB.js.map → chunk-IUCPLBDS.js.map} +0 -0
  550. /package/dist/{chunk-XRBHXUTQ.js.map → chunk-IWD33CF4.js.map} +0 -0
  551. /package/dist/{chunk-4IHBN6WU.js.map → chunk-JKMIGCK6.js.map} +0 -0
  552. /package/dist/{chunk-ROBHL3GL.js.map → chunk-JWX2Q6HS.js.map} +0 -0
  553. /package/dist/{chunk-3I3U6FFT.js.map → chunk-K7BN34IA.js.map} +0 -0
  554. /package/dist/{chunk-4THZGKQ2.js.map → chunk-KLJVTZ3R.js.map} +0 -0
  555. /package/dist/{chunk-4G4B3Z2B.js.map → chunk-KW4AJ7T3.js.map} +0 -0
  556. /package/dist/{chunk-ZI7LMSNI.js.map → chunk-LLHZZOIB.js.map} +0 -0
  557. /package/dist/{chunk-LS2FHUML.js.map → chunk-LQ5SS4OP.js.map} +0 -0
  558. /package/dist/{chunk-NSFOERZQ.js.map → chunk-LWFWZTWX.js.map} +0 -0
  559. /package/dist/{chunk-BMWN7B3Y.js.map → chunk-LXATZLSC.js.map} +0 -0
  560. /package/dist/{chunk-OYKQ6T4V.js.map → chunk-MATDGSJ7.js.map} +0 -0
  561. /package/dist/{chunk-3NFN4Y4P.js.map → chunk-MGCKZWAE.js.map} +0 -0
  562. /package/dist/{chunk-O4KYRDRT.js.map → chunk-MJIOGYKX.js.map} +0 -0
  563. /package/dist/{chunk-6OMUHXHP.js.map → chunk-ML7ZJAKJ.js.map} +0 -0
  564. /package/dist/{chunk-GKIXBH7Y.js.map → chunk-MO6N4QYY.js.map} +0 -0
  565. /package/dist/{chunk-A2E4WNW4.js.map → chunk-MWWAQXZ6.js.map} +0 -0
  566. /package/dist/{chunk-VYPFEVOM.js.map → chunk-NHUX6GXA.js.map} +0 -0
  567. /package/dist/{chunk-AKREOU5F.js.map → chunk-NZCKG25S.js.map} +0 -0
  568. /package/dist/{chunk-4NDWE44P.js.map → chunk-NZFFGO5O.js.map} +0 -0
  569. /package/dist/{chunk-WWSRLS4M.js.map → chunk-O2YPCFJT.js.map} +0 -0
  570. /package/dist/{chunk-ZSJGYC3C.js.map → chunk-OQJKY3Z5.js.map} +0 -0
  571. /package/dist/{chunk-OFEHITAZ.js.map → chunk-OXNTOHL6.js.map} +0 -0
  572. /package/dist/{chunk-FQD2KPQH.js.map → chunk-P55FACBG.js.map} +0 -0
  573. /package/dist/{chunk-JYZSRNR7.js.map → chunk-PIITB2YZ.js.map} +0 -0
  574. /package/dist/{chunk-PBVNVKYN.js.map → chunk-PIN5OPBA.js.map} +0 -0
  575. /package/dist/{chunk-4TTGRETU.js.map → chunk-PRU7OF3Y.js.map} +0 -0
  576. /package/dist/{chunk-K2FSASGZ.js.map → chunk-PVHQSLNN.js.map} +0 -0
  577. /package/dist/{chunk-SVDU4OHO.js.map → chunk-Q35L7TYB.js.map} +0 -0
  578. /package/dist/{chunk-5VC7J76U.js.map → chunk-QPH52AZB.js.map} +0 -0
  579. /package/dist/{chunk-6T42L5FI.js.map → chunk-QS3OLP5I.js.map} +0 -0
  580. /package/dist/{chunk-P34FDDB5.js.map → chunk-QSEUUQUF.js.map} +0 -0
  581. /package/dist/{chunk-PAAJWQH5.js.map → chunk-QUMKDRCF.js.map} +0 -0
  582. /package/dist/{chunk-KZEMFD6E.js.map → chunk-R2H4ZFBJ.js.map} +0 -0
  583. /package/dist/{chunk-JFVCDEIC.js.map → chunk-RP7PQWZM.js.map} +0 -0
  584. /package/dist/{chunk-KC46VZR5.js.map → chunk-RTTPBBAN.js.map} +0 -0
  585. /package/dist/{chunk-ZQ3WU6JO.js.map → chunk-RXFCU3CY.js.map} +0 -0
  586. /package/dist/{chunk-CBP4HWCL.js.map → chunk-RYYVMZBR.js.map} +0 -0
  587. /package/dist/{chunk-2NCBDGND.js.map → chunk-SA6GMZJY.js.map} +0 -0
  588. /package/dist/{chunk-VFTK5WKI.js.map → chunk-STBX5X6B.js.map} +0 -0
  589. /package/dist/{chunk-WVHRNAXL.js.map → chunk-SWWHIJUJ.js.map} +0 -0
  590. /package/dist/{chunk-WADSXS4K.js.map → chunk-SX4QDWXK.js.map} +0 -0
  591. /package/dist/{chunk-WETFW255.js.map → chunk-T7ASDYNK.js.map} +0 -0
  592. /package/dist/{chunk-XZLWYZ7C.js.map → chunk-THEPGZBM.js.map} +0 -0
  593. /package/dist/{chunk-YEM7K3KD.js.map → chunk-TMC7HBED.js.map} +0 -0
  594. /package/dist/{chunk-RWRQ67OR.js.map → chunk-TPNCXSXP.js.map} +0 -0
  595. /package/dist/{chunk-LZKOVXMX.js.map → chunk-TRMJ6BYC.js.map} +0 -0
  596. /package/dist/{chunk-A6TVQ3QP.js.map → chunk-UGYUBENJ.js.map} +0 -0
  597. /package/dist/{chunk-AAM66QCP.js.map → chunk-UZRSI6NX.js.map} +0 -0
  598. /package/dist/{chunk-XHWJRUVP.js.map → chunk-V3TXIXXY.js.map} +0 -0
  599. /package/dist/{chunk-2CXQZXWM.js.map → chunk-V4MB5ONM.js.map} +0 -0
  600. /package/dist/{chunk-UOKPJFO3.js.map → chunk-VNZMZPAC.js.map} +0 -0
  601. /package/dist/{chunk-FZB4TS2W.js.map → chunk-VPXIKBPX.js.map} +0 -0
  602. /package/dist/{chunk-CYEK6Z3P.js.map → chunk-VW6VIJOS.js.map} +0 -0
  603. /package/dist/{chunk-QUA7RLK6.js.map → chunk-W3FVQBGF.js.map} +0 -0
  604. /package/dist/{chunk-6OQ6N5RP.js.map → chunk-WGTR573G.js.map} +0 -0
  605. /package/dist/{chunk-W3K3HITK.js.map → chunk-WLT6LTQP.js.map} +0 -0
  606. /package/dist/{chunk-6Z2AZ4AJ.js.map → chunk-XKRXN63M.js.map} +0 -0
  607. /package/dist/{chunk-FZVROZKC.js.map → chunk-XVZA6VXC.js.map} +0 -0
  608. /package/dist/{chunk-DA2INEB5.js.map → chunk-XYGQSDTH.js.map} +0 -0
  609. /package/dist/{chunk-RBJQYMMT.js.map → chunk-YRULQW5J.js.map} +0 -0
  610. /package/dist/{chunk-QUNDYIYZ.js.map → chunk-YYEOR4XN.js.map} +0 -0
  611. /package/dist/{chunk-6WHJ2EAB.js.map → chunk-Z64TS5V4.js.map} +0 -0
  612. /package/dist/{chunk-NHLLKEKK.js.map → chunk-ZAJLJ35W.js.map} +0 -0
  613. /package/dist/{chunk-M7V65M6H.js.map → chunk-ZKHSAMTE.js.map} +0 -0
  614. /package/dist/{resolution-EKJHREVJ.js.map → dreams-ledger-UCHHRQ4R.js.map} +0 -0
@@ -1,21 +1,22 @@
1
1
  import {
2
2
  ExtractionEngine,
3
3
  shouldEnableLocalExtractionThinking
4
- } from "./chunk-XRBHXUTQ.js";
5
- import "./chunk-ZUMXY4KA.js";
4
+ } from "./chunk-IWD33CF4.js";
5
+ import "./chunk-22W2XWGH.js";
6
6
  import "./chunk-54V4BZWP.js";
7
7
  import "./chunk-2CGLBUW3.js";
8
8
  import "./chunk-AAQA6ZUP.js";
9
9
  import "./chunk-JHU4EYDV.js";
10
10
  import "./chunk-E4X2YX2F.js";
11
- import "./chunk-FZVROZKC.js";
11
+ import "./chunk-XVZA6VXC.js";
12
+ import "./chunk-JE26AUX6.js";
12
13
  import "./chunk-A6CXG5WI.js";
13
14
  import "./chunk-QJ2AX6DU.js";
14
- import "./chunk-JE26AUX6.js";
15
- import "./chunk-YRH3C2OJ.js";
16
- import "./chunk-375ARKRS.js";
15
+ import "./chunk-CIIHIAJ2.js";
16
+ import "./chunk-D5SSBCYY.js";
17
+ import "./chunk-77R7BQZ2.js";
18
+ import "./chunk-AIYXVWUH.js";
17
19
  import "./chunk-BVRZSI7Q.js";
18
- import "./chunk-LNH76ZJX.js";
19
20
  import {
20
21
  classifyExtractionThrownError,
21
22
  classifyFallbackParseFailure,
@@ -32,13 +33,13 @@ import "./chunk-EI6V5UXY.js";
32
33
  import "./chunk-M7KGIW5F.js";
33
34
  import "./chunk-5TJEOU6Y.js";
34
35
  import "./chunk-754XN6LX.js";
35
- import "./chunk-BLVHDY2U.js";
36
+ import "./chunk-DOWACHYO.js";
36
37
  import "./chunk-5MA7ZLPD.js";
37
- import "./chunk-ZIZ2G47N.js";
38
+ import "./chunk-2PYHLSXK.js";
38
39
  import "./chunk-3UXOZBHV.js";
39
40
  import "./chunk-PIWFNPQT.js";
40
- import "./chunk-EGDYVYU7.js";
41
- import "./chunk-PBVNVKYN.js";
41
+ import "./chunk-CLWBFR7Q.js";
42
+ import "./chunk-PIN5OPBA.js";
42
43
  import "./chunk-CSAKJVXW.js";
43
44
  import "./chunk-K2XUWZBM.js";
44
45
  import "./chunk-OD4FM2U7.js";
@@ -52,59 +53,61 @@ import "./chunk-ADXCCZL2.js";
52
53
  import "./chunk-236PXYG7.js";
53
54
  import "./chunk-ZCUTSMR2.js";
54
55
  import "./chunk-QDW3E4RD.js";
55
- import "./chunk-Y3VDGK2O.js";
56
+ import "./chunk-4SCZZ3U7.js";
56
57
  import "./chunk-UHVXE24Y.js";
57
- import "./chunk-LZKOVXMX.js";
58
+ import "./chunk-TRMJ6BYC.js";
58
59
  import "./chunk-V4JZCTMK.js";
59
- import "./chunk-A2E4WNW4.js";
60
- import "./chunk-KC46VZR5.js";
60
+ import "./chunk-MWWAQXZ6.js";
61
+ import "./chunk-RTTPBBAN.js";
62
+ import "./chunk-655FVTCD.js";
63
+ import "./chunk-GQJKVQJR.js";
61
64
  import "./chunk-CYEPCZN5.js";
62
- import "./chunk-T3FMRLWQ.js";
65
+ import "./chunk-HFSPY26A.js";
63
66
  import "./chunk-7VO6E5UD.js";
67
+ import "./chunk-KJXP6RUG.js";
64
68
  import "./chunk-VOKHZRHW.js";
65
- import "./chunk-S7LWX2PQ.js";
66
- import "./chunk-T2YX56QI.js";
67
- import "./chunk-4O6WRBGE.js";
68
69
  import "./chunk-GUMZC2BO.js";
69
70
  import "./chunk-TFA6HPOA.js";
70
71
  import "./chunk-F4TWWUMP.js";
71
72
  import "./chunk-72A4L5JJ.js";
72
73
  import "./chunk-A7Q43EUZ.js";
73
74
  import "./chunk-S2V7RUCL.js";
75
+ import "./chunk-PPUNC7UX.js";
74
76
  import "./chunk-X3724WL4.js";
75
77
  import "./chunk-MRPOZBJC.js";
76
78
  import "./chunk-S2HLHAZ4.js";
77
- import "./chunk-LDXUBPMO.js";
78
79
  import "./chunk-DM2T26WE.js";
79
- import "./chunk-FF6N7BXC.js";
80
+ import "./chunk-LDXUBPMO.js";
80
81
  import "./chunk-2DT7PIDZ.js";
81
82
  import "./chunk-AAD2ZS6P.js";
82
- import "./chunk-YYO447A7.js";
83
+ import "./chunk-FF6N7BXC.js";
84
+ import "./chunk-JNIVZNIB.js";
85
+ import "./chunk-YXZG5TVN.js";
83
86
  import "./chunk-ZIKENA2C.js";
84
87
  import "./chunk-3OUGSOJP.js";
85
88
  import "./chunk-SCU65EZI.js";
86
89
  import "./chunk-3ONXXHQO.js";
87
- import "./chunk-YXZG5TVN.js";
88
- import "./chunk-3WU7XOFN.js";
89
90
  import "./chunk-6MKLMEBE.js";
90
- import "./chunk-QZZPUREO.js";
91
+ import "./chunk-3WU7XOFN.js";
92
+ import "./chunk-G7D6GZ5J.js";
93
+ import "./chunk-3GYSZHMT.js";
91
94
  import "./chunk-M5GVCJSJ.js";
92
95
  import "./chunk-RBOJCG4T.js";
93
- import "./chunk-4NDWE44P.js";
96
+ import "./chunk-NZFFGO5O.js";
94
97
  import "./chunk-5WITETWU.js";
95
98
  import "./chunk-6CIAGZ6X.js";
96
99
  import "./chunk-7CT3AI52.js";
97
- import "./chunk-G7D6GZ5J.js";
100
+ import "./chunk-6EDW54SQ.js";
98
101
  import "./chunk-ZJP66Q4I.js";
99
- import "./chunk-DGRMWDQY.js";
102
+ import "./chunk-66BCOVW2.js";
100
103
  import "./chunk-G26YNEOC.js";
104
+ import "./chunk-SWWHIJUJ.js";
105
+ import "./chunk-TPSLVZHS.js";
101
106
  import "./chunk-SIGAGKNE.js";
102
107
  import "./chunk-IUM3VSHI.js";
103
- import "./chunk-WVHRNAXL.js";
104
- import "./chunk-TPSLVZHS.js";
105
- import "./chunk-23G5P7TA.js";
106
108
  import "./chunk-C64XATK7.js";
107
109
  import "./chunk-42JKGUFJ.js";
110
+ import "./chunk-23G5P7TA.js";
108
111
  import "./chunk-TKC5LZ43.js";
109
112
  import "./chunk-I55KAVET.js";
110
113
  import "./chunk-L2EXJQJP.js";
@@ -118,45 +121,47 @@ import "./chunk-YCVB7X56.js";
118
121
  import "./chunk-PQVCH2AE.js";
119
122
  import "./chunk-PJKTFXE2.js";
120
123
  import "./chunk-W5BIQOAJ.js";
121
- import "./chunk-QWWMS4AE.js";
124
+ import "./chunk-3MO4LWYU.js";
122
125
  import "./chunk-YBA52OKG.js";
123
- import "./chunk-3I3U6FFT.js";
126
+ import "./chunk-K7BN34IA.js";
124
127
  import "./chunk-353C5UNV.js";
125
- import "./chunk-OFCHT2TN.js";
128
+ import "./chunk-5LRV557D.js";
126
129
  import "./chunk-BT7NVCML.js";
127
- import "./chunk-VFTK5WKI.js";
130
+ import "./chunk-STBX5X6B.js";
128
131
  import "./chunk-BJMBJZ2Y.js";
129
132
  import "./chunk-UKJAGEXH.js";
130
133
  import "./chunk-FP2373TW.js";
131
134
  import "./chunk-WC3V7HHP.js";
132
135
  import "./chunk-L272A5QW.js";
133
- import "./chunk-FQD2KPQH.js";
136
+ import "./chunk-P55FACBG.js";
134
137
  import "./chunk-ZA53AZND.js";
135
138
  import "./chunk-7RJUVTVF.js";
136
139
  import "./chunk-AL3UYZ5N.js";
137
140
  import "./chunk-RL6NEVXT.js";
141
+ import "./chunk-YET735EZ.js";
138
142
  import "./chunk-PWPIERBM.js";
139
143
  import "./chunk-IG747LRN.js";
140
144
  import "./chunk-C7HJ3NEI.js";
141
- import "./chunk-KI6UOSNR.js";
145
+ import "./chunk-DEY7B77Y.js";
142
146
  import "./chunk-5FVVY2EB.js";
143
147
  import "./chunk-BTNNL7ZW.js";
144
148
  import "./chunk-JDSVLVCG.js";
145
149
  import "./chunk-5GKPFL3S.js";
146
150
  import "./chunk-JAKIDQB2.js";
147
- import "./chunk-EHRE7ZG3.js";
151
+ import "./chunk-5B5WYAHQ.js";
148
152
  import "./chunk-P7FMDTKL.js";
149
153
  import "./chunk-ESG6ITGP.js";
150
154
  import "./chunk-PCXDUHQH.js";
151
155
  import "./chunk-VUFL7X3H.js";
152
156
  import "./chunk-C5LWPYS3.js";
153
- import "./chunk-7LEQREP2.js";
157
+ import "./chunk-PGRZ3FYC.js";
154
158
  import "./chunk-3Q3N35W7.js";
155
159
  import "./chunk-ZEFVK7XC.js";
156
160
  import "./chunk-6KH5NLQS.js";
157
161
  import "./chunk-P2QRMMVQ.js";
158
162
  import "./chunk-3MUKQQ7A.js";
159
163
  import "./chunk-BTTPKDIL.js";
164
+ import "./chunk-QUIRIG2P.js";
160
165
  import "./chunk-LDPPTPO5.js";
161
166
  import "./chunk-MAAL6OZV.js";
162
167
  import "./chunk-A6XUJE5D.js";
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  applyUtilityPromotionRuntimePolicy,
3
3
  loadUtilityRuntimeValues
4
- } from "./chunk-SWIKABKI.js";
5
- import {
6
- TierMigrationExecutor
7
- } from "./chunk-YRFAYOFQ.js";
4
+ } from "./chunk-3Q3XD3NO.js";
8
5
  import {
9
6
  decideTierTransition
10
7
  } from "./chunk-GCBIXUPT.js";
11
- import "./chunk-W3K3HITK.js";
12
- import "./chunk-EBA5DA77.js";
8
+ import {
9
+ TierMigrationExecutor
10
+ } from "./chunk-YRFAYOFQ.js";
11
+ import "./chunk-WLT6LTQP.js";
12
+ import "./chunk-EOU6V4IN.js";
13
13
  import "./chunk-TBBDFYXW.js";
14
14
  import {
15
15
  excludeSupportPassportPrivateMemories
@@ -25,7 +25,8 @@ import {
25
25
  resolveUtilityLearningCapabilities
26
26
  } from "./chunk-C5LWPYS3.js";
27
27
  import "./chunk-A2IYSXDQ.js";
28
- import "./chunk-B6O2YLUR.js";
28
+ import "./chunk-2Z5DIDQD.js";
29
+ import "./chunk-QUIRIG2P.js";
29
30
  import "./chunk-KNA3BXXL.js";
30
31
  import "./chunk-PZ5AY32C.js";
31
32
 
@@ -273,4 +274,4 @@ export {
273
274
  LIFECYCLE_INIT_DONE_MARKER,
274
275
  runFirstStartMigration
275
276
  };
276
- //# sourceMappingURL=first-start-migration-HYAMKJ6V.js.map
277
+ //# sourceMappingURL=first-start-migration-QVD22WWS.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/maintenance/first-start-migration.ts"],"sourcesContent":["/**\n * First-start lifecycle migration (issue #686 retention-completion).\n *\n * When `lifecyclePolicyEnabled` is true but the memoryDir has never been\n * touched by the lifecycle policy (i.e. the state marker\n * `.lifecycle-init-done` does not exist), run a one-time, rate-limited\n * demotion sweep so the hot tier isn't flooded on the first real cron pass.\n *\n * Design constraints:\n * - Capped at `FIRST_START_DEMOTION_CAP` (default 50) demotions per run\n * so a large pre-existing corpus doesn't stall startup.\n * - Resumable: subsequent invocations see the marker and skip.\n * - The marker is written AFTER all mutations succeed so a crash during\n * migration doesn't leave a false \"done\" marker (CLAUDE.md rule #12).\n * - Dry-run mode reports candidates without mutating anything or writing\n * the marker (safe to call from tests).\n */\n\nimport path from \"node:path\";\nimport { access, mkdir, readFile, unlink, writeFile } from \"node:fs/promises\";\nimport {\n resolveMemoryLifecycleCapabilities,\n resolveQmdCapabilities,\n resolveUtilityLearningCapabilities} from \"../capabilities.js\";\nimport type { StorageManager } from \"../storage.js\";\nimport type { PluginConfig } from \"../types.js\";\nimport {\n decideTierTransition,\n type TierRoutingPolicy,\n} from \"../tier-routing.js\";\nimport { TierMigrationExecutor } from \"../tier-migration.js\";\nimport type { SearchBackend } from \"../search/port.js\";\nimport {\n applyUtilityPromotionRuntimePolicy,\n loadUtilityRuntimeValues,\n} from \"../utility-runtime.js\";\nimport { excludeSupportPassportPrivateMemories } from \"../support-passport/card-projection.js\";\n\nexport const FIRST_START_DEMOTION_CAP = 50;\nexport const LIFECYCLE_INIT_DONE_MARKER = \".lifecycle-init-done\";\nconst LIFECYCLE_QMD_REFRESH_PENDING_MARKER = \".lifecycle-qmd-refresh-pending\";\n\ntype QmdRefreshPendingMarker = {\n createdAt: string;\n collection: string;\n};\n\nexport interface FirstStartMigrationOptions {\n storage: StorageManager;\n config: PluginConfig;\n /** Override the per-run demotion cap (default: FIRST_START_DEMOTION_CAP). */\n demotionCap?: number;\n /** When true, report candidates but do not mutate or write the marker. */\n dryRun?: boolean;\n /** Optional QMD backend used to journal demotions and refresh tier collections. */\n qmd?: SearchBackend;\n /** Hot-tier QMD collection name. Defaults to config.qmdCollection. */\n hotCollection?: string;\n /** Cold-tier QMD collection name. Defaults to config.qmdColdCollection. */\n coldCollection?: string;\n /** Optional shutdown signal. When aborted, the migration stops without writing the done marker. */\n signal?: AbortSignal;\n /** Override clock for tests. */\n now?: () => Date;\n}\n\nexport interface FirstStartMigrationResult {\n skipped: boolean;\n skipReason?: string;\n dryRun: boolean;\n candidateCount: number;\n demotedCount: number;\n /** Number of individual demotion failures. When > 0, the init-done marker is\n * NOT written so the next start can retry the failed demotions. */\n failureCount: number;\n cappedAt: number;\n}\n\nfunction markerPath(memoryDir: string): string {\n return path.join(memoryDir, \"state\", LIFECYCLE_INIT_DONE_MARKER);\n}\n\nfunction qmdRefreshPendingPath(memoryDir: string): string {\n return path.join(memoryDir, \"state\", LIFECYCLE_QMD_REFRESH_PENDING_MARKER);\n}\n\nasync function markerExists(memoryDir: string): Promise<boolean> {\n try {\n await access(markerPath(memoryDir));\n return true;\n } catch {\n return false;\n }\n}\n\nasync function writeMarker(memoryDir: string, now: Date): Promise<void> {\n const p = markerPath(memoryDir);\n await mkdir(path.dirname(p), { recursive: true });\n await writeFile(p, JSON.stringify({ createdAt: now.toISOString() }), \"utf-8\");\n}\n\nasync function readQmdRefreshPending(memoryDir: string): Promise<QmdRefreshPendingMarker | null> {\n try {\n const raw = await readFile(qmdRefreshPendingPath(memoryDir), \"utf-8\");\n const parsed = JSON.parse(raw) as unknown;\n if (\n parsed &&\n typeof parsed === \"object\" &&\n typeof (parsed as { createdAt?: unknown }).createdAt === \"string\" &&\n typeof (parsed as { collection?: unknown }).collection === \"string\" &&\n (parsed as { collection: string }).collection.length > 0\n ) {\n return parsed as QmdRefreshPendingMarker;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nasync function pathExists(p: string): Promise<boolean> {\n try {\n await access(p);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function writeQmdRefreshPending(memoryDir: string, now: Date, collection: string): Promise<void> {\n const p = qmdRefreshPendingPath(memoryDir);\n await mkdir(path.dirname(p), { recursive: true });\n await writeFile(p, JSON.stringify({ createdAt: now.toISOString(), collection }), \"utf-8\");\n}\n\nasync function clearQmdRefreshPending(memoryDir: string): Promise<void> {\n await unlink(qmdRefreshPendingPath(memoryDir)).catch(() => {});\n}\n\nasync function buildTierRoutingPolicy(config: PluginConfig): Promise<TierRoutingPolicy> {\n const basePolicy: TierRoutingPolicy = {\n enabled: resolveQmdCapabilities(config).qmdTierMigration,\n demotionMinAgeDays: config.qmdTierDemotionMinAgeDays,\n demotionValueThreshold: config.qmdTierDemotionValueThreshold,\n promotionValueThreshold: config.qmdTierPromotionValueThreshold,\n };\n const runtime = await loadUtilityRuntimeValues({\n memoryDir: config.memoryDir,\n memoryUtilityLearningEnabled: resolveUtilityLearningCapabilities(config).memoryUtilityLearning,\n promotionByOutcomeEnabled: resolveUtilityLearningCapabilities(config).promotionByOutcome,\n });\n return applyUtilityPromotionRuntimePolicy(basePolicy, runtime);\n}\n\nasync function refreshQmdCollection(\n qmd: SearchBackend,\n collection: string,\n signal?: AbortSignal,\n): Promise<void> {\n if (typeof qmd.updateCollectionStrict === \"function\") {\n await qmd.updateCollectionStrict(collection, { signal });\n return;\n }\n await qmd.updateCollection(collection, { signal });\n}\n\n/**\n * Run the first-start migration sweep. No-ops when:\n * - `lifecyclePolicyEnabled` is false, or\n * - `qmdTierMigrationEnabled` is false (no tier migration configured), or\n * - the state marker already exists (already ran).\n *\n * Returns a structured result describing what happened.\n */\nexport async function runFirstStartMigration(\n options: FirstStartMigrationOptions,\n): Promise<FirstStartMigrationResult> {\n const {\n storage,\n config,\n demotionCap = FIRST_START_DEMOTION_CAP,\n dryRun = false,\n qmd,\n signal,\n } = options;\n const now = (options.now ?? (() => new Date()))();\n const lifecycleCaps = resolveMemoryLifecycleCapabilities(config);\n const abortedResult = (candidateCount = 0, demotedCount = 0, failureCount = 0): FirstStartMigrationResult => ({\n skipped: candidateCount === 0 && demotedCount === 0 && failureCount === 0,\n skipReason: candidateCount === 0 && demotedCount === 0 && failureCount === 0 ? \"aborted\" : undefined,\n dryRun,\n candidateCount,\n demotedCount,\n failureCount,\n cappedAt: demotionCap,\n });\n\n if (signal?.aborted) {\n return abortedResult();\n }\n\n if (!lifecycleCaps.lifecyclePolicy) {\n return {\n skipped: true,\n skipReason: \"lifecyclePolicyEnabled is false\",\n dryRun,\n candidateCount: 0,\n demotedCount: 0,\n failureCount: 0,\n cappedAt: demotionCap,\n };\n }\n\n if (!resolveQmdCapabilities(config).qmdTierMigration) {\n return {\n skipped: true,\n skipReason: \"qmdTierMigrationEnabled is false\",\n dryRun,\n candidateCount: 0,\n demotedCount: 0,\n failureCount: 0,\n cappedAt: demotionCap,\n };\n }\n\n if (await markerExists(config.memoryDir)) {\n return {\n skipped: true,\n skipReason: \"lifecycle-init-done marker already present\",\n dryRun,\n candidateCount: 0,\n demotedCount: 0,\n failureCount: 0,\n cappedAt: demotionCap,\n };\n }\n\n if (signal?.aborted) {\n return abortedResult();\n }\n\n const policy = await buildTierRoutingPolicy(config);\n if (signal?.aborted) {\n return abortedResult();\n }\n\n const hotMemories = excludeSupportPassportPrivateMemories(await storage.readAllMemories());\n if (signal?.aborted) {\n return abortedResult();\n }\n\n // Find hot memories that should be demoted to cold\n const demotionCandidates = hotMemories.filter((m) => {\n const decision = decideTierTransition(m, \"hot\", policy, now);\n return decision.changed && decision.nextTier === \"cold\";\n });\n\n const candidateCount = demotionCandidates.length;\n // Apply cap\n const batch = demotionCandidates.slice(0, demotionCap);\n\n if (dryRun) {\n return {\n skipped: false,\n dryRun: true,\n candidateCount,\n demotedCount: 0,\n failureCount: 0,\n cappedAt: demotionCap,\n };\n }\n\n let demotedCount = 0;\n let failureCount = 0;\n let qmdRefreshPendingForRun = false;\n const executor = qmd\n ? new TierMigrationExecutor({\n storage,\n qmd,\n hotCollection: options.hotCollection ?? config.qmdCollection ?? \"openclaw-engram\",\n coldCollection: options.coldCollection ?? config.qmdColdCollection ?? \"openclaw-engram-cold\",\n })\n : null;\n const coldCollection = options.coldCollection ?? config.qmdColdCollection ?? \"openclaw-engram-cold\";\n\n for (const memory of batch) {\n if (signal?.aborted) {\n return abortedResult(candidateCount, demotedCount, failureCount);\n }\n try {\n const result = executor\n ? await executor.migrateMemory({\n memory,\n fromTier: \"hot\",\n toTier: \"cold\",\n reason: \"first-start-lifecycle-migration\",\n })\n : await storage.migrateMemoryToTier(memory, \"cold\");\n if (result.changed) {\n demotedCount += 1;\n }\n } catch {\n const targetPath = storage.buildTierMemoryPath(memory, \"cold\");\n const [targetExists, sourceExists] = await Promise.all([\n pathExists(targetPath),\n pathExists(memory.path),\n ]);\n const movedToCold = targetExists && !sourceExists;\n if (movedToCold) {\n if (!qmd) {\n demotedCount += 1;\n continue;\n }\n try {\n await refreshQmdCollection(qmd, coldCollection, signal);\n demotedCount += 1;\n continue;\n } catch {\n qmdRefreshPendingForRun = true;\n try {\n await writeQmdRefreshPending(config.memoryDir, now, coldCollection);\n } catch {\n // The end-of-run retry below still gets a chance to repair the QMD\n // state before we decide whether the init marker is safe to write.\n }\n demotedCount += 1;\n continue;\n }\n }\n // Non-fatal — individual migration failures are counted but do not abort\n // the sweep. We track them so the marker is only written when ALL\n // attempted demotions succeeded (CLAUDE.md rule #12: don't write a\n // success marker after a partial failure).\n failureCount += 1;\n }\n }\n\n // Write marker AFTER all mutations succeed (CLAUDE.md rule #12).\n // If any demotion failed, skip the marker so the next start retries.\n if (signal?.aborted) {\n return abortedResult(candidateCount, demotedCount, failureCount);\n }\n const persistedQmdRefreshPending = qmd ? await readQmdRefreshPending(config.memoryDir) : null;\n const hasPersistedQmdRefreshPending = persistedQmdRefreshPending?.collection === coldCollection;\n if (qmd && persistedQmdRefreshPending && persistedQmdRefreshPending.collection !== coldCollection) {\n failureCount += 1;\n }\n if (qmd && (qmdRefreshPendingForRun || hasPersistedQmdRefreshPending)) {\n try {\n await refreshQmdCollection(qmd, coldCollection, signal);\n await clearQmdRefreshPending(config.memoryDir);\n } catch {\n failureCount += 1;\n }\n }\n if (failureCount === 0) {\n await writeMarker(config.memoryDir, now);\n }\n\n return {\n skipped: false,\n dryRun: false,\n candidateCount,\n demotedCount,\n failureCount,\n cappedAt: demotionCap,\n };\n}\n"],"mappings":"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","names":["candidateCount","demotedCount","failureCount"]}
1
+ {"version":3,"sources":["../src/maintenance/first-start-migration.ts"],"sourcesContent":["/**\n * First-start lifecycle migration (issue #686 retention-completion).\n *\n * When `lifecyclePolicyEnabled` is true but the memoryDir has never been\n * touched by the lifecycle policy (i.e. the state marker\n * `.lifecycle-init-done` does not exist), run a one-time, rate-limited\n * demotion sweep so the hot tier isn't flooded on the first real cron pass.\n *\n * Design constraints:\n * - Capped at `FIRST_START_DEMOTION_CAP` (default 50) demotions per run\n * so a large pre-existing corpus doesn't stall startup.\n * - Resumable: subsequent invocations see the marker and skip.\n * - The marker is written AFTER all mutations succeed so a crash during\n * migration doesn't leave a false \"done\" marker (CLAUDE.md rule #12).\n * - Dry-run mode reports candidates without mutating anything or writing\n * the marker (safe to call from tests).\n */\n\nimport path from \"node:path\";\nimport { access, mkdir, readFile, unlink, writeFile } from \"node:fs/promises\";\nimport {\n resolveMemoryLifecycleCapabilities,\n resolveQmdCapabilities,\n resolveUtilityLearningCapabilities} from \"../capabilities.js\";\nimport type { StorageManager } from \"../storage.js\";\nimport type { PluginConfig } from \"../types.js\";\nimport {\n decideTierTransition,\n type TierRoutingPolicy,\n} from \"../tier-routing.js\";\nimport { TierMigrationExecutor } from \"../tier-migration.js\";\nimport type { SearchBackend } from \"../search/port.js\";\nimport {\n applyUtilityPromotionRuntimePolicy,\n loadUtilityRuntimeValues,\n} from \"../utility-runtime.js\";\nimport { excludeSupportPassportPrivateMemories } from \"../support-passport/card-projection.js\";\n\nexport const FIRST_START_DEMOTION_CAP = 50;\nexport const LIFECYCLE_INIT_DONE_MARKER = \".lifecycle-init-done\";\nconst LIFECYCLE_QMD_REFRESH_PENDING_MARKER = \".lifecycle-qmd-refresh-pending\";\n\ntype QmdRefreshPendingMarker = {\n createdAt: string;\n collection: string;\n};\n\nexport interface FirstStartMigrationOptions {\n storage: StorageManager;\n config: PluginConfig;\n /** Override the per-run demotion cap (default: FIRST_START_DEMOTION_CAP). */\n demotionCap?: number;\n /** When true, report candidates but do not mutate or write the marker. */\n dryRun?: boolean;\n /** Optional QMD backend used to journal demotions and refresh tier collections. */\n qmd?: SearchBackend;\n /** Hot-tier QMD collection name. Defaults to config.qmdCollection. */\n hotCollection?: string;\n /** Cold-tier QMD collection name. Defaults to config.qmdColdCollection. */\n coldCollection?: string;\n /** Optional shutdown signal. When aborted, the migration stops without writing the done marker. */\n signal?: AbortSignal;\n /** Override clock for tests. */\n now?: () => Date;\n}\n\nexport interface FirstStartMigrationResult {\n skipped: boolean;\n skipReason?: string;\n dryRun: boolean;\n candidateCount: number;\n demotedCount: number;\n /** Number of individual demotion failures. When > 0, the init-done marker is\n * NOT written so the next start can retry the failed demotions. */\n failureCount: number;\n cappedAt: number;\n}\n\nfunction markerPath(memoryDir: string): string {\n return path.join(memoryDir, \"state\", LIFECYCLE_INIT_DONE_MARKER);\n}\n\nfunction qmdRefreshPendingPath(memoryDir: string): string {\n return path.join(memoryDir, \"state\", LIFECYCLE_QMD_REFRESH_PENDING_MARKER);\n}\n\nasync function markerExists(memoryDir: string): Promise<boolean> {\n try {\n await access(markerPath(memoryDir));\n return true;\n } catch {\n return false;\n }\n}\n\nasync function writeMarker(memoryDir: string, now: Date): Promise<void> {\n const p = markerPath(memoryDir);\n await mkdir(path.dirname(p), { recursive: true });\n await writeFile(p, JSON.stringify({ createdAt: now.toISOString() }), \"utf-8\");\n}\n\nasync function readQmdRefreshPending(memoryDir: string): Promise<QmdRefreshPendingMarker | null> {\n try {\n const raw = await readFile(qmdRefreshPendingPath(memoryDir), \"utf-8\");\n const parsed = JSON.parse(raw) as unknown;\n if (\n parsed &&\n typeof parsed === \"object\" &&\n typeof (parsed as { createdAt?: unknown }).createdAt === \"string\" &&\n typeof (parsed as { collection?: unknown }).collection === \"string\" &&\n (parsed as { collection: string }).collection.length > 0\n ) {\n return parsed as QmdRefreshPendingMarker;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nasync function pathExists(p: string): Promise<boolean> {\n try {\n await access(p);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function writeQmdRefreshPending(memoryDir: string, now: Date, collection: string): Promise<void> {\n const p = qmdRefreshPendingPath(memoryDir);\n await mkdir(path.dirname(p), { recursive: true });\n await writeFile(p, JSON.stringify({ createdAt: now.toISOString(), collection }), \"utf-8\");\n}\n\nasync function clearQmdRefreshPending(memoryDir: string): Promise<void> {\n await unlink(qmdRefreshPendingPath(memoryDir)).catch(() => {});\n}\n\nasync function buildTierRoutingPolicy(config: PluginConfig): Promise<TierRoutingPolicy> {\n const basePolicy: TierRoutingPolicy = {\n enabled: resolveQmdCapabilities(config).qmdTierMigration,\n demotionMinAgeDays: config.qmdTierDemotionMinAgeDays,\n demotionValueThreshold: config.qmdTierDemotionValueThreshold,\n promotionValueThreshold: config.qmdTierPromotionValueThreshold,\n };\n const runtime = await loadUtilityRuntimeValues({\n memoryDir: config.memoryDir,\n memoryUtilityLearningEnabled: resolveUtilityLearningCapabilities(config).memoryUtilityLearning,\n promotionByOutcomeEnabled: resolveUtilityLearningCapabilities(config).promotionByOutcome,\n });\n return applyUtilityPromotionRuntimePolicy(basePolicy, runtime);\n}\n\nasync function refreshQmdCollection(\n qmd: SearchBackend,\n collection: string,\n signal?: AbortSignal,\n): Promise<void> {\n if (typeof qmd.updateCollectionStrict === \"function\") {\n await qmd.updateCollectionStrict(collection, { signal });\n return;\n }\n await qmd.updateCollection(collection, { signal });\n}\n\n/**\n * Run the first-start migration sweep. No-ops when:\n * - `lifecyclePolicyEnabled` is false, or\n * - `qmdTierMigrationEnabled` is false (no tier migration configured), or\n * - the state marker already exists (already ran).\n *\n * Returns a structured result describing what happened.\n */\nexport async function runFirstStartMigration(\n options: FirstStartMigrationOptions,\n): Promise<FirstStartMigrationResult> {\n const {\n storage,\n config,\n demotionCap = FIRST_START_DEMOTION_CAP,\n dryRun = false,\n qmd,\n signal,\n } = options;\n const now = (options.now ?? (() => new Date()))();\n const lifecycleCaps = resolveMemoryLifecycleCapabilities(config);\n const abortedResult = (candidateCount = 0, demotedCount = 0, failureCount = 0): FirstStartMigrationResult => ({\n skipped: candidateCount === 0 && demotedCount === 0 && failureCount === 0,\n skipReason: candidateCount === 0 && demotedCount === 0 && failureCount === 0 ? \"aborted\" : undefined,\n dryRun,\n candidateCount,\n demotedCount,\n failureCount,\n cappedAt: demotionCap,\n });\n\n if (signal?.aborted) {\n return abortedResult();\n }\n\n if (!lifecycleCaps.lifecyclePolicy) {\n return {\n skipped: true,\n skipReason: \"lifecyclePolicyEnabled is false\",\n dryRun,\n candidateCount: 0,\n demotedCount: 0,\n failureCount: 0,\n cappedAt: demotionCap,\n };\n }\n\n if (!resolveQmdCapabilities(config).qmdTierMigration) {\n return {\n skipped: true,\n skipReason: \"qmdTierMigrationEnabled is false\",\n dryRun,\n candidateCount: 0,\n demotedCount: 0,\n failureCount: 0,\n cappedAt: demotionCap,\n };\n }\n\n if (await markerExists(config.memoryDir)) {\n return {\n skipped: true,\n skipReason: \"lifecycle-init-done marker already present\",\n dryRun,\n candidateCount: 0,\n demotedCount: 0,\n failureCount: 0,\n cappedAt: demotionCap,\n };\n }\n\n if (signal?.aborted) {\n return abortedResult();\n }\n\n const policy = await buildTierRoutingPolicy(config);\n if (signal?.aborted) {\n return abortedResult();\n }\n\n const hotMemories = excludeSupportPassportPrivateMemories(await storage.readAllMemories());\n if (signal?.aborted) {\n return abortedResult();\n }\n\n // Find hot memories that should be demoted to cold\n const demotionCandidates = hotMemories.filter((m) => {\n const decision = decideTierTransition(m, \"hot\", policy, now);\n return decision.changed && decision.nextTier === \"cold\";\n });\n\n const candidateCount = demotionCandidates.length;\n // Apply cap\n const batch = demotionCandidates.slice(0, demotionCap);\n\n if (dryRun) {\n return {\n skipped: false,\n dryRun: true,\n candidateCount,\n demotedCount: 0,\n failureCount: 0,\n cappedAt: demotionCap,\n };\n }\n\n let demotedCount = 0;\n let failureCount = 0;\n let qmdRefreshPendingForRun = false;\n const executor = qmd\n ? new TierMigrationExecutor({\n storage,\n qmd,\n hotCollection: options.hotCollection ?? config.qmdCollection ?? \"openclaw-engram\",\n coldCollection: options.coldCollection ?? config.qmdColdCollection ?? \"openclaw-engram-cold\",\n })\n : null;\n const coldCollection = options.coldCollection ?? config.qmdColdCollection ?? \"openclaw-engram-cold\";\n\n for (const memory of batch) {\n if (signal?.aborted) {\n return abortedResult(candidateCount, demotedCount, failureCount);\n }\n try {\n const result = executor\n ? await executor.migrateMemory({\n memory,\n fromTier: \"hot\",\n toTier: \"cold\",\n reason: \"first-start-lifecycle-migration\",\n })\n : await storage.migrateMemoryToTier(memory, \"cold\");\n if (result.changed) {\n demotedCount += 1;\n }\n } catch {\n const targetPath = storage.buildTierMemoryPath(memory, \"cold\");\n const [targetExists, sourceExists] = await Promise.all([\n pathExists(targetPath),\n pathExists(memory.path),\n ]);\n const movedToCold = targetExists && !sourceExists;\n if (movedToCold) {\n if (!qmd) {\n demotedCount += 1;\n continue;\n }\n try {\n await refreshQmdCollection(qmd, coldCollection, signal);\n demotedCount += 1;\n continue;\n } catch {\n qmdRefreshPendingForRun = true;\n try {\n await writeQmdRefreshPending(config.memoryDir, now, coldCollection);\n } catch {\n // The end-of-run retry below still gets a chance to repair the QMD\n // state before we decide whether the init marker is safe to write.\n }\n demotedCount += 1;\n continue;\n }\n }\n // Non-fatal — individual migration failures are counted but do not abort\n // the sweep. We track them so the marker is only written when ALL\n // attempted demotions succeeded (CLAUDE.md rule #12: don't write a\n // success marker after a partial failure).\n failureCount += 1;\n }\n }\n\n // Write marker AFTER all mutations succeed (CLAUDE.md rule #12).\n // If any demotion failed, skip the marker so the next start retries.\n if (signal?.aborted) {\n return abortedResult(candidateCount, demotedCount, failureCount);\n }\n const persistedQmdRefreshPending = qmd ? await readQmdRefreshPending(config.memoryDir) : null;\n const hasPersistedQmdRefreshPending = persistedQmdRefreshPending?.collection === coldCollection;\n if (qmd && persistedQmdRefreshPending && persistedQmdRefreshPending.collection !== coldCollection) {\n failureCount += 1;\n }\n if (qmd && (qmdRefreshPendingForRun || hasPersistedQmdRefreshPending)) {\n try {\n await refreshQmdCollection(qmd, coldCollection, signal);\n await clearQmdRefreshPending(config.memoryDir);\n } catch {\n failureCount += 1;\n }\n }\n if (failureCount === 0) {\n await writeMarker(config.memoryDir, now);\n }\n\n return {\n skipped: false,\n dryRun: false,\n candidateCount,\n demotedCount,\n failureCount,\n cappedAt: demotionCap,\n };\n}\n"],"mappings":"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","names":["candidateCount","demotedCount","failureCount"]}
@@ -1,13 +1,14 @@
1
1
  import {
2
2
  buildRetiredFactTombstoneInputs
3
- } from "./chunk-LZKOVXMX.js";
3
+ } from "./chunk-TRMJ6BYC.js";
4
4
  import {
5
5
  supersessionKeysForFact
6
6
  } from "./chunk-5WITETWU.js";
7
7
  import "./chunk-6CIAGZ6X.js";
8
8
  import "./chunk-5FVVY2EB.js";
9
- import "./chunk-EHRE7ZG3.js";
10
- import "./chunk-7LEQREP2.js";
9
+ import "./chunk-5B5WYAHQ.js";
10
+ import "./chunk-PGRZ3FYC.js";
11
+ import "./chunk-BTTPKDIL.js";
11
12
  import "./chunk-3WCASNQZ.js";
12
13
  import "./chunk-PZ5AY32C.js";
13
14
 
@@ -99,4 +100,4 @@ export {
99
100
  ForgetMemoryNotFoundError,
100
101
  forgetMemory
101
102
  };
102
- //# sourceMappingURL=forget-OHAJ6PSU.js.map
103
+ //# sourceMappingURL=forget-GXBWFKRC.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/maintenance/forget.ts"],"sourcesContent":["/**\n * Operator-facing memory forgetting (issue #686 PR 4/6).\n *\n * `remnic forget <id>` marks a memory as forgotten — a soft-delete that:\n *\n * 1. Sets `status: \"forgotten\"`, `forgottenAt`, optional\n * `forgottenReason` in YAML frontmatter via the existing\n * `storage.writeMemoryFrontmatter` path (which logs the change\n * to the lifecycle ledger and invalidates caches).\n * 2. Returns a structured result describing what changed so the\n * CLI and downstream telemetry can render it.\n *\n * Memories with `status === \"forgotten\"` are excluded from recall,\n * browse, and entity attribution by the status filters that serve\n * active user context. A future maintenance cron will hard-delete\n * forgotten memories after a configurable retention window (default\n * 90 days) — for this PR the file stays on disk and the act is\n * reversible by editing the YAML directly.\n *\n * This module ships the pure helper; the CLI wires it in `cli.ts` as\n * a new `remnic forget` subcommand.\n */\n\nimport type { StorageManager } from \"../storage.js\";\nimport { buildRetiredFactTombstoneInputs } from \"../lifecycle/tombstones.js\";\nimport { supersessionKeysForFact } from \"../temporal-supersession.js\";\nimport type { MemoryFile } from \"../types.js\";\n\nexport interface ForgetMemoryRequest {\n /** Memory id (frontmatter `id`) to forget. */\n id: string;\n /** Optional human-readable reason. */\n reason?: string;\n /** Override the timestamp written to `forgottenAt`. Defaults to `new Date().toISOString()`. */\n now?: () => Date;\n}\n\nexport interface ForgetMemoryResult {\n /** Memory id that was forgotten. */\n id: string;\n /** Filesystem path of the forgotten memory. */\n path: string;\n /** Prior status before the forget call, for audit. */\n priorStatus: string;\n /** Timestamp written to `forgottenAt`. */\n forgottenAt: string;\n /** Reason captured (or empty string if none). */\n reason: string;\n}\n\nexport class ForgetMemoryNotFoundError extends Error {\n readonly code = \"memory_not_found\" as const;\n constructor(id: string) {\n super(`memory not found: ${id}`);\n this.name = \"ForgetMemoryNotFoundError\";\n }\n}\n\nexport class ForgetMemoryAlreadyForgottenError extends Error {\n readonly code = \"already_forgotten\" as const;\n constructor(id: string, forgottenAt: string) {\n super(`memory ${id} was already forgotten at ${forgottenAt}`);\n this.name = \"ForgetMemoryAlreadyForgottenError\";\n }\n}\n\n/**\n * Mark a memory as forgotten. Pure orchestration over storage —\n * caller supplies the storage instance and the request. Status\n * filters elsewhere in the codebase exclude `status: \"forgotten\"`\n * from recall/browse surfaces before they serve active user context.\n */\nexport async function forgetMemory(\n storage: StorageManager,\n request: ForgetMemoryRequest,\n): Promise<ForgetMemoryResult> {\n const id = typeof request.id === \"string\" ? request.id.trim() : \"\";\n if (id.length === 0) {\n throw new Error(\"forget: memory id is required and must be non-empty\");\n }\n const memory = await findMemoryById(storage, id);\n if (!memory) {\n throw new ForgetMemoryNotFoundError(id);\n }\n if (memory.frontmatter.status === \"forgotten\") {\n throw new ForgetMemoryAlreadyForgottenError(\n id,\n memory.frontmatter.forgottenAt ?? \"(unknown)\",\n );\n }\n const priorStatus =\n typeof memory.frontmatter.status === \"string\" ? memory.frontmatter.status : \"active\";\n const now = (request.now ?? (() => new Date()))();\n const forgottenAt = now.toISOString();\n const reason = typeof request.reason === \"string\" ? request.reason.trim() : \"\";\n await storage.writeMemoryFrontmatter(memory, {\n status: \"forgotten\",\n forgottenAt,\n forgottenReason: reason.length > 0 ? reason : undefined,\n updated: forgottenAt,\n }, {\n actor: \"remnic-forget\",\n reasonCode: \"operator_forget\",\n });\n // Issue #1579 thread OchiF: emit a LIVE tombstone at forget time so a\n // forgotten FACT cannot resurrect via re-extraction/import before an\n // operator runs `remnic doctor --rebuild-tombstones`. Without this, the\n // non-resurrection chokepoint in writeMemory has nothing to match — the\n // forgotten fact's content hash is gone from the active index but no\n // tombstone exists until a manual rebuild derives one — so the same fact\n // written again through writeMemory becomes active. Mirrors supersedeMemory\n // (contradiction) and applyTemporalSupersession via the shared\n // buildRetiredFactTombstoneInputs helper. Best-effort (rule 34): a tombstone\n // append failure must not fail the forget, which already succeeded on disk.\n if (memory.frontmatter.category === \"fact\") {\n for (const input of buildRetiredFactTombstoneInputs(\n {\n id,\n content: memory.content,\n ...(memory.frontmatter.contentHash\n ? { contentHash: memory.frontmatter.contentHash }\n : {}),\n ...(memory.frontmatter.entityRef\n ? { entityRef: memory.frontmatter.entityRef }\n : {}),\n ...(memory.frontmatter.structuredAttributes\n ? { structuredAttributes: memory.frontmatter.structuredAttributes }\n : {}),\n },\n {\n reason: \"retraction\",\n createdBy: \"user_correction\",\n createdAt: forgottenAt,\n supersessionKeysForFact,\n },\n )) {\n try {\n await storage.appendTombstone(input);\n } catch {\n // Best-effort — the forget already succeeded on disk.\n }\n }\n }\n return {\n id,\n path: memory.path,\n priorStatus,\n forgottenAt,\n reason,\n };\n}\n\nasync function findMemoryById(\n storage: StorageManager,\n id: string,\n): Promise<MemoryFile | null> {\n const hot = await storage.readAllMemories();\n const hotMatch = hot.find((m) => m.frontmatter.id === id);\n if (hotMatch) return hotMatch;\n\n const archived = await storage.readArchivedMemories();\n const archivedMatch = archived.find((m) => m.frontmatter.id === id);\n if (archivedMatch) return archivedMatch;\n\n const cold = await storage.readAllColdMemories();\n return cold.find((m) => m.frontmatter.id === id) ?? null;\n}\n"],"mappings":";;;;;;;;;;;;;;AAkDO,IAAM,4BAAN,cAAwC,MAAM;AAAA,EAC1C,OAAO;AAAA,EAChB,YAAY,IAAY;AACtB,UAAM,qBAAqB,EAAE,EAAE;AAC/B,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,oCAAN,cAAgD,MAAM;AAAA,EAClD,OAAO;AAAA,EAChB,YAAY,IAAY,aAAqB;AAC3C,UAAM,UAAU,EAAE,6BAA6B,WAAW,EAAE;AAC5D,SAAK,OAAO;AAAA,EACd;AACF;AAQA,eAAsB,aACpB,SACA,SAC6B;AAC7B,QAAM,KAAK,OAAO,QAAQ,OAAO,WAAW,QAAQ,GAAG,KAAK,IAAI;AAChE,MAAI,GAAG,WAAW,GAAG;AACnB,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AACA,QAAM,SAAS,MAAM,eAAe,SAAS,EAAE;AAC/C,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,0BAA0B,EAAE;AAAA,EACxC;AACA,MAAI,OAAO,YAAY,WAAW,aAAa;AAC7C,UAAM,IAAI;AAAA,MACR;AAAA,MACA,OAAO,YAAY,eAAe;AAAA,IACpC;AAAA,EACF;AACA,QAAM,cACJ,OAAO,OAAO,YAAY,WAAW,WAAW,OAAO,YAAY,SAAS;AAC9E,QAAM,OAAO,QAAQ,QAAQ,MAAM,oBAAI,KAAK,IAAI;AAChD,QAAM,cAAc,IAAI,YAAY;AACpC,QAAM,SAAS,OAAO,QAAQ,WAAW,WAAW,QAAQ,OAAO,KAAK,IAAI;AAC5E,QAAM,QAAQ,uBAAuB,QAAQ;AAAA,IAC3C,QAAQ;AAAA,IACR;AAAA,IACA,iBAAiB,OAAO,SAAS,IAAI,SAAS;AAAA,IAC9C,SAAS;AAAA,EACX,GAAG;AAAA,IACD,OAAO;AAAA,IACP,YAAY;AAAA,EACd,CAAC;AAWD,MAAI,OAAO,YAAY,aAAa,QAAQ;AAC1C,eAAW,SAAS;AAAA,MAClB;AAAA,QACE;AAAA,QACA,SAAS,OAAO;AAAA,QAChB,GAAI,OAAO,YAAY,cACnB,EAAE,aAAa,OAAO,YAAY,YAAY,IAC9C,CAAC;AAAA,QACL,GAAI,OAAO,YAAY,YACnB,EAAE,WAAW,OAAO,YAAY,UAAU,IAC1C,CAAC;AAAA,QACL,GAAI,OAAO,YAAY,uBACnB,EAAE,sBAAsB,OAAO,YAAY,qBAAqB,IAChE,CAAC;AAAA,MACP;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,WAAW;AAAA,QACX;AAAA,MACF;AAAA,IACF,GAAG;AACD,UAAI;AACF,cAAM,QAAQ,gBAAgB,KAAK;AAAA,MACrC,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,IACA,MAAM,OAAO;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,eACb,SACA,IAC4B;AAC5B,QAAM,MAAM,MAAM,QAAQ,gBAAgB;AAC1C,QAAM,WAAW,IAAI,KAAK,CAAC,MAAM,EAAE,YAAY,OAAO,EAAE;AACxD,MAAI,SAAU,QAAO;AAErB,QAAM,WAAW,MAAM,QAAQ,qBAAqB;AACpD,QAAM,gBAAgB,SAAS,KAAK,CAAC,MAAM,EAAE,YAAY,OAAO,EAAE;AAClE,MAAI,cAAe,QAAO;AAE1B,QAAM,OAAO,MAAM,QAAQ,oBAAoB;AAC/C,SAAO,KAAK,KAAK,CAAC,MAAM,EAAE,YAAY,OAAO,EAAE,KAAK;AACtD;","names":[]}
1
+ {"version":3,"sources":["../src/maintenance/forget.ts"],"sourcesContent":["/**\n * Operator-facing memory forgetting (issue #686 PR 4/6).\n *\n * `remnic forget <id>` marks a memory as forgotten — a soft-delete that:\n *\n * 1. Sets `status: \"forgotten\"`, `forgottenAt`, optional\n * `forgottenReason` in YAML frontmatter via the existing\n * `storage.writeMemoryFrontmatter` path (which logs the change\n * to the lifecycle ledger and invalidates caches).\n * 2. Returns a structured result describing what changed so the\n * CLI and downstream telemetry can render it.\n *\n * Memories with `status === \"forgotten\"` are excluded from recall,\n * browse, and entity attribution by the status filters that serve\n * active user context. A future maintenance cron will hard-delete\n * forgotten memories after a configurable retention window (default\n * 90 days) — for this PR the file stays on disk and the act is\n * reversible by editing the YAML directly.\n *\n * This module ships the pure helper; the CLI wires it in `cli.ts` as\n * a new `remnic forget` subcommand.\n */\n\nimport type { StorageManager } from \"../storage.js\";\nimport { buildRetiredFactTombstoneInputs } from \"../lifecycle/tombstones.js\";\nimport { supersessionKeysForFact } from \"../temporal-supersession.js\";\nimport type { MemoryFile } from \"../types.js\";\n\nexport interface ForgetMemoryRequest {\n /** Memory id (frontmatter `id`) to forget. */\n id: string;\n /** Optional human-readable reason. */\n reason?: string;\n /** Override the timestamp written to `forgottenAt`. Defaults to `new Date().toISOString()`. */\n now?: () => Date;\n}\n\nexport interface ForgetMemoryResult {\n /** Memory id that was forgotten. */\n id: string;\n /** Filesystem path of the forgotten memory. */\n path: string;\n /** Prior status before the forget call, for audit. */\n priorStatus: string;\n /** Timestamp written to `forgottenAt`. */\n forgottenAt: string;\n /** Reason captured (or empty string if none). */\n reason: string;\n}\n\nexport class ForgetMemoryNotFoundError extends Error {\n readonly code = \"memory_not_found\" as const;\n constructor(id: string) {\n super(`memory not found: ${id}`);\n this.name = \"ForgetMemoryNotFoundError\";\n }\n}\n\nexport class ForgetMemoryAlreadyForgottenError extends Error {\n readonly code = \"already_forgotten\" as const;\n constructor(id: string, forgottenAt: string) {\n super(`memory ${id} was already forgotten at ${forgottenAt}`);\n this.name = \"ForgetMemoryAlreadyForgottenError\";\n }\n}\n\n/**\n * Mark a memory as forgotten. Pure orchestration over storage —\n * caller supplies the storage instance and the request. Status\n * filters elsewhere in the codebase exclude `status: \"forgotten\"`\n * from recall/browse surfaces before they serve active user context.\n */\nexport async function forgetMemory(\n storage: StorageManager,\n request: ForgetMemoryRequest,\n): Promise<ForgetMemoryResult> {\n const id = typeof request.id === \"string\" ? request.id.trim() : \"\";\n if (id.length === 0) {\n throw new Error(\"forget: memory id is required and must be non-empty\");\n }\n const memory = await findMemoryById(storage, id);\n if (!memory) {\n throw new ForgetMemoryNotFoundError(id);\n }\n if (memory.frontmatter.status === \"forgotten\") {\n throw new ForgetMemoryAlreadyForgottenError(\n id,\n memory.frontmatter.forgottenAt ?? \"(unknown)\",\n );\n }\n const priorStatus =\n typeof memory.frontmatter.status === \"string\" ? memory.frontmatter.status : \"active\";\n const now = (request.now ?? (() => new Date()))();\n const forgottenAt = now.toISOString();\n const reason = typeof request.reason === \"string\" ? request.reason.trim() : \"\";\n await storage.writeMemoryFrontmatter(memory, {\n status: \"forgotten\",\n forgottenAt,\n forgottenReason: reason.length > 0 ? reason : undefined,\n updated: forgottenAt,\n }, {\n actor: \"remnic-forget\",\n reasonCode: \"operator_forget\",\n });\n // Issue #1579 thread OchiF: emit a LIVE tombstone at forget time so a\n // forgotten FACT cannot resurrect via re-extraction/import before an\n // operator runs `remnic doctor --rebuild-tombstones`. Without this, the\n // non-resurrection chokepoint in writeMemory has nothing to match — the\n // forgotten fact's content hash is gone from the active index but no\n // tombstone exists until a manual rebuild derives one — so the same fact\n // written again through writeMemory becomes active. Mirrors supersedeMemory\n // (contradiction) and applyTemporalSupersession via the shared\n // buildRetiredFactTombstoneInputs helper. Best-effort (rule 34): a tombstone\n // append failure must not fail the forget, which already succeeded on disk.\n if (memory.frontmatter.category === \"fact\") {\n for (const input of buildRetiredFactTombstoneInputs(\n {\n id,\n content: memory.content,\n ...(memory.frontmatter.contentHash\n ? { contentHash: memory.frontmatter.contentHash }\n : {}),\n ...(memory.frontmatter.entityRef\n ? { entityRef: memory.frontmatter.entityRef }\n : {}),\n ...(memory.frontmatter.structuredAttributes\n ? { structuredAttributes: memory.frontmatter.structuredAttributes }\n : {}),\n },\n {\n reason: \"retraction\",\n createdBy: \"user_correction\",\n createdAt: forgottenAt,\n supersessionKeysForFact,\n },\n )) {\n try {\n await storage.appendTombstone(input);\n } catch {\n // Best-effort — the forget already succeeded on disk.\n }\n }\n }\n return {\n id,\n path: memory.path,\n priorStatus,\n forgottenAt,\n reason,\n };\n}\n\nasync function findMemoryById(\n storage: StorageManager,\n id: string,\n): Promise<MemoryFile | null> {\n const hot = await storage.readAllMemories();\n const hotMatch = hot.find((m) => m.frontmatter.id === id);\n if (hotMatch) return hotMatch;\n\n const archived = await storage.readArchivedMemories();\n const archivedMatch = archived.find((m) => m.frontmatter.id === id);\n if (archivedMatch) return archivedMatch;\n\n const cold = await storage.readAllColdMemories();\n return cold.find((m) => m.frontmatter.id === id) ?? null;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAkDO,IAAM,4BAAN,cAAwC,MAAM;AAAA,EAC1C,OAAO;AAAA,EAChB,YAAY,IAAY;AACtB,UAAM,qBAAqB,EAAE,EAAE;AAC/B,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,oCAAN,cAAgD,MAAM;AAAA,EAClD,OAAO;AAAA,EAChB,YAAY,IAAY,aAAqB;AAC3C,UAAM,UAAU,EAAE,6BAA6B,WAAW,EAAE;AAC5D,SAAK,OAAO;AAAA,EACd;AACF;AAQA,eAAsB,aACpB,SACA,SAC6B;AAC7B,QAAM,KAAK,OAAO,QAAQ,OAAO,WAAW,QAAQ,GAAG,KAAK,IAAI;AAChE,MAAI,GAAG,WAAW,GAAG;AACnB,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AACA,QAAM,SAAS,MAAM,eAAe,SAAS,EAAE;AAC/C,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,0BAA0B,EAAE;AAAA,EACxC;AACA,MAAI,OAAO,YAAY,WAAW,aAAa;AAC7C,UAAM,IAAI;AAAA,MACR;AAAA,MACA,OAAO,YAAY,eAAe;AAAA,IACpC;AAAA,EACF;AACA,QAAM,cACJ,OAAO,OAAO,YAAY,WAAW,WAAW,OAAO,YAAY,SAAS;AAC9E,QAAM,OAAO,QAAQ,QAAQ,MAAM,oBAAI,KAAK,IAAI;AAChD,QAAM,cAAc,IAAI,YAAY;AACpC,QAAM,SAAS,OAAO,QAAQ,WAAW,WAAW,QAAQ,OAAO,KAAK,IAAI;AAC5E,QAAM,QAAQ,uBAAuB,QAAQ;AAAA,IAC3C,QAAQ;AAAA,IACR;AAAA,IACA,iBAAiB,OAAO,SAAS,IAAI,SAAS;AAAA,IAC9C,SAAS;AAAA,EACX,GAAG;AAAA,IACD,OAAO;AAAA,IACP,YAAY;AAAA,EACd,CAAC;AAWD,MAAI,OAAO,YAAY,aAAa,QAAQ;AAC1C,eAAW,SAAS;AAAA,MAClB;AAAA,QACE;AAAA,QACA,SAAS,OAAO;AAAA,QAChB,GAAI,OAAO,YAAY,cACnB,EAAE,aAAa,OAAO,YAAY,YAAY,IAC9C,CAAC;AAAA,QACL,GAAI,OAAO,YAAY,YACnB,EAAE,WAAW,OAAO,YAAY,UAAU,IAC1C,CAAC;AAAA,QACL,GAAI,OAAO,YAAY,uBACnB,EAAE,sBAAsB,OAAO,YAAY,qBAAqB,IAChE,CAAC;AAAA,MACP;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,WAAW;AAAA,QACX;AAAA,MACF;AAAA,IACF,GAAG;AACD,UAAI;AACF,cAAM,QAAQ,gBAAgB,KAAK;AAAA,MACrC,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,IACA,MAAM,OAAO;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,eACb,SACA,IAC4B;AAC5B,QAAM,MAAM,MAAM,QAAQ,gBAAgB;AAC1C,QAAM,WAAW,IAAI,KAAK,CAAC,MAAM,EAAE,YAAY,OAAO,EAAE;AACxD,MAAI,SAAU,QAAO;AAErB,QAAM,WAAW,MAAM,QAAQ,qBAAqB;AACpD,QAAM,gBAAgB,SAAS,KAAK,CAAC,MAAM,EAAE,YAAY,OAAO,EAAE;AAClE,MAAI,cAAe,QAAO;AAE1B,QAAM,OAAO,MAAM,QAAQ,oBAAoB;AAC/C,SAAO,KAAK,KAAK,CAAC,MAAM,EAAE,YAAY,OAAO,EAAE,KAAK;AACtD;","names":[]}
@@ -5,18 +5,19 @@ import {
5
5
  readGraphEdgeDecayStatus,
6
6
  runGraphEdgeDecayMaintenance,
7
7
  runGraphEdgeDecayMaintenanceAcrossNamespaces
8
- } from "./chunk-Y6DZ33PA.js";
9
- import "./chunk-QUNDYIYZ.js";
10
- import "./chunk-BTJ6CAIA.js";
11
- import "./chunk-LXY5VVGM.js";
12
- import "./chunk-ZQ3WU6JO.js";
13
- import "./chunk-GKCXTSFF.js";
8
+ } from "./chunk-5GX5457J.js";
9
+ import "./chunk-YYEOR4XN.js";
10
+ import "./chunk-4IYIGN53.js";
11
+ import "./chunk-RXFCU3CY.js";
14
12
  import "./chunk-2LSZVONP.js";
15
13
  import "./chunk-DEUNUKTD.js";
16
- import "./chunk-EHRE7ZG3.js";
14
+ import "./chunk-LXY5VVGM.js";
15
+ import "./chunk-GKCXTSFF.js";
16
+ import "./chunk-5B5WYAHQ.js";
17
17
  import "./chunk-PCXDUHQH.js";
18
18
  import "./chunk-VUFL7X3H.js";
19
- import "./chunk-7LEQREP2.js";
19
+ import "./chunk-PGRZ3FYC.js";
20
+ import "./chunk-BTTPKDIL.js";
20
21
  import "./chunk-KNA3BXXL.js";
21
22
  import "./chunk-3WCASNQZ.js";
22
23
  import "./chunk-PZ5AY32C.js";
@@ -28,4 +29,4 @@ export {
28
29
  runGraphEdgeDecayMaintenance,
29
30
  runGraphEdgeDecayMaintenanceAcrossNamespaces
30
31
  };
31
- //# sourceMappingURL=graph-edge-decay-CZ3SYLM4.js.map
32
+ //# sourceMappingURL=graph-edge-decay-BYPZVJT4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -3,15 +3,16 @@ import {
3
3
  restoreRemovedNodeEdges,
4
4
  rollbackNodeEdgeRewrite,
5
5
  writeGraphJsonlAtomic
6
- } from "./chunk-QUNDYIYZ.js";
7
- import "./chunk-BTJ6CAIA.js";
8
- import "./chunk-LXY5VVGM.js";
9
- import "./chunk-ZQ3WU6JO.js";
10
- import "./chunk-GKCXTSFF.js";
6
+ } from "./chunk-YYEOR4XN.js";
7
+ import "./chunk-4IYIGN53.js";
8
+ import "./chunk-RXFCU3CY.js";
11
9
  import "./chunk-2LSZVONP.js";
12
10
  import "./chunk-DEUNUKTD.js";
13
- import "./chunk-EHRE7ZG3.js";
14
- import "./chunk-7LEQREP2.js";
11
+ import "./chunk-LXY5VVGM.js";
12
+ import "./chunk-GKCXTSFF.js";
13
+ import "./chunk-5B5WYAHQ.js";
14
+ import "./chunk-PGRZ3FYC.js";
15
+ import "./chunk-BTTPKDIL.js";
15
16
  import "./chunk-KNA3BXXL.js";
16
17
  import "./chunk-3WCASNQZ.js";
17
18
  import "./chunk-PZ5AY32C.js";
@@ -4,15 +4,16 @@ import {
4
4
  buildGraphSnapshot,
5
5
  normalizeGraphSnapshotLimit,
6
6
  parseGraphSnapshotSince
7
- } from "./chunk-6VAHJ2F6.js";
8
- import "./chunk-BTJ6CAIA.js";
9
- import "./chunk-LXY5VVGM.js";
10
- import "./chunk-ZQ3WU6JO.js";
11
- import "./chunk-GKCXTSFF.js";
7
+ } from "./chunk-DMDWFQMR.js";
8
+ import "./chunk-4IYIGN53.js";
9
+ import "./chunk-RXFCU3CY.js";
12
10
  import "./chunk-2LSZVONP.js";
13
11
  import "./chunk-DEUNUKTD.js";
14
- import "./chunk-EHRE7ZG3.js";
15
- import "./chunk-7LEQREP2.js";
12
+ import "./chunk-LXY5VVGM.js";
13
+ import "./chunk-GKCXTSFF.js";
14
+ import "./chunk-5B5WYAHQ.js";
15
+ import "./chunk-PGRZ3FYC.js";
16
+ import "./chunk-BTTPKDIL.js";
16
17
  import "./chunk-KNA3BXXL.js";
17
18
  import "./chunk-PZ5AY32C.js";
18
19
  export {
@@ -3,9 +3,10 @@ import {
3
3
  assertGraphLockHeld,
4
4
  withGraphWriteLock,
5
5
  yieldForLockHeartbeat
6
- } from "./chunk-ZQ3WU6JO.js";
7
- import "./chunk-EHRE7ZG3.js";
8
- import "./chunk-7LEQREP2.js";
6
+ } from "./chunk-RXFCU3CY.js";
7
+ import "./chunk-5B5WYAHQ.js";
8
+ import "./chunk-PGRZ3FYC.js";
9
+ import "./chunk-BTTPKDIL.js";
9
10
  import "./chunk-PZ5AY32C.js";
10
11
  export {
11
12
  GraphLockLostError,
package/dist/graph.js CHANGED
@@ -16,19 +16,20 @@ import {
16
16
  readAllEdges,
17
17
  readEdges,
18
18
  readEdgesStrict
19
- } from "./chunk-BTJ6CAIA.js";
20
- import {
21
- reconstructActivationPath
22
- } from "./chunk-LXY5VVGM.js";
19
+ } from "./chunk-4IYIGN53.js";
23
20
  import {
24
21
  GraphLockLostError,
25
22
  withGraphWriteLock
26
- } from "./chunk-ZQ3WU6JO.js";
27
- import "./chunk-GKCXTSFF.js";
23
+ } from "./chunk-RXFCU3CY.js";
28
24
  import "./chunk-2LSZVONP.js";
29
25
  import "./chunk-DEUNUKTD.js";
30
- import "./chunk-EHRE7ZG3.js";
31
- import "./chunk-7LEQREP2.js";
26
+ import {
27
+ reconstructActivationPath
28
+ } from "./chunk-LXY5VVGM.js";
29
+ import "./chunk-GKCXTSFF.js";
30
+ import "./chunk-5B5WYAHQ.js";
31
+ import "./chunk-PGRZ3FYC.js";
32
+ import "./chunk-BTTPKDIL.js";
32
33
  import "./chunk-KNA3BXXL.js";
33
34
  import "./chunk-PZ5AY32C.js";
34
35
  export {
@@ -5,15 +5,16 @@ import {
5
5
  normalizeCueAnchorInputs,
6
6
  normalizedHarmonicEntityIdentity,
7
7
  persistHarmonicRecords
8
- } from "./chunk-LS2FHUML.js";
9
- import "./chunk-BMWN7B3Y.js";
8
+ } from "./chunk-LQ5SS4OP.js";
9
+ import "./chunk-LXATZLSC.js";
10
10
  import "./chunk-YCVB7X56.js";
11
11
  import "./chunk-5GKPFL3S.js";
12
12
  import "./chunk-JAKIDQB2.js";
13
- import "./chunk-46EST7JO.js";
13
+ import "./chunk-F2XNSIPP.js";
14
14
  import "./chunk-G73MCJKL.js";
15
15
  import "./chunk-A2IYSXDQ.js";
16
- import "./chunk-B6O2YLUR.js";
16
+ import "./chunk-2Z5DIDQD.js";
17
+ import "./chunk-QUIRIG2P.js";
17
18
  import "./chunk-KNA3BXXL.js";
18
19
  import "./chunk-PZ5AY32C.js";
19
20
  export {