@remnic/core 9.69.37 → 9.69.39

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 (697) hide show
  1. package/dist/access-admin-ops-surface.d.ts +14 -12
  2. package/dist/access-admin-ops-surface.js +86 -83
  3. package/dist/access-authorization-probe.d.ts +14 -12
  4. package/dist/access-authorization-probe.js +87 -84
  5. package/dist/access-boundary.d.ts +14 -12
  6. package/dist/access-boundary.js +86 -83
  7. package/dist/access-cli.js +197 -191
  8. package/dist/access-cli.js.map +1 -1
  9. package/dist/access-coding-context-resolution.d.ts +2 -1
  10. package/dist/access-extraction-force-flush.d.ts +14 -12
  11. package/dist/access-extraction-force-flush.js +86 -83
  12. package/dist/access-health-types.d.ts +2 -1
  13. package/dist/access-http-briefing.d.ts +14 -12
  14. package/dist/access-http-briefing.js +87 -84
  15. package/dist/access-http-lcm-compaction.d.ts +14 -12
  16. package/dist/access-http-lifecycle-flush.d.ts +14 -12
  17. package/dist/access-http-offline-stream.d.ts +14 -12
  18. package/dist/access-http-query.d.ts +3 -2
  19. package/dist/access-http-query.js +88 -85
  20. package/dist/access-http.d.ts +15 -13
  21. package/dist/access-http.js +108 -105
  22. package/dist/access-identity-continuity-surface.d.ts +12 -10
  23. package/dist/access-identity-continuity-surface.js +86 -83
  24. package/dist/access-lcm-surface.d.ts +14 -12
  25. package/dist/access-lcm-surface.js +86 -83
  26. package/dist/access-mcp.d.ts +14 -12
  27. package/dist/access-mcp.js +97 -94
  28. package/dist/access-memory-search-fanout.d.ts +3 -2
  29. package/dist/{access-namespace-preflight-CV5cHujx.d.ts → access-namespace-preflight-DY4z6L5X.d.ts} +1 -1
  30. package/dist/access-namespace-preflight.d.ts +4 -3
  31. package/dist/access-namespace-preflight.js +86 -83
  32. package/dist/access-observe-transcript.d.ts +12 -10
  33. package/dist/access-observe-write-category.d.ts +37 -0
  34. package/dist/access-observe-write-category.js +34 -0
  35. package/dist/access-observe-write-surface.d.ts +17 -15
  36. package/dist/access-observe-write-surface.js +86 -83
  37. package/dist/access-offline-manifest.d.ts +12 -10
  38. package/dist/access-offline-manifest.js +15 -15
  39. package/dist/access-operations-batch.js +91 -88
  40. package/dist/access-operations.d.ts +17 -30
  41. package/dist/access-operations.js +96 -93
  42. package/dist/access-recall-concurrency.d.ts +14 -12
  43. package/dist/access-recall-concurrency.js +86 -83
  44. package/dist/access-recall-response.d.ts +14 -12
  45. package/dist/access-recall-response.js +86 -83
  46. package/dist/access-recall-surface.d.ts +14 -12
  47. package/dist/access-recall-surface.js +86 -83
  48. package/dist/access-schema.d.ts +210 -107
  49. package/dist/access-schema.js +9 -15
  50. package/dist/{access-service-DwHC7lcV.d.ts → access-service-MY4bsr_Q.d.ts} +101 -77
  51. package/dist/access-service-helpers.d.ts +14 -12
  52. package/dist/access-service.d.ts +14 -12
  53. package/dist/access-service.js +86 -83
  54. package/dist/access-surface-catalog.d.ts +14 -12
  55. package/dist/access-surface-catalog.js +88 -85
  56. package/dist/access-surface-catalog.js.map +1 -1
  57. package/dist/access-wearables-meetings-surface.d.ts +5 -3
  58. package/dist/action-confidence.d.ts +2 -1
  59. package/dist/active-memory-bridge.d.ts +2 -1
  60. package/dist/active-memory-bridge.js +3 -3
  61. package/dist/active-recall.d.ts +2 -1
  62. package/dist/active-recall.js +20 -17
  63. package/dist/active-recall.js.map +1 -1
  64. package/dist/activity/digest.d.ts +2 -1
  65. package/dist/adapters/index.js +4 -4
  66. package/dist/adapters/registry.js +2 -2
  67. package/dist/ambient-provenance.d.ts +2 -1
  68. package/dist/artifact-search.d.ts +2 -1
  69. package/dist/{auto-sync-FSRJDU63.js → auto-sync-RP4C6ZPF.js} +11 -9
  70. package/dist/{auto-sync-FSRJDU63.js.map → auto-sync-RP4C6ZPF.js.map} +1 -1
  71. package/dist/background-generation-config.d.ts +10 -0
  72. package/dist/background-generation-config.js +9 -0
  73. package/dist/background-generation.d.ts +25 -0
  74. package/dist/background-generation.js +11 -0
  75. package/dist/behavior-learner.d.ts +2 -1
  76. package/dist/behavior-signals.d.ts +2 -1
  77. package/dist/bootstrap.d.ts +12 -10
  78. package/dist/briefing-window.d.ts +3 -2
  79. package/dist/briefing.d.ts +3 -2
  80. package/dist/briefing.js +27 -26
  81. package/dist/buffer-surprise-report.d.ts +2 -1
  82. package/dist/buffer-turn-helpers.d.ts +2 -1
  83. package/dist/buffer.d.ts +3 -2
  84. package/dist/buffer.js +8 -8
  85. package/dist/bulk-import/index.d.ts +4 -3
  86. package/dist/calibration.d.ts +3 -1
  87. package/dist/calibration.js +4 -2
  88. package/dist/calibration.js.map +1 -1
  89. package/dist/capabilities.d.ts +2 -1
  90. package/dist/{capsule-crypto-YO5QJ6L3.js → capsule-crypto-7FJQINUR.js} +2 -2
  91. package/dist/{capsule-merge-ZCXUPLNJ.js → capsule-merge-IPG4IOFP.js} +2 -2
  92. package/dist/{catalog-Cl4H8N89.d.ts → catalog-CW87xGx8.d.ts} +1 -1
  93. package/dist/causal-behavior.d.ts +2 -1
  94. package/dist/causal-behavior.js +2 -2
  95. package/dist/causal-chain.js +2 -2
  96. package/dist/causal-consolidation.d.ts +2 -1
  97. package/dist/causal-consolidation.js +29 -28
  98. package/dist/causal-consolidation.js.map +1 -1
  99. package/dist/causal-retrieval.js +2 -2
  100. package/dist/causal-trajectory-graph.d.ts +2 -1
  101. package/dist/causal-trajectory-graph.js +2 -2
  102. package/dist/causal-trajectory.js +1 -1
  103. package/dist/{chunk-YHU5XUF4.js → chunk-27MKMTBY.js} +2 -2
  104. package/dist/{chunk-TK4FHQRN.js → chunk-2J3V5QEO.js} +4 -4
  105. package/dist/{chunk-BXLOS5AJ.js → chunk-2NLLXCJG.js} +2 -2
  106. package/dist/chunk-2QG4SLZI.js +44 -0
  107. package/dist/chunk-2QG4SLZI.js.map +1 -0
  108. package/dist/{chunk-TFRDUD3M.js → chunk-2ZTDRNCS.js} +2 -2
  109. package/dist/{chunk-PWPIERBM.js → chunk-37CAEC7E.js} +4 -4
  110. package/dist/{chunk-X7BCM2NA.js → chunk-3EKVN2OP.js} +2 -2
  111. package/dist/{chunk-S2ULTQZR.js → chunk-3N3PBBEH.js} +2 -2
  112. package/dist/{chunk-XCF3SFHD.js → chunk-3NPNBVFR.js} +2 -2
  113. package/dist/{chunk-JO5TQAKW.js → chunk-4BCHFSC7.js} +3 -3
  114. package/dist/{chunk-Q6D7EUSQ.js → chunk-4JVQRFZD.js} +10 -10
  115. package/dist/{chunk-YEDVOYL2.js → chunk-4RX5O34R.js} +2 -2
  116. package/dist/{chunk-JMPYZJQN.js → chunk-4RZLTZVM.js} +4 -4
  117. package/dist/{chunk-Q7JK6YEB.js → chunk-54NX5EG4.js} +2 -2
  118. package/dist/{chunk-GWK7FEUL.js → chunk-5FAGCOZD.js} +4 -4
  119. package/dist/{chunk-2PUE5P7C.js → chunk-5N4MZLEH.js} +5 -5
  120. package/dist/{chunk-B2YKTE7P.js → chunk-5SPCMAUC.js} +10 -10
  121. package/dist/{chunk-3OHISDDW.js → chunk-5U7K4W6K.js} +2 -2
  122. package/dist/{chunk-CYEMS2PG.js → chunk-5YCNDC3C.js} +3 -3
  123. package/dist/{chunk-PAAJWQH5.js → chunk-62D2PAAM.js} +4 -4
  124. package/dist/{chunk-52II7PB6.js → chunk-645WOU5I.js} +4 -4
  125. package/dist/chunk-6AGWBKQU.js +94 -0
  126. package/dist/chunk-6AGWBKQU.js.map +1 -0
  127. package/dist/{chunk-326KUXIR.js → chunk-6EHM2AV7.js} +6 -6
  128. package/dist/{chunk-YM7YN37H.js → chunk-6ET2VII7.js} +2 -2
  129. package/dist/chunk-6H2G7RFT.js +58 -0
  130. package/dist/chunk-6H2G7RFT.js.map +1 -0
  131. package/dist/{chunk-A2YQL2FF.js → chunk-6P4REYKL.js} +5 -5
  132. package/dist/{chunk-7RKBPXY6.js → chunk-6YAIN5XJ.js} +2 -2
  133. package/dist/{chunk-2L5FSNPC.js → chunk-A7GQBJP5.js} +10 -10
  134. package/dist/{chunk-UYVXIY6C.js → chunk-AAZEKXUP.js} +2 -2
  135. package/dist/{chunk-JR6PP7UM.js → chunk-ACY4ZPF7.js} +28 -2
  136. package/dist/chunk-ACY4ZPF7.js.map +1 -0
  137. package/dist/{chunk-IQZ6ISFX.js → chunk-AECJY3GJ.js} +2 -2
  138. package/dist/{chunk-76DRU7C4.js → chunk-AENM6GKU.js} +2 -2
  139. package/dist/{chunk-KTRXQQFN.js → chunk-B36GUU6T.js} +4 -4
  140. package/dist/{chunk-TLHNF6GA.js → chunk-BV4ZKIZH.js} +1 -1
  141. package/dist/{chunk-ZWEZXVYH.js → chunk-CEO4DONG.js} +2 -2
  142. package/dist/chunk-CWTCMZGE.js +858 -0
  143. package/dist/chunk-CWTCMZGE.js.map +1 -0
  144. package/dist/{chunk-ZEPVWLCN.js → chunk-CZTPU65V.js} +25 -25
  145. package/dist/{chunk-TRU6JBOI.js → chunk-D545Z7UH.js} +3 -3
  146. package/dist/{chunk-6E5GYDIE.js → chunk-DGS34QSY.js} +2 -2
  147. package/dist/{chunk-65RENJGB.js → chunk-E2AWJ7KQ.js} +8 -4
  148. package/dist/chunk-E2AWJ7KQ.js.map +1 -0
  149. package/dist/{chunk-6Z3WW2MW.js → chunk-ENBPQEVU.js} +3 -3
  150. package/dist/{chunk-DOKKRZPH.js → chunk-EYKIDK33.js} +21 -19
  151. package/dist/chunk-EYKIDK33.js.map +1 -0
  152. package/dist/{chunk-PNEDMJ53.js → chunk-F4EHXVP7.js} +2 -2
  153. package/dist/{chunk-JPKZTCWZ.js → chunk-FNHLI2RE.js} +3 -3
  154. package/dist/{chunk-D2DIYEFW.js → chunk-FWWWUPOE.js} +12 -36
  155. package/dist/chunk-FWWWUPOE.js.map +1 -0
  156. package/dist/{chunk-M3MYMWXG.js → chunk-FXHOZGSE.js} +2 -2
  157. package/dist/{chunk-SAKA6PPL.js → chunk-GAS7KYC7.js} +5 -5
  158. package/dist/{chunk-LSLCFCCQ.js → chunk-GDYU6VF4.js} +1 -1
  159. package/dist/chunk-GDYU6VF4.js.map +1 -0
  160. package/dist/{chunk-2AR5JFD7.js → chunk-GG5FHZJJ.js} +6 -6
  161. package/dist/{chunk-WS3WNLST.js → chunk-GI4ZBWPQ.js} +3 -3
  162. package/dist/{chunk-JYR4LH76.js → chunk-GMIQV6DD.js} +2 -2
  163. package/dist/{chunk-WIKO4SCR.js → chunk-H3TKENU4.js} +5 -5
  164. package/dist/{chunk-ZLN7AROH.js → chunk-HIP6DKJJ.js} +5 -5
  165. package/dist/{chunk-SF6RFI5Z.js → chunk-HWLIMQE2.js} +2 -2
  166. package/dist/{chunk-JZYECQWN.js → chunk-IL6ODG6M.js} +2 -2
  167. package/dist/{chunk-GNR6YEWZ.js → chunk-IQEJIOEU.js} +6 -6
  168. package/dist/{chunk-BICNRVEC.js → chunk-IWO6QXWJ.js} +2 -2
  169. package/dist/{chunk-RN3MVLW3.js → chunk-IYKZJVL5.js} +1 -1
  170. package/dist/chunk-IYKZJVL5.js.map +1 -0
  171. package/dist/{chunk-42DJ235G.js → chunk-J272ODKJ.js} +2 -2
  172. package/dist/{chunk-R3TLVTWW.js → chunk-JDX2OA4R.js} +3 -3
  173. package/dist/{chunk-G5MO3VQA.js → chunk-JKKII6GX.js} +2 -2
  174. package/dist/{chunk-L5OXE4PX.js → chunk-JTQR6L2N.js} +3 -3
  175. package/dist/{chunk-VDX2J7OX.js → chunk-KQAFEZQX.js} +2 -2
  176. package/dist/{chunk-AKE4GGQ3.js → chunk-KQW3YGEN.js} +2 -2
  177. package/dist/{chunk-LMMQKZK3.js → chunk-L63GFNKL.js} +1 -1
  178. package/dist/{chunk-BRZWWUCJ.js → chunk-LMLGBG6H.js} +2 -2
  179. package/dist/{chunk-3IXB77DA.js → chunk-LPYYY4AP.js} +318 -278
  180. package/dist/chunk-LPYYY4AP.js.map +1 -0
  181. package/dist/{chunk-YEN4TREG.js → chunk-LQNRVPTV.js} +54 -567
  182. package/dist/chunk-LQNRVPTV.js.map +1 -0
  183. package/dist/{chunk-CQ7SSBO4.js → chunk-M6HBPLBA.js} +2 -2
  184. package/dist/chunk-MCRVQ5YQ.js +14 -0
  185. package/dist/chunk-MCRVQ5YQ.js.map +1 -0
  186. package/dist/{chunk-3YMDY3ZF.js → chunk-MUTVRKKY.js} +16 -16
  187. package/dist/{chunk-FCFAYMTU.js → chunk-NXGSONWM.js} +2 -2
  188. package/dist/{chunk-4WGAMREC.js → chunk-O4M4BDIJ.js} +2 -2
  189. package/dist/{chunk-5SYI2F47.js → chunk-O76F5QPP.js} +2 -2
  190. package/dist/{chunk-SROIT6QY.js → chunk-OPBFP4TF.js} +28 -11
  191. package/dist/chunk-OPBFP4TF.js.map +1 -0
  192. package/dist/{chunk-7MJBKZPU.js → chunk-P4ZAEYKG.js} +68 -34
  193. package/dist/chunk-P4ZAEYKG.js.map +1 -0
  194. package/dist/{chunk-57GDHV2D.js → chunk-PCOVEDPK.js} +6 -6
  195. package/dist/{chunk-PPTOAHTZ.js → chunk-PGAB2V53.js} +2 -2
  196. package/dist/{chunk-HHDTBYDJ.js → chunk-Q432REND.js} +2 -2
  197. package/dist/{chunk-XAITGGX5.js → chunk-Q4AUIFUA.js} +4 -4
  198. package/dist/{chunk-5LLQAUMI.js → chunk-Q7CLGFA7.js} +3 -3
  199. package/dist/{chunk-KUK56OPR.js → chunk-QHT7MOUF.js} +12 -12
  200. package/dist/{chunk-W6IJMWTZ.js → chunk-QTQ6XKGT.js} +4 -4
  201. package/dist/{chunk-FLLORID2.js → chunk-RLJHJQUY.js} +9 -9
  202. package/dist/{chunk-353KGBKY.js → chunk-RW4QNB4J.js} +4 -4
  203. package/dist/{chunk-GWQVMKUJ.js → chunk-SCXURCVT.js} +3 -3
  204. package/dist/{chunk-FQXJAC3T.js → chunk-SGUDMW2K.js} +4 -4
  205. package/dist/{chunk-LSDEIZ76.js → chunk-TA4C3XB7.js} +6 -6
  206. package/dist/{chunk-YIZ2EUUL.js → chunk-TNZNSMVJ.js} +94 -94
  207. package/dist/{chunk-CIYUWSMZ.js → chunk-TRLOFIQC.js} +2 -2
  208. package/dist/{chunk-TL7NLM2L.js → chunk-TSP5WH72.js} +2 -2
  209. package/dist/{chunk-3K6UFW5B.js → chunk-UHRZ324M.js} +8 -8
  210. package/dist/{chunk-JLXWRQNR.js → chunk-UZEHHXYC.js} +170 -167
  211. package/dist/chunk-UZEHHXYC.js.map +1 -0
  212. package/dist/{chunk-A5UQ52YQ.js → chunk-UZZ7SQT3.js} +5 -5
  213. package/dist/{chunk-GHX5PNXW.js → chunk-VBSNUH4J.js} +2 -2
  214. package/dist/{chunk-MR6LQVZ5.js → chunk-VJIE4D2I.js} +3 -3
  215. package/dist/{chunk-OTPXEE6W.js → chunk-VSL63CFJ.js} +15 -12
  216. package/dist/chunk-VSL63CFJ.js.map +1 -0
  217. package/dist/{chunk-2JGGZICG.js → chunk-WBM2MVBK.js} +2 -2
  218. package/dist/{chunk-CD3C4BJN.js → chunk-WIWLX65T.js} +2 -2
  219. package/dist/{chunk-GDDSXVWR.js → chunk-X4TD4O2F.js} +3 -3
  220. package/dist/{chunk-DQEMWVMT.js → chunk-X7Y7WX73.js} +1 -1
  221. package/dist/{chunk-FPQDZCUX.js → chunk-XH3HGI2N.js} +2 -2
  222. package/dist/{chunk-C6KRO3SU.js → chunk-XVDZFTN5.js} +4 -4
  223. package/dist/{chunk-3SL52JKD.js → chunk-XVZA6VXC.js} +4 -4
  224. package/dist/chunk-YDVAM7S4.js +221 -0
  225. package/dist/chunk-YDVAM7S4.js.map +1 -0
  226. package/dist/chunk-YFTNZMGR.js +71 -0
  227. package/dist/chunk-YFTNZMGR.js.map +1 -0
  228. package/dist/{chunk-VELCIWJZ.js → chunk-YKREX63Z.js} +19 -10
  229. package/dist/chunk-YKREX63Z.js.map +1 -0
  230. package/dist/{chunk-BLHX5FQW.js → chunk-YUW66UAH.js} +2 -2
  231. package/dist/{chunk-DOQLHCSS.js → chunk-ZBW7A667.js} +2 -2
  232. package/dist/{chunk-4DPDIOVA.js → chunk-ZEGL7YCC.js} +2 -2
  233. package/dist/{chunk-VVX5PZFS.js → chunk-ZHXSOMYH.js} +2 -2
  234. package/dist/{chunk-GCBIXUPT.js → chunk-ZMWSYUUL.js} +2 -2
  235. package/dist/{chunk-X2QPKLPL.js → chunk-ZZUVBZL2.js} +2 -2
  236. package/dist/{cli-1mzd5TM4.d.ts → cli-DGq0MNpO.d.ts} +5 -5
  237. package/dist/cli-fallback.d.ts +4 -2
  238. package/dist/cli-fallback.js +3 -1
  239. package/dist/cli.d.ts +16 -14
  240. package/dist/cli.js +139 -134
  241. package/dist/coding/export-okf-codegraph.d.ts +2 -1
  242. package/dist/coding/export-okf-codegraph.js +26 -25
  243. package/dist/coding/export-okf-codegraph.js.map +1 -1
  244. package/dist/coding/pre-action-gate.d.ts +2 -1
  245. package/dist/coding/pre-action-gate.js +2 -2
  246. package/dist/compat/codex-cli-fallback.d.ts +1 -1
  247. package/dist/compat/codex-cli-fallback.js +3 -1
  248. package/dist/compat/codex-cli-fallback.js.map +1 -1
  249. package/dist/compounding/engine.d.ts +3 -2
  250. package/dist/compounding/engine.js +27 -26
  251. package/dist/compounding/preference-consolidator.d.ts +2 -1
  252. package/dist/compression-optimizer.d.ts +2 -1
  253. package/dist/config.d.ts +2 -1
  254. package/dist/config.js +18 -15
  255. package/dist/connectors/codex-materialize-runner.d.ts +2 -1
  256. package/dist/connectors/codex-materialize-runner.js +26 -25
  257. package/dist/connectors/codex-materialize.d.ts +2 -1
  258. package/dist/connectors/index.d.ts +2 -1
  259. package/dist/connectors/index.js +29 -28
  260. package/dist/consolidation-provenance-check.d.ts +3 -2
  261. package/dist/consolidation-undo.d.ts +3 -2
  262. package/dist/contradiction/index.d.ts +5 -3
  263. package/dist/contradiction/index.js +7 -7
  264. package/dist/{contradiction-scan-GVD4JJ7B.js → contradiction-scan-BSGKZHYJ.js} +4 -4
  265. package/dist/contradiction-scan-BSGKZHYJ.js.map +1 -0
  266. package/dist/converge-config.d.ts +2 -1
  267. package/dist/convergence-refresh.d.ts +3 -2
  268. package/dist/convergence-refresh.js +29 -28
  269. package/dist/conversation-index/backend.d.ts +2 -1
  270. package/dist/conversation-index/chunker.d.ts +2 -1
  271. package/dist/conversation-index/faiss-adapter.d.ts +2 -1
  272. package/dist/conversation-index/indexer.d.ts +2 -1
  273. package/dist/conversation-index/search.d.ts +2 -1
  274. package/dist/corpus-watermark.d.ts +2 -1
  275. package/dist/corpus-watermark.js +29 -28
  276. package/dist/cross-lingual-recall.d.ts +2 -1
  277. package/dist/day-summary.d.ts +2 -1
  278. package/dist/deep-recall-http-glue.d.ts +14 -12
  279. package/dist/deep-recall-http-glue.js +4 -14
  280. package/dist/deep-recall-mcp-tools.d.ts +14 -12
  281. package/dist/deep-recall-policy-llm.d.ts +3 -1
  282. package/dist/deep-recall-policy-llm.js +5 -3
  283. package/dist/deep-recall-seeds.d.ts +2 -1
  284. package/dist/delinearize.d.ts +2 -1
  285. package/dist/dependency-propagation-config.d.ts +2 -1
  286. package/dist/{dependency-propagation-delivery-Bua2ApHV.d.ts → dependency-propagation-delivery-Cq1ekOwV.d.ts} +1 -1
  287. package/dist/direct-answer-wiring.d.ts +2 -1
  288. package/dist/direct-answer.d.ts +2 -1
  289. package/dist/embedding-fallback.d.ts +2 -1
  290. package/dist/enrichment/index.d.ts +2 -1
  291. package/dist/entity-origin-fields.d.ts +2 -1
  292. package/dist/entity-retrieval.d.ts +3 -2
  293. package/dist/entity-retrieval.js +28 -27
  294. package/dist/entity-schema.d.ts +2 -1
  295. package/dist/episodic-context.d.ts +2 -1
  296. package/dist/eval-trajectory-contracts.d.ts +2 -1
  297. package/dist/eval-trajectory-store.d.ts +2 -1
  298. package/dist/eval-trajectory.d.ts +2 -1
  299. package/dist/event-order-recall.js +3 -3
  300. package/dist/explicit-capture.d.ts +12 -10
  301. package/dist/explicit-capture.js +6 -6
  302. package/dist/external-wiki-access.d.ts +14 -12
  303. package/dist/external-wiki-access.js +87 -84
  304. package/dist/external-wiki-collection-registration.d.ts +2 -1
  305. package/dist/external-wiki-collection.d.ts +2 -1
  306. package/dist/external-wiki-mcp-tools.d.ts +14 -12
  307. package/dist/extraction-error-classification.d.ts +2 -1
  308. package/dist/extraction-faithfulness.d.ts +3 -1
  309. package/dist/extraction-faithfulness.js +5 -3
  310. package/dist/extraction-judge-telemetry.d.ts +3 -1
  311. package/dist/extraction-judge-training.d.ts +3 -1
  312. package/dist/extraction-judge.d.ts +3 -1
  313. package/dist/extraction-judge.js +5 -3
  314. package/dist/extraction-liveness.d.ts +2 -1
  315. package/dist/extraction-normalization.d.ts +2 -1
  316. package/dist/extraction-prompt.d.ts +2 -1
  317. package/dist/extraction-source-grounding-rules.d.ts +2 -1
  318. package/dist/extraction-source-grounding.d.ts +2 -1
  319. package/dist/extraction-source-grounding.js +3 -3
  320. package/dist/extraction-span-config.d.ts +2 -1
  321. package/dist/extraction-span-materialize.d.ts +2 -1
  322. package/dist/extraction-span-materialize.js +2 -2
  323. package/dist/extraction.d.ts +2 -1
  324. package/dist/extraction.js +46 -45
  325. package/dist/fallback-llm-codex-subscription.d.ts +79 -0
  326. package/dist/fallback-llm-codex-subscription.js +22 -0
  327. package/dist/fallback-llm-codex-subscription.js.map +1 -0
  328. package/dist/fallback-llm.d.ts +5 -1
  329. package/dist/fallback-llm.js +4 -2
  330. package/dist/{first-start-migration-GZ45G5FS.js → first-start-migration-ZWMV5CX4.js} +6 -6
  331. package/dist/{generic-recall-paths-DJBADojG.d.ts → generic-recall-paths-BcySh_f9.d.ts} +1 -1
  332. package/dist/graph-append-error.d.ts +2 -1
  333. package/dist/graph-dashboard-diff.d.ts +2 -1
  334. package/dist/graph-dashboard-key.d.ts +2 -1
  335. package/dist/graph-dashboard-parser.d.ts +2 -1
  336. package/dist/{graph-edge-decay-ROSUPDX3.js → graph-edge-decay-MKIRZ762.js} +5 -5
  337. package/dist/graph-edge-decay-MKIRZ762.js.map +1 -0
  338. package/dist/graph-edge-reinforcement.d.ts +2 -1
  339. package/dist/graph-jsonl.d.ts +2 -1
  340. package/dist/graph-jsonl.js +3 -3
  341. package/dist/graph-path-reconstruction.d.ts +2 -1
  342. package/dist/graph-path-scoring.d.ts +2 -1
  343. package/dist/graph-snapshot.d.ts +2 -1
  344. package/dist/graph-snapshot.js +3 -3
  345. package/dist/graph.d.ts +2 -1
  346. package/dist/graph.js +2 -2
  347. package/dist/harmonic-retrieval.js +3 -3
  348. package/dist/importance.d.ts +2 -1
  349. package/dist/importers/index.d.ts +2 -1
  350. package/dist/importers/test-utils.d.ts +2 -1
  351. package/dist/in-flight-reads.d.ts +2 -1
  352. package/dist/{index-Bsy8ygLL.d.ts → index-DWOb4wz9.d.ts} +2 -2
  353. package/dist/index.d.ts +713 -705
  354. package/dist/index.js +419 -346
  355. package/dist/intent.d.ts +2 -1
  356. package/dist/lcm/engine.d.ts +2 -1
  357. package/dist/lcm/engine.js +4 -4
  358. package/dist/lcm/index.d.ts +2 -1
  359. package/dist/lcm/index.js +12 -12
  360. package/dist/lcm/tools.d.ts +2 -1
  361. package/dist/lifecycle.d.ts +2 -1
  362. package/dist/live-connectors-runner.d.ts +2 -1
  363. package/dist/local-llm-config.d.ts +7 -1
  364. package/dist/local-llm-config.js +12 -0
  365. package/dist/local-llm.d.ts +2 -1
  366. package/dist/local-model-endpoint.d.ts +2 -1
  367. package/dist/location/index.d.ts +4 -3
  368. package/dist/location/index.js +60 -59
  369. package/dist/maintenance/memory-governance.d.ts +2 -1
  370. package/dist/maintenance/memory-governance.js +26 -25
  371. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +3 -2
  372. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +27 -26
  373. package/dist/maintenance/rebuild-memory-projection.d.ts +3 -2
  374. package/dist/maintenance/rebuild-memory-projection.js +28 -27
  375. package/dist/{maintenance-DItyBwTC.d.ts → maintenance-CW9wCzMP.d.ts} +3 -3
  376. package/dist/mcp-memory-inspector-app.d.ts +14 -12
  377. package/dist/memory-action-policy.d.ts +2 -1
  378. package/dist/memory-cache.d.ts +2 -1
  379. package/dist/memory-controller.d.ts +2 -1
  380. package/dist/memory-lifecycle-ledger-utils.d.ts +2 -1
  381. package/dist/memory-projection-store.d.ts +2 -1
  382. package/dist/memory-provenance.d.ts +2 -1
  383. package/dist/memory-snapshot.d.ts +2 -1
  384. package/dist/memory-subject-cli.d.ts +14 -12
  385. package/dist/memory-subject.d.ts +14 -12
  386. package/dist/memory-worth-outcomes.d.ts +3 -2
  387. package/dist/models-json.d.ts +2 -1
  388. package/dist/namespaces/migrate.d.ts +4 -3
  389. package/dist/namespaces/migrate.js +27 -26
  390. package/dist/namespaces/principal.d.ts +2 -1
  391. package/dist/namespaces/search.d.ts +2 -1
  392. package/dist/namespaces/search.js +6 -6
  393. package/dist/namespaces/storage.d.ts +4 -3
  394. package/dist/namespaces/storage.js +26 -25
  395. package/dist/native-knowledge.d.ts +2 -1
  396. package/dist/offline-sync-impression-drain.d.ts +2 -1
  397. package/dist/offline-sync-impression-drain.js +4 -4
  398. package/dist/operator-doctor-corpus.d.ts +2 -1
  399. package/dist/operator-doctor-corpus.js +30 -29
  400. package/dist/operator-doctor-replica.d.ts +2 -1
  401. package/dist/operator-toolkit.d.ts +4 -3
  402. package/dist/operator-toolkit.js +53 -49
  403. package/dist/orchestration/compression-guideline-coordinator.d.ts +3 -2
  404. package/dist/orchestration/maintenance.d.ts +5 -4
  405. package/dist/orchestration/maintenance.js +39 -38
  406. package/dist/{orchestrator-DBUX-aAM.d.ts → orchestrator-ComHLm49.d.ts} +22 -11
  407. package/dist/orchestrator.d.ts +12 -10
  408. package/dist/orchestrator.js +224 -218
  409. package/dist/patterns-cli.d.ts +2 -1
  410. package/dist/{pipeline-BqgcOk1Z.d.ts → pipeline-CiYcqqhl.d.ts} +1 -1
  411. package/dist/policy-runtime.d.ts +2 -1
  412. package/dist/proactive-contention.d.ts +2 -1
  413. package/dist/provenance.d.ts +2 -1
  414. package/dist/provenance.js +2 -2
  415. package/dist/{public-http-CqtZ5kv3.d.ts → public-http-CuK4_Cb1.d.ts} +1 -1
  416. package/dist/qmd-preflight.d.ts +3 -2
  417. package/dist/{qmd-BD0ikV_Y.d.ts → qmd-qXD4vatU.d.ts} +1 -1
  418. package/dist/qmd-recall-cache.d.ts +2 -1
  419. package/dist/qmd.d.ts +3 -2
  420. package/dist/recall-concurrency-config.d.ts +2 -1
  421. package/dist/recall-disclosure-escalation.d.ts +2 -1
  422. package/dist/recall-explain-renderer.d.ts +2 -1
  423. package/dist/recall-explain-renderer.js +3 -3
  424. package/dist/recall-memory-map.d.ts +2 -1
  425. package/dist/recall-navigate-access.d.ts +2 -1
  426. package/dist/recall-navigate-access.js +2 -2
  427. package/dist/recall-navigate-disclosure.d.ts +2 -1
  428. package/dist/recall-navigate-disclosure.js +1 -1
  429. package/dist/recall-navigate.d.ts +2 -1
  430. package/dist/recall-navigate.js +2 -2
  431. package/dist/recall-planner-llm.d.ts +3 -1
  432. package/dist/recall-planner-llm.js +4 -2
  433. package/dist/recall-planner-llm.js.map +1 -1
  434. package/dist/recall-state-view-admission.d.ts +3 -2
  435. package/dist/recall-state-view-admission.js +9 -9
  436. package/dist/recall-state-view-anchors.d.ts +85 -0
  437. package/dist/recall-state-view-anchors.js +21 -0
  438. package/dist/recall-state-view-anchors.js.map +1 -0
  439. package/dist/recall-state-view-inject.js +2 -2
  440. package/dist/recall-state-view-render.js +2 -2
  441. package/dist/recall-state-view-widen.js +2 -2
  442. package/dist/recall-state-view-wire.js +3 -3
  443. package/dist/recall-state-view.d.ts +37 -1
  444. package/dist/recall-state-view.js +11 -3
  445. package/dist/recall-state.d.ts +2 -1
  446. package/dist/recall-tag-filter.d.ts +2 -1
  447. package/dist/recall-timings.d.ts +2 -1
  448. package/dist/recall-xray-cli.d.ts +2 -1
  449. package/dist/recall-xray-cli.js +4 -4
  450. package/dist/recall-xray-renderer.d.ts +2 -1
  451. package/dist/recall-xray-renderer.js +3 -3
  452. package/dist/recall-xray.d.ts +2 -1
  453. package/dist/recall-xray.js +2 -2
  454. package/dist/reconcile/cursor.d.ts +2 -1
  455. package/dist/reconcile/cursor.js +2 -2
  456. package/dist/reconcile/manifest.d.ts +2 -1
  457. package/dist/reconcile/manifest.js +4 -4
  458. package/dist/reconcile/plan.d.ts +2 -1
  459. package/dist/reconcile/plan.js +2 -2
  460. package/dist/replay/normalizers/chatgpt.d.ts +2 -1
  461. package/dist/replay/normalizers/claude.d.ts +2 -1
  462. package/dist/replay/normalizers/openclaw.d.ts +2 -1
  463. package/dist/replay/normalizers/shared.d.ts +2 -1
  464. package/dist/replay/runner.d.ts +2 -1
  465. package/dist/replay/types.d.ts +2 -1
  466. package/dist/replica-divergence.d.ts +2 -1
  467. package/dist/replica-peers-config.d.ts +2 -1
  468. package/dist/{resolution-OHJZG45O.js → resolution-4GG3QZRJ.js} +8 -8
  469. package/dist/resolution-4GG3QZRJ.js.map +1 -0
  470. package/dist/resolve-auth-token.d.ts +2 -1
  471. package/dist/resume-bundles.js +19 -16
  472. package/dist/retrieval-agents.d.ts +3 -2
  473. package/dist/retrieval-tiers.d.ts +2 -1
  474. package/dist/routing/engine.d.ts +2 -1
  475. package/dist/routing/store.d.ts +2 -1
  476. package/dist/salvage-envelope.d.ts +2 -1
  477. package/dist/salvage-envelope.js +2 -2
  478. package/dist/schemas.d.ts +160 -160
  479. package/dist/{scope-profiles-BIJMsd0B.d.ts → scope-profiles-BT9rqC3w.d.ts} +1 -1
  480. package/dist/search/embed-helper.d.ts +2 -1
  481. package/dist/search/factory.d.ts +2 -1
  482. package/dist/search/factory.js +5 -5
  483. package/dist/search/index.d.ts +2 -1
  484. package/dist/search/index.js +13 -13
  485. package/dist/search/lancedb-backend.d.ts +2 -1
  486. package/dist/search/meilisearch-backend.d.ts +2 -1
  487. package/dist/search/noop-backend.d.ts +2 -1
  488. package/dist/search/orama-backend.d.ts +2 -1
  489. package/dist/search/port.d.ts +2 -1
  490. package/dist/search/remote-backend.d.ts +2 -1
  491. package/dist/{semantic-consolidation-D7sJocll.d.ts → semantic-consolidation-CmZi7thY.d.ts} +1 -1
  492. package/dist/semantic-consolidation.d.ts +3 -2
  493. package/dist/semantic-consolidation.js +27 -26
  494. package/dist/semantic-rule-promotion.js +26 -25
  495. package/dist/semantic-rule-verifier.d.ts +2 -1
  496. package/dist/semantic-rule-verifier.js +26 -25
  497. package/dist/{service-fwgEngUj.d.ts → service-CLkA7AQB.d.ts} +2 -2
  498. package/dist/session-observer-bands.d.ts +2 -1
  499. package/dist/session-observer-state.d.ts +2 -1
  500. package/dist/shared-context/manager.d.ts +8 -7
  501. package/dist/signal.d.ts +2 -1
  502. package/dist/source-agent-qualifier.d.ts +2 -1
  503. package/dist/source-agent-qualifier.js +41 -40
  504. package/dist/standup/build.js +27 -26
  505. package/dist/{storage-Cbll3-Tk.d.ts → storage-wvX01lht.d.ts} +1 -1
  506. package/dist/storage.d.ts +3 -2
  507. package/dist/storage.js +25 -24
  508. package/dist/subject-config.d.ts +2 -1
  509. package/dist/subject-config.js +2 -2
  510. package/dist/summarizer.d.ts +2 -1
  511. package/dist/summarizer.js +6 -3
  512. package/dist/summary-snapshot.d.ts +2 -1
  513. package/dist/support-passport/index.d.ts +17 -15
  514. package/dist/support-passport/index.js +92 -89
  515. package/dist/temporal-supersession.d.ts +3 -2
  516. package/dist/temporal-timeline-recall.d.ts +2 -1
  517. package/dist/temporal-validity.d.ts +2 -1
  518. package/dist/threading.d.ts +2 -1
  519. package/dist/tier-migration.d.ts +3 -2
  520. package/dist/tier-routing.d.ts +2 -1
  521. package/dist/tier-routing.js +3 -3
  522. package/dist/{tier-stats-VK5PCO2L.js → tier-stats-LUSUUNU6.js} +4 -4
  523. package/dist/topics.d.ts +2 -1
  524. package/dist/transcript.d.ts +2 -1
  525. package/dist/transfer/backup.js +2 -2
  526. package/dist/transfer/capsule-export.js +2 -2
  527. package/dist/transfer/capsule-import.js +3 -3
  528. package/dist/transfer/export-okf.d.ts +2 -1
  529. package/dist/transfer/export-okf.js +26 -25
  530. package/dist/transfer/types.d.ts +78 -78
  531. package/dist/trust-score-stage.d.ts +2 -1
  532. package/dist/trust-score.d.ts +2 -1
  533. package/dist/{types-48sPkWB0.d.ts → types-Cyr32ABj.d.ts} +3 -1
  534. package/dist/types.d.ts +2 -1
  535. package/dist/types.js +1 -1
  536. package/dist/utility-runtime.d.ts +2 -1
  537. package/dist/verified-recall.js +26 -25
  538. package/dist/who-knows-cli.d.ts +14 -12
  539. package/dist/who-knows-cli.js +27 -26
  540. package/dist/who-knows.d.ts +14 -12
  541. package/dist/who-knows.js +26 -25
  542. package/dist/write-envelope.d.ts +7 -1
  543. package/dist/write-envelope.js +1 -1
  544. package/package.json +2 -2
  545. package/src/access-boundary.ts +21 -6
  546. package/src/access-category-alias.test.ts +488 -51
  547. package/src/access-http.test.ts +249 -0
  548. package/src/access-http.ts +2 -0
  549. package/src/access-mcp.test.ts +2 -2
  550. package/src/access-observe-write-category.ts +25 -0
  551. package/src/access-observe-write-surface.ts +58 -57
  552. package/src/access-operations-batch.ts +28 -2
  553. package/src/access-operations.ts +6 -4
  554. package/src/access-schema.ts +106 -50
  555. package/src/access-service.ts +23 -9
  556. package/src/background-generation-config.ts +79 -0
  557. package/src/background-generation.test.ts +123 -0
  558. package/src/background-generation.ts +52 -0
  559. package/src/cli-fallback.ts +8 -2
  560. package/src/config.test.ts +172 -0
  561. package/src/config.ts +2 -43
  562. package/src/fallback-llm-codex-subscription.ts +168 -0
  563. package/src/fallback-llm.test.ts +46 -0
  564. package/src/fallback-llm.ts +60 -48
  565. package/src/index.ts +2 -16
  566. package/src/local-llm-config.ts +84 -0
  567. package/src/orchestration/recall-internal.ts +91 -74
  568. package/src/orchestration/recall-rerank-coordinator.ts +41 -4
  569. package/src/orchestration/recall-search-pipeline.ts +25 -18
  570. package/src/orchestration/recall-state-view-pipeline.test.ts +89 -0
  571. package/src/providers/codex-subscription.test.ts +804 -1
  572. package/src/providers/codex-subscription.ts +407 -65
  573. package/src/recall-rerank-coordinator.test.ts +153 -0
  574. package/src/recall-state-view-anchors.ts +163 -0
  575. package/src/recall-state-view-widen.ts +21 -7
  576. package/src/recall-state-view-zero-diff.test.ts +30 -0
  577. package/src/recall-state-view.test.ts +161 -0
  578. package/src/recall-state-view.ts +206 -35
  579. package/src/summarizer.ts +25 -0
  580. package/src/trust-score-recall-paths.test.ts +1 -1
  581. package/src/types.ts +3 -2
  582. package/src/write-envelope.ts +5 -0
  583. package/dist/chunk-255PC37A.js +0 -120
  584. package/dist/chunk-255PC37A.js.map +0 -1
  585. package/dist/chunk-3IXB77DA.js.map +0 -1
  586. package/dist/chunk-65RENJGB.js.map +0 -1
  587. package/dist/chunk-7MJBKZPU.js.map +0 -1
  588. package/dist/chunk-D2DIYEFW.js.map +0 -1
  589. package/dist/chunk-DOKKRZPH.js.map +0 -1
  590. package/dist/chunk-JLXWRQNR.js.map +0 -1
  591. package/dist/chunk-JR6PP7UM.js.map +0 -1
  592. package/dist/chunk-LSLCFCCQ.js.map +0 -1
  593. package/dist/chunk-OTPXEE6W.js.map +0 -1
  594. package/dist/chunk-RN3MVLW3.js.map +0 -1
  595. package/dist/chunk-SROIT6QY.js.map +0 -1
  596. package/dist/chunk-VELCIWJZ.js.map +0 -1
  597. package/dist/chunk-YEN4TREG.js.map +0 -1
  598. /package/dist/{capsule-crypto-YO5QJ6L3.js.map → access-observe-write-category.js.map} +0 -0
  599. /package/dist/{contradiction-scan-GVD4JJ7B.js.map → background-generation-config.js.map} +0 -0
  600. /package/dist/{graph-edge-decay-ROSUPDX3.js.map → background-generation.js.map} +0 -0
  601. /package/dist/{resolution-OHJZG45O.js.map → capsule-crypto-7FJQINUR.js.map} +0 -0
  602. /package/dist/{capsule-merge-ZCXUPLNJ.js.map → capsule-merge-IPG4IOFP.js.map} +0 -0
  603. /package/dist/{chunk-YHU5XUF4.js.map → chunk-27MKMTBY.js.map} +0 -0
  604. /package/dist/{chunk-TK4FHQRN.js.map → chunk-2J3V5QEO.js.map} +0 -0
  605. /package/dist/{chunk-BXLOS5AJ.js.map → chunk-2NLLXCJG.js.map} +0 -0
  606. /package/dist/{chunk-TFRDUD3M.js.map → chunk-2ZTDRNCS.js.map} +0 -0
  607. /package/dist/{chunk-PWPIERBM.js.map → chunk-37CAEC7E.js.map} +0 -0
  608. /package/dist/{chunk-X7BCM2NA.js.map → chunk-3EKVN2OP.js.map} +0 -0
  609. /package/dist/{chunk-S2ULTQZR.js.map → chunk-3N3PBBEH.js.map} +0 -0
  610. /package/dist/{chunk-XCF3SFHD.js.map → chunk-3NPNBVFR.js.map} +0 -0
  611. /package/dist/{chunk-JO5TQAKW.js.map → chunk-4BCHFSC7.js.map} +0 -0
  612. /package/dist/{chunk-Q6D7EUSQ.js.map → chunk-4JVQRFZD.js.map} +0 -0
  613. /package/dist/{chunk-YEDVOYL2.js.map → chunk-4RX5O34R.js.map} +0 -0
  614. /package/dist/{chunk-JMPYZJQN.js.map → chunk-4RZLTZVM.js.map} +0 -0
  615. /package/dist/{chunk-Q7JK6YEB.js.map → chunk-54NX5EG4.js.map} +0 -0
  616. /package/dist/{chunk-GWK7FEUL.js.map → chunk-5FAGCOZD.js.map} +0 -0
  617. /package/dist/{chunk-2PUE5P7C.js.map → chunk-5N4MZLEH.js.map} +0 -0
  618. /package/dist/{chunk-B2YKTE7P.js.map → chunk-5SPCMAUC.js.map} +0 -0
  619. /package/dist/{chunk-3OHISDDW.js.map → chunk-5U7K4W6K.js.map} +0 -0
  620. /package/dist/{chunk-CYEMS2PG.js.map → chunk-5YCNDC3C.js.map} +0 -0
  621. /package/dist/{chunk-PAAJWQH5.js.map → chunk-62D2PAAM.js.map} +0 -0
  622. /package/dist/{chunk-52II7PB6.js.map → chunk-645WOU5I.js.map} +0 -0
  623. /package/dist/{chunk-326KUXIR.js.map → chunk-6EHM2AV7.js.map} +0 -0
  624. /package/dist/{chunk-YM7YN37H.js.map → chunk-6ET2VII7.js.map} +0 -0
  625. /package/dist/{chunk-A2YQL2FF.js.map → chunk-6P4REYKL.js.map} +0 -0
  626. /package/dist/{chunk-7RKBPXY6.js.map → chunk-6YAIN5XJ.js.map} +0 -0
  627. /package/dist/{chunk-2L5FSNPC.js.map → chunk-A7GQBJP5.js.map} +0 -0
  628. /package/dist/{chunk-UYVXIY6C.js.map → chunk-AAZEKXUP.js.map} +0 -0
  629. /package/dist/{chunk-IQZ6ISFX.js.map → chunk-AECJY3GJ.js.map} +0 -0
  630. /package/dist/{chunk-76DRU7C4.js.map → chunk-AENM6GKU.js.map} +0 -0
  631. /package/dist/{chunk-KTRXQQFN.js.map → chunk-B36GUU6T.js.map} +0 -0
  632. /package/dist/{chunk-TLHNF6GA.js.map → chunk-BV4ZKIZH.js.map} +0 -0
  633. /package/dist/{chunk-ZWEZXVYH.js.map → chunk-CEO4DONG.js.map} +0 -0
  634. /package/dist/{chunk-ZEPVWLCN.js.map → chunk-CZTPU65V.js.map} +0 -0
  635. /package/dist/{chunk-TRU6JBOI.js.map → chunk-D545Z7UH.js.map} +0 -0
  636. /package/dist/{chunk-6E5GYDIE.js.map → chunk-DGS34QSY.js.map} +0 -0
  637. /package/dist/{chunk-6Z3WW2MW.js.map → chunk-ENBPQEVU.js.map} +0 -0
  638. /package/dist/{chunk-PNEDMJ53.js.map → chunk-F4EHXVP7.js.map} +0 -0
  639. /package/dist/{chunk-JPKZTCWZ.js.map → chunk-FNHLI2RE.js.map} +0 -0
  640. /package/dist/{chunk-M3MYMWXG.js.map → chunk-FXHOZGSE.js.map} +0 -0
  641. /package/dist/{chunk-SAKA6PPL.js.map → chunk-GAS7KYC7.js.map} +0 -0
  642. /package/dist/{chunk-2AR5JFD7.js.map → chunk-GG5FHZJJ.js.map} +0 -0
  643. /package/dist/{chunk-WS3WNLST.js.map → chunk-GI4ZBWPQ.js.map} +0 -0
  644. /package/dist/{chunk-JYR4LH76.js.map → chunk-GMIQV6DD.js.map} +0 -0
  645. /package/dist/{chunk-WIKO4SCR.js.map → chunk-H3TKENU4.js.map} +0 -0
  646. /package/dist/{chunk-ZLN7AROH.js.map → chunk-HIP6DKJJ.js.map} +0 -0
  647. /package/dist/{chunk-SF6RFI5Z.js.map → chunk-HWLIMQE2.js.map} +0 -0
  648. /package/dist/{chunk-JZYECQWN.js.map → chunk-IL6ODG6M.js.map} +0 -0
  649. /package/dist/{chunk-GNR6YEWZ.js.map → chunk-IQEJIOEU.js.map} +0 -0
  650. /package/dist/{chunk-BICNRVEC.js.map → chunk-IWO6QXWJ.js.map} +0 -0
  651. /package/dist/{chunk-42DJ235G.js.map → chunk-J272ODKJ.js.map} +0 -0
  652. /package/dist/{chunk-R3TLVTWW.js.map → chunk-JDX2OA4R.js.map} +0 -0
  653. /package/dist/{chunk-G5MO3VQA.js.map → chunk-JKKII6GX.js.map} +0 -0
  654. /package/dist/{chunk-L5OXE4PX.js.map → chunk-JTQR6L2N.js.map} +0 -0
  655. /package/dist/{chunk-VDX2J7OX.js.map → chunk-KQAFEZQX.js.map} +0 -0
  656. /package/dist/{chunk-AKE4GGQ3.js.map → chunk-KQW3YGEN.js.map} +0 -0
  657. /package/dist/{chunk-LMMQKZK3.js.map → chunk-L63GFNKL.js.map} +0 -0
  658. /package/dist/{chunk-BRZWWUCJ.js.map → chunk-LMLGBG6H.js.map} +0 -0
  659. /package/dist/{chunk-CQ7SSBO4.js.map → chunk-M6HBPLBA.js.map} +0 -0
  660. /package/dist/{chunk-3YMDY3ZF.js.map → chunk-MUTVRKKY.js.map} +0 -0
  661. /package/dist/{chunk-FCFAYMTU.js.map → chunk-NXGSONWM.js.map} +0 -0
  662. /package/dist/{chunk-4WGAMREC.js.map → chunk-O4M4BDIJ.js.map} +0 -0
  663. /package/dist/{chunk-5SYI2F47.js.map → chunk-O76F5QPP.js.map} +0 -0
  664. /package/dist/{chunk-57GDHV2D.js.map → chunk-PCOVEDPK.js.map} +0 -0
  665. /package/dist/{chunk-PPTOAHTZ.js.map → chunk-PGAB2V53.js.map} +0 -0
  666. /package/dist/{chunk-HHDTBYDJ.js.map → chunk-Q432REND.js.map} +0 -0
  667. /package/dist/{chunk-XAITGGX5.js.map → chunk-Q4AUIFUA.js.map} +0 -0
  668. /package/dist/{chunk-5LLQAUMI.js.map → chunk-Q7CLGFA7.js.map} +0 -0
  669. /package/dist/{chunk-KUK56OPR.js.map → chunk-QHT7MOUF.js.map} +0 -0
  670. /package/dist/{chunk-W6IJMWTZ.js.map → chunk-QTQ6XKGT.js.map} +0 -0
  671. /package/dist/{chunk-FLLORID2.js.map → chunk-RLJHJQUY.js.map} +0 -0
  672. /package/dist/{chunk-353KGBKY.js.map → chunk-RW4QNB4J.js.map} +0 -0
  673. /package/dist/{chunk-GWQVMKUJ.js.map → chunk-SCXURCVT.js.map} +0 -0
  674. /package/dist/{chunk-FQXJAC3T.js.map → chunk-SGUDMW2K.js.map} +0 -0
  675. /package/dist/{chunk-LSDEIZ76.js.map → chunk-TA4C3XB7.js.map} +0 -0
  676. /package/dist/{chunk-YIZ2EUUL.js.map → chunk-TNZNSMVJ.js.map} +0 -0
  677. /package/dist/{chunk-CIYUWSMZ.js.map → chunk-TRLOFIQC.js.map} +0 -0
  678. /package/dist/{chunk-TL7NLM2L.js.map → chunk-TSP5WH72.js.map} +0 -0
  679. /package/dist/{chunk-3K6UFW5B.js.map → chunk-UHRZ324M.js.map} +0 -0
  680. /package/dist/{chunk-A5UQ52YQ.js.map → chunk-UZZ7SQT3.js.map} +0 -0
  681. /package/dist/{chunk-GHX5PNXW.js.map → chunk-VBSNUH4J.js.map} +0 -0
  682. /package/dist/{chunk-MR6LQVZ5.js.map → chunk-VJIE4D2I.js.map} +0 -0
  683. /package/dist/{chunk-2JGGZICG.js.map → chunk-WBM2MVBK.js.map} +0 -0
  684. /package/dist/{chunk-CD3C4BJN.js.map → chunk-WIWLX65T.js.map} +0 -0
  685. /package/dist/{chunk-GDDSXVWR.js.map → chunk-X4TD4O2F.js.map} +0 -0
  686. /package/dist/{chunk-DQEMWVMT.js.map → chunk-X7Y7WX73.js.map} +0 -0
  687. /package/dist/{chunk-FPQDZCUX.js.map → chunk-XH3HGI2N.js.map} +0 -0
  688. /package/dist/{chunk-C6KRO3SU.js.map → chunk-XVDZFTN5.js.map} +0 -0
  689. /package/dist/{chunk-3SL52JKD.js.map → chunk-XVZA6VXC.js.map} +0 -0
  690. /package/dist/{chunk-BLHX5FQW.js.map → chunk-YUW66UAH.js.map} +0 -0
  691. /package/dist/{chunk-DOQLHCSS.js.map → chunk-ZBW7A667.js.map} +0 -0
  692. /package/dist/{chunk-4DPDIOVA.js.map → chunk-ZEGL7YCC.js.map} +0 -0
  693. /package/dist/{chunk-VVX5PZFS.js.map → chunk-ZHXSOMYH.js.map} +0 -0
  694. /package/dist/{chunk-GCBIXUPT.js.map → chunk-ZMWSYUUL.js.map} +0 -0
  695. /package/dist/{chunk-X2QPKLPL.js.map → chunk-ZZUVBZL2.js.map} +0 -0
  696. /package/dist/{first-start-migration-GZ45G5FS.js.map → first-start-migration-ZWMV5CX4.js.map} +0 -0
  697. /package/dist/{tier-stats-VK5PCO2L.js.map → tier-stats-LUSUUNU6.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/config.ts","../src/procedural/maintenance-config.ts","../src/preferences/drift-config.ts","../src/dedup/connector-scope.ts","../src/dedup/novelty-gate.ts","../src/dedup/merge-min-score.ts","../src/dedup/merge-on-write.ts","../src/dedup/merge-content.ts","../src/dedup/merge.ts","../src/wearables/config.ts","../src/meetings/detect.ts","../src/meetings/config.ts","../src/location/parse-companions.ts","../src/okf/config.ts","../src/coding/action-gate.ts","../src/chat/chat-config.ts","../src/namespaces/scope-profile-config.ts"],"sourcesContent":["import path from \"node:path\";\nimport type {\n CodexCompactionFlushMode,\n CodingModeConfig,\n CodexCompatConfig,\n DreamingConfig,\n DreamsLightSleepConfig,\n DreamsRemConfig,\n DreamsDeepSleepConfig,\n DreamsPhasesConfig,\n ProceduralConfig,\n HeartbeatConfig,\n IdentityInjectionMode,\n MemoryOsPresetName,\n AgentPersonaModelConfig,\n PluginConfig,\n PrincipalRule,\n RecallPipelineConfig,\n RecallSectionConfig,\n ReasoningEffort,\n SemanticChunkingConfigShape,\n SessionObserverBandConfig,\n SlotBehaviorConfig,\n SlotMismatchMode,\n TriggerMode,\n TrustWeights,\n} from \"./types.js\";\nimport { parseConvergeConfig } from \"./converge-config.js\";\nimport { parseExternalWikiRecallGuard } from \"./external-wiki-guard.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\";\nimport { expandTildePath } from \"./utils/path.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, coerceBooleanLike, coerceInstallExtension, coerceNumber } from \"./connectors/coerce.js\";\nimport { parseSubjectRuntimeConfig } from \"./subject-config.js\";\nimport { parseRecallStateViews } from \"./recall-state-view.js\";\nimport { parseRecallConcurrencyConfig } from \"./recall-concurrency-config.js\";\nimport { parseExtractionFields } from \"./extraction-span-config.js\";\nimport { parseReplicaPeersConfig } from \"./replica-peers-config.js\";\nimport { parseDependencyPropagationConfig } from \"./dependency-propagation-config.js\";\nimport { parseProceduralMaintenanceConfig } from \"./procedural/maintenance-config.js\";\nimport { parseActiveContextFields } from \"./active-context-config.js\";\nimport { parseSkillProjectionConfig } from \"./procedural/skill-projection.js\";\nimport { parseDriftDetectionConfig } from \"./preferences/drift-config.js\";\nimport { parseDeepRecallConfig } from \"./deep-recall-config.js\";\nimport { parseContradictionLocalizationConfig, parseContradictionScanConfig } from \"./contradiction-config.js\";\nimport { parseGraphPathScoringConfig } from \"./graph-path-scoring-config.js\";\nimport { parseWritePathDedupConfig } from \"./dedup/novelty-gate.js\";\nimport { parseSemanticMergeConfig } from \"./dedup/merge.js\";\nimport { hasLegacyConnectorEntries } from \"./connectors/paths.js\";\nimport {\n parseQmdChunkStrategy,\n parseQmdDaemonTimeoutMs,\n parseQmdGpuBackend,\n parseQmdSearchStrategy,\n parseQmdSubprocessStrategy,\n parseQmdSupportedVersion,\n} from \"./config-qmd.js\";\nimport { parseSecurityConfig } from \"./config-security.js\";\nimport {\n resolveEmitLegacyTools,\n resolveNamespaceCatalogEnabled,\n} from \"./emit-legacy-tools.js\";\nimport { parseWearablesConfig } from \"./wearables/config.js\";\nimport { parseCaptureCompanionConfigs } from \"./location/parse-companions.js\";\nimport { parseLocationConfig } from \"./location/config.js\";\nimport { parseOkfConfig } from \"./okf/config.js\";\nimport { parseBoundedJsonlStateConfig } from \"./bounded-jsonl-state.js\";\nimport { parseCodingKnowledgeConfig } from \"./coding/coding-knowledge-config.js\";\nimport { parseActionGateConfig } from \"./coding/action-gate.js\";\nimport { parseChatConfig } from \"./chat/chat-config.js\";\nimport { parseSupportPassportConfig } from \"./support-passport/config.js\";\nimport { parseCorrectionIntentConfig, parseFaithfulnessGateConfig } from \"./faithfulness-config.js\";\nimport { parseOfflineSyncExcludes } from \"./offline-sync.js\";\nimport { parseExternalWikiRoots } from \"./external-wiki-config.js\";\nimport {\n parseScopeProfiles,\n parseScopeTeams,\n validateScopeProfileTeamReferences,\n} from \"./namespaces/scope-profile-config.js\";\nconst DEFAULT_MEMORY_DIR = path.join(\n resolveHomeDir(),\n \".openclaw\",\n \"workspace\",\n \"memory\",\n \"local\",\n);\nconst DEFAULT_WORKSPACE_DIR = path.join(\n resolveHomeDir(),\n \".openclaw\",\n \"workspace\",\n);\n\nconst DEFAULT_INIT_GATE_TIMEOUT_MS = 30_000;\n\nconst CLIENT_SECRET_FIELD = [\"client\", \"Secret\"].join(\"\") as \"clientSecret\";\nconst REFRESH_TOKEN_FIELD = [\"refresh\", \"Token\"].join(\"\") as \"refreshToken\";\nconst LEGACY_ACTIVE_RECALL_CUSTOM_FIELD = [\n \"activeRecall\",\n \"Prompt\",\n \"Override\",\n].join(\"\") as \"activeRecallPromptOverride\";\n\nfunction parseBoundedIntegerMs(\n value: unknown,\n fallback: number,\n min: number,\n max: number,\n): number {\n const coerced = coerceNumber(value);\n if (coerced === undefined) return fallback;\n return Math.min(max, Math.max(min, Math.floor(coerced)));\n}\n\n// A gateway model string must be \"provider/model\" — at least one \"/\" with a\n// non-empty provider segment and a non-empty model segment. This mirrors\n// FallbackLlmClient.parseModelString (which requires >= 2 slash-parts), so a\n// model the runtime would silently drop is rejected at config time instead.\nfunction isQualifiedModelString(value: string): boolean {\n const slash = value.indexOf(\"/\");\n return slash > 0 && slash < value.length - 1;\n}\n\nfunction parseModelChainConfig(\n value: unknown,\n keyName: string,\n): AgentPersonaModelConfig | undefined {\n // Absent → not configured (no error).\n if (value === undefined || value === null) return undefined;\n\n // Present but malformed → reject loudly rather than silently dropping it,\n // so a typo'd chain surfaces instead of quietly reverting to defaults\n // (gotcha #51). Issue #1365 / PR #1370.\n if (typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(\n `${keyName} must be an object like { \"primary\": \"provider/model\", \"fallbacks\": [\"provider/model\", ...] }; got ${JSON.stringify(value)}`,\n );\n }\n const raw = value as Record<string, unknown>;\n // Reject unknown keys (matches the manifest's additionalProperties:false) so a\n // misspelled \"fallback\"/\"fallbackModels\" doesn't silently drop the fallback\n // chain (gotcha #51, codex review #1425).\n const unknownKeys = Object.keys(raw).filter((k) => k !== \"primary\" && k !== \"fallbacks\");\n if (unknownKeys.length > 0) {\n throw new Error(\n `${keyName} has unknown propert${unknownKeys.length === 1 ? \"y\" : \"ies\"}: ${unknownKeys.join(\", \")}. Allowed: \"primary\", \"fallbacks\".`,\n );\n }\n if (typeof raw.primary !== \"string\" || raw.primary.trim().length === 0) {\n throw new Error(\n `${keyName}.primary is required and must be a non-empty \"provider/model\" string; got ${JSON.stringify(raw.primary)}`,\n );\n }\n const primary = raw.primary.trim();\n if (!isQualifiedModelString(primary)) {\n throw new Error(\n `${keyName}.primary must be in \"provider/model\" form (e.g. \"zai/glm-4.7-flash\"); got ${JSON.stringify(primary)}`,\n );\n }\n\n let dedupedFallbacks: string[] | undefined;\n if (raw.fallbacks !== undefined) {\n if (!Array.isArray(raw.fallbacks)) {\n throw new Error(\n `${keyName}.fallbacks must be an array of \"provider/model\" strings; got ${JSON.stringify(raw.fallbacks)}`,\n );\n }\n if (raw.fallbacks.some((item) => typeof item !== \"string\")) {\n throw new Error(`${keyName}.fallbacks must contain only strings`);\n }\n const trimmed = raw.fallbacks\n .map((item) => (item as string).trim())\n .filter((item) => item.length > 0 && item !== primary);\n for (const fb of trimmed) {\n if (!isQualifiedModelString(fb)) {\n throw new Error(\n `${keyName}.fallbacks entries must be in \"provider/model\" form; got ${JSON.stringify(fb)}`,\n );\n }\n }\n dedupedFallbacks = [...new Set(trimmed)];\n }\n\n return {\n primary,\n ...(dedupedFallbacks && dedupedFallbacks.length > 0 ? { fallbacks: dedupedFallbacks } : {}),\n };\n}\n\nfunction parsePositiveInteger(value: unknown, keyName: string): number | undefined {\n if (value === undefined || value === null) return undefined;\n const coerced = coerceNumber(value);\n if (\n coerced === undefined ||\n !Number.isFinite(coerced) ||\n !Number.isInteger(coerced) ||\n coerced <= 0\n ) {\n throw new Error(\n `${keyName} must be a positive integer; got ${JSON.stringify(value)}`,\n );\n }\n return coerced;\n}\n\nfunction parseBoundedPositiveInteger(\n value: unknown,\n min: number,\n max: number,\n keyName: string,\n): number | undefined {\n const parsed = parsePositiveInteger(value, keyName);\n if (parsed === undefined) return undefined;\n return Math.max(min, Math.min(max, parsed));\n}\n\n/**\n * Validate a closed-range integer config knob, coercing CLI numeric strings\n * first (issue #1909 review round 8). `undefined`/`null` → `fallback`. Anything\n * provided must coerce to a FINITE INTEGER in `[min, max]`; otherwise THROW\n * (AGENTS.md #1/#39: reject invalid user input, never silently floor/clamp).\n */\nfunction parseIntegerInClosedRange(\n value: unknown,\n min: number,\n max: number,\n fallback: number,\n keyName: string,\n): number {\n // Only an absent key (undefined) falls back to the default; an explicit `null`\n // is invalid input and proceeds to validation → throw (round 9 finding 1).\n if (value === undefined) return fallback;\n const coerced = coerceNumber(value);\n if (\n coerced === undefined ||\n !Number.isFinite(coerced) ||\n !Number.isInteger(coerced) ||\n coerced < min ||\n coerced > max\n ) {\n throw new Error(\n `${keyName} must be an integer in [${min}, ${max}]; got ${JSON.stringify(value)}`,\n );\n }\n return coerced;\n}\n\nfunction parseOptionalNonEmptyString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction parseIntegerAtLeast(\n value: unknown,\n fallback: number,\n min: number,\n keyName: string,\n): number {\n if (value === undefined || value === null) return fallback;\n const coerced = coerceNumber(value);\n if (\n coerced === undefined ||\n !Number.isFinite(coerced) ||\n !Number.isInteger(coerced) ||\n coerced < min\n ) {\n throw new Error(\n `${keyName} must be an integer greater than or equal to ${min}; got ${JSON.stringify(value)}`,\n );\n }\n return coerced;\n}\n\nfunction parseOptionalIntegerAtLeast(\n value: unknown,\n min: number,\n keyName: string,\n): number | undefined {\n if (value === undefined || value === null) return undefined;\n const coerced = coerceNumber(value);\n if (\n coerced === undefined ||\n !Number.isFinite(coerced) ||\n !Number.isInteger(coerced) ||\n coerced < min\n ) {\n throw new Error(\n `${keyName} must be an integer greater than or equal to ${min}; got ${JSON.stringify(value)}`,\n );\n }\n return coerced;\n}\n\nfunction parsePortNumber(\n value: unknown,\n fallback: number,\n keyName: string,\n): number {\n if (value === undefined || value === null) return fallback;\n const coerced = coerceNumber(value);\n if (\n coerced === undefined ||\n !Number.isInteger(coerced) ||\n coerced < 0 ||\n coerced > 65535\n ) {\n throw new Error(\n `${keyName} must be an integer from 0 to 65535; got ${JSON.stringify(value)}`,\n );\n }\n return coerced;\n}\n\nfunction readNestedConfig(\n cfg: Record<string, unknown>,\n blockName: string,\n key: string,\n): unknown {\n const block = validateNestedConfigBlock(cfg, blockName);\n if (!block) return undefined;\n return block[key];\n}\n\nfunction validateNestedConfigBlock(\n cfg: Record<string, unknown>,\n blockName: string,\n): Record<string, unknown> | undefined {\n const block = cfg[blockName];\n if (block === undefined || block === null) return undefined;\n if (typeof block !== \"object\" || Array.isArray(block)) {\n throw new Error(`${blockName} must be a plain object`);\n }\n return block as Record<string, unknown>;\n}\n\nfunction readFlatOrNestedConfig(\n cfg: Record<string, unknown>,\n flatKey: string,\n blockName: string,\n nestedKey: string,\n): unknown {\n return cfg[flatKey] !== undefined\n ? cfg[flatKey]\n : readNestedConfig(cfg, blockName, nestedKey);\n}\n\nfunction resolveBooleanConfig(\n value: unknown,\n defaultValue: boolean,\n keyName: string,\n): boolean {\n if (value === undefined || value === null) return defaultValue;\n const coerced = coerceBool(value);\n if (coerced === undefined) {\n throw new Error(\n `${keyName} must be a boolean-like value (true/false/1/0/yes/no/on/off); got ${JSON.stringify(value)}`,\n );\n }\n return coerced;\n}\n\nfunction resolvePositiveIntegerConfig(\n value: unknown,\n defaultValue: number,\n keyName: string,\n): number {\n if (value === undefined || value === null) return defaultValue;\n const coerced = coerceNumber(value);\n if (\n coerced === undefined ||\n !Number.isFinite(coerced) ||\n !Number.isInteger(coerced) ||\n coerced < 1\n ) {\n throw new Error(\n `${keyName} must be a positive integer; got ${JSON.stringify(value)}`,\n );\n }\n return coerced;\n}\n\nfunction resolveNonNegativeIntegerConfig(\n value: unknown,\n defaultValue: number,\n keyName: string,\n): number {\n if (value === undefined || value === null) return defaultValue;\n const coerced = coerceNumber(value);\n if (\n coerced === undefined ||\n !Number.isFinite(coerced) ||\n !Number.isInteger(coerced) ||\n coerced < 0\n ) {\n throw new Error(\n `${keyName} must be a non-negative integer; got ${JSON.stringify(value)}`,\n );\n }\n return coerced;\n}\n\nexport function isOpenaiApiKeyDisabled(value: unknown): boolean {\n return value === false || (typeof value === \"string\" && value.trim().toLowerCase() === \"false\");\n}\n\n/**\n * Detect a SecretRef-shaped object (issue #757) without resolving it.\n * SecretRefs are preserved verbatim through `parseConfig` and resolved at\n * service-start time via `resolveAgentAccessAuthToken` (which delegates to\n * OpenClaw's gateway resolver). Standalone Remnic does not resolve these.\n */\nfunction isSecretRefShape(value: unknown): value is import(\"./types.js\").SecretRef {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const obj = value as Record<string, unknown>;\n return typeof obj.source === \"string\" && obj.source.trim().length > 0;\n}\n\n/**\n * Parse the `agentAccessHttp.authToken` field. Accepts:\n * - `string` → env-expanded immediately (current behavior preserved)\n * - `SecretRef` object (`{source, ...}`) → preserved verbatim for runtime\n * resolution by OpenClaw's gateway secret resolver\n * - `undefined` / empty string → fall back to env var, then `undefined`\n * - Any other shape → throw with a clear, actionable error so operators can\n * debug rather than chasing a generic startup failure (issue #757).\n */\nfunction parseAgentAccessAuthToken(raw: unknown): import(\"./types.js\").AgentAccessAuthToken | undefined {\n if (raw === undefined || raw === null) {\n return readEnvVar(\"OPENCLAW_REMNIC_ACCESS_TOKEN\") ?? readEnvVar(\"OPENCLAW_ENGRAM_ACCESS_TOKEN\");\n }\n if (typeof raw === \"string\") {\n if (raw.trim().length === 0) {\n return readEnvVar(\"OPENCLAW_REMNIC_ACCESS_TOKEN\") ?? readEnvVar(\"OPENCLAW_ENGRAM_ACCESS_TOKEN\");\n }\n return resolveEnvVars(raw);\n }\n if (isSecretRefShape(raw)) {\n return raw;\n }\n throw new Error(\n \"unsupported SecretRef shape for agentAccessHttp.authToken — \" +\n \"expected a string or an object with a non-empty `source` field \" +\n \"(see https://github.com/joshuaswarren/remnic/issues/757)\",\n );\n}\n\nfunction parseAgentAccessPrincipal(raw: unknown): string | undefined {\n if (typeof raw === \"string\" && raw.trim().length > 0) {\n return resolveEnvVars(raw);\n }\n return (\n readEnvVar(\"OPENCLAW_REMNIC_ACCESS_PRINCIPAL\")?.trim() ||\n readEnvVar(\"OPENCLAW_ENGRAM_ACCESS_PRINCIPAL\")?.trim() ||\n undefined\n );\n}\n\nfunction parseOptionalEnvName(raw: unknown, property: string): string | undefined {\n if (raw === undefined || raw === null || raw === \"\") return undefined;\n if (typeof raw !== \"string\" || !/^[A-Z_][A-Z0-9_]*$/.test(raw)) {\n throw new Error(`${property} must name a conventional environment variable`);\n }\n return raw;\n}\n\nexport function 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 === undefined) return undefined;\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n throw new Error(`${source === \"env\" ? \"OPENAI_BASE_URL\" : \"openaiBaseUrl\"} must be an absolute HTTP or HTTPS URL`);\n }\n\n let parsed: URL;\n try {\n parsed = new URL(trimmed);\n } catch {\n throw new Error(`${source === \"env\" ? \"OPENAI_BASE_URL\" : \"openaiBaseUrl\"} must be an absolute HTTP or HTTPS URL`);\n }\n\n if (parsed.protocol !== \"https:\" && parsed.protocol !== \"http:\") {\n throw new Error(`${source === \"env\" ? \"OPENAI_BASE_URL\" : \"openaiBaseUrl\"} must use HTTP or HTTPS`);\n }\n\n if (parsed.username || parsed.password || parsed.search || parsed.hash) {\n throw new Error(\n `${source === \"env\" ? \"OPENAI_BASE_URL\" : \"openaiBaseUrl\"} must not include credentials, query parameters, or fragments`,\n );\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\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\n// Cursor review on PR #736: the default reasoning model used by the\n// extraction pipeline (`config.model`) and the new peer profile\n// reasoner (`peerProfileReasonerModel`) was hardcoded as `\"gpt-5.5\"`\n// in two places. Centralize the default so both surfaces — and any\n// future LLM-backed surface — always agree on the same model id.\n// Sibling packages may keep their own constants only when they are scoped to\n// their own subsystem and intentionally diverge. Shared reasoning-model\n// defaults should use this constant.\nexport const DEFAULT_REASONING_MODEL = \"gpt-5.5\";\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 \"qmdEmbeddingBacklogThreshold\",\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 explicitCueRecallEnabled: true,\n explicitCueRecallMaxChars: 3200,\n lcmEnabled: 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}\nexport function parseConfig(\n raw: unknown,\n rawOperatorConfig?: Record<string, unknown> | null,\n runtimeSet?: ReadonlySet<string>,\n): 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 validateNestedConfigBlock(cfg, \"maintenance\");\n\n const modelSource =\n cfg.modelSource === \"gateway\" ? \"gateway\" : \"plugin\";\n\n const openaiApiKeyDisabled = isOpenaiApiKeyDisabled(cfg.openaiApiKey);\n\n let apiKey: string | undefined;\n if (openaiApiKeyDisabled) {\n // Explicit opt-out for local/gateway-only deployments. Without this,\n // a stale process-level OPENAI_API_KEY can be captured even when the\n // operator wants Remnic to use local LLMs and never try direct OpenAI.\n apiKey = undefined;\n } else if (typeof cfg.openaiApiKey === \"string\" && cfg.openaiApiKey.length > 0) {\n apiKey = resolveEnvVars(cfg.openaiApiKey);\n } else if (modelSource === \"gateway\") {\n // Gateway mode deliberately delegates LLM calls to OpenClaw's model chain.\n // Do not implicitly capture OPENAI_API_KEY from the Remnic process env here:\n // doing so makes diagnostics look OpenAI-dependent and can accidentally\n // route extraction through a stale direct key before gateway fallback.\n apiKey = undefined;\n } else {\n apiKey = readEnvVar(\"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 taskModelChain = parseModelChainConfig(cfg.taskModelChain, \"taskModelChain\");\n // Gateway-routed background tasks (flush plan, hourly summary cron, recall\n // planner) default to the configured task-model primary, or empty so the\n // Gateway default wins — never a bare reasoning id that resolves to an\n // unroutable `<provider>/gpt-5.5` (issue #1469).\n const taskModelFallback =\n modelSource === \"gateway\"\n ? (taskModelChain?.primary ?? \"\")\n : DEFAULT_REASONING_MODEL;\n const explicitModel =\n typeof cfg.model === \"string\" && cfg.model.length > 0 ? cfg.model : \"\";\n // Base reasoning/extraction model. Kept DIRECT-compatible: direct-key call\n // sites (e.g. briefing follow-ups when `openaiApiKey` is set) pass this\n // straight to the OpenAI Responses API, so it must stay a bare/direct model\n // id and never a provider-qualified gateway route string. The gateway task\n // chain is applied at gateway-routed call sites (summaryModel, recall planner)\n // instead, not here (issue #1469 / codex review on PR #1470).\n const model = explicitModel || DEFAULT_REASONING_MODEL;\n // In gateway mode a usable task route must be provider-qualified (`provider/model`).\n // A bare id — including the `\"gpt-5.5\"` schema default OpenClaw injects when the\n // operator only configured `modelSource` + `taskModelChain` — resolves to an\n // unroutable `<provider>/gpt-5.5`, so it is treated as ABSENT and the configured\n // task chain wins. Direct (non-gateway) mode keeps bare ids as-is (#1469).\n const gatewayTaskModel = (value: string): string =>\n modelSource === \"gateway\" && !value.includes(\"/\") ? \"\" : value;\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\n // ── Dreams phases config (issue #678 PR 2/4) ─────────────────────────────\n // The `dreams.phases.*` block groups existing top-level lifecycle / REM /\n // deep-sleep gates under a unified namespace. When a value is explicitly\n // set under `dreams.phases.*`, it WINS over the corresponding legacy\n // top-level key. Legacy top-level keys continue to be parsed so existing\n // configs work without modification.\n //\n // Precedence summary (highest → lowest):\n // dreams.phases.lightSleep.enabled > lifecyclePolicyEnabled\n // dreams.phases.rem.enabled > semanticConsolidationEnabled\n // dreams.phases.deepSleep.enabled > (no legacy top-level equivalent)\n //\n // This block is intentionally a DIFFERENT namespace from `dreaming`\n // (the diary surface — `surfaces/dreams.ts`). See docs/dreams.md.\n const rawDreamsBlock =\n cfg.dreams && typeof cfg.dreams === \"object\" && !Array.isArray(cfg.dreams)\n ? (cfg.dreams as Record<string, unknown>)\n : {};\n const rawDreamsPhases =\n rawDreamsBlock.phases && typeof rawDreamsBlock.phases === \"object\" && !Array.isArray(rawDreamsBlock.phases)\n ? (rawDreamsBlock.phases as Record<string, unknown>)\n : {};\n const rawDreamsLightSleep =\n rawDreamsPhases.lightSleep && typeof rawDreamsPhases.lightSleep === \"object\" && !Array.isArray(rawDreamsPhases.lightSleep)\n ? (rawDreamsPhases.lightSleep as Record<string, unknown>)\n : {};\n const rawDreamsRem =\n rawDreamsPhases.rem && typeof rawDreamsPhases.rem === \"object\" && !Array.isArray(rawDreamsPhases.rem)\n ? (rawDreamsPhases.rem as Record<string, unknown>)\n : {};\n const rawDreamsDeepSleep =\n rawDreamsPhases.deepSleep && typeof rawDreamsPhases.deepSleep === \"object\" && !Array.isArray(rawDreamsPhases.deepSleep)\n ? (rawDreamsPhases.deepSleep as Record<string, unknown>)\n : {};\n\n // Resolve legacy top-level defaults that the phases mirror. We compute them\n // here (before the return statement) so the phase parser can apply precedence\n // without duplicating the clamping logic.\n const legacyLifecyclePolicyEnabled = coerceBooleanLike(cfg.lifecyclePolicyEnabled) ?? true;\n const legacyLifecyclePromoteHeatThreshold =\n typeof cfg.lifecyclePromoteHeatThreshold === \"number\"\n ? Math.min(1, Math.max(0, cfg.lifecyclePromoteHeatThreshold))\n : 0.55;\n const legacyLifecycleStaleDecayThreshold =\n typeof cfg.lifecycleStaleDecayThreshold === \"number\"\n ? Math.min(1, Math.max(0, cfg.lifecycleStaleDecayThreshold))\n : 0.65;\n const legacyLifecycleArchiveDecayThreshold =\n typeof cfg.lifecycleArchiveDecayThreshold === \"number\"\n ? Math.min(1, Math.max(0, cfg.lifecycleArchiveDecayThreshold))\n : 0.85;\n const legacySemanticConsolidationEnabled = cfg.semanticConsolidationEnabled === true;\n const legacySemanticConsolidationIntervalHours =\n typeof cfg.semanticConsolidationIntervalHours === \"number\"\n ? Math.max(1, Math.floor(cfg.semanticConsolidationIntervalHours))\n : 168;\n const legacySemanticConsolidationThreshold =\n typeof cfg.semanticConsolidationThreshold === \"number\" ? cfg.semanticConsolidationThreshold : 0.8;\n const legacySemanticConsolidationMinClusterSize =\n typeof cfg.semanticConsolidationMinClusterSize === \"number\"\n ? Math.max(2, Math.floor(cfg.semanticConsolidationMinClusterSize))\n : 3;\n const legacySemanticConsolidationMaxPerRun =\n typeof cfg.semanticConsolidationMaxPerRun === \"number\"\n ? Math.max(0, Math.floor(cfg.semanticConsolidationMaxPerRun))\n : 100;\n const legacyConsolidationMinIntervalMs =\n typeof cfg.consolidationMinIntervalMs === \"number\" ? cfg.consolidationMinIntervalMs : 10 * 60_000;\n const legacyVersioningEnabled = cfg.versioningEnabled === true;\n const legacyVersioningMaxPerPage =\n typeof cfg.versioningMaxPerPage === \"number\"\n ? Math.max(0, Math.floor(cfg.versioningMaxPerPage))\n : 50;\n const legacyDeepSleepEnabled =\n cfg.nightlyGovernanceCronAutoRegister === true ||\n cfg.qmdTierMigrationEnabled === true ||\n legacyVersioningEnabled;\n\n // Light sleep phase — dreams.phases.lightSleep.* wins when present.\n const dreamsLightSleepEnabledRaw = coerceBooleanLike(rawDreamsLightSleep.enabled);\n const dreamsLightSleep: DreamsLightSleepConfig = {\n // new key wins; fall back to resolved legacy default\n enabled: dreamsLightSleepEnabledRaw !== undefined ? dreamsLightSleepEnabledRaw : legacyLifecyclePolicyEnabled,\n cadenceMs:\n typeof rawDreamsLightSleep.cadenceMs === \"number\"\n ? Math.max(0, Math.floor(rawDreamsLightSleep.cadenceMs))\n : 0, // 0 = no override; orchestrator uses its own internal cadence\n promoteHeatThreshold:\n typeof rawDreamsLightSleep.promoteHeatThreshold === \"number\"\n ? Math.min(1, Math.max(0, rawDreamsLightSleep.promoteHeatThreshold))\n : legacyLifecyclePromoteHeatThreshold,\n staleDecayThreshold:\n typeof rawDreamsLightSleep.staleDecayThreshold === \"number\"\n ? Math.min(1, Math.max(0, rawDreamsLightSleep.staleDecayThreshold))\n : legacyLifecycleStaleDecayThreshold,\n archiveDecayThreshold:\n typeof rawDreamsLightSleep.archiveDecayThreshold === \"number\"\n ? Math.min(1, Math.max(0, rawDreamsLightSleep.archiveDecayThreshold))\n : legacyLifecycleArchiveDecayThreshold,\n filterStaleEnabled:\n rawDreamsLightSleep.filterStaleEnabled !== undefined\n ? coerceBooleanLike(rawDreamsLightSleep.filterStaleEnabled) === true\n : cfg.lifecycleFilterStaleEnabled === true,\n };\n\n // REM phase — dreams.phases.rem.* wins when present.\n const dreamsRemEnabledRaw = coerceBooleanLike(rawDreamsRem.enabled);\n const dreamsRem: DreamsRemConfig = {\n enabled: dreamsRemEnabledRaw !== undefined ? dreamsRemEnabledRaw : legacySemanticConsolidationEnabled,\n cadenceMs:\n typeof rawDreamsRem.cadenceMs === \"number\"\n ? Math.max(0, Math.floor(rawDreamsRem.cadenceMs))\n : legacySemanticConsolidationIntervalHours * 3_600_000,\n similarityThreshold:\n typeof rawDreamsRem.similarityThreshold === \"number\"\n ? Math.min(1, Math.max(0, rawDreamsRem.similarityThreshold))\n : legacySemanticConsolidationThreshold,\n minClusterSize:\n typeof rawDreamsRem.minClusterSize === \"number\"\n ? Math.max(2, Math.floor(rawDreamsRem.minClusterSize))\n : legacySemanticConsolidationMinClusterSize,\n maxPerRun:\n typeof rawDreamsRem.maxPerRun === \"number\"\n ? Math.max(0, Math.floor(rawDreamsRem.maxPerRun))\n : legacySemanticConsolidationMaxPerRun,\n minIntervalMs:\n typeof rawDreamsRem.minIntervalMs === \"number\"\n ? Math.max(0, Math.floor(rawDreamsRem.minIntervalMs))\n : legacyConsolidationMinIntervalMs,\n };\n\n // Deep sleep phase — dreams.phases.deepSleep.* wins when present.\n const dreamsDeepSleepEnabledRaw = coerceBooleanLike(rawDreamsDeepSleep.enabled);\n const dreamsDeepSleep: DreamsDeepSleepConfig = {\n enabled:\n dreamsDeepSleepEnabledRaw !== undefined\n ? dreamsDeepSleepEnabledRaw\n : legacyDeepSleepEnabled,\n enabledExplicitlySet: dreamsDeepSleepEnabledRaw !== undefined,\n cadenceMs:\n typeof rawDreamsDeepSleep.cadenceMs === \"number\"\n ? Math.max(0, Math.floor(rawDreamsDeepSleep.cadenceMs))\n : 24 * 3_600_000, // default: 24 h (mirrors nightly governance cron)\n versioningEnabled:\n rawDreamsDeepSleep.versioningEnabled !== undefined\n ? coerceBooleanLike(rawDreamsDeepSleep.versioningEnabled) === true\n : legacyVersioningEnabled,\n versioningMaxPerPage:\n typeof rawDreamsDeepSleep.versioningMaxPerPage === \"number\"\n ? Math.max(0, Math.floor(rawDreamsDeepSleep.versioningMaxPerPage))\n : legacyVersioningMaxPerPage,\n };\n\n const dreamsPhases: DreamsPhasesConfig = {\n lightSleep: dreamsLightSleep,\n rem: dreamsRem,\n deepSleep: dreamsDeepSleep,\n };\n // ── End dreams phases ─────────────────────────────────────────────────────\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 const maintenance = parseProceduralMaintenanceConfig(rawProcedural.maintenance);\n const skillProjection = parseSkillProjectionConfig(rawProcedural.skillProjection);\n // Default-on procedural memory (issue #567 PR 4/5). Explicit false-ish values stay off. Unknown values throw.\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 maintenance,\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 skillProjection,\n };\n const wearables = parseWearablesConfig(cfg.wearables);\n const { activity, meetings, provenance } = parseCaptureCompanionConfigs(cfg);\n const location = parseLocationConfig(cfg.location);\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, branchScope=false (opt-in; CLAUDE.md #36).\n const codingProjectScopeRaw = coerceBool(rawCodingMode.projectScope);\n const codingBranchScopeRaw = coerceBool(rawCodingMode.branchScope);\n const codingGlobalFallbackRaw = coerceBool(rawCodingMode.globalFallback);\n const codingMode: CodingModeConfig = {\n projectScope: codingProjectScopeRaw === undefined ? true : codingProjectScopeRaw,\n branchScope: codingBranchScopeRaw === true,\n // Default true — project-scoped sessions include the root namespace in\n // read fallbacks so globally useful memories remain visible. CLAUDE.md #30.\n globalFallback: codingGlobalFallbackRaw === undefined ? true : codingGlobalFallbackRaw,\n };\n\n const memoryDir =\n typeof cfg.memoryDir === \"string\" && cfg.memoryDir.length > 0\n ? expandTildePath(cfg.memoryDir)\n : DEFAULT_MEMORY_DIR;\n const scopeProfiles = parseScopeProfiles(cfg.scopeProfiles);\n const teams = parseScopeTeams(cfg.teams);\n validateScopeProfileTeamReferences(scopeProfiles, teams);\n const defaultScopeProfile = (() => {\n if (cfg.defaultScopeProfile === undefined || cfg.defaultScopeProfile === null) {\n return undefined;\n }\n if (typeof cfg.defaultScopeProfile !== \"string\" || cfg.defaultScopeProfile.trim().length === 0) {\n throw new Error(\"defaultScopeProfile must be a non-empty string\");\n }\n return cfg.defaultScopeProfile.trim();\n })();\n if (\n defaultScopeProfile !== undefined &&\n scopeProfiles[defaultScopeProfile] === undefined\n ) {\n throw new Error(`defaultScopeProfile references unknown scope profile: ${defaultScopeProfile}`);\n }\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 agentAccessAuthToken = parseAgentAccessAuthToken(rawAgentAccessHttp?.authToken);\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: parsePortNumber(rawAgentAccessHttp?.port, 4318, \"agentAccessHttp.port\"),\n [[\"auth\", \"Token\"].join(\"\")]: agentAccessAuthToken,\n principal: parseAgentAccessPrincipal(rawAgentAccessHttp?.principal),\n maxBodyBytes:\n typeof rawAgentAccessHttp?.maxBodyBytes === \"number\"\n ? Math.max(1, Math.floor(rawAgentAccessHttp.maxBodyBytes))\n : 131072,\n writeRateLimitMaxRequests: resolvePositiveIntegerConfig(\n rawAgentAccessHttp?.writeRateLimitMaxRequests,\n 30,\n \"agentAccessHttp.writeRateLimitMaxRequests\",\n ),\n writeRateLimitWindowMs: resolvePositiveIntegerConfig(\n rawAgentAccessHttp?.writeRateLimitWindowMs,\n 60_000,\n \"agentAccessHttp.writeRateLimitWindowMs\",\n ),\n };\n\n let baseUrl: string | undefined;\n if (cfg.openaiBaseUrl !== undefined && typeof cfg.openaiBaseUrl !== \"string\") {\n throw new Error(\"openaiBaseUrl must be a string\");\n }\n if (cfg.openaiBaseUrl !== undefined) {\n baseUrl = normalizeOpenaiBaseUrl(resolveEnvVars(cfg.openaiBaseUrl), \"config\");\n } else if (apiKey !== undefined) {\n baseUrl = normalizeOpenaiBaseUrl(readEnvVar(\"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 const maintenanceNamespaceFanoutEnabled = resolveBooleanConfig(\n readFlatOrNestedConfig(\n cfg,\n \"maintenanceNamespaceFanoutEnabled\",\n \"maintenance\",\n \"namespaceFanoutEnabled\",\n ),\n true,\n \"maintenance.namespaceFanoutEnabled\",\n );\n const maintenanceMaxNamespacesPerCycle = resolvePositiveIntegerConfig(\n readFlatOrNestedConfig(\n cfg,\n \"maintenanceMaxNamespacesPerCycle\",\n \"maintenance\",\n \"maxNamespacesPerCycle\",\n ),\n 20,\n \"maintenance.maxNamespacesPerCycle\",\n );\n const maintenanceIncludeProjectNamespaces = resolveBooleanConfig(\n readFlatOrNestedConfig(\n cfg,\n \"maintenanceIncludeProjectNamespaces\",\n \"maintenance\",\n \"includeProjectNamespaces\",\n ),\n true,\n \"maintenance.includeProjectNamespaces\",\n );\n const maintenanceIncludeBranchNamespaces = resolveBooleanConfig(\n readFlatOrNestedConfig(\n cfg,\n \"maintenanceIncludeBranchNamespaces\",\n \"maintenance\",\n \"includeBranchNamespaces\",\n ),\n false,\n \"maintenance.includeBranchNamespaces\",\n );\n const maintenanceIncludeTeamProjectNamespaces = resolveBooleanConfig(\n readFlatOrNestedConfig(\n cfg,\n \"maintenanceIncludeTeamProjectNamespaces\",\n \"maintenance\",\n \"includeTeamProjectNamespaces\",\n ),\n true,\n \"maintenance.includeTeamProjectNamespaces\",\n );\n const maintenanceNamespaceLockStaleMs = resolvePositiveIntegerConfig(\n readFlatOrNestedConfig(\n cfg,\n \"maintenanceNamespaceLockStaleMs\",\n \"maintenance\",\n \"namespaceLockStaleMs\",\n ),\n 10 * 60_000,\n \"maintenance.namespaceLockStaleMs\",\n );\n\n const { wikiMergeIntoRecall, qmdCollection, qmdColdCollection } =\n parseExternalWikiRecallGuard(cfg);\n const localLlmApiKeyEnv = parseOptionalEnvName(cfg.localLlmApiKeyEnv, \"localLlmApiKeyEnv\");\n\n return {\n openaiApiKey: apiKey,\n openaiBaseUrl: baseUrl,\n model,\n reasoningEffort,\n triggerMode,\n ...parseSecurityConfig(cfg, rawOperatorConfig),\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 wikiMergeIntoRecall,\n qmdMaxResults:\n typeof cfg.qmdMaxResults === \"number\" ? cfg.qmdMaxResults : 8,\n qmdEmbeddingBacklogThreshold: (() => {\n const raw = cfg.qmdEmbeddingBacklogThreshold;\n const n = typeof raw === \"number\"\n ? raw\n : typeof raw === \"string\" && raw.trim() !== \"\"\n ? Number(raw)\n : NaN;\n return Number.isFinite(n) && Number.isInteger(n) && n >= 0 ? n : 1000;\n })(),\n qmdColdTierEnabled: cfg.qmdColdTierEnabled === true,\n qmdColdCollection,\n qmdColdMaxResults:\n typeof cfg.qmdColdMaxResults === \"number\" ? cfg.qmdColdMaxResults : 8,\n // Issue #678 PR 2/4: gate hot/cold tier migration (a deep-sleep activity)\n // on dreams.phases.deepSleep.enabled. When deep sleep is disabled,\n // tier migration is forced off regardless of legacy flag.\n qmdTierMigrationEnabled: dreamsDeepSleep.enabled && 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 qmdSupportedVersion: parseQmdSupportedVersion(cfg.qmdSupportedVersion),\n qmdAutoUpgradeEnabled: coerceBool(cfg.qmdAutoUpgradeEnabled) === true,\n qmdAutoUpgradeCheckIntervalMs: parseBoundedIntegerMs(\n cfg.qmdAutoUpgradeCheckIntervalMs,\n 24 * 60 * 60_000,\n 60_000,\n 30 * 24 * 60 * 60_000,\n ),\n qmdChunkStrategy: parseQmdChunkStrategy(cfg.qmdChunkStrategy),\n qmdCandidateLimit: parsePositiveInteger(cfg.qmdCandidateLimit, \"qmdCandidateLimit\"),\n qmdQueryRerankEnabled: coerceBooleanLike(cfg.qmdQueryRerankEnabled) ?? true,\n qmdSearchStrategy: parseQmdSearchStrategy(cfg.qmdSearchStrategy),\n qmdSubprocessStrategy: parseQmdSubprocessStrategy(cfg.qmdSubprocessStrategy),\n qmdDaemonTimeoutMs: parseQmdDaemonTimeoutMs(cfg.qmdDaemonTimeoutMs),\n qmdIndexName: parseOptionalNonEmptyString(cfg.qmdIndexName),\n qmdForceCpu: coerceBooleanLike(cfg.qmdForceCpu) ?? false,\n qmdGpuBackend: parseQmdGpuBackend(cfg.qmdGpuBackend),\n qmdEmbedParallelism: parseBoundedPositiveInteger(\n cfg.qmdEmbedParallelism,\n 1,\n 8,\n \"qmdEmbedParallelism\",\n ),\n qmdEmbedModel: parseOptionalNonEmptyString(cfg.qmdEmbedModel),\n qmdRerankModel: parseOptionalNonEmptyString(cfg.qmdRerankModel),\n qmdGenerateModel: parseOptionalNonEmptyString(cfg.qmdGenerateModel),\n embeddingFallbackEnabled: cfg.embeddingFallbackEnabled !== false,\n embeddingFallbackProvider:\n cfg.embeddingFallbackProvider === \"openai\"\n ? \"openai\"\n : cfg.embeddingFallbackProvider === \"local\"\n ? \"local\"\n : \"auto\",\n hostEmbeddingProviderEnabled:\n coerceBooleanLike(cfg.hostEmbeddingProviderEnabled) ??\n coerceBooleanLike(cfg.openclawHostEmbeddingProviderEnabled) ??\n true,\n hostEmbeddingProviderId:\n parseOptionalNonEmptyString(cfg.hostEmbeddingProviderId) ??\n parseOptionalNonEmptyString(cfg.openclawHostEmbeddingProviderId),\n hostEmbeddingProviderModel:\n parseOptionalNonEmptyString(cfg.hostEmbeddingProviderModel) ??\n parseOptionalNonEmptyString(cfg.openclawHostEmbeddingProviderModel),\n embeddingFallbackModel:\n typeof cfg.embeddingFallbackModel === \"string\" && cfg.embeddingFallbackModel.length > 0\n ? cfg.embeddingFallbackModel\n : \"\",\n qmdPath:\n typeof cfg.qmdPath === \"string\" && cfg.qmdPath.length > 0\n ? cfg.qmdPath\n : undefined,\n memoryDir,\n externalWikis: parseExternalWikiRoots(cfg.externalWikis, 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 // Explicit validation (issue #1909 review round 8): reject invalid input\n // rather than flooring/clamping. Must be an integer in [0, 2^31-1] (Node's\n // setTimeout ceiling); 0 = save every turn; undefined → 3000.\n bufferSaveDebounceMs: parseIntegerInClosedRange(\n cfg.bufferSaveDebounceMs,\n 0,\n 2_147_483_647,\n 3_000,\n \"bufferSaveDebounceMs\",\n ),\n sessionObserverBands,\n injectQuestions: cfg.injectQuestions === true,\n commitmentDecayDays: parseIntegerAtLeast(\n cfg.commitmentDecayDays,\n 90,\n 1,\n \"commitmentDecayDays\",\n ),\n workspaceDir:\n typeof cfg.workspaceDir === \"string\" && cfg.workspaceDir.length > 0\n ? expandTildePath(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 contradictionLocalization: parseContradictionLocalizationConfig(cfg.contradictionLocalization),\n contradictionAutoResolve: cfg.contradictionAutoResolve !== false,\n // Contradiction Scan cron (issue #520)\n contradictionScan: parseContradictionScanConfig(cfg.contradictionScan),\n // Preference drift detection (issue #2371)\n driftDetection: parseDriftDetectionConfig(cfg.driftDetection),\n // Budgeted deep-recall surface (issue #2332)\n deepRecall: parseDeepRecallConfig(cfg.deepRecall),\n dependencyPropagation: parseDependencyPropagationConfig(cfg),\n // Temporal Supersession (issue #375)\n temporalSupersessionEnabled: cfg.temporalSupersessionEnabled !== false, // On by default\n temporalSupersessionIncludeInRecall:\n cfg.temporalSupersessionIncludeInRecall === true, // Off by default\n // Bi-temporal validity (issue #1578). Default `false` so recall behaves\n // byte-identically to pre-#1578 until an operator opts in. Uses coerceBool\n // (same as recallDirectAnswerEnabled below) so CLI string \"true\" works.\n //\n // CURRENT scope (this PR): the recall injection filter (expired-validity\n // facts leave default injection but stay findable by explicit search and\n // as_of queries) + the observedAt/eventTimeSource storage fields. The\n // extraction prompt → resolveEventTime write-time wiring lands in a\n // follow-on PR; until then, enabling the gate exercises the filter and\n // storage round-trip but new extractions are not yet event-time-resolved\n // (docs kept honest — review: wire resolver before exposing the gate).\n temporalBiTemporal: coerceBool(cfg.temporalBiTemporal) ?? false,\n temporalExpiredInInjection: coerceBool(cfg.temporalExpiredInInjection) ?? false,\n // Correction Contract (issue #1580). Parsed here so operators can actually\n // set the documented toggles/limits (review thread Txp): parseConfig builds\n // an explicit output, so without these lines the raw `correction` block /\n // flat legacy keys are dropped and the runtime always sees defaults. Nested\n // `correction.<key>` wins; flat `correction<Key>` is the legacy fallback.\n correctionEnabled: (() => {\n const nested = (cfg.correction as Record<string, unknown> | undefined)?.enabled;\n const raw = nested !== undefined ? nested : cfg.correctionEnabled;\n if (raw === undefined || raw === null) return true;\n const v = coerceBool(raw);\n if (v === undefined) {\n throw new Error(`Invalid correction.enabled: expected a boolean, got ${JSON.stringify(raw)}`);\n }\n return v;\n })(),\n correctionApplyRequiresConfirm: (() => {\n const nested = (cfg.correction as Record<string, unknown> | undefined)?.applyRequiresConfirm;\n const raw = nested !== undefined ? nested : cfg.correctionApplyRequiresConfirm;\n if (raw === undefined || raw === null) return true;\n const v = coerceBool(raw);\n if (v === undefined) {\n throw new Error(`Invalid correction.applyRequiresConfirm: expected a boolean, got ${JSON.stringify(raw)}`);\n }\n return v;\n })(),\n correctionMaxAffected: (() => {\n const rawNested = (cfg.correction as Record<string, unknown> | undefined)?.maxAffected;\n const raw = rawNested !== undefined ? rawNested : cfg.correctionMaxAffected;\n if (raw === undefined || raw === null) return 10;\n const n = coerceNumber(raw);\n // #1678 (thread Oiup6): the error message says \"integer\" — enforce it\n // with Number.isInteger so 3.7 is rejected rather than silently floored.\n if (n === undefined || !Number.isFinite(n) || n < 1 || !Number.isInteger(n)) {\n throw new Error(`Invalid correction.maxAffected: expected an integer >= 1, got ${JSON.stringify(raw)}`);\n }\n return n;\n })(),\n correctionPlanTtlHours: (() => {\n const nested = (cfg.correction as Record<string, unknown> | undefined)?.planTtlHours;\n const fromNested = nested !== undefined ? coerceNumber(nested) : undefined;\n if (fromNested !== undefined && fromNested >= 1) return fromNested;\n // #1678 (threads Ohtvi/Ohyvf): reject invalid (0/negative/non-numeric)\n // instead of silently defaulting to 24h — completes the config-reject\n // class already enforced for enabled/applyRequiresConfirm/maxAffected.\n if (nested !== undefined && fromNested === undefined) {\n throw new Error(`Invalid correction.planTtlHours: expected a number >= 1, got ${JSON.stringify(nested)}`);\n }\n if (fromNested !== undefined && fromNested < 1) {\n throw new Error(`Invalid correction.planTtlHours: expected a number >= 1, got ${JSON.stringify(nested)}`);\n }\n const fromFlat = coerceNumber(cfg.correctionPlanTtlHours);\n if (fromFlat !== undefined && fromFlat >= 1) return fromFlat;\n if (cfg.correctionPlanTtlHours !== undefined && fromFlat === undefined) {\n throw new Error(`Invalid correction.planTtlHours: expected a number >= 1, got ${JSON.stringify(cfg.correctionPlanTtlHours)}`);\n }\n if (fromFlat !== undefined && fromFlat < 1) {\n throw new Error(`Invalid correction.planTtlHours: expected a number >= 1, got ${JSON.stringify(cfg.correctionPlanTtlHours)}`);\n }\n return 24;\n })(),\n // Passive correction capture (issue #1581). Parsed from\n // `correctionCapture.<key>` (nested) or flat legacy keys. Default \"off\" —\n // operators opt in (rule 48). Invalid mode → rejected listing options (rule 51).\n correctionCaptureMode: (() => {\n const nested = (cfg.correctionCapture as Record<string, unknown> | undefined)?.mode;\n const raw = nested !== undefined ? nested : cfg.correctionCaptureMode;\n if (raw === undefined || raw === null) return \"off\" as const;\n if (raw === \"off\" || raw === \"queue\" || raw === \"auto\") return raw;\n throw new Error(\n `Invalid correctionCapture.mode: expected one of \"off\", \"queue\", \"auto\", got ${JSON.stringify(raw)}`,\n );\n })(),\n correctionCaptureConfidenceFloor: (() => {\n const nested = (cfg.correctionCapture as Record<string, unknown> | undefined)?.confidenceFloor;\n const raw = nested !== undefined ? nested : cfg.correctionCaptureConfidenceFloor;\n if (raw === undefined || raw === null) return 0.85;\n const n = coerceNumber(raw);\n if (n === undefined || !Number.isFinite(n) || n < 0 || n > 1) {\n throw new Error(`Invalid correctionCapture.confidenceFloor: expected a number in [0, 1], got ${JSON.stringify(raw)}`);\n }\n return n;\n })(),\n correctionCaptureAutoApplyMaxAffected: (() => {\n const nested = (cfg.correctionCapture as Record<string, unknown> | undefined)?.autoApplyMaxAffected;\n const raw = nested !== undefined ? nested : cfg.correctionCaptureAutoApplyMaxAffected;\n if (raw === undefined || raw === null) return 2;\n const n = coerceNumber(raw);\n if (n === undefined || !Number.isFinite(n) || n < 1) {\n throw new Error(`Invalid correctionCapture.autoApplyMaxAffected: expected an integer >= 1, got ${JSON.stringify(raw)}`);\n }\n return Math.floor(n);\n })(),\n // Tombstones — non-resurrection invariant (issue #1579). The invariant is\n // the point, so it ships ON by default; `false` restores pre-feature\n // behavior for rollback safety (rule 30). Uses coerceBool so CLI string\n // \"false\" / \"0\" disable it (CLAUDE.md §24).\n tombstonesEnabled: coerceBool(cfg.tombstonesEnabled) ?? true,\n tombstonesSemanticMatch: coerceBool(cfg.tombstonesSemanticMatch) ?? false,\n tombstonesSemanticThreshold: (() => {\n const n = coerceNumber(cfg.tombstonesSemanticThreshold);\n return n !== undefined && n >= 0 && n <= 1 ? n : 0.9;\n })(),\n // Direct-answer retrieval tier (issue #518). Default off so the\n // recall path keeps least-privileged behavior unless operators\n // explicitly opt in.\n recallDirectAnswerEnabled:\n coerceBool(cfg.recallDirectAnswerEnabled) ?? false,\n // Recall state views (issue #1952). Default false; exact false/0/\"false\"\n // disable (parseRecallStateViews → coerceBooleanLike).\n recallStateViews: parseRecallStateViews(cfg.recallStateViews),\n // Disclosure auto-escalation (issue #677 PR 4/4). Default `manual`\n // so pre-#677 callers see unchanged behavior. Reject anything\n // outside the allow-list rather than silently defaulting (CLAUDE.md\n // rule 51).\n recallDisclosureEscalation: (() => {\n const raw = cfg.recallDisclosureEscalation;\n if (raw === undefined || raw === null) return \"manual\" as const;\n if (raw === \"manual\" || raw === \"auto\") return raw;\n throw new Error(\n `recallDisclosureEscalation must be \"manual\" or \"auto\" (got ${JSON.stringify(raw)}).`,\n );\n })(),\n recallDisclosureEscalationThreshold: (() => {\n const n = coerceNumber(cfg.recallDisclosureEscalationThreshold);\n return n !== undefined && n >= 0 && n <= 1 ? n : 0.5;\n })(),\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). Defaults to\n // false — ships disabled; when enabled, throttles cross-namespace recall bursts.\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 ...parseRecallConcurrencyConfig(cfg),\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 // Trust/Memory-Worth recall stage corpus-level fallback (issue #1905).\n // Default true: when a candidate is missing from the frontmatter already\n // loaded on the hot recall path, the stage may fall back to a per-namespace\n // corpus counter/signal map (version-keyed, so it hits in steady state).\n // Set false to disable that O(corpus) fallback entirely — the stage then\n // uses only the preloaded frontmatter plus a bounded-parallel per-candidate\n // direct read (fully O(candidates)). coerceBool handles \"false\"/\"0\" forms.\n recallTrustStageCorpusFallbackEnabled:\n coerceBool(cfg.recallTrustStageCorpusFallbackEnabled) ?? true,\n // Hot-memories result cache (issue #1902). Default on: readAllMemories()\n // serves from the version-keyed in-process corpus cache. coerceBool\n // handles \"false\"/\"0\" string forms; set false to force disk scans.\n hotMemoriesCacheEnabled: coerceBool(cfg.hotMemoriesCacheEnabled) ?? true,\n // Scope-aware cache invalidation (issue #1904). Default on: a plain fact\n // create no longer nukes the QMD/entity caches it can't affect. coerceBool\n // handles \"false\"/\"0\" string forms; set false to restore full-clear-per-write.\n scopedCacheInvalidationEnabled: coerceBool(cfg.scopedCacheInvalidationEnabled) ?? true,\n // External-edit safety net (issue #1902): the version sentinel gives\n // immediate coherence for cooperating writers, but direct user/git/editor\n // writes to memory files (which the project supports) don't bump it. Bound\n // the hot cache's staleness with a TTL so such edits self-heal. Default 60s;\n // 0 disables the TTL (version invalidation only — max perf for pure-daemon\n // deployments with no external edits). coerceNumber handles string forms.\n hotMemoriesCacheTtlMs: (() => {\n const n = coerceNumber(cfg.hotMemoriesCacheTtlMs);\n return n !== undefined && n >= 0 ? n : 60_000;\n })(),\n recallMemoryWorthHalfLifeMs: (() => {\n const n = coerceNumber(cfg.recallMemoryWorthHalfLifeMs);\n return n !== undefined && n >= 0 ? n : 0;\n })(),\n // Unified TrustScore recall stage (issue #1577). Default off: the stage\n // is absent and ranking is byte-identical to the pre-feature pipeline\n // (rule 39). Flip the master gate via #1574 ablation evidence only.\n trustScoreEnabled: coerceBool(cfg.trustScoreEnabled) ?? false,\n // Epistemic rendering ships behind its own gate so scoring can land first.\n trustScoreEpistemicRendering: coerceBool(cfg.trustScoreEpistemicRendering) ?? false,\n // Quarantine defaults on (only effective under the master gate); keeps\n // hard negatives out of injection but visible in X-ray (rule 34).\n trustScoreQuarantine: coerceBool(cfg.trustScoreQuarantine) ?? true,\n trustScoreMinMultiplier: (() => {\n const n = coerceNumber(cfg.trustScoreMinMultiplier);\n return n !== undefined && n >= 0 && n <= 1 ? n : 0.5;\n })(),\n trustScoreMaxMultiplier: (() => {\n const n = coerceNumber(cfg.trustScoreMaxMultiplier);\n return n !== undefined && n >= 1 && n <= 4 ? n : 1.25;\n })(),\n // Per-component weights. Accept a nested object from config; invalid\n // entries (non-finite, outside [0,1]) are dropped by resolveTrustWeights,\n // which falls back to the documented defaults (rule 51).\n trustScoreWeights: parseTrustScoreWeights(cfg.trustScoreWeights),\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 initGateTimeoutMs: parseBoundedIntegerMs(\n cfg.initGateTimeoutMs,\n DEFAULT_INIT_GATE_TIMEOUT_MS,\n 1_000,\n 120_000,\n ),\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 openclawMessageReceivedCaptureEnabled:\n coerceBooleanLike(cfg.openclawMessageReceivedCaptureEnabled) ?? true,\n openclawReplyMetadataCaptureEnabled:\n coerceBooleanLike(cfg.openclawReplyMetadataCaptureEnabled) ?? true,\n openclawReplyMetadataExtractionHintsEnabled:\n coerceBooleanLike(cfg.openclawReplyMetadataExtractionHintsEnabled) ?? false,\n openclawChannelEnvelopeCleaningEnabled:\n coerceBooleanLike(cfg.openclawChannelEnvelopeCleaningEnabled) ?? true,\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 activeRecallCustomInstruction: (() => {\n const raw =\n typeof cfg.activeRecallCustomInstruction === \"string\"\n ? cfg.activeRecallCustomInstruction\n : typeof cfg[LEGACY_ACTIVE_RECALL_CUSTOM_FIELD] === \"string\"\n ? cfg[LEGACY_ACTIVE_RECALL_CUSTOM_FIELD]\n : \"\";\n return raw.trim().length > 0 ? raw.trim() : null;\n })(),\n activeRecallPromptReplacement: (() => {\n const raw = cfg.activeRecallPromptReplacement;\n if (raw !== undefined && raw !== null && typeof raw !== \"string\") {\n throw new Error(\n `activeRecallPromptReplacement must be a string; got ${JSON.stringify(raw)}`,\n );\n }\n return typeof raw === \"string\" && raw.trim().length > 0 ? raw.trim() : null;\n })(),\n activeRecallPromptOverride: (() => {\n const raw = cfg.activeRecallPromptOverride;\n if (raw !== undefined && raw !== null && typeof raw !== \"string\") {\n throw new Error(\n `activeRecallPromptOverride must be a string; got ${JSON.stringify(raw)}`,\n );\n }\n return typeof raw === \"string\" && raw.trim().length > 0 ? raw.trim() : null;\n })(),\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: parseOptionalNonEmptyString(cfg.activeRecallTranscriptDir) ?? \"active-recall\",\n activeRecallEntityGraphDepth:\n typeof cfg.activeRecallEntityGraphDepth === \"number\"\n ? Math.min(3, Math.max(0, Math.floor(cfg.activeRecallEntityGraphDepth)))\n : 1,\n activeRecallIncludeCausalTrajectories: cfg.activeRecallIncludeCausalTrajectories === true,\n activeRecallIncludeDaySummary: cfg.activeRecallIncludeDaySummary === true,\n activeRecallAttachRecallExplain: cfg.activeRecallAttachRecallExplain === true,\n activeRecallAllowChainedActiveMemory: cfg.activeRecallAllowChainedActiveMemory === true,\n dreaming,\n dreamsPhases,\n procedural,\n ...parseExtractionFields(cfg),\n replicaPeers: parseReplicaPeersConfig(cfg),\n converge: parseConvergeConfig(cfg.converge),\n wearables,\n meetings,\n okf: parseOkfConfig(cfg.okf),\n activity,\n location,\n provenance,\n // At-rest encryption (#690): coerceBool handles CLI string \"true\" (#36).\n secureStoreEnabled: coerceBool(cfg.secureStoreEnabled) === true,\n secureStoreEncryptOnWrite: coerceBool(cfg.secureStoreEncryptOnWrite) !== false, // default: true\n codingMode,\n heartbeat,\n slotBehavior,\n bridgeMode: cfg.bridgeMode === undefined ? \"embedded\" : String(cfg.bridgeMode),\n codexCompat,\n codingKnowledge: parseCodingKnowledgeConfig(cfg.codingKnowledge),\n actionGate: parseActionGateConfig(cfg.actionGate),\n chat: parseChatConfig(cfg.chat),\n supportPassport: parseSupportPassportConfig(cfg.supportPassport),\n hourlySummariesEnabled: cfg.hourlySummariesEnabled !== false, // default: true\n daySummaryEnabled: cfg.daySummaryEnabled !== false, // default: true\n hourlySummaryCronAutoRegister: cfg.hourlySummaryCronAutoRegister === true,\n // Day summary timezone override (issue #1475). When unset, the plugin\n // falls back to the server's local timezone.\n daySummaryTimezone:\n typeof cfg.daySummaryTimezone === \"string\" && cfg.daySummaryTimezone.trim().length > 0\n ? (() => {\n const tz = (cfg.daySummaryTimezone as string).trim();\n try {\n Intl.DateTimeFormat(undefined, { timeZone: tz });\n return tz;\n } catch {\n throw new Error(`daySummaryTimezone must be a valid IANA timezone: ${tz}`);\n }\n })()\n : undefined,\n // Codex P1 on PR 763 round 2: gate the nightly-governance cron\n // (deep-sleep's primary scheduled execution path) on\n // dreams.phases.deepSleep.enabled. When the phase is disabled the\n // cron must NOT auto-register, otherwise `deepSleep.enabled=false`\n // is a contract lie — deep-sleep keeps running.\n nightlyGovernanceCronAutoRegister:\n dreamsDeepSleep.enabled && cfg.nightlyGovernanceCronAutoRegister === true,\n summaryRecallHours:\n typeof cfg.summaryRecallHours === \"number\" ? cfg.summaryRecallHours : 24,\n maxSummaryCount:\n typeof cfg.maxSummaryCount === \"number\" ? cfg.maxSummaryCount : 6,\n // Gateway-routed (memory flush plan + hourly summary cron). Precedence:\n // explicit summaryModel → explicit base model → gateway task-chain primary →\n // \"\" (omit, so the Gateway default wins). In gateway mode bare ids (incl. the\n // injected `model` schema default) are dropped via `gatewayTaskModel`, so the\n // Gateway is never sent an unroutable `<provider>/gpt-5.5` (issue #1469).\n summaryModel:\n gatewayTaskModel(\n typeof cfg.summaryModel === \"string\" && cfg.summaryModel.length > 0\n ? cfg.summaryModel\n : \"\",\n ) ||\n gatewayTaskModel(explicitModel) ||\n taskModelFallback,\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 episodicContextEnabled: cfg.episodicContextEnabled === true,\n abstractionAnchorsEnabled: cfg.abstractionAnchorsEnabled === true,\n verifiedRecallEnabled: cfg.verifiedRecallEnabled === true,\n semanticRulePromotionEnabled: cfg.semanticRulePromotionEnabled === true,\n semanticRuleVerificationEnabled: cfg.semanticRuleVerificationEnabled === true,\n // Issue #678 PR 2/4: when `dreams.phases.rem.*` is set, the resolved\n // dreamsPhases value WINS over the legacy top-level key. The runtime\n // gates (orchestrator's `runSemanticConsolidation`) read these legacy\n // fields, so we must propagate the precedence here, not just in the\n // `dreamsPhases` object.\n semanticConsolidationEnabled: dreamsRem.enabled && dreamsRem.cadenceMs > 0,\n semanticConsolidationModel:\n typeof cfg.semanticConsolidationModel === \"string\" && cfg.semanticConsolidationModel.length > 0\n ? cfg.semanticConsolidationModel\n : \"auto\",\n semanticConsolidationThreshold: dreamsRem.similarityThreshold,\n semanticConsolidationMinClusterSize: dreamsRem.minClusterSize,\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 is derived from dreamsRem.cadenceMs\n // when an override is set (rounded up to the nearest hour). Preserve\n // explicit zero so legacy schedulers see the same disable-by-zero signal\n // as the dreams.phases.rem config; the runtime enabled flag is also\n // disabled above so zero does not mean \"run every maintenance cycle\".\n semanticConsolidationIntervalHours:\n rawDreamsRem.cadenceMs !== undefined\n ? Math.max(0, Math.ceil(dreamsRem.cadenceMs / 3_600_000))\n : legacySemanticConsolidationIntervalHours,\n semanticConsolidationMaxPerRun: dreamsRem.maxPerRun,\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 // Pattern reinforcement (issue #687 PR 2/4). Defaults: off, weekly\n // cadence, min cluster size 3, target categories preference / fact\n // / decision. All bounds clamped at parse time so invalid inputs\n // (negative numbers, non-arrays, non-strings) fail safe to defaults\n // rather than crash the job.\n patternReinforcementEnabled:\n coerceBool(cfg.patternReinforcementEnabled) ?? false,\n patternReinforcementCadenceMs: (() => {\n const raw = coerceNumber(cfg.patternReinforcementCadenceMs);\n if (raw === undefined || !Number.isFinite(raw)) {\n return 7 * 24 * 60 * 60 * 1000;\n }\n // Allow 0 to disable cadence gating; otherwise clamp to >= 0.\n return Math.max(0, Math.floor(raw));\n })(),\n patternReinforcementMinCount: (() => {\n const raw = coerceNumber(cfg.patternReinforcementMinCount);\n if (raw === undefined || !Number.isFinite(raw)) return 3;\n // Clusters of 1 are degenerate; clusters of 2 are the minimum\n // meaningful pattern. Cap at a sane upper bound to prevent\n // accidentally locking out the job entirely.\n return Math.min(1000, Math.max(2, Math.floor(raw)));\n })(),\n patternReinforcementCategories: Array.isArray(cfg.patternReinforcementCategories)\n ? (cfg.patternReinforcementCategories as unknown[])\n .filter((v): v is string => typeof v === \"string\")\n .map((v) => v.trim())\n .filter((v) => v.length > 0)\n : [\"preference\", \"fact\", \"decision\"],\n // issue #687 PR 3/4: reinforcement recall boost config.\n reinforcementRecallBoostEnabled:\n coerceBool(cfg.reinforcementRecallBoostEnabled) ?? false,\n reinforcementRecallBoostWeight: (() => {\n if (cfg.reinforcementRecallBoostWeight === undefined) return 0.05;\n const n = coerceNumber(cfg.reinforcementRecallBoostWeight);\n if (n === undefined || !Number.isFinite(n) || n < 0 || n > 1) {\n throw new Error(\n `reinforcementRecallBoostWeight must be a number in [0, 1] (got ${JSON.stringify(cfg.reinforcementRecallBoostWeight)}).`,\n );\n }\n return n;\n })(),\n reinforcementRecallBoostMax: (() => {\n if (cfg.reinforcementRecallBoostMax === undefined) return 0.3;\n const n = coerceNumber(cfg.reinforcementRecallBoostMax);\n if (n === undefined || !Number.isFinite(n) || n < 0 || n > 1) {\n throw new Error(\n `reinforcementRecallBoostMax must be a number in [0, 1] (got ${JSON.stringify(cfg.reinforcementRecallBoostMax)}).`,\n );\n }\n return n;\n })(),\n // Async peer profile reasoner (issue #679 PR 2/5). Defaults to\n // `false` (opt-in) per Gotchas #30/#48 — least-privileged default.\n // `coerceBool` handles \"true\"/\"1\"/\"yes\"/\"on\" CLI strings (Gotcha\n // #36). Numeric thresholds clamp at zero (Gotcha #28 + #45 — 0\n // is a documented disable value for both, so the schema minimum\n // matches and we do NOT silently bump to 1).\n peerProfileReasonerEnabled:\n coerceBool(cfg.peerProfileReasonerEnabled) ?? false,\n // Cursor M on PR #736: use the routing alias `\"auto\"` rather than\n // a hardcoded model identifier. Matches the convention established\n // by sibling `semanticConsolidationModel`. Operators can still\n // override via config; the value is logged for telemetry only.\n peerProfileReasonerModel:\n typeof cfg.peerProfileReasonerModel === \"string\" &&\n cfg.peerProfileReasonerModel.trim().length > 0\n ? cfg.peerProfileReasonerModel.trim()\n : \"auto\",\n // Cursor L on PR #736: numeric config keys must coerce string CLI\n // values (Gotcha #28 — `--config peerProfileReasonerMaxFieldsPerRun=2`\n // arrives as the string \"2\"). Pre-fix `typeof === \"number\"`\n // rejected string inputs and silently fell back to defaults. The\n // shared `coerceNonNegativeInt` helper accepts both forms, throws\n // on invalid input (Gotcha #51 — reject rather than silently\n // default), and falls back to the documented default when the\n // key is absent. 0 is a valid documented disable value here, so\n // the helper does NOT bump to 1.\n peerProfileReasonerMinInteractions: coerceNonNegativeInt(\n cfg.peerProfileReasonerMinInteractions,\n 5,\n \"peerProfileReasonerMinInteractions\",\n ),\n peerProfileReasonerMaxFieldsPerRun: coerceNonNegativeInt(\n cfg.peerProfileReasonerMaxFieldsPerRun,\n 8,\n \"peerProfileReasonerMaxFieldsPerRun\",\n ),\n // Peer profile recall injection (issue #679 PR 3/5). Default-off\n // per Gotcha #30/#48 (least-privileged default, new feature gate).\n // `coerceBool` handles CLI string forms \"true\"/\"1\"/\"yes\"/\"on\"\n // (Gotcha #36). `coerceNonNegativeInt` handles string CLI values\n // (Gotcha #28) and documents 0 as the disable value (Gotcha #45 —\n // schema minimum must also be 0 so they stay consistent).\n peerProfileRecallEnabled:\n coerceBool(cfg.peerProfileRecallEnabled) ?? false,\n peerProfileRecallMaxFields: coerceNonNegativeInt(\n cfg.peerProfileRecallMaxFields,\n 5,\n \"peerProfileRecallMaxFields\",\n ),\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 : localLlmApiKeyEnv === undefined\n ? undefined\n : readEnvVar(localLlmApiKeyEnv),\n localLlmApiKeyEnv,\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 parseBoundedIntegerMs(cfg.localLlmTimeoutMs, 180_000, 1, 86_400_000),\n localLlmMaxContext:\n parseOptionalIntegerAtLeast(cfg.localLlmMaxContext, 1024, \"localLlmMaxContext\"),\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 extractionSourceGroundingEnabled: coerceBool(cfg.extractionSourceGroundingEnabled) !== 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 extractionTelemetryPrefilterEnabled:\n coerceBool(cfg.extractionTelemetryPrefilterEnabled) !== false,\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 scope classification (rule 30 gate): \"global\" facts promote\n // to the shared namespace. Default true.\n extractionScopeClassificationEnabled:\n coerceBool(cfg.extractionScopeClassificationEnabled) !== false,\n ...parseSubjectRuntimeConfig(cfg),\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; `coerceBool` accepts CLI-style strings (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 // Extraction faithfulness gate (issue #1576) + model-lab pointer\n // `extractionFaithfulnessBaseUrl` (issue #1585), and the correction-intent\n // model-lab pointer (issue #1581 / #1585). Parsed in faithfulness-config.ts\n // (extracted from this god file so the block can grow without tripping the\n // ratchet). Defaults preserve the byte-identical pre-feature pipeline\n // (rule 39); invalid values reject (rule 51 / #1634).\n ...parseFaithfulnessGateConfig(cfg),\n ...parseCorrectionIntentConfig(cfg),\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 // Issue #678 PR 2/4: dreams.phases.rem.minIntervalMs WINS when set.\n consolidationMinIntervalMs: dreamsRem.minIntervalMs,\n // QMD maintenance (debounced singleflight)\n qmdMaintenanceEnabled: cfg.qmdMaintenanceEnabled !== false,\n qmdMaintenanceDebounceMs:\n typeof cfg.qmdMaintenanceDebounceMs === \"number\" ? cfg.qmdMaintenanceDebounceMs : 30_000,\n maintenanceNamespaceFanoutEnabled,\n maintenanceMaxNamespacesPerCycle,\n maintenanceIncludeProjectNamespaces,\n maintenanceIncludeBranchNamespaces,\n maintenanceIncludeTeamProjectNamespaces,\n maintenanceNamespaceLockStaleMs,\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 // Ollama thinking suppression dialect (issue #1996): reasoning_effort value\n // for THINKING_SUPPRESSED_OPERATIONS on the ollama backend. Default \"none\"\n // (think off). \"\" disables injection. Invalid values fall back to \"none\"\n // rather than reaching Ollama, which 400s on unknown efforts.\n localLlmReasoningEffort:\n typeof cfg.localLlmReasoningEffort === \"string\" &&\n [\"\", \"none\", \"low\", \"medium\", \"high\", \"max\"].includes(cfg.localLlmReasoningEffort)\n ? cfg.localLlmReasoningEffort\n : \"none\",\n localLlmThinkingThresholdChars: (() => {\n const threshold = coerceNumber(cfg.localLlmThinkingThresholdChars);\n return threshold !== undefined && Number.isInteger(threshold) && threshold >= 0\n ? threshold\n : 3_000;\n })(),\n // Extraction retry/backoff + circuit breaker (extraction hot-loop hardening)\n extractionRetryEnabled: coerceBooleanLike(cfg.extractionRetryEnabled) ?? true,\n extractionRetryScheduleMs:\n Array.isArray(cfg.extractionRetryScheduleMs) &&\n cfg.extractionRetryScheduleMs.length > 0 &&\n cfg.extractionRetryScheduleMs.every((n) => typeof n === \"number\" && Number.isFinite(n) && n > 0)\n ? (cfg.extractionRetryScheduleMs as number[])\n : [60_000, 300_000, 1_800_000, 7_200_000],\n extractionRetryMaxBackoffMs:\n typeof cfg.extractionRetryMaxBackoffMs === \"number\" && cfg.extractionRetryMaxBackoffMs > 0\n ? cfg.extractionRetryMaxBackoffMs : 21_600_000,\n extractionRetryJitterRatio:\n typeof cfg.extractionRetryJitterRatio === \"number\" &&\n cfg.extractionRetryJitterRatio >= 0 && cfg.extractionRetryJitterRatio <= 1\n ? cfg.extractionRetryJitterRatio : 0.2,\n extractionParseEmptyMaxAttempts:\n typeof cfg.extractionParseEmptyMaxAttempts === \"number\" &&\n Number.isInteger(cfg.extractionParseEmptyMaxAttempts) && cfg.extractionParseEmptyMaxAttempts > 0\n ? cfg.extractionParseEmptyMaxAttempts : 3,\n extractionBreakerFailureThreshold:\n typeof cfg.extractionBreakerFailureThreshold === \"number\" &&\n Number.isInteger(cfg.extractionBreakerFailureThreshold) && cfg.extractionBreakerFailureThreshold > 0\n ? cfg.extractionBreakerFailureThreshold : 5,\n extractionBreakerCooldownMs:\n typeof cfg.extractionBreakerCooldownMs === \"number\" && cfg.extractionBreakerCooldownMs >= 0\n ? cfg.extractionBreakerCooldownMs : 300_000,\n extractionBreakerAuthCooldownMs:\n typeof cfg.extractionBreakerAuthCooldownMs === \"number\" && cfg.extractionBreakerAuthCooldownMs >= 0\n ? cfg.extractionBreakerAuthCooldownMs : 1_800_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 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 taskModelChain,\n\n // v3.0 namespaces (default off)\n namespacesEnabled: cfg.namespacesEnabled === true,\n // Namespace catalog (issue #1499): default ON, but only does anything when\n // namespacesEnabled is also true (the catalog is inert otherwise). Operators\n // opt out with namespaceCatalogEnabled: false. Boolean-like opt-outs from\n // CLI/env/JSON (\"false\", \"0\", \"no\", \"off\") are honored (CLAUDE.md rule #36);\n // a PRESENT but unrecognized value (\"flase\", 2) is REJECTED rather than\n // silently defaulting to enabled (CLAUDE.md rule #51); default to enabled\n // only when the value is absent.\n namespaceCatalogEnabled: resolveNamespaceCatalogEnabled(cfg.namespaceCatalogEnabled, rawOperatorConfig, runtimeSet),\n // Namespace catalog touch-path performance knobs (issue #1903). Numerics use\n // resolveNonNegativeIntegerConfig so 0 is an accepted disable switch; a\n // present-but-invalid value (negative/non-integer) is REJECTED (rule #51).\n namespacesCatalogCompactBytes: resolveNonNegativeIntegerConfig(\n cfg.namespacesCatalogCompactBytes,\n 16 * 1024 * 1024,\n \"namespacesCatalogCompactBytes\",\n ),\n namespacesCatalogReadTouchCoalesceMs: resolveNonNegativeIntegerConfig(\n cfg.namespacesCatalogReadTouchCoalesceMs,\n 60_000,\n \"namespacesCatalogReadTouchCoalesceMs\",\n ),\n namespacesCatalogWriteTouchCoalesceMs: resolveNonNegativeIntegerConfig(\n cfg.namespacesCatalogWriteTouchCoalesceMs,\n 1_000,\n \"namespacesCatalogWriteTouchCoalesceMs\",\n ),\n namespacesCatalogTouchStateWrites: resolveBooleanConfig(\n cfg.namespacesCatalogTouchStateWrites,\n false,\n \"namespacesCatalogTouchStateWrites\",\n ),\n // NOTE: namespace identifiers are intentionally NOT sanitized here — the\n // codebase rejects unsafe namespaces at the point of use (see\n // codex-materialize-runner and NamespaceStorageRouter / resolveNamespaceDir),\n // so a \"../x\" value is surfaced as an explicit error rather than silently\n // rewritten. Containment is enforced at the filesystem sinks.\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 scopeProfiles,\n defaultScopeProfile,\n teams,\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 // CLI values arrive as strings (`--config sharedContextAllowBindingAuthority=true`),\n // so a strict `=== true` silently keeps the feature off. Default stays false.\n sharedContextAllowBindingAuthority:\n coerceBool(cfg.sharedContextAllowBindingAuthority, \"sharedContextAllowBindingAuthority\") ?? false,\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 recallProfileMaxRatio: parseRecallProfileMaxRatio(cfg.recallProfileMaxRatio),\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 // Issue #1582: off by default — handles are byte-additive at injection time.\n recallMemoryHandles: coerceBool(cfg.recallMemoryHandles) ?? false,\n recallHandleSnapshotDepth:\n typeof cfg.recallHandleSnapshotDepth === \"number\" &&\n Number.isFinite(cfg.recallHandleSnapshotDepth)\n ? Math.max(1, Math.min(50, Math.floor(cfg.recallHandleSnapshotDepth)))\n : 5,\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 // CJK/Thai lexical segmentation (issue #2187) — default on; string forms\n // from CLI `--config` are coerced like neighboring boolean flags.\n oramaCjkSegmentation: coerceBooleanLike(cfg.oramaCjkSegmentation) ?? true,\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 ...parseWritePathDedupConfig(cfg),\n ...parseSemanticMergeConfig(cfg),\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 // Lifecycle policy engine (issue #686 PR 3/6 — flipped default to\n // `true`). Tier infrastructure (`tier-routing.ts`,\n // `tier-migration.ts`, separate cold QMD collection) has shipped\n // for several releases. Default-on lets the year-2 retention\n // story land for every install instead of staying gated behind\n // an opt-in flag the typical operator never reaches. Operators\n // who need pre-#686 behavior (no automatic hot↔cold migration,\n // no recall-time stale filtering) can set\n // `lifecyclePolicyEnabled: false` explicitly. Coerce string/number\n // boolean-likes (e.g. CLI `--config lifecyclePolicyEnabled=false`)\n // before applying the default — otherwise an explicit false-ish\n // input falls through and silently re-enables the policy.\n // Issue #678 PR 2/4: dreams.phases.lightSleep.* WINS over legacy keys.\n // The runtime gate (orchestrator's `runLifecyclePolicyPass`) reads\n // these legacy fields, so propagate the precedence here.\n lifecyclePolicyEnabled: dreamsLightSleep.enabled,\n lifecycleFilterStaleEnabled: dreamsLightSleep.filterStaleEnabled,\n lifecyclePromoteHeatThreshold: dreamsLightSleep.promoteHeatThreshold,\n lifecycleStaleDecayThreshold: dreamsLightSleep.staleDecayThreshold,\n lifecycleArchiveDecayThreshold: dreamsLightSleep.archiveDecayThreshold,\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 // Mirror the *resolved* lifecyclePolicyEnabled default (not the\n // raw input) — otherwise omitting both flags returns `false` for\n // metrics even though the policy is enabled by default since\n // #686 PR 3/6.\n // Issue #678 PR 2/4: mirror the resolved dreams light-sleep enabled flag\n // (which already incorporates dreams.phases precedence + legacy fallback).\n lifecycleMetricsEnabled:\n coerceBooleanLike(cfg.lifecycleMetricsEnabled) ?? dreamsLightSleep.enabled,\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 proactiveExtractionSkipWhenLocalLlmBusy: ((): boolean => {\n const raw = cfg.proactiveExtractionSkipWhenLocalLlmBusy;\n if (raw === undefined || raw === null) return true;\n const value = coerceBooleanLike(raw, \"proactiveExtractionSkipWhenLocalLlmBusy\");\n if (value === undefined) {\n throw new Error(\n `proactiveExtractionSkipWhenLocalLlmBusy must be boolean-like (true|false|1|0|yes|no|on|off); got ${JSON.stringify(raw)}`,\n );\n }\n return value;\n })(),\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 ...parseActiveContextFields(cfg),\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 // All recallPlanner boolean gates coerce boolean-like strings so CLI/env\n // surfaces (`--config recallPlanner*=true|false`) behave correctly — the\n // shadow-mode/telemetry/enable flags are documented rollout switches and\n // must not silently ignore string values (gotcha #36, #1428 review).\n recallPlannerEnabled: coerceBooleanLike(cfg.recallPlannerEnabled) ?? true,\n // Issue #1367 / Option C: LLM-based recall planning is opt-in so the\n // default recall path stays heuristic (no added latency / LLM call unless\n // the operator asks for it — gotcha #30). Coerce boolean-like strings so\n // CLI/env surfaces (`--config recallPlannerLlmEnabled=true`) actually\n // enable it (gotcha #36); defaults off.\n recallPlannerLlmEnabled: coerceBooleanLike(cfg.recallPlannerLlmEnabled) ?? false,\n // Gateway-routed via FallbackLlmClient (qualifiedPlannerModel drops bare ids).\n // Drop the bare schema-default model in gateway mode too so the resolved value\n // reflects the actual gateway route (task-chain primary) instead of \"gpt-5.5\".\n recallPlannerModel:\n gatewayTaskModel(\n typeof cfg.recallPlannerModel === \"string\" && cfg.recallPlannerModel.trim().length > 0\n ? cfg.recallPlannerModel.trim()\n : \"\",\n ) || taskModelFallback,\n recallPlannerTimeoutMs:\n typeof cfg.recallPlannerTimeoutMs === \"number\" ? cfg.recallPlannerTimeoutMs : 1500,\n recallPlannerUseResponsesApi: coerceBooleanLike(cfg.recallPlannerUseResponsesApi) ?? true,\n recallPlannerMaxPromptChars:\n typeof cfg.recallPlannerMaxPromptChars === \"number\" ? cfg.recallPlannerMaxPromptChars : 4000,\n recallPlannerMaxMemoryHints:\n typeof cfg.recallPlannerMaxMemoryHints === \"number\" ? cfg.recallPlannerMaxMemoryHints : 24,\n recallPlannerShadowMode: coerceBooleanLike(cfg.recallPlannerShadowMode) ?? false,\n recallPlannerTelemetryEnabled: coerceBooleanLike(cfg.recallPlannerTelemetryEnabled) ?? true,\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 graphPathScoring: parseGraphPathScoringConfig(\n cfg.graphPathScoring as Record<string, unknown> | undefined,\n ),\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 // Incremental GraphIndex edge cache (issue #1904). Default on: single-writer\n // edge appends are pushed into the warm cache in place (size-revalidated for\n // cross-process coherence) instead of nulling + re-reading the 6 MB edge\n // file. coerceBool handles string forms; set false to null the cache per write.\n graphEdgeCacheIncrementalEnabled: coerceBool(cfg.graphEdgeCacheIncrementalEnabled) ?? true,\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 // Issue #681 PR 2/3 — graph-edge confidence decay maintenance.\n // Boolean coerced via shared helper (gotcha #36: string \"false\" is truthy).\n graphEdgeDecayEnabled: coerceBooleanLike(cfg.graphEdgeDecayEnabled) ?? false,\n graphEdgeDecayCadenceMs:\n typeof cfg.graphEdgeDecayCadenceMs === \"number\" && Number.isFinite(cfg.graphEdgeDecayCadenceMs)\n ? Math.max(60_000, Math.floor(cfg.graphEdgeDecayCadenceMs))\n : 7 * 24 * 60 * 60 * 1000,\n graphEdgeDecayWindowMs:\n typeof cfg.graphEdgeDecayWindowMs === \"number\" && Number.isFinite(cfg.graphEdgeDecayWindowMs)\n ? Math.max(60_000, Math.floor(cfg.graphEdgeDecayWindowMs))\n : 90 * 24 * 60 * 60 * 1000,\n graphEdgeDecayPerWindow:\n typeof cfg.graphEdgeDecayPerWindow === \"number\" && Number.isFinite(cfg.graphEdgeDecayPerWindow)\n ? Math.max(0, Math.min(1, cfg.graphEdgeDecayPerWindow))\n : 0.1,\n graphEdgeDecayFloor:\n typeof cfg.graphEdgeDecayFloor === \"number\" && Number.isFinite(cfg.graphEdgeDecayFloor)\n ? Math.max(0, Math.min(1, cfg.graphEdgeDecayFloor))\n : 0.1,\n graphEdgeDecayVisibilityThreshold:\n typeof cfg.graphEdgeDecayVisibilityThreshold === \"number\" &&\n Number.isFinite(cfg.graphEdgeDecayVisibilityThreshold)\n ? Math.max(0, Math.min(1, cfg.graphEdgeDecayVisibilityThreshold))\n : 0.2,\n // Issue #2119 — maintenance-scheduled memory-projection rebuild.\n // Enabled-by-default (gotcha #36 coercion); interval via the strict shared parser (strings coerced, non-integer/sub-60s rejected — pattern #39).\n projectionRebuildEnabled: coerceBooleanLike(cfg.projectionRebuildEnabled) ?? true,\n projectionRebuildIntervalMs: parseIntegerAtLeast(\n cfg.projectionRebuildIntervalMs, 6 * 60 * 60 * 1000, 60_000, \"projectionRebuildIntervalMs\"),\n ...parseBoundedJsonlStateConfig(cfg, parseIntegerAtLeast),\n // Issue #681 PR 3/3 — confidence-aware traversal. Floor clamps to [0,1]; a\n // documented 0 iterations disables PageRank refinement (BFS scores pass through).\n graphTraversalConfidenceFloor:\n typeof cfg.graphTraversalConfidenceFloor === \"number\" &&\n Number.isFinite(cfg.graphTraversalConfidenceFloor)\n ? Math.min(1, Math.max(0, cfg.graphTraversalConfidenceFloor))\n : 0.2,\n graphTraversalPageRankIterations:\n typeof cfg.graphTraversalPageRankIterations === \"number\" &&\n Number.isFinite(cfg.graphTraversalPageRankIterations) &&\n cfg.graphTraversalPageRankIterations >= 0\n ? Math.floor(cfg.graphTraversalPageRankIterations)\n : 8,\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 explicitCueRecallEnabled: coerceBool(cfg.explicitCueRecallEnabled) === true,\n explicitCueRecallMaxChars:\n coerceNumber(cfg.explicitCueRecallMaxChars) !== undefined\n ? Math.max(0, Math.floor(coerceNumber(cfg.explicitCueRecallMaxChars)!))\n : 2400,\n explicitCueRecallMaxReferences:\n coerceNumber(cfg.explicitCueRecallMaxReferences) !== undefined\n ? Math.max(0, Math.floor(coerceNumber(cfg.explicitCueRecallMaxReferences)!))\n : 24,\n targetedFactRecallEnabled: coerceBool(cfg.targetedFactRecallEnabled) === true,\n targetedFactRecallMaxChars:\n parseIntegerAtLeast(cfg.targetedFactRecallMaxChars, 2400, 0, \"targetedFactRecallMaxChars\"),\n targetedFactRecallMaxResults:\n parseIntegerAtLeast(cfg.targetedFactRecallMaxResults, 48, 0, \"targetedFactRecallMaxResults\"),\n targetedFactRecallScanWindowTurns:\n parseIntegerAtLeast(cfg.targetedFactRecallScanWindowTurns, 8, 1, \"targetedFactRecallScanWindowTurns\"),\n targetedFactRecallScanWindowTokens:\n parseIntegerAtLeast(cfg.targetedFactRecallScanWindowTokens, 12_000, 1, \"targetedFactRecallScanWindowTokens\"),\n focusedListRecallEnabled: coerceBool(cfg.focusedListRecallEnabled) === true,\n focusedListRecallMaxChars:\n parseIntegerAtLeast(cfg.focusedListRecallMaxChars, 2600, 0, \"focusedListRecallMaxChars\"),\n focusedListRecallMaxResults:\n parseIntegerAtLeast(cfg.focusedListRecallMaxResults, 40, 0, \"focusedListRecallMaxResults\"),\n focusedListRecallScanWindowTurns:\n parseIntegerAtLeast(cfg.focusedListRecallScanWindowTurns, 64, 1, \"focusedListRecallScanWindowTurns\"),\n focusedListRecallScanWindowTokens:\n parseIntegerAtLeast(cfg.focusedListRecallScanWindowTokens, 14_000, 1, \"focusedListRecallScanWindowTokens\"),\n responseGuidanceRecallEnabled:\n coerceBool(cfg.responseGuidanceRecallEnabled) === true,\n responseGuidanceRecallMaxChars:\n parseIntegerAtLeast(cfg.responseGuidanceRecallMaxChars, 2400, 0, \"responseGuidanceRecallMaxChars\"),\n responseGuidanceRecallMaxResults:\n parseIntegerAtLeast(cfg.responseGuidanceRecallMaxResults, 48, 0, \"responseGuidanceRecallMaxResults\"),\n responseGuidanceRecallScanWindowTurns:\n parseIntegerAtLeast(cfg.responseGuidanceRecallScanWindowTurns, 64, 1, \"responseGuidanceRecallScanWindowTurns\"),\n responseGuidanceRecallScanWindowTokens:\n parseIntegerAtLeast(cfg.responseGuidanceRecallScanWindowTokens, 16_000, 1, \"responseGuidanceRecallScanWindowTokens\"),\n eventOrderRecallEnabled: coerceBool(cfg.eventOrderRecallEnabled) === true,\n eventOrderRecallMaxChars:\n parseIntegerAtLeast(cfg.eventOrderRecallMaxChars, 2400, 0, \"eventOrderRecallMaxChars\"),\n eventOrderRecallMaxResults:\n parseIntegerAtLeast(cfg.eventOrderRecallMaxResults, 24, 0, \"eventOrderRecallMaxResults\"),\n eventOrderRecallScanWindowTurns:\n parseIntegerAtLeast(cfg.eventOrderRecallScanWindowTurns, 12, 1, \"eventOrderRecallScanWindowTurns\"),\n eventOrderRecallScanWindowTokens:\n parseIntegerAtLeast(cfg.eventOrderRecallScanWindowTokens, 24_000, 1, \"eventOrderRecallScanWindowTokens\"),\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 lcmTelemetryPrefilterEnabled:\n coerceBool(cfg.lcmTelemetryPrefilterEnabled) !== false,\n lcmArchiveRetentionDays:\n typeof cfg.lcmArchiveRetentionDays === \"number\"\n ? Math.max(1, Math.floor(cfg.lcmArchiveRetentionDays))\n : 90,\n lcmObserveConcurrency:\n parseIntegerAtLeast(cfg.lcmObserveConcurrency, 1, 1, \"lcmObserveConcurrency\"),\n messagePartsEnabled: coerceBooleanLike(cfg.messagePartsEnabled) === true,\n messagePartsRecallMaxResults:\n typeof cfg.messagePartsRecallMaxResults === \"number\"\n ? Math.max(0, Math.floor(cfg.messagePartsRecallMaxResults))\n : 6,\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 // Live connectors (issue #683 PR 2/N).\n //\n // Per CLAUDE.md gotcha #30 and #48, every concrete connector ships\n // disabled-by-default and the parser MUST reject malformed top-level\n // shapes loudly (gotcha #51) rather than silently producing an empty\n // object.\n //\n // We do NOT validate credential strings here — the connector module\n // re-validates on every sync pass via `validateGoogleDriveConfig`.\n // That keeps secret-store-driven values (which may legitimately be\n // empty until the operator runs setup) round-trippable through the\n // config layer without crashing the orchestrator at boot.\n connectors: (() => {\n if (\n cfg.connectors !== undefined &&\n (cfg.connectors === null ||\n typeof cfg.connectors !== \"object\" ||\n Array.isArray(cfg.connectors))\n ) {\n throw new Error(\n `connectors must be an object (got ${JSON.stringify(cfg.connectors)}). ` +\n `Use connectors: {} to opt out of every live connector.`,\n );\n }\n const rawConnectors =\n cfg.connectors && typeof cfg.connectors === \"object\" && !Array.isArray(cfg.connectors)\n ? (cfg.connectors as Record<string, unknown>)\n : {};\n // googleDrive (#683 PR 2/N)\n if (\n rawConnectors.googleDrive !== undefined &&\n (rawConnectors.googleDrive === null ||\n typeof rawConnectors.googleDrive !== \"object\" ||\n Array.isArray(rawConnectors.googleDrive))\n ) {\n throw new Error(\n `connectors.googleDrive must be an object (got ${JSON.stringify(rawConnectors.googleDrive)}).`,\n );\n }\n const rawDrive =\n rawConnectors.googleDrive &&\n typeof rawConnectors.googleDrive === \"object\" &&\n !Array.isArray(rawConnectors.googleDrive)\n ? (rawConnectors.googleDrive as Record<string, unknown>)\n : {};\n const driveEnabled = coerceBool(rawDrive.enabled) === true;\n const driveClientId =\n typeof rawDrive.clientId === \"string\" ? rawDrive.clientId : \"\";\n const driveClientSecret =\n typeof rawDrive[CLIENT_SECRET_FIELD] === \"string\"\n ? rawDrive[CLIENT_SECRET_FIELD]\n : \"\";\n const driveRefreshToken =\n typeof rawDrive[REFRESH_TOKEN_FIELD] === \"string\"\n ? rawDrive[REFRESH_TOKEN_FIELD]\n : \"\";\n const drivePollCoerced = coerceNumber(rawDrive.pollIntervalMs);\n let drivePollIntervalMs = 300_000;\n if (drivePollCoerced !== undefined) {\n if (\n !Number.isFinite(drivePollCoerced) ||\n !Number.isInteger(drivePollCoerced) ||\n drivePollCoerced < 1_000 ||\n drivePollCoerced > 86_400_000\n ) {\n throw new Error(\n `connectors.googleDrive.pollIntervalMs must be an integer in [1000, 86400000] ms (got ${JSON.stringify(rawDrive.pollIntervalMs)})`,\n );\n }\n drivePollIntervalMs = drivePollCoerced;\n }\n let driveFolderIds: string[] = [];\n if (rawDrive.folderIds !== undefined) {\n if (!Array.isArray(rawDrive.folderIds)) {\n throw new Error(\n `connectors.googleDrive.folderIds must be an array of strings (got ${typeof rawDrive.folderIds})`,\n );\n }\n const seen = new Set<string>();\n for (const value of rawDrive.folderIds) {\n if (typeof value !== \"string\") {\n throw new Error(\n `connectors.googleDrive.folderIds entries must be strings; found ${typeof value}`,\n );\n }\n const trimmed = value.trim();\n if (trimmed.length === 0) continue;\n if (seen.has(trimmed)) continue;\n seen.add(trimmed);\n driveFolderIds.push(trimmed);\n }\n }\n // notion (#683 PR 3/N)\n if (\n rawConnectors.notion !== undefined &&\n (rawConnectors.notion === null ||\n typeof rawConnectors.notion !== \"object\" ||\n Array.isArray(rawConnectors.notion))\n ) {\n throw new Error(\n `connectors.notion must be an object (got ${JSON.stringify(rawConnectors.notion)}).`,\n );\n }\n const rawNotion =\n rawConnectors.notion &&\n typeof rawConnectors.notion === \"object\" &&\n !Array.isArray(rawConnectors.notion)\n ? (rawConnectors.notion as Record<string, unknown>)\n : {};\n const notionEnabled = coerceBool(rawNotion.enabled) === true;\n const notionToken =\n typeof rawNotion.token === \"string\" ? rawNotion.token : \"\";\n const notionPollCoerced = coerceNumber(rawNotion.pollIntervalMs);\n let notionPollIntervalMs = 300_000;\n if (notionPollCoerced !== undefined) {\n if (\n !Number.isFinite(notionPollCoerced) ||\n !Number.isInteger(notionPollCoerced) ||\n notionPollCoerced < 1_000 ||\n notionPollCoerced > 86_400_000\n ) {\n throw new Error(\n `connectors.notion.pollIntervalMs must be an integer in [1000, 86400000] ms (got ${JSON.stringify(rawNotion.pollIntervalMs)})`,\n );\n }\n notionPollIntervalMs = notionPollCoerced;\n }\n let notionDatabaseIds: string[] = [];\n if (rawNotion.databaseIds !== undefined) {\n if (!Array.isArray(rawNotion.databaseIds)) {\n throw new Error(\n `connectors.notion.databaseIds must be an array of strings (got ${typeof rawNotion.databaseIds})`,\n );\n }\n const seen = new Set<string>();\n for (const value of rawNotion.databaseIds) {\n if (typeof value !== \"string\") {\n throw new Error(\n `connectors.notion.databaseIds entries must be strings; found ${typeof value}`,\n );\n }\n const trimmed = value.trim();\n if (trimmed.length === 0) continue;\n if (seen.has(trimmed)) continue;\n seen.add(trimmed);\n notionDatabaseIds.push(trimmed);\n }\n }\n // gmail (#683 PR 4/6)\n if (\n rawConnectors.gmail !== undefined &&\n (rawConnectors.gmail === null ||\n typeof rawConnectors.gmail !== \"object\" ||\n Array.isArray(rawConnectors.gmail))\n ) {\n throw new Error(\n `connectors.gmail must be an object (got ${JSON.stringify(rawConnectors.gmail)}).`,\n );\n }\n const rawGmail =\n rawConnectors.gmail &&\n typeof rawConnectors.gmail === \"object\" &&\n !Array.isArray(rawConnectors.gmail)\n ? (rawConnectors.gmail as Record<string, unknown>)\n : {};\n const gmailEnabled = coerceBool(rawGmail.enabled) === true;\n const gmailClientId =\n typeof rawGmail.clientId === \"string\" ? rawGmail.clientId : \"\";\n const gmailClientSecret =\n typeof rawGmail[CLIENT_SECRET_FIELD] === \"string\"\n ? rawGmail[CLIENT_SECRET_FIELD]\n : \"\";\n const gmailRefreshToken =\n typeof rawGmail[REFRESH_TOKEN_FIELD] === \"string\"\n ? rawGmail[REFRESH_TOKEN_FIELD]\n : \"\";\n const gmailUserId =\n typeof rawGmail.userId === \"string\" && rawGmail.userId.trim().length > 0\n ? rawGmail.userId.trim()\n : \"me\";\n const gmailQuery =\n typeof rawGmail.query === \"string\" ? rawGmail.query : \"in:inbox\";\n const gmailPollCoerced = coerceNumber(rawGmail.pollIntervalMs);\n let gmailPollIntervalMs = 300_000;\n if (rawGmail.pollIntervalMs !== undefined) {\n // CLAUDE.md gotcha #51: reject invalid values explicitly rather than\n // silently coercing to a default. Non-numeric strings, NaN, and\n // ±Infinity all cause coerceNumber to return undefined — treat that as\n // a configuration error rather than a quiet fallback.\n if (gmailPollCoerced === undefined) {\n throw new Error(\n `connectors.gmail.pollIntervalMs must be a finite number; got ${JSON.stringify(rawGmail.pollIntervalMs)}`,\n );\n }\n if (gmailPollCoerced <= 0) {\n throw new Error(\n `connectors.gmail.pollIntervalMs must be positive; got ${JSON.stringify(rawGmail.pollIntervalMs)}`,\n );\n }\n if (\n !Number.isInteger(gmailPollCoerced) ||\n gmailPollCoerced < 1_000 ||\n gmailPollCoerced > 86_400_000\n ) {\n throw new Error(\n `connectors.gmail.pollIntervalMs must be an integer in [1000, 86400000] ms (got ${JSON.stringify(rawGmail.pollIntervalMs)})`,\n );\n }\n gmailPollIntervalMs = gmailPollCoerced;\n }\n\n // github (#683 PR 5/6)\n if (\n rawConnectors.github !== undefined &&\n (rawConnectors.github === null ||\n typeof rawConnectors.github !== \"object\" ||\n Array.isArray(rawConnectors.github))\n ) {\n throw new Error(\n `connectors.github must be an object (got ${JSON.stringify(rawConnectors.github)}).`,\n );\n }\n const rawGitHub =\n rawConnectors.github &&\n typeof rawConnectors.github === \"object\" &&\n !Array.isArray(rawConnectors.github)\n ? (rawConnectors.github as Record<string, unknown>)\n : {};\n const githubEnabled = coerceBool(rawGitHub.enabled) === true;\n const githubToken =\n typeof rawGitHub.token === \"string\" ? rawGitHub.token : \"\";\n const githubUserLogin =\n typeof rawGitHub.userLogin === \"string\" ? rawGitHub.userLogin : \"\";\n const githubPollCoerced = coerceNumber(rawGitHub.pollIntervalMs);\n let githubPollIntervalMs = 300_000;\n if (githubPollCoerced !== undefined) {\n if (\n !Number.isFinite(githubPollCoerced) ||\n !Number.isInteger(githubPollCoerced) ||\n githubPollCoerced < 1_000 ||\n githubPollCoerced > 86_400_000\n ) {\n throw new Error(\n `connectors.github.pollIntervalMs must be an integer in [1000, 86400000] ms (got ${JSON.stringify(rawGitHub.pollIntervalMs)})`,\n );\n }\n githubPollIntervalMs = githubPollCoerced;\n }\n let githubRepos: string[] = [];\n if (rawGitHub.repos !== undefined) {\n if (!Array.isArray(rawGitHub.repos)) {\n throw new Error(\n `connectors.github.repos must be an array of strings (got ${typeof rawGitHub.repos})`,\n );\n }\n const seen = new Set<string>();\n for (const value of rawGitHub.repos) {\n if (typeof value !== \"string\") {\n throw new Error(\n `connectors.github.repos entries must be strings; found ${typeof value}`,\n );\n }\n const trimmed = value.trim();\n if (trimmed.length === 0) continue;\n if (seen.has(trimmed)) continue;\n seen.add(trimmed);\n githubRepos.push(trimmed);\n }\n }\n const githubIncludeDiscussions = coerceBool(rawGitHub.includeDiscussions) === true;\n return {\n googleDrive: {\n enabled: driveEnabled,\n clientId: driveClientId,\n [CLIENT_SECRET_FIELD]: driveClientSecret,\n [REFRESH_TOKEN_FIELD]: driveRefreshToken,\n pollIntervalMs: drivePollIntervalMs,\n folderIds: driveFolderIds,\n },\n notion: {\n enabled: notionEnabled,\n token: notionToken,\n databaseIds: notionDatabaseIds,\n pollIntervalMs: notionPollIntervalMs,\n },\n gmail: {\n enabled: gmailEnabled,\n clientId: gmailClientId,\n [CLIENT_SECRET_FIELD]: gmailClientSecret,\n [REFRESH_TOKEN_FIELD]: gmailRefreshToken,\n userId: gmailUserId,\n query: gmailQuery,\n pollIntervalMs: gmailPollIntervalMs,\n },\n github: {\n enabled: githubEnabled,\n token: githubToken,\n userLogin: githubUserLogin,\n repos: githubRepos,\n pollIntervalMs: githubPollIntervalMs,\n includeDiscussions: githubIncludeDiscussions,\n },\n };\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: coerceBool(cfg.codexMaterializeMemories) ?? true,\n codexMaterializeNamespace:\n typeof cfg.codexMaterializeNamespace === \"string\" && cfg.codexMaterializeNamespace.trim().length > 0\n ? cfg.codexMaterializeNamespace.trim()\n : \"auto\",\n codexMaterializeMaxSummaryTokens: parseIntegerAtLeast(\n cfg.codexMaterializeMaxSummaryTokens,\n 4500,\n 0,\n \"codexMaterializeMaxSummaryTokens\",\n ),\n codexMaterializeRolloutRetentionDays: parseIntegerAtLeast(\n cfg.codexMaterializeRolloutRetentionDays,\n 30,\n 0,\n \"codexMaterializeRolloutRetentionDays\",\n ),\n codexMaterializeOnConsolidation: coerceBool(cfg.codexMaterializeOnConsolidation) ?? true,\n codexMaterializeOnSessionEnd: coerceBool(cfg.codexMaterializeOnSessionEnd) ?? true,\n // Codex CLI — marketplace integration (#418)\n codexMarketplaceEnabled: cfg.codexMarketplaceEnabled !== false, // default: true\n\n // Page-level versioning (issue #371). Issue #678 PR 2/4:\n // dreams.phases.deepSleep.* WINS over legacy keys.\n versioningEnabled: dreamsDeepSleep.enabled && dreamsDeepSleep.versioningEnabled,\n versioningMaxPerPage: dreamsDeepSleep.versioningMaxPerPage,\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 // Legacy MCP tool aliases opt-out (issue #1427). Config field wins; then\n // the REMNIC_/ENGRAM_ env var (gotcha #9); default true for back-compat.\n // Malformed values fail fast rather than silently defaulting (gotcha #51).\n emitLegacyTools: resolveEmitLegacyTools(cfg.emitLegacyTools, rawOperatorConfig, runtimeSet),\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 ? expandTildePath(cfg.memoryExtensionsRoot.trim())\n : \"\",\n\n // Offline sync excludes (#1786) — validated below (parseOfflineSyncExcludes\n // throws on non-array / non-string / empty entries and on invalid globs).\n offlineSyncExcludes: parseOfflineSyncExcludes(cfg.offlineSyncExcludes),\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\nfunction parseRecallProfileMaxRatio(value: unknown): number {\n if (value === undefined) return 0.3;\n const ratio = coerceNumber(value);\n if (ratio === undefined || ratio < 0 || ratio > 1) {\n throw new Error(\n `recallProfileMaxRatio must be a finite number in [0, 1]; got ${JSON.stringify(value)}`,\n );\n }\n return ratio;\n}\n\n/**\n * Cursor L on PR #736: numeric config keys must accept BOTH numbers\n * and CLI-string forms (`--config peerProfileReasonerMinInteractions=10`\n * arrives as the string `\"10\"` per CLAUDE.md Gotcha #28). Pre-fix\n * `typeof === \"number\"` rejected strings and silently fell back to the\n * default — operators thought their override applied.\n *\n * Behavior:\n * - `undefined` / `null` / missing → return `fallback`\n * - finite number ≥ 0 → return floor(value)\n * - string that parses to finite ≥ 0 → return floor(value)\n * - anything else (NaN, ±Infinity, negative, non-numeric string,\n * boolean, object) → throw an Error listing the offending key.\n *\n * Throwing matches Gotcha #51 — reject invalid input rather than\n * silently defaulting — and is consistent with how the surprise\n * knobs validate their inputs.\n */\nfunction coerceNonNegativeInt(\n value: unknown,\n fallback: number,\n keyName?: string,\n): number {\n if (value === undefined || value === null) return fallback;\n const coerced = coerceNumber(value);\n if (coerced === undefined || coerced < 0) {\n const label = keyName ? ` (${keyName})` : \"\";\n throw new Error(\n `config value${label} must be a non-negative finite number; got ${JSON.stringify(value)}`,\n );\n }\n return Math.floor(coerced);\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 ...(entry.forceGeneric === undefined\n ? {}\n : { forceGeneric: coerceBool(entry.forceGeneric) === true }),\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: \"explicit-cue\",\n enabled: coerceBool(cfg.explicitCueRecallEnabled) === true,\n maxChars:\n coerceNumber(cfg.explicitCueRecallMaxChars) !== undefined\n ? Math.max(0, Math.floor(coerceNumber(cfg.explicitCueRecallMaxChars)!))\n : 2400,\n maxResults:\n coerceNumber(cfg.explicitCueRecallMaxReferences) !== undefined\n ? Math.max(0, Math.floor(coerceNumber(cfg.explicitCueRecallMaxReferences)!))\n : 24,\n },\n {\n id: \"targeted-facts\",\n enabled: coerceBool(cfg.targetedFactRecallEnabled) === true,\n maxChars: parseIntegerAtLeast(cfg.targetedFactRecallMaxChars, 2400, 0, \"targetedFactRecallMaxChars\"),\n maxResults: parseIntegerAtLeast(cfg.targetedFactRecallMaxResults, 48, 0, \"targetedFactRecallMaxResults\"),\n maxTurns: parseIntegerAtLeast(cfg.targetedFactRecallScanWindowTurns, 8, 1, \"targetedFactRecallScanWindowTurns\"),\n maxTokens: parseIntegerAtLeast(cfg.targetedFactRecallScanWindowTokens, 12_000, 1, \"targetedFactRecallScanWindowTokens\"),\n },\n {\n id: \"focused-list\",\n enabled: coerceBool(cfg.focusedListRecallEnabled) === true,\n maxChars: parseIntegerAtLeast(cfg.focusedListRecallMaxChars, 2600, 0, \"focusedListRecallMaxChars\"),\n maxResults: parseIntegerAtLeast(cfg.focusedListRecallMaxResults, 40, 0, \"focusedListRecallMaxResults\"),\n maxTurns: parseIntegerAtLeast(cfg.focusedListRecallScanWindowTurns, 64, 1, \"focusedListRecallScanWindowTurns\"),\n maxTokens: parseIntegerAtLeast(cfg.focusedListRecallScanWindowTokens, 14_000, 1, \"focusedListRecallScanWindowTokens\"),\n },\n {\n id: \"response-guidance\",\n enabled: coerceBool(cfg.responseGuidanceRecallEnabled) === true,\n maxChars: parseIntegerAtLeast(cfg.responseGuidanceRecallMaxChars, 2400, 0, \"responseGuidanceRecallMaxChars\"),\n maxResults: parseIntegerAtLeast(cfg.responseGuidanceRecallMaxResults, 48, 0, \"responseGuidanceRecallMaxResults\"),\n maxTurns: parseIntegerAtLeast(cfg.responseGuidanceRecallScanWindowTurns, 64, 1, \"responseGuidanceRecallScanWindowTurns\"),\n maxTokens: parseIntegerAtLeast(cfg.responseGuidanceRecallScanWindowTokens, 16_000, 1, \"responseGuidanceRecallScanWindowTokens\"),\n },\n {\n id: \"event-order\",\n enabled: coerceBool(cfg.eventOrderRecallEnabled) === true,\n maxChars: parseIntegerAtLeast(cfg.eventOrderRecallMaxChars, 2400, 0, \"eventOrderRecallMaxChars\"),\n maxResults: parseIntegerAtLeast(cfg.eventOrderRecallMaxResults, 24, 0, \"eventOrderRecallMaxResults\"),\n maxTurns: parseIntegerAtLeast(cfg.eventOrderRecallScanWindowTurns, 12, 1, \"eventOrderRecallScanWindowTurns\"),\n maxTokens: parseIntegerAtLeast(cfg.eventOrderRecallScanWindowTokens, 24_000, 1, \"eventOrderRecallScanWindowTokens\"),\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: \"episodic-context\",\n enabled: cfg.episodicContextEnabled === true,\n maxResults: 2,\n maxTurns: 8,\n maxChars: 2400,\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 // Keep four characters per token as Latin-script headroom. Assemblers enforce\n // maxMemoryTokens with the shared script-aware estimator.\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/**\n * Parse the `trustScoreWeights` config value into a {@link TrustWeights}\n * object. Accepts a plain object of per-component numbers; non-finite or\n * out-of-`[0,1]` entries are dropped (the scorer falls back to defaults via\n * `resolveTrustWeights`). A non-object value yields `{}` → all defaults.\n * Rule 51: invalid weight rejected, never silently clamped to an extreme.\n */\nfunction parseTrustScoreWeights(value: unknown): TrustWeights {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return {};\n const src = value as Record<string, unknown>;\n const out: TrustWeights = {};\n const keys: Array<keyof TrustWeights> = [\n \"memoryWorth\",\n \"provenance\",\n \"faithfulness\",\n \"corroboration\",\n \"contradiction\",\n \"domainCalibration\",\n \"feedback\",\n \"recency\",\n ];\n for (const key of keys) {\n const raw = src[key as string];\n if (typeof raw !== \"number\" || !Number.isFinite(raw) || raw < 0 || raw > 1) continue;\n (out as Record<string, number>)[key as string] = raw;\n }\n return out;\n}\n","import { coerceBool, coerceNumber } from \"../connectors/coerce.js\";\n\nexport interface ProceduralMaintenanceConfig {\n enabled: boolean;\n retireIdleDays: number;\n retireMinOutcomes: number;\n retireFailRatio: number;\n mergeEnabled: boolean;\n}\n\nexport function parseProceduralMaintenanceConfig(\n raw: unknown,\n): ProceduralMaintenanceConfig {\n if (raw !== undefined && (raw === null || typeof raw !== \"object\" || Array.isArray(raw))) {\n throw new Error(\n `procedural.maintenance must be an object (got ${JSON.stringify(raw)}). Omit the key to keep maintenance disabled (issue #2370).`,\n );\n }\n const rawMaintenance = raw && typeof raw === \"object\" ? (raw as Record<string, unknown>) : {};\n let enabled = false;\n if (rawMaintenance.enabled !== undefined) {\n const coerced = coerceBool(rawMaintenance.enabled);\n if (coerced === undefined) {\n throw new Error(\n `procedural.maintenance.enabled must be a boolean or one of \"true\"/\"false\"/\"1\"/\"0\"/\"yes\"/\"no\"/\"on\"/\"off\" (got ${JSON.stringify(rawMaintenance.enabled)}).`,\n );\n }\n enabled = coerced;\n }\n const parseInteger = (key: string, fallback: number, min: number, max: number): number => {\n const value = rawMaintenance[key];\n if (value === undefined) return fallback;\n const coerced = coerceNumber(value);\n if (coerced === undefined || !Number.isFinite(coerced)) {\n throw new Error(\n `procedural.maintenance.${key} must be a finite number (got ${JSON.stringify(value)}).`,\n );\n }\n if (!Number.isInteger(coerced)) {\n throw new Error(\n `procedural.maintenance.${key} must be an integer (got ${JSON.stringify(value)}).`,\n );\n }\n if (coerced < min || coerced > max) {\n throw new Error(\n `procedural.maintenance.${key} must be between ${min} and ${max} (got ${JSON.stringify(value)}).`,\n );\n }\n return coerced;\n };\n let retireFailRatio = 2;\n if (rawMaintenance.retireFailRatio !== undefined) {\n const coerced = coerceNumber(rawMaintenance.retireFailRatio);\n if (coerced === undefined || !Number.isFinite(coerced) || coerced <= 0) {\n throw new Error(\n `procedural.maintenance.retireFailRatio must be a positive finite number (got ${JSON.stringify(rawMaintenance.retireFailRatio)}).`,\n );\n }\n retireFailRatio = coerced;\n }\n let mergeEnabled = true;\n if (rawMaintenance.mergeEnabled !== undefined) {\n const coerced = coerceBool(rawMaintenance.mergeEnabled);\n if (coerced === undefined) {\n throw new Error(\n `procedural.maintenance.mergeEnabled must be a boolean or one of \"true\"/\"false\"/\"1\"/\"0\"/\"yes\"/\"no\"/\"on\"/\"off\" (got ${JSON.stringify(rawMaintenance.mergeEnabled)}).`,\n );\n }\n mergeEnabled = coerced;\n }\n return {\n enabled,\n retireIdleDays: parseInteger(\"retireIdleDays\", 90, 0, 36_500),\n retireMinOutcomes: parseInteger(\"retireMinOutcomes\", 5, 1, 100_000),\n retireFailRatio,\n mergeEnabled,\n };\n}\n","/**\n * Preference drift detection config (issue #2371).\n *\n * Standalone top-level block, parsed the same way `contradictionScan` and\n * `procedural.maintenance` are: shape-validated, string-coercion safe (§24),\n * and honoring documented zero/no-op values (§33) rather than clamping them\n * to something non-zero.\n */\n\nimport { coerceBool, coerceNumber } from \"../connectors/coerce.js\";\n\nexport interface DriftDetectionConfig {\n /** Master switch for drift classification and its apply mode. Default false. */\n enabled: boolean;\n /** A preference younger than this is never a scan candidate. Default 60. */\n minAgeDays: number;\n /** Evidence-gathering window, in days back from the run instant. Default 45. */\n lookbackDays: number;\n /** Cap on preferences classified per run. `0` disables the scan entirely. Default 25. */\n maxCandidatesPerRun: number;\n /** When true, recall damps `driftState: stale` preferences. Default false. */\n recallDamping: boolean;\n /** Multiplier applied to stale preferences in (0, 1]; `1` is a documented no-op. Default 0.8. */\n stalePenalty: number;\n /** Annotate injected preferences uncorroborated for this many days. `0` = off. Default 0. */\n annotateAfterDays: number;\n}\n\nexport const DRIFT_DETECTION_DEFAULTS: DriftDetectionConfig = {\n enabled: false,\n minAgeDays: 60,\n lookbackDays: 45,\n maxCandidatesPerRun: 25,\n recallDamping: false,\n stalePenalty: 0.8,\n annotateAfterDays: 0,\n};\n\nfunction parseFlag(src: Record<string, unknown>, key: string, fallback: boolean): boolean {\n const value = src[key];\n if (value === undefined || value === null) return fallback;\n const coerced = coerceBool(value);\n if (coerced === undefined) {\n throw new Error(\n `driftDetection.${key} must be a boolean or one of \"true\"/\"false\"/\"1\"/\"0\"/\"yes\"/\"no\"/\"on\"/\"off\" (got ${JSON.stringify(value)}).`,\n );\n }\n return coerced;\n}\n\nfunction parseDayCount(src: Record<string, unknown>, key: string, fallback: number): number {\n const value = src[key];\n if (value === undefined || value === null) return fallback;\n const coerced = coerceNumber(value);\n if (coerced === undefined || !Number.isFinite(coerced)) {\n throw new Error(`driftDetection.${key} must be a finite number (got ${JSON.stringify(value)}).`);\n }\n if (!Number.isInteger(coerced)) {\n throw new Error(`driftDetection.${key} must be an integer (got ${JSON.stringify(value)}).`);\n }\n if (coerced < 0 || coerced > 36_500) {\n throw new Error(`driftDetection.${key} must be between 0 and 36500 (got ${JSON.stringify(value)}).`);\n }\n return coerced;\n}\n\nexport function parseDriftDetectionConfig(raw: unknown): DriftDetectionConfig {\n if (raw === undefined || raw === null) return { ...DRIFT_DETECTION_DEFAULTS };\n if (typeof raw !== \"object\" || Array.isArray(raw)) {\n throw new Error(\n `driftDetection must be an object (got ${JSON.stringify(raw)}). Omit the key to keep drift detection disabled (issue #2371).`,\n );\n }\n const src = raw as Record<string, unknown>;\n\n // `0` disables the scan and MUST survive as zero — the documented disable\n // value, never coerced up to a minimum (§33).\n const rawMax = src.maxCandidatesPerRun;\n let maxCandidatesPerRun = DRIFT_DETECTION_DEFAULTS.maxCandidatesPerRun;\n if (rawMax !== undefined && rawMax !== null) {\n const coerced = coerceNumber(rawMax);\n if (coerced === undefined || !Number.isInteger(coerced) || coerced < 0) {\n throw new Error(\n `driftDetection.maxCandidatesPerRun must be an integer >= 0 (got ${JSON.stringify(rawMax)}). Use 0 to disable the scan.`,\n );\n }\n maxCandidatesPerRun = coerced;\n }\n\n // stalePenalty is a multiplier in (0, 1]. `1` is the documented no-op; `0`\n // would erase a memory's rank entirely and is rejected rather than accepted\n // as a silent \"delete from recall\".\n const rawPenalty = src.stalePenalty;\n let stalePenalty = DRIFT_DETECTION_DEFAULTS.stalePenalty;\n if (rawPenalty !== undefined && rawPenalty !== null) {\n const coerced = coerceNumber(rawPenalty);\n if (coerced === undefined || !Number.isFinite(coerced) || coerced <= 0 || coerced > 1) {\n throw new Error(\n `driftDetection.stalePenalty must be a number in (0, 1] (got ${JSON.stringify(rawPenalty)}). Use 1 to disable damping without changing the flag.`,\n );\n }\n stalePenalty = coerced;\n }\n\n return {\n enabled: parseFlag(src, \"enabled\", DRIFT_DETECTION_DEFAULTS.enabled),\n minAgeDays: parseDayCount(src, \"minAgeDays\", DRIFT_DETECTION_DEFAULTS.minAgeDays),\n lookbackDays: parseDayCount(src, \"lookbackDays\", DRIFT_DETECTION_DEFAULTS.lookbackDays),\n maxCandidatesPerRun,\n recallDamping: parseFlag(src, \"recallDamping\", DRIFT_DETECTION_DEFAULTS.recallDamping),\n stalePenalty,\n annotateAfterDays: parseDayCount(\n src,\n \"annotateAfterDays\",\n DRIFT_DETECTION_DEFAULTS.annotateAfterDays,\n ),\n };\n}\n","/**\n * Connector-aware neighbor scoping, shared by every write-path dedup gate.\n *\n * A candidate fact carrying provenance (`sourceConnector`) must only be\n * compared against neighbors from the SAME connector — otherwise connector B's\n * write is suppressed by, or merged into, connector A's memory while that\n * memory's `sourceConnector` frontmatter still identifies A (PR #1852 review\n * finding on 7e0eb1a0; PR #2564 review finding on 54d865cb9; issue #2330).\n *\n * The rule was previously reimplemented inline in each gate. It is one\n * mechanism, so it lives in one module: the semantic near-duplicate skip gate\n * (`semantic.ts`), the novelty gate (`novelty-gate.ts`), and merge-on-write\n * (`merge.ts`) all resolve scope and match neighbors through these helpers.\n */\n\n/**\n * The candidate's connector scope. An absent, non-string, or whitespace-only\n * value is \"unattributed\" (operator writes), which keeps the unscoped\n * neighborhood — the original pre-provenance behavior.\n */\nexport function normalizeConnectorScope(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\n/**\n * Whether a neighbor may act on a candidate in this scope. An unscoped\n * candidate matches every neighbor; a scoped candidate matches only neighbors\n * carrying the identical connector. A neighbor with an absent or\n * whitespace-only connector never matches a scoped candidate.\n */\nexport function connectorMatchesScope(\n neighborConnector: unknown,\n scope: string | undefined,\n): boolean {\n if (scope === undefined) return true;\n return normalizeConnectorScope(neighborConnector) === scope;\n}\n","import { coerceBooleanLike, coerceNumber } from \"../connectors/coerce.js\";\nimport { connectorMatchesScope, normalizeConnectorScope } from \"./connector-scope.js\";\n\n/**\n * Embedding-density novelty gate (issue #1953, SAGE).\n *\n * score = 1 - mean(cosine of k nearest). Higher score = more novel.\n * score >= noveltyAddThreshold → add (skip semantic/LLM dedup)\n * score <= noveltyNoopThreshold → noop (drop; do not touch contentHashIndex)\n * else → uncertain (fall through to semantic dedup)\n *\n * Defaults keep a wide UNCERTAIN band. noveltyGateEnabled defaults false.\n * Backend failure is not handled here — callers treat a thrown lookup as uncertain.\n */\nexport const DEFAULT_NOVELTY_ADD_THRESHOLD = 0.55;\nexport const DEFAULT_NOVELTY_NOOP_THRESHOLD = 0.15;\nexport const DEFAULT_NOVELTY_K = 5;\n\nexport interface NoveltyNeighbor {\n id: string;\n embedding: number[];\n}\n\nexport interface NoveltyDecision {\n score: number;\n decision: \"add\" | \"noop\" | \"uncertain\";\n neighborId?: string;\n}\n\nexport interface NoveltyThresholds {\n addThreshold?: number;\n noopThreshold?: number;\n k?: number;\n}\n\nexport interface WritePathDedupConfig {\n semanticDedupEnabled: boolean;\n semanticDedupThreshold: number;\n semanticDedupCandidates: number;\n noveltyGateEnabled: boolean;\n noveltyAddThreshold: number;\n noveltyNoopThreshold: number;\n}\n\nfunction clamp01(value: number | undefined, fallback: number): number {\n return value !== undefined && Number.isFinite(value) ? Math.min(1, Math.max(0, value)) : fallback;\n}\n\nfunction cosine(a: number[], b: number[]): number {\n if (a.length === 0 || a.length !== b.length) return 0;\n let dot = 0;\n let magA = 0;\n let magB = 0;\n for (let i = 0; i < a.length; i++) {\n dot += a[i] * b[i];\n magA += a[i] * a[i];\n magB += b[i] * b[i];\n }\n const denom = Math.sqrt(magA) * Math.sqrt(magB);\n if (denom === 0) return 0;\n const raw = dot / denom;\n if (!Number.isFinite(raw)) return 0;\n if (raw < 0) return 0;\n if (raw > 1) return 1;\n return raw;\n}\n\n/** The semantic-dedup threshold exactly as `parseWritePathDedupConfig` resolves it. */\nexport function semanticDedupThresholdFrom(cfg: Record<string, unknown>): number {\n return clamp01(coerceNumber(cfg.semanticDedupThreshold, \"semanticDedupThreshold\"), 0.92);\n}\n\nexport function parseWritePathDedupConfig(cfg: Record<string, unknown>): WritePathDedupConfig {\n const rawCandidates = coerceNumber(cfg.semanticDedupCandidates, \"semanticDedupCandidates\");\n let semanticDedupCandidates = 5;\n if (rawCandidates !== undefined && rawCandidates >= 0) {\n const n = Math.floor(rawCandidates);\n semanticDedupCandidates = rawCandidates > 0 && n === 0 ? 1 : n;\n }\n return {\n semanticDedupEnabled: coerceBooleanLike(cfg.semanticDedupEnabled, \"semanticDedupEnabled\") !== false,\n semanticDedupThreshold: semanticDedupThresholdFrom(cfg),\n semanticDedupCandidates,\n noveltyGateEnabled: coerceBooleanLike(cfg.noveltyGateEnabled, \"noveltyGateEnabled\") === true,\n noveltyAddThreshold: clamp01(\n coerceNumber(cfg.noveltyAddThreshold, \"noveltyAddThreshold\"),\n DEFAULT_NOVELTY_ADD_THRESHOLD,\n ),\n noveltyNoopThreshold: clamp01(\n coerceNumber(cfg.noveltyNoopThreshold, \"noveltyNoopThreshold\"),\n DEFAULT_NOVELTY_NOOP_THRESHOLD,\n ),\n };\n}\n\nexport function embeddingsFromCosineHits(\n hits: ReadonlyArray<{ id: string; score: number; sourceConnector?: string }>,\n opts: { candidateConnector?: string } = {},\n): { embedding: number[]; neighborhood: NoveltyNeighbor[] } {\n // Connector-aware scoping (PR #2564 review finding on 54d865cb9): a\n // neighbor from a different (or unattributed) connector must not drive a\n // noop — the shared contract in `connector-scope.ts`, also applied by the\n // semantic skip gate and merge-on-write. Candidates without a connector\n // keep the unscoped neighborhood.\n const scope = normalizeConnectorScope(opts.candidateConnector);\n const scoped = hits.filter((hit) => connectorMatchesScope(hit.sourceConnector, scope));\n return {\n embedding: [1, 0],\n neighborhood: scoped.map((hit) => {\n const s = Number.isFinite(hit.score) ? Math.min(1, Math.max(-1, hit.score)) : 0;\n return { id: hit.id, embedding: [s, Math.sqrt(Math.max(0, 1 - s * s))] };\n }),\n };\n}\n\nexport function scoreNovelty(\n embedding: number[],\n neighborhood: NoveltyNeighbor[],\n thresholds: NoveltyThresholds = {},\n): NoveltyDecision {\n const addThreshold = clamp01(thresholds.addThreshold ?? DEFAULT_NOVELTY_ADD_THRESHOLD, DEFAULT_NOVELTY_ADD_THRESHOLD);\n const noopThreshold = clamp01(thresholds.noopThreshold ?? DEFAULT_NOVELTY_NOOP_THRESHOLD, DEFAULT_NOVELTY_NOOP_THRESHOLD);\n const k = thresholds.k !== undefined && Number.isFinite(thresholds.k) && thresholds.k > 0\n ? Math.floor(thresholds.k)\n : DEFAULT_NOVELTY_K;\n\n if (neighborhood.length === 0) {\n return { score: 1, decision: \"add\" };\n }\n\n const ranked = neighborhood\n .map((neighbor) => ({\n id: neighbor.id,\n cosine: cosine(embedding, neighbor.embedding),\n }))\n .sort((a, b) => b.cosine - a.cosine);\n const nearest = ranked.slice(0, Math.max(1, k));\n const density = nearest.reduce((sum, row) => sum + row.cosine, 0) / nearest.length;\n const score = 1 - density;\n const neighborId = ranked[0]?.id;\n\n if (score >= addThreshold) return { score, decision: \"add\", neighborId };\n if (score <= noopThreshold) return { score, decision: \"noop\", neighborId };\n return { score, decision: \"uncertain\", neighborId };\n}\n\nexport async function applyNoveltyGate(opts: {\n enabled: boolean;\n addThreshold: number;\n noopThreshold: number;\n lookup: () => Promise<{ embedding: number[]; neighborhood: NoveltyNeighbor[] }>;\n}): Promise<NoveltyDecision> {\n if (!opts.enabled) {\n return { score: 0, decision: \"uncertain\" };\n }\n try {\n const { embedding, neighborhood } = await opts.lookup();\n return scoreNovelty(embedding, neighborhood, {\n addThreshold: opts.addThreshold,\n noopThreshold: opts.noopThreshold,\n });\n } catch {\n return { score: 0, decision: \"uncertain\" };\n }\n}\n","/**\n * Parse merge-on-write min score (issue #2330 leftover).\n *\n * Finite number in [0, 1] is returned. Outside range or non-finite throws.\n */\nfunction describeValue(value: unknown): string {\n try {\n const serialized = JSON.stringify(value);\n return serialized === undefined ? String(value) : serialized;\n } catch {\n return String(value);\n }\n}\n\nexport function parseMinMergeScore(value: unknown): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0 || value > 1) {\n throw new RangeError(\n `merge minScore must be a finite number in [0, 1]; got ${describeValue(value)}`,\n );\n }\n return value;\n}\n","/**\n * Isolated merge-on-write judge (issue #2330 first slice).\n *\n * Default off. Persist wiring comes later. Failures create.\n */\n\nexport const DEFAULT_MERGE_MIN = 0.8;\nexport const DEFAULT_SKIP_THRESHOLD = 0.92;\n\nexport const REFUSED_MERGE_CATEGORIES = [\n \"procedure\",\n \"reasoning_trace\",\n \"moment\",\n \"correction\",\n] as const;\n\nexport type MergeOnWriteDecision = \"merge\" | \"create\";\nexport type MergeJudgeVerdict = MergeOnWriteDecision | \"uncertain\";\n\nexport interface MergeOnWritePair {\n category: string;\n score: number;\n incomingContent?: string;\n existingContent?: string;\n existingId?: string;\n}\n\nexport type MergeJudge = (\n pair: MergeOnWritePair,\n) => Promise<MergeJudgeVerdict> | MergeJudgeVerdict;\n\nexport function shouldConsiderMerge(opts: {\n score: number;\n skipThreshold?: number;\n mergeMin?: number;\n}): boolean {\n const mergeMin = opts.mergeMin ?? DEFAULT_MERGE_MIN;\n const skipThreshold = opts.skipThreshold ?? DEFAULT_SKIP_THRESHOLD;\n if (!(mergeMin > 0)) return false;\n if (!Number.isFinite(opts.score) || !Number.isFinite(skipThreshold)) return false;\n return mergeMin <= opts.score && opts.score < skipThreshold;\n}\n\nexport async function judgeMergeDecision(\n pair: MergeOnWritePair,\n judge: MergeJudge,\n): Promise<MergeOnWriteDecision> {\n try {\n const verdict = await judge(pair);\n return verdict === \"merge\" ? \"merge\" : \"create\";\n } catch {\n return \"create\";\n }\n}\n\nexport async function applyMergeOnWrite(opts: {\n pair: MergeOnWritePair;\n judge: MergeJudge;\n enabled?: boolean;\n mergeMin?: number;\n skipThreshold?: number;\n}): Promise<MergeOnWriteDecision> {\n if (opts.enabled !== true) return \"create\";\n if ((REFUSED_MERGE_CATEGORIES as readonly string[]).includes(opts.pair.category)) return \"create\";\n if (\n !shouldConsiderMerge({\n score: opts.pair.score,\n mergeMin: opts.mergeMin,\n skipThreshold: opts.skipThreshold,\n })\n ) {\n return \"create\";\n }\n return judgeMergeDecision(opts.pair, opts.judge);\n}\n","/**\n * Merged-content acceptance check (issue #2330).\n *\n * A judge-merged body that is blank, a runaway continuation, or text the\n * storage sanitizer would rewrite is refused so the write path can fall back\n * to create. `mergedContent` arrives from a model and gets a typed refusal;\n * non-string `incomingContent`/`targetContent` is a caller bug and throws.\n * Internal helper; wiring into the write path is a later slice.\n */\n\nimport { sanitizeMemoryContent } from \"../sanitize.js\";\n\nexport const MERGE_CONTENT_LENGTH_FACTOR = 4;\nexport type MergeContentCheck =\n | { ok: true; content: string }\n | { ok: false; reason: \"empty\" | \"oversized\" | \"unsafe\"; limit: number };\n\nfunction requireString(value: unknown, field: string): string {\n if (typeof value !== \"string\") {\n throw new RangeError(`merge ${field} must be a string`);\n }\n return value;\n}\n\nexport function checkMergedContent(input: {\n mergedContent: unknown;\n incomingContent: string;\n targetContent: string;\n}): MergeContentCheck {\n const incoming = requireString(input.incomingContent, \"incomingContent\");\n const target = requireString(input.targetContent, \"targetContent\");\n const limit = MERGE_CONTENT_LENGTH_FACTOR * (incoming.length + target.length);\n\n const merged = input.mergedContent;\n if (typeof merged !== \"string\" || merged.trim() === \"\") {\n return { ok: false, reason: \"empty\", limit };\n }\n // Storage persists `sanitizeMemoryContent(text).text`, so a merged body the\n // sanitizer would rewrite can never round-trip: the persist-side CAS and\n // provenance equality checks compare the RAW judge output, and a target\n // holding the sanitization placeholder reads back as a concurrent\n // replacement — the rollback then \"succeeds\" while the original body is\n // lost and the caller also creates the fact. Refusing here means the merge\n // decision becomes a create and no mutation ever runs. Checked before the\n // length limit: an injection-pattern body is refused as unsafe whatever its\n // length.\n if (!sanitizeMemoryContent(merged).clean) {\n return { ok: false, reason: \"unsafe\", limit };\n }\n if (merged.length > limit) {\n return { ok: false, reason: \"oversized\", limit };\n }\n return { ok: true, content: merged };\n}\n","/**\n * Judge-mediated merge-on-write decision (issue #2330, harmonic 2/5).\n *\n * A new candidate fact that is semantically close — but NOT near-duplicate\n * close — to an existing active memory is offered to an LLM merge judge.\n * On a \"merge\" verdict the caller updates the existing entry in place\n * instead of writing a new fragment. Every failure mode fails closed to\n * \"create\": the unsafe default is always the unchanged write path.\n *\n * The near-duplicate skip path (similarity >= the semantic dedup\n * threshold) is untouched — this module only sees the band\n * `[minSimilarity, dedupThreshold)`.\n */\n\nimport { coerceBool, coerceNumber } from \"../connectors/coerce.js\";\nimport { MEMORY_CATEGORIES } from \"../correction/correction-contract.js\";\nimport type { SemanticMergeConfig } from \"../types.js\";\nimport { isActiveMemoryStatus } from \"../memory-lifecycle-ledger-utils.js\";\nimport { semanticDedupThresholdFrom } from \"./novelty-gate.js\";\nimport { parseMinMergeScore } from \"./merge-min-score.js\";\nimport { REFUSED_MERGE_CATEGORIES } from \"./merge-on-write.js\";\nimport { checkMergedContent } from \"./merge-content.js\";\nimport type { SemanticDedupHit, SemanticDedupLookup } from \"./semantic.js\";\nimport { normalizeConnectorScope } from \"./connector-scope.js\";\n\n// ── Public types ──────────────────────────────────────────────────────────────\n\n/** An existing memory considered as a merge target. */\nexport interface MergeCandidate {\n memoryId: string;\n content: string;\n category: string;\n similarity: number;\n /** Frontmatter status; only `active` (or absent) memories are eligible. */\n status: string;\n}\n\n/**\n * Raw (parsed but UNVALIDATED) judge verdict. `decideSemanticMerge`\n * hard-validates before trusting any field — an LLM-fabricated targetId\n * must never survive (issue #2330 step 2).\n */\nexport interface MergeJudgeRawVerdict {\n decision: \"merge\" | \"create\" | \"contradicts\";\n targetId?: string | null;\n mergedContent?: string | null;\n reason?: string | null;\n}\n\n/** The judge call injected by the caller (LLM-backed in production). */\nexport type MergeJudge = (input: {\n content: string;\n category: string;\n candidates: readonly MergeCandidate[];\n}) => Promise<MergeJudgeRawVerdict>;\n\n/** Resolves candidate metadata for a lookup hit id; null = unknown memory. */\nexport type MergeCandidateResolver = (\n memoryId: string,\n) => Promise<{ content: string; category: string; status: string } | null>;\n\n/** Why a candidate fell through to the unchanged create path. */\nexport type MergeCreateReason =\n | \"disabled\"\n | \"no_candidates\"\n | \"judge_create\"\n | \"judge_contradicts\"\n | \"judge_invalid\"\n | \"judge_error\"\n | \"backend_unavailable\";\n\nexport type MergeDecision =\n | { action: \"create\"; reason: MergeCreateReason }\n | {\n action: \"merge\";\n targetId: string;\n mergedContent: string;\n /**\n * The target body the judge actually merged. The persist side must\n * compare it against the target it is about to write and fall back to\n * create when it differs: in a multi-writer deployment another\n * extraction can update the target between this decision and the write,\n * and `mergedContent` was computed from the older body.\n */\n targetContent: string;\n reason: \"judge_merge\";\n };\n\nexport interface DecideSemanticMergeOptions {\n content: string;\n category: string;\n lookup: SemanticDedupLookup;\n judge: MergeJudge;\n config: SemanticMergeConfig;\n /** Upper bound of the merge band: the semantic-dedup threshold. */\n dedupThreshold: number;\n resolveCandidate: MergeCandidateResolver;\n /**\n * Provenance connector of the INCOMING fact. Merge selection is stricter\n * than the novelty and semantic-dedup gates (`connector-scope.ts`): a merge\n * may only pair an unscoped fact with an unscoped target, or a\n * provenance-bearing fact with a neighbor from the same connector. A merge\n * rewrites the target's body, so any other pairing would relabel one side's\n * claims under the other's `sourceConnector` frontmatter (finding B).\n */\n sourceConnector?: string;\n}\n\n// ── Decision function ─────────────────────────────────────────────────────────\n\n/** Total order: similarity desc, then memoryId asc (checklist #12). */\nfunction compareMergeCandidates(a: MergeCandidate, b: MergeCandidate): number {\n if (a.similarity !== b.similarity) return b.similarity - a.similarity;\n return a.memoryId < b.memoryId ? -1 : a.memoryId > b.memoryId ? 1 : 0;\n}\n\nexport async function decideSemanticMerge(\n options: DecideSemanticMergeOptions,\n): Promise<MergeDecision> {\n const { config } = options;\n if (config.enabled !== true) return { action: \"create\", reason: \"disabled\" };\n // 0 disables merging entirely — short-circuit BEFORE the lookup so no\n // embedding backend call is made (config is runtime API; never coerce 0).\n if (!(config.maxCandidates > 0)) return { action: \"create\", reason: \"disabled\" };\n if (!(config.categories as readonly string[]).includes(options.category)) {\n return { action: \"create\", reason: \"disabled\" };\n }\n const trimmed = typeof options.content === \"string\" ? options.content.trim() : \"\";\n if (!trimmed) return { action: \"create\", reason: \"no_candidates\" };\n\n // Lookup throws = backend down (distinct from an empty index, #22).\n // Round N+17 (A): the fetch deliberately OVERSHOOTS maxCandidates. The\n // eligibility predicates below (band, connector scope, category, active\n // status) run after the lookup, so fetching exactly maxCandidates let\n // ineligible hits — a foreign connector or category, an inactive row —\n // occupy the whole fetch window and crowd out a valid target ranked\n // immediately beneath them; the write then created another fragment.\n // maxCandidates still bounds what reaches the JUDGE (the slice below is\n // the only truncation point).\n let hits: SemanticDedupHit[];\n try {\n hits = await options.lookup(trimmed, config.maxCandidates * CANDIDATE_OVERFETCH_FACTOR);\n } catch {\n return { action: \"create\", reason: \"backend_unavailable\" };\n }\n if (!Array.isArray(hits) || hits.length === 0) {\n return { action: \"create\", reason: \"no_candidates\" };\n }\n\n // Connector scope (finding B): a merge REWRITES the neighbor's body, so it\n // is stricter than the shared dedup helper — both sides must be unscoped or\n // carry the identical connector. An unscoped merge into a connector-owned\n // target would rewrite A's memory while A's `sourceConnector` frontmatter\n // still identifies A, so recall and connector-aware dedup would label the\n // unscoped claims as A's.\n const scope = normalizeConnectorScope(options.sourceConnector);\n const candidates: MergeCandidate[] = [];\n for (const hit of hits) {\n if (\n !hit ||\n typeof hit.id !== \"string\" ||\n hit.id.trim().length === 0 ||\n typeof hit.score !== \"number\" ||\n !Number.isFinite(hit.score)\n ) {\n continue;\n }\n // Band: [minSimilarity, dedupThreshold). The upper edge is owned by the\n // near-duplicate skip path and must stay excluded.\n if (!(hit.score >= config.minSimilarity && hit.score < options.dedupThreshold)) {\n continue;\n }\n if (normalizeConnectorScope(hit.sourceConnector) !== scope) continue;\n const meta = await options.resolveCandidate(hit.id);\n if (!meta) continue;\n if (meta.category !== options.category) continue;\n if (!isActiveMemoryStatus(meta.status)) continue;\n candidates.push({\n memoryId: hit.id,\n content: meta.content,\n category: meta.category,\n similarity: hit.score,\n status: meta.status,\n });\n }\n if (candidates.length === 0) return { action: \"create\", reason: \"no_candidates\" };\n\n candidates.sort(compareMergeCandidates);\n // Eligible-first truncation (round N+17 A): the judge sees up to\n // maxCandidates ELIGIBLE neighbors — never the raw top-of-index hits.\n const limited = candidates.slice(0, config.maxCandidates);\n\n let verdict: MergeJudgeRawVerdict;\n try {\n verdict = await options.judge({\n content: trimmed,\n category: options.category,\n candidates: limited,\n });\n } catch {\n return { action: \"create\", reason: \"judge_error\" };\n }\n if (!verdict || typeof verdict !== \"object\") {\n return { action: \"create\", reason: \"judge_invalid\" };\n }\n if (verdict.decision === \"create\") return { action: \"create\", reason: \"judge_create\" };\n if (verdict.decision === \"contradicts\") return { action: \"create\", reason: \"judge_contradicts\" };\n\n // Hard post-validation: never trust the model to echo ids.\n const target =\n typeof verdict.targetId === \"string\"\n ? limited.find((c) => c.memoryId === verdict.targetId)\n : undefined;\n if (!target) return { action: \"create\", reason: \"judge_invalid\" };\n const content = checkMergedContent({\n mergedContent: verdict.mergedContent,\n incomingContent: trimmed,\n targetContent: target.content,\n });\n if (!content.ok) return { action: \"create\", reason: \"judge_invalid\" };\n return {\n action: \"merge\",\n targetId: target.memoryId,\n mergedContent: content.content,\n targetContent: target.content,\n reason: \"judge_merge\",\n };\n}\n\n// ── Config parsing ────────────────────────────────────────────────────────────\n\nexport const DEFAULT_SEMANTIC_MERGE_CATEGORIES = [\n \"fact\",\n \"preference\",\n \"decision\",\n \"relationship\",\n \"skill\",\n] as const;\n\n/**\n * The categories `semanticMerge.categories` may name: every known memory\n * category except the episodic/immutable ones `REFUSED_MERGE_CATEGORIES`\n * excludes at runtime — listing a refused category configures a gate that\n * can never fire, and an unknown string (a typo like \"facts\") silently\n * disables merging for every category, so both are rejected at parse time.\n */\nexport const MERGEABLE_MEMORY_CATEGORIES: readonly string[] = MEMORY_CATEGORIES.filter(\n (category) => !(REFUSED_MERGE_CATEGORIES as readonly string[]).includes(category),\n);\n\nexport const DEFAULT_SEMANTIC_MERGE_MIN = 0.8;\nexport const DEFAULT_SEMANTIC_MERGE_CANDIDATES = 3;\n\n/**\n * Round N+17 (A): the neighbor fetch overshoots `maxCandidates` by this\n * factor so eligibility filtering happens BEFORE truncation. Bounded\n * ceiling: a corpus holding more than this many consecutive ineligible\n * neighbors above the valid target still crowds it out; raise only with\n * evidence of that corpus shape.\n */\nconst CANDIDATE_OVERFETCH_FACTOR = 4;\n\nfunction describeValue(value: unknown): string {\n try {\n const serialized = JSON.stringify(value);\n return serialized === undefined ? String(value) : serialized;\n } catch {\n return String(value);\n }\n}\n\n/**\n * Parse the `semanticMerge` block (issue #2330). Follows the `procedural.*`\n * worked example: strict booleans that reject unrecognized values, CLI\n * string coercion for numbers (\"0\" is zero, never coerced upward), and\n * parse-time rejection of an empty merge band (`minSimilarity` must be\n * strictly below the semantic-dedup threshold that owns the band's top).\n * Invalid input is rejected, never silently defaulted or reinterpreted: a\n * present block that is not an object, a present-but-`undefined` or\n * unparseable field (`enabled`, `shadowMode`, `minSimilarity`,\n * `maxCandidates` \"abc\"/an object/NaN/infinity, or a malformed `categories`\n * array) each throw. Presence is OWN-property presence (checklist #46): a\n * key inherited through the prototype chain never applies, and only a key\n * absent from `Object.getOwnPropertyNames` means \"use the defaults\".\n *\n * The band check applies only when it can describe a real misconfiguration:\n * merging is enabled, or `minSimilarity` was set explicitly. A deployment\n * that predates this block and lowered `semanticDedupThreshold` to <= the\n * default merge minimum must keep starting — the disabled feature performs\n * no band lookup at all, so rejecting that config would be a gratuitous\n * backward-compatibility break.\n */\nexport function parseSemanticMergeConfig(\n cfg: Record<string, unknown>,\n): { semanticMerge: SemanticMergeConfig } {\n // Own-property presence (checklist #46): a bracket read follows the\n // prototype chain, and `=== undefined` folds present-but-invalid into\n // absent. Gate every presence question on Object.hasOwn.\n const blockPresent = Object.hasOwn(cfg, \"semanticMerge\");\n const block = blockPresent ? cfg.semanticMerge : undefined;\n if (\n block !== undefined &&\n (typeof block !== \"object\" || block === null || Array.isArray(block))\n ) {\n throw new Error(\n `semanticMerge must be an object when present (got ${describeValue(block)}). Remove the block to fall back to the defaults.`,\n );\n }\n if (blockPresent && block === undefined) {\n throw new Error(\n `semanticMerge must be an object when present (got ${describeValue(block)}). Remove the key to fall back to the defaults.`,\n );\n }\n const raw = (block ?? {}) as Record<string, unknown>;\n const parseGate = (key: string, fallback: boolean): boolean => {\n if (!Object.hasOwn(raw, key)) return fallback;\n const value = raw[key];\n const coerced = coerceBool(value, `semanticMerge.${key}`);\n if (coerced === undefined) {\n throw new Error(\n `semanticMerge.${key} must be a boolean or one of \"true\"/\"false\"/\"1\"/\"0\"/\"yes\"/\"no\"/\"on\"/\"off\" (got ${describeValue(value)}).`,\n );\n }\n return coerced;\n };\n const minSimilarityPresent = Object.hasOwn(raw, \"minSimilarity\");\n const minSimilarity = minSimilarityPresent\n ? parseMinMergeScore(raw.minSimilarity)\n : DEFAULT_SEMANTIC_MERGE_MIN;\n // Round N+2 (D) — distinguish an ABSENT key from a present-but-unparseable\n // value (#1/#39/#45): coerceNumber returns undefined for \"abc\", objects,\n // NaN, and ±Infinity, and an undefined result here must never fall back to\n // the default — that would silently enable judge lookups under an invalid\n // config. Only a key absent from the own-property set means \"use the\n // default\"; present-but-`undefined` is invalid like any other bad value.\n const maxCandidates = (() => {\n if (!Object.hasOwn(raw, \"maxCandidates\")) return DEFAULT_SEMANTIC_MERGE_CANDIDATES;\n const rawCandidatesValue = raw.maxCandidates;\n const rawCandidates = coerceNumber(rawCandidatesValue, \"semanticMerge.maxCandidates\");\n if (rawCandidates === undefined || !Number.isInteger(rawCandidates) || rawCandidates < 0) {\n throw new Error(\n `semanticMerge.maxCandidates must be an integer >= 0 (got ${describeValue(rawCandidatesValue)}). Remove the key to use the default (${DEFAULT_SEMANTIC_MERGE_CANDIDATES}) or set 0 to disable merging entirely.`,\n );\n }\n return rawCandidates;\n })();\n const categories = (() => {\n if (!Object.hasOwn(raw, \"categories\")) return [...DEFAULT_SEMANTIC_MERGE_CATEGORIES];\n const rawCategories = raw.categories;\n if (\n !Array.isArray(rawCategories) ||\n !rawCategories.every((c) => typeof c === \"string\" && c.length > 0)\n ) {\n throw new Error(\n `semanticMerge.categories must be an array of non-empty category names (got ${describeValue(rawCategories)}).`,\n );\n }\n const invalidCategory = rawCategories.find(\n (c) => !MERGEABLE_MEMORY_CATEGORIES.includes(c),\n );\n if (invalidCategory !== undefined) {\n throw new Error(\n `semanticMerge.categories contains an unknown or never-mergeable category: ${describeValue(invalidCategory)}. Valid categories: ${MERGEABLE_MEMORY_CATEGORIES.join(\", \")}. The episodic and immutable categories (${REFUSED_MERGE_CATEGORIES.join(\", \")}) never merge and cannot be listed.`,\n );\n }\n return [...rawCategories];\n })();\n const enabled = parseGate(\"enabled\", false);\n const dedupThreshold = semanticDedupThresholdFrom(cfg);\n if ((enabled || minSimilarityPresent) && minSimilarity >= dedupThreshold) {\n throw new Error(\n `semanticMerge.minSimilarity (${minSimilarity}) must be strictly below semanticDedupThreshold (${dedupThreshold}) — the near-duplicate skip path owns similarities at or above it.`,\n );\n }\n return {\n semanticMerge: {\n enabled,\n minSimilarity,\n maxCandidates,\n categories,\n shadowMode: parseGate(\"shadowMode\", false),\n },\n };\n}\n","/**\n * Wearables config parsing — strict, loud, and default-safe.\n *\n * Mirrors the `procedural` block conventions in config.ts: shape\n * violations and unparseable values throw with actionable messages\n * (CLAUDE.md rule 51); boolean-ish strings coerce via the shared\n * helpers (rule 36); every numeric knob is bounds-checked; the\n * memory-creation default is the least-privileged mode (rule 48).\n */\n\nimport { coerceBool, coerceNumber } from \"../connectors/coerce.js\";\nimport type { ImportanceLevel } from \"../types.js\";\nimport { compileCorrectionRules } from \"./corrections.js\";\nimport { compileRedactionPatterns } from \"./redaction.js\";\nimport type {\n OffTheRecordMarkerSettings,\n WearableCleanupSettings,\n WearableCorrectionRule,\n WearableMemoryMode,\n WearableFusionConfig,\n WearableSourceSettings,\n WearablesConfig,\n} from \"./types.js\";\n\nexport const KNOWN_WEARABLE_SOURCE_IDS = [\"limitless\", \"bee\", \"omi\"] as const;\n\nconst MEMORY_MODES: WearableMemoryMode[] = [\"off\", \"review\", \"auto\", \"smart\"];\nconst IMPORTANCE_LEVELS: ImportanceLevel[] = [\n \"trivial\",\n \"low\",\n \"normal\",\n \"high\",\n \"critical\",\n];\nconst NATIVE_IMPORT_MODES = [\"off\", \"review\", \"smart\"] as const;\n\nconst DEFAULT_MIN_CONFIDENCE = 0.6;\nconst DEFAULT_MIN_IMPORTANCE: ImportanceLevel = \"low\";\n// Uncapped by default — wearables capture full days and the smart trust\n// pipeline is the quality gate; a count cap would drop real memories on\n// busy days. Operators who want a ceiling set any positive integer.\nconst DEFAULT_MAX_MEMORIES_PER_DAY = 0;\nconst DEFAULT_AUTO_SYNC_ENABLED = true;\nconst DEFAULT_AUTO_SYNC_INTERVAL_MINUTES = 15;\nconst MAX_AUTO_SYNC_INTERVAL_MINUTES = 1440;\nconst DEFAULT_AUTO_SYNC_DAYS = 2;\nconst DEFAULT_AUTO_SYNC_DEEP_DAYS = 7;\nconst MAX_AUTO_SYNC_WINDOW_DAYS = 90;\nconst DEFAULT_SOURCE_TRUST = 0.8;\nconst DEFAULT_AUTO_APPROVE_TRUST = 0.7;\nconst DEFAULT_REVIEW_TRUST = 0.45;\n// Cross-source fusion (#1810) — disabled by default; enabling is the\n// only behavior change fusion introduces.\nconst DEFAULT_FUSION_ENABLED = false;\nconst DEFAULT_FUSION_PROXIMITY_GAP_MS = 300_000;\nconst DEFAULT_FUSION_WINDOW_TOLERANCE_MS = 30_000;\n\n// Sources whose provider emits per-utterance text but unreliable\n// speaker labels (Bee falls back to a generic \"unknown\" label when\n// diarization is unavailable). For those, the cleanup default keeps\n// utterance-level boundaries so a whole conversation does not collapse\n// into one mega-segment (issue #1811). Other sources keep the legacy\n// merge-everything default unless explicitly configured.\nconst BOUNDARY_PRESERVING_SOURCE_IDS = new Set<string>([\"bee\"]);\n\n/**\n * Default cleanup settings. `sourceId` (the connector id this block\n * belongs to) only adjusts the `preserveUtteranceBoundaries` default —\n * every other toggle is identical across sources.\n */\nexport function defaultWearableCleanupSettings(\n sourceId?: string,\n): WearableCleanupSettings {\n return {\n mergeSameSpeaker: true,\n stripFillers: true,\n collapseRepeats: true,\n dropLowQuality: true,\n preserveUtteranceBoundaries:\n sourceId !== undefined && BOUNDARY_PRESERVING_SOURCE_IDS.has(sourceId),\n };\n}\n\nexport function defaultWearableSourceSettings(\n sourceId?: string,\n): WearableSourceSettings {\n return {\n enabled: false,\n memoryMode: \"smart\",\n sourceTrust: DEFAULT_SOURCE_TRUST,\n autoApproveTrust: DEFAULT_AUTO_APPROVE_TRUST,\n reviewTrust: DEFAULT_REVIEW_TRUST,\n minConfidence: DEFAULT_MIN_CONFIDENCE,\n minImportance: DEFAULT_MIN_IMPORTANCE,\n maxMemoriesPerDay: DEFAULT_MAX_MEMORIES_PER_DAY,\n importNativeMemories: \"smart\",\n cleanup: defaultWearableCleanupSettings(sourceId),\n };\n}\n\nexport function defaultWearableFusionConfig(): WearableFusionConfig {\n return {\n enabled: DEFAULT_FUSION_ENABLED,\n proximityGapMs: DEFAULT_FUSION_PROXIMITY_GAP_MS,\n windowToleranceMs: DEFAULT_FUSION_WINDOW_TOLERANCE_MS,\n };\n}\n\nexport function defaultWearablesConfig(): WearablesConfig {\n return {\n enabled: false,\n redactionEnabled: true,\n redactionPatterns: [],\n offTheRecordEnabled: true,\n offTheRecordMarkers: { start: [], end: [], useBuiltIns: true },\n fillerTokens: [],\n digestEnabled: true,\n autoSyncEnabled: DEFAULT_AUTO_SYNC_ENABLED,\n autoSyncIntervalMinutes: DEFAULT_AUTO_SYNC_INTERVAL_MINUTES,\n autoSyncDays: DEFAULT_AUTO_SYNC_DAYS,\n autoSyncDeepDays: DEFAULT_AUTO_SYNC_DEEP_DAYS,\n corrections: [],\n sources: {},\n fusion: defaultWearableFusionConfig(),\n };\n}\n\nfunction requireObject(\n value: unknown,\n keyPath: string,\n): Record<string, unknown> {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(\n `${keyPath} must be an object (got ${JSON.stringify(value)})`,\n );\n }\n return value as Record<string, unknown>;\n}\n\n/** Longest accepted off-the-record marker phrase. */\nconst MAX_MARKER_PHRASE_LENGTH = 128;\n/** Longest accepted filler token. */\nconst MAX_FILLER_TOKEN_LENGTH = 64;\n\n/**\n * Parse an optional array of non-empty phrases. Rejects a non-array, a\n * non-string entry, a blank entry, and an over-long entry — an operator\n * privacy phrase that is silently discarded is the failure this parser\n * exists to prevent (issue #2196).\n */\nfunction parsePhraseList(\n value: unknown,\n keyPath: string,\n maxLength: number,\n): string[] {\n if (value === undefined) return [];\n if (!Array.isArray(value)) {\n throw new Error(`${keyPath} must be an array of strings`);\n }\n return value.map((entry, index) => {\n if (typeof entry !== \"string\" || entry.trim().length === 0) {\n throw new Error(`${keyPath}[${index}] must be a non-empty string`);\n }\n if (entry.length > maxLength) {\n throw new Error(`${keyPath}[${index}] exceeds ${maxLength} characters`);\n }\n return entry.trim();\n });\n}\n\nfunction parseBool(\n value: unknown,\n keyPath: string,\n fallback: boolean,\n): boolean {\n if (value === undefined) return fallback;\n const coerced = coerceBool(value);\n if (coerced === undefined) {\n throw new Error(\n `${keyPath} must be a boolean or one of \"true\"/\"false\"/\"1\"/\"0\"/\"yes\"/\"no\"/\"on\"/\"off\" (got ${JSON.stringify(value)})`,\n );\n }\n return coerced;\n}\n\nfunction parseEnum<T extends string>(\n value: unknown,\n keyPath: string,\n allowed: readonly T[],\n fallback: T,\n): T {\n if (value === undefined) return fallback;\n if (typeof value === \"string\" && (allowed as readonly string[]).includes(value)) {\n return value as T;\n }\n throw new Error(\n `${keyPath} must be one of ${allowed.map((entry) => `\"${entry}\"`).join(\", \")} (got ${JSON.stringify(value)})`,\n );\n}\n\nfunction parseOptionalString(\n value: unknown,\n keyPath: string,\n): string | undefined {\n if (value === undefined) return undefined;\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new Error(`${keyPath} must be a non-empty string when set`);\n }\n return value.trim();\n}\n\nfunction parseCorrectionRules(\n value: unknown,\n keyPath: string,\n): WearableCorrectionRule[] {\n if (value === undefined) return [];\n if (!Array.isArray(value)) {\n throw new Error(`${keyPath} must be an array of correction rules`);\n }\n const rules = value.map((entry, index) => {\n const raw = requireObject(entry, `${keyPath}[${index}]`);\n const rule: WearableCorrectionRule = {\n match: typeof raw.match === \"string\" ? raw.match : \"\",\n replace: typeof raw.replace === \"string\" ? raw.replace : \"\",\n };\n if (raw.regex !== undefined) {\n rule.regex = parseBool(raw.regex, `${keyPath}[${index}].regex`, false);\n }\n if (raw.caseInsensitive !== undefined) {\n rule.caseInsensitive = parseBool(\n raw.caseInsensitive,\n `${keyPath}[${index}].caseInsensitive`,\n true,\n );\n }\n if (raw.sources !== undefined) {\n if (\n !Array.isArray(raw.sources) ||\n raw.sources.some((source) => typeof source !== \"string\")\n ) {\n throw new Error(`${keyPath}[${index}].sources must be an array of strings`);\n }\n rule.sources = raw.sources as string[];\n }\n return rule;\n });\n // Compile now so bad rules fail at config load, not mid-sync.\n compileCorrectionRules(rules, keyPath);\n return rules;\n}\n\nfunction parseSourceSettings(\n value: unknown,\n keyPath: string,\n sourceId: string,\n): WearableSourceSettings {\n const raw = requireObject(value, keyPath);\n const defaults = defaultWearableSourceSettings(sourceId);\n\n const minConfidenceRaw = coerceNumber(raw.minConfidence);\n // Out-of-range values reject loudly instead of clamping — silently\n // turning minConfidence 7 into 1 would change the memory gate in a\n // way the operator never asked for (Codex P2 on PR #1458, round 3).\n if (\n raw.minConfidence !== undefined &&\n (minConfidenceRaw === undefined || minConfidenceRaw < 0 || minConfidenceRaw > 1)\n ) {\n throw new Error(\n `${keyPath}.minConfidence must be a number between 0 and 1 (got ${JSON.stringify(raw.minConfidence)})`,\n );\n }\n const minConfidence = minConfidenceRaw ?? defaults.minConfidence;\n\n const maxPerDayRaw = coerceNumber(raw.maxMemoriesPerDay);\n // Reject non-integers instead of flooring them: 0.5 would floor to 0,\n // and 0 is the documented \"disable the cap\" value — a fractional typo\n // must not silently remove the cap (Codex P2 on PR #1458).\n if (\n raw.maxMemoriesPerDay !== undefined &&\n (maxPerDayRaw === undefined ||\n !Number.isInteger(maxPerDayRaw) ||\n maxPerDayRaw < 0)\n ) {\n throw new Error(\n `${keyPath}.maxMemoriesPerDay must be a non-negative integer (0, the default, disables the cap); got ${JSON.stringify(raw.maxMemoriesPerDay)}`,\n );\n }\n // 0 is the documented \"disable the cap\" value — honored here AND in\n // the schema minimum (CLAUDE.md rule 45).\n const maxMemoriesPerDay = maxPerDayRaw ?? defaults.maxMemoriesPerDay;\n\n const parseUnitInterval = (value: unknown, name: string, fallback: number): number => {\n if (value === undefined) return fallback;\n const coerced = coerceNumber(value);\n if (coerced === undefined || coerced < 0 || coerced > 1) {\n throw new Error(\n `${keyPath}.${name} must be a number between 0 and 1 (got ${JSON.stringify(value)})`,\n );\n }\n return coerced;\n };\n const sourceTrust = parseUnitInterval(raw.sourceTrust, \"sourceTrust\", defaults.sourceTrust);\n const autoApproveTrust = parseUnitInterval(\n raw.autoApproveTrust,\n \"autoApproveTrust\",\n defaults.autoApproveTrust,\n );\n const reviewTrust = parseUnitInterval(raw.reviewTrust, \"reviewTrust\", defaults.reviewTrust);\n if (reviewTrust >= autoApproveTrust) {\n throw new Error(\n `${keyPath}.reviewTrust (${reviewTrust}) must be below autoApproveTrust (${autoApproveTrust})`,\n );\n }\n\n const rawCleanup =\n raw.cleanup === undefined ? {} : requireObject(raw.cleanup, `${keyPath}.cleanup`);\n const cleanup: WearableCleanupSettings = {\n mergeSameSpeaker: parseBool(\n rawCleanup.mergeSameSpeaker,\n `${keyPath}.cleanup.mergeSameSpeaker`,\n defaults.cleanup.mergeSameSpeaker,\n ),\n stripFillers: parseBool(\n rawCleanup.stripFillers,\n `${keyPath}.cleanup.stripFillers`,\n defaults.cleanup.stripFillers,\n ),\n collapseRepeats: parseBool(\n rawCleanup.collapseRepeats,\n `${keyPath}.cleanup.collapseRepeats`,\n defaults.cleanup.collapseRepeats,\n ),\n dropLowQuality: parseBool(\n rawCleanup.dropLowQuality,\n `${keyPath}.cleanup.dropLowQuality`,\n defaults.cleanup.dropLowQuality,\n ),\n preserveUtteranceBoundaries: parseBool(\n rawCleanup.preserveUtteranceBoundaries,\n `${keyPath}.cleanup.preserveUtteranceBoundaries`,\n // Optional on the type; the per-source default is always concrete.\n defaults.cleanup.preserveUtteranceBoundaries ?? false,\n ),\n };\n\n return {\n enabled: parseBool(raw.enabled, `${keyPath}.enabled`, false),\n apiKey: parseOptionalString(raw.apiKey, `${keyPath}.apiKey`),\n baseUrl: parseOptionalString(raw.baseUrl, `${keyPath}.baseUrl`),\n appId: parseOptionalString(raw.appId, `${keyPath}.appId`),\n userId: parseOptionalString(raw.userId, `${keyPath}.userId`),\n memoryMode: parseEnum(\n raw.memoryMode,\n `${keyPath}.memoryMode`,\n MEMORY_MODES,\n defaults.memoryMode,\n ),\n sourceTrust,\n autoApproveTrust,\n reviewTrust,\n minConfidence,\n minImportance: parseEnum(\n raw.minImportance,\n `${keyPath}.minImportance`,\n IMPORTANCE_LEVELS,\n defaults.minImportance,\n ),\n maxMemoriesPerDay,\n importNativeMemories: parseEnum(\n raw.importNativeMemories,\n `${keyPath}.importNativeMemories`,\n NATIVE_IMPORT_MODES,\n defaults.importNativeMemories,\n ),\n cleanup,\n };\n}\n\n/**\n * Parse the `wearables` config block. `undefined` yields the disabled\n * default config; any present-but-malformed value throws.\n */\nfunction parseFusionSettings(\n value: unknown,\n keyPath: string,\n): WearableFusionConfig {\n if (value === undefined) return defaultWearableFusionConfig();\n const raw = requireObject(value, keyPath);\n const defaults = defaultWearableFusionConfig();\n const parsePositiveInt = (\n value: unknown,\n name: string,\n fallback: number,\n ): number => {\n if (value === undefined) return fallback;\n const coerced = coerceNumber(value);\n if (coerced === undefined || !Number.isInteger(coerced) || coerced <= 0) {\n throw new Error(\n `${keyPath}.${name} must be a positive integer (got ${JSON.stringify(value)})`,\n );\n }\n return coerced;\n };\n return {\n enabled: parseBool(raw.enabled, `${keyPath}.enabled`, defaults.enabled),\n proximityGapMs: parsePositiveInt(\n raw.proximityGapMs,\n \"proximityGapMs\",\n defaults.proximityGapMs,\n ),\n windowToleranceMs: parsePositiveInt(\n raw.windowToleranceMs,\n \"windowToleranceMs\",\n defaults.windowToleranceMs,\n ),\n };\n}\n\nexport function parseWearablesConfig(value: unknown): WearablesConfig {\n if (value === undefined) return defaultWearablesConfig();\n const raw = requireObject(value, \"wearables\");\n const defaults = defaultWearablesConfig();\n\n const timezone = parseOptionalString(raw.timezone, \"wearables.timezone\");\n if (timezone !== undefined) {\n try {\n new Intl.DateTimeFormat(\"en-US\", { timeZone: timezone });\n } catch {\n throw new Error(\n `wearables.timezone must be a valid IANA timezone identifier (got ${JSON.stringify(timezone)})`,\n );\n }\n }\n\n let redactionPatterns: string[] = defaults.redactionPatterns;\n if (raw.redactionPatterns !== undefined) {\n if (\n !Array.isArray(raw.redactionPatterns) ||\n raw.redactionPatterns.some((pattern) => typeof pattern !== \"string\")\n ) {\n throw new Error(\"wearables.redactionPatterns must be an array of strings\");\n }\n redactionPatterns = raw.redactionPatterns as string[];\n // Compile now so invalid regexes fail at config load.\n compileRedactionPatterns(redactionPatterns);\n }\n\n const offTheRecordEnabled = parseBool(\n raw.offTheRecordEnabled,\n \"wearables.offTheRecordEnabled\",\n defaults.offTheRecordEnabled,\n );\n const rawMarkers =\n raw.offTheRecordMarkers === undefined\n ? {}\n : requireObject(raw.offTheRecordMarkers, \"wearables.offTheRecordMarkers\");\n // A typo such as `starts:` would otherwise be dropped without a word,\n // and the operator would believe a private span is protected. Core and\n // standalone callers never see OpenClaw's JSON schema, so the check\n // belongs here. Keys are compared literally so the config-contract\n // extractor can still enumerate this parser's surface.\n const {\n start: rawMarkerStart,\n end: rawMarkerEnd,\n useBuiltIns: rawMarkerUseBuiltIns,\n ...unknownMarkerKeys\n } = rawMarkers;\n const unknownMarkerNames = Object.keys(unknownMarkerKeys);\n if (unknownMarkerNames.length > 0) {\n throw new Error(\n `wearables.offTheRecordMarkers has unknown key(s) ${unknownMarkerNames.sort().join(\", \")} — valid keys are start, end, useBuiltIns`,\n );\n }\n const offTheRecordMarkers: OffTheRecordMarkerSettings = {\n start: parsePhraseList(\n rawMarkerStart,\n \"wearables.offTheRecordMarkers.start\",\n MAX_MARKER_PHRASE_LENGTH,\n ),\n end: parsePhraseList(\n rawMarkerEnd,\n \"wearables.offTheRecordMarkers.end\",\n MAX_MARKER_PHRASE_LENGTH,\n ),\n useBuiltIns: parseBool(\n rawMarkerUseBuiltIns,\n \"wearables.offTheRecordMarkers.useBuiltIns\",\n defaults.offTheRecordMarkers.useBuiltIns,\n ),\n };\n // A silent no-op is the exact failure this feature exists to remove\n // (issue #2196): turning the built-ins off without supplying a start\n // phrase would leave the gate on and matching nothing.\n if (\n offTheRecordEnabled &&\n !offTheRecordMarkers.useBuiltIns &&\n offTheRecordMarkers.start.length === 0\n ) {\n throw new Error(\n \"wearables.offTheRecordMarkers.useBuiltIns is false but no start phrase is configured — add wearables.offTheRecordMarkers.start, or set wearables.offTheRecordEnabled to false\",\n );\n }\n\n const fillerTokens = parsePhraseList(\n raw.fillerTokens,\n \"wearables.fillerTokens\",\n MAX_FILLER_TOKEN_LENGTH,\n );\n\n const parseBoundedInt = (\n value: unknown,\n name: string,\n fallback: number,\n min: number,\n max: number,\n ): number => {\n if (value === undefined) return fallback;\n const coerced = coerceNumber(value);\n if (\n coerced === undefined ||\n !Number.isInteger(coerced) ||\n coerced < min ||\n coerced > max\n ) {\n throw new Error(\n `${name} must be an integer between ${min} and ${max}; got ${JSON.stringify(value)}`,\n );\n }\n return coerced;\n };\n const autoSyncIntervalMinutes = parseBoundedInt(\n raw.autoSyncIntervalMinutes,\n \"wearables.autoSyncIntervalMinutes\",\n defaults.autoSyncIntervalMinutes,\n 1,\n MAX_AUTO_SYNC_INTERVAL_MINUTES,\n );\n const autoSyncDays = parseBoundedInt(\n raw.autoSyncDays,\n \"wearables.autoSyncDays\",\n defaults.autoSyncDays,\n 1,\n MAX_AUTO_SYNC_WINDOW_DAYS,\n );\n const autoSyncDeepDays = parseBoundedInt(\n raw.autoSyncDeepDays,\n \"wearables.autoSyncDeepDays\",\n defaults.autoSyncDeepDays,\n 0,\n MAX_AUTO_SYNC_WINDOW_DAYS,\n );\n // A deep window narrower than the every-tick window would make the\n // \"deep\" pass fetch LESS than a normal tick — reject the confusion\n // instead of silently honoring it (0 disables the deep pass).\n if (autoSyncDeepDays !== 0 && autoSyncDeepDays < autoSyncDays) {\n throw new Error(\n `wearables.autoSyncDeepDays must be 0 (disabled) or >= wearables.autoSyncDays (${autoSyncDays}); got ${autoSyncDeepDays}`,\n );\n }\n\n const sources: Record<string, WearableSourceSettings> = {};\n if (raw.sources !== undefined) {\n const rawSources = requireObject(raw.sources, \"wearables.sources\");\n for (const [sourceId, sourceValue] of Object.entries(rawSources)) {\n if (!/^[a-z][a-z0-9-]{0,63}$/.test(sourceId)) {\n throw new Error(\n `wearables.sources keys must be lowercase source ids (letters, digits, dashes); got ${JSON.stringify(sourceId)}`,\n );\n }\n sources[sourceId] = parseSourceSettings(\n sourceValue,\n `wearables.sources.${sourceId}`,\n sourceId,\n );\n }\n }\n\n return {\n enabled: parseBool(raw.enabled, \"wearables.enabled\", defaults.enabled),\n ...(timezone !== undefined ? { timezone } : {}),\n redactionEnabled: parseBool(\n raw.redactionEnabled,\n \"wearables.redactionEnabled\",\n defaults.redactionEnabled,\n ),\n redactionPatterns,\n offTheRecordEnabled,\n offTheRecordMarkers,\n fillerTokens,\n digestEnabled: parseBool(\n raw.digestEnabled,\n \"wearables.digestEnabled\",\n defaults.digestEnabled,\n ),\n autoSyncEnabled: parseBool(\n raw.autoSyncEnabled,\n \"wearables.autoSyncEnabled\",\n defaults.autoSyncEnabled,\n ),\n autoSyncIntervalMinutes,\n autoSyncDays,\n autoSyncDeepDays,\n fusion: parseFusionSettings(raw.fusion, \"wearables.fusion\"),\n corrections: parseCorrectionRules(raw.corrections, \"wearables.corrections\"),\n sources,\n };\n}\n","/**\n * Retrospective meeting detection (issue #1900, Phase 4 slice 1).\n *\n * Pure functions over a day's already-ingested signals. A meeting candidate is\n * either (a) an audio conversation overlapping a meeting-app foreground span\n * (`app+audio`), (b) a provider meeting with its own boundaries (`provider`),\n * or (c) a long enough multi-speaker conversation with no app span\n * (`audio`, the phone-call/in-person fallback). App spans with no overlapping\n * audio are NOT meetings (you were watching a recording). Candidates are then\n * merged so a day's meetings never overlap, and each gets a re-run-stable id.\n */\n\nimport { createHash } from \"node:crypto\";\n\nimport type {\n DetectedMeeting,\n MeetingAppSpan,\n MeetingAudioWindow,\n MeetingDetectionSource,\n MeetingsDetectionConfig,\n MeetingsDetectionInput,\n} from \"./types.js\";\n\n/** Shipped meeting-app patterns (used by the later activity-span derivation). */\nexport const DEFAULT_MEETING_APP_PATTERNS: readonly string[] = [\n \"zoom.us\",\n \"Zoom\",\n \"Microsoft Teams\",\n \"teams.microsoft.com\",\n \"meet.google.com\",\n \"Webex\",\n \"Slack\", // huddle windows\n \"FaceTime\",\n];\n\nexport const DEFAULT_MEETINGS_DETECTION_CONFIG: MeetingsDetectionConfig = {\n appPatterns: [...DEFAULT_MEETING_APP_PATTERNS],\n minOverlapMinutes: 2,\n audioOnlyMinMinutes: 15,\n mergeGapMinutes: 2,\n};\n\ninterface Candidate {\n startMs: number;\n endMs: number;\n app?: string;\n detectionSource: MeetingDetectionSource;\n sources: string[];\n title?: string;\n}\n\nfunction ms(iso: string): number {\n if (typeof iso !== \"string\") return Number.NaN;\n if (!Number.isFinite(Date.parse(iso))) return Number.NaN;\n // Reject invalid calendar rollovers (e.g. 2026-02-30 → Mar 2) in EITHER `Z`\n // or explicit-offset form, by validating the wall-clock calendar fields in the\n // string directly rather than trusting Date.parse's silent normalization.\n const m = iso.match(/^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(?:\\.\\d+)?(?:Z|[+-](?:0\\d:[0-5]\\d|1[0-3]:[0-5]\\d|14:00))$/);\n if (m === null) return Number.NaN;\n const [year, month, day, hour, minute, second] = m.slice(1).map(Number);\n const daysInMonth = month >= 1 && month <= 12 ? new Date(Date.UTC(year, month, 0)).getUTCDate() : 0;\n if (day < 1 || day > daysInMonth || hour > 23 || minute > 59 || second > 59) return Number.NaN;\n return Date.parse(iso);\n}\n\n/** Overlap of two half-open [start,end) windows, in milliseconds (0 if disjoint). */\nfunction overlapMs(aStart: number, aEnd: number, bStart: number, bEnd: number): number {\n const start = Math.max(aStart, bStart);\n const end = Math.min(aEnd, bEnd);\n return end > start ? end - start : 0;\n}\n\n/** Re-run-stable id: same date + exact START instant ⇒ same id. Anchored on the\n * start ONLY (end + app both excluded from the hash) so a resync that extends\n * the meeting's end (a late source / rejoin) or reassigns its app never\n * renumbers an existing record — the start is the stable identity. Full start\n * precision (NOT minute-rounded) keeps ids unique even for short provider\n * meetings that share a start minute: post-merge meetings are non-overlapping,\n * so their start instants are always distinct.\n *\n * A resync that moves a meeting's START earlier (a late source beginning before\n * the first-ingested one) does change the id — a stateless pure detector cannot\n * know the prior id. Preserving ids across a shifted start is cross-run identity\n * work that needs prior-emission state, so it belongs to the fusion/store slice\n * (#1900), which matches a re-detected meeting to its stored record by overlap\n * and keeps the original id. This function stays pure and deterministic. */\nexport function meetingId(date: string, startUtc: string): string {\n if (!isValidDay(date)) {\n throw new RangeError(`meetings: invalid day \"${date}\" for a meeting id; expected a real YYYY-MM-DD.`);\n }\n const startMs = ms(startUtc);\n if (Number.isNaN(startMs)) {\n throw new RangeError(`meetings: invalid meeting start \"${startUtc}\" for a meeting id.`);\n }\n const anchor = new Date(startMs).toISOString();\n const hash = createHash(\"sha256\").update(`${date}|${anchor}`, \"utf8\").digest(\"hex\").slice(0, 8);\n return `mtg-${date}-${hash}`;\n}\n\nfunction isFinitePair(a: number, b: number): boolean {\n return Number.isFinite(a) && Number.isFinite(b) && b > a;\n}\n\nfunction combineDetection(a: MeetingDetectionSource, b: MeetingDetectionSource): MeetingDetectionSource {\n if (a === \"app+audio\" || b === \"app+audio\") return \"app+audio\";\n if (a === \"provider\" || b === \"provider\") return \"provider\";\n return \"audio\";\n}\n\nfunction buildCandidates(\n audioWindows: MeetingAudioWindow[],\n appSpans: MeetingAppSpan[],\n config: MeetingsDetectionConfig,\n): Candidate[] {\n const minOverlapMs = config.minOverlapMinutes * 60_000;\n const audioOnlyMs = config.audioOnlyMinMinutes * 60_000;\n const candidates: Candidate[] = [];\n\n for (const window of audioWindows) {\n const startMs = ms(window.startUtc);\n const endMs = ms(window.endUtc);\n if (!isFinitePair(startMs, endMs)) continue;\n\n if (window.providerMeeting === true) {\n candidates.push({\n startMs,\n endMs,\n detectionSource: \"provider\",\n sources: [window.source],\n ...(window.title !== undefined ? { title: window.title } : {}),\n });\n continue;\n }\n\n // Best-overlapping meeting-app span (deterministic: max overlap, then earliest start).\n let bestApp: { span: MeetingAppSpan; overlap: number } | undefined;\n for (const span of appSpans) {\n const spanStart = ms(span.startUtc);\n const spanEnd = ms(span.endUtc);\n if (!isFinitePair(spanStart, spanEnd)) continue;\n const overlap = overlapMs(startMs, endMs, spanStart, spanEnd);\n // Require genuine overlap for an app+audio pairing, even when the caller\n // sets minOverlapMinutes to 0 — disjoint windows must not pair.\n if (overlap <= 0 || overlap < minOverlapMs) continue;\n if (bestApp === undefined || overlap > bestApp.overlap) {\n bestApp = { span, overlap };\n } else if (overlap === bestApp.overlap) {\n // Fully deterministic tie-break so nested/duplicate spans covering the\n // same window never depend on input order: earliest start, then app\n // name, then earliest end.\n const bestStart = ms(bestApp.span.startUtc);\n const better =\n spanStart < bestStart ||\n (spanStart === bestStart &&\n (span.app < bestApp.span.app ||\n (span.app === bestApp.span.app && spanEnd < ms(bestApp.span.endUtc))));\n if (better) bestApp = { span, overlap };\n }\n }\n\n if (bestApp !== undefined) {\n candidates.push({\n startMs,\n endMs,\n app: bestApp.span.app,\n detectionSource: \"app+audio\",\n sources: [window.source],\n ...(window.title !== undefined ? { title: window.title } : {}),\n });\n continue;\n }\n\n // Audio-only fallback: long enough, ≥ 2 distinct non-wearer speakers.\n if (\n endMs - startMs >= audioOnlyMs &&\n Number.isInteger(window.distinctNonWearerSpeakers) &&\n window.distinctNonWearerSpeakers >= 2\n ) {\n candidates.push({\n startMs,\n endMs,\n detectionSource: \"audio\",\n sources: [window.source],\n ...(window.title !== undefined ? { title: window.title } : {}),\n });\n }\n }\n\n return candidates;\n}\n\n/** Detection-source rank for a total, stable candidate ordering. */\nconst DETECTION_RANK: Record<MeetingDetectionSource, number> = {\n \"app+audio\": 0,\n provider: 1,\n audio: 2,\n};\n\n/** Total order over candidates so equal-time spans resolve deterministically. */\nfunction candidateOrder(a: Candidate, b: Candidate): number {\n return (\n a.startMs - b.startMs ||\n a.endMs - b.endMs ||\n DETECTION_RANK[a.detectionSource] - DETECTION_RANK[b.detectionSource] ||\n (a.app ?? \"\").localeCompare(b.app ?? \"\") ||\n (a.title ?? \"\").localeCompare(b.title ?? \"\") ||\n (a.sources[0] ?? \"\").localeCompare(b.sources[0] ?? \"\")\n );\n}\n\n/**\n * Merge candidates so the day's meetings never overlap. Two candidates merge\n * when they overlap, or when they are within `mergeGapMinutes` and share the\n * same app (rejoin-after-drop). Deterministic via `candidateOrder`.\n */\nfunction mergeCandidates(candidates: Candidate[], mergeGapMs: number): Candidate[] {\n const sorted = [...candidates].sort(candidateOrder);\n const merged: Candidate[] = [];\n for (const candidate of sorted) {\n const prev = merged[merged.length - 1];\n const overlaps = prev !== undefined && candidate.startMs < prev.endMs;\n const sameAppAdjacent =\n prev !== undefined &&\n prev.app !== undefined &&\n prev.app === candidate.app &&\n candidate.startMs - prev.endMs <= mergeGapMs;\n if (prev !== undefined && (overlaps || sameAppAdjacent)) {\n prev.endMs = Math.max(prev.endMs, candidate.endMs);\n prev.app = prev.app ?? candidate.app;\n prev.detectionSource = combineDetection(prev.detectionSource, candidate.detectionSource);\n prev.sources = [...new Set([...prev.sources, ...candidate.sources])];\n prev.title = prev.title ?? candidate.title;\n continue;\n }\n merged.push({ ...candidate, sources: [...candidate.sources] });\n }\n return merged;\n}\n\nfunction assertFiniteNonNegative(name: string, value: number): void {\n if (!Number.isFinite(value) || value < 0) {\n throw new RangeError(`meetings config \"${name}\" must be a finite, non-negative number (got ${value}).`);\n }\n}\n\nfunction isValidDay(date: string): boolean {\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(date);\n if (m === null) return false;\n const [, year, month, day] = m.map(Number);\n const daysInMonth = month >= 1 && month <= 12 ? new Date(Date.UTC(year, month, 0)).getUTCDate() : 0;\n return day >= 1 && day <= daysInMonth;\n}\n\nfunction validateConfig(config: MeetingsDetectionConfig): void {\n assertFiniteNonNegative(\"minOverlapMinutes\", config.minOverlapMinutes);\n assertFiniteNonNegative(\"audioOnlyMinMinutes\", config.audioOnlyMinMinutes);\n assertFiniteNonNegative(\"mergeGapMinutes\", config.mergeGapMinutes);\n}\n\n/** Detect the day's non-overlapping meetings from its audio + app-span signals. */\nexport function detectMeetings(\n input: MeetingsDetectionInput,\n config: MeetingsDetectionConfig = DEFAULT_MEETINGS_DETECTION_CONFIG,\n): DetectedMeeting[] {\n validateConfig(config);\n if (!isValidDay(input.date)) {\n // The day is embedded verbatim in every meeting id (mtg-<date>-<hash>); a\n // non-YYYY-MM-DD value would produce malformed ids (e.g. slashes).\n throw new RangeError(`meetings: invalid day \"${input.date}\"; expected a real YYYY-MM-DD.`);\n }\n const candidates = buildCandidates(input.audioWindows, input.appSpans, config);\n const merged = mergeCandidates(candidates, config.mergeGapMinutes * 60_000);\n return merged.map((candidate) => {\n const startUtc = new Date(candidate.startMs).toISOString();\n const endUtc = new Date(candidate.endMs).toISOString();\n return {\n id: meetingId(input.date, startUtc),\n date: input.date,\n startUtc,\n endUtc,\n ...(candidate.app !== undefined ? { app: candidate.app } : {}),\n detectionSource: candidate.detectionSource,\n sources: [...candidate.sources].sort((a, b) => (a < b ? -1 : a > b ? 1 : 0)),\n ...(candidate.title !== undefined ? { title: candidate.title } : {}),\n };\n });\n}\n","/**\n * Meetings config parsing — strict, loud, and default-safe (issue #1900).\n *\n * Mirrors the wearables/procedural blocks in config.ts: shape violations and\n * unparseable values throw with actionable messages (CLAUDE.md rule 51);\n * boolean-ish strings coerce via the shared helper (rule 36); every numeric\n * knob is bounds-checked; the master gate defaults OFF (rule 48) so base\n * installs see zero behavior change.\n *\n * This slice wires only the keys detection + fusion + the record store need.\n * The memory-generation knobs (summaryMode, sourceTrust, autoApproveTrust,\n * reviewTrust) land with the trust-pipeline slice.\n */\n\nimport { coerceBool, coerceNumber } from \"../connectors/coerce.js\";\nimport { DEFAULT_MEETING_APP_PATTERNS } from \"./detect.js\";\nimport type { MeetingsConfig, MeetingSummaryMode } from \"./types.js\";\n\nconst DEFAULT_MIN_OVERLAP_MINUTES = 2;\nconst DEFAULT_AUDIO_ONLY_MIN_MINUTES = 15;\nconst DEFAULT_MERGE_GAP_MINUTES = 2;\nconst DEFAULT_CONTEXT_DWELL_SECONDS = 20;\nconst DEFAULT_MAX_CONTEXT_CHARS = 4000;\nconst DEFAULT_SUMMARY_MODE: MeetingSummaryMode = \"smart\";\nconst DEFAULT_SOURCE_TRUST = 0.85;\nconst DEFAULT_AUTO_APPROVE_TRUST = 0.7;\nconst DEFAULT_REVIEW_TRUST = 0.45;\nconst SUMMARY_MODES: readonly MeetingSummaryMode[] = [\"off\", \"review\", \"smart\"];\n\nexport const DEFAULT_MEETINGS_CONFIG: MeetingsConfig = {\n enabled: false,\n appPatterns: [...DEFAULT_MEETING_APP_PATTERNS],\n minOverlapMinutes: DEFAULT_MIN_OVERLAP_MINUTES,\n audioOnlyMinMinutes: DEFAULT_AUDIO_ONLY_MIN_MINUTES,\n mergeGapMinutes: DEFAULT_MERGE_GAP_MINUTES,\n contextDwellSeconds: DEFAULT_CONTEXT_DWELL_SECONDS,\n maxContextChars: DEFAULT_MAX_CONTEXT_CHARS,\n summaryMode: DEFAULT_SUMMARY_MODE,\n sourceTrust: DEFAULT_SOURCE_TRUST,\n autoApproveTrust: DEFAULT_AUTO_APPROVE_TRUST,\n reviewTrust: DEFAULT_REVIEW_TRUST,\n};\n\nfunction parseBool(value: unknown, name: string, fallback: boolean): boolean {\n if (value === undefined || value === null) return fallback;\n const coerced = coerceBool(value);\n if (coerced === undefined) {\n throw new Error(\n `${name} must be a boolean-like value (true/false/1/0/yes/no/on/off); got ${JSON.stringify(value)}`,\n );\n }\n return coerced;\n}\n\nfunction parseBoundedInt(\n value: unknown,\n name: string,\n fallback: number,\n min: number,\n max: number,\n): number {\n if (value === undefined || value === null) return fallback;\n const coerced = coerceNumber(value);\n if (\n coerced === undefined ||\n !Number.isFinite(coerced) ||\n !Number.isInteger(coerced) ||\n coerced < min ||\n coerced > max\n ) {\n throw new Error(\n `${name} must be an integer between ${min} and ${max}; got ${JSON.stringify(value)}`,\n );\n }\n return coerced;\n}\n\nfunction parseAppPatterns(value: unknown): string[] {\n if (value === undefined || value === null) {\n return [...DEFAULT_MEETING_APP_PATTERNS];\n }\n if (!Array.isArray(value)) {\n throw new Error(\n `meetings.appPatterns must be an array of non-empty strings; got ${JSON.stringify(value)}`,\n );\n }\n const patterns: string[] = [];\n for (const entry of value) {\n if (typeof entry !== \"string\" || entry.trim().length === 0) {\n throw new Error(\n `meetings.appPatterns entries must be non-empty strings; got ${JSON.stringify(entry)}`,\n );\n }\n patterns.push(entry);\n }\n // Additive over the shipped defaults so a user extension never silently\n // drops a built-in meeting app (issue #1900 — appPatterns is additive).\n const merged = [...DEFAULT_MEETING_APP_PATTERNS, ...patterns];\n return [...new Set(merged)];\n}\n\nfunction parseSummaryMode(value: unknown): MeetingSummaryMode {\n if (value === undefined || value === null) return DEFAULT_SUMMARY_MODE;\n if (typeof value === \"string\" && (SUMMARY_MODES as readonly string[]).includes(value)) {\n return value as MeetingSummaryMode;\n }\n throw new Error(\n `meetings.summaryMode must be one of ${SUMMARY_MODES.join(\", \")}; got ${JSON.stringify(value)}`,\n );\n}\n\nfunction parseTrust01(value: unknown, name: string, fallback: number): number {\n if (value === undefined || value === null) return fallback;\n const coerced = coerceNumber(value);\n if (coerced === undefined || !Number.isFinite(coerced) || coerced < 0 || coerced > 1) {\n throw new Error(`${name} must be a number in [0, 1]; got ${JSON.stringify(value)}`);\n }\n return coerced;\n}\n\n/** Parse the `meetings` config block. Absent/`{}` → defaults (subsystem off). */\nexport function parseMeetingsConfig(value: unknown): MeetingsConfig {\n if (value === undefined || value === null) {\n return { ...DEFAULT_MEETINGS_CONFIG, appPatterns: [...DEFAULT_MEETING_APP_PATTERNS] };\n }\n if (typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(`meetings must be an object; got ${JSON.stringify(value)}`);\n }\n const raw = value as Record<string, unknown>;\n const config: MeetingsConfig = {\n enabled: parseBool(raw.enabled, \"meetings.enabled\", DEFAULT_MEETINGS_CONFIG.enabled),\n appPatterns: parseAppPatterns(raw.appPatterns),\n minOverlapMinutes: parseBoundedInt(\n raw.minOverlapMinutes,\n \"meetings.minOverlapMinutes\",\n DEFAULT_MIN_OVERLAP_MINUTES,\n 0,\n 1440,\n ),\n audioOnlyMinMinutes: parseBoundedInt(\n raw.audioOnlyMinMinutes,\n \"meetings.audioOnlyMinMinutes\",\n DEFAULT_AUDIO_ONLY_MIN_MINUTES,\n 1,\n 1440,\n ),\n mergeGapMinutes: parseBoundedInt(\n raw.mergeGapMinutes,\n \"meetings.mergeGapMinutes\",\n DEFAULT_MERGE_GAP_MINUTES,\n 0,\n 1440,\n ),\n contextDwellSeconds: parseBoundedInt(\n raw.contextDwellSeconds,\n \"meetings.contextDwellSeconds\",\n DEFAULT_CONTEXT_DWELL_SECONDS,\n 0,\n 86_400,\n ),\n maxContextChars: parseBoundedInt(\n raw.maxContextChars,\n \"meetings.maxContextChars\",\n DEFAULT_MAX_CONTEXT_CHARS,\n 0,\n 1_000_000,\n ),\n summaryMode: parseSummaryMode(raw.summaryMode),\n sourceTrust: parseTrust01(raw.sourceTrust, \"meetings.sourceTrust\", DEFAULT_SOURCE_TRUST),\n autoApproveTrust: parseTrust01(raw.autoApproveTrust, \"meetings.autoApproveTrust\", DEFAULT_AUTO_APPROVE_TRUST),\n reviewTrust: parseTrust01(raw.reviewTrust, \"meetings.reviewTrust\", DEFAULT_REVIEW_TRUST),\n };\n // decideSmart checks the auto-approve band FIRST, so autoApproveTrust below\n // reviewTrust fails open (a claim under the review bar would auto-activate).\n // Reject the inversion loudly rather than silently mis-gate meeting facts.\n if (config.autoApproveTrust < config.reviewTrust) {\n throw new Error(\n `meetings.autoApproveTrust (${config.autoApproveTrust}) must be >= meetings.reviewTrust ` +\n `(${config.reviewTrust}); an inverted gate would auto-approve below the review bar`,\n );\n }\n return config;\n}\n","import { parseActivityConfig } from \"../activity/config.js\";\nimport { parseMeetingsConfig } from \"../meetings/config.js\";\nimport { parseProvenanceConfig } from \"../provenance.js\";\n\n/** Parse capture-adjacent config blocks without location (#2044). */\nexport function parseCaptureCompanionConfigs(cfg: Record<string, unknown>) {\n return {\n activity: parseActivityConfig(cfg.activity),\n meetings: parseMeetingsConfig(cfg.meetings),\n provenance: parseProvenanceConfig(cfg.provenance),\n };\n}\n","/**\n * OKF conformance config (issue #1946). Parsed off the raw `okf` config\n * block; mirrors the meetings/wearables parse-module seam so config.ts\n * stays a thin caller.\n */\nimport { coerceBooleanLike } from \"../connectors/coerce.js\";\n\nexport interface OkfConfig {\n /** Emit inert OKF `type` metadata on writes and gate the sweep (default true). */\n conformanceEnabled: boolean;\n /** Opt-in governance sweep that backfills `type` on legacy files (default false). */\n sweepEnabled: boolean;\n /** Generate OKF index.md files in the live store (default false). */\n indexFilesEnabled: boolean;\n}\n\nexport const DEFAULT_OKF_CONFIG: OkfConfig = Object.freeze({\n conformanceEnabled: true,\n sweepEnabled: false,\n indexFilesEnabled: false,\n});\n\nexport function parseOkfConfig(raw: unknown): OkfConfig {\n if (raw === undefined || raw === null) return { ...DEFAULT_OKF_CONFIG };\n if (typeof raw !== \"object\" || Array.isArray(raw)) {\n throw new Error(\n `okf must be an object (got ${JSON.stringify(raw)}). Use okf: { conformanceEnabled: false } to opt out; omit the key for defaults.`,\n );\n }\n const record = raw as Record<string, unknown>;\n const conformance = coerceBooleanLike(record.conformanceEnabled, \"okf.conformanceEnabled\");\n const sweep = coerceBooleanLike(record.sweepEnabled, \"okf.sweepEnabled\");\n const indexFiles = coerceBooleanLike(record.indexFilesEnabled, \"okf.indexFilesEnabled\");\n return {\n conformanceEnabled: conformance ?? DEFAULT_OKF_CONFIG.conformanceEnabled,\n sweepEnabled: sweep ?? DEFAULT_OKF_CONFIG.sweepEnabled,\n indexFilesEnabled: indexFiles ?? DEFAULT_OKF_CONFIG.indexFilesEnabled,\n };\n}\n","/**\n * Action-site failure gate (issue #2382, slice 1 — core contract).\n *\n * The H6 study (#1963) measured that a failure memory delivered in the prompt\n * preamble barely changes behaviour, while the same memory delivered at the\n * moment the agent proposes the matched action removes the repeated failure.\n * This module productionises that delivery point: `ActionGateService` wraps the\n * experimental `PreActionFailureGate` primitive, adds failure-class memory\n * candidates, a per-turn budget, cross-channel suppression, and telemetry.\n *\n * Scope, per the study's honest limit: the gate removes a known failure mode.\n * It does not improve task completion. It is advisory only — it never blocks an\n * action, never outruns its deadline, and fails open on every error path.\n */\nimport type { ActionIntent, ActionStrategyId } from \"../causal-trajectory.js\";\nimport { coerceBool, coerceNumber } from \"../connectors/coerce.js\";\nimport type { CodingContext, MemoryFile } from \"../types.js\";\nimport {\n PRE_ACTION_GATE_DEFAULT_TIMEOUT_MS,\n type PreActionFailureGate,\n normalizeActionIntent,\n sanitizePayloadString,\n} from \"./pre-action-gate.js\";\n\nexport const ACTION_GATE_DEFAULT_MAX_ADVISORIES_PER_TURN = 3;\n/** Bound on a single advisory payload, above the primitive's citation bound. */\nconst MAX_ADVISORY_CHARS = 400;\n/** Bounded lexical matching: terms considered from one proposed action. */\nconst MAX_ACTION_TERMS = 24;\nconst MIN_TERM_CHARS = 3;\n/** Fraction of action terms a failure memory must mention to be a candidate. */\nconst MIN_TERM_OVERLAP_RATIO = 0.6;\n/** Sessions tracked for suppression before the oldest is evicted. */\nconst MAX_TRACKED_SESSIONS = 200;\n/** Memory ids remembered per session for cross-channel suppression. */\nconst MAX_TRACKED_IDS_PER_SESSION = 200;\n\nexport interface ActionGateConfig {\n /**\n * Master gate. Default `false`: when disabled no lookup, no matching, and no\n * suppression bookkeeping runs on any path.\n */\n enabled: boolean;\n /** Hard latency cap for a whole gate evaluation. Overrun fails open. */\n timeoutMs: number;\n /** Advisories injected per turn. `0` disables injection and all lookups. */\n maxAdvisoriesPerTurn: number;\n}\n\nexport const ACTION_GATE_DEFAULTS: ActionGateConfig = {\n enabled: false,\n timeoutMs: PRE_ACTION_GATE_DEFAULT_TIMEOUT_MS,\n maxAdvisoriesPerTurn: ACTION_GATE_DEFAULT_MAX_ADVISORIES_PER_TURN,\n};\n\nexport function parseActionGateConfig(raw: unknown): ActionGateConfig {\n if (raw !== undefined && (raw === null || typeof raw !== \"object\" || Array.isArray(raw))) {\n throw new Error(\n `actionGate must be an object (got ${JSON.stringify(raw)}). Use actionGate: { enabled: true } to opt in.`\n );\n }\n const block = (raw ?? {}) as Record<string, unknown>;\n const rawEnabled = block.enabled;\n let enabled = ACTION_GATE_DEFAULTS.enabled;\n if (rawEnabled !== undefined) {\n const coerced = coerceBool(rawEnabled);\n if (coerced === undefined) {\n throw new Error(\n `actionGate.enabled must be a boolean or one of \"true\"/\"false\"/\"1\"/\"0\"/\"yes\"/\"no\"/\"on\"/\"off\" (got ${JSON.stringify(rawEnabled)}).`\n );\n }\n enabled = coerced;\n }\n const rawTimeout = coerceNumber(block.timeoutMs);\n const timeoutMs =\n rawTimeout !== undefined && Number.isFinite(rawTimeout)\n ? Math.min(5000, Math.max(1, Math.floor(rawTimeout)))\n : ACTION_GATE_DEFAULTS.timeoutMs;\n const rawMax = coerceNumber(block.maxAdvisoriesPerTurn);\n // Zero-limit semantics are a compatibility contract: `0` stays `0`.\n const maxAdvisoriesPerTurn =\n rawMax !== undefined && Number.isFinite(rawMax)\n ? Math.min(20, Math.max(0, Math.floor(rawMax)))\n : ACTION_GATE_DEFAULTS.maxAdvisoriesPerTurn;\n return { enabled, timeoutMs, maxAdvisoriesPerTurn };\n}\n\nexport type ActionGateStatus = \"DISABLED\" | \"NO_MATCH\" | \"MATCH_WARN\" | \"ERROR_FAIL_OPEN\";\n\nexport interface ActionGateRequest {\n sessionKey: string;\n /** Turn identity: the per-turn budget and dedupe reset when this changes. */\n turnId: string;\n strategyId: ActionStrategyId;\n intent: ActionIntent;\n codingContext: CodingContext;\n /** Memory directory ALREADY resolved for the caller's readable namespace. */\n memoryDir: string;\n /** Resolved readable namespace, passed verbatim to candidate sources. */\n namespace?: string;\n causalTrajectoryStoreDir?: string;\n signal?: AbortSignal;\n}\n\nexport interface ActionGateAdvisory {\n /** Trajectory id or memory id — the unit of dedupe and suppression. */\n memoryId: string;\n sourceId: string;\n text: string;\n}\n\nexport interface ActionGateDecision {\n status: ActionGateStatus;\n advisories: ActionGateAdvisory[];\n /** Candidates withheld: already delivered this turn/session, or over budget. */\n suppressedIds: string[];\n /** Source failures, kept distinct from \"no candidates\" (rule 22). */\n degradations: string[];\n fingerprint?: string;\n reason?: string;\n latencyMs: number;\n}\n\nexport interface ActionGateCandidate {\n memoryId: string;\n advisoryText: string;\n /** Deterministic ranking key; higher wins, ties break on `memoryId`. */\n score?: number;\n}\n\nexport interface ActionGateCandidateQuery {\n sessionKey: string;\n fingerprint: string;\n /** Normalized, deduplicated lexical terms describing the proposed action. */\n actionTerms: string[];\n strategyId: ActionStrategyId;\n intent: ActionIntent;\n codingContext: CodingContext;\n memoryDir: string;\n namespace?: string;\n causalTrajectoryStoreDir?: string;\n signal?: AbortSignal;\n}\n\nexport type ActionGateSourceResult = { ok: true; candidates: ActionGateCandidate[] } | { ok: false; reason: string };\n\nexport interface ActionGateCandidateSource {\n readonly id: string;\n find(query: ActionGateCandidateQuery): Promise<ActionGateSourceResult>;\n}\n\nexport interface ActionGateAuditRecord {\n ts: string;\n sessionKey: string;\n turnId: string;\n status: ActionGateStatus;\n latencyMs: number;\n fingerprint?: string;\n deliveredIds: string[];\n suppressedIds: string[];\n degradations: string[];\n reason?: string;\n}\n\nexport type ActionGateAuditSink = (record: ActionGateAuditRecord) => void | Promise<void>;\n\nexport interface ActionGateServiceDependencies {\n sources?: ActionGateCandidateSource[];\n audit?: ActionGateAuditSink;\n clock?: () => number;\n now?: () => Date;\n}\n\n/**\n * Deterministic, local term extraction from a proposed action. No LLM and no\n * I/O: this runs in the hot path ahead of the tool call.\n */\nexport function actionTermsFor(intent: ActionIntent): string[] {\n const raw =\n intent.kind === \"command\"\n ? [intent.command, ...(intent.args ?? [])]\n : [intent.filePath, intent.editKind, intent.symbol ?? \"\", intent.range ?? \"\"];\n const terms: string[] = [];\n const seen = new Set<string>();\n for (const piece of raw) {\n for (const token of sanitizePayloadString(piece ?? \"\")\n .toLowerCase()\n .split(/[^a-z0-9._-]+/)) {\n const term = token.replace(/^[._-]+|[._-]+$/g, \"\");\n if (term.length < MIN_TERM_CHARS || seen.has(term)) continue;\n seen.add(term);\n terms.push(term);\n if (terms.length >= MAX_ACTION_TERMS) return terms;\n }\n }\n return terms;\n}\n\n/**\n * Failure-class markers on stored memories, read from frontmatter only so the\n * decision stays deterministic: explicit corrections, procedures flagged for\n * repair by library maintenance, and memories whose recorded outcomes are\n * failure-dominant.\n */\nexport function isFailureClassMemory(memory: MemoryFile): boolean {\n const fm = memory.frontmatter;\n if (fm.status !== undefined && fm.status !== \"active\") return false;\n if (fm.category === \"correction\") return true;\n if (fm.structuredAttributes?.needsRepair === \"true\") return true;\n const failures = typeof fm.mw_fail === \"number\" ? fm.mw_fail : 0;\n const successes = typeof fm.mw_success === \"number\" ? fm.mw_success : 0;\n return failures > 0 && failures > successes;\n}\n\nexport interface FailureMemorySourceDependencies {\n /**\n * Namespace-scoped listing of candidate memories. Callers wire this to a\n * storage read for the SAME namespace the gate request resolved, so a\n * principal can never receive another principal's advisories.\n */\n listMemories: (options: {\n namespace?: string;\n memoryDir: string;\n signal?: AbortSignal;\n }) => Promise<MemoryFile[]>;\n}\n\n/**\n * Failure-class memory candidates, matched by bounded lexical overlap against\n * the proposed action's terms. Deterministic and local by construction.\n */\nexport function createFailureMemoryCandidateSource(deps: FailureMemorySourceDependencies): ActionGateCandidateSource {\n return {\n id: \"failure-memory\",\n async find(query) {\n if (query.actionTerms.length === 0) return { ok: true, candidates: [] };\n let memories: MemoryFile[];\n try {\n memories = await deps.listMemories({\n namespace: query.namespace,\n memoryDir: query.memoryDir,\n signal: query.signal,\n });\n } catch (error) {\n return { ok: false, reason: error instanceof Error ? error.message : String(error) };\n }\n const required = Math.max(1, Math.ceil(query.actionTerms.length * MIN_TERM_OVERLAP_RATIO));\n const candidates: ActionGateCandidate[] = [];\n for (const memory of memories) {\n if (!isFailureClassMemory(memory)) continue;\n const haystack = `${memory.content} ${(memory.frontmatter.tags ?? []).join(\" \")}`.toLowerCase();\n let hits = 0;\n for (const term of query.actionTerms) if (haystack.includes(term)) hits += 1;\n if (hits < required) continue;\n candidates.push({\n memoryId: memory.frontmatter.id,\n score: hits,\n advisoryText: `[ActionGate] A stored failure memory matches this action: \"${memory.content}\".`,\n });\n }\n candidates.sort((left, right) => {\n const byScore = (right.score ?? 0) - (left.score ?? 0);\n return byScore !== 0 ? byScore : left.memoryId.localeCompare(right.memoryId);\n });\n return { ok: true, candidates };\n },\n };\n}\n\n/**\n * Candidate source over recorded causal-trajectory failures, delegating the\n * fingerprint match to the existing `PreActionFailureGate` primitive.\n */\nexport function createTrajectoryCandidateSource(gate: PreActionFailureGate): ActionGateCandidateSource {\n return {\n id: \"causal-trajectory\",\n async find(query) {\n const result = await gate.evaluate({\n sessionKey: query.sessionKey,\n strategyId: query.strategyId,\n intent: query.intent,\n codingContext: query.codingContext,\n memoryDir: query.memoryDir,\n causalTrajectoryStoreDir: query.causalTrajectoryStoreDir,\n signal: query.signal,\n });\n if (result.status === \"ERROR_FAIL_OPEN\") {\n return { ok: false, reason: result.reason ?? \"pre-action gate failed open\" };\n }\n if (result.status !== \"MATCH_WARN\" || !result.matchedTrajectoryId || !result.advisoryText) {\n return { ok: true, candidates: [] };\n }\n return {\n ok: true,\n candidates: [\n {\n memoryId: result.matchedTrajectoryId,\n // Trajectory matches are exact fingerprint hits: rank above lexical ones.\n score: Number.MAX_SAFE_INTEGER,\n advisoryText: result.advisoryText,\n },\n ],\n };\n },\n };\n}\n\ninterface SessionSuppression {\n turnId: string;\n /** Ids the gate delivered during `turnId`. */\n deliveredThisTurn: Set<string>;\n /** Ids the gate delivered anywhere in the session; turn-start must skip them. */\n deliveredByGate: Set<string>;\n /** Ids turn-start injection already delivered; the gate must skip them. */\n deliveredByTurnStart: Set<string>;\n}\n\n/**\n * Advisory gate evaluated immediately before an agent action.\n *\n * Delivery is bounded three ways: a hard deadline, `maxAdvisoriesPerTurn`, and\n * dedupe per memory per turn. Cross-channel suppression keeps one memory from\n * arriving twice in a session — once here and once from turn-start recall.\n */\nexport class ActionGateService {\n private readonly config: ActionGateConfig;\n private readonly sources: ActionGateCandidateSource[];\n private readonly audit?: ActionGateAuditSink;\n private readonly clock: () => number;\n private readonly now: () => Date;\n private readonly sessions = new Map<string, SessionSuppression>();\n\n constructor(config: ActionGateConfig, deps: ActionGateServiceDependencies = {}) {\n this.config = config;\n this.sources = deps.sources ?? [];\n this.audit = deps.audit;\n this.clock = deps.clock ?? Date.now;\n this.now = deps.now ?? (() => new Date());\n }\n\n /**\n * Memory ids the gate already delivered in this session. Turn-start recall\n * filters these out before its own cap, honouring the filter-then-cap order.\n */\n public suppressedForTurnStart(sessionKey: string): string[] {\n if (!this.config.enabled) return [];\n return [...(this.sessions.get(sessionKey)?.deliveredByGate ?? [])];\n }\n\n /** Record ids turn-start recall injected, so the gate will not repeat them. */\n public noteTurnStartDelivery(sessionKey: string, memoryIds: readonly string[]): void {\n if (!this.config.enabled || memoryIds.length === 0) return;\n const state = this.sessionState(sessionKey, undefined);\n for (const id of memoryIds) this.addTracked(state.deliveredByTurnStart, id);\n }\n\n public resetSession(sessionKey: string): void {\n this.sessions.delete(sessionKey);\n }\n\n async evaluate(request: ActionGateRequest): Promise<ActionGateDecision> {\n const startedAt = this.clock();\n if (!this.config.enabled) {\n return {\n status: \"DISABLED\",\n advisories: [],\n suppressedIds: [],\n degradations: [],\n reason: \"actionGate.enabled is false\",\n latencyMs: 0,\n };\n }\n if (this.config.maxAdvisoriesPerTurn === 0) {\n return this.finish(request, startedAt, {\n status: \"DISABLED\",\n advisories: [],\n suppressedIds: [],\n degradations: [],\n reason: \"actionGate.maxAdvisoriesPerTurn is 0\",\n });\n }\n\n let fingerprint: string;\n try {\n fingerprint = normalizeActionIntent(request.intent, request.strategyId, request.codingContext).fingerprint;\n } catch (error) {\n return this.finish(request, startedAt, {\n status: \"ERROR_FAIL_OPEN\",\n advisories: [],\n suppressedIds: [],\n degradations: [],\n reason: error instanceof Error ? error.message : String(error),\n });\n }\n\n const deadline = startedAt + this.config.timeoutMs;\n const collected = await this.collect(request, fingerprint, deadline);\n const state = this.sessionState(request.sessionKey, request.turnId);\n const advisories: ActionGateAdvisory[] = [];\n const suppressedIds: string[] = [];\n for (const { sourceId, candidate } of collected.candidates) {\n if (state.deliveredThisTurn.has(candidate.memoryId) || state.deliveredByTurnStart.has(candidate.memoryId)) {\n suppressedIds.push(candidate.memoryId);\n continue;\n }\n if (advisories.length >= this.config.maxAdvisoriesPerTurn) {\n suppressedIds.push(candidate.memoryId);\n continue;\n }\n advisories.push({\n memoryId: candidate.memoryId,\n sourceId,\n text: sanitizePayloadString(candidate.advisoryText).replace(/\\s+/g, \" \").slice(0, MAX_ADVISORY_CHARS),\n });\n this.addTracked(state.deliveredThisTurn, candidate.memoryId);\n this.addTracked(state.deliveredByGate, candidate.memoryId);\n }\n\n const status: ActionGateStatus =\n advisories.length > 0 ? \"MATCH_WARN\" : collected.degradations.length > 0 ? \"ERROR_FAIL_OPEN\" : \"NO_MATCH\";\n return this.finish(request, startedAt, {\n status,\n advisories,\n suppressedIds,\n degradations: collected.degradations,\n fingerprint,\n reason: status === \"ERROR_FAIL_OPEN\" ? collected.degradations[0] : undefined,\n });\n }\n\n private async collect(\n request: ActionGateRequest,\n fingerprint: string,\n deadline: number\n ): Promise<{\n candidates: Array<{ sourceId: string; candidate: ActionGateCandidate }>;\n degradations: string[];\n }> {\n if (this.sources.length === 0) return { candidates: [], degradations: [] };\n const timeoutAbort = new AbortController();\n const signal = request.signal\n ? AbortSignal.any([request.signal, timeoutAbort.signal])\n : timeoutAbort.signal;\n const query: ActionGateCandidateQuery = {\n sessionKey: request.sessionKey,\n fingerprint,\n actionTerms: actionTermsFor(request.intent),\n strategyId: request.strategyId,\n intent: request.intent,\n codingContext: request.codingContext,\n memoryDir: request.memoryDir,\n namespace: request.namespace,\n causalTrajectoryStoreDir: request.causalTrajectoryStoreDir,\n signal,\n };\n const remaining = Math.max(1, deadline - this.clock());\n let onTimeout!: (value: ActionGateSourceResult) => void;\n const timeoutResult = new Promise<ActionGateSourceResult>((resolve) => {\n onTimeout = resolve;\n });\n const timer = setTimeout(() => {\n timeoutAbort.abort();\n onTimeout({ ok: false, reason: `action gate timed out after ${this.config.timeoutMs}ms` });\n }, remaining);\n try {\n const settled = await Promise.all(\n this.sources.map(async (source) => {\n let result: ActionGateSourceResult;\n try {\n result = await Promise.race([source.find(query), timeoutResult]);\n } catch (error) {\n result = { ok: false, reason: error instanceof Error ? error.message : String(error) };\n }\n return { source, result };\n })\n );\n const candidates: Array<{ sourceId: string; candidate: ActionGateCandidate }> = [];\n const degradations: string[] = [];\n for (const { source, result } of settled) {\n if (!result.ok) {\n degradations.push(`${source.id}: ${result.reason}`);\n continue;\n }\n for (const candidate of result.candidates) candidates.push({ sourceId: source.id, candidate });\n }\n candidates.sort((left, right) => {\n const byScore = (right.candidate.score ?? 0) - (left.candidate.score ?? 0);\n if (byScore !== 0) return byScore;\n const bySource = left.sourceId.localeCompare(right.sourceId);\n return bySource !== 0 ? bySource : left.candidate.memoryId.localeCompare(right.candidate.memoryId);\n });\n return { candidates, degradations };\n } finally {\n clearTimeout(timer);\n }\n }\n\n private finish(\n request: ActionGateRequest,\n startedAt: number,\n decision: Omit<ActionGateDecision, \"latencyMs\">\n ): ActionGateDecision {\n const latencyMs = Math.max(0, this.clock() - startedAt);\n const result: ActionGateDecision = { ...decision, latencyMs };\n if (this.audit) {\n const record: ActionGateAuditRecord = {\n ts: this.now().toISOString(),\n sessionKey: request.sessionKey,\n turnId: request.turnId,\n status: result.status,\n latencyMs,\n fingerprint: result.fingerprint,\n deliveredIds: result.advisories.map((advisory) => advisory.memoryId),\n suppressedIds: result.suppressedIds,\n degradations: result.degradations,\n reason: result.reason,\n };\n // Telemetry must never break the action it observes.\n void Promise.resolve()\n .then(() => this.audit?.(record))\n .catch(() => undefined);\n }\n return result;\n }\n\n private sessionState(sessionKey: string, turnId: string | undefined): SessionSuppression {\n let state = this.sessions.get(sessionKey);\n if (!state) {\n if (this.sessions.size >= MAX_TRACKED_SESSIONS) {\n const oldest = this.sessions.keys().next().value;\n if (oldest !== undefined) this.sessions.delete(oldest);\n }\n state = {\n turnId: turnId ?? \"\",\n deliveredThisTurn: new Set(),\n deliveredByGate: new Set(),\n deliveredByTurnStart: new Set(),\n };\n this.sessions.set(sessionKey, state);\n }\n if (turnId !== undefined && state.turnId !== turnId) {\n state.turnId = turnId;\n state.deliveredThisTurn.clear();\n }\n return state;\n }\n\n private addTracked(set: Set<string>, value: string): void {\n if (set.has(value)) return;\n if (set.size >= MAX_TRACKED_IDS_PER_SESSION) {\n const oldest = set.values().next().value;\n if (oldest !== undefined) set.delete(oldest);\n }\n set.add(value);\n }\n}\n","/**\n * Config parsing for the chat feature (issue #1583).\n *\n * Kept in a dedicated module so config.ts gains only an import + one call\n * site — the god-file ratchet (#1520) tracks config.ts LOC.\n */\n\nimport type { ChatConfig } from \"../types.js\";\nimport { coerceNumber } from \"../connectors/coerce.js\";\n\nexport const DEFAULT_CHAT_CONFIG: ChatConfig = {\n enabled: false,\n model: \"\",\n maxToolCallsPerTurn: 8,\n sessionTtlHours: 72,\n};\n\n/**\n * Coerce a positive-integer config value, accepting numeric strings written\n * via CLI `key=value` paths (rule 28 — coerce at the boundary). Falls back to\n * the default for missing/unparseable values, matching the existing\n * silent-default semantics of this parser.\n */\nfunction positiveInt(value: unknown, fallback: number): number {\n const n = coerceNumber(value);\n return typeof n === \"number\" && Number.isInteger(n) && n > 0 ? n : fallback;\n}\n\n/**\n * Parse the `chat` config section from the raw config object.\n *\n * ```\n * \"chat\": {\n * \"enabled\": true,\n * \"model\": \"ollama/llama3\",\n * \"maxToolCallsPerTurn\": 8,\n * \"sessionTtlHours\": 72\n * }\n * ```\n *\n * Missing fields default to {@link DEFAULT_CHAT_CONFIG} (rule 48 — explicit\n * opt-in; `enabled` defaults to `false`).\n */\nexport function parseChatConfig(\n raw: unknown,\n): ChatConfig {\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n return { ...DEFAULT_CHAT_CONFIG };\n }\n const obj = raw as Record<string, unknown>;\n return {\n enabled: obj.enabled === true || obj.enabled === \"true\" || obj.enabled === \"1\",\n model: typeof obj.model === \"string\" ? obj.model : \"\",\n maxToolCallsPerTurn: positiveInt(obj.maxToolCallsPerTurn, DEFAULT_CHAT_CONFIG.maxToolCallsPerTurn),\n sessionTtlHours: positiveInt(obj.sessionTtlHours, DEFAULT_CHAT_CONFIG.sessionTtlHours),\n };\n}\n","import { coerceBool } from \"../connectors/coerce.js\";\nimport type {\n ScopeProfileConfig,\n ScopeProfileLayerId,\n ScopeProfilePromotionTarget,\n ScopeTeamConfig,\n} from \"../types.js\";\n\nconst SCOPE_PROFILE_LAYER_IDS = [\n \"userProject\",\n \"teamProject\",\n \"userGlobal\",\n \"serverShared\",\n] as const satisfies readonly ScopeProfileLayerId[];\nconst SCOPE_PROFILE_PROMOTION_TARGETS = [\n ...SCOPE_PROFILE_LAYER_IDS,\n] as const satisfies readonly ScopeProfilePromotionTarget[];\nconst SCOPE_PROFILE_AUTO_PROMOTE_CATEGORIES = [\n \"fact\",\n \"correction\",\n \"decision\",\n \"preference\",\n \"rule\",\n \"procedure\",\n] as const;\nconst CONFIDENCE_TIERS = [\"explicit\", \"implied\", \"inferred\", \"speculative\"] as const;\n\ntype ConfidenceTier = (typeof CONFIDENCE_TIERS)[number];\ntype AutoPromoteCategory = (typeof SCOPE_PROFILE_AUTO_PROMOTE_CATEGORIES)[number];\n\nfunction isConfidenceTier(value: unknown): value is ConfidenceTier {\n return typeof value === \"string\" && (CONFIDENCE_TIERS as readonly string[]).includes(value);\n}\n\nfunction isAutoPromoteCategory(value: unknown): value is AutoPromoteCategory {\n return typeof value === \"string\" && (SCOPE_PROFILE_AUTO_PROMOTE_CATEGORIES as readonly string[]).includes(value);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parseStringList(value: unknown, keyName: string): string[] {\n if (value === undefined || value === null) return [];\n if (!Array.isArray(value)) {\n throw new Error(`${keyName} must be an array`);\n }\n const out: string[] = [];\n for (const entry of value) {\n if (typeof entry !== \"string\" || entry.length === 0) {\n throw new Error(`${keyName} must contain only non-empty strings`);\n }\n out.push(entry);\n }\n return out;\n}\n\nfunction parseScopeProfileLayerList(\n value: unknown,\n keyName: string,\n fallback: ScopeProfileLayerId[]\n): ScopeProfileLayerId[] {\n if (value === undefined || value === null) return [...fallback];\n if (!Array.isArray(value)) {\n throw new Error(`${keyName} must be an array`);\n }\n const out: ScopeProfileLayerId[] = [];\n for (const entry of value) {\n if (!SCOPE_PROFILE_LAYER_IDS.includes(entry as ScopeProfileLayerId)) {\n throw new Error(`${keyName} contains unsupported layer: ${String(entry)}`);\n }\n if (!out.includes(entry as ScopeProfileLayerId)) {\n out.push(entry as ScopeProfileLayerId);\n }\n }\n return out;\n}\n\nfunction parseScopeProfilePromotionTargets(value: unknown, keyName: string): ScopeProfilePromotionTarget[] {\n if (value === undefined || value === null) return [];\n if (!Array.isArray(value)) {\n throw new Error(`${keyName} must be an array`);\n }\n const out: ScopeProfilePromotionTarget[] = [];\n for (const entry of value) {\n if (!SCOPE_PROFILE_PROMOTION_TARGETS.includes(entry as ScopeProfilePromotionTarget)) {\n throw new Error(`${keyName} contains unsupported target: ${String(entry)}`);\n }\n if (!out.includes(entry as ScopeProfilePromotionTarget)) {\n out.push(entry as ScopeProfilePromotionTarget);\n }\n }\n return out;\n}\n\nexport function parseScopeProfiles(value: unknown): Record<string, ScopeProfileConfig> {\n if (value === undefined || value === null) return {};\n if (!isRecord(value)) {\n throw new Error(\"scopeProfiles must be an object\");\n }\n const profiles: Record<string, ScopeProfileConfig> = {};\n for (const [profileId, rawProfile] of Object.entries(value)) {\n if (profileId.trim().length === 0) {\n throw new Error(\"scopeProfiles keys must not be empty\");\n }\n if (!isRecord(rawProfile)) {\n throw new Error(`scopeProfiles.${profileId} must be an object`);\n }\n const readOrder = parseScopeProfileLayerList(rawProfile.readOrder, `scopeProfiles.${profileId}.readOrder`, [\n \"userProject\",\n \"userGlobal\",\n \"serverShared\",\n ]);\n const writeDefault =\n rawProfile.writeDefault === undefined || rawProfile.writeDefault === null\n ? \"userProject\"\n : rawProfile.writeDefault;\n if (!SCOPE_PROFILE_LAYER_IDS.includes(writeDefault as ScopeProfileLayerId)) {\n throw new Error(`scopeProfiles.${profileId}.writeDefault contains unsupported layer: ${String(writeDefault)}`);\n }\n if (rawProfile.teamProject !== undefined && rawProfile.teamProject !== null && !isRecord(rawProfile.teamProject)) {\n throw new Error(`scopeProfiles.${profileId}.teamProject must be an object`);\n }\n const teamProject = (() => {\n if (!isRecord(rawProfile.teamProject)) return undefined;\n const out: NonNullable<ScopeProfileConfig[\"teamProject\"]> = {};\n if (rawProfile.teamProject.namespaceTemplate !== undefined) {\n if (\n typeof rawProfile.teamProject.namespaceTemplate !== \"string\" ||\n rawProfile.teamProject.namespaceTemplate.length === 0\n ) {\n throw new Error(`scopeProfiles.${profileId}.teamProject.namespaceTemplate must be a non-empty string`);\n }\n out.namespaceTemplate = rawProfile.teamProject.namespaceTemplate;\n }\n if (rawProfile.teamProject.teamId !== undefined) {\n if (typeof rawProfile.teamProject.teamId !== \"string\" || rawProfile.teamProject.teamId.length === 0) {\n throw new Error(`scopeProfiles.${profileId}.teamProject.teamId must be a non-empty string`);\n }\n out.teamId = rawProfile.teamProject.teamId;\n }\n return out;\n })();\n if (rawProfile.autoPromote !== undefined && rawProfile.autoPromote !== null && !isRecord(rawProfile.autoPromote)) {\n throw new Error(`scopeProfiles.${profileId}.autoPromote must be an object`);\n }\n const rawAutoPromote = isRecord(rawProfile.autoPromote) ? rawProfile.autoPromote : {};\n const hasAutoPromoteEnabled = Object.prototype.hasOwnProperty.call(rawAutoPromote, \"enabled\");\n const autoPromoteEnabled = coerceBool(rawAutoPromote.enabled);\n if (hasAutoPromoteEnabled && autoPromoteEnabled === undefined) {\n throw new Error(`scopeProfiles.${profileId}.autoPromote.enabled must be a boolean or boolean-like string`);\n }\n const minConfidenceTier = (() => {\n const rawTier = rawAutoPromote.minConfidenceTier;\n if (rawTier === undefined || rawTier === null) return \"explicit\";\n if (!isConfidenceTier(rawTier)) {\n throw new Error(\n `scopeProfiles.${profileId}.autoPromote.minConfidenceTier must be one of: ${CONFIDENCE_TIERS.join(\", \")}`\n );\n }\n return rawTier;\n })();\n const autoPromoteCategories: AutoPromoteCategory[] = (() => {\n if (rawAutoPromote.categories === undefined || rawAutoPromote.categories === null) {\n return [\"fact\", \"correction\", \"decision\", \"preference\"];\n }\n if (!Array.isArray(rawAutoPromote.categories)) {\n throw new Error(`scopeProfiles.${profileId}.autoPromote.categories must be an array`);\n }\n const categories: AutoPromoteCategory[] = [];\n for (const entry of rawAutoPromote.categories) {\n if (!isAutoPromoteCategory(entry)) {\n throw new Error(\n `scopeProfiles.${profileId}.autoPromote.categories must contain only: ${SCOPE_PROFILE_AUTO_PROMOTE_CATEGORIES.join(\", \")}`\n );\n }\n categories.push(entry);\n }\n return categories;\n })();\n profiles[profileId] = {\n readOrder,\n writeDefault: writeDefault as ScopeProfileLayerId,\n promotionTargets: parseScopeProfilePromotionTargets(\n rawProfile.promotionTargets,\n `scopeProfiles.${profileId}.promotionTargets`\n ),\n ...(teamProject && Object.keys(teamProject).length > 0 ? { teamProject } : {}),\n autoPromote: {\n enabled: autoPromoteEnabled === true,\n targets: parseScopeProfilePromotionTargets(\n rawAutoPromote.targets,\n `scopeProfiles.${profileId}.autoPromote.targets`\n ),\n categories: autoPromoteCategories,\n minConfidenceTier,\n },\n };\n }\n return profiles;\n}\n\nexport function parseScopeTeams(value: unknown): Record<string, ScopeTeamConfig> {\n if (value === undefined || value === null) return {};\n if (!isRecord(value)) {\n throw new Error(\"teams must be an object\");\n }\n const teams: Record<string, ScopeTeamConfig> = {};\n for (const [teamId, rawTeam] of Object.entries(value)) {\n if (teamId.trim().length === 0) {\n throw new Error(\"teams keys must not be empty\");\n }\n if (!isRecord(rawTeam)) {\n throw new Error(`teams.${teamId} must be an object`);\n }\n const projectNamespaceTemplate = rawTeam.projectNamespaceTemplate;\n if (projectNamespaceTemplate !== undefined) {\n if (typeof projectNamespaceTemplate !== \"string\" || projectNamespaceTemplate.length === 0) {\n throw new Error(`teams.${teamId}.projectNamespaceTemplate must be a non-empty string`);\n }\n }\n teams[teamId] = {\n principals: parseStringList(rawTeam.principals, `teams.${teamId}.principals`),\n ...(projectNamespaceTemplate !== undefined ? { projectNamespaceTemplate } : {}),\n read: parseStringList(rawTeam.read, `teams.${teamId}.read`),\n write: parseStringList(rawTeam.write, `teams.${teamId}.write`),\n promote: parseStringList(rawTeam.promote, `teams.${teamId}.promote`),\n };\n }\n return teams;\n}\n\nexport function validateScopeProfileTeamReferences(\n profiles: Record<string, ScopeProfileConfig>,\n teams: Record<string, ScopeTeamConfig>\n): void {\n for (const [profileId, profile] of Object.entries(profiles)) {\n const teamId = profile.teamProject?.teamId;\n if (teamId && !Object.prototype.hasOwnProperty.call(teams, teamId)) {\n throw new Error(`scopeProfiles.${profileId}.teamProject.teamId references unknown team: ${teamId}`);\n }\n }\n}\n"],"mappings":"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","names":["describeValue","value","parseBoundedInt","DEFAULT_SOURCE_TRUST","DEFAULT_AUTO_APPROVE_TRUST","DEFAULT_REVIEW_TRUST","parseBool","raw"]}