@remnic/core 1.1.12 → 1.1.13
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.
- package/dist/access-cli.d.ts +2 -1
- package/dist/access-cli.js +263 -82
- package/dist/access-cli.js.map +1 -1
- package/dist/access-http.d.ts +26 -60
- package/dist/access-http.js +43 -29
- package/dist/access-mcp.d.ts +24 -6
- package/dist/access-mcp.js +35 -28
- package/dist/access-schema.d.ts +9 -6
- package/dist/access-schema.js +7 -5
- package/dist/access-service-DcCDmNYC.d.ts +1542 -0
- package/dist/access-service.d.ts +25 -7
- package/dist/access-service.js +33 -26
- package/dist/active-memory-bridge.js +2 -2
- package/dist/active-recall.js +11 -3
- package/dist/active-recall.js.map +1 -1
- package/dist/adapters/claude-code.d.ts +24 -0
- package/dist/adapters/claude-code.js +9 -0
- package/dist/adapters/codex.d.ts +25 -0
- package/dist/adapters/codex.js +9 -0
- package/dist/adapters/hermes.d.ts +35 -0
- package/dist/adapters/hermes.js +9 -0
- package/dist/adapters/index.d.ts +6 -0
- package/dist/adapters/index.js +26 -0
- package/dist/adapters/registry.d.ts +20 -0
- package/dist/adapters/registry.js +13 -0
- package/dist/adapters/replit.d.ts +28 -0
- package/dist/adapters/replit.js +9 -0
- package/dist/adapters/types.d.ts +43 -0
- package/dist/adapters/types.js +8 -0
- package/dist/bootstrap.d.ts +20 -5
- package/dist/boxes.d.ts +7 -0
- package/dist/boxes.js +1 -1
- package/dist/briefing.d.ts +5 -3
- package/dist/briefing.js +9 -6
- package/dist/buffer-surprise-report.js +1 -1
- package/dist/buffer.d.ts +18 -4
- package/dist/buffer.js +1 -1
- package/dist/calibration.js +4 -4
- package/dist/capsule-cli.d.ts +4 -4
- package/dist/capsule-cli.js +1 -1
- package/dist/capsule-crypto-5CYAGVC5.js +18 -0
- package/dist/capsule-merge-4MGKE7C5.js +189 -0
- package/dist/causal-behavior.d.ts +8 -28
- package/dist/causal-behavior.js +6 -3
- package/dist/causal-behavior.js.map +1 -1
- package/dist/causal-chain.js +3 -2
- package/dist/causal-consolidation.d.ts +1 -1
- package/dist/causal-consolidation.js +24 -13
- package/dist/causal-consolidation.js.map +1 -1
- package/dist/causal-retrieval.js +3 -3
- package/dist/causal-trajectory.js +1 -1
- package/dist/chunk-25MQ7IHJ.js +427 -0
- package/dist/chunk-25MQ7IHJ.js.map +1 -0
- package/dist/chunk-2F2W355T.js +256 -0
- package/dist/chunk-2F2W355T.js.map +1 -0
- package/dist/chunk-2KI4QFHU.js +228 -0
- package/dist/chunk-2KI4QFHU.js.map +1 -0
- package/dist/chunk-2PRQG7PV.js +86 -0
- package/dist/chunk-2PRQG7PV.js.map +1 -0
- package/dist/chunk-2QR3XXIC.js +2272 -0
- package/dist/chunk-2QR3XXIC.js.map +1 -0
- package/dist/chunk-2WWLHTZY.js +121 -0
- package/dist/chunk-326G7DJK.js +2185 -0
- package/dist/chunk-326G7DJK.js.map +1 -0
- package/dist/chunk-34DQE4KF.js +174 -0
- package/dist/chunk-34DQE4KF.js.map +1 -0
- package/dist/chunk-3APJ5EVB.js +601 -0
- package/dist/chunk-3APJ5EVB.js.map +1 -0
- package/dist/chunk-3HPAPHUK.js +51 -0
- package/dist/chunk-3HPAPHUK.js.map +1 -0
- package/dist/chunk-3JXBXXM2.js +69 -0
- package/dist/chunk-3JXBXXM2.js.map +1 -0
- package/dist/chunk-3KW65B36.js +681 -0
- package/dist/chunk-3KW65B36.js.map +1 -0
- package/dist/chunk-3UXOZBHV.js +20 -0
- package/dist/chunk-3UXOZBHV.js.map +1 -0
- package/dist/chunk-3VAL7ZL2.js +266 -0
- package/dist/chunk-3VAL7ZL2.js.map +1 -0
- package/dist/chunk-3Y4P7RXM.js +31 -0
- package/dist/chunk-3Y4P7RXM.js.map +1 -0
- package/dist/chunk-47VWKCAF.js +273 -0
- package/dist/chunk-47VWKCAF.js.map +1 -0
- package/dist/chunk-4CRG46BG.js +271 -0
- package/dist/chunk-5375UYTQ.js +914 -0
- package/dist/chunk-5375UYTQ.js.map +1 -0
- package/dist/chunk-56K5QLHX.js +506 -0
- package/dist/chunk-56K5QLHX.js.map +1 -0
- package/dist/chunk-5RGLBDQF.js +596 -0
- package/dist/chunk-5RGLBDQF.js.map +1 -0
- package/dist/chunk-5UZXUTVO.js +9 -0
- package/dist/chunk-5UZXUTVO.js.map +1 -0
- package/dist/chunk-65PG43EQ.js +105 -0
- package/dist/chunk-65PG43EQ.js.map +1 -0
- package/dist/chunk-66DHUKLO.js +57 -0
- package/dist/chunk-66DHUKLO.js.map +1 -0
- package/dist/chunk-6FC5EGNV.js +46 -0
- package/dist/chunk-6FC5EGNV.js.map +1 -0
- package/dist/chunk-6H2TESSP.js +62 -0
- package/dist/chunk-6H2TESSP.js.map +1 -0
- package/dist/chunk-6LVVDPJ4.js +32 -0
- package/dist/chunk-6LVVDPJ4.js.map +1 -0
- package/dist/chunk-6RVI47ZR.js +159 -0
- package/dist/chunk-6RVI47ZR.js.map +1 -0
- package/dist/chunk-7AAT6G4Q.js +5117 -0
- package/dist/chunk-7AAT6G4Q.js.map +1 -0
- package/dist/chunk-7DTASS5T.js +29 -0
- package/dist/chunk-7DTASS5T.js.map +1 -0
- package/dist/chunk-7IASACLB.js +596 -0
- package/dist/chunk-7MNMYOFP.js +32 -0
- package/dist/chunk-7MNMYOFP.js.map +1 -0
- package/dist/chunk-7N4KAIGN.js +133 -0
- package/dist/chunk-7N4KAIGN.js.map +1 -0
- package/dist/chunk-7OZ53EXP.js +101 -0
- package/dist/chunk-7OZ53EXP.js.map +1 -0
- package/dist/chunk-7XYTQGCC.js +134 -0
- package/dist/chunk-7XYTQGCC.js.map +1 -0
- package/dist/chunk-A2XUIMJ3.js +341 -0
- package/dist/chunk-A2XUIMJ3.js.map +1 -0
- package/dist/chunk-AGZQD76C.js +201 -0
- package/dist/chunk-AGZQD76C.js.map +1 -0
- package/dist/chunk-APO3DCMU.js +361 -0
- package/dist/chunk-APO3DCMU.js.map +1 -0
- package/dist/chunk-BFBF3XEF.js +283 -0
- package/dist/chunk-BFBF3XEF.js.map +1 -0
- package/dist/chunk-BJ3KMYTB.js +1974 -0
- package/dist/chunk-BJ3KMYTB.js.map +1 -0
- package/dist/chunk-CHEL3SKB.js +6758 -0
- package/dist/chunk-CHEL3SKB.js.map +1 -0
- package/dist/chunk-CQZRLNMV.js +1491 -0
- package/dist/chunk-CQZRLNMV.js.map +1 -0
- package/dist/chunk-D46YSIYX.js +892 -0
- package/dist/chunk-D46YSIYX.js.map +1 -0
- package/dist/chunk-DINWEURR.js +648 -0
- package/dist/chunk-DINWEURR.js.map +1 -0
- package/dist/chunk-DK5LDEQM.js +530 -0
- package/dist/chunk-DK5LDEQM.js.map +1 -0
- package/dist/chunk-DOM4GKSW.js +34 -0
- package/dist/chunk-DOM4GKSW.js.map +1 -0
- package/dist/chunk-EDTHC6UD.js +1075 -0
- package/dist/chunk-EFJ3MQ4V.js +721 -0
- package/dist/chunk-EHRTFRWW.js +89 -0
- package/dist/chunk-EHRTFRWW.js.map +1 -0
- package/dist/chunk-FAJ7FZYM.js +11 -0
- package/dist/chunk-FAJ7FZYM.js.map +1 -0
- package/dist/chunk-FBYESMQ2.js +570 -0
- package/dist/chunk-FDU6HUUL.js +147 -0
- package/dist/chunk-FF4KLI5W.js +99 -0
- package/dist/chunk-FF4KLI5W.js.map +1 -0
- package/dist/chunk-FIT6DMX6.js +310 -0
- package/dist/chunk-FIT6DMX6.js.map +1 -0
- package/dist/chunk-FJ43PRLT.js +272 -0
- package/dist/chunk-FJ43PRLT.js.map +1 -0
- package/dist/chunk-FKFMOY3N.js +32 -0
- package/dist/chunk-FKFMOY3N.js.map +1 -0
- package/dist/chunk-FLTNHQK6.js +262 -0
- package/dist/chunk-FLTNHQK6.js.map +1 -0
- package/dist/chunk-GA454ALV.js +12436 -0
- package/dist/chunk-GA454ALV.js.map +1 -0
- package/dist/chunk-GGKRUQOO.js +228 -0
- package/dist/chunk-GIF42EW3.js +63 -0
- package/dist/chunk-GIF42EW3.js.map +1 -0
- package/dist/chunk-GL6I6MEQ.js +647 -0
- package/dist/chunk-H3ME6L6D.js +709 -0
- package/dist/chunk-H3ME6L6D.js.map +1 -0
- package/dist/chunk-HHLLAQGZ.js +1 -0
- package/dist/chunk-HXXBL2KD.js +2040 -0
- package/dist/chunk-I5V2VDIW.js +219 -0
- package/dist/chunk-I5V2VDIW.js.map +1 -0
- package/dist/chunk-I6K5FBRQ.js +35 -0
- package/dist/chunk-I6K5FBRQ.js.map +1 -0
- package/dist/chunk-ICRIXAP2.js +121 -0
- package/dist/chunk-ICRIXAP2.js.map +1 -0
- package/dist/chunk-J4EB7DNW.js +11 -0
- package/dist/chunk-J4EB7DNW.js.map +1 -0
- package/dist/chunk-JLFA7DQG.js +62 -0
- package/dist/chunk-JLFA7DQG.js.map +1 -0
- package/dist/chunk-KJTKLXTH.js +9 -0
- package/dist/chunk-KJTKLXTH.js.map +1 -0
- package/dist/chunk-KLAO5DGL.js +917 -0
- package/dist/chunk-KLAO5DGL.js.map +1 -0
- package/dist/chunk-KNKUID7G.js +183 -0
- package/dist/chunk-KOSORCJG.js +624 -0
- package/dist/chunk-KOSORCJG.js.map +1 -0
- package/dist/chunk-KUJVMMZQ.js +1262 -0
- package/dist/chunk-KUJVMMZQ.js.map +1 -0
- package/dist/chunk-LCR46JY5.js +123 -0
- package/dist/chunk-LCR46JY5.js.map +1 -0
- package/dist/chunk-LLQ2LLWF.js +148 -0
- package/dist/chunk-LLQ2LLWF.js.map +1 -0
- package/dist/chunk-LPMVBPA3.js +236 -0
- package/dist/chunk-LT3NLYSI.js +50 -0
- package/dist/chunk-LT3NLYSI.js.map +1 -0
- package/dist/chunk-LUDTDZLK.js +287 -0
- package/dist/chunk-LUDTDZLK.js.map +1 -0
- package/dist/chunk-M23FSH32.js +3963 -0
- package/dist/chunk-M23FSH32.js.map +1 -0
- package/dist/chunk-MC26UJIM.js +118 -0
- package/dist/chunk-ME6ESPZU.js +119 -0
- package/dist/chunk-ME6ESPZU.js.map +1 -0
- package/dist/chunk-MGKYQQYF.js +272 -0
- package/dist/chunk-MJFNCJXV.js +66 -0
- package/dist/chunk-MJFNCJXV.js.map +1 -0
- package/dist/chunk-MSWG7JI6.js +237 -0
- package/dist/chunk-MSWG7JI6.js.map +1 -0
- package/dist/chunk-MT25YHYH.js +141 -0
- package/dist/chunk-MT25YHYH.js.map +1 -0
- package/dist/chunk-MT4HVDUZ.js +53 -0
- package/dist/chunk-MY6TPVXW.js +219 -0
- package/dist/chunk-N2D6GXBM.js +267 -0
- package/dist/chunk-N2D6GXBM.js.map +1 -0
- package/dist/chunk-NJ3MJQZX.js +46 -0
- package/dist/chunk-NJ3MJQZX.js.map +1 -0
- package/dist/chunk-NMZY542O.js +335 -0
- package/dist/chunk-NMZY542O.js.map +1 -0
- package/dist/chunk-NNVTUXEB.js +23 -0
- package/dist/chunk-NZL6GGQE.js +375 -0
- package/dist/chunk-NZL6GGQE.js.map +1 -0
- package/dist/chunk-P4NEIHUT.js +108 -0
- package/dist/chunk-P7FMDTKL.js +103 -0
- package/dist/chunk-P7FMDTKL.js.map +1 -0
- package/dist/chunk-PHK3HARR.js +32 -0
- package/dist/chunk-PHK3HARR.js.map +1 -0
- package/dist/chunk-PIRJPV5T.js +98 -0
- package/dist/chunk-PIRJPV5T.js.map +1 -0
- package/dist/chunk-PK7H5L6Y.js +159 -0
- package/dist/chunk-PK7H5L6Y.js.map +1 -0
- package/dist/chunk-PR5FBTFU.js +233 -0
- package/dist/chunk-PR5FBTFU.js.map +1 -0
- package/dist/chunk-PU63GXWS.js +174 -0
- package/dist/chunk-PU63GXWS.js.map +1 -0
- package/dist/chunk-PZIAX57I.js +124 -0
- package/dist/chunk-PZIAX57I.js.map +1 -0
- package/dist/chunk-Q7P4WJDP.js +26 -0
- package/dist/chunk-Q7P4WJDP.js.map +1 -0
- package/dist/chunk-QQUAB63I.js +63 -0
- package/dist/chunk-QQUAB63I.js.map +1 -0
- package/dist/chunk-QRNI5JBH.js +18 -0
- package/dist/chunk-RHY3HH7P.js +601 -0
- package/dist/chunk-RHY3HH7P.js.map +1 -0
- package/dist/chunk-RRF5UOBJ.js +91 -0
- package/dist/chunk-RXDLTSWT.js +124 -0
- package/dist/chunk-RXDLTSWT.js.map +1 -0
- package/dist/chunk-RYED3SPJ.js +42 -0
- package/dist/chunk-RYED3SPJ.js.map +1 -0
- package/dist/chunk-S7KDBTWT.js +106 -0
- package/dist/chunk-S7KDBTWT.js.map +1 -0
- package/dist/chunk-SEDEKFYQ.js +1 -0
- package/dist/chunk-TECVW3JP.js +36 -0
- package/dist/chunk-TECVW3JP.js.map +1 -0
- package/dist/chunk-TFO23QT4.js +88 -0
- package/dist/chunk-TFO23QT4.js.map +1 -0
- package/dist/chunk-TK4UEOSK.js +76 -0
- package/dist/chunk-TK4UEOSK.js.map +1 -0
- package/dist/chunk-TKWGAOLV.js +122 -0
- package/dist/chunk-TKWGAOLV.js.map +1 -0
- package/dist/chunk-TMM4S4IJ.js +597 -0
- package/dist/chunk-TMM4S4IJ.js.map +1 -0
- package/dist/chunk-TMQLARTH.js +188 -0
- package/dist/chunk-TMQLARTH.js.map +1 -0
- package/dist/chunk-TPDBFYEG.js +130 -0
- package/dist/chunk-TPDBFYEG.js.map +1 -0
- package/dist/chunk-TPMQ3G6Z.js +145 -0
- package/dist/chunk-TPMQ3G6Z.js.map +1 -0
- package/dist/chunk-TZOLIGIG.js +61 -0
- package/dist/chunk-TZOLIGIG.js.map +1 -0
- package/dist/chunk-U3PN77QT.js +113 -0
- package/dist/chunk-U3WSW6PZ.js +277 -0
- package/dist/chunk-U4SCL7B7.js +640 -0
- package/dist/chunk-U4SCL7B7.js.map +1 -0
- package/dist/chunk-UWK5OXUJ.js +156 -0
- package/dist/chunk-UWK5OXUJ.js.map +1 -0
- package/dist/chunk-UWVJF25J.js +74 -0
- package/dist/chunk-UXHQAFNA.js +1317 -0
- package/dist/chunk-UXHQAFNA.js.map +1 -0
- package/dist/chunk-V5OCT34X.js +1 -0
- package/dist/chunk-VLXA6PI2.js +304 -0
- package/dist/chunk-VLXA6PI2.js.map +1 -0
- package/dist/chunk-VNO6ZJ35.js +500 -0
- package/dist/chunk-VNO6ZJ35.js.map +1 -0
- package/dist/chunk-VW676BEI.js +827 -0
- package/dist/chunk-VW676BEI.js.map +1 -0
- package/dist/chunk-W3LR522O.js +2296 -0
- package/dist/chunk-W4L6CZKA.js +96 -0
- package/dist/chunk-W4L6CZKA.js.map +1 -0
- package/dist/chunk-W4RVMTHR.js +372 -0
- package/dist/chunk-W4RVMTHR.js.map +1 -0
- package/dist/chunk-WEHSQBFR.js +188 -0
- package/dist/chunk-WEHSQBFR.js.map +1 -0
- package/dist/chunk-WELDCG6C.js +380 -0
- package/dist/chunk-WELDCG6C.js.map +1 -0
- package/dist/chunk-WZYKANL3.js +2800 -0
- package/dist/chunk-WZYKANL3.js.map +1 -0
- package/dist/chunk-XIG5PDM7.js +48 -0
- package/dist/chunk-XJNBEDFE.js +193 -0
- package/dist/chunk-XJNBEDFE.js.map +1 -0
- package/dist/chunk-XVVIG67A.js +291 -0
- package/dist/chunk-XVVIG67A.js.map +1 -0
- package/dist/chunk-XVZ7B3HG.js +135 -0
- package/dist/chunk-YBPYIAA5.js +73 -0
- package/dist/chunk-YBPYIAA5.js.map +1 -0
- package/dist/chunk-Z734BLO3.js +21 -0
- package/dist/chunk-Z734BLO3.js.map +1 -0
- package/dist/chunk-ZKSK55RC.js +269 -0
- package/dist/chunk-ZKSK55RC.js.map +1 -0
- package/dist/chunk-ZTFCYYEZ.js +69 -0
- package/dist/chunk-ZTFCYYEZ.js.map +1 -0
- package/dist/chunk-ZY2MNJR6.js +329 -0
- package/dist/chunk-ZY2MNJR6.js.map +1 -0
- package/dist/cli-D3VpkVwB.d.ts +1136 -0
- package/dist/cli.d.ts +39 -10
- package/dist/cli.js +108 -49
- package/dist/commitment-ledger.js +1 -1
- package/dist/compat/checks.d.ts +5 -0
- package/dist/compat/checks.js +11 -0
- package/dist/compat/checks.js.map +1 -0
- package/dist/compat/types.d.ts +30 -0
- package/dist/compat/types.js +1 -0
- package/dist/compat/types.js.map +1 -0
- package/dist/compounding/engine.d.ts +221 -0
- package/dist/compounding/engine.js +32 -0
- package/dist/compounding/engine.js.map +1 -0
- package/dist/compounding/preference-consolidator.d.ts +92 -0
- package/dist/compounding/preference-consolidator.js +553 -0
- package/dist/compounding/preference-consolidator.js.map +1 -0
- package/dist/config.d.ts +4 -2
- package/dist/config.js +9 -4
- package/dist/conflict-policy-DyJ2wd-h.d.ts +4 -0
- package/dist/connectors/codex-materialize-runner.d.ts +64 -0
- package/dist/connectors/codex-materialize-runner.js +33 -0
- package/dist/connectors/codex-materialize-runner.js.map +1 -0
- package/dist/connectors/codex-materialize.d.ts +195 -0
- package/dist/connectors/codex-materialize.js +38 -0
- package/dist/connectors/codex-materialize.js.map +1 -0
- package/dist/connectors/index.d.ts +444 -0
- package/dist/connectors/index.js +115 -0
- package/dist/connectors/index.js.map +1 -0
- package/dist/connectors-cli-CwbyjGR7.d.ts +257 -0
- package/dist/connectors-cli.d.ts +1 -1
- package/dist/consolidation-provenance-check.d.ts +3 -1
- package/dist/consolidation-undo.d.ts +3 -1
- package/dist/contradiction/index.d.ts +258 -0
- package/dist/contradiction/index.js +43 -0
- package/dist/contradiction/index.js.map +1 -0
- package/dist/contradiction-review-ATP4S6IC.js +30 -0
- package/dist/contradiction-review-ATP4S6IC.js.map +1 -0
- package/dist/contradiction-scan-5A4IDZV5.js +13 -0
- package/dist/contradiction-scan-5A4IDZV5.js.map +1 -0
- package/dist/conversation-index/backend.d.ts +97 -0
- package/dist/conversation-index/backend.js +13 -0
- package/dist/conversation-index/backend.js.map +1 -0
- package/dist/conversation-index/chunker.d.ts +16 -0
- package/dist/conversation-index/chunker.js +8 -0
- package/dist/conversation-index/chunker.js.map +1 -0
- package/dist/conversation-index/cleanup.d.ts +11 -0
- package/dist/conversation-index/cleanup.js +9 -0
- package/dist/conversation-index/cleanup.js.map +1 -0
- package/dist/conversation-index/faiss-adapter.d.ts +6 -0
- package/dist/conversation-index/faiss-adapter.js +16 -0
- package/dist/conversation-index/faiss-adapter.js.map +1 -0
- package/dist/conversation-index/indexer.d.ts +23 -0
- package/dist/conversation-index/indexer.js +15 -0
- package/dist/conversation-index/indexer.js.map +1 -0
- package/dist/conversation-index/search.d.ts +6 -0
- package/dist/conversation-index/search.js +11 -0
- package/dist/conversation-index/search.js.map +1 -0
- package/dist/embedding-fallback.js +2 -2
- package/dist/enrichment/index.d.ts +163 -0
- package/dist/enrichment/index.js +18 -0
- package/dist/enrichment/index.js.map +1 -0
- package/dist/entity-retrieval.d.ts +4 -2
- package/dist/entity-retrieval.js +8 -5
- package/dist/evals.js +1 -1
- package/dist/explicit-capture.d.ts +20 -5
- package/dist/explicit-capture.js +2 -2
- package/dist/extraction-judge-training.js +1 -1
- package/dist/extraction.js +8 -8
- package/dist/faiss-adapter-CzPghc4C.d.ts +70 -0
- package/dist/fallback-llm.d.ts +2 -0
- package/dist/fallback-llm.js +4 -4
- package/dist/graph-edge-decay-5DI5GUNL.js +207 -0
- package/dist/index.d.ts +66 -711
- package/dist/index.js +556 -2680
- package/dist/index.js.map +1 -1
- package/dist/lcm/archive.d.ts +89 -0
- package/dist/lcm/archive.js +12 -0
- package/dist/lcm/archive.js.map +1 -0
- package/dist/lcm/dag.d.ts +48 -0
- package/dist/lcm/dag.js +8 -0
- package/dist/lcm/dag.js.map +1 -0
- package/dist/lcm/engine.d.ts +116 -0
- package/dist/lcm/engine.js +20 -0
- package/dist/lcm/engine.js.map +1 -0
- package/dist/lcm/index.d.ts +12 -0
- package/dist/lcm/index.js +44 -0
- package/dist/lcm/index.js.map +1 -0
- package/dist/lcm/queue.d.ts +62 -0
- package/dist/lcm/queue.js +8 -0
- package/dist/lcm/queue.js.map +1 -0
- package/dist/lcm/recall.d.ts +20 -0
- package/dist/lcm/recall.js +8 -0
- package/dist/lcm/recall.js.map +1 -0
- package/dist/lcm/schema.d.ts +16 -0
- package/dist/lcm/schema.js +14 -0
- package/dist/lcm/schema.js.map +1 -0
- package/dist/lcm/summarizer.d.ts +38 -0
- package/dist/lcm/summarizer.js +12 -0
- package/dist/lcm/summarizer.js.map +1 -0
- package/dist/lcm/tools.d.ts +29 -0
- package/dist/lcm/tools.js +8 -0
- package/dist/lcm/tools.js.map +1 -0
- package/dist/live-connectors-runner.js +5 -5
- package/dist/local-llm.js +3 -3
- package/dist/maintenance/archive-observations.d.ts +18 -0
- package/dist/maintenance/archive-observations.js +8 -0
- package/dist/maintenance/archive-observations.js.map +1 -0
- package/dist/maintenance/backup-stamp.d.ts +3 -0
- package/dist/maintenance/backup-stamp.js +8 -0
- package/dist/maintenance/backup-stamp.js.map +1 -0
- package/dist/maintenance/memory-governance-cron.d.ts +85 -0
- package/dist/maintenance/memory-governance-cron.js +22 -0
- package/dist/maintenance/memory-governance-cron.js.map +1 -0
- package/dist/maintenance/memory-governance.d.ts +137 -0
- package/dist/maintenance/memory-governance.js +40 -0
- package/dist/maintenance/memory-governance.js.map +1 -0
- package/dist/maintenance/migrate-observations.d.ts +18 -0
- package/dist/maintenance/migrate-observations.js +9 -0
- package/dist/maintenance/migrate-observations.js.map +1 -0
- package/dist/maintenance/observation-ledger-utils.d.ts +10 -0
- package/dist/maintenance/observation-ledger-utils.js +10 -0
- package/dist/maintenance/observation-ledger-utils.js.map +1 -0
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +15 -0
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +28 -0
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js.map +1 -0
- package/dist/maintenance/rebuild-memory-projection.d.ts +77 -0
- package/dist/maintenance/rebuild-memory-projection.js +35 -0
- package/dist/maintenance/rebuild-memory-projection.js.map +1 -0
- package/dist/maintenance/rebuild-observations.d.ts +17 -0
- package/dist/maintenance/rebuild-observations.js +9 -0
- package/dist/maintenance/rebuild-observations.js.map +1 -0
- package/dist/mcp-memory-inspector-app.d.ts +24 -6
- package/dist/memory-projection-store.d.ts +108 -3
- package/dist/memory-projection-store.js +2 -1
- package/dist/memory-worth-outcomes.d.ts +4 -2
- package/dist/migrate/from-engram.d.ts +24 -0
- package/dist/migrate/from-engram.js +12 -0
- package/dist/migrate/from-engram.js.map +1 -0
- package/dist/namespaces/migrate.d.ts +50 -0
- package/dist/namespaces/migrate.js +50 -0
- package/dist/namespaces/migrate.js.map +1 -0
- package/dist/namespaces/principal.d.ts +17 -0
- package/dist/namespaces/principal.js +16 -0
- package/dist/namespaces/principal.js.map +1 -0
- package/dist/namespaces/search.d.ts +46 -0
- package/dist/namespaces/search.js +28 -0
- package/dist/namespaces/search.js.map +1 -0
- package/dist/namespaces/storage.d.ts +32 -0
- package/dist/namespaces/storage.js +28 -0
- package/dist/namespaces/storage.js.map +1 -0
- package/dist/network/tailscale.d.ts +41 -0
- package/dist/network/tailscale.js +9 -0
- package/dist/network/tailscale.js.map +1 -0
- package/dist/network/webdav.d.ts +39 -0
- package/dist/network/webdav.js +10 -0
- package/dist/network/webdav.js.map +1 -0
- package/dist/objective-state-writers.js +2 -2
- package/dist/operator-toolkit.d.ts +4 -2
- package/dist/operator-toolkit.js +32 -14
- package/dist/opik-exporter.js +2 -2
- package/dist/opik-exporter.js.map +1 -1
- package/dist/orchestrator-DuWl9Hwx.d.ts +1244 -0
- package/dist/orchestrator.d.ts +22 -7
- package/dist/orchestrator.js +79 -44
- package/dist/path-MR5JPYOP.js +9 -0
- package/dist/path-MR5JPYOP.js.map +1 -0
- package/dist/qmd-recall-cache.d.ts +1 -1
- package/dist/qmd.d.ts +102 -3
- package/dist/qmd.js +23 -5
- package/dist/recall-explain-renderer.js +3 -3
- package/dist/recall-xray-cli.js +4 -4
- package/dist/recall-xray-renderer.js +3 -3
- package/dist/recall-xray.js +2 -2
- package/dist/replay/normalizers/chatgpt.d.ts +6 -0
- package/dist/replay/normalizers/chatgpt.js +11 -0
- package/dist/replay/normalizers/chatgpt.js.map +1 -0
- package/dist/replay/normalizers/claude.d.ts +6 -0
- package/dist/replay/normalizers/claude.js +11 -0
- package/dist/replay/normalizers/claude.js.map +1 -0
- package/dist/replay/normalizers/openclaw.d.ts +6 -0
- package/dist/replay/normalizers/openclaw.js +11 -0
- package/dist/replay/normalizers/openclaw.js.map +1 -0
- package/dist/replay/normalizers/shared.d.ts +16 -0
- package/dist/replay/normalizers/shared.js +14 -0
- package/dist/replay/normalizers/shared.js.map +1 -0
- package/dist/replay/runner.d.ts +35 -0
- package/dist/replay/runner.js +16 -0
- package/dist/replay/runner.js.map +1 -0
- package/dist/replay/types.d.ts +57 -0
- package/dist/replay/types.js +19 -0
- package/dist/replay/types.js.map +1 -0
- package/dist/resolution-B7FNQSSP.js +12 -0
- package/dist/resolution-B7FNQSSP.js.map +1 -0
- package/dist/resolve-provider-secret.js +2 -2
- package/dist/resume-bundles.js +8 -6
- package/dist/retrieval-agents.d.ts +1 -1
- package/dist/routing/engine.d.ts +35 -0
- package/dist/routing/engine.js +16 -0
- package/dist/routing/engine.js.map +1 -0
- package/dist/routing/store.d.ts +27 -0
- package/dist/routing/store.js +10 -0
- package/dist/routing/store.js.map +1 -0
- package/dist/runtime/better-sqlite.d.ts +8 -0
- package/dist/runtime/better-sqlite.js +10 -0
- package/dist/runtime/better-sqlite.js.map +1 -0
- package/dist/runtime/child-process.d.ts +32 -0
- package/dist/runtime/child-process.js +10 -0
- package/dist/runtime/child-process.js.map +1 -0
- package/dist/runtime/env.d.ts +5 -0
- package/dist/runtime/env.js +12 -0
- package/dist/runtime/env.js.map +1 -0
- package/dist/schemas.d.ts +22 -22
- package/dist/sdk-compat.js +1 -1
- package/dist/search/document-scanner.d.ts +22 -0
- package/dist/search/document-scanner.js +8 -0
- package/dist/search/document-scanner.js.map +1 -0
- package/dist/search/embed-helper.d.ts +35 -0
- package/dist/search/embed-helper.js +9 -0
- package/dist/search/embed-helper.js.map +1 -0
- package/dist/search/factory.d.ts +32 -0
- package/dist/search/factory.js +29 -0
- package/dist/search/factory.js.map +1 -0
- package/dist/search/index.d.ts +15 -0
- package/dist/search/index.js +50 -0
- package/dist/search/index.js.map +1 -0
- package/dist/search/lancedb-backend.d.ts +51 -0
- package/dist/search/lancedb-backend.js +10 -0
- package/dist/search/lancedb-backend.js.map +1 -0
- package/dist/search/meilisearch-backend.d.ts +48 -0
- package/dist/search/meilisearch-backend.js +10 -0
- package/dist/search/meilisearch-backend.js.map +1 -0
- package/dist/search/noop-backend.d.ts +26 -0
- package/dist/search/noop-backend.js +8 -0
- package/dist/search/noop-backend.js.map +1 -0
- package/dist/search/orama-backend.d.ts +53 -0
- package/dist/search/orama-backend.js +10 -0
- package/dist/search/orama-backend.js.map +1 -0
- package/dist/search/port.d.ts +61 -0
- package/dist/search/port.js +1 -0
- package/dist/search/port.js.map +1 -0
- package/dist/search/remote-backend.d.ts +39 -0
- package/dist/search/remote-backend.js +9 -0
- package/dist/search/remote-backend.js.map +1 -0
- package/dist/secure-store/index.d.ts +890 -0
- package/dist/secure-store/index.js +156 -0
- package/dist/secure-store/index.js.map +1 -0
- package/dist/semantic-VwGI14Ok.d.ts +69 -0
- package/dist/semantic-consolidation-4HkHWgeI.d.ts +180 -0
- package/dist/semantic-consolidation.d.ts +2 -2
- package/dist/semantic-consolidation.js +13 -6
- package/dist/semantic-rule-promotion.js +8 -5
- package/dist/semantic-rule-verifier.js +8 -5
- package/dist/shared-context/manager.d.ts +131 -0
- package/dist/shared-context/manager.js +15 -0
- package/dist/shared-context/manager.js.map +1 -0
- package/dist/skills-registry.js +13 -1
- package/dist/skills-registry.js.map +1 -1
- package/dist/state-store-VZU2IA53.js +16 -0
- package/dist/state-store-VZU2IA53.js.map +1 -0
- package/dist/storage-paths.d.ts +9 -0
- package/dist/storage-paths.js +20 -0
- package/dist/storage-paths.js.map +1 -0
- package/dist/storage.d.ts +3 -1
- package/dist/storage.js +7 -4
- package/dist/summarizer.d.ts +5 -0
- package/dist/summarizer.js +9 -8
- package/dist/summary-snapshot.js +2 -1
- package/dist/surfaces/dreams.d.ts +16 -0
- package/dist/surfaces/dreams.js +282 -0
- package/dist/surfaces/dreams.js.map +1 -0
- package/dist/surfaces/heartbeat.d.ts +17 -0
- package/dist/surfaces/heartbeat.js +265 -0
- package/dist/surfaces/heartbeat.js.map +1 -0
- package/dist/temporal-supersession.d.ts +3 -1
- package/dist/threading.d.ts +5 -0
- package/dist/threading.js +2 -1
- package/dist/tier-migration.d.ts +4 -2
- package/dist/tokens.js +2 -2
- package/dist/transcript.d.ts +15 -1
- package/dist/transcript.js +2 -1
- package/dist/transfer/autodetect.d.ts +4 -0
- package/dist/transfer/autodetect.js +15 -0
- package/dist/transfer/autodetect.js.map +1 -0
- package/dist/transfer/backup.d.ts +21 -0
- package/dist/transfer/backup.js +17 -0
- package/dist/transfer/backup.js.map +1 -0
- package/dist/transfer/capsule-export.d.ts +113 -0
- package/dist/transfer/capsule-export.js +19 -0
- package/dist/transfer/capsule-export.js.map +1 -0
- package/dist/transfer/capsule-import.d.ts +124 -0
- package/dist/transfer/capsule-import.js +16 -0
- package/dist/transfer/capsule-import.js.map +1 -0
- package/dist/transfer/constants.d.ts +13 -0
- package/dist/transfer/constants.js +12 -0
- package/dist/transfer/constants.js.map +1 -0
- package/dist/transfer/export-json.d.ts +11 -0
- package/dist/transfer/export-json.js +11 -0
- package/dist/transfer/export-json.js.map +1 -0
- package/dist/transfer/export-md.d.ts +10 -0
- package/dist/transfer/export-md.js +13 -0
- package/dist/transfer/export-md.js.map +1 -0
- package/dist/transfer/export-sqlite.d.ts +9 -0
- package/dist/transfer/export-sqlite.js +12 -0
- package/dist/transfer/export-sqlite.js.map +1 -0
- package/dist/transfer/fs-utils.d.ts +61 -0
- package/dist/transfer/fs-utils.js +40 -0
- package/dist/transfer/fs-utils.js.map +1 -0
- package/dist/transfer/import-json.d.ts +16 -0
- package/dist/transfer/import-json.js +13 -0
- package/dist/transfer/import-json.js.map +1 -0
- package/dist/transfer/import-md.d.ts +14 -0
- package/dist/transfer/import-md.js +11 -0
- package/dist/transfer/import-md.js.map +1 -0
- package/dist/transfer/import-sqlite.d.ts +14 -0
- package/dist/transfer/import-sqlite.js +12 -0
- package/dist/transfer/import-sqlite.js.map +1 -0
- package/dist/transfer/sqlite-schema.d.ts +4 -0
- package/dist/transfer/sqlite-schema.js +10 -0
- package/dist/transfer/sqlite-schema.js.map +1 -0
- package/dist/transfer/types.d.ts +916 -0
- package/dist/transfer/types.js +30 -0
- package/dist/transfer/types.js.map +1 -0
- package/dist/types.d.ts +28 -1
- package/dist/types.js +1 -1
- package/dist/verified-recall.js +9 -6
- package/dist/work/board.d.ts +43 -0
- package/dist/work/board.js +14 -0
- package/dist/work/board.js.map +1 -0
- package/dist/work/boundary.d.ts +8 -0
- package/dist/work/boundary.js +14 -0
- package/dist/work/boundary.js.map +1 -0
- package/dist/work/storage.d.ts +39 -0
- package/dist/work/storage.js +11 -0
- package/dist/work/storage.js.map +1 -0
- package/dist/work/types.d.ts +75 -0
- package/dist/work/types.js +1 -0
- package/dist/work/types.js.map +1 -0
- package/package.json +2767 -6
- package/scripts/faiss_index.py +816 -0
- package/scripts/faiss_requirements.txt +3 -0
- package/skills/remnic-entities/SKILL.md +51 -0
- package/skills/remnic-memory-workflow/SKILL.md +61 -0
- package/skills/remnic-recall/SKILL.md +51 -0
- package/skills/remnic-remember/SKILL.md +56 -0
- package/skills/remnic-search/SKILL.md +51 -0
- package/skills/remnic-status/SKILL.md +51 -0
- package/src/abort-error.test.ts +49 -0
- package/src/abort-error.ts +46 -0
- package/src/abstraction-nodes.ts +162 -0
- package/src/access-audit.test.ts +178 -0
- package/src/access-audit.ts +125 -0
- package/src/access-cli.test.ts +439 -0
- package/src/access-cli.ts +438 -0
- package/src/access-http.test.ts +225 -0
- package/src/access-http.ts +1899 -0
- package/src/access-idempotency.ts +232 -0
- package/src/access-mcp.test.ts +568 -0
- package/src/access-mcp.ts +3056 -0
- package/src/access-schema-pi.test.ts +60 -0
- package/src/access-schema.ts +522 -0
- package/src/access-service-namespace.test.ts +123 -0
- package/src/access-service.ts +5629 -0
- package/src/action-confidence.test.ts +206 -0
- package/src/action-confidence.ts +466 -0
- package/src/active-memory-bridge.test.ts +285 -0
- package/src/active-memory-bridge.ts +217 -0
- package/src/active-recall.test.ts +484 -0
- package/src/active-recall.ts +459 -0
- package/src/adapters/claude-code.ts +56 -0
- package/src/adapters/codex.ts +57 -0
- package/src/adapters/hermes.ts +64 -0
- package/src/adapters/index.ts +6 -0
- package/src/adapters/registry.ts +41 -0
- package/src/adapters/replit.ts +55 -0
- package/src/adapters/types.ts +51 -0
- package/src/behavior-learner.ts +144 -0
- package/src/behavior-signals.ts +73 -0
- package/src/binary-lifecycle/backend.ts +117 -0
- package/src/binary-lifecycle/index.ts +35 -0
- package/src/binary-lifecycle/manifest.ts +79 -0
- package/src/binary-lifecycle/pipeline.ts +352 -0
- package/src/binary-lifecycle/scanner.ts +89 -0
- package/src/binary-lifecycle/types.ts +89 -0
- package/src/bootstrap.ts +178 -0
- package/src/boxes.ts +521 -0
- package/src/briefing.test.ts +1535 -0
- package/src/briefing.ts +1382 -0
- package/src/buffer-session.test.ts +443 -0
- package/src/buffer-surprise-report.ts +176 -0
- package/src/buffer-surprise-telemetry.test.ts +606 -0
- package/src/buffer-surprise-trigger.test.ts +766 -0
- package/src/buffer-surprise.test.ts +339 -0
- package/src/buffer-surprise.ts +203 -0
- package/src/buffer.ts +900 -0
- package/src/bulk-import/cli-command.test.ts +204 -0
- package/src/bulk-import/index.ts +34 -0
- package/src/bulk-import/pipeline.test.ts +445 -0
- package/src/bulk-import/pipeline.ts +178 -0
- package/src/bulk-import/registry.test.ts +151 -0
- package/src/bulk-import/registry.ts +72 -0
- package/src/bulk-import/types.test.ts +272 -0
- package/src/bulk-import/types.ts +145 -0
- package/src/calibration.ts +394 -0
- package/src/capsule-cli.test.ts +398 -0
- package/src/capsule-cli.ts +565 -0
- package/src/causal-behavior.ts +308 -0
- package/src/causal-chain.ts +419 -0
- package/src/causal-consolidation.ts +370 -0
- package/src/causal-retrieval.ts +286 -0
- package/src/causal-trajectory-graph.ts +60 -0
- package/src/causal-trajectory.ts +303 -0
- package/src/chunking.ts +220 -0
- package/src/citations.ts +232 -0
- package/src/cli.ts +9403 -0
- package/src/codex-cli-fallback.ts +162 -0
- package/src/codex-thread-key.ts +1 -0
- package/src/coding/access-coding-context.test.ts +197 -0
- package/src/coding/coding-branch-scope.test.ts +281 -0
- package/src/coding/coding-namespace.test.ts +360 -0
- package/src/coding/coding-namespace.ts +412 -0
- package/src/coding/coding-orchestrator.test.ts +249 -0
- package/src/coding/git-context.test.ts +507 -0
- package/src/coding/git-context.ts +336 -0
- package/src/coding/mcp-set-coding-context.test.ts +174 -0
- package/src/coding/review-context.test.ts +316 -0
- package/src/coding/review-context.ts +349 -0
- package/src/coding/wire-coding-context.test.ts +468 -0
- package/src/commitment-ledger.test.ts +78 -0
- package/src/commitment-ledger.ts +337 -0
- package/src/compat/checks.test.ts +206 -0
- package/src/compat/checks.ts +716 -0
- package/src/compat/types.ts +33 -0
- package/src/compounding/engine.ts +1686 -0
- package/src/compounding/preference-consolidator.ts +778 -0
- package/src/compression-optimizer.ts +312 -0
- package/src/config.test.ts +930 -0
- package/src/config.ts +3807 -0
- package/src/connectors/codex/instructions.md +160 -0
- package/src/connectors/codex/resources/namespace-cheatsheet.md +48 -0
- package/src/connectors/codex-marketplace.ts +500 -0
- package/src/connectors/codex-materialize-runner.ts +212 -0
- package/src/connectors/codex-materialize.ts +983 -0
- package/src/connectors/coerce.ts +62 -0
- package/src/connectors/index.test.ts +1570 -0
- package/src/connectors/index.ts +3222 -0
- package/src/connectors/live/framework.ts +164 -0
- package/src/connectors/live/github.test.ts +1218 -0
- package/src/connectors/live/github.ts +1068 -0
- package/src/connectors/live/gmail.test.ts +1706 -0
- package/src/connectors/live/gmail.ts +1293 -0
- package/src/connectors/live/google-drive.test.ts +696 -0
- package/src/connectors/live/google-drive.ts +724 -0
- package/src/connectors/live/index.ts +101 -0
- package/src/connectors/live/live-connectors.test.ts +689 -0
- package/src/connectors/live/notion.test.ts +1109 -0
- package/src/connectors/live/notion.ts +978 -0
- package/src/connectors/live/registry.ts +103 -0
- package/src/connectors/live/state-store.ts +399 -0
- package/src/connectors/live/transient-errors.ts +150 -0
- package/src/connectors/weclone-installer.test.ts +850 -0
- package/src/connectors-cli.ts +513 -0
- package/src/console/state.test.ts +224 -0
- package/src/console/state.ts +514 -0
- package/src/console/trace.test.ts +813 -0
- package/src/console/trace.ts +603 -0
- package/src/console/tui.test.ts +582 -0
- package/src/console/tui.ts +508 -0
- package/src/consolidation-operator.ts +182 -0
- package/src/consolidation-provenance-check.ts +551 -0
- package/src/consolidation-undo.ts +718 -0
- package/src/contradiction/contradiction-judge.test.ts +189 -0
- package/src/contradiction/contradiction-judge.ts +333 -0
- package/src/contradiction/contradiction-review.ts +574 -0
- package/src/contradiction/contradiction-scan.ts +504 -0
- package/src/contradiction/contradiction.test.ts +2230 -0
- package/src/contradiction/index.ts +37 -0
- package/src/contradiction/resolution.ts +383 -0
- package/src/conversation-index/backend.ts +323 -0
- package/src/conversation-index/chunker.ts +47 -0
- package/src/conversation-index/cleanup.ts +53 -0
- package/src/conversation-index/faiss-adapter.ts +384 -0
- package/src/conversation-index/indexer.test.ts +164 -0
- package/src/conversation-index/indexer.ts +192 -0
- package/src/conversation-index/search.ts +37 -0
- package/src/cross-namespace-budget.test.ts +275 -0
- package/src/cross-namespace-budget.ts +365 -0
- package/src/cue-anchors.ts +163 -0
- package/src/curation/index.ts +544 -0
- package/src/dashboard-runtime.ts +337 -0
- package/src/day-summary.ts +122 -0
- package/src/dedup/index.ts +330 -0
- package/src/dedup/semantic.test.ts +1577 -0
- package/src/dedup/semantic.ts +148 -0
- package/src/delinearize.ts +193 -0
- package/src/direct-answer-wiring.test.ts +473 -0
- package/src/direct-answer-wiring.ts +180 -0
- package/src/direct-answer.test.ts +484 -0
- package/src/direct-answer.ts +273 -0
- package/src/embedding-fallback.ts +565 -0
- package/src/enrichment/audit.ts +89 -0
- package/src/enrichment/index.ts +27 -0
- package/src/enrichment/pipeline.ts +197 -0
- package/src/enrichment/provider-registry.ts +85 -0
- package/src/enrichment/types.ts +100 -0
- package/src/enrichment/web-search-provider.ts +63 -0
- package/src/entity-retrieval.ts +774 -0
- package/src/entity-schema.ts +239 -0
- package/src/evals.ts +1312 -0
- package/src/event-order-recall.test.ts +4164 -0
- package/src/event-order-recall.ts +2802 -0
- package/src/evidence-pack.test.ts +89 -0
- package/src/evidence-pack.ts +388 -0
- package/src/explicit-capture.ts +530 -0
- package/src/explicit-cue-recall.test.ts +3019 -0
- package/src/explicit-cue-recall.ts +5545 -0
- package/src/extraction-judge-telemetry.ts +234 -0
- package/src/extraction-judge-training.ts +221 -0
- package/src/extraction-judge.ts +846 -0
- package/src/extraction-timeout.test.ts +265 -0
- package/src/extraction.ts +2719 -0
- package/src/fallback-llm.test.ts +1060 -0
- package/src/fallback-llm.ts +918 -0
- package/src/focused-list-recall.test.ts +734 -0
- package/src/focused-list-recall.ts +1160 -0
- package/src/graph-dashboard-diff.ts +35 -0
- package/src/graph-dashboard-key.ts +5 -0
- package/src/graph-dashboard-parser.ts +104 -0
- package/src/graph-edge-reinforcement.ts +192 -0
- package/src/graph-events.ts +151 -0
- package/src/graph-recall.test.ts +164 -0
- package/src/graph-recall.ts +189 -0
- package/src/graph-retrieval.test.ts +809 -0
- package/src/graph-retrieval.ts +823 -0
- package/src/graph-snapshot.ts +329 -0
- package/src/graph.ts +813 -0
- package/src/harmonic-retrieval.ts +223 -0
- package/src/himem.ts +154 -0
- package/src/hygiene.ts +87 -0
- package/src/identity-continuity.ts +333 -0
- package/src/importance.ts +328 -0
- package/src/importers/base.test.ts +294 -0
- package/src/importers/base.ts +436 -0
- package/src/importers/index.ts +21 -0
- package/src/index.ts +1204 -0
- package/src/intent.ts +154 -0
- package/src/json-extract.ts +85 -0
- package/src/json-store.ts +42 -0
- package/src/lcm/archive.ts +617 -0
- package/src/lcm/dag.ts +199 -0
- package/src/lcm/engine.ts +645 -0
- package/src/lcm/index.ts +7 -0
- package/src/lcm/queue.test.ts +178 -0
- package/src/lcm/queue.ts +200 -0
- package/src/lcm/recall.ts +117 -0
- package/src/lcm/schema.ts +154 -0
- package/src/lcm/summarizer.ts +235 -0
- package/src/lcm/tools.ts +191 -0
- package/src/lcm-engine.test.ts +660 -0
- package/src/legacy-hook-compat.test.ts +20 -0
- package/src/legacy-hook-compat.ts +45 -0
- package/src/lifecycle.ts +289 -0
- package/src/live-connectors-runner.ts +385 -0
- package/src/local-llm-qos.test.ts +303 -0
- package/src/local-llm-thinking.test.ts +292 -0
- package/src/local-llm.ts +1464 -0
- package/src/logger.ts +49 -0
- package/src/maintenance/archive-observations.ts +147 -0
- package/src/maintenance/backup-stamp.ts +3 -0
- package/src/maintenance/dreams-ledger.ts +516 -0
- package/src/maintenance/first-start-migration.ts +362 -0
- package/src/maintenance/forget.test.ts +206 -0
- package/src/maintenance/forget.ts +126 -0
- package/src/maintenance/graph-edge-decay.test.ts +409 -0
- package/src/maintenance/graph-edge-decay.ts +394 -0
- package/src/maintenance/memory-governance-cron.ts +447 -0
- package/src/maintenance/memory-governance.ts +1039 -0
- package/src/maintenance/migrate-observations.ts +216 -0
- package/src/maintenance/observation-ledger-utils.ts +54 -0
- package/src/maintenance/pattern-reinforcement.test.ts +875 -0
- package/src/maintenance/pattern-reinforcement.ts +369 -0
- package/src/maintenance/purge.ts +334 -0
- package/src/maintenance/rebuild-memory-lifecycle-ledger.ts +78 -0
- package/src/maintenance/rebuild-memory-projection.ts +1234 -0
- package/src/maintenance/rebuild-observations.ts +178 -0
- package/src/maintenance/tier-stats.test.ts +378 -0
- package/src/maintenance/tier-stats.ts +222 -0
- package/src/mcp-memory-inspector-app.ts +421 -0
- package/src/memory-action-policy.ts +80 -0
- package/src/memory-cache.ts +208 -0
- package/src/memory-extension/claude-code-publisher.ts +51 -0
- package/src/memory-extension/codex-publisher.ts +149 -0
- package/src/memory-extension/hermes-publisher.ts +51 -0
- package/src/memory-extension/index.ts +100 -0
- package/src/memory-extension/shared-instructions.ts +133 -0
- package/src/memory-extension/types.ts +86 -0
- package/src/memory-extension-host/host-discovery.ts +276 -0
- package/src/memory-extension-host/index.ts +14 -0
- package/src/memory-extension-host/render-extensions-block.ts +73 -0
- package/src/memory-extension-host/types.ts +21 -0
- package/src/memory-lifecycle-ledger-utils.ts +116 -0
- package/src/memory-projection-format.ts +11 -0
- package/src/memory-projection-store.ts +951 -0
- package/src/memory-provenance.test.ts +196 -0
- package/src/memory-provenance.ts +484 -0
- package/src/memory-worth-bench.test.ts +71 -0
- package/src/memory-worth-bench.ts +265 -0
- package/src/memory-worth-filter.test.ts +209 -0
- package/src/memory-worth-filter.ts +204 -0
- package/src/memory-worth-frontmatter.test.ts +311 -0
- package/src/memory-worth-outcomes.test.ts +316 -0
- package/src/memory-worth-outcomes.ts +286 -0
- package/src/memory-worth.test.ts +317 -0
- package/src/memory-worth.ts +215 -0
- package/src/message-parts/index.ts +806 -0
- package/src/message-parts/message-parts.test.ts +421 -0
- package/src/migrate/from-engram.ts +789 -0
- package/src/model-registry.ts +313 -0
- package/src/models-json.ts +76 -0
- package/src/namespaces/migrate.ts +187 -0
- package/src/namespaces/path.ts +25 -0
- package/src/namespaces/principal.test.ts +195 -0
- package/src/namespaces/principal.ts +86 -0
- package/src/namespaces/search.test.ts +105 -0
- package/src/namespaces/search.ts +233 -0
- package/src/namespaces/storage.ts +74 -0
- package/src/native-knowledge.ts +1823 -0
- package/src/negative.ts +72 -0
- package/src/network/tailscale.ts +179 -0
- package/src/network/webdav.ts +385 -0
- package/src/objective-state-writers.ts +951 -0
- package/src/objective-state.ts +320 -0
- package/src/onboarding/index.ts +529 -0
- package/src/openai-chat-compat.ts +56 -0
- package/src/operator-toolkit.ts +2132 -0
- package/src/opik-exporter.test.ts +72 -0
- package/src/opik-exporter.ts +587 -0
- package/src/orchestrator-extraction-queue.test.ts +197 -0
- package/src/orchestrator-flush.test.ts +1171 -0
- package/src/orchestrator-pattern-reinforcement.test.ts +128 -0
- package/src/orchestrator-source-attribution.test.ts +701 -0
- package/src/orchestrator.ts +16368 -0
- package/src/page-versioning.ts +450 -0
- package/src/patterns-cli.ts +574 -0
- package/src/peers/index.ts +54 -0
- package/src/peers/migrate-from-identity-anchor.test.ts +291 -0
- package/src/peers/migrate-from-identity-anchor.ts +350 -0
- package/src/peers/peers.test.ts +419 -0
- package/src/peers/profile-reasoner.ts +694 -0
- package/src/peers/storage.ts +1350 -0
- package/src/peers/types.ts +138 -0
- package/src/plugin-id.ts +84 -0
- package/src/policy-runtime.ts +209 -0
- package/src/procedural/procedure-miner.ts +150 -0
- package/src/procedural/procedure-recall.ts +93 -0
- package/src/procedural/procedure-stats.ts +213 -0
- package/src/procedural/procedure-types.ts +132 -0
- package/src/procedural/reinforcement-core.test.ts +132 -0
- package/src/procedural/reinforcement-core.ts +73 -0
- package/src/profiling.test.ts +263 -0
- package/src/profiling.ts +435 -0
- package/src/projection/index.ts +398 -0
- package/src/qmd-recall-cache.test.ts +138 -0
- package/src/qmd-recall-cache.ts +111 -0
- package/src/qmd.test.ts +257 -0
- package/src/qmd.ts +2614 -0
- package/src/reasoning-trace-recall.ts +201 -0
- package/src/reasoning-trace-types.ts +235 -0
- package/src/recall-audit-anomaly.test.ts +246 -0
- package/src/recall-audit-anomaly.ts +297 -0
- package/src/recall-audit.test.ts +51 -0
- package/src/recall-audit.ts +72 -0
- package/src/recall-budget-config.test.ts +87 -0
- package/src/recall-disclosure-escalation.test.ts +196 -0
- package/src/recall-disclosure-escalation.ts +158 -0
- package/src/recall-disclosure-shaping.test.ts +146 -0
- package/src/recall-disclosure.test.ts +214 -0
- package/src/recall-explain-renderer.test.ts +140 -0
- package/src/recall-explain-renderer.ts +356 -0
- package/src/recall-mmr.test.ts +808 -0
- package/src/recall-mmr.ts +607 -0
- package/src/recall-qos.test.ts +85 -0
- package/src/recall-qos.ts +82 -0
- package/src/recall-query-policy.ts +221 -0
- package/src/recall-state.test.ts +233 -0
- package/src/recall-state.ts +456 -0
- package/src/recall-tag-filter.ts +143 -0
- package/src/recall-tokenization.ts +35 -0
- package/src/recall-xray-cli.test.ts +118 -0
- package/src/recall-xray-cli.ts +100 -0
- package/src/recall-xray-disclosure-telemetry.test.ts +183 -0
- package/src/recall-xray-renderer.test.ts +539 -0
- package/src/recall-xray-renderer.ts +487 -0
- package/src/recall-xray.test.ts +503 -0
- package/src/recall-xray.ts +621 -0
- package/src/reconstruct.ts +41 -0
- package/src/release-changelog.ts +35 -0
- package/src/relevance.ts +67 -0
- package/src/replay/normalizers/chatgpt.ts +133 -0
- package/src/replay/normalizers/claude.ts +102 -0
- package/src/replay/normalizers/openclaw.ts +119 -0
- package/src/replay/normalizers/shared.ts +69 -0
- package/src/replay/runner.ts +197 -0
- package/src/replay/types.ts +143 -0
- package/src/rerank.test.ts +48 -0
- package/src/rerank.ts +176 -0
- package/src/resolve-auth-token.test.ts +226 -0
- package/src/resolve-auth-token.ts +151 -0
- package/src/resolve-provider-secret.test.ts +187 -0
- package/src/resolve-provider-secret.ts +410 -0
- package/src/response-guidance-recall.test.ts +3952 -0
- package/src/response-guidance-recall.ts +4431 -0
- package/src/resume-bundles.ts +415 -0
- package/src/retrieval-agents.ts +623 -0
- package/src/retrieval-tiers.ts +25 -0
- package/src/retrieval.ts +104 -0
- package/src/review/index.test.ts +201 -0
- package/src/review/index.ts +536 -0
- package/src/routing/engine.ts +162 -0
- package/src/routing/store.ts +321 -0
- package/src/runtime/better-sqlite.test.ts +32 -0
- package/src/runtime/better-sqlite.ts +76 -0
- package/src/runtime/child-process.ts +67 -0
- package/src/runtime/env.ts +48 -0
- package/src/sanitize.ts +58 -0
- package/src/schemas.ts +449 -0
- package/src/sdk-compat.ts +87 -0
- package/src/search/document-scanner.ts +96 -0
- package/src/search/embed-helper.ts +142 -0
- package/src/search/factory.ts +189 -0
- package/src/search/index.ts +10 -0
- package/src/search/lancedb-backend.ts +342 -0
- package/src/search/meilisearch-backend.ts +232 -0
- package/src/search/noop-backend.ts +57 -0
- package/src/search/orama-backend.ts +358 -0
- package/src/search/port.ts +86 -0
- package/src/search/remote-backend.ts +124 -0
- package/src/secure-store/cipher.ts +271 -0
- package/src/secure-store/cli-handlers.ts +355 -0
- package/src/secure-store/cli-renderer.ts +131 -0
- package/src/secure-store/header.ts +373 -0
- package/src/secure-store/index.ts +137 -0
- package/src/secure-store/kdf.ts +263 -0
- package/src/secure-store/keyring.ts +106 -0
- package/src/secure-store/metadata.ts +394 -0
- package/src/secure-store/passphrase-reader.ts +252 -0
- package/src/secure-store/secure-fs.ts +571 -0
- package/src/secure-store/secure-store.test.ts +755 -0
- package/src/semantic-chunking.ts +545 -0
- package/src/semantic-consolidation.test.ts +182 -0
- package/src/semantic-consolidation.ts +432 -0
- package/src/semantic-rule-promotion.ts +183 -0
- package/src/semantic-rule-verifier.ts +160 -0
- package/src/session-integrity.ts +569 -0
- package/src/session-observer-bands.ts +11 -0
- package/src/session-observer-state.ts +346 -0
- package/src/session-toggles.test.ts +96 -0
- package/src/session-toggles.ts +159 -0
- package/src/shared-context/manager.ts +810 -0
- package/src/signal.ts +84 -0
- package/src/skills-registry.test.ts +277 -0
- package/src/skills-registry.ts +120 -0
- package/src/source-attribution-roundtrip.test.ts +215 -0
- package/src/source-attribution.test.ts +1425 -0
- package/src/source-attribution.ts +639 -0
- package/src/spaces/index.ts +627 -0
- package/src/storage-paths.ts +117 -0
- package/src/storage.ts +6657 -0
- package/src/store-contract.ts +55 -0
- package/src/summarizer.ts +844 -0
- package/src/summary-snapshot.test.ts +681 -0
- package/src/summary-snapshot.ts +238 -0
- package/src/surfaces/dreams.test.ts +394 -0
- package/src/surfaces/dreams.ts +346 -0
- package/src/surfaces/heartbeat.test.ts +415 -0
- package/src/surfaces/heartbeat.ts +325 -0
- package/src/sync/index.ts +308 -0
- package/src/targeted-fact-recall.test.ts +1694 -0
- package/src/targeted-fact-recall.ts +2905 -0
- package/src/taxonomy/default-taxonomy.ts +87 -0
- package/src/taxonomy/index.ts +26 -0
- package/src/taxonomy/resolver-doc-generator.ts +57 -0
- package/src/taxonomy/resolver.ts +184 -0
- package/src/taxonomy/taxonomy-loader.ts +186 -0
- package/src/taxonomy/types.ts +48 -0
- package/src/telemetry-transcript.ts +70 -0
- package/src/temporal-index.ts +890 -0
- package/src/temporal-supersession.test.ts +2703 -0
- package/src/temporal-supersession.ts +493 -0
- package/src/temporal-validity.test.ts +448 -0
- package/src/temporal-validity.ts +123 -0
- package/src/threading.ts +395 -0
- package/src/tier-migration.ts +124 -0
- package/src/tier-routing.ts +102 -0
- package/src/tmt.ts +462 -0
- package/src/tokens.test.ts +178 -0
- package/src/tokens.ts +279 -0
- package/src/topics.ts +147 -0
- package/src/training-export/cli-date-validation.test.ts +258 -0
- package/src/training-export/converter.test.ts +452 -0
- package/src/training-export/converter.ts +319 -0
- package/src/training-export/date-parse.ts +117 -0
- package/src/training-export/index.ts +26 -0
- package/src/training-export/registry.test.ts +85 -0
- package/src/training-export/registry.ts +57 -0
- package/src/training-export/types.ts +31 -0
- package/src/transcript.ts +1179 -0
- package/src/transfer/autodetect.ts +30 -0
- package/src/transfer/backup.ts +138 -0
- package/src/transfer/capsule-crypto.ts +485 -0
- package/src/transfer/capsule-encrypt.test.ts +690 -0
- package/src/transfer/capsule-export.ts +543 -0
- package/src/transfer/capsule-fork.ts +375 -0
- package/src/transfer/capsule-import.ts +564 -0
- package/src/transfer/capsule-merge.ts +433 -0
- package/src/transfer/conflict-policy.ts +16 -0
- package/src/transfer/constants.ts +13 -0
- package/src/transfer/exclusions.ts +37 -0
- package/src/transfer/export-json.ts +65 -0
- package/src/transfer/export-md.ts +59 -0
- package/src/transfer/export-sqlite.ts +52 -0
- package/src/transfer/fs-utils.ts +269 -0
- package/src/transfer/import-json.ts +108 -0
- package/src/transfer/import-md.ts +84 -0
- package/src/transfer/import-sqlite.ts +100 -0
- package/src/transfer/integrity.ts +71 -0
- package/src/transfer/sqlite-schema.ts +16 -0
- package/src/transfer/types.ts +297 -0
- package/src/trust-zones.ts +1186 -0
- package/src/types.ts +3074 -0
- package/src/user-model.test.ts +124 -0
- package/src/user-model.ts +162 -0
- package/src/utility-learner.ts +353 -0
- package/src/utility-runtime.ts +88 -0
- package/src/utility-telemetry.ts +215 -0
- package/src/utils/category-dir.ts +44 -0
- package/src/utils/errno.ts +6 -0
- package/src/utils/iso-timestamp.test.ts +37 -0
- package/src/utils/iso-timestamp.ts +164 -0
- package/src/utils/path.ts +26 -0
- package/src/verified-recall.ts +138 -0
- package/src/version-utils.test.ts +10 -0
- package/src/version-utils.ts +9 -0
- package/src/whitespace.ts +10 -0
- package/src/work/board.ts +359 -0
- package/src/work/boundary.ts +107 -0
- package/src/work/storage.ts +436 -0
- package/src/work/types.ts +82 -0
- package/src/work-product-ledger.ts +265 -0
- package/dist/access-service-DDjzFALq.d.ts +0 -2088
- package/dist/capsule-crypto-SJS5VVAP.js +0 -18
- package/dist/capsule-export-7QNCBZOQ.js +0 -17
- package/dist/capsule-import-EPBHD2EN.js +0 -16
- package/dist/capsule-merge-DI7PNQ2H.js +0 -189
- package/dist/chunk-23ZZK64Y.js +0 -26
- package/dist/chunk-23ZZK64Y.js.map +0 -1
- package/dist/chunk-242S3I2A.js +0 -647
- package/dist/chunk-2LGMW3DJ.js +0 -111
- package/dist/chunk-3B6KIRBH.js +0 -5213
- package/dist/chunk-3B6KIRBH.js.map +0 -1
- package/dist/chunk-457A4P3L.js +0 -119
- package/dist/chunk-457A4P3L.js.map +0 -1
- package/dist/chunk-4IS4SXIQ.js +0 -2040
- package/dist/chunk-4YM32CRU.js +0 -721
- package/dist/chunk-6TBWYBJ3.js +0 -236
- package/dist/chunk-74EMIVE4.js +0 -329
- package/dist/chunk-74EMIVE4.js.map +0 -1
- package/dist/chunk-767ODGE6.js +0 -183
- package/dist/chunk-7V22HTMD.js +0 -623
- package/dist/chunk-7V22HTMD.js.map +0 -1
- package/dist/chunk-7ZM3BFKK.js +0 -9705
- package/dist/chunk-7ZM3BFKK.js.map +0 -1
- package/dist/chunk-AQJNPMOA.js +0 -643
- package/dist/chunk-AQJNPMOA.js.map +0 -1
- package/dist/chunk-ASAITVLA.js +0 -64
- package/dist/chunk-ASAITVLA.js.map +0 -1
- package/dist/chunk-BBE34QBJ.js +0 -275
- package/dist/chunk-BBE34QBJ.js.map +0 -1
- package/dist/chunk-BZSQEPRW.js +0 -14710
- package/dist/chunk-BZSQEPRW.js.map +0 -1
- package/dist/chunk-CPKTBRS2.js +0 -891
- package/dist/chunk-CPKTBRS2.js.map +0 -1
- package/dist/chunk-D4GAOFF6.js +0 -562
- package/dist/chunk-D4GAOFF6.js.map +0 -1
- package/dist/chunk-D54LZC5L.js +0 -147
- package/dist/chunk-DF3RVK3X.js +0 -119
- package/dist/chunk-DF3RVK3X.js.map +0 -1
- package/dist/chunk-DZZPC36E.js +0 -1451
- package/dist/chunk-DZZPC36E.js.map +0 -1
- package/dist/chunk-E2UCDP5S.js +0 -570
- package/dist/chunk-E6K4NIEU.js +0 -747
- package/dist/chunk-E6K4NIEU.js.map +0 -1
- package/dist/chunk-EEQLFRUM.js +0 -89
- package/dist/chunk-ETOW6ACV.js +0 -158
- package/dist/chunk-ETOW6ACV.js.map +0 -1
- package/dist/chunk-FMEBPEAO.js +0 -347
- package/dist/chunk-FMEBPEAO.js.map +0 -1
- package/dist/chunk-FQDPCE3I.js +0 -1837
- package/dist/chunk-FQDPCE3I.js.map +0 -1
- package/dist/chunk-FYIYMQ5N.js +0 -221
- package/dist/chunk-FYIYMQ5N.js.map +0 -1
- package/dist/chunk-G2WADRQ3.js +0 -219
- package/dist/chunk-G4SK7DSQ.js +0 -121
- package/dist/chunk-GVPWB7EY.js +0 -390
- package/dist/chunk-GVPWB7EY.js.map +0 -1
- package/dist/chunk-HELQZFZO.js +0 -1075
- package/dist/chunk-HL5LRPNA.js +0 -1914
- package/dist/chunk-HL5LRPNA.js.map +0 -1
- package/dist/chunk-HQZVVSVB.js +0 -147
- package/dist/chunk-HQZVVSVB.js.map +0 -1
- package/dist/chunk-HY3L4WKC.js +0 -2195
- package/dist/chunk-HY3L4WKC.js.map +0 -1
- package/dist/chunk-IB3BFHGN.js +0 -228
- package/dist/chunk-IXEJRKCZ.js +0 -18
- package/dist/chunk-JBMSGZEQ.js +0 -441
- package/dist/chunk-JBMSGZEQ.js.map +0 -1
- package/dist/chunk-JESOB2HO.js +0 -108
- package/dist/chunk-JKDVIE52.js +0 -272
- package/dist/chunk-JRNQ3RNA.js +0 -284
- package/dist/chunk-JRNQ3RNA.js.map +0 -1
- package/dist/chunk-K6WK37A6.js +0 -865
- package/dist/chunk-K6WK37A6.js.map +0 -1
- package/dist/chunk-MARWOCVP.js +0 -48
- package/dist/chunk-MNU6ZBWT.js +0 -4454
- package/dist/chunk-MNU6ZBWT.js.map +0 -1
- package/dist/chunk-N5AKDXAI.js +0 -74
- package/dist/chunk-OA3L7BFR.js +0 -183
- package/dist/chunk-OA3L7BFR.js.map +0 -1
- package/dist/chunk-OR64ZGRZ.js +0 -23
- package/dist/chunk-P77UEOU2.js +0 -1521
- package/dist/chunk-P77UEOU2.js.map +0 -1
- package/dist/chunk-PH4C2U43.js +0 -239
- package/dist/chunk-PH4C2U43.js.map +0 -1
- package/dist/chunk-RVPLBATS.js +0 -1586
- package/dist/chunk-RVPLBATS.js.map +0 -1
- package/dist/chunk-U5JMRGKX.js +0 -340
- package/dist/chunk-U5JMRGKX.js.map +0 -1
- package/dist/chunk-URB2WSKZ.js +0 -350
- package/dist/chunk-URB2WSKZ.js.map +0 -1
- package/dist/chunk-UVMUAWVT.js +0 -596
- package/dist/chunk-WEJG4TB5.js +0 -118
- package/dist/chunk-X7HPGUVG.js +0 -271
- package/dist/chunk-XAMBKFQS.js +0 -2777
- package/dist/chunk-XAMBKFQS.js.map +0 -1
- package/dist/chunk-XJKFSSDW.js +0 -726
- package/dist/chunk-XJKFSSDW.js.map +0 -1
- package/dist/chunk-XMHBH5H6.js +0 -283
- package/dist/chunk-XMHBH5H6.js.map +0 -1
- package/dist/chunk-XMVFHBHT.js +0 -277
- package/dist/chunk-Y3VMVTYX.js +0 -53
- package/dist/chunk-YNB73F22.js +0 -137
- package/dist/chunk-YNB73F22.js.map +0 -1
- package/dist/chunk-Z2E7VW55.js +0 -335
- package/dist/chunk-Z2E7VW55.js.map +0 -1
- package/dist/chunk-ZG7PTKBK.js +0 -2296
- package/dist/chunk-ZNQN6ZTA.js +0 -135
- package/dist/chunk-ZVTKDVVM.js +0 -827
- package/dist/chunk-ZVTKDVVM.js.map +0 -1
- package/dist/cli-BR8KpIU0.d.ts +0 -1259
- package/dist/codex-materialize-CQlLTzke.d.ts +0 -139
- package/dist/connectors-cli-DFGtY2DB.d.ts +0 -257
- package/dist/contradiction-review-5LTTVDQV.js +0 -22
- package/dist/contradiction-scan-QTXAMBUA.js +0 -414
- package/dist/contradiction-scan-QTXAMBUA.js.map +0 -1
- package/dist/engine-35M5BKQ7.js +0 -28
- package/dist/fs-utils-IRVUFB6G.js +0 -30
- package/dist/graph-edge-decay-PWB63GRE.js +0 -207
- package/dist/memory-governance-IMPQZXFC.js +0 -37
- package/dist/memory-projection-store-CY8TU40w.d.ts +0 -222
- package/dist/orchestrator-DDMPqU6R.d.ts +0 -1792
- package/dist/path-RMTY5Y5A.js +0 -9
- package/dist/port-B6VEDIkC.d.ts +0 -53
- package/dist/resolution-YGIBORXI.js +0 -101
- package/dist/resolution-YGIBORXI.js.map +0 -1
- package/dist/secure-store-4R2GSO7S.js +0 -156
- package/dist/semantic-consolidation-ByBXb-sf.d.ts +0 -180
- package/dist/state-store-3EH7HYIN.js +0 -16
- package/dist/types-V3FJ26TF.js +0 -30
- /package/dist/{capsule-crypto-SJS5VVAP.js.map → adapters/claude-code.js.map} +0 -0
- /package/dist/{capsule-export-7QNCBZOQ.js.map → adapters/codex.js.map} +0 -0
- /package/dist/{capsule-import-EPBHD2EN.js.map → adapters/hermes.js.map} +0 -0
- /package/dist/{contradiction-review-5LTTVDQV.js.map → adapters/index.js.map} +0 -0
- /package/dist/{engine-35M5BKQ7.js.map → adapters/registry.js.map} +0 -0
- /package/dist/{fs-utils-IRVUFB6G.js.map → adapters/replit.js.map} +0 -0
- /package/dist/{memory-governance-IMPQZXFC.js.map → adapters/types.js.map} +0 -0
- /package/dist/{path-RMTY5Y5A.js.map → capsule-crypto-5CYAGVC5.js.map} +0 -0
- /package/dist/{capsule-merge-DI7PNQ2H.js.map → capsule-merge-4MGKE7C5.js.map} +0 -0
- /package/dist/{chunk-G4SK7DSQ.js.map → chunk-2WWLHTZY.js.map} +0 -0
- /package/dist/{chunk-X7HPGUVG.js.map → chunk-4CRG46BG.js.map} +0 -0
- /package/dist/{chunk-UVMUAWVT.js.map → chunk-7IASACLB.js.map} +0 -0
- /package/dist/{chunk-HELQZFZO.js.map → chunk-EDTHC6UD.js.map} +0 -0
- /package/dist/{chunk-4YM32CRU.js.map → chunk-EFJ3MQ4V.js.map} +0 -0
- /package/dist/{chunk-E2UCDP5S.js.map → chunk-FBYESMQ2.js.map} +0 -0
- /package/dist/{chunk-D54LZC5L.js.map → chunk-FDU6HUUL.js.map} +0 -0
- /package/dist/{chunk-IB3BFHGN.js.map → chunk-GGKRUQOO.js.map} +0 -0
- /package/dist/{chunk-242S3I2A.js.map → chunk-GL6I6MEQ.js.map} +0 -0
- /package/dist/{secure-store-4R2GSO7S.js.map → chunk-HHLLAQGZ.js.map} +0 -0
- /package/dist/{chunk-4IS4SXIQ.js.map → chunk-HXXBL2KD.js.map} +0 -0
- /package/dist/{chunk-767ODGE6.js.map → chunk-KNKUID7G.js.map} +0 -0
- /package/dist/{chunk-6TBWYBJ3.js.map → chunk-LPMVBPA3.js.map} +0 -0
- /package/dist/{chunk-WEJG4TB5.js.map → chunk-MC26UJIM.js.map} +0 -0
- /package/dist/{chunk-JKDVIE52.js.map → chunk-MGKYQQYF.js.map} +0 -0
- /package/dist/{chunk-Y3VMVTYX.js.map → chunk-MT4HVDUZ.js.map} +0 -0
- /package/dist/{chunk-G2WADRQ3.js.map → chunk-MY6TPVXW.js.map} +0 -0
- /package/dist/{chunk-OR64ZGRZ.js.map → chunk-NNVTUXEB.js.map} +0 -0
- /package/dist/{chunk-JESOB2HO.js.map → chunk-P4NEIHUT.js.map} +0 -0
- /package/dist/{chunk-IXEJRKCZ.js.map → chunk-QRNI5JBH.js.map} +0 -0
- /package/dist/{chunk-EEQLFRUM.js.map → chunk-RRF5UOBJ.js.map} +0 -0
- /package/dist/{state-store-3EH7HYIN.js.map → chunk-SEDEKFYQ.js.map} +0 -0
- /package/dist/{chunk-2LGMW3DJ.js.map → chunk-U3PN77QT.js.map} +0 -0
- /package/dist/{chunk-XMVFHBHT.js.map → chunk-U3WSW6PZ.js.map} +0 -0
- /package/dist/{chunk-N5AKDXAI.js.map → chunk-UWVJF25J.js.map} +0 -0
- /package/dist/{types-V3FJ26TF.js.map → chunk-V5OCT34X.js.map} +0 -0
- /package/dist/{chunk-ZG7PTKBK.js.map → chunk-W3LR522O.js.map} +0 -0
- /package/dist/{chunk-MARWOCVP.js.map → chunk-XIG5PDM7.js.map} +0 -0
- /package/dist/{chunk-ZNQN6ZTA.js.map → chunk-XVZ7B3HG.js.map} +0 -0
- /package/dist/{graph-edge-decay-PWB63GRE.js.map → graph-edge-decay-5DI5GUNL.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/storage.ts","../src/utils/iso-timestamp.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, invalidateCachedEntities, setCachedEntities } from \"./memory-cache.js\";\nimport { rotateMarkdownFileToArchive } from \"./hygiene.js\";\nimport { sanitizeMemoryContent } from \"./sanitize.js\";\nimport { createVersion as createPageVersion, type VersioningConfig, type VersionTrigger } from \"./page-versioning.js\";\nimport {\n SecureStoreLockedError,\n isEncryptedFile,\n readMaybeEncryptedFile,\n writeMaybeEncryptedFile,\n} from \"./secure-store/secure-fs.js\";\nimport {\n isConsolidationOperator,\n isValidDerivedFromEntry,\n type ConsolidationOperator,\n} from \"./consolidation-operator.js\";\nimport {\n matchEntitySchemaSection,\n normalizeEntityStructuredSection,\n sortStructuredSectionsBySchema,\n} from \"./entity-schema.js\";\nimport {\n hasCitation,\n hasCitationForTemplate,\n stripCitationForTemplate,\n DEFAULT_CITATION_FORMAT,\n} from \"./source-attribution.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 EntityStructuredSection,\n EntityTimelineEntry,\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 BufferSurpriseEvent,\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\";\nimport { parseFlexibleIsoTimestamp } from \"./utils/iso-timestamp.js\";\n// stripCitation import removed: legacy rebuild fallback was replaced by a\n// skip-with-warning strategy (Finding 1 — Uhol). See ensureFactHashIndexAuthoritative.\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\n/**\n * Validate a Memory Worth counter (`mw_success` / `mw_fail`) before we persist\n * it. Rejects non-finite, non-integer, and negative values rather than silently\n * clamping — a silent clamp would mask miscounts in the feedback pipeline\n * (issue #560 PR 3). Callers should pass only explicit user/pipeline values;\n * `undefined` is checked at the callsite and skipped entirely.\n */\nfunction assertMemoryWorthCounter(field: \"mw_success\" | \"mw_fail\", value: number): void {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new Error(`${field} must be a finite number, got ${String(value)}`);\n }\n if (!Number.isInteger(value)) {\n throw new Error(`${field} must be an integer, got ${value}`);\n }\n if (value < 0) {\n throw new Error(`${field} must be >= 0, got ${value}`);\n }\n}\n\nfunction normalizeMemoryWriteTimestamp(\n field: string,\n value: string | undefined,\n): string | undefined {\n if (value === undefined) return undefined;\n if (typeof value !== \"string\") {\n throw new Error(`${field} must be an ISO timestamp string, got ${String(value)}`);\n }\n const trimmed = value.trim();\n const parsed = parseFlexibleIsoTimestamp(trimmed);\n if (parsed === null) {\n throw new Error(`${field} must be a valid ISO timestamp, got ${JSON.stringify(value)}`);\n }\n return new Date(parsed).toISOString();\n}\n\nfunction isErrnoCode(error: unknown, code: string): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: unknown }).code === code\n );\n}\n\nfunction trimTrailingSpacesAndTabs(value: string): string {\n let end = value.length;\n while (end > 0 && (value[end - 1] === \" \" || value[end - 1] === \"\\t\")) {\n end -= 1;\n }\n return end === value.length ? value : value.slice(0, end);\n}\n\nfunction trimLeadingSpacesAndTabs(value: string): string {\n let start = 0;\n while (start < value.length && (value[start] === \" \" || value[start] === \"\\t\")) {\n start += 1;\n }\n return start === 0 ? value : value.slice(start);\n}\n\nfunction stripDefaultCitationMarkersWithoutRegex(value: string): string {\n return stripCitationMarkersForHashRemoval(value, DEFAULT_CITATION_FORMAT);\n}\n\nfunction citationTemplateLiteralParts(template: string): string[] {\n const parts: string[] = [];\n let cursor = 0;\n while (cursor < template.length) {\n const open = template.indexOf(\"{\", cursor);\n if (open === -1) {\n parts.push(template.slice(cursor));\n break;\n }\n parts.push(template.slice(cursor, open));\n const close = template.indexOf(\"}\", open + 1);\n if (close === -1) {\n cursor = open + 1;\n } else {\n cursor = close + 1;\n }\n }\n return parts.filter((part) => part.length > 0);\n}\n\nfunction stripCitationMarkersForHashRemoval(value: string, template: string): string {\n const parts = citationTemplateLiteralParts(template);\n if (parts.length === 0) return value;\n const first = parts[0]!;\n const lowerValue = value.toLowerCase();\n const lowerFirst = first.toLowerCase();\n const lowerParts = parts.map((part) => part.toLowerCase());\n if (!lowerValue.includes(lowerFirst)) return value;\n\n let result = \"\";\n let cursor = 0;\n let removed = false;\n while (cursor < value.length) {\n const markerStart = lowerValue.indexOf(lowerFirst, cursor);\n if (markerStart === -1) {\n result += value.slice(cursor);\n break;\n }\n const boundedEnd = first.startsWith(\"[\") ? value.indexOf(\"]\", markerStart + first.length) : -1;\n if (first.startsWith(\"[\") && boundedEnd === -1) {\n result += value.slice(cursor);\n break;\n }\n const searchLimit = boundedEnd === -1 ? value.length : boundedEnd + 1;\n let markerEnd = markerStart + first.length;\n let matched = true;\n for (let i = 1; i < lowerParts.length; i += 1) {\n const partIndex = lowerValue.indexOf(lowerParts[i]!, markerEnd);\n if (partIndex === -1 || partIndex + parts[i]!.length > searchLimit) {\n matched = false;\n break;\n }\n markerEnd = partIndex + parts[i]!.length;\n }\n if (!matched) {\n result += value.slice(cursor);\n break;\n }\n result += trimTrailingSpacesAndTabs(value.slice(cursor, markerStart));\n cursor = markerEnd;\n removed = true;\n }\n\n return removed ? trimLeadingSpacesAndTabs(result) : value;\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 // Issue #680 — explicit fact lifecycle. Emit only when present so legacy\n // memories round-trip unchanged; readers default `valid_at` to `created`.\n if (fm.valid_at) lines.push(`validAt: ${fm.valid_at}`);\n if (fm.invalid_at) lines.push(`invalidAt: ${fm.invalid_at}`);\n if (fm.forgottenAt) lines.push(`forgottenAt: ${fm.forgottenAt}`);\n if (fm.forgottenReason) lines.push(`forgottenReason: ${JSON.stringify(fm.forgottenReason)}`);\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 // Memory Worth counters (issue #560). Emit verbatim when present — including\n // explicit zeros — so consumers can distinguish \"never observed\" (absent)\n // from \"observed with zero successes\" (present, value 0). Validation below\n // rejects negatives and non-integers so we never persist a corrupt counter.\n if (fm.mw_success !== undefined) {\n assertMemoryWorthCounter(\"mw_success\", fm.mw_success);\n lines.push(`mw_success: ${fm.mw_success}`);\n }\n if (fm.mw_fail !== undefined) {\n assertMemoryWorthCounter(\"mw_fail\", fm.mw_fail);\n lines.push(`mw_fail: ${fm.mw_fail}`);\n }\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 // Raw-content dedup hash — format-agnostic archive/consolidation cleanup\n if (fm.contentHash) lines.push(`contentHash: ${fm.contentHash}`);\n // Consolidation provenance (issue #561). Validate on write so malformed\n // entries cannot leak into the on-disk format. Read-through parsing is\n // permissive; only writes go through the validator.\n if (fm.derived_from !== undefined) {\n if (!Array.isArray(fm.derived_from)) {\n throw new Error(\n `serializeFrontmatter: derived_from must be an array of \"<path>:<version>\" strings`,\n );\n }\n for (const entry of fm.derived_from) {\n if (!isValidDerivedFromEntry(entry)) {\n throw new Error(\n `serializeFrontmatter: invalid derived_from entry ${JSON.stringify(entry)} — expected \"<path>:<version>\" with version >= 0`,\n );\n }\n }\n if (fm.derived_from.length > 0) {\n lines.push(\n `derived_from: [${fm.derived_from\n .map((e) => `\"${e.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`)\n .join(\", \")}]`,\n );\n }\n }\n if (fm.derived_via !== undefined) {\n if (!isConsolidationOperator(fm.derived_via)) {\n throw new Error(\n `serializeFrontmatter: invalid derived_via ${JSON.stringify(fm.derived_via)} — expected one of \"split\" | \"merge\" | \"update\" | \"pattern-reinforcement\"`,\n );\n }\n lines.push(`derived_via: ${fm.derived_via}`);\n }\n // Pattern-reinforcement metadata (issue #687 PR 2/4). Emit only when\n // present so memories never touched by reinforcement round-trip\n // unchanged; matches the `archivedAt` / `forgottenAt` precedent.\n if (fm.reinforcement_count !== undefined) {\n if (\n !Number.isInteger(fm.reinforcement_count) ||\n fm.reinforcement_count <= 0\n ) {\n throw new Error(\n `serializeFrontmatter: reinforcement_count must be a positive integer (got ${JSON.stringify(fm.reinforcement_count)})`,\n );\n }\n lines.push(`reinforcement_count: ${fm.reinforcement_count}`);\n }\n if (fm.last_reinforced_at) {\n lines.push(`last_reinforced_at: ${fm.last_reinforced_at}`);\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 parseFrontmatterStringValue(rawValue: string | undefined): string | undefined {\n if (rawValue === undefined) return undefined;\n const trimmed = rawValue.trim();\n if (trimmed.length === 0) return undefined;\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"')) {\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n return typeof parsed === \"string\" ? parsed : trimmed;\n } catch {\n return trimmed.slice(1, -1).replace(/\\\\\"/g, '\"');\n }\n }\n return trimmed;\n}\n\n/**\n * Parse a Memory Worth counter from its raw YAML string form. Returns\n * `undefined` for missing, blank, negative, or non-integer values so a\n * corrupt stored counter fails safely rather than poisoning downstream\n * scoring. Pair with `assertMemoryWorthCounter` on the write path.\n */\nfunction parseMemoryWorthCounterField(raw: string | undefined): number | undefined {\n if (raw === undefined) return undefined;\n const trimmed = raw.trim();\n if (trimmed.length === 0) return undefined;\n const n = Number(trimmed);\n if (!Number.isFinite(n) || !Number.isInteger(n) || n < 0) return undefined;\n return n;\n}\n\n/**\n * Parse the pattern-reinforcement counter (issue #687 PR 2/4) from its\n * raw YAML string form. Returns `undefined` for missing, blank,\n * non-positive, or non-integer values so a corrupt stored counter\n * fails safely. Pair with the `reinforcement_count > 0 && integer`\n * assertion on the write path in `serializeFrontmatter`.\n */\nfunction parseReinforcementCountField(raw: string | undefined): number | undefined {\n if (raw === undefined) return undefined;\n const trimmed = raw.trim();\n if (trimmed.length === 0) return undefined;\n const n = Number(trimmed);\n if (!Number.isFinite(n) || !Number.isInteger(n) || n <= 0) return undefined;\n return 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 // Collapse YAML block-sequence style into inline flow style so the\n // downstream per-key parsers (derived_from, tags, lineage, etc.) keep\n // working. A key like\n // derived_from:\n // - facts/a.md:2\n // - facts/b.md:5\n // becomes\n // derived_from: [\"facts/a.md:2\", \"facts/b.md:5\"]\n // before the line-split. Only applies when the key's own line has an\n // empty scalar — any inline value or explicit flow sequence short-circuits\n // this and is parsed as-is.\n const rawLines = fmBlock.split(\"\\n\");\n const lines: string[] = [];\n let i = 0;\n while (i < rawLines.length) {\n const line = rawLines[i];\n const colonIdx = line.indexOf(\":\");\n if (colonIdx !== -1 && line.slice(colonIdx + 1).trim() === \"\") {\n const baseIndent = line.match(/^\\s*/)![0].length;\n const items: string[] = [];\n let j = i + 1;\n while (j < rawLines.length) {\n const next = rawLines[j];\n const m = next.match(/^(\\s+)- (.*)$/);\n if (!m || m[1].length <= baseIndent) break;\n // Strip matching surrounding quotes and apply YAML unescape rules\n // so block-style entries round-trip identically to flow-style ones.\n // double-quoted: `\\\"` → `\"`, `\\\\` → `\\`\n // single-quoted: `''` → `'` (YAML's native escape)\n let item = m[2].trim();\n if (item.startsWith('\"') && item.endsWith('\"') && item.length >= 2) {\n item = item\n .slice(1, -1)\n .replace(/\\\\\"/g, '\"')\n .replace(/\\\\\\\\/g, \"\\\\\");\n } else if (item.startsWith(\"'\") && item.endsWith(\"'\") && item.length >= 2) {\n item = item.slice(1, -1).replace(/''/g, \"'\");\n }\n items.push(item);\n j++;\n }\n if (items.length > 0) {\n const inline = items\n .map((v) => `\"${v.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`)\n .join(\", \");\n lines.push(`${line.slice(0, colonIdx + 1)} [${inline}]`);\n i = j;\n continue;\n }\n }\n lines.push(line);\n i++;\n }\n\n for (const line of lines) {\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 consolidation provenance (issue #561). `derived_from` is an\n // array of `\"<path>:<version>\"` strings; parsing is permissive so legacy\n // / malformed entries survive a read, but serialization validates on\n // write (see serializeFrontmatter). `derived_via` is a single operator\n // string; unknown values become `undefined` on read rather than raising.\n //\n // Tokenization handles every inline-YAML flavor we may encounter from\n // external editors and older builds:\n // - our canonical escape: [\"facts/a.md:2\", \"facts/b.md:5\"]\n // - single-quoted: ['facts/a.md:2', 'facts/b.md:5']\n // - bare (no quotes): [facts/a.md:2, facts/b.md:5]\n // Quoted entries preserve embedded commas in the path; bare entries\n // fall back to comma splitting but are still validated on write.\n let derived_from: string[] | undefined;\n const derivedFromStr = (fm.derived_from ?? \"\").trim();\n if (derivedFromStr.startsWith(\"[\") && derivedFromStr.endsWith(\"]\")) {\n const inner = derivedFromStr.slice(1, -1);\n const entries: string[] = [];\n // Hand-rolled tokenizer: walk the inner characters, honoring\n // double-quote escapes (`\\\"`, `\\\\`) and YAML single-quote doubling\n // (`''` in a `'...'` string means a literal `'`). This avoids the\n // `'...'` regex footgun where `''` is parsed as two empty strings.\n // Bare tokens (not quoted) are read until the next comma/whitespace\n // so flow sequences that mix quoted and bare scalars preserve every\n // entry.\n let i = 0;\n while (i < inner.length) {\n const ch = inner[i];\n if (ch === '\"') {\n let buf = \"\";\n i++;\n while (i < inner.length) {\n const c = inner[i];\n if (c === \"\\\\\" && i + 1 < inner.length) {\n const next = inner[i + 1];\n if (next === '\"') {\n buf += '\"';\n i += 2;\n continue;\n }\n if (next === \"\\\\\") {\n buf += \"\\\\\";\n i += 2;\n continue;\n }\n buf += c;\n i++;\n continue;\n }\n if (c === '\"') {\n i++;\n break;\n }\n buf += c;\n i++;\n }\n if (buf.length > 0) entries.push(buf);\n } else if (ch === \"'\") {\n let buf = \"\";\n i++;\n while (i < inner.length) {\n const c = inner[i];\n if (c === \"'\") {\n // YAML single-quote escape: `''` means a literal `'`.\n if (i + 1 < inner.length && inner[i + 1] === \"'\") {\n buf += \"'\";\n i += 2;\n continue;\n }\n i++;\n break;\n }\n buf += c;\n i++;\n }\n if (buf.length > 0) entries.push(buf);\n } else if (ch === \",\" || /\\s/.test(ch)) {\n // Separator between entries — skip.\n i++;\n } else {\n // Bare token — read until next comma or whitespace. Supports\n // mixed-style YAML sequences like `[\"facts/a.md:1\", facts/b.md:2]`\n // where some entries are quoted and others are bare.\n let buf = \"\";\n while (i < inner.length) {\n const c = inner[i];\n if (c === \",\" || /\\s/.test(c)) break;\n buf += c;\n i++;\n }\n if (buf.length > 0) entries.push(buf);\n }\n }\n if (entries.length > 0) derived_from = entries;\n }\n // `derived_via` may arrive quoted from external YAML emitters\n // (`derived_via: \"merge\"` or `'merge'`). Strip a single surrounding\n // quote pair before operator validation so semantically valid entries\n // aren't silently downgraded to `undefined`.\n const derivedViaRaw = (fm.derived_via ?? \"\").trim();\n const derivedViaUnquoted =\n (derivedViaRaw.startsWith('\"') && derivedViaRaw.endsWith('\"')) ||\n (derivedViaRaw.startsWith(\"'\") && derivedViaRaw.endsWith(\"'\"))\n ? derivedViaRaw.slice(1, -1)\n : derivedViaRaw;\n const derived_via = isConsolidationOperator(derivedViaUnquoted) ? derivedViaUnquoted : undefined;\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 Memory Worth counters (issue #560). We preserve explicit zeros so\n // callers can distinguish \"observed with zero successes\" from \"never\n // observed\". Invalid (non-integer / negative) stored values round-trip to\n // `undefined` — better to drop corrupt counters than to poison scoring.\n const mw_success = parseMemoryWorthCounterField(fm.mw_success);\n const mw_fail = parseMemoryWorthCounterField(fm.mw_fail);\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 // Issue #680 — explicit fact lifecycle round-trip.\n valid_at: fm.validAt || undefined,\n invalid_at: fm.invalidAt || undefined,\n forgottenAt: fm.forgottenAt || undefined,\n forgottenReason: parseFrontmatterStringValue(fm.forgottenReason),\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 // Memory Worth counters (issue #560)\n mw_success,\n mw_fail,\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 // Raw-content dedup hash (format-agnostic archive/consolidation cleanup)\n contentHash: fm.contentHash || undefined,\n // Consolidation provenance (issue #561) — read-through only in this\n // PR; no code produces these fields yet.\n derived_from,\n derived_via,\n // Pattern-reinforcement metadata (issue #687 PR 2/4). Parse\n // permissively: invalid values (negative, non-integer, blank\n // ISO-strings) are dropped to undefined so a corrupt frontmatter\n // never poisons downstream scoring. Validation lives on the\n // write path in serializeFrontmatter.\n reinforcement_count: parseReinforcementCountField(fm.reinforcement_count),\n last_reinforced_at: fm.last_reinforced_at || undefined,\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 inferEntityTypeFromContent(content: string): string | undefined {\n const typeMatch = content.match(/^\\*\\*Type:\\*\\*\\s*([^\\n]+)/m)?.[1]?.trim().toLowerCase();\n return typeMatch || undefined;\n}\n\nconst KNOWN_ENTITY_FILENAME_PREFIXES = new Set([\n \"company\",\n \"other\",\n \"person\",\n \"place\",\n \"project\",\n \"tool\",\n \"topic\",\n]);\n\nfunction inferEntityTypeFromFilename(pathRel: string): string | undefined {\n const basename = path.basename(pathRel, \".md\").toLowerCase();\n const separator = basename.indexOf(\"-\");\n if (separator <= 0) return undefined;\n const candidate = basename.slice(0, separator);\n return KNOWN_ENTITY_FILENAME_PREFIXES.has(candidate) ? candidate : undefined;\n}\n\nfunction normalizeFrontmatterForPath(frontmatter: MemoryFrontmatter, pathRel: string, content: string = \"\"): MemoryFrontmatter {\n const normalizedPath = pathRel.split(path.sep).join(\"/\");\n let normalizedFrontmatter = frontmatter;\n\n if (normalizedPath === \"entities\" || normalizedPath.startsWith(\"entities/\") || normalizedPath.includes(\"/entities/\")) {\n const basename = path.basename(pathRel, \".md\");\n const inferredType = inferEntityTypeFromContent(content) || inferEntityTypeFromFilename(pathRel) || \"entity\";\n const existingTags = Array.isArray(frontmatter.tags) ? frontmatter.tags : [];\n normalizedFrontmatter = {\n ...normalizedFrontmatter,\n id: typeof normalizedFrontmatter.id === \"string\" && normalizedFrontmatter.id.trim().length > 0\n ? normalizedFrontmatter.id\n : basename,\n category: \"entity\",\n tags: existingTags.includes(inferredType) ? existingTags : [...existingTags, inferredType],\n };\n }\n\n if (isArchivedMemoryPath(pathRel) && (!normalizedFrontmatter.status || normalizedFrontmatter.status === \"active\")) {\n return {\n ...normalizedFrontmatter,\n status: \"archived\",\n };\n }\n\n return normalizedFrontmatter;\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 private readonly secureStoreKeyProvider: () => Buffer | null;\n private readonly secureStoreWriteKeyProvider: () => Buffer | null;\n private readonly memoryDir: string;\n\n constructor(\n stateDir: string,\n secureStoreKeyProvider: () => Buffer | null = () => null,\n secureStoreWriteKeyProvider: () => Buffer | null = secureStoreKeyProvider,\n memoryDir: string = path.dirname(stateDir),\n ) {\n this.filePath = path.join(stateDir, \"fact-hashes.txt\");\n this.secureStoreKeyProvider = secureStoreKeyProvider;\n this.secureStoreWriteKeyProvider = secureStoreWriteKeyProvider;\n this.memoryDir = memoryDir;\n }\n\n /** Load existing hashes from disk. Safe to call multiple times. */\n async load(): Promise<void> {\n try {\n const raw = await readMaybeEncryptedFile(this.filePath, this.secureStoreKeyProvider(), this.memoryDir);\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 (err) {\n if (err instanceof SecureStoreLockedError) throw err;\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\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 writeMaybeEncryptedFile(\n this.filePath,\n [...this.hashes].join(\"\\n\") + \"\\n\",\n this.secureStoreWriteKeyProvider(),\n {},\n this.memoryDir,\n );\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 /**\n * Remove a pre-computed SHA-256 hash directly from the index without\n * re-hashing. Use this when the caller already holds the stored hash\n * (e.g. `memory.frontmatter.contentHash`) to avoid the double-hash bug\n * where `remove(hash)` would compute `hash(hash)` and never match the\n * entry.\n */\n removeByHash(hash: string): void {\n if (this.hashes.delete(hash)) {\n this.dirty = true;\n }\n }\n\n /**\n * Add a pre-computed SHA-256 hash directly to the index without re-hashing.\n * Use this when the caller already holds the stored hash\n * (e.g. `memory.frontmatter.contentHash`) so that the index records the raw\n * content hash rather than re-hashing the citation-annotated body.\n *\n * @internal Only called from `StorageManager.ensureFactHashIndexAuthoritative`.\n * Not part of the public API — prefer `add(content)` for external callers.\n */\n addByHash(hash: string): void {\n if (!this.hashes.has(hash)) {\n this.hashes.add(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// Attribute normalization helper\n// ---------------------------------------------------------------------------\n\n/**\n * Render a structured-attributes map into a stable, canonical string fragment\n * suitable for appending to enriched memory content before hashing.\n *\n * Normalization rules:\n * - Keys are trimmed and lowercased (values are trimmed but preserve case)\n * - Key-value pairs are sorted alphabetically by normalized key\n * - Pairs are joined with \"; \" and rendered as \"key: value\"\n *\n * Using this helper at BOTH the write path (enrichedContent) and the\n * dedup-lookup path (dedupContent) guarantees identical output regardless of\n * the insertion order or casing used by the caller.\n *\n * @example\n * normalizeAttributePairs({ foo: \"bar\", BAZ: \"qux\" })\n * // → \"baz: qux; foo: bar\"\n */\nexport function normalizeAttributePairs(pairs: Record<string, string>): string {\n return Object.entries(pairs)\n .map(([k, v]) => [k.trim().toLowerCase(), v.trim()] as [string, string])\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => `${k}: ${v}`)\n .join(\"; \");\n}\n\n// ---------------------------------------------------------------------------\n// Entity file parsing / serialization (Knowledge Graph v7.0)\n// ---------------------------------------------------------------------------\n\nfunction parseEntityFrontmatter(\n raw: string,\n): {\n frontmatter: {\n created?: string;\n updated?: string;\n synthesisUpdatedAt?: string;\n synthesisTimelineCount?: number;\n synthesisStructuredFactCount?: number;\n synthesisStructuredFactDigest?: string;\n synthesisVersion?: number;\n extraLines?: string[];\n };\n body: string;\n} {\n const match = raw.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?([\\s\\S]*)$/);\n if (!match) {\n return { frontmatter: {}, body: raw };\n }\n\n const values: Record<string, string> = {};\n const extraLines: string[] = [];\n const recognizedKeys = new Set([\n \"created\",\n \"updated\",\n \"synthesis_updated_at\",\n \"synthesis_timeline_count\",\n \"synthesis_structured_fact_count\",\n \"synthesis_structured_fact_digest\",\n \"synthesis_version\",\n ]);\n for (const line of match[1].split(/\\r?\\n/)) {\n if (/^\\s/.test(line)) {\n extraLines.push(line);\n continue;\n }\n const colonIdx = line.indexOf(\":\");\n if (colonIdx === -1) {\n extraLines.push(line);\n continue;\n }\n const key = line.slice(0, colonIdx).trim();\n if (!recognizedKeys.has(key)) {\n extraLines.push(line);\n continue;\n }\n const value = parseManagedFrontmatterValue(line.slice(colonIdx + 1));\n values[key] = value;\n }\n\n const synthesisTimelineCount = Number.parseInt(values.synthesis_timeline_count ?? \"\", 10);\n const synthesisStructuredFactCount = Number.parseInt(values.synthesis_structured_fact_count ?? \"\", 10);\n const synthesisVersion = Number.parseInt(values.synthesis_version ?? \"\", 10);\n return {\n frontmatter: {\n created: values.created || undefined,\n updated: values.updated || undefined,\n synthesisUpdatedAt: values.synthesis_updated_at || undefined,\n synthesisTimelineCount: Number.isFinite(synthesisTimelineCount) ? synthesisTimelineCount : undefined,\n synthesisStructuredFactCount: Number.isFinite(synthesisStructuredFactCount) ? synthesisStructuredFactCount : undefined,\n synthesisStructuredFactDigest: values.synthesis_structured_fact_digest || undefined,\n synthesisVersion: Number.isFinite(synthesisVersion) ? synthesisVersion : undefined,\n extraLines,\n },\n body: match[2],\n };\n}\n\nfunction parseManagedFrontmatterValue(rawValue: string): string {\n const trimmed = rawValue.trim();\n if (!trimmed) return \"\";\n\n const openingQuote = trimmed[0];\n if (openingQuote === '\"' || openingQuote === \"'\") {\n let escaped = false;\n for (let index = 1; index < trimmed.length; index += 1) {\n const char = trimmed[index];\n if (openingQuote === '\"' && !escaped && char === \"\\\\\") {\n escaped = true;\n continue;\n }\n if (!escaped && char === openingQuote) {\n return trimmed.slice(1, index);\n }\n escaped = false;\n }\n return trimmed.slice(1).replace(new RegExp(`${openingQuote}$`), \"\");\n }\n\n for (let index = 0; index < trimmed.length; index += 1) {\n if (trimmed[index] === \"#\" && (index === 0 || /\\s/.test(trimmed[index - 1] ?? \"\"))) {\n return trimmed.slice(0, index).trimEnd();\n }\n }\n\n return trimmed;\n}\n\nfunction readEntitySectionText(\n lines: string[],\n sectionNames: string[],\n options: {\n preserveBullets?: boolean;\n skipTimelineBullets?: boolean;\n } = {},\n): string | undefined {\n const normalizedSections = new Set(sectionNames.map((name) => name.toLowerCase()));\n let section = \"\";\n const sectionLines: string[] = [];\n for (const line of lines) {\n if (line.startsWith(\"## \")) {\n const nextSection = line.slice(3).trim().toLowerCase();\n if (section && !normalizedSections.has(nextSection)) break;\n section = normalizedSections.has(nextSection) ? nextSection : \"\";\n continue;\n }\n if (!section) continue;\n const trimmed = line.trim();\n if (!trimmed) {\n if (options.preserveBullets === true && sectionLines.length > 0 && sectionLines[sectionLines.length - 1] !== \"\") {\n sectionLines.push(\"\");\n }\n continue;\n }\n if (\n options.skipTimelineBullets === true\n && trimmed.startsWith(\"- \")\n && isEntitySynthesisTimelinePromotionBullet(trimmed.slice(2))\n ) {\n continue;\n }\n if (trimmed.startsWith(\"- \") && options.preserveBullets !== true) continue;\n sectionLines.push(options.preserveBullets === true ? line.trimEnd() : trimmed);\n }\n while (sectionLines[sectionLines.length - 1] === \"\") {\n sectionLines.pop();\n }\n if (sectionLines.length === 0) return undefined;\n return sectionLines.join(options.preserveBullets === true ? \"\\n\" : \" \");\n}\n\nfunction parseEntityTimelineBullet(\n bullet: string,\n fallbackTimestamp: string,\n): EntityTimelineEntry | null {\n const trimmed = bullet.trim();\n if (!trimmed) return null;\n\n let rest = trimmed;\n const entry: EntityTimelineEntry = {\n timestamp: trimmed.startsWith(\"[\") ? \"\" : fallbackTimestamp,\n text: \"\",\n };\n const consumedMetadataSegments: string[] = [];\n let literalSingleSourceSegment: string | undefined;\n\n if (!trimmed.startsWith(\"[\")) {\n entry.text = trimmed;\n return entry.text ? entry : null;\n }\n\n const firstEnd = trimmed.indexOf(\"]\");\n if (firstEnd === -1) {\n entry.text = trimmed;\n return entry.text ? entry : null;\n }\n\n const firstToken = trimmed.slice(1, firstEnd).trim();\n const parsedTimestamp = Date.parse(firstToken);\n if (Number.isFinite(parsedTimestamp)) {\n entry.timestamp = firstToken || fallbackTimestamp;\n rest = trimmed.slice(firstEnd + 1).trimStart();\n }\n\n while (rest.startsWith(\"[\")) {\n const end = findEntityTimelineTokenEnd(rest);\n if (end === -1) break;\n const rawSegment = rest.slice(0, end + 1);\n const token = rest.slice(1, end).trim();\n const equalsIdx = token.indexOf(\"=\");\n if (equalsIdx === -1) {\n if (rest === trimmed) {\n entry.text = trimmed;\n return entry.text ? entry : null;\n }\n break;\n }\n const key = token.slice(0, equalsIdx).trim().toLowerCase();\n const value = unescapeEntityTimelineMetadataValue(token.slice(equalsIdx + 1).trim());\n if (!value) break;\n const nextRest = rest.slice(end + 1).trimStart();\n switch (key) {\n case \"source_meta\":\n entry.source = value;\n break;\n case \"source\":\n if (\n consumedMetadataSegments.length === 0\n && !nextRest.startsWith(\"[\")\n && nextRest.length > 0\n && !isManagedEntityTimelineSource(value)\n ) {\n literalSingleSourceSegment = rawSegment;\n rest = nextRest;\n break;\n }\n entry.source = value;\n break;\n case \"session\":\n case \"sessionkey\":\n entry.sessionKey = value;\n break;\n case \"principal\":\n entry.principal = value;\n break;\n default:\n entry.text = rest.trim();\n return entry.text ? entry : null;\n }\n if (literalSingleSourceSegment) break;\n consumedMetadataSegments.push(rawSegment);\n rest = nextRest;\n }\n\n if (literalSingleSourceSegment) {\n return {\n timestamp: entry.timestamp,\n text: `${literalSingleSourceSegment} ${rest}`.trim(),\n };\n }\n\n entry.text = rest.trim();\n if (!entry.text) return null;\n return entry;\n}\n\nfunction isEntitySynthesisTimelinePromotionBullet(bullet: string): boolean {\n const trimmed = bullet.trim();\n if (!trimmed.startsWith(\"[\")) return false;\n\n const firstEnd = findEntityTimelineTokenEnd(trimmed);\n if (firstEnd === -1) return false;\n\n const firstToken = trimmed.slice(1, firstEnd).trim();\n return looksLikeEntityTimelineTimestamp(firstToken);\n}\n\nfunction looksLikeEntityTimelineTimestamp(token: string): boolean {\n if (!/^\\d{4}-\\d{2}-\\d{2}(?:[T\\s].*)?$/.test(token)) return false;\n return Number.isFinite(Date.parse(token));\n}\n\nfunction isManagedEntityTimelineSource(source: string): boolean {\n switch (source.trim().toLowerCase()) {\n case \"artifact\":\n case \"chunking\":\n case \"cli-migrate\":\n case \"compounding-promotion\":\n case \"consolidation\":\n case \"contradiction-detection\":\n case \"entity_extraction\":\n case \"explicit\":\n case \"explicit-inline\":\n case \"explicit-inline-review\":\n case \"explicit-review\":\n case \"extraction\":\n case \"extraction-shared-promotion\":\n case \"manual\":\n case \"migration\":\n case \"migration-rechunk\":\n case \"proactive\":\n case \"replay\":\n case \"semantic-consolidation\":\n case \"unknown\":\n return true;\n default:\n return false;\n }\n}\n\nfunction findEntityTimelineTokenEnd(input: string): number {\n let escaped = false;\n for (let index = 0; index < input.length; index += 1) {\n const char = input[index];\n if (escaped) {\n escaped = false;\n continue;\n }\n if (char === \"\\\\\") {\n escaped = true;\n continue;\n }\n if (char === \"]\") return index;\n }\n return -1;\n}\n\nfunction escapeEntityTimelineMetadataValue(value: string): string {\n let escaped = \"\";\n for (const char of value) {\n switch (char) {\n case \"\\\\\":\n escaped += \"\\\\\\\\\";\n break;\n case \"]\":\n escaped += \"\\\\]\";\n break;\n case \"\\n\":\n escaped += \"\\\\n\";\n break;\n case \"\\r\":\n escaped += \"\\\\r\";\n break;\n case \"\\t\":\n escaped += \"\\\\t\";\n break;\n default: {\n const codePoint = char.codePointAt(0) ?? 0;\n if (codePoint < 0x20) {\n escaped += `\\\\u${codePoint.toString(16).padStart(4, \"0\")}`;\n } else {\n escaped += char;\n }\n }\n }\n }\n return escaped;\n}\n\nfunction unescapeEntityTimelineMetadataValue(value: string): string {\n if (!value.includes(\"\\\\\")) return value;\n\n let result = \"\";\n for (let index = 0; index < value.length; index += 1) {\n const char = value[index];\n if (char !== \"\\\\\") {\n result += char;\n continue;\n }\n\n const next = value[index + 1];\n if (!next) {\n result += \"\\\\\";\n break;\n }\n\n switch (next) {\n case \"n\":\n result += \"\\n\";\n index += 1;\n break;\n case \"r\":\n result += \"\\r\";\n index += 1;\n break;\n case \"t\":\n result += \"\\t\";\n index += 1;\n break;\n case \"u\": {\n const hex = value.slice(index + 2, index + 6);\n if (/^[0-9a-fA-F]{4}$/.test(hex)) {\n result += String.fromCharCode(parseInt(hex, 16));\n index += 5;\n break;\n }\n result += \"u\";\n index += 1;\n break;\n }\n default:\n result += next;\n index += 1;\n break;\n }\n }\n return result;\n}\n\nfunction serializeEntityTimelineEntry(entry: EntityTimelineEntry): string {\n const tokens: string[] = [];\n if (entry.timestamp.trim().length > 0) {\n tokens.push(`[${entry.timestamp}]`);\n }\n if (entry.source) {\n const sourceKey = isManagedEntityTimelineSource(entry.source) ? \"source\" : \"source_meta\";\n tokens.push(`[${sourceKey}=${escapeEntityTimelineMetadataValue(entry.source)}]`);\n }\n if (entry.sessionKey) {\n tokens.push(`[session=${escapeEntityTimelineMetadataValue(entry.sessionKey)}]`);\n }\n if (entry.principal) {\n tokens.push(`[principal=${escapeEntityTimelineMetadataValue(entry.principal)}]`);\n }\n const serializedMetadata = tokens.length > 0 ? `${tokens.join(\" \")} ` : \"\";\n return `- ${serializedMetadata}${entry.text}`.trimEnd();\n}\n\nfunction dedupeEntityTimelineFacts(timeline: EntityTimelineEntry[]): string[] {\n return [...new Set(\n timeline\n .map((entry) => entry.text.trim())\n .filter((entry) => entry.length > 0),\n )];\n}\n\nfunction normalizeEntitySectionFact(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction normalizeStructuredSectionFacts(facts: string[]): string[] {\n return [...new Set(\n facts\n .map((fact) => normalizeEntitySectionFact(fact))\n .filter((fact) => fact.length > 0),\n )];\n}\n\nfunction collectStructuredSectionFacts(structuredSections: EntityStructuredSection[]): string[] {\n const facts: string[] = [];\n for (const section of structuredSections) {\n for (const fact of section.facts) {\n const normalized = normalizeEntitySectionFact(fact);\n if (!normalized) continue;\n facts.push(normalized);\n }\n }\n return [...new Set(facts)];\n}\n\nfunction compileEntityFacts(\n timeline: EntityTimelineEntry[],\n structuredSections: EntityStructuredSection[],\n): string[] {\n const facts: string[] = [];\n const seen = new Set<string>();\n for (const fact of dedupeEntityTimelineFacts(timeline)) {\n if (seen.has(fact)) continue;\n seen.add(fact);\n facts.push(fact);\n }\n for (const fact of collectStructuredSectionFacts(structuredSections)) {\n if (seen.has(fact)) continue;\n seen.add(fact);\n facts.push(fact);\n }\n return facts;\n}\n\nfunction parseEntityStructuredSectionFacts(lines: string[]): string[] {\n const facts: string[] = [];\n let currentBlock: string[] = [];\n\n const flushCurrentBlock = (): void => {\n const normalized = normalizeEntitySectionFact(currentBlock.join(\" \"));\n if (normalized.length > 0) facts.push(normalized);\n currentBlock = [];\n };\n\n for (const rawLine of lines) {\n const line = rawLine.trim();\n if (!line) {\n flushCurrentBlock();\n continue;\n }\n if (line.startsWith(\"- \")) {\n flushCurrentBlock();\n currentBlock = [line.slice(2).trim()];\n continue;\n }\n currentBlock.push(line);\n }\n\n flushCurrentBlock();\n return [...new Set(facts)];\n}\n\nfunction looksLikeStructuredSectionFactList(lines: string[]): boolean {\n const firstNonBlank = lines.find((line) => line.trim().length > 0)?.trim() ?? \"\";\n return firstNonBlank.startsWith(\"- \");\n}\n\nfunction partitionEntityStructuredSections(\n entityType: string,\n extraSections: Array<{ title: string; lines: string[] }>,\n entitySchemas?: PluginConfig[\"entitySchemas\"],\n): {\n structuredSections: EntityStructuredSection[];\n remainingExtraSections: Array<{ title: string; lines: string[] }>;\n} {\n const structuredSections: EntityStructuredSection[] = [];\n const remainingExtraSections: Array<{ title: string; lines: string[] }> = [];\n const structuredSectionIndex = new Map<string, EntityStructuredSection>();\n\n for (const section of extraSections) {\n const matchedSection = matchEntitySchemaSection(entityType, section.title, entitySchemas);\n if (!matchedSection && !looksLikeStructuredSectionFactList(section.lines)) {\n remainingExtraSections.push(section);\n continue;\n }\n const facts = parseEntityStructuredSectionFacts(section.lines);\n if (!matchedSection && facts.length === 0) {\n remainingExtraSections.push(section);\n continue;\n }\n const normalizedSection = matchedSection\n ? { key: matchedSection.key, title: matchedSection.title }\n : normalizeEntityStructuredSection(\n entityType,\n { key: section.title, title: section.title },\n entitySchemas,\n );\n if (facts.length === 0) {\n remainingExtraSections.push(section);\n continue;\n }\n const existing = structuredSectionIndex.get(normalizedSection.key);\n if (existing) {\n existing.facts = normalizeStructuredSectionFacts([...existing.facts, ...facts]);\n continue;\n }\n const structuredSection: EntityStructuredSection = {\n key: normalizedSection.key,\n title: normalizedSection.title,\n facts: normalizeStructuredSectionFacts(facts),\n };\n structuredSections.push(structuredSection);\n structuredSectionIndex.set(normalizedSection.key, structuredSection);\n }\n\n return {\n structuredSections,\n remainingExtraSections,\n };\n}\n\nfunction latestEntityTimelineTimestamp(entity: EntityFile): string | undefined {\n let latestRaw: string | undefined;\n for (const entry of entity.timeline) {\n const timestamp = entry.timestamp.trim();\n if (!timestamp) continue;\n if (!latestRaw || compareEntityTimestamps(timestamp, latestRaw) > 0) {\n latestRaw = timestamp;\n }\n }\n return latestRaw;\n}\n\nexport function compareEntityTimestamps(left?: string, right?: string): number {\n const leftValue = left?.trim() ?? \"\";\n const rightValue = right?.trim() ?? \"\";\n\n if (!leftValue && !rightValue) return 0;\n if (!leftValue) return -1;\n if (!rightValue) return 1;\n\n const leftMs = Date.parse(leftValue);\n const rightMs = Date.parse(rightValue);\n const leftParsed = Number.isFinite(leftMs);\n const rightParsed = Number.isFinite(rightMs);\n\n if (leftParsed && rightParsed) {\n if (leftMs === rightMs) return 0;\n return leftMs > rightMs ? 1 : -1;\n }\n if (leftParsed) return 1;\n if (rightParsed) return -1;\n return leftValue.localeCompare(rightValue);\n}\n\nfunction countEntityStructuredFacts(entity: EntityFile): number {\n return (entity.structuredSections ?? []).reduce((count, section) => count + section.facts.length, 0);\n}\n\nexport function fingerprintEntityStructuredFacts(entity: Pick<EntityFile, \"structuredSections\">): string | undefined {\n const normalizedSections = (entity.structuredSections ?? [])\n .map((section) => ({\n key: section.key.trim().toLowerCase(),\n title: section.title.replace(/\\s+/g, \" \").trim(),\n facts: normalizeStructuredSectionFacts(section.facts).slice().sort((left, right) => left.localeCompare(right)),\n }))\n .filter((section) => section.facts.length > 0)\n .sort((left, right) =>\n left.key.localeCompare(right.key)\n || left.title.localeCompare(right.title)\n || left.facts.join(\"\\n\").localeCompare(right.facts.join(\"\\n\")));\n if (normalizedSections.length === 0) return undefined;\n return createHash(\"sha256\").update(JSON.stringify(normalizedSections)).digest(\"hex\");\n}\n\nexport function isEntitySynthesisStale(entity: EntityFile): boolean {\n const structuredFactCount = countEntityStructuredFacts(entity);\n const structuredFactDigest = fingerprintEntityStructuredFacts(entity);\n const storedStructuredFactDigest = entity.synthesisStructuredFactDigest?.trim() || undefined;\n if (entity.timeline.length === 0 && structuredFactCount === 0) return false;\n if (!entity.synthesis?.trim()) return true;\n if (entity.synthesisTimelineCount === undefined) return true;\n if (structuredFactCount > 0 && entity.synthesisStructuredFactCount === undefined) return true;\n if (structuredFactCount > 0 && !storedStructuredFactDigest) return true;\n const latestTimelineTimestamp = latestEntityTimelineTimestamp(entity);\n if (!latestTimelineTimestamp) {\n return entity.timeline.length > entity.synthesisTimelineCount\n || structuredFactCount > (entity.synthesisStructuredFactCount ?? 0)\n || structuredFactDigest !== storedStructuredFactDigest;\n }\n if (!entity.synthesisUpdatedAt?.trim()) return true;\n const timelineFreshness = compareEntityTimestamps(latestTimelineTimestamp, entity.synthesisUpdatedAt);\n if (timelineFreshness > 0) return true;\n return entity.timeline.length > entity.synthesisTimelineCount\n || structuredFactCount > (entity.synthesisStructuredFactCount ?? 0)\n || structuredFactDigest !== storedStructuredFactDigest;\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(\n content: string,\n entitySchemas?: PluginConfig[\"entitySchemas\"],\n): EntityFile {\n const { frontmatter, body } = parseEntityFrontmatter(content);\n const lines = body.split(\"\\n\");\n const recognizedSections = new Set([\n \"facts\",\n \"timeline\",\n \"summary\",\n \"synthesis\",\n \"connected to\",\n \"activity\",\n \"aliases\",\n ]);\n\n // Header\n let name = \"\";\n let type = \"other\";\n let created = frontmatter.created ?? \"\";\n let updated = \"\";\n const legacyFacts: string[] = [];\n const relationships: EntityRelationship[] = [];\n const activity: EntityActivityEntry[] = [];\n const aliases: string[] = [];\n const timeline: EntityTimelineEntry[] = [];\n const extraSections: Array<{ title: string; lines: 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 if (!updated) updated = frontmatter.updated ?? frontmatter.created ?? \"\";\n if (!created) created = updated;\n\n const headingLineIndex = lines.findIndex((l) => l.startsWith(\"# \"));\n const firstSectionIndex = lines.findIndex((l) => l.startsWith(\"## \"));\n const preSectionStartIndex = headingLineIndex > -1 ? headingLineIndex + 1 : 0;\n const preSectionCandidates = firstSectionIndex > -1\n ? lines.slice(preSectionStartIndex, firstSectionIndex)\n : lines.slice(preSectionStartIndex);\n const preSectionLines = preSectionCandidates.filter(\n (line) => !line.startsWith(\"**Type:**\") && !line.startsWith(\"**Updated:**\"),\n );\n const normalizedPreSectionLines = [...preSectionLines];\n while (normalizedPreSectionLines[0] === \"\") {\n normalizedPreSectionLines.shift();\n }\n const preservedPreSectionLines = normalizedPreSectionLines.some((line) => line.trim().length > 0)\n ? normalizedPreSectionLines\n : [];\n\n const fallbackTimestamp = updated || created || \"\";\n\n // Detect which section we're in\n let section = \"\";\n let currentExtraSection: { title: string; lines: string[] } | null = null;\n for (const line of lines) {\n if (line.startsWith(\"## \")) {\n const heading = line.slice(3).trim();\n section = heading.toLowerCase();\n if (recognizedSections.has(section)) {\n currentExtraSection = null;\n } else {\n currentExtraSection = { title: heading, lines: [] };\n extraSections.push(currentExtraSection);\n }\n continue;\n }\n if (currentExtraSection) {\n currentExtraSection.lines.push(line);\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 legacyFacts.push(bullet);\n break;\n case \"timeline\": {\n const parsed = parseEntityTimelineBullet(\n bullet,\n fallbackTimestamp,\n );\n if (parsed) timeline.push(parsed);\n break;\n }\n case \"summary\":\n case \"synthesis\":\n if (isEntitySynthesisTimelinePromotionBullet(bullet)) {\n const parsed = parseEntityTimelineBullet(\n bullet,\n fallbackTimestamp,\n );\n if (parsed) timeline.push(parsed);\n }\n // Summary/synthesis is typically a paragraph 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 const legacyFactTimelineEntries = legacyFacts.map((fact) => ({\n timestamp: fallbackTimestamp,\n text: fact,\n source: \"migration\" as const,\n }));\n\n if (legacyFactTimelineEntries.length > 0) {\n const existingTimelineFacts = new Set(\n timeline\n .map((entry) => entry.text.trim())\n .filter((entry) => entry.length > 0),\n );\n for (const fact of legacyFactTimelineEntries) {\n const normalizedFact = fact.text.trim();\n if (!normalizedFact || existingTimelineFacts.has(normalizedFact)) continue;\n timeline.push(fact);\n existingTimelineFacts.add(normalizedFact);\n }\n }\n\n const synthesis =\n readEntitySectionText(lines, [\"Synthesis\"], { preserveBullets: true, skipTimelineBullets: true })\n ?? readEntitySectionText(lines, [\"Summary\"], { preserveBullets: true, skipTimelineBullets: true });\n const synthesisUpdatedAt = frontmatter.synthesisUpdatedAt || undefined;\n const synthesisTimelineCount = frontmatter.synthesisTimelineCount;\n const synthesisStructuredFactCount = frontmatter.synthesisStructuredFactCount;\n const synthesisStructuredFactDigest = frontmatter.synthesisStructuredFactDigest;\n const { structuredSections, remainingExtraSections } = partitionEntityStructuredSections(\n type,\n extraSections,\n entitySchemas,\n );\n const facts = compileEntityFacts(timeline, structuredSections);\n\n return {\n name,\n type,\n created,\n updated,\n extraFrontmatterLines: frontmatter.extraLines ?? [],\n preSectionLines: preservedPreSectionLines,\n facts,\n summary: synthesis,\n synthesis,\n synthesisUpdatedAt,\n synthesisTimelineCount,\n synthesisStructuredFactCount,\n synthesisStructuredFactDigest,\n synthesisVersion: frontmatter.synthesisVersion,\n timeline,\n structuredSections,\n relationships,\n activity,\n aliases,\n extraSections: remainingExtraSections,\n };\n}\n\n/**\n * Serialize an EntityFile back to markdown.\n * Writes the compiled-truth + timeline format while remaining parse-compatible\n * with the legacy in-memory `summary` and `facts` fields.\n */\nexport function serializeEntityFile(\n entity: EntityFile,\n entitySchemas?: PluginConfig[\"entitySchemas\"],\n): string {\n const synthesis = entity.synthesis || entity.summary || \"\";\n const created = entity.created?.trim() || entity.updated || new Date().toISOString();\n const updated = entity.updated || created;\n const timeline = entity.timeline;\n const structuredSections = sortStructuredSectionsBySchema(\n entity.type,\n (entity.structuredSections ?? []).map((section) => ({\n ...section,\n facts: normalizeStructuredSectionFacts(section.facts),\n })).filter((section) => section.facts.length > 0),\n entitySchemas,\n );\n const sectionFacts = new Set(collectStructuredSectionFacts(structuredSections));\n const legacyFacts = timeline.length === 0\n ? [...new Set(\n entity.facts\n .map((fact) => normalizeEntitySectionFact(fact))\n .filter((fact) => fact.length > 0 && !sectionFacts.has(fact)),\n )]\n : [];\n const synthesisUpdatedAt = entity.synthesisUpdatedAt?.trim() || \"\";\n const synthesisTimelineCount = entity.synthesisTimelineCount;\n const synthesisStructuredFactCount = entity.synthesisStructuredFactCount;\n const synthesisStructuredFactDigest = entity.synthesisStructuredFactDigest?.trim() || \"\";\n const synthesisVersion = entity.synthesisVersion ?? (synthesis ? 1 : 0);\n\n const lines: string[] = [\n \"---\",\n `created: ${created}`,\n `updated: ${updated}`,\n `synthesis_updated_at: \"${synthesisUpdatedAt}\"`,\n ...(synthesisTimelineCount === undefined\n ? []\n : [`synthesis_timeline_count: ${synthesisTimelineCount}`]),\n ...(synthesisStructuredFactCount === undefined\n ? []\n : [`synthesis_structured_fact_count: ${synthesisStructuredFactCount}`]),\n ...(synthesisStructuredFactDigest\n ? [`synthesis_structured_fact_digest: \"${synthesisStructuredFactDigest}\"`]\n : []),\n `synthesis_version: ${synthesisVersion}`,\n ...(entity.extraFrontmatterLines ?? []),\n \"---\",\n \"\",\n `# ${entity.name}`,\n \"\",\n `**Type:** ${entity.type}`,\n `**Updated:** ${updated}`,\n \"\",\n ];\n\n if ((entity.preSectionLines ?? []).length > 0) {\n lines.push(...(entity.preSectionLines ?? []));\n if (entity.preSectionLines?.[entity.preSectionLines.length - 1] !== \"\") {\n lines.push(\"\");\n }\n }\n\n lines.push(\"## Synthesis\", \"\");\n if (synthesis) {\n lines.push(synthesis);\n }\n lines.push(\"\");\n\n if (timeline.length > 0 || legacyFacts.length === 0) {\n lines.push(\"## Timeline\", \"\");\n for (const entry of timeline) {\n lines.push(serializeEntityTimelineEntry(entry));\n }\n lines.push(\"\");\n }\n\n if (legacyFacts.length > 0) {\n lines.push(\"## Facts\", \"\");\n for (const fact of legacyFacts) {\n lines.push(`- ${fact}`);\n }\n lines.push(\"\");\n }\n\n for (const section of structuredSections) {\n lines.push(`## ${section.title}`, \"\");\n for (const fact of section.facts) {\n lines.push(`- ${fact}`);\n }\n lines.push(\"\");\n }\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 for (const section of entity.extraSections ?? []) {\n lines.push(`## ${section.title}`);\n lines.push(...section.lines);\n if (section.lines.length > 0 && section.lines[section.lines.length - 1] !== \"\") {\n lines.push(\"\");\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction buildEntitySchemaCacheKey(entitySchemas?: PluginConfig[\"entitySchemas\"]): string {\n if (!entitySchemas) return \"\";\n const normalized = Object.entries(entitySchemas)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([entityType, schema]) => [\n entityType,\n {\n sections: schema.sections.map((section) => ({\n key: section.key,\n title: section.title,\n description: section.description,\n aliases: section.aliases ? [...section.aliases] : undefined,\n })),\n },\n ]);\n return JSON.stringify(normalized);\n}\n\n/**\n * Full-schema type guard for a `BUFFER_SURPRISE` telemetry row\n * (issue #563 PR 3).\n *\n * The reader applies `limit` over the count of VALID rows, so\n * applying only a partial check (e.g. \"has a finite surpriseScore\")\n * and then deferring the rest of validation to\n * `reportBufferSurpriseDistribution` would silently count\n * schema-incomplete rows toward the limit, pushing genuinely-valid\n * earlier rows out of the report window. Validate everything the\n * downstream report requires at read time so the limit semantics and\n * the distribution semantics stay consistent.\n */\nfunction isValidBufferSurpriseEvent(value: unknown): value is BufferSurpriseEvent {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const v = value as Record<string, unknown>;\n if (v.event !== \"BUFFER_SURPRISE\") return false;\n if (typeof v.timestamp !== \"string\" || v.timestamp.length === 0) return false;\n if (!Number.isFinite(Date.parse(v.timestamp))) return false;\n if (typeof v.bufferKey !== \"string\" || v.bufferKey.length === 0) return false;\n if (v.sessionKey !== null && typeof v.sessionKey !== \"string\") return false;\n if (v.turnRole !== \"user\" && v.turnRole !== \"assistant\") return false;\n if (typeof v.surpriseScore !== \"number\" || !Number.isFinite(v.surpriseScore)) {\n return false;\n }\n // Surprise is documented as a value in [0, 1] — reject out-of-range\n // rows at read time so they do not consume the caller's `limit`.\n if (v.surpriseScore < 0 || v.surpriseScore > 1) return false;\n if (typeof v.threshold !== \"number\" || !Number.isFinite(v.threshold)) return false;\n if (v.threshold < 0 || v.threshold > 1) return false;\n if (typeof v.triggeredFlush !== \"boolean\") return false;\n if (typeof v.turnCountInWindow !== \"number\" || !Number.isFinite(v.turnCountInWindow)) {\n return false;\n }\n return true;\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 private static readonly secureStoreEntityCacheKeyIds = new WeakMap<Buffer, number>();\n private static nextSecureStoreEntityCacheKeyId = 1;\n // In-process fallback for the cold-write sentinel (used when the disk file\n // is not accessible). The canonical source of truth is state/cold-write.log.\n private static readonly coldWriteVersionByDir = 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 readAllColdMemories() — keyed by cold root directory path.\n // Prevents an uncached full-tree directory scan on every structured-attribute\n // write (Finding UOGi, PR #402 round-6). The cache is only invalidated when\n // cold-tier content actually changes (via invalidateColdMemoriesCache), NOT\n // on every hot-tier write. It also expires after COLD_SCAN_CACHE_TTL_MS as\n // a safety net.\n //\n // Finding UvUy (PR #402 round-11): cache entries now carry a `coldVersion`\n // sentinel that is bumped (via a file-size counter in state/cold-write.log)\n // on every write that modifies cold-tier content. Before serving a cached\n // result, readAllColdMemories() reads the sentinel from disk and compares.\n // If they differ the entry is dropped and the cold tree is re-scanned. This\n // makes the cache correct across process boundaries (gateway + CLI): a second\n // process that writes a new cold memory bumps the sentinel on disk, so the\n // first process's next readAllColdMemories() sees the change within one call\n // (rather than waiting up to 30s for TTL expiry).\n //\n // After Finding UTsP broadened readAllColdMemories to scan the entire cold/\n // subtree (not just facts/+corrections/), amortizing this I/O across\n // back-to-back writes in the same burst is even more important.\n private static readonly COLD_SCAN_CACHE_TTL_MS = 30_000; // 30 seconds\n private static readonly coldMemoriesCache = new Map<string, { memories: MemoryFile[]; loadedAt: number; coldVersion: number }>();\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 private readonly secureAppendChains = new Map<string, Promise<void>>();\n /** Optional: set by the orchestrator after construction to enable template-aware citation stripping during legacy hash rebuild. */\n citationTemplate: string = DEFAULT_CITATION_FORMAT;\n\n /** Page-versioning configuration. Set by the orchestrator after construction. */\n private _versioningConfig: VersioningConfig | null = null;\n\n /** Set the page-versioning configuration. When `enabled` is false (default), all versioning calls are no-ops. */\n setVersioningConfig(config: VersioningConfig): void {\n this._versioningConfig = config;\n }\n\n /**\n * At-rest encryption key (issue #690 PR 3/4).\n *\n * When non-null, every memory file read is decrypted and every write\n * is encrypted using the secure-fs layer. When null, the storage\n * layer operates in plain-text mode (legacy/unencrypted store).\n *\n * Set by the orchestrator after init/unlock; cleared on lock.\n * The key buffer is NEVER logged or serialized.\n */\n private _secureStoreKey: Buffer | null = null;\n\n /**\n * When true (and `_secureStoreKey` is non-null), new writes are\n * encrypted. Set to false to pause encryption of new writes while\n * still decrypting existing files.\n */\n private _secureStoreEncryptOnWrite = true;\n\n /**\n * When true, the secure-store is configured as required — writes\n * MUST be encrypted and a locked store MUST reject writes rather\n * than silently falling back to plaintext. Set by the orchestrator\n * from `config.secureStoreEnabled`.\n */\n private _secureStoreRequired = false;\n\n /**\n * Set or clear the at-rest encryption key.\n *\n * Pass a 32-byte Buffer to enable encryption; pass null to clear\n * (lock) the store. The caller is responsible for key lifecycle —\n * this method does not zero the buffer on replacement; the keyring\n * module (`keyring.ts`) owns zeroization.\n */\n setSecureStoreKey(key: Buffer | null, encryptOnWrite = true): void {\n this._secureStoreKey = key;\n this._secureStoreEncryptOnWrite = encryptOnWrite;\n invalidateCachedEntities(this.baseDir);\n this.invalidateKnowledgeIndexCache();\n }\n\n private getEntityCacheSecureStoreKey(): string {\n if (!this._secureStoreKey) return \"secure-store:locked\";\n let id = StorageManager.secureStoreEntityCacheKeyIds.get(this._secureStoreKey);\n if (id === undefined) {\n id = StorageManager.nextSecureStoreEntityCacheKeyId++;\n StorageManager.secureStoreEntityCacheKeyIds.set(this._secureStoreKey, id);\n }\n return `secure-store:key:${id}`;\n }\n\n /**\n * Mark the secure-store as required for this storage instance.\n * When required and locked, writes throw SecureStoreLockedError\n * rather than silently writing plaintext.\n */\n setSecureStoreRequired(required: boolean): void {\n this._secureStoreRequired = required;\n }\n\n /** Return true iff the secure-store key is currently set (store is unlocked). */\n isSecureStoreUnlocked(): boolean {\n return this._secureStoreKey !== null;\n }\n\n /**\n * Resolve the effective write key.\n *\n * - If `_secureStoreEncryptOnWrite` is false: returns null (plain write).\n * - If `_secureStoreEncryptOnWrite` is true AND key is set: returns key.\n * - If `_secureStoreEncryptOnWrite` is true AND key is null AND\n * `_secureStoreRequired` is true: throws SecureStoreLockedError so the\n * write fails loudly rather than silently writing plaintext (P1 finding\n * from Cursor review of PR #767).\n * - If `_secureStoreEncryptOnWrite` is true AND key is null AND\n * `_secureStoreRequired` is false: returns null (unencrypted store).\n */\n private resolveWriteKey(): Buffer | null {\n if (!this._secureStoreEncryptOnWrite) return null;\n if (this._secureStoreKey !== null) return this._secureStoreKey;\n if (this._secureStoreRequired) {\n throw new SecureStoreLockedError(\n \"secure-store is locked — cannot write memory file. \" +\n \"Run `remnic secure-store unlock` to decrypt, or restart the daemon after unlocking.\",\n );\n }\n return null;\n }\n\n /**\n * Snapshot the current content of a page before overwriting.\n * No-op when versioning is disabled or the file does not yet exist.\n */\n private async snapshotBeforeWrite(filePath: string, trigger: VersionTrigger): Promise<void> {\n if (!this._versioningConfig || !this._versioningConfig.enabled) return;\n try {\n // Use the secure-fs read path so the snapshot captures plaintext\n // regardless of whether the file is currently encrypted on disk.\n const existing = await readMaybeEncryptedFile(filePath, this._secureStoreKey, this.baseDir);\n await createPageVersion(filePath, existing, trigger, this._versioningConfig, log, undefined, this.baseDir);\n } catch {\n // File does not exist yet — nothing to snapshot\n }\n }\n\n /**\n * Consolidation provenance helper (issue #561 PR 2).\n *\n * Captures the current on-disk content of a source memory as a\n * page-version snapshot so the downstream consolidated write can record a\n * `derived_from` pointer that actually resolves. Returns the\n * `\"<relative-path>:<versionId>\"` entry expected by the `derived_from`\n * frontmatter field.\n *\n * Returns `null` when versioning is disabled (snapshots would not be\n * created), when the file does not exist (nothing to snapshot), or when\n * the snapshot write itself fails (best-effort — callers skip the entry\n * rather than block the consolidation).\n */\n async snapshotForProvenance(filePath: string): Promise<string | null> {\n if (!this._versioningConfig || !this._versioningConfig.enabled) return null;\n let existing: string;\n try {\n existing = await readMaybeEncryptedFile(filePath, this._secureStoreKey, this.baseDir);\n } catch {\n return null;\n }\n try {\n const version = await createPageVersion(\n filePath,\n existing,\n \"consolidation\",\n this._versioningConfig,\n log,\n undefined,\n this.baseDir,\n );\n const rel = path.relative(this.baseDir, filePath).split(path.sep).join(\"/\");\n return `${rel}:${version.versionId}`;\n } catch (err) {\n log.warn(\n `storage.snapshotForProvenance: failed to snapshot ${filePath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n return null;\n }\n }\n\n constructor(\n private readonly baseDir: string,\n private readonly entitySchemas?: PluginConfig[\"entitySchemas\"],\n ) {}\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\" | \"cold-write\"): string {\n const fileName =\n kind === \"memory-status\"\n ? \".memory-status-version.log\"\n : kind === \"artifact-write\"\n ? \".artifact-write-version.log\"\n : \".cold-write-version.log\";\n return path.join(this.stateDir, fileName);\n }\n\n private bumpSharedVersion(\n kind: \"memory-status\" | \"artifact-write\" | \"cold-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\" | \"cold-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 proceduresDir(): string {\n return path.join(this.baseDir, \"procedures\");\n }\n private get reasoningTracesDir(): string {\n return path.join(this.baseDir, \"reasoning-traces\");\n }\n private get entitiesDir(): string {\n return path.join(this.baseDir, \"entities\");\n }\n private readStorageSecureFile(filePath: string): Promise<string> {\n return readMaybeEncryptedFile(filePath, this._secureStoreKey, this.baseDir);\n }\n private writeStorageSecureFile(filePath: string, content: string): Promise<void> {\n return writeMaybeEncryptedFile(filePath, content, this.resolveWriteKey(), {}, this.baseDir);\n }\n createContentHashIndex(): ContentHashIndex {\n return new ContentHashIndex(\n this.stateDir,\n () => this._secureStoreKey,\n () => this.resolveWriteKey(),\n this.baseDir,\n );\n }\n\n private async appendStorageSecureFile(filePath: string, content: string): Promise<void> {\n const previous = this.secureAppendChains.get(filePath) ?? Promise.resolve();\n const current = previous\n .catch(() => undefined)\n .then(() => this.appendStorageSecureFileUnlocked(filePath, content));\n const next = current.catch(() => undefined);\n this.secureAppendChains.set(filePath, next);\n try {\n await current;\n } finally {\n if (this.secureAppendChains.get(filePath) === next) {\n this.secureAppendChains.delete(filePath);\n }\n }\n }\n\n private async appendStorageSecureFileUnlocked(filePath: string, content: string): Promise<void> {\n const writeKey = this.resolveWriteKey();\n await mkdir(path.dirname(filePath), { recursive: true });\n if (writeKey === null) {\n try {\n if (isEncryptedFile(await readFile(filePath))) {\n const existing = await this.readStorageSecureFile(filePath);\n await writeMaybeEncryptedFile(filePath, `${existing}${content}`, null, {}, this.baseDir);\n return;\n }\n } catch (err) {\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\n }\n await appendFile(filePath, content, \"utf-8\");\n return;\n }\n\n let existing = \"\";\n try {\n existing = await this.readStorageSecureFile(filePath);\n } catch (err) {\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\n }\n await writeMaybeEncryptedFile(filePath, `${existing}${content}`, writeKey, {}, this.baseDir);\n }\n private get stateDir(): string {\n return path.join(this.baseDir, \"state\");\n }\n private get entitySynthesisQueuePath(): string {\n return path.join(this.stateDir, \"entity-synthesis-queue.json\");\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 = this.createContentHashIndex();\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 let legacyRecovered = 0;\n for (const memory of existing) {\n if (memory.frontmatter.category !== \"fact\") continue;\n if (inferMemoryStatus(memory.frontmatter, memory.path) !== \"active\") continue;\n // Prefer the pre-computed raw-content hash stored in frontmatter\n // (written since round 8 of issue #369). This hash was derived from\n // the content BEFORE citation annotation, so it matches what\n // hasFactContentHash(rawFact) would compute.\n if (memory.frontmatter.contentHash) {\n factHashIndex.addByHash(memory.frontmatter.contentHash);\n continue;\n }\n // Legacy fact written before contentHash was introduced (Finding 1 —\n // Uhol). Apply nuanced handling based on whether the citation can be\n // reliably stripped:\n //\n // 1. Default citation present → strip it and index the raw body.\n // 2. No citation at all → index the raw body as-is.\n // 3. Unknown/custom citation template → skip with a warning.\n //\n // Rationale for (3): for facts annotated with a custom citation\n // template, stripCitationForTemplate cannot reliably detect the inline\n // marker and would hash the cited body — producing a hash that never\n // matches what hasFactContentHash(rawContent) computes. A\n // false-negative miss (the fact is not in the index) is preferable to\n // a wrong index entry that permanently suppresses legitimate duplicate\n // writes.\n //\n // Limitation (Thread 2 — stale hash): even when contentHash IS present\n // it may be stale if updateMemory() rewrote the body without updating\n // the frontmatter hash. The hash is trusted as-is here; a future\n // migration pass can recompute it from the current content.\n const content = memory.content;\n // Use the configured template (Thread 1 fix): citationTemplate is set\n // by the orchestrator to the active inlineSourceAttributionFormat so\n // the rebuild can strip both the default and any custom template.\n // Falls back to DEFAULT_CITATION_FORMAT when the orchestrator has not\n // configured a custom template (e.g. direct StorageManager construction\n // in tests).\n const stripped = stripCitationForTemplate(content, this.citationTemplate);\n if (stripped !== content) {\n // Citation was stripped — index the bare body.\n factHashIndex.addByHash(\n ContentHashIndex.computeHash(sanitizeMemoryContent(stripped).text),\n );\n continue;\n }\n // No citation was removed. Decide whether to index or skip.\n // Thread 4 fix: use hasCitation() rather than the too-broad endsWith(\"]\")\n // heuristic. Facts that legitimately end with \"]\" (e.g. \"User prefers\n // [dark mode]\") have no citation marker and should be indexed as-is.\n // Only skip when hasCitation() confirms a citation is present — that\n // means the citation is from an unknown/custom template we cannot strip.\n if (!hasCitation(content)) {\n // Content has no recognisable citation marker — index raw body.\n factHashIndex.addByHash(\n ContentHashIndex.computeHash(sanitizeMemoryContent(content).text),\n );\n continue;\n }\n // Content carries a citation from an unknown/custom template\n // that we cannot safely strip. Skip rather than index a wrong hash.\n legacyRecovered++;\n continue;\n }\n if (legacyRecovered > 0) {\n log.info(\n `ensureFactHashIndexAuthoritative: skipped ${legacyRecovered} legacy fact(s) with no contentHash in frontmatter`,\n );\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 * Buffer surprise telemetry ledger (issue #563 PR 3).\n *\n * Append-only JSONL of per-turn `BUFFER_SURPRISE` events emitted by\n * `SmartBuffer` when `bufferSurpriseTriggerEnabled` is on. Each row\n * captures the score, the threshold in force at the time, whether the\n * turn caused an extract_now upgrade, and the buffer size. Kept in\n * `state/` alongside the other append-only ledgers so cleanup and\n * governance sweeps can treat it uniformly.\n */\n private get bufferSurpriseLedgerPath(): string {\n return path.join(this.stateDir, \"buffer-surprise-ledger.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(path.join(this.proceduresDir, today), { recursive: true });\n await mkdir(path.join(this.reasoningTracesDir, 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 validAt?: string;\n structuredAttributes?: Record<string, string>;\n /**\n * When provided, this string is used as the source for the fact-content\n * dedup hash index instead of the persisted body (`content`).\n *\n * Use this when the persisted body differs from the canonical fact text\n * — for example when `content` is a citation-annotated variant of a raw\n * fact. Passing the raw fact as `contentHashSource` ensures that\n * `hasFactContentHash(rawFact)` returns `true` after the write, so\n * subsequent extractions of the same logical fact are correctly deduped\n * even when their citation timestamp differs.\n */\n contentHashSource?: string;\n status?: MemoryStatus;\n /**\n * Consolidation provenance (issue #561 PR 2). When the caller is a\n * consolidation / supersession / dedup-merge path, these fields wire\n * the page-version snapshots the new memory was derived from and the\n * operator that produced it. Persisted onto frontmatter as\n * `derived_from` + `derived_via`; validated at serialize time.\n */\n derivedFrom?: string[];\n derivedVia?: ConsolidationOperator;\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 const validAt = normalizeMemoryWriteTimestamp(\"validAt\", options.validAt);\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 valid_at: validAt,\n structuredAttributes: options.structuredAttributes,\n };\n if (options.status !== undefined) {\n fm.status = options.status;\n }\n // Consolidation provenance (issue #561 PR 2). Fields are independent\n // at the storage layer:\n // - `derivedFrom: []` → coerced to undefined so we never emit the\n // invalid `derived_from: []` form the write validator rejects.\n // - `derivedVia` may stand alone: an orphan operator marker (e.g.\n // `derived_via: merge` with no `derived_from`) is the correct\n // serialization when page-versioning is disabled and snapshots\n // can't be captured. Downstream logic still needs to identify\n // the memory as a consolidation output. Review feedback: PR #624\n // codex / cursor threads.\n if (options.derivedFrom !== undefined && options.derivedFrom.length > 0) {\n fm.derived_from = options.derivedFrom;\n }\n if (options.derivedVia !== undefined) {\n fm.derived_via = options.derivedVia;\n }\n\n // Append structured attributes as searchable suffix so QMD indexes them.\n // normalizeAttributePairs sorts and lowercases keys so the enriched content\n // is stable regardless of the insertion order or key casing supplied by the\n // caller — this must stay in sync with the dedupContent built in the\n // orchestrator's hash-dedup path.\n let enrichedContent = content;\n if (options.structuredAttributes && Object.keys(options.structuredAttributes).length > 0) {\n enrichedContent = `${content}\\n[Attributes: ${normalizeAttributePairs(options.structuredAttributes)}]`;\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\n // Persist the raw-content dedup hash on the frontmatter so archive and\n // consolidation paths can remove the correct hash from ContentHashIndex\n // regardless of what citation format (if any) has been appended to the\n // stored body. Mirrors the logic in the fact-hash-index update below.\n if (category === \"fact\") {\n const hashSource =\n options.contentHashSource !== undefined && options.contentHashSource.length > 0\n ? sanitizeMemoryContent(options.contentHashSource).text\n : sanitized.text;\n fm.contentHash = ContentHashIndex.computeHash(hashSource);\n }\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 if (category === \"procedure\") {\n await mkdir(path.join(this.proceduresDir, today), { recursive: true });\n filePath = path.join(this.proceduresDir, today, `${id}.md`);\n } else if (category === \"reasoning_trace\") {\n // Issue #564 PR 3: reasoning traces live in their own subtree so recall\n // can filter on path cheaply without parsing frontmatter.\n await mkdir(path.join(this.reasoningTracesDir, today), { recursive: true });\n filePath = path.join(this.reasoningTracesDir, today, `${id}.md`);\n } else {\n filePath = path.join(this.factsDir, today, `${id}.md`);\n }\n\n await this.snapshotBeforeWrite(filePath, \"write\");\n await writeMaybeEncryptedFile(filePath, fileContent, this.resolveWriteKey(), {}, this.baseDir);\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 // When the caller provides a separate contentHashSource (e.g. the raw\n // fact text before citation annotation), index THAT string so that\n // hasFactContentHash(rawFact) returns true on subsequent extractions.\n // Otherwise fall back to the sanitized persisted body as before.\n if (options.contentHashSource !== undefined && options.contentHashSource.length > 0) {\n const hashSourceSanitized = sanitizeMemoryContent(options.contentHashSource);\n factHashIndex.add(hashSourceSanitized.text);\n } else {\n factHashIndex.add(sanitized.text);\n }\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 private factContentHashForRemoval(memory: MemoryFile): string | null {\n if (memory.frontmatter.category !== \"fact\") return null;\n if (typeof memory.frontmatter.contentHash === \"string\" && memory.frontmatter.contentHash.length > 0) {\n return memory.frontmatter.contentHash;\n }\n const configuredHashSource = stripCitationMarkersForHashRemoval(memory.content, this.citationTemplate);\n const hashSource =\n configuredHashSource !== memory.content\n ? configuredHashSource\n : stripDefaultCitationMarkersWithoutRegex(memory.content);\n return ContentHashIndex.computeHash(sanitizeMemoryContent(hashSource).text);\n }\n\n async removeFactContentHashesForMemories(memories: MemoryFile[]): Promise<void> {\n await this.ensureFactHashIndexAuthoritative();\n const factHashIndex = await this.getFactHashIndex();\n const removedIds = new Set(\n memories\n .map((memory) => memory.frontmatter.id)\n .filter((id): id is string => typeof id === \"string\" && id.length > 0),\n );\n const removedHashes = new Map<MemoryFile, string>();\n for (const memory of memories) {\n const hash = this.factContentHashForRemoval(memory);\n if (hash) {\n removedHashes.set(memory, hash);\n }\n }\n if (removedHashes.size === 0) return;\n\n const remainingActiveHashes = new Set<string>();\n const remainingMemories = [\n ...await this.readAllMemories(),\n ...await this.readAllColdMemories(),\n ];\n for (const memory of remainingMemories) {\n if (memory.frontmatter.category !== \"fact\") continue;\n if (removedIds.has(memory.frontmatter.id)) continue;\n if (inferMemoryStatus(memory.frontmatter, memory.path) !== \"active\") continue;\n const hash = this.factContentHashForRemoval(memory);\n if (hash) {\n remainingActiveHashes.add(hash);\n }\n }\n\n for (const hash of removedHashes.values()) {\n if (!remainingActiveHashes.has(hash)) {\n factHashIndex.removeByHash(hash);\n }\n }\n await factHashIndex.save();\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 writeMaybeEncryptedFile(filePath, `${serializeFrontmatter(fm)}\\n\\n${sanitized.text}\\n`, this.resolveWriteKey(), {}, this.baseDir);\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 options: {\n timestamp?: string;\n source?: string;\n sessionKey?: string;\n principal?: string;\n structuredSections?: EntityStructuredSection[];\n } = {},\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)\n ? [...new Set(\n facts\n .filter((fact) => typeof fact === \"string\")\n .map((fact) => fact.trim())\n .filter((fact) => fact.length > 0),\n )]\n : [];\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,\n type,\n created: \"\",\n updated: new Date().toISOString(),\n facts: [],\n summary: undefined,\n synthesis: undefined,\n synthesisUpdatedAt: undefined,\n synthesisVersion: undefined,\n synthesisStructuredFactCount: undefined,\n synthesisStructuredFactDigest: undefined,\n timeline: [],\n relationships: [],\n activity: [],\n aliases: [],\n };\n try {\n const existing = await this.readStorageSecureFile(filePath);\n entity = parseEntityFile(existing, this.entitySchemas);\n } catch (err) {\n if (err instanceof SecureStoreLockedError) throw err;\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\n // File doesn't exist yet\n }\n\n const timestamp = options.timestamp?.trim() || new Date().toISOString();\n const source = options.source?.trim() || undefined;\n const sessionKey = options.sessionKey?.trim() || undefined;\n const principal = options.principal?.trim() || undefined;\n const structuredSectionMap = new Map(\n (entity.structuredSections ?? []).map((section) => [section.key, {\n ...section,\n facts: [...section.facts],\n }]),\n );\n for (const section of options.structuredSections ?? []) {\n const normalizedSection = normalizeEntityStructuredSection(type, section, this.entitySchemas);\n const normalizedFacts = normalizeStructuredSectionFacts(section.facts);\n if (normalizedFacts.length === 0) continue;\n const existingSection = structuredSectionMap.get(normalizedSection.key);\n if (!existingSection) {\n structuredSectionMap.set(normalizedSection.key, {\n key: normalizedSection.key,\n title: normalizedSection.title,\n facts: normalizedFacts,\n });\n continue;\n }\n existingSection.facts = normalizeStructuredSectionFacts([...existingSection.facts, ...normalizedFacts]);\n if (!existingSection.title.trim() && normalizedSection.title.trim()) {\n existingSection.title = normalizedSection.title;\n }\n }\n for (const fact of safeFacts) {\n const nextEntry = {\n timestamp,\n text: fact,\n ...(source ? { source } : {}),\n ...(sessionKey ? { sessionKey } : {}),\n ...(principal ? { principal } : {}),\n };\n const alreadyPresent = entity.timeline.some((entry) =>\n entry.timestamp === nextEntry.timestamp\n && entry.text === nextEntry.text\n && entry.source === nextEntry.source\n && entry.sessionKey === nextEntry.sessionKey\n && entry.principal === nextEntry.principal\n );\n if (alreadyPresent) continue;\n entity.timeline.push(nextEntry);\n }\n entity.structuredSections = sortStructuredSectionsBySchema(\n type,\n Array.from(structuredSectionMap.values()).filter((section) => section.facts.length > 0),\n this.entitySchemas,\n );\n entity.facts = compileEntityFacts(entity.timeline, entity.structuredSections);\n entity.summary = entity.synthesis || entity.summary;\n entity.name = name;\n entity.type = type;\n entity.created = entity.created || timestamp;\n entity.updated = new Date().toISOString();\n\n await this.snapshotBeforeWrite(filePath, \"write\");\n await this.writeStorageSecureFile(filePath, serializeEntityFile(entity, this.entitySchemas));\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 readMaybeEncryptedFile(this.profilePath, this._secureStoreKey, this.baseDir);\n } catch (error) {\n if (error instanceof SecureStoreLockedError) {\n throw error;\n }\n if (isErrnoCode(error, \"ENOENT\")) return \"\";\n throw error;\n }\n }\n\n async writeProfile(content: string): Promise<void> {\n await this.ensureDirectories();\n await this.snapshotBeforeWrite(this.profilePath, \"consolidation\");\n await writeMaybeEncryptedFile(this.profilePath, content, this.resolveWriteKey(), {}, this.baseDir);\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 /** Invalidate only the cache layers affected by direct tier file deletes. */\n invalidateMemoryCachesForTiers(tiers: Iterable<\"hot\" | \"cold\" | \"archive\">): void {\n let hotChanged = false;\n let coldChanged = false;\n for (const tier of tiers) {\n if (tier === \"cold\") {\n coldChanged = true;\n } else if (tier === \"hot\" || tier === \"archive\") {\n hotChanged = true;\n }\n }\n if (hotChanged) {\n this.invalidateAllMemoriesCache();\n }\n if (coldChanged) {\n this.invalidateColdMemoriesCache();\n }\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 StorageManager.coldMemoriesCache.clear(); // also wipe the cold-scan TTL cache\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 *\n * Finding UvBq (PR #402 round-11): this method intentionally does NOT\n * invalidate the cold-scan cache. Ordinary hot-tier writes (writeMemory)\n * do not change cold-tier content, so evicting the cold cache on every hot\n * write was defeating the burst-dedup optimisation — the cold cache was\n * cleared before applyTemporalSupersession ran, causing a full cold-tree\n * disk scan on every write in a burst. Cold cache invalidation is handled\n * exclusively by invalidateColdMemoriesCache(), which is called only when\n * cold content actually changes (hot→cold demotions, writeMemoryFileAtomic\n * inside cold/, archiveMemory, etc.). */\n private invalidateAllMemoriesCache(): void {\n StorageManager.allMemoriesInFlight.delete(this.baseDir);\n }\n\n /**\n * Invalidate the cold-scan cache for this storage root and bump the\n * on-disk cold-version sentinel so that other processes (gateway, CLI) see\n * the change immediately on their next readAllColdMemories() call.\n *\n * Must be called whenever a memory is written INTO the cold tier — hot→cold\n * demotion, atomic writes inside cold/, archiving a cold memory, etc.\n * NOT called on ordinary hot-tier writes (those don't change cold contents).\n *\n * Finding UvUy (PR #402 round-11): bumping the sentinel here makes the\n * per-process in-memory cache safe across process boundaries.\n */\n private invalidateColdMemoriesCache(): void {\n const coldRoot = path.join(this.baseDir, \"cold\");\n StorageManager.coldMemoriesCache.delete(coldRoot);\n this.bumpColdWriteVersion();\n }\n\n /** Return the current cold-write version counter for this storage root.\n * Reads the on-disk sentinel (state/cold-write.log) so it reflects writes\n * made by other processes. */\n private readColdWriteVersion(): number {\n return this.readSharedVersion(\"cold-write\", StorageManager.coldWriteVersionByDir);\n }\n\n /** Bump the on-disk cold-write version sentinel and update the in-process\n * fallback map. Called by invalidateColdMemoriesCache(). */\n private bumpColdWriteVersion(): void {\n this.bumpSharedVersion(\"cold-write\", StorageManager.coldWriteVersionByDir);\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.proceduresDir);\n await collectPaths(this.reasoningTracesDir);\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 readMaybeEncryptedFile(fullPath, this._secureStoreKey, this.baseDir);\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 parsed.content,\n ),\n content: parsed.content,\n } satisfies MemoryFile;\n } catch (err) {\n // Re-throw store-locked errors so a locked encrypted store fails\n // loudly rather than appearing as an empty memory corpus (Cursor\n // review finding, PR #767).\n if (err instanceof SecureStoreLockedError) throw err;\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 readMaybeEncryptedFile(filePath, this._secureStoreKey, this.baseDir);\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 all memories from the cold tier by scanning the entire cold/ root\n * tree. Previously this only scanned cold/facts/ and cold/corrections/, but\n * structuredAttributes can appear on any MemoryCategory (preference, decision,\n * entity, etc.). Although buildTierMemoryPath currently routes all\n * non-correction, non-artifact memories to cold/facts/, scanning the full\n * coldRoot ensures correctness if that routing ever changes and guards against\n * files placed in unexpected subdirectories during manual operations or future\n * refactors.\n *\n * Broadened in PR #402 round-6 (Finding UTsP): scanning only facts/ and\n * corrections/ was a narrower-than-necessary subset of the cold directory\n * tree. Correctness trumps the minor performance difference — cold scans\n * already happen at most once per supersession write.\n *\n * Used by applyTemporalSupersession so that memories already demoted to\n * cold/ can still be marked superseded when a newer hot fact arrives.\n *\n * Cached with a TTL (Finding UOGi, PR #402 round-6): back-to-back\n * structured-attribute writes in the same burst reuse the cached result\n * instead of re-scanning the cold tree on every call. The cache is\n * invalidated whenever a write calls invalidateAllMemoriesCache() (which\n * covers any hot→cold demotion that changes cold-tier contents) and\n * expires after COLD_SCAN_CACHE_TTL_MS as a safety net.\n */\n async readAllColdMemories(): Promise<MemoryFile[]> {\n const coldRoot = this.resolveTierRootDir(\"cold\");\n\n // Read the on-disk cold-version sentinel BEFORE checking the cache so that\n // writes made by other processes (gateway + CLI) are detected immediately.\n // Finding UvUy (PR #402 round-11): without this check the cache served\n // stale data for up to 30s when another process wrote a new cold memory.\n const currentColdVersion = this.readColdWriteVersion();\n\n // Return cached result if still valid by both TTL and sentinel version.\n const cached = StorageManager.coldMemoriesCache.get(coldRoot);\n if (\n cached &&\n Date.now() - cached.loadedAt < StorageManager.COLD_SCAN_CACHE_TTL_MS &&\n cached.coldVersion === currentColdVersion\n ) {\n return cached.memories;\n }\n\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 — cold tier may be empty.\n }\n };\n\n // Scan the entire cold root so that memories in any subdirectory (facts/,\n // corrections/, artifacts/, or any future category-specific subdirectory)\n // are included. This is broader than the previous facts/+corrections/ scan\n // and ensures that any memory with structuredAttributes is found regardless\n // of which category it was written with.\n await collectPaths(coldRoot);\n const memories = await this.readParsedMemoriesFromPaths(filePaths, 50);\n\n // Store in cache with the sentinel version captured above so that any\n // subsequent cold-version bump (by this or another process) invalidates it.\n StorageManager.coldMemoriesCache.set(coldRoot, { memories, loadedAt: Date.now(), coldVersion: currentColdVersion });\n return memories;\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 readMaybeEncryptedFile(fullPath, this._secureStoreKey, this.baseDir);\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 parsed.content,\n ),\n content: parsed.content,\n });\n }\n } catch (err) {\n // Re-throw store-locked errors — a locked encrypted store\n // must fail loudly, not silently return an empty archive.\n if (err instanceof SecureStoreLockedError) throw err;\n // Skip other unreadable files (ENOENT, parse failures, etc.)\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 readMaybeEncryptedFile(filePath, this._secureStoreKey, this.baseDir);\n // Note: the outer catch intentionally swallows most errors (ENOENT etc.)\n // but SecureStoreLockedError must propagate — see re-throw below.\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 parsed.content,\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, this.entitySchemas);\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 (err) {\n // Re-throw store-locked errors — callers need to distinguish \"locked\"\n // from \"file not found / parse error\". Swallowing a locked error here\n // would silently return null and leave the daemon appearing to work\n // while returning no memories (subtle data loss).\n if (err instanceof SecureStoreLockedError) throw err;\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 if (memory.frontmatter.category === \"procedure\") {\n return path.join(root, \"procedures\", this.resolveMemoryDateDir(memory), `${memory.frontmatter.id}.md`);\n }\n if (memory.frontmatter.category === \"reasoning_trace\") {\n // Issue #564 PR 3: preserve the dedicated reasoning-traces/ subtree\n // across tier moves. Without this branch, hot→cold migration would\n // funnel the memory into facts/, breaking isReasoningTracePath() and\n // silently disabling the recall boost for migrated traces.\n return path.join(root, \"reasoning-traces\", this.resolveMemoryDateDir(memory), `${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 // writeMaybeEncryptedFile handles atomic temp→rename internally and\n // calls mkdir on the parent directory — no need to duplicate here.\n await writeMaybeEncryptedFile(targetPath, fileContent, this.resolveWriteKey(), {}, this.baseDir);\n this.invalidateAllMemoriesCache();\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 // If moving to cold, also invalidate the cold-scan cache so the next\n // readAllColdMemories() call sees the newly-demoted file (Finding UOGi fix).\n if (targetTier === \"cold\") {\n this.invalidateColdMemoriesCache();\n }\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 (encrypted if applicable), then remove original.\n await writeMaybeEncryptedFile(destPath, fileContent, this.resolveWriteKey(), {}, this.baseDir);\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 this.readStorageSecureFile(path.join(this.entitiesDir, `${name}.md`));\n } catch (err) {\n if (err instanceof SecureStoreLockedError) throw err;\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\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 writeMaybeEncryptedFile(memory.path, fileContent, this.resolveWriteKey(), {}, this.baseDir);\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 writeMaybeEncryptedFile(memory.path, fileContent, this.resolveWriteKey(), {}, this.baseDir);\n this.invalidateAllMemoriesCache();\n // If the target file lives in cold/, bump the cold-version sentinel so\n // other processes detect the change on their next readAllColdMemories()\n // call (Finding UvUy fix).\n if (memory.path.includes(`${path.sep}cold${path.sep}`)) {\n this.invalidateColdMemoriesCache();\n }\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 this.readStorageSecureFile(bufferPath);\n return JSON.parse(raw) as BufferState;\n } catch (err) {\n if (err instanceof SecureStoreLockedError) throw err;\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\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 this.writeStorageSecureFile(bufferPath, JSON.stringify(state, null, 2));\n }\n\n async loadMeta(): Promise<MetaState> {\n const metaPath = path.join(this.stateDir, \"meta.json\");\n try {\n const raw = await this.readStorageSecureFile(metaPath);\n const parsed = JSON.parse(raw) as MetaState;\n return {\n extractionCount:\n typeof parsed.extractionCount === \"number\" ? parsed.extractionCount : 0,\n lastExtractionAt: parsed.lastExtractionAt ?? null,\n lastConsolidationAt: parsed.lastConsolidationAt ?? null,\n totalMemories:\n typeof parsed.totalMemories === \"number\" ? parsed.totalMemories : 0,\n totalEntities:\n typeof parsed.totalEntities === \"number\" ? parsed.totalEntities : 0,\n processedExtractionFingerprints: Array.isArray(\n parsed.processedExtractionFingerprints,\n )\n ? parsed.processedExtractionFingerprints\n .filter(\n (entry) =>\n entry &&\n typeof entry === \"object\" &&\n typeof (entry as { fingerprint?: unknown }).fingerprint ===\n \"string\" &&\n typeof (entry as { observedAt?: unknown }).observedAt ===\n \"string\",\n )\n .map((entry) => ({\n fingerprint: (entry as { fingerprint: string }).fingerprint,\n observedAt: (entry as { observedAt: string }).observedAt,\n }))\n : [],\n };\n } catch (err) {\n if (err instanceof SecureStoreLockedError) throw err;\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\n return {\n extractionCount: 0,\n lastExtractionAt: null,\n lastConsolidationAt: null,\n totalMemories: 0,\n totalEntities: 0,\n processedExtractionFingerprints: [],\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 this.writeStorageSecureFile(metaPath, JSON.stringify(state, null, 2));\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 this.appendStorageSecureFile(this.memoryActionsPath, payload);\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 this.appendStorageSecureFile(this.memoryLifecycleLedgerPath, payload);\n return events.length;\n }\n\n /**\n * Append a batch of `BUFFER_SURPRISE` telemetry events (issue #563 PR 3).\n *\n * Each event records a single buffer flush decision driven by the\n * surprise gate. The ledger is consumed by\n * `reportBufferSurpriseDistribution` (Doctor report) and by downstream\n * benchmark analysis. This method is fire-and-forget by contract:\n * callers log but do not fail the hot path if the append throws.\n */\n async appendBufferSurpriseEvents(\n events: BufferSurpriseEvent[],\n ): Promise<number> {\n if (events.length === 0) return 0;\n await this.ensureDirectories();\n\n const nowIso = new Date().toISOString();\n const payload = events\n .map((event) => {\n const normalized: BufferSurpriseEvent = {\n ...event,\n event: \"BUFFER_SURPRISE\",\n timestamp:\n event.timestamp && event.timestamp.length > 0\n ? event.timestamp\n : nowIso,\n };\n return `${JSON.stringify(normalized)}\\n`;\n })\n .join(\"\");\n\n await this.appendStorageSecureFile(this.bufferSurpriseLedgerPath, payload);\n return events.length;\n }\n\n /**\n * Read the buffer-surprise ledger, most recent rows last.\n *\n * `limit` bounds the number of **valid rows** returned (not the\n * number of raw lines parsed). We parse every row, discard malformed\n * ones, then take the tail — so a partial/truncated trailing line\n * (the common failure mode after an interrupted append) cannot hide\n * otherwise-valid recent data above it.\n *\n * Non-positive / non-integer / non-finite limits return `[]` rather\n * than the entire file, matching the other ledger readers in this\n * class and protecting against `slice(-0.5)` → `slice(-0)` silently\n * devolving into an unbounded parse.\n *\n * # Performance note\n *\n * For very large ledgers (issue #563 follow-up), a tail-first reader\n * would avoid parsing the full file when only a recent window is\n * needed. We keep the full-scan implementation here because:\n *\n * - the ledger is opt-in (flag off by default), so early deployments\n * accumulate rows slowly;\n * - telemetry rows are small (~200 bytes), so even 100k rows parse\n * in well under a second;\n * - the governance archive/cleanup flow can trim the ledger when\n * size becomes a concern, reusing the existing maintenance hooks.\n *\n * Swap to a chunked tail-reader if production logs show this is a\n * hot path — leaving that work for a follow-up keeps this PR scoped\n * to correctness, not optimization.\n */\n async readBufferSurpriseEvents(\n options: { limit?: number } = {},\n ): Promise<BufferSurpriseEvent[]> {\n let raw: string;\n try {\n raw = await this.readStorageSecureFile(this.bufferSurpriseLedgerPath);\n } catch (err) {\n if (err instanceof SecureStoreLockedError) throw err;\n const code = (err as NodeJS.ErrnoException).code;\n if (code === \"ENOENT\") return [];\n throw err;\n }\n\n // Resolve the effective limit up front. Any non-finite / non-positive\n // value returns no rows — callers who want \"everything\" should OMIT\n // the `limit` key (treated as \"no bound\" below). We intentionally\n // reject `Infinity` too, because the slice math `events.slice(-Inf)`\n // is surprising and ambiguous; omit the key instead. Fractional\n // values <1 floor to 0, which would make `slice(-0)` return the\n // entire file — guard against that too.\n let effectiveLimit: number | null = null;\n if (options.limit !== undefined) {\n if (\n typeof options.limit !== \"number\" ||\n !Number.isFinite(options.limit) ||\n options.limit <= 0\n ) {\n return [];\n }\n const floored = Math.floor(options.limit);\n if (floored <= 0) return [];\n effectiveLimit = floored;\n }\n\n const lines = raw.split(\"\\n\");\n const events: BufferSurpriseEvent[] = [];\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.length === 0) continue;\n try {\n const parsed = JSON.parse(trimmed);\n if (isValidBufferSurpriseEvent(parsed)) {\n events.push(parsed);\n }\n } catch {\n // Malformed row — fail open, skip.\n }\n }\n\n if (effectiveLimit === null) return events;\n // Slice over VALID rows, not raw lines, so malformed tails cannot\n // mask good data above them.\n return events.slice(-effectiveLimit);\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 this.readStorageSecureFile(this.behaviorSignalsPath);\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 (err) {\n if (err instanceof SecureStoreLockedError) throw err;\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\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 this.appendStorageSecureFile(this.behaviorSignalsPath, payload);\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 this.appendStorageSecureFile(filePath, lines);\n return events.length;\n } catch (err) {\n if (err instanceof SecureStoreLockedError) throw err;\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\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 this.readStorageSecureFile(filePath);\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 (err) {\n if (err instanceof SecureStoreLockedError) throw err;\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\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 this.readStorageSecureFile(this.behaviorSignalsPath);\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 (err) {\n if (err instanceof SecureStoreLockedError) throw err;\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\n return [];\n }\n }\n\n async readMemoryActionEvents(limit: number = 200): Promise<MemoryActionEvent[]> {\n return (await this.readMemoryActionEventRows(limit)).map((row) => row.event);\n }\n\n async readMemoryActionEventRows(limit: number = 200): Promise<Array<{ line: number; event: MemoryActionEvent }>> {\n const cappedLimit = Math.max(0, Math.floor(limit));\n if (cappedLimit === 0) return [];\n\n try {\n const raw = await this.readStorageSecureFile(this.memoryActionsPath);\n const out: Array<{ line: number; event: 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 const outcome = parsed.outcome === \"applied\" || parsed.outcome === \"skipped\" || parsed.outcome === \"failed\"\n ? parsed.outcome\n : null;\n if (\n typeof parsed.timestamp === \"string\" &&\n typeof parsed.action === \"string\" &&\n outcome !== null\n ) {\n out.push({\n line: i + 1,\n event: {\n ...parsed,\n outcome,\n } as MemoryActionEvent,\n });\n }\n } catch {\n // Ignore malformed rows (fail-open).\n }\n }\n return out.reverse();\n } catch (err) {\n if (err instanceof SecureStoreLockedError) throw err;\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\n return [];\n }\n }\n\n async readAllMemoryLifecycleEvents(): Promise<MemoryLifecycleEvent[]> {\n try {\n const raw = await this.readStorageSecureFile(this.memoryLifecycleLedgerPath);\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 (err) {\n if (err instanceof SecureStoreLockedError) throw err;\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\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 this.writeStorageSecureFile(this.compressionGuidelinesPath, content);\n }\n\n async readCompressionGuidelines(): Promise<string | null> {\n try {\n return await this.readStorageSecureFile(this.compressionGuidelinesPath);\n } catch (err) {\n if (err instanceof SecureStoreLockedError) throw err;\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\n return null;\n }\n }\n\n async writeCompressionGuidelineDraft(content: string): Promise<void> {\n await this.ensureDirectories();\n await this.writeStorageSecureFile(this.compressionGuidelineDraftPath, content);\n }\n\n async readCompressionGuidelineDraft(): Promise<string | null> {\n try {\n return await this.readStorageSecureFile(this.compressionGuidelineDraftPath);\n } catch (err) {\n if (err instanceof SecureStoreLockedError) throw err;\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\n return null;\n }\n }\n\n async writeCompressionGuidelineOptimizerState(\n state: CompressionGuidelineOptimizerState,\n ): Promise<void> {\n await this.ensureDirectories();\n await this.writeStorageSecureFile(this.compressionGuidelineStatePath, `${JSON.stringify(state, null, 2)}\\n`);\n }\n\n async writeCompressionGuidelineDraftState(\n state: CompressionGuidelineOptimizerState,\n ): Promise<void> {\n await this.ensureDirectories();\n await this.writeStorageSecureFile(this.compressionGuidelineDraftStatePath, `${JSON.stringify(state, null, 2)}\\n`);\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 this.readStorageSecureFile(filePath);\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 (err) {\n if (err instanceof SecureStoreLockedError) throw err;\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\n return null;\n }\n }\n\n async writeIdentityAnchor(content: string): Promise<void> {\n await this.ensureDirectories();\n await this.writeStorageSecureFile(this.identityAnchorPath, content);\n }\n\n async readIdentityAnchor(): Promise<string | null> {\n try {\n return await this.readStorageSecureFile(this.identityAnchorPath);\n } catch (err) {\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\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 this.writeStorageSecureFile(filePath, serializeContinuityIncident(incident));\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 this.readStorageSecureFile(filePath);\n const parsed = parseContinuityIncident(raw);\n if (!parsed) continue;\n if (state !== \"all\" && parsed.state !== state) continue;\n incidents.push({ ...parsed, filePath });\n } catch (err) {\n if (err instanceof SecureStoreLockedError) throw err;\n // Fail-open on malformed/missing files.\n }\n }\n return incidents;\n } catch (err) {\n if (err instanceof SecureStoreLockedError) throw err;\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\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 this.writeStorageSecureFile(directFilePath, serializeContinuityIncident(closed));\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 this.writeStorageSecureFile(filePath, content);\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 this.readStorageSecureFile(path.join(dir, `${safeKey}.md`));\n } catch (err) {\n if (err instanceof Error && err.message === \"Invalid identity audit key\") return null;\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\n return null;\n }\n }\n\n async writeIdentityImprovementLoops(content: string): Promise<void> {\n await this.ensureDirectories();\n await this.writeStorageSecureFile(this.identityImprovementLoopsPath, content);\n }\n\n async readIdentityImprovementLoops(): Promise<string | null> {\n try {\n return await this.readStorageSecureFile(this.identityImprovementLoopsPath);\n } catch (err) {\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\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 this.readStorageSecureFile(filePath);\n const parsed = parseContinuityIncident(raw);\n return parsed ? { ...parsed, filePath } : null;\n } catch (err) {\n if (err instanceof SecureStoreLockedError) throw err;\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 readMaybeEncryptedFile(filePath, this._secureStoreKey, this.baseDir);\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 this.readStorageSecureFile(this.identityReflectionsPath);\n } catch (err) {\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\n return null;\n }\n }\n\n async writeIdentityReflections(content: string): Promise<void> {\n await mkdir(this.identityDir, { recursive: true });\n await this.writeStorageSecureFile(this.identityReflectionsPath, content);\n }\n\n async appendIdentityReflection(reflection: string): Promise<void> {\n let existing = \"\";\n try {\n existing = await this.readStorageSecureFile(this.identityReflectionsPath);\n } catch (err) {\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\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 this.writeStorageSecureFile(this.identityReflectionsPath, `${existing.trimEnd()}${section}`);\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 this.readStorageSecureFile(filePath);\n entity = parseEntityFile(content, this.entitySchemas);\n } catch (err) {\n if (err instanceof SecureStoreLockedError) throw err;\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\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 this.writeStorageSecureFile(filePath, serializeEntityFile(entity, this.entitySchemas));\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 this.readStorageSecureFile(filePath);\n entity = parseEntityFile(content, this.entitySchemas);\n } catch (err) {\n if (err instanceof SecureStoreLockedError) throw err;\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\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 this.writeStorageSecureFile(filePath, serializeEntityFile(entity, this.entitySchemas));\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 this.readStorageSecureFile(filePath);\n entity = parseEntityFile(content, this.entitySchemas);\n } catch (err) {\n if (err instanceof SecureStoreLockedError) throw err;\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\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 this.writeStorageSecureFile(filePath, serializeEntityFile(entity, this.entitySchemas));\n this.invalidateKnowledgeIndexCache();\n }\n\n /**\n * Set or rewrite the synthesis layer of an entity file.\n */\n async updateEntitySynthesis(\n name: string,\n synthesis: string,\n options: {\n entityUpdatedAt?: string;\n synthesisStructuredFactCount?: number;\n synthesisStructuredFactDigest?: string;\n synthesisTimelineCount?: number;\n updatedAt?: string;\n incrementVersion?: boolean;\n } = {},\n ): Promise<void> {\n const filePath = path.join(this.entitiesDir, `${name}.md`);\n let entity: EntityFile;\n try {\n const content = await this.readStorageSecureFile(filePath);\n entity = parseEntityFile(content, this.entitySchemas);\n } catch (err) {\n if (err instanceof SecureStoreLockedError) throw err;\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\n log.debug(`updateEntitySynthesis: entity file ${name}.md not found`);\n return;\n }\n\n const updatedAt = options.updatedAt?.trim() || entity.synthesisUpdatedAt?.trim() || undefined;\n const entityUpdatedAt = options.entityUpdatedAt?.trim() || updatedAt || entity.updated || new Date().toISOString();\n const synthesisTimelineCount = Number.isInteger(options.synthesisTimelineCount)\n && (options.synthesisTimelineCount ?? 0) >= 0\n ? options.synthesisTimelineCount\n : undefined;\n const synthesisStructuredFactCount = Number.isInteger(options.synthesisStructuredFactCount)\n && (options.synthesisStructuredFactCount ?? 0) >= 0\n ? options.synthesisStructuredFactCount\n : countEntityStructuredFacts(entity);\n const synthesisStructuredFactDigest = options.synthesisStructuredFactDigest?.trim()\n || fingerprintEntityStructuredFacts(entity);\n entity.synthesis = synthesis.trim();\n entity.summary = entity.synthesis;\n entity.synthesisUpdatedAt = updatedAt;\n entity.synthesisTimelineCount = synthesisTimelineCount;\n entity.synthesisStructuredFactCount = synthesisStructuredFactCount;\n entity.synthesisStructuredFactDigest = synthesisStructuredFactDigest;\n entity.synthesisVersion = Math.max(0, entity.synthesisVersion ?? 0)\n + (options.incrementVersion === false ? 0 : 1);\n entity.updated = entityUpdatedAt;\n await this.writeStorageSecureFile(filePath, serializeEntityFile(entity, this.entitySchemas));\n await this.removeEntitySynthesisQueueEntries([\n ...new Set([name, normalizeEntityName(entity.name, entity.type)]),\n ]);\n this.invalidateKnowledgeIndexCache();\n this.bumpMemoryStatusVersion(); // invalidate entity cache\n }\n\n /**\n * Backward-compatible alias for legacy callers/tests.\n */\n async updateEntitySummary(name: string, summary: string): Promise<void> {\n const updatedAt = new Date().toISOString();\n let synthesisTimelineCount: number | undefined;\n try {\n const filePath = path.join(this.entitiesDir, `${name}.md`);\n const content = await this.readStorageSecureFile(filePath);\n synthesisTimelineCount = parseEntityFile(content, this.entitySchemas).timeline.length;\n } catch (err) {\n if (err instanceof SecureStoreLockedError) throw err;\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\n synthesisTimelineCount = undefined;\n }\n await this.updateEntitySynthesis(name, summary, {\n entityUpdatedAt: updatedAt,\n synthesisTimelineCount,\n updatedAt,\n });\n }\n\n async readEntitySynthesisQueue(): Promise<string[]> {\n try {\n const raw = await this.readStorageSecureFile(this.entitySynthesisQueuePath);\n const parsed = JSON.parse(raw) as { entityNames?: unknown };\n return Array.isArray(parsed.entityNames)\n ? parsed.entityNames.filter((value): value is string => typeof value === \"string\")\n : [];\n } catch (err) {\n if (err instanceof SecureStoreLockedError) throw err;\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\n return [];\n }\n }\n\n async refreshEntitySynthesisQueue(): Promise<string[]> {\n const entityNames = await this.listEntityNames();\n const entityQueueEntries = await Promise.all(\n entityNames.map(async (entityName) => {\n const raw = await this.readEntity(entityName);\n if (!raw) return null;\n return {\n entityName,\n entity: parseEntityFile(raw, this.entitySchemas),\n };\n }),\n );\n const staleEntityNames = entityQueueEntries\n .filter((entry): entry is { entityName: string; entity: EntityFile } => entry !== null)\n .filter(({ entity }) => isEntitySynthesisStale(entity))\n .sort((left, right) => {\n const leftTs = latestEntityTimelineTimestamp(left.entity) ?? \"\";\n const rightTs = latestEntityTimelineTimestamp(right.entity) ?? \"\";\n return compareEntityTimestamps(rightTs, leftTs);\n })\n .map(({ entityName }) => entityName);\n\n await mkdir(this.stateDir, { recursive: true });\n await this.writeStorageSecureFile(\n this.entitySynthesisQueuePath,\n JSON.stringify(\n {\n updatedAt: new Date().toISOString(),\n entityNames: staleEntityNames,\n },\n null,\n 2,\n ) + \"\\n\",\n );\n return staleEntityNames;\n }\n\n async removeEntitySynthesisQueueEntries(entityNames: string[]): Promise<void> {\n if (entityNames.length === 0) return;\n const queue = await this.readEntitySynthesisQueue();\n if (queue.length === 0) return;\n const removals = new Set(entityNames);\n const nextQueue = queue.filter((name) => !removals.has(name));\n await mkdir(this.stateDir, { recursive: true });\n await this.writeStorageSecureFile(\n this.entitySynthesisQueuePath,\n JSON.stringify(\n {\n updatedAt: new Date().toISOString(),\n entityNames: nextQueue,\n },\n null,\n 2,\n ) + \"\\n\",\n );\n }\n\n async migrateEntityFilesToCompiledTruthTimeline(): Promise<{\n total: number;\n migrated: number;\n }> {\n const entityNames = await this.listEntityNames();\n let migrated = 0;\n for (const entityName of entityNames) {\n const raw = await this.readEntity(entityName);\n if (!raw) continue;\n const serialized = serializeEntityFile(parseEntityFile(raw, this.entitySchemas), this.entitySchemas);\n if (raw.trimEnd() === serialized.trimEnd()) continue;\n await this.writeStorageSecureFile(path.join(this.entitiesDir, `${entityName}.md`), serialized);\n migrated += 1;\n }\n if (migrated > 0) {\n this.invalidateKnowledgeIndexCache();\n this.bumpMemoryStatusVersion();\n }\n return {\n total: entityNames.length,\n migrated,\n };\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 schemaCacheKey = buildEntitySchemaCacheKey(this.entitySchemas);\n const cacheKey = `${this.getEntityCacheSecureStoreKey()}\\u0000${schemaCacheKey}`;\n const cached = getCachedEntities(this.baseDir, currentVersion, cacheKey);\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(async (entry) => {\n try {\n return await this.readStorageSecureFile(path.join(this.entitiesDir, entry));\n } catch (err) {\n if (err instanceof SecureStoreLockedError) throw err;\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\n return null;\n }\n }),\n );\n for (const content of results) {\n if (content !== null) entities.push(parseEntityFile(content, this.entitySchemas));\n }\n }\n\n setCachedEntities(this.baseDir, entities, currentVersion, cacheKey);\n return entities;\n } catch (err) {\n if (err instanceof SecureStoreLockedError || !isErrnoCode(err, \"ENOENT\")) throw err;\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.synthesis ?? 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 created: \"\",\n updated: \"\",\n extraFrontmatterLines: [],\n preSectionLines: [],\n facts: [],\n summary: undefined,\n synthesis: undefined,\n synthesisUpdatedAt: undefined,\n synthesisTimelineCount: undefined,\n synthesisStructuredFactCount: undefined,\n synthesisStructuredFactDigest: undefined,\n synthesisVersion: undefined,\n timeline: [],\n relationships: [],\n activity: [],\n aliases: [],\n structuredSections: [],\n extraSections: [],\n };\n\n for (const file of files) {\n const filePath = path.join(this.entitiesDir, file);\n try {\n const content = await this.readStorageSecureFile(filePath);\n const parsed = parseEntityFile(content, this.entitySchemas);\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 || compareEntityTimestamps(parsed.updated, mergedEntity.updated) > 0) {\n mergedEntity.updated = parsed.updated;\n }\n\n const parsedCreated = parsed.created || parsed.updated;\n const mergedCreated = mergedEntity.created?.trim() || \"\";\n const parsedCreatedMs = parsedCreated ? Date.parse(parsedCreated) : Number.NaN;\n const mergedCreatedMs = mergedCreated ? Date.parse(mergedCreated) : Number.NaN;\n const parsedCreatedIsValid = Number.isFinite(parsedCreatedMs);\n const mergedCreatedIsValid = Number.isFinite(mergedCreatedMs);\n if (\n parsedCreated &&\n (\n !mergedCreated\n || (parsedCreatedIsValid && !mergedCreatedIsValid)\n || (\n parsedCreatedIsValid\n && mergedCreatedIsValid\n && parsedCreatedMs < mergedCreatedMs\n )\n || (\n !parsedCreatedIsValid\n && !mergedCreatedIsValid\n && compareEntityTimestamps(parsedCreated, mergedCreated) < 0\n )\n )\n ) {\n mergedEntity.created = parsedCreated;\n }\n\n // Keep longest/best name\n if (parsed.name.length > mergedEntity.name.length) {\n mergedEntity.name = parsed.name;\n }\n\n const parsedSynthesisUpdatedAt = parsed.synthesisUpdatedAt?.trim() || undefined;\n const mergedSynthesisUpdatedAt = mergedEntity.synthesisUpdatedAt?.trim() || undefined;\n\n // Prefer the freshest synthesis/summary available.\n if (\n parsed.synthesis &&\n (!mergedEntity.synthesis\n || (!mergedSynthesisUpdatedAt && Boolean(parsedSynthesisUpdatedAt))\n || (Boolean(mergedSynthesisUpdatedAt)\n && Boolean(parsedSynthesisUpdatedAt)\n && compareEntityTimestamps(parsedSynthesisUpdatedAt, mergedSynthesisUpdatedAt) > 0))\n ) {\n mergedEntity.synthesis = parsed.synthesis;\n mergedEntity.summary = parsed.synthesis;\n mergedEntity.synthesisUpdatedAt = parsedSynthesisUpdatedAt;\n mergedEntity.synthesisTimelineCount = parsed.synthesisTimelineCount;\n mergedEntity.synthesisStructuredFactCount = parsed.synthesisStructuredFactCount;\n mergedEntity.synthesisStructuredFactDigest = parsed.synthesisStructuredFactDigest;\n mergedEntity.synthesisVersion = parsed.synthesisVersion;\n } else if (!mergedEntity.summary && parsed.summary) {\n mergedEntity.summary = parsed.summary;\n mergedEntity.synthesis = parsed.summary;\n mergedEntity.synthesisUpdatedAt = parsedSynthesisUpdatedAt;\n mergedEntity.synthesisTimelineCount = parsed.synthesisTimelineCount;\n mergedEntity.synthesisStructuredFactCount = parsed.synthesisStructuredFactCount;\n mergedEntity.synthesisStructuredFactDigest = parsed.synthesisStructuredFactDigest;\n mergedEntity.synthesisVersion = parsed.synthesisVersion;\n }\n\n // Collect all timeline evidence; facts are derived below.\n mergedEntity.timeline.push(...parsed.timeline);\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\n const mergedStructuredSectionMap = new Map(\n (mergedEntity.structuredSections ?? []).map((section) => [section.key, {\n ...section,\n facts: [...section.facts],\n }]),\n );\n for (const section of parsed.structuredSections ?? []) {\n const existingSection = mergedStructuredSectionMap.get(section.key);\n if (!existingSection) {\n mergedStructuredSectionMap.set(section.key, {\n key: section.key,\n title: section.title,\n facts: [...new Set(section.facts.map((fact) => fact.trim()).filter((fact) => fact.length > 0))],\n });\n continue;\n }\n\n const mergedFacts = new Set(existingSection.facts.map((fact) => fact.trim()));\n for (const fact of section.facts) {\n const trimmed = fact.trim();\n if (!trimmed) continue;\n mergedFacts.add(trimmed);\n }\n existingSection.facts = Array.from(mergedFacts);\n if (!existingSection.title.trim() && section.title.trim()) {\n existingSection.title = section.title;\n }\n }\n mergedEntity.structuredSections = Array.from(mergedStructuredSectionMap.values());\n\n // Preserve custom metadata and user-authored freeform content from fragments.\n mergedEntity.extraFrontmatterLines!.push(...(parsed.extraFrontmatterLines ?? []));\n mergedEntity.preSectionLines!.push(...(parsed.preSectionLines ?? []));\n mergedEntity.extraSections!.push(...(parsed.extraSections ?? []).map((section) => ({\n title: section.title,\n lines: [...section.lines],\n })));\n } catch (err) {\n if (err instanceof SecureStoreLockedError) throw err;\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\n // Skip unreadable\n }\n }\n\n // Deduplicate timeline entries and derive facts from the timeline.\n const timelineKeys = new Set<string>();\n mergedEntity.timeline = mergedEntity.timeline.filter((entry) => {\n const key = JSON.stringify([\n entry.timestamp,\n entry.source ?? \"\",\n entry.sessionKey ?? \"\",\n entry.principal ?? \"\",\n entry.text,\n ]);\n if (timelineKeys.has(key)) return false;\n timelineKeys.add(key);\n return true;\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 mergedEntity.structuredSections = sortStructuredSectionsBySchema(\n mergedEntity.type,\n mergedEntity.structuredSections ?? [],\n this.entitySchemas,\n );\n mergedEntity.facts = compileEntityFacts(mergedEntity.timeline, mergedEntity.structuredSections);\n\n const extraSectionKeys = new Set<string>();\n mergedEntity.extraSections = (mergedEntity.extraSections ?? []).filter((section) => {\n const key = `${section.title}::${section.lines.join(\"\\n\")}`;\n if (extraSectionKeys.has(key)) return false;\n extraSectionKeys.add(key);\n return true;\n });\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.created = mergedEntity.created || mergedEntity.updated || new Date().toISOString();\n mergedEntity.updated = mergedEntity.updated || new Date().toISOString();\n\n const canonicalPath = path.join(this.entitiesDir, `${canonical}.md`);\n await this.writeStorageSecureFile(canonicalPath, serializeEntityFile(mergedEntity, this.entitySchemas));\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 (err) {\n if (err instanceof SecureStoreLockedError || !isErrnoCode(err, \"ENOENT\")) throw err;\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 this.writeStorageSecureFile(memory.path, fileContent);\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 /**\n * Check which of the given memory IDs actually exist on disk.\n *\n * Uses a lightweight directory scan (collectActiveMemoryPaths) that reads\n * file names without parsing frontmatter — much cheaper than readAllMemories()\n * for simple existence checks like citation usage tracking.\n *\n * Returns the subset of `ids` that correspond to real memory files.\n */\n async filterExistingMemoryIds(ids: string[]): Promise<Set<string>> {\n if (ids.length === 0) return new Set();\n const wantedIds = new Set(ids);\n const filePaths = await this.collectActiveMemoryPaths();\n const foundIds = new Set<string>();\n for (const filePath of filePaths) {\n const basename = path.basename(filePath, \".md\");\n if (wantedIds.has(basename)) {\n foundIds.add(basename);\n // Short-circuit once all requested IDs are found.\n if (foundIds.size === wantedIds.size) break;\n }\n }\n return foundIds;\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 validAt?: 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 = `${parentId}-chunk-${chunkIndex}`;\n const conf = options.confidence ?? 0.8;\n const tier = confidenceTier(conf);\n const validAt = normalizeMemoryWriteTimestamp(\"validAt\", options.validAt);\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 valid_at: validAt,\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 if (category === \"procedure\") {\n await mkdir(path.join(this.proceduresDir, today), { recursive: true });\n filePath = path.join(this.proceduresDir, today, `${id}.md`);\n } else if (category === \"reasoning_trace\") {\n // Issue #564 PR 3: chunks of a reasoning_trace memory live alongside the\n // parent in reasoning-traces/<date>/.\n await mkdir(path.join(this.reasoningTracesDir, today), { recursive: true });\n filePath = path.join(this.reasoningTracesDir, today, `${id}.md`);\n } else {\n filePath = path.join(this.factsDir, today, `${id}.md`);\n }\n\n await this.writeStorageSecureFile(filePath, fileContent);\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 writeMaybeEncryptedFile(oldMemory.path, fileContent, this.resolveWriteKey(), {}, this.baseDir);\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 this.writeStorageSecureFile(filePath, JSON.stringify(summary, null, 2));\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 this.readStorageSecureFile(filePath);\n summaries.push(JSON.parse(raw) as MemorySummary);\n }\n\n return summaries;\n } catch (err) {\n if (err instanceof SecureStoreLockedError) throw err;\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\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 this.writeStorageSecureFile(memory.path, fileContent);\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 this.writeStorageSecureFile(metaPath, JSON.stringify({ topics, updatedAt: new Date().toISOString() }, null, 2));\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 this.readStorageSecureFile(metaPath);\n return JSON.parse(raw) as { topics: TopicScore[]; updatedAt: string | null };\n } catch (err) {\n if (err instanceof SecureStoreLockedError) throw err;\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\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","// ---------------------------------------------------------------------------\n// Shared ISO-8601 / RFC 3339 timestamp validation helpers.\n//\n// Two public entry points — a strict UTC-only parser used by the replay\n// pipeline, and a more permissive parser used by bulk-import adapters that\n// need to preserve source timezone offsets. Both share date-component,\n// offset-range, and round-trip validation so they cannot silently diverge.\n// ---------------------------------------------------------------------------\n\n// UTC-only: `...Z`, 0 or 3 fractional digits (replay canonical form).\nconst ISO_UTC_TIMESTAMP_RE =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{3})?Z$/;\n\n// Lenient: variable-precision fractional seconds and `Z` or `[+-]HH:MM` offset.\nconst ISO_OFFSET_TIMESTAMP_RE =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:\\d{2})$/;\n\nconst FLEXIBLE_ISO_TIMESTAMP_RE =\n /^(\\d{4})-(\\d{2})-(\\d{2})(?:[Tt](\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.\\d{1,9})?)?(?:[Zz]|([+-])(\\d{2}):(\\d{2}))?)?$/;\n\nfunction isoDaysInMonth(year: number, month: number): number {\n const leap = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n return [31, leap ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month - 1] ?? 0;\n}\n\n/**\n * Validate the date/time components of an ISO timestamp string.\n * Catches overflowed dates like Feb 31 that `Date.parse` silently normalizes.\n */\nfunction validateDateComponents(isoString: string): boolean {\n const match = isoString.match(\n /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})/,\n );\n if (!match) return false;\n const [, yStr, mStr, dStr, hStr, minStr, sStr] = match;\n const y = Number(yStr);\n const m = Number(mStr);\n const d = Number(dStr);\n const h = Number(hStr);\n const min = Number(minStr);\n const s = Number(sStr);\n if (m < 1 || m > 12) return false;\n if (d < 1 || d > 31) return false;\n if (h > 23 || min > 59 || s > 59) return false;\n if (d > isoDaysInMonth(y, m)) return false;\n return true;\n}\n\n/**\n * Validate the timezone offset range if present.\n * Max offset is +/-14:00 per ISO 8601; minute part must be 0-59.\n */\nfunction validateOffset(isoString: string): boolean {\n const offsetMatch = isoString.match(/([+-])(\\d{2}):(\\d{2})$/);\n if (!offsetMatch) return true; // `Z` form, no offset to validate.\n const oh = Number(offsetMatch[2]);\n const om = Number(offsetMatch[3]);\n if (oh > 14 || om > 59) return false;\n // +14:00 is max; offsets like +14:30 are invalid.\n if (oh === 14 && om > 0) return false;\n return true;\n}\n\n/**\n * Normalize a `Z`-suffixed ISO timestamp to exactly three fractional digits so\n * the round-trip comparison against `Date.prototype.toISOString()` succeeds\n * regardless of input precision (or absence of a fractional part).\n */\nfunction normalizeUtcForComparison(value: string): string {\n const fracMatch = value.match(/\\.(\\d+)Z$/);\n if (fracMatch) {\n const ms = (fracMatch[1] + \"000\").slice(0, 3);\n return value.replace(/\\.\\d+Z$/, `.${ms}Z`);\n }\n return value.replace(/Z$/, \".000Z\");\n}\n\n/**\n * Strict UTC-only parser — accepts `YYYY-MM-DDTHH:MM:SS[.sss]Z`.\n * Returns milliseconds since epoch, or `null` if invalid.\n */\nexport function parseIsoUtcTimestamp(value: string): number | null {\n if (typeof value !== \"string\" || !ISO_UTC_TIMESTAMP_RE.test(value)) {\n return null;\n }\n const ts = Date.parse(value);\n if (!Number.isFinite(ts)) return null;\n if (!validateDateComponents(value)) return null;\n const roundTrip = new Date(ts).toISOString();\n if (roundTrip !== normalizeUtcForComparison(value)) return null;\n return ts;\n}\n\n/**\n * Lenient parser — accepts variable-precision fractional seconds and either\n * a `Z` suffix or a `[+-]HH:MM` offset. Returns milliseconds since epoch, or\n * `null` if the string is not a well-formed RFC 3339 timestamp.\n */\nexport function parseIsoOffsetTimestamp(value: string): number | null {\n if (typeof value !== \"string\" || !ISO_OFFSET_TIMESTAMP_RE.test(value)) {\n return null;\n }\n const ts = Date.parse(value);\n if (!Number.isFinite(ts)) return null;\n if (!validateDateComponents(value)) return null;\n if (!validateOffset(value)) return null;\n // For UTC timestamps (ending in `Z`), verify with a round-trip so that\n // overflowed UTC calendar dates cannot slip through.\n if (value.endsWith(\"Z\")) {\n const roundTrip = new Date(ts).toISOString();\n if (roundTrip !== normalizeUtcForComparison(value)) return null;\n }\n return ts;\n}\n\n/**\n * Benchmark/adapter parser — accepts ISO date-only values plus reduced\n * precision date-times used by public benchmark fixtures. Returns milliseconds\n * since epoch, or `null` if invalid.\n */\nexport function parseFlexibleIsoTimestamp(value: string): number | null {\n const match = typeof value === \"string\"\n ? value.match(FLEXIBLE_ISO_TIMESTAMP_RE)\n : null;\n if (!match) {\n return null;\n }\n\n const year = Number(match[1]);\n const month = Number(match[2]);\n const day = Number(match[3]);\n const hour = match[4] === undefined ? 0 : Number(match[4]);\n const minute = match[5] === undefined ? 0 : Number(match[5]);\n const second = match[6] === undefined ? 0 : Number(match[6]);\n const offsetHour = match[8] === undefined ? undefined : Number(match[8]);\n const offsetMinute = match[9] === undefined ? undefined : Number(match[9]);\n const hasTime = match[4] !== undefined;\n const hasOffset = offsetHour !== undefined && offsetMinute !== undefined;\n const hasTimezone = /(?:[Zz]|[+-]\\d{2}:\\d{2})$/.test(value);\n\n if (\n month < 1 ||\n month > 12 ||\n day < 1 ||\n day > isoDaysInMonth(year, month) ||\n (hasTime && !hasTimezone)\n ) {\n return null;\n }\n if (hasTime && (hour > 23 || minute > 59 || second > 59)) {\n return null;\n }\n if (\n hasOffset &&\n (offsetMinute > 59 ||\n offsetHour > 14 ||\n (offsetHour === 14 && offsetMinute > 0))\n ) {\n return null;\n }\n\n const ts = Date.parse(value);\n return Number.isFinite(ts) ? ts : null;\n}\n"],"mappings":"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","names":["i","match","existing","q"]}
|