@remnic/core 9.7.15 → 9.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (929) hide show
  1. package/dist/access-admin-ops-surface.d.ts +13 -6
  2. package/dist/access-admin-ops-surface.js +85 -71
  3. package/dist/access-audit.js +2 -2
  4. package/dist/access-boundary.d.ts +35 -17
  5. package/dist/access-boundary.js +86 -74
  6. package/dist/access-citation.d.ts +28 -0
  7. package/dist/access-citation.js +9 -0
  8. package/dist/access-cli.js +194 -178
  9. package/dist/access-cli.js.map +1 -1
  10. package/dist/access-errors.d.ts +16 -1
  11. package/dist/access-errors.js +7 -3
  12. package/dist/access-http.d.ts +25 -19
  13. package/dist/access-http.js +100 -87
  14. package/dist/access-identity-continuity-surface.d.ts +13 -8
  15. package/dist/access-identity-continuity-surface.js +85 -71
  16. package/dist/access-lcm-surface.d.ts +16 -9
  17. package/dist/access-lcm-surface.js +85 -71
  18. package/dist/access-mcp.d.ts +23 -16
  19. package/dist/access-mcp.js +96 -84
  20. package/dist/access-memory-search-fanout.d.ts +93 -0
  21. package/dist/access-memory-search-fanout.js +18 -0
  22. package/dist/access-observe-write-surface.d.ts +26 -8
  23. package/dist/access-observe-write-surface.js +85 -71
  24. package/dist/access-operations-batch.js +92 -80
  25. package/dist/access-operations.d.ts +29 -22
  26. package/dist/access-operations.js +94 -82
  27. package/dist/access-recall-concurrency.d.ts +250 -0
  28. package/dist/access-recall-concurrency.js +157 -0
  29. package/dist/access-recall-response.d.ts +130 -0
  30. package/dist/access-recall-response.js +147 -0
  31. package/dist/access-recall-surface.d.ts +15 -7
  32. package/dist/access-recall-surface.js +85 -71
  33. package/dist/access-schema.d.ts +98 -98
  34. package/dist/access-schema.js +8 -6
  35. package/dist/{access-service-DpcYZ9Nl.d.ts → access-service-DEL4qCrc.d.ts} +25 -32
  36. package/dist/access-service.d.ts +13 -6
  37. package/dist/access-service.js +89 -72
  38. package/dist/access-surface-catalog.d.ts +23 -16
  39. package/dist/access-surface-catalog.js +1 -0
  40. package/dist/access-surface-catalog.js.map +1 -1
  41. package/dist/access-token-capabilities.d.ts +2 -1
  42. package/dist/access-token-capabilities.js +4 -2
  43. package/dist/action-confidence.d.ts +3 -1
  44. package/dist/active-memory-bridge.d.ts +3 -1
  45. package/dist/active-memory-bridge.js +4 -4
  46. package/dist/active-recall.d.ts +4 -1
  47. package/dist/active-recall.js +23 -13
  48. package/dist/active-recall.js.map +1 -1
  49. package/dist/adapters/index.js +4 -4
  50. package/dist/adapters/registry.js +2 -2
  51. package/dist/{auto-sync-AAMTVZMK.js → auto-sync-UZG3XQZ5.js} +14 -8
  52. package/dist/{auto-sync-AAMTVZMK.js.map → auto-sync-UZG3XQZ5.js.map} +1 -1
  53. package/dist/behavior-learner.d.ts +3 -1
  54. package/dist/behavior-signals.d.ts +3 -1
  55. package/dist/bootstrap.d.ts +12 -7
  56. package/dist/bootstrap.js +2 -2
  57. package/dist/bounded-jsonl-state.d.ts +54 -0
  58. package/dist/bounded-jsonl-state.js +10 -0
  59. package/dist/boxes.js +2 -2
  60. package/dist/briefing.d.ts +5 -2
  61. package/dist/briefing.js +34 -24
  62. package/dist/buffer-surprise-report.d.ts +3 -1
  63. package/dist/buffer.d.ts +60 -2
  64. package/dist/buffer.js +3 -3
  65. package/dist/bulk-import/index.d.ts +5 -3
  66. package/dist/calibration.d.ts +3 -1
  67. package/dist/calibration.js +6 -6
  68. package/dist/capabilities.d.ts +7 -7
  69. package/dist/capabilities.js +1 -1
  70. package/dist/{capsule-crypto-CZJSLEFG.js → capsule-crypto-YO5QJ6L3.js} +3 -3
  71. package/dist/capsule-crypto-YO5QJ6L3.js.map +1 -0
  72. package/dist/{catalog-C9444P10.d.ts → catalog-BWqHb5HT.d.ts} +1 -1
  73. package/dist/causal-behavior.d.ts +3 -1
  74. package/dist/causal-behavior.js +6 -6
  75. package/dist/causal-chain.js +4 -4
  76. package/dist/causal-consolidation.d.ts +3 -1
  77. package/dist/causal-consolidation.js +43 -34
  78. package/dist/causal-consolidation.js.map +1 -1
  79. package/dist/causal-retrieval.js +6 -6
  80. package/dist/causal-trajectory-graph.d.ts +3 -1
  81. package/dist/causal-trajectory-graph.js +1 -1
  82. package/dist/causal-trajectory.js +1 -1
  83. package/dist/{chunk-A3GOMRJG.js → chunk-23L3IXFD.js} +2 -2
  84. package/dist/chunk-2CGLBUW3.js +15 -0
  85. package/dist/chunk-2CGLBUW3.js.map +1 -0
  86. package/dist/{chunk-MRHFJV44.js → chunk-2DQ2XREU.js} +2 -2
  87. package/dist/{chunk-QKQYXZVS.js → chunk-2EJOEICD.js} +1819 -1481
  88. package/dist/chunk-2EJOEICD.js.map +1 -0
  89. package/dist/{chunk-L2B3EE7B.js → chunk-2QMKMVHH.js} +2 -2
  90. package/dist/{chunk-VJVNLNDQ.js → chunk-2UFO7X4Q.js} +7 -7
  91. package/dist/{chunk-2MR3MFQB.js → chunk-2VEOKUPP.js} +3 -3
  92. package/dist/chunk-2Z24E5W2.js +22 -0
  93. package/dist/chunk-2Z24E5W2.js.map +1 -0
  94. package/dist/{chunk-RHOZ5LLO.js → chunk-347WD2LE.js} +2 -2
  95. package/dist/{chunk-HDTQVNWD.js → chunk-3QAH2S33.js} +3 -3
  96. package/dist/{chunk-37CTGERM.js → chunk-3WCASNQZ.js} +12 -1
  97. package/dist/chunk-3WCASNQZ.js.map +1 -0
  98. package/dist/{chunk-LRNMRXJO.js → chunk-3Y224NYC.js} +3 -3
  99. package/dist/{chunk-3IY64MV6.js → chunk-44XZ75OQ.js} +44 -10
  100. package/dist/chunk-44XZ75OQ.js.map +1 -0
  101. package/dist/{chunk-VFSP73LP.js → chunk-45GF7Y3V.js} +2 -2
  102. package/dist/{chunk-K7LOWSLU.js → chunk-4BJQODZF.js} +2479 -1520
  103. package/dist/chunk-4BJQODZF.js.map +1 -0
  104. package/dist/{chunk-JREB6UFH.js → chunk-57OWKFUQ.js} +17 -6
  105. package/dist/chunk-57OWKFUQ.js.map +1 -0
  106. package/dist/{chunk-OEHCMALU.js → chunk-5I4M26Q7.js} +5 -5
  107. package/dist/{chunk-2AZXIZEN.js → chunk-5Q7EVV4X.js} +6 -6
  108. package/dist/{chunk-LC7OODWZ.js → chunk-5SB7SC2G.js} +80 -49
  109. package/dist/chunk-5SB7SC2G.js.map +1 -0
  110. package/dist/{chunk-PUBTHW5O.js → chunk-6DRPPQEJ.js} +2 -2
  111. package/dist/{chunk-NWTGD4AN.js → chunk-6KIQT7RG.js} +10 -9
  112. package/dist/chunk-6KIQT7RG.js.map +1 -0
  113. package/dist/{chunk-FDCTQWLW.js → chunk-6O22TZSB.js} +3 -3
  114. package/dist/{chunk-ZQ7UBUZ6.js → chunk-6QYST5XN.js} +6 -6
  115. package/dist/{chunk-W4PGTAS2.js → chunk-6WAFYNVT.js} +3 -3
  116. package/dist/chunk-6ZMAMSHS.js +20 -0
  117. package/dist/chunk-6ZMAMSHS.js.map +1 -0
  118. package/dist/{chunk-R5VAVVHP.js → chunk-72A4L5JJ.js} +2 -2
  119. package/dist/{chunk-X64YLC24.js → chunk-72VAXGEI.js} +5 -13
  120. package/dist/chunk-72VAXGEI.js.map +1 -0
  121. package/dist/{chunk-IKQTFQMI.js → chunk-755Q3DGF.js} +22 -3
  122. package/dist/chunk-755Q3DGF.js.map +1 -0
  123. package/dist/{chunk-OVJ2HIPE.js → chunk-76GLCM57.js} +158 -125
  124. package/dist/chunk-76GLCM57.js.map +1 -0
  125. package/dist/{chunk-D7FOKIY5.js → chunk-7AMFUATK.js} +12 -9
  126. package/dist/{chunk-D7FOKIY5.js.map → chunk-7AMFUATK.js.map} +1 -1
  127. package/dist/{chunk-BFVEEB7W.js → chunk-7ON2JW73.js} +57 -22
  128. package/dist/chunk-7ON2JW73.js.map +1 -0
  129. package/dist/chunk-7RNBVZZO.js +270 -0
  130. package/dist/chunk-7RNBVZZO.js.map +1 -0
  131. package/dist/{chunk-3FAMU5TX.js → chunk-A6USBZTO.js} +2 -2
  132. package/dist/{chunk-ZHIVCODT.js → chunk-A72SWTWW.js} +7 -7
  133. package/dist/{chunk-FC77VUX5.js → chunk-A7Q43EUZ.js} +2 -2
  134. package/dist/{chunk-UJBESW6X.js → chunk-AE7WMV4V.js} +7 -7
  135. package/dist/{chunk-J2HSAU72.js → chunk-AIK5W3IW.js} +29 -1
  136. package/dist/chunk-AIK5W3IW.js.map +1 -0
  137. package/dist/{chunk-A5UXZRRM.js → chunk-AJ7QCSIS.js} +2 -2
  138. package/dist/{chunk-FNMFJWBY.js → chunk-ANEUPF6O.js} +5 -5
  139. package/dist/chunk-AREGMX2J.js +50 -0
  140. package/dist/chunk-AREGMX2J.js.map +1 -0
  141. package/dist/chunk-AVPXXV6J.js +448 -0
  142. package/dist/chunk-AVPXXV6J.js.map +1 -0
  143. package/dist/{chunk-2A3OXAP2.js → chunk-B7RWBZXW.js} +2 -2
  144. package/dist/{chunk-GWTFLF2P.js → chunk-BJMBJZ2Y.js} +59 -59
  145. package/dist/chunk-BJMBJZ2Y.js.map +1 -0
  146. package/dist/{chunk-74F5STS4.js → chunk-BLAKS3CP.js} +4 -4
  147. package/dist/{chunk-M7VGG3ID.js → chunk-BV5WMSIJ.js} +9 -9
  148. package/dist/{chunk-2BFLDH5F.js → chunk-BXLOS5AJ.js} +2 -2
  149. package/dist/{chunk-UXKMMNJD.js → chunk-C23BYTJV.js} +6 -6
  150. package/dist/{chunk-JZHHREBL.js → chunk-C3AKM55W.js} +2 -2
  151. package/dist/{chunk-RP7YXA67.js → chunk-C5JF6EZ7.js} +2 -2
  152. package/dist/{chunk-T7Y5KPLN.js → chunk-C6XBRYVD.js} +16 -15
  153. package/dist/chunk-C6XBRYVD.js.map +1 -0
  154. package/dist/{chunk-FTYDWKO6.js → chunk-CEN6DW6X.js} +12 -2
  155. package/dist/chunk-CEN6DW6X.js.map +1 -0
  156. package/dist/chunk-CGASUJVP.js +421 -0
  157. package/dist/chunk-CGASUJVP.js.map +1 -0
  158. package/dist/{chunk-EHCONI6E.js → chunk-CQMEM5CC.js} +2 -2
  159. package/dist/{chunk-PBNZVPFS.js → chunk-CXZQOVIE.js} +12 -12
  160. package/dist/chunk-D3V3UMET.js +44 -0
  161. package/dist/chunk-D3V3UMET.js.map +1 -0
  162. package/dist/{chunk-7N2RUBAP.js → chunk-DDA47TES.js} +2 -2
  163. package/dist/{chunk-64SE4X5G.js → chunk-DEBHXHJR.js} +3 -3
  164. package/dist/{chunk-EHK6KZHK.js → chunk-DNHVPZOD.js} +2 -2
  165. package/dist/{chunk-437S3G37.js → chunk-DQEMWVMT.js} +2 -2
  166. package/dist/{chunk-LZZNTPLR.js → chunk-DX3XRGLH.js} +2 -2
  167. package/dist/chunk-EA2H5LML.js +72 -0
  168. package/dist/chunk-EA2H5LML.js.map +1 -0
  169. package/dist/{chunk-INELTPRG.js → chunk-EEC7UJPX.js} +103 -106
  170. package/dist/chunk-EEC7UJPX.js.map +1 -0
  171. package/dist/{chunk-KSNVDPDF.js → chunk-EKBNDKDY.js} +21 -20
  172. package/dist/chunk-EKBNDKDY.js.map +1 -0
  173. package/dist/{chunk-YF6FMLBT.js → chunk-EQWEIIKQ.js} +64 -34
  174. package/dist/chunk-EQWEIIKQ.js.map +1 -0
  175. package/dist/{chunk-DZKHSDOM.js → chunk-ES36HTSC.js} +4 -4
  176. package/dist/{chunk-TN7THW5U.js → chunk-ET356KSB.js} +2 -2
  177. package/dist/{chunk-YNDLCWXS.js → chunk-EZ25VE3G.js} +4 -4
  178. package/dist/{chunk-DMSDUGDM.js → chunk-F7GAIWFA.js} +20 -20
  179. package/dist/{chunk-G6XXLKC5.js → chunk-FFPJINJE.js} +6 -6
  180. package/dist/chunk-FMLKOL2Z.js +636 -0
  181. package/dist/chunk-FMLKOL2Z.js.map +1 -0
  182. package/dist/chunk-FQC3DHH2.js +20 -0
  183. package/dist/chunk-FQC3DHH2.js.map +1 -0
  184. package/dist/{chunk-G4CN3ZXL.js → chunk-FUTF72MJ.js} +15 -15
  185. package/dist/chunk-GCASGYIO.js +71 -0
  186. package/dist/chunk-GCASGYIO.js.map +1 -0
  187. package/dist/{chunk-HF77M34J.js → chunk-GFPZS3F5.js} +8 -8
  188. package/dist/{chunk-BCDKBDSY.js → chunk-GNVZQ5JN.js} +99 -41
  189. package/dist/chunk-GNVZQ5JN.js.map +1 -0
  190. package/dist/{chunk-G6NKALRN.js → chunk-H4WG3UQZ.js} +2 -2
  191. package/dist/{chunk-UDQUSU27.js → chunk-HNZKVLAN.js} +2 -2
  192. package/dist/{chunk-5EZXHU36.js → chunk-HYQJQGD3.js} +2 -2
  193. package/dist/{chunk-OAZVR2BV.js → chunk-IDZFBSHN.js} +8 -6
  194. package/dist/{chunk-OAZVR2BV.js.map → chunk-IDZFBSHN.js.map} +1 -1
  195. package/dist/{chunk-PLQE6MJA.js → chunk-IFH6LWTO.js} +50 -8
  196. package/dist/chunk-IFH6LWTO.js.map +1 -0
  197. package/dist/{chunk-RULE4VG5.js → chunk-ILGC6JH6.js} +21 -6
  198. package/dist/chunk-ILGC6JH6.js.map +1 -0
  199. package/dist/chunk-IUM3VSHI.js +113 -0
  200. package/dist/chunk-IUM3VSHI.js.map +1 -0
  201. package/dist/{chunk-DCFV7A7H.js → chunk-IYNGIMVG.js} +101 -91
  202. package/dist/chunk-IYNGIMVG.js.map +1 -0
  203. package/dist/{chunk-TRWPCR6P.js → chunk-JECBQBEX.js} +3 -3
  204. package/dist/{chunk-E6CBU7XP.js → chunk-JYIFGGEM.js} +2 -2
  205. package/dist/{chunk-VA4WSW54.js → chunk-JYIJNNN3.js} +3 -3
  206. package/dist/{chunk-L5HJQC36.js → chunk-K2TDK7GG.js} +3 -3
  207. package/dist/{chunk-KDXVOFYY.js → chunk-KAVBJSBQ.js} +4 -4
  208. package/dist/{chunk-BS4SGLWV.js → chunk-KF5EUVKQ.js} +16 -6
  209. package/dist/chunk-KF5EUVKQ.js.map +1 -0
  210. package/dist/chunk-KFZY2OFH.js +42 -0
  211. package/dist/chunk-KFZY2OFH.js.map +1 -0
  212. package/dist/{chunk-4OKLXWDZ.js → chunk-KNB7IBBU.js} +2 -2
  213. package/dist/{chunk-QLULYKWZ.js → chunk-KSXJOC4F.js} +2 -2
  214. package/dist/{chunk-2S6QHZGJ.js → chunk-L2DPF4DF.js} +1 -1
  215. package/dist/{chunk-JI5AVXYO.js → chunk-LEPOP46W.js} +6 -6
  216. package/dist/{chunk-O7BBFJLP.js → chunk-LTAVSOZW.js} +2 -2
  217. package/dist/{chunk-E3VODCC3.js → chunk-LUDXM7MD.js} +14 -2
  218. package/dist/{chunk-E3VODCC3.js.map → chunk-LUDXM7MD.js.map} +1 -1
  219. package/dist/{chunk-2IZAGAJR.js → chunk-LULR4IUW.js} +3 -3
  220. package/dist/{chunk-QQGPUKMT.js → chunk-MC5Q3J7S.js} +398 -7
  221. package/dist/chunk-MC5Q3J7S.js.map +1 -0
  222. package/dist/{chunk-WMWVO45V.js → chunk-MC6XO7T4.js} +2 -2
  223. package/dist/chunk-MKQBXQKU.js +107 -0
  224. package/dist/chunk-MKQBXQKU.js.map +1 -0
  225. package/dist/{chunk-7PND4PUC.js → chunk-MMGGVZ4Q.js} +29 -9
  226. package/dist/{chunk-7PND4PUC.js.map → chunk-MMGGVZ4Q.js.map} +1 -1
  227. package/dist/{chunk-D6RIFG4O.js → chunk-MNB5RMAY.js} +2 -2
  228. package/dist/{chunk-Q5WG43OP.js → chunk-MYFQ3ED4.js} +7 -7
  229. package/dist/{chunk-V3UE5I5F.js → chunk-MYVPLJOO.js} +2 -2
  230. package/dist/chunk-NINSR6LX.js +83 -0
  231. package/dist/chunk-NINSR6LX.js.map +1 -0
  232. package/dist/{chunk-MTWKDOVO.js → chunk-NLE6TSLG.js} +2 -2
  233. package/dist/{chunk-DBRYEIGY.js → chunk-OJP3N7UK.js} +2 -2
  234. package/dist/{chunk-VDW4VU7B.js → chunk-OQJIB32H.js} +28 -23
  235. package/dist/chunk-OQJIB32H.js.map +1 -0
  236. package/dist/{chunk-SMX5267P.js → chunk-OZKOPQCM.js} +2 -2
  237. package/dist/{chunk-JCK7V6SN.js → chunk-P65YJEEL.js} +2 -2
  238. package/dist/{chunk-MTR7BZQN.js → chunk-PBGWYM3H.js} +3 -3
  239. package/dist/chunk-PIG4WJFQ.js +87 -0
  240. package/dist/chunk-PIG4WJFQ.js.map +1 -0
  241. package/dist/chunk-PQVCH2AE.js +76 -0
  242. package/dist/chunk-PQVCH2AE.js.map +1 -0
  243. package/dist/{chunk-AXTXN4T6.js → chunk-PWFCHOB3.js} +2 -2
  244. package/dist/{chunk-FDPZVY6D.js → chunk-QFN4U7AG.js} +2 -2
  245. package/dist/{chunk-K2ZLHESQ.js → chunk-QIEUU4UK.js} +2 -2
  246. package/dist/{chunk-DYP3YYJJ.js → chunk-QJAQNXWI.js} +39 -5
  247. package/dist/chunk-QJAQNXWI.js.map +1 -0
  248. package/dist/{chunk-3D6AFGQR.js → chunk-QVT3E4CE.js} +7 -7
  249. package/dist/{chunk-FIJUY7GG.js → chunk-R26ZMXR2.js} +23 -23
  250. package/dist/{chunk-FIJUY7GG.js.map → chunk-R26ZMXR2.js.map} +1 -1
  251. package/dist/chunk-R3DJVOSM.js +34 -0
  252. package/dist/chunk-R3DJVOSM.js.map +1 -0
  253. package/dist/{chunk-SFQ6QNL7.js → chunk-R6YJI3HE.js} +2 -1
  254. package/dist/{chunk-5CJVLG3H.js → chunk-RFDD3B7W.js} +5 -5
  255. package/dist/{chunk-JBPKEARU.js → chunk-RKNJBZ55.js} +4 -4
  256. package/dist/chunk-ROI7BK7H.js +88 -0
  257. package/dist/chunk-ROI7BK7H.js.map +1 -0
  258. package/dist/{chunk-FNZQGN76.js → chunk-S2BBISHU.js} +4 -4
  259. package/dist/{chunk-IALLX7EE.js → chunk-S2FSBU4H.js} +3 -3
  260. package/dist/{chunk-BFPETA3S.js → chunk-SCCO46KZ.js} +3 -2
  261. package/dist/chunk-SCCO46KZ.js.map +1 -0
  262. package/dist/chunk-SICXL4MK.js +165 -0
  263. package/dist/chunk-SICXL4MK.js.map +1 -0
  264. package/dist/chunk-SK7AMF2J.js +168 -0
  265. package/dist/chunk-SK7AMF2J.js.map +1 -0
  266. package/dist/{chunk-LZOV7MX7.js → chunk-TDTXKOAJ.js} +6474 -5747
  267. package/dist/chunk-TDTXKOAJ.js.map +1 -0
  268. package/dist/{chunk-KSBEEMQF.js → chunk-TG6IHVE2.js} +151 -6
  269. package/dist/chunk-TG6IHVE2.js.map +1 -0
  270. package/dist/{chunk-7K5Q6COX.js → chunk-TVVEYCNW.js} +4 -4
  271. package/dist/{chunk-DPAENM7O.js → chunk-U3ZAVRP3.js} +2 -2
  272. package/dist/{chunk-ODPLEWB6.js → chunk-UFGFMWAD.js} +47 -17
  273. package/dist/chunk-UFGFMWAD.js.map +1 -0
  274. package/dist/{chunk-4KJLYTLS.js → chunk-V57NLO5P.js} +2 -2
  275. package/dist/{chunk-FLVL4L3L.js → chunk-VDX2J7OX.js} +2 -2
  276. package/dist/{chunk-AJLLIIML.js → chunk-W4FBGYGK.js} +1 -1
  277. package/dist/{chunk-TXLGHDHS.js → chunk-W4XJFLAL.js} +53 -32
  278. package/dist/chunk-W4XJFLAL.js.map +1 -0
  279. package/dist/{chunk-6SXVCD7W.js → chunk-W7IGLX4G.js} +2 -2
  280. package/dist/{chunk-KQDNAXOM.js → chunk-WG5HSQ4P.js} +19 -6
  281. package/dist/chunk-WG5HSQ4P.js.map +1 -0
  282. package/dist/{chunk-LTJAMRGI.js → chunk-WL5EBRDH.js} +17 -3
  283. package/dist/chunk-WL5EBRDH.js.map +1 -0
  284. package/dist/{chunk-KAWTOYAW.js → chunk-WLZYGLJ4.js} +2 -2
  285. package/dist/{chunk-RO4LQGT3.js → chunk-WON4APQY.js} +4 -4
  286. package/dist/{chunk-PQVK2S3J.js → chunk-WZFAPHIK.js} +6 -6
  287. package/dist/{chunk-KQPJLK3X.js → chunk-XL24QQ63.js} +2 -2
  288. package/dist/{chunk-RVZRYUQH.js → chunk-YROFNEG5.js} +7 -7
  289. package/dist/{chunk-RAR2BSEM.js → chunk-YV32N67O.js} +1 -1
  290. package/dist/chunk-YV32N67O.js.map +1 -0
  291. package/dist/{chunk-PBSAPHHA.js → chunk-YVKF3HEW.js} +1 -1
  292. package/dist/chunk-YVKF3HEW.js.map +1 -0
  293. package/dist/{chunk-VRAD2FGO.js → chunk-Z54EM5YZ.js} +12 -12
  294. package/dist/{chunk-2VN4JAX7.js → chunk-ZOKZIR5K.js} +95 -33
  295. package/dist/chunk-ZOKZIR5K.js.map +1 -0
  296. package/dist/{cli-Cd5fMmhq.d.ts → cli-C_pqqTCw.d.ts} +28 -12
  297. package/dist/cli.d.ts +16 -9
  298. package/dist/cli.js +142 -127
  299. package/dist/compounding/engine.d.ts +5 -2
  300. package/dist/compounding/engine.js +36 -26
  301. package/dist/compounding/preference-consolidator.d.ts +3 -1
  302. package/dist/compounding/preference-consolidator.js +1 -1
  303. package/dist/compression-optimizer.d.ts +3 -1
  304. package/dist/config-qmd.d.ts +8 -0
  305. package/dist/config-qmd.js +20 -0
  306. package/dist/config-qmd.js.map +1 -0
  307. package/dist/config.d.ts +3 -1
  308. package/dist/config.js +15 -10
  309. package/dist/connectors/codex-materialize-runner.d.ts +3 -1
  310. package/dist/connectors/codex-materialize-runner.js +36 -26
  311. package/dist/connectors/codex-materialize.d.ts +3 -1
  312. package/dist/connectors/codex-materialize.js +2 -2
  313. package/dist/connectors/index.d.ts +3 -1
  314. package/dist/connectors/index.js +41 -32
  315. package/dist/consolidation-provenance-check.d.ts +5 -2
  316. package/dist/consolidation-undo.d.ts +5 -2
  317. package/dist/contradiction/index.d.ts +5 -2
  318. package/dist/contradiction/index.js +10 -4
  319. package/dist/{contradiction-scan-J57T5QV7.js → contradiction-scan-RJBABNRH.js} +4 -4
  320. package/dist/contradiction-scan-RJBABNRH.js.map +1 -0
  321. package/dist/conversation-index/backend.d.ts +3 -1
  322. package/dist/conversation-index/backend.js +5 -5
  323. package/dist/conversation-index/chunker.d.ts +3 -1
  324. package/dist/conversation-index/cleanup.js +2 -2
  325. package/dist/conversation-index/faiss-adapter.d.ts +3 -1
  326. package/dist/conversation-index/faiss-adapter.js +2 -2
  327. package/dist/conversation-index/indexer.d.ts +3 -1
  328. package/dist/conversation-index/indexer.js +2 -2
  329. package/dist/conversation-index/search.d.ts +3 -1
  330. package/dist/conversation-index/search.js +2 -2
  331. package/dist/cross-namespace-budget.d.ts +45 -1
  332. package/dist/cross-namespace-budget.js +5 -3
  333. package/dist/dashboard-runtime.js +2 -2
  334. package/dist/day-summary.d.ts +3 -1
  335. package/dist/day-summary.js +3 -3
  336. package/dist/delinearize.d.ts +3 -1
  337. package/dist/direct-answer-wiring.d.ts +3 -1
  338. package/dist/direct-answer.d.ts +3 -1
  339. package/dist/{dreams-ledger-6UODQOX6.js → dreams-ledger-567VKVOU.js} +4 -2
  340. package/dist/dreams-ledger-567VKVOU.js.map +1 -0
  341. package/dist/embedding-fallback.d.ts +3 -1
  342. package/dist/embedding-fallback.js +3 -3
  343. package/dist/enrichment/index.d.ts +3 -1
  344. package/dist/entity-retrieval.d.ts +5 -2
  345. package/dist/entity-retrieval.js +35 -26
  346. package/dist/entity-schema.d.ts +3 -1
  347. package/dist/explicit-capture.d.ts +13 -8
  348. package/dist/explicit-capture.js +7 -3
  349. package/dist/extraction-faithfulness.d.ts +3 -1
  350. package/dist/extraction-faithfulness.js +5 -5
  351. package/dist/extraction-judge-telemetry.d.ts +3 -1
  352. package/dist/extraction-judge-telemetry.js +2 -2
  353. package/dist/extraction-judge-training.d.ts +3 -1
  354. package/dist/extraction-judge-training.js +2 -2
  355. package/dist/extraction-judge.d.ts +3 -1
  356. package/dist/extraction-judge.js +5 -5
  357. package/dist/extraction.d.ts +3 -1
  358. package/dist/extraction.js +13 -12
  359. package/dist/faithfulness-config.js +3 -2
  360. package/dist/fallback-llm.d.ts +3 -1
  361. package/dist/fallback-llm.js +4 -4
  362. package/dist/{first-start-migration-TI67YMLG.js → first-start-migration-CSRHCJIQ.js} +2 -2
  363. package/dist/{forget-CQCLB5LB.js → forget-HRPLVB3W.js} +5 -5
  364. package/dist/graph-dashboard-diff.d.ts +3 -1
  365. package/dist/graph-dashboard-key.d.ts +3 -1
  366. package/dist/graph-dashboard-parser.d.ts +3 -1
  367. package/dist/{graph-edge-decay-IOGBBAGC.js → graph-edge-decay-Z6ENALU2.js} +3 -3
  368. package/dist/graph-edge-decay-Z6ENALU2.js.map +1 -0
  369. package/dist/graph-edge-reinforcement.d.ts +3 -1
  370. package/dist/graph-snapshot.d.ts +3 -1
  371. package/dist/graph-snapshot.js +2 -2
  372. package/dist/graph.d.ts +3 -1
  373. package/dist/graph.js +1 -1
  374. package/dist/identity-continuity.d.ts +1 -2
  375. package/dist/importance.d.ts +3 -1
  376. package/dist/importers/index.d.ts +3 -1
  377. package/dist/in-flight-reads.d.ts +3 -1
  378. package/dist/index.d.ts +473 -464
  379. package/dist/index.js +287 -239
  380. package/dist/intent.d.ts +3 -1
  381. package/dist/lcm/archive.js +2 -2
  382. package/dist/lcm/engine.d.ts +3 -1
  383. package/dist/lcm/engine.js +6 -6
  384. package/dist/lcm/index.d.ts +3 -1
  385. package/dist/lcm/index.js +13 -13
  386. package/dist/lcm/schema.js +2 -2
  387. package/dist/lcm/summarizer.js +3 -3
  388. package/dist/lcm/tools.d.ts +3 -1
  389. package/dist/lifecycle.d.ts +3 -1
  390. package/dist/live-connectors-runner.d.ts +3 -1
  391. package/dist/local-llm.d.ts +5 -2
  392. package/dist/local-llm.js +3 -3
  393. package/dist/local-model-endpoint.d.ts +3 -1
  394. package/dist/logger.d.ts +3 -1
  395. package/dist/logger.js +7 -3
  396. package/dist/maintenance/archive-observations.js +2 -2
  397. package/dist/maintenance/memory-governance.d.ts +3 -1
  398. package/dist/maintenance/memory-governance.js +35 -25
  399. package/dist/maintenance/migrate-observations.js +3 -3
  400. package/dist/maintenance/observation-ledger-utils.js +2 -2
  401. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +102 -1
  402. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +37 -25
  403. package/dist/maintenance/rebuild-memory-projection.js +38 -28
  404. package/dist/maintenance/rebuild-observations.js +3 -3
  405. package/dist/mcp-memory-inspector-app.d.ts +22 -15
  406. package/dist/memory-action-policy.d.ts +3 -1
  407. package/dist/memory-cache.d.ts +3 -1
  408. package/dist/memory-lifecycle-ledger-utils.d.ts +25 -2
  409. package/dist/memory-lifecycle-ledger-utils.js +11 -1
  410. package/dist/memory-projection-store.d.ts +3 -1
  411. package/dist/memory-projection-store.js +2 -2
  412. package/dist/memory-provenance.d.ts +3 -1
  413. package/dist/memory-worth-outcomes.d.ts +5 -2
  414. package/dist/model-registry.js +2 -2
  415. package/dist/models-json.d.ts +3 -1
  416. package/dist/models-json.js +2 -2
  417. package/dist/namespaces/migrate.d.ts +6 -3
  418. package/dist/namespaces/migrate.js +51 -42
  419. package/dist/namespaces/principal.d.ts +27 -2
  420. package/dist/namespaces/principal.js +6 -2
  421. package/dist/namespaces/search.d.ts +16 -2
  422. package/dist/namespaces/search.js +24 -20
  423. package/dist/namespaces/storage.d.ts +24 -3
  424. package/dist/namespaces/storage.js +35 -27
  425. package/dist/native-knowledge.d.ts +3 -1
  426. package/dist/native-knowledge.js +2 -2
  427. package/dist/negative.js +2 -2
  428. package/dist/offline-sync-exclude-globs.d.ts +13 -0
  429. package/dist/offline-sync-exclude-globs.js +10 -0
  430. package/dist/offline-sync-exclude-globs.js.map +1 -0
  431. package/dist/offline-sync-impression-drain.d.ts +78 -0
  432. package/dist/offline-sync-impression-drain.js +37 -0
  433. package/dist/offline-sync-impression-drain.js.map +1 -0
  434. package/dist/offline-sync.js +4 -2
  435. package/dist/operator-toolkit.d.ts +5 -2
  436. package/dist/operator-toolkit.js +69 -54
  437. package/dist/orchestration/compression-guideline-coordinator.d.ts +5 -2
  438. package/dist/orchestration/compression-guideline-coordinator.js +3 -3
  439. package/dist/orchestration/maintenance.d.ts +121 -2
  440. package/dist/orchestration/maintenance.js +44 -31
  441. package/dist/{orchestrator-Bp_jeBHK.d.ts → orchestrator-CQJ8U7En.d.ts} +85 -79
  442. package/dist/orchestrator.d.ts +13 -8
  443. package/dist/orchestrator.js +194 -177
  444. package/dist/patterns-cli.d.ts +3 -1
  445. package/dist/{pipeline-BAj5bx7g.d.ts → pipeline-Cn-kvYeV.d.ts} +1 -1
  446. package/dist/policy-runtime.d.ts +3 -1
  447. package/dist/prioritized-embed.d.ts +19 -0
  448. package/dist/prioritized-embed.js +8 -0
  449. package/dist/prioritized-embed.js.map +1 -0
  450. package/dist/proactive-contention.d.ts +28 -0
  451. package/dist/proactive-contention.js +8 -0
  452. package/dist/proactive-contention.js.map +1 -0
  453. package/dist/profiling.js +2 -2
  454. package/dist/provenance.d.ts +3 -1
  455. package/dist/provenance.js +3 -2
  456. package/dist/{purge-NDWV6WYD.js → purge-IRF47ZTX.js} +3 -3
  457. package/dist/{qmd-_MDSlj1m.d.ts → qmd-oh9VXz1d.d.ts} +11 -1
  458. package/dist/qmd-preflight.d.ts +5 -2
  459. package/dist/qmd-recall-cache.d.ts +3 -1
  460. package/dist/qmd-status.d.ts +57 -0
  461. package/dist/qmd-status.js +18 -0
  462. package/dist/qmd-status.js.map +1 -0
  463. package/dist/qmd.d.ts +5 -2
  464. package/dist/qmd.js +7 -3
  465. package/dist/recall-concurrency-config.d.ts +16 -0
  466. package/dist/recall-concurrency-config.js +10 -0
  467. package/dist/recall-concurrency-config.js.map +1 -0
  468. package/dist/recall-disclosure-escalation.d.ts +3 -1
  469. package/dist/recall-explain-renderer.d.ts +4 -1
  470. package/dist/recall-explain-renderer.js +3 -3
  471. package/dist/recall-memory-map.d.ts +26 -0
  472. package/dist/recall-memory-map.js +18 -0
  473. package/dist/recall-memory-map.js.map +1 -0
  474. package/dist/recall-planner-llm.d.ts +3 -1
  475. package/dist/recall-planner-llm.js +4 -4
  476. package/dist/recall-qos.js +2 -2
  477. package/dist/recall-state.d.ts +163 -2
  478. package/dist/recall-state.js +6 -3
  479. package/dist/recall-tag-filter.d.ts +3 -1
  480. package/dist/recall-timings.d.ts +11 -2
  481. package/dist/recall-timings.js +3 -1
  482. package/dist/recall-xray-cli.d.ts +3 -1
  483. package/dist/recall-xray-cli.js +4 -4
  484. package/dist/recall-xray-renderer.d.ts +3 -1
  485. package/dist/recall-xray-renderer.js +3 -3
  486. package/dist/recall-xray.d.ts +3 -1
  487. package/dist/recall-xray.js +2 -2
  488. package/dist/relevance.js +3 -3
  489. package/dist/replay/normalizers/chatgpt.d.ts +3 -1
  490. package/dist/replay/normalizers/claude.d.ts +3 -1
  491. package/dist/replay/normalizers/openclaw.d.ts +3 -1
  492. package/dist/replay/normalizers/shared.d.ts +3 -1
  493. package/dist/replay/runner.d.ts +3 -1
  494. package/dist/replay/types.d.ts +3 -1
  495. package/dist/rerank.d.ts +8 -1
  496. package/dist/rerank.js +3 -1
  497. package/dist/resolution-3K27T4VO.js +18 -0
  498. package/dist/resolution-3K27T4VO.js.map +1 -0
  499. package/dist/resolve-auth-token.d.ts +3 -1
  500. package/dist/resolve-provider-secret.js +2 -2
  501. package/dist/resume-bundles.js +19 -14
  502. package/dist/retrieval-agents.d.ts +19 -16
  503. package/dist/retrieval-agents.js +3 -3
  504. package/dist/retrieval-tiers.d.ts +3 -1
  505. package/dist/routing/engine.d.ts +3 -1
  506. package/dist/routing/store.d.ts +3 -1
  507. package/dist/routing/store.js +2 -2
  508. package/dist/salvage-envelope.d.ts +18 -0
  509. package/dist/salvage-envelope.js +15 -0
  510. package/dist/salvage-envelope.js.map +1 -0
  511. package/dist/schemas.d.ts +98 -98
  512. package/dist/scope-profiles-EpJG7yKP.d.ts +30 -0
  513. package/dist/search/document-scanner.js +3 -2
  514. package/dist/search/embed-helper.d.ts +3 -1
  515. package/dist/search/embed-helper.js +3 -3
  516. package/dist/search/factory.d.ts +3 -1
  517. package/dist/search/factory.js +18 -16
  518. package/dist/search/index.d.ts +3 -1
  519. package/dist/search/index.js +22 -20
  520. package/dist/search/lancedb-backend.d.ts +3 -1
  521. package/dist/search/lancedb-backend.js +6 -5
  522. package/dist/search/meilisearch-backend.d.ts +3 -1
  523. package/dist/search/meilisearch-backend.js +6 -5
  524. package/dist/search/noop-backend.d.ts +3 -1
  525. package/dist/search/orama-backend.d.ts +3 -1
  526. package/dist/search/orama-backend.js +6 -5
  527. package/dist/search/port.d.ts +16 -2
  528. package/dist/search/port.js +1 -1
  529. package/dist/search/remote-backend.d.ts +3 -1
  530. package/dist/search/remote-backend.js +3 -3
  531. package/dist/secure-store/index.d.ts +12 -1
  532. package/dist/secure-store/index.js +6 -3
  533. package/dist/{semantic-consolidation-C2m5eHHE.d.ts → semantic-consolidation-DILZEQq3.d.ts} +1 -1
  534. package/dist/semantic-consolidation.d.ts +4 -2
  535. package/dist/semantic-consolidation.js +38 -29
  536. package/dist/semantic-rule-promotion.js +34 -24
  537. package/dist/semantic-rule-verifier.d.ts +3 -1
  538. package/dist/semantic-rule-verifier.js +35 -25
  539. package/dist/session-observer-bands.d.ts +3 -1
  540. package/dist/session-observer-state.d.ts +3 -1
  541. package/dist/session-observer-state.js +2 -2
  542. package/dist/session-transcript-migration.js +2 -2
  543. package/dist/shared-context/manager.d.ts +11 -9
  544. package/dist/shared-context/manager.js +3 -3
  545. package/dist/signal.d.ts +3 -1
  546. package/dist/{storage-hr_Y2z5R.d.ts → storage-NIyKYD8g.d.ts} +489 -110
  547. package/dist/storage-guards.js +2 -2
  548. package/dist/storage.d.ts +6 -3
  549. package/dist/storage.js +38 -26
  550. package/dist/structured-attributes.d.ts +23 -1
  551. package/dist/structured-attributes.js +7 -1
  552. package/dist/summarizer.d.ts +3 -1
  553. package/dist/summarizer.js +11 -11
  554. package/dist/summary-snapshot.d.ts +3 -1
  555. package/dist/summary-snapshot.js +2 -2
  556. package/dist/temporal-index-batch.d.ts +1 -0
  557. package/dist/temporal-index-batch.js +10 -0
  558. package/dist/temporal-index-batch.js.map +1 -0
  559. package/dist/temporal-index-compat.d.ts +279 -1
  560. package/dist/temporal-index-compat.js +1 -1
  561. package/dist/temporal-index.d.ts +1 -225
  562. package/dist/temporal-index.js +35 -3
  563. package/dist/temporal-supersession.d.ts +5 -2
  564. package/dist/temporal-supersession.js +2 -2
  565. package/dist/temporal-timeline-recall.d.ts +3 -1
  566. package/dist/temporal-validity.d.ts +3 -1
  567. package/dist/threading.d.ts +3 -1
  568. package/dist/threading.js +2 -2
  569. package/dist/tier-migration.d.ts +5 -2
  570. package/dist/tier-routing.d.ts +3 -1
  571. package/dist/{tier-stats-KV7IWCJR.js → tier-stats-QEJSPFV2.js} +2 -2
  572. package/dist/tokens.js +3 -3
  573. package/dist/topics.d.ts +3 -1
  574. package/dist/transcript.d.ts +3 -1
  575. package/dist/transcript.js +2 -2
  576. package/dist/transfer/backup.js +3 -3
  577. package/dist/transfer/capsule-export.js +3 -3
  578. package/dist/transfer/capsule-import.js +3 -3
  579. package/dist/transfer/types.d.ts +90 -90
  580. package/dist/trust-score-stage.d.ts +75 -38
  581. package/dist/trust-score-stage.js +11 -3
  582. package/dist/trust-score.d.ts +3 -1
  583. package/dist/{types-Cg8q7W7_.d.ts → types-D_fG2ix8.d.ts} +39 -63
  584. package/dist/types-continuity.d.ts +52 -0
  585. package/dist/types-continuity.js +1 -0
  586. package/dist/types-continuity.js.map +1 -0
  587. package/dist/types.d.ts +3 -1
  588. package/dist/types.js +1 -1
  589. package/dist/utility-runtime.d.ts +3 -1
  590. package/dist/utils/serialize-mutations.d.ts +31 -2
  591. package/dist/utils/serialize-mutations.js +1 -1
  592. package/dist/verified-recall.js +36 -26
  593. package/dist/write-envelope.d.ts +282 -0
  594. package/dist/write-envelope.js +35 -0
  595. package/dist/write-envelope.js.map +1 -0
  596. package/dist/write-quarantine.d.ts +79 -0
  597. package/dist/write-quarantine.js +11 -0
  598. package/dist/write-quarantine.js.map +1 -0
  599. package/dist/write-rate-limiter.d.ts +45 -0
  600. package/dist/write-rate-limiter.js +9 -0
  601. package/dist/write-rate-limiter.js.map +1 -0
  602. package/package.json +37 -2
  603. package/src/access-admin-ops-surface.ts +17 -7
  604. package/src/access-boundary.test.ts +28 -0
  605. package/src/access-boundary.ts +31 -2
  606. package/src/access-citation.test.ts +72 -0
  607. package/src/access-citation.ts +139 -0
  608. package/src/access-errors.ts +21 -0
  609. package/src/access-fingerprint-parity.test.ts +211 -0
  610. package/src/access-http-cancellation.test.ts +59 -21
  611. package/src/access-http.test.ts +90 -0
  612. package/src/access-http.ts +79 -79
  613. package/src/access-mcp-cancellation.test.ts +16 -7
  614. package/src/access-memory-search-fanout.test.ts +220 -0
  615. package/src/access-memory-search-fanout.ts +168 -0
  616. package/src/access-observe-quarantine.test.ts +120 -0
  617. package/src/access-observe-write-surface.ts +130 -11
  618. package/src/access-operations-batch.ts +2 -0
  619. package/src/access-recall-concurrency.ts +773 -0
  620. package/src/access-recall-response.ts +307 -0
  621. package/src/access-recall-surface.ts +100 -252
  622. package/src/access-service-coding-write.test.ts +22 -4
  623. package/src/access-service-health.test.ts +49 -0
  624. package/src/access-service-namespace.test.ts +486 -8
  625. package/src/access-service-observe-scope.test.ts +4 -0
  626. package/src/access-service-recall-concurrency.test.ts +1990 -0
  627. package/src/access-service.ts +182 -175
  628. package/src/access-surface-catalog.ts +1 -0
  629. package/src/access-token-capabilities.ts +16 -9
  630. package/src/active-recall.test.ts +35 -0
  631. package/src/active-recall.ts +7 -0
  632. package/src/bounded-jsonl-state.ts +93 -0
  633. package/src/buffer-session.test.ts +422 -5
  634. package/src/buffer-surprise-trigger.test.ts +41 -0
  635. package/src/buffer.ts +218 -3
  636. package/src/capabilities-cluster-b.test.ts +1 -0
  637. package/src/capabilities.ts +5 -6
  638. package/src/cli.ts +21 -22
  639. package/src/coding/architecture-surfaces.test.ts +6 -3
  640. package/src/coding/architecture-surfaces.ts +36 -25
  641. package/src/coding/decision-surfaces.ts +42 -34
  642. package/src/compounding/engine.test.ts +5 -1
  643. package/src/compounding/engine.ts +7 -7
  644. package/src/config-qmd.ts +89 -0
  645. package/src/config.test.ts +136 -0
  646. package/src/config.ts +113 -118
  647. package/src/connector-provenance-lifecycle.test.ts +4 -4
  648. package/src/connectors/coerce.test.ts +131 -0
  649. package/src/connectors/coerce.ts +80 -7
  650. package/src/contradiction/contradiction.test.ts +10 -6
  651. package/src/contradiction/resolution.ts +17 -4
  652. package/src/correction/correction-access-wiring.ts +62 -18
  653. package/src/cross-namespace-budget.test.ts +35 -0
  654. package/src/cross-namespace-budget.ts +86 -19
  655. package/src/explicit-capture.ts +54 -17
  656. package/src/extraction.ts +2 -3
  657. package/src/faithfulness-graph-guard.test.ts +16 -69
  658. package/src/graph-recall.test.ts +31 -0
  659. package/src/index.ts +22 -2
  660. package/src/local-llm.ts +4 -6
  661. package/src/logger.ts +16 -0
  662. package/src/maintenance/dreams-ledger.ts +100 -49
  663. package/src/maintenance/rebuild-memory-lifecycle-ledger-cli.ts +77 -0
  664. package/src/maintenance/rebuild-memory-lifecycle-ledger.ts +373 -9
  665. package/src/memory-lifecycle-ledger-utils.ts +51 -5
  666. package/src/namespaces/principal.test.ts +37 -1
  667. package/src/namespaces/principal.ts +48 -0
  668. package/src/namespaces/search.test.ts +79 -5
  669. package/src/namespaces/search.ts +59 -6
  670. package/src/namespaces/storage.ts +43 -1
  671. package/src/offline-sync-exclude-globs.ts +58 -0
  672. package/src/offline-sync-impression-drain.test.ts +316 -0
  673. package/src/offline-sync-impression-drain.ts +260 -0
  674. package/src/offline-sync.test.ts +32 -5
  675. package/src/offline-sync.ts +1 -14
  676. package/src/operator-toolkit.ts +1 -1
  677. package/src/orchestration/batch-deindex-flush.test.ts +146 -0
  678. package/src/orchestration/consolidation-run.ts +96 -85
  679. package/src/orchestration/extraction-envelope.ts +94 -0
  680. package/src/orchestration/extraction-persist-promotion.ts +134 -0
  681. package/src/orchestration/extraction-persist.ts +325 -260
  682. package/src/orchestration/extraction-run.test.ts +1 -1
  683. package/src/orchestration/extraction-run.ts +2 -2
  684. package/src/orchestration/graph-recall-coordinator.ts +18 -7
  685. package/src/orchestration/lifecycle-policy-coordinator.ts +63 -48
  686. package/src/orchestration/maintenance.test.ts +2103 -3
  687. package/src/orchestration/maintenance.ts +574 -2
  688. package/src/orchestration/namespace-read-fanout.ts +14 -8
  689. package/src/orchestration/orchestrator-helpers.ts +8 -1
  690. package/src/orchestration/orchestrator-init.ts +22 -6
  691. package/src/orchestration/orchestrator-namespace-scope.ts +71 -0
  692. package/src/orchestration/persistence-index.ts +64 -9
  693. package/src/orchestration/qmd-result-resolver.ts +27 -0
  694. package/src/orchestration/recall-entry.ts +34 -19
  695. package/src/orchestration/recall-internal.ts +207 -79
  696. package/src/orchestration/recall-rerank-coordinator.ts +229 -82
  697. package/src/orchestration/recall-result-formatter.ts +76 -20
  698. package/src/orchestration/recall-search-pipeline.test.ts +70 -0
  699. package/src/orchestration/recall-search-pipeline.ts +102 -129
  700. package/src/orchestration/recall-section-coordinator.ts +315 -85
  701. package/src/orchestration/semantic-consolidation-coordinator.ts +69 -37
  702. package/src/orchestration/session-context.ts +21 -0
  703. package/src/orchestration/workspace-ops.test.ts +348 -0
  704. package/src/orchestration/workspace-ops.ts +168 -34
  705. package/src/orchestrator-chunked-hash-durability.test.ts +126 -0
  706. package/src/orchestrator-connector-dedup.test.ts +1061 -40
  707. package/src/orchestrator-flush.test.ts +155 -39
  708. package/src/orchestrator-nonchunked-hash-durability.test.ts +121 -0
  709. package/src/orchestrator-source-attribution.test.ts +9 -9
  710. package/src/orchestrator.ts +160 -149
  711. package/src/prioritized-embed.ts +123 -0
  712. package/src/proactive-contention.test.ts +80 -0
  713. package/src/proactive-contention.ts +39 -0
  714. package/src/procedural/procedure-miner.test.ts +19 -14
  715. package/src/procedural/procedure-miner.ts +44 -13
  716. package/src/qmd-client.test.ts +111 -1
  717. package/src/qmd-status.ts +186 -0
  718. package/src/qmd.ts +47 -47
  719. package/src/recall-budget-config.test.ts +30 -0
  720. package/src/recall-cold-deadline.test.ts +149 -0
  721. package/src/recall-concurrency-config.ts +28 -0
  722. package/src/recall-memory-map.ts +74 -0
  723. package/src/recall-rerank-coordinator.test.ts +508 -0
  724. package/src/recall-state.test.ts +825 -1
  725. package/src/recall-state.ts +406 -7
  726. package/src/recall-timings-access.test.ts +41 -0
  727. package/src/recall-timings.ts +16 -0
  728. package/src/relay/mission-access.test.ts +5 -5
  729. package/src/rerank.ts +22 -0
  730. package/src/retrieval-agents.test.ts +79 -0
  731. package/src/retrieval-agents.ts +71 -19
  732. package/src/salvage-envelope.ts +28 -0
  733. package/src/scopes/scope-plan.test.ts +42 -0
  734. package/src/scopes/scope-plan.ts +45 -0
  735. package/src/search/port.ts +13 -0
  736. package/src/secure-store/index.ts +1 -0
  737. package/src/secure-store/secure-fs.ts +48 -0
  738. package/src/secure-store/secure-store.test.ts +40 -0
  739. package/src/semantic-rule-promotion.ts +13 -4
  740. package/src/storage/content-hash-index.ts +655 -0
  741. package/src/storage/entity-timeline.ts +473 -0
  742. package/src/storage/memory-lifecycle-ledger-access.ts +603 -0
  743. package/src/storage/secure-line-reader.test.ts +197 -0
  744. package/src/storage/secure-line-reader.ts +181 -3
  745. package/src/storage-append-header-sniff.test.ts +195 -0
  746. package/src/storage-behavior-signals-cache.test.ts +237 -0
  747. package/src/storage-contract/cache-coherence.test.ts +96 -1
  748. package/src/storage-contract/content-hash.test.ts +47 -2
  749. package/src/storage-fact-hash-index-defer.test.ts +1200 -0
  750. package/src/storage-memory-lifecycle-ledger.test.ts +1146 -3
  751. package/src/storage.ts +882 -890
  752. package/src/structured-attributes.ts +52 -0
  753. package/src/temporal-index-batch.ts +112 -0
  754. package/src/temporal-index.test.ts +193 -0
  755. package/src/temporal-index.ts +49 -53
  756. package/src/testing/lifecycle-matrix.test.ts +212 -0
  757. package/src/testing/lifecycle-matrix.ts +271 -0
  758. package/src/testing/orchestrator-lite.ts +236 -0
  759. package/src/testing/subjects/dreams-ledger.test.ts +67 -0
  760. package/src/testing/subjects/extraction-lifecycle.test.ts +442 -0
  761. package/src/testing/subjects/lifecycle-ledger.test.ts +93 -0
  762. package/src/testing/subjects/recall-budget.test.ts +461 -0
  763. package/src/testing/subjects/serialized-write-chain.test.ts +224 -0
  764. package/src/trust-score-stage.test.ts +154 -0
  765. package/src/trust-score-stage.ts +216 -53
  766. package/src/types-continuity.ts +57 -0
  767. package/src/types.ts +51 -77
  768. package/src/utils/path-containment.test.ts +75 -0
  769. package/src/utils/path-containment.ts +76 -0
  770. package/src/utils/serialize-mutations.test.ts +122 -0
  771. package/src/utils/serialize-mutations.ts +68 -3
  772. package/src/wearables/memory-gen.test.ts +31 -9
  773. package/src/wearables/memory-gen.ts +95 -55
  774. package/src/wearables/pipeline.test.ts +10 -7
  775. package/src/wearables/service.test.ts +6 -8
  776. package/src/wearables/service.ts +2 -2
  777. package/src/write-envelope.extension.test.ts +111 -0
  778. package/src/write-envelope.test.ts +683 -0
  779. package/src/write-envelope.ts +902 -0
  780. package/src/write-quarantine.test.ts +193 -0
  781. package/src/write-quarantine.ts +241 -0
  782. package/src/write-rate-limiter.test.ts +105 -0
  783. package/src/write-rate-limiter.ts +135 -0
  784. package/src/write-sealed-parity.test.ts +204 -0
  785. package/dist/chunk-2VN4JAX7.js.map +0 -1
  786. package/dist/chunk-37CTGERM.js.map +0 -1
  787. package/dist/chunk-3IY64MV6.js.map +0 -1
  788. package/dist/chunk-BCDKBDSY.js.map +0 -1
  789. package/dist/chunk-BFPETA3S.js.map +0 -1
  790. package/dist/chunk-BFVEEB7W.js.map +0 -1
  791. package/dist/chunk-BS4SGLWV.js.map +0 -1
  792. package/dist/chunk-DCFV7A7H.js.map +0 -1
  793. package/dist/chunk-DYP3YYJJ.js.map +0 -1
  794. package/dist/chunk-E5BK6CGV.js +0 -335
  795. package/dist/chunk-E5BK6CGV.js.map +0 -1
  796. package/dist/chunk-FTYDWKO6.js.map +0 -1
  797. package/dist/chunk-GWTFLF2P.js.map +0 -1
  798. package/dist/chunk-IKQTFQMI.js.map +0 -1
  799. package/dist/chunk-INELTPRG.js.map +0 -1
  800. package/dist/chunk-J2HSAU72.js.map +0 -1
  801. package/dist/chunk-JREB6UFH.js.map +0 -1
  802. package/dist/chunk-K7LOWSLU.js.map +0 -1
  803. package/dist/chunk-KQDNAXOM.js.map +0 -1
  804. package/dist/chunk-KSBEEMQF.js.map +0 -1
  805. package/dist/chunk-KSNVDPDF.js.map +0 -1
  806. package/dist/chunk-LC7OODWZ.js.map +0 -1
  807. package/dist/chunk-LTJAMRGI.js.map +0 -1
  808. package/dist/chunk-LZOV7MX7.js.map +0 -1
  809. package/dist/chunk-NWTGD4AN.js.map +0 -1
  810. package/dist/chunk-ODPLEWB6.js.map +0 -1
  811. package/dist/chunk-OVJ2HIPE.js.map +0 -1
  812. package/dist/chunk-PBSAPHHA.js.map +0 -1
  813. package/dist/chunk-PHK3HARR.js +0 -32
  814. package/dist/chunk-PHK3HARR.js.map +0 -1
  815. package/dist/chunk-PLQE6MJA.js.map +0 -1
  816. package/dist/chunk-QKQYXZVS.js.map +0 -1
  817. package/dist/chunk-QQGPUKMT.js.map +0 -1
  818. package/dist/chunk-RANHFI3P.js +0 -8
  819. package/dist/chunk-RANHFI3P.js.map +0 -1
  820. package/dist/chunk-RAR2BSEM.js.map +0 -1
  821. package/dist/chunk-RULE4VG5.js.map +0 -1
  822. package/dist/chunk-SVOZFLIQ.js +0 -16
  823. package/dist/chunk-SVOZFLIQ.js.map +0 -1
  824. package/dist/chunk-T7Y5KPLN.js.map +0 -1
  825. package/dist/chunk-TXLGHDHS.js.map +0 -1
  826. package/dist/chunk-VDW4VU7B.js.map +0 -1
  827. package/dist/chunk-VSMRDBFT.js +0 -17
  828. package/dist/chunk-VSMRDBFT.js.map +0 -1
  829. package/dist/chunk-X64YLC24.js.map +0 -1
  830. package/dist/chunk-XDSXEKYK.js +0 -118
  831. package/dist/chunk-XDSXEKYK.js.map +0 -1
  832. package/dist/chunk-YF6FMLBT.js.map +0 -1
  833. package/dist/resolution-VH4NGENZ.js +0 -12
  834. /package/dist/{capsule-crypto-CZJSLEFG.js.map → access-citation.js.map} +0 -0
  835. /package/dist/{contradiction-scan-J57T5QV7.js.map → access-memory-search-fanout.js.map} +0 -0
  836. /package/dist/{dreams-ledger-6UODQOX6.js.map → access-recall-concurrency.js.map} +0 -0
  837. /package/dist/{graph-edge-decay-IOGBBAGC.js.map → access-recall-response.js.map} +0 -0
  838. /package/dist/{resolution-VH4NGENZ.js.map → bounded-jsonl-state.js.map} +0 -0
  839. /package/dist/{chunk-A3GOMRJG.js.map → chunk-23L3IXFD.js.map} +0 -0
  840. /package/dist/{chunk-MRHFJV44.js.map → chunk-2DQ2XREU.js.map} +0 -0
  841. /package/dist/{chunk-L2B3EE7B.js.map → chunk-2QMKMVHH.js.map} +0 -0
  842. /package/dist/{chunk-VJVNLNDQ.js.map → chunk-2UFO7X4Q.js.map} +0 -0
  843. /package/dist/{chunk-2MR3MFQB.js.map → chunk-2VEOKUPP.js.map} +0 -0
  844. /package/dist/{chunk-RHOZ5LLO.js.map → chunk-347WD2LE.js.map} +0 -0
  845. /package/dist/{chunk-HDTQVNWD.js.map → chunk-3QAH2S33.js.map} +0 -0
  846. /package/dist/{chunk-LRNMRXJO.js.map → chunk-3Y224NYC.js.map} +0 -0
  847. /package/dist/{chunk-VFSP73LP.js.map → chunk-45GF7Y3V.js.map} +0 -0
  848. /package/dist/{chunk-OEHCMALU.js.map → chunk-5I4M26Q7.js.map} +0 -0
  849. /package/dist/{chunk-2AZXIZEN.js.map → chunk-5Q7EVV4X.js.map} +0 -0
  850. /package/dist/{chunk-PUBTHW5O.js.map → chunk-6DRPPQEJ.js.map} +0 -0
  851. /package/dist/{chunk-FDCTQWLW.js.map → chunk-6O22TZSB.js.map} +0 -0
  852. /package/dist/{chunk-ZQ7UBUZ6.js.map → chunk-6QYST5XN.js.map} +0 -0
  853. /package/dist/{chunk-W4PGTAS2.js.map → chunk-6WAFYNVT.js.map} +0 -0
  854. /package/dist/{chunk-R5VAVVHP.js.map → chunk-72A4L5JJ.js.map} +0 -0
  855. /package/dist/{chunk-3FAMU5TX.js.map → chunk-A6USBZTO.js.map} +0 -0
  856. /package/dist/{chunk-ZHIVCODT.js.map → chunk-A72SWTWW.js.map} +0 -0
  857. /package/dist/{chunk-FC77VUX5.js.map → chunk-A7Q43EUZ.js.map} +0 -0
  858. /package/dist/{chunk-UJBESW6X.js.map → chunk-AE7WMV4V.js.map} +0 -0
  859. /package/dist/{chunk-A5UXZRRM.js.map → chunk-AJ7QCSIS.js.map} +0 -0
  860. /package/dist/{chunk-FNMFJWBY.js.map → chunk-ANEUPF6O.js.map} +0 -0
  861. /package/dist/{chunk-2A3OXAP2.js.map → chunk-B7RWBZXW.js.map} +0 -0
  862. /package/dist/{chunk-74F5STS4.js.map → chunk-BLAKS3CP.js.map} +0 -0
  863. /package/dist/{chunk-M7VGG3ID.js.map → chunk-BV5WMSIJ.js.map} +0 -0
  864. /package/dist/{chunk-2BFLDH5F.js.map → chunk-BXLOS5AJ.js.map} +0 -0
  865. /package/dist/{chunk-UXKMMNJD.js.map → chunk-C23BYTJV.js.map} +0 -0
  866. /package/dist/{chunk-JZHHREBL.js.map → chunk-C3AKM55W.js.map} +0 -0
  867. /package/dist/{chunk-RP7YXA67.js.map → chunk-C5JF6EZ7.js.map} +0 -0
  868. /package/dist/{chunk-EHCONI6E.js.map → chunk-CQMEM5CC.js.map} +0 -0
  869. /package/dist/{chunk-PBNZVPFS.js.map → chunk-CXZQOVIE.js.map} +0 -0
  870. /package/dist/{chunk-7N2RUBAP.js.map → chunk-DDA47TES.js.map} +0 -0
  871. /package/dist/{chunk-64SE4X5G.js.map → chunk-DEBHXHJR.js.map} +0 -0
  872. /package/dist/{chunk-EHK6KZHK.js.map → chunk-DNHVPZOD.js.map} +0 -0
  873. /package/dist/{chunk-437S3G37.js.map → chunk-DQEMWVMT.js.map} +0 -0
  874. /package/dist/{chunk-LZZNTPLR.js.map → chunk-DX3XRGLH.js.map} +0 -0
  875. /package/dist/{chunk-DZKHSDOM.js.map → chunk-ES36HTSC.js.map} +0 -0
  876. /package/dist/{chunk-TN7THW5U.js.map → chunk-ET356KSB.js.map} +0 -0
  877. /package/dist/{chunk-YNDLCWXS.js.map → chunk-EZ25VE3G.js.map} +0 -0
  878. /package/dist/{chunk-DMSDUGDM.js.map → chunk-F7GAIWFA.js.map} +0 -0
  879. /package/dist/{chunk-G6XXLKC5.js.map → chunk-FFPJINJE.js.map} +0 -0
  880. /package/dist/{chunk-G4CN3ZXL.js.map → chunk-FUTF72MJ.js.map} +0 -0
  881. /package/dist/{chunk-HF77M34J.js.map → chunk-GFPZS3F5.js.map} +0 -0
  882. /package/dist/{chunk-G6NKALRN.js.map → chunk-H4WG3UQZ.js.map} +0 -0
  883. /package/dist/{chunk-UDQUSU27.js.map → chunk-HNZKVLAN.js.map} +0 -0
  884. /package/dist/{chunk-5EZXHU36.js.map → chunk-HYQJQGD3.js.map} +0 -0
  885. /package/dist/{chunk-TRWPCR6P.js.map → chunk-JECBQBEX.js.map} +0 -0
  886. /package/dist/{chunk-E6CBU7XP.js.map → chunk-JYIFGGEM.js.map} +0 -0
  887. /package/dist/{chunk-VA4WSW54.js.map → chunk-JYIJNNN3.js.map} +0 -0
  888. /package/dist/{chunk-L5HJQC36.js.map → chunk-K2TDK7GG.js.map} +0 -0
  889. /package/dist/{chunk-KDXVOFYY.js.map → chunk-KAVBJSBQ.js.map} +0 -0
  890. /package/dist/{chunk-4OKLXWDZ.js.map → chunk-KNB7IBBU.js.map} +0 -0
  891. /package/dist/{chunk-QLULYKWZ.js.map → chunk-KSXJOC4F.js.map} +0 -0
  892. /package/dist/{chunk-2S6QHZGJ.js.map → chunk-L2DPF4DF.js.map} +0 -0
  893. /package/dist/{chunk-JI5AVXYO.js.map → chunk-LEPOP46W.js.map} +0 -0
  894. /package/dist/{chunk-O7BBFJLP.js.map → chunk-LTAVSOZW.js.map} +0 -0
  895. /package/dist/{chunk-2IZAGAJR.js.map → chunk-LULR4IUW.js.map} +0 -0
  896. /package/dist/{chunk-WMWVO45V.js.map → chunk-MC6XO7T4.js.map} +0 -0
  897. /package/dist/{chunk-D6RIFG4O.js.map → chunk-MNB5RMAY.js.map} +0 -0
  898. /package/dist/{chunk-Q5WG43OP.js.map → chunk-MYFQ3ED4.js.map} +0 -0
  899. /package/dist/{chunk-V3UE5I5F.js.map → chunk-MYVPLJOO.js.map} +0 -0
  900. /package/dist/{chunk-MTWKDOVO.js.map → chunk-NLE6TSLG.js.map} +0 -0
  901. /package/dist/{chunk-DBRYEIGY.js.map → chunk-OJP3N7UK.js.map} +0 -0
  902. /package/dist/{chunk-SMX5267P.js.map → chunk-OZKOPQCM.js.map} +0 -0
  903. /package/dist/{chunk-JCK7V6SN.js.map → chunk-P65YJEEL.js.map} +0 -0
  904. /package/dist/{chunk-MTR7BZQN.js.map → chunk-PBGWYM3H.js.map} +0 -0
  905. /package/dist/{chunk-AXTXN4T6.js.map → chunk-PWFCHOB3.js.map} +0 -0
  906. /package/dist/{chunk-FDPZVY6D.js.map → chunk-QFN4U7AG.js.map} +0 -0
  907. /package/dist/{chunk-K2ZLHESQ.js.map → chunk-QIEUU4UK.js.map} +0 -0
  908. /package/dist/{chunk-3D6AFGQR.js.map → chunk-QVT3E4CE.js.map} +0 -0
  909. /package/dist/{chunk-SFQ6QNL7.js.map → chunk-R6YJI3HE.js.map} +0 -0
  910. /package/dist/{chunk-5CJVLG3H.js.map → chunk-RFDD3B7W.js.map} +0 -0
  911. /package/dist/{chunk-JBPKEARU.js.map → chunk-RKNJBZ55.js.map} +0 -0
  912. /package/dist/{chunk-FNZQGN76.js.map → chunk-S2BBISHU.js.map} +0 -0
  913. /package/dist/{chunk-IALLX7EE.js.map → chunk-S2FSBU4H.js.map} +0 -0
  914. /package/dist/{chunk-7K5Q6COX.js.map → chunk-TVVEYCNW.js.map} +0 -0
  915. /package/dist/{chunk-DPAENM7O.js.map → chunk-U3ZAVRP3.js.map} +0 -0
  916. /package/dist/{chunk-4KJLYTLS.js.map → chunk-V57NLO5P.js.map} +0 -0
  917. /package/dist/{chunk-FLVL4L3L.js.map → chunk-VDX2J7OX.js.map} +0 -0
  918. /package/dist/{chunk-AJLLIIML.js.map → chunk-W4FBGYGK.js.map} +0 -0
  919. /package/dist/{chunk-6SXVCD7W.js.map → chunk-W7IGLX4G.js.map} +0 -0
  920. /package/dist/{chunk-KAWTOYAW.js.map → chunk-WLZYGLJ4.js.map} +0 -0
  921. /package/dist/{chunk-RO4LQGT3.js.map → chunk-WON4APQY.js.map} +0 -0
  922. /package/dist/{chunk-PQVK2S3J.js.map → chunk-WZFAPHIK.js.map} +0 -0
  923. /package/dist/{chunk-KQPJLK3X.js.map → chunk-XL24QQ63.js.map} +0 -0
  924. /package/dist/{chunk-RVZRYUQH.js.map → chunk-YROFNEG5.js.map} +0 -0
  925. /package/dist/{chunk-VRAD2FGO.js.map → chunk-Z54EM5YZ.js.map} +0 -0
  926. /package/dist/{first-start-migration-TI67YMLG.js.map → first-start-migration-CSRHCJIQ.js.map} +0 -0
  927. /package/dist/{forget-CQCLB5LB.js.map → forget-HRPLVB3W.js.map} +0 -0
  928. /package/dist/{purge-NDWV6WYD.js.map → purge-IRF47ZTX.js.map} +0 -0
  929. /package/dist/{tier-stats-KV7IWCJR.js.map → tier-stats-QEJSPFV2.js.map} +0 -0
package/src/config.ts CHANGED
@@ -35,14 +35,24 @@ import { expandTildePath } from "./utils/path.js";
35
35
  // boolean-coercion logic that connectors/index.ts already exports. The helper
36
36
  // lives in connectors/coerce.ts (a tiny, dependency-free module) so neither
37
37
  // config.ts → connectors/index.ts nor the reverse circular import arises.
38
- import { coerceBool, coerceInstallExtension, coerceNumber } from "./connectors/coerce.js";
38
+ import { coerceBool, coerceBooleanLike, coerceInstallExtension, coerceNumber } from "./connectors/coerce.js";
39
+ import { parseRecallConcurrencyConfig } from "./recall-concurrency-config.js";
39
40
  import { hasLegacyConnectorEntries } from "./connectors/paths.js";
41
+ import {
42
+ parseQmdChunkStrategy,
43
+ parseQmdDaemonTimeoutMs,
44
+ parseQmdGpuBackend,
45
+ parseQmdSearchStrategy,
46
+ parseQmdSubprocessStrategy,
47
+ parseQmdSupportedVersion,
48
+ } from "./config-qmd.js";
40
49
  import {
41
50
  resolveEmitLegacyTools,
42
51
  resolveNamespaceCatalogEnabled,
43
52
  } from "./emit-legacy-tools.js";
44
53
  import { parseWearablesConfig } from "./wearables/config.js";
45
54
  import { parseProvenanceConfig } from "./provenance.js";
55
+ import { parseBoundedJsonlStateConfig } from "./bounded-jsonl-state.js";
46
56
  import { parseCodingKnowledgeConfig } from "./coding/coding-knowledge-config.js";
47
57
  import { parseChatConfig } from "./chat/chat-config.js";
48
58
  import { parseCorrectionIntentConfig, parseFaithfulnessGateConfig } from "./faithfulness-config.js";
@@ -188,92 +198,35 @@ function parseBoundedPositiveInteger(
188
198
  return Math.max(min, Math.min(max, parsed));
189
199
  }
190
200
 
191
- function parseQmdSupportedVersion(value: unknown): string {
192
- if (value === undefined || value === null) return "2.5.3";
193
- if (typeof value !== "string") {
194
- throw new Error(`qmdSupportedVersion must be a semantic version string; got ${JSON.stringify(value)}`);
195
- }
196
- const normalized = value.trim();
197
- if (!/^\d+\.\d+\.\d+$/.test(normalized)) {
198
- throw new Error(
199
- `qmdSupportedVersion must be a semantic version string like "2.5.3"; got ${JSON.stringify(value)}`,
200
- );
201
- }
202
- return normalized;
203
- }
204
-
205
- function parseQmdGpuBackend(value: unknown): "auto" | "metal" | "cuda" | "vulkan" | "false" | undefined {
206
- if (value === undefined || value === null) return undefined;
207
- if (value === false) return "false";
208
- if (typeof value !== "string") {
209
- throw new Error(`qmdGpuBackend must be one of "auto", "metal", "cuda", "vulkan", or false; got ${JSON.stringify(value)}`);
210
- }
211
- const normalized = value.trim().toLowerCase();
201
+ /**
202
+ * Validate a closed-range integer config knob, coercing CLI numeric strings
203
+ * first (issue #1909 review round 8). `undefined`/`null` → `fallback`. Anything
204
+ * provided must coerce to a FINITE INTEGER in `[min, max]`; otherwise THROW
205
+ * (AGENTS.md #1/#39: reject invalid user input, never silently floor/clamp).
206
+ */
207
+ function parseIntegerInClosedRange(
208
+ value: unknown,
209
+ min: number,
210
+ max: number,
211
+ fallback: number,
212
+ keyName: string,
213
+ ): number {
214
+ // Only an absent key (undefined) falls back to the default; an explicit `null`
215
+ // is invalid input and proceeds to validation throw (round 9 finding 1).
216
+ if (value === undefined) return fallback;
217
+ const coerced = coerceNumber(value);
212
218
  if (
213
- normalized === "auto" ||
214
- normalized === "metal" ||
215
- normalized === "cuda" ||
216
- normalized === "vulkan" ||
217
- normalized === "false"
219
+ coerced === undefined ||
220
+ !Number.isFinite(coerced) ||
221
+ !Number.isInteger(coerced) ||
222
+ coerced < min ||
223
+ coerced > max
218
224
  ) {
219
- return normalized;
220
- }
221
- throw new Error(`qmdGpuBackend must be one of "auto", "metal", "cuda", "vulkan", or false; got ${JSON.stringify(value)}`);
222
- }
223
-
224
- function parseQmdChunkStrategy(value: unknown): "auto" | "regex" {
225
- if (value === undefined || value === null) return "auto";
226
- if (typeof value !== "string") {
227
- throw new Error(`qmdChunkStrategy must be "auto" or "regex"; got ${JSON.stringify(value)}`);
228
- }
229
- const normalized = value.trim().toLowerCase();
230
- if (normalized === "auto" || normalized === "regex") return normalized;
231
- throw new Error(`qmdChunkStrategy must be "auto" or "regex"; got ${JSON.stringify(value)}`);
232
- }
233
-
234
- // Issue #1335. Default "hybrid" preserves the historical lex+vec+hyde daemon plan.
235
- function parseQmdSearchStrategy(value: unknown): "hybrid" | "lex-vec" | "lex" {
236
- if (value === undefined || value === null) return "hybrid";
237
- if (typeof value !== "string") {
238
- throw new Error(
239
- `qmdSearchStrategy must be one of "hybrid", "lex-vec", or "lex"; got ${JSON.stringify(value)}`,
240
- );
241
- }
242
- const normalized = value.trim().toLowerCase();
243
- if (normalized === "hybrid" || normalized === "lex-vec" || normalized === "lex") {
244
- return normalized;
245
- }
246
- throw new Error(
247
- `qmdSearchStrategy must be one of "hybrid", "lex-vec", or "lex"; got ${JSON.stringify(value)}`,
248
- );
249
- }
250
-
251
- // Issue #1335. Reject non-numeric / non-integer timeouts rather than silently
252
- // coercing them (gotcha #51), then clamp valid integers to the documented bounds.
253
- function parseQmdDaemonTimeoutMs(value: unknown): number {
254
- if (value === undefined || value === null) return 8_000;
255
- const coerced = coerceNumber(value);
256
- if (coerced === undefined || !Number.isInteger(coerced)) {
257
225
  throw new Error(
258
- `qmdDaemonTimeoutMs must be an integer number of milliseconds between 1000 and 120000; got ${JSON.stringify(value)}`,
226
+ `${keyName} must be an integer in [${min}, ${max}]; got ${JSON.stringify(value)}`,
259
227
  );
260
228
  }
261
- return Math.min(120_000, Math.max(1_000, coerced));
262
- }
263
-
264
- // Issue #1335. Default "query" keeps `qmd query` (LLM expansion + rerank) per gotcha #7.
265
- function parseQmdSubprocessStrategy(value: unknown): "query" | "search" {
266
- if (value === undefined || value === null) return "query";
267
- if (typeof value !== "string") {
268
- throw new Error(
269
- `qmdSubprocessStrategy must be one of "query" or "search"; got ${JSON.stringify(value)}`,
270
- );
271
- }
272
- const normalized = value.trim().toLowerCase();
273
- if (normalized === "query" || normalized === "search") return normalized;
274
- throw new Error(
275
- `qmdSubprocessStrategy must be one of "query" or "search"; got ${JSON.stringify(value)}`,
276
- );
229
+ return coerced;
277
230
  }
278
231
 
279
232
  function parseOptionalNonEmptyString(value: unknown): string | undefined {
@@ -343,30 +296,6 @@ function parsePortNumber(
343
296
  return coerced;
344
297
  }
345
298
 
346
- // Coerce common string/number representations of a boolean to a real boolean.
347
- // Returns `undefined` when the value cannot be interpreted, so callers can
348
- // fall back to their own default. Guards against the "string `false` is
349
- // truthy" footgun (CLAUDE.md gotcha #36) when config values arrive from
350
- // CLI/env/JSON sources where booleans are sometimes string-typed.
351
- function coerceBooleanLike(value: unknown): boolean | undefined {
352
- if (typeof value === "boolean") return value;
353
- if (typeof value === "number") {
354
- if (value === 1) return true;
355
- if (value === 0) return false;
356
- return undefined;
357
- }
358
- if (typeof value === "string") {
359
- const normalized = value.trim().toLowerCase();
360
- if (normalized === "true" || normalized === "1" || normalized === "yes" || normalized === "on") {
361
- return true;
362
- }
363
- if (normalized === "false" || normalized === "0" || normalized === "no" || normalized === "off") {
364
- return false;
365
- }
366
- }
367
- return undefined;
368
- }
369
-
370
299
  function readNestedConfig(
371
300
  cfg: Record<string, unknown>,
372
301
  blockName: string,
@@ -658,6 +587,7 @@ const DEFAULT_BEHAVIOR_LOOP_PROTECTED_PARAMS = [
658
587
  "maxMemoryTokens",
659
588
  "qmdMaxResults",
660
589
  "qmdColdMaxResults",
590
+ "qmdEmbeddingBacklogThreshold",
661
591
  "recallPlannerMaxQmdResultsMinimal",
662
592
  "verbatimArtifactsMaxRecall",
663
593
  ];
@@ -1683,6 +1613,15 @@ export function parseConfig(
1683
1613
  : "openclaw-engram",
1684
1614
  qmdMaxResults:
1685
1615
  typeof cfg.qmdMaxResults === "number" ? cfg.qmdMaxResults : 8,
1616
+ qmdEmbeddingBacklogThreshold: (() => {
1617
+ const raw = cfg.qmdEmbeddingBacklogThreshold;
1618
+ const n = typeof raw === "number"
1619
+ ? raw
1620
+ : typeof raw === "string" && raw.trim() !== ""
1621
+ ? Number(raw)
1622
+ : NaN;
1623
+ return Number.isFinite(n) && Number.isInteger(n) && n >= 0 ? n : 1000;
1624
+ })(),
1686
1625
  qmdColdTierEnabled: cfg.qmdColdTierEnabled === true,
1687
1626
  qmdColdCollection:
1688
1627
  typeof cfg.qmdColdCollection === "string" && cfg.qmdColdCollection.length > 0
@@ -1780,6 +1719,16 @@ export function parseConfig(
1780
1719
  typeof cfg.sessionObserverDebounceMs === "number"
1781
1720
  ? Math.max(0, Math.floor(cfg.sessionObserverDebounceMs))
1782
1721
  : 120_000,
1722
+ // Explicit validation (issue #1909 review round 8): reject invalid input
1723
+ // rather than flooring/clamping. Must be an integer in [0, 2^31-1] (Node's
1724
+ // setTimeout ceiling); 0 = save every turn; undefined → 3000.
1725
+ bufferSaveDebounceMs: parseIntegerInClosedRange(
1726
+ cfg.bufferSaveDebounceMs,
1727
+ 0,
1728
+ 2_147_483_647,
1729
+ 3_000,
1730
+ "bufferSaveDebounceMs",
1731
+ ),
1783
1732
  sessionObserverBands,
1784
1733
  injectQuestions: cfg.injectQuestions === true,
1785
1734
  commitmentDecayDays: parseIntegerAtLeast(
@@ -2061,10 +2010,8 @@ export function parseConfig(
2061
2010
  (v): v is string => typeof v === "string" && v.length > 0,
2062
2011
  )
2063
2012
  : ["decisions", "principles", "conventions", "runbooks", "entities"],
2064
- // Cross-namespace query-budget limiter (issue #565 PR 4/5).
2065
- // Defaults to false — ships disabled so existing deployments are
2066
- // unaffected. When enabled, the read path throttles a principal that
2067
- // issues a burst of recalls against namespaces other than their own.
2013
+ // Cross-namespace query-budget limiter (issue #565 PR 4/5). Defaults to
2014
+ // false — ships disabled; when enabled, throttles cross-namespace recall bursts.
2068
2015
  recallCrossNamespaceBudgetEnabled:
2069
2016
  coerceBool(cfg.recallCrossNamespaceBudgetEnabled) ?? false,
2070
2017
  recallCrossNamespaceBudgetWindowMs: (() => {
@@ -2079,6 +2026,7 @@ export function parseConfig(
2079
2026
  const n = coerceNumber(cfg.recallCrossNamespaceBudgetHardLimit);
2080
2027
  return n !== undefined && n > 0 ? Math.floor(n) : 30;
2081
2028
  })(),
2029
+ ...parseRecallConcurrencyConfig(cfg),
2082
2030
  // Recall-audit anomaly detector (issue #565 PR 5/5). Defaults off so
2083
2031
  // existing deployments are unaffected; enable explicitly to let the
2084
2032
  // access surfaces flag suspicious query patterns derived from the
@@ -2126,6 +2074,15 @@ export function parseConfig(
2126
2074
  // opt out with recallMemoryWorthFilterEnabled=false.
2127
2075
  recallMemoryWorthFilterEnabled:
2128
2076
  coerceBool(cfg.recallMemoryWorthFilterEnabled) ?? true,
2077
+ // Trust/Memory-Worth recall stage corpus-level fallback (issue #1905).
2078
+ // Default true: when a candidate is missing from the frontmatter already
2079
+ // loaded on the hot recall path, the stage may fall back to a per-namespace
2080
+ // corpus counter/signal map (version-keyed, so it hits in steady state).
2081
+ // Set false to disable that O(corpus) fallback entirely — the stage then
2082
+ // uses only the preloaded frontmatter plus a bounded-parallel per-candidate
2083
+ // direct read (fully O(candidates)). coerceBool handles "false"/"0" forms.
2084
+ recallTrustStageCorpusFallbackEnabled:
2085
+ coerceBool(cfg.recallTrustStageCorpusFallbackEnabled) ?? true,
2129
2086
  // Hot-memories result cache (issue #1902). Default on: readAllMemories()
2130
2087
  // serves from the version-keyed in-process corpus cache. coerceBool
2131
2088
  // handles "false"/"0" string forms; set false to force disk scans.
@@ -2274,15 +2231,31 @@ export function parseConfig(
2274
2231
  ? cfg.activeRecallPromptStyle
2275
2232
  : "balanced",
2276
2233
  activeRecallCustomInstruction: (() => {
2277
- const customInstruction =
2234
+ const raw =
2278
2235
  typeof cfg.activeRecallCustomInstruction === "string"
2279
2236
  ? cfg.activeRecallCustomInstruction
2280
2237
  : typeof cfg[LEGACY_ACTIVE_RECALL_CUSTOM_FIELD] === "string"
2281
2238
  ? cfg[LEGACY_ACTIVE_RECALL_CUSTOM_FIELD]
2282
2239
  : "";
2283
- return customInstruction.trim().length > 0
2284
- ? customInstruction.trim()
2285
- : null;
2240
+ return raw.trim().length > 0 ? raw.trim() : null;
2241
+ })(),
2242
+ activeRecallPromptReplacement: (() => {
2243
+ const raw = cfg.activeRecallPromptReplacement;
2244
+ if (raw !== undefined && raw !== null && typeof raw !== "string") {
2245
+ throw new Error(
2246
+ `activeRecallPromptReplacement must be a string; got ${JSON.stringify(raw)}`,
2247
+ );
2248
+ }
2249
+ return typeof raw === "string" && raw.trim().length > 0 ? raw.trim() : null;
2250
+ })(),
2251
+ activeRecallPromptOverride: (() => {
2252
+ const raw = cfg.activeRecallPromptOverride;
2253
+ if (raw !== undefined && raw !== null && typeof raw !== "string") {
2254
+ throw new Error(
2255
+ `activeRecallPromptOverride must be a string; got ${JSON.stringify(raw)}`,
2256
+ );
2257
+ }
2258
+ return typeof raw === "string" && raw.trim().length > 0 ? raw.trim() : null;
2286
2259
  })(),
2287
2260
  activeRecallPromptAppend:
2288
2261
  typeof cfg.activeRecallPromptAppend === "string" &&
@@ -3131,6 +3104,7 @@ export function parseConfig(
3131
3104
  typeof cfg.entityRetrievalRecentTurns === "number" ? cfg.entityRetrievalRecentTurns : 6,
3132
3105
  entitySchemas,
3133
3106
  recallBudgetChars: recallPipelineConfig.recallBudgetChars,
3107
+ recallProfileMaxRatio: parseRecallProfileMaxRatio(cfg.recallProfileMaxRatio),
3134
3108
  recallOuterTimeoutMs:
3135
3109
  typeof cfg.recallOuterTimeoutMs === "number" ? Math.max(0, Math.floor(cfg.recallOuterTimeoutMs)) : 75_000,
3136
3110
  recallCoreDeadlineMs:
@@ -3305,6 +3279,17 @@ export function parseConfig(
3305
3279
  typeof cfg.proactiveExtractionTimeoutMs === "number"
3306
3280
  ? Math.max(0, Math.floor(cfg.proactiveExtractionTimeoutMs))
3307
3281
  : 2500,
3282
+ proactiveExtractionSkipWhenLocalLlmBusy: ((): boolean => {
3283
+ const raw = cfg.proactiveExtractionSkipWhenLocalLlmBusy;
3284
+ if (raw === undefined || raw === null) return true;
3285
+ const value = coerceBooleanLike(raw, "proactiveExtractionSkipWhenLocalLlmBusy");
3286
+ if (value === undefined) {
3287
+ throw new Error(
3288
+ `proactiveExtractionSkipWhenLocalLlmBusy must be boolean-like (true|false|1|0|yes|no|on|off); got ${JSON.stringify(raw)}`,
3289
+ );
3290
+ }
3291
+ return value;
3292
+ })(),
3308
3293
  proactiveExtractionMaxTokens:
3309
3294
  typeof cfg.proactiveExtractionMaxTokens === "number"
3310
3295
  ? Math.max(0, Math.floor(cfg.proactiveExtractionMaxTokens))
@@ -3572,10 +3557,9 @@ export function parseConfig(
3572
3557
  Number.isFinite(cfg.graphEdgeDecayVisibilityThreshold)
3573
3558
  ? Math.max(0, Math.min(1, cfg.graphEdgeDecayVisibilityThreshold))
3574
3559
  : 0.2,
3575
- // Issue #681 PR 3/3 — confidence-aware traversal & PageRank refinement.
3576
- // Floor clamps to [0, 1] so misconfigured input cannot accept negative
3577
- // confidences or reject every edge. Iterations floors at 0 so a
3578
- // documented 0 disables PageRank refinement and BFS scores pass through.
3560
+ ...parseBoundedJsonlStateConfig(cfg, parseIntegerAtLeast),
3561
+ // Issue #681 PR 3/3 — confidence-aware traversal. Floor clamps to [0,1]; a
3562
+ // documented 0 iterations disables PageRank refinement (BFS scores pass through).
3579
3563
  graphTraversalConfidenceFloor:
3580
3564
  typeof cfg.graphTraversalConfidenceFloor === "number" &&
3581
3565
  Number.isFinite(cfg.graphTraversalConfidenceFloor)
@@ -4136,6 +4120,17 @@ function clampNonNegativeNumber(value: unknown): number | undefined {
4136
4120
  return Math.max(0, Math.floor(value));
4137
4121
  }
4138
4122
 
4123
+ function parseRecallProfileMaxRatio(value: unknown): number {
4124
+ if (value === undefined) return 0.3;
4125
+ const ratio = coerceNumber(value);
4126
+ if (ratio === undefined || ratio < 0 || ratio > 1) {
4127
+ throw new Error(
4128
+ `recallProfileMaxRatio must be a finite number in [0, 1]; got ${JSON.stringify(value)}`,
4129
+ );
4130
+ }
4131
+ return ratio;
4132
+ }
4133
+
4139
4134
  /**
4140
4135
  * Cursor L on PR #736: numeric config keys must accept BOTH numbers
4141
4136
  * and CLI-string forms (`--config peerProfileReasonerMinInteractions=10`
@@ -295,9 +295,9 @@ test("runExtraction: mixed tagged+untagged turns → persistExtraction receives
295
295
  validAt?: string;
296
296
  sourceConnector?: string;
297
297
  }
298
- ): Promise<string[]> => {
298
+ ): Promise<{ persistedIds: string[]; memoryPathById: Map<string, string> }> => {
299
299
  spy(sourceContext);
300
- return ["fact-1"];
300
+ return { persistedIds: ["fact-1"], memoryPathById: new Map() };
301
301
  },
302
302
  maybeCapturePassiveCorrections: async () => {},
303
303
  resolveSelfNamespace: () => "default",
@@ -397,9 +397,9 @@ test("runExtraction: context-only turns without sourceConnector do not affect at
397
397
  validAt?: string;
398
398
  sourceConnector?: string;
399
399
  }
400
- ): Promise<string[]> => {
400
+ ): Promise<{ persistedIds: string[]; memoryPathById: Map<string, string> }> => {
401
401
  capturedConnector = sourceContext?.sourceConnector;
402
- return ["fact-1"];
402
+ return { persistedIds: ["fact-1"], memoryPathById: new Map() };
403
403
  },
404
404
  maybeCapturePassiveCorrections: async () => {},
405
405
  resolveSelfNamespace: () => "default",
@@ -0,0 +1,131 @@
1
+ import { strict as assert } from "node:assert";
2
+ import { afterEach, beforeEach, test } from "node:test";
3
+
4
+ import { coerceBool, coerceNumber } from "./coerce.js";
5
+ import { initLogger, resetLogger } from "../logger.js";
6
+
7
+ let warnings: string[];
8
+
9
+ beforeEach(() => {
10
+ warnings = [];
11
+ initLogger(
12
+ {
13
+ info() {},
14
+ warn(msg: string) {
15
+ warnings.push(msg);
16
+ },
17
+ error() {},
18
+ debug() {},
19
+ },
20
+ false,
21
+ { timestamps: false },
22
+ );
23
+ });
24
+
25
+ afterEach(() => {
26
+ // Restore the no-op backend so later suites do not inherit this capture sink.
27
+ initLogger({ info() {}, warn() {}, error() {}, debug() {} });
28
+ });
29
+
30
+ test("coerceBool recognizes canonical true/false spellings without warning", () => {
31
+ for (const t of ["true", "1", "yes", "on", "TRUE", " On "]) {
32
+ assert.equal(coerceBool(t), true, `${t} → true`);
33
+ }
34
+ for (const f of ["false", "0", "no", "off", "FALSE", " Off "]) {
35
+ assert.equal(coerceBool(f), false, `${f} → false`);
36
+ }
37
+ assert.equal(coerceBool(true), true);
38
+ assert.equal(coerceBool(false), false);
39
+ assert.deepEqual(warnings, [], "recognized values must not warn");
40
+ });
41
+
42
+ test("coerceBool returns undefined silently for absent values", () => {
43
+ assert.equal(coerceBool(undefined), undefined);
44
+ assert.equal(coerceBool(null), undefined);
45
+ assert.equal(coerceBool(""), undefined);
46
+ assert.equal(coerceBool(" "), undefined);
47
+ assert.deepEqual(warnings, [], "absent/empty must be treated as 'use default', no warning");
48
+ });
49
+
50
+ test("coerceBool warns on a present-but-unrecognized string and returns undefined", () => {
51
+ assert.equal(coerceBool("disabled"), undefined);
52
+ assert.equal(warnings.length, 1);
53
+ assert.match(warnings[0], /unrecognized boolean value "disabled"/);
54
+ assert.match(warnings[0], /using default/);
55
+ });
56
+
57
+ test("coerceBool includes the label in the warning when provided", () => {
58
+ assert.equal(coerceBool("fales", "qmdForceCpu"), undefined);
59
+ assert.equal(warnings.length, 1);
60
+ assert.match(warnings[0], /for qmdForceCpu/);
61
+ });
62
+
63
+ test("coerceBool does not warn on inherited Object keys (prototype safety)", () => {
64
+ assert.equal(coerceBool("constructor"), undefined);
65
+ assert.equal(coerceBool("toString"), undefined);
66
+ assert.equal(coerceBool("hasOwnProperty"), undefined);
67
+ // These are unrecognized strings, so each warns exactly once — never matched
68
+ // as a truthy/falsy token via the prototype chain.
69
+ assert.equal(warnings.length, 3);
70
+ });
71
+
72
+ test("coerceBool returns undefined without warning for non-string, non-boolean inputs", () => {
73
+ assert.equal(coerceBool(2), undefined);
74
+ assert.equal(coerceBool({}), undefined);
75
+ assert.equal(coerceBool([]), undefined);
76
+ assert.deepEqual(warnings, []);
77
+ });
78
+
79
+ test("coerceNumber accepts finite numbers and numeric strings without warning", () => {
80
+ assert.equal(coerceNumber(5), 5);
81
+ assert.equal(coerceNumber(0), 0);
82
+ assert.equal(coerceNumber(-3.5), -3.5);
83
+ assert.equal(coerceNumber("42"), 42);
84
+ assert.equal(coerceNumber(" 7 "), 7);
85
+ assert.deepEqual(warnings, []);
86
+ });
87
+
88
+ test("coerceNumber returns undefined silently for absent inputs", () => {
89
+ assert.equal(coerceNumber(undefined), undefined);
90
+ assert.equal(coerceNumber(null), undefined);
91
+ assert.equal(coerceNumber(""), undefined);
92
+ assert.equal(coerceNumber(" "), undefined);
93
+ assert.deepEqual(warnings, [], "absent numeric inputs do not warn");
94
+ });
95
+
96
+ test("coerceNumber warns on present non-finite number inputs and returns undefined", () => {
97
+ assert.equal(coerceNumber(Number.NaN), undefined);
98
+ assert.equal(coerceNumber(Number.POSITIVE_INFINITY), undefined);
99
+ assert.equal(coerceNumber(Number.NEGATIVE_INFINITY, "ttlMs"), undefined);
100
+ assert.equal(warnings.length, 3);
101
+ assert.match(warnings[0], /non-finite numeric value/);
102
+ assert.match(warnings[2], /for ttlMs/);
103
+ });
104
+
105
+ test("coerceNumber warns on a present-but-unparseable string and returns undefined", () => {
106
+ assert.equal(coerceNumber("abc"), undefined);
107
+ assert.equal(coerceNumber("NaN"), undefined);
108
+ assert.equal(coerceNumber("Infinity"), undefined);
109
+ assert.equal(coerceNumber("12px", "maxResults"), undefined);
110
+ assert.equal(warnings.length, 4);
111
+ assert.match(warnings[0], /unrecognized numeric value "abc"/);
112
+ assert.match(warnings[3], /for maxResults/);
113
+ });
114
+
115
+ test("warns via console when no logger backend is installed (standalone-core path)", () => {
116
+ resetLogger();
117
+ const originalWarn = console.warn;
118
+ const captured: string[] = [];
119
+ console.warn = (msg?: unknown) => {
120
+ captured.push(String(msg));
121
+ };
122
+ try {
123
+ assert.equal(coerceBool("disabled"), undefined);
124
+ assert.equal(coerceNumber("abc"), undefined);
125
+ } finally {
126
+ console.warn = originalWarn;
127
+ }
128
+ assert.equal(captured.length, 2);
129
+ assert.match(captured[0], /^remnic: ignoring unrecognized boolean value "disabled"/);
130
+ assert.match(captured[1], /^remnic: ignoring unrecognized numeric value "abc"/);
131
+ });
@@ -5,6 +5,28 @@
5
5
  * connectors/index.ts can import them without creating a circular dependency.
6
6
  */
7
7
 
8
+ import { isLoggerInitialized, log } from "../logger.js";
9
+
10
+ const BOOL_TOKENS: Record<string, boolean> = {
11
+ true: true, "1": true, yes: true, on: true,
12
+ false: false, "0": false, no: false, off: false,
13
+ };
14
+
15
+ /**
16
+ * Surface a "present but unrecognized config value" diagnostic. Routes through
17
+ * the installed logger when a host has called `initLogger`, and otherwise falls
18
+ * back to `console.warn` so the standalone `@remnic/core` path (documented to
19
+ * call `parseConfig()` without a logger) does not silently discard the warning
20
+ * and re-introduce the fail-open default this whole change exists to prevent.
21
+ */
22
+ export function warnUnrecognizedConfig(message: string): void {
23
+ if (isLoggerInitialized()) {
24
+ log.warn(message);
25
+ } else {
26
+ console.warn(`remnic: ${message}`);
27
+ }
28
+ }
29
+
8
30
  /**
9
31
  * Generic boolean coercion: converts string representations of booleans
10
32
  * (e.g. from CLI `--config someFlag=false`) to proper boolean values.
@@ -13,15 +35,28 @@
13
35
  * Returns `undefined` when the value is neither a boolean nor a recognised
14
36
  * string, so callers can fall back to a default.
15
37
  *
38
+ * A value that is PRESENT but unrecognised (a non-empty string like `"disabled"`
39
+ * or a typo like `"fales"`) is logged at warn level before returning `undefined`,
40
+ * so an operator typo does not silently take the caller's default — which is
41
+ * frequently a fail-open `?? true`. Absent values (`undefined`/`null`/empty
42
+ * string) fall through silently: absence legitimately means "use the default".
43
+ * Pass `label` (the config key) to make the warning actionable.
44
+ *
16
45
  * CLAUDE.md gotcha #36: String "false" is truthy in JavaScript.
17
46
  * CLAUDE.md gotcha #28: Coerce CLI values to expected types at input boundaries.
47
+ * CLAUDE.md gotcha #51: Reject/flag present-but-unrecognized values; don't
48
+ * silently default them.
18
49
  */
19
- export function coerceBool(value: unknown): boolean | undefined {
50
+ export function coerceBool(value: unknown, label?: string): boolean | undefined {
20
51
  if (typeof value === "boolean") return value;
21
52
  if (typeof value === "string") {
22
53
  const v = value.trim().toLowerCase();
23
- if (["false", "0", "no", "off"].includes(v)) return false;
24
- if (["true", "1", "yes", "on"].includes(v)) return true;
54
+ if (v === "") return undefined;
55
+ if (Object.hasOwn(BOOL_TOKENS, v)) return BOOL_TOKENS[v];
56
+ warnUnrecognizedConfig(
57
+ `ignoring unrecognized boolean value ${JSON.stringify(value)}${label ? ` for ${label}` : ""}; ` +
58
+ `expected true|false|1|0|yes|no|on|off — using default`,
59
+ );
25
60
  }
26
61
  return undefined;
27
62
  }
@@ -33,7 +68,7 @@ export function coerceBool(value: unknown): boolean | undefined {
33
68
  * Delegates to the generic `coerceBool` helper. Kept for backward compatibility.
34
69
  */
35
70
  export function coerceInstallExtension(value: unknown): boolean | undefined {
36
- return coerceBool(value);
71
+ return coerceBool(value, "installExtension");
37
72
  }
38
73
 
39
74
  /**
@@ -46,17 +81,55 @@ export function coerceInstallExtension(value: unknown): boolean | undefined {
46
81
  * - string: trimmed, parsed with `Number()`. Returns `undefined` on
47
82
  * empty, NaN, or Infinity.
48
83
  *
84
+ * A PRESENT but unparseable string (a non-empty value that is not a finite
85
+ * number) is logged at warn level before returning `undefined`, for the same
86
+ * reason as `coerceBool`: a typo must not silently take the caller's default.
87
+ * Absent values (`undefined`/`null`/empty string) fall through silently.
88
+ * Pass `label` (the config key) to make the warning actionable.
89
+ *
49
90
  * CLAUDE.md gotcha #28: Coerce CLI values to expected types at input boundaries.
91
+ * CLAUDE.md gotcha #51: Flag present-but-unrecognized values.
50
92
  */
51
- export function coerceNumber(value: unknown): number | undefined {
93
+ export function coerceNumber(value: unknown, label?: string): number | undefined {
52
94
  if (typeof value === "number") {
53
- return Number.isFinite(value) ? value : undefined;
95
+ if (Number.isFinite(value)) return value;
96
+ warnUnrecognizedConfig(
97
+ `ignoring non-finite numeric value ${JSON.stringify(value)}${label ? ` for ${label}` : ""}; ` +
98
+ `expected a finite number — using default`,
99
+ );
100
+ return undefined;
54
101
  }
55
102
  if (typeof value === "string") {
56
103
  const trimmed = value.trim();
57
104
  if (trimmed.length === 0) return undefined;
58
105
  const n = Number(trimmed);
59
- return Number.isFinite(n) ? n : undefined;
106
+ if (Number.isFinite(n)) return n;
107
+ warnUnrecognizedConfig(
108
+ `ignoring unrecognized numeric value ${JSON.stringify(value)}${label ? ` for ${label}` : ""}; ` +
109
+ `expected a finite number — using default`,
110
+ );
60
111
  }
61
112
  return undefined;
62
113
  }
114
+
115
+ /**
116
+ * Config-layer boolean coercion. Adds numeric 1/0 handling on top of the
117
+ * canonical `coerceBool` because config values can arrive as JSON numbers,
118
+ * which `coerceBool` intentionally does not accept. Any other present-but-
119
+ * unrecognized value (string typo or out-of-range number) warns and returns
120
+ * `undefined` so a caller's fail-open `?? true` default is not taken silently.
121
+ *
122
+ * CLAUDE.md gotcha #36: string "false" is truthy in JavaScript.
123
+ */
124
+ export function coerceBooleanLike(value: unknown, label?: string): boolean | undefined {
125
+ if (typeof value === "number") {
126
+ if (value === 1) return true;
127
+ if (value === 0) return false;
128
+ warnUnrecognizedConfig(
129
+ `ignoring unrecognized boolean value ${JSON.stringify(value)}${label ? ` for ${label}` : ""}; ` +
130
+ `expected true|false|1|0|yes|no|on|off — using default`,
131
+ );
132
+ return undefined;
133
+ }
134
+ return coerceBool(value, label);
135
+ }
@@ -24,6 +24,7 @@ import { executeResolution, isValidResolutionVerb } from "./resolution.js";
24
24
  import { ACTIVE_STATUSES, runContradictionScan } from "./contradiction-scan.js";
25
25
  import { parseConfig } from "../config.js";
26
26
  import type { StorageManager } from "../storage.js";
27
+ import { sealedWriteToLegacyArgs, type SealedMemoryEnvelope } from "../write-envelope.js";
27
28
  import type { MemoryCategory, MemoryFile, MemoryFrontmatter } from "../types.js";
28
29
 
29
30
  type FrontmatterLifecycleOptions = Parameters<StorageManager["writeMemoryFrontmatter"]>[2];
@@ -117,12 +118,15 @@ function makeResolutionStorage(options: {
117
118
  const memory = memories.get(id);
118
119
  return memory ? cloneMemory(memory) : null;
119
120
  },
120
- async writeMemory(category: MemoryCategory, content: string, writeOptions: {
121
- lineage?: string[];
122
- derivedFrom?: string[];
123
- derivedVia?: string;
124
- tags?: string[];
125
- }) {
121
+ // Production mapper keeps this legacy-shaped double faithful (§21).
122
+ async writeSealedMemory(envelope: SealedMemoryEnvelope, extras: Record<string, unknown>) {
123
+ const { category, content, options } = sealedWriteToLegacyArgs(envelope, extras);
124
+ const writeOptions = options as {
125
+ lineage?: string[];
126
+ derivedFrom?: string[];
127
+ derivedVia?: string;
128
+ tags?: string[];
129
+ };
126
130
  const id = `merged-created-${memories.size}`;
127
131
  const memory = makeMemory(id, category);
128
132
  memory.content = content;