@remnic/core 1.0.2 → 1.1.0

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 (385) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1 -0
  3. package/dist/abort-error.d.ts +32 -0
  4. package/dist/abort-error.js +11 -0
  5. package/dist/access-cli.d.ts +13 -3
  6. package/dist/access-cli.js +96 -80
  7. package/dist/access-cli.js.map +1 -1
  8. package/dist/access-http.d.ts +12 -4
  9. package/dist/access-http.js +25 -18
  10. package/dist/access-mcp.d.ts +32 -4
  11. package/dist/access-mcp.js +16 -1
  12. package/dist/access-schema.d.ts +28 -28
  13. package/dist/access-schema.js +1 -1
  14. package/dist/access-service-HmO1Trrx.d.ts +732 -0
  15. package/dist/access-service.d.ts +15 -601
  16. package/dist/access-service.js +21 -15
  17. package/dist/active-memory-bridge.d.ts +66 -0
  18. package/dist/active-memory-bridge.js +11 -0
  19. package/dist/active-memory-bridge.js.map +1 -0
  20. package/dist/active-recall.d.ts +96 -0
  21. package/dist/active-recall.js +308 -0
  22. package/dist/active-recall.js.map +1 -0
  23. package/dist/behavior-learner.js +1 -1
  24. package/dist/bootstrap.d.ts +6 -3
  25. package/dist/bootstrap.js +2 -2
  26. package/dist/boxes.js +2 -2
  27. package/dist/briefing.d.ts +169 -0
  28. package/dist/briefing.js +52 -0
  29. package/dist/briefing.js.map +1 -0
  30. package/dist/buffer.d.ts +19 -5
  31. package/dist/buffer.js +2 -2
  32. package/dist/calibration.js +6 -6
  33. package/dist/causal-behavior.js +5 -5
  34. package/dist/causal-chain.js +3 -3
  35. package/dist/causal-consolidation.d.ts +22 -2
  36. package/dist/causal-consolidation.js +36 -9
  37. package/dist/causal-consolidation.js.map +1 -1
  38. package/dist/causal-retrieval.js +6 -6
  39. package/dist/causal-trajectory-graph.js +1 -1
  40. package/dist/causal-trajectory.d.ts +14 -1
  41. package/dist/causal-trajectory.js +5 -1
  42. package/dist/{chunk-KWBU5S5U.js → chunk-2ODBA7MQ.js} +9 -3
  43. package/dist/chunk-2ODBA7MQ.js.map +1 -0
  44. package/dist/{chunk-ZJLY4QSU.js → chunk-37UIFYWO.js} +130 -6
  45. package/dist/chunk-37UIFYWO.js.map +1 -0
  46. package/dist/chunk-3PG3H5TD.js +7 -0
  47. package/dist/chunk-3PG3H5TD.js.map +1 -0
  48. package/dist/{chunk-NTTLPF7F.js → chunk-3QFQGRHO.js} +5 -5
  49. package/dist/{chunk-QDOSNLB4.js → chunk-3QHL5ABG.js} +17 -15
  50. package/dist/chunk-3QHL5ABG.js.map +1 -0
  51. package/dist/{chunk-6UJQNRIO.js → chunk-3SV6CQHO.js} +92 -33
  52. package/dist/chunk-3SV6CQHO.js.map +1 -0
  53. package/dist/{chunk-U4PV25RD.js → chunk-3WHVNEN7.js} +1 -1
  54. package/dist/chunk-3WHVNEN7.js.map +1 -0
  55. package/dist/{chunk-XUHI52HK.js → chunk-44ICJRF3.js} +98 -10
  56. package/dist/chunk-44ICJRF3.js.map +1 -0
  57. package/dist/{chunk-HG2NKWR2.js → chunk-47UU5PU2.js} +49 -10
  58. package/dist/chunk-47UU5PU2.js.map +1 -0
  59. package/dist/chunk-4DJQYKMN.js +187 -0
  60. package/dist/chunk-4DJQYKMN.js.map +1 -0
  61. package/dist/chunk-4KAN3GZ3.js +225 -0
  62. package/dist/chunk-4KAN3GZ3.js.map +1 -0
  63. package/dist/chunk-4LACOVZX.js +813 -0
  64. package/dist/chunk-4LACOVZX.js.map +1 -0
  65. package/dist/{chunk-ORZMT74A.js → chunk-4NRAJUDS.js} +11 -1
  66. package/dist/chunk-4NRAJUDS.js.map +1 -0
  67. package/dist/{chunk-B7LOFDVE.js → chunk-4WMCPJWX.js} +8 -3
  68. package/dist/chunk-4WMCPJWX.js.map +1 -0
  69. package/dist/{chunk-G3AG3KZN.js → chunk-5IZL4DCV.js} +2 -2
  70. package/dist/{chunk-BRK4ODMI.js → chunk-5NPGSAVB.js} +2 -2
  71. package/dist/{chunk-QANCTXQF.js → chunk-6LX5ORAS.js} +3 -3
  72. package/dist/chunk-6MKAMLQL.js +16 -0
  73. package/dist/chunk-6MKAMLQL.js.map +1 -0
  74. package/dist/{chunk-ESSMF2FR.js → chunk-6PFRXT4K.js} +15 -6
  75. package/dist/chunk-6PFRXT4K.js.map +1 -0
  76. package/dist/{chunk-UIYZ5T3I.js → chunk-6UJ47TVX.js} +8 -8
  77. package/dist/chunk-6ZH4TU6I.js +245 -0
  78. package/dist/chunk-6ZH4TU6I.js.map +1 -0
  79. package/dist/{chunk-L5RPWGFK.js → chunk-7DHTMOND.js} +2 -2
  80. package/dist/{chunk-L7WO3MZ4.js → chunk-7ECD5ATE.js} +2 -2
  81. package/dist/{chunk-Q6FETXJA.js → chunk-7SEAZFFB.js} +2 -2
  82. package/dist/{chunk-V4YC4LUK.js → chunk-7WQ6SLIE.js} +175 -63
  83. package/dist/chunk-7WQ6SLIE.js.map +1 -0
  84. package/dist/chunk-ALXMCZEU.js +332 -0
  85. package/dist/chunk-ALXMCZEU.js.map +1 -0
  86. package/dist/{chunk-TVVVQQAK.js → chunk-BLKTA7MM.js} +58 -24
  87. package/dist/chunk-BLKTA7MM.js.map +1 -0
  88. package/dist/{chunk-SCHEKPYH.js → chunk-C2EFFULQ.js} +1 -1
  89. package/dist/{chunk-GJR6D6KC.js → chunk-D654IBA6.js} +2 -2
  90. package/dist/{chunk-OTFNI3OO.js → chunk-DEPL3635.js} +1828 -401
  91. package/dist/chunk-DEPL3635.js.map +1 -0
  92. package/dist/{chunk-UYSKNO6E.js → chunk-DHHP2Z4X.js} +15 -4
  93. package/dist/chunk-DHHP2Z4X.js.map +1 -0
  94. package/dist/{chunk-UV2FO7J4.js → chunk-E6K4NIEU.js} +2 -2
  95. package/dist/{chunk-T4WRIV2C.js → chunk-EABGC2TL.js} +2 -2
  96. package/dist/chunk-EJI5XIBB.js +232 -0
  97. package/dist/chunk-EJI5XIBB.js.map +1 -0
  98. package/dist/{chunk-ONRU4L2N.js → chunk-FEMOX5AD.js} +2 -2
  99. package/dist/{chunk-IFFFR3MR.js → chunk-FSFEQI74.js} +3 -3
  100. package/dist/chunk-G4SK7DSQ.js +121 -0
  101. package/dist/chunk-G4SK7DSQ.js.map +1 -0
  102. package/dist/{chunk-WWIQTB2Y.js → chunk-GGD5W7TB.js} +9 -2
  103. package/dist/chunk-GGD5W7TB.js.map +1 -0
  104. package/dist/{chunk-QWUUMMIK.js → chunk-GV6NLQ4X.js} +1355 -80
  105. package/dist/chunk-GV6NLQ4X.js.map +1 -0
  106. package/dist/{chunk-2PO5ZRKV.js → chunk-GZCUW5IC.js} +16 -3
  107. package/dist/chunk-GZCUW5IC.js.map +1 -0
  108. package/dist/{chunk-AAI7JARD.js → chunk-HMDCOMYU.js} +8 -11
  109. package/dist/chunk-HMDCOMYU.js.map +1 -0
  110. package/dist/chunk-IQT3XTKW.js +121 -0
  111. package/dist/chunk-IQT3XTKW.js.map +1 -0
  112. package/dist/{chunk-J3BT33K7.js → chunk-ITRLGI2T.js} +5 -5
  113. package/dist/{chunk-BDFZXRSO.js → chunk-J4IYOZZ5.js} +15 -2
  114. package/dist/chunk-J4IYOZZ5.js.map +1 -0
  115. package/dist/{chunk-J47FNDR7.js → chunk-JIU55F3X.js} +7 -7
  116. package/dist/{chunk-MDDAA2AO.js → chunk-JL2PU6AI.js} +17 -6
  117. package/dist/chunk-JL2PU6AI.js.map +1 -0
  118. package/dist/{chunk-ZKYI7UVO.js → chunk-JR4ZC3G4.js} +2 -2
  119. package/dist/{chunk-UCYSTFZR.js → chunk-JRNQ3RNA.js} +2 -2
  120. package/dist/{chunk-GPGBSNKM.js → chunk-K4FLSOR5.js} +2 -2
  121. package/dist/chunk-KVE7R4CG.js +320 -0
  122. package/dist/chunk-KVE7R4CG.js.map +1 -0
  123. package/dist/chunk-LAYN4LDC.js +267 -0
  124. package/dist/chunk-LAYN4LDC.js.map +1 -0
  125. package/dist/{chunk-ISY75RLM.js → chunk-MBJHSA7F.js} +344 -7
  126. package/dist/chunk-MBJHSA7F.js.map +1 -0
  127. package/dist/{chunk-PGK3VUHN.js → chunk-MTLYEMJB.js} +3 -2
  128. package/dist/chunk-MTLYEMJB.js.map +1 -0
  129. package/dist/{chunk-QY2BHY5O.js → chunk-MVTHXUBX.js} +297 -34
  130. package/dist/chunk-MVTHXUBX.js.map +1 -0
  131. package/dist/{chunk-LP47L3ZX.js → chunk-N42IWANG.js} +5 -5
  132. package/dist/{chunk-YNI4S5WT.js → chunk-N53K2EXC.js} +2 -2
  133. package/dist/{chunk-763GUIOU.js → chunk-NBNN5GOB.js} +2 -2
  134. package/dist/{chunk-CXWFUJR2.js → chunk-NQEVYWX6.js} +195 -5
  135. package/dist/chunk-NQEVYWX6.js.map +1 -0
  136. package/dist/{chunk-KL4CP4SB.js → chunk-O5ETUNBT.js} +17 -5
  137. package/dist/chunk-O5ETUNBT.js.map +1 -0
  138. package/dist/{chunk-OOSWAUYB.js → chunk-ODWDQNRE.js} +2 -2
  139. package/dist/chunk-OIT5QGG4.js +80 -0
  140. package/dist/chunk-OIT5QGG4.js.map +1 -0
  141. package/dist/{chunk-HLBYLYRD.js → chunk-PAORGQRI.js} +70 -13
  142. package/dist/chunk-PAORGQRI.js.map +1 -0
  143. package/dist/chunk-PVGDJXVK.js +21 -0
  144. package/dist/chunk-PVGDJXVK.js.map +1 -0
  145. package/dist/{chunk-OTAVQCSF.js → chunk-PYXS46O7.js} +2 -2
  146. package/dist/chunk-QDW3E4RD.js +108 -0
  147. package/dist/chunk-QDW3E4RD.js.map +1 -0
  148. package/dist/{chunk-YNCQ7E4M.js → chunk-QDYXG4CS.js} +4 -3
  149. package/dist/chunk-QDYXG4CS.js.map +1 -0
  150. package/dist/{chunk-HLXVTBF3.js → chunk-QNJMBKFK.js} +3 -2
  151. package/dist/chunk-QNJMBKFK.js.map +1 -0
  152. package/dist/{chunk-4A24LIM2.js → chunk-S75M5ZRK.js} +2 -2
  153. package/dist/chunk-SYUK3VLY.js +789 -0
  154. package/dist/chunk-SYUK3VLY.js.map +1 -0
  155. package/dist/{chunk-QCCCQT3O.js → chunk-TBBDFYXW.js} +2 -2
  156. package/dist/chunk-TBBDFYXW.js.map +1 -0
  157. package/dist/chunk-U66YHYC7.js +31 -0
  158. package/dist/chunk-U66YHYC7.js.map +1 -0
  159. package/dist/{chunk-MWGVGUIS.js → chunk-UEYA6UC7.js} +36 -4
  160. package/dist/chunk-UEYA6UC7.js.map +1 -0
  161. package/dist/{chunk-M5KEYE5E.js → chunk-URB2WSKZ.js} +2 -2
  162. package/dist/chunk-UVJFDP7P.js +202 -0
  163. package/dist/chunk-UVJFDP7P.js.map +1 -0
  164. package/dist/chunk-W6SL7OFG.js +180 -0
  165. package/dist/chunk-W6SL7OFG.js.map +1 -0
  166. package/dist/chunk-WBSAYXVI.js +7945 -0
  167. package/dist/chunk-WBSAYXVI.js.map +1 -0
  168. package/dist/{chunk-M5ZBBBJI.js → chunk-XZ2TIKGC.js} +39 -9
  169. package/dist/chunk-XZ2TIKGC.js.map +1 -0
  170. package/dist/chunk-Y4FHOFJ2.js +140 -0
  171. package/dist/chunk-Y4FHOFJ2.js.map +1 -0
  172. package/dist/chunk-YDBIWGNI.js +298 -0
  173. package/dist/chunk-YDBIWGNI.js.map +1 -0
  174. package/dist/chunk-YNB73F22.js +137 -0
  175. package/dist/chunk-YNB73F22.js.map +1 -0
  176. package/dist/{chunk-IZME7KW2.js → chunk-ZVBB3T7V.js} +31 -12
  177. package/dist/chunk-ZVBB3T7V.js.map +1 -0
  178. package/dist/chunking.js +1 -1
  179. package/dist/citations.d.ts +67 -0
  180. package/dist/citations.js +13 -0
  181. package/dist/citations.js.map +1 -0
  182. package/dist/cli-BneVIEvh.d.ts +1240 -0
  183. package/dist/cli.d.ts +32 -1147
  184. package/dist/cli.js +150 -7092
  185. package/dist/cli.js.map +1 -1
  186. package/dist/codex-materialize-CQlLTzke.d.ts +139 -0
  187. package/dist/codex-thread-key.d.ts +3 -0
  188. package/dist/codex-thread-key.js +7 -0
  189. package/dist/codex-thread-key.js.map +1 -0
  190. package/dist/config.js +3 -2
  191. package/dist/connectors/codex/instructions.md +160 -0
  192. package/dist/connectors/codex/resources/namespace-cheatsheet.md +48 -0
  193. package/dist/contradiction-review-WIUBAR52.js +21 -0
  194. package/dist/contradiction-review-WIUBAR52.js.map +1 -0
  195. package/dist/contradiction-scan-GR33PONM.js +376 -0
  196. package/dist/contradiction-scan-GR33PONM.js.map +1 -0
  197. package/dist/day-summary.d.ts +7 -2
  198. package/dist/day-summary.js +5 -2
  199. package/dist/direct-answer-wiring.d.ts +77 -0
  200. package/dist/direct-answer-wiring.js +75 -0
  201. package/dist/direct-answer-wiring.js.map +1 -0
  202. package/dist/direct-answer.d.ts +106 -0
  203. package/dist/direct-answer.js +10 -0
  204. package/dist/direct-answer.js.map +1 -0
  205. package/dist/embedding-fallback.d.ts +96 -2
  206. package/dist/embedding-fallback.js +6 -4
  207. package/dist/{engine-2A6J4XEX.js → engine-5TIQBYZR.js} +10 -7
  208. package/dist/engine-5TIQBYZR.js.map +1 -0
  209. package/dist/entity-retrieval.d.ts +3 -2
  210. package/dist/entity-retrieval.js +10 -7
  211. package/dist/entity-schema.d.ts +11 -0
  212. package/dist/entity-schema.js +19 -0
  213. package/dist/entity-schema.js.map +1 -0
  214. package/dist/explicit-capture.d.ts +6 -3
  215. package/dist/explicit-capture.js +2 -2
  216. package/dist/extraction-judge.d.ts +66 -0
  217. package/dist/extraction-judge.js +18 -0
  218. package/dist/extraction-judge.js.map +1 -0
  219. package/dist/extraction.d.ts +1 -0
  220. package/dist/extraction.js +12 -10
  221. package/dist/fallback-llm.d.ts +11 -2
  222. package/dist/fallback-llm.js +4 -4
  223. package/dist/graph.js +1 -1
  224. package/dist/harmonic-retrieval.js +2 -1
  225. package/dist/importance.d.ts +11 -1
  226. package/dist/importance.js +3 -1
  227. package/dist/index.d.ts +1027 -9
  228. package/dist/index.js +3303 -349
  229. package/dist/index.js.map +1 -1
  230. package/dist/intent.d.ts +2 -1
  231. package/dist/intent.js +3 -1
  232. package/dist/lifecycle.js +1 -1
  233. package/dist/local-llm.d.ts +10 -3
  234. package/dist/local-llm.js +2 -2
  235. package/dist/logger.d.ts +1 -1
  236. package/dist/logger.js +1 -1
  237. package/dist/memory-cache.d.ts +2 -2
  238. package/dist/memory-cache.js +1 -1
  239. package/dist/{memory-projection-store-NxMkbocT.d.ts → memory-projection-store-DeSXPh1j.d.ts} +1 -1
  240. package/dist/memory-projection-store.d.ts +1 -1
  241. package/dist/model-registry.js +2 -2
  242. package/dist/models-json.js +2 -2
  243. package/dist/native-knowledge.js +2 -2
  244. package/dist/negative.js +2 -2
  245. package/dist/operator-toolkit.js +20 -15
  246. package/dist/{orchestrator-zTa-Qo-1.d.ts → orchestrator-DRYA6_lW.d.ts} +273 -9
  247. package/dist/orchestrator.d.ts +6 -3
  248. package/dist/orchestrator.js +76 -63
  249. package/dist/page-versioning.d.ts +77 -0
  250. package/dist/page-versioning.js +15 -0
  251. package/dist/page-versioning.js.map +1 -0
  252. package/dist/plugin-id.d.ts +37 -0
  253. package/dist/plugin-id.js +11 -0
  254. package/dist/plugin-id.js.map +1 -0
  255. package/dist/policy-runtime.js +2 -2
  256. package/dist/profiling.js +2 -2
  257. package/dist/qmd.d.ts +5 -2
  258. package/dist/qmd.js +4 -3
  259. package/dist/recall-audit.d.ts +20 -0
  260. package/dist/recall-audit.js +50 -0
  261. package/dist/recall-audit.js.map +1 -0
  262. package/dist/recall-mmr.d.ts +152 -0
  263. package/dist/recall-mmr.js +17 -0
  264. package/dist/recall-mmr.js.map +1 -0
  265. package/dist/recall-qos.js +2 -2
  266. package/dist/recall-state.d.ts +28 -1
  267. package/dist/recall-state.js +2 -2
  268. package/dist/relevance.js +2 -2
  269. package/dist/resolution-QBTDHTG7.js +100 -0
  270. package/dist/resolution-QBTDHTG7.js.map +1 -0
  271. package/dist/resolve-provider-secret.d.ts +24 -1
  272. package/dist/resolve-provider-secret.js +4 -2
  273. package/dist/resume-bundles.js +6 -5
  274. package/dist/retrieval-agents.js +2 -2
  275. package/dist/retrieval.js +2 -2
  276. package/dist/schemas.d.ts +412 -54
  277. package/dist/schemas.js +3 -1
  278. package/dist/sdk-compat.d.ts +2 -0
  279. package/dist/sdk-compat.js +6 -3
  280. package/dist/sdk-compat.js.map +1 -1
  281. package/dist/semantic-chunking.d.ts +87 -0
  282. package/dist/semantic-chunking.js +20 -0
  283. package/dist/semantic-chunking.js.map +1 -0
  284. package/dist/semantic-consolidation-DrvSYRdB.d.ts +119 -0
  285. package/dist/semantic-consolidation.d.ts +4 -42
  286. package/dist/semantic-consolidation.js +23 -2
  287. package/dist/semantic-rule-promotion.js +9 -6
  288. package/dist/semantic-rule-verifier.js +10 -7
  289. package/dist/session-observer-state.js +2 -2
  290. package/dist/session-toggles.d.ts +22 -0
  291. package/dist/session-toggles.js +116 -0
  292. package/dist/session-toggles.js.map +1 -0
  293. package/dist/skills-registry.d.ts +47 -0
  294. package/dist/skills-registry.js +48 -0
  295. package/dist/skills-registry.js.map +1 -0
  296. package/dist/source-attribution.d.ts +169 -0
  297. package/dist/source-attribution.js +27 -0
  298. package/dist/source-attribution.js.map +1 -0
  299. package/dist/storage.d.ts +171 -10
  300. package/dist/storage.js +16 -5
  301. package/dist/summarizer.js +7 -7
  302. package/dist/temporal-supersession.d.ts +127 -0
  303. package/dist/temporal-supersession.js +20 -0
  304. package/dist/temporal-supersession.js.map +1 -0
  305. package/dist/threading.js +2 -2
  306. package/dist/tier-migration.d.ts +2 -1
  307. package/dist/tier-routing.js +2 -2
  308. package/dist/tokens.d.ts +21 -1
  309. package/dist/tokens.js +5 -1
  310. package/dist/transcript.js +2 -2
  311. package/dist/types-DJhqDJUV.d.ts +50 -0
  312. package/dist/types.d.ts +529 -3
  313. package/dist/types.js +1 -1
  314. package/dist/utility-learner.js +2 -2
  315. package/dist/utility-runtime.js +3 -3
  316. package/dist/verified-recall.js +11 -8
  317. package/dist/whitespace.d.ts +4 -0
  318. package/dist/whitespace.js +9 -0
  319. package/dist/whitespace.js.map +1 -0
  320. package/package.json +14 -8
  321. package/dist/chunk-2CJCWDMR.js +0 -87
  322. package/dist/chunk-2CJCWDMR.js.map +0 -1
  323. package/dist/chunk-2PO5ZRKV.js.map +0 -1
  324. package/dist/chunk-6UJQNRIO.js.map +0 -1
  325. package/dist/chunk-AAI7JARD.js.map +0 -1
  326. package/dist/chunk-B7LOFDVE.js.map +0 -1
  327. package/dist/chunk-BDFZXRSO.js.map +0 -1
  328. package/dist/chunk-CXWFUJR2.js.map +0 -1
  329. package/dist/chunk-DORBM6OB.js +0 -81
  330. package/dist/chunk-DORBM6OB.js.map +0 -1
  331. package/dist/chunk-ESSMF2FR.js.map +0 -1
  332. package/dist/chunk-HG2NKWR2.js.map +0 -1
  333. package/dist/chunk-HLBYLYRD.js.map +0 -1
  334. package/dist/chunk-HLXVTBF3.js.map +0 -1
  335. package/dist/chunk-ISY75RLM.js.map +0 -1
  336. package/dist/chunk-IZME7KW2.js.map +0 -1
  337. package/dist/chunk-KL4CP4SB.js.map +0 -1
  338. package/dist/chunk-KWBU5S5U.js.map +0 -1
  339. package/dist/chunk-M5ZBBBJI.js.map +0 -1
  340. package/dist/chunk-MDDAA2AO.js.map +0 -1
  341. package/dist/chunk-MWGVGUIS.js.map +0 -1
  342. package/dist/chunk-ORZMT74A.js.map +0 -1
  343. package/dist/chunk-OTFNI3OO.js.map +0 -1
  344. package/dist/chunk-PGK3VUHN.js.map +0 -1
  345. package/dist/chunk-QCCCQT3O.js.map +0 -1
  346. package/dist/chunk-QDOSNLB4.js.map +0 -1
  347. package/dist/chunk-QPKFPHOO.js +0 -178
  348. package/dist/chunk-QPKFPHOO.js.map +0 -1
  349. package/dist/chunk-QWUUMMIK.js.map +0 -1
  350. package/dist/chunk-QY2BHY5O.js.map +0 -1
  351. package/dist/chunk-TVVVQQAK.js.map +0 -1
  352. package/dist/chunk-U4PV25RD.js.map +0 -1
  353. package/dist/chunk-UYSKNO6E.js.map +0 -1
  354. package/dist/chunk-V4YC4LUK.js.map +0 -1
  355. package/dist/chunk-WWIQTB2Y.js.map +0 -1
  356. package/dist/chunk-XUHI52HK.js.map +0 -1
  357. package/dist/chunk-YNCQ7E4M.js.map +0 -1
  358. package/dist/chunk-ZJLY4QSU.js.map +0 -1
  359. /package/dist/{engine-2A6J4XEX.js.map → abort-error.js.map} +0 -0
  360. /package/dist/{chunk-NTTLPF7F.js.map → chunk-3QFQGRHO.js.map} +0 -0
  361. /package/dist/{chunk-G3AG3KZN.js.map → chunk-5IZL4DCV.js.map} +0 -0
  362. /package/dist/{chunk-BRK4ODMI.js.map → chunk-5NPGSAVB.js.map} +0 -0
  363. /package/dist/{chunk-QANCTXQF.js.map → chunk-6LX5ORAS.js.map} +0 -0
  364. /package/dist/{chunk-UIYZ5T3I.js.map → chunk-6UJ47TVX.js.map} +0 -0
  365. /package/dist/{chunk-L5RPWGFK.js.map → chunk-7DHTMOND.js.map} +0 -0
  366. /package/dist/{chunk-L7WO3MZ4.js.map → chunk-7ECD5ATE.js.map} +0 -0
  367. /package/dist/{chunk-Q6FETXJA.js.map → chunk-7SEAZFFB.js.map} +0 -0
  368. /package/dist/{chunk-SCHEKPYH.js.map → chunk-C2EFFULQ.js.map} +0 -0
  369. /package/dist/{chunk-GJR6D6KC.js.map → chunk-D654IBA6.js.map} +0 -0
  370. /package/dist/{chunk-UV2FO7J4.js.map → chunk-E6K4NIEU.js.map} +0 -0
  371. /package/dist/{chunk-T4WRIV2C.js.map → chunk-EABGC2TL.js.map} +0 -0
  372. /package/dist/{chunk-ONRU4L2N.js.map → chunk-FEMOX5AD.js.map} +0 -0
  373. /package/dist/{chunk-IFFFR3MR.js.map → chunk-FSFEQI74.js.map} +0 -0
  374. /package/dist/{chunk-J3BT33K7.js.map → chunk-ITRLGI2T.js.map} +0 -0
  375. /package/dist/{chunk-J47FNDR7.js.map → chunk-JIU55F3X.js.map} +0 -0
  376. /package/dist/{chunk-ZKYI7UVO.js.map → chunk-JR4ZC3G4.js.map} +0 -0
  377. /package/dist/{chunk-UCYSTFZR.js.map → chunk-JRNQ3RNA.js.map} +0 -0
  378. /package/dist/{chunk-GPGBSNKM.js.map → chunk-K4FLSOR5.js.map} +0 -0
  379. /package/dist/{chunk-LP47L3ZX.js.map → chunk-N42IWANG.js.map} +0 -0
  380. /package/dist/{chunk-YNI4S5WT.js.map → chunk-N53K2EXC.js.map} +0 -0
  381. /package/dist/{chunk-763GUIOU.js.map → chunk-NBNN5GOB.js.map} +0 -0
  382. /package/dist/{chunk-OOSWAUYB.js.map → chunk-ODWDQNRE.js.map} +0 -0
  383. /package/dist/{chunk-OTAVQCSF.js.map → chunk-PYXS46O7.js.map} +0 -0
  384. /package/dist/{chunk-4A24LIM2.js.map → chunk-S75M5ZRK.js.map} +0 -0
  385. /package/dist/{chunk-M5KEYE5E.js.map → chunk-URB2WSKZ.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/storage.ts"],"sourcesContent":["import { access, readdir, readFile, stat, writeFile, mkdir, unlink, rename, appendFile } from \"node:fs/promises\";\nimport { appendFileSync, mkdirSync, statSync } from \"node:fs\";\nimport { createHash } from \"node:crypto\";\nimport path from \"node:path\";\nimport { log } from \"./logger.js\";\nimport { getCachedEntities, setCachedEntities } from \"./memory-cache.js\";\nimport { rotateMarkdownFileToArchive } from \"./hygiene.js\";\nimport { sanitizeMemoryContent } from \"./sanitize.js\";\nimport type {\n AccessTrackingEntry,\n BufferState,\n ConfidenceTier,\n ContinuityIncidentCloseInput,\n ContinuityIncidentOpenInput,\n ContinuityIncidentRecord,\n ContinuityImprovementLoop,\n ContinuityLoopReviewInput,\n ContinuityLoopUpsertInput,\n EntityActivityEntry,\n EntityFile,\n EntityRelationship,\n ImportanceLevel,\n ImportanceScore,\n MemoryCategory,\n MemoryFile,\n MemoryFrontmatter,\n MemoryLink,\n LifecycleState,\n VerificationState,\n PolicyClass,\n MemoryStatus,\n MemoryActionEvent,\n MemoryLifecycleEvent,\n MemoryLifecycleEventType,\n MemoryLifecycleStateSummary,\n MemoryProjectionCurrentState,\n BehaviorSignalEvent,\n MemorySummary,\n MetaState,\n CompressionGuidelineOptimizerState,\n PluginConfig,\n ScoredEntity,\n TopicScore,\n FileHygieneConfig,\n} from \"./types.js\";\nimport { confidenceTier, SPECULATIVE_TTL_DAYS } from \"./types.js\";\nimport {\n type ProjectedMemoryBrowseOptions,\n type ProjectedMemoryBrowsePage,\n readProjectedMemoryState,\n readProjectedMemoryBrowse,\n readProjectedGovernanceRecord,\n readProjectedMemoryTimeline,\n} from \"./memory-projection-store.js\";\nimport {\n inferMemoryStatus,\n isArchivedMemoryPath,\n sortMemoryLifecycleEvents,\n toMemoryPathRel,\n} from \"./memory-lifecycle-ledger-utils.js\";\nimport {\n normalizeProjectionPreview,\n normalizeProjectionTags,\n} from \"./memory-projection-format.js\";\nimport {\n closeContinuityIncidentRecord,\n createContinuityIncidentRecord,\n parseContinuityIncident,\n parseContinuityImprovementLoops,\n reviewContinuityLoopInMarkdown,\n serializeContinuityIncident,\n upsertContinuityLoopInMarkdown,\n} from \"./identity-continuity.js\";\n\nconst ARTIFACT_SEARCH_STOPWORDS = new Set([\n \"a\",\n \"an\",\n \"and\",\n \"are\",\n \"as\",\n \"at\",\n \"be\",\n \"but\",\n \"by\",\n \"for\",\n \"from\",\n \"has\",\n \"have\",\n \"i\",\n \"in\",\n \"is\",\n \"it\",\n \"of\",\n \"on\",\n \"or\",\n \"that\",\n \"the\",\n \"this\",\n \"to\",\n \"was\",\n \"were\",\n \"with\",\n]);\n\nexport interface ReextractJobRequest {\n memoryId: string;\n model: string;\n requestedAt: string;\n source: \"cli-migrate\";\n}\n\nexport interface MemoryLifecycleEventWriteOptions {\n at?: Date;\n actor?: string;\n reasonCode?: string;\n ruleVersion?: string;\n relatedMemoryIds?: string[];\n correlationId?: string;\n}\n\nfunction tokenizeArtifactSearchText(input: string): string[] {\n return input\n .toLowerCase()\n .split(/[^a-z0-9]+/i)\n .map((t) => t.trim())\n .filter((t) => t.length >= 2)\n .filter((t) => !ARTIFACT_SEARCH_STOPWORDS.has(t));\n}\n\nfunction serializeFrontmatter(fm: MemoryFrontmatter): string {\n const lines = [\n \"---\",\n `id: ${fm.id}`,\n `category: ${fm.category}`,\n `created: ${fm.created}`,\n `updated: ${fm.updated}`,\n `source: ${fm.source}`,\n `confidence: ${fm.confidence}`,\n `confidenceTier: ${fm.confidenceTier}`,\n `tags: [${fm.tags.map((t) => `\"${t}\"`).join(\", \")}]`,\n ];\n if (fm.entityRef) lines.push(`entityRef: ${fm.entityRef}`);\n if (fm.supersedes) lines.push(`supersedes: ${fm.supersedes}`);\n if (fm.expiresAt) lines.push(`expiresAt: ${fm.expiresAt}`);\n if (fm.lineage && fm.lineage.length > 0) {\n lines.push(`lineage: [${fm.lineage.map((l) => `\"${l}\"`).join(\", \")}]`);\n }\n // Status management\n if (fm.status && fm.status !== \"active\") lines.push(`status: ${fm.status}`);\n if (fm.supersededBy) lines.push(`supersededBy: ${fm.supersededBy}`);\n if (fm.supersededAt) lines.push(`supersededAt: ${fm.supersededAt}`);\n if (fm.archivedAt) lines.push(`archivedAt: ${fm.archivedAt}`);\n // Lifecycle policy fields\n if (fm.lifecycleState) lines.push(`lifecycleState: ${fm.lifecycleState}`);\n if (fm.verificationState) lines.push(`verificationState: ${fm.verificationState}`);\n if (fm.policyClass) lines.push(`policyClass: ${fm.policyClass}`);\n if (fm.lastValidatedAt) lines.push(`lastValidatedAt: ${fm.lastValidatedAt}`);\n if (fm.decayScore !== undefined) lines.push(`decayScore: ${fm.decayScore}`);\n if (fm.heatScore !== undefined) lines.push(`heatScore: ${fm.heatScore}`);\n // Access tracking\n if (fm.accessCount !== undefined && fm.accessCount > 0) {\n lines.push(`accessCount: ${fm.accessCount}`);\n }\n if (fm.lastAccessed) lines.push(`lastAccessed: ${fm.lastAccessed}`);\n // Importance scoring\n if (fm.importance) {\n lines.push(`importanceScore: ${fm.importance.score}`);\n lines.push(`importanceLevel: ${fm.importance.level}`);\n if (fm.importance.reasons.length > 0) {\n lines.push(\n `importanceReasons: [${fm.importance.reasons\n .map((r) => `\"${r.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`)\n .join(\", \")}]`,\n );\n }\n if (fm.importance.keywords.length > 0) {\n lines.push(`importanceKeywords: [${fm.importance.keywords.map((k) => `\"${k}\"`).join(\", \")}]`);\n }\n }\n // Chunking (Phase 2A)\n if (fm.parentId) lines.push(`parentId: ${fm.parentId}`);\n if (fm.chunkIndex !== undefined) lines.push(`chunkIndex: ${fm.chunkIndex}`);\n if (fm.chunkTotal !== undefined) lines.push(`chunkTotal: ${fm.chunkTotal}`);\n // Memory Linking (Phase 3A)\n if (fm.links && fm.links.length > 0) {\n lines.push(\"links:\");\n for (const link of fm.links) {\n lines.push(` - targetId: ${link.targetId}`);\n lines.push(` linkType: ${link.linkType}`);\n lines.push(` strength: ${link.strength}`);\n if (link.reason) lines.push(` reason: ${JSON.stringify(link.reason)}`);\n }\n }\n if (fm.intentGoal) lines.push(`intentGoal: ${fm.intentGoal}`);\n if (fm.intentActionType) lines.push(`intentActionType: ${fm.intentActionType}`);\n if (fm.intentEntityTypes && fm.intentEntityTypes.length > 0) {\n lines.push(`intentEntityTypes: [${fm.intentEntityTypes.map((t) => `\"${t}\"`).join(\", \")}]`);\n }\n if (fm.artifactType) lines.push(`artifactType: ${fm.artifactType}`);\n if (fm.sourceMemoryId) lines.push(`sourceMemoryId: ${fm.sourceMemoryId}`);\n if (fm.sourceTurnId) lines.push(`sourceTurnId: ${fm.sourceTurnId}`);\n // v8.0 Phase 2B: HiMem episode/note classification\n if (fm.memoryKind) lines.push(`memoryKind: ${fm.memoryKind}`);\n // Structured attributes (stored as JSON on a single line)\n if (fm.structuredAttributes && Object.keys(fm.structuredAttributes).length > 0) {\n lines.push(`structuredAttributes: ${JSON.stringify(fm.structuredAttributes)}`);\n }\n lines.push(\"---\");\n return lines.join(\"\\n\");\n}\n\nfunction parseStructuredAttributes(raw: string | undefined): Record<string, string> | undefined {\n if (!raw || !raw.trim()) return undefined;\n try {\n const parsed = JSON.parse(raw);\n if (typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)) {\n const result: Record<string, string> = {};\n for (const [k, v] of Object.entries(parsed)) {\n if (typeof k === \"string\" && typeof v === \"string\") {\n result[k] = v;\n }\n }\n return Object.keys(result).length > 0 ? result : undefined;\n }\n } catch {\n // Not valid JSON — ignore\n }\n return undefined;\n}\n\nfunction parseLinkReasonValue(rawValue: string): string {\n const legacyValue = rawValue.replace(/\\\\\"/g, '\"');\n const looksLikeLegacyPath =\n !rawValue.includes(\"\\\\\\\\\") &&\n (/[A-Za-z]:\\\\[A-Za-z0-9._ -]+(?:\\\\[A-Za-z0-9._ -]+)*/.test(rawValue) ||\n /\\\\[A-Za-z0-9._ -]+\\\\[A-Za-z0-9._ -]+/.test(rawValue));\n\n if (looksLikeLegacyPath) {\n return legacyValue;\n }\n\n try {\n return JSON.parse(`\"${rawValue}\"`) as string;\n } catch {\n return legacyValue;\n }\n}\n\nfunction parseFrontmatter(\n raw: string,\n): { frontmatter: MemoryFrontmatter; content: string } | null {\n const match = raw.match(/^---\\n([\\s\\S]*?)\\n---\\n?([\\s\\S]*)$/);\n if (!match) return null;\n\n const fmBlock = match[1];\n const content = match[2].trim();\n const fm: Record<string, string> = {};\n\n for (const line of fmBlock.split(\"\\n\")) {\n const colonIdx = line.indexOf(\":\");\n if (colonIdx === -1) continue;\n const key = line.slice(0, colonIdx).trim();\n const value = line.slice(colonIdx + 1).trim();\n fm[key] = value;\n }\n\n let tags: string[] = [];\n const tagsStr = fm.tags ?? \"\";\n const tagMatch = tagsStr.match(/\\[(.*)]/);\n if (tagMatch) {\n tags = tagMatch[1]\n .split(\",\")\n .map((t) => t.trim().replace(/^\"|\"$/g, \"\"))\n .filter(Boolean);\n }\n\n let intentEntityTypes: string[] | undefined;\n const intentEntityTypesStr = fm.intentEntityTypes ?? \"\";\n const intentEntityTypesMatch = intentEntityTypesStr.match(/\\[(.*)]/);\n if (intentEntityTypesMatch) {\n intentEntityTypes = intentEntityTypesMatch[1]\n .split(\",\")\n .map((t) => t.trim().replace(/^\"|\"$/g, \"\"))\n .filter(Boolean);\n }\n\n const conf = parseFloat(fm.confidence ?? \"0.8\");\n\n // Parse lineage array if present\n let lineage: string[] | undefined;\n const lineageStr = fm.lineage ?? \"\";\n const lineageMatch = lineageStr.match(/\\[(.*)]/);\n if (lineageMatch) {\n lineage = lineageMatch[1]\n .split(\",\")\n .map((l) => l.trim().replace(/^\"|\"$/g, \"\"))\n .filter(Boolean);\n }\n\n // Parse accessCount\n const accessCount = fm.accessCount ? parseInt(fm.accessCount, 10) : undefined;\n const decayScore = fm.decayScore !== undefined ? parseFloat(fm.decayScore) : undefined;\n const heatScore = fm.heatScore !== undefined ? parseFloat(fm.heatScore) : undefined;\n\n // Parse importance\n let importance: ImportanceScore | undefined;\n if (fm.importanceScore) {\n const score = parseFloat(fm.importanceScore);\n const level = (fm.importanceLevel as ImportanceLevel) || \"normal\";\n\n // Parse importance reasons array\n let reasons: string[] = [];\n const reasonsStr = fm.importanceReasons ?? \"\";\n if (reasonsStr.trim().startsWith(\"[\") && reasonsStr.trim().endsWith(\"]\")) {\n const reasonMatches = reasonsStr.matchAll(/\"((?:\\\\.|[^\"\\\\])*)\"/g);\n for (const match of reasonMatches) {\n const reason = parseLinkReasonValue(match[1]);\n if (reason.length > 0) {\n reasons.push(reason);\n }\n }\n }\n\n // Parse importance keywords array\n let keywords: string[] = [];\n const keywordsStr = fm.importanceKeywords ?? \"\";\n const keywordsMatch = keywordsStr.match(/\\[(.*)]/);\n if (keywordsMatch) {\n keywords = keywordsMatch[1]\n .split(\",\")\n .map((k) => k.trim().replace(/^\"|\"$/g, \"\"))\n .filter(Boolean);\n }\n\n importance = { score, level, reasons, keywords };\n }\n\n const result: { frontmatter: MemoryFrontmatter; content: string } = {\n frontmatter: {\n id: fm.id ?? \"\",\n category: (fm.category ?? \"fact\") as MemoryCategory,\n created: fm.created ?? new Date().toISOString(),\n updated: fm.updated ?? new Date().toISOString(),\n source: fm.source ?? \"unknown\",\n confidence: conf,\n confidenceTier: (fm.confidenceTier as ConfidenceTier) || confidenceTier(conf),\n tags,\n entityRef: fm.entityRef || undefined,\n supersedes: fm.supersedes || undefined,\n expiresAt: fm.expiresAt || undefined,\n lineage: lineage && lineage.length > 0 ? lineage : undefined,\n // Status management\n status: (fm.status as MemoryStatus) || \"active\",\n supersededBy: fm.supersededBy || undefined,\n supersededAt: fm.supersededAt || undefined,\n archivedAt: fm.archivedAt || undefined,\n lifecycleState: (fm.lifecycleState as LifecycleState) || undefined,\n verificationState: (fm.verificationState as VerificationState) || undefined,\n policyClass: (fm.policyClass as PolicyClass) || undefined,\n lastValidatedAt: fm.lastValidatedAt || undefined,\n decayScore: Number.isFinite(decayScore) ? decayScore : undefined,\n heatScore: Number.isFinite(heatScore) ? heatScore : undefined,\n // Access tracking\n accessCount: accessCount && accessCount > 0 ? accessCount : undefined,\n lastAccessed: fm.lastAccessed || undefined,\n // Importance scoring\n importance,\n // Chunking\n parentId: fm.parentId || undefined,\n chunkIndex: fm.chunkIndex ? parseInt(fm.chunkIndex, 10) : undefined,\n chunkTotal: fm.chunkTotal ? parseInt(fm.chunkTotal, 10) : undefined,\n // Links are parsed separately below\n intentGoal: fm.intentGoal || undefined,\n intentActionType: fm.intentActionType || undefined,\n intentEntityTypes: intentEntityTypes && intentEntityTypes.length > 0 ? intentEntityTypes : undefined,\n artifactType: (fm.artifactType as MemoryFrontmatter[\"artifactType\"]) || undefined,\n sourceMemoryId: fm.sourceMemoryId || undefined,\n sourceTurnId: fm.sourceTurnId || undefined,\n // v8.0 Phase 2B: HiMem episode/note classification\n memoryKind: (fm.memoryKind as MemoryFrontmatter[\"memoryKind\"]) || undefined,\n // Structured attributes (JSON on a single line)\n structuredAttributes: parseStructuredAttributes(fm.structuredAttributes),\n },\n content,\n };\n\n // Parse links (YAML array format)\n // Note: Simple parsing - for full YAML we'd need a library.\n if (fmBlock.includes(\"links:\")) {\n const links: MemoryLink[] = [];\n const linkMatches = fmBlock.matchAll(\n /- targetId: (\\S+)\\s+linkType: (\\S+)\\s+strength: ([\\d.]+)(?:\\s+reason: \"((?:\\\\.|[^\"\\\\])*)\")?/g,\n );\n for (const match of linkMatches) {\n links.push({\n targetId: match[1],\n linkType: match[2] as MemoryLink[\"linkType\"],\n strength: parseFloat(match[3]),\n reason: match[4] ? parseLinkReasonValue(match[4]) : undefined,\n });\n }\n if (links.length > 0) {\n result.frontmatter.links = links;\n }\n }\n\n return result;\n}\n\nfunction normalizeFrontmatterForPath(frontmatter: MemoryFrontmatter, pathRel: string): MemoryFrontmatter {\n if (isArchivedMemoryPath(pathRel) && (!frontmatter.status || frontmatter.status === \"active\")) {\n return {\n ...frontmatter,\n status: \"archived\",\n };\n }\n\n return frontmatter;\n}\n\nfunction inferCurrentStateStatus(\n frontmatter: MemoryFrontmatter,\n pathRel: string,\n fallbackStatus: MemoryStatus,\n): MemoryStatus {\n return inferMemoryStatus(frontmatter, pathRel, fallbackStatus);\n}\n\n/**\n * Entity alias table loaded from the user's local config.\n * Populated by StorageManager.loadAliases() at startup.\n * Falls back to built-in structural aliases (e.g. \"open-claw\" → \"openclaw\").\n */\nlet userAliases: Record<string, string> = {};\n\n/** Built-in aliases for common structural normalizations (no personal data) */\nconst BUILTIN_ALIASES: Record<string, string> = {\n openclaw: \"openclaw\",\n \"open-claw\": \"openclaw\",\n};\n\n/**\n * Normalize an entity name to a canonical form.\n * Strips non-alphanumeric chars, collapses hyphens, removes type prefix duplication.\n * e.g. \"My Project\" → \"my-project\"\n *\n * Checks user-defined aliases (from config/aliases.json) first, then built-in aliases.\n */\nexport function normalizeEntityName(raw: string, type: string): string {\n // Strip type prefix if present (e.g. name=\"person-jane-doe\", type=\"person\")\n const rawStr = typeof raw === \"string\" ? raw : \"\";\n const typeStr = typeof type === \"string\" && type.trim().length > 0 ? type : \"entity\";\n\n let name = rawStr.toLowerCase().trim();\n const typePrefix = `${typeStr.toLowerCase()}-`;\n if (name.startsWith(typePrefix)) {\n name = name.slice(typePrefix.length);\n }\n\n // Replace non-alphanumeric with hyphens, collapse multiples, trim edges\n let normalized = name\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n\n // Check user aliases first, then built-in\n if (userAliases[normalized]) {\n normalized = userAliases[normalized];\n } else if (BUILTIN_ALIASES[normalized]) {\n normalized = BUILTIN_ALIASES[normalized];\n }\n\n return `${typeStr.toLowerCase()}-${normalized}`;\n}\n\n/**\n * Simple Levenshtein distance between two strings.\n */\nfunction levenshtein(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n if (m === 0) return n;\n if (n === 0) return m;\n\n const dp: number[][] = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0));\n for (let i = 0; i <= m; i++) dp[i][0] = i;\n for (let j = 0; j <= n; j++) dp[0][j] = j;\n\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n dp[i][j] = a[i - 1] === b[j - 1]\n ? dp[i - 1][j - 1]\n : 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);\n }\n }\n return dp[m][n];\n}\n\n/** Strip hyphens from a string for loose comparison */\nfunction dehyphenate(s: string): string {\n return s.replace(/-/g, \"\");\n}\n\n/**\n * Content-hash dedup index for facts.\n * Normalizes content (lowercase, strip punctuation, collapse whitespace),\n * computes SHA-256, and stores hashes in a line-delimited file.\n * Prevents writing semantically identical facts.\n */\nexport class ContentHashIndex {\n private hashes: Set<string> = new Set();\n private dirty = false;\n private readonly filePath: string;\n\n constructor(stateDir: string) {\n this.filePath = path.join(stateDir, \"fact-hashes.txt\");\n }\n\n /** Load existing hashes from disk. Safe to call multiple times. */\n async load(): Promise<void> {\n try {\n const raw = await readFile(this.filePath, \"utf-8\");\n for (const line of raw.split(\"\\n\")) {\n const trimmed = line.trim();\n if (trimmed.length > 0) {\n this.hashes.add(trimmed);\n }\n }\n log.debug(`content-hash index: loaded ${this.hashes.size} hashes`);\n } catch {\n log.debug(\"content-hash index: no existing index — starting fresh\");\n }\n }\n\n /** Check if content already exists in the index. */\n has(content: string): boolean {\n return this.hashes.has(ContentHashIndex.computeHash(content));\n }\n\n /** Add content hash to the index. */\n add(content: string): void {\n const hash = ContentHashIndex.computeHash(content);\n if (!this.hashes.has(hash)) {\n this.hashes.add(hash);\n this.dirty = true;\n }\n }\n\n get size(): number {\n return this.hashes.size;\n }\n\n /** Persist index to disk if changed. */\n async save(): Promise<void> {\n if (!this.dirty) return;\n await mkdir(path.dirname(this.filePath), { recursive: true });\n await writeFile(this.filePath, [...this.hashes].join(\"\\n\") + \"\\n\", \"utf-8\");\n this.dirty = false;\n log.debug(`content-hash index: saved ${this.hashes.size} hashes`);\n }\n\n /** Remove a hash from the index (used when archiving/deleting). */\n remove(content: string): void {\n const hash = ContentHashIndex.computeHash(content);\n if (this.hashes.delete(hash)) {\n this.dirty = true;\n }\n }\n\n /** Normalize content and compute SHA-256 hash. */\n static normalizeContent(content: string): string {\n return content\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n }\n\n /** Normalize content and compute SHA-256 hash. */\n static computeHash(content: string): string {\n const normalized = ContentHashIndex.normalizeContent(content);\n return createHash(\"sha256\").update(normalized).digest(\"hex\");\n }\n}\n\n// ---------------------------------------------------------------------------\n// Entity file parsing / serialization (Knowledge Graph v7.0)\n// ---------------------------------------------------------------------------\n\n/**\n * Parse an entity markdown file into a structured EntityFile.\n * Backward compatible: old files without new sections get empty arrays.\n */\nexport function parseEntityFile(content: string): EntityFile {\n const lines = content.split(\"\\n\");\n\n // Header\n let name = \"\";\n let type = \"other\";\n let updated = \"\";\n let summary: string | undefined;\n const facts: string[] = [];\n const relationships: EntityRelationship[] = [];\n const activity: EntityActivityEntry[] = [];\n const aliases: string[] = [];\n\n // Parse name from first heading\n const headingLine = lines.find((l) => l.startsWith(\"# \"));\n if (headingLine) name = headingLine.slice(2).trim();\n\n // Parse type\n const typeLine = lines.find((l) => l.startsWith(\"**Type:**\"));\n if (typeLine) type = typeLine.replace(\"**Type:**\", \"\").trim();\n\n // Parse updated\n const updatedLine = lines.find((l) => l.startsWith(\"**Updated:**\"));\n if (updatedLine) updated = updatedLine.replace(\"**Updated:**\", \"\").trim();\n\n // Detect which section we're in\n let section = \"\";\n for (const line of lines) {\n if (line.startsWith(\"## \")) {\n section = line.slice(3).trim().toLowerCase();\n continue;\n }\n if (!line.startsWith(\"- \")) continue;\n\n const bullet = line.slice(2).trim();\n if (!bullet) continue;\n\n switch (section) {\n case \"facts\":\n facts.push(bullet);\n break;\n case \"summary\":\n // Summary is typically a single line after the heading, not a bullet\n break;\n case \"connected to\": {\n // Format: [[target-entity]] — relationship label\n const relMatch = bullet.match(/^\\[\\[([^\\]]+)\\]\\]\\s*[—–-]\\s*(.+)$/);\n if (relMatch) {\n relationships.push({ target: relMatch[1].trim(), label: relMatch[2].trim() });\n }\n break;\n }\n case \"activity\": {\n // Format: YYYY-MM-DD: note\n const actMatch = bullet.match(/^(\\d{4}-\\d{2}-\\d{2}):\\s*(.+)$/);\n if (actMatch) {\n activity.push({ date: actMatch[1], note: actMatch[2].trim() });\n }\n break;\n }\n case \"aliases\":\n aliases.push(bullet);\n break;\n }\n }\n\n // Parse summary: text between ## Summary heading and next ## heading (not bulleted)\n const summaryIdx = lines.findIndex((l) => l.startsWith(\"## Summary\"));\n if (summaryIdx !== -1) {\n const summaryLines: string[] = [];\n for (let i = summaryIdx + 1; i < lines.length; i++) {\n if (lines[i].startsWith(\"## \")) break;\n const trimmed = lines[i].trim();\n if (trimmed) summaryLines.push(trimmed);\n }\n if (summaryLines.length > 0) summary = summaryLines.join(\" \");\n }\n\n return { name, type, updated, facts, summary, relationships, activity, aliases };\n}\n\n/**\n * Serialize an EntityFile back to markdown.\n * Only emits sections that have content (except Facts which is always emitted).\n */\nexport function serializeEntityFile(entity: EntityFile): string {\n const lines: string[] = [\n `# ${entity.name}`,\n \"\",\n `**Type:** ${entity.type}`,\n `**Updated:** ${entity.updated || new Date().toISOString()}`,\n \"\",\n ];\n\n // Summary (optional)\n if (entity.summary) {\n lines.push(\"## Summary\", \"\", entity.summary, \"\");\n }\n\n // Facts (always emitted)\n lines.push(\"## Facts\", \"\");\n for (const f of entity.facts) {\n lines.push(`- ${f}`);\n }\n lines.push(\"\");\n\n // Connected to (optional)\n if (entity.relationships.length > 0) {\n lines.push(\"## Connected to\", \"\");\n for (const rel of entity.relationships) {\n lines.push(`- [[${rel.target}]] — ${rel.label}`);\n }\n lines.push(\"\");\n }\n\n // Activity (optional)\n if (entity.activity.length > 0) {\n lines.push(\"## Activity\", \"\");\n for (const act of entity.activity) {\n lines.push(`- ${act.date}: ${act.note}`);\n }\n lines.push(\"\");\n }\n\n // Aliases (optional)\n if (entity.aliases.length > 0) {\n lines.push(\"## Aliases\", \"\");\n for (const alias of entity.aliases) {\n lines.push(`- ${alias}`);\n }\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\nexport class StorageManager {\n private knowledgeIndexCache: { result: string; builtAt: number } | null = null;\n private static readonly KNOWLEDGE_INDEX_CACHE_TTL_MS = 600_000; // 10 minutes (entity mutations invalidate)\n private artifactIndexCache: { memories: MemoryFile[]; loadedAtMs: number; writeVersion: number } | null = null;\n private static readonly ARTIFACT_INDEX_CACHE_TTL_MS = 60_000; // 1 minute\n private static readonly artifactWriteVersionByDir = new Map<string, number>();\n private static readonly memoryStatusVersionByDir = new Map<string, number>();\n\n // Module-level cache for readAllMemories() keyed by base directory.\n // Shared across all StorageManager instances to avoid duplicate I/O when\n // multiple concurrent callers (e.g. verifiedRecall + verifiedRules) read the\n // same directory simultaneously. In-flight deduplication prevents multiple\n // concurrent reads of the same directory.\n //\n // Stale-while-revalidate: once the cache has a value, subsequent reads after\n // TTL expiry return the stale cached data immediately and kick off a background\n // refresh. This eliminates the 13-60 s cold-scan penalty that would otherwise\n // block recall requests every 5 minutes on large memory collections (80k+ files).\n private static readonly allMemoriesInFlight = new Map<string, Promise<MemoryFile[]>>();\n\n // Cache for readQuestions() — avoids serially re-reading tens of thousands of\n // question files on every recall. 60-second TTL is intentionally short so that\n // newly written questions surface quickly.\n private static readonly QUESTIONS_CACHE_TTL_MS = 60_000; // 1 minute\n private static readonly questionsCache = new Map<\n string,\n {\n questions: Array<{\n id: string;\n question: string;\n context: string;\n priority: number;\n resolved: boolean;\n created: string;\n filePath: string;\n }>;\n loadedAt: number;\n }\n >();\n private factHashIndex: ContentHashIndex | null = null;\n private factHashIndexLoadPromise: Promise<ContentHashIndex> | null = null;\n private factHashIndexAuthoritative: boolean | null = null;\n private factHashIndexAuthoritativePromise: Promise<void> | null = null;\n\n constructor(private readonly baseDir: string) {}\n\n /** The root directory of this storage instance. */\n get dir(): string {\n return this.baseDir;\n }\n\n private identityFilePath(workspaceDir: string, namespace?: string): string {\n const rawNamespace = typeof namespace === \"string\" ? namespace.trim() : \"\";\n if (!rawNamespace) return path.join(workspaceDir, \"IDENTITY.md\");\n const safeNamespace = rawNamespace.replace(/[^a-zA-Z0-9._-]/g, \"-\");\n return path.join(workspaceDir, `IDENTITY.${safeNamespace}.md`);\n }\n\n private versionFilePath(kind: \"memory-status\" | \"artifact-write\"): string {\n const fileName =\n kind === \"memory-status\" ? \".memory-status-version.log\" : \".artifact-write-version.log\";\n return path.join(this.stateDir, fileName);\n }\n\n private bumpSharedVersion(\n kind: \"memory-status\" | \"artifact-write\",\n fallbackMap: Map<string, number>,\n ): number {\n const filePath = this.versionFilePath(kind);\n try {\n mkdirSync(this.stateDir, { recursive: true });\n appendFileSync(filePath, \"x\");\n const next = statSync(filePath).size;\n fallbackMap.set(this.baseDir, next);\n return next;\n } catch {\n const next = (fallbackMap.get(this.baseDir) ?? 0) + 1;\n fallbackMap.set(this.baseDir, next);\n return next;\n }\n }\n\n private readSharedVersion(\n kind: \"memory-status\" | \"artifact-write\",\n fallbackMap: Map<string, number>,\n ): number {\n const filePath = this.versionFilePath(kind);\n try {\n return statSync(filePath).size;\n } catch {\n return fallbackMap.get(this.baseDir) ?? 0;\n }\n }\n\n private bumpMemoryStatusVersion(): void {\n this.bumpSharedVersion(\"memory-status\", StorageManager.memoryStatusVersionByDir);\n }\n\n getMemoryStatusVersion(): number {\n return this.readSharedVersion(\"memory-status\", StorageManager.memoryStatusVersionByDir);\n }\n\n private bumpArtifactWriteVersion(): number {\n return this.bumpSharedVersion(\"artifact-write\", StorageManager.artifactWriteVersionByDir);\n }\n\n private getArtifactWriteVersion(): number {\n return this.readSharedVersion(\"artifact-write\", StorageManager.artifactWriteVersionByDir);\n }\n\n private get factsDir(): string {\n return path.join(this.baseDir, \"facts\");\n }\n private get correctionsDir(): string {\n return path.join(this.baseDir, \"corrections\");\n }\n private get entitiesDir(): string {\n return path.join(this.baseDir, \"entities\");\n }\n private get stateDir(): string {\n return path.join(this.baseDir, \"state\");\n }\n private get factHashIndexReadyPath(): string {\n return path.join(this.stateDir, \"fact-hashes.ready\");\n }\n\n private async getFactHashIndex(): Promise<ContentHashIndex> {\n if (this.factHashIndex) {\n return this.factHashIndex;\n }\n if (!this.factHashIndexLoadPromise) {\n const index = new ContentHashIndex(this.stateDir);\n this.factHashIndexLoadPromise = index\n .load()\n .then(() => {\n this.factHashIndex = index;\n return index;\n })\n .catch((err) => {\n this.factHashIndexLoadPromise = null;\n throw err;\n });\n }\n return this.factHashIndexLoadPromise;\n }\n\n private async ensureFactHashIndexAuthoritative(): Promise<void> {\n if (this.factHashIndexAuthoritative === true) {\n return;\n }\n if (this.factHashIndexAuthoritativePromise) {\n await this.factHashIndexAuthoritativePromise;\n return;\n }\n\n this.factHashIndexAuthoritativePromise = (async () => {\n try {\n await access(this.factHashIndexReadyPath);\n this.factHashIndexAuthoritative = true;\n return;\n } catch {\n // Fall through and backfill from the live fact corpus once.\n }\n\n const factHashIndex = await this.getFactHashIndex();\n const existing = await this.readAllMemories();\n for (const memory of existing) {\n if (memory.frontmatter.category !== \"fact\") continue;\n if (inferMemoryStatus(memory.frontmatter, memory.path) !== \"active\") continue;\n factHashIndex.add(memory.content);\n }\n await factHashIndex.save();\n await mkdir(path.dirname(this.factHashIndexReadyPath), { recursive: true });\n await writeFile(this.factHashIndexReadyPath, \"v1\\n\", \"utf-8\");\n this.factHashIndexAuthoritative = true;\n })().finally(() => {\n this.factHashIndexAuthoritativePromise = null;\n });\n await this.factHashIndexAuthoritativePromise;\n }\n private get questionsDir(): string {\n return path.join(this.baseDir, \"questions\");\n }\n private get artifactsDir(): string {\n return path.join(this.baseDir, \"artifacts\");\n }\n private get identityDir(): string {\n return path.join(this.baseDir, \"identity\");\n }\n private get identityAnchorPath(): string {\n return path.join(this.identityDir, \"identity-anchor.md\");\n }\n private get identityIncidentsDir(): string {\n return path.join(this.identityDir, \"incidents\");\n }\n private get identityAuditsWeeklyDir(): string {\n return path.join(this.identityDir, \"audits\", \"weekly\");\n }\n private get identityAuditsMonthlyDir(): string {\n return path.join(this.identityDir, \"audits\", \"monthly\");\n }\n private get identityImprovementLoopsPath(): string {\n return path.join(this.identityDir, \"improvement-loops.md\");\n }\n private get identityReflectionsPath(): string {\n return path.join(this.identityDir, \"reflections.md\");\n }\n private get profilePath(): string {\n return path.join(this.baseDir, \"profile.md\");\n }\n private get memoryActionsPath(): string {\n return path.join(this.stateDir, \"memory-actions.jsonl\");\n }\n private get memoryLifecycleLedgerPath(): string {\n return path.join(this.stateDir, \"memory-lifecycle-ledger.jsonl\");\n }\n private get compressionGuidelinesPath(): string {\n return path.join(this.stateDir, \"compression-guidelines.md\");\n }\n private get compressionGuidelineDraftPath(): string {\n return path.join(this.stateDir, \"compression-guidelines.draft.md\");\n }\n private get compressionGuidelineStatePath(): string {\n return path.join(this.stateDir, \"compression-guideline-state.json\");\n }\n private get compressionGuidelineDraftStatePath(): string {\n return path.join(this.stateDir, \"compression-guideline-draft-state.json\");\n }\n private get behaviorSignalsPath(): string {\n return path.join(this.stateDir, \"behavior-signals.jsonl\");\n }\n\n /**\n * Load user-defined entity aliases from config/aliases.json in the memory store.\n * File format: { \"variant\": \"canonical\", \"variant2\": \"canonical\", ... }\n * Call this once at startup (e.g. from orchestrator.initialize()).\n */\n async loadAliases(): Promise<void> {\n const aliasPath = path.join(this.baseDir, \"config\", \"aliases.json\");\n try {\n const raw = await readFile(aliasPath, \"utf-8\");\n const parsed = JSON.parse(raw);\n if (typeof parsed === \"object\" && parsed !== null) {\n userAliases = parsed as Record<string, string>;\n log.debug(`loaded ${Object.keys(userAliases).length} entity aliases from ${aliasPath}`);\n }\n } catch {\n // No aliases file — that's fine, use built-in only\n log.debug(\"no config/aliases.json found — using built-in aliases only\");\n }\n }\n\n async ensureDirectories(): Promise<void> {\n const today = new Date().toISOString().slice(0, 10);\n await mkdir(path.join(this.factsDir, today), { recursive: true });\n await mkdir(this.correctionsDir, { recursive: true });\n await mkdir(this.entitiesDir, { recursive: true });\n await mkdir(this.stateDir, { recursive: true });\n await mkdir(this.questionsDir, { recursive: true });\n await mkdir(this.artifactsDir, { recursive: true });\n await mkdir(this.identityDir, { recursive: true });\n await mkdir(this.identityIncidentsDir, { recursive: true });\n await mkdir(this.identityAuditsWeeklyDir, { recursive: true });\n await mkdir(this.identityAuditsMonthlyDir, { recursive: true });\n await mkdir(path.join(this.baseDir, \"config\"), { recursive: true });\n }\n\n async writeMemory(\n category: MemoryCategory,\n content: string,\n options: {\n actor?: string;\n confidence?: number;\n tags?: string[];\n entityRef?: string;\n source?: string;\n supersedes?: string;\n lineage?: string[];\n importance?: ImportanceScore;\n links?: MemoryLink[];\n intentGoal?: string;\n intentActionType?: string;\n intentEntityTypes?: string[];\n artifactType?: MemoryFrontmatter[\"artifactType\"];\n sourceMemoryId?: string;\n sourceTurnId?: string;\n memoryKind?: MemoryFrontmatter[\"memoryKind\"];\n expiresAt?: string;\n structuredAttributes?: Record<string, string>;\n } = {},\n ): Promise<string> {\n await this.ensureDirectories();\n const now = new Date();\n const today = now.toISOString().slice(0, 10);\n const id = `${category}-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;\n const conf = options.confidence ?? 0.8;\n const tier = confidenceTier(conf);\n\n // Auto-set TTL for speculative memories\n let expiresAt: string | undefined;\n if (typeof options.expiresAt === \"string\" && options.expiresAt.length > 0) {\n expiresAt = options.expiresAt;\n } else if (tier === \"speculative\") {\n const expiry = new Date(now.getTime() + SPECULATIVE_TTL_DAYS * 24 * 60 * 60 * 1000);\n expiresAt = expiry.toISOString();\n }\n\n const fm: MemoryFrontmatter = {\n id,\n category,\n created: now.toISOString(),\n updated: now.toISOString(),\n source: options.source ?? \"extraction\",\n confidence: conf,\n confidenceTier: tier,\n tags: options.tags ?? [],\n entityRef: options.entityRef,\n supersedes: options.supersedes,\n expiresAt,\n lineage: options.lineage,\n importance: options.importance,\n links: options.links,\n intentGoal: options.intentGoal,\n intentActionType: options.intentActionType,\n intentEntityTypes: options.intentEntityTypes,\n artifactType: options.artifactType,\n sourceMemoryId: options.sourceMemoryId,\n sourceTurnId: options.sourceTurnId,\n memoryKind: options.memoryKind,\n structuredAttributes: options.structuredAttributes,\n };\n\n // Append structured attributes as searchable suffix so QMD indexes them\n let enrichedContent = content;\n if (options.structuredAttributes && Object.keys(options.structuredAttributes).length > 0) {\n const attrLines = Object.entries(options.structuredAttributes)\n .map(([k, v]) => `${k}: ${v}`)\n .join(\"; \");\n enrichedContent = `${content}\\n[Attributes: ${attrLines}]`;\n }\n\n const sanitized = sanitizeMemoryContent(enrichedContent);\n if (!sanitized.clean) {\n log.warn(`memory content sanitized for ${id}; violations=${sanitized.violations.join(\", \")}`);\n }\n const fileContent = `${serializeFrontmatter(fm)}\\n\\n${sanitized.text}\\n`;\n\n let filePath: string;\n if (category === \"correction\") {\n filePath = path.join(this.correctionsDir, `${id}.md`);\n } else {\n filePath = path.join(this.factsDir, today, `${id}.md`);\n }\n\n await writeFile(filePath, fileContent, \"utf-8\");\n this.invalidateAllMemoriesCache();\n await this.appendGeneratedMemoryLifecycleEventFailOpen(\"storage.writeMemory\", {\n memoryId: id,\n eventType: \"created\",\n timestamp: fm.created,\n actor: options.actor ?? \"storage.writeMemory\",\n after: this.summarizeLifecycleState(fm, filePath),\n relatedMemoryIds: [\n ...(options.supersedes ? [options.supersedes] : []),\n ...((options.lineage ?? []).filter(Boolean)),\n ],\n });\n if (category === \"fact\") {\n try {\n const factHashIndex = await this.getFactHashIndex();\n factHashIndex.add(sanitized.text);\n await factHashIndex.save();\n } catch (err) {\n log.warn(`storage.writeMemory completed but failed to update fact hash index: ${err}`);\n }\n }\n log.debug(`wrote memory ${id} to ${filePath}`);\n return id;\n }\n\n async hasFactContentHash(content: string): Promise<boolean> {\n await this.ensureFactHashIndexAuthoritative();\n const factHashIndex = await this.getFactHashIndex();\n const sanitized = sanitizeMemoryContent(content);\n return factHashIndex.has(sanitized.text);\n }\n\n async isFactContentHashAuthoritative(): Promise<boolean> {\n await this.ensureFactHashIndexAuthoritative();\n return true;\n }\n\n async writeArtifact(\n quote: string,\n options: {\n actor?: string;\n tags?: string[];\n confidence?: number;\n artifactType?: MemoryFrontmatter[\"artifactType\"];\n sourceMemoryId?: string;\n sourceTurnId?: string;\n intentGoal?: string;\n intentActionType?: string;\n intentEntityTypes?: string[];\n } = {},\n ): Promise<string> {\n await this.ensureDirectories();\n const now = new Date();\n const day = now.toISOString().slice(0, 10);\n const dir = path.join(this.artifactsDir, day);\n await mkdir(dir, { recursive: true });\n\n const id = `artifact-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;\n const fm: MemoryFrontmatter = {\n id,\n category: \"fact\",\n created: now.toISOString(),\n updated: now.toISOString(),\n source: \"artifact\",\n confidence: options.confidence ?? 0.9,\n confidenceTier: confidenceTier(options.confidence ?? 0.9),\n tags: options.tags ?? [],\n artifactType: options.artifactType ?? \"fact\",\n sourceMemoryId: options.sourceMemoryId,\n sourceTurnId: options.sourceTurnId,\n intentGoal: options.intentGoal,\n intentActionType: options.intentActionType,\n intentEntityTypes: options.intentEntityTypes,\n };\n\n const sanitized = sanitizeMemoryContent(quote);\n if (!sanitized.clean) {\n log.warn(`artifact content rejected for ${id}; violations=${sanitized.violations.join(\", \")}`);\n return \"\";\n }\n const filePath = path.join(dir, `${id}.md`);\n await writeFile(filePath, `${serializeFrontmatter(fm)}\\n\\n${sanitized.text}\\n`, \"utf-8\");\n const actor =\n typeof options.actor === \"string\" && options.actor.length > 0\n ? options.actor\n : \"storage.writeArtifact\";\n await this.appendGeneratedMemoryLifecycleEventFailOpen(\"storage.writeArtifact\", {\n memoryId: id,\n eventType: \"created\",\n timestamp: fm.created,\n actor,\n after: this.summarizeLifecycleState(fm, filePath),\n relatedMemoryIds: options.sourceMemoryId ? [options.sourceMemoryId] : [],\n });\n this.bumpArtifactWriteVersion();\n // Always invalidate on write. This avoids stale mixed snapshots when multiple\n // processes share the same memoryDir and write concurrently.\n this.artifactIndexCache = null;\n return id;\n }\n\n private async readAllArtifactsCached(): Promise<MemoryFile[]> {\n if (\n this.artifactIndexCache &&\n Date.now() - this.artifactIndexCache.loadedAtMs <= StorageManager.ARTIFACT_INDEX_CACHE_TTL_MS &&\n this.artifactIndexCache.writeVersion === this.getArtifactWriteVersion()\n ) {\n return this.artifactIndexCache.memories;\n }\n\n const scanArtifacts = async (): Promise<MemoryFile[]> => {\n const artifacts: MemoryFile[] = [];\n const readDir = async (dir: string) => {\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n await readDir(fullPath);\n continue;\n }\n if (!entry.name.endsWith(\".md\")) continue;\n const memory = await this.readMemoryByPath(fullPath);\n if (!memory) continue;\n artifacts.push(memory);\n }\n } catch {\n // Directory doesn't exist yet\n }\n };\n await readDir(this.artifactsDir);\n return artifacts;\n };\n\n const MAX_REBUILD_RETRIES = 2;\n let latestArtifacts: MemoryFile[] = [];\n for (let attempt = 0; attempt <= MAX_REBUILD_RETRIES; attempt += 1) {\n const versionBefore = this.getArtifactWriteVersion();\n const artifacts = await scanArtifacts();\n const versionAfter = this.getArtifactWriteVersion();\n latestArtifacts = artifacts;\n if (versionAfter === versionBefore) {\n this.artifactIndexCache = { memories: artifacts, loadedAtMs: Date.now(), writeVersion: versionAfter };\n return artifacts;\n }\n }\n\n // Highly concurrent writer churn; keep cache invalid so next read retries a clean rebuild.\n // Return best-effort latest scan instead of an empty set to avoid dropping recall entirely.\n this.artifactIndexCache = null;\n return latestArtifacts;\n }\n\n async searchArtifacts(query: string, maxResults: number): Promise<MemoryFile[]> {\n const tokens = tokenizeArtifactSearchText(query);\n if (tokens.length === 0) return [];\n\n const artifacts = await this.readAllArtifactsCached();\n const hits: Array<{ score: number; memory: MemoryFile }> = [];\n for (const memory of artifacts) {\n const indexedTokens = new Set(\n tokenizeArtifactSearchText(`${memory.content} ${(memory.frontmatter.tags ?? []).join(\" \")}`),\n );\n const score = tokens.reduce((sum, t) => sum + (indexedTokens.has(t) ? 1 : 0), 0);\n if (score > 0) {\n hits.push({ score, memory });\n }\n }\n hits.sort((a, b) => b.score - a.score);\n return hits.slice(0, maxResults).map((h) => h.memory);\n }\n\n async writeEntity(\n name: string,\n type: string,\n facts: string[],\n ): Promise<string> {\n await this.ensureDirectories();\n if (typeof name !== \"string\" || !name.trim() || typeof type !== \"string\" || !type.trim()) {\n log.warn(\"writeEntity: invalid entity payload, skipping\", {\n nameType: typeof name,\n typeType: typeof type,\n });\n return \"\";\n }\n const safeFacts = Array.isArray(facts) ? facts.filter((f) => typeof f === \"string\") : [];\n let normalized = normalizeEntityName(name, type);\n\n // Check for fuzzy match against existing entities before creating a new file\n const match = await this.findMatchingEntity(name, type);\n if (match && match !== normalized) {\n log.debug(`fuzzy match: \"${normalized}\" → existing \"${match}\"`);\n normalized = match;\n }\n\n const filePath = path.join(this.entitiesDir, `${normalized}.md`);\n\n // Parse existing file to preserve relationships/activity/aliases/summary\n let entity: EntityFile = {\n name, type, updated: new Date().toISOString(),\n facts: [], summary: undefined, relationships: [], activity: [], aliases: [],\n };\n try {\n const existing = await readFile(filePath, \"utf-8\");\n entity = parseEntityFile(existing);\n } catch {\n // File doesn't exist yet\n }\n\n // Merge facts (dedup)\n entity.facts = [...new Set([...entity.facts, ...safeFacts])];\n entity.name = name;\n entity.type = type;\n entity.updated = new Date().toISOString();\n\n await writeFile(filePath, serializeEntityFile(entity), \"utf-8\");\n this.invalidateKnowledgeIndexCache();\n this.bumpMemoryStatusVersion(); // invalidate entity cache\n log.debug(`wrote entity ${normalized}`);\n return normalized;\n }\n\n async readProfile(): Promise<string> {\n try {\n return await readFile(this.profilePath, \"utf-8\");\n } catch {\n return \"\";\n }\n }\n\n async writeProfile(content: string): Promise<void> {\n await this.ensureDirectories();\n await writeFile(this.profilePath, content, \"utf-8\");\n log.debug(\"updated profile.md\");\n }\n\n /**\n * Normalize a string for fuzzy profile dedup: lowercase, strip punctuation, collapse whitespace.\n */\n private static normalizeForDedup(s: string): string {\n if (typeof s !== \"string\") return \"\";\n return s\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n }\n\n /**\n * Check if a new bullet is a fuzzy duplicate of any existing bullet.\n * Returns true if the new bullet should be skipped.\n */\n private static isFuzzyDuplicate(newNorm: string, existingNorms: string[]): boolean {\n for (const existing of existingNorms) {\n // Exact normalized match\n if (newNorm === existing) return true;\n\n // Containment check: shorter must be >60% length of longer\n const shorter = newNorm.length <= existing.length ? newNorm : existing;\n const longer = newNorm.length > existing.length ? newNorm : existing;\n if (shorter.length > 20 && shorter.length / longer.length > 0.6 && longer.includes(shorter)) {\n return true;\n }\n }\n return false;\n }\n\n async appendToProfile(updates: string[]): Promise<void> {\n // Filter out non-string entries that the LLM may return\n updates = updates.filter((u) => typeof u === \"string\" && u.trim().length > 0);\n if (updates.length === 0) return;\n const existing = await this.readProfile();\n\n const lines = existing ? existing.split(\"\\n\") : [];\n const existingBulletRaw = lines\n .filter((l) => l.startsWith(\"- \"))\n .map((l) => l.slice(2).trim());\n const existingNorms = existingBulletRaw.map(StorageManager.normalizeForDedup);\n\n const newBullets = updates.filter((u) => {\n const norm = StorageManager.normalizeForDedup(u);\n return !StorageManager.isFuzzyDuplicate(norm, existingNorms);\n });\n if (newBullets.length === 0) return;\n\n if (!existing) {\n const content = [\n \"# Behavioral Profile\",\n \"\",\n `*Last updated: ${new Date().toISOString()}*`,\n \"\",\n ...newBullets.map((b) => `- ${b}`),\n \"\",\n ].join(\"\\n\");\n await this.writeProfile(content);\n } else {\n const updatedTimestamp = existing.replace(\n /\\*Last updated:.*\\*/,\n `*Last updated: ${new Date().toISOString()}*`,\n );\n const withBullets = updatedTimestamp.trimEnd() + \"\\n\" + newBullets.map((b) => `- ${b}`).join(\"\\n\") + \"\\n\";\n await this.writeProfile(withBullets);\n }\n }\n\n /** Check if profile.md exceeds the max line cap and needs LLM consolidation */\n async profileNeedsConsolidation(triggerLines?: number): Promise<boolean> {\n const profile = await this.readProfile();\n if (!profile) return false;\n const lineCount = profile.split(\"\\n\").length;\n const threshold = typeof triggerLines === \"number\"\n ? Math.max(0, Math.floor(triggerLines))\n : StorageManager.PROFILE_MAX_LINES;\n return lineCount > threshold;\n }\n\n async readAllMemories(): Promise<MemoryFile[]> {\n // Deduplicate concurrent reads for the same directory so multiple\n // callers in the same recall share one disk scan.\n const inFlight = StorageManager.allMemoriesInFlight.get(this.baseDir);\n if (inFlight) return inFlight;\n\n const readPromise = this._readAllMemoriesFromDisk();\n StorageManager.allMemoriesInFlight.set(this.baseDir, readPromise);\n try {\n return await readPromise;\n } finally {\n // Only delete if we still own the slot — invalidateAllMemoriesCache()\n // may have already cleared it and a new read may have claimed it.\n if (StorageManager.allMemoriesInFlight.get(this.baseDir) === readPromise) {\n StorageManager.allMemoriesInFlight.delete(this.baseDir);\n }\n }\n }\n\n /** Invalidate the readAllMemories() cache after writes that add/remove memories. */\n /** Public cache invalidation for callers that need authoritative disk reads\n * (e.g. projection verify/rebuild). */\n invalidateAllMemoriesCacheForDir(): void {\n this.invalidateAllMemoriesCache();\n }\n\n /** Clear ALL static caches. Use in tests that write files directly\n * (bypassing StorageManager.writeMemory) to avoid stale reads. */\n static clearAllStaticCaches(): void {\n StorageManager.allMemoriesInFlight.clear();\n StorageManager.questionsCache.clear();\n }\n\n /** Cancel any in-flight concurrent read so the next readAllMemories()\n * starts a fresh disk scan and sees the just-written data. */\n private invalidateAllMemoriesCache(): void {\n StorageManager.allMemoriesInFlight.delete(this.baseDir);\n }\n\n private normalizeMemoryReadBatchSize(batchSize?: number): number {\n if (typeof batchSize !== \"number\" || !Number.isFinite(batchSize)) {\n return 50;\n }\n return Math.max(1, Math.floor(batchSize));\n }\n\n private async collectActiveMemoryPaths(): Promise<string[]> {\n const filePaths: string[] = [];\n\n const collectPaths = async (dir: string) => {\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n const subdirs: string[] = [];\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n subdirs.push(fullPath);\n } else if (entry.name.endsWith(\".md\")) {\n filePaths.push(fullPath);\n }\n }\n for (const subdir of subdirs) {\n await collectPaths(subdir);\n }\n } catch {\n // Directory does not exist yet.\n }\n };\n\n await collectPaths(this.factsDir);\n await collectPaths(this.correctionsDir);\n return filePaths;\n }\n\n private async readParsedMemoriesFromPaths(\n filePaths: string[],\n batchSize?: number,\n ): Promise<MemoryFile[]> {\n if (filePaths.length === 0) return [];\n\n const normalizedBatchSize = this.normalizeMemoryReadBatchSize(batchSize);\n const memories: MemoryFile[] = [];\n for (let i = 0; i < filePaths.length; i += normalizedBatchSize) {\n const batch = filePaths.slice(i, i + normalizedBatchSize);\n const results = await Promise.all(\n batch.map(async (fullPath) => {\n try {\n const raw = await readFile(fullPath, \"utf-8\");\n const parsed = parseFrontmatter(raw);\n if (!parsed) return null;\n return {\n path: fullPath,\n frontmatter: normalizeFrontmatterForPath(\n parsed.frontmatter,\n toMemoryPathRel(this.baseDir, fullPath),\n ),\n content: parsed.content,\n } satisfies MemoryFile;\n } catch {\n return null;\n }\n }),\n );\n for (const memory of results) {\n if (memory !== null) memories.push(memory);\n }\n }\n return memories;\n }\n\n private async readWindowUpdatedMs(filePath: string): Promise<number | null> {\n try {\n const raw = await readFile(filePath, \"utf-8\");\n const match = raw.match(/^---\\n([\\s\\S]*?)\\n---\\n?/);\n if (!match) return null;\n const frontmatterBlock = match[1];\n const rawUpdated =\n frontmatterBlock.match(/^updated:\\s*\"?([^\"\\n]*)\"?/m)?.[1]\n ?? frontmatterBlock.match(/^created:\\s*\"?([^\"\\n]*)\"?/m)?.[1]\n ?? null;\n const updatedMs = rawUpdated ? Date.parse(rawUpdated) : Number.NaN;\n return Number.isFinite(updatedMs) ? updatedMs : null;\n } catch {\n return null;\n }\n }\n\n private async filterWindowPathsByUpdatedAfter(filePaths: string[], updatedAfterMs: number): Promise<string[]> {\n const results = await Promise.all(filePaths.map(async (filePath) => {\n const updatedMs = await this.readWindowUpdatedMs(filePath);\n if (updatedMs !== null) {\n return updatedMs >= updatedAfterMs ? filePath : null;\n }\n try {\n const fileStat = await stat(filePath);\n return fileStat.mtimeMs >= updatedAfterMs ? filePath : null;\n } catch {\n return filePath;\n }\n }));\n return results.filter((filePath): filePath is string => filePath !== null);\n }\n\n private orderWindowPaths(filePaths: string[]): string[] {\n const correctionPaths: string[] = [];\n const factPaths: string[] = [];\n\n for (const filePath of filePaths) {\n if (filePath === this.correctionsDir || filePath.startsWith(`${this.correctionsDir}${path.sep}`)) {\n correctionPaths.push(filePath);\n } else {\n factPaths.push(filePath);\n }\n }\n\n correctionPaths.sort((left, right) => right.localeCompare(left));\n factPaths.sort((left, right) => right.localeCompare(left));\n\n if (correctionPaths.length === 0) return factPaths;\n if (factPaths.length === 0) return correctionPaths;\n\n const ordered: string[] = [];\n const maxLength = Math.max(correctionPaths.length, factPaths.length);\n for (let i = 0; i < maxLength; i += 1) {\n const correctionPath = correctionPaths[i];\n if (correctionPath) ordered.push(correctionPath);\n const factPath = factPaths[i];\n if (factPath) ordered.push(factPath);\n }\n return ordered;\n }\n\n private async readWindowBoundedBatch(\n candidateBatchPaths: string[],\n remainingSlots: number,\n remainingInspectionBudget: number,\n readBatchSize: number,\n ): Promise<{ memories: MemoryFile[]; filePaths: string[] }> {\n const memories: MemoryFile[] = [];\n const filePaths: string[] = [];\n const normalizedReadBatchSize = this.normalizeMemoryReadBatchSize(readBatchSize);\n\n for (let index = 0; index < candidateBatchPaths.length; ) {\n if (memories.length >= remainingSlots || filePaths.length >= remainingInspectionBudget) break;\n const availableSlots = remainingSlots - memories.length;\n const availableInspectionBudget = remainingInspectionBudget - filePaths.length;\n const parallelWindow =\n availableSlots >= 4 && availableInspectionBudget >= 4\n ? Math.min(normalizedReadBatchSize, 4)\n : 1;\n const candidatePaths = candidateBatchPaths.slice(\n index,\n index + Math.min(parallelWindow, availableInspectionBudget),\n );\n index += candidatePaths.length;\n if (candidatePaths.length === 0) break;\n filePaths.push(...candidatePaths);\n const parsedMemories = await this.readParsedMemoriesFromPaths(candidatePaths, candidatePaths.length);\n if (parsedMemories.length === 0) continue;\n memories.push(...parsedMemories.slice(0, availableSlots));\n }\n\n return { memories, filePaths };\n }\n\n async readMemoriesWindow(options: {\n maxMemories?: number;\n batchSize?: number;\n updatedAfter?: Date;\n } = {}): Promise<{ memories: MemoryFile[]; filePaths: string[] }> {\n const allPaths = await this.collectActiveMemoryPaths();\n const sortedPaths = this.orderWindowPaths(allPaths);\n const maxMemories =\n typeof options.maxMemories === \"number\" && Number.isFinite(options.maxMemories)\n ? Math.max(1, Math.floor(options.maxMemories))\n : undefined;\n const maxCandidatePaths = maxMemories === undefined ? undefined : maxMemories * 2;\n const updatedAfterMs = options.updatedAfter?.getTime();\n const normalizedBatchSize = this.normalizeMemoryReadBatchSize(options.batchSize);\n const memories: MemoryFile[] = [];\n const selectedPaths: string[] = [];\n\n for (let i = 0; i < sortedPaths.length; i += normalizedBatchSize) {\n if (\n maxMemories !== undefined\n && (memories.length >= maxMemories || (maxCandidatePaths !== undefined && selectedPaths.length >= maxCandidatePaths))\n ) {\n return { memories, filePaths: selectedPaths };\n }\n const batchPaths = sortedPaths.slice(i, i + normalizedBatchSize);\n const candidateBatchPaths = updatedAfterMs === undefined\n ? batchPaths\n : await this.filterWindowPathsByUpdatedAfter(batchPaths, updatedAfterMs);\n const remainingSlots = maxMemories === undefined ? undefined : Math.max(0, maxMemories - memories.length);\n const remainingInspectionBudget = maxCandidatePaths === undefined ? undefined : Math.max(0, maxCandidatePaths - selectedPaths.length);\n const { memories: batchMemories, filePaths: parsedCandidatePaths } = remainingSlots === undefined\n ? {\n memories: await this.readParsedMemoriesFromPaths(candidateBatchPaths, normalizedBatchSize),\n filePaths: candidateBatchPaths,\n }\n : await this.readWindowBoundedBatch(\n candidateBatchPaths,\n remainingSlots,\n remainingInspectionBudget ?? remainingSlots,\n normalizedBatchSize,\n );\n selectedPaths.push(...parsedCandidatePaths);\n for (const memory of batchMemories) {\n memories.push(memory);\n if (maxMemories !== undefined && memories.length >= maxMemories) {\n return { memories, filePaths: selectedPaths };\n }\n }\n }\n\n return { memories, filePaths: selectedPaths };\n }\n\n private async _readAllMemoriesFromDisk(): Promise<MemoryFile[]> {\n const filePaths = await this.collectActiveMemoryPaths();\n return this.readParsedMemoriesFromPaths(filePaths, 50);\n }\n\n /**\n * Read archived memory markdown files under archive/.\n * Used by long-term recall fallback when hot recall has no hits.\n */\n async readArchivedMemories(): Promise<MemoryFile[]> {\n const memories: MemoryFile[] = [];\n const root = this.archiveDir;\n\n const readDir = async (dir: string) => {\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n await readDir(fullPath);\n } else if (entry.name.endsWith(\".md\")) {\n try {\n const raw = await readFile(fullPath, \"utf-8\");\n const parsed = parseFrontmatter(raw);\n if (parsed) {\n memories.push({\n path: fullPath,\n frontmatter: normalizeFrontmatterForPath(\n parsed.frontmatter,\n toMemoryPathRel(this.baseDir, fullPath),\n ),\n content: parsed.content,\n });\n }\n } catch {\n // Skip unreadable files\n }\n }\n }\n } catch {\n // Directory doesn't exist yet\n }\n };\n\n await readDir(root);\n return memories;\n }\n\n /** Read a single memory file by its absolute path. Returns null if unreadable. */\n async readMemoryByPath(filePath: string): Promise<MemoryFile | null> {\n try {\n const raw = await readFile(filePath, \"utf-8\");\n const parsed = parseFrontmatter(raw);\n if (parsed) {\n return {\n path: filePath,\n frontmatter: normalizeFrontmatterForPath(\n parsed.frontmatter,\n toMemoryPathRel(this.baseDir, filePath),\n ),\n content: parsed.content,\n };\n }\n\n // Entity files use a `# Name` + `**Type:** ...` markdown format rather than\n // YAML frontmatter. Build a synthetic MemoryFile so entity files returned by\n // the direct retrieval agent participate in boostSearchResults and last-recall\n // tracking rather than being silently dropped.\n const normalizedPath = filePath.split(path.sep).join(\"/\");\n if (normalizedPath.includes(\"/entities/\") && filePath.endsWith(\".md\")) {\n const entity = parseEntityFile(raw);\n if (!entity.name) return null;\n const nameWithoutExt = path.basename(filePath, \".md\");\n // Fall back to file mtime rather than new Date() so that entities without\n // an explicit Updated: timestamp are not treated as freshly created on every\n // read. Using new Date() would inflate boostSearchResults recency scores for\n // every entity that lacks a timestamp.\n // Use epoch as the last-resort fallback so that entities without a\n // parseable timestamp don't appear as \"freshly created\" and inflate scores.\n const fileMtime = entity.updated\n || await stat(filePath).then((s) => s.mtime.toISOString()).catch(() => new Date(0).toISOString());\n return {\n path: filePath,\n frontmatter: {\n id: nameWithoutExt,\n category: \"entity\",\n created: fileMtime,\n updated: fileMtime,\n source: \"entity_extraction\",\n confidence: 0.9,\n confidenceTier: confidenceTier(0.9),\n tags: entity.type ? [entity.type] : [],\n },\n content: raw,\n };\n }\n\n return null;\n } catch {\n return null;\n }\n }\n\n private resolveTierRootDir(tier: \"hot\" | \"cold\"): string {\n return tier === \"cold\" ? path.join(this.baseDir, \"cold\") : this.baseDir;\n }\n\n private resolveMemoryDateDir(memory: MemoryFile): string {\n const preferred = memory.frontmatter.created || memory.frontmatter.updated;\n const dateToken = (preferred ?? \"\").slice(0, 10);\n return /^\\d{4}-\\d{2}-\\d{2}$/.test(dateToken)\n ? dateToken\n : new Date().toISOString().slice(0, 10);\n }\n\n private isArtifactMemory(memory: MemoryFile): boolean {\n if (memory.frontmatter.source === \"artifact\") return true;\n if (memory.frontmatter.artifactType !== undefined) return true;\n return /[\\\\/]artifacts[\\\\/]/.test(memory.path);\n }\n\n buildTierMemoryPath(memory: MemoryFile, tier: \"hot\" | \"cold\"): string {\n const root = this.resolveTierRootDir(tier);\n if (this.isArtifactMemory(memory)) {\n return path.join(root, \"artifacts\", this.resolveMemoryDateDir(memory), `${memory.frontmatter.id}.md`);\n }\n if (memory.frontmatter.category === \"correction\") {\n return path.join(root, \"corrections\", `${memory.frontmatter.id}.md`);\n }\n return path.join(root, \"facts\", this.resolveMemoryDateDir(memory), `${memory.frontmatter.id}.md`);\n }\n\n private async writeMemoryFileAtomic(targetPath: string, memory: MemoryFile): Promise<void> {\n const fileContent = `${serializeFrontmatter(memory.frontmatter)}\\n\\n${memory.content}\\n`;\n await mkdir(path.dirname(targetPath), { recursive: true });\n const tempPath = `${targetPath}.tmp-${process.pid}-${Date.now()}`;\n try {\n await writeFile(tempPath, fileContent, \"utf-8\");\n await rename(tempPath, targetPath);\n this.invalidateAllMemoriesCache();\n } catch (err) {\n try {\n await unlink(tempPath);\n } catch {\n // best-effort cleanup\n }\n throw err;\n }\n }\n\n async moveMemoryToPath(memory: MemoryFile, targetPath: string): Promise<void> {\n await this.writeMemoryFileAtomic(targetPath, memory);\n const sourcePath = path.resolve(memory.path);\n const destPath = path.resolve(targetPath);\n if (sourcePath !== destPath) {\n try {\n await unlink(memory.path);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (!message.includes(\"ENOENT\")) {\n throw err;\n }\n }\n // Re-invalidate after the unlink — writeMemoryFileAtomic already\n // invalidated, but a concurrent readAllMemories() may have re-populated\n // the cache between the write and the unlink.\n this.invalidateAllMemoriesCache();\n }\n }\n\n async migrateMemoryToTier(\n memory: MemoryFile,\n targetTier: \"hot\" | \"cold\",\n ): Promise<{ changed: boolean; targetPath: string }> {\n const targetPath = this.buildTierMemoryPath(memory, targetTier);\n const sourcePath = path.resolve(memory.path);\n const destPath = path.resolve(targetPath);\n if (sourcePath === destPath) {\n return { changed: false, targetPath };\n }\n\n const existing = await this.readMemoryByPath(targetPath);\n if (existing?.frontmatter.id === memory.frontmatter.id) {\n try {\n await unlink(memory.path);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (!message.includes(\"ENOENT\")) {\n throw err;\n }\n }\n this.bumpMemoryStatusVersion();\n return { changed: false, targetPath };\n }\n\n await this.moveMemoryToPath(memory, targetPath);\n this.invalidateAllMemoriesCache();\n this.bumpMemoryStatusVersion();\n return { changed: true, targetPath };\n }\n\n private get archiveDir(): string {\n return path.join(this.baseDir, \"archive\");\n }\n\n /**\n * Archive a memory by moving it from facts/ to archive/YYYY-MM-DD/.\n * Updates frontmatter with archived status before moving.\n * Returns the new file path on success, null on failure.\n */\n async archiveMemory(\n memory: MemoryFile,\n lifecycle?: MemoryLifecycleEventWriteOptions,\n ): Promise<string | null> {\n try {\n const now = lifecycle?.at ?? new Date();\n const today = now.toISOString().slice(0, 10);\n const destDir = path.join(this.archiveDir, today);\n await mkdir(destDir, { recursive: true });\n\n // Update frontmatter to reflect archived status\n const updatedFm: MemoryFrontmatter = {\n ...memory.frontmatter,\n status: \"archived\",\n archivedAt: now.toISOString(),\n updated: now.toISOString(),\n };\n\n const fileContent = `${serializeFrontmatter(updatedFm)}\\n\\n${memory.content}\\n`;\n const destPath = path.join(destDir, path.basename(memory.path));\n\n // Write to archive location first, then remove original\n await writeFile(destPath, fileContent, \"utf-8\");\n await unlink(memory.path);\n this.invalidateAllMemoriesCache();\n await this.appendGeneratedMemoryLifecycleEventFailOpen(\n \"storage.archiveMemory\",\n {\n memoryId: memory.frontmatter.id,\n eventType: \"archived\",\n timestamp: updatedFm.archivedAt ?? updatedFm.updated,\n actor: lifecycle?.actor ?? \"storage.archiveMemory\",\n reasonCode: lifecycle?.reasonCode,\n before: this.summarizeLifecycleState(memory.frontmatter, memory.path),\n after: this.summarizeLifecycleState(updatedFm, destPath),\n relatedMemoryIds: lifecycle?.relatedMemoryIds,\n correlationId: lifecycle?.correlationId,\n },\n lifecycle?.ruleVersion,\n );\n this.bumpMemoryStatusVersion();\n\n log.debug(`archived memory ${memory.frontmatter.id} → ${destPath}`);\n return destPath;\n } catch (err) {\n log.warn(`failed to archive memory ${memory.frontmatter.id}: ${err}`);\n return null;\n }\n }\n\n async readEntities(): Promise<string[]> {\n try {\n const entries = await readdir(this.entitiesDir);\n return entries.filter((e) => e.endsWith(\".md\")).map((e) => e.replace(\".md\", \"\"));\n } catch {\n return [];\n }\n }\n\n async readEntity(name: string): Promise<string> {\n try {\n return await readFile(path.join(this.entitiesDir, `${name}.md`), \"utf-8\");\n } catch {\n return \"\";\n }\n }\n\n /** Return sorted list of entity filenames (without .md extension) */\n async listEntityNames(): Promise<string[]> {\n try {\n const entries = await readdir(this.entitiesDir);\n return entries\n .filter((e) => e.endsWith(\".md\"))\n .map((e) => e.replace(\".md\", \"\"))\n .sort();\n } catch {\n return [];\n }\n }\n\n /**\n * Find an existing entity that fuzzy-matches the proposed name.\n * Returns the existing entity filename (without .md) or null if no match.\n *\n * Matching priority:\n * 1. Exact normalized match (handled by normalizeEntityName already)\n * 2. Dehyphenated match: \"jane-doe\" vs \"janedoe\"\n * 3. Substring containment: \"handle-janedoe\" contains \"janedoe\"\n * 4. Levenshtein ≤ 2 on dehyphenated names\n */\n async findMatchingEntity(proposedName: string, type: string): Promise<string | null> {\n const existing = await this.listEntityNames();\n if (existing.length === 0) return null;\n\n const typePrefix = `${type.toLowerCase()}-`;\n // Extract the name part from the proposed normalized name\n const proposedFull = normalizeEntityName(proposedName, type);\n const proposedNamePart = proposedFull.startsWith(typePrefix)\n ? proposedFull.slice(typePrefix.length)\n : proposedFull;\n const proposedDehyph = dehyphenate(proposedNamePart);\n\n // Only compare against entities of the same type\n const sameType = existing.filter((e) => e.startsWith(typePrefix));\n\n for (const entity of sameType) {\n const entityNamePart = entity.slice(typePrefix.length);\n const entityDehyph = dehyphenate(entityNamePart);\n\n // Already the exact normalized form\n if (entity === proposedFull) return entity;\n\n // Dehyphenated exact match\n if (entityDehyph === proposedDehyph) return entity;\n\n // Substring containment (shorter must be >60% length of longer)\n const shorter = proposedDehyph.length <= entityDehyph.length ? proposedDehyph : entityDehyph;\n const longer = proposedDehyph.length > entityDehyph.length ? proposedDehyph : entityDehyph;\n if (shorter.length > 3 && shorter.length / longer.length > 0.6 && longer.includes(shorter)) {\n return entity;\n }\n\n // Levenshtein distance ≤ 2 (only for names of reasonable length)\n if (proposedDehyph.length >= 4 && entityDehyph.length >= 4) {\n const dist = levenshtein(proposedDehyph, entityDehyph);\n if (dist <= 2) return entity;\n }\n }\n\n return null;\n }\n\n async invalidateMemory(id: string): Promise<boolean> {\n const memories = await this.readAllMemories();\n const memory = memories.find((m) => m.frontmatter.id === id);\n if (!memory) return false;\n\n try {\n await unlink(memory.path);\n this.invalidateAllMemoriesCache();\n this.bumpMemoryStatusVersion();\n log.debug(`invalidated memory ${id}`);\n return true;\n } catch {\n return false;\n }\n }\n\n async updateMemory(\n id: string,\n newContent: string,\n options?: { supersedes?: string; lineage?: string[]; actor?: string },\n ): Promise<boolean> {\n const memories = await this.readAllMemories();\n const memory = memories.find((m) => m.frontmatter.id === id);\n if (!memory) return false;\n\n const mergedLineage = [\n ...(memory.frontmatter.lineage ?? []),\n ...(options?.lineage ?? []),\n ].filter((v, i, a) => a.indexOf(v) === i); // dedupe\n\n const updated: MemoryFrontmatter = {\n ...memory.frontmatter,\n updated: new Date().toISOString(),\n supersedes: options?.supersedes ?? memory.frontmatter.supersedes,\n lineage: mergedLineage.length > 0 ? mergedLineage : undefined,\n };\n const sanitized = sanitizeMemoryContent(newContent);\n if (!sanitized.clean) {\n log.warn(`updated memory content sanitized for ${id}; violations=${sanitized.violations.join(\", \")}`);\n }\n const fileContent = `${serializeFrontmatter(updated)}\\n\\n${sanitized.text}\\n`;\n await writeFile(memory.path, fileContent, \"utf-8\");\n this.invalidateAllMemoriesCache();\n await this.appendGeneratedMemoryLifecycleEventFailOpen(\"storage.updateMemory\", {\n memoryId: id,\n eventType: \"updated\",\n timestamp: updated.updated,\n actor: options?.actor ?? \"storage.updateMemory\",\n before: this.summarizeLifecycleState(memory.frontmatter, memory.path),\n after: this.summarizeLifecycleState(updated, memory.path),\n relatedMemoryIds: [\n ...(updated.supersedes ? [updated.supersedes] : []),\n ...((updated.lineage ?? []).filter(Boolean)),\n ],\n });\n log.debug(`updated memory ${id}`);\n return true;\n }\n\n /**\n * Update frontmatter fields without changing memory content.\n * Returns false when the memory is not found.\n */\n async writeMemoryFrontmatter(\n memory: MemoryFile,\n patch: Partial<MemoryFrontmatter>,\n lifecycle?: MemoryLifecycleEventWriteOptions,\n ): Promise<boolean> {\n const beforeStatus = memory.frontmatter.status ?? \"active\";\n const updated: MemoryFrontmatter = {\n ...memory.frontmatter,\n ...patch,\n };\n const afterStatus = updated.status ?? \"active\";\n\n const fileContent = `${serializeFrontmatter(updated)}\\n\\n${memory.content}\\n`;\n await writeFile(memory.path, fileContent, \"utf-8\");\n this.invalidateAllMemoriesCache();\n await this.appendGeneratedMemoryLifecycleEventFailOpen(\n \"storage.writeMemoryFrontmatter\",\n {\n memoryId: updated.id,\n eventType: this.frontmatterPatchEventType(memory.frontmatter, updated),\n timestamp: updated.updated ?? new Date().toISOString(),\n actor: lifecycle?.actor ?? \"storage.writeMemoryFrontmatter\",\n reasonCode: lifecycle?.reasonCode,\n before: this.summarizeLifecycleState(memory.frontmatter, memory.path),\n after: this.summarizeLifecycleState(updated, memory.path),\n relatedMemoryIds: [\n ...(lifecycle?.relatedMemoryIds ?? []),\n ...(updated.supersededBy ? [updated.supersededBy] : []),\n ...(updated.supersedes ? [updated.supersedes] : []),\n ],\n correlationId: lifecycle?.correlationId,\n },\n lifecycle?.ruleVersion,\n );\n if (beforeStatus !== afterStatus) {\n this.bumpMemoryStatusVersion();\n }\n return true;\n }\n\n /**\n * Update frontmatter by memory ID.\n * Prefer writeMemoryFrontmatter(memory, patch) in batch loops to avoid full-corpus rescans.\n */\n async updateMemoryFrontmatter(\n id: string,\n patch: Partial<MemoryFrontmatter>,\n ): Promise<boolean> {\n const memories = await this.readAllMemories();\n const memory = memories.find((m) => m.frontmatter.id === id);\n if (!memory) return false;\n return this.writeMemoryFrontmatter(memory, patch);\n }\n\n /** Remove memories past their TTL expiresAt date */\n async cleanExpiredTTL(): Promise<MemoryFile[]> {\n const memories = await this.readAllMemories();\n const now = Date.now();\n const deleted: MemoryFile[] = [];\n\n for (const m of memories) {\n if (!m.frontmatter.expiresAt) continue;\n const expiresAt = new Date(m.frontmatter.expiresAt).getTime();\n if (expiresAt < now) {\n try {\n await unlink(m.path);\n deleted.push(m);\n log.debug(`cleaned expired memory ${m.frontmatter.id} (TTL expired)`);\n } catch {\n // Ignore\n }\n }\n }\n\n if (deleted.length > 0) {\n this.invalidateAllMemoriesCache();\n this.bumpMemoryStatusVersion();\n }\n\n return deleted;\n }\n\n async loadBuffer(): Promise<BufferState> {\n const bufferPath = path.join(this.stateDir, \"buffer.json\");\n try {\n const raw = await readFile(bufferPath, \"utf-8\");\n return JSON.parse(raw) as BufferState;\n } catch {\n return { turns: [], lastExtractionAt: null, extractionCount: 0 };\n }\n }\n\n async saveBuffer(state: BufferState): Promise<void> {\n await this.ensureDirectories();\n const bufferPath = path.join(this.stateDir, \"buffer.json\");\n await writeFile(bufferPath, JSON.stringify(state, null, 2), \"utf-8\");\n }\n\n async loadMeta(): Promise<MetaState> {\n const metaPath = path.join(this.stateDir, \"meta.json\");\n try {\n const raw = await readFile(metaPath, \"utf-8\");\n return JSON.parse(raw) as MetaState;\n } catch {\n return {\n extractionCount: 0,\n lastExtractionAt: null,\n lastConsolidationAt: null,\n totalMemories: 0,\n totalEntities: 0,\n };\n }\n }\n\n async saveMeta(state: MetaState): Promise<void> {\n await this.ensureDirectories();\n const metaPath = path.join(this.stateDir, \"meta.json\");\n await writeFile(metaPath, JSON.stringify(state, null, 2), \"utf-8\");\n }\n\n async appendMemoryActionEvents(events: MemoryActionEvent[]): Promise<number> {\n if (events.length === 0) return 0;\n await this.ensureDirectories();\n\n const nowIso = new Date().toISOString();\n const payload = events.map((event) => {\n const normalized: MemoryActionEvent = {\n ...event,\n timestamp: event.timestamp && event.timestamp.length > 0 ? event.timestamp : nowIso,\n };\n return `${JSON.stringify(normalized)}\\n`;\n }).join(\"\");\n\n await appendFile(this.memoryActionsPath, payload, \"utf-8\");\n return events.length;\n }\n\n async appendMemoryLifecycleEvents(events: MemoryLifecycleEvent[]): Promise<number> {\n if (events.length === 0) return 0;\n await this.ensureDirectories();\n\n const nowIso = new Date().toISOString();\n const payload = events.map((event) => {\n const normalized: MemoryLifecycleEvent = {\n ...event,\n timestamp: event.timestamp && event.timestamp.length > 0 ? event.timestamp : nowIso,\n };\n return `${JSON.stringify(normalized)}\\n`;\n }).join(\"\");\n\n await appendFile(this.memoryLifecycleLedgerPath, payload, \"utf-8\");\n return events.length;\n }\n\n async appendBehaviorSignals(events: BehaviorSignalEvent[]): Promise<number> {\n if (events.length === 0) return 0;\n await this.ensureDirectories();\n\n let existingKeys = new Set<string>();\n try {\n const raw = await readFile(this.behaviorSignalsPath, \"utf-8\");\n const lines = raw.split(\"\\n\");\n for (const line of lines) {\n const row = line.trim();\n if (!row) continue;\n try {\n const parsed = JSON.parse(row) as Partial<BehaviorSignalEvent>;\n if (typeof parsed.memoryId === \"string\" && typeof parsed.signalHash === \"string\") {\n existingKeys.add(`${parsed.memoryId}:${parsed.signalHash}`);\n }\n } catch {\n // Ignore malformed rows (fail-open).\n }\n }\n } catch {\n existingKeys = new Set<string>();\n }\n\n const nowIso = new Date().toISOString();\n const deduped: BehaviorSignalEvent[] = [];\n for (const event of events) {\n const key = `${event.memoryId}:${event.signalHash}`;\n if (existingKeys.has(key)) continue;\n existingKeys.add(key);\n deduped.push({\n ...event,\n timestamp: event.timestamp && event.timestamp.length > 0 ? event.timestamp : nowIso,\n });\n }\n\n if (deduped.length === 0) return 0;\n const payload = deduped.map((event) => `${JSON.stringify(event)}\\n`).join(\"\");\n await appendFile(this.behaviorSignalsPath, payload, \"utf-8\");\n return deduped.length;\n }\n\n async appendReextractJobs(events: ReextractJobRequest[]): Promise<number> {\n if (events.length === 0) return 0;\n await this.ensureDirectories();\n const filePath = path.join(this.stateDir, \"reextract-jobs.jsonl\");\n const lines = events.map((event) => JSON.stringify(event)).join(\"\\n\") + \"\\n\";\n try {\n await appendFile(filePath, lines, \"utf-8\");\n return events.length;\n } catch {\n return 0;\n }\n }\n\n async readReextractJobs(limit: number = 200): Promise<ReextractJobRequest[]> {\n const safeLimit = Number.isFinite(limit) ? Math.max(1, Math.min(1000, Math.floor(limit))) : 200;\n const filePath = path.join(this.stateDir, \"reextract-jobs.jsonl\");\n try {\n const raw = await readFile(filePath, \"utf-8\");\n const lines = raw.split(\"\\n\").filter((line) => line.trim().length > 0);\n const parsed: ReextractJobRequest[] = [];\n for (const line of lines) {\n try {\n const record = JSON.parse(line) as Partial<ReextractJobRequest>;\n if (\n typeof record.memoryId !== \"string\" ||\n record.memoryId.length === 0 ||\n typeof record.model !== \"string\" ||\n record.model.length === 0 ||\n typeof record.requestedAt !== \"string\" ||\n record.requestedAt.length === 0 ||\n record.source !== \"cli-migrate\"\n ) {\n continue;\n }\n parsed.push({\n memoryId: record.memoryId,\n model: record.model,\n requestedAt: record.requestedAt,\n source: \"cli-migrate\",\n });\n } catch {\n continue;\n }\n }\n return parsed.slice(-safeLimit);\n } catch {\n return [];\n }\n }\n\n async readBehaviorSignals(limit: number = 200): Promise<BehaviorSignalEvent[]> {\n const cappedLimit = Math.max(0, Math.floor(limit));\n if (cappedLimit === 0) return [];\n\n try {\n const raw = await readFile(this.behaviorSignalsPath, \"utf-8\");\n const out: BehaviorSignalEvent[] = [];\n const lines = raw.split(\"\\n\");\n for (let i = lines.length - 1; i >= 0 && out.length < cappedLimit; i -= 1) {\n const row = lines[i]?.trim();\n if (!row) continue;\n try {\n const parsed = JSON.parse(row) as Partial<BehaviorSignalEvent>;\n if (\n typeof parsed.timestamp === \"string\" &&\n typeof parsed.namespace === \"string\" &&\n typeof parsed.memoryId === \"string\" &&\n typeof parsed.category === \"string\" &&\n typeof parsed.signalType === \"string\" &&\n typeof parsed.direction === \"string\" &&\n typeof parsed.confidence === \"number\" &&\n typeof parsed.signalHash === \"string\" &&\n typeof parsed.source === \"string\"\n ) {\n out.push(parsed as BehaviorSignalEvent);\n }\n } catch {\n // Ignore malformed rows (fail-open).\n }\n }\n return out.reverse();\n } catch {\n return [];\n }\n }\n\n async readMemoryActionEvents(limit: number = 200): Promise<MemoryActionEvent[]> {\n const cappedLimit = Math.max(0, Math.floor(limit));\n if (cappedLimit === 0) return [];\n\n try {\n const raw = await readFile(this.memoryActionsPath, \"utf-8\");\n const out: MemoryActionEvent[] = [];\n const lines = raw.split(\"\\n\");\n for (let i = lines.length - 1; i >= 0 && out.length < cappedLimit; i -= 1) {\n const line = lines[i]?.trim();\n if (!line) continue;\n try {\n const parsed = JSON.parse(line) as Partial<MemoryActionEvent>;\n if (\n typeof parsed.timestamp === \"string\" &&\n typeof parsed.action === \"string\" &&\n typeof parsed.outcome === \"string\"\n ) {\n out.push(parsed as MemoryActionEvent);\n }\n } catch {\n // Ignore malformed rows (fail-open).\n }\n }\n return out.reverse();\n } catch {\n return [];\n }\n }\n\n async readAllMemoryLifecycleEvents(): Promise<MemoryLifecycleEvent[]> {\n try {\n const raw = await readFile(this.memoryLifecycleLedgerPath, \"utf-8\");\n const out: MemoryLifecycleEvent[] = [];\n const lines = raw.split(\"\\n\");\n for (const line of lines) {\n const row = line.trim();\n if (!row) continue;\n try {\n const parsed = JSON.parse(row) as Partial<MemoryLifecycleEvent>;\n if (\n typeof parsed.eventId === \"string\" &&\n typeof parsed.memoryId === \"string\" &&\n typeof parsed.eventType === \"string\" &&\n typeof parsed.timestamp === \"string\" &&\n typeof parsed.actor === \"string\" &&\n typeof parsed.ruleVersion === \"string\"\n ) {\n out.push(parsed as MemoryLifecycleEvent);\n }\n } catch {\n // Ignore malformed rows (fail-open).\n }\n }\n return sortMemoryLifecycleEvents(out);\n } catch {\n return [];\n }\n }\n\n async readMemoryLifecycleEvents(limit: number = 200): Promise<MemoryLifecycleEvent[]> {\n const cappedLimit = Math.max(0, Math.floor(limit));\n if (cappedLimit === 0) return [];\n const events = await this.readAllMemoryLifecycleEvents();\n return events.slice(-cappedLimit);\n }\n\n async writeCompressionGuidelines(content: string): Promise<void> {\n await this.ensureDirectories();\n await writeFile(this.compressionGuidelinesPath, content, \"utf-8\");\n }\n\n async readCompressionGuidelines(): Promise<string | null> {\n try {\n return await readFile(this.compressionGuidelinesPath, \"utf-8\");\n } catch {\n return null;\n }\n }\n\n async writeCompressionGuidelineDraft(content: string): Promise<void> {\n await this.ensureDirectories();\n await writeFile(this.compressionGuidelineDraftPath, content, \"utf-8\");\n }\n\n async readCompressionGuidelineDraft(): Promise<string | null> {\n try {\n return await readFile(this.compressionGuidelineDraftPath, \"utf-8\");\n } catch {\n return null;\n }\n }\n\n async writeCompressionGuidelineOptimizerState(\n state: CompressionGuidelineOptimizerState,\n ): Promise<void> {\n await this.ensureDirectories();\n await writeFile(this.compressionGuidelineStatePath, `${JSON.stringify(state, null, 2)}\\n`, \"utf-8\");\n }\n\n async writeCompressionGuidelineDraftState(\n state: CompressionGuidelineOptimizerState,\n ): Promise<void> {\n await this.ensureDirectories();\n await writeFile(this.compressionGuidelineDraftStatePath, `${JSON.stringify(state, null, 2)}\\n`, \"utf-8\");\n }\n\n async readCompressionGuidelineOptimizerState(): Promise<CompressionGuidelineOptimizerState | null> {\n return this.readCompressionGuidelineStateFile(this.compressionGuidelineStatePath);\n }\n\n async readCompressionGuidelineDraftState(): Promise<CompressionGuidelineOptimizerState | null> {\n return this.readCompressionGuidelineStateFile(this.compressionGuidelineDraftStatePath);\n }\n\n async activateCompressionGuidelineDraft(options?: {\n expectedContentHash?: string;\n expectedGuidelineVersion?: number;\n }): Promise<boolean> {\n const [draftContent, draftState] = await Promise.all([\n this.readCompressionGuidelineDraft(),\n this.readCompressionGuidelineDraftState(),\n ]);\n if (!draftContent || !draftState) return false;\n if (\n typeof options?.expectedContentHash === \"string\" &&\n options.expectedContentHash.length > 0 &&\n draftState.contentHash !== options.expectedContentHash\n ) {\n return false;\n }\n if (\n typeof options?.expectedGuidelineVersion === \"number\" &&\n Number.isFinite(options.expectedGuidelineVersion) &&\n draftState.guidelineVersion !== options.expectedGuidelineVersion\n ) {\n return false;\n }\n if (draftState.contentHash) {\n const contentHash = createHash(\"sha256\").update(draftContent).digest(\"hex\");\n if (contentHash !== draftState.contentHash) return false;\n }\n\n await this.writeCompressionGuidelines(draftContent);\n await this.writeCompressionGuidelineOptimizerState({\n ...draftState,\n activationState: \"active\",\n });\n await Promise.all([\n unlink(this.compressionGuidelineDraftPath).catch(() => undefined),\n unlink(this.compressionGuidelineDraftStatePath).catch(() => undefined),\n ]);\n return true;\n }\n\n private async readCompressionGuidelineStateFile(\n filePath: string,\n ): Promise<CompressionGuidelineOptimizerState | null> {\n const isFiniteNonNegativeInteger = (value: unknown): value is number =>\n typeof value === \"number\" && Number.isFinite(value) && Number.isInteger(value) && value >= 0;\n const isValidActionSummary = (\n value: unknown,\n ): value is NonNullable<CompressionGuidelineOptimizerState[\"actionSummaries\"]>[number] => {\n if (!value || typeof value !== \"object\") return false;\n const summary = value as NonNullable<CompressionGuidelineOptimizerState[\"actionSummaries\"]>[number];\n return (\n typeof summary.action === \"string\" &&\n isFiniteNonNegativeInteger(summary.total) &&\n summary.outcomes !== null &&\n typeof summary.outcomes === \"object\" &&\n isFiniteNonNegativeInteger(summary.outcomes.applied) &&\n isFiniteNonNegativeInteger(summary.outcomes.skipped) &&\n isFiniteNonNegativeInteger(summary.outcomes.failed) &&\n summary.quality !== null &&\n typeof summary.quality === \"object\" &&\n isFiniteNonNegativeInteger(summary.quality.good) &&\n isFiniteNonNegativeInteger(summary.quality.poor) &&\n isFiniteNonNegativeInteger(summary.quality.unknown)\n );\n };\n const isValidRuleUpdate = (\n value: unknown,\n ): value is NonNullable<CompressionGuidelineOptimizerState[\"ruleUpdates\"]>[number] => {\n if (!value || typeof value !== \"object\") return false;\n const rule = value as NonNullable<CompressionGuidelineOptimizerState[\"ruleUpdates\"]>[number];\n return (\n typeof rule.action === \"string\" &&\n typeof rule.delta === \"number\" &&\n Number.isFinite(rule.delta) &&\n (rule.direction === \"increase\" || rule.direction === \"decrease\" || rule.direction === \"hold\") &&\n (rule.confidence === \"low\" || rule.confidence === \"medium\" || rule.confidence === \"high\") &&\n Array.isArray(rule.notes) &&\n rule.notes.every((note) => typeof note === \"string\")\n );\n };\n\n try {\n const raw = await readFile(filePath, \"utf-8\");\n const parsed = JSON.parse(raw) as Partial<CompressionGuidelineOptimizerState>;\n const sourceWindow = parsed?.sourceWindow as Partial<CompressionGuidelineOptimizerState[\"sourceWindow\"]>;\n const eventCounts = parsed?.eventCounts as Partial<CompressionGuidelineOptimizerState[\"eventCounts\"]>;\n const activationState =\n parsed?.activationState === \"draft\" || parsed?.activationState === \"active\"\n ? parsed.activationState\n : undefined;\n const contentHash =\n typeof parsed?.contentHash === \"string\" && parsed.contentHash.length > 0\n ? parsed.contentHash\n : undefined;\n const actionSummaries = Array.isArray(parsed?.actionSummaries)\n ? parsed.actionSummaries.filter(isValidActionSummary)\n : undefined;\n const ruleUpdates = Array.isArray(parsed?.ruleUpdates)\n ? parsed.ruleUpdates.filter(isValidRuleUpdate)\n : undefined;\n if (\n !isFiniteNonNegativeInteger(parsed?.version) ||\n typeof parsed?.updatedAt !== \"string\" ||\n parsed.updatedAt.length === 0 ||\n !sourceWindow ||\n typeof sourceWindow.from !== \"string\" ||\n sourceWindow.from.length === 0 ||\n typeof sourceWindow.to !== \"string\" ||\n sourceWindow.to.length === 0 ||\n !eventCounts ||\n !isFiniteNonNegativeInteger(eventCounts.total) ||\n !isFiniteNonNegativeInteger(eventCounts.applied) ||\n !isFiniteNonNegativeInteger(eventCounts.skipped) ||\n !isFiniteNonNegativeInteger(eventCounts.failed) ||\n !isFiniteNonNegativeInteger(parsed?.guidelineVersion)\n ) {\n return null;\n }\n\n return {\n version: parsed.version,\n updatedAt: parsed.updatedAt,\n sourceWindow: {\n from: sourceWindow.from,\n to: sourceWindow.to,\n },\n eventCounts: {\n total: eventCounts.total,\n applied: eventCounts.applied,\n skipped: eventCounts.skipped,\n failed: eventCounts.failed,\n },\n guidelineVersion: parsed.guidelineVersion,\n ...(contentHash ? { contentHash } : {}),\n ...(activationState ? { activationState } : {}),\n ...(actionSummaries ? { actionSummaries } : {}),\n ...(ruleUpdates ? { ruleUpdates } : {}),\n };\n } catch {\n return null;\n }\n }\n\n async writeIdentityAnchor(content: string): Promise<void> {\n await this.ensureDirectories();\n await writeFile(this.identityAnchorPath, content, \"utf-8\");\n }\n\n async readIdentityAnchor(): Promise<string | null> {\n try {\n return await readFile(this.identityAnchorPath, \"utf-8\");\n } catch {\n return null;\n }\n }\n\n async appendContinuityIncident(input: ContinuityIncidentOpenInput): Promise<ContinuityIncidentRecord> {\n await this.ensureDirectories();\n const now = new Date();\n const nowIso = now.toISOString();\n const date = nowIso.slice(0, 10);\n const id = this.generateId(\"incident\");\n const incident = createContinuityIncidentRecord(id, input, nowIso);\n const filePath = path.join(this.identityIncidentsDir, `${date}-${id}.md`);\n await writeFile(filePath, serializeContinuityIncident(incident), \"utf-8\");\n return { ...incident, filePath };\n }\n\n async readContinuityIncidents(\n limit: number = 200,\n state: \"open\" | \"closed\" | \"all\" = \"all\",\n ): Promise<ContinuityIncidentRecord[]> {\n const normalizedLimit = Number.isFinite(limit) ? Math.floor(limit) : 0;\n const cappedLimit = Math.max(0, normalizedLimit);\n if (cappedLimit === 0) return [];\n\n try {\n const candidates = await this.readContinuityIncidentFileNames();\n const incidents: ContinuityIncidentRecord[] = [];\n\n for (const file of candidates) {\n if (incidents.length >= cappedLimit) break;\n const filePath = path.join(this.identityIncidentsDir, file);\n try {\n const raw = await readFile(filePath, \"utf-8\");\n const parsed = parseContinuityIncident(raw);\n if (!parsed) continue;\n if (state !== \"all\" && parsed.state !== state) continue;\n incidents.push({ ...parsed, filePath });\n } catch {\n // Fail-open on malformed/missing files.\n }\n }\n return incidents;\n } catch {\n return [];\n }\n }\n\n async closeContinuityIncident(\n id: string,\n closure: ContinuityIncidentCloseInput,\n ): Promise<ContinuityIncidentRecord | null> {\n const directFilePath = await this.findContinuityIncidentFilePathById(id);\n const target = directFilePath ? await this.readContinuityIncidentFile(directFilePath) : null;\n if (!target || !directFilePath) return null;\n if (target.state === \"closed\") return target;\n\n const closed = closeContinuityIncidentRecord(target, closure, new Date().toISOString());\n await writeFile(directFilePath, serializeContinuityIncident(closed), \"utf-8\");\n return { ...closed, filePath: directFilePath };\n }\n\n async writeIdentityAudit(period: \"weekly\" | \"monthly\", key: string, content: string): Promise<string> {\n await this.ensureDirectories();\n const safeKey = this.sanitizeIdentityAuditKey(key);\n const dir = period === \"weekly\" ? this.identityAuditsWeeklyDir : this.identityAuditsMonthlyDir;\n const filePath = path.join(dir, `${safeKey}.md`);\n await writeFile(filePath, content, \"utf-8\");\n return filePath;\n }\n\n async readIdentityAudit(period: \"weekly\" | \"monthly\", key: string): Promise<string | null> {\n try {\n const safeKey = this.sanitizeIdentityAuditKey(key);\n const dir = period === \"weekly\" ? this.identityAuditsWeeklyDir : this.identityAuditsMonthlyDir;\n return await readFile(path.join(dir, `${safeKey}.md`), \"utf-8\");\n } catch {\n return null;\n }\n }\n\n async writeIdentityImprovementLoops(content: string): Promise<void> {\n await this.ensureDirectories();\n await writeFile(this.identityImprovementLoopsPath, content, \"utf-8\");\n }\n\n async readIdentityImprovementLoops(): Promise<string | null> {\n try {\n return await readFile(this.identityImprovementLoopsPath, \"utf-8\");\n } catch {\n return null;\n }\n }\n\n async readIdentityImprovementLoopRegister(): Promise<ContinuityImprovementLoop[]> {\n const raw = await this.readIdentityImprovementLoops();\n if (!raw) return [];\n return parseContinuityImprovementLoops(raw);\n }\n\n async upsertIdentityImprovementLoop(input: ContinuityLoopUpsertInput): Promise<ContinuityImprovementLoop> {\n const nowIso = new Date().toISOString();\n const raw = await this.readIdentityImprovementLoops();\n const { markdown, loop } = upsertContinuityLoopInMarkdown(raw, input, nowIso);\n await this.writeIdentityImprovementLoops(markdown);\n return loop;\n }\n\n async reviewIdentityImprovementLoop(\n id: string,\n input: ContinuityLoopReviewInput,\n ): Promise<ContinuityImprovementLoop | null> {\n const raw = await this.readIdentityImprovementLoops();\n const { markdown, loop } = reviewContinuityLoopInMarkdown(raw, id, input, new Date().toISOString());\n if (!loop) return null;\n await this.writeIdentityImprovementLoops(markdown);\n return loop;\n }\n\n // ---------------------------------------------------------------------------\n // Question storage\n // ---------------------------------------------------------------------------\n\n private generateId(prefix: string = \"m\"): string {\n const ts = Date.now().toString(36);\n const rand = Math.random().toString(36).slice(2, 4);\n return `${prefix}-${ts}-${rand}`;\n }\n\n private async readContinuityIncidentFileNames(): Promise<string[]> {\n const files = await readdir(this.identityIncidentsDir);\n return files\n .filter((file) => file.endsWith(\".md\"))\n .sort()\n .reverse();\n }\n\n private async readContinuityIncidentFile(filePath: string): Promise<ContinuityIncidentRecord | null> {\n try {\n const raw = await readFile(filePath, \"utf-8\");\n const parsed = parseContinuityIncident(raw);\n return parsed ? { ...parsed, filePath } : null;\n } catch {\n return null;\n }\n }\n\n private async findContinuityIncidentFilePathById(id: string): Promise<string | null> {\n const fileNames = await this.readContinuityIncidentFileNames();\n const directMatch = fileNames.find((name) => name.endsWith(`-${id}.md`));\n if (directMatch) {\n const directPath = path.join(this.identityIncidentsDir, directMatch);\n const parsed = await this.readContinuityIncidentFile(directPath);\n if (parsed?.id === id) return directPath;\n }\n\n for (const fileName of fileNames) {\n const filePath = path.join(this.identityIncidentsDir, fileName);\n const parsed = await this.readContinuityIncidentFile(filePath);\n if (parsed?.id === id) return filePath;\n }\n return null;\n }\n\n private sanitizeIdentityAuditKey(key: string): string {\n const trimmed = key.trim();\n if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(trimmed) || trimmed.includes(\"..\")) {\n throw new Error(\"Invalid identity audit key\");\n }\n return trimmed;\n }\n\n async writeQuestion(\n question: string,\n context: string,\n priority: number,\n ): Promise<string> {\n await mkdir(this.questionsDir, { recursive: true });\n\n const id = this.generateId(\"q\");\n const frontmatter = {\n id,\n created: new Date().toISOString(),\n priority,\n resolved: false,\n };\n\n const content = `---\\n${Object.entries(frontmatter).map(([k, v]) => `${k}: ${JSON.stringify(v)}`).join(\"\\n\")}\\n---\\n\\n${question}\\n\\n**Context:** ${context}\\n`;\n\n const filePath = path.join(this.questionsDir, `${id}.md`);\n await writeFile(filePath, content, \"utf-8\");\n\n log.debug(`wrote question ${id} to ${filePath}`);\n this.invalidateQuestionsCache();\n return id;\n }\n\n async readQuestions(\n opts?: { unresolvedOnly?: boolean },\n ): Promise<\n Array<{\n id: string;\n question: string;\n context: string;\n priority: number;\n resolved: boolean;\n created: string;\n filePath: string;\n }>\n > {\n const cacheKey = this.questionsDir;\n const cached = StorageManager.questionsCache.get(cacheKey);\n if (cached && Date.now() - cached.loadedAt < StorageManager.QUESTIONS_CACHE_TTL_MS) {\n // Check dir mtime for cross-process invalidation — if another process\n // wrote/resolved a question, the directory mtime will be newer than loadedAt.\n try {\n const dirStat = await stat(this.questionsDir);\n if (dirStat.mtimeMs <= cached.loadedAt) {\n const all = cached.questions;\n return opts?.unresolvedOnly ? all.filter((q) => !q.resolved) : all;\n }\n } catch {\n // Dir doesn't exist — fall through to re-read\n }\n }\n\n try {\n const files = await readdir(this.questionsDir);\n const questions = [];\n for (const file of files) {\n if (!file.endsWith(\".md\")) continue;\n const filePath = path.join(this.questionsDir, file);\n const raw = await readFile(filePath, \"utf-8\");\n const parsed = this.parseQuestionFile(raw, filePath);\n if (parsed) {\n questions.push(parsed);\n }\n }\n const sorted = questions.sort((a, b) => b.priority - a.priority);\n StorageManager.questionsCache.set(cacheKey, { questions: sorted, loadedAt: Date.now() });\n return opts?.unresolvedOnly ? sorted.filter((q) => !q.resolved) : sorted;\n } catch {\n return [];\n }\n }\n\n /** Invalidate the questions cache (call after writing a question). */\n invalidateQuestionsCache(): void {\n StorageManager.questionsCache.delete(this.questionsDir);\n }\n\n private parseQuestionFile(\n raw: string,\n filePath: string,\n ): {\n id: string;\n question: string;\n context: string;\n priority: number;\n resolved: boolean;\n created: string;\n filePath: string;\n } | null {\n const match = raw.match(/^---\\n([\\s\\S]*?)\\n---\\n\\n([\\s\\S]*)$/);\n if (!match) return null;\n\n const frontmatterStr = match[1];\n const body = match[2].trim();\n\n // Parse frontmatter\n const id =\n this.extractFrontmatterValue(frontmatterStr, \"id\") ??\n path.basename(filePath, \".md\");\n const created =\n this.extractFrontmatterValue(frontmatterStr, \"created\") ?? \"\";\n const priority = parseFloat(\n this.extractFrontmatterValue(frontmatterStr, \"priority\") ?? \"0.5\",\n );\n const resolved =\n this.extractFrontmatterValue(frontmatterStr, \"resolved\") === \"true\";\n\n // Extract question and context from body\n const contextMatch = body.match(/\\*\\*Context:\\*\\*\\s*(.*)/);\n const question = contextMatch\n ? body.slice(0, contextMatch.index).trim()\n : body;\n const context = contextMatch ? contextMatch[1].trim() : \"\";\n\n return { id, question, context, priority, resolved, created, filePath };\n }\n\n private extractFrontmatterValue(\n frontmatter: string,\n key: string,\n ): string | null {\n const match = frontmatter.match(\n new RegExp(`^${key}:\\\\s*\"?([^\"\\\\n]*)\"?`, \"m\"),\n );\n return match ? match[1] : null;\n }\n\n async resolveQuestion(id: string): Promise<boolean> {\n const questions = await this.readQuestions();\n const q = questions.find((q) => q.id === id);\n if (!q) return false;\n\n let raw = await readFile(q.filePath, \"utf-8\");\n raw = raw.replace(/resolved: false/, \"resolved: true\");\n raw = raw.replace(\n /---\\n\\n/,\n `resolvedAt: \"${new Date().toISOString()}\"\\n---\\n\\n`,\n );\n await writeFile(q.filePath, raw, \"utf-8\");\n log.debug(`resolved question ${id}`);\n return true;\n }\n\n // ---------------------------------------------------------------------------\n // Identity file\n // ---------------------------------------------------------------------------\n\n async readIdentity(workspaceDir: string, namespace?: string): Promise<string> {\n const identityPath = this.identityFilePath(workspaceDir, namespace);\n try {\n return await readFile(identityPath, \"utf-8\");\n } catch {\n return \"\";\n }\n }\n\n async writeIdentity(workspaceDir: string, content: string, namespace?: string): Promise<void> {\n const identityPath = this.identityFilePath(workspaceDir, namespace);\n await writeFile(identityPath, content, \"utf-8\");\n log.debug(`wrote consolidated IDENTITY.md (${content.length} chars)`);\n }\n\n /** Max size for IDENTITY.md before we stop appending reflections (15KB leaves room under 20KB gateway limit) */\n private static readonly IDENTITY_MAX_BYTES = 15_000;\n /** Minimum interval between reflections (1 hour) */\n private static readonly REFLECTION_COOLDOWN_MS = 60 * 60 * 1000;\n\n async appendToIdentity(\n workspaceDir: string,\n reflection: string,\n opts?: { hygiene?: FileHygieneConfig; namespace?: string },\n ): Promise<void> {\n const identityPath = this.identityFilePath(workspaceDir, opts?.namespace);\n\n let existing = \"\";\n try {\n existing = await readFile(identityPath, \"utf-8\");\n } catch {\n // File doesn't exist yet\n }\n\n const hygiene = opts?.hygiene;\n const rotateEnabled =\n hygiene?.enabled === true &&\n hygiene.rotateEnabled === true &&\n Array.isArray(hygiene.rotatePaths) &&\n hygiene.rotatePaths.includes(path.basename(identityPath));\n\n // Rotation/splitting: preserve full history, keep the bootstrap file small.\n if (rotateEnabled) {\n const maxBytes = hygiene.rotateMaxBytes;\n if (existing.length > maxBytes) {\n const archiveDir = path.join(workspaceDir, hygiene.archiveDir);\n const { newContent } = await rotateMarkdownFileToArchive({\n filePath: identityPath,\n archiveDir,\n archivePrefix: \"IDENTITY\",\n keepTailChars: hygiene.rotateKeepTailChars,\n });\n await writeFile(identityPath, newContent, \"utf-8\");\n existing = newContent;\n log.info(\n `rotated IDENTITY.md to archive (size=${existing.length} chars, maxBytes=${maxBytes})`,\n );\n }\n } else {\n // Legacy behavior: skip if file is too large\n if (existing.length > StorageManager.IDENTITY_MAX_BYTES) {\n log.debug(`IDENTITY.md is ${existing.length} chars (limit ${StorageManager.IDENTITY_MAX_BYTES}); skipping reflection`);\n return;\n }\n }\n\n // Rate-limit: skip if last reflection was less than 1 hour ago\n const lastMatch = existing.match(/## Reflection — (\\S+)\\s*$/m);\n if (lastMatch) {\n // Find the LAST reflection timestamp\n const allMatches = [...existing.matchAll(/## Reflection — (\\S+)/g)];\n if (allMatches.length > 0) {\n const lastTimestamp = allMatches[allMatches.length - 1][1];\n const elapsed = Date.now() - new Date(lastTimestamp).getTime();\n if (elapsed < StorageManager.REFLECTION_COOLDOWN_MS) {\n log.debug(`reflection cooldown: ${Math.round(elapsed / 1000)}s since last (need ${StorageManager.REFLECTION_COOLDOWN_MS / 1000}s)`);\n return;\n }\n }\n }\n\n const timestamp = new Date().toISOString();\n const section = `\\n\\n## Reflection — ${timestamp}\\n\\n${reflection}\\n`;\n\n await writeFile(identityPath, existing + section, \"utf-8\");\n log.debug(`appended reflection to ${identityPath}`);\n }\n\n async readIdentityReflections(): Promise<string | null> {\n try {\n return await readFile(this.identityReflectionsPath, \"utf-8\");\n } catch {\n return null;\n }\n }\n\n async writeIdentityReflections(content: string): Promise<void> {\n await mkdir(this.identityDir, { recursive: true });\n await writeFile(this.identityReflectionsPath, content, \"utf-8\");\n }\n\n async appendIdentityReflection(reflection: string): Promise<void> {\n let existing = \"\";\n try {\n existing = await readFile(this.identityReflectionsPath, \"utf-8\");\n } catch {\n // File doesn't exist yet.\n }\n\n if (existing.length > StorageManager.IDENTITY_MAX_BYTES) {\n log.debug(\n `identity/reflections.md is ${existing.length} chars (limit ${StorageManager.IDENTITY_MAX_BYTES}); skipping reflection`,\n );\n return;\n }\n\n const allMatches = [...existing.matchAll(/## Reflection — (\\S+)/g)];\n if (allMatches.length > 0) {\n const lastTimestamp = allMatches[allMatches.length - 1][1];\n const elapsed = Date.now() - new Date(lastTimestamp).getTime();\n if (elapsed < StorageManager.REFLECTION_COOLDOWN_MS) {\n log.debug(\n `reflection cooldown: ${Math.round(elapsed / 1000)}s since last (need ${StorageManager.REFLECTION_COOLDOWN_MS / 1000}s)`,\n );\n return;\n }\n }\n\n const timestamp = new Date().toISOString();\n const section = `${existing.trimEnd().length > 0 ? \"\\n\\n\" : \"\"}## Reflection — ${timestamp}\\n\\n${reflection}\\n`;\n await mkdir(this.identityDir, { recursive: true });\n await writeFile(this.identityReflectionsPath, `${existing.trimEnd()}${section}`, \"utf-8\");\n log.debug(`appended namespace-local reflection to ${this.identityReflectionsPath}`);\n }\n\n // ---------------------------------------------------------------------------\n // Entity mutation helpers (Knowledge Graph v7.0)\n // ---------------------------------------------------------------------------\n\n /**\n * Add a relationship to an entity file.\n * Deduplicates by target+label.\n */\n async addEntityRelationship(name: string, rel: EntityRelationship): Promise<void> {\n const filePath = path.join(this.entitiesDir, `${name}.md`);\n let entity: EntityFile;\n try {\n const content = await readFile(filePath, \"utf-8\");\n entity = parseEntityFile(content);\n } catch {\n log.debug(`addEntityRelationship: entity file ${name}.md not found`);\n return;\n }\n\n // Dedupe by target+label\n const exists = entity.relationships.some(\n (r) => r.target === rel.target && r.label === rel.label,\n );\n if (exists) return;\n\n entity.relationships.push(rel);\n entity.updated = new Date().toISOString();\n await writeFile(filePath, serializeEntityFile(entity), \"utf-8\");\n this.invalidateKnowledgeIndexCache();\n }\n\n /**\n * Add an activity entry to an entity file.\n * Prepends to the beginning, prunes oldest entries beyond maxEntries.\n */\n async addEntityActivity(\n name: string,\n entry: EntityActivityEntry,\n maxEntries: number,\n ): Promise<void> {\n const filePath = path.join(this.entitiesDir, `${name}.md`);\n let entity: EntityFile;\n try {\n const content = await readFile(filePath, \"utf-8\");\n entity = parseEntityFile(content);\n } catch {\n log.debug(`addEntityActivity: entity file ${name}.md not found`);\n return;\n }\n\n entity.activity.unshift(entry);\n if (entity.activity.length > maxEntries) {\n entity.activity = entity.activity.slice(0, maxEntries);\n }\n entity.updated = new Date().toISOString();\n await writeFile(filePath, serializeEntityFile(entity), \"utf-8\");\n this.invalidateKnowledgeIndexCache();\n }\n\n /**\n * Add an alias to an entity file. Deduplicates.\n */\n async addEntityAlias(name: string, alias: string): Promise<void> {\n const filePath = path.join(this.entitiesDir, `${name}.md`);\n let entity: EntityFile;\n try {\n const content = await readFile(filePath, \"utf-8\");\n entity = parseEntityFile(content);\n } catch {\n log.debug(`addEntityAlias: entity file ${name}.md not found`);\n return;\n }\n\n if (entity.aliases.includes(alias)) return;\n entity.aliases.push(alias);\n entity.updated = new Date().toISOString();\n await writeFile(filePath, serializeEntityFile(entity), \"utf-8\");\n this.invalidateKnowledgeIndexCache();\n }\n\n /**\n * Set or update the summary of an entity file.\n */\n async updateEntitySummary(name: string, summary: string): Promise<void> {\n const filePath = path.join(this.entitiesDir, `${name}.md`);\n let entity: EntityFile;\n try {\n const content = await readFile(filePath, \"utf-8\");\n entity = parseEntityFile(content);\n } catch {\n log.debug(`updateEntitySummary: entity file ${name}.md not found`);\n return;\n }\n\n entity.summary = summary;\n entity.updated = new Date().toISOString();\n await writeFile(filePath, serializeEntityFile(entity), \"utf-8\");\n this.invalidateKnowledgeIndexCache();\n this.bumpMemoryStatusVersion(); // invalidate entity cache\n }\n\n // ---------------------------------------------------------------------------\n // Scoring + Knowledge Index (Knowledge Graph v7.0)\n // ---------------------------------------------------------------------------\n\n /**\n * Read all entity files and return lightweight EntityFile objects.\n * Parsing is fast (~50-100ms for ~1,800 files) since entity files are small.\n */\n async readAllEntityFiles(): Promise<EntityFile[]> {\n const currentVersion = this.getMemoryStatusVersion();\n const cached = getCachedEntities(this.baseDir, currentVersion);\n if (cached) return cached;\n\n try {\n const entries = await readdir(this.entitiesDir);\n const mdFiles = entries.filter((e) => e.endsWith(\".md\"));\n if (mdFiles.length === 0) return [];\n\n // Read all entity files in parallel batches to avoid O(N) sequential I/O.\n // With 3000+ entity files, sequential reads can take 15-20s under load.\n // Batching at 100 keeps file-descriptor pressure manageable while staying fast.\n const BATCH_SIZE = 100;\n const entities: EntityFile[] = [];\n for (let i = 0; i < mdFiles.length; i += BATCH_SIZE) {\n const batch = mdFiles.slice(i, i + BATCH_SIZE);\n const results = await Promise.all(\n batch.map((entry) =>\n readFile(path.join(this.entitiesDir, entry), \"utf-8\").catch(() => null),\n ),\n );\n for (const content of results) {\n if (content !== null) entities.push(parseEntityFile(content));\n }\n }\n\n setCachedEntities(this.baseDir, entities, currentVersion);\n return entities;\n } catch {\n // Directory doesn't exist yet\n return [];\n }\n }\n\n /**\n * Score an entity based on recency, frequency, activity, type priority,\n * and relationship density.\n *\n * score = recency*0.40 + frequency*0.25 + activity*0.15 + typePriority*0.10 + relationshipDensity*0.10\n */\n static scoreEntity(entity: EntityFile, now: Date): number {\n // Recency: 1 / (1 + daysSince/7) — 7-day half-life\n const updated = entity.updated ? new Date(entity.updated).getTime() : 0;\n const daysSince = Math.max(0, (now.getTime() - updated) / (1000 * 60 * 60 * 24));\n const recency = 1 / (1 + daysSince / 7);\n\n // Frequency: min(facts.length / 20, 1.0)\n const frequency = Math.min(entity.facts.length / 20, 1.0);\n\n // Activity: min(activity.length / 10, 1.0)\n const activityScore = Math.min(entity.activity.length / 10, 1.0);\n\n // Type priority\n const TYPE_PRIORITY: Record<string, number> = {\n person: 1.0,\n project: 0.8,\n company: 0.7,\n tool: 0.6,\n place: 0.5,\n other: 0.3,\n };\n const typePriority = TYPE_PRIORITY[entity.type.toLowerCase()] ?? 0.3;\n\n // Relationship density: min(relationships.length / 8, 1.0)\n const relDensity = Math.min(entity.relationships.length / 8, 1.0);\n\n return (\n recency * 0.40 +\n frequency * 0.25 +\n activityScore * 0.15 +\n typePriority * 0.10 +\n relDensity * 0.10\n );\n }\n\n /**\n * Build the Knowledge Index: a compact markdown table of top-scored entities.\n * Respects maxEntities and maxChars limits from config.\n */\n async buildKnowledgeIndex(\n config: PluginConfig,\n overrides?: { maxEntities?: number; maxChars?: number },\n ): Promise<{ result: string; cached: boolean }> {\n const useDefaultLimits =\n overrides?.maxEntities === undefined &&\n overrides?.maxChars === undefined;\n // Return cached index if still fresh\n if (\n useDefaultLimits &&\n this.knowledgeIndexCache &&\n Date.now() - this.knowledgeIndexCache.builtAt < StorageManager.KNOWLEDGE_INDEX_CACHE_TTL_MS\n ) {\n return { result: this.knowledgeIndexCache.result, cached: true };\n }\n\n const entities = await this.readAllEntityFiles();\n if (entities.length === 0) {\n if (useDefaultLimits) this.knowledgeIndexCache = { result: \"\", builtAt: Date.now() };\n return { result: \"\", cached: false };\n }\n\n const now = new Date();\n const scored: ScoredEntity[] = entities.map((e) => ({\n name: e.name,\n type: e.type,\n score: StorageManager.scoreEntity(e, now),\n factCount: e.facts.length,\n summary: e.summary,\n topRelationships: e.relationships.slice(0, 3).map((r) => r.target),\n }));\n\n // Sort by score descending, take top N\n scored.sort((a, b) => b.score - a.score);\n const maxEntities = typeof overrides?.maxEntities === \"number\"\n ? Math.max(0, Math.floor(overrides.maxEntities))\n : config.knowledgeIndexMaxEntities;\n const topN = scored.slice(0, maxEntities);\n\n if (topN.length === 0) {\n if (useDefaultLimits) this.knowledgeIndexCache = { result: \"\", builtAt: Date.now() };\n return { result: \"\", cached: false };\n }\n\n // Build markdown table\n const header = \"## Knowledge Index\\n\\n| Entity | Type | Summary | Connected to |\\n|--------|------|---------|-------------|\";\n const rows: string[] = [];\n let totalChars = header.length;\n const maxChars = typeof overrides?.maxChars === \"number\"\n ? Math.max(0, Math.floor(overrides.maxChars))\n : config.knowledgeIndexMaxChars;\n\n for (const entity of topN) {\n const summary = entity.summary || `${entity.factCount} facts`;\n const connected = entity.topRelationships.length > 0\n ? entity.topRelationships.join(\", \")\n : \"—\";\n const row = `| ${entity.name} | ${entity.type} | ${summary} | ${connected} |`;\n\n if (totalChars + row.length + 1 > maxChars) break;\n rows.push(row);\n totalChars += row.length + 1;\n }\n\n const result = rows.length === 0 ? \"\" : `${header}\\n${rows.join(\"\\n\")}\\n`;\n if (useDefaultLimits) this.knowledgeIndexCache = { result, builtAt: Date.now() };\n return { result, cached: false };\n }\n\n /** Invalidate the Knowledge Index cache (call after entity mutations). */\n invalidateKnowledgeIndexCache(): void {\n this.knowledgeIndexCache = null;\n }\n\n // ---------------------------------------------------------------------------\n // Commitment decay\n // ---------------------------------------------------------------------------\n\n /** Max lines for profile.md before LLM consolidation triggers */\n private static readonly PROFILE_MAX_LINES = 300;\n\n /**\n * Merge fragmented entity files that resolve to the same canonical name.\n * Preserves relationships, activity, aliases, and summary from all fragments.\n * Returns count of files merged.\n */\n async mergeFragmentedEntities(): Promise<number> {\n let merged = 0;\n try {\n const entries = await readdir(this.entitiesDir);\n const mdFiles = entries.filter((e) => e.endsWith(\".md\"));\n\n // Group files by their canonical name\n const groups = new Map<string, string[]>();\n for (const file of mdFiles) {\n const baseName = file.replace(\".md\", \"\");\n // Extract type and name from filename (type-rest-of-name)\n const dashIdx = baseName.indexOf(\"-\");\n if (dashIdx === -1) continue;\n const type = baseName.slice(0, dashIdx);\n const restOfName = baseName.slice(dashIdx + 1);\n const canonical = normalizeEntityName(restOfName, type);\n\n if (!groups.has(canonical)) groups.set(canonical, []);\n groups.get(canonical)!.push(file);\n }\n\n // Merge groups with more than one file\n for (const [canonical, files] of groups) {\n if (files.length <= 1) continue;\n\n // Parse all files and merge into a single EntityFile\n const mergedEntity: EntityFile = {\n name: \"\",\n type: \"other\",\n updated: \"\",\n facts: [],\n summary: undefined,\n relationships: [],\n activity: [],\n aliases: [],\n };\n\n for (const file of files) {\n const filePath = path.join(this.entitiesDir, file);\n try {\n const content = await readFile(filePath, \"utf-8\");\n const parsed = parseEntityFile(content);\n\n // Prefer specific types over \"other\"\n if (!mergedEntity.type || mergedEntity.type === \"other\") {\n mergedEntity.type = parsed.type;\n }\n\n // Keep latest update time\n if (!mergedEntity.updated || parsed.updated > mergedEntity.updated) {\n mergedEntity.updated = parsed.updated;\n }\n\n // Keep longest/best name\n if (parsed.name.length > mergedEntity.name.length) {\n mergedEntity.name = parsed.name;\n }\n\n // Keep first non-empty summary\n if (!mergedEntity.summary && parsed.summary) {\n mergedEntity.summary = parsed.summary;\n }\n\n // Collect all facts\n mergedEntity.facts.push(...parsed.facts);\n\n // Collect relationships (dedup later)\n mergedEntity.relationships.push(...parsed.relationships);\n\n // Collect activity entries\n mergedEntity.activity.push(...parsed.activity);\n\n // Collect aliases\n mergedEntity.aliases.push(...parsed.aliases);\n } catch {\n // Skip unreadable\n }\n }\n\n // Deduplicate facts\n mergedEntity.facts = [...new Set(mergedEntity.facts)];\n\n // Deduplicate relationships by target+label\n const relKeys = new Set<string>();\n mergedEntity.relationships = mergedEntity.relationships.filter((r) => {\n const key = `${r.target}::${r.label}`;\n if (relKeys.has(key)) return false;\n relKeys.add(key);\n return true;\n });\n\n // Sort activity by date descending, deduplicate by date+note\n const actKeys = new Set<string>();\n mergedEntity.activity = mergedEntity.activity\n .filter((a) => {\n const key = `${a.date}::${a.note}`;\n if (actKeys.has(key)) return false;\n actKeys.add(key);\n return true;\n })\n .sort((a, b) => b.date.localeCompare(a.date));\n\n // Deduplicate aliases\n mergedEntity.aliases = [...new Set(mergedEntity.aliases)];\n\n // Fallback name from canonical\n if (!mergedEntity.name) {\n const dashIdx = canonical.indexOf(\"-\");\n mergedEntity.name = dashIdx !== -1 ? canonical.slice(dashIdx + 1) : canonical;\n }\n\n mergedEntity.updated = mergedEntity.updated || new Date().toISOString();\n\n const canonicalPath = path.join(this.entitiesDir, `${canonical}.md`);\n await writeFile(canonicalPath, serializeEntityFile(mergedEntity), \"utf-8\");\n\n // Remove non-canonical files\n for (const file of files) {\n const filePath = path.join(this.entitiesDir, file);\n if (filePath !== canonicalPath) {\n try {\n await unlink(filePath);\n merged++;\n log.debug(`merged entity ${file} → ${canonical}.md`);\n } catch {\n // Ignore\n }\n }\n }\n }\n } catch {\n // Directory doesn't exist yet\n }\n\n return merged;\n }\n\n async cleanExpiredCommitments(decayDays: number): Promise<MemoryFile[]> {\n const memories = await this.readAllMemories();\n const cutoff = Date.now() - decayDays * 24 * 60 * 60 * 1000;\n const deleted: MemoryFile[] = [];\n\n for (const m of memories) {\n if (m.frontmatter.category !== \"commitment\") continue;\n // Only decay commitments that have been marked as resolved/expired\n // (indicated by tags containing \"fulfilled\" or \"expired\")\n const isResolved = m.frontmatter.tags.some(\n (t) => t === \"fulfilled\" || t === \"expired\",\n );\n if (!isResolved) continue;\n\n const updatedAt = new Date(m.frontmatter.updated).getTime();\n if (updatedAt < cutoff) {\n // Remove the file\n try {\n await unlink(m.path);\n deleted.push(m);\n log.debug(`cleaned expired commitment ${m.frontmatter.id}`);\n } catch {\n // Ignore\n }\n }\n }\n\n if (deleted.length > 0) {\n this.bumpMemoryStatusVersion();\n }\n\n return deleted;\n }\n\n // ---------------------------------------------------------------------------\n // Access Tracking (Phase 1A)\n // ---------------------------------------------------------------------------\n\n /**\n * Flush batched access tracking updates to disk.\n * Called during consolidation or when buffer exceeds max size.\n */\n async flushAccessTracking(entries: AccessTrackingEntry[]): Promise<number> {\n if (entries.length === 0) return 0;\n\n const memories = await this.readAllMemories();\n const memoryMap = new Map(memories.map((m) => [m.frontmatter.id, m]));\n let updated = 0;\n\n for (const entry of entries) {\n const memory = memoryMap.get(entry.memoryId);\n if (!memory) continue;\n\n const newFm: MemoryFrontmatter = {\n ...memory.frontmatter,\n accessCount: entry.newCount,\n lastAccessed: entry.lastAccessed,\n };\n\n const fileContent = `${serializeFrontmatter(newFm)}\\n\\n${memory.content}\\n`;\n try {\n await writeFile(memory.path, fileContent, \"utf-8\");\n updated++;\n } catch (err) {\n log.debug(`failed to update access tracking for ${entry.memoryId}: ${err}`);\n }\n }\n\n if (updated > 0) {\n log.debug(`flushed access tracking for ${updated} memories`);\n }\n return updated;\n }\n\n /**\n * Get a memory by its ID.\n */\n async getMemoryById(id: string): Promise<MemoryFile | null> {\n const memories = await this.readAllMemories();\n return memories.find((m) => m.frontmatter.id === id) ?? null;\n }\n\n async getProjectedMemoryState(id: string): Promise<MemoryProjectionCurrentState | null> {\n const projected = readProjectedMemoryState(this.baseDir, id);\n if (projected) return projected;\n\n const active = await this.getMemoryById(id);\n if (active) return this.toProjectedCurrentState(active, \"active\");\n\n const archived = (await this.readArchivedMemories()).find((memory) => memory.frontmatter.id === id);\n if (!archived) return null;\n\n return this.toProjectedCurrentState(archived, \"archived\");\n }\n\n async browseProjectedMemories(\n options: ProjectedMemoryBrowseOptions,\n ): Promise<ProjectedMemoryBrowsePage | null> {\n return readProjectedMemoryBrowse(this.baseDir, options);\n }\n\n async getProjectedGovernanceRecord(): Promise<ReturnType<typeof readProjectedGovernanceRecord>> {\n return readProjectedGovernanceRecord(this.baseDir);\n }\n\n private toProjectedCurrentState(\n memory: MemoryFile,\n fallbackStatus: MemoryStatus,\n ): MemoryProjectionCurrentState {\n const pathRel = toMemoryPathRel(this.baseDir, memory.path);\n return {\n memoryId: memory.frontmatter.id,\n category: memory.frontmatter.category,\n status: inferCurrentStateStatus(memory.frontmatter, pathRel, fallbackStatus),\n lifecycleState: memory.frontmatter.lifecycleState,\n path: memory.path,\n pathRel,\n created: memory.frontmatter.created,\n updated: memory.frontmatter.updated,\n archivedAt: memory.frontmatter.archivedAt,\n supersededAt: memory.frontmatter.supersededAt,\n entityRef: memory.frontmatter.entityRef,\n source: memory.frontmatter.source,\n confidence: memory.frontmatter.confidence,\n confidenceTier: memory.frontmatter.confidenceTier,\n memoryKind: memory.frontmatter.memoryKind,\n accessCount: memory.frontmatter.accessCount,\n lastAccessed: memory.frontmatter.lastAccessed,\n tags: normalizeProjectionTags(memory.frontmatter.tags),\n preview: normalizeProjectionPreview(memory.content),\n };\n }\n\n async getMemoryTimeline(memoryId: string, limit: number = 200): Promise<MemoryLifecycleEvent[]> {\n const cappedLimit = Math.max(0, Math.floor(limit));\n if (cappedLimit === 0) return [];\n\n const projected = readProjectedMemoryTimeline(this.baseDir, memoryId, cappedLimit);\n if (projected && projected.length > 0) return projected;\n\n const events = await this.readAllMemoryLifecycleEvents();\n return events.filter((event) => event.memoryId === memoryId).slice(-cappedLimit);\n }\n\n // ---------------------------------------------------------------------------\n // Chunking (Phase 2A)\n // ---------------------------------------------------------------------------\n\n /**\n * Write a memory chunk with parent reference.\n * Chunk IDs follow format: {parentId}-chunk-{index}\n */\n async writeChunk(\n parentId: string,\n chunkIndex: number,\n chunkTotal: number,\n category: MemoryCategory,\n content: string,\n options: {\n confidence?: number;\n tags?: string[];\n entityRef?: string;\n source?: string;\n importance?: ImportanceScore;\n intentGoal?: string;\n intentActionType?: string;\n intentEntityTypes?: string[];\n memoryKind?: MemoryFrontmatter[\"memoryKind\"];\n } = {},\n ): Promise<string> {\n await this.ensureDirectories();\n const now = new Date();\n const today = now.toISOString().slice(0, 10);\n const id = `${parentId}-chunk-${chunkIndex}`;\n const conf = options.confidence ?? 0.8;\n const tier = confidenceTier(conf);\n\n const fm: MemoryFrontmatter = {\n id,\n category,\n created: now.toISOString(),\n updated: now.toISOString(),\n source: options.source ?? \"chunking\",\n confidence: conf,\n confidenceTier: tier,\n tags: options.tags ?? [],\n entityRef: options.entityRef,\n importance: options.importance,\n parentId,\n chunkIndex,\n chunkTotal,\n intentGoal: options.intentGoal,\n intentActionType: options.intentActionType,\n intentEntityTypes: options.intentEntityTypes,\n memoryKind: options.memoryKind,\n };\n\n const sanitized = sanitizeMemoryContent(content);\n if (!sanitized.clean) {\n log.warn(`chunk content sanitized for ${id}; violations=${sanitized.violations.join(\", \")}`);\n }\n const fileContent = `${serializeFrontmatter(fm)}\\n\\n${sanitized.text}\\n`;\n\n let filePath: string;\n if (category === \"correction\") {\n filePath = path.join(this.correctionsDir, `${id}.md`);\n } else {\n filePath = path.join(this.factsDir, today, `${id}.md`);\n }\n\n await writeFile(filePath, fileContent, \"utf-8\");\n log.debug(`wrote chunk ${id} (${chunkIndex + 1}/${chunkTotal}) to ${filePath}`);\n return id;\n }\n\n /**\n * Get all chunks for a given parent memory ID.\n * Returns chunks sorted by chunkIndex.\n */\n async getChunksForParent(parentId: string): Promise<MemoryFile[]> {\n const memories = await this.readAllMemories();\n return memories\n .filter((m) => m.frontmatter.parentId === parentId)\n .sort((a, b) => (a.frontmatter.chunkIndex ?? 0) - (b.frontmatter.chunkIndex ?? 0));\n }\n\n // ---------------------------------------------------------------------------\n // Contradiction Detection (Phase 2B)\n // ---------------------------------------------------------------------------\n\n /**\n * Mark a memory as superseded by another.\n * Updates the old memory's status and adds the supersededBy link.\n */\n async supersedeMemory(\n oldMemoryId: string,\n newMemoryId: string,\n reason: string,\n ): Promise<boolean> {\n const memories = await this.readAllMemories();\n const oldMemory = memories.find((m) => m.frontmatter.id === oldMemoryId);\n if (!oldMemory) return false;\n\n const now = new Date().toISOString();\n const updatedFm: MemoryFrontmatter = {\n ...oldMemory.frontmatter,\n status: \"superseded\",\n supersededBy: newMemoryId,\n supersededAt: now,\n updated: now,\n };\n\n const fileContent = `${serializeFrontmatter(updatedFm)}\\n\\n${oldMemory.content}\\n`;\n\n try {\n await writeFile(oldMemory.path, fileContent, \"utf-8\");\n await this.appendGeneratedMemoryLifecycleEventFailOpen(\"storage.supersedeMemory\", {\n memoryId: oldMemoryId,\n eventType: \"superseded\",\n timestamp: now,\n actor: \"storage.supersedeMemory\",\n reasonCode: reason,\n before: this.summarizeLifecycleState(oldMemory.frontmatter, oldMemory.path),\n after: this.summarizeLifecycleState(updatedFm, oldMemory.path),\n relatedMemoryIds: [newMemoryId],\n });\n this.bumpMemoryStatusVersion();\n log.debug(`superseded memory ${oldMemoryId} by ${newMemoryId}: ${reason}`);\n\n // Also write a correction entry for the audit trail\n await this.writeMemory(\"correction\", `Superseded: ${oldMemory.content}\\n\\nReason: ${reason}`, {\n confidence: 1.0,\n tags: [\"supersession\", \"auto-resolved\"],\n source: \"contradiction-detection\",\n lineage: [oldMemoryId, newMemoryId],\n });\n\n return true;\n } catch (err) {\n log.error(`failed to supersede memory ${oldMemoryId}:`, err);\n return false;\n }\n }\n\n // ---------------------------------------------------------------------------\n // Memory Summarization (Phase 4A)\n // ---------------------------------------------------------------------------\n\n private get summariesDir(): string {\n return path.join(this.baseDir, \"summaries\");\n }\n\n /**\n * Write a memory summary.\n */\n async writeSummary(summary: MemorySummary): Promise<void> {\n await mkdir(this.summariesDir, { recursive: true });\n const filePath = path.join(this.summariesDir, `${summary.id}.json`);\n await writeFile(filePath, JSON.stringify(summary, null, 2), \"utf-8\");\n log.debug(`wrote summary ${summary.id}`);\n }\n\n /**\n * Get all summaries.\n */\n async readSummaries(): Promise<MemorySummary[]> {\n try {\n const files = await readdir(this.summariesDir);\n const summaries: MemorySummary[] = [];\n\n for (const file of files) {\n if (!file.endsWith(\".json\")) continue;\n const filePath = path.join(this.summariesDir, file);\n const raw = await readFile(filePath, \"utf-8\");\n summaries.push(JSON.parse(raw) as MemorySummary);\n }\n\n return summaries;\n } catch {\n return [];\n }\n }\n\n /**\n * Archive memories (mark as archived, not delete).\n */\n async archiveMemories(memoryIds: string[], summaryId: string): Promise<number> {\n const memories = await this.readAllMemories();\n const memoryMap = new Map(memories.map((m) => [m.frontmatter.id, m]));\n let archived = 0;\n\n for (const id of memoryIds) {\n const memory = memoryMap.get(id);\n if (!memory) continue;\n\n const now = new Date().toISOString();\n const updatedFm: MemoryFrontmatter = {\n ...memory.frontmatter,\n status: \"archived\",\n archivedAt: now,\n updated: now,\n };\n\n const fileContent = `${serializeFrontmatter(updatedFm)}\\n\\n${memory.content}\\n`;\n\n try {\n await writeFile(memory.path, fileContent, \"utf-8\");\n await this.appendGeneratedMemoryLifecycleEventFailOpen(\"storage.archiveMemories\", {\n memoryId: id,\n eventType: \"archived\",\n timestamp: updatedFm.archivedAt ?? updatedFm.updated,\n actor: \"storage.archiveMemories\",\n reasonCode: `summary:${summaryId}`,\n before: this.summarizeLifecycleState(memory.frontmatter, memory.path),\n after: this.summarizeLifecycleState(updatedFm, memory.path),\n relatedMemoryIds: [summaryId],\n });\n archived++;\n } catch {\n // Ignore individual failures\n }\n }\n\n if (archived > 0) {\n this.bumpMemoryStatusVersion();\n log.debug(`archived ${archived} memories for summary ${summaryId}`);\n }\n return archived;\n }\n\n // ---------------------------------------------------------------------------\n // Topic Extraction (Phase 4B)\n // ---------------------------------------------------------------------------\n\n /**\n * Save topic scores to meta.json.\n */\n async saveTopics(topics: TopicScore[]): Promise<void> {\n const metaPath = path.join(this.stateDir, \"topics.json\");\n await mkdir(this.stateDir, { recursive: true });\n await writeFile(metaPath, JSON.stringify({ topics, updatedAt: new Date().toISOString() }, null, 2), \"utf-8\");\n log.debug(`saved ${topics.length} topic scores`);\n }\n\n /**\n * Load topic scores from meta.json.\n */\n async loadTopics(): Promise<{ topics: TopicScore[]; updatedAt: string | null }> {\n const metaPath = path.join(this.stateDir, \"topics.json\");\n try {\n const raw = await readFile(metaPath, \"utf-8\");\n return JSON.parse(raw) as { topics: TopicScore[]; updatedAt: string | null };\n } catch {\n return { topics: [], updatedAt: null };\n }\n }\n\n /**\n * Add links to an existing memory.\n */\n async addLinksToMemory(\n memoryId: string,\n links: MemoryLink[],\n lifecycle?: MemoryLifecycleEventWriteOptions,\n ): Promise<boolean> {\n const memories = await this.readAllMemories();\n const memory = memories.find((m) => m.frontmatter.id === memoryId);\n if (!memory) return false;\n\n const existingLinks = memory.frontmatter.links ?? [];\n const mergedLinks = [...existingLinks];\n\n // Add new links, avoiding duplicates\n for (const link of links) {\n if (!mergedLinks.some((l) => l.targetId === link.targetId && l.linkType === link.linkType)) {\n mergedLinks.push(link);\n }\n }\n\n try {\n await this.writeMemoryFrontmatter(\n memory,\n {\n links: mergedLinks,\n updated: new Date().toISOString(),\n },\n lifecycle,\n );\n log.debug(`added ${links.length} links to memory ${memoryId}`);\n return true;\n } catch (err) {\n log.error(`failed to add links to memory ${memoryId}:`, err);\n return false;\n }\n }\n\n private summarizeLifecycleState(\n frontmatter: MemoryFrontmatter,\n filePath: string,\n ): MemoryLifecycleStateSummary {\n return {\n category: frontmatter.category,\n path: filePath,\n status: frontmatter.status ?? \"active\",\n lifecycleState: frontmatter.lifecycleState,\n };\n }\n\n private frontmatterPatchEventType(\n before: MemoryFrontmatter,\n after: MemoryFrontmatter,\n ): MemoryLifecycleEventType {\n const beforeStatus = before.status ?? \"active\";\n const afterStatus = after.status ?? \"active\";\n if (beforeStatus !== \"archived\" && afterStatus === \"archived\") return \"archived\";\n if (beforeStatus !== \"superseded\" && afterStatus === \"superseded\") return \"superseded\";\n if (beforeStatus !== \"rejected\" && afterStatus === \"rejected\") return \"rejected\";\n if (beforeStatus !== \"active\" && afterStatus === \"active\") {\n return \"restored\";\n }\n return \"updated\";\n }\n\n private async appendGeneratedMemoryLifecycleEvent(\n input: Omit<MemoryLifecycleEvent, \"eventId\" | \"ruleVersion\">,\n ruleVersion = \"memory-lifecycle-ledger.v1\",\n ): Promise<void> {\n await this.appendMemoryLifecycleEvents([\n {\n ...input,\n eventId: this.generateId(\"mle\"),\n ruleVersion,\n },\n ]);\n }\n\n private async appendGeneratedMemoryLifecycleEventFailOpen(\n operation: string,\n input: Omit<MemoryLifecycleEvent, \"eventId\" | \"ruleVersion\">,\n ruleVersion?: string,\n ): Promise<void> {\n try {\n await this.appendGeneratedMemoryLifecycleEvent(input, ruleVersion);\n } catch (appendErr) {\n log.warn(`${operation} completed but failed to append lifecycle event: ${appendErr}`);\n }\n }\n}\n"],"mappings":"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","names":["match","q"]}