@remnic/core 1.0.3 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (323) hide show
  1. package/dist/abort-error.d.ts +32 -0
  2. package/dist/abort-error.js +11 -0
  3. package/dist/access-audit.d.ts +56 -0
  4. package/dist/access-audit.js +9 -0
  5. package/dist/access-audit.js.map +1 -0
  6. package/dist/access-cli.js +72 -54
  7. package/dist/access-cli.js.map +1 -1
  8. package/dist/access-http.d.ts +16 -8
  9. package/dist/access-http.js +25 -17
  10. package/dist/access-mcp.d.ts +16 -8
  11. package/dist/access-mcp.js +28 -6
  12. package/dist/access-schema.d.ts +130 -39
  13. package/dist/access-schema.js +5 -1
  14. package/dist/access-service-Br8ZydTK.d.ts +827 -0
  15. package/dist/access-service.d.ts +20 -660
  16. package/dist/access-service.js +22 -14
  17. package/dist/bootstrap.d.ts +6 -3
  18. package/dist/briefing.d.ts +1 -0
  19. package/dist/briefing.js +6 -5
  20. package/dist/buffer-surprise-report.d.ts +70 -0
  21. package/dist/buffer-surprise-report.js +7 -0
  22. package/dist/buffer-surprise-report.js.map +1 -0
  23. package/dist/buffer-surprise.d.ts +98 -0
  24. package/dist/buffer-surprise.js +11 -0
  25. package/dist/buffer-surprise.js.map +1 -0
  26. package/dist/buffer.d.ts +100 -2
  27. package/dist/buffer.js +1 -1
  28. package/dist/calibration.js +5 -5
  29. package/dist/causal-behavior.js +4 -4
  30. package/dist/causal-chain.js +2 -2
  31. package/dist/causal-consolidation.js +17 -16
  32. package/dist/causal-consolidation.js.map +1 -1
  33. package/dist/causal-retrieval.js +4 -4
  34. package/dist/causal-trajectory.js +1 -1
  35. package/dist/{chunk-QNJMBKFK.js → chunk-2LGMW3DJ.js} +3 -2
  36. package/dist/chunk-2LGMW3DJ.js.map +1 -0
  37. package/dist/{chunk-QDYXG4CS.js → chunk-3FPTCC3Z.js} +4 -3
  38. package/dist/chunk-3FPTCC3Z.js.map +1 -0
  39. package/dist/chunk-3GPTTA4J.js +57 -0
  40. package/dist/chunk-3GPTTA4J.js.map +1 -0
  41. package/dist/{chunk-QKAH5B6E.js → chunk-3GXCSUXR.js} +94 -6
  42. package/dist/chunk-3GXCSUXR.js.map +1 -0
  43. package/dist/{chunk-POBPGDWI.js → chunk-3OGMS3PE.js} +2 -2
  44. package/dist/chunk-54V4BZWP.js +139 -0
  45. package/dist/chunk-54V4BZWP.js.map +1 -0
  46. package/dist/chunk-5JRF2PZA.js +67 -0
  47. package/dist/chunk-5JRF2PZA.js.map +1 -0
  48. package/dist/chunk-64NJRYU2.js +332 -0
  49. package/dist/chunk-64NJRYU2.js.map +1 -0
  50. package/dist/chunk-6AUUAZEX.js +150 -0
  51. package/dist/chunk-6AUUAZEX.js.map +1 -0
  52. package/dist/{chunk-HITJFT7E.js → chunk-7I7FKFZH.js} +28 -21
  53. package/dist/chunk-7I7FKFZH.js.map +1 -0
  54. package/dist/chunk-AJU4PJGY.js +126 -0
  55. package/dist/chunk-AJU4PJGY.js.map +1 -0
  56. package/dist/chunk-ASAITVLA.js +64 -0
  57. package/dist/chunk-ASAITVLA.js.map +1 -0
  58. package/dist/{chunk-X4WESCKA.js → chunk-B5WXLVDY.js} +187 -6
  59. package/dist/chunk-B5WXLVDY.js.map +1 -0
  60. package/dist/{chunk-RCICHSHL.js → chunk-BGJGXLZ7.js} +111 -2
  61. package/dist/{chunk-RCICHSHL.js.map → chunk-BGJGXLZ7.js.map} +1 -1
  62. package/dist/{chunk-OJFGVJS6.js → chunk-BK2EFTE2.js} +319 -18
  63. package/dist/chunk-BK2EFTE2.js.map +1 -0
  64. package/dist/chunk-C4SQJZAF.js +486 -0
  65. package/dist/chunk-C4SQJZAF.js.map +1 -0
  66. package/dist/{chunk-GJQPH5G3.js → chunk-CUPFXL3J.js} +2 -2
  67. package/dist/chunk-DF3RVK3X.js +119 -0
  68. package/dist/chunk-DF3RVK3X.js.map +1 -0
  69. package/dist/{chunk-PMB3WGDL.js → chunk-DFTTJYSO.js} +167 -7
  70. package/dist/chunk-DFTTJYSO.js.map +1 -0
  71. package/dist/chunk-DGVM5SFL.js +69 -0
  72. package/dist/chunk-DGVM5SFL.js.map +1 -0
  73. package/dist/chunk-EIR5VLIH.js +90 -0
  74. package/dist/chunk-EIR5VLIH.js.map +1 -0
  75. package/dist/{chunk-PAORGQRI.js → chunk-EPQJM2GC.js} +37 -23
  76. package/dist/chunk-EPQJM2GC.js.map +1 -0
  77. package/dist/{chunk-POMSFKTB.js → chunk-F5VP6YCB.js} +368 -10
  78. package/dist/chunk-F5VP6YCB.js.map +1 -0
  79. package/dist/{chunk-6ZH4TU6I.js → chunk-FAAFWE4G.js} +2 -1
  80. package/dist/chunk-FAAFWE4G.js.map +1 -0
  81. package/dist/{chunk-74JR4N5J.js → chunk-FVA6TGI3.js} +2 -2
  82. package/dist/chunk-GDFS42HT.js +206 -0
  83. package/dist/chunk-GDFS42HT.js.map +1 -0
  84. package/dist/{chunk-BKQJBXXX.js → chunk-GGD5W7TB.js} +2 -2
  85. package/dist/chunk-GGD5W7TB.js.map +1 -0
  86. package/dist/{chunk-V7XCAHIB.js → chunk-GKFXUTJ2.js} +508 -26
  87. package/dist/chunk-GKFXUTJ2.js.map +1 -0
  88. package/dist/{chunk-NSB3WSYS.js → chunk-HK3FGIEW.js} +278 -3
  89. package/dist/chunk-HK3FGIEW.js.map +1 -0
  90. package/dist/{chunk-AAI7JARD.js → chunk-HMDCOMYU.js} +8 -11
  91. package/dist/chunk-HMDCOMYU.js.map +1 -0
  92. package/dist/chunk-IISBCCWR.js +52 -0
  93. package/dist/chunk-IISBCCWR.js.map +1 -0
  94. package/dist/{chunk-YFYL2SIJ.js → chunk-INXV5JBT.js} +290 -46
  95. package/dist/chunk-INXV5JBT.js.map +1 -0
  96. package/dist/chunk-JBMSGZEQ.js +441 -0
  97. package/dist/chunk-JBMSGZEQ.js.map +1 -0
  98. package/dist/{chunk-UPMD5XND.js → chunk-JL2PU6AI.js} +16 -5
  99. package/dist/chunk-JL2PU6AI.js.map +1 -0
  100. package/dist/{chunk-J4IYOZZ5.js → chunk-JXS5PDQ7.js} +3 -1
  101. package/dist/chunk-JXS5PDQ7.js.map +1 -0
  102. package/dist/{chunk-AYPYCLR7.js → chunk-KUB6JU6H.js} +4 -4
  103. package/dist/chunk-KVBLZUKV.js +173 -0
  104. package/dist/chunk-KVBLZUKV.js.map +1 -0
  105. package/dist/chunk-LBLXEFWK.js +51 -0
  106. package/dist/chunk-LBLXEFWK.js.map +1 -0
  107. package/dist/{chunk-U2IQTSBY.js → chunk-LTCGGW2D.js} +1 -1
  108. package/dist/chunk-LTCGGW2D.js.map +1 -0
  109. package/dist/{chunk-UEYA6UC7.js → chunk-NZLQTHS5.js} +25 -2
  110. package/dist/chunk-NZLQTHS5.js.map +1 -0
  111. package/dist/chunk-PVGDJXVK.js +21 -0
  112. package/dist/chunk-PVGDJXVK.js.map +1 -0
  113. package/dist/chunk-PVPWZSSI.js +37 -0
  114. package/dist/chunk-PVPWZSSI.js.map +1 -0
  115. package/dist/{chunk-4NRAJUDS.js → chunk-RBBWYEFJ.js} +1 -1
  116. package/dist/chunk-RFYAYKTD.js +146 -0
  117. package/dist/chunk-RFYAYKTD.js.map +1 -0
  118. package/dist/{chunk-JROGC36Y.js → chunk-RGLL5SPU.js} +2 -2
  119. package/dist/{chunk-2VFW5K5U.js → chunk-S3EEFKNY.js} +103 -65
  120. package/dist/chunk-S3EEFKNY.js.map +1 -0
  121. package/dist/chunk-SOBJ6NEY.js +18 -0
  122. package/dist/chunk-SOBJ6NEY.js.map +1 -0
  123. package/dist/{chunk-MYQWXITD.js → chunk-SPI27QT6.js} +2 -2
  124. package/dist/chunk-TVVEYCNW.js +65 -0
  125. package/dist/chunk-TVVEYCNW.js.map +1 -0
  126. package/dist/chunk-ULYOGL6R.js +322 -0
  127. package/dist/chunk-ULYOGL6R.js.map +1 -0
  128. package/dist/{chunk-S4LX5EBI.js → chunk-VBVG2M5G.js} +64 -10
  129. package/dist/chunk-VBVG2M5G.js.map +1 -0
  130. package/dist/{chunk-KWP7T3DP.js → chunk-VDX363PS.js} +2 -2
  131. package/dist/{chunk-XMGSSBFX.js → chunk-VYM3VWOF.js} +1560 -244
  132. package/dist/chunk-VYM3VWOF.js.map +1 -0
  133. package/dist/{chunk-MTLYEMJB.js → chunk-WCLICCGB.js} +18 -3
  134. package/dist/chunk-WCLICCGB.js.map +1 -0
  135. package/dist/{chunk-ECKDIK5F.js → chunk-WVVA7F5A.js} +2 -2
  136. package/dist/chunk-X6GF3FX2.js +26 -0
  137. package/dist/chunk-X6GF3FX2.js.map +1 -0
  138. package/dist/{chunk-3QFQGRHO.js → chunk-XMHBH5H6.js} +4 -4
  139. package/dist/{chunk-KEG4GNGI.js → chunk-XZ2TIKGC.js} +38 -8
  140. package/dist/chunk-XZ2TIKGC.js.map +1 -0
  141. package/dist/chunk-Y4FHOFJ2.js +140 -0
  142. package/dist/chunk-Y4FHOFJ2.js.map +1 -0
  143. package/dist/chunk-YNB73F22.js +137 -0
  144. package/dist/chunk-YNB73F22.js.map +1 -0
  145. package/dist/{chunk-7PA4OZEU.js → chunk-YNQKWQT4.js} +55 -30
  146. package/dist/chunk-YNQKWQT4.js.map +1 -0
  147. package/dist/chunk-ZAIM4TUE.js +488 -0
  148. package/dist/chunk-ZAIM4TUE.js.map +1 -0
  149. package/dist/{chunk-BTY5RRRF.js → chunk-ZEM3OK2K.js} +5 -5
  150. package/dist/chunk-ZZTOURJI.js +91 -0
  151. package/dist/chunk-ZZTOURJI.js.map +1 -0
  152. package/dist/{cli-DwIBnp2g.d.ts → cli-BkeRaYfk.d.ts} +2 -2
  153. package/dist/cli.d.ts +13 -5
  154. package/dist/cli.js +45 -33
  155. package/dist/config.js +1 -1
  156. package/dist/consolidation-operator.d.ts +41 -0
  157. package/dist/consolidation-operator.js +11 -0
  158. package/dist/consolidation-operator.js.map +1 -0
  159. package/dist/consolidation-provenance-check.d.ts +68 -0
  160. package/dist/consolidation-provenance-check.js +9 -0
  161. package/dist/consolidation-provenance-check.js.map +1 -0
  162. package/dist/consolidation-undo.d.ts +123 -0
  163. package/dist/consolidation-undo.js +426 -0
  164. package/dist/consolidation-undo.js.map +1 -0
  165. package/dist/contradiction-review-WIUBAR52.js +21 -0
  166. package/dist/contradiction-review-WIUBAR52.js.map +1 -0
  167. package/dist/contradiction-scan-E3GJTI4F.js +412 -0
  168. package/dist/contradiction-scan-E3GJTI4F.js.map +1 -0
  169. package/dist/cross-namespace-budget.d.ts +133 -0
  170. package/dist/cross-namespace-budget.js +9 -0
  171. package/dist/cross-namespace-budget.js.map +1 -0
  172. package/dist/direct-answer-wiring.d.ts +77 -0
  173. package/dist/direct-answer-wiring.js +10 -0
  174. package/dist/direct-answer-wiring.js.map +1 -0
  175. package/dist/direct-answer.d.ts +106 -0
  176. package/dist/direct-answer.js +10 -0
  177. package/dist/direct-answer.js.map +1 -0
  178. package/dist/{engine-X7X3AAG3.js → engine-F3GOXGE5.js} +7 -6
  179. package/dist/engine-F3GOXGE5.js.map +1 -0
  180. package/dist/entity-retrieval.d.ts +1 -0
  181. package/dist/entity-retrieval.js +6 -5
  182. package/dist/explicit-capture.d.ts +6 -3
  183. package/dist/explicit-capture.js +2 -2
  184. package/dist/extraction-judge-telemetry.d.ts +113 -0
  185. package/dist/extraction-judge-telemetry.js +14 -0
  186. package/dist/extraction-judge-telemetry.js.map +1 -0
  187. package/dist/extraction-judge-training.d.ts +85 -0
  188. package/dist/extraction-judge-training.js +16 -0
  189. package/dist/extraction-judge-training.js.map +1 -0
  190. package/dist/extraction-judge.d.ts +124 -2
  191. package/dist/extraction-judge.js +11 -1
  192. package/dist/extraction.js +7 -6
  193. package/dist/fallback-llm.d.ts +11 -2
  194. package/dist/fallback-llm.js +2 -2
  195. package/dist/graph-recall.d.ts +100 -0
  196. package/dist/graph-recall.js +8 -0
  197. package/dist/graph-recall.js.map +1 -0
  198. package/dist/graph-retrieval.d.ts +271 -0
  199. package/dist/graph-retrieval.js +21 -0
  200. package/dist/graph-retrieval.js.map +1 -0
  201. package/dist/harmonic-retrieval.js +2 -1
  202. package/dist/importance.js +1 -1
  203. package/dist/index.d.ts +589 -138
  204. package/dist/index.js +531 -403
  205. package/dist/index.js.map +1 -1
  206. package/dist/intent.js +1 -1
  207. package/dist/local-llm.d.ts +10 -3
  208. package/dist/local-llm.js +1 -1
  209. package/dist/memory-worth-bench.d.ts +51 -0
  210. package/dist/memory-worth-bench.js +131 -0
  211. package/dist/memory-worth-bench.js.map +1 -0
  212. package/dist/memory-worth-filter.d.ts +128 -0
  213. package/dist/memory-worth-filter.js +10 -0
  214. package/dist/memory-worth-filter.js.map +1 -0
  215. package/dist/memory-worth-outcomes.d.ts +118 -0
  216. package/dist/memory-worth-outcomes.js +9 -0
  217. package/dist/memory-worth-outcomes.js.map +1 -0
  218. package/dist/memory-worth.d.ts +102 -0
  219. package/dist/memory-worth.js +7 -0
  220. package/dist/memory-worth.js.map +1 -0
  221. package/dist/operator-toolkit.d.ts +40 -1
  222. package/dist/operator-toolkit.js +24 -14
  223. package/dist/{orchestrator-B9kwlCep.d.ts → orchestrator-CmJ-NTdJ.d.ts} +254 -10
  224. package/dist/orchestrator.d.ts +6 -3
  225. package/dist/orchestrator.js +59 -48
  226. package/dist/page-versioning.d.ts +12 -1
  227. package/dist/page-versioning.js +5 -3
  228. package/dist/{port-C1GZFv8h.d.ts → port-BADbLZU5.d.ts} +2 -2
  229. package/dist/qmd-recall-cache.d.ts +1 -1
  230. package/dist/qmd.d.ts +5 -3
  231. package/dist/qmd.js +2 -1
  232. package/dist/reasoning-trace-recall.d.ts +90 -0
  233. package/dist/reasoning-trace-recall.js +13 -0
  234. package/dist/reasoning-trace-recall.js.map +1 -0
  235. package/dist/reasoning-trace-types.d.ts +54 -0
  236. package/dist/reasoning-trace-types.js +17 -0
  237. package/dist/reasoning-trace-types.js.map +1 -0
  238. package/dist/recall-audit-anomaly.d.ts +112 -0
  239. package/dist/recall-audit-anomaly.js +11 -0
  240. package/dist/recall-audit-anomaly.js.map +1 -0
  241. package/dist/recall-audit.js +5 -44
  242. package/dist/recall-audit.js.map +1 -1
  243. package/dist/recall-explain-renderer.d.ts +49 -0
  244. package/dist/recall-explain-renderer.js +18 -0
  245. package/dist/recall-explain-renderer.js.map +1 -0
  246. package/dist/recall-state.d.ts +39 -1
  247. package/dist/recall-state.js +1 -1
  248. package/dist/recall-xray-cli.d.ts +40 -0
  249. package/dist/recall-xray-cli.js +11 -0
  250. package/dist/recall-xray-cli.js.map +1 -0
  251. package/dist/recall-xray-renderer.d.ts +44 -0
  252. package/dist/recall-xray-renderer.js +18 -0
  253. package/dist/recall-xray-renderer.js.map +1 -0
  254. package/dist/recall-xray.d.ts +179 -0
  255. package/dist/recall-xray.js +13 -0
  256. package/dist/recall-xray.js.map +1 -0
  257. package/dist/resolution-QBTDHTG7.js +100 -0
  258. package/dist/resolution-QBTDHTG7.js.map +1 -0
  259. package/dist/resolve-provider-secret.d.ts +24 -1
  260. package/dist/resolve-provider-secret.js +3 -1
  261. package/dist/resume-bundles.js +6 -6
  262. package/dist/retrieval-agents.d.ts +1 -1
  263. package/dist/retrieval-tiers.d.ts +17 -0
  264. package/dist/retrieval-tiers.js +9 -0
  265. package/dist/retrieval-tiers.js.map +1 -0
  266. package/dist/schemas.d.ts +301 -45
  267. package/dist/schemas.js +1 -1
  268. package/dist/{semantic-consolidation-DrvSYRdB.d.ts → semantic-consolidation-CxJU6MJk.d.ts} +62 -1
  269. package/dist/semantic-consolidation.d.ts +2 -1
  270. package/dist/semantic-consolidation.js +20 -6
  271. package/dist/semantic-rule-promotion.js +6 -5
  272. package/dist/semantic-rule-verifier.js +6 -5
  273. package/dist/storage.d.ts +82 -1
  274. package/dist/storage.js +5 -4
  275. package/dist/summarizer.js +4 -4
  276. package/dist/temporal-supersession.d.ts +1 -0
  277. package/dist/tier-migration.d.ts +2 -1
  278. package/dist/types-DJhqDJUV.d.ts +50 -0
  279. package/dist/types.d.ts +309 -3
  280. package/dist/types.js +1 -1
  281. package/dist/verified-recall.js +6 -5
  282. package/package.json +1 -1
  283. package/dist/chunk-2VFW5K5U.js.map +0 -1
  284. package/dist/chunk-6ZH4TU6I.js.map +0 -1
  285. package/dist/chunk-7PA4OZEU.js.map +0 -1
  286. package/dist/chunk-AAI7JARD.js.map +0 -1
  287. package/dist/chunk-BKQJBXXX.js.map +0 -1
  288. package/dist/chunk-HITJFT7E.js.map +0 -1
  289. package/dist/chunk-J4IYOZZ5.js.map +0 -1
  290. package/dist/chunk-KEG4GNGI.js.map +0 -1
  291. package/dist/chunk-LAYN4LDC.js +0 -267
  292. package/dist/chunk-LAYN4LDC.js.map +0 -1
  293. package/dist/chunk-MTLYEMJB.js.map +0 -1
  294. package/dist/chunk-NSB3WSYS.js.map +0 -1
  295. package/dist/chunk-OJFGVJS6.js.map +0 -1
  296. package/dist/chunk-PAORGQRI.js.map +0 -1
  297. package/dist/chunk-PMB3WGDL.js.map +0 -1
  298. package/dist/chunk-POMSFKTB.js.map +0 -1
  299. package/dist/chunk-QDYXG4CS.js.map +0 -1
  300. package/dist/chunk-QKAH5B6E.js.map +0 -1
  301. package/dist/chunk-QNJMBKFK.js.map +0 -1
  302. package/dist/chunk-S4LX5EBI.js.map +0 -1
  303. package/dist/chunk-U2IQTSBY.js.map +0 -1
  304. package/dist/chunk-UEYA6UC7.js.map +0 -1
  305. package/dist/chunk-UPMD5XND.js.map +0 -1
  306. package/dist/chunk-UVJFDP7P.js +0 -202
  307. package/dist/chunk-UVJFDP7P.js.map +0 -1
  308. package/dist/chunk-V7XCAHIB.js.map +0 -1
  309. package/dist/chunk-X4WESCKA.js.map +0 -1
  310. package/dist/chunk-XMGSSBFX.js.map +0 -1
  311. package/dist/chunk-YFYL2SIJ.js.map +0 -1
  312. /package/dist/{engine-X7X3AAG3.js.map → abort-error.js.map} +0 -0
  313. /package/dist/{chunk-POBPGDWI.js.map → chunk-3OGMS3PE.js.map} +0 -0
  314. /package/dist/{chunk-GJQPH5G3.js.map → chunk-CUPFXL3J.js.map} +0 -0
  315. /package/dist/{chunk-74JR4N5J.js.map → chunk-FVA6TGI3.js.map} +0 -0
  316. /package/dist/{chunk-AYPYCLR7.js.map → chunk-KUB6JU6H.js.map} +0 -0
  317. /package/dist/{chunk-4NRAJUDS.js.map → chunk-RBBWYEFJ.js.map} +0 -0
  318. /package/dist/{chunk-JROGC36Y.js.map → chunk-RGLL5SPU.js.map} +0 -0
  319. /package/dist/{chunk-MYQWXITD.js.map → chunk-SPI27QT6.js.map} +0 -0
  320. /package/dist/{chunk-KWP7T3DP.js.map → chunk-VDX363PS.js.map} +0 -0
  321. /package/dist/{chunk-ECKDIK5F.js.map → chunk-WVVA7F5A.js.map} +0 -0
  322. /package/dist/{chunk-3QFQGRHO.js.map → chunk-XMHBH5H6.js.map} +0 -0
  323. /package/dist/{chunk-BTY5RRRF.js.map → chunk-ZEM3OK2K.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config.ts","../src/connectors/coerce.ts"],"sourcesContent":["import path from \"node:path\";\nimport type {\n CodexCompactionFlushMode,\n CodingModeConfig,\n ContradictionScanConfig,\n CodexCompatConfig,\n DreamingConfig,\n ProceduralConfig,\n HeartbeatConfig,\n IdentityInjectionMode,\n MemoryOsPresetName,\n PluginConfig,\n PrincipalRule,\n RecallPipelineConfig,\n RecallSectionConfig,\n ReasoningEffort,\n SemanticChunkingConfigShape,\n SessionObserverBandConfig,\n SlotBehaviorConfig,\n SlotMismatchMode,\n TriggerMode,\n} from \"./types.js\";\nimport { log } from \"./logger.js\";\nimport { cloneDefaultSessionObserverBands } from \"./session-observer-bands.js\";\nimport { readEnvVar, resolveHomeDir } from \"./runtime/env.js\";\nimport { normalizeEntitySchemas } from \"./entity-schema.js\";\n// Finding 4 (#394): use the shared coerce helper instead of inlining the same\n// boolean-coercion logic that connectors/index.ts already exports. The helper\n// lives in connectors/coerce.ts (a tiny, dependency-free module) so neither\n// config.ts → connectors/index.ts nor the reverse circular import arises.\nimport { coerceBool, coerceInstallExtension, coerceNumber } from \"./connectors/coerce.js\";\n\nconst DEFAULT_MEMORY_DIR = path.join(\n resolveHomeDir(),\n \".openclaw\",\n \"workspace\",\n \"memory\",\n \"local\",\n);\n\nconst DEFAULT_WORKSPACE_DIR = path.join(\n resolveHomeDir(),\n \".openclaw\",\n \"workspace\",\n);\n\nfunction resolveEnvVars(value: string): string {\n const resolved = value.replace(/\\$\\{([A-Za-z_][A-Za-z0-9_]*)\\}/g, (_, envVar: string) => {\n const envValue = readEnvVar(envVar);\n if (!envValue) {\n throw new Error(`Environment variable ${envVar} is not set`);\n }\n return envValue;\n });\n const remaining = resolved.match(/\\$\\{[^}]*\\}/);\n if (remaining) {\n throw new Error(`Malformed environment variable placeholder: ${remaining[0]}`);\n }\n return resolved;\n}\n\nfunction normalizeOpenaiBaseUrl(value: string | undefined, source: \"config\" | \"env\"): string | undefined {\n if (!value) return undefined;\n const trimmed = value.trim();\n if (trimmed.length === 0) return undefined;\n\n let parsed: URL;\n try {\n parsed = new URL(trimmed);\n } catch {\n log.warn(`ignoring invalid openaiBaseUrl from ${source}: not a valid URL`);\n return undefined;\n }\n\n if (parsed.protocol !== \"https:\" && parsed.protocol !== \"http:\") {\n log.warn(\n `ignoring openaiBaseUrl from ${source}: unsupported URL scheme (${parsed.protocol.replace(\":\", \"\")})`,\n );\n return undefined;\n }\n\n if (parsed.protocol === \"http:\") {\n log.warn(`openaiBaseUrl from ${source} is using insecure http; prefer https`);\n }\n\n // Avoid duplicate slash behavior in downstream baseURL path joins.\n let url = parsed.toString();\n while (url.endsWith(\"/\")) url = url.slice(0, -1);\n return url;\n}\n\nfunction normalizeMemoryRelativeDir(raw: unknown, fallback: string): string {\n if (typeof raw !== \"string\") return fallback;\n const trimmed = raw.trim();\n if (trimmed.length === 0) return fallback;\n\n const normalized = trimmed\n .replace(/\\\\/g, \"/\")\n .split(\"/\")\n .filter((segment) => segment.length > 0 && segment !== \".\" && segment !== \"..\")\n .join(\"/\");\n return normalized.length > 0 ? normalized : fallback;\n}\n\n/**\n * Parse and validate the semanticChunkingConfig sub-object.\n * Returns only recognized numeric/boolean fields with their correct types.\n */\nfunction parseContradictionScanConfig(raw: unknown): ContradictionScanConfig {\n if (!raw || typeof raw !== \"object\") {\n return {\n enabled: false,\n similarityFloor: 0.82,\n topicOverlapFloor: 0.4,\n maxPairsPerRun: 500,\n cooldownDays: 14,\n autoMergeDuplicates: false,\n };\n }\n const src = raw as Record<string, unknown>;\n const simFloor = coerceNumber(src.similarityFloor) ?? 0.82;\n const topicFloor = coerceNumber(src.topicOverlapFloor) ?? 0.4;\n const maxPairs = coerceNumber(src.maxPairsPerRun) ?? 500;\n const cooldown = coerceNumber(src.cooldownDays) ?? 14;\n return {\n enabled: coerceBool(src.enabled) === true,\n similarityFloor: Math.min(1, Math.max(0, simFloor)),\n topicOverlapFloor: Math.min(1, Math.max(0, topicFloor)),\n maxPairsPerRun: Math.max(1, maxPairs),\n cooldownDays: Math.max(0, cooldown),\n autoMergeDuplicates: coerceBool(src.autoMergeDuplicates) === true,\n };\n}\n\nfunction parseSemanticChunkingConfig(\n raw: unknown,\n): Partial<SemanticChunkingConfigShape> {\n if (!raw || typeof raw !== \"object\") return {};\n const src = raw as Record<string, unknown>;\n const out: Partial<SemanticChunkingConfigShape> = {};\n\n if (typeof src.targetTokens === \"number\") out.targetTokens = src.targetTokens;\n if (typeof src.minTokens === \"number\") out.minTokens = src.minTokens;\n if (typeof src.maxTokens === \"number\") out.maxTokens = src.maxTokens;\n if (typeof src.smoothingWindowSize === \"number\") out.smoothingWindowSize = src.smoothingWindowSize;\n if (typeof src.boundaryThresholdStdDevs === \"number\") out.boundaryThresholdStdDevs = src.boundaryThresholdStdDevs;\n if (typeof src.embeddingBatchSize === \"number\") out.embeddingBatchSize = src.embeddingBatchSize;\n if (typeof src.fallbackToRecursive === \"boolean\") out.fallbackToRecursive = src.fallbackToRecursive;\n\n return out;\n}\n\nconst VALID_EFFORTS: ReasoningEffort[] = [\"none\", \"low\", \"medium\", \"high\"];\nconst VALID_TRIGGERS: TriggerMode[] = [\"smart\", \"every_n\", \"time_based\"];\nconst VALID_IDENTITY_INJECTION_MODES: IdentityInjectionMode[] = [\"recovery_only\", \"minimal\", \"full\"];\nconst VALID_MEMORY_OS_PRESETS: MemoryOsPresetName[] = [\n \"conservative\",\n \"balanced\",\n \"research-max\",\n \"local-llm-heavy\",\n];\nconst VALID_SLOT_MISMATCH_MODES: SlotMismatchMode[] = [\"error\", \"warn\", \"silent\"];\nconst VALID_CODEX_COMPACTION_FLUSH_MODES: CodexCompactionFlushMode[] = [\"signal\", \"heuristic\", \"auto\"];\nexport const VALID_MEMORY_CATEGORIES = new Set([\n \"fact\",\n \"preference\",\n \"correction\",\n \"entity\",\n \"decision\",\n \"relationship\",\n \"principle\",\n \"commitment\",\n \"moment\",\n \"skill\",\n \"rule\",\n \"procedure\",\n \"reasoning_trace\",\n]);\n\nconst DEFAULT_BEHAVIOR_LOOP_PROTECTED_PARAMS = [\n \"maxMemoryTokens\",\n \"qmdMaxResults\",\n \"qmdColdMaxResults\",\n \"recallPlannerMaxQmdResultsMinimal\",\n \"verbatimArtifactsMaxRecall\",\n];\n\nconst MEMORY_OS_PRESET_ALIASES: Record<string, MemoryOsPresetName> = {\n research: \"research-max\",\n};\n\nconst MEMORY_OS_PRESETS: Record<MemoryOsPresetName, Record<string, unknown>> = {\n conservative: {\n maxMemoryTokens: 1500,\n recallPlannerMaxQmdResultsMinimal: 2,\n recallPlannerMaxQmdResultsFull: 5,\n queryAwareIndexingEnabled: false,\n verbatimArtifactsEnabled: false,\n verbatimArtifactsMaxRecall: 2,\n rerankEnabled: false,\n localLlmEnabled: false,\n localLlmFastEnabled: false,\n multiGraphMemoryEnabled: false,\n graphRecallEnabled: false,\n graphAssistInFullModeEnabled: false,\n proactiveExtractionEnabled: false,\n contextCompressionActionsEnabled: false,\n compressionGuidelineLearningEnabled: false,\n compressionGuidelineSemanticRefinementEnabled: false,\n maxProactiveQuestionsPerExtraction: 0,\n maxCompressionTokensPerHour: 0,\n behaviorLoopAutoTuneEnabled: false,\n // Issue #567 PR 4/5 flipped `procedural.enabled` default to `true`.\n // The conservative preset intentionally keeps the feature OFF to\n // match its restrictive intent (no proactive extraction, no\n // compression guideline learning, etc.). Users who want procedural\n // memory on a conservative preset must set `procedural.enabled: true`\n // explicitly.\n procedural: { enabled: false },\n },\n balanced: {\n maxMemoryTokens: 2000,\n recallPlannerMaxQmdResultsMinimal: 4,\n recallPlannerMaxQmdResultsFull: 8,\n queryAwareIndexingEnabled: true,\n verbatimArtifactsEnabled: true,\n verbatimArtifactsMaxRecall: 4,\n rerankEnabled: true,\n rerankProvider: \"local\",\n localLlmEnabled: false,\n localLlmFastEnabled: false,\n multiGraphMemoryEnabled: false,\n graphRecallEnabled: false,\n graphAssistInFullModeEnabled: false,\n proactiveExtractionEnabled: false,\n contextCompressionActionsEnabled: false,\n compressionGuidelineLearningEnabled: false,\n compressionGuidelineSemanticRefinementEnabled: false,\n maxProactiveQuestionsPerExtraction: 2,\n maxCompressionTokensPerHour: 1500,\n behaviorLoopAutoTuneEnabled: false,\n },\n \"research-max\": {\n maxMemoryTokens: 3200,\n recallPlannerMaxQmdResultsMinimal: 6,\n recallPlannerMaxQmdResultsFull: 12,\n queryAwareIndexingEnabled: true,\n verbatimArtifactsEnabled: true,\n verbatimArtifactsMaxRecall: 6,\n rerankEnabled: true,\n rerankProvider: \"local\",\n localLlmEnabled: false,\n localLlmFastEnabled: false,\n multiGraphMemoryEnabled: true,\n graphRecallEnabled: true,\n graphAssistInFullModeEnabled: true,\n proactiveExtractionEnabled: true,\n contextCompressionActionsEnabled: true,\n compressionGuidelineLearningEnabled: true,\n compressionGuidelineSemanticRefinementEnabled: true,\n maxProactiveQuestionsPerExtraction: 4,\n maxCompressionTokensPerHour: 3000,\n behaviorLoopAutoTuneEnabled: true,\n },\n \"local-llm-heavy\": {\n maxMemoryTokens: 2400,\n recallPlannerMaxQmdResultsMinimal: 4,\n recallPlannerMaxQmdResultsFull: 8,\n queryAwareIndexingEnabled: true,\n verbatimArtifactsEnabled: true,\n verbatimArtifactsMaxRecall: 4,\n rerankEnabled: true,\n rerankProvider: \"local\",\n localLlmEnabled: true,\n localLlmFastEnabled: true,\n embeddingFallbackProvider: \"local\",\n localLlmFallback: true,\n multiGraphMemoryEnabled: false,\n graphRecallEnabled: false,\n graphAssistInFullModeEnabled: false,\n proactiveExtractionEnabled: true,\n contextCompressionActionsEnabled: true,\n compressionGuidelineLearningEnabled: true,\n compressionGuidelineSemanticRefinementEnabled: false,\n maxProactiveQuestionsPerExtraction: 2,\n maxCompressionTokensPerHour: 1500,\n behaviorLoopAutoTuneEnabled: false,\n },\n};\n\nfunction resolveMemoryOsPreset(value: unknown): MemoryOsPresetName | undefined {\n if (typeof value !== \"string\") return undefined;\n const normalized = value.trim();\n if (VALID_MEMORY_OS_PRESETS.includes(normalized as MemoryOsPresetName)) {\n return normalized as MemoryOsPresetName;\n }\n return MEMORY_OS_PRESET_ALIASES[normalized];\n}\n\nexport function parseConfig(raw: unknown): PluginConfig {\n const baseCfg =\n raw && typeof raw === \"object\" && !Array.isArray(raw)\n ? (raw as Record<string, unknown>)\n : {};\n const memoryOsPreset = resolveMemoryOsPreset(baseCfg.memoryOsPreset);\n let cfg: Record<string, unknown>;\n if (memoryOsPreset) {\n const preset = MEMORY_OS_PRESETS[memoryOsPreset];\n // Deep-merge the `procedural` block specifically: the preset may pin a\n // subset of keys (e.g. `conservative` pins `procedural: { enabled: false }`),\n // and a user-provided `procedural` block with just `minOccurrences` or\n // `lookbackDays` must NOT silently discard the preset's `enabled: false`.\n // CLAUDE.md rule 22 (dedup config resolution) + Codex P1 on #609.\n const presetProcedural =\n preset.procedural &&\n typeof preset.procedural === \"object\" &&\n !Array.isArray(preset.procedural)\n ? (preset.procedural as Record<string, unknown>)\n : undefined;\n const baseProcedural =\n baseCfg.procedural &&\n typeof baseCfg.procedural === \"object\" &&\n !Array.isArray(baseCfg.procedural)\n ? (baseCfg.procedural as Record<string, unknown>)\n : undefined;\n const mergedProcedural =\n presetProcedural && baseProcedural\n ? { ...presetProcedural, ...baseProcedural }\n : (baseProcedural ?? presetProcedural);\n cfg = {\n ...preset,\n ...baseCfg,\n memoryOsPreset,\n };\n if (mergedProcedural !== undefined) {\n cfg.procedural = mergedProcedural;\n }\n } else {\n cfg = baseCfg;\n }\n\n let apiKey: string | undefined;\n if (typeof cfg.openaiApiKey === \"string\" && cfg.openaiApiKey.length > 0) {\n apiKey = resolveEnvVars(cfg.openaiApiKey);\n } else {\n apiKey = process.env.OPENAI_API_KEY;\n }\n\n // API key is optional at load time — retrieval works without it.\n // Extraction will log a warning if called without a key.\n\n const model =\n typeof cfg.model === \"string\" && cfg.model.length > 0\n ? cfg.model\n : \"gpt-5.2\";\n const captureMode =\n cfg.captureMode === \"explicit\" || cfg.captureMode === \"hybrid\"\n ? cfg.captureMode\n : \"implicit\";\n\n const rawEffort = cfg.reasoningEffort as string | undefined;\n const reasoningEffort: ReasoningEffort =\n rawEffort && VALID_EFFORTS.includes(rawEffort as ReasoningEffort)\n ? (rawEffort as ReasoningEffort)\n : \"low\";\n\n const rawTrigger = cfg.triggerMode as string | undefined;\n const triggerMode: TriggerMode =\n rawTrigger && VALID_TRIGGERS.includes(rawTrigger as TriggerMode)\n ? (rawTrigger as TriggerMode)\n : \"smart\";\n const rawSlotBehavior =\n cfg.slotBehavior && typeof cfg.slotBehavior === \"object\" && !Array.isArray(cfg.slotBehavior)\n ? (cfg.slotBehavior as Record<string, unknown>)\n : {};\n const slotBehavior: SlotBehaviorConfig = {\n requireExclusiveMemorySlot:\n rawSlotBehavior.requireExclusiveMemorySlot !== false,\n onSlotMismatch:\n typeof rawSlotBehavior.onSlotMismatch === \"string\" &&\n VALID_SLOT_MISMATCH_MODES.includes(\n rawSlotBehavior.onSlotMismatch as SlotMismatchMode,\n )\n ? (rawSlotBehavior.onSlotMismatch as SlotMismatchMode)\n : \"error\",\n };\n const rawDreaming =\n cfg.dreaming && typeof cfg.dreaming === \"object\" && !Array.isArray(cfg.dreaming)\n ? (cfg.dreaming as Record<string, unknown>)\n : {};\n const dreaming: DreamingConfig = {\n enabled: rawDreaming.enabled === true,\n journalPath:\n typeof rawDreaming.journalPath === \"string\" && rawDreaming.journalPath.trim().length > 0\n ? rawDreaming.journalPath.trim()\n : \"DREAMS.md\",\n maxEntries:\n typeof rawDreaming.maxEntries === \"number\"\n ? rawDreaming.maxEntries === 0\n ? 0\n : rawDreaming.maxEntries < 0\n ? 500\n : rawDreaming.maxEntries < 10\n ? 500\n : Math.min(10000, Math.floor(rawDreaming.maxEntries))\n : 500,\n injectRecentCount:\n typeof rawDreaming.injectRecentCount === \"number\"\n ? Math.min(20, Math.max(0, Math.floor(rawDreaming.injectRecentCount)))\n : 3,\n minIntervalMinutes:\n typeof rawDreaming.minIntervalMinutes === \"number\"\n ? Math.max(1, Math.floor(rawDreaming.minIntervalMinutes))\n : 120,\n narrativeModel:\n typeof rawDreaming.narrativeModel === \"string\" && rawDreaming.narrativeModel.trim().length > 0\n ? rawDreaming.narrativeModel.trim()\n : null,\n narrativePromptStyle:\n rawDreaming.narrativePromptStyle === \"diary\" ||\n rawDreaming.narrativePromptStyle === \"analytical\"\n ? rawDreaming.narrativePromptStyle\n : \"reflective\",\n watchFile: rawDreaming.watchFile !== false,\n };\n const rawHeartbeat =\n cfg.heartbeat && typeof cfg.heartbeat === \"object\" && !Array.isArray(cfg.heartbeat)\n ? (cfg.heartbeat as Record<string, unknown>)\n : {};\n const heartbeat: HeartbeatConfig = {\n enabled: rawHeartbeat.enabled === true,\n journalPath:\n typeof rawHeartbeat.journalPath === \"string\" && rawHeartbeat.journalPath.trim().length > 0\n ? rawHeartbeat.journalPath.trim()\n : \"HEARTBEAT.md\",\n maxPreviousRuns:\n typeof rawHeartbeat.maxPreviousRuns === \"number\"\n ? Math.min(20, Math.max(0, Math.floor(rawHeartbeat.maxPreviousRuns)))\n : 5,\n watchFile: rawHeartbeat.watchFile !== false,\n detectionMode:\n rawHeartbeat.detectionMode === \"runtime-signal\" ||\n rawHeartbeat.detectionMode === \"heuristic\"\n ? rawHeartbeat.detectionMode\n : \"auto\",\n gateExtractionDuringHeartbeat:\n rawHeartbeat.gateExtractionDuringHeartbeat !== false,\n };\n const rawCodexCompat =\n cfg.codexCompat && typeof cfg.codexCompat === \"object\" && !Array.isArray(cfg.codexCompat)\n ? (cfg.codexCompat as Record<string, unknown>)\n : {};\n const codexCompat: CodexCompatConfig = {\n enabled: rawCodexCompat.enabled === true,\n threadIdBufferKeying: rawCodexCompat.threadIdBufferKeying !== false,\n compactionFlushMode:\n typeof rawCodexCompat.compactionFlushMode === \"string\" &&\n VALID_CODEX_COMPACTION_FLUSH_MODES.includes(\n rawCodexCompat.compactionFlushMode as CodexCompactionFlushMode,\n )\n ? (rawCodexCompat.compactionFlushMode as CodexCompactionFlushMode)\n : \"auto\",\n fingerprintDedup: rawCodexCompat.fingerprintDedup !== false,\n };\n\n // Validate the shape of the `procedural` config block BEFORE applying the\n // default-on behavior. Codex P2 on #609: a shorthand opt-out like\n // `procedural: false` or `procedural: null` would previously normalize\n // silently to `{}`, and the omitted-key branch would then enable the\n // feature — the opposite of what the user asked for. Reject\n // non-object shapes loudly per CLAUDE.md rule 51.\n if (\n cfg.procedural !== undefined &&\n (cfg.procedural === null ||\n typeof cfg.procedural !== \"object\" ||\n Array.isArray(cfg.procedural))\n ) {\n throw new Error(\n `procedural must be an object (got ${JSON.stringify(cfg.procedural)}). Use procedural: { enabled: false } to opt out; omit the key to use the default-on behavior (issue #567 PR 4).`,\n );\n }\n const rawProcedural =\n cfg.procedural && typeof cfg.procedural === \"object\" && !Array.isArray(cfg.procedural)\n ? (cfg.procedural as Record<string, unknown>)\n : {};\n const proceduralMinCoerced = coerceNumber(rawProcedural.minOccurrences);\n const proceduralMinRaw =\n proceduralMinCoerced !== undefined\n ? Math.floor(proceduralMinCoerced)\n : 3;\n const successFloorRaw = coerceNumber(rawProcedural.successFloor);\n // Safer-by-default floor (issue #567 PR 3/5): raise from 0.7 to 0.75.\n // Miner promotion now requires a stricter trajectory success rate before\n // procedures become candidates, reducing false positives when procedural\n // recall is enabled by default in slice 4.\n const successFloor =\n successFloorRaw !== undefined &&\n successFloorRaw >= 0 &&\n successFloorRaw <= 1\n ? successFloorRaw\n : 0.75;\n const autoPromoteOccRaw = coerceNumber(rawProcedural.autoPromoteOccurrences);\n const autoPromoteOccurrences =\n autoPromoteOccRaw !== undefined && Number.isFinite(autoPromoteOccRaw)\n ? autoPromoteOccRaw <= 0\n ? 0\n : Math.min(10_000, Math.max(1, Math.floor(autoPromoteOccRaw)))\n : 8;\n const lookbackCoerced = coerceNumber(rawProcedural.lookbackDays);\n // Safer-by-default lookback (issue #567 PR 3/5): lower from 30 to 14 days.\n // Shorter window keeps mined procedures more recent, which improves\n // relevance once recall is on by default.\n const lookbackDays =\n lookbackCoerced !== undefined && Number.isFinite(lookbackCoerced)\n ? Math.min(3650, Math.max(1, Math.floor(lookbackCoerced)))\n : 14;\n const recallMaxCoerced = coerceNumber(rawProcedural.recallMaxProcedures);\n // Safer-by-default recall cap (issue #567 PR 3/5): lower from 3 to 2.\n // Cap the injected procedure block so enabling procedural recall by\n // default does not crowd out other recall sections.\n const recallMaxProcedures =\n recallMaxCoerced !== undefined && Number.isFinite(recallMaxCoerced)\n ? Math.min(10, Math.max(1, Math.floor(recallMaxCoerced)))\n : 2;\n // Default-on procedural memory (issue #567 PR 4/5): if the user has NOT\n // explicitly set `procedural.enabled`, enable it. Explicit `false` (or any\n // value coerceBool reads as false: `\"0\"`, `\"no\"`, `\"off\"`, `false`) keeps\n // the feature off. CLAUDE.md rules:\n // - #30 — escape hatch remains for operators who want to stay opt-out.\n // - #36 — \"false\"-ish strings coerce to false via coerceBool.\n // - #51 — when the key IS present but the value can't be understood\n // (typo like `\"fales\"` or a number like `0`), reject loudly instead\n // of silently flipping the default. Silent fallback on bad input is\n // how procedural memory would end up \"fail-open\" for typos.\n const rawEnabledValue = rawProcedural.enabled;\n let proceduralEnabled: boolean;\n if (rawEnabledValue === undefined) {\n proceduralEnabled = true;\n } else {\n const enabledCoerced = coerceBool(rawEnabledValue);\n if (enabledCoerced === undefined) {\n throw new Error(\n `procedural.enabled must be a boolean or one of \"true\"/\"false\"/\"1\"/\"0\"/\"yes\"/\"no\"/\"on\"/\"off\" (got ${JSON.stringify(rawEnabledValue)}). Omit the key to use the default-on behavior (issue #567 PR 4).`,\n );\n }\n proceduralEnabled = enabledCoerced;\n }\n const procedural: ProceduralConfig = {\n enabled: proceduralEnabled,\n /** `0` skips all mining (`minOccurrences_zero`); otherwise clusters need at least this many members. */\n minOccurrences: Math.min(1000, Math.max(0, proceduralMinRaw)),\n successFloor,\n autoPromoteOccurrences,\n autoPromoteEnabled: coerceBool(rawProcedural.autoPromoteEnabled) === true,\n lookbackDays,\n proceduralMiningCronAutoRegister: coerceBool(rawProcedural.proceduralMiningCronAutoRegister) === true,\n recallMaxProcedures,\n };\n\n // Coding-agent project/branch scoping (issue #569)\n const rawCodingMode =\n cfg.codingMode && typeof cfg.codingMode === \"object\" && !Array.isArray(cfg.codingMode)\n ? (cfg.codingMode as Record<string, unknown>)\n : {};\n // Default: projectScope=true (enabled), branchScope=false (opt-in).\n // `coerceBool` treats \"false\"/\"0\"/\"no\"/\"off\" as false (CLAUDE.md #36).\n const codingProjectScopeRaw = coerceBool(rawCodingMode.projectScope);\n const codingBranchScopeRaw = coerceBool(rawCodingMode.branchScope);\n const codingMode: CodingModeConfig = {\n projectScope: codingProjectScopeRaw === undefined ? true : codingProjectScopeRaw,\n branchScope: codingBranchScopeRaw === true,\n };\n\n const memoryDir =\n typeof cfg.memoryDir === \"string\" && cfg.memoryDir.length > 0\n ? cfg.memoryDir\n : DEFAULT_MEMORY_DIR;\n const rawIdentityInjectionMode = cfg.identityInjectionMode as string | undefined;\n const identityInjectionMode: IdentityInjectionMode =\n rawIdentityInjectionMode\n && VALID_IDENTITY_INJECTION_MODES.includes(rawIdentityInjectionMode as IdentityInjectionMode)\n ? (rawIdentityInjectionMode as IdentityInjectionMode)\n : \"recovery_only\";\n const identityContinuityEnabled = cfg.identityContinuityEnabled === true;\n const sessionObserverBands: SessionObserverBandConfig[] = Array.isArray(cfg.sessionObserverBands)\n ? (cfg.sessionObserverBands as Array<Record<string, unknown>>)\n .map((band) => ({\n maxBytes:\n typeof band?.maxBytes === \"number\" ? Math.max(0, Math.floor(band.maxBytes)) : 0,\n triggerDeltaBytes:\n typeof band?.triggerDeltaBytes === \"number\"\n ? Math.max(0, Math.floor(band.triggerDeltaBytes))\n : 0,\n triggerDeltaTokens:\n typeof band?.triggerDeltaTokens === \"number\"\n ? Math.max(0, Math.floor(band.triggerDeltaTokens))\n : 0,\n }))\n .filter((band) => band.maxBytes > 0)\n : cloneDefaultSessionObserverBands();\n\n const principalRules: PrincipalRule[] = Array.isArray(cfg.principalFromSessionKeyRules)\n ? (cfg.principalFromSessionKeyRules as any[]).map((r) => ({\n match: typeof r?.match === \"string\" ? r.match : \"\",\n principal: typeof r?.principal === \"string\" ? r.principal : \"\",\n })).filter((r) => r.match.length > 0 && r.principal.length > 0)\n : [];\n const entitySchemas = normalizeEntitySchemas(cfg.entitySchemas);\n\n // Optional file hygiene (memory file limits / truncation risk mitigation)\n const rawHygiene =\n cfg.fileHygiene && typeof cfg.fileHygiene === \"object\" && !Array.isArray(cfg.fileHygiene)\n ? (cfg.fileHygiene as Record<string, unknown>)\n : undefined;\n const hygieneEnabled = rawHygiene?.enabled === true;\n const fileHygiene = hygieneEnabled\n ? {\n enabled: true,\n lintEnabled: rawHygiene?.lintEnabled !== false,\n lintBudgetBytes:\n typeof rawHygiene?.lintBudgetBytes === \"number\" ? rawHygiene.lintBudgetBytes : 20_000,\n lintWarnRatio:\n typeof rawHygiene?.lintWarnRatio === \"number\" ? rawHygiene.lintWarnRatio : 0.8,\n lintPaths: Array.isArray(rawHygiene?.lintPaths)\n ? (rawHygiene!.lintPaths as string[])\n : [\"IDENTITY.md\", \"MEMORY.md\"],\n rotateEnabled: rawHygiene?.rotateEnabled === true,\n rotateMaxBytes:\n typeof rawHygiene?.rotateMaxBytes === \"number\" ? rawHygiene.rotateMaxBytes : 18_000,\n rotateKeepTailChars:\n typeof rawHygiene?.rotateKeepTailChars === \"number\"\n ? rawHygiene.rotateKeepTailChars\n : 2000,\n rotatePaths: Array.isArray(rawHygiene?.rotatePaths)\n ? (rawHygiene!.rotatePaths as string[])\n : [\"IDENTITY.md\"],\n archiveDir:\n typeof rawHygiene?.archiveDir === \"string\" && rawHygiene.archiveDir.length > 0\n ? (rawHygiene.archiveDir as string)\n : \".engram-archive\",\n runMinIntervalMs:\n typeof rawHygiene?.runMinIntervalMs === \"number\" ? rawHygiene.runMinIntervalMs : 5 * 60 * 1000,\n warningsLogEnabled: rawHygiene?.warningsLogEnabled === true,\n warningsLogPath:\n typeof rawHygiene?.warningsLogPath === \"string\" && rawHygiene.warningsLogPath.length > 0\n ? (rawHygiene.warningsLogPath as string)\n : \"hygiene/warnings.md\",\n indexEnabled: rawHygiene?.indexEnabled === true,\n indexPath:\n typeof rawHygiene?.indexPath === \"string\" && rawHygiene.indexPath.length > 0\n ? (rawHygiene.indexPath as string)\n : \"ENGRAM_INDEX.md\",\n }\n : undefined;\n\n const rawNativeKnowledge =\n cfg.nativeKnowledge && typeof cfg.nativeKnowledge === \"object\" && !Array.isArray(cfg.nativeKnowledge)\n ? (cfg.nativeKnowledge as Record<string, unknown>)\n : undefined;\n const nativeKnowledge = rawNativeKnowledge?.enabled === true\n ? {\n enabled: true,\n includeFiles: Array.isArray(rawNativeKnowledge.includeFiles)\n ? (rawNativeKnowledge.includeFiles as unknown[])\n .filter((value): value is string => typeof value === \"string\")\n .map((value) => value.trim())\n .filter(Boolean)\n : [\"IDENTITY.md\", \"MEMORY.md\"],\n maxChunkChars:\n typeof rawNativeKnowledge.maxChunkChars === \"number\"\n ? Math.max(200, Math.floor(rawNativeKnowledge.maxChunkChars))\n : 900,\n maxResults:\n typeof rawNativeKnowledge.maxResults === \"number\"\n ? Math.max(0, Math.floor(rawNativeKnowledge.maxResults))\n : 4,\n maxChars:\n typeof rawNativeKnowledge.maxChars === \"number\"\n ? Math.max(0, Math.floor(rawNativeKnowledge.maxChars))\n : 2400,\n stateDir:\n normalizeMemoryRelativeDir(rawNativeKnowledge.stateDir, \"state/native-knowledge\"),\n openclawWorkspace:\n rawNativeKnowledge.openclawWorkspace &&\n typeof rawNativeKnowledge.openclawWorkspace === \"object\" &&\n !Array.isArray(rawNativeKnowledge.openclawWorkspace) &&\n (rawNativeKnowledge.openclawWorkspace as Record<string, unknown>).enabled === true\n ? {\n enabled: true,\n bootstrapFiles: Array.isArray((rawNativeKnowledge.openclawWorkspace as Record<string, unknown>).bootstrapFiles)\n ? ((rawNativeKnowledge.openclawWorkspace as Record<string, unknown>).bootstrapFiles as unknown[])\n .filter((value): value is string => typeof value === \"string\")\n .map((value) => value.trim())\n .filter(Boolean)\n : [\"IDENTITY.md\", \"MEMORY.md\", \"USER.md\"],\n handoffGlobs: Array.isArray((rawNativeKnowledge.openclawWorkspace as Record<string, unknown>).handoffGlobs)\n ? ((rawNativeKnowledge.openclawWorkspace as Record<string, unknown>).handoffGlobs as unknown[])\n .filter((value): value is string => typeof value === \"string\")\n .map((value) => value.trim())\n .filter(Boolean)\n : [\"**/*handoff*.md\", \"handoffs/**/*.md\"],\n dailySummaryGlobs: Array.isArray((rawNativeKnowledge.openclawWorkspace as Record<string, unknown>).dailySummaryGlobs)\n ? ((rawNativeKnowledge.openclawWorkspace as Record<string, unknown>).dailySummaryGlobs as unknown[])\n .filter((value): value is string => typeof value === \"string\")\n .map((value) => value.trim())\n .filter(Boolean)\n : [\"**/*daily*summary*.md\", \"summaries/**/*.md\"],\n automationNoteGlobs: Array.isArray((rawNativeKnowledge.openclawWorkspace as Record<string, unknown>).automationNoteGlobs)\n ? ((rawNativeKnowledge.openclawWorkspace as Record<string, unknown>).automationNoteGlobs as unknown[])\n .filter((value): value is string => typeof value === \"string\")\n .map((value) => value.trim())\n .filter(Boolean)\n : [],\n workspaceDocGlobs: Array.isArray((rawNativeKnowledge.openclawWorkspace as Record<string, unknown>).workspaceDocGlobs)\n ? ((rawNativeKnowledge.openclawWorkspace as Record<string, unknown>).workspaceDocGlobs as unknown[])\n .filter((value): value is string => typeof value === \"string\")\n .map((value) => value.trim())\n .filter(Boolean)\n : [],\n excludeGlobs: [\n \".git/**\",\n \"node_modules/**\",\n \"dist/**\",\n \"build/**\",\n \"coverage/**\",\n \"**/*.log\",\n \"**/.env*\",\n \"**/*.pem\",\n \"**/*.key\",\n ...(Array.isArray((rawNativeKnowledge.openclawWorkspace as Record<string, unknown>).excludeGlobs)\n ? ((rawNativeKnowledge.openclawWorkspace as Record<string, unknown>).excludeGlobs as unknown[])\n .filter((value): value is string => typeof value === \"string\")\n .map((value) => value.trim())\n .filter(Boolean)\n : []),\n ].filter((value, index, array) => array.indexOf(value) === index),\n sharedSafeGlobs: Array.isArray((rawNativeKnowledge.openclawWorkspace as Record<string, unknown>).sharedSafeGlobs)\n ? ((rawNativeKnowledge.openclawWorkspace as Record<string, unknown>).sharedSafeGlobs as unknown[])\n .filter((value): value is string => typeof value === \"string\")\n .map((value) => value.trim())\n .filter(Boolean)\n : [],\n }\n : undefined,\n obsidianVaults: Array.isArray(rawNativeKnowledge.obsidianVaults)\n ? (rawNativeKnowledge.obsidianVaults as unknown[])\n .filter((value): value is Record<string, unknown> => !!value && typeof value === \"object\" && !Array.isArray(value))\n .map((vault, index) => {\n const defaultId = `vault-${index + 1}`;\n return {\n id:\n typeof vault.id === \"string\" && vault.id.trim().length > 0\n ? vault.id.trim()\n : defaultId,\n rootDir:\n typeof vault.rootDir === \"string\" && vault.rootDir.trim().length > 0\n ? vault.rootDir.trim()\n : \"\",\n includeGlobs: Array.isArray(vault.includeGlobs)\n ? (vault.includeGlobs as unknown[])\n .filter((value): value is string => typeof value === \"string\")\n .map((value) => value.trim())\n .filter(Boolean)\n : [\"**/*.md\"],\n excludeGlobs: Array.isArray(vault.excludeGlobs)\n ? (vault.excludeGlobs as unknown[])\n .filter((value): value is string => typeof value === \"string\")\n .map((value) => value.trim())\n .filter(Boolean)\n : [\".obsidian/**\", \"**/*.canvas\", \"**/*.png\", \"**/*.jpg\", \"**/*.jpeg\", \"**/*.gif\", \"**/*.pdf\"],\n namespace:\n typeof vault.namespace === \"string\" && vault.namespace.trim().length > 0\n ? vault.namespace.trim()\n : undefined,\n privacyClass:\n typeof vault.privacyClass === \"string\" && vault.privacyClass.trim().length > 0\n ? vault.privacyClass.trim()\n : undefined,\n folderRules: Array.isArray(vault.folderRules)\n ? (vault.folderRules as unknown[])\n .filter((value): value is Record<string, unknown> => !!value && typeof value === \"object\" && !Array.isArray(value))\n .map((rule) => ({\n pathPrefix:\n typeof rule.pathPrefix === \"string\" && rule.pathPrefix.trim().length > 0\n ? rule.pathPrefix.trim()\n : \"\",\n namespace:\n typeof rule.namespace === \"string\" && rule.namespace.trim().length > 0\n ? rule.namespace.trim()\n : undefined,\n privacyClass:\n typeof rule.privacyClass === \"string\" && rule.privacyClass.trim().length > 0\n ? rule.privacyClass.trim()\n : undefined,\n }))\n .filter((rule) => rule.pathPrefix.length > 0)\n : [],\n dailyNotePatterns: Array.isArray(vault.dailyNotePatterns)\n ? (vault.dailyNotePatterns as unknown[])\n .filter((value): value is string => typeof value === \"string\")\n .map((value) => value.trim())\n .filter(Boolean)\n : [\"YYYY-MM-DD\"],\n materializeBacklinks: vault.materializeBacklinks === true,\n };\n })\n .filter((vault) => vault.rootDir.length > 0)\n : [],\n }\n : undefined;\n\n const rawAgentAccessHttp =\n cfg.agentAccessHttp && typeof cfg.agentAccessHttp === \"object\" && !Array.isArray(cfg.agentAccessHttp)\n ? (cfg.agentAccessHttp as Record<string, unknown>)\n : undefined;\n const agentAccessHttp = {\n enabled: rawAgentAccessHttp?.enabled === true,\n host:\n typeof rawAgentAccessHttp?.host === \"string\" && rawAgentAccessHttp.host.trim().length > 0\n ? rawAgentAccessHttp.host.trim()\n : \"127.0.0.1\",\n port:\n typeof rawAgentAccessHttp?.port === \"number\"\n ? Math.max(0, Math.floor(rawAgentAccessHttp.port))\n : 4318,\n authToken:\n typeof rawAgentAccessHttp?.authToken === \"string\" && rawAgentAccessHttp.authToken.trim().length > 0\n ? resolveEnvVars(rawAgentAccessHttp.authToken)\n : process.env.OPENCLAW_REMNIC_ACCESS_TOKEN ?? process.env.OPENCLAW_ENGRAM_ACCESS_TOKEN,\n principal:\n typeof rawAgentAccessHttp?.principal === \"string\" && rawAgentAccessHttp.principal.trim().length > 0\n ? resolveEnvVars(rawAgentAccessHttp.principal)\n : process.env.OPENCLAW_ENGRAM_ACCESS_PRINCIPAL?.trim() || undefined,\n maxBodyBytes:\n typeof rawAgentAccessHttp?.maxBodyBytes === \"number\"\n ? Math.max(1, Math.floor(rawAgentAccessHttp.maxBodyBytes))\n : 131072,\n };\n\n let baseUrl: string | undefined;\n if (typeof cfg.openaiBaseUrl === \"string\" && cfg.openaiBaseUrl.length > 0) {\n baseUrl = normalizeOpenaiBaseUrl(resolveEnvVars(cfg.openaiBaseUrl), \"config\");\n } else {\n baseUrl = normalizeOpenaiBaseUrl(process.env.OPENAI_BASE_URL, \"env\");\n }\n\n const sharedCrossSignalSemanticEnabled =\n cfg.sharedCrossSignalSemanticEnabled === true || cfg.crossSignalsSemanticEnabled === true;\n const sharedCrossSignalSemanticTimeoutMs =\n typeof cfg.sharedCrossSignalSemanticTimeoutMs === \"number\"\n ? Math.max(1, Math.floor(cfg.sharedCrossSignalSemanticTimeoutMs))\n : typeof cfg.crossSignalsSemanticTimeoutMs === \"number\"\n ? Math.max(1, Math.floor(cfg.crossSignalsSemanticTimeoutMs))\n : 4000;\n const recallPipelineConfig = buildRecallPipelineConfig(cfg);\n\n return {\n openaiApiKey: apiKey,\n openaiBaseUrl: baseUrl,\n model,\n reasoningEffort,\n triggerMode,\n bufferMaxTurns:\n typeof cfg.bufferMaxTurns === \"number\" ? cfg.bufferMaxTurns : 5,\n bufferMaxMinutes:\n typeof cfg.bufferMaxMinutes === \"number\" ? cfg.bufferMaxMinutes : 15,\n // Surprise-gated buffer flush (issue #563, D-MEM). See types.ts for\n // semantics. Default off so PR 2 ships as a pure no-op until an operator\n // opts in. PR 4 benchmarks the flag and may flip the default.\n //\n // Use `coerceBool` rather than a strict `=== true` check: CLI operators\n // set booleans via `--config bufferSurpriseTriggerEnabled=true` which\n // arrives as the string `\"true\"` — the strict form would silently\n // leave the flag off. Matches the coercion contract established for\n // other boolean config keys (CLAUDE.md rule #36).\n bufferSurpriseTriggerEnabled:\n coerceBool(cfg.bufferSurpriseTriggerEnabled) === true,\n // Numeric surprise knobs go through `coerceNumber` so CLI operators\n // can pass `--config bufferSurpriseThreshold=0.5` without the string\n // silently dropping to the default. Matches the coercion contract\n // applied to other numeric config keys (CLAUDE.md rule #28).\n bufferSurpriseThreshold: clampSurpriseThreshold(\n coerceNumber(cfg.bufferSurpriseThreshold),\n 0.35,\n ),\n bufferSurpriseK: clampSurpriseK(\n coerceNumber(cfg.bufferSurpriseK),\n 5,\n ),\n bufferSurpriseRecentMemoryCount: clampSurpriseRecentMemoryCount(\n coerceNumber(cfg.bufferSurpriseRecentMemoryCount),\n 20,\n ),\n bufferSurpriseProbeTimeoutMs: clampSurpriseProbeTimeoutMs(\n coerceNumber(cfg.bufferSurpriseProbeTimeoutMs),\n 2000,\n ),\n consolidateEveryN:\n typeof cfg.consolidateEveryN === \"number\" ? cfg.consolidateEveryN : 3,\n highSignalPatterns: Array.isArray(cfg.highSignalPatterns)\n ? (cfg.highSignalPatterns as string[])\n : [],\n maxMemoryTokens:\n typeof cfg.maxMemoryTokens === \"number\" ? cfg.maxMemoryTokens : 2000,\n memoryOsPreset,\n qmdEnabled: cfg.qmdEnabled !== false,\n qmdCollection:\n typeof cfg.qmdCollection === \"string\"\n ? cfg.qmdCollection\n // TODO(#403): Keep legacy collection name for backwards compat so existing\n // installs don't lose their QMD vector store data on upgrade. New installs\n // can override via qmdCollection config. Consider migrating in a future PR.\n : \"openclaw-engram\",\n qmdMaxResults:\n typeof cfg.qmdMaxResults === \"number\" ? cfg.qmdMaxResults : 8,\n qmdColdTierEnabled: cfg.qmdColdTierEnabled === true,\n qmdColdCollection:\n typeof cfg.qmdColdCollection === \"string\" && cfg.qmdColdCollection.length > 0\n ? cfg.qmdColdCollection\n // TODO(#403): Keep legacy collection name for backwards compat.\n : \"openclaw-engram-cold\",\n qmdColdMaxResults:\n typeof cfg.qmdColdMaxResults === \"number\" ? cfg.qmdColdMaxResults : 8,\n qmdTierMigrationEnabled: cfg.qmdTierMigrationEnabled === true,\n qmdTierDemotionMinAgeDays:\n typeof cfg.qmdTierDemotionMinAgeDays === \"number\"\n ? Math.max(0, Math.floor(cfg.qmdTierDemotionMinAgeDays))\n : 14,\n qmdTierDemotionValueThreshold:\n typeof cfg.qmdTierDemotionValueThreshold === \"number\"\n ? Math.max(0, Math.min(1, cfg.qmdTierDemotionValueThreshold))\n : 0.35,\n qmdTierPromotionValueThreshold:\n typeof cfg.qmdTierPromotionValueThreshold === \"number\"\n ? Math.max(0, Math.min(1, cfg.qmdTierPromotionValueThreshold))\n : 0.7,\n qmdTierParityGraphEnabled: cfg.qmdTierParityGraphEnabled !== false,\n qmdTierParityHiMemEnabled: cfg.qmdTierParityHiMemEnabled !== false,\n qmdTierAutoBackfillEnabled: cfg.qmdTierAutoBackfillEnabled === true,\n embeddingFallbackEnabled: cfg.embeddingFallbackEnabled !== false,\n embeddingFallbackProvider:\n cfg.embeddingFallbackProvider === \"openai\"\n ? \"openai\"\n : cfg.embeddingFallbackProvider === \"local\"\n ? \"local\"\n : \"auto\",\n qmdPath:\n typeof cfg.qmdPath === \"string\" && cfg.qmdPath.length > 0\n ? cfg.qmdPath\n : undefined,\n memoryDir,\n debug: cfg.debug === true,\n identityEnabled: cfg.identityEnabled !== false,\n identityContinuityEnabled,\n identityInjectionMode,\n identityMaxInjectChars:\n typeof cfg.identityMaxInjectChars === \"number\"\n ? Math.max(0, Math.floor(cfg.identityMaxInjectChars))\n : 1200,\n continuityIncidentLoggingEnabled:\n typeof cfg.continuityIncidentLoggingEnabled === \"boolean\"\n ? cfg.continuityIncidentLoggingEnabled\n : identityContinuityEnabled,\n continuityAuditEnabled: cfg.continuityAuditEnabled === true,\n sessionObserverEnabled: cfg.sessionObserverEnabled === true,\n sessionObserverDebounceMs:\n typeof cfg.sessionObserverDebounceMs === \"number\"\n ? Math.max(0, Math.floor(cfg.sessionObserverDebounceMs))\n : 120_000,\n sessionObserverBands,\n injectQuestions: cfg.injectQuestions === true,\n commitmentDecayDays:\n typeof cfg.commitmentDecayDays === \"number\" ? cfg.commitmentDecayDays : 90,\n workspaceDir:\n typeof cfg.workspaceDir === \"string\" && cfg.workspaceDir.length > 0\n ? cfg.workspaceDir\n : DEFAULT_WORKSPACE_DIR,\n captureMode,\n fileHygiene,\n nativeKnowledge,\n agentAccessHttp,\n // Access tracking (Phase 1A)\n accessTrackingEnabled: cfg.accessTrackingEnabled !== false,\n accessTrackingBufferMaxSize:\n typeof cfg.accessTrackingBufferMaxSize === \"number\"\n ? cfg.accessTrackingBufferMaxSize\n : 100,\n // Retrieval options\n recencyWeight:\n typeof cfg.recencyWeight === \"number\" ? cfg.recencyWeight : 0.2,\n boostAccessCount: cfg.boostAccessCount !== false,\n recordEmptyRecallImpressions: cfg.recordEmptyRecallImpressions === true,\n // v2.2 Advanced Retrieval (safe defaults: off unless enabled)\n queryExpansionEnabled: cfg.queryExpansionEnabled === true,\n queryExpansionMaxQueries:\n typeof cfg.queryExpansionMaxQueries === \"number\"\n ? cfg.queryExpansionMaxQueries\n : 4,\n queryExpansionMinTokenLen:\n typeof cfg.queryExpansionMinTokenLen === \"number\"\n ? cfg.queryExpansionMinTokenLen\n : 3,\n rerankEnabled: cfg.rerankEnabled === true,\n rerankProvider:\n cfg.rerankProvider === \"cloud\" ? \"cloud\" : \"local\",\n rerankMaxCandidates:\n typeof cfg.rerankMaxCandidates === \"number\" ? cfg.rerankMaxCandidates : 20,\n rerankTimeoutMs:\n typeof cfg.rerankTimeoutMs === \"number\" ? cfg.rerankTimeoutMs : 8000,\n rerankCacheEnabled: cfg.rerankCacheEnabled !== false,\n rerankCacheTtlMs:\n typeof cfg.rerankCacheTtlMs === \"number\" ? cfg.rerankCacheTtlMs : 60 * 60 * 1000,\n feedbackEnabled: cfg.feedbackEnabled === true,\n // v2.2 Negative Examples (safe defaults: off unless enabled)\n negativeExamplesEnabled: cfg.negativeExamplesEnabled === true,\n negativeExamplesPenaltyPerHit:\n typeof cfg.negativeExamplesPenaltyPerHit === \"number\"\n ? cfg.negativeExamplesPenaltyPerHit\n : 0.05,\n negativeExamplesPenaltyCap:\n typeof cfg.negativeExamplesPenaltyCap === \"number\"\n ? cfg.negativeExamplesPenaltyCap\n : 0.25,\n // Chunking (Phase 2A)\n chunkingEnabled: cfg.chunkingEnabled === true, // Off by default initially\n chunkingTargetTokens:\n typeof cfg.chunkingTargetTokens === \"number\" ? cfg.chunkingTargetTokens : 200,\n chunkingMinTokens:\n typeof cfg.chunkingMinTokens === \"number\" ? cfg.chunkingMinTokens : 150,\n chunkingOverlapSentences:\n typeof cfg.chunkingOverlapSentences === \"number\" ? cfg.chunkingOverlapSentences : 2,\n // Semantic Chunking (Issue #368)\n semanticChunkingEnabled: cfg.semanticChunkingEnabled === true,\n semanticChunkingConfig: parseSemanticChunkingConfig(cfg.semanticChunkingConfig),\n // Contradiction Detection (Phase 2B)\n contradictionDetectionEnabled: cfg.contradictionDetectionEnabled === true, // Off by default initially\n contradictionSimilarityThreshold:\n typeof cfg.contradictionSimilarityThreshold === \"number\" ? cfg.contradictionSimilarityThreshold : 0.7,\n contradictionMinConfidence:\n typeof cfg.contradictionMinConfidence === \"number\" ? cfg.contradictionMinConfidence : 0.9,\n contradictionAutoResolve: cfg.contradictionAutoResolve !== false,\n // Contradiction Scan cron (issue #520)\n contradictionScan: parseContradictionScanConfig(cfg.contradictionScan),\n // Temporal Supersession (issue #375)\n temporalSupersessionEnabled: cfg.temporalSupersessionEnabled !== false, // On by default\n temporalSupersessionIncludeInRecall:\n cfg.temporalSupersessionIncludeInRecall === true, // Off by default\n // Direct-answer retrieval tier (issue #518). Default on — the\n // tier runs in observation mode: it annotates\n // LastRecallSnapshot.tierExplain but never short-circuits the\n // QMD path. Operators can opt out with\n // recallDirectAnswerEnabled=false.\n recallDirectAnswerEnabled:\n coerceBool(cfg.recallDirectAnswerEnabled) ?? true,\n // Graph-based retrieval tier (issue #559 PR 4). Default `false` —\n // the tier ships off pending the `retrieval-graph` bench in PR 5.\n recallGraphEnabled:\n coerceBool(cfg.recallGraphEnabled) ?? false,\n recallGraphDamping: (() => {\n const n = coerceNumber(cfg.recallGraphDamping);\n return n !== undefined && n >= 0 && n < 1 ? n : 0.85;\n })(),\n // Fractional integer values (e.g. `0.5`) are REJECTED rather than\n // silently floored to zero — CLAUDE.md rule 51 (\"Reject invalid\n // user input instead of silently defaulting\"). Users who set a\n // fractional iteration cap almost certainly meant an integer and\n // quietly flooring their value to 0 turns off the tier without\n // warning.\n recallGraphIterations: (() => {\n if (cfg.recallGraphIterations === undefined) return 20;\n const n = coerceNumber(cfg.recallGraphIterations);\n if (n === undefined || !Number.isFinite(n) || n < 0 || n > 500) {\n throw new Error(\n `recallGraphIterations must be an integer in [0, 500] (got ${JSON.stringify(cfg.recallGraphIterations)}).`,\n );\n }\n if (!Number.isInteger(n)) {\n throw new Error(\n `recallGraphIterations must be an integer (got fractional value ${n}).`,\n );\n }\n return n;\n })(),\n recallGraphTopK: (() => {\n if (cfg.recallGraphTopK === undefined) return 50;\n const n = coerceNumber(cfg.recallGraphTopK);\n if (n === undefined || !Number.isFinite(n) || n < 0 || n > 10000) {\n throw new Error(\n `recallGraphTopK must be an integer in [0, 10000] (got ${JSON.stringify(cfg.recallGraphTopK)}).`,\n );\n }\n if (!Number.isInteger(n)) {\n throw new Error(\n `recallGraphTopK must be an integer (got fractional value ${n}).`,\n );\n }\n return n;\n })(),\n recallDirectAnswerTokenOverlapFloor: (() => {\n const n = coerceNumber(cfg.recallDirectAnswerTokenOverlapFloor);\n return n !== undefined && n >= 0 && n <= 1 ? n : 0.55;\n })(),\n recallDirectAnswerImportanceFloor: (() => {\n const n = coerceNumber(cfg.recallDirectAnswerImportanceFloor);\n return n !== undefined && n >= 0 && n <= 1 ? n : 0.7;\n })(),\n recallDirectAnswerAmbiguityMargin: (() => {\n const n = coerceNumber(cfg.recallDirectAnswerAmbiguityMargin);\n return n !== undefined && n >= 0 && n <= 1 ? n : 0.15;\n })(),\n recallDirectAnswerEligibleTaxonomyBuckets: Array.isArray(\n cfg.recallDirectAnswerEligibleTaxonomyBuckets,\n )\n ? (cfg.recallDirectAnswerEligibleTaxonomyBuckets as unknown[]).filter(\n (v): v is string => typeof v === \"string\" && v.length > 0,\n )\n : [\"decisions\", \"principles\", \"conventions\", \"runbooks\", \"entities\"],\n // Cross-namespace query-budget limiter (issue #565 PR 4/5).\n // Defaults to false — ships disabled so existing deployments are\n // unaffected. When enabled, the read path throttles a principal that\n // issues a burst of recalls against namespaces other than their own.\n recallCrossNamespaceBudgetEnabled:\n coerceBool(cfg.recallCrossNamespaceBudgetEnabled) ?? false,\n recallCrossNamespaceBudgetWindowMs: (() => {\n const n = coerceNumber(cfg.recallCrossNamespaceBudgetWindowMs);\n return n !== undefined && n > 0 ? Math.floor(n) : 60_000;\n })(),\n recallCrossNamespaceBudgetSoftLimit: (() => {\n const n = coerceNumber(cfg.recallCrossNamespaceBudgetSoftLimit);\n return n !== undefined && n >= 0 ? Math.floor(n) : 10;\n })(),\n recallCrossNamespaceBudgetHardLimit: (() => {\n const n = coerceNumber(cfg.recallCrossNamespaceBudgetHardLimit);\n return n !== undefined && n > 0 ? Math.floor(n) : 30;\n })(),\n // Recall-audit anomaly detector (issue #565 PR 5/5). Defaults off so\n // existing deployments are unaffected; enable explicitly to let the\n // access surfaces flag suspicious query patterns derived from the\n // audit trail. Thresholds floor AFTER validating the floored value\n // is still >= 1 — a `0.5` input that floors to 0 would turn every\n // detector into a flood-on-anything, flipping the default to\n // max-noise instead of max-silence.\n recallAuditAnomalyDetectionEnabled:\n coerceBool(cfg.recallAuditAnomalyDetectionEnabled) ?? false,\n recallAuditAnomalyWindowMs: (() => {\n const n = coerceNumber(cfg.recallAuditAnomalyWindowMs);\n if (n === undefined) return 5 * 60_000;\n const floored = Math.floor(n);\n return floored >= 1 ? floored : 5 * 60_000;\n })(),\n recallAuditAnomalyRepeatQueryLimit: (() => {\n const n = coerceNumber(cfg.recallAuditAnomalyRepeatQueryLimit);\n if (n === undefined) return 5;\n const floored = Math.floor(n);\n return floored >= 1 ? floored : 5;\n })(),\n recallAuditAnomalyNamespaceWalkLimit: (() => {\n const n = coerceNumber(cfg.recallAuditAnomalyNamespaceWalkLimit);\n if (n === undefined) return 3;\n const floored = Math.floor(n);\n return floored >= 1 ? floored : 3;\n })(),\n recallAuditAnomalyHighCardinalityLimit: (() => {\n const n = coerceNumber(cfg.recallAuditAnomalyHighCardinalityLimit);\n if (n === undefined) return 50;\n const floored = Math.floor(n);\n return floored >= 1 ? floored : 50;\n })(),\n recallAuditAnomalyRapidFireLimit: (() => {\n const n = coerceNumber(cfg.recallAuditAnomalyRapidFireLimit);\n if (n === undefined) return 30;\n const floored = Math.floor(n);\n return floored >= 1 ? floored : 30;\n })(),\n\n // Memory Worth recall filter (issue #560 PR 4, default flipped in PR 5).\n // Bench result on the seeded fixture: precision@5 lifts from 0.00 to\n // 0.60 across all 50 cases with zero regressions. See\n // `runMemoryWorthBench` in memory-worth-bench.ts. Operators can still\n // opt out with recallMemoryWorthFilterEnabled=false.\n recallMemoryWorthFilterEnabled:\n coerceBool(cfg.recallMemoryWorthFilterEnabled) ?? true,\n recallMemoryWorthHalfLifeMs: (() => {\n const n = coerceNumber(cfg.recallMemoryWorthHalfLifeMs);\n return n !== undefined && n >= 0 ? n : 0;\n })(),\n // Memory Linking (Phase 3A)\n memoryLinkingEnabled: cfg.memoryLinkingEnabled === true, // Off by default initially\n // Conversation Threading (Phase 3B)\n threadingEnabled: cfg.threadingEnabled === true, // Off by default initially\n threadingGapMinutes:\n typeof cfg.threadingGapMinutes === \"number\" ? cfg.threadingGapMinutes : 30,\n // Memory Summarization (Phase 4A)\n summarizationEnabled: cfg.summarizationEnabled === true, // Off by default\n summarizationTriggerCount:\n typeof cfg.summarizationTriggerCount === \"number\" ? cfg.summarizationTriggerCount : 1000,\n summarizationRecentToKeep:\n typeof cfg.summarizationRecentToKeep === \"number\" ? cfg.summarizationRecentToKeep : 300,\n summarizationImportanceThreshold:\n typeof cfg.summarizationImportanceThreshold === \"number\" ? cfg.summarizationImportanceThreshold : 0.3,\n summarizationProtectedTags: Array.isArray(cfg.summarizationProtectedTags)\n ? (cfg.summarizationProtectedTags as string[])\n : [\"commitment\", \"preference\", \"decision\", \"principle\"],\n // Topic Extraction (Phase 4B)\n topicExtractionEnabled: cfg.topicExtractionEnabled !== false, // On by default\n topicExtractionTopN:\n typeof cfg.topicExtractionTopN === \"number\" ? cfg.topicExtractionTopN : 50,\n // Transcript & Context Preservation (v2.0)\n // Transcript archive\n transcriptEnabled: cfg.transcriptEnabled !== false, // default: true\n transcriptRetentionDays:\n typeof cfg.transcriptRetentionDays === \"number\" ? cfg.transcriptRetentionDays : 7,\n transcriptSkipChannelTypes: Array.isArray(cfg.transcriptSkipChannelTypes)\n ? (cfg.transcriptSkipChannelTypes as string[])\n : [\"cron\"], // default: skip cron transcripts\n // Transcript injection\n transcriptRecallHours:\n typeof cfg.transcriptRecallHours === \"number\" ? cfg.transcriptRecallHours : 12,\n maxTranscriptTurns:\n typeof cfg.maxTranscriptTurns === \"number\" ? cfg.maxTranscriptTurns : 50,\n maxTranscriptTokens:\n typeof cfg.maxTranscriptTokens === \"number\" ? cfg.maxTranscriptTokens : 1000,\n // Checkpoint\n checkpointEnabled: cfg.checkpointEnabled !== false, // default: true\n checkpointTurns:\n typeof cfg.checkpointTurns === \"number\" ? cfg.checkpointTurns : 15,\n // Compaction reset (opt-in, default: false)\n compactionResetEnabled: cfg.compactionResetEnabled === true,\n beforeResetTimeoutMs:\n typeof cfg.beforeResetTimeoutMs === \"number\"\n ? Math.min(30_000, Math.max(100, Math.floor(cfg.beforeResetTimeoutMs)))\n : 2_000,\n flushOnResetEnabled: cfg.flushOnResetEnabled !== false,\n commandsListEnabled: cfg.commandsListEnabled !== false,\n openclawToolsEnabled: cfg.openclawToolsEnabled !== false,\n openclawToolSnippetMaxChars:\n typeof cfg.openclawToolSnippetMaxChars === \"number\"\n ? Math.min(4_000, Math.max(80, Math.floor(cfg.openclawToolSnippetMaxChars)))\n : 600,\n sessionTogglesEnabled: cfg.sessionTogglesEnabled !== false,\n verboseRecallVisibility: cfg.verboseRecallVisibility !== false,\n recallTranscriptsEnabled: cfg.recallTranscriptsEnabled === true,\n recallTranscriptRetentionDays:\n typeof cfg.recallTranscriptRetentionDays === \"number\"\n ? Math.min(365, Math.max(1, Math.floor(cfg.recallTranscriptRetentionDays)))\n : 30,\n respectBundledActiveMemoryToggle:\n cfg.respectBundledActiveMemoryToggle !== false,\n activeRecallEnabled: cfg.activeRecallEnabled === true,\n activeRecallAgents:\n Array.isArray(cfg.activeRecallAgents) && cfg.activeRecallAgents.length > 0\n ? cfg.activeRecallAgents\n .filter((value): value is string => typeof value === \"string\" && value.trim().length > 0)\n .map((value) => value.trim())\n : null,\n activeRecallAllowedChatTypes:\n Array.isArray(cfg.activeRecallAllowedChatTypes) &&\n cfg.activeRecallAllowedChatTypes.length > 0\n ? cfg.activeRecallAllowedChatTypes.filter(\n (value): value is \"direct\" | \"group\" | \"channel\" =>\n value === \"direct\" || value === \"group\" || value === \"channel\",\n )\n : [\"direct\", \"group\", \"channel\"],\n activeRecallQueryMode:\n cfg.activeRecallQueryMode === \"message\" ||\n cfg.activeRecallQueryMode === \"full\"\n ? cfg.activeRecallQueryMode\n : \"recent\",\n activeRecallPromptStyle:\n cfg.activeRecallPromptStyle === \"strict\" ||\n cfg.activeRecallPromptStyle === \"contextual\" ||\n cfg.activeRecallPromptStyle === \"recall-heavy\" ||\n cfg.activeRecallPromptStyle === \"precision-heavy\" ||\n cfg.activeRecallPromptStyle === \"preference-only\"\n ? cfg.activeRecallPromptStyle\n : \"balanced\",\n activeRecallPromptOverride:\n typeof cfg.activeRecallPromptOverride === \"string\" &&\n cfg.activeRecallPromptOverride.trim().length > 0\n ? cfg.activeRecallPromptOverride.trim()\n : null,\n activeRecallPromptAppend:\n typeof cfg.activeRecallPromptAppend === \"string\" &&\n cfg.activeRecallPromptAppend.trim().length > 0\n ? cfg.activeRecallPromptAppend.trim()\n : null,\n activeRecallMaxSummaryChars:\n typeof cfg.activeRecallMaxSummaryChars === \"number\"\n ? Math.min(1000, Math.max(40, Math.floor(cfg.activeRecallMaxSummaryChars)))\n : 220,\n activeRecallRecentUserTurns:\n typeof cfg.activeRecallRecentUserTurns === \"number\"\n ? Math.min(4, Math.max(0, Math.floor(cfg.activeRecallRecentUserTurns)))\n : 2,\n activeRecallRecentAssistantTurns:\n typeof cfg.activeRecallRecentAssistantTurns === \"number\"\n ? Math.min(3, Math.max(0, Math.floor(cfg.activeRecallRecentAssistantTurns)))\n : 1,\n activeRecallRecentUserChars:\n typeof cfg.activeRecallRecentUserChars === \"number\"\n ? Math.min(1000, Math.max(40, Math.floor(cfg.activeRecallRecentUserChars)))\n : 600,\n activeRecallRecentAssistantChars:\n typeof cfg.activeRecallRecentAssistantChars === \"number\"\n ? Math.min(1000, Math.max(40, Math.floor(cfg.activeRecallRecentAssistantChars)))\n : 400,\n activeRecallThinking:\n cfg.activeRecallThinking === \"low\" ||\n cfg.activeRecallThinking === \"off\" ||\n cfg.activeRecallThinking === \"minimal\" ||\n cfg.activeRecallThinking === \"medium\" ||\n cfg.activeRecallThinking === \"high\" ||\n cfg.activeRecallThinking === \"xhigh\" ||\n cfg.activeRecallThinking === \"adaptive\"\n ? cfg.activeRecallThinking\n : \"low\",\n activeRecallTimeoutMs:\n typeof cfg.activeRecallTimeoutMs === \"number\"\n ? Math.max(250, Math.floor(cfg.activeRecallTimeoutMs))\n : 15_000,\n activeRecallCacheTtlMs:\n typeof cfg.activeRecallCacheTtlMs === \"number\"\n ? cfg.activeRecallCacheTtlMs === 0\n ? 0\n : cfg.activeRecallCacheTtlMs < 0\n ? 15_000\n : Math.min(\n 120_000,\n Math.max(1, Math.floor(cfg.activeRecallCacheTtlMs)),\n )\n : 15_000,\n activeRecallModel:\n typeof cfg.activeRecallModel === \"string\" && cfg.activeRecallModel.trim().length > 0\n ? cfg.activeRecallModel.trim()\n : null,\n activeRecallModelFallbackPolicy:\n cfg.activeRecallModelFallbackPolicy === \"resolved-only\"\n ? \"resolved-only\"\n : \"default-remote\",\n activeRecallPersistTranscripts: cfg.activeRecallPersistTranscripts === true,\n activeRecallTranscriptDir:\n typeof cfg.activeRecallTranscriptDir === \"string\" &&\n cfg.activeRecallTranscriptDir.trim().length > 0\n ? cfg.activeRecallTranscriptDir.trim()\n : \"active-recall\",\n activeRecallEntityGraphDepth:\n typeof cfg.activeRecallEntityGraphDepth === \"number\"\n ? Math.min(3, Math.max(0, Math.floor(cfg.activeRecallEntityGraphDepth)))\n : 1,\n activeRecallIncludeCausalTrajectories:\n cfg.activeRecallIncludeCausalTrajectories === true,\n activeRecallIncludeDaySummary: cfg.activeRecallIncludeDaySummary === true,\n activeRecallAttachRecallExplain: cfg.activeRecallAttachRecallExplain === true,\n activeRecallAllowChainedActiveMemory:\n cfg.activeRecallAllowChainedActiveMemory === true,\n dreaming,\n procedural,\n codingMode,\n heartbeat,\n slotBehavior,\n codexCompat,\n // Hourly summaries\n hourlySummariesEnabled: cfg.hourlySummariesEnabled !== false, // default: true\n daySummaryEnabled: cfg.daySummaryEnabled !== false, // default: true\n hourlySummaryCronAutoRegister: cfg.hourlySummaryCronAutoRegister === true,\n nightlyGovernanceCronAutoRegister: cfg.nightlyGovernanceCronAutoRegister === true,\n summaryRecallHours:\n typeof cfg.summaryRecallHours === \"number\" ? cfg.summaryRecallHours : 24,\n maxSummaryCount:\n typeof cfg.maxSummaryCount === \"number\" ? cfg.maxSummaryCount : 6,\n summaryModel:\n typeof cfg.summaryModel === \"string\" && cfg.summaryModel.length > 0\n ? cfg.summaryModel\n : model, // default: same as extraction model\n // v2.4 Extended hourly summaries (default off)\n hourlySummariesExtendedEnabled: cfg.hourlySummariesExtendedEnabled === true,\n hourlySummariesIncludeToolStats: cfg.hourlySummariesIncludeToolStats === true,\n hourlySummariesIncludeSystemMessages: cfg.hourlySummariesIncludeSystemMessages === true,\n hourlySummariesMaxTurnsPerRun:\n typeof cfg.hourlySummariesMaxTurnsPerRun === \"number\" ? cfg.hourlySummariesMaxTurnsPerRun : 200,\n // v2.4 Conversation index (default off)\n conversationIndexEnabled: cfg.conversationIndexEnabled === true,\n conversationIndexBackend: cfg.conversationIndexBackend === \"faiss\" ? \"faiss\" : \"qmd\",\n conversationIndexQmdCollection:\n typeof cfg.conversationIndexQmdCollection === \"string\" && cfg.conversationIndexQmdCollection.length > 0\n ? cfg.conversationIndexQmdCollection\n // TODO(#403): Keep legacy collection name for backwards compat.\n : \"openclaw-engram-conversations\",\n conversationIndexRetentionDays:\n typeof cfg.conversationIndexRetentionDays === \"number\" ? cfg.conversationIndexRetentionDays : 30,\n conversationIndexMinUpdateIntervalMs:\n typeof cfg.conversationIndexMinUpdateIntervalMs === \"number\"\n ? cfg.conversationIndexMinUpdateIntervalMs\n : 15 * 60_000,\n conversationIndexEmbedOnUpdate: cfg.conversationIndexEmbedOnUpdate === true,\n conversationIndexFaissScriptPath:\n typeof cfg.conversationIndexFaissScriptPath === \"string\" && cfg.conversationIndexFaissScriptPath.trim().length > 0\n ? cfg.conversationIndexFaissScriptPath.trim()\n : undefined,\n conversationIndexFaissPythonBin:\n typeof cfg.conversationIndexFaissPythonBin === \"string\" && cfg.conversationIndexFaissPythonBin.trim().length > 0\n ? cfg.conversationIndexFaissPythonBin.trim()\n : undefined,\n conversationIndexFaissModelId:\n typeof cfg.conversationIndexFaissModelId === \"string\" && cfg.conversationIndexFaissModelId.trim().length > 0\n ? cfg.conversationIndexFaissModelId.trim()\n : \"text-embedding-3-small\",\n conversationIndexFaissIndexDir:\n typeof cfg.conversationIndexFaissIndexDir === \"string\" && cfg.conversationIndexFaissIndexDir.trim().length > 0\n ? cfg.conversationIndexFaissIndexDir.trim()\n : \"state/conversation-index/faiss\",\n conversationIndexFaissUpsertTimeoutMs:\n typeof cfg.conversationIndexFaissUpsertTimeoutMs === \"number\"\n ? Math.max(0, Math.floor(cfg.conversationIndexFaissUpsertTimeoutMs))\n : 30_000,\n conversationIndexFaissSearchTimeoutMs:\n typeof cfg.conversationIndexFaissSearchTimeoutMs === \"number\"\n ? Math.max(0, Math.floor(cfg.conversationIndexFaissSearchTimeoutMs))\n : 5_000,\n conversationIndexFaissHealthTimeoutMs:\n typeof cfg.conversationIndexFaissHealthTimeoutMs === \"number\"\n ? Math.max(0, Math.floor(cfg.conversationIndexFaissHealthTimeoutMs))\n : 2_000,\n conversationIndexFaissMaxBatchSize:\n typeof cfg.conversationIndexFaissMaxBatchSize === \"number\"\n ? Math.max(0, Math.floor(cfg.conversationIndexFaissMaxBatchSize))\n : 512,\n conversationIndexFaissMaxSearchK:\n typeof cfg.conversationIndexFaissMaxSearchK === \"number\"\n ? Math.max(0, Math.floor(cfg.conversationIndexFaissMaxSearchK))\n : 50,\n conversationRecallTopK:\n typeof cfg.conversationRecallTopK === \"number\" ? cfg.conversationRecallTopK : 3,\n conversationRecallMaxChars:\n typeof cfg.conversationRecallMaxChars === \"number\" ? cfg.conversationRecallMaxChars : 2500,\n conversationRecallTimeoutMs:\n typeof cfg.conversationRecallTimeoutMs === \"number\" ? cfg.conversationRecallTimeoutMs : 800,\n evalHarnessEnabled: cfg.evalHarnessEnabled === true,\n evalShadowModeEnabled: cfg.evalShadowModeEnabled === true,\n benchmarkBaselineSnapshotsEnabled: cfg.benchmarkBaselineSnapshotsEnabled === true,\n benchmarkDeltaReporterEnabled: cfg.benchmarkDeltaReporterEnabled === true,\n benchmarkStoredBaselineEnabled: cfg.benchmarkStoredBaselineEnabled === true,\n evalStoreDir:\n typeof cfg.evalStoreDir === \"string\" && cfg.evalStoreDir.trim().length > 0\n ? cfg.evalStoreDir.trim()\n : path.join(memoryDir, \"state\", \"evals\"),\n objectiveStateMemoryEnabled: cfg.objectiveStateMemoryEnabled === true,\n objectiveStateSnapshotWritesEnabled: cfg.objectiveStateSnapshotWritesEnabled === true,\n objectiveStateRecallEnabled: cfg.objectiveStateRecallEnabled === true,\n objectiveStateStoreDir:\n typeof cfg.objectiveStateStoreDir === \"string\" && cfg.objectiveStateStoreDir.trim().length > 0\n ? cfg.objectiveStateStoreDir.trim()\n : path.join(memoryDir, \"state\", \"objective-state\"),\n causalTrajectoryMemoryEnabled: cfg.causalTrajectoryMemoryEnabled === true,\n causalTrajectoryStoreDir:\n typeof cfg.causalTrajectoryStoreDir === \"string\" && cfg.causalTrajectoryStoreDir.trim().length > 0\n ? cfg.causalTrajectoryStoreDir.trim()\n : path.join(memoryDir, \"state\", \"causal-trajectories\"),\n causalTrajectoryRecallEnabled: cfg.causalTrajectoryRecallEnabled === true,\n actionGraphRecallEnabled: cfg.actionGraphRecallEnabled === true,\n trustZonesEnabled: cfg.trustZonesEnabled === true,\n quarantinePromotionEnabled: cfg.quarantinePromotionEnabled === true,\n trustZoneStoreDir:\n typeof cfg.trustZoneStoreDir === \"string\" && cfg.trustZoneStoreDir.trim().length > 0\n ? cfg.trustZoneStoreDir.trim()\n : path.join(memoryDir, \"state\", \"trust-zones\"),\n trustZoneRecallEnabled: cfg.trustZoneRecallEnabled === true,\n memoryPoisoningDefenseEnabled: cfg.memoryPoisoningDefenseEnabled === true,\n memoryRedTeamBenchEnabled: cfg.memoryRedTeamBenchEnabled === true,\n harmonicRetrievalEnabled: cfg.harmonicRetrievalEnabled === true,\n abstractionAnchorsEnabled: cfg.abstractionAnchorsEnabled === true,\n verifiedRecallEnabled: cfg.verifiedRecallEnabled === true,\n semanticRulePromotionEnabled: cfg.semanticRulePromotionEnabled === true,\n semanticRuleVerificationEnabled: cfg.semanticRuleVerificationEnabled === true,\n semanticConsolidationEnabled: cfg.semanticConsolidationEnabled === true,\n semanticConsolidationModel:\n typeof cfg.semanticConsolidationModel === \"string\" && cfg.semanticConsolidationModel.length > 0\n ? cfg.semanticConsolidationModel\n : \"auto\",\n semanticConsolidationThreshold:\n typeof cfg.semanticConsolidationThreshold === \"number\" ? cfg.semanticConsolidationThreshold : 0.8,\n semanticConsolidationMinClusterSize:\n typeof cfg.semanticConsolidationMinClusterSize === \"number\"\n ? Math.max(2, Math.floor(cfg.semanticConsolidationMinClusterSize))\n : 3,\n semanticConsolidationExcludeCategories: Array.isArray(cfg.semanticConsolidationExcludeCategories)\n ? (cfg.semanticConsolidationExcludeCategories as unknown[]).filter(\n (c): c is string => typeof c === \"string\" && c.length > 0,\n )\n : [\"correction\", \"commitment\", \"procedure\"],\n semanticConsolidationIntervalHours:\n typeof cfg.semanticConsolidationIntervalHours === \"number\"\n ? Math.max(1, Math.floor(cfg.semanticConsolidationIntervalHours))\n : 168,\n semanticConsolidationMaxPerRun:\n typeof cfg.semanticConsolidationMaxPerRun === \"number\"\n ? Math.max(0, Math.floor(cfg.semanticConsolidationMaxPerRun))\n : 100,\n // Operator-aware consolidation prompt (issue #561 PR 3). Defaults\n // to `false` to match sibling `*Enabled` flags' least-privileged\n // convention. Operators opt in by setting `true` (or truthy\n // coercions like \"true\", \"1\", \"yes\", \"on\") when they want the\n // consolidation LLM to emit SPLIT/MERGE/UPDATE operator selection\n // on the `derived_via` frontmatter field. Uses `coerceBool` per\n // Gotcha #36 so CLI / env-string inputs coerce correctly. When\n // disabled, `derived_via` is still populated via the cluster-shape\n // heuristic (chooseConsolidationOperator) so PR 2's provenance\n // wiring keeps working without operator-aware prompts.\n operatorAwareConsolidationEnabled:\n coerceBool(cfg.operatorAwareConsolidationEnabled) ?? false,\n creationMemoryEnabled: cfg.creationMemoryEnabled === true,\n memoryUtilityLearningEnabled: cfg.memoryUtilityLearningEnabled === true,\n promotionByOutcomeEnabled: cfg.promotionByOutcomeEnabled === true,\n commitmentLedgerEnabled: cfg.commitmentLedgerEnabled === true,\n commitmentLifecycleEnabled: cfg.commitmentLifecycleEnabled === true,\n commitmentStaleDays:\n typeof cfg.commitmentStaleDays === \"number\" ? cfg.commitmentStaleDays : 14,\n commitmentLedgerDir:\n typeof cfg.commitmentLedgerDir === \"string\" && cfg.commitmentLedgerDir.trim().length > 0\n ? cfg.commitmentLedgerDir.trim()\n : path.join(memoryDir, \"state\", \"commitment-ledger\"),\n resumeBundlesEnabled: cfg.resumeBundlesEnabled === true,\n resumeBundleDir:\n typeof cfg.resumeBundleDir === \"string\" && cfg.resumeBundleDir.trim().length > 0\n ? cfg.resumeBundleDir.trim()\n : path.join(memoryDir, \"state\", \"resume-bundles\"),\n workProductRecallEnabled: cfg.workProductRecallEnabled === true,\n workTasksEnabled: cfg.workTasksEnabled === true,\n workProjectsEnabled: cfg.workProjectsEnabled === true,\n workTasksDir:\n typeof cfg.workTasksDir === \"string\" && cfg.workTasksDir.trim().length > 0\n ? cfg.workTasksDir.trim()\n : path.join(memoryDir, \"work\", \"tasks\"),\n workProjectsDir:\n typeof cfg.workProjectsDir === \"string\" && cfg.workProjectsDir.trim().length > 0\n ? cfg.workProjectsDir.trim()\n : path.join(memoryDir, \"work\", \"projects\"),\n workIndexEnabled: cfg.workIndexEnabled === true,\n workIndexDir:\n typeof cfg.workIndexDir === \"string\" && cfg.workIndexDir.trim().length > 0\n ? cfg.workIndexDir.trim()\n : path.join(memoryDir, \"work\", \"index\"),\n workTaskIndexEnabled: cfg.workTaskIndexEnabled === true,\n workProjectIndexEnabled: cfg.workProjectIndexEnabled === true,\n workIndexAutoRebuildEnabled: cfg.workIndexAutoRebuildEnabled === true,\n workIndexAutoRebuildDebounceMs:\n typeof cfg.workIndexAutoRebuildDebounceMs === \"number\" ? cfg.workIndexAutoRebuildDebounceMs : 1000,\n workProductLedgerDir:\n typeof cfg.workProductLedgerDir === \"string\" && cfg.workProductLedgerDir.trim().length > 0\n ? cfg.workProductLedgerDir.trim()\n : path.join(memoryDir, \"state\", \"work-product-ledger\"),\n abstractionNodeStoreDir:\n typeof cfg.abstractionNodeStoreDir === \"string\" && cfg.abstractionNodeStoreDir.trim().length > 0\n ? cfg.abstractionNodeStoreDir.trim()\n : path.join(memoryDir, \"state\", \"abstraction-nodes\"),\n // Local LLM Provider (v2.1)\n localLlmEnabled: cfg.localLlmEnabled === true || cfg.localLlmEnabled === \"true\", // default: false\n localLlmUrl:\n typeof cfg.localLlmUrl === \"string\" && cfg.localLlmUrl.length > 0\n ? cfg.localLlmUrl\n : \"http://localhost:1234/v1\",\n localLlmModel:\n typeof cfg.localLlmModel === \"string\" && cfg.localLlmModel.length > 0\n ? cfg.localLlmModel\n : \"local-model\",\n localLlmApiKey:\n typeof cfg.localLlmApiKey === \"string\" && cfg.localLlmApiKey.length > 0\n ? resolveEnvVars(cfg.localLlmApiKey)\n : undefined,\n localLlmHeaders:\n cfg.localLlmHeaders && typeof cfg.localLlmHeaders === \"object\" && !Array.isArray(cfg.localLlmHeaders)\n ? Object.fromEntries(\n Object.entries(cfg.localLlmHeaders as Record<string, unknown>)\n .filter(([, value]) => typeof value === \"string\")\n .map(([key, value]) => [key, String(value)]),\n )\n : undefined,\n localLlmAuthHeader: cfg.localLlmAuthHeader !== false,\n localLlmFallback: cfg.localLlmFallback !== false, // default: true\n localLlmHomeDir:\n typeof cfg.localLlmHomeDir === \"string\" && cfg.localLlmHomeDir.length > 0\n ? cfg.localLlmHomeDir\n : undefined,\n localLmsCliPath:\n typeof cfg.localLmsCliPath === \"string\" && cfg.localLmsCliPath.length > 0\n ? cfg.localLmsCliPath\n : undefined,\n localLmsBinDir:\n typeof cfg.localLmsBinDir === \"string\" && cfg.localLmsBinDir.length > 0\n ? cfg.localLmsBinDir\n : undefined,\n localLlmTimeoutMs:\n typeof cfg.localLlmTimeoutMs === \"number\" ? cfg.localLlmTimeoutMs : 180_000,\n localLlmMaxContext:\n typeof cfg.localLlmMaxContext === \"number\" ? cfg.localLlmMaxContext : undefined,\n // Observability (disabled by default to avoid log spam)\n slowLogEnabled: cfg.slowLogEnabled === true,\n slowLogThresholdMs:\n typeof cfg.slowLogThresholdMs === \"number\" ? cfg.slowLogThresholdMs : 30_000,\n // Trace recall content — disabled by default; enable to send recalled memory text to trace subscribers\n traceRecallContent: cfg.traceRecallContent === true,\n // Performance profiling (opt-in, disabled by default)\n profilingEnabled: cfg.profilingEnabled === true,\n profilingStorageDir:\n typeof cfg.profilingStorageDir === \"string\" && cfg.profilingStorageDir.length > 0\n ? cfg.profilingStorageDir\n : path.join(memoryDir, \"profiling\"),\n profilingMaxTraces:\n typeof cfg.profilingMaxTraces === \"number\" && Number.isFinite(cfg.profilingMaxTraces)\n ? Math.max(0, cfg.profilingMaxTraces)\n : 100,\n // Extraction stability guards (P0/P1)\n extractionDedupeEnabled: cfg.extractionDedupeEnabled !== false,\n extractionDedupeWindowMs:\n typeof cfg.extractionDedupeWindowMs === \"number\" ? cfg.extractionDedupeWindowMs : 5 * 60_000,\n extractionMinChars:\n typeof cfg.extractionMinChars === \"number\" ? cfg.extractionMinChars : 40,\n extractionMinUserTurns:\n typeof cfg.extractionMinUserTurns === \"number\" ? cfg.extractionMinUserTurns : 1,\n extractionMaxTurnChars:\n typeof cfg.extractionMaxTurnChars === \"number\" ? cfg.extractionMaxTurnChars : 4000,\n extractionMaxFactsPerRun:\n typeof cfg.extractionMaxFactsPerRun === \"number\" ? cfg.extractionMaxFactsPerRun : 12,\n extractionMaxEntitiesPerRun:\n typeof cfg.extractionMaxEntitiesPerRun === \"number\" ? cfg.extractionMaxEntitiesPerRun : 6,\n extractionMaxQuestionsPerRun:\n typeof cfg.extractionMaxQuestionsPerRun === \"number\" ? cfg.extractionMaxQuestionsPerRun : 3,\n extractionMaxProfileUpdatesPerRun:\n typeof cfg.extractionMaxProfileUpdatesPerRun === \"number\" ? cfg.extractionMaxProfileUpdatesPerRun : 4,\n // Importance write-gate for trivial extracted content (issue #372).\n // Default \"low\" drops only \"trivial\" facts (greetings, single-word replies,\n // heartbeat pings); set to \"normal\" or higher to make the gate stricter.\n extractionMinImportanceLevel: ((): PluginConfig[\"extractionMinImportanceLevel\"] => {\n const raw = cfg.extractionMinImportanceLevel;\n if (\n raw === \"trivial\" ||\n raw === \"low\" ||\n raw === \"normal\" ||\n raw === \"high\" ||\n raw === \"critical\"\n ) {\n return raw;\n }\n return \"low\";\n })(),\n // Extraction judge (issue #376). Opt-in LLM-as-judge fact-worthiness gate.\n extractionJudgeEnabled: cfg.extractionJudgeEnabled === true,\n extractionJudgeModel:\n typeof cfg.extractionJudgeModel === \"string\" ? cfg.extractionJudgeModel : \"\",\n extractionJudgeBatchSize:\n typeof cfg.extractionJudgeBatchSize === \"number\" && Number.isFinite(cfg.extractionJudgeBatchSize)\n ? Math.max(1, Math.round(cfg.extractionJudgeBatchSize))\n : 20,\n extractionJudgeShadow: cfg.extractionJudgeShadow === true,\n // Defer cap (issue #562 PR 2): max re-deferrals for the same candidate\n // text before the verdict is forcibly converted to reject.\n extractionJudgeMaxDeferrals:\n typeof cfg.extractionJudgeMaxDeferrals === \"number\" &&\n Number.isFinite(cfg.extractionJudgeMaxDeferrals) &&\n cfg.extractionJudgeMaxDeferrals >= 1\n ? Math.floor(cfg.extractionJudgeMaxDeferrals)\n : 2,\n // Judge telemetry (issue #562 PR 3): opt-in structured emit to the\n // observation ledger for defer-rate / latency metrics.\n // Uses `coerceBool` so CLI-style string inputs (`\"true\"`, `\"false\"`,\n // `\"1\"`, `\"0\"`) are accepted consistently with the rest of the\n // codebase (CLAUDE.md gotcha 36).\n extractionJudgeTelemetryEnabled:\n coerceBool(cfg.extractionJudgeTelemetryEnabled) === true,\n // Judge training-pair collection (issue #562 PR 4): opt-in shim for a\n // future GRPO training pipeline. Rows land under ~/.remnic/judge-\n // training/<date>.jsonl — NOT in the shared memory directory.\n // Uses `coerceBool` per CLAUDE.md gotcha 36 for CLI-string parity.\n collectJudgeTrainingPairs: coerceBool(cfg.collectJudgeTrainingPairs) === true,\n judgeTrainingDir:\n typeof cfg.judgeTrainingDir === \"string\" ? cfg.judgeTrainingDir : \"\",\n // Inline source attribution (issue #369). Opt-in to preserve\n // backwards compatibility with existing downstream consumers.\n inlineSourceAttributionEnabled: cfg.inlineSourceAttributionEnabled === true,\n inlineSourceAttributionFormat:\n typeof cfg.inlineSourceAttributionFormat === \"string\" &&\n cfg.inlineSourceAttributionFormat.trim().length > 0\n ? cfg.inlineSourceAttributionFormat\n : \"[Source: agent={agent}, session={sessionId}, ts={ts}]\",\n consolidationRequireNonZeroExtraction: cfg.consolidationRequireNonZeroExtraction !== false,\n consolidationMinIntervalMs:\n typeof cfg.consolidationMinIntervalMs === \"number\" ? cfg.consolidationMinIntervalMs : 10 * 60_000,\n // QMD maintenance (debounced singleflight)\n qmdMaintenanceEnabled: cfg.qmdMaintenanceEnabled !== false,\n qmdMaintenanceDebounceMs:\n typeof cfg.qmdMaintenanceDebounceMs === \"number\" ? cfg.qmdMaintenanceDebounceMs : 30_000,\n qmdAutoEmbedEnabled: cfg.qmdAutoEmbedEnabled === true,\n qmdEmbedMinIntervalMs:\n typeof cfg.qmdEmbedMinIntervalMs === \"number\" ? cfg.qmdEmbedMinIntervalMs : 60 * 60_000,\n qmdUpdateTimeoutMs:\n typeof cfg.qmdUpdateTimeoutMs === \"number\" ? cfg.qmdUpdateTimeoutMs : 90_000,\n qmdUpdateMinIntervalMs:\n typeof cfg.qmdUpdateMinIntervalMs === \"number\" ? cfg.qmdUpdateMinIntervalMs : 15 * 60_000,\n // Local LLM resilience\n localLlmRetry5xxCount:\n typeof cfg.localLlmRetry5xxCount === \"number\" ? cfg.localLlmRetry5xxCount : 1,\n localLlmRetryBackoffMs:\n typeof cfg.localLlmRetryBackoffMs === \"number\" ? cfg.localLlmRetryBackoffMs : 400,\n localLlm400TripThreshold:\n typeof cfg.localLlm400TripThreshold === \"number\" ? cfg.localLlm400TripThreshold : 5,\n localLlm400CooldownMs:\n typeof cfg.localLlm400CooldownMs === \"number\" ? cfg.localLlm400CooldownMs : 120_000,\n // Local LLM fast tier (v9.1)\n localLlmFastEnabled: cfg.localLlmFastEnabled === true,\n localLlmFastModel:\n typeof cfg.localLlmFastModel === \"string\" && cfg.localLlmFastModel.length > 0\n ? cfg.localLlmFastModel\n : \"\",\n localLlmFastUrl:\n typeof cfg.localLlmFastUrl === \"string\" && cfg.localLlmFastUrl.length > 0\n ? cfg.localLlmFastUrl\n : typeof cfg.localLlmUrl === \"string\" && cfg.localLlmUrl.length > 0\n ? cfg.localLlmUrl\n : \"http://localhost:1234/v1\",\n localLlmFastTimeoutMs:\n typeof cfg.localLlmFastTimeoutMs === \"number\" ? cfg.localLlmFastTimeoutMs : 15_000,\n // Thinking-mode suppression on the main local LLM (issue #548).\n // Default true — extraction / consolidation produce structured\n // JSON and gain nothing from chain-of-thought; thinking-capable\n // models burn their token budget on reasoning and blow the\n // default 60s timeout. Operators who need thinking on the main\n // client (e.g. for narrative tasks) can set this to false via\n // config or --config CLI flag. The fast-tier `fastLlm` always\n // disables thinking and is unaffected by this flag.\n //\n // Injection is backend-gated inside LocalLlmClient: the\n // `chat_template_kwargs` field is only sent when the detected\n // backend is in `THINKING_COMPATIBLE_BACKENDS` (LM Studio, vLLM).\n // Strict OpenAI-compatible backends reject unknown request\n // fields with 400, so the client fails open on unknown backends\n // rather than tripping the 400 cooldown (Codex P1 on PR #550).\n localLlmDisableThinking:\n coerceBool(cfg.localLlmDisableThinking) ?? true,\n // Gateway config (passed from index.ts for fallback AI)\n gatewayConfig: cfg.gatewayConfig as PluginConfig[\"gatewayConfig\"],\n // Gateway model source (v9.2) — route LLM calls through gateway agent model chain\n modelSource:\n cfg.modelSource === \"gateway\" ? \"gateway\" : \"plugin\",\n gatewayAgentId:\n typeof cfg.gatewayAgentId === \"string\" && cfg.gatewayAgentId.length > 0\n ? cfg.gatewayAgentId\n : \"\",\n fastGatewayAgentId:\n typeof cfg.fastGatewayAgentId === \"string\" && cfg.fastGatewayAgentId.length > 0\n ? cfg.fastGatewayAgentId\n : \"\",\n\n // v3.0 namespaces (default off)\n namespacesEnabled: cfg.namespacesEnabled === true,\n defaultNamespace:\n typeof cfg.defaultNamespace === \"string\" && cfg.defaultNamespace.length > 0 ? cfg.defaultNamespace : \"default\",\n sharedNamespace:\n typeof cfg.sharedNamespace === \"string\" && cfg.sharedNamespace.length > 0 ? cfg.sharedNamespace : \"shared\",\n principalFromSessionKeyMode:\n cfg.principalFromSessionKeyMode === \"prefix\"\n ? \"prefix\"\n : cfg.principalFromSessionKeyMode === \"regex\"\n ? \"regex\"\n : \"map\",\n principalFromSessionKeyRules: principalRules,\n namespacePolicies: Array.isArray(cfg.namespacePolicies)\n ? (cfg.namespacePolicies as any[]).map((p) => ({\n name: typeof p?.name === \"string\" ? p.name : \"\",\n readPrincipals: Array.isArray(p?.readPrincipals) ? p.readPrincipals.filter((x: any) => typeof x === \"string\") : [],\n writePrincipals: Array.isArray(p?.writePrincipals) ? p.writePrincipals.filter((x: any) => typeof x === \"string\") : [],\n includeInRecallByDefault: p?.includeInRecallByDefault === true,\n })).filter((p) => p.name.length > 0)\n : [],\n defaultRecallNamespaces: Array.isArray(cfg.defaultRecallNamespaces) ? [\"self\", \"shared\"].filter((x) => (cfg.defaultRecallNamespaces as any[]).includes(x)) as any : [\"self\", \"shared\"],\n cronRecallMode:\n cfg.cronRecallMode === \"none\"\n ? \"none\"\n : cfg.cronRecallMode === \"allowlist\"\n ? \"allowlist\"\n : \"all\",\n cronRecallAllowlist: Array.isArray(cfg.cronRecallAllowlist)\n ? (cfg.cronRecallAllowlist as unknown[]).filter((v): v is string => typeof v === \"string\" && v.length > 0)\n : [],\n cronRecallPolicyEnabled: cfg.cronRecallPolicyEnabled !== false,\n cronRecallNormalizedQueryMaxChars:\n typeof cfg.cronRecallNormalizedQueryMaxChars === \"number\"\n ? cfg.cronRecallNormalizedQueryMaxChars\n : 480,\n cronRecallInstructionHeavyTokenCap:\n typeof cfg.cronRecallInstructionHeavyTokenCap === \"number\"\n ? cfg.cronRecallInstructionHeavyTokenCap\n : 36,\n cronConversationRecallMode:\n cfg.cronConversationRecallMode === \"always\"\n ? \"always\"\n : cfg.cronConversationRecallMode === \"never\"\n ? \"never\"\n : \"auto\",\n autoPromoteToSharedEnabled: cfg.autoPromoteToSharedEnabled === true,\n autoPromoteToSharedCategories: Array.isArray(cfg.autoPromoteToSharedCategories)\n ? (cfg.autoPromoteToSharedCategories as any[]).filter((c) => c === \"fact\" || c === \"correction\" || c === \"decision\" || c === \"preference\")\n : [\"fact\", \"correction\", \"decision\", \"preference\"],\n autoPromoteMinConfidenceTier:\n cfg.autoPromoteMinConfidenceTier === \"explicit\"\n ? \"explicit\"\n : cfg.autoPromoteMinConfidenceTier === \"implied\"\n ? \"implied\"\n : \"explicit\",\n routingRulesEnabled: cfg.routingRulesEnabled === true,\n routingRulesStateFile:\n typeof cfg.routingRulesStateFile === \"string\" && cfg.routingRulesStateFile.trim().length > 0\n ? cfg.routingRulesStateFile.trim()\n : \"state/routing-rules.json\",\n\n // v4.0 shared-context (default off)\n sharedContextEnabled: cfg.sharedContextEnabled === true,\n sharedContextDir:\n typeof cfg.sharedContextDir === \"string\" && cfg.sharedContextDir.length > 0 ? cfg.sharedContextDir : undefined,\n sharedContextMaxInjectChars:\n typeof cfg.sharedContextMaxInjectChars === \"number\" ? cfg.sharedContextMaxInjectChars : 4000,\n sharedCrossSignalSemanticEnabled,\n sharedCrossSignalSemanticTimeoutMs,\n sharedCrossSignalSemanticMaxCandidates:\n typeof cfg.sharedCrossSignalSemanticMaxCandidates === \"number\"\n ? Math.max(0, Math.floor(cfg.sharedCrossSignalSemanticMaxCandidates))\n : 120,\n // Backward-compatible aliases.\n crossSignalsSemanticEnabled: sharedCrossSignalSemanticEnabled,\n crossSignalsSemanticTimeoutMs: sharedCrossSignalSemanticTimeoutMs,\n\n // v5.0 compounding (default off)\n compoundingEnabled: cfg.compoundingEnabled === true,\n compoundingWeeklyCronEnabled: cfg.compoundingWeeklyCronEnabled === true,\n compoundingSemanticEnabled: cfg.compoundingSemanticEnabled === true,\n compoundingSynthesisTimeoutMs:\n typeof cfg.compoundingSynthesisTimeoutMs === \"number\" ? cfg.compoundingSynthesisTimeoutMs : 15_000,\n compoundingInjectEnabled: cfg.compoundingInjectEnabled !== false,\n\n // IRC (Inductive Rule Consolidation) — preference synthesis\n ircEnabled: cfg.ircEnabled !== false,\n ircMaxPreferences: typeof cfg.ircMaxPreferences === \"number\" ? cfg.ircMaxPreferences : 20,\n ircIncludeCorrections: cfg.ircIncludeCorrections !== false,\n ircMinConfidence: typeof cfg.ircMinConfidence === \"number\" ? cfg.ircMinConfidence : 0.3,\n\n // CMC (Causal Memory Consolidation) — cross-session causal reasoning\n cmcEnabled: cfg.cmcEnabled === true,\n cmcStitchLookbackDays: typeof cfg.cmcStitchLookbackDays === \"number\" ? cfg.cmcStitchLookbackDays : 7,\n cmcStitchMinScore: typeof cfg.cmcStitchMinScore === \"number\" ? cfg.cmcStitchMinScore : 2.5,\n cmcStitchMaxEdgesPerTrajectory: typeof cfg.cmcStitchMaxEdgesPerTrajectory === \"number\" ? cfg.cmcStitchMaxEdgesPerTrajectory : 3,\n cmcConsolidationEnabled: cfg.cmcConsolidationEnabled === true,\n cmcConsolidationMinRecurrence: typeof cfg.cmcConsolidationMinRecurrence === \"number\" ? cfg.cmcConsolidationMinRecurrence : 3,\n cmcConsolidationMinSessions: typeof cfg.cmcConsolidationMinSessions === \"number\" ? cfg.cmcConsolidationMinSessions : 2,\n cmcConsolidationSuccessThreshold: typeof cfg.cmcConsolidationSuccessThreshold === \"number\" ? cfg.cmcConsolidationSuccessThreshold : 0.7,\n cmcRetrievalEnabled: cfg.cmcRetrievalEnabled === true,\n cmcRetrievalMaxDepth: typeof cfg.cmcRetrievalMaxDepth === \"number\" ? cfg.cmcRetrievalMaxDepth : 3,\n cmcRetrievalMaxChars: typeof cfg.cmcRetrievalMaxChars === \"number\" ? cfg.cmcRetrievalMaxChars : 800,\n cmcRetrievalCounterfactualBoost: typeof cfg.cmcRetrievalCounterfactualBoost === \"number\" ? cfg.cmcRetrievalCounterfactualBoost : 0.4,\n cmcBehaviorLearningEnabled: cfg.cmcBehaviorLearningEnabled === true,\n cmcBehaviorMinFrequency: typeof cfg.cmcBehaviorMinFrequency === \"number\" ? cfg.cmcBehaviorMinFrequency : 3,\n cmcBehaviorMinSessions: typeof cfg.cmcBehaviorMinSessions === \"number\" ? cfg.cmcBehaviorMinSessions : 2,\n cmcBehaviorConfidenceThreshold: typeof cfg.cmcBehaviorConfidenceThreshold === \"number\" ? cfg.cmcBehaviorConfidenceThreshold : 0.6,\n cmcLifecycleCausalImpactWeight: typeof cfg.cmcLifecycleCausalImpactWeight === \"number\" ? cfg.cmcLifecycleCausalImpactWeight : 0.05,\n\n // PEDC (Prediction-Error-Driven Calibration) — model-user alignment\n calibrationEnabled: cfg.calibrationEnabled === true,\n calibrationMaxRulesPerRecall: typeof cfg.calibrationMaxRulesPerRecall === \"number\" ? cfg.calibrationMaxRulesPerRecall : 10,\n calibrationMaxChars: typeof cfg.calibrationMaxChars === \"number\" ? cfg.calibrationMaxChars : 1200,\n\n // v7.0 Knowledge Graph Enhancement\n knowledgeIndexEnabled: cfg.knowledgeIndexEnabled !== false,\n knowledgeIndexMaxEntities:\n typeof cfg.knowledgeIndexMaxEntities === \"number\" ? cfg.knowledgeIndexMaxEntities : 40,\n knowledgeIndexMaxChars:\n typeof cfg.knowledgeIndexMaxChars === \"number\" ? cfg.knowledgeIndexMaxChars : 4000,\n entityRetrievalEnabled: cfg.entityRetrievalEnabled !== false,\n entityRetrievalMaxChars:\n typeof cfg.entityRetrievalMaxChars === \"number\" ? cfg.entityRetrievalMaxChars : 2400,\n entityRetrievalMaxHints:\n typeof cfg.entityRetrievalMaxHints === \"number\" ? cfg.entityRetrievalMaxHints : 2,\n entityRetrievalMaxSupportingFacts:\n typeof cfg.entityRetrievalMaxSupportingFacts === \"number\" ? cfg.entityRetrievalMaxSupportingFacts : 6,\n entityRetrievalMaxRelatedEntities:\n typeof cfg.entityRetrievalMaxRelatedEntities === \"number\" ? cfg.entityRetrievalMaxRelatedEntities : 3,\n entityRetrievalRecentTurns:\n typeof cfg.entityRetrievalRecentTurns === \"number\" ? cfg.entityRetrievalRecentTurns : 6,\n entitySchemas,\n recallBudgetChars: recallPipelineConfig.recallBudgetChars,\n recallOuterTimeoutMs:\n typeof cfg.recallOuterTimeoutMs === \"number\" ? Math.max(0, Math.floor(cfg.recallOuterTimeoutMs)) : 75_000,\n recallCoreDeadlineMs:\n typeof cfg.recallCoreDeadlineMs === \"number\" ? Math.max(0, Math.floor(cfg.recallCoreDeadlineMs)) : 75_000,\n recallEnrichmentDeadlineMs:\n typeof cfg.recallEnrichmentDeadlineMs === \"number\"\n ? Math.max(0, Math.floor(cfg.recallEnrichmentDeadlineMs))\n : 25_000,\n recallPipeline: recallPipelineConfig.pipeline,\n recallMmrEnabled: cfg.recallMmrEnabled !== false,\n recallMmrLambda:\n typeof cfg.recallMmrLambda === \"number\" && Number.isFinite(cfg.recallMmrLambda)\n ? Math.min(1, Math.max(0, cfg.recallMmrLambda))\n : 0.7,\n recallMmrTopN:\n typeof cfg.recallMmrTopN === \"number\" && Number.isFinite(cfg.recallMmrTopN)\n ? Math.max(0, Math.floor(cfg.recallMmrTopN))\n : 40,\n // Issue #564 PR 3: off by default; enable explicitly after bench validation.\n recallReasoningTraceBoostEnabled:\n coerceBool(cfg.recallReasoningTraceBoostEnabled) ?? false,\n qmdRecallCacheTtlMs:\n typeof cfg.qmdRecallCacheTtlMs === \"number\" ? Math.max(0, Math.floor(cfg.qmdRecallCacheTtlMs)) : 60_000,\n qmdRecallCacheStaleTtlMs:\n typeof cfg.qmdRecallCacheStaleTtlMs === \"number\"\n ? Math.max(0, Math.floor(cfg.qmdRecallCacheStaleTtlMs))\n : 10 * 60_000,\n qmdRecallCacheMaxEntries:\n typeof cfg.qmdRecallCacheMaxEntries === \"number\"\n ? Math.max(0, Math.floor(cfg.qmdRecallCacheMaxEntries))\n : 128,\n entityRelationshipsEnabled: cfg.entityRelationshipsEnabled !== false,\n entityActivityLogEnabled: cfg.entityActivityLogEnabled !== false,\n entityActivityLogMaxEntries:\n typeof cfg.entityActivityLogMaxEntries === \"number\" ? cfg.entityActivityLogMaxEntries : 20,\n entityAliasesEnabled: cfg.entityAliasesEnabled !== false,\n entitySummaryEnabled: cfg.entitySummaryEnabled !== false,\n entitySynthesisMaxTokens:\n typeof cfg.entitySynthesisMaxTokens === \"number\" && Number.isFinite(cfg.entitySynthesisMaxTokens)\n ? (() => {\n const tokens = Math.max(0, Math.floor(cfg.entitySynthesisMaxTokens));\n return tokens === 0 ? 0 : Math.max(10, tokens);\n })()\n : 500,\n\n // Search backend abstraction\n searchBackend: ([\"qmd\", \"remote\", \"noop\", \"lancedb\", \"meilisearch\", \"orama\"] as const).includes(cfg.searchBackend as any)\n ? (cfg.searchBackend as \"qmd\" | \"remote\" | \"noop\" | \"lancedb\" | \"meilisearch\" | \"orama\")\n : \"qmd\",\n remoteSearchBaseUrl: typeof cfg.remoteSearchBaseUrl === \"string\" ? cfg.remoteSearchBaseUrl : undefined,\n remoteSearchApiKey: typeof cfg.remoteSearchApiKey === \"string\" ? cfg.remoteSearchApiKey : undefined,\n remoteSearchTimeoutMs: typeof cfg.remoteSearchTimeoutMs === \"number\" ? cfg.remoteSearchTimeoutMs : 30_000,\n\n // LanceDB backend\n lancedbEnabled: cfg.lancedbEnabled === true,\n lanceDbPath: typeof cfg.lanceDbPath === \"string\" ? cfg.lanceDbPath : path.join(memoryDir, \"lancedb\"),\n lanceEmbeddingDimension: typeof cfg.lanceEmbeddingDimension === \"number\" ? cfg.lanceEmbeddingDimension : 1536,\n\n // Meilisearch backend\n meilisearchEnabled: cfg.meilisearchEnabled === true,\n meilisearchHost: typeof cfg.meilisearchHost === \"string\" ? cfg.meilisearchHost : \"http://localhost:7700\",\n meilisearchApiKey: typeof cfg.meilisearchApiKey === \"string\" ? cfg.meilisearchApiKey : undefined,\n meilisearchTimeoutMs: typeof cfg.meilisearchTimeoutMs === \"number\" ? cfg.meilisearchTimeoutMs : 30_000,\n meilisearchAutoIndex: cfg.meilisearchAutoIndex === true,\n\n // Orama backend\n oramaEnabled: cfg.oramaEnabled === true,\n oramaDbPath: typeof cfg.oramaDbPath === \"string\" ? cfg.oramaDbPath : path.join(memoryDir, \"orama\"),\n oramaEmbeddingDimension: typeof cfg.oramaEmbeddingDimension === \"number\" ? cfg.oramaEmbeddingDimension : 1536,\n\n // QMD daemon mode\n qmdDaemonEnabled: cfg.qmdDaemonEnabled !== false,\n qmdDaemonUrl:\n typeof cfg.qmdDaemonUrl === \"string\" && cfg.qmdDaemonUrl.length > 0\n ? cfg.qmdDaemonUrl\n : \"http://localhost:8181/mcp\",\n qmdDaemonRecheckIntervalMs:\n typeof cfg.qmdDaemonRecheckIntervalMs === \"number\" ? cfg.qmdDaemonRecheckIntervalMs : 15_000,\n qmdIntentHintsEnabled: cfg.qmdIntentHintsEnabled === true,\n qmdExplainEnabled: cfg.qmdExplainEnabled === true,\n\n // v6.0 Fact deduplication & archival\n factDeduplicationEnabled: cfg.factDeduplicationEnabled !== false,\n // Issue #373 — write-time semantic similarity guard\n semanticDedupEnabled: cfg.semanticDedupEnabled !== false,\n // Guard against NaN / Infinity — Number.isFinite rejects both and falls\n // back to the documented default so the semantic dedup guard cannot be\n // silently disabled by a malformed config value.\n semanticDedupThreshold:\n typeof cfg.semanticDedupThreshold === \"number\" &&\n Number.isFinite(cfg.semanticDedupThreshold)\n ? Math.min(1, Math.max(0, cfg.semanticDedupThreshold))\n : 0.92,\n // Zero is a valid \"disable candidate lookup\" signal and must be preserved.\n // Only negative or non-finite values fall back to the default of 5.\n // Fractional values in (0, 1) floor to 0, which would silently disable\n // semantic dedup despite a clearly non-zero operator intent — clamp to 1.\n semanticDedupCandidates: (() => {\n const raw = cfg.semanticDedupCandidates;\n if (typeof raw !== \"number\" || !Number.isFinite(raw) || raw < 0) return 5;\n const n = Math.floor(raw);\n // Positive fractional input (e.g. 0.5) should mean \"at least 1 candidate\",\n // not \"disabled\". Only explicit 0 is the operator's disable signal.\n return raw > 0 && n === 0 ? 1 : n;\n })(),\n factArchivalEnabled: cfg.factArchivalEnabled === true,\n factArchivalAgeDays:\n typeof cfg.factArchivalAgeDays === \"number\" ? cfg.factArchivalAgeDays : 90,\n factArchivalMaxImportance:\n typeof cfg.factArchivalMaxImportance === \"number\" ? cfg.factArchivalMaxImportance : 0.3,\n factArchivalMaxAccessCount:\n typeof cfg.factArchivalMaxAccessCount === \"number\" ? cfg.factArchivalMaxAccessCount : 2,\n factArchivalProtectedCategories: Array.isArray(cfg.factArchivalProtectedCategories)\n ? (cfg.factArchivalProtectedCategories as any[]).filter((c) => typeof c === \"string\")\n : [\"commitment\", \"preference\", \"decision\", \"principle\", \"procedure\"],\n // v8.3 lifecycle policy engine (default off)\n lifecyclePolicyEnabled: cfg.lifecyclePolicyEnabled === true,\n lifecycleFilterStaleEnabled: cfg.lifecycleFilterStaleEnabled === true,\n lifecyclePromoteHeatThreshold:\n typeof cfg.lifecyclePromoteHeatThreshold === \"number\"\n ? Math.min(1, Math.max(0, cfg.lifecyclePromoteHeatThreshold))\n : 0.55,\n lifecycleStaleDecayThreshold:\n typeof cfg.lifecycleStaleDecayThreshold === \"number\"\n ? Math.min(1, Math.max(0, cfg.lifecycleStaleDecayThreshold))\n : 0.65,\n lifecycleArchiveDecayThreshold:\n typeof cfg.lifecycleArchiveDecayThreshold === \"number\"\n ? Math.min(1, Math.max(0, cfg.lifecycleArchiveDecayThreshold))\n : 0.85,\n lifecycleProtectedCategories: Array.isArray(cfg.lifecycleProtectedCategories)\n ? (cfg.lifecycleProtectedCategories as any[]).filter(\n (c): c is PluginConfig[\"lifecycleProtectedCategories\"][number] =>\n typeof c === \"string\" && VALID_MEMORY_CATEGORIES.has(c),\n )\n : [\"decision\", \"principle\", \"commitment\", \"preference\", \"procedure\"],\n lifecycleMetricsEnabled:\n typeof cfg.lifecycleMetricsEnabled === \"boolean\"\n ? cfg.lifecycleMetricsEnabled\n : cfg.lifecyclePolicyEnabled === true,\n // v8.3 proactive + policy learning (default off)\n proactiveExtractionEnabled: cfg.proactiveExtractionEnabled === true,\n contextCompressionActionsEnabled: cfg.contextCompressionActionsEnabled === true,\n compressionGuidelineLearningEnabled: cfg.compressionGuidelineLearningEnabled === true,\n compressionGuidelineSemanticRefinementEnabled:\n cfg.compressionGuidelineSemanticRefinementEnabled === true,\n compressionGuidelineSemanticTimeoutMs:\n typeof cfg.compressionGuidelineSemanticTimeoutMs === \"number\"\n ? Math.max(1, Math.floor(cfg.compressionGuidelineSemanticTimeoutMs))\n : 2500,\n maxProactiveQuestionsPerExtraction:\n typeof cfg.maxProactiveQuestionsPerExtraction === \"number\"\n ? Math.max(0, Math.floor(cfg.maxProactiveQuestionsPerExtraction))\n : 2,\n proactiveExtractionTimeoutMs:\n typeof cfg.proactiveExtractionTimeoutMs === \"number\"\n ? Math.max(0, Math.floor(cfg.proactiveExtractionTimeoutMs))\n : 2500,\n proactiveExtractionMaxTokens:\n typeof cfg.proactiveExtractionMaxTokens === \"number\"\n ? Math.max(0, Math.floor(cfg.proactiveExtractionMaxTokens))\n : 900,\n extractionMaxOutputTokens:\n typeof cfg.extractionMaxOutputTokens === \"number\"\n ? Math.max(1, Math.floor(cfg.extractionMaxOutputTokens))\n : 16384,\n proactiveExtractionCategoryAllowlist: Array.isArray(cfg.proactiveExtractionCategoryAllowlist)\n ? (cfg.proactiveExtractionCategoryAllowlist as unknown[]).filter(\n (category): category is PluginConfig[\"lifecycleProtectedCategories\"][number] =>\n typeof category === \"string\" && VALID_MEMORY_CATEGORIES.has(category),\n )\n : undefined,\n maxCompressionTokensPerHour:\n typeof cfg.maxCompressionTokensPerHour === \"number\"\n ? Math.max(0, Math.floor(cfg.maxCompressionTokensPerHour))\n : 1500,\n behaviorLoopAutoTuneEnabled: cfg.behaviorLoopAutoTuneEnabled === true,\n behaviorLoopLearningWindowDays:\n typeof cfg.behaviorLoopLearningWindowDays === \"number\"\n ? Math.max(0, Math.floor(cfg.behaviorLoopLearningWindowDays))\n : 14,\n behaviorLoopMinSignalCount:\n typeof cfg.behaviorLoopMinSignalCount === \"number\"\n ? Math.max(0, Math.floor(cfg.behaviorLoopMinSignalCount))\n : 10,\n behaviorLoopMaxDeltaPerCycle:\n typeof cfg.behaviorLoopMaxDeltaPerCycle === \"number\"\n ? Math.min(1, Math.max(0, cfg.behaviorLoopMaxDeltaPerCycle))\n : 0.1,\n behaviorLoopProtectedParams: Array.isArray(cfg.behaviorLoopProtectedParams)\n ? (cfg.behaviorLoopProtectedParams as unknown[])\n .filter((param): param is string => typeof param === \"string\" && param.trim().length > 0)\n : [...DEFAULT_BEHAVIOR_LOOP_PROTECTED_PARAMS],\n // v8.0 phase 1\n recallPlannerEnabled: cfg.recallPlannerEnabled !== false,\n recallPlannerModel:\n typeof cfg.recallPlannerModel === \"string\" && cfg.recallPlannerModel.trim().length > 0\n ? cfg.recallPlannerModel.trim()\n : \"gpt-5.2-mini\",\n recallPlannerTimeoutMs:\n typeof cfg.recallPlannerTimeoutMs === \"number\" ? cfg.recallPlannerTimeoutMs : 1500,\n recallPlannerUseResponsesApi: cfg.recallPlannerUseResponsesApi !== false,\n recallPlannerMaxPromptChars:\n typeof cfg.recallPlannerMaxPromptChars === \"number\" ? cfg.recallPlannerMaxPromptChars : 4000,\n recallPlannerMaxMemoryHints:\n typeof cfg.recallPlannerMaxMemoryHints === \"number\" ? cfg.recallPlannerMaxMemoryHints : 24,\n recallPlannerShadowMode: cfg.recallPlannerShadowMode === true,\n recallPlannerTelemetryEnabled: cfg.recallPlannerTelemetryEnabled !== false,\n recallPlannerMaxQmdResultsMinimal:\n typeof cfg.recallPlannerMaxQmdResultsMinimal === \"number\"\n ? cfg.recallPlannerMaxQmdResultsMinimal\n : 4,\n recallPlannerMaxQmdResultsFull:\n typeof cfg.recallPlannerMaxQmdResultsFull === \"number\" ? cfg.recallPlannerMaxQmdResultsFull : 8,\n intentRoutingEnabled: cfg.intentRoutingEnabled === true,\n intentRoutingBoost:\n typeof cfg.intentRoutingBoost === \"number\" ? cfg.intentRoutingBoost : 0.12,\n verbatimArtifactsEnabled: cfg.verbatimArtifactsEnabled === true,\n verbatimArtifactsMinConfidence:\n typeof cfg.verbatimArtifactsMinConfidence === \"number\"\n ? cfg.verbatimArtifactsMinConfidence\n : 0.8,\n verbatimArtifactsMaxRecall:\n typeof cfg.verbatimArtifactsMaxRecall === \"number\" ? cfg.verbatimArtifactsMaxRecall : 5,\n verbatimArtifactCategories: Array.isArray(cfg.verbatimArtifactCategories)\n ? (cfg.verbatimArtifactCategories as any[]).filter(\n (c): c is PluginConfig[\"verbatimArtifactCategories\"][number] =>\n typeof c === \"string\" && VALID_MEMORY_CATEGORIES.has(c),\n )\n : [\"decision\", \"correction\", \"principle\", \"commitment\"],\n // v8.0 Phase 2A: Memory Boxes + Trace Weaving\n memoryBoxesEnabled: cfg.memoryBoxesEnabled === true,\n boxTopicShiftThreshold:\n typeof cfg.boxTopicShiftThreshold === \"number\" ? cfg.boxTopicShiftThreshold : 0.35,\n boxTimeGapMs:\n typeof cfg.boxTimeGapMs === \"number\" ? cfg.boxTimeGapMs : 30 * 60 * 1000,\n boxMaxMemories:\n typeof cfg.boxMaxMemories === \"number\" ? cfg.boxMaxMemories : 50,\n traceWeaverEnabled: cfg.traceWeaverEnabled === true,\n traceWeaverLookbackDays:\n typeof cfg.traceWeaverLookbackDays === \"number\" ? cfg.traceWeaverLookbackDays : 7,\n traceWeaverOverlapThreshold:\n typeof cfg.traceWeaverOverlapThreshold === \"number\" ? cfg.traceWeaverOverlapThreshold : 0.4,\n boxRecallDays:\n typeof cfg.boxRecallDays === \"number\" ? cfg.boxRecallDays : 3,\n // v8.0 Phase 2B: Episode/Note dual store (HiMem)\n episodeNoteModeEnabled: cfg.episodeNoteModeEnabled === true,\n // v8.1: Temporal + Tag Indexes (SwiftMem-inspired)\n queryAwareIndexingEnabled: cfg.queryAwareIndexingEnabled === true,\n queryAwareIndexingMaxCandidates:\n typeof cfg.queryAwareIndexingMaxCandidates === \"number\"\n ? Math.max(0, cfg.queryAwareIndexingMaxCandidates) // clamp: negative treated as 0 (no cap)\n : 200,\n temporalIndexWindowDays:\n typeof cfg.temporalIndexWindowDays === \"number\" ? cfg.temporalIndexWindowDays : 30,\n temporalIndexMaxEntries:\n typeof cfg.temporalIndexMaxEntries === \"number\" ? cfg.temporalIndexMaxEntries : 5000,\n temporalBoostRecentDays:\n typeof cfg.temporalBoostRecentDays === \"number\" ? cfg.temporalBoostRecentDays : 7,\n temporalBoostScore: typeof cfg.temporalBoostScore === \"number\" ? cfg.temporalBoostScore : 0.15,\n temporalDecayEnabled: cfg.temporalDecayEnabled !== false,\n tagMemoryEnabled: cfg.tagMemoryEnabled === true,\n tagMaxPerMemory: typeof cfg.tagMaxPerMemory === \"number\" ? cfg.tagMaxPerMemory : 5,\n tagIndexMaxEntries:\n typeof cfg.tagIndexMaxEntries === \"number\" ? cfg.tagIndexMaxEntries : 10000,\n tagRecallBoost: typeof cfg.tagRecallBoost === \"number\" ? cfg.tagRecallBoost : 0.15,\n tagRecallMaxMatches: typeof cfg.tagRecallMaxMatches === \"number\" ? cfg.tagRecallMaxMatches : 10,\n // v8.2: Multi-graph memory (PR 18)\n multiGraphMemoryEnabled: cfg.multiGraphMemoryEnabled === true,\n graphRecallEnabled: cfg.graphRecallEnabled === true,\n graphRecallMaxExpansions:\n typeof cfg.graphRecallMaxExpansions === \"number\" ? cfg.graphRecallMaxExpansions : 3,\n graphRecallMaxPerSeed:\n typeof cfg.graphRecallMaxPerSeed === \"number\" ? cfg.graphRecallMaxPerSeed : 5,\n graphRecallMinEdgeWeight:\n typeof cfg.graphRecallMinEdgeWeight === \"number\" ? cfg.graphRecallMinEdgeWeight : 0.1,\n graphRecallShadowEnabled: cfg.graphRecallShadowEnabled === true,\n graphRecallSnapshotEnabled: cfg.graphRecallSnapshotEnabled === true,\n graphRecallShadowSampleRate:\n typeof cfg.graphRecallShadowSampleRate === \"number\" ? cfg.graphRecallShadowSampleRate : 0.1,\n graphRecallExplainToolEnabled: cfg.graphRecallExplainToolEnabled === true,\n graphRecallStoreColdMirror: cfg.graphRecallStoreColdMirror === true,\n graphRecallColdMirrorCollection:\n typeof cfg.graphRecallColdMirrorCollection === \"string\" &&\n cfg.graphRecallColdMirrorCollection.trim().length > 0\n ? cfg.graphRecallColdMirrorCollection.trim()\n : undefined,\n graphRecallColdMirrorMinAgeDays:\n typeof cfg.graphRecallColdMirrorMinAgeDays === \"number\" ? cfg.graphRecallColdMirrorMinAgeDays : 7,\n graphRecallUseEntityPriors: cfg.graphRecallUseEntityPriors === true,\n graphRecallEntityPriorBoost:\n typeof cfg.graphRecallEntityPriorBoost === \"number\" ? cfg.graphRecallEntityPriorBoost : 0.2,\n graphRecallPreferHubSeeds: cfg.graphRecallPreferHubSeeds === true,\n graphRecallHubBias:\n typeof cfg.graphRecallHubBias === \"number\" ? cfg.graphRecallHubBias : 0.3,\n graphRecallRecencyHalfLifeDays:\n typeof cfg.graphRecallRecencyHalfLifeDays === \"number\" ? cfg.graphRecallRecencyHalfLifeDays : 30,\n graphRecallDampingFactor:\n typeof cfg.graphRecallDampingFactor === \"number\" ? cfg.graphRecallDampingFactor : 0.85,\n graphRecallMaxSeedNodes:\n typeof cfg.graphRecallMaxSeedNodes === \"number\" ? cfg.graphRecallMaxSeedNodes : 10,\n graphRecallMaxExpandedNodes:\n typeof cfg.graphRecallMaxExpandedNodes === \"number\" ? cfg.graphRecallMaxExpandedNodes : 30,\n graphRecallMaxTrailPerNode:\n typeof cfg.graphRecallMaxTrailPerNode === \"number\" ? cfg.graphRecallMaxTrailPerNode : 5,\n graphRecallMinSeedScore:\n typeof cfg.graphRecallMinSeedScore === \"number\" ? cfg.graphRecallMinSeedScore : 0.3,\n graphRecallExpansionScoreThreshold:\n typeof cfg.graphRecallExpansionScoreThreshold === \"number\"\n ? cfg.graphRecallExpansionScoreThreshold\n : 0.2,\n graphRecallExplainMaxPaths:\n typeof cfg.graphRecallExplainMaxPaths === \"number\" ? cfg.graphRecallExplainMaxPaths : 3,\n graphRecallExplainMaxChars:\n typeof cfg.graphRecallExplainMaxChars === \"number\" ? cfg.graphRecallExplainMaxChars : 500,\n graphRecallExplainEdgeLimit:\n typeof cfg.graphRecallExplainEdgeLimit === \"number\" ? cfg.graphRecallExplainEdgeLimit : 5,\n graphRecallExplainEnabled: cfg.graphRecallExplainEnabled === true,\n graphRecallEntityHintsEnabled: cfg.graphRecallEntityHintsEnabled === true,\n graphRecallEntityHintMax:\n typeof cfg.graphRecallEntityHintMax === \"number\" ? cfg.graphRecallEntityHintMax : 3,\n graphRecallEntityHintMaxChars:\n typeof cfg.graphRecallEntityHintMaxChars === \"number\" ? cfg.graphRecallEntityHintMaxChars : 200,\n graphRecallSnapshotDir:\n typeof cfg.graphRecallSnapshotDir === \"string\" && cfg.graphRecallSnapshotDir.trim().length > 0\n ? cfg.graphRecallSnapshotDir.trim()\n : path.join(memoryDir, \"state\", \"graph\"),\n graphRecallEnableTrace: cfg.graphRecallEnableTrace === true,\n graphRecallEnableDebug: cfg.graphRecallEnableDebug === true,\n graphExpandedIntentEnabled: cfg.graphExpandedIntentEnabled !== false,\n graphAssistInFullModeEnabled: cfg.graphAssistInFullModeEnabled !== false,\n graphAssistShadowEvalEnabled: cfg.graphAssistShadowEvalEnabled === true,\n graphAssistMinSeedResults:\n typeof cfg.graphAssistMinSeedResults === \"number\"\n ? Math.max(1, Math.floor(cfg.graphAssistMinSeedResults))\n : 3,\n entityGraphEnabled: cfg.entityGraphEnabled !== false,\n timeGraphEnabled: cfg.timeGraphEnabled !== false,\n graphWriteSessionAdjacencyEnabled: cfg.graphWriteSessionAdjacencyEnabled !== false,\n causalGraphEnabled: cfg.causalGraphEnabled !== false,\n maxGraphTraversalSteps:\n typeof cfg.maxGraphTraversalSteps === \"number\" ? Math.max(0, cfg.maxGraphTraversalSteps) : 3,\n graphActivationDecay:\n typeof cfg.graphActivationDecay === \"number\"\n ? Math.min(1, Math.max(0, cfg.graphActivationDecay))\n : 0.7,\n graphExpansionActivationWeight:\n typeof cfg.graphExpansionActivationWeight === \"number\"\n ? Math.min(1, Math.max(0, cfg.graphExpansionActivationWeight))\n : 0.65,\n graphExpansionBlendMin:\n typeof cfg.graphExpansionBlendMin === \"number\"\n ? Math.min(1, Math.max(0, cfg.graphExpansionBlendMin))\n : 0.05,\n graphExpansionBlendMax:\n typeof cfg.graphExpansionBlendMax === \"number\"\n ? Math.min(1, Math.max(0, cfg.graphExpansionBlendMax))\n : 0.95,\n maxEntityGraphEdgesPerMemory:\n typeof cfg.maxEntityGraphEdgesPerMemory === \"number\"\n ? Math.max(0, cfg.maxEntityGraphEdgesPerMemory)\n : 10,\n delinearizeEnabled: cfg.delinearizeEnabled !== false,\n recallConfidenceGateEnabled: cfg.recallConfidenceGateEnabled === true,\n recallConfidenceGateThreshold:\n typeof cfg.recallConfidenceGateThreshold === \"number\"\n ? Math.max(0, Math.min(1, cfg.recallConfidenceGateThreshold))\n : 0.12,\n causalRuleExtractionEnabled: cfg.causalRuleExtractionEnabled === true,\n memoryReconstructionEnabled: cfg.memoryReconstructionEnabled === true,\n memoryReconstructionMaxExpansions:\n typeof cfg.memoryReconstructionMaxExpansions === \"number\" ? Math.max(0, Math.round(cfg.memoryReconstructionMaxExpansions)) : 3,\n graphLateralInhibitionEnabled: cfg.graphLateralInhibitionEnabled !== false,\n graphLateralInhibitionBeta:\n typeof cfg.graphLateralInhibitionBeta === \"number\"\n ? Math.max(0, Math.min(1, cfg.graphLateralInhibitionBeta))\n : 0.15,\n graphLateralInhibitionTopM:\n typeof cfg.graphLateralInhibitionTopM === \"number\"\n ? Math.max(0, Math.round(cfg.graphLateralInhibitionTopM))\n : 7,\n // v8.2: Temporal Memory Tree\n temporalMemoryTreeEnabled: cfg.temporalMemoryTreeEnabled === true,\n tmtHourlyMinMemories:\n typeof cfg.tmtHourlyMinMemories === \"number\" ? cfg.tmtHourlyMinMemories : 3,\n tmtSummaryMaxTokens:\n typeof cfg.tmtSummaryMaxTokens === \"number\" ? cfg.tmtSummaryMaxTokens : 300,\n // Lossless Context Management (LCM)\n lcmEnabled: cfg.lcmEnabled === true,\n lcmLeafBatchSize:\n typeof cfg.lcmLeafBatchSize === \"number\" ? Math.max(2, Math.floor(cfg.lcmLeafBatchSize)) : 8,\n lcmRollupFanIn:\n typeof cfg.lcmRollupFanIn === \"number\" ? Math.max(2, Math.floor(cfg.lcmRollupFanIn)) : 4,\n lcmFreshTailTurns:\n typeof cfg.lcmFreshTailTurns === \"number\" ? Math.max(1, Math.floor(cfg.lcmFreshTailTurns)) : 16,\n lcmMaxDepth:\n typeof cfg.lcmMaxDepth === \"number\" ? Math.max(1, Math.floor(cfg.lcmMaxDepth)) : 5,\n lcmRecallBudgetShare:\n typeof cfg.lcmRecallBudgetShare === \"number\"\n ? Math.max(0, Math.min(1, cfg.lcmRecallBudgetShare))\n : 0.15,\n lcmDeterministicMaxTokens:\n typeof cfg.lcmDeterministicMaxTokens === \"number\"\n ? Math.max(64, Math.floor(cfg.lcmDeterministicMaxTokens))\n : 512,\n lcmArchiveRetentionDays:\n typeof cfg.lcmArchiveRetentionDays === \"number\"\n ? Math.max(1, Math.floor(cfg.lcmArchiveRetentionDays))\n : 90,\n\n // v9.1 Parallel Specialized Retrieval\n parallelRetrievalEnabled: cfg.parallelRetrievalEnabled === true,\n parallelAgentWeights: (() => {\n const w = cfg.parallelAgentWeights as Record<string, unknown> | undefined;\n return {\n direct: typeof w?.direct === \"number\" ? Math.max(0, w.direct) : 1.0,\n contextual: typeof w?.contextual === \"number\" ? Math.max(0, w.contextual) : 0.7,\n temporal: typeof w?.temporal === \"number\" ? Math.max(0, w.temporal) : 0.85,\n };\n })(),\n parallelMaxResultsPerAgent:\n typeof cfg.parallelMaxResultsPerAgent === \"number\"\n ? Math.max(0, Math.floor(cfg.parallelMaxResultsPerAgent))\n : 20,\n\n briefing: parseBriefingConfig(cfg.briefing),\n\n // Codex CLI connector settings (install-time)\n codex: (() => {\n const raw =\n cfg.codex && typeof cfg.codex === \"object\" && !Array.isArray(cfg.codex)\n ? (cfg.codex as Record<string, unknown>)\n : {};\n // Coerce string \"false\"/\"0\"/\"no\" → false and \"true\"/\"1\"/\"yes\" → true so\n // that CLI inputs like --config installExtension=false are handled correctly.\n // Missing / undefined defaults to true (coerceInstallExtension returns\n // undefined for unknown values, so ?? true applies the default).\n const installExtension = coerceInstallExtension(raw.installExtension) ?? true;\n const codexHome =\n typeof raw.codexHome === \"string\" && raw.codexHome.trim().length > 0\n ? raw.codexHome.trim()\n : null;\n return { installExtension, codexHome };\n })(),\n\n // MECE Taxonomy (#366)\n // Coerce string booleans from CLI (e.g. --config taxonomyEnabled=true) — gotcha #36\n taxonomyEnabled: coerceBool(cfg.taxonomyEnabled) ?? false,\n taxonomyAutoGenResolver: coerceBool(cfg.taxonomyAutoGenResolver) ?? true,\n\n // Codex CLI — native memory materialization (#378)\n codexMaterializeMemories: cfg.codexMaterializeMemories !== false,\n codexMaterializeNamespace:\n typeof cfg.codexMaterializeNamespace === \"string\" && cfg.codexMaterializeNamespace.trim().length > 0\n ? cfg.codexMaterializeNamespace.trim()\n : \"auto\",\n codexMaterializeMaxSummaryTokens:\n typeof cfg.codexMaterializeMaxSummaryTokens === \"number\"\n ? Math.max(0, Math.floor(cfg.codexMaterializeMaxSummaryTokens))\n : 4500,\n codexMaterializeRolloutRetentionDays:\n typeof cfg.codexMaterializeRolloutRetentionDays === \"number\"\n ? Math.max(0, Math.floor(cfg.codexMaterializeRolloutRetentionDays))\n : 30,\n codexMaterializeOnConsolidation: cfg.codexMaterializeOnConsolidation !== false,\n codexMaterializeOnSessionEnd: cfg.codexMaterializeOnSessionEnd !== false,\n // Codex CLI — marketplace integration (#418)\n codexMarketplaceEnabled: cfg.codexMarketplaceEnabled !== false, // default: true\n\n // Page-level versioning (issue #371)\n versioningEnabled: cfg.versioningEnabled === true,\n versioningMaxPerPage:\n typeof cfg.versioningMaxPerPage === \"number\"\n ? Math.max(0, Math.floor(cfg.versioningMaxPerPage))\n : 50,\n versioningSidecarDir:\n typeof cfg.versioningSidecarDir === \"string\" && cfg.versioningSidecarDir.trim().length > 0\n ? cfg.versioningSidecarDir.trim()\n : \".versions\",\n\n // Binary file lifecycle management (#367)\n binaryLifecycleEnabled: cfg.binaryLifecycleEnabled === true,\n binaryLifecycleGracePeriodDays:\n typeof cfg.binaryLifecycleGracePeriodDays === \"number\"\n ? Math.max(0, Math.floor(cfg.binaryLifecycleGracePeriodDays))\n : 7,\n binaryLifecycleBackendType: (() => {\n const valid = [\"filesystem\", \"s3\", \"none\"] as const;\n const raw = cfg.binaryLifecycleBackendType;\n if (typeof raw === \"string\" && (valid as readonly string[]).includes(raw)) {\n return raw as \"filesystem\" | \"s3\" | \"none\";\n }\n return \"none\" as const;\n })(),\n binaryLifecycleBackendPath:\n typeof cfg.binaryLifecycleBackendPath === \"string\"\n ? cfg.binaryLifecycleBackendPath.trim()\n : \"\",\n\n // Codex citation parity (issue #379)\n citationsEnabled: cfg.citationsEnabled === true,\n citationsAutoDetect: cfg.citationsAutoDetect !== false,\n\n // External enrichment pipeline (issue #365)\n enrichmentEnabled: cfg.enrichmentEnabled === true,\n enrichmentAutoOnCreate: cfg.enrichmentAutoOnCreate === true,\n enrichmentMaxCandidatesPerEntity:\n typeof cfg.enrichmentMaxCandidatesPerEntity === \"number\"\n ? Math.max(0, Math.floor(cfg.enrichmentMaxCandidatesPerEntity))\n : 20,\n\n // Memory extensions discovery (#382)\n memoryExtensionsEnabled: cfg.memoryExtensionsEnabled !== false,\n memoryExtensionsRoot:\n typeof cfg.memoryExtensionsRoot === \"string\" && cfg.memoryExtensionsRoot.trim().length > 0\n ? cfg.memoryExtensionsRoot.trim()\n : \"\",\n };\n}\n\nfunction parseBriefingConfig(raw: unknown): import(\"./types.js\").BriefingConfig {\n const entry =\n raw && typeof raw === \"object\" && !Array.isArray(raw)\n ? (raw as Record<string, unknown>)\n : {};\n const defaultFormat =\n entry.defaultFormat === \"json\" || entry.defaultFormat === \"markdown\"\n ? (entry.defaultFormat as \"markdown\" | \"json\")\n : \"markdown\";\n const maxFollowupsRaw =\n typeof entry.maxFollowups === \"number\" && Number.isFinite(entry.maxFollowups)\n ? Math.floor(entry.maxFollowups)\n : 5;\n const maxFollowups = Math.max(0, Math.min(10, maxFollowupsRaw));\n return {\n enabled: entry.enabled !== false,\n defaultWindow:\n typeof entry.defaultWindow === \"string\" && entry.defaultWindow.trim().length > 0\n ? entry.defaultWindow.trim()\n : \"yesterday\",\n defaultFormat,\n maxFollowups,\n calendarSource:\n typeof entry.calendarSource === \"string\" && entry.calendarSource.trim().length > 0\n ? entry.calendarSource.trim()\n : null,\n saveByDefault: entry.saveByDefault === true,\n saveDir:\n typeof entry.saveDir === \"string\" && entry.saveDir.trim().length > 0\n ? entry.saveDir.trim()\n : null,\n llmFollowups: entry.llmFollowups !== false,\n };\n}\n\nfunction clampNonNegativeNumber(value: unknown): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return undefined;\n return Math.max(0, Math.floor(value));\n}\n\n// -----------------------------------------------------------------------------\n// Issue #563 buffer-surprise knobs — shared clamp helpers\n// -----------------------------------------------------------------------------\n//\n// Each helper takes a post-`coerceNumber` value (number | undefined) and a\n// fallback. This keeps the coercion layer (coerce CLI strings → number) and\n// the range layer (clamp to valid domain) cleanly separated — a common\n// source of post-merge fixes when these were inlined (CLAUDE.md rule #28).\n\nfunction clampSurpriseThreshold(\n value: number | undefined,\n fallback: number,\n): number {\n if (value === undefined) return fallback;\n // [0, 1] inclusive. 0 means \"always flush on any score\"; 1 means \"never\n // flush on surprise alone\" — both are valid-but-odd configurations.\n return Math.min(1, Math.max(0, value));\n}\n\nfunction clampSurpriseK(\n value: number | undefined,\n fallback: number,\n): number {\n if (value === undefined) return fallback;\n return Math.max(1, Math.floor(value));\n}\n\nfunction clampSurpriseRecentMemoryCount(\n value: number | undefined,\n fallback: number,\n): number {\n if (value === undefined) return fallback;\n return Math.max(0, Math.floor(value));\n}\n\nfunction clampSurpriseProbeTimeoutMs(\n value: number | undefined,\n fallback: number,\n): number {\n if (value === undefined) return fallback;\n // A zero or negative timeout would either skip the probe entirely or\n // fire instantly — both surprising behaviors that hide config errors.\n // Clamp to a minimum of 1ms and round to integer.\n return Math.max(1, Math.floor(value));\n}\n\nfunction parseRecallSectionEntry(raw: unknown): RecallSectionConfig {\n const entry =\n raw && typeof raw === \"object\" && !Array.isArray(raw)\n ? (raw as Record<string, unknown>)\n : {};\n return {\n id: typeof entry.id === \"string\" ? entry.id.trim() : \"\",\n enabled: entry.enabled !== false,\n maxChars:\n entry.maxChars === null\n ? null\n : clampNonNegativeNumber(entry.maxChars),\n maxHints: clampNonNegativeNumber(entry.maxHints),\n maxSupportingFacts: clampNonNegativeNumber(entry.maxSupportingFacts),\n maxRelatedEntities: clampNonNegativeNumber(entry.maxRelatedEntities),\n consolidateTriggerLines: clampNonNegativeNumber(entry.consolidateTriggerLines),\n consolidateTargetLines: clampNonNegativeNumber(entry.consolidateTargetLines),\n maxEntities: clampNonNegativeNumber(entry.maxEntities),\n maxResults: clampNonNegativeNumber(entry.maxResults),\n recentTurns: clampNonNegativeNumber(entry.recentTurns),\n maxTurns: clampNonNegativeNumber(entry.maxTurns),\n maxTokens: clampNonNegativeNumber(entry.maxTokens),\n lookbackHours: clampNonNegativeNumber(entry.lookbackHours),\n maxCount: clampNonNegativeNumber(entry.maxCount),\n topK: clampNonNegativeNumber(entry.topK),\n timeoutMs: clampNonNegativeNumber(entry.timeoutMs),\n maxPatterns: clampNonNegativeNumber(entry.maxPatterns),\n maxRubrics: clampNonNegativeNumber(entry.maxRubrics),\n };\n}\n\nfunction buildDefaultRecallPipeline(cfg: Record<string, unknown>): RecallSectionConfig[] {\n return [\n {\n id: \"shared-context\",\n enabled: cfg.sharedContextEnabled === true,\n maxChars:\n typeof cfg.sharedContextMaxInjectChars === \"number\"\n ? Math.max(0, Math.floor(cfg.sharedContextMaxInjectChars))\n : 4000,\n },\n {\n id: \"profile\",\n enabled: true,\n consolidateTriggerLines: 100,\n consolidateTargetLines: 50,\n },\n {\n id: \"identity-continuity\",\n enabled: cfg.identityContinuityEnabled === true,\n },\n {\n id: \"entity-retrieval\",\n enabled: cfg.entityRetrievalEnabled !== false,\n maxChars:\n typeof cfg.entityRetrievalMaxChars === \"number\"\n ? Math.max(0, Math.floor(cfg.entityRetrievalMaxChars))\n : 2400,\n maxHints:\n typeof cfg.entityRetrievalMaxHints === \"number\"\n ? Math.max(0, Math.floor(cfg.entityRetrievalMaxHints))\n : 2,\n maxSupportingFacts:\n typeof cfg.entityRetrievalMaxSupportingFacts === \"number\"\n ? Math.max(0, Math.floor(cfg.entityRetrievalMaxSupportingFacts))\n : 6,\n maxRelatedEntities:\n typeof cfg.entityRetrievalMaxRelatedEntities === \"number\"\n ? Math.max(0, Math.floor(cfg.entityRetrievalMaxRelatedEntities))\n : 3,\n recentTurns:\n typeof cfg.entityRetrievalRecentTurns === \"number\"\n ? Math.max(0, Math.floor(cfg.entityRetrievalRecentTurns))\n : 6,\n },\n {\n id: \"knowledge-index\",\n enabled: cfg.knowledgeIndexEnabled !== false,\n maxChars:\n typeof cfg.knowledgeIndexMaxChars === \"number\"\n ? Math.max(0, Math.floor(cfg.knowledgeIndexMaxChars))\n : 4000,\n maxEntities:\n typeof cfg.knowledgeIndexMaxEntities === \"number\"\n ? Math.max(0, Math.floor(cfg.knowledgeIndexMaxEntities))\n : 40,\n },\n { id: \"verbatim-artifacts\", enabled: cfg.verbatimArtifactsEnabled === true },\n {\n id: \"procedure-recall\",\n // Default-on since issue #567 PR 4/5: the master `procedural.enabled`\n // gate now defaults to `true` when the key is omitted, so the recall\n // pipeline must stay in sync. Explicit `false` (or any coerceBool\n // falsy variant) still disables recall injection.\n //\n // CLAUDE.md rule 48 (least-privileged defaults) + Cursor review on #609:\n // never fail open on unrecognized values. Only `coerced === true` or\n // the \"key omitted\" path enables the section. `parseConfig` throws\n // on invalid values upstream, so this branch only ever sees boolean\n // results — `coerced === undefined` should never happen in practice,\n // but defense-in-depth keeps the section disabled if it ever does.\n enabled: (() => {\n const proceduralRaw =\n typeof cfg.procedural === \"object\" &&\n cfg.procedural !== null &&\n !Array.isArray(cfg.procedural)\n ? (cfg.procedural as { enabled?: unknown })\n : undefined;\n if (proceduralRaw === undefined) return true;\n const rawEnabled = proceduralRaw.enabled;\n if (rawEnabled === undefined) return true;\n return coerceBool(rawEnabled) === true;\n })(),\n maxChars: 2400,\n },\n { id: \"memory-boxes\", enabled: cfg.memoryBoxesEnabled === true },\n { id: \"temporal-memory-tree\", enabled: cfg.temporalMemoryTreeEnabled === true },\n { id: \"lcm-compressed-history\", enabled: cfg.lcmEnabled === true },\n {\n id: \"objective-state\",\n enabled: cfg.objectiveStateRecallEnabled === true,\n maxResults: 4,\n maxChars: 1800,\n },\n {\n id: \"causal-trajectories\",\n enabled: cfg.causalTrajectoryRecallEnabled === true,\n maxResults: 3,\n maxChars: 2200,\n },\n {\n id: \"trust-zones\",\n enabled: cfg.trustZoneRecallEnabled === true,\n maxResults: 3,\n maxChars: 1800,\n },\n {\n id: \"harmonic-retrieval\",\n enabled: cfg.harmonicRetrievalEnabled === true,\n maxResults: 3,\n maxChars: 2200,\n },\n {\n id: \"verified-episodes\",\n enabled: cfg.verifiedRecallEnabled === true,\n maxResults: 3,\n maxChars: 1800,\n },\n {\n id: \"verified-rules\",\n enabled: cfg.semanticRuleVerificationEnabled === true,\n maxResults: 3,\n maxChars: 1800,\n },\n {\n id: \"work-products\",\n enabled: cfg.workProductRecallEnabled === true,\n maxResults: 3,\n maxChars: 1800,\n },\n {\n id: \"memories\",\n enabled: true,\n maxResults:\n typeof cfg.qmdMaxResults === \"number\"\n ? Math.max(0, Math.floor(cfg.qmdMaxResults))\n : 8,\n },\n {\n id: \"compression-guidelines\",\n enabled: cfg.compressionGuidelineLearningEnabled === true,\n },\n {\n id: \"native-knowledge\",\n enabled: cfg.nativeKnowledge && typeof cfg.nativeKnowledge === \"object\"\n ? (cfg.nativeKnowledge as Record<string, unknown>).enabled === true\n : false,\n maxResults:\n cfg.nativeKnowledge && typeof cfg.nativeKnowledge === \"object\" &&\n typeof (cfg.nativeKnowledge as Record<string, unknown>).maxResults === \"number\"\n ? Math.max(0, Math.floor((cfg.nativeKnowledge as Record<string, unknown>).maxResults as number))\n : 4,\n maxChars:\n cfg.nativeKnowledge && typeof cfg.nativeKnowledge === \"object\" &&\n typeof (cfg.nativeKnowledge as Record<string, unknown>).maxChars === \"number\"\n ? Math.max(0, Math.floor((cfg.nativeKnowledge as Record<string, unknown>).maxChars as number))\n : 2400,\n },\n {\n id: \"transcript\",\n enabled: cfg.transcriptEnabled !== false,\n maxTurns:\n typeof cfg.maxTranscriptTurns === \"number\"\n ? Math.max(0, Math.floor(cfg.maxTranscriptTurns))\n : 50,\n maxTokens:\n typeof cfg.maxTranscriptTokens === \"number\"\n ? Math.max(0, Math.floor(cfg.maxTranscriptTokens))\n : 1000,\n lookbackHours:\n typeof cfg.transcriptRecallHours === \"number\"\n ? Math.max(0, Math.floor(cfg.transcriptRecallHours))\n : 12,\n },\n {\n id: \"summaries\",\n enabled: cfg.hourlySummariesEnabled !== false,\n maxCount:\n typeof cfg.maxSummaryCount === \"number\"\n ? Math.max(0, Math.floor(cfg.maxSummaryCount))\n : 6,\n lookbackHours:\n typeof cfg.summaryRecallHours === \"number\"\n ? Math.max(0, Math.floor(cfg.summaryRecallHours))\n : 24,\n },\n {\n id: \"conversation-recall\",\n enabled: cfg.conversationIndexEnabled === true,\n topK:\n typeof cfg.conversationRecallTopK === \"number\"\n ? Math.max(0, Math.floor(cfg.conversationRecallTopK))\n : 3,\n maxChars:\n typeof cfg.conversationRecallMaxChars === \"number\"\n ? Math.max(0, Math.floor(cfg.conversationRecallMaxChars))\n : 2500,\n timeoutMs:\n typeof cfg.conversationRecallTimeoutMs === \"number\"\n ? Math.max(0, Math.floor(cfg.conversationRecallTimeoutMs))\n : 800,\n },\n {\n id: \"compounding\",\n enabled: cfg.compoundingEnabled === true && cfg.compoundingInjectEnabled !== false,\n maxPatterns: 40,\n maxRubrics: 4,\n },\n { id: \"questions\", enabled: cfg.injectQuestions === true },\n ];\n}\n\nfunction buildRecallPipelineConfig(cfg: Record<string, unknown>): RecallPipelineConfig {\n const maxMemoryTokens =\n typeof cfg.maxMemoryTokens === \"number\"\n ? Math.max(0, Math.floor(cfg.maxMemoryTokens))\n : 2000;\n const recallBudgetCharsRaw = clampNonNegativeNumber(cfg.recallBudgetChars);\n const recallBudgetChars = recallBudgetCharsRaw ?? maxMemoryTokens * 4;\n\n const rawPipeline = cfg.recallPipeline;\n const pipeline = Array.isArray(rawPipeline)\n ? rawPipeline.map(parseRecallSectionEntry).filter((entry) => entry.id.length > 0)\n : buildDefaultRecallPipeline(cfg);\n\n return { recallBudgetChars, pipeline };\n}\n","/**\n * Shared boolean coercion helpers.\n *\n * Extracted from connectors/index.ts so that both config.ts and\n * connectors/index.ts can import them without creating a circular dependency.\n */\n\n/**\n * Generic boolean coercion: converts string representations of booleans\n * (e.g. from CLI `--config someFlag=false`) to proper boolean values.\n * Accepts the same truthy/falsy strings that common shells and env vars use.\n *\n * Returns `undefined` when the value is neither a boolean nor a recognised\n * string, so callers can fall back to a default.\n *\n * CLAUDE.md gotcha #36: String \"false\" is truthy in JavaScript.\n * CLAUDE.md gotcha #28: Coerce CLI values to expected types at input boundaries.\n */\nexport function coerceBool(value: unknown): boolean | undefined {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") {\n const v = value.trim().toLowerCase();\n if ([\"false\", \"0\", \"no\", \"off\"].includes(v)) return false;\n if ([\"true\", \"1\", \"yes\", \"on\"].includes(v)) return true;\n }\n return undefined;\n}\n\n/**\n * Coerce the `installExtension` config value from a string (e.g. from CLI\n * `--config installExtension=false`) to a proper boolean.\n *\n * Delegates to the generic `coerceBool` helper. Kept for backward compatibility.\n */\nexport function coerceInstallExtension(value: unknown): boolean | undefined {\n return coerceBool(value);\n}\n\n/**\n * Generic numeric coercion: accepts a finite number or a string that\n * parses cleanly to one. Returns `undefined` otherwise so callers can\n * fall back to a default.\n *\n * Rules:\n * - number: returned as-is only if finite (NaN / ±Infinity → undefined).\n * - string: trimmed, parsed with `Number()`. Returns `undefined` on\n * empty, NaN, or Infinity.\n *\n * CLAUDE.md gotcha #28: Coerce CLI values to expected types at input boundaries.\n */\nexport function coerceNumber(value: unknown): number | undefined {\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? value : undefined;\n }\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (trimmed.length === 0) return undefined;\n const n = Number(trimmed);\n return Number.isFinite(n) ? n : undefined;\n }\n return undefined;\n}\n"],"mappings":"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","names":["raw"]}