@remnic/core 9.3.718 → 9.3.720

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (323) hide show
  1. package/dist/access-boundary.d.ts +10 -7
  2. package/dist/access-boundary.js +18 -17
  3. package/dist/access-cli.js +39 -37
  4. package/dist/access-cli.js.map +1 -1
  5. package/dist/access-http.d.ts +11 -8
  6. package/dist/access-http.js +25 -24
  7. package/dist/access-mcp.d.ts +11 -8
  8. package/dist/access-mcp.js +21 -20
  9. package/dist/access-operations-batch.js +19 -18
  10. package/dist/access-operations.d.ts +11 -8
  11. package/dist/access-operations.js +20 -19
  12. package/dist/access-schema.d.ts +19 -19
  13. package/dist/{access-service-CZbnt0t2.d.ts → access-service-Dw-tK1pa.d.ts} +3 -3
  14. package/dist/access-service.d.ts +11 -8
  15. package/dist/access-service.js +17 -16
  16. package/dist/access-surface-catalog.d.ts +10 -7
  17. package/dist/action-confidence.d.ts +1 -1
  18. package/dist/active-memory-bridge.d.ts +1 -1
  19. package/dist/active-recall.d.ts +1 -1
  20. package/dist/active-recall.js +1 -1
  21. package/dist/adapters/index.js +7 -7
  22. package/dist/adapters/registry.js +3 -3
  23. package/dist/behavior-learner.d.ts +1 -1
  24. package/dist/behavior-signals.d.ts +1 -1
  25. package/dist/bootstrap.d.ts +11 -8
  26. package/dist/briefing.d.ts +1 -1
  27. package/dist/briefing.js +4 -4
  28. package/dist/buffer-surprise-report.d.ts +1 -1
  29. package/dist/buffer.d.ts +1 -1
  30. package/dist/calibration.d.ts +1 -1
  31. package/dist/capabilities.d.ts +30 -2
  32. package/dist/capabilities.js +3 -1
  33. package/dist/{catalog-CEYlMs9X.d.ts → catalog-B9SPfcsE.d.ts} +1 -1
  34. package/dist/causal-behavior.d.ts +1 -1
  35. package/dist/causal-behavior.js +2 -2
  36. package/dist/causal-chain.js +2 -2
  37. package/dist/causal-consolidation.d.ts +1 -1
  38. package/dist/causal-consolidation.js +7 -7
  39. package/dist/causal-retrieval.js +2 -2
  40. package/dist/causal-trajectory-graph.d.ts +4 -0
  41. package/dist/causal-trajectory-graph.js +1 -1
  42. package/dist/causal-trajectory.js +1 -1
  43. package/dist/{chunk-7EEVXW7X.js → chunk-2RBMGTK4.js} +2 -2
  44. package/dist/{chunk-L5ASZA2F.js → chunk-3XEGHEQ2.js} +17 -2
  45. package/dist/chunk-3XEGHEQ2.js.map +1 -0
  46. package/dist/{chunk-YYOK4GVF.js → chunk-422TIKIH.js} +3 -3
  47. package/dist/{chunk-KRGC4EDX.js → chunk-5YQN2XYC.js} +2 -2
  48. package/dist/{chunk-ANI5DUAE.js → chunk-6S5ZI7HB.js} +7 -7
  49. package/dist/{chunk-JIZGYQYH.js → chunk-ATGRQ2NE.js} +4 -4
  50. package/dist/chunk-BCDKBDSY.js +173 -0
  51. package/dist/chunk-BCDKBDSY.js.map +1 -0
  52. package/dist/{chunk-P5IPFZVH.js → chunk-BGQ7WKMT.js} +5 -5
  53. package/dist/{chunk-JAKYZGV4.js → chunk-CYJV5AYC.js} +3 -3
  54. package/dist/{chunk-APUJIMDM.js → chunk-DG3ORVCU.js} +2 -2
  55. package/dist/{chunk-PBH4JUAB.js → chunk-DVRHLN2O.js} +18 -3
  56. package/dist/chunk-DVRHLN2O.js.map +1 -0
  57. package/dist/{chunk-S35FX6MU.js → chunk-H2AGJ5SV.js} +2 -2
  58. package/dist/{chunk-A66YRSOS.js → chunk-HAPVZ4CO.js} +2 -2
  59. package/dist/{chunk-4KZGLDJJ.js → chunk-HHSO6VCQ.js} +2 -2
  60. package/dist/{chunk-2VHMVWPU.js → chunk-HTIL3EJK.js} +2 -2
  61. package/dist/{chunk-UCJ5CDTK.js → chunk-HU4EBIXO.js} +22 -14
  62. package/dist/chunk-HU4EBIXO.js.map +1 -0
  63. package/dist/{chunk-CTOQEZSN.js → chunk-IPJD7WJH.js} +2 -2
  64. package/dist/{chunk-DIFU33GU.js → chunk-JV7Q226R.js} +2 -2
  65. package/dist/{chunk-U5H7WHTS.js → chunk-KNN6DAZQ.js} +4 -4
  66. package/dist/{chunk-3JJWNZTT.js → chunk-L2B3EE7B.js} +102 -42
  67. package/dist/chunk-L2B3EE7B.js.map +1 -0
  68. package/dist/{chunk-5RHM43BJ.js → chunk-LLLG5PTE.js} +3 -3
  69. package/dist/{chunk-F3PVXKHP.js → chunk-M3GBOKUX.js} +22 -16
  70. package/dist/chunk-M3GBOKUX.js.map +1 -0
  71. package/dist/{chunk-2PTBLS2S.js → chunk-NBYXOEO7.js} +2 -2
  72. package/dist/{chunk-URM3HW2R.js → chunk-NE5WFIY6.js} +2 -2
  73. package/dist/{chunk-REWQAFSA.js → chunk-NERBFQNY.js} +2 -2
  74. package/dist/{chunk-773DPI6T.js → chunk-NO4DWSQE.js} +10 -10
  75. package/dist/{chunk-OZ2KQ7HF.js → chunk-O6SEGJNV.js} +2 -2
  76. package/dist/{chunk-IF362TF6.js → chunk-PMBWVQ7D.js} +2 -2
  77. package/dist/chunk-PMBWVQ7D.js.map +1 -0
  78. package/dist/{chunk-OJU73BUX.js → chunk-PPVCZPYA.js} +2 -2
  79. package/dist/{chunk-S3OPGGZB.js → chunk-RIW3UDDY.js} +2 -2
  80. package/dist/{chunk-AU7Q3LSC.js → chunk-RKNJBZ55.js} +7 -7
  81. package/dist/{chunk-EH27LHML.js → chunk-RX7EBFFJ.js} +2 -2
  82. package/dist/{chunk-2COL35PK.js → chunk-T3XSXAWK.js} +2 -2
  83. package/dist/{chunk-2KAYTPPT.js → chunk-UUMYB3FR.js} +4 -4
  84. package/dist/{chunk-72VDBALG.js → chunk-V5EGLYXE.js} +52 -43
  85. package/dist/chunk-V5EGLYXE.js.map +1 -0
  86. package/dist/{chunk-LXSG4L55.js → chunk-V7UUIIR7.js} +2 -2
  87. package/dist/{chunk-HLIR3RJ7.js → chunk-WBHQ5LP5.js} +2 -2
  88. package/dist/{chunk-YGKUAX2B.js → chunk-XROP4ZHB.js} +8 -8
  89. package/dist/chunk-XROP4ZHB.js.map +1 -0
  90. package/dist/{chunk-NFRBADNR.js → chunk-Y4I7SOJN.js} +559 -318
  91. package/dist/chunk-Y4I7SOJN.js.map +1 -0
  92. package/dist/{chunk-YTZLBBEB.js → chunk-YMPEGBLL.js} +3 -3
  93. package/dist/chunk-YN2UN7N3.js +217 -0
  94. package/dist/chunk-YN2UN7N3.js.map +1 -0
  95. package/dist/{chunk-YI7RZO7Y.js → chunk-ZE7GJ76H.js} +1 -1
  96. package/dist/{chunk-74MYJSKB.js → chunk-ZG2WP425.js} +2 -2
  97. package/dist/{chunk-A5TUPZ3N.js → chunk-ZKUW2MJG.js} +43 -1
  98. package/dist/chunk-ZKUW2MJG.js.map +1 -0
  99. package/dist/{chunk-N3DUH6OO.js → chunk-ZW5I3UNP.js} +1 -1
  100. package/dist/chunk-ZW5I3UNP.js.map +1 -0
  101. package/dist/{cli-1orcdXOY.d.ts → cli-qcLCJlOD.d.ts} +3 -3
  102. package/dist/cli.d.ts +9 -6
  103. package/dist/cli.js +43 -42
  104. package/dist/compounding/engine.d.ts +1 -1
  105. package/dist/compounding/engine.js +4 -4
  106. package/dist/compounding/preference-consolidator.d.ts +1 -1
  107. package/dist/compression-optimizer.d.ts +1 -1
  108. package/dist/config.d.ts +1 -1
  109. package/dist/config.js +1 -1
  110. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  111. package/dist/connectors/codex-materialize-runner.js +4 -4
  112. package/dist/connectors/codex-materialize.d.ts +1 -1
  113. package/dist/connectors/index.d.ts +1 -1
  114. package/dist/connectors/index.js +4 -4
  115. package/dist/consolidation-provenance-check.d.ts +1 -1
  116. package/dist/consolidation-undo.d.ts +1 -1
  117. package/dist/contradiction/index.d.ts +1 -1
  118. package/dist/conversation-index/backend.d.ts +1 -1
  119. package/dist/conversation-index/chunker.d.ts +1 -1
  120. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  121. package/dist/conversation-index/indexer.d.ts +1 -1
  122. package/dist/conversation-index/search.d.ts +1 -1
  123. package/dist/day-summary.d.ts +1 -1
  124. package/dist/delinearize.d.ts +1 -1
  125. package/dist/direct-answer-wiring.d.ts +1 -1
  126. package/dist/direct-answer.d.ts +1 -1
  127. package/dist/embedding-fallback.d.ts +1 -1
  128. package/dist/enrichment/index.d.ts +1 -1
  129. package/dist/entity-retrieval.d.ts +1 -1
  130. package/dist/entity-retrieval.js +4 -4
  131. package/dist/entity-schema.d.ts +1 -1
  132. package/dist/explicit-capture.d.ts +11 -8
  133. package/dist/extraction-faithfulness.d.ts +1 -1
  134. package/dist/extraction-judge-telemetry.d.ts +1 -1
  135. package/dist/extraction-judge-training.d.ts +1 -1
  136. package/dist/extraction-judge.d.ts +1 -1
  137. package/dist/extraction.d.ts +1 -1
  138. package/dist/fallback-llm.d.ts +1 -1
  139. package/dist/{forget-U66KPDPY.js → forget-OEE5OELK.js} +2 -2
  140. package/dist/graph-dashboard-diff.d.ts +4 -0
  141. package/dist/graph-dashboard-key.d.ts +4 -0
  142. package/dist/graph-dashboard-parser.d.ts +4 -0
  143. package/dist/{graph-edge-decay-JLOF3YW4.js → graph-edge-decay-QDDC6AVV.js} +2 -2
  144. package/dist/graph-edge-reinforcement.d.ts +4 -0
  145. package/dist/graph-snapshot.d.ts +7 -3
  146. package/dist/graph-snapshot.js +2 -2
  147. package/dist/graph.d.ts +7 -1
  148. package/dist/graph.js +1 -1
  149. package/dist/identity-continuity.d.ts +1 -1
  150. package/dist/importance.d.ts +1 -1
  151. package/dist/index.d.ts +571 -570
  152. package/dist/index.js +57 -55
  153. package/dist/index.js.map +1 -1
  154. package/dist/intent.d.ts +1 -1
  155. package/dist/lcm/engine.d.ts +1 -1
  156. package/dist/lcm/engine.js +4 -4
  157. package/dist/lcm/index.d.ts +1 -1
  158. package/dist/lcm/index.js +8 -8
  159. package/dist/lcm/tools.d.ts +1 -1
  160. package/dist/lifecycle.d.ts +1 -1
  161. package/dist/live-connectors-runner.d.ts +1 -1
  162. package/dist/local-llm.d.ts +1 -1
  163. package/dist/maintenance/memory-governance.d.ts +1 -1
  164. package/dist/maintenance/memory-governance.js +4 -4
  165. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +4 -4
  166. package/dist/maintenance/rebuild-memory-projection.js +5 -5
  167. package/dist/mcp-memory-inspector-app.d.ts +11 -8
  168. package/dist/memory-action-policy.d.ts +1 -1
  169. package/dist/memory-cache.d.ts +1 -1
  170. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  171. package/dist/memory-projection-store.d.ts +1 -1
  172. package/dist/memory-provenance.d.ts +1 -1
  173. package/dist/memory-worth-outcomes.d.ts +1 -1
  174. package/dist/models-json.d.ts +1 -1
  175. package/dist/namespaces/migrate.d.ts +2 -2
  176. package/dist/namespaces/migrate.js +9 -9
  177. package/dist/namespaces/principal.d.ts +1 -1
  178. package/dist/namespaces/search.d.ts +1 -1
  179. package/dist/namespaces/search.js +4 -4
  180. package/dist/namespaces/storage.d.ts +2 -2
  181. package/dist/namespaces/storage.js +4 -4
  182. package/dist/native-knowledge.d.ts +1 -1
  183. package/dist/operator-toolkit.d.ts +3 -2
  184. package/dist/operator-toolkit.js +16 -15
  185. package/dist/orchestration/maintenance.d.ts +2 -2
  186. package/dist/orchestration/maintenance.js +6 -6
  187. package/dist/{orchestrator-kOxredSr.d.ts → orchestrator-Bg5Fnza6.d.ts} +178 -81
  188. package/dist/orchestrator.d.ts +8 -5
  189. package/dist/orchestrator.js +31 -29
  190. package/dist/patterns-cli.d.ts +1 -1
  191. package/dist/policy-runtime.d.ts +1 -1
  192. package/dist/provenance.d.ts +1 -1
  193. package/dist/qmd-recall-cache.d.ts +1 -1
  194. package/dist/qmd.d.ts +1 -1
  195. package/dist/recall-disclosure-escalation.d.ts +1 -1
  196. package/dist/recall-explain-renderer.d.ts +1 -1
  197. package/dist/recall-explain-renderer.js +3 -3
  198. package/dist/recall-planner-llm.d.ts +1 -1
  199. package/dist/recall-state.d.ts +1 -1
  200. package/dist/recall-tag-filter.d.ts +1 -1
  201. package/dist/recall-xray-cli.d.ts +1 -1
  202. package/dist/recall-xray-cli.js +4 -4
  203. package/dist/recall-xray-renderer.d.ts +1 -1
  204. package/dist/recall-xray-renderer.js +3 -3
  205. package/dist/recall-xray.d.ts +18 -1
  206. package/dist/recall-xray.js +2 -2
  207. package/dist/resolve-auth-token.d.ts +1 -1
  208. package/dist/resume-bundles.js +2 -2
  209. package/dist/retrieval-agents.d.ts +1 -1
  210. package/dist/retrieval-tiers.d.ts +1 -1
  211. package/dist/routing/engine.d.ts +1 -1
  212. package/dist/routing/store.d.ts +1 -1
  213. package/dist/search/embed-helper.d.ts +1 -1
  214. package/dist/search/factory.d.ts +1 -1
  215. package/dist/search/factory.js +3 -3
  216. package/dist/search/index.d.ts +1 -1
  217. package/dist/search/index.js +7 -7
  218. package/dist/search/lancedb-backend.d.ts +1 -1
  219. package/dist/search/meilisearch-backend.d.ts +1 -1
  220. package/dist/search/noop-backend.d.ts +1 -1
  221. package/dist/search/orama-backend.d.ts +1 -1
  222. package/dist/search/port.d.ts +1 -1
  223. package/dist/search/remote-backend.d.ts +1 -1
  224. package/dist/{semantic-consolidation-B58v3S-a.d.ts → semantic-consolidation-ClOiS6KP.d.ts} +1 -1
  225. package/dist/semantic-consolidation.d.ts +2 -2
  226. package/dist/semantic-consolidation.js +5 -5
  227. package/dist/semantic-rule-promotion.js +4 -4
  228. package/dist/semantic-rule-verifier.d.ts +1 -1
  229. package/dist/semantic-rule-verifier.js +4 -4
  230. package/dist/session-observer-bands.d.ts +1 -1
  231. package/dist/session-observer-state.d.ts +1 -1
  232. package/dist/shared-context/manager.d.ts +1 -1
  233. package/dist/signal.d.ts +1 -1
  234. package/dist/storage.d.ts +45 -1
  235. package/dist/storage.js +3 -3
  236. package/dist/summarizer.d.ts +1 -1
  237. package/dist/summary-snapshot.d.ts +1 -1
  238. package/dist/temporal-supersession.d.ts +1 -1
  239. package/dist/temporal-validity.d.ts +1 -1
  240. package/dist/threading.d.ts +1 -1
  241. package/dist/tier-migration.d.ts +1 -1
  242. package/dist/tier-routing.d.ts +1 -1
  243. package/dist/topics.d.ts +1 -1
  244. package/dist/transcript.d.ts +1 -1
  245. package/dist/trust-score-stage.d.ts +178 -0
  246. package/dist/trust-score-stage.js +18 -0
  247. package/dist/trust-score-stage.js.map +1 -0
  248. package/dist/trust-score.d.ts +164 -0
  249. package/dist/trust-score.js +22 -0
  250. package/dist/trust-score.js.map +1 -0
  251. package/dist/{types-ACmDOScJ.d.ts → types-BSdUWePh.d.ts} +37 -1
  252. package/dist/types.d.ts +1 -1
  253. package/dist/types.js +1 -1
  254. package/dist/utility-runtime.d.ts +1 -1
  255. package/dist/verified-recall.js +4 -4
  256. package/package.json +2 -2
  257. package/src/access-service.ts +8 -5
  258. package/src/capabilities-cluster-b.test.ts +78 -0
  259. package/src/capabilities.test.ts +11 -1
  260. package/src/capabilities.ts +58 -0
  261. package/src/cli/research-status-commands.ts +7 -3
  262. package/src/cli.ts +11 -6
  263. package/src/config.ts +51 -0
  264. package/src/graph-snapshot.ts +3 -3
  265. package/src/graph.ts +8 -7
  266. package/src/lifecycle/tombstones.test.ts +242 -1
  267. package/src/lifecycle/tombstones.ts +157 -70
  268. package/src/operator-toolkit.ts +24 -7
  269. package/src/orchestration/tier-migration-coordinator.ts +286 -0
  270. package/src/orchestrator.ts +331 -222
  271. package/src/recall-xray.test.ts +62 -0
  272. package/src/recall-xray.ts +34 -0
  273. package/src/trust-score-recall-paths.test.ts +157 -0
  274. package/src/trust-score-stage.test.ts +350 -0
  275. package/src/trust-score-stage.ts +398 -0
  276. package/src/trust-score.test.ts +282 -0
  277. package/src/trust-score.ts +449 -0
  278. package/src/types.ts +42 -0
  279. package/dist/chunk-3JJWNZTT.js.map +0 -1
  280. package/dist/chunk-72VDBALG.js.map +0 -1
  281. package/dist/chunk-A5TUPZ3N.js.map +0 -1
  282. package/dist/chunk-F3PVXKHP.js.map +0 -1
  283. package/dist/chunk-IF362TF6.js.map +0 -1
  284. package/dist/chunk-L5ASZA2F.js.map +0 -1
  285. package/dist/chunk-N3DUH6OO.js.map +0 -1
  286. package/dist/chunk-NFRBADNR.js.map +0 -1
  287. package/dist/chunk-PBH4JUAB.js.map +0 -1
  288. package/dist/chunk-UCJ5CDTK.js.map +0 -1
  289. package/dist/chunk-YGKUAX2B.js.map +0 -1
  290. /package/dist/{chunk-7EEVXW7X.js.map → chunk-2RBMGTK4.js.map} +0 -0
  291. /package/dist/{chunk-YYOK4GVF.js.map → chunk-422TIKIH.js.map} +0 -0
  292. /package/dist/{chunk-KRGC4EDX.js.map → chunk-5YQN2XYC.js.map} +0 -0
  293. /package/dist/{chunk-ANI5DUAE.js.map → chunk-6S5ZI7HB.js.map} +0 -0
  294. /package/dist/{chunk-JIZGYQYH.js.map → chunk-ATGRQ2NE.js.map} +0 -0
  295. /package/dist/{chunk-P5IPFZVH.js.map → chunk-BGQ7WKMT.js.map} +0 -0
  296. /package/dist/{chunk-JAKYZGV4.js.map → chunk-CYJV5AYC.js.map} +0 -0
  297. /package/dist/{chunk-APUJIMDM.js.map → chunk-DG3ORVCU.js.map} +0 -0
  298. /package/dist/{chunk-S35FX6MU.js.map → chunk-H2AGJ5SV.js.map} +0 -0
  299. /package/dist/{chunk-A66YRSOS.js.map → chunk-HAPVZ4CO.js.map} +0 -0
  300. /package/dist/{chunk-4KZGLDJJ.js.map → chunk-HHSO6VCQ.js.map} +0 -0
  301. /package/dist/{chunk-2VHMVWPU.js.map → chunk-HTIL3EJK.js.map} +0 -0
  302. /package/dist/{chunk-CTOQEZSN.js.map → chunk-IPJD7WJH.js.map} +0 -0
  303. /package/dist/{chunk-DIFU33GU.js.map → chunk-JV7Q226R.js.map} +0 -0
  304. /package/dist/{chunk-U5H7WHTS.js.map → chunk-KNN6DAZQ.js.map} +0 -0
  305. /package/dist/{chunk-5RHM43BJ.js.map → chunk-LLLG5PTE.js.map} +0 -0
  306. /package/dist/{chunk-2PTBLS2S.js.map → chunk-NBYXOEO7.js.map} +0 -0
  307. /package/dist/{chunk-URM3HW2R.js.map → chunk-NE5WFIY6.js.map} +0 -0
  308. /package/dist/{chunk-REWQAFSA.js.map → chunk-NERBFQNY.js.map} +0 -0
  309. /package/dist/{chunk-773DPI6T.js.map → chunk-NO4DWSQE.js.map} +0 -0
  310. /package/dist/{chunk-OZ2KQ7HF.js.map → chunk-O6SEGJNV.js.map} +0 -0
  311. /package/dist/{chunk-OJU73BUX.js.map → chunk-PPVCZPYA.js.map} +0 -0
  312. /package/dist/{chunk-S3OPGGZB.js.map → chunk-RIW3UDDY.js.map} +0 -0
  313. /package/dist/{chunk-AU7Q3LSC.js.map → chunk-RKNJBZ55.js.map} +0 -0
  314. /package/dist/{chunk-EH27LHML.js.map → chunk-RX7EBFFJ.js.map} +0 -0
  315. /package/dist/{chunk-2COL35PK.js.map → chunk-T3XSXAWK.js.map} +0 -0
  316. /package/dist/{chunk-2KAYTPPT.js.map → chunk-UUMYB3FR.js.map} +0 -0
  317. /package/dist/{chunk-LXSG4L55.js.map → chunk-V7UUIIR7.js.map} +0 -0
  318. /package/dist/{chunk-HLIR3RJ7.js.map → chunk-WBHQ5LP5.js.map} +0 -0
  319. /package/dist/{chunk-YTZLBBEB.js.map → chunk-YMPEGBLL.js.map} +0 -0
  320. /package/dist/{chunk-YI7RZO7Y.js.map → chunk-ZE7GJ76H.js.map} +0 -0
  321. /package/dist/{chunk-74MYJSKB.js.map → chunk-ZG2WP425.js.map} +0 -0
  322. /package/dist/{forget-U66KPDPY.js.map → forget-OEE5OELK.js.map} +0 -0
  323. /package/dist/{graph-edge-decay-JLOF3YW4.js.map → graph-edge-decay-QDDC6AVV.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/capabilities.ts"],"sourcesContent":["/**\n * CapabilitySet — recall-operation feature gates resolved once, then threaded.\n *\n * Issue #1523 (Phase 1 of epic #1520). Root cause this addresses: 161+\n * scattered `config.<flag>Enabled` reads mean each gate is re-derived at every\n * call site, and reviews keep finding parallel code paths where one branch\n * checks a gate the other forgot (CLAUDE.md rule 39 — the \"gate divergence\"\n * defect class). The fix is to resolve a frozen capability projection ONCE at\n * the top of the recall operation and pass it down explicitly.\n *\n * Scope of THIS module (first migration PR): only the recall-operation-scoped\n * flags below. Flags that are also read in graph construction, writes, CLI, or\n * the summarizer are deliberately deferred to a follow-up so we never leave a\n * single flag half-migrated (some sites on `caps.`, some on `config.`).\n *\n * Field naming: each field is the config flag name with the trailing `Enabled`\n * removed (`recallMmrEnabled` → `recallMmr`).\n *\n * This is plumbing, not a feature — there is deliberately NO `enabled` gate for\n * the CapabilitySet itself (rule 30 governs behavior changes; resolving and\n * threading a capability projection must stay behavior-preserving).\n */\n\nimport type { PluginConfig } from \"./types.js\";\n\n/**\n * Frozen projection of recall-operation feature gates.\n *\n * Every field is `readonly boolean`. The composition that maps a config flag to\n * a capability (including default-when-undefined semantics for optional flags)\n * lives ONLY in {@link resolveCapabilities} — call sites must read the\n * capability, never re-derive it from raw config.\n */\nexport interface CapabilitySet {\n /** `rerankCacheEnabled` — cache reranker scores across recall passes. */\n readonly rerankCache: boolean;\n /** `recallDirectAnswerEnabled` — observation-mode direct-answer tier. */\n readonly recallDirectAnswer: boolean;\n /** `recallMemoryWorthFilterEnabled` — Memory-Worth score reweighting. */\n readonly recallMemoryWorthFilter: boolean;\n /** `recallMmrEnabled` — maximal-marginal-relevance diversification. */\n readonly recallMmr: boolean;\n /** `recallReasoningTraceBoostEnabled` — boost reasoning-trace memories. */\n readonly recallReasoningTraceBoost: boolean;\n /** `recallPlannerLlmEnabled` — LLM-backed recall-mode planner. */\n readonly recallPlannerLlm: boolean;\n /** `recallPlannerEnabled` — recall-mode planner (heuristic + optional LLM). */\n readonly recallPlanner: boolean;\n /** `recallConfidenceGateEnabled` — Synapse-style confidence gate. */\n readonly recallConfidenceGate: boolean;\n /** `graphRecallEnabled` — graph-mode recall tier (gates planner graph mode). */\n readonly graphRecall: boolean;\n /** `graphAssistInFullModeEnabled` — graph-assist overlay in full mode. */\n readonly graphAssistInFullMode: boolean;\n /** `graphExpandedIntentEnabled` — promote broad-intent asks to graph mode. */\n readonly graphExpandedIntent: boolean;\n}\n\n/**\n * Resolve the recall-operation {@link CapabilitySet} from parsed config.\n *\n * Call this ONCE per recall operation (at the `recall()` / `recallInternal`\n * entry) and thread the result down. Composition lives here and only here.\n *\n * Session toggles are intentionally not a parameter yet: `session-toggles.ts`\n * is agent-scoped (per session/agent enable-disable of the whole plugin), not\n * flag-scoped — none of the flags projected here have a per-session override,\n * so there is nothing for a toggle argument to compose at this layer.\n */\nexport function resolveCapabilities(config: PluginConfig): CapabilitySet {\n return Object.freeze({\n rerankCache: config.rerankCacheEnabled,\n recallDirectAnswer: config.recallDirectAnswerEnabled,\n recallMemoryWorthFilter: config.recallMemoryWorthFilterEnabled,\n recallMmr: config.recallMmrEnabled,\n recallReasoningTraceBoost: config.recallReasoningTraceBoostEnabled,\n recallPlannerLlm: config.recallPlannerLlmEnabled,\n recallPlanner: config.recallPlannerEnabled,\n recallConfidenceGate: config.recallConfidenceGateEnabled,\n graphRecall: config.graphRecallEnabled,\n // Optional flags: preserve the exact default-when-undefined semantics the\n // migrated call sites used (`!== false` = default-on, `=== true` = default-off).\n graphAssistInFullMode: config.graphAssistInFullModeEnabled !== false,\n graphExpandedIntent: config.graphExpandedIntentEnabled === true,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Graph-construction capability set (issue #1566 Cluster A).\n//\n// The recall CapabilitySet above covers flags whose EVERY read site lives on\n// the recall call chain. The five flags below are read on graph-construction,\n// write/extraction, AND recall paths — so they cannot join the recall set\n// without leaving some sites on `caps.` and others on `config.` (the exact\n// divergence #1523 forbade). They get their own projection, resolved at graph\n// build/write entry (and alongside `caps` when recall reads them).\n// ---------------------------------------------------------------------------\n\n/**\n * Frozen projection of graph-construction feature gates.\n *\n * Every field is `readonly boolean`. Composition (including default-when-\n * undefined semantics for the optional `graphWriteSessionAdjacencyEnabled`)\n * lives ONLY in {@link resolveGraphConstructionCapabilities}.\n */\nexport interface GraphConstructionCapabilitySet {\n /** `entityGraphEnabled` — maintain entity co-reference graph edges. */\n readonly entityGraph: boolean;\n /** `timeGraphEnabled` — maintain thread-adjacency graph edges. */\n readonly timeGraph: boolean;\n /** `causalGraphEnabled` — maintain causal-language graph edges. */\n readonly causalGraph: boolean;\n /** `multiGraphMemoryEnabled` — master switch for multi-graph writes/traversal. */\n readonly multiGraphMemory: boolean;\n /** `graphWriteSessionAdjacencyEnabled` — session-adjacency fallback for time edges (default-on). */\n readonly graphWriteSessionAdjacency: boolean;\n}\n\n/**\n * Resolve the {@link GraphConstructionCapabilitySet} from parsed config.\n *\n * Call this ONCE at graph build/write entry (extraction, recall graph\n * expansion, graph-health/repair) and thread the result down — exactly the\n * pattern {@link resolveCapabilities} established for recall.\n */\nexport type GraphConstructionConfigProjection = Pick<\n PluginConfig,\n | \"entityGraphEnabled\"\n | \"timeGraphEnabled\"\n | \"causalGraphEnabled\"\n | \"multiGraphMemoryEnabled\"\n | \"graphWriteSessionAdjacencyEnabled\"\n>;\n\nexport function resolveGraphConstructionCapabilities(\n config: GraphConstructionConfigProjection,\n): GraphConstructionCapabilitySet {\n return Object.freeze({\n entityGraph: config.entityGraphEnabled,\n timeGraph: config.timeGraphEnabled,\n causalGraph: config.causalGraphEnabled,\n multiGraphMemory: config.multiGraphMemoryEnabled,\n // Optional flag: preserve the exact default-when-undefined semantics the\n // migrated call site used (`!== false` = default-on).\n graphWriteSessionAdjacency: config.graphWriteSessionAdjacencyEnabled !== false,\n });\n}\n"],"mappings":";AAqEO,SAAS,oBAAoB,QAAqC;AACvE,SAAO,OAAO,OAAO;AAAA,IACnB,aAAa,OAAO;AAAA,IACpB,oBAAoB,OAAO;AAAA,IAC3B,yBAAyB,OAAO;AAAA,IAChC,WAAW,OAAO;AAAA,IAClB,2BAA2B,OAAO;AAAA,IAClC,kBAAkB,OAAO;AAAA,IACzB,eAAe,OAAO;AAAA,IACtB,sBAAsB,OAAO;AAAA,IAC7B,aAAa,OAAO;AAAA;AAAA;AAAA,IAGpB,uBAAuB,OAAO,iCAAiC;AAAA,IAC/D,qBAAqB,OAAO,+BAA+B;AAAA,EAC7D,CAAC;AACH;AAiDO,SAAS,qCACd,QACgC;AAChC,SAAO,OAAO,OAAO;AAAA,IACnB,aAAa,OAAO;AAAA,IACpB,WAAW,OAAO;AAAA,IAClB,aAAa,OAAO;AAAA,IACpB,kBAAkB,OAAO;AAAA;AAAA;AAAA,IAGzB,4BAA4B,OAAO,sCAAsC;AAAA,EAC3E,CAAC;AACH;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/operator-toolkit.ts"],"sourcesContent":["import path from \"node:path\";\nimport { constants as fsConstants } from \"node:fs\";\nimport { access, mkdir, readFile, readdir, stat, unlink, writeFile } from \"node:fs/promises\";\nimport { lintWorkspaceFiles } from \"./hygiene.js\";\nimport { parseConfig } from \"./config.js\";\nimport { readEnvVar, resolveHomeDir } from \"./runtime/env.js\";\nimport { resolvePluginEntry } from \"./plugin-entry-resolver.js\";\nimport {\n resolveCuratedIncludeFilesStatePath,\n resolveNativeKnowledgeStatePath,\n resolveOpenClawWorkspaceStatePath,\n} from \"./native-knowledge.js\";\nimport { StorageManager } from \"./storage.js\";\nimport { listNamespaces } from \"./namespaces/migrate.js\";\nimport { summarizeNamespaceMaintenanceHealth } from \"./maintenance/namespace-maintenance-fanout.js\";\nimport {\n createEvalBaselineSnapshot,\n getEvalHarnessStatus,\n runEvalBaselineDeltaReport,\n runEvalBenchmarkCiGate,\n validateEvalBenchmarkPack,\n type EvalBaselineDeltaReport,\n type EvalCiGateReport,\n type EvalHarnessStatus,\n} from \"./evals.js\";\nimport { analyzeGraphHealth, type GraphHealthReport } from \"./graph.js\";\nimport {\n analyzeSessionIntegrity,\n applySessionRepair,\n planSessionRepair,\n type SessionIntegrityReport,\n type SessionRepairApplyResult,\n type SessionRepairPlan,\n} from \"./session-integrity.js\";\nimport {\n listMemoryGovernanceRuns,\n readMemoryGovernanceRunArtifact,\n} from \"./maintenance/memory-governance.js\";\nimport {\n runConsolidationProvenanceCheck,\n type ConsolidationProvenanceReport,\n} from \"./consolidation-provenance-check.js\";\nimport type {\n BufferSurpriseEvent,\n DreamsPhasesConfig,\n FileHygieneConfig,\n MemoryFile,\n PluginConfig,\n} from \"./types.js\";\nimport { reportBufferSurpriseDistribution } from \"./buffer-surprise-report.js\";\nimport { readJudgeVerdictStats } from \"./extraction-judge-telemetry.js\";\n\nconst OPENCLAW_REMNIC_PLUGIN_IDS = [\"openclaw-remnic\", \"openclaw-engram\"] as const;\n\nfunction getOpenClawPluginEntries(raw: Record<string, unknown>): Record<string, unknown> | undefined {\n const plugins =\n raw[\"plugins\"] && typeof raw[\"plugins\"] === \"object\" && !Array.isArray(raw[\"plugins\"])\n ? (raw[\"plugins\"] as Record<string, unknown>)\n : undefined;\n const entries =\n plugins && plugins[\"entries\"] && typeof plugins[\"entries\"] === \"object\" && !Array.isArray(plugins[\"entries\"])\n ? (plugins[\"entries\"] as Record<string, unknown>)\n : undefined;\n return entries;\n}\n\nfunction getOpenClawMemorySlotId(raw: Record<string, unknown>): string | undefined {\n const plugins =\n raw[\"plugins\"] && typeof raw[\"plugins\"] === \"object\" && !Array.isArray(raw[\"plugins\"])\n ? (raw[\"plugins\"] as Record<string, unknown>)\n : undefined;\n const slots =\n plugins && plugins[\"slots\"] && typeof plugins[\"slots\"] === \"object\" && !Array.isArray(plugins[\"slots\"])\n ? (plugins[\"slots\"] as Record<string, unknown>)\n : undefined;\n const slotId = slots?.[\"memory\"];\n return typeof slotId === \"string\" ? slotId : undefined;\n}\n\nfunction resolveOpenClawRemnicPluginEntry(raw: unknown): Record<string, unknown> | undefined {\n return resolvePluginEntry(raw, {\n candidateIds: OPENCLAW_REMNIC_PLUGIN_IDS,\n getEntries: getOpenClawPluginEntries,\n getSlotId: getOpenClawMemorySlotId,\n });\n}\n\ninterface QmdRuntimeLike {\n probe(): Promise<boolean>;\n isAvailable(): boolean;\n ensureCollection(\n memoryDir: string,\n collectionOrExecution?: string | { signal?: AbortSignal },\n execution?: { signal?: AbortSignal },\n ): Promise<\"present\" | \"missing\" | \"unknown\" | \"skipped\">;\n debugStatus(): string;\n}\n\nfunction isMissingPathError(error: unknown): boolean {\n return typeof error === \"object\"\n && error !== null\n && \"code\" in error\n && (error as { code?: unknown }).code === \"ENOENT\";\n}\n\nfunction formatUnknownError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\ninterface ConversationIndexLike {\n getConversationIndexHealth(): Promise<{\n enabled: boolean;\n backend: \"qmd\" | \"faiss\";\n status: \"ok\" | \"degraded\" | \"disabled\";\n chunkDocCount: number;\n lastUpdateAt: string | null;\n qmdAvailable?: boolean;\n faiss?: {\n ok: boolean;\n status: \"ok\" | \"degraded\" | \"error\";\n indexPath: string;\n message?: string;\n manifest?: {\n version: number;\n modelId: string;\n normalizedModelId: string;\n dimension: number;\n chunkCount: number;\n updatedAt: string;\n lastSuccessfulRebuildAt: string;\n };\n };\n }>;\n rebuildConversationIndex(\n sessionKey?: string,\n hours?: number,\n opts?: { embed?: boolean },\n ): Promise<{\n chunks: number;\n skipped: boolean;\n reason?: string;\n embedded?: boolean;\n rebuilt?: boolean;\n }>;\n}\n\nexport interface OperatorToolkitOrchestrator extends ConversationIndexLike {\n config: PluginConfig;\n storage: StorageManager;\n qmd: QmdRuntimeLike;\n}\n\nexport interface OperatorConfigLoadResult {\n found: boolean;\n path: string;\n parsed: boolean;\n memoryDir?: string;\n workspaceDir?: string;\n error?: string;\n}\n\nexport interface OperatorSetupReport {\n schemaVersion: 1;\n generatedAt: string;\n config: OperatorConfigLoadResult;\n memoryDir: string;\n workspaceDir: string;\n directories: Array<{ path: string; exists: boolean; writable: boolean }>;\n qmd: {\n enabled: boolean;\n available: boolean;\n collectionState: \"present\" | \"missing\" | \"unknown\" | \"skipped\";\n debugStatus: string;\n };\n nativeKnowledge: {\n enabled: boolean;\n includeFiles: string[];\n curatedIncludeSync: {\n statePath: string;\n exists: boolean;\n updatedAt: string | null;\n fileCount: number;\n activeChunkCount: number;\n deletedFileCount: number;\n };\n openclawWorkspaceAdapterEnabled: boolean;\n obsidianVaultAdapterEnabled: boolean;\n obsidianSync: {\n statePath: string;\n exists: boolean;\n updatedAt: string | null;\n vaultCount: number;\n activeChunkCount: number;\n deletedNoteCount: number;\n };\n openclawWorkspaceSync: {\n statePath: string;\n exists: boolean;\n updatedAt: string | null;\n fileCount: number;\n activeChunkCount: number;\n deletedFileCount: number;\n };\n };\n explicitCapture: {\n captureMode: string;\n enabled: boolean;\n memoryDocPath: string;\n memoryDocExists: boolean;\n memoryDocInstalled: boolean;\n memoryDocUpdated: boolean;\n memoryDocRemoved: boolean;\n preview: string | null;\n };\n nextSteps: string[];\n verificationCommands: string[];\n}\n\nexport interface OperatorDoctorCheck {\n key: string;\n status: \"ok\" | \"warn\" | \"error\";\n summary: string;\n remediation?: string;\n details?: unknown;\n}\n\nexport interface OperatorConfigReviewFinding {\n key: string;\n status: \"recommend\" | \"problem\";\n setting: string;\n currentValue: string;\n defaultValue: string;\n recommendedValue: string;\n summary: string;\n rationale: string;\n}\n\nexport interface OperatorConfigReviewReport {\n schemaVersion: 1;\n generatedAt: string;\n ok: boolean;\n config: OperatorConfigLoadResult;\n profile: {\n memoryOsPreset?: string;\n searchBackend: string;\n qmdEnabled: boolean;\n qmdDaemonEnabled: boolean;\n nativeKnowledgeEnabled: boolean;\n fileHygieneEnabled: boolean;\n conversationIndexEnabled: boolean;\n };\n summary: {\n recommend: number;\n problem: number;\n };\n findings: OperatorConfigReviewFinding[];\n}\n\nexport interface OperatorDoctorReport {\n schemaVersion: 1;\n generatedAt: string;\n ok: boolean;\n summary: {\n ok: number;\n warn: number;\n error: number;\n };\n config: OperatorConfigLoadResult;\n checks: OperatorDoctorCheck[];\n}\n\nexport interface OperatorInventoryNamespaceSummary {\n namespace: string;\n memoryCount: number;\n entityCount: number;\n}\n\nexport interface OperatorInventoryReport {\n schemaVersion: 1;\n generatedAt: string;\n memoryDir: string;\n totals: {\n memories: number;\n entities: number;\n namespaces: number;\n reviewQueue: number;\n storageBytes: number;\n };\n categories: Record<string, number>;\n statuses: Record<string, number>;\n namespaces: OperatorInventoryNamespaceSummary[];\n ageBands: Record<string, number>;\n profile: {\n exists: boolean;\n chars: number;\n lines: number;\n };\n storageFootprint: {\n bytes: number;\n byTopLevel: Record<string, number>;\n };\n archivePressure: {\n archived: number;\n pendingReview: number;\n quarantined: number;\n rejected: number;\n };\n conversationIndex: {\n enabled: boolean;\n backend: \"qmd\" | \"faiss\";\n status: \"ok\" | \"degraded\" | \"disabled\";\n chunkDocCount: number;\n lastUpdateAt: string | null;\n };\n nativeKnowledge: {\n enabled: boolean;\n curatedIncludeSync: {\n exists: boolean;\n updatedAt: string | null;\n fileCount: number;\n activeChunkCount: number;\n deletedFileCount: number;\n };\n obsidianSync: {\n exists: boolean;\n updatedAt: string | null;\n vaultCount: number;\n activeChunkCount: number;\n deletedNoteCount: number;\n };\n openclawWorkspaceSync: {\n exists: boolean;\n updatedAt: string | null;\n fileCount: number;\n activeChunkCount: number;\n deletedFileCount: number;\n };\n };\n}\n\nexport interface BenchmarkRecallReport {\n schemaVersion: 1;\n generatedAt: string;\n mode: \"status\" | \"validate\" | \"baseline-report\" | \"ci-gate\" | \"snapshot\";\n status: EvalHarnessStatus;\n validate?: Awaited<ReturnType<typeof validateEvalBenchmarkPack>>;\n baselineReport?: EvalBaselineDeltaReport;\n ciGate?: EvalCiGateReport;\n snapshot?: {\n targetPath: string;\n snapshotId: string;\n };\n}\n\nexport interface OperatorRepairReport {\n schemaVersion: 1;\n generatedAt: string;\n dryRun: boolean;\n sessionCheck: SessionIntegrityReport;\n sessionRepairPlan: SessionRepairPlan;\n sessionRepairApply: SessionRepairApplyResult;\n graphHealth: GraphHealthReport;\n}\n\nexport interface OperatorSetupOptions {\n orchestrator: OperatorToolkitOrchestrator;\n installCaptureInstructions?: boolean;\n captureInstructionsMode?: \"preview\" | \"install\" | \"remove\";\n configPath?: string;\n now?: Date;\n}\n\nexport interface OperatorDoctorOptions {\n orchestrator: OperatorToolkitOrchestrator;\n configPath?: string;\n now?: Date;\n}\n\nexport interface OperatorConfigReviewOptions {\n orchestrator: OperatorToolkitOrchestrator;\n configPath?: string;\n now?: Date;\n}\n\nexport interface OperatorInventoryOptions {\n orchestrator: OperatorToolkitOrchestrator;\n now?: Date;\n}\n\nexport interface BenchmarkRecallOptions {\n config: Pick<\n PluginConfig,\n | \"memoryDir\"\n | \"evalStoreDir\"\n | \"evalHarnessEnabled\"\n | \"evalShadowModeEnabled\"\n | \"benchmarkBaselineSnapshotsEnabled\"\n | \"benchmarkDeltaReporterEnabled\"\n | \"memoryRedTeamBenchEnabled\"\n >;\n validatePath?: string;\n baseEvalStoreDir?: string;\n candidateEvalStoreDir?: string;\n snapshotId?: string;\n createSnapshot?: boolean;\n snapshotNotes?: string;\n gitRef?: string;\n createdAt?: string;\n now?: Date;\n}\n\nexport interface OperatorRepairOptions {\n config: Pick<\n PluginConfig,\n \"memoryDir\" | \"entityGraphEnabled\" | \"timeGraphEnabled\" | \"causalGraphEnabled\"\n >;\n apply?: boolean;\n dryRun?: boolean;\n allowSessionFileRepair?: boolean;\n sessionFilesDir?: string;\n now?: Date;\n}\n\nfunction resolveConfigPath(explicitPath?: string): string {\n if (explicitPath && explicitPath.trim().length > 0) return explicitPath.trim();\n const configured =\n readEnvVar(\"OPENCLAW_CONFIG_PATH\") ||\n readEnvVar(\"OPENCLAW_ENGRAM_CONFIG_PATH\");\n if (configured && configured.trim().length > 0) return configured.trim();\n return path.join(resolveHomeDir(), \".openclaw\", \"openclaw.json\");\n}\n\nasync function loadCliPluginConfig(configPath?: string): Promise<OperatorConfigLoadResult> {\n const resolvedPath = resolveConfigPath(configPath);\n try {\n const raw = JSON.parse(await readFile(resolvedPath, \"utf-8\")) as Record<string, unknown>;\n // Delegate slot → canonical → legacy resolution to the generic helper so\n // all config loaders stay in sync (#403).\n const entry = resolveOpenClawRemnicPluginEntry(raw);\n const parsedConfig = parseConfig(\n entry && typeof entry === \"object\"\n ? ((entry[\"config\"] as Record<string, unknown> | undefined) ?? {})\n : {},\n );\n return {\n found: true,\n path: resolvedPath,\n parsed: true,\n memoryDir: parsedConfig.memoryDir,\n workspaceDir: parsedConfig.workspaceDir,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n found: !/ENOENT/i.test(message),\n path: resolvedPath,\n parsed: false,\n error: message,\n };\n }\n}\n\nasync function isWritable(targetPath: string): Promise<boolean> {\n try {\n await access(targetPath, fsConstants.W_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function pathExists(targetPath: string): Promise<boolean> {\n try {\n await access(targetPath, fsConstants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction formatConfigValue(value: unknown): string {\n if (value === undefined || value === null) return \"(unset)\";\n if (typeof value === \"string\") return value.length > 0 ? value : \"(unset)\";\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n return JSON.stringify(value);\n}\n\nasync function gatherDirectoryStatus(\n paths: string[],\n): Promise<Array<{ path: string; exists: boolean; writable: boolean }>> {\n return Promise.all(paths.map(async (targetPath) => {\n try {\n await access(targetPath, fsConstants.F_OK);\n return {\n path: targetPath,\n exists: true,\n writable: await isWritable(targetPath),\n };\n } catch {\n return {\n path: targetPath,\n exists: false,\n writable: false,\n };\n }\n }));\n}\n\nfunction getSetupPaths(config: PluginConfig): string[] {\n return [\n config.memoryDir,\n config.workspaceDir,\n path.join(config.memoryDir, \"facts\"),\n path.join(config.memoryDir, \"entities\"),\n path.join(config.memoryDir, \"state\"),\n path.join(config.memoryDir, \"questions\"),\n path.join(config.memoryDir, \"artifacts\"),\n path.join(config.memoryDir, \"config\"),\n ];\n}\n\nasync function readJsonIfExists(filePath: string): Promise<unknown | null> {\n try {\n return JSON.parse(await readFile(filePath, \"utf-8\")) as unknown;\n } catch {\n return null;\n }\n}\n\nasync function summarizeNativeKnowledgeStatus(config: PluginConfig): Promise<{\n enabled: boolean;\n includeFiles: string[];\n curatedIncludeSync: {\n statePath: string;\n exists: boolean;\n updatedAt: string | null;\n fileCount: number;\n activeChunkCount: number;\n deletedFileCount: number;\n };\n openclawWorkspaceAdapterEnabled: boolean;\n obsidianVaultAdapterEnabled: boolean;\n obsidianSync: {\n statePath: string;\n exists: boolean;\n updatedAt: string | null;\n vaultCount: number;\n activeChunkCount: number;\n deletedNoteCount: number;\n };\n openclawWorkspaceSync: {\n statePath: string;\n exists: boolean;\n updatedAt: string | null;\n fileCount: number;\n activeChunkCount: number;\n deletedFileCount: number;\n };\n}> {\n const nativeKnowledge = config.nativeKnowledge;\n const nativeKnowledgeStateDir = nativeKnowledge?.stateDir ?? \"state/native-knowledge\";\n const curatedStatePath = nativeKnowledge\n ? resolveCuratedIncludeFilesStatePath(config.memoryDir, nativeKnowledge)\n : path.join(config.memoryDir, nativeKnowledgeStateDir, \"curated-include-sync.json\");\n const obsidianStatePath = nativeKnowledge\n ? resolveNativeKnowledgeStatePath(config.memoryDir, nativeKnowledge)\n : path.join(config.memoryDir, nativeKnowledgeStateDir, \"obsidian-sync.json\");\n const openclawStatePath = nativeKnowledge\n ? resolveOpenClawWorkspaceStatePath(config.memoryDir, nativeKnowledge)\n : path.join(config.memoryDir, nativeKnowledgeStateDir, \"openclaw-workspace-sync.json\");\n const [curatedRaw, obsidianRaw, openclawRaw] = await Promise.all([\n readJsonIfExists(curatedStatePath),\n readJsonIfExists(obsidianStatePath),\n readJsonIfExists(openclawStatePath),\n ]);\n\n const curatedFiles = curatedRaw && typeof curatedRaw === \"object\" && curatedRaw !== null\n && \"files\" in curatedRaw && typeof (curatedRaw as { files?: unknown }).files === \"object\"\n && (curatedRaw as { files?: unknown }).files !== null\n ? (curatedRaw as {\n updatedAt?: unknown;\n files: Record<string, { deleted?: boolean; chunks?: unknown[] }>;\n })\n : null;\n\n let curatedActiveChunkCount = 0;\n let curatedDeletedFileCount = 0;\n for (const file of Object.values(curatedFiles?.files ?? {})) {\n if (file.deleted) {\n curatedDeletedFileCount += 1;\n continue;\n }\n curatedActiveChunkCount += Array.isArray(file.chunks) ? file.chunks.length : 0;\n }\n\n const obsidianVaults = obsidianRaw && typeof obsidianRaw === \"object\" && obsidianRaw !== null\n && \"vaults\" in obsidianRaw && typeof (obsidianRaw as { vaults?: unknown }).vaults === \"object\"\n && (obsidianRaw as { vaults?: unknown }).vaults !== null\n ? (obsidianRaw as {\n updatedAt?: unknown;\n vaults: Record<string, { notes?: Record<string, { deleted?: boolean; chunks?: unknown[] }> }>;\n })\n : null;\n\n let obsidianActiveChunkCount = 0;\n let obsidianDeletedNoteCount = 0;\n for (const vault of Object.values(obsidianVaults?.vaults ?? {})) {\n for (const note of Object.values(vault.notes ?? {})) {\n if (note.deleted) {\n obsidianDeletedNoteCount += 1;\n continue;\n }\n obsidianActiveChunkCount += Array.isArray(note.chunks) ? note.chunks.length : 0;\n }\n }\n\n const openclawFiles = openclawRaw && typeof openclawRaw === \"object\" && openclawRaw !== null\n && \"files\" in openclawRaw && typeof (openclawRaw as { files?: unknown }).files === \"object\"\n && (openclawRaw as { files?: unknown }).files !== null\n ? (openclawRaw as {\n updatedAt?: unknown;\n files: Record<string, { deleted?: boolean; chunks?: unknown[] }>;\n })\n : null;\n\n let openclawActiveChunkCount = 0;\n let openclawDeletedFileCount = 0;\n for (const file of Object.values(openclawFiles?.files ?? {})) {\n if (file.deleted) {\n openclawDeletedFileCount += 1;\n continue;\n }\n openclawActiveChunkCount += Array.isArray(file.chunks) ? file.chunks.length : 0;\n }\n\n return {\n enabled: nativeKnowledge?.enabled === true,\n includeFiles: nativeKnowledge?.includeFiles ?? [],\n curatedIncludeSync: {\n statePath: curatedStatePath,\n exists: curatedFiles !== null,\n updatedAt: typeof curatedFiles?.updatedAt === \"string\" ? curatedFiles.updatedAt : null,\n fileCount: Object.keys(curatedFiles?.files ?? {}).length,\n activeChunkCount: curatedActiveChunkCount,\n deletedFileCount: curatedDeletedFileCount,\n },\n openclawWorkspaceAdapterEnabled: nativeKnowledge?.openclawWorkspace?.enabled === true,\n obsidianVaultAdapterEnabled: (nativeKnowledge?.obsidianVaults?.length ?? 0) > 0,\n obsidianSync: {\n statePath: obsidianStatePath,\n exists: obsidianVaults !== null,\n updatedAt: typeof obsidianVaults?.updatedAt === \"string\" ? obsidianVaults.updatedAt : null,\n vaultCount: Object.keys(obsidianVaults?.vaults ?? {}).length,\n activeChunkCount: obsidianActiveChunkCount,\n deletedNoteCount: obsidianDeletedNoteCount,\n },\n openclawWorkspaceSync: {\n statePath: openclawStatePath,\n exists: openclawFiles !== null,\n updatedAt: typeof openclawFiles?.updatedAt === \"string\" ? openclawFiles.updatedAt : null,\n fileCount: Object.keys(openclawFiles?.files ?? {}).length,\n activeChunkCount: openclawActiveChunkCount,\n deletedFileCount: openclawDeletedFileCount,\n },\n };\n}\n\nconst CAPTURE_INSTRUCTIONS_START = \"<!-- BEGIN ENGRAM EXPLICIT CAPTURE INSTRUCTIONS -->\";\nconst CAPTURE_INSTRUCTIONS_END = \"<!-- END ENGRAM EXPLICIT CAPTURE INSTRUCTIONS -->\";\n\nfunction buildCaptureInstructions(): string {\n return [\n CAPTURE_INSTRUCTIONS_START,\n \"# Memory\",\n \"\",\n \"Use this file for explicit memory capture notes when Engram runs in explicit or hybrid mode.\",\n \"\",\n \"## Suggested format\",\n \"\",\n \"- Write durable facts, decisions, commitments, or corrections.\",\n \"- Keep entries concise and specific.\",\n \"- Avoid secrets, tokens, and private credentials.\",\n \"\",\n \"## Example\",\n \"\",\n \"- Decision: recall benchmark packs live under `state/evals/benchmarks/`.\",\n \"- Commitment: rerun `openclaw engram doctor --json` after changing retrieval settings.\",\n \"\",\n CAPTURE_INSTRUCTIONS_END,\n ].join(\"\\n\");\n}\n\nfunction upsertManagedCaptureInstructions(existing: string | null, snippet: string): { content: string; updated: boolean; installed: boolean } {\n if (!existing || existing.trim().length === 0) {\n return { content: `${snippet}\\n`, updated: false, installed: true };\n }\n if (existing.includes(CAPTURE_INSTRUCTIONS_START) && existing.includes(CAPTURE_INSTRUCTIONS_END)) {\n const next = existing.replace(\n new RegExp(`${CAPTURE_INSTRUCTIONS_START}[\\\\s\\\\S]*?${CAPTURE_INSTRUCTIONS_END}`),\n snippet,\n );\n return { content: next.endsWith(\"\\n\") ? next : `${next}\\n`, updated: next !== existing, installed: false };\n }\n const trimmed = existing.trimEnd();\n return {\n content: `${trimmed}\\n\\n${snippet}\\n`,\n updated: false,\n installed: true,\n };\n}\n\nfunction removeManagedCaptureInstructions(existing: string): { content: string; removed: boolean } {\n if (!existing.includes(CAPTURE_INSTRUCTIONS_START) || !existing.includes(CAPTURE_INSTRUCTIONS_END)) {\n return { content: existing, removed: false };\n }\n const stripped = existing\n .replace(new RegExp(`\\\\n*${CAPTURE_INSTRUCTIONS_START}[\\\\s\\\\S]*?${CAPTURE_INSTRUCTIONS_END}\\\\n*`), \"\\n\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n return {\n content: stripped.length > 0 ? `${stripped}\\n` : \"\",\n removed: true,\n };\n}\n\nexport async function runOperatorSetup(options: OperatorSetupOptions): Promise<OperatorSetupReport> {\n const now = options.now ?? new Date();\n const configStatus = await loadCliPluginConfig(options.configPath);\n const storage = options.orchestrator.storage;\n await storage.ensureDirectories();\n await mkdir(options.orchestrator.config.workspaceDir, { recursive: true });\n\n const qmdAvailable = await options.orchestrator.qmd.probe();\n const collectionState = options.orchestrator.config.qmdEnabled\n ? await options.orchestrator.qmd.ensureCollection(\n options.orchestrator.config.memoryDir,\n options.orchestrator.config.qmdCollection,\n )\n : \"skipped\";\n const nativeKnowledgeStatus = await summarizeNativeKnowledgeStatus(options.orchestrator.config);\n\n const memoryDocPath = path.join(options.orchestrator.config.workspaceDir, \"MEMORY.md\");\n const captureInstructionsMode =\n options.captureInstructionsMode\n ?? (options.installCaptureInstructions ? \"install\" : undefined);\n let memoryDocExists = false;\n try {\n await access(memoryDocPath, fsConstants.F_OK);\n memoryDocExists = true;\n } catch {\n memoryDocExists = false;\n }\n let memoryDocInstalled = false;\n let memoryDocUpdated = false;\n let memoryDocRemoved = false;\n const explicitCaptureEnabled = options.orchestrator.config.captureMode === \"explicit\"\n || options.orchestrator.config.captureMode === \"hybrid\";\n const captureInstructionsPreview = captureInstructionsMode ? buildCaptureInstructions() : null;\n if (captureInstructionsMode) {\n if (captureInstructionsMode === \"preview\") {\n // no-op, preview only\n } else if (captureInstructionsMode === \"install\") {\n const existing = memoryDocExists ? await readFile(memoryDocPath, \"utf-8\") : null;\n const next = upsertManagedCaptureInstructions(existing, captureInstructionsPreview ?? \"\");\n if (!existing || next.content !== existing) {\n await writeFile(memoryDocPath, next.content, \"utf-8\");\n }\n memoryDocExists = true;\n memoryDocInstalled = next.installed;\n memoryDocUpdated = next.updated;\n } else if (captureInstructionsMode === \"remove\" && memoryDocExists) {\n const existing = await readFile(memoryDocPath, \"utf-8\");\n const next = removeManagedCaptureInstructions(existing);\n if (next.removed) {\n if (next.content.length === 0) {\n await unlink(memoryDocPath);\n memoryDocExists = false;\n } else {\n await writeFile(memoryDocPath, next.content, \"utf-8\");\n memoryDocExists = true;\n }\n memoryDocRemoved = true;\n }\n }\n }\n\n const directories = await gatherDirectoryStatus(getSetupPaths(options.orchestrator.config));\n const nextSteps = [\n `Run \\`openclaw engram doctor${options.installCaptureInstructions ? \"\" : \" --json\"}\\` to verify runtime health.`,\n \"Run `openclaw engram inventory --json` to capture a baseline footprint.\",\n \"If QMD is enabled and the collection is missing, add the collection to `~/.config/qmd/index.yml` and run `qmd update && qmd embed`.\",\n ];\n if (explicitCaptureEnabled && !memoryDocExists) {\n nextSteps.push(\"Run `openclaw engram setup --preview-capture-instructions` to review the managed explicit-capture snippet, then `--install-capture-instructions` to write it.\");\n }\n\n return {\n schemaVersion: 1,\n generatedAt: now.toISOString(),\n config: configStatus,\n memoryDir: options.orchestrator.config.memoryDir,\n workspaceDir: options.orchestrator.config.workspaceDir,\n directories,\n qmd: {\n enabled: options.orchestrator.config.qmdEnabled,\n available: qmdAvailable,\n collectionState,\n debugStatus: options.orchestrator.qmd.debugStatus(),\n },\n nativeKnowledge: nativeKnowledgeStatus,\n explicitCapture: {\n captureMode: options.orchestrator.config.captureMode,\n enabled: explicitCaptureEnabled,\n memoryDocPath,\n memoryDocExists,\n memoryDocInstalled,\n memoryDocUpdated,\n memoryDocRemoved,\n preview: captureInstructionsMode === \"preview\" ? captureInstructionsPreview : null,\n },\n nextSteps,\n verificationCommands: [\n \"openclaw engram doctor --json\",\n \"openclaw engram inventory --json\",\n \"openclaw engram benchmark recall --json\",\n ],\n };\n}\n\nfunction summarizeHygieneWarnings(\n warnings: Awaited<ReturnType<typeof lintWorkspaceFiles>>,\n hygiene: FileHygieneConfig | undefined,\n): OperatorDoctorCheck {\n if (!hygiene?.enabled || hygiene.lintEnabled !== true) {\n return {\n key: \"file_hygiene\",\n status: \"warn\",\n summary: \"File hygiene linting is disabled; bootstrap file truncation warnings are not active.\",\n remediation: \"Enable `fileHygiene.enabled` and `fileHygiene.lintEnabled` if large workspace bootstrap files are common.\",\n details: {\n enabled: hygiene?.enabled === true,\n lintEnabled: hygiene?.lintEnabled === true,\n },\n };\n }\n if (warnings.length > 0) {\n return {\n key: \"file_hygiene\",\n status: \"warn\",\n summary: `${warnings.length} bootstrap file(s) are near or above the configured budget.`,\n remediation: \"Archive/split the listed files or adjust `fileHygiene` budgets.\",\n details: { warnings },\n };\n }\n return {\n key: \"file_hygiene\",\n status: \"ok\",\n summary: \"Bootstrap file hygiene is within budget.\",\n details: {\n enabled: true,\n lintPaths: hygiene.lintPaths,\n budgetBytes: hygiene.lintBudgetBytes,\n },\n };\n}\n\nfunction buildConfigReviewFinding(input: {\n key: string;\n status: \"recommend\" | \"problem\";\n setting: string;\n currentValue: unknown;\n defaultValue: unknown;\n recommendedValue: unknown;\n summary: string;\n rationale: string;\n}): OperatorConfigReviewFinding {\n return {\n key: input.key,\n status: input.status,\n setting: input.setting,\n currentValue: formatConfigValue(input.currentValue),\n defaultValue: formatConfigValue(input.defaultValue),\n recommendedValue: formatConfigValue(input.recommendedValue),\n summary: input.summary,\n rationale: input.rationale,\n };\n}\n\nexport async function runOperatorConfigReview(\n options: OperatorConfigReviewOptions,\n): Promise<OperatorConfigReviewReport> {\n const now = options.now ?? new Date();\n const configStatus = await loadCliPluginConfig(options.configPath);\n return buildOperatorConfigReviewReport({\n now,\n configStatus,\n config: options.orchestrator.config,\n });\n}\n\nasync function buildOperatorConfigReviewReport(input: {\n now: Date;\n configStatus: OperatorConfigLoadResult;\n config: PluginConfig;\n}): Promise<OperatorConfigReviewReport> {\n const { now, configStatus, config } = input;\n const findings: OperatorConfigReviewFinding[] = [];\n const searchBackend = config.searchBackend ?? \"qmd\";\n const workspaceBootstrapFiles = [\n path.join(config.workspaceDir, \"IDENTITY.md\"),\n path.join(config.workspaceDir, \"MEMORY.md\"),\n path.join(config.workspaceDir, \"USER.md\"),\n ];\n const workspaceBootstrapExists = (await Promise.all(workspaceBootstrapFiles.map(pathExists))).some(Boolean);\n\n if (\n config.memoryOsPreset !== \"conservative\" &&\n config.memoryOsPreset !== \"balanced\" &&\n config.memoryOsPreset !== \"research-max\" &&\n config.memoryOsPreset !== \"local-llm-heavy\" &&\n config.queryAwareIndexingEnabled === false &&\n config.verbatimArtifactsEnabled === false &&\n config.rerankEnabled === false\n ) {\n findings.push(buildConfigReviewFinding({\n key: \"balanced_preset\",\n status: \"recommend\",\n setting: \"memoryOsPreset\",\n currentValue: config.memoryOsPreset,\n defaultValue: \"(unset)\",\n recommendedValue: \"balanced\",\n summary: \"Adopt the balanced preset as the baseline configuration profile.\",\n rationale:\n \"The balanced preset enables the recommended indexing, reranking, and artifact defaults without turning on the higher-churn graph and learning loops.\",\n }));\n }\n\n if (config.qmdEnabled && config.qmdDaemonEnabled === false) {\n findings.push(buildConfigReviewFinding({\n key: \"qmd_daemon\",\n status: \"recommend\",\n setting: \"qmdDaemonEnabled\",\n currentValue: config.qmdDaemonEnabled,\n defaultValue: true,\n recommendedValue: true,\n summary: \"Enable the QMD daemon path when QMD powers recall.\",\n rationale:\n \"The daemon path reduces recall/search contention by preferring the MCP transport instead of repeated subprocess calls when QMD is available.\",\n }));\n }\n\n if (workspaceBootstrapExists && config.nativeKnowledge?.enabled !== true) {\n findings.push(buildConfigReviewFinding({\n key: \"native_knowledge_enabled\",\n status: \"recommend\",\n setting: \"nativeKnowledge.enabled\",\n currentValue: config.nativeKnowledge?.enabled,\n defaultValue: false,\n recommendedValue: true,\n summary: \"Enable native knowledge recall for workspace bootstrap documents.\",\n rationale:\n \"When files like IDENTITY.md or MEMORY.md already exist, native knowledge recall can chunk and inject them directly instead of relying only on extracted memories.\",\n }));\n }\n\n if (workspaceBootstrapExists && config.fileHygiene?.enabled !== true) {\n findings.push(buildConfigReviewFinding({\n key: \"file_hygiene_enabled\",\n status: \"recommend\",\n setting: \"fileHygiene.enabled\",\n currentValue: config.fileHygiene?.enabled,\n defaultValue: false,\n recommendedValue: true,\n summary: \"Enable file hygiene to avoid silent workspace-file truncation.\",\n rationale:\n \"OpenClaw bootstrap files can grow quietly; file hygiene warns before oversized files are truncated during prompt bootstrap.\",\n }));\n }\n\n if (searchBackend === \"qmd\" && config.qmdEnabled === false) {\n findings.push(buildConfigReviewFinding({\n key: \"qmd_search_backend_disabled\",\n status: \"problem\",\n setting: \"qmdEnabled\",\n currentValue: config.qmdEnabled,\n defaultValue: true,\n recommendedValue: true,\n summary: \"QMD search is selected but QMD is disabled.\",\n rationale:\n \"When searchBackend resolves to qmd while qmdEnabled is false, Engram falls back to the noop backend and disables the primary search path.\",\n }));\n }\n\n if (config.qmdColdTierEnabled === true && config.qmdEnabled === false) {\n findings.push(buildConfigReviewFinding({\n key: \"qmd_cold_tier_requires_qmd\",\n status: \"problem\",\n setting: \"qmdEnabled\",\n currentValue: config.qmdEnabled,\n defaultValue: true,\n recommendedValue: true,\n summary: \"Cold-tier QMD recall is enabled while QMD itself is disabled.\",\n rationale:\n \"The cold tier depends on the same QMD runtime as the hot tier, so turning QMD off leaves the extra tiering path unusable.\",\n }));\n }\n\n if (config.qmdTierMigrationEnabled && config.qmdColdTierEnabled !== true) {\n findings.push(buildConfigReviewFinding({\n key: \"qmd_tier_migration_requires_cold_tier\",\n status: \"problem\",\n setting: \"qmdColdTierEnabled\",\n currentValue: config.qmdColdTierEnabled,\n defaultValue: false,\n recommendedValue: true,\n summary: \"Hot/cold tier migration is enabled without the cold tier itself.\",\n rationale:\n \"Tier migration depends on the cold-tier collection and recall path, so enabling migration while the cold tier is off leaves the feature in a contradictory state.\",\n }));\n }\n\n if (config.conversationIndexEnabled && config.conversationIndexBackend === \"qmd\" && config.qmdEnabled === false) {\n findings.push(buildConfigReviewFinding({\n key: \"conversation_index_qmd_requires_qmd\",\n status: \"problem\",\n setting: \"qmdEnabled\",\n currentValue: config.qmdEnabled,\n defaultValue: true,\n recommendedValue: true,\n summary: \"The conversation index is configured for QMD while QMD is disabled.\",\n rationale:\n \"A QMD-backed conversation index cannot rebuild or serve queries when the underlying QMD runtime is disabled.\",\n }));\n }\n\n const summary = findings.reduce(\n (acc, finding) => {\n acc[finding.status] += 1;\n return acc;\n },\n { recommend: 0, problem: 0 },\n );\n\n return {\n schemaVersion: 1,\n generatedAt: now.toISOString(),\n ok: configStatus.parsed && summary.problem === 0,\n config: configStatus,\n profile: {\n memoryOsPreset: config.memoryOsPreset,\n searchBackend,\n qmdEnabled: config.qmdEnabled,\n qmdDaemonEnabled: config.qmdDaemonEnabled,\n nativeKnowledgeEnabled: config.nativeKnowledge?.enabled === true,\n fileHygieneEnabled: config.fileHygiene?.enabled === true,\n conversationIndexEnabled: config.conversationIndexEnabled,\n },\n summary,\n findings,\n };\n}\n\n/**\n * Summarize the provenance coverage of a set of memories (issue #1575 PR 3).\n * Pure function — counts the verified/unverified/none distribution so the\n * doctor check and any future surface can consume it without coupling to the\n * orchestrator. Legacy memories (no `provenance` field) count as `\"none\"`.\n */\nexport function summarizeProvenanceCoverage(\n memories: ReadonlyArray<{ frontmatter: { provenance?: string } }>,\n): { counts: { verified: number; unverified: number; none: number }; total: number } {\n const counts = { verified: 0, unverified: 0, none: 0 };\n for (const mem of memories) {\n const tag = mem.frontmatter.provenance ?? \"none\";\n if (tag === \"verified\") counts.verified += 1;\n else if (tag === \"unverified\") counts.unverified += 1;\n else counts.none += 1;\n }\n return { counts, total: memories.length };\n}\n\nexport async function runOperatorDoctor(options: OperatorDoctorOptions): Promise<OperatorDoctorReport> {\n const now = options.now ?? new Date();\n const configStatus = await loadCliPluginConfig(options.configPath);\n const checks: OperatorDoctorCheck[] = [];\n const config = options.orchestrator.config;\n const storage = options.orchestrator.storage;\n const configReview = await buildOperatorConfigReviewReport({\n now,\n configStatus,\n config,\n });\n const nativeKnowledgeStatus = await summarizeNativeKnowledgeStatus(config);\n const setupPaths = await gatherDirectoryStatus(getSetupPaths(config));\n const missingPaths = setupPaths.filter((entry) => !entry.exists).map((entry) => entry.path);\n\n checks.push({\n key: \"config\",\n status: configStatus.parsed\n ? \"ok\"\n : options.configPath\n ? \"error\"\n : \"warn\",\n summary: configStatus.parsed ? \"OpenClaw config loaded and Engram config parsed successfully.\" : \"Config file could not be parsed.\",\n remediation: configStatus.parsed ? undefined : \"Fix the config file or set OPENCLAW_ENGRAM_CONFIG_PATH/OPENCLAW_CONFIG_PATH.\",\n details: configStatus,\n });\n\n checks.push({\n key: \"memory_dir\",\n status: missingPaths.length === 0 ? \"ok\" : \"warn\",\n summary: missingPaths.length === 0\n ? \"Expected Engram directories exist.\"\n : `${missingPaths.length} expected directory path(s) are missing.`,\n remediation: missingPaths.length === 0 ? undefined : \"Run `openclaw engram setup` to create missing directories.\",\n details: { directories: setupPaths },\n });\n\n checks.push({\n key: \"config_review\",\n status: configReview.summary.problem > 0 ? \"error\" : configReview.summary.recommend > 0 ? \"warn\" : \"ok\",\n summary: configReview.summary.problem > 0\n ? `${configReview.summary.problem} configuration problem(s) detected.`\n : configReview.summary.recommend > 0\n ? `No configuration problems detected; ${configReview.summary.recommend} optional recommendation(s) are available.`\n : \"No configuration problems detected.\",\n remediation: configReview.summary.problem > 0 || configReview.summary.recommend > 0\n ? \"Run `openclaw engram config-review` to inspect and fix the flagged configuration combinations.\"\n : undefined,\n details: configReview,\n });\n\n const qmdAvailable = await options.orchestrator.qmd.probe();\n const collectionState = config.qmdEnabled\n ? await options.orchestrator.qmd.ensureCollection(config.memoryDir, config.qmdCollection)\n : \"skipped\";\n checks.push({\n key: \"qmd\",\n status: !config.qmdEnabled\n ? \"warn\"\n : !qmdAvailable\n ? \"error\"\n : collectionState === \"present\"\n ? \"ok\"\n : collectionState === \"missing\"\n ? \"error\"\n : \"warn\",\n summary: !config.qmdEnabled\n ? \"QMD is disabled in config.\"\n : qmdAvailable\n ? `QMD is reachable (${collectionState}).`\n : \"QMD is not currently reachable.\",\n remediation: !config.qmdEnabled\n ? \"Enable `qmdEnabled` if you expect hybrid search.\"\n : !qmdAvailable\n ? \"Ensure the `qmd` binary is installed and on PATH, or set `qmdPath`.\"\n : collectionState === \"missing\"\n ? \"Add the configured collection to `~/.config/qmd/index.yml`.\"\n : collectionState === \"present\"\n ? undefined\n : \"Re-run `openclaw engram setup` after restoring QMD access.\",\n details: {\n available: qmdAvailable,\n collectionState,\n debugStatus: options.orchestrator.qmd.debugStatus(),\n },\n });\n\n const conversationIndex = await options.orchestrator.getConversationIndexHealth();\n checks.push({\n key: \"conversation_index\",\n status: conversationIndex.status === \"ok\"\n ? \"ok\"\n : conversationIndex.enabled\n ? \"error\"\n : \"warn\",\n summary: conversationIndex.enabled\n ? `Conversation index backend is ${conversationIndex.status}.`\n : \"Conversation index is disabled.\",\n remediation: conversationIndex.enabled && conversationIndex.status !== \"ok\"\n ? \"Run `openclaw engram rebuild-index` to refresh the conversation index artifacts.\"\n : undefined,\n details: conversationIndex,\n });\n\n const meta = await storage.loadMeta();\n checks.push({\n key: \"maintenance\",\n status: meta.lastExtractionAt || meta.lastConsolidationAt ? \"ok\" : \"warn\",\n summary: meta.lastExtractionAt || meta.lastConsolidationAt\n ? \"Extraction/consolidation metadata is present.\"\n : \"No extraction or consolidation metadata found yet.\",\n remediation: meta.lastExtractionAt || meta.lastConsolidationAt\n ? undefined\n : \"Run a normal agent turn or `openclaw engram consolidate` after seeding memory.\",\n details: meta,\n });\n\n // Provenance coverage (issue #1575 PR 3). Operators need to see the\n // verified/unverified/none distribution grow as extraction backfills.\n // Best-effort: a read failure surfaces as a warn, not an error.\n let provenanceCoverage: ReturnType<typeof summarizeProvenanceCoverage> = {\n counts: { verified: 0, unverified: 0, none: 0 },\n total: 0,\n };\n let provenanceReadOk = true;\n let provenancePartialTiers: string[] = [];\n try {\n // Include all tiers so cold-migrated and archived memories are counted\n // (codex thread PRRT_kwDORJXyws6Ojqz8 — readAllMemories is hot-only).\n // Use allSettled so a real read failure (e.g. locked encrypted store)\n // is surfaced as a partial-read warning, not silently swallowed\n // (codex thread PRRT_kwDORJXyws6OjygQ).\n const [hot, archived, cold] = await Promise.allSettled([\n storage.readAllMemories(),\n storage.readArchivedMemories(),\n storage.readAllColdMemories(),\n ]);\n const all: { frontmatter: { provenance?: string } }[] = [];\n if (hot.status === \"fulfilled\") all.push(...hot.value);\n else provenancePartialTiers.push(\"hot\");\n if (archived.status === \"fulfilled\") all.push(...archived.value);\n else provenancePartialTiers.push(\"archived\");\n if (cold.status === \"fulfilled\") all.push(...cold.value);\n else provenancePartialTiers.push(\"cold\");\n provenanceCoverage = summarizeProvenanceCoverage(all);\n } catch {\n provenanceReadOk = false;\n }\n const pc = provenanceCoverage.counts;\n const totalProvenance = provenanceCoverage.total;\n const provenanceCovered = pc.verified + pc.unverified;\n const partialSuffix = provenancePartialTiers.length > 0\n ? ` (partial: ${provenancePartialTiers.join(\"/\")} tier unreadable)`\n : \"\";\n checks.push({\n key: \"provenance_coverage\",\n status: !provenanceReadOk || provenancePartialTiers.length > 0\n ? \"warn\"\n : totalProvenance === 0\n ? \"warn\"\n : provenanceCovered === 0\n ? \"warn\"\n : \"ok\",\n summary: !provenanceReadOk\n ? \"Could not read memories for provenance coverage.\"\n : totalProvenance === 0\n ? \"No memories found yet — provenance coverage is empty.\"\n : `Provenance coverage: ${pc.verified} verified, ${pc.unverified} unverified, ${pc.none} none (${totalProvenance} total).${partialSuffix}`,\n remediation: !provenanceReadOk\n ? undefined\n : provenancePartialTiers.length > 0\n ? `Some tiers could not be read (${provenancePartialTiers.join(\", \")}). Check storage health and re-run.`\n : provenanceCovered === 0 && totalProvenance > 0\n ? \"New extractions will carry source spans. Existing legacy memories remain `none` until re-extracted.\"\n : undefined,\n details: { provenanceCounts: pc, total: totalProvenance, partialTiers: provenancePartialTiers.length > 0 ? provenancePartialTiers : undefined },\n });\n\n const syncedChunkCount =\n nativeKnowledgeStatus.curatedIncludeSync.activeChunkCount +\n nativeKnowledgeStatus.obsidianSync.activeChunkCount +\n nativeKnowledgeStatus.openclawWorkspaceSync.activeChunkCount;\n const hasSyncState =\n nativeKnowledgeStatus.curatedIncludeSync.exists ||\n nativeKnowledgeStatus.obsidianSync.exists ||\n nativeKnowledgeStatus.openclawWorkspaceSync.exists;\n checks.push({\n key: \"native_knowledge\",\n status: !nativeKnowledgeStatus.enabled\n ? \"warn\"\n : hasSyncState\n ? \"ok\"\n : \"warn\",\n summary: !nativeKnowledgeStatus.enabled\n ? \"Native knowledge sync is disabled.\"\n : hasSyncState\n ? `Native knowledge sync state is present (${syncedChunkCount} active chunks).`\n : \"Native knowledge sync is enabled but no sync state has been written yet.\",\n remediation: !nativeKnowledgeStatus.enabled\n ? \"Enable `nativeKnowledge.enabled` if curated workspace recall should participate in retrieval.\"\n : hasSyncState\n ? undefined\n : \"Run a recall, sync, or setup flow that touches native knowledge sources, then rerun `openclaw engram doctor --json`.\",\n details: nativeKnowledgeStatus,\n });\n\n const agentAccessEnabled = config.agentAccessHttp?.enabled === true;\n // A SecretRef object counts as \"configured\" (issue #757) — resolution\n // happens at service-start time, not at doctor-time. We only check that\n // *something* is set; we never log the resolved value.\n const rawAuthToken = config.agentAccessHttp?.authToken;\n const authTokenConfigured =\n (typeof rawAuthToken === \"string\" && rawAuthToken.length > 0) ||\n (rawAuthToken !== null &&\n typeof rawAuthToken === \"object\" &&\n typeof (rawAuthToken as { source?: unknown }).source === \"string\");\n checks.push({\n key: \"access_http_auth\",\n status: !agentAccessEnabled\n ? \"warn\"\n : authTokenConfigured\n ? \"ok\"\n : \"error\",\n summary: !agentAccessEnabled\n ? \"Agent access HTTP bridge is disabled.\"\n : authTokenConfigured\n ? \"Agent access HTTP bridge has an auth token configured.\"\n : \"Agent access HTTP bridge is enabled without an auth token.\",\n remediation: !agentAccessEnabled\n ? \"Ignore unless you plan to enable the HTTP bridge.\"\n : authTokenConfigured\n ? undefined\n : \"Set `agentAccessHttp.authToken` before exposing the bridge.\",\n });\n\n const warnings = config.fileHygiene?.lintEnabled\n ? await lintWorkspaceFiles({\n workspaceDir: config.workspaceDir,\n paths: config.fileHygiene.lintPaths,\n budgetBytes: config.fileHygiene.lintBudgetBytes,\n warnRatio: config.fileHygiene.lintWarnRatio,\n })\n : [];\n checks.push(summarizeHygieneWarnings(warnings, config.fileHygiene));\n\n // Memory Worth legacy counter audit (issue #560 PR 1).\n // Memories written before #560 have no `mw_success` / `mw_fail` frontmatter\n // fields. That is fully supported — readers treat the absence as a uniform\n // Beta(1,1) prior — but surfacing the count helps operators understand how\n // much history will bootstrap the scoring pipeline landed in later PRs.\n // This is an informational check, never an error.\n checks.push(await summarizeMemoryWorthLegacyCounters(storage));\n\n // Buffer surprise telemetry distribution (issue #563 PR 3).\n // Surfaces recent surprise scores so operators can calibrate the\n // `bufferSurpriseThreshold` from real traffic. Never an error — an empty\n // ledger is the expected state until the flag is turned on.\n checks.push(\n await summarizeBufferSurpriseDistribution(storage, config),\n );\n\n // Consolidation provenance integrity (issue #561 PR 4).\n // Validates that every `derived_from` entry resolves to an on-disk\n // page-version snapshot and every `derived_via` is a known operator.\n // Broken provenance emits warnings with the offending file path — the\n // check is informational (never an error) because a missing snapshot\n // can legitimately occur after log pruning or versioning being disabled\n // retroactively; operators need visibility, not a hard fail. Review\n // feedback (PR #634): the summarizer threads the configured\n // `versioningSidecarDir` into the scan so deployments that override\n // the default `.versions` directory get accurate results instead of\n // false-missing warnings.\n checks.push(await summarizeConsolidationProvenance(storage, config));\n\n // Graph-edge decay maintenance status (issue #681 PR 2/3).\n // Reports whether the periodic decay job has run and surfaces last-run\n // counts. Disabled is \"ok\" with a note; enabled-but-never-run is \"warn\".\n checks.push(await summarizeGraphEdgeDecayStatus(config));\n\n // Tier distribution (issue #686 retention-completion).\n // Shows hot/cold counts, per-status breakdown, and forgotten-memory count.\n // Informational only — never errors, never blocks doctor from returning ok.\n checks.push(await summarizeTierDistribution(options.orchestrator.storage));\n\n // Dreams phases thresholds and last-run timestamps (issue #678 PR 2/4).\n // Surfaces per-phase: enabled status, cadence, threshold values, and the\n // best-available last-run timestamp for each of the three pipeline phases.\n checks.push(await summarizeDreamsPhases(config, storage));\n\n // Security mitigation status (issue #565).\n // Reports whether the cross-namespace budget and anomaly detection\n // mitigations are enabled and surfaces config values for operator review.\n checks.push(summarizeSecurityMitigations(config));\n\n // Observation throughput + judge acceptance rate (issue #685).\n // Surfaces the total verdict count, accept/reject/defer breakdown, and the\n // most recent `observedAt` timestamp from the extraction-judge telemetry\n // ledger. This closes the *(future)* item deferred in\n // `docs/trace-to-primitive.md`. The check is purely informational — it\n // always resolves to `ok`; an empty ledger is the expected cold-install\n // state and is never an error.\n checks.push(await summarizeObservationThroughput(config.memoryDir));\n\n // Namespace maintenance fanout status (issue #1500).\n // Reports per-job+namespace maintenance outcomes (ran/skipped/failed) so\n // operators can verify that dynamic project/team namespaces are being\n // maintained. Informational: never errors on its own — a namespace that has\n // never been maintained is the expected cold-install state.\n const namespaceMaintenanceHealth = await summarizeNamespaceMaintenanceHealth(config);\n checks.push({\n key: \"namespace_maintenance\",\n status: namespaceMaintenanceHealth.totalFailed > 0 ? \"warn\" : \"ok\",\n summary:\n namespaceMaintenanceHealth.totalRan === 0 && namespaceMaintenanceHealth.totalFailed === 0\n ? \"No namespace maintenance recorded yet (expected for a fresh install).\"\n : `${namespaceMaintenanceHealth.totalRan} namespace maintenance run(s)` +\n (namespaceMaintenanceHealth.totalFailed > 0\n ? `, ${namespaceMaintenanceHealth.totalFailed} failure(s) across ${namespaceMaintenanceHealth.jobs.filter((j) => j.failed > 0).length} job(s)`\n : \"\") +\n \".\",\n remediation:\n namespaceMaintenanceHealth.totalFailed > 0\n ? \"Run `remnic namespaces maintenance` for per-namespace details.\"\n : undefined,\n details: namespaceMaintenanceHealth,\n });\n\n // Tombstone non-resurrection invariant (issue #1579). Reports active\n // tombstone count, last append, corrupted-line count, and rebuild\n // staleness so operators can verify the invariant is enforced and know\n // when a rebuild is warranted. Informational: never errors on its own.\n checks.push(await summarizeTombstoneStatus(options.orchestrator.storage));\n\n const summary = checks.reduce(\n (acc, check) => {\n acc[check.status] += 1;\n return acc;\n },\n { ok: 0, warn: 0, error: 0 },\n );\n\n return {\n schemaVersion: 1,\n generatedAt: now.toISOString(),\n ok: summary.error === 0,\n summary,\n config: configStatus,\n checks,\n };\n}\n\n/**\n * Categories whose memories are eligible for Memory Worth instrumentation.\n *\n * Memory Worth is a per-fact utility signal: the counters ride on extracted\n * facts whose retrieval outcome can be judged (success/fail) by the feedback\n * pipeline landing in issue #560 PR 3. Procedures, corrections, and other\n * non-fact memory kinds are out of scope — they are not expected to be\n * instrumented, and counting them as \"legacy\" would permanently inflate the\n * legacy bucket and make rollout progress misleading even when every fact\n * memory is instrumented.\n *\n * If a later PR widens Memory Worth to additional categories, extend this set\n * alongside the scoring/increment logic so the doctor audit stays in sync.\n */\nconst MEMORY_WORTH_ELIGIBLE_CATEGORIES: ReadonlySet<MemoryFile[\"frontmatter\"][\"category\"]> =\n new Set([\"fact\"]);\n\n/**\n * Count memories that pre-date the Memory Worth counters introduced in issue\n * #560 — i.e., neither `mw_success` nor `mw_fail` is set on the frontmatter.\n *\n * Only memories whose category is eligible for Memory Worth (see\n * `MEMORY_WORTH_ELIGIBLE_CATEGORIES`) are considered. Procedures, corrections,\n * and other kinds that are not instrumented are excluded entirely — they're\n * neither \"legacy\" nor \"instrumented\" for the purposes of this audit. The\n * total in the returned details reflects only eligible memories.\n *\n * Returned as an `ok` check regardless of count, since legacy memories are\n * fully functional (readers treat missing counters as zero observations). The\n * numbers are informational for operators following the #560 rollout.\n *\n * Exported so unit tests can exercise the classification logic without\n * booting a full orchestrator.\n */\nexport async function summarizeMemoryWorthLegacyCounters(\n storage: StorageManager,\n): Promise<OperatorDoctorCheck> {\n let legacy = 0;\n let instrumented = 0;\n let ineligible = 0;\n try {\n const memories = await storage.readAllMemories();\n for (const memory of memories) {\n if (!MEMORY_WORTH_ELIGIBLE_CATEGORIES.has(memory.frontmatter.category)) {\n ineligible += 1;\n continue;\n }\n const { mw_success, mw_fail } = memory.frontmatter;\n if (mw_success === undefined && mw_fail === undefined) {\n legacy += 1;\n } else {\n instrumented += 1;\n }\n }\n } catch (err) {\n return {\n key: \"memory_worth_legacy\",\n status: \"warn\",\n summary: \"Could not enumerate memories to count Memory Worth instrumentation.\",\n remediation: \"Retry `remnic doctor` after ensuring the memory directory is readable.\",\n details: { error: String(err) },\n };\n }\n\n const total = legacy + instrumented;\n return {\n key: \"memory_worth_legacy\",\n status: \"ok\",\n summary:\n total === 0\n ? \"No Memory Worth–eligible memories on disk yet — counters will populate as facts are extracted.\"\n : `${legacy} of ${total} eligible memories have no Memory Worth counters yet (${instrumented} instrumented).`,\n details: { legacy, instrumented, total, ineligible },\n };\n}\n\n/**\n * Summarize the recent buffer-surprise telemetry distribution for the\n * Doctor report (issue #563 PR 3).\n *\n * Reports mean/median/p90 surprise scores and the triggered-flush rate\n * over the most recent window of ledger rows. An empty ledger is the\n * expected state until `bufferSurpriseTriggerEnabled` is turned on — the\n * check never escalates beyond `ok` / `warn` (ledger unreadable).\n *\n * Exported so tests can exercise the formatting without booting a real\n * orchestrator.\n */\nexport async function summarizeBufferSurpriseDistribution(\n storage: StorageManager,\n config: PluginConfig,\n): Promise<OperatorDoctorCheck> {\n const storageWithLedger = storage as StorageManager & {\n readBufferSurpriseEvents?: (\n opts: { limit?: number },\n ) => Promise<BufferSurpriseEvent[]>;\n };\n\n // Defensive: older StorageManager builds (not yet rebuilt) may lack the\n // reader. Do not fail the entire Doctor run in that case.\n if (typeof storageWithLedger.readBufferSurpriseEvents !== \"function\") {\n return {\n key: \"buffer_surprise_distribution\",\n status: \"ok\",\n summary: \"Buffer-surprise telemetry reader unavailable in this build.\",\n details: { available: false },\n };\n }\n\n try {\n const dist = await reportBufferSurpriseDistribution(\n async (opts) =>\n storageWithLedger.readBufferSurpriseEvents!({ limit: opts.limit }),\n { limit: 200 },\n );\n\n if (dist.count === 0) {\n return {\n key: \"buffer_surprise_distribution\",\n status: \"ok\",\n summary: config.bufferSurpriseTriggerEnabled\n ? \"Surprise trigger is enabled but no telemetry has been recorded yet.\"\n : \"Surprise trigger is disabled; no telemetry expected.\",\n details: {\n enabled: config.bufferSurpriseTriggerEnabled,\n distribution: dist,\n },\n };\n }\n\n const pct = (value: number) => (value * 100).toFixed(1);\n return {\n key: \"buffer_surprise_distribution\",\n status: \"ok\",\n summary: `Recent surprise: mean=${dist.mean.toFixed(3)}, median=${dist.median.toFixed(3)}, p90=${dist.p90.toFixed(3)}, triggered=${pct(dist.triggeredRate)}% over ${dist.count} turns (threshold=${dist.currentThreshold ?? config.bufferSurpriseThreshold}).`,\n details: {\n enabled: config.bufferSurpriseTriggerEnabled,\n distribution: dist,\n },\n };\n } catch (err) {\n return {\n key: \"buffer_surprise_distribution\",\n status: \"warn\",\n summary: \"Could not read buffer-surprise telemetry ledger.\",\n remediation:\n \"Retry `remnic doctor` after ensuring the memory state directory is readable.\",\n details: { error: String(err) },\n };\n }\n}\n\n/**\n * Summarize the consolidation-provenance integrity scan for the doctor\n * report (issue #561 PR 4). Returns an `ok` check when no issues are\n * found, `warn` otherwise. Never returns `error` — a broken provenance\n * pointer is informational because it can legitimately result from log\n * pruning, versioning being disabled retroactively, or operator-driven\n * archive operations.\n *\n * Exported so unit tests can exercise the summarization without booting a\n * full orchestrator.\n */\n\nasync function summarizeGraphEdgeDecayStatus(\n config: Pick<\n PluginConfig,\n \"memoryDir\" | \"graphEdgeDecayEnabled\" | \"graphEdgeDecayCadenceMs\"\n >,\n): Promise<OperatorDoctorCheck> {\n // Lazy import to keep the doctor fast when the feature is disabled.\n const { readGraphEdgeDecayStatus } = await import(\"./maintenance/graph-edge-decay.js\");\n const enabled = config.graphEdgeDecayEnabled === true;\n if (!enabled) {\n return {\n key: \"graph_edge_decay\",\n status: \"ok\",\n summary: \"Graph-edge decay maintenance is disabled (graphEdgeDecayEnabled = false).\",\n remediation: \"Set graphEdgeDecayEnabled = true to opt into the periodic decay job (issue #681).\",\n details: { enabled: false },\n };\n }\n\n const status = await readGraphEdgeDecayStatus(config.memoryDir);\n if (!status) {\n return {\n key: \"graph_edge_decay\",\n status: \"warn\",\n summary: \"Graph-edge decay is enabled but has not run yet (no status file present).\",\n remediation:\n \"Trigger the cron, run `engram.graph_edge_decay_run` via MCP, or wait for the scheduled cadence to fire.\",\n details: { enabled: true, lastRun: null, cadenceMs: config.graphEdgeDecayCadenceMs },\n };\n }\n\n return {\n key: \"graph_edge_decay\",\n status: \"ok\",\n summary:\n `Graph-edge decay last ran at ${status.ranAt} ` +\n `(${status.edgesDecayed}/${status.edgesTotal} edges decayed, ` +\n `${status.edgesBelowVisibilityThreshold} below visibility threshold).`,\n details: {\n enabled: true,\n lastRun: status.ranAt,\n durationMs: status.durationMs,\n edgesTotal: status.edgesTotal,\n edgesDecayed: status.edgesDecayed,\n edgesBelowVisibilityThreshold: status.edgesBelowVisibilityThreshold,\n topDecayedEntities: status.topDecayedEntities,\n cadenceMs: config.graphEdgeDecayCadenceMs,\n },\n };\n}\n\n/**\n * Summarize hot/cold tier distribution for the Doctor report\n * (issue #686 retention-completion).\n *\n * Shows:\n * - hot vs cold memory counts\n * - forgotten-memory count\n * - top per-status breakdown\n * - recent migrations in the last 7 days (from the tier-migration journal)\n * - top demotion reasons from the journal\n *\n * Always returns an `ok` check — this section is informational, never\n * a gate. A missing journal or unreadable corpus is surfaced as a note,\n * not an error.\n *\n * Exported so tests can exercise the summarizer without a full orchestrator.\n */\nexport async function summarizeTierDistribution(\n storage: StorageManager,\n): Promise<OperatorDoctorCheck> {\n try {\n const { summarizeTiers } = await import(\"./maintenance/tier-stats.js\");\n const summary = await summarizeTiers(storage);\n\n // Read recent migration journal entries (last 7 days)\n const storageDir = (storage as unknown as { dir?: string }).dir ?? \"\";\n const journalPath = storageDir.length > 0\n ? path.join(storageDir, \"state\", \"tier-migration-journal.jsonl\")\n : null;\n let recentMigrations = 0;\n const demotionReasons: Record<string, number> = {};\n const sevenDaysAgoMs = Date.now() - 7 * 86_400_000;\n\n if (journalPath) {\n try {\n const { readFile } = await import(\"node:fs/promises\");\n const raw = await readFile(journalPath, \"utf-8\");\n for (const line of raw.split(\"\\n\")) {\n const trimmed = line.trim();\n if (trimmed.length === 0) continue;\n try {\n const entry = JSON.parse(trimmed) as {\n ts?: string;\n changed?: boolean;\n fromTier?: string;\n toTier?: string;\n reason?: string;\n };\n const tsMs = entry.ts ? Date.parse(entry.ts) : NaN;\n if (Number.isFinite(tsMs) && tsMs >= sevenDaysAgoMs && entry.changed === true) {\n recentMigrations += 1;\n if (entry.fromTier === \"hot\" && entry.toTier === \"cold\" && typeof entry.reason === \"string\") {\n const reason = entry.reason;\n demotionReasons[reason] = (demotionReasons[reason] ?? 0) + 1;\n }\n }\n } catch {\n // Malformed line — skip\n }\n }\n } catch {\n // Journal not present yet — expected on fresh installs\n }\n }\n\n const topDemotionReasons = Object.entries(demotionReasons)\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n .slice(0, 5)\n .map(([reason, count]) => ({ reason, count }));\n\n const statusParts = Object.entries(summary.byStatus)\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n .slice(0, 6)\n .map(([s, n]) => `${s}: ${n}`)\n .join(\", \");\n\n return {\n key: \"tier_distribution\",\n status: \"ok\",\n summary:\n `Tier distribution: hot=${summary.byTier.hot}, cold=${summary.byTier.cold}` +\n (summary.forgottenCount > 0 ? `, forgotten=${summary.forgottenCount}` : \"\") +\n `. Total: ${summary.total}.` +\n (recentMigrations > 0 ? ` Recent migrations (7d): ${recentMigrations}.` : \"\"),\n details: {\n total: summary.total,\n byTier: summary.byTier,\n byStatus: summary.byStatus,\n forgottenCount: summary.forgottenCount,\n statusSummary: statusParts,\n recentMigrations,\n topDemotionReasons,\n },\n };\n } catch (err) {\n return {\n key: \"tier_distribution\",\n status: \"ok\",\n summary: \"Tier distribution unavailable — could not enumerate memories.\",\n details: { error: String(err) },\n };\n }\n}\n\n/**\n * Dreams phases doctor check (issue #678 PR 2/4).\n *\n * Reports per-phase: enabled status, cadence, threshold values, and last-run\n * timestamp sourced from `meta.json` (the existing maintenance ledger).\n *\n * Last-run mapping (best available in PR 2; PR 3/4 will emit per-phase events):\n * light sleep → `meta.lastExtractionAt` (lifecycle pass runs with extraction)\n * REM → `meta.lastConsolidationAt` (semantic consolidation)\n * deep sleep → latest governance run manifest when present, otherwise null\n */\nexport async function summarizeDreamsPhases(\n config: Pick<PluginConfig, \"memoryDir\" | \"dreamsPhases\">,\n storage: StorageManager = new StorageManager(config.memoryDir),\n): Promise<OperatorDoctorCheck> {\n const phases: DreamsPhasesConfig = config.dreamsPhases;\n\n // Load meta.json for best-available last-run timestamps.\n const meta = await storage.loadMeta();\n\n let deepSleepLastRun: string | null = null;\n let deepSleepLastRunWarning: string | null = null;\n try {\n // Read the latest governance run's manifest from the real on-disk format\n // rather than treating every failure as \"no runs yet\".\n const runsDir = path.join(config.memoryDir, \"state\", \"memory-governance\", \"runs\");\n const runIds = (await readdir(runsDir)).sort().reverse();\n if (runIds.length > 0) {\n const latestRunId = runIds[0];\n const manifestPath = path.join(\n runsDir,\n latestRunId,\n \"manifest.json\",\n );\n const raw = await readFile(manifestPath, \"utf-8\");\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n if (typeof parsed.createdAt === \"string\" && parsed.createdAt.length > 0) {\n deepSleepLastRun = parsed.createdAt;\n }\n }\n } catch (error) {\n if (!isMissingPathError(error)) {\n deepSleepLastRunWarning = `Could not read latest governance run manifest: ${formatUnknownError(error)}`;\n }\n }\n\n // Build per-phase summary lines for the human-readable `summary` field.\n const phaseLines: string[] = [\n `lightSleep: enabled=${phases.lightSleep.enabled}, cadenceMs=${phases.lightSleep.cadenceMs}, promoteHeat=${phases.lightSleep.promoteHeatThreshold}, staleDecay=${phases.lightSleep.staleDecayThreshold}, archiveDecay=${phases.lightSleep.archiveDecayThreshold}, filterStale=${phases.lightSleep.filterStaleEnabled}, lastRun=${meta.lastExtractionAt ?? \"never\"}`,\n `rem: enabled=${phases.rem.enabled}, cadenceMs=${phases.rem.cadenceMs}, similarity=${phases.rem.similarityThreshold}, minCluster=${phases.rem.minClusterSize}, maxPerRun=${phases.rem.maxPerRun}, minIntervalMs=${phases.rem.minIntervalMs}, lastRun=${meta.lastConsolidationAt ?? \"never\"}`,\n `deepSleep: enabled=${phases.deepSleep.enabled}, cadenceMs=${phases.deepSleep.cadenceMs}, versioning=${phases.deepSleep.versioningEnabled}, versioningMaxPerPage=${phases.deepSleep.versioningMaxPerPage}, lastRun=${deepSleepLastRun ?? \"never\"}`,\n ];\n\n return {\n key: \"dreams_phases\",\n status: deepSleepLastRunWarning ? \"warn\" : \"ok\",\n summary: `Dreams pipeline phases: ${phaseLines.join(\"; \")}${deepSleepLastRunWarning ? `; ${deepSleepLastRunWarning}` : \"\"}`,\n remediation: deepSleepLastRunWarning\n ? \"Inspect state/memory-governance/runs and repair or remove unreadable governance run artifacts.\"\n : undefined,\n details: {\n lightSleep: {\n enabled: phases.lightSleep.enabled,\n cadenceMs: phases.lightSleep.cadenceMs,\n promoteHeatThreshold: phases.lightSleep.promoteHeatThreshold,\n staleDecayThreshold: phases.lightSleep.staleDecayThreshold,\n archiveDecayThreshold: phases.lightSleep.archiveDecayThreshold,\n filterStaleEnabled: phases.lightSleep.filterStaleEnabled,\n lastRun: meta.lastExtractionAt ?? null,\n },\n rem: {\n enabled: phases.rem.enabled,\n cadenceMs: phases.rem.cadenceMs,\n similarityThreshold: phases.rem.similarityThreshold,\n minClusterSize: phases.rem.minClusterSize,\n maxPerRun: phases.rem.maxPerRun,\n minIntervalMs: phases.rem.minIntervalMs,\n lastRun: meta.lastConsolidationAt ?? null,\n },\n deepSleep: {\n enabled: phases.deepSleep.enabled,\n cadenceMs: phases.deepSleep.cadenceMs,\n versioningEnabled: phases.deepSleep.versioningEnabled,\n versioningMaxPerPage: phases.deepSleep.versioningMaxPerPage,\n lastRun: deepSleepLastRun,\n warning: deepSleepLastRunWarning,\n },\n },\n };\n}\n\nfunction summarizeSecurityMitigations(\n config: Pick<\n PluginConfig,\n | \"recallCrossNamespaceBudgetEnabled\"\n | \"recallCrossNamespaceBudgetWindowMs\"\n | \"recallCrossNamespaceBudgetSoftLimit\"\n | \"recallCrossNamespaceBudgetHardLimit\"\n | \"recallAuditAnomalyDetectionEnabled\"\n | \"recallAuditAnomalyWindowMs\"\n | \"recallAuditAnomalyRepeatQueryLimit\"\n | \"recallAuditAnomalyNamespaceWalkLimit\"\n | \"recallAuditAnomalyHighCardinalityLimit\"\n | \"recallAuditAnomalyRapidFireLimit\"\n >,\n): OperatorDoctorCheck {\n const budgetEnabled = config.recallCrossNamespaceBudgetEnabled === true;\n const anomalyEnabled = config.recallAuditAnomalyDetectionEnabled === true;\n\n if (!budgetEnabled && !anomalyEnabled) {\n return {\n key: \"security_mitigations\",\n status: \"warn\",\n summary: \"Memory-extraction mitigations are disabled (cross-namespace budget and anomaly detection off).\",\n remediation: \"Enable recallCrossNamespaceBudgetEnabled and/or recallAuditAnomalyDetectionEnabled for production deployments. See docs/security/memory-extraction-threat-model.md.\",\n details: {\n budgetEnabled: false,\n anomalyDetectionEnabled: false,\n },\n };\n }\n\n const details: Record<string, unknown> = {\n budgetEnabled,\n anomalyDetectionEnabled: anomalyEnabled,\n };\n\n if (budgetEnabled) {\n details.budgetConfig = {\n windowMs: config.recallCrossNamespaceBudgetWindowMs,\n softLimit: config.recallCrossNamespaceBudgetSoftLimit,\n hardLimit: config.recallCrossNamespaceBudgetHardLimit,\n };\n }\n\n if (anomalyEnabled) {\n details.anomalyConfig = {\n windowMs: config.recallAuditAnomalyWindowMs,\n repeatQueryLimit: config.recallAuditAnomalyRepeatQueryLimit,\n namespaceWalkLimit: config.recallAuditAnomalyNamespaceWalkLimit,\n highCardinalityLimit: config.recallAuditAnomalyHighCardinalityLimit,\n rapidFireLimit: config.recallAuditAnomalyRapidFireLimit,\n };\n }\n\n return {\n key: \"security_mitigations\",\n status: \"ok\",\n summary: `Memory-extraction mitigation config enabled: ${budgetEnabled ? \"budget\" : \"\"}${budgetEnabled && anomalyEnabled ? \", \" : \"\"}${anomalyEnabled ? \"anomaly detection\" : \"\"}.`,\n details: { ...details, configOnly: true },\n };\n}\n\n/**\n * Observation throughput check for `remnic doctor` (issue #685).\n *\n * Reads the extraction-judge verdict ledger to surface:\n * - total observations (verdicts) recorded\n * - accept / reject / defer breakdown\n * - most-recent `observedAt` timestamp\n *\n * The check is purely informational (always `ok`): a missing or empty\n * ledger is the expected state on a fresh install and is never an error.\n * This closes the `*(future)*` item deferred in `docs/trace-to-primitive.md`.\n */\nexport async function summarizeObservationThroughput(\n memoryDir: string,\n): Promise<OperatorDoctorCheck> {\n try {\n const stats = await readJudgeVerdictStats(memoryDir);\n if (stats.total === 0) {\n return {\n key: \"observations\",\n status: \"ok\",\n summary: \"No observations recorded yet (extraction-judge telemetry ledger is empty or missing).\",\n details: { total: 0, accept: 0, reject: 0, defer: 0, lastObservedAt: null },\n };\n }\n const acceptPct = ((stats.accept / stats.total) * 100).toFixed(1);\n const rejectPct = ((stats.reject / stats.total) * 100).toFixed(1);\n const deferPct = ((stats.defer / stats.total) * 100).toFixed(1);\n return {\n key: \"observations\",\n status: \"ok\",\n summary: `${stats.total} observations recorded: accept=${acceptPct}%, reject=${rejectPct}%, defer=${deferPct}%. Last observed: ${stats.lastTs ?? \"unknown\"}.`,\n details: {\n total: stats.total,\n accept: stats.accept,\n reject: stats.reject,\n defer: stats.defer,\n deferCapTriggered: stats.deferCapTriggered,\n deferRate: stats.deferRate,\n meanElapsedMs: stats.meanElapsedMs,\n firstObservedAt: stats.firstTs ?? null,\n lastObservedAt: stats.lastTs ?? null,\n },\n };\n } catch (err) {\n return {\n key: \"observations\",\n status: \"warn\",\n summary: \"Could not read observation telemetry ledger.\",\n remediation: \"Retry `remnic doctor` after ensuring the memory state directory is readable.\",\n details: { error: String(err) },\n };\n }\n}\n\n/**\n * Tombstone non-resurrection invariant status for `remnic doctor`\n * (issue #1579).\n *\n * Reports:\n * - active tombstone count (excluding revoked)\n * - revoked count (re-allowed via the review queue)\n * - last append timestamp\n * - corrupted-line count (skipped, not crashed — rule 34/18)\n * - rebuild staleness (whether the in-memory index loaded cleanly)\n *\n * Always informational: a disabled or empty tombstone store is the expected\n * cold-install state and is never an error. A non-zero corrupted-line count\n * surfaces as `warn` so operators know a rebuild (`remnic doctor\n * --rebuild-tombstones`) will repair the log.\n */\nexport async function summarizeTombstoneStatus(\n storage: StorageManager,\n): Promise<OperatorDoctorCheck> {\n try {\n const stats = await storage.getTombstoneStats();\n if (stats === null) {\n return {\n key: \"tombstones\",\n status: \"ok\",\n summary: \"Tombstone non-resurrection invariant is disabled (tombstonesEnabled=false).\",\n details: { enabled: false },\n };\n }\n const corrupted = stats.corruptedLines > 0;\n const parts = [\n `${stats.count} active tombstone(s)`,\n ...(stats.revoked > 0 ? [`${stats.revoked} revoked`] : []),\n ];\n if (stats.lastAppendAt) {\n parts.push(`last append ${stats.lastAppendAt}`);\n }\n if (corrupted) {\n parts.push(`${stats.corruptedLines} corrupted line(s) skipped`);\n }\n return {\n key: \"tombstones\",\n status: corrupted ? \"warn\" : \"ok\",\n summary:\n `Tombstone invariant enabled. ${parts.join(\", \")}. ` +\n (corrupted\n ? \"Run `remnic doctor --rebuild-tombstones` to repair the log.\"\n : \"Re-observation of retired facts is blocked at the storage chokepoint.\"),\n remediation: corrupted\n ? \"Rebuild the tombstone log from retired memories on disk.\"\n : undefined,\n details: {\n enabled: true,\n count: stats.count,\n revoked: stats.revoked,\n lastAppendAt: stats.lastAppendAt,\n corruptedLines: stats.corruptedLines,\n loaded: stats.loaded,\n },\n };\n } catch (err) {\n return {\n key: \"tombstones\",\n status: \"warn\",\n summary: \"Could not read tombstone store stats.\",\n remediation: \"Ensure the memory state directory is readable and rerun `remnic doctor`.\",\n details: { error: String(err) },\n };\n }\n}\n\nexport async function summarizeConsolidationProvenance(\n storage: StorageManager,\n config: Pick<PluginConfig, \"memoryDir\"> & { versioningSidecarDir?: string },\n): Promise<OperatorDoctorCheck> {\n let report: ConsolidationProvenanceReport;\n try {\n report = await runConsolidationProvenanceCheck({\n storage,\n memoryDir: config.memoryDir,\n // Honor the configured sidecar directory (PR #634 review): when an\n // operator overrides `versioningSidecarDir`, the default `.versions`\n // would point at the wrong location and every entry would report as\n // missing. Undefined falls back to the helper's default.\n sidecarDir: config.versioningSidecarDir,\n });\n } catch (err) {\n return {\n key: \"consolidation_provenance\",\n status: \"warn\",\n summary: \"Could not run consolidation-provenance integrity check.\",\n remediation: \"Ensure the memory directory is readable and rerun `remnic doctor`.\",\n details: { error: String(err) },\n };\n }\n\n if (report.issues.length === 0) {\n return {\n key: \"consolidation_provenance\",\n status: \"ok\",\n summary:\n report.withProvenance === 0\n ? \"No consolidation-provenance memories on disk yet.\"\n : `${report.withProvenance} consolidation-provenance memories verified (no broken references).`,\n details: report,\n };\n }\n\n return {\n key: \"consolidation_provenance\",\n status: \"warn\",\n summary: `${report.issues.length} consolidation-provenance integrity issue(s) detected across ${report.withProvenance} memories with provenance frontmatter.`,\n remediation:\n \"Broken pointers are informational. Inspect flagged memories, and if they should resolve, re-snapshot via a consolidation pass or accept pruning.\",\n details: report,\n };\n}\n\nfunction getMemoryAgeBand(memory: MemoryFile, now: Date): string {\n const created = Date.parse(memory.frontmatter.created ?? \"\");\n if (!Number.isFinite(created)) return \"unknown\";\n const ageDays = Math.max(0, Math.floor((now.getTime() - created) / 86_400_000));\n if (ageDays < 7) return \"0_6d\";\n if (ageDays < 30) return \"7_29d\";\n if (ageDays < 90) return \"30_89d\";\n return \"90d_plus\";\n}\n\nasync function dirSize(targetPath: string): Promise<number> {\n try {\n const info = await stat(targetPath);\n if (info.isFile()) return info.size;\n if (!info.isDirectory()) return 0;\n } catch {\n return 0;\n }\n\n let total = 0;\n let entries;\n try {\n entries = await readdir(targetPath, { withFileTypes: true });\n } catch {\n return 0;\n }\n for (const entry of entries) {\n total += await dirSize(path.join(targetPath, entry.name));\n }\n return total;\n}\n\nasync function summarizeStorageFootprint(memoryDir: string): Promise<{ bytes: number; byTopLevel: Record<string, number> }> {\n const topLevel = [\n \"facts\",\n \"entities\",\n \"questions\",\n \"corrections\",\n \"artifacts\",\n \"state\",\n \"identity\",\n \"namespaces\",\n \"summaries\",\n \"profile.md\",\n ];\n const byTopLevel: Record<string, number> = {};\n let bytes = 0;\n for (const name of topLevel) {\n const size = await dirSize(path.join(memoryDir, name));\n if (size > 0) {\n byTopLevel[name] = size;\n bytes += size;\n }\n }\n return { bytes, byTopLevel };\n}\n\nexport async function runOperatorInventory(options: OperatorInventoryOptions): Promise<OperatorInventoryReport> {\n const now = options.now ?? new Date();\n const config = options.orchestrator.config;\n const namespaceEntries = await listNamespaces({ config });\n const uniqueRootEntries = new Map<string, { namespace: string; rootDir: string }>();\n for (const entry of namespaceEntries) {\n if (!uniqueRootEntries.has(entry.rootDir)) {\n uniqueRootEntries.set(entry.rootDir, { namespace: entry.namespace, rootDir: entry.rootDir });\n }\n }\n const categories: Record<string, number> = {};\n const statuses: Record<string, number> = {};\n const ageBands: Record<string, number> = {\n \"0_6d\": 0,\n \"7_29d\": 0,\n \"30_89d\": 0,\n \"90d_plus\": 0,\n unknown: 0,\n };\n const namespaces: OperatorInventoryNamespaceSummary[] = [];\n let totalMemories = 0;\n let totalEntities = 0;\n let archived = 0;\n let pendingReview = 0;\n let quarantined = 0;\n let rejected = 0;\n\n for (const entry of uniqueRootEntries.values()) {\n const storage = new StorageManager(entry.rootDir);\n const memories = await storage.readAllMemories();\n const entities = await storage.readAllEntityFiles();\n namespaces.push({\n namespace: entry.namespace,\n memoryCount: memories.length,\n entityCount: entities.length,\n });\n totalMemories += memories.length;\n totalEntities += entities.length;\n for (const memory of memories) {\n const category = memory.frontmatter.category;\n categories[category] = (categories[category] ?? 0) + 1;\n const status = memory.frontmatter.status ?? \"active\";\n statuses[status] = (statuses[status] ?? 0) + 1;\n ageBands[getMemoryAgeBand(memory, now)] += 1;\n if (status === \"archived\") archived += 1;\n if (status === \"pending_review\") pendingReview += 1;\n if (status === \"quarantined\") quarantined += 1;\n if (status === \"rejected\") rejected += 1;\n }\n }\n\n const defaultStorage = new StorageManager(config.memoryDir);\n const profile = await defaultStorage.readProfile();\n const footprint = await summarizeStorageFootprint(config.memoryDir);\n const reviewRunId = (await listMemoryGovernanceRuns(config.memoryDir))[0];\n let reviewQueue = 0;\n if (reviewRunId) {\n try {\n reviewQueue = (await readMemoryGovernanceRunArtifact(config.memoryDir, reviewRunId)).reviewQueue.length;\n } catch {\n reviewQueue = 0;\n }\n }\n const conversationIndex = await options.orchestrator.getConversationIndexHealth();\n const nativeKnowledgeStatus = await summarizeNativeKnowledgeStatus(config);\n\n return {\n schemaVersion: 1,\n generatedAt: now.toISOString(),\n memoryDir: config.memoryDir,\n totals: {\n memories: totalMemories,\n entities: totalEntities,\n namespaces: namespaceEntries.length,\n reviewQueue,\n storageBytes: footprint.bytes,\n },\n categories,\n statuses,\n namespaces,\n ageBands,\n profile: {\n exists: profile.length > 0,\n chars: profile.length,\n lines: profile.length > 0 ? profile.split(\"\\n\").length : 0,\n },\n storageFootprint: footprint,\n archivePressure: {\n archived,\n pendingReview,\n quarantined,\n rejected,\n },\n conversationIndex: {\n enabled: conversationIndex.enabled,\n backend: conversationIndex.backend,\n status: conversationIndex.status,\n chunkDocCount: conversationIndex.chunkDocCount,\n lastUpdateAt: conversationIndex.lastUpdateAt,\n },\n nativeKnowledge: {\n enabled: nativeKnowledgeStatus.enabled,\n curatedIncludeSync: nativeKnowledgeStatus.curatedIncludeSync,\n obsidianSync: nativeKnowledgeStatus.obsidianSync,\n openclawWorkspaceSync: nativeKnowledgeStatus.openclawWorkspaceSync,\n },\n };\n}\n\nexport async function runBenchmarkRecall(options: BenchmarkRecallOptions): Promise<BenchmarkRecallReport> {\n const now = options.now ?? new Date();\n const status = await getEvalHarnessStatus({\n memoryDir: options.config.memoryDir,\n evalStoreDir: options.config.evalStoreDir,\n enabled: options.config.evalHarnessEnabled,\n shadowModeEnabled: options.config.evalShadowModeEnabled,\n baselineSnapshotsEnabled: options.config.benchmarkBaselineSnapshotsEnabled,\n memoryRedTeamBenchEnabled: options.config.memoryRedTeamBenchEnabled,\n });\n\n if (options.createSnapshot && options.snapshotId) {\n const snapshot = await createEvalBaselineSnapshot({\n memoryDir: options.config.memoryDir,\n evalStoreDir: options.config.evalStoreDir,\n baselineSnapshotsEnabled: options.config.benchmarkBaselineSnapshotsEnabled,\n snapshotId: options.snapshotId,\n notes: options.snapshotNotes,\n gitRef: options.gitRef,\n createdAt: options.createdAt,\n });\n return {\n schemaVersion: 1,\n generatedAt: now.toISOString(),\n mode: \"snapshot\",\n status,\n snapshot: {\n targetPath: snapshot.targetPath,\n snapshotId: snapshot.snapshot.snapshotId,\n },\n };\n }\n\n if (options.baseEvalStoreDir && options.candidateEvalStoreDir) {\n const ciGate = await runEvalBenchmarkCiGate({\n baseEvalStoreDir: options.baseEvalStoreDir,\n candidateEvalStoreDir: options.candidateEvalStoreDir,\n });\n return {\n schemaVersion: 1,\n generatedAt: now.toISOString(),\n mode: \"ci-gate\",\n status,\n ciGate,\n };\n }\n\n if (options.snapshotId) {\n const baselineReport = await runEvalBaselineDeltaReport({\n memoryDir: options.config.memoryDir,\n evalStoreDir: options.config.evalStoreDir,\n benchmarkDeltaReporterEnabled: options.config.benchmarkDeltaReporterEnabled,\n snapshotId: options.snapshotId,\n });\n return {\n schemaVersion: 1,\n generatedAt: now.toISOString(),\n mode: \"baseline-report\",\n status,\n baselineReport,\n };\n }\n\n if (options.validatePath) {\n const validate = await validateEvalBenchmarkPack(options.validatePath, {\n memoryRedTeamBenchEnabled: options.config.memoryRedTeamBenchEnabled,\n });\n return {\n schemaVersion: 1,\n generatedAt: now.toISOString(),\n mode: \"validate\",\n status,\n validate,\n };\n }\n\n return {\n schemaVersion: 1,\n generatedAt: now.toISOString(),\n mode: \"status\",\n status,\n };\n}\n\nexport async function runOperatorRepair(options: OperatorRepairOptions): Promise<OperatorRepairReport> {\n const now = options.now ?? new Date();\n const dryRun = options.dryRun === true || options.apply !== true;\n const sessionCheck = await analyzeSessionIntegrity({ memoryDir: options.config.memoryDir });\n const sessionRepairPlan = planSessionRepair({\n report: sessionCheck,\n dryRun,\n allowSessionFileRepair: options.allowSessionFileRepair,\n sessionFilesDir: options.sessionFilesDir,\n });\n const sessionRepairApply = await applySessionRepair({\n plan: sessionRepairPlan,\n });\n const graphHealth = await analyzeGraphHealth(options.config.memoryDir, {\n entityGraphEnabled: options.config.entityGraphEnabled,\n timeGraphEnabled: options.config.timeGraphEnabled,\n causalGraphEnabled: options.config.causalGraphEnabled,\n includeRepairGuidance: true,\n });\n return {\n schemaVersion: 1,\n generatedAt: now.toISOString(),\n dryRun,\n sessionCheck,\n sessionRepairPlan,\n sessionRepairApply,\n graphHealth,\n };\n}\n"],"mappings":"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","names":["readFile"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/graph.ts"],"sourcesContent":["/**\n * Multi-Graph Memory (MAGMA/SYNAPSE-inspired, v8.2)\n *\n * Maintains three typed edge graphs:\n * entity.jsonl — memories sharing a named entity (entityRef)\n * time.jsonl — consecutive memories in the same thread/session\n * causal.jsonl — memories linked by causal language heuristics\n *\n * Stored under `<memoryDir>/state/graphs/`.\n * All writes are fail-open: errors are caught/logged, never thrown.\n */\n\nimport { appendFile, mkdir, readFile } from \"node:fs/promises\";\nimport * as path from \"node:path\";\n\nimport { readEdgeConfidence } from \"./graph-edge-reinforcement.js\";\nimport { emitGraphEvent } from \"./graph-events.js\";\n\nexport type GraphType = \"entity\" | \"time\" | \"causal\";\n\nexport interface GraphEdge {\n from: string; // relative memory path (e.g. \"facts/2026-02-22/abc.md\")\n to: string; // relative memory path\n type: GraphType;\n weight: number; // 1.0 default, decay applied during traversal\n label: string; // entity name, threadId, or matched causal phrase\n ts: string; // ISO timestamp of edge creation\n\n // Issue #681 — edge confidence + reinforcement (PR 1/3: schema + primitive only).\n // Both fields are optional so existing edges without confidence still validate.\n // Treat a missing `confidence` as 1.0 (legacy behavior) at read sites.\n // PR 2/3 wires the maintenance decay job; PR 3/3 weights PageRank traversal by confidence.\n confidence?: number; // [0, 1]; missing = 1.0\n lastReinforcedAt?: string; // ISO timestamp of most recent reinforcement\n}\n\nexport interface GraphConfig {\n multiGraphMemoryEnabled: boolean;\n entityGraphEnabled: boolean;\n timeGraphEnabled: boolean;\n causalGraphEnabled: boolean;\n maxGraphTraversalSteps: number;\n graphActivationDecay: number;\n maxEntityGraphEdgesPerMemory: number;\n graphLateralInhibitionEnabled: boolean;\n graphLateralInhibitionBeta: number;\n graphLateralInhibitionTopM: number;\n /**\n * Issue #681 PR 3/3 — minimum edge confidence required for traversal.\n * Edges with confidence below this floor are pruned. Legacy edges\n * (no `confidence` field) are treated as 1.0 and always pass.\n * Range `[0, 1]`. Default 0.2.\n */\n graphTraversalConfidenceFloor: number;\n /**\n * Issue #681 PR 3/3 — number of PageRank-style refinement iterations\n * applied on top of BFS activation. Set to 0 to disable refinement\n * and return raw BFS scores. Default 8.\n */\n graphTraversalPageRankIterations: number;\n}\n\n/** Default minimum edge confidence required for traversal (issue #681 PR 3/3). */\nexport const DEFAULT_GRAPH_TRAVERSAL_CONFIDENCE_FLOOR = 0.2;\n/** Default PageRank-style refinement iteration count (issue #681 PR 3/3). */\nexport const DEFAULT_GRAPH_TRAVERSAL_PAGERANK_ITERATIONS = 8;\n\n// Causal signal phrases — order matters (most specific first)\nexport const CAUSAL_PHRASES = [\"as a result\", \"led to\", \"because of\", \"therefore\", \"caused\", \"because\"];\n\nexport function graphsDir(memoryDir: string): string {\n return path.join(memoryDir, \"state\", \"graphs\");\n}\n\nexport function graphFilePath(memoryDir: string, type: GraphType): string {\n return path.join(graphsDir(memoryDir), `${type}.jsonl`);\n}\n\nexport async function ensureGraphsDir(memoryDir: string): Promise<void> {\n await mkdir(graphsDir(memoryDir), { recursive: true });\n}\n\n// ---------------------------------------------------------------------------\n// Per-graph-file write lock (gotcha #40 promise-chain pattern).\n//\n// Both the append path (`appendEdge`) and the rewrite path used by the\n// decay maintenance job must serialize on the same lock keyed by the\n// JSONL file path. Without this, an extraction can append a new edge\n// between the decay job's read-snapshot and rewrite, silently dropping\n// the appended edge during active traffic (issue #729 / Codex P1).\n// ---------------------------------------------------------------------------\nconst graphWriteLocks = new Map<string, Promise<void>>();\n\n/**\n * Run `fn` while holding the write lock for the given graph JSONL file.\n *\n * The lock is keyed by absolute file path so concurrent writes to\n * different graph types proceed independently. The chain recovers from\n * rejection (gotcha #40) so a single I/O failure does not poison all\n * future writers, but the original error is still surfaced to the\n * caller of `withGraphWriteLock`.\n */\nexport function withGraphWriteLock<T>(filePath: string, fn: () => Promise<T>): Promise<T> {\n const prev = graphWriteLocks.get(filePath) ?? Promise.resolve();\n const next = prev.then(fn, fn);\n graphWriteLocks.set(\n filePath,\n next.then(\n () => undefined,\n () => undefined\n )\n );\n return next;\n}\n\nexport async function appendEdge(memoryDir: string, edge: GraphEdge): Promise<void> {\n await ensureGraphsDir(memoryDir);\n const filePath = graphFilePath(memoryDir, edge.type);\n const line = `${JSON.stringify(edge)}\\n`;\n await withGraphWriteLock(filePath, async () => {\n await appendFile(filePath, line, \"utf8\");\n });\n // Emit edge-added event for SSE subscribers (issue #691 PR 5/5).\n // Fail-open: emitGraphEvent catches listener errors so a bad SSE client\n // can never surface into the extraction pipeline.\n emitGraphEvent(memoryDir, \"edge-added\", {\n source: edge.from,\n target: edge.to,\n kind: edge.type,\n weight: edge.weight,\n label: edge.label,\n confidence: typeof edge.confidence === \"number\" ? edge.confidence : 1.0,\n });\n}\n\nfunction isNodeError(err: unknown): err is NodeJS.ErrnoException {\n return typeof err === \"object\" && err !== null && \"code\" in err;\n}\n\nfunction parseEdgesJsonl(raw: string, expectedType: GraphType): GraphEdge[] {\n const edges: GraphEdge[] = [];\n for (const line of raw.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n if (isValidGraphEdge(parsed, expectedType)) {\n edges.push(parsed);\n }\n } catch {\n // skip corrupt lines — fail-open for partial JSONL recovery\n }\n }\n return edges;\n}\n\n/**\n * Read all edges of a given type from the JSONL file.\n * Returns [] if the file doesn't exist or any read error occurs (fail-open).\n *\n * Production traversal callers (recall/PageRank) depend on this fail-open\n * posture so a temporarily missing or unreadable graph file never blocks\n * a recall. Maintenance jobs that need to distinguish ENOENT from real\n * I/O failures must use {@link readEdgesStrict} instead.\n */\nexport async function readEdges(memoryDir: string, type: GraphType): Promise<GraphEdge[]> {\n const filePath = graphFilePath(memoryDir, type);\n try {\n const raw = await readFile(filePath, \"utf8\");\n return parseEdgesJsonl(raw, type);\n } catch {\n return [];\n }\n}\n\n/**\n * Same as {@link readEdges} but only swallows `ENOENT`; all other read\n * errors (`EACCES`, `EIO`, …) are propagated. Used by the graph-edge\n * decay maintenance job so I/O outages surface as a failed run instead\n * of being silently reported as \"no edges to decay\" (issue #729 /\n * Codex P1, line 120).\n */\nexport async function readEdgesStrict(memoryDir: string, type: GraphType): Promise<GraphEdge[]> {\n const filePath = graphFilePath(memoryDir, type);\n try {\n const raw = await readFile(filePath, \"utf8\");\n return parseEdgesJsonl(raw, type);\n } catch (err) {\n if (isNodeError(err) && err.code === \"ENOENT\") {\n return [];\n }\n throw err;\n }\n}\n\n/**\n * Read edges from all enabled graph types.\n */\nexport async function readAllEdges(\n memoryDir: string,\n config: Pick<GraphConfig, \"entityGraphEnabled\" | \"timeGraphEnabled\" | \"causalGraphEnabled\">\n): Promise<GraphEdge[]> {\n const parts: GraphEdge[][] = await Promise.all([\n config.entityGraphEnabled ? readEdges(memoryDir, \"entity\") : Promise.resolve([]),\n config.timeGraphEnabled ? readEdges(memoryDir, \"time\") : Promise.resolve([]),\n config.causalGraphEnabled ? readEdges(memoryDir, \"causal\") : Promise.resolve([]),\n ]);\n return parts.flat();\n}\n\nexport interface GraphHealthFileStats {\n type: GraphType;\n filePath: string;\n exists: boolean;\n totalLines: number;\n validEdges: number;\n corruptLines: number;\n uniqueNodes: number;\n}\n\nexport interface GraphHealthReport {\n generatedAt: string;\n enabledTypes: GraphType[];\n totals: {\n totalLines: number;\n validEdges: number;\n corruptLines: number;\n uniqueNodes: number;\n };\n files: GraphHealthFileStats[];\n repairGuidance?: string[];\n}\n\nfunction isValidGraphEdge(raw: unknown, expectedType: GraphType): raw is GraphEdge {\n if (!raw || typeof raw !== \"object\") return false;\n const edge = raw as Record<string, unknown>;\n return (\n edge.type === expectedType &&\n typeof edge.from === \"string\" &&\n edge.from.length > 0 &&\n typeof edge.to === \"string\" &&\n edge.to.length > 0 &&\n typeof edge.weight === \"number\" &&\n Number.isFinite(edge.weight) &&\n typeof edge.label === \"string\" &&\n typeof edge.ts === \"string\"\n );\n}\n\nexport async function analyzeGraphHealth(\n memoryDir: string,\n options?: {\n entityGraphEnabled?: boolean;\n timeGraphEnabled?: boolean;\n causalGraphEnabled?: boolean;\n includeRepairGuidance?: boolean;\n }\n): Promise<GraphHealthReport> {\n const enabledTypes: GraphType[] = [];\n if (options?.entityGraphEnabled !== false) enabledTypes.push(\"entity\");\n if (options?.timeGraphEnabled !== false) enabledTypes.push(\"time\");\n if (options?.causalGraphEnabled !== false) enabledTypes.push(\"causal\");\n\n const files: GraphHealthFileStats[] = [];\n const globalNodes = new Set<string>();\n\n for (const type of enabledTypes) {\n const filePath = graphFilePath(memoryDir, type);\n let exists = true;\n let totalLines = 0;\n let validEdges = 0;\n let corruptLines = 0;\n const nodes = new Set<string>();\n\n try {\n const raw = await readFile(filePath, \"utf8\");\n for (const line of raw.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n totalLines += 1;\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n if (!isValidGraphEdge(parsed, type)) {\n corruptLines += 1;\n continue;\n }\n validEdges += 1;\n nodes.add(parsed.from);\n nodes.add(parsed.to);\n globalNodes.add(parsed.from);\n globalNodes.add(parsed.to);\n } catch {\n corruptLines += 1;\n }\n }\n } catch {\n exists = false;\n }\n\n files.push({\n type,\n filePath,\n exists,\n totalLines,\n validEdges,\n corruptLines,\n uniqueNodes: nodes.size,\n });\n }\n\n const totals = files.reduce(\n (acc, item) => {\n acc.totalLines += item.totalLines;\n acc.validEdges += item.validEdges;\n acc.corruptLines += item.corruptLines;\n return acc;\n },\n {\n totalLines: 0,\n validEdges: 0,\n corruptLines: 0,\n uniqueNodes: globalNodes.size,\n }\n );\n totals.uniqueNodes = globalNodes.size;\n\n const report: GraphHealthReport = {\n generatedAt: new Date().toISOString(),\n enabledTypes,\n totals,\n files,\n };\n\n if (options?.includeRepairGuidance === true) {\n const guidance: string[] = [];\n if (totals.corruptLines > 0) {\n guidance.push(\n \"Corrupt graph lines detected: back up memory/state/graphs, then rebuild graphs from clean memory replay/extraction runs.\"\n );\n }\n if (totals.validEdges === 0) {\n guidance.push(\n \"No valid edges detected yet: run normal extraction traffic (or replay ingestion) to seed graph files.\"\n );\n }\n if (guidance.length > 0) report.repairGuidance = guidance;\n }\n\n return report;\n}\n\n/**\n * Detect causal signal phrases in text. Returns the first matched phrase, or null.\n */\nexport function detectCausalPhrase(text: string): string | null {\n const lower = text.toLowerCase();\n for (const phrase of CAUSAL_PHRASES) {\n if (lower.includes(phrase)) return phrase;\n }\n return null;\n}\n\n/**\n * GraphIndex — builds and updates the three memory graphs.\n *\n * Usage (orchestrator):\n * this.graphIndex = new GraphIndex(config.memoryDir, config);\n *\n * // After each memory write:\n * await this.graphIndex.onMemoryWritten(memoryPath, frontmatter, threadId, recentInThread);\n */\nexport class GraphIndex {\n private readonly memoryDir: string;\n private readonly cfg: GraphConfig;\n\n // Cache for readAllEdges() result. With 30k+ entity edges (6 MB JSONL) the\n // file read + JSON parse takes 2-4 s per call. This instance-level cache\n // eliminates that overhead on every spreadingActivation() call; it is\n // invalidated (set to null) in onMemoryWritten() so new edges appear promptly.\n private edgeCache: { allEdges: GraphEdge[]; loadedAt: number } | null = null;\n private static readonly EDGE_CACHE_TTL_MS = 300_000; // 5 minutes\n\n constructor(memoryDir: string, cfg: GraphConfig) {\n this.memoryDir = memoryDir;\n this.cfg = cfg;\n }\n\n /** Clear the edge cache so the next spreadingActivation() re-reads from disk.\n * Call after any code path that appends edges outside of onMemoryWritten(). */\n invalidateEdgeCache(): void {\n this.edgeCache = null;\n }\n\n private async loadEdgesCached(): Promise<GraphEdge[]> {\n if (this.edgeCache && Date.now() - this.edgeCache.loadedAt < GraphIndex.EDGE_CACHE_TTL_MS) {\n return this.edgeCache.allEdges;\n }\n const allEdges = await readAllEdges(this.memoryDir, {\n entityGraphEnabled: this.cfg.entityGraphEnabled,\n timeGraphEnabled: this.cfg.timeGraphEnabled,\n causalGraphEnabled: this.cfg.causalGraphEnabled,\n });\n this.edgeCache = { allEdges, loadedAt: Date.now() };\n return allEdges;\n }\n\n /**\n * Called after a memory is written to disk.\n *\n * @param memoryPath - relative path from memoryDir (e.g. \"facts/2026-02-22/abc.md\")\n * @param entityRef - entityRef frontmatter field (if any)\n * @param content - full memory text (for causal detection)\n * @param created - ISO timestamp of this memory\n * @param threadId - current thread ID (for time graph)\n * @param recentInThread - paths of the N most-recent memories in this thread (for time graph)\n * @param entitySiblings - paths of other memories that share the same entityRef (for entity graph)\n */\n async onMemoryWritten(opts: {\n memoryPath: string;\n entityRef?: string;\n content: string;\n created: string;\n threadId?: string;\n recentInThread?: string[];\n entitySiblings?: string[];\n causalPredecessor?: string;\n /**\n * Optional frozen gate overrides (from GraphConstructionCapabilitySet).\n * When provided, these take precedence over `this.cfg` so the caller's\n * operation-scoped snapshot is the single source of truth (#1566).\n */\n graphCapsOverride?: {\n entityGraph: boolean;\n timeGraph: boolean;\n causalGraph: boolean;\n multiGraphMemory: boolean;\n };\n }): Promise<void> {\n const g = opts.graphCapsOverride;\n const multiGraphOn = g ? g.multiGraphMemory : this.cfg.multiGraphMemoryEnabled;\n if (!multiGraphOn) return;\n const entityOn = g ? g.entityGraph : this.cfg.entityGraphEnabled;\n const timeOn = g ? g.timeGraph : this.cfg.timeGraphEnabled;\n const causalOn = g ? g.causalGraph : this.cfg.causalGraphEnabled;\n const ts = new Date().toISOString();\n\n try {\n // Entity graph\n if (entityOn && opts.entityRef && opts.entitySiblings?.length) {\n const siblings = opts.entitySiblings.slice(0, this.cfg.maxEntityGraphEdgesPerMemory);\n for (const sibling of siblings) {\n await appendEdge(this.memoryDir, {\n from: opts.memoryPath,\n to: sibling,\n type: \"entity\",\n weight: 1.0,\n label: opts.entityRef,\n ts,\n });\n }\n }\n\n // Time graph — link to most recent memory in same thread\n if (timeOn && opts.threadId && opts.recentInThread?.length) {\n const predecessor = opts.recentInThread[opts.recentInThread.length - 1];\n if (predecessor && predecessor !== opts.memoryPath) {\n await appendEdge(this.memoryDir, {\n from: predecessor,\n to: opts.memoryPath,\n type: \"time\",\n weight: 1.0,\n label: opts.threadId,\n ts,\n });\n }\n }\n\n // Causal graph\n if (causalOn && opts.causalPredecessor) {\n const phrase = detectCausalPhrase(opts.content);\n if (phrase) {\n await appendEdge(this.memoryDir, {\n from: opts.causalPredecessor,\n to: opts.memoryPath,\n type: \"causal\",\n weight: 1.0,\n label: phrase,\n ts,\n });\n }\n }\n } catch (err) {\n // Fail-open: graph write errors must never surface to caller\n const { log } = await import(\"./logger.js\");\n log.warn(`[graph] onMemoryWritten error: ${err}`);\n } finally {\n // Invalidate edge cache so spreadingActivation() picks up new edges.\n // In `finally` so the cache is cleared even on partial write failure.\n this.edgeCache = null;\n }\n }\n\n /**\n * Spreading activation BFS (SYNAPSE-inspired).\n *\n * Starting from `seeds`, traverse the combined graph for up to `maxSteps` hops.\n * Each candidate gets an activation score = edge.weight × edgeConfidence × decay^hop.\n *\n * Issue #681 PR 3/3 — confidence-aware traversal:\n * - Each edge's `weight` is multiplied by its `confidence` (legacy edges\n * missing `confidence` are treated as 1.0, preserving prior behavior).\n * - Edges with `confidence < graphTraversalConfidenceFloor` are pruned and\n * contribute neither activation nor downstream neighbors.\n * - When `graphTraversalPageRankIterations > 0`, an additional PageRank-\n * style refinement pass redistributes activation along confidence-weighted\n * edges, sharpening the ranking among multi-hop candidates.\n * - Per-result provenance includes the highest-confidence edge that landed\n * on each candidate, so the X-ray surface can attribute pruning and\n * ranking decisions back to specific edges.\n *\n * @param seeds - initial memory paths to expand from (e.g. QMD top results)\n * @param maxSteps - max BFS hops (from config: maxGraphTraversalSteps)\n * @returns Array of {path, score, edgeConfidence, ...} sorted descending, not including seed paths\n */\n async spreadingActivation(\n seeds: string[],\n maxSteps?: number,\n opts?: {\n /**\n * Issue #681 — when `true`, bypasses the configured\n * `graphTraversalConfidenceFloor` and includes low-confidence\n * edges in traversal. Equivalent to forcing the floor to `0`.\n * Default `false` (floor from config is applied).\n */\n includeLowConfidence?: boolean;\n /** Absolute deadline in ms-since-epoch for post-retrieval assembly. */\n deadlineAtMs?: number;\n }\n ): Promise<\n Array<{\n path: string;\n score: number;\n seed: string;\n hopDepth: number;\n decayedWeight: number;\n graphType: \"entity\" | \"time\" | \"causal\";\n /**\n * Confidence of the edge that produced this candidate's recorded\n * provenance (the strongest edge along the chosen entry path).\n * In `[0, 1]`. Legacy edges without `confidence` surface as 1.0.\n */\n edgeConfidence: number;\n }>\n > {\n if (!this.cfg.multiGraphMemoryEnabled) return [];\n const steps = maxSteps ?? this.cfg.maxGraphTraversalSteps;\n const decay = this.cfg.graphActivationDecay;\n // When `includeLowConfidence` is set, use floor=0 so all edges\n // participate in traversal regardless of their decay state.\n // Otherwise clamp the configured floor into [0, 1] so misconfiguration\n // cannot (a) admit edges with negative confidence or (b) reject every\n // edge.\n const floor =\n opts?.includeLowConfidence === true ? 0 : clampConfidenceFloor(this.cfg.graphTraversalConfidenceFloor);\n const iterations = clampPageRankIterations(this.cfg.graphTraversalPageRankIterations);\n const deadlineAtMs = opts?.deadlineAtMs;\n const deadlineExpired = (): boolean =>\n typeof deadlineAtMs === \"number\" && Date.now() >= deadlineAtMs;\n\n try {\n if (deadlineExpired()) return [];\n const allEdges = await this.loadEdgesCached();\n if (deadlineExpired()) return [];\n\n // Build adjacency index: from → edges, to → edges (bidirectional for entity/time, directional for causal).\n // Edges below the confidence floor are pruned at index time so neither\n // direct activation nor downstream BFS expansion can re-introduce them.\n const adj = new Map<string, GraphEdge[]>();\n for (let i = 0; i < allEdges.length; i += 1) {\n if ((i & 1023) === 0 && deadlineExpired()) return [];\n const edge = allEdges[i];\n const conf = readEdgeConfidence(edge);\n if (conf < floor) continue;\n if (!adj.has(edge.from)) adj.set(edge.from, []);\n adj.get(edge.from)!.push(edge);\n // Entity and time edges are bidirectional\n if (edge.type !== \"causal\") {\n if (!adj.has(edge.to)) adj.set(edge.to, []);\n adj.get(edge.to)!.push({ ...edge, from: edge.to, to: edge.from });\n }\n }\n\n const seedSet = new Set(seeds);\n const scores = new Map<string, number>(); // candidate path → accumulated activation score\n const provenance = new Map<\n string,\n {\n seed: string;\n hopDepth: number;\n decayedWeight: number;\n graphType: \"entity\" | \"time\" | \"causal\";\n edgeConfidence: number;\n }\n >();\n let frontier = new Map<string, { node: string; seed: string; activation: number }>();\n const reachedBySeed = new Map<string, Set<string>>();\n for (const seed of seeds) {\n frontier.set(`${seed}\\0${seed}`, { node: seed, seed, activation: 1 });\n reachedBySeed.set(seed, new Set([seed]));\n }\n const finalizeScores = () =>\n Array.from(scores.entries())\n .map(([p, score]) => ({\n path: p,\n score,\n seed: provenance.get(p)?.seed ?? \"\",\n hopDepth: provenance.get(p)?.hopDepth ?? 0,\n decayedWeight: provenance.get(p)?.decayedWeight ?? 0,\n graphType: provenance.get(p)?.graphType ?? \"entity\",\n edgeConfidence: provenance.get(p)?.edgeConfidence ?? 1,\n }))\n .sort((a, b) => b.score - a.score);\n\n for (let hop = 0; hop < steps && frontier.size > 0; hop++) {\n if (deadlineExpired()) return finalizeScores();\n const nextFrontier = new Map<string, { node: string; seed: string; activation: number }>();\n\n for (const { node, seed: sourceSeed, activation } of frontier.values()) {\n const edges = adj.get(node) ?? [];\n for (let i = 0; i < edges.length; i += 1) {\n if ((i & 1023) === 0 && deadlineExpired()) return finalizeScores();\n const edge = edges[i];\n const neighbor = edge.to === node ? edge.from : edge.to;\n const conf = readEdgeConfidence(edge);\n // Defense in depth: the adjacency build already drops sub-floor\n // edges, but if a synthesized reverse edge ever bypassed that\n // path, this guard keeps spreading activation honest.\n if (conf < floor) continue;\n const score = activation * edge.weight * conf * decay;\n const reachedForSeed = reachedBySeed.get(sourceSeed);\n if (reachedForSeed?.has(neighbor)) {\n continue;\n }\n\n if (!seedSet.has(neighbor)) {\n const existing = scores.get(neighbor) ?? 0;\n scores.set(neighbor, existing + score);\n\n const prev = provenance.get(neighbor);\n if (!prev || hop + 1 < prev.hopDepth || (hop + 1 === prev.hopDepth && score > prev.decayedWeight)) {\n provenance.set(neighbor, {\n seed: sourceSeed,\n hopDepth: hop + 1,\n decayedWeight: score,\n graphType: edge.type,\n edgeConfidence: conf,\n });\n }\n\n if (hop + 1 < steps) {\n const frontierKey = `${sourceSeed}\\0${neighbor}`;\n const existingFrontier = nextFrontier.get(frontierKey);\n if (existingFrontier) {\n existingFrontier.activation += score;\n } else {\n nextFrontier.set(frontierKey, {\n node: neighbor,\n seed: sourceSeed,\n activation: score,\n });\n }\n }\n }\n }\n }\n\n for (const { node, seed } of nextFrontier.values()) {\n reachedBySeed.get(seed)?.add(node);\n }\n frontier = nextFrontier;\n }\n\n // Issue #681 PR 3/3 — optional PageRank-style refinement.\n // Redistributes a node's accumulated activation along its outgoing\n // edges, weighted by edge confidence. Damping is fixed at the\n // canonical 0.85 so the ranking stays comparable across queries;\n // the `iterations` knob bounds compute, not behavior shape.\n if (!deadlineExpired() && iterations > 0 && scores.size > 1) {\n applyPageRankRefinement(scores, adj, {\n iterations,\n floor,\n damping: 0.85,\n deadlineAtMs,\n });\n }\n\n // Apply lateral inhibition if enabled (Synapse-inspired competitive suppression)\n if (deadlineExpired()) return finalizeScores();\n if (this.cfg.graphLateralInhibitionEnabled && scores.size > 1) {\n const inhibited = applyLateralInhibition(scores, {\n beta: this.cfg.graphLateralInhibitionBeta,\n topM: this.cfg.graphLateralInhibitionTopM,\n });\n for (const [k, v] of inhibited) {\n scores.set(k, v);\n }\n }\n\n return finalizeScores();\n } catch (err) {\n const { log } = await import(\"./logger.js\");\n log.warn(`[graph] spreadingActivation error: ${err}`);\n return [];\n }\n }\n}\n\n/**\n * Clamp `graphTraversalConfidenceFloor` into the legal range `[0, 1]`.\n * Non-finite or non-numeric values fall back to the documented default\n * so misconfiguration cannot silently disable the floor or reject every edge.\n *\n * Exported for tests; call sites in `spreadingActivation` use it to make\n * the contract explicit at every boundary.\n */\nexport function clampConfidenceFloor(raw: unknown): number {\n if (typeof raw !== \"number\" || !Number.isFinite(raw)) {\n return DEFAULT_GRAPH_TRAVERSAL_CONFIDENCE_FLOOR;\n }\n if (raw < 0) return 0;\n if (raw > 1) return 1;\n return raw;\n}\n\n/**\n * Clamp `graphTraversalPageRankIterations` into a non-negative integer.\n * Negative or non-finite values fall back to 0 (disable refinement) so\n * misconfiguration cannot stall recall in an unbounded loop.\n */\nexport function clampPageRankIterations(raw: unknown): number {\n if (typeof raw !== \"number\" || !Number.isFinite(raw)) return 0;\n if (raw <= 0) return 0;\n return Math.floor(raw);\n}\n\n/**\n * PageRank-style refinement on top of the BFS activation map.\n *\n * Each iteration redistributes a fraction of every node's score along\n * its outgoing edges, scaled by edge confidence. Confidence below\n * `floor` is filtered out before redistribution, mirroring the BFS\n * pruning rule. Mutates `scores` in place.\n *\n * Exported for tests; in production, call sites pass the same adjacency\n * map already used by BFS so behavior stays consistent.\n */\nexport function applyPageRankRefinement(\n scores: Map<string, number>,\n adj: Map<string, GraphEdge[]>,\n opts: { iterations: number; floor: number; damping: number; deadlineAtMs?: number }\n): void {\n const { iterations, floor, damping, deadlineAtMs } = opts;\n if (iterations <= 0 || scores.size === 0) return;\n const safeDamping = Math.min(1, Math.max(0, damping));\n const deadlineExpired = (): boolean =>\n typeof deadlineAtMs === \"number\" && Date.now() >= deadlineAtMs;\n\n // Pre-compute confidence-weighted out-edge totals for normalization.\n // Done once per refinement, not per iteration, since adjacency is\n // immutable inside the loop.\n //\n // Codex P1 (#735): the denominator MUST be computed over the same\n // eligible-neighbor set the iteration redistributes into — i.e.\n // edges whose neighbor is in `scores`. Counting edges-to-seeds (or\n // edges-to-unseen-nodes) in the denominator while dropping their\n // flow during iteration leaks `safeDamping × score` every pass and\n // collapses leaf candidates' scores instead of just re-ranking them.\n const eligible = (edge: GraphEdge, fromNode: string): boolean => {\n if (readEdgeConfidence(edge) < floor) return false;\n const neighbor = edge.to === fromNode ? edge.from : edge.to;\n return scores.has(neighbor);\n };\n const outboundTotal = new Map<string, number>();\n for (const [node, edges] of adj.entries()) {\n if (deadlineExpired()) return;\n if (!scores.has(node)) continue; // only candidate nodes redistribute\n let sum = 0;\n for (const edge of edges) {\n if (!eligible(edge, node)) continue;\n sum += readEdgeConfidence(edge) * edge.weight;\n }\n if (sum > 0) outboundTotal.set(node, sum);\n }\n\n for (let i = 0; i < iterations; i += 1) {\n if (deadlineExpired()) return;\n const next = new Map<string, number>();\n // Teleport / damping floor: every node retains `(1 - damping) * score`\n // of its current activation so dangling nodes do not bleed to zero.\n for (const [node, score] of scores) {\n next.set(node, (1 - safeDamping) * score);\n }\n for (const [node, score] of scores) {\n const outEdges = adj.get(node);\n const total = outboundTotal.get(node);\n // Dangling-node fallback: when a candidate has zero eligible\n // outflow (no in-scores neighbors above the floor), the\n // `safeDamping × score` portion would otherwise evaporate. Keep\n // it on `node` so total mass is conserved and the score reflects\n // the candidate's standing rather than its in-degree topology.\n if (!outEdges || outEdges.length === 0 || !total || total <= 0) {\n next.set(node, (next.get(node) ?? 0) + safeDamping * score);\n continue;\n }\n for (let edgeIndex = 0; edgeIndex < outEdges.length; edgeIndex += 1) {\n if ((edgeIndex & 1023) === 0 && deadlineExpired()) return;\n const edge = outEdges[edgeIndex];\n if (!eligible(edge, node)) continue;\n const conf = readEdgeConfidence(edge);\n const neighbor = edge.to === node ? edge.from : edge.to;\n const flow = safeDamping * score * ((conf * edge.weight) / total);\n next.set(neighbor, (next.get(neighbor) ?? 0) + flow);\n }\n }\n for (const [node, score] of next) {\n scores.set(node, score);\n }\n }\n}\n\n/**\n * Lateral inhibition (Synapse-inspired).\n *\n * For each node, the top-M higher-activation competitors exert inhibition\n * proportional to their activation difference. Output is clamped to [0, ∞).\n *\n * No sigmoid is applied here — downstream `normalizeGraphActivationScore`\n * already applies x/(1+x) soft squash, so adding a sigmoid would double-\n * normalize and cap graph influence at ~50%.\n *\n * Formula: u_hat_i = max(0, u_i - beta * sum_{k in top-M where u_k > u_i}(u_k - u_i))\n *\n * When beta=0 or topM=0, returns original scores unchanged (no-op).\n */\nexport function applyLateralInhibition(\n scores: Map<string, number>,\n opts: { beta: number; topM: number }\n): Map<string, number> {\n const { beta, topM } = opts;\n if (beta === 0 || topM === 0) return new Map(scores);\n\n const sorted = Array.from(scores.entries()).sort((a, b) => b[1] - a[1]);\n const topCompetitors = sorted.slice(0, topM);\n\n const result = new Map<string, number>();\n for (const [node, u] of scores) {\n let inhibition = 0;\n for (const [, uK] of topCompetitors) {\n if (uK > u) {\n inhibition += uK - u;\n }\n }\n result.set(node, Math.max(0, u - beta * inhibition));\n }\n\n return result;\n}\n"],"mappings":"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","names":[]}