@remnic/core 1.1.11 → 1.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1462) hide show
  1. package/README.md +3 -3
  2. package/dist/access-cli.d.ts +2 -1
  3. package/dist/access-cli.js +293 -104
  4. package/dist/access-cli.js.map +1 -1
  5. package/dist/access-http.d.ts +31 -62
  6. package/dist/access-http.js +53 -35
  7. package/dist/access-mcp.d.ts +31 -8
  8. package/dist/access-mcp.js +45 -34
  9. package/dist/access-schema.d.ts +197 -14
  10. package/dist/access-schema.js +16 -5
  11. package/dist/access-service-DcCDmNYC.d.ts +1542 -0
  12. package/dist/access-service.d.ts +30 -9
  13. package/dist/access-service.js +42 -32
  14. package/dist/action-confidence.d.ts +83 -0
  15. package/dist/action-confidence.js +22 -0
  16. package/dist/active-memory-bridge.d.ts +1 -1
  17. package/dist/active-memory-bridge.js +2 -2
  18. package/dist/active-recall.d.ts +1 -1
  19. package/dist/active-recall.js +11 -3
  20. package/dist/active-recall.js.map +1 -1
  21. package/dist/adapters/claude-code.d.ts +24 -0
  22. package/dist/adapters/claude-code.js +9 -0
  23. package/dist/adapters/codex.d.ts +25 -0
  24. package/dist/adapters/codex.js +9 -0
  25. package/dist/adapters/hermes.d.ts +35 -0
  26. package/dist/adapters/hermes.js +9 -0
  27. package/dist/adapters/index.d.ts +6 -0
  28. package/dist/adapters/index.js +26 -0
  29. package/dist/adapters/registry.d.ts +20 -0
  30. package/dist/adapters/registry.js +13 -0
  31. package/dist/adapters/replit.d.ts +28 -0
  32. package/dist/adapters/replit.js +9 -0
  33. package/dist/adapters/types.d.ts +43 -0
  34. package/dist/adapters/types.js +8 -0
  35. package/dist/behavior-learner.d.ts +1 -1
  36. package/dist/behavior-signals.d.ts +1 -1
  37. package/dist/bootstrap.d.ts +23 -6
  38. package/dist/boxes.d.ts +7 -0
  39. package/dist/boxes.js +1 -1
  40. package/dist/briefing.d.ts +5 -3
  41. package/dist/briefing.js +10 -7
  42. package/dist/buffer-surprise-report.d.ts +1 -1
  43. package/dist/buffer-surprise-report.js +1 -1
  44. package/dist/buffer.d.ts +18 -4
  45. package/dist/buffer.js +1 -1
  46. package/dist/calibration.d.ts +1 -1
  47. package/dist/calibration.js +6 -6
  48. package/dist/capsule-cli.d.ts +4 -4
  49. package/dist/capsule-cli.js +1 -1
  50. package/dist/capsule-crypto-5CYAGVC5.js +18 -0
  51. package/dist/capsule-merge-4MGKE7C5.js +189 -0
  52. package/dist/causal-behavior.d.ts +9 -29
  53. package/dist/causal-behavior.js +6 -3
  54. package/dist/causal-behavior.js.map +1 -1
  55. package/dist/causal-chain.js +3 -2
  56. package/dist/causal-consolidation.d.ts +2 -2
  57. package/dist/causal-consolidation.js +28 -17
  58. package/dist/causal-consolidation.js.map +1 -1
  59. package/dist/causal-retrieval.js +3 -3
  60. package/dist/causal-trajectory.js +1 -1
  61. package/dist/chunk-25MQ7IHJ.js +427 -0
  62. package/dist/chunk-25MQ7IHJ.js.map +1 -0
  63. package/dist/chunk-2F2W355T.js +256 -0
  64. package/dist/chunk-2F2W355T.js.map +1 -0
  65. package/dist/chunk-2KI4QFHU.js +228 -0
  66. package/dist/chunk-2KI4QFHU.js.map +1 -0
  67. package/dist/chunk-2PRQG7PV.js +86 -0
  68. package/dist/chunk-2PRQG7PV.js.map +1 -0
  69. package/dist/chunk-2QR3XXIC.js +2272 -0
  70. package/dist/chunk-2QR3XXIC.js.map +1 -0
  71. package/dist/chunk-2WWLHTZY.js +121 -0
  72. package/dist/chunk-326G7DJK.js +2185 -0
  73. package/dist/chunk-326G7DJK.js.map +1 -0
  74. package/dist/chunk-34DQE4KF.js +174 -0
  75. package/dist/chunk-34DQE4KF.js.map +1 -0
  76. package/dist/chunk-3APJ5EVB.js +601 -0
  77. package/dist/chunk-3APJ5EVB.js.map +1 -0
  78. package/dist/chunk-3HPAPHUK.js +51 -0
  79. package/dist/chunk-3HPAPHUK.js.map +1 -0
  80. package/dist/chunk-3JXBXXM2.js +69 -0
  81. package/dist/chunk-3JXBXXM2.js.map +1 -0
  82. package/dist/chunk-3KW65B36.js +681 -0
  83. package/dist/chunk-3KW65B36.js.map +1 -0
  84. package/dist/chunk-3UXOZBHV.js +20 -0
  85. package/dist/chunk-3UXOZBHV.js.map +1 -0
  86. package/dist/chunk-3VAL7ZL2.js +266 -0
  87. package/dist/chunk-3VAL7ZL2.js.map +1 -0
  88. package/dist/chunk-3Y4P7RXM.js +31 -0
  89. package/dist/chunk-3Y4P7RXM.js.map +1 -0
  90. package/dist/chunk-47VWKCAF.js +273 -0
  91. package/dist/chunk-47VWKCAF.js.map +1 -0
  92. package/dist/chunk-4CRG46BG.js +271 -0
  93. package/dist/chunk-4RA3C3EV.js +60 -0
  94. package/dist/chunk-4RA3C3EV.js.map +1 -0
  95. package/dist/chunk-5375UYTQ.js +914 -0
  96. package/dist/chunk-5375UYTQ.js.map +1 -0
  97. package/dist/chunk-56K5QLHX.js +506 -0
  98. package/dist/chunk-56K5QLHX.js.map +1 -0
  99. package/dist/chunk-5NXIJZFX.js +180 -0
  100. package/dist/chunk-5NXIJZFX.js.map +1 -0
  101. package/dist/chunk-5RGLBDQF.js +596 -0
  102. package/dist/chunk-5RGLBDQF.js.map +1 -0
  103. package/dist/chunk-5UZXUTVO.js +9 -0
  104. package/dist/chunk-5UZXUTVO.js.map +1 -0
  105. package/dist/chunk-65PG43EQ.js +105 -0
  106. package/dist/chunk-65PG43EQ.js.map +1 -0
  107. package/dist/chunk-66DHUKLO.js +57 -0
  108. package/dist/chunk-66DHUKLO.js.map +1 -0
  109. package/dist/chunk-6FC5EGNV.js +46 -0
  110. package/dist/chunk-6FC5EGNV.js.map +1 -0
  111. package/dist/chunk-6H2TESSP.js +62 -0
  112. package/dist/chunk-6H2TESSP.js.map +1 -0
  113. package/dist/chunk-6LVVDPJ4.js +32 -0
  114. package/dist/chunk-6LVVDPJ4.js.map +1 -0
  115. package/dist/chunk-6NKAQ74D.js +2237 -0
  116. package/dist/chunk-6NKAQ74D.js.map +1 -0
  117. package/dist/chunk-6RVI47ZR.js +159 -0
  118. package/dist/chunk-6RVI47ZR.js.map +1 -0
  119. package/dist/chunk-7AAT6G4Q.js +5117 -0
  120. package/dist/chunk-7AAT6G4Q.js.map +1 -0
  121. package/dist/chunk-7DTASS5T.js +29 -0
  122. package/dist/chunk-7DTASS5T.js.map +1 -0
  123. package/dist/chunk-7IASACLB.js +596 -0
  124. package/dist/chunk-7MNMYOFP.js +32 -0
  125. package/dist/chunk-7MNMYOFP.js.map +1 -0
  126. package/dist/chunk-7N4KAIGN.js +133 -0
  127. package/dist/chunk-7N4KAIGN.js.map +1 -0
  128. package/dist/chunk-7OZ53EXP.js +101 -0
  129. package/dist/chunk-7OZ53EXP.js.map +1 -0
  130. package/dist/chunk-7XYTQGCC.js +134 -0
  131. package/dist/chunk-7XYTQGCC.js.map +1 -0
  132. package/dist/chunk-A2XUIMJ3.js +341 -0
  133. package/dist/chunk-A2XUIMJ3.js.map +1 -0
  134. package/dist/chunk-AC5LO7IU.js +308 -0
  135. package/dist/chunk-AC5LO7IU.js.map +1 -0
  136. package/dist/chunk-AGZQD76C.js +201 -0
  137. package/dist/chunk-AGZQD76C.js.map +1 -0
  138. package/dist/chunk-AH2JUU6X.js +336 -0
  139. package/dist/chunk-AH2JUU6X.js.map +1 -0
  140. package/dist/chunk-APO3DCMU.js +361 -0
  141. package/dist/chunk-APO3DCMU.js.map +1 -0
  142. package/dist/chunk-BFBF3XEF.js +283 -0
  143. package/dist/chunk-BFBF3XEF.js.map +1 -0
  144. package/dist/chunk-BJ3KMYTB.js +1974 -0
  145. package/dist/chunk-BJ3KMYTB.js.map +1 -0
  146. package/dist/chunk-C5BCH4ZS.js +317 -0
  147. package/dist/chunk-C5BCH4ZS.js.map +1 -0
  148. package/dist/chunk-CHEL3SKB.js +6758 -0
  149. package/dist/chunk-CHEL3SKB.js.map +1 -0
  150. package/dist/chunk-CQZRLNMV.js +1491 -0
  151. package/dist/chunk-CQZRLNMV.js.map +1 -0
  152. package/dist/chunk-D46YSIYX.js +892 -0
  153. package/dist/chunk-D46YSIYX.js.map +1 -0
  154. package/dist/chunk-DB5A3NHS.js +906 -0
  155. package/dist/chunk-DB5A3NHS.js.map +1 -0
  156. package/dist/chunk-DINWEURR.js +648 -0
  157. package/dist/chunk-DINWEURR.js.map +1 -0
  158. package/dist/chunk-DK5LDEQM.js +530 -0
  159. package/dist/chunk-DK5LDEQM.js.map +1 -0
  160. package/dist/chunk-DOM4GKSW.js +34 -0
  161. package/dist/chunk-DOM4GKSW.js.map +1 -0
  162. package/dist/chunk-EDTHC6UD.js +1075 -0
  163. package/dist/chunk-EDTHC6UD.js.map +1 -0
  164. package/dist/chunk-EFJ3MQ4V.js +721 -0
  165. package/dist/chunk-EHRTFRWW.js +89 -0
  166. package/dist/chunk-EHRTFRWW.js.map +1 -0
  167. package/dist/chunk-FAJ7FZYM.js +11 -0
  168. package/dist/chunk-FAJ7FZYM.js.map +1 -0
  169. package/dist/chunk-FBYESMQ2.js +570 -0
  170. package/dist/chunk-FBYESMQ2.js.map +1 -0
  171. package/dist/chunk-FDU6HUUL.js +147 -0
  172. package/dist/chunk-FF4KLI5W.js +99 -0
  173. package/dist/chunk-FF4KLI5W.js.map +1 -0
  174. package/dist/chunk-FIT6DMX6.js +310 -0
  175. package/dist/chunk-FIT6DMX6.js.map +1 -0
  176. package/dist/chunk-FJ43PRLT.js +272 -0
  177. package/dist/chunk-FJ43PRLT.js.map +1 -0
  178. package/dist/chunk-FKFMOY3N.js +32 -0
  179. package/dist/chunk-FKFMOY3N.js.map +1 -0
  180. package/dist/chunk-FLTNHQK6.js +262 -0
  181. package/dist/chunk-FLTNHQK6.js.map +1 -0
  182. package/dist/chunk-GA454ALV.js +12436 -0
  183. package/dist/chunk-GA454ALV.js.map +1 -0
  184. package/dist/chunk-GGKRUQOO.js +228 -0
  185. package/dist/chunk-GIF42EW3.js +63 -0
  186. package/dist/chunk-GIF42EW3.js.map +1 -0
  187. package/dist/chunk-GL6I6MEQ.js +647 -0
  188. package/dist/chunk-H3ME6L6D.js +709 -0
  189. package/dist/chunk-H3ME6L6D.js.map +1 -0
  190. package/dist/chunk-HHLLAQGZ.js +1 -0
  191. package/dist/chunk-HXXBL2KD.js +2040 -0
  192. package/dist/chunk-I5V2VDIW.js +219 -0
  193. package/dist/chunk-I5V2VDIW.js.map +1 -0
  194. package/dist/chunk-I6K5FBRQ.js +35 -0
  195. package/dist/chunk-I6K5FBRQ.js.map +1 -0
  196. package/dist/chunk-ICRIXAP2.js +121 -0
  197. package/dist/chunk-ICRIXAP2.js.map +1 -0
  198. package/dist/chunk-J4EB7DNW.js +11 -0
  199. package/dist/chunk-J4EB7DNW.js.map +1 -0
  200. package/dist/chunk-JLFA7DQG.js +62 -0
  201. package/dist/chunk-JLFA7DQG.js.map +1 -0
  202. package/dist/chunk-KJTKLXTH.js +9 -0
  203. package/dist/chunk-KJTKLXTH.js.map +1 -0
  204. package/dist/chunk-KLAO5DGL.js +917 -0
  205. package/dist/chunk-KLAO5DGL.js.map +1 -0
  206. package/dist/chunk-KNKUID7G.js +183 -0
  207. package/dist/chunk-KOSORCJG.js +624 -0
  208. package/dist/chunk-KOSORCJG.js.map +1 -0
  209. package/dist/chunk-KUJVMMZQ.js +1262 -0
  210. package/dist/chunk-KUJVMMZQ.js.map +1 -0
  211. package/dist/chunk-LCR46JY5.js +123 -0
  212. package/dist/chunk-LCR46JY5.js.map +1 -0
  213. package/dist/chunk-LLQ2LLWF.js +148 -0
  214. package/dist/chunk-LLQ2LLWF.js.map +1 -0
  215. package/dist/chunk-LPMVBPA3.js +236 -0
  216. package/dist/chunk-LT3NLYSI.js +50 -0
  217. package/dist/chunk-LT3NLYSI.js.map +1 -0
  218. package/dist/chunk-LUDTDZLK.js +287 -0
  219. package/dist/chunk-LUDTDZLK.js.map +1 -0
  220. package/dist/chunk-M23FSH32.js +3963 -0
  221. package/dist/chunk-M23FSH32.js.map +1 -0
  222. package/dist/chunk-MC26UJIM.js +118 -0
  223. package/dist/chunk-ME6ESPZU.js +119 -0
  224. package/dist/chunk-ME6ESPZU.js.map +1 -0
  225. package/dist/chunk-MGKYQQYF.js +272 -0
  226. package/dist/chunk-MGKYQQYF.js.map +1 -0
  227. package/dist/chunk-MJFNCJXV.js +66 -0
  228. package/dist/chunk-MJFNCJXV.js.map +1 -0
  229. package/dist/chunk-MSWG7JI6.js +237 -0
  230. package/dist/chunk-MSWG7JI6.js.map +1 -0
  231. package/dist/chunk-MT25YHYH.js +141 -0
  232. package/dist/chunk-MT25YHYH.js.map +1 -0
  233. package/dist/chunk-MT4HVDUZ.js +53 -0
  234. package/dist/chunk-MY6TPVXW.js +219 -0
  235. package/dist/chunk-N2D6GXBM.js +267 -0
  236. package/dist/chunk-N2D6GXBM.js.map +1 -0
  237. package/dist/chunk-NJ3MJQZX.js +46 -0
  238. package/dist/chunk-NJ3MJQZX.js.map +1 -0
  239. package/dist/chunk-NMZY542O.js +335 -0
  240. package/dist/chunk-NMZY542O.js.map +1 -0
  241. package/dist/chunk-NNVTUXEB.js +23 -0
  242. package/dist/chunk-NZL6GGQE.js +375 -0
  243. package/dist/chunk-NZL6GGQE.js.map +1 -0
  244. package/dist/chunk-OAZ5MFUB.js +4124 -0
  245. package/dist/chunk-OAZ5MFUB.js.map +1 -0
  246. package/dist/chunk-OIGNEXKZ.js +237 -0
  247. package/dist/chunk-OIGNEXKZ.js.map +1 -0
  248. package/dist/chunk-OZKZ2TRP.js +3729 -0
  249. package/dist/chunk-OZKZ2TRP.js.map +1 -0
  250. package/dist/chunk-P4NEIHUT.js +108 -0
  251. package/dist/chunk-P7FMDTKL.js +103 -0
  252. package/dist/chunk-P7FMDTKL.js.map +1 -0
  253. package/dist/chunk-PD6O7AXF.js +110 -0
  254. package/dist/chunk-PD6O7AXF.js.map +1 -0
  255. package/dist/chunk-PHK3HARR.js +32 -0
  256. package/dist/chunk-PHK3HARR.js.map +1 -0
  257. package/dist/chunk-PIRJPV5T.js +98 -0
  258. package/dist/chunk-PIRJPV5T.js.map +1 -0
  259. package/dist/chunk-PK7H5L6Y.js +159 -0
  260. package/dist/chunk-PK7H5L6Y.js.map +1 -0
  261. package/dist/chunk-PR5FBTFU.js +233 -0
  262. package/dist/chunk-PR5FBTFU.js.map +1 -0
  263. package/dist/chunk-PU63GXWS.js +174 -0
  264. package/dist/chunk-PU63GXWS.js.map +1 -0
  265. package/dist/chunk-PYPOFEMK.js +294 -0
  266. package/dist/chunk-PYPOFEMK.js.map +1 -0
  267. package/dist/chunk-PZIAX57I.js +124 -0
  268. package/dist/chunk-PZIAX57I.js.map +1 -0
  269. package/dist/chunk-Q7P4WJDP.js +26 -0
  270. package/dist/chunk-Q7P4WJDP.js.map +1 -0
  271. package/dist/chunk-QDZ2RLEC.js +908 -0
  272. package/dist/chunk-QDZ2RLEC.js.map +1 -0
  273. package/dist/chunk-QQUAB63I.js +63 -0
  274. package/dist/chunk-QQUAB63I.js.map +1 -0
  275. package/dist/chunk-QRNI5JBH.js +18 -0
  276. package/dist/chunk-RHY3HH7P.js +601 -0
  277. package/dist/chunk-RHY3HH7P.js.map +1 -0
  278. package/dist/chunk-RK6F44Y6.js +84 -0
  279. package/dist/chunk-RK6F44Y6.js.map +1 -0
  280. package/dist/chunk-RRF5UOBJ.js +91 -0
  281. package/dist/chunk-RXDLTSWT.js +124 -0
  282. package/dist/chunk-RXDLTSWT.js.map +1 -0
  283. package/dist/chunk-RYED3SPJ.js +42 -0
  284. package/dist/chunk-RYED3SPJ.js.map +1 -0
  285. package/dist/chunk-S7KDBTWT.js +106 -0
  286. package/dist/chunk-S7KDBTWT.js.map +1 -0
  287. package/dist/chunk-SEDEKFYQ.js +1 -0
  288. package/dist/chunk-SOAU2OE2.js +125 -0
  289. package/dist/chunk-SOAU2OE2.js.map +1 -0
  290. package/dist/chunk-TECVW3JP.js +36 -0
  291. package/dist/chunk-TECVW3JP.js.map +1 -0
  292. package/dist/chunk-TFO23QT4.js +88 -0
  293. package/dist/chunk-TFO23QT4.js.map +1 -0
  294. package/dist/chunk-TK4UEOSK.js +76 -0
  295. package/dist/chunk-TK4UEOSK.js.map +1 -0
  296. package/dist/chunk-TKWGAOLV.js +122 -0
  297. package/dist/chunk-TKWGAOLV.js.map +1 -0
  298. package/dist/chunk-TMM4S4IJ.js +597 -0
  299. package/dist/chunk-TMM4S4IJ.js.map +1 -0
  300. package/dist/chunk-TMQLARTH.js +188 -0
  301. package/dist/chunk-TMQLARTH.js.map +1 -0
  302. package/dist/chunk-TPDBFYEG.js +130 -0
  303. package/dist/chunk-TPDBFYEG.js.map +1 -0
  304. package/dist/chunk-TPMQ3G6Z.js +145 -0
  305. package/dist/chunk-TPMQ3G6Z.js.map +1 -0
  306. package/dist/chunk-TZOLIGIG.js +61 -0
  307. package/dist/chunk-TZOLIGIG.js.map +1 -0
  308. package/dist/chunk-U3PN77QT.js +113 -0
  309. package/dist/chunk-U3WSW6PZ.js +277 -0
  310. package/dist/chunk-U4SCL7B7.js +640 -0
  311. package/dist/chunk-U4SCL7B7.js.map +1 -0
  312. package/dist/chunk-UWK5OXUJ.js +156 -0
  313. package/dist/chunk-UWK5OXUJ.js.map +1 -0
  314. package/dist/chunk-UWVJF25J.js +74 -0
  315. package/dist/chunk-UXHQAFNA.js +1317 -0
  316. package/dist/chunk-UXHQAFNA.js.map +1 -0
  317. package/dist/chunk-V5OCT34X.js +1 -0
  318. package/dist/chunk-V5OCT34X.js.map +1 -0
  319. package/dist/chunk-VLXA6PI2.js +304 -0
  320. package/dist/chunk-VLXA6PI2.js.map +1 -0
  321. package/dist/chunk-VNO6ZJ35.js +500 -0
  322. package/dist/chunk-VNO6ZJ35.js.map +1 -0
  323. package/dist/chunk-VW676BEI.js +827 -0
  324. package/dist/chunk-VW676BEI.js.map +1 -0
  325. package/dist/chunk-VWT3F4IV.js +2161 -0
  326. package/dist/chunk-VWT3F4IV.js.map +1 -0
  327. package/dist/chunk-W3LR522O.js +2296 -0
  328. package/dist/chunk-W3LR522O.js.map +1 -0
  329. package/dist/chunk-W4L6CZKA.js +96 -0
  330. package/dist/chunk-W4L6CZKA.js.map +1 -0
  331. package/dist/chunk-W4RVMTHR.js +372 -0
  332. package/dist/chunk-W4RVMTHR.js.map +1 -0
  333. package/dist/chunk-WEHSQBFR.js +188 -0
  334. package/dist/chunk-WEHSQBFR.js.map +1 -0
  335. package/dist/chunk-WELDCG6C.js +380 -0
  336. package/dist/chunk-WELDCG6C.js.map +1 -0
  337. package/dist/chunk-WZYKANL3.js +2800 -0
  338. package/dist/chunk-WZYKANL3.js.map +1 -0
  339. package/dist/chunk-XIG5PDM7.js +48 -0
  340. package/dist/chunk-XJNBEDFE.js +193 -0
  341. package/dist/chunk-XJNBEDFE.js.map +1 -0
  342. package/dist/chunk-XVVIG67A.js +291 -0
  343. package/dist/chunk-XVVIG67A.js.map +1 -0
  344. package/dist/chunk-XVZ7B3HG.js +135 -0
  345. package/dist/chunk-YBPYIAA5.js +73 -0
  346. package/dist/chunk-YBPYIAA5.js.map +1 -0
  347. package/dist/chunk-Z734BLO3.js +21 -0
  348. package/dist/chunk-Z734BLO3.js.map +1 -0
  349. package/dist/chunk-ZKSK55RC.js +269 -0
  350. package/dist/chunk-ZKSK55RC.js.map +1 -0
  351. package/dist/chunk-ZTFCYYEZ.js +69 -0
  352. package/dist/chunk-ZTFCYYEZ.js.map +1 -0
  353. package/dist/chunk-ZY2MNJR6.js +329 -0
  354. package/dist/chunk-ZY2MNJR6.js.map +1 -0
  355. package/dist/cli-D3VpkVwB.d.ts +1136 -0
  356. package/dist/cli.d.ts +42 -10
  357. package/dist/cli.js +121 -58
  358. package/dist/codex-cli-fallback.d.ts +1 -0
  359. package/dist/codex-cli-fallback.js +1 -1
  360. package/dist/commitment-ledger.js +1 -1
  361. package/dist/compat/checks.d.ts +5 -0
  362. package/dist/compat/checks.js +11 -0
  363. package/dist/compat/checks.js.map +1 -0
  364. package/dist/compat/types.d.ts +30 -0
  365. package/dist/compat/types.js +1 -0
  366. package/dist/compat/types.js.map +1 -0
  367. package/dist/compounding/engine.d.ts +221 -0
  368. package/dist/compounding/engine.js +32 -0
  369. package/dist/compounding/engine.js.map +1 -0
  370. package/dist/compounding/preference-consolidator.d.ts +92 -0
  371. package/dist/compounding/preference-consolidator.js +553 -0
  372. package/dist/compounding/preference-consolidator.js.map +1 -0
  373. package/dist/compression-optimizer.d.ts +1 -1
  374. package/dist/config.d.ts +5 -3
  375. package/dist/config.js +9 -4
  376. package/dist/conflict-policy-DyJ2wd-h.d.ts +4 -0
  377. package/dist/connectors/codex-materialize-runner.d.ts +64 -0
  378. package/dist/connectors/codex-materialize-runner.js +33 -0
  379. package/dist/connectors/codex-materialize-runner.js.map +1 -0
  380. package/dist/connectors/codex-materialize.d.ts +195 -0
  381. package/dist/connectors/codex-materialize.js +38 -0
  382. package/dist/connectors/codex-materialize.js.map +1 -0
  383. package/dist/connectors/index.d.ts +444 -0
  384. package/dist/connectors/index.js +115 -0
  385. package/dist/connectors/index.js.map +1 -0
  386. package/dist/connectors-cli-CwbyjGR7.d.ts +257 -0
  387. package/dist/connectors-cli.d.ts +1 -1
  388. package/dist/consolidation-provenance-check.d.ts +4 -2
  389. package/dist/consolidation-undo.d.ts +4 -2
  390. package/dist/contradiction/index.d.ts +258 -0
  391. package/dist/contradiction/index.js +43 -0
  392. package/dist/contradiction/index.js.map +1 -0
  393. package/dist/contradiction-review-ATP4S6IC.js +30 -0
  394. package/dist/contradiction-review-ATP4S6IC.js.map +1 -0
  395. package/dist/contradiction-scan-5A4IDZV5.js +13 -0
  396. package/dist/contradiction-scan-5A4IDZV5.js.map +1 -0
  397. package/dist/conversation-index/backend.d.ts +97 -0
  398. package/dist/conversation-index/backend.js +13 -0
  399. package/dist/conversation-index/backend.js.map +1 -0
  400. package/dist/conversation-index/chunker.d.ts +16 -0
  401. package/dist/conversation-index/chunker.js +8 -0
  402. package/dist/conversation-index/chunker.js.map +1 -0
  403. package/dist/conversation-index/cleanup.d.ts +11 -0
  404. package/dist/conversation-index/cleanup.js +9 -0
  405. package/dist/conversation-index/cleanup.js.map +1 -0
  406. package/dist/conversation-index/faiss-adapter.d.ts +6 -0
  407. package/dist/conversation-index/faiss-adapter.js +16 -0
  408. package/dist/conversation-index/faiss-adapter.js.map +1 -0
  409. package/dist/conversation-index/indexer.d.ts +23 -0
  410. package/dist/conversation-index/indexer.js +15 -0
  411. package/dist/conversation-index/indexer.js.map +1 -0
  412. package/dist/conversation-index/search.d.ts +6 -0
  413. package/dist/conversation-index/search.js +11 -0
  414. package/dist/conversation-index/search.js.map +1 -0
  415. package/dist/day-summary.d.ts +1 -1
  416. package/dist/delinearize.d.ts +1 -1
  417. package/dist/direct-answer-wiring.d.ts +1 -1
  418. package/dist/direct-answer-wiring.js +1 -1
  419. package/dist/direct-answer.d.ts +1 -1
  420. package/dist/embedding-fallback.d.ts +1 -1
  421. package/dist/embedding-fallback.js +2 -2
  422. package/dist/enrichment/index.d.ts +163 -0
  423. package/dist/enrichment/index.js +18 -0
  424. package/dist/enrichment/index.js.map +1 -0
  425. package/dist/entity-retrieval.d.ts +4 -2
  426. package/dist/entity-retrieval.js +9 -6
  427. package/dist/entity-schema.d.ts +1 -1
  428. package/dist/evals.js +1 -1
  429. package/dist/event-order-recall.d.ts +17 -0
  430. package/dist/event-order-recall.js +11 -0
  431. package/dist/event-order-recall.js.map +1 -0
  432. package/dist/evidence-pack.d.ts +3 -1
  433. package/dist/evidence-pack.js +5 -3
  434. package/dist/explicit-capture.d.ts +23 -6
  435. package/dist/explicit-capture.js +2 -2
  436. package/dist/explicit-cue-recall.d.ts +4 -1
  437. package/dist/explicit-cue-recall.js +4 -2
  438. package/dist/extraction-judge-telemetry.d.ts +1 -1
  439. package/dist/extraction-judge-training.d.ts +1 -1
  440. package/dist/extraction-judge-training.js +1 -1
  441. package/dist/extraction-judge.d.ts +1 -1
  442. package/dist/extraction.d.ts +1 -1
  443. package/dist/extraction.js +11 -10
  444. package/dist/faiss-adapter-CzPghc4C.d.ts +70 -0
  445. package/dist/fallback-llm.d.ts +4 -1
  446. package/dist/fallback-llm.js +6 -6
  447. package/dist/focused-list-recall.d.ts +17 -0
  448. package/dist/focused-list-recall.js +11 -0
  449. package/dist/focused-list-recall.js.map +1 -0
  450. package/dist/graph-edge-decay-5DI5GUNL.js +207 -0
  451. package/dist/identity-continuity.d.ts +1 -1
  452. package/dist/importance.d.ts +1 -1
  453. package/dist/index-DJ9QWMw-.d.ts +35 -0
  454. package/dist/index.d.ts +107 -715
  455. package/dist/index.js +657 -2611
  456. package/dist/index.js.map +1 -1
  457. package/dist/intent.d.ts +1 -1
  458. package/dist/intent.js +1 -1
  459. package/dist/lcm/archive.d.ts +89 -0
  460. package/dist/lcm/archive.js +12 -0
  461. package/dist/lcm/archive.js.map +1 -0
  462. package/dist/lcm/dag.d.ts +48 -0
  463. package/dist/lcm/dag.js +8 -0
  464. package/dist/lcm/dag.js.map +1 -0
  465. package/dist/lcm/engine.d.ts +116 -0
  466. package/dist/lcm/engine.js +20 -0
  467. package/dist/lcm/engine.js.map +1 -0
  468. package/dist/lcm/index.d.ts +12 -0
  469. package/dist/lcm/index.js +44 -0
  470. package/dist/lcm/index.js.map +1 -0
  471. package/dist/lcm/queue.d.ts +62 -0
  472. package/dist/lcm/queue.js +8 -0
  473. package/dist/lcm/queue.js.map +1 -0
  474. package/dist/lcm/recall.d.ts +20 -0
  475. package/dist/lcm/recall.js +8 -0
  476. package/dist/lcm/recall.js.map +1 -0
  477. package/dist/lcm/schema.d.ts +16 -0
  478. package/dist/lcm/schema.js +14 -0
  479. package/dist/lcm/schema.js.map +1 -0
  480. package/dist/lcm/summarizer.d.ts +38 -0
  481. package/dist/lcm/summarizer.js +12 -0
  482. package/dist/lcm/summarizer.js.map +1 -0
  483. package/dist/lcm/tools.d.ts +29 -0
  484. package/dist/lcm/tools.js +8 -0
  485. package/dist/lcm/tools.js.map +1 -0
  486. package/dist/lifecycle.d.ts +1 -1
  487. package/dist/live-connectors-runner.d.ts +1 -1
  488. package/dist/live-connectors-runner.js +5 -5
  489. package/dist/local-llm.d.ts +8 -4
  490. package/dist/local-llm.js +3 -3
  491. package/dist/maintenance/archive-observations.d.ts +18 -0
  492. package/dist/maintenance/archive-observations.js +8 -0
  493. package/dist/maintenance/archive-observations.js.map +1 -0
  494. package/dist/maintenance/backup-stamp.d.ts +3 -0
  495. package/dist/maintenance/backup-stamp.js +8 -0
  496. package/dist/maintenance/backup-stamp.js.map +1 -0
  497. package/dist/maintenance/memory-governance-cron.d.ts +85 -0
  498. package/dist/maintenance/memory-governance-cron.js +22 -0
  499. package/dist/maintenance/memory-governance-cron.js.map +1 -0
  500. package/dist/maintenance/memory-governance.d.ts +137 -0
  501. package/dist/maintenance/memory-governance.js +40 -0
  502. package/dist/maintenance/memory-governance.js.map +1 -0
  503. package/dist/maintenance/migrate-observations.d.ts +18 -0
  504. package/dist/maintenance/migrate-observations.js +9 -0
  505. package/dist/maintenance/migrate-observations.js.map +1 -0
  506. package/dist/maintenance/observation-ledger-utils.d.ts +10 -0
  507. package/dist/maintenance/observation-ledger-utils.js +10 -0
  508. package/dist/maintenance/observation-ledger-utils.js.map +1 -0
  509. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +15 -0
  510. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +28 -0
  511. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js.map +1 -0
  512. package/dist/maintenance/rebuild-memory-projection.d.ts +77 -0
  513. package/dist/maintenance/rebuild-memory-projection.js +35 -0
  514. package/dist/maintenance/rebuild-memory-projection.js.map +1 -0
  515. package/dist/maintenance/rebuild-observations.d.ts +17 -0
  516. package/dist/maintenance/rebuild-observations.js +9 -0
  517. package/dist/maintenance/rebuild-observations.js.map +1 -0
  518. package/dist/mcp-memory-inspector-app.d.ts +124 -0
  519. package/dist/mcp-memory-inspector-app.js +20 -0
  520. package/dist/mcp-memory-inspector-app.js.map +1 -0
  521. package/dist/memory-action-policy.d.ts +1 -1
  522. package/dist/memory-cache.d.ts +1 -1
  523. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  524. package/dist/memory-projection-store.d.ts +108 -3
  525. package/dist/memory-projection-store.js +2 -1
  526. package/dist/memory-provenance.d.ts +57 -0
  527. package/dist/memory-provenance.js +13 -0
  528. package/dist/memory-provenance.js.map +1 -0
  529. package/dist/memory-worth-outcomes.d.ts +4 -2
  530. package/dist/migrate/from-engram.d.ts +24 -0
  531. package/dist/migrate/from-engram.js +12 -0
  532. package/dist/migrate/from-engram.js.map +1 -0
  533. package/dist/models-json.d.ts +1 -1
  534. package/dist/namespaces/migrate.d.ts +50 -0
  535. package/dist/namespaces/migrate.js +50 -0
  536. package/dist/namespaces/migrate.js.map +1 -0
  537. package/dist/namespaces/principal.d.ts +17 -0
  538. package/dist/namespaces/principal.js +16 -0
  539. package/dist/namespaces/principal.js.map +1 -0
  540. package/dist/namespaces/search.d.ts +46 -0
  541. package/dist/namespaces/search.js +28 -0
  542. package/dist/namespaces/search.js.map +1 -0
  543. package/dist/namespaces/storage.d.ts +32 -0
  544. package/dist/namespaces/storage.js +28 -0
  545. package/dist/namespaces/storage.js.map +1 -0
  546. package/dist/native-knowledge.d.ts +1 -1
  547. package/dist/network/tailscale.d.ts +41 -0
  548. package/dist/network/tailscale.js +9 -0
  549. package/dist/network/tailscale.js.map +1 -0
  550. package/dist/network/webdav.d.ts +39 -0
  551. package/dist/network/webdav.js +10 -0
  552. package/dist/network/webdav.js.map +1 -0
  553. package/dist/objective-state-writers.d.ts +1 -1
  554. package/dist/objective-state-writers.js +2 -2
  555. package/dist/operator-toolkit.d.ts +4 -2
  556. package/dist/operator-toolkit.js +35 -17
  557. package/dist/opik-exporter.js +2 -2
  558. package/dist/opik-exporter.js.map +1 -1
  559. package/dist/orchestrator-DuWl9Hwx.d.ts +1244 -0
  560. package/dist/orchestrator.d.ts +24 -7
  561. package/dist/orchestrator.js +107 -65
  562. package/dist/path-MR5JPYOP.js +9 -0
  563. package/dist/path-MR5JPYOP.js.map +1 -0
  564. package/dist/patterns-cli.d.ts +1 -1
  565. package/dist/policy-runtime.d.ts +1 -1
  566. package/dist/qmd-recall-cache.d.ts +2 -2
  567. package/dist/qmd.d.ts +103 -4
  568. package/dist/qmd.js +23 -5
  569. package/dist/recall-disclosure-escalation.d.ts +1 -1
  570. package/dist/recall-explain-renderer.d.ts +3 -1
  571. package/dist/recall-explain-renderer.js +5 -3
  572. package/dist/recall-state.d.ts +1 -1
  573. package/dist/recall-tag-filter.d.ts +3 -1
  574. package/dist/recall-xray-cli.d.ts +3 -1
  575. package/dist/recall-xray-cli.js +6 -4
  576. package/dist/recall-xray-renderer.d.ts +3 -1
  577. package/dist/recall-xray-renderer.js +5 -3
  578. package/dist/recall-xray.d.ts +8 -1
  579. package/dist/recall-xray.js +4 -2
  580. package/dist/replay/normalizers/chatgpt.d.ts +6 -0
  581. package/dist/replay/normalizers/chatgpt.js +11 -0
  582. package/dist/replay/normalizers/chatgpt.js.map +1 -0
  583. package/dist/replay/normalizers/claude.d.ts +6 -0
  584. package/dist/replay/normalizers/claude.js +11 -0
  585. package/dist/replay/normalizers/claude.js.map +1 -0
  586. package/dist/replay/normalizers/openclaw.d.ts +6 -0
  587. package/dist/replay/normalizers/openclaw.js +11 -0
  588. package/dist/replay/normalizers/openclaw.js.map +1 -0
  589. package/dist/replay/normalizers/shared.d.ts +16 -0
  590. package/dist/replay/normalizers/shared.js +14 -0
  591. package/dist/replay/normalizers/shared.js.map +1 -0
  592. package/dist/replay/runner.d.ts +35 -0
  593. package/dist/replay/runner.js +16 -0
  594. package/dist/replay/runner.js.map +1 -0
  595. package/dist/replay/types.d.ts +57 -0
  596. package/dist/replay/types.js +19 -0
  597. package/dist/replay/types.js.map +1 -0
  598. package/dist/resolution-B7FNQSSP.js +12 -0
  599. package/dist/resolution-B7FNQSSP.js.map +1 -0
  600. package/dist/resolve-auth-token.d.ts +1 -1
  601. package/dist/resolve-provider-secret.js +2 -2
  602. package/dist/response-guidance-recall.d.ts +18 -0
  603. package/dist/response-guidance-recall.js +11 -0
  604. package/dist/response-guidance-recall.js.map +1 -0
  605. package/dist/resume-bundles.js +7 -5
  606. package/dist/retrieval-agents.d.ts +2 -2
  607. package/dist/retrieval-tiers.d.ts +1 -1
  608. package/dist/routing/engine.d.ts +35 -0
  609. package/dist/routing/engine.js +16 -0
  610. package/dist/routing/engine.js.map +1 -0
  611. package/dist/routing/store.d.ts +27 -0
  612. package/dist/routing/store.js +10 -0
  613. package/dist/routing/store.js.map +1 -0
  614. package/dist/runtime/better-sqlite.d.ts +8 -0
  615. package/dist/runtime/better-sqlite.js +10 -0
  616. package/dist/runtime/better-sqlite.js.map +1 -0
  617. package/dist/runtime/child-process.d.ts +32 -0
  618. package/dist/runtime/child-process.js +10 -0
  619. package/dist/runtime/child-process.js.map +1 -0
  620. package/dist/runtime/env.d.ts +5 -0
  621. package/dist/runtime/env.js +12 -0
  622. package/dist/runtime/env.js.map +1 -0
  623. package/dist/sdk-compat.js +1 -1
  624. package/dist/search/document-scanner.d.ts +22 -0
  625. package/dist/search/document-scanner.js +8 -0
  626. package/dist/search/document-scanner.js.map +1 -0
  627. package/dist/search/embed-helper.d.ts +35 -0
  628. package/dist/search/embed-helper.js +9 -0
  629. package/dist/search/embed-helper.js.map +1 -0
  630. package/dist/search/factory.d.ts +32 -0
  631. package/dist/search/factory.js +29 -0
  632. package/dist/search/factory.js.map +1 -0
  633. package/dist/search/index.d.ts +15 -0
  634. package/dist/search/index.js +50 -0
  635. package/dist/search/index.js.map +1 -0
  636. package/dist/search/lancedb-backend.d.ts +51 -0
  637. package/dist/search/lancedb-backend.js +10 -0
  638. package/dist/search/lancedb-backend.js.map +1 -0
  639. package/dist/search/meilisearch-backend.d.ts +48 -0
  640. package/dist/search/meilisearch-backend.js +10 -0
  641. package/dist/search/meilisearch-backend.js.map +1 -0
  642. package/dist/search/noop-backend.d.ts +26 -0
  643. package/dist/search/noop-backend.js +8 -0
  644. package/dist/search/noop-backend.js.map +1 -0
  645. package/dist/search/orama-backend.d.ts +53 -0
  646. package/dist/search/orama-backend.js +10 -0
  647. package/dist/search/orama-backend.js.map +1 -0
  648. package/dist/search/port.d.ts +61 -0
  649. package/dist/search/port.js +1 -0
  650. package/dist/search/port.js.map +1 -0
  651. package/dist/search/remote-backend.d.ts +39 -0
  652. package/dist/search/remote-backend.js +9 -0
  653. package/dist/search/remote-backend.js.map +1 -0
  654. package/dist/secure-store/index.d.ts +890 -0
  655. package/dist/secure-store/index.js +156 -0
  656. package/dist/secure-store/index.js.map +1 -0
  657. package/dist/semantic-VwGI14Ok.d.ts +69 -0
  658. package/dist/semantic-consolidation-4HkHWgeI.d.ts +180 -0
  659. package/dist/semantic-consolidation.d.ts +3 -3
  660. package/dist/semantic-consolidation.js +15 -8
  661. package/dist/semantic-rule-promotion.js +9 -6
  662. package/dist/semantic-rule-verifier.d.ts +1 -1
  663. package/dist/semantic-rule-verifier.js +10 -7
  664. package/dist/session-observer-bands.d.ts +1 -1
  665. package/dist/session-observer-state.d.ts +1 -1
  666. package/dist/shared-context/manager.d.ts +131 -0
  667. package/dist/shared-context/manager.js +15 -0
  668. package/dist/shared-context/manager.js.map +1 -0
  669. package/dist/signal.d.ts +1 -1
  670. package/dist/skills-registry.js +13 -1
  671. package/dist/skills-registry.js.map +1 -1
  672. package/dist/state-store-VZU2IA53.js +16 -0
  673. package/dist/state-store-VZU2IA53.js.map +1 -0
  674. package/dist/storage-paths.d.ts +9 -0
  675. package/dist/storage-paths.js +20 -0
  676. package/dist/storage-paths.js.map +1 -0
  677. package/dist/storage.d.ts +6 -2
  678. package/dist/storage.js +8 -5
  679. package/dist/summarizer.d.ts +6 -1
  680. package/dist/summarizer.js +11 -10
  681. package/dist/summary-snapshot.d.ts +1 -1
  682. package/dist/summary-snapshot.js +2 -1
  683. package/dist/surfaces/dreams.d.ts +16 -0
  684. package/dist/surfaces/dreams.js +282 -0
  685. package/dist/surfaces/dreams.js.map +1 -0
  686. package/dist/surfaces/heartbeat.d.ts +17 -0
  687. package/dist/surfaces/heartbeat.js +265 -0
  688. package/dist/surfaces/heartbeat.js.map +1 -0
  689. package/dist/targeted-fact-recall.d.ts +17 -0
  690. package/dist/targeted-fact-recall.js +11 -0
  691. package/dist/targeted-fact-recall.js.map +1 -0
  692. package/dist/telemetry-transcript.d.ts +7 -0
  693. package/dist/telemetry-transcript.js +16 -0
  694. package/dist/telemetry-transcript.js.map +1 -0
  695. package/dist/temporal-supersession.d.ts +4 -2
  696. package/dist/temporal-supersession.js +2 -1
  697. package/dist/temporal-validity.d.ts +1 -1
  698. package/dist/threading.d.ts +6 -1
  699. package/dist/threading.js +2 -1
  700. package/dist/tier-migration.d.ts +5 -3
  701. package/dist/tier-routing.d.ts +1 -1
  702. package/dist/tokens.js +2 -2
  703. package/dist/topics.d.ts +1 -1
  704. package/dist/transcript.d.ts +16 -2
  705. package/dist/transcript.js +2 -1
  706. package/dist/transfer/autodetect.d.ts +4 -0
  707. package/dist/transfer/autodetect.js +15 -0
  708. package/dist/transfer/autodetect.js.map +1 -0
  709. package/dist/transfer/backup.d.ts +21 -0
  710. package/dist/transfer/backup.js +17 -0
  711. package/dist/transfer/backup.js.map +1 -0
  712. package/dist/transfer/capsule-export.d.ts +113 -0
  713. package/dist/transfer/capsule-export.js +19 -0
  714. package/dist/transfer/capsule-export.js.map +1 -0
  715. package/dist/transfer/capsule-import.d.ts +124 -0
  716. package/dist/transfer/capsule-import.js +16 -0
  717. package/dist/transfer/capsule-import.js.map +1 -0
  718. package/dist/transfer/constants.d.ts +13 -0
  719. package/dist/transfer/constants.js +12 -0
  720. package/dist/transfer/constants.js.map +1 -0
  721. package/dist/transfer/export-json.d.ts +11 -0
  722. package/dist/transfer/export-json.js +11 -0
  723. package/dist/transfer/export-json.js.map +1 -0
  724. package/dist/transfer/export-md.d.ts +10 -0
  725. package/dist/transfer/export-md.js +13 -0
  726. package/dist/transfer/export-md.js.map +1 -0
  727. package/dist/transfer/export-sqlite.d.ts +9 -0
  728. package/dist/transfer/export-sqlite.js +12 -0
  729. package/dist/transfer/export-sqlite.js.map +1 -0
  730. package/dist/transfer/fs-utils.d.ts +61 -0
  731. package/dist/transfer/fs-utils.js +40 -0
  732. package/dist/transfer/fs-utils.js.map +1 -0
  733. package/dist/transfer/import-json.d.ts +16 -0
  734. package/dist/transfer/import-json.js +13 -0
  735. package/dist/transfer/import-json.js.map +1 -0
  736. package/dist/transfer/import-md.d.ts +14 -0
  737. package/dist/transfer/import-md.js +11 -0
  738. package/dist/transfer/import-md.js.map +1 -0
  739. package/dist/transfer/import-sqlite.d.ts +14 -0
  740. package/dist/transfer/import-sqlite.js +12 -0
  741. package/dist/transfer/import-sqlite.js.map +1 -0
  742. package/dist/transfer/sqlite-schema.d.ts +4 -0
  743. package/dist/transfer/sqlite-schema.js +10 -0
  744. package/dist/transfer/sqlite-schema.js.map +1 -0
  745. package/dist/transfer/types.d.ts +916 -0
  746. package/dist/transfer/types.js +30 -0
  747. package/dist/transfer/types.js.map +1 -0
  748. package/dist/trust-zones.d.ts +3 -2
  749. package/dist/trust-zones.js +1 -1
  750. package/dist/types.d.ts +88 -3
  751. package/dist/types.js +1 -1
  752. package/dist/user-model.d.ts +37 -0
  753. package/dist/user-model.js +28 -0
  754. package/dist/user-model.js.map +1 -0
  755. package/dist/utility-runtime.d.ts +1 -1
  756. package/dist/verified-recall.js +11 -8
  757. package/dist/work/board.d.ts +43 -0
  758. package/dist/work/board.js +14 -0
  759. package/dist/work/board.js.map +1 -0
  760. package/dist/work/boundary.d.ts +8 -0
  761. package/dist/work/boundary.js +14 -0
  762. package/dist/work/boundary.js.map +1 -0
  763. package/dist/work/storage.d.ts +39 -0
  764. package/dist/work/storage.js +11 -0
  765. package/dist/work/storage.js.map +1 -0
  766. package/dist/work/types.d.ts +75 -0
  767. package/dist/work/types.js +1 -0
  768. package/dist/work/types.js.map +1 -0
  769. package/package.json +2767 -6
  770. package/scripts/faiss_index.py +816 -0
  771. package/scripts/faiss_requirements.txt +3 -0
  772. package/skills/remnic-entities/SKILL.md +51 -0
  773. package/skills/remnic-memory-workflow/SKILL.md +61 -0
  774. package/skills/remnic-recall/SKILL.md +51 -0
  775. package/skills/remnic-remember/SKILL.md +56 -0
  776. package/skills/remnic-search/SKILL.md +51 -0
  777. package/skills/remnic-status/SKILL.md +51 -0
  778. package/src/abort-error.test.ts +49 -0
  779. package/src/abort-error.ts +46 -0
  780. package/src/abstraction-nodes.ts +162 -0
  781. package/src/access-audit.test.ts +178 -0
  782. package/src/access-audit.ts +125 -0
  783. package/src/access-cli.test.ts +439 -0
  784. package/src/access-cli.ts +438 -0
  785. package/src/access-http.test.ts +225 -0
  786. package/src/access-http.ts +1899 -0
  787. package/src/access-idempotency.ts +232 -0
  788. package/src/access-mcp.test.ts +568 -0
  789. package/src/access-mcp.ts +3056 -0
  790. package/src/access-schema-pi.test.ts +60 -0
  791. package/src/access-schema.ts +522 -0
  792. package/src/access-service-namespace.test.ts +123 -0
  793. package/src/access-service.ts +5629 -0
  794. package/src/action-confidence.test.ts +206 -0
  795. package/src/action-confidence.ts +466 -0
  796. package/src/active-memory-bridge.test.ts +285 -0
  797. package/src/active-memory-bridge.ts +217 -0
  798. package/src/active-recall.test.ts +484 -0
  799. package/src/active-recall.ts +459 -0
  800. package/src/adapters/claude-code.ts +56 -0
  801. package/src/adapters/codex.ts +57 -0
  802. package/src/adapters/hermes.ts +64 -0
  803. package/src/adapters/index.ts +6 -0
  804. package/src/adapters/registry.ts +41 -0
  805. package/src/adapters/replit.ts +55 -0
  806. package/src/adapters/types.ts +51 -0
  807. package/src/behavior-learner.ts +144 -0
  808. package/src/behavior-signals.ts +73 -0
  809. package/src/binary-lifecycle/backend.ts +117 -0
  810. package/src/binary-lifecycle/index.ts +35 -0
  811. package/src/binary-lifecycle/manifest.ts +79 -0
  812. package/src/binary-lifecycle/pipeline.ts +352 -0
  813. package/src/binary-lifecycle/scanner.ts +89 -0
  814. package/src/binary-lifecycle/types.ts +89 -0
  815. package/src/bootstrap.ts +178 -0
  816. package/src/boxes.ts +521 -0
  817. package/src/briefing.test.ts +1535 -0
  818. package/src/briefing.ts +1382 -0
  819. package/src/buffer-session.test.ts +443 -0
  820. package/src/buffer-surprise-report.ts +176 -0
  821. package/src/buffer-surprise-telemetry.test.ts +606 -0
  822. package/src/buffer-surprise-trigger.test.ts +766 -0
  823. package/src/buffer-surprise.test.ts +339 -0
  824. package/src/buffer-surprise.ts +203 -0
  825. package/src/buffer.ts +900 -0
  826. package/src/bulk-import/cli-command.test.ts +204 -0
  827. package/src/bulk-import/index.ts +34 -0
  828. package/src/bulk-import/pipeline.test.ts +445 -0
  829. package/src/bulk-import/pipeline.ts +178 -0
  830. package/src/bulk-import/registry.test.ts +151 -0
  831. package/src/bulk-import/registry.ts +72 -0
  832. package/src/bulk-import/types.test.ts +272 -0
  833. package/src/bulk-import/types.ts +145 -0
  834. package/src/calibration.ts +394 -0
  835. package/src/capsule-cli.test.ts +398 -0
  836. package/src/capsule-cli.ts +565 -0
  837. package/src/causal-behavior.ts +308 -0
  838. package/src/causal-chain.ts +419 -0
  839. package/src/causal-consolidation.ts +370 -0
  840. package/src/causal-retrieval.ts +286 -0
  841. package/src/causal-trajectory-graph.ts +60 -0
  842. package/src/causal-trajectory.ts +303 -0
  843. package/src/chunking.ts +220 -0
  844. package/src/citations.ts +232 -0
  845. package/src/cli.ts +9403 -0
  846. package/src/codex-cli-fallback.ts +162 -0
  847. package/src/codex-thread-key.ts +1 -0
  848. package/src/coding/access-coding-context.test.ts +197 -0
  849. package/src/coding/coding-branch-scope.test.ts +281 -0
  850. package/src/coding/coding-namespace.test.ts +360 -0
  851. package/src/coding/coding-namespace.ts +412 -0
  852. package/src/coding/coding-orchestrator.test.ts +249 -0
  853. package/src/coding/git-context.test.ts +507 -0
  854. package/src/coding/git-context.ts +336 -0
  855. package/src/coding/mcp-set-coding-context.test.ts +174 -0
  856. package/src/coding/review-context.test.ts +316 -0
  857. package/src/coding/review-context.ts +349 -0
  858. package/src/coding/wire-coding-context.test.ts +468 -0
  859. package/src/commitment-ledger.test.ts +78 -0
  860. package/src/commitment-ledger.ts +337 -0
  861. package/src/compat/checks.test.ts +206 -0
  862. package/src/compat/checks.ts +716 -0
  863. package/src/compat/types.ts +33 -0
  864. package/src/compounding/engine.ts +1686 -0
  865. package/src/compounding/preference-consolidator.ts +778 -0
  866. package/src/compression-optimizer.ts +312 -0
  867. package/src/config.test.ts +930 -0
  868. package/src/config.ts +3807 -0
  869. package/src/connectors/codex/instructions.md +160 -0
  870. package/src/connectors/codex/resources/namespace-cheatsheet.md +48 -0
  871. package/src/connectors/codex-marketplace.ts +500 -0
  872. package/src/connectors/codex-materialize-runner.ts +212 -0
  873. package/src/connectors/codex-materialize.ts +983 -0
  874. package/src/connectors/coerce.ts +62 -0
  875. package/src/connectors/index.test.ts +1570 -0
  876. package/src/connectors/index.ts +3222 -0
  877. package/src/connectors/live/framework.ts +164 -0
  878. package/src/connectors/live/github.test.ts +1218 -0
  879. package/src/connectors/live/github.ts +1068 -0
  880. package/src/connectors/live/gmail.test.ts +1706 -0
  881. package/src/connectors/live/gmail.ts +1293 -0
  882. package/src/connectors/live/google-drive.test.ts +696 -0
  883. package/src/connectors/live/google-drive.ts +724 -0
  884. package/src/connectors/live/index.ts +101 -0
  885. package/src/connectors/live/live-connectors.test.ts +689 -0
  886. package/src/connectors/live/notion.test.ts +1109 -0
  887. package/src/connectors/live/notion.ts +978 -0
  888. package/src/connectors/live/registry.ts +103 -0
  889. package/src/connectors/live/state-store.ts +399 -0
  890. package/src/connectors/live/transient-errors.ts +150 -0
  891. package/src/connectors/weclone-installer.test.ts +850 -0
  892. package/src/connectors-cli.ts +513 -0
  893. package/src/console/state.test.ts +224 -0
  894. package/src/console/state.ts +514 -0
  895. package/src/console/trace.test.ts +813 -0
  896. package/src/console/trace.ts +603 -0
  897. package/src/console/tui.test.ts +582 -0
  898. package/src/console/tui.ts +508 -0
  899. package/src/consolidation-operator.ts +182 -0
  900. package/src/consolidation-provenance-check.ts +551 -0
  901. package/src/consolidation-undo.ts +718 -0
  902. package/src/contradiction/contradiction-judge.test.ts +189 -0
  903. package/src/contradiction/contradiction-judge.ts +333 -0
  904. package/src/contradiction/contradiction-review.ts +574 -0
  905. package/src/contradiction/contradiction-scan.ts +504 -0
  906. package/src/contradiction/contradiction.test.ts +2230 -0
  907. package/src/contradiction/index.ts +37 -0
  908. package/src/contradiction/resolution.ts +383 -0
  909. package/src/conversation-index/backend.ts +323 -0
  910. package/src/conversation-index/chunker.ts +47 -0
  911. package/src/conversation-index/cleanup.ts +53 -0
  912. package/src/conversation-index/faiss-adapter.ts +384 -0
  913. package/src/conversation-index/indexer.test.ts +164 -0
  914. package/src/conversation-index/indexer.ts +192 -0
  915. package/src/conversation-index/search.ts +37 -0
  916. package/src/cross-namespace-budget.test.ts +275 -0
  917. package/src/cross-namespace-budget.ts +365 -0
  918. package/src/cue-anchors.ts +163 -0
  919. package/src/curation/index.ts +544 -0
  920. package/src/dashboard-runtime.ts +337 -0
  921. package/src/day-summary.ts +122 -0
  922. package/src/dedup/index.ts +330 -0
  923. package/src/dedup/semantic.test.ts +1577 -0
  924. package/src/dedup/semantic.ts +148 -0
  925. package/src/delinearize.ts +193 -0
  926. package/src/direct-answer-wiring.test.ts +473 -0
  927. package/src/direct-answer-wiring.ts +180 -0
  928. package/src/direct-answer.test.ts +484 -0
  929. package/src/direct-answer.ts +273 -0
  930. package/src/embedding-fallback.ts +565 -0
  931. package/src/enrichment/audit.ts +89 -0
  932. package/src/enrichment/index.ts +27 -0
  933. package/src/enrichment/pipeline.ts +197 -0
  934. package/src/enrichment/provider-registry.ts +85 -0
  935. package/src/enrichment/types.ts +100 -0
  936. package/src/enrichment/web-search-provider.ts +63 -0
  937. package/src/entity-retrieval.ts +774 -0
  938. package/src/entity-schema.ts +239 -0
  939. package/src/evals.ts +1312 -0
  940. package/src/event-order-recall.test.ts +4164 -0
  941. package/src/event-order-recall.ts +2802 -0
  942. package/src/evidence-pack.test.ts +89 -0
  943. package/src/evidence-pack.ts +388 -0
  944. package/src/explicit-capture.ts +530 -0
  945. package/src/explicit-cue-recall.test.ts +3019 -0
  946. package/src/explicit-cue-recall.ts +5545 -0
  947. package/src/extraction-judge-telemetry.ts +234 -0
  948. package/src/extraction-judge-training.ts +221 -0
  949. package/src/extraction-judge.ts +846 -0
  950. package/src/extraction-timeout.test.ts +265 -0
  951. package/src/extraction.ts +2719 -0
  952. package/src/fallback-llm.test.ts +1060 -0
  953. package/src/fallback-llm.ts +918 -0
  954. package/src/focused-list-recall.test.ts +734 -0
  955. package/src/focused-list-recall.ts +1160 -0
  956. package/src/graph-dashboard-diff.ts +35 -0
  957. package/src/graph-dashboard-key.ts +5 -0
  958. package/src/graph-dashboard-parser.ts +104 -0
  959. package/src/graph-edge-reinforcement.ts +192 -0
  960. package/src/graph-events.ts +151 -0
  961. package/src/graph-recall.test.ts +164 -0
  962. package/src/graph-recall.ts +189 -0
  963. package/src/graph-retrieval.test.ts +809 -0
  964. package/src/graph-retrieval.ts +823 -0
  965. package/src/graph-snapshot.ts +329 -0
  966. package/src/graph.ts +813 -0
  967. package/src/harmonic-retrieval.ts +223 -0
  968. package/src/himem.ts +154 -0
  969. package/src/hygiene.ts +87 -0
  970. package/src/identity-continuity.ts +333 -0
  971. package/src/importance.ts +328 -0
  972. package/src/importers/base.test.ts +294 -0
  973. package/src/importers/base.ts +436 -0
  974. package/src/importers/index.ts +21 -0
  975. package/src/index.ts +1204 -0
  976. package/src/intent.ts +154 -0
  977. package/src/json-extract.ts +85 -0
  978. package/src/json-store.ts +42 -0
  979. package/src/lcm/archive.ts +617 -0
  980. package/src/lcm/dag.ts +199 -0
  981. package/src/lcm/engine.ts +645 -0
  982. package/src/lcm/index.ts +7 -0
  983. package/src/lcm/queue.test.ts +178 -0
  984. package/src/lcm/queue.ts +200 -0
  985. package/src/lcm/recall.ts +117 -0
  986. package/src/lcm/schema.ts +154 -0
  987. package/src/lcm/summarizer.ts +235 -0
  988. package/src/lcm/tools.ts +191 -0
  989. package/src/lcm-engine.test.ts +660 -0
  990. package/src/legacy-hook-compat.test.ts +20 -0
  991. package/src/legacy-hook-compat.ts +45 -0
  992. package/src/lifecycle.ts +289 -0
  993. package/src/live-connectors-runner.ts +385 -0
  994. package/src/local-llm-qos.test.ts +303 -0
  995. package/src/local-llm-thinking.test.ts +292 -0
  996. package/src/local-llm.ts +1464 -0
  997. package/src/logger.ts +49 -0
  998. package/src/maintenance/archive-observations.ts +147 -0
  999. package/src/maintenance/backup-stamp.ts +3 -0
  1000. package/src/maintenance/dreams-ledger.ts +516 -0
  1001. package/src/maintenance/first-start-migration.ts +362 -0
  1002. package/src/maintenance/forget.test.ts +206 -0
  1003. package/src/maintenance/forget.ts +126 -0
  1004. package/src/maintenance/graph-edge-decay.test.ts +409 -0
  1005. package/src/maintenance/graph-edge-decay.ts +394 -0
  1006. package/src/maintenance/memory-governance-cron.ts +447 -0
  1007. package/src/maintenance/memory-governance.ts +1039 -0
  1008. package/src/maintenance/migrate-observations.ts +216 -0
  1009. package/src/maintenance/observation-ledger-utils.ts +54 -0
  1010. package/src/maintenance/pattern-reinforcement.test.ts +875 -0
  1011. package/src/maintenance/pattern-reinforcement.ts +369 -0
  1012. package/src/maintenance/purge.ts +334 -0
  1013. package/src/maintenance/rebuild-memory-lifecycle-ledger.ts +78 -0
  1014. package/src/maintenance/rebuild-memory-projection.ts +1234 -0
  1015. package/src/maintenance/rebuild-observations.ts +178 -0
  1016. package/src/maintenance/tier-stats.test.ts +378 -0
  1017. package/src/maintenance/tier-stats.ts +222 -0
  1018. package/src/mcp-memory-inspector-app.ts +421 -0
  1019. package/src/memory-action-policy.ts +80 -0
  1020. package/src/memory-cache.ts +208 -0
  1021. package/src/memory-extension/claude-code-publisher.ts +51 -0
  1022. package/src/memory-extension/codex-publisher.ts +149 -0
  1023. package/src/memory-extension/hermes-publisher.ts +51 -0
  1024. package/src/memory-extension/index.ts +100 -0
  1025. package/src/memory-extension/shared-instructions.ts +133 -0
  1026. package/src/memory-extension/types.ts +86 -0
  1027. package/src/memory-extension-host/host-discovery.ts +276 -0
  1028. package/src/memory-extension-host/index.ts +14 -0
  1029. package/src/memory-extension-host/render-extensions-block.ts +73 -0
  1030. package/src/memory-extension-host/types.ts +21 -0
  1031. package/src/memory-lifecycle-ledger-utils.ts +116 -0
  1032. package/src/memory-projection-format.ts +11 -0
  1033. package/src/memory-projection-store.ts +951 -0
  1034. package/src/memory-provenance.test.ts +196 -0
  1035. package/src/memory-provenance.ts +484 -0
  1036. package/src/memory-worth-bench.test.ts +71 -0
  1037. package/src/memory-worth-bench.ts +265 -0
  1038. package/src/memory-worth-filter.test.ts +209 -0
  1039. package/src/memory-worth-filter.ts +204 -0
  1040. package/src/memory-worth-frontmatter.test.ts +311 -0
  1041. package/src/memory-worth-outcomes.test.ts +316 -0
  1042. package/src/memory-worth-outcomes.ts +286 -0
  1043. package/src/memory-worth.test.ts +317 -0
  1044. package/src/memory-worth.ts +215 -0
  1045. package/src/message-parts/index.ts +806 -0
  1046. package/src/message-parts/message-parts.test.ts +421 -0
  1047. package/src/migrate/from-engram.ts +789 -0
  1048. package/src/model-registry.ts +313 -0
  1049. package/src/models-json.ts +76 -0
  1050. package/src/namespaces/migrate.ts +187 -0
  1051. package/src/namespaces/path.ts +25 -0
  1052. package/src/namespaces/principal.test.ts +195 -0
  1053. package/src/namespaces/principal.ts +86 -0
  1054. package/src/namespaces/search.test.ts +105 -0
  1055. package/src/namespaces/search.ts +233 -0
  1056. package/src/namespaces/storage.ts +74 -0
  1057. package/src/native-knowledge.ts +1823 -0
  1058. package/src/negative.ts +72 -0
  1059. package/src/network/tailscale.ts +179 -0
  1060. package/src/network/webdav.ts +385 -0
  1061. package/src/objective-state-writers.ts +951 -0
  1062. package/src/objective-state.ts +320 -0
  1063. package/src/onboarding/index.ts +529 -0
  1064. package/src/openai-chat-compat.ts +56 -0
  1065. package/src/operator-toolkit.ts +2132 -0
  1066. package/src/opik-exporter.test.ts +72 -0
  1067. package/src/opik-exporter.ts +587 -0
  1068. package/src/orchestrator-extraction-queue.test.ts +197 -0
  1069. package/src/orchestrator-flush.test.ts +1171 -0
  1070. package/src/orchestrator-pattern-reinforcement.test.ts +128 -0
  1071. package/src/orchestrator-source-attribution.test.ts +701 -0
  1072. package/src/orchestrator.ts +16368 -0
  1073. package/src/page-versioning.ts +450 -0
  1074. package/src/patterns-cli.ts +574 -0
  1075. package/src/peers/index.ts +54 -0
  1076. package/src/peers/migrate-from-identity-anchor.test.ts +291 -0
  1077. package/src/peers/migrate-from-identity-anchor.ts +350 -0
  1078. package/src/peers/peers.test.ts +419 -0
  1079. package/src/peers/profile-reasoner.ts +694 -0
  1080. package/src/peers/storage.ts +1350 -0
  1081. package/src/peers/types.ts +138 -0
  1082. package/src/plugin-id.ts +84 -0
  1083. package/src/policy-runtime.ts +209 -0
  1084. package/src/procedural/procedure-miner.ts +150 -0
  1085. package/src/procedural/procedure-recall.ts +93 -0
  1086. package/src/procedural/procedure-stats.ts +213 -0
  1087. package/src/procedural/procedure-types.ts +132 -0
  1088. package/src/procedural/reinforcement-core.test.ts +132 -0
  1089. package/src/procedural/reinforcement-core.ts +73 -0
  1090. package/src/profiling.test.ts +263 -0
  1091. package/src/profiling.ts +435 -0
  1092. package/src/projection/index.ts +398 -0
  1093. package/src/qmd-recall-cache.test.ts +138 -0
  1094. package/src/qmd-recall-cache.ts +111 -0
  1095. package/src/qmd.test.ts +257 -0
  1096. package/src/qmd.ts +2614 -0
  1097. package/src/reasoning-trace-recall.ts +201 -0
  1098. package/src/reasoning-trace-types.ts +235 -0
  1099. package/src/recall-audit-anomaly.test.ts +246 -0
  1100. package/src/recall-audit-anomaly.ts +297 -0
  1101. package/src/recall-audit.test.ts +51 -0
  1102. package/src/recall-audit.ts +72 -0
  1103. package/src/recall-budget-config.test.ts +87 -0
  1104. package/src/recall-disclosure-escalation.test.ts +196 -0
  1105. package/src/recall-disclosure-escalation.ts +158 -0
  1106. package/src/recall-disclosure-shaping.test.ts +146 -0
  1107. package/src/recall-disclosure.test.ts +214 -0
  1108. package/src/recall-explain-renderer.test.ts +140 -0
  1109. package/src/recall-explain-renderer.ts +356 -0
  1110. package/src/recall-mmr.test.ts +808 -0
  1111. package/src/recall-mmr.ts +607 -0
  1112. package/src/recall-qos.test.ts +85 -0
  1113. package/src/recall-qos.ts +82 -0
  1114. package/src/recall-query-policy.ts +221 -0
  1115. package/src/recall-state.test.ts +233 -0
  1116. package/src/recall-state.ts +456 -0
  1117. package/src/recall-tag-filter.ts +143 -0
  1118. package/src/recall-tokenization.ts +35 -0
  1119. package/src/recall-xray-cli.test.ts +118 -0
  1120. package/src/recall-xray-cli.ts +100 -0
  1121. package/src/recall-xray-disclosure-telemetry.test.ts +183 -0
  1122. package/src/recall-xray-renderer.test.ts +539 -0
  1123. package/src/recall-xray-renderer.ts +487 -0
  1124. package/src/recall-xray.test.ts +503 -0
  1125. package/src/recall-xray.ts +621 -0
  1126. package/src/reconstruct.ts +41 -0
  1127. package/src/release-changelog.ts +35 -0
  1128. package/src/relevance.ts +67 -0
  1129. package/src/replay/normalizers/chatgpt.ts +133 -0
  1130. package/src/replay/normalizers/claude.ts +102 -0
  1131. package/src/replay/normalizers/openclaw.ts +119 -0
  1132. package/src/replay/normalizers/shared.ts +69 -0
  1133. package/src/replay/runner.ts +197 -0
  1134. package/src/replay/types.ts +143 -0
  1135. package/src/rerank.test.ts +48 -0
  1136. package/src/rerank.ts +176 -0
  1137. package/src/resolve-auth-token.test.ts +226 -0
  1138. package/src/resolve-auth-token.ts +151 -0
  1139. package/src/resolve-provider-secret.test.ts +187 -0
  1140. package/src/resolve-provider-secret.ts +410 -0
  1141. package/src/response-guidance-recall.test.ts +3952 -0
  1142. package/src/response-guidance-recall.ts +4431 -0
  1143. package/src/resume-bundles.ts +415 -0
  1144. package/src/retrieval-agents.ts +623 -0
  1145. package/src/retrieval-tiers.ts +25 -0
  1146. package/src/retrieval.ts +104 -0
  1147. package/src/review/index.test.ts +201 -0
  1148. package/src/review/index.ts +536 -0
  1149. package/src/routing/engine.ts +162 -0
  1150. package/src/routing/store.ts +321 -0
  1151. package/src/runtime/better-sqlite.test.ts +32 -0
  1152. package/src/runtime/better-sqlite.ts +76 -0
  1153. package/src/runtime/child-process.ts +67 -0
  1154. package/src/runtime/env.ts +48 -0
  1155. package/src/sanitize.ts +58 -0
  1156. package/src/schemas.ts +449 -0
  1157. package/src/sdk-compat.ts +87 -0
  1158. package/src/search/document-scanner.ts +96 -0
  1159. package/src/search/embed-helper.ts +142 -0
  1160. package/src/search/factory.ts +189 -0
  1161. package/src/search/index.ts +10 -0
  1162. package/src/search/lancedb-backend.ts +342 -0
  1163. package/src/search/meilisearch-backend.ts +232 -0
  1164. package/src/search/noop-backend.ts +57 -0
  1165. package/src/search/orama-backend.ts +358 -0
  1166. package/src/search/port.ts +86 -0
  1167. package/src/search/remote-backend.ts +124 -0
  1168. package/src/secure-store/cipher.ts +271 -0
  1169. package/src/secure-store/cli-handlers.ts +355 -0
  1170. package/src/secure-store/cli-renderer.ts +131 -0
  1171. package/src/secure-store/header.ts +373 -0
  1172. package/src/secure-store/index.ts +137 -0
  1173. package/src/secure-store/kdf.ts +263 -0
  1174. package/src/secure-store/keyring.ts +106 -0
  1175. package/src/secure-store/metadata.ts +394 -0
  1176. package/src/secure-store/passphrase-reader.ts +252 -0
  1177. package/src/secure-store/secure-fs.ts +571 -0
  1178. package/src/secure-store/secure-store.test.ts +755 -0
  1179. package/src/semantic-chunking.ts +545 -0
  1180. package/src/semantic-consolidation.test.ts +182 -0
  1181. package/src/semantic-consolidation.ts +432 -0
  1182. package/src/semantic-rule-promotion.ts +183 -0
  1183. package/src/semantic-rule-verifier.ts +160 -0
  1184. package/src/session-integrity.ts +569 -0
  1185. package/src/session-observer-bands.ts +11 -0
  1186. package/src/session-observer-state.ts +346 -0
  1187. package/src/session-toggles.test.ts +96 -0
  1188. package/src/session-toggles.ts +159 -0
  1189. package/src/shared-context/manager.ts +810 -0
  1190. package/src/signal.ts +84 -0
  1191. package/src/skills-registry.test.ts +277 -0
  1192. package/src/skills-registry.ts +120 -0
  1193. package/src/source-attribution-roundtrip.test.ts +215 -0
  1194. package/src/source-attribution.test.ts +1425 -0
  1195. package/src/source-attribution.ts +639 -0
  1196. package/src/spaces/index.ts +627 -0
  1197. package/src/storage-paths.ts +117 -0
  1198. package/src/storage.ts +6657 -0
  1199. package/src/store-contract.ts +55 -0
  1200. package/src/summarizer.ts +844 -0
  1201. package/src/summary-snapshot.test.ts +681 -0
  1202. package/src/summary-snapshot.ts +238 -0
  1203. package/src/surfaces/dreams.test.ts +394 -0
  1204. package/src/surfaces/dreams.ts +346 -0
  1205. package/src/surfaces/heartbeat.test.ts +415 -0
  1206. package/src/surfaces/heartbeat.ts +325 -0
  1207. package/src/sync/index.ts +308 -0
  1208. package/src/targeted-fact-recall.test.ts +1694 -0
  1209. package/src/targeted-fact-recall.ts +2905 -0
  1210. package/src/taxonomy/default-taxonomy.ts +87 -0
  1211. package/src/taxonomy/index.ts +26 -0
  1212. package/src/taxonomy/resolver-doc-generator.ts +57 -0
  1213. package/src/taxonomy/resolver.ts +184 -0
  1214. package/src/taxonomy/taxonomy-loader.ts +186 -0
  1215. package/src/taxonomy/types.ts +48 -0
  1216. package/src/telemetry-transcript.ts +70 -0
  1217. package/src/temporal-index.ts +890 -0
  1218. package/src/temporal-supersession.test.ts +2703 -0
  1219. package/src/temporal-supersession.ts +493 -0
  1220. package/src/temporal-validity.test.ts +448 -0
  1221. package/src/temporal-validity.ts +123 -0
  1222. package/src/threading.ts +395 -0
  1223. package/src/tier-migration.ts +124 -0
  1224. package/src/tier-routing.ts +102 -0
  1225. package/src/tmt.ts +462 -0
  1226. package/src/tokens.test.ts +178 -0
  1227. package/src/tokens.ts +279 -0
  1228. package/src/topics.ts +147 -0
  1229. package/src/training-export/cli-date-validation.test.ts +258 -0
  1230. package/src/training-export/converter.test.ts +452 -0
  1231. package/src/training-export/converter.ts +319 -0
  1232. package/src/training-export/date-parse.ts +117 -0
  1233. package/src/training-export/index.ts +26 -0
  1234. package/src/training-export/registry.test.ts +85 -0
  1235. package/src/training-export/registry.ts +57 -0
  1236. package/src/training-export/types.ts +31 -0
  1237. package/src/transcript.ts +1179 -0
  1238. package/src/transfer/autodetect.ts +30 -0
  1239. package/src/transfer/backup.ts +138 -0
  1240. package/src/transfer/capsule-crypto.ts +485 -0
  1241. package/src/transfer/capsule-encrypt.test.ts +690 -0
  1242. package/src/transfer/capsule-export.ts +543 -0
  1243. package/src/transfer/capsule-fork.ts +375 -0
  1244. package/src/transfer/capsule-import.ts +564 -0
  1245. package/src/transfer/capsule-merge.ts +433 -0
  1246. package/src/transfer/conflict-policy.ts +16 -0
  1247. package/src/transfer/constants.ts +13 -0
  1248. package/src/transfer/exclusions.ts +37 -0
  1249. package/src/transfer/export-json.ts +65 -0
  1250. package/src/transfer/export-md.ts +59 -0
  1251. package/src/transfer/export-sqlite.ts +52 -0
  1252. package/src/transfer/fs-utils.ts +269 -0
  1253. package/src/transfer/import-json.ts +108 -0
  1254. package/src/transfer/import-md.ts +84 -0
  1255. package/src/transfer/import-sqlite.ts +100 -0
  1256. package/src/transfer/integrity.ts +71 -0
  1257. package/src/transfer/sqlite-schema.ts +16 -0
  1258. package/src/transfer/types.ts +297 -0
  1259. package/src/trust-zones.ts +1186 -0
  1260. package/src/types.ts +3074 -0
  1261. package/src/user-model.test.ts +124 -0
  1262. package/src/user-model.ts +162 -0
  1263. package/src/utility-learner.ts +353 -0
  1264. package/src/utility-runtime.ts +88 -0
  1265. package/src/utility-telemetry.ts +215 -0
  1266. package/src/utils/category-dir.ts +44 -0
  1267. package/src/utils/errno.ts +6 -0
  1268. package/src/utils/iso-timestamp.test.ts +37 -0
  1269. package/src/utils/iso-timestamp.ts +164 -0
  1270. package/src/utils/path.ts +26 -0
  1271. package/src/verified-recall.ts +138 -0
  1272. package/src/version-utils.test.ts +10 -0
  1273. package/src/version-utils.ts +9 -0
  1274. package/src/whitespace.ts +10 -0
  1275. package/src/work/board.ts +359 -0
  1276. package/src/work/boundary.ts +107 -0
  1277. package/src/work/storage.ts +436 -0
  1278. package/src/work/types.ts +82 -0
  1279. package/src/work-product-ledger.ts +265 -0
  1280. package/dist/access-service-BkXt3di1.d.ts +0 -2039
  1281. package/dist/capsule-crypto-SJS5VVAP.js +0 -18
  1282. package/dist/capsule-export-LLEVB2RG.js +0 -17
  1283. package/dist/capsule-import-UW45R2MZ.js +0 -16
  1284. package/dist/capsule-merge-DI7PNQ2H.js +0 -189
  1285. package/dist/chunk-2LGMW3DJ.js +0 -111
  1286. package/dist/chunk-2YMTO4ZJ.js +0 -265
  1287. package/dist/chunk-2YMTO4ZJ.js.map +0 -1
  1288. package/dist/chunk-363MWCD3.js +0 -9683
  1289. package/dist/chunk-363MWCD3.js.map +0 -1
  1290. package/dist/chunk-36CTNQY7.js +0 -1554
  1291. package/dist/chunk-36CTNQY7.js.map +0 -1
  1292. package/dist/chunk-457A4P3L.js +0 -119
  1293. package/dist/chunk-457A4P3L.js.map +0 -1
  1294. package/dist/chunk-4DXC6HQQ.js +0 -1837
  1295. package/dist/chunk-4DXC6HQQ.js.map +0 -1
  1296. package/dist/chunk-4IS4SXIQ.js +0 -2040
  1297. package/dist/chunk-57QNCUEZ.js +0 -1914
  1298. package/dist/chunk-57QNCUEZ.js.map +0 -1
  1299. package/dist/chunk-6AUUAZEX.js +0 -150
  1300. package/dist/chunk-6AUUAZEX.js.map +0 -1
  1301. package/dist/chunk-6TBWYBJ3.js +0 -236
  1302. package/dist/chunk-6XA7UN4Z.js +0 -135
  1303. package/dist/chunk-6Z6UH6TK.js +0 -2129
  1304. package/dist/chunk-6Z6UH6TK.js.map +0 -1
  1305. package/dist/chunk-74EMIVE4.js +0 -329
  1306. package/dist/chunk-74EMIVE4.js.map +0 -1
  1307. package/dist/chunk-74WWN7ZW.js +0 -82
  1308. package/dist/chunk-74WWN7ZW.js.map +0 -1
  1309. package/dist/chunk-767ODGE6.js +0 -183
  1310. package/dist/chunk-A4ACKWIW.js +0 -289
  1311. package/dist/chunk-A4ACKWIW.js.map +0 -1
  1312. package/dist/chunk-ASAITVLA.js +0 -64
  1313. package/dist/chunk-ASAITVLA.js.map +0 -1
  1314. package/dist/chunk-C5HUWVH2.js +0 -891
  1315. package/dist/chunk-C5HUWVH2.js.map +0 -1
  1316. package/dist/chunk-D54LZC5L.js +0 -147
  1317. package/dist/chunk-DF3RVK3X.js +0 -119
  1318. package/dist/chunk-DF3RVK3X.js.map +0 -1
  1319. package/dist/chunk-E6K4NIEU.js +0 -747
  1320. package/dist/chunk-E6K4NIEU.js.map +0 -1
  1321. package/dist/chunk-EEQLFRUM.js +0 -89
  1322. package/dist/chunk-EQINRHYR.js +0 -672
  1323. package/dist/chunk-EQINRHYR.js.map +0 -1
  1324. package/dist/chunk-ETOW6ACV.js +0 -158
  1325. package/dist/chunk-ETOW6ACV.js.map +0 -1
  1326. package/dist/chunk-EYNQTST2.js +0 -721
  1327. package/dist/chunk-FYIYMQ5N.js +0 -221
  1328. package/dist/chunk-FYIYMQ5N.js.map +0 -1
  1329. package/dist/chunk-G2WADRQ3.js +0 -219
  1330. package/dist/chunk-G4SK7DSQ.js +0 -121
  1331. package/dist/chunk-GGD5W7TB.js +0 -105
  1332. package/dist/chunk-GGD5W7TB.js.map +0 -1
  1333. package/dist/chunk-GVPWB7EY.js +0 -390
  1334. package/dist/chunk-GVPWB7EY.js.map +0 -1
  1335. package/dist/chunk-HJYHRE4S.js +0 -647
  1336. package/dist/chunk-I6BQZSML.js +0 -1451
  1337. package/dist/chunk-I6BQZSML.js.map +0 -1
  1338. package/dist/chunk-IBX3VFOM.js +0 -446
  1339. package/dist/chunk-IBX3VFOM.js.map +0 -1
  1340. package/dist/chunk-IXEJRKCZ.js +0 -18
  1341. package/dist/chunk-JBMSGZEQ.js +0 -441
  1342. package/dist/chunk-JBMSGZEQ.js.map +0 -1
  1343. package/dist/chunk-JRNQ3RNA.js +0 -284
  1344. package/dist/chunk-JRNQ3RNA.js.map +0 -1
  1345. package/dist/chunk-K6WK37A6.js +0 -865
  1346. package/dist/chunk-K6WK37A6.js.map +0 -1
  1347. package/dist/chunk-KBYWQWSB.js +0 -271
  1348. package/dist/chunk-KUHRUM6B.js +0 -14397
  1349. package/dist/chunk-KUHRUM6B.js.map +0 -1
  1350. package/dist/chunk-KWBPHZUU.js +0 -83
  1351. package/dist/chunk-KWBPHZUU.js.map +0 -1
  1352. package/dist/chunk-LIO5X3CM.js +0 -596
  1353. package/dist/chunk-MARWOCVP.js +0 -48
  1354. package/dist/chunk-MCC6KDQF.js +0 -5095
  1355. package/dist/chunk-MCC6KDQF.js.map +0 -1
  1356. package/dist/chunk-N5AKDXAI.js +0 -74
  1357. package/dist/chunk-NN3LPQ5D.js +0 -936
  1358. package/dist/chunk-NN3LPQ5D.js.map +0 -1
  1359. package/dist/chunk-O4XJUPSF.js +0 -533
  1360. package/dist/chunk-O4XJUPSF.js.map +0 -1
  1361. package/dist/chunk-OA3L7BFR.js +0 -183
  1362. package/dist/chunk-OA3L7BFR.js.map +0 -1
  1363. package/dist/chunk-OR64ZGRZ.js +0 -23
  1364. package/dist/chunk-P73JTV34.js +0 -275
  1365. package/dist/chunk-P73JTV34.js.map +0 -1
  1366. package/dist/chunk-P77UEOU2.js +0 -1521
  1367. package/dist/chunk-P77UEOU2.js.map +0 -1
  1368. package/dist/chunk-PB5KW5PL.js +0 -118
  1369. package/dist/chunk-PHNGXFQ6.js +0 -623
  1370. package/dist/chunk-PHNGXFQ6.js.map +0 -1
  1371. package/dist/chunk-QIGOEM65.js +0 -228
  1372. package/dist/chunk-RXTFCYQF.js +0 -108
  1373. package/dist/chunk-S2JJBLJG.js +0 -2101
  1374. package/dist/chunk-S2JJBLJG.js.map +0 -1
  1375. package/dist/chunk-S3IP6R6K.js +0 -219
  1376. package/dist/chunk-S3IP6R6K.js.map +0 -1
  1377. package/dist/chunk-SRBJUAMP.js +0 -403
  1378. package/dist/chunk-SRBJUAMP.js.map +0 -1
  1379. package/dist/chunk-URB2WSKZ.js +0 -350
  1380. package/dist/chunk-URB2WSKZ.js.map +0 -1
  1381. package/dist/chunk-VQXK37XA.js +0 -26
  1382. package/dist/chunk-VQXK37XA.js.map +0 -1
  1383. package/dist/chunk-VTU2B4VF.js +0 -146
  1384. package/dist/chunk-VTU2B4VF.js.map +0 -1
  1385. package/dist/chunk-VX2IUQFE.js +0 -613
  1386. package/dist/chunk-VX2IUQFE.js.map +0 -1
  1387. package/dist/chunk-WGK4VHGP.js +0 -4292
  1388. package/dist/chunk-WGK4VHGP.js.map +0 -1
  1389. package/dist/chunk-WTFWLUSX.js +0 -827
  1390. package/dist/chunk-WTFWLUSX.js.map +0 -1
  1391. package/dist/chunk-XJKFSSDW.js +0 -726
  1392. package/dist/chunk-XJKFSSDW.js.map +0 -1
  1393. package/dist/chunk-XMHBH5H6.js +0 -283
  1394. package/dist/chunk-XMHBH5H6.js.map +0 -1
  1395. package/dist/chunk-XMVFHBHT.js +0 -277
  1396. package/dist/chunk-Y5KDIOKF.js +0 -2403
  1397. package/dist/chunk-Y5KDIOKF.js.map +0 -1
  1398. package/dist/chunk-YNB73F22.js +0 -137
  1399. package/dist/chunk-YNB73F22.js.map +0 -1
  1400. package/dist/chunk-Z2E7VW55.js +0 -335
  1401. package/dist/chunk-Z2E7VW55.js.map +0 -1
  1402. package/dist/chunk-Z5S5HNGY.js +0 -2280
  1403. package/dist/chunk-Z5S5HNGY.js.map +0 -1
  1404. package/dist/chunk-ZL4S7ARC.js +0 -53
  1405. package/dist/chunk-ZTSE2ZJ6.js +0 -190
  1406. package/dist/chunk-ZTSE2ZJ6.js.map +0 -1
  1407. package/dist/cli-Cvy2SNhF.d.ts +0 -1259
  1408. package/dist/codex-materialize-CQlLTzke.d.ts +0 -139
  1409. package/dist/connectors-cli-DFGtY2DB.d.ts +0 -257
  1410. package/dist/contradiction-review-5LTTVDQV.js +0 -22
  1411. package/dist/contradiction-scan-3Z6YW7YA.js +0 -413
  1412. package/dist/contradiction-scan-3Z6YW7YA.js.map +0 -1
  1413. package/dist/engine-FOC3IJLA.js +0 -28
  1414. package/dist/fs-utils-IRVUFB6G.js +0 -30
  1415. package/dist/graph-edge-decay-PWB63GRE.js +0 -207
  1416. package/dist/index-1qIcnbG1.d.ts +0 -34
  1417. package/dist/memory-governance-F3QOJGEY.js +0 -37
  1418. package/dist/memory-projection-store-CY8TU40w.d.ts +0 -222
  1419. package/dist/orchestrator-AOQMo7QI.d.ts +0 -1784
  1420. package/dist/path-RMTY5Y5A.js +0 -9
  1421. package/dist/port-B6VEDIkC.d.ts +0 -53
  1422. package/dist/resolution-YGIBORXI.js +0 -101
  1423. package/dist/resolution-YGIBORXI.js.map +0 -1
  1424. package/dist/secure-store-4R2GSO7S.js +0 -156
  1425. package/dist/semantic-consolidation-ByBXb-sf.d.ts +0 -180
  1426. package/dist/state-store-3EH7HYIN.js +0 -16
  1427. package/dist/types-V3FJ26TF.js +0 -30
  1428. /package/dist/{capsule-crypto-SJS5VVAP.js.map → action-confidence.js.map} +0 -0
  1429. /package/dist/{capsule-export-LLEVB2RG.js.map → adapters/claude-code.js.map} +0 -0
  1430. /package/dist/{capsule-import-UW45R2MZ.js.map → adapters/codex.js.map} +0 -0
  1431. /package/dist/{contradiction-review-5LTTVDQV.js.map → adapters/hermes.js.map} +0 -0
  1432. /package/dist/{engine-FOC3IJLA.js.map → adapters/index.js.map} +0 -0
  1433. /package/dist/{fs-utils-IRVUFB6G.js.map → adapters/registry.js.map} +0 -0
  1434. /package/dist/{memory-governance-F3QOJGEY.js.map → adapters/replit.js.map} +0 -0
  1435. /package/dist/{path-RMTY5Y5A.js.map → adapters/types.js.map} +0 -0
  1436. /package/dist/{secure-store-4R2GSO7S.js.map → capsule-crypto-5CYAGVC5.js.map} +0 -0
  1437. /package/dist/{capsule-merge-DI7PNQ2H.js.map → capsule-merge-4MGKE7C5.js.map} +0 -0
  1438. /package/dist/{chunk-G4SK7DSQ.js.map → chunk-2WWLHTZY.js.map} +0 -0
  1439. /package/dist/{chunk-KBYWQWSB.js.map → chunk-4CRG46BG.js.map} +0 -0
  1440. /package/dist/{chunk-LIO5X3CM.js.map → chunk-7IASACLB.js.map} +0 -0
  1441. /package/dist/{chunk-EYNQTST2.js.map → chunk-EFJ3MQ4V.js.map} +0 -0
  1442. /package/dist/{chunk-D54LZC5L.js.map → chunk-FDU6HUUL.js.map} +0 -0
  1443. /package/dist/{chunk-QIGOEM65.js.map → chunk-GGKRUQOO.js.map} +0 -0
  1444. /package/dist/{chunk-HJYHRE4S.js.map → chunk-GL6I6MEQ.js.map} +0 -0
  1445. /package/dist/{state-store-3EH7HYIN.js.map → chunk-HHLLAQGZ.js.map} +0 -0
  1446. /package/dist/{chunk-4IS4SXIQ.js.map → chunk-HXXBL2KD.js.map} +0 -0
  1447. /package/dist/{chunk-767ODGE6.js.map → chunk-KNKUID7G.js.map} +0 -0
  1448. /package/dist/{chunk-6TBWYBJ3.js.map → chunk-LPMVBPA3.js.map} +0 -0
  1449. /package/dist/{chunk-PB5KW5PL.js.map → chunk-MC26UJIM.js.map} +0 -0
  1450. /package/dist/{chunk-ZL4S7ARC.js.map → chunk-MT4HVDUZ.js.map} +0 -0
  1451. /package/dist/{chunk-G2WADRQ3.js.map → chunk-MY6TPVXW.js.map} +0 -0
  1452. /package/dist/{chunk-OR64ZGRZ.js.map → chunk-NNVTUXEB.js.map} +0 -0
  1453. /package/dist/{chunk-RXTFCYQF.js.map → chunk-P4NEIHUT.js.map} +0 -0
  1454. /package/dist/{chunk-IXEJRKCZ.js.map → chunk-QRNI5JBH.js.map} +0 -0
  1455. /package/dist/{chunk-EEQLFRUM.js.map → chunk-RRF5UOBJ.js.map} +0 -0
  1456. /package/dist/{types-V3FJ26TF.js.map → chunk-SEDEKFYQ.js.map} +0 -0
  1457. /package/dist/{chunk-2LGMW3DJ.js.map → chunk-U3PN77QT.js.map} +0 -0
  1458. /package/dist/{chunk-XMVFHBHT.js.map → chunk-U3WSW6PZ.js.map} +0 -0
  1459. /package/dist/{chunk-N5AKDXAI.js.map → chunk-UWVJF25J.js.map} +0 -0
  1460. /package/dist/{chunk-MARWOCVP.js.map → chunk-XIG5PDM7.js.map} +0 -0
  1461. /package/dist/{chunk-6XA7UN4Z.js.map → chunk-XVZ7B3HG.js.map} +0 -0
  1462. /package/dist/{graph-edge-decay-PWB63GRE.js.map → graph-edge-decay-5DI5GUNL.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/search/noop-backend.ts","../src/search/document-scanner.ts","../src/search/lancedb-backend.ts","../src/search/meilisearch-backend.ts","../src/search/orama-backend.ts","../src/conversation-index/indexer.ts","../src/search/factory.ts","../src/search/remote-backend.ts","../src/search/embed-helper.ts","../src/conversation-index/faiss-adapter.ts","../src/conversation-index/search.ts","../src/conversation-index/backend.ts","../src/namespaces/storage.ts","../src/namespaces/search.ts"],"sourcesContent":["import type { SearchBackend, SearchExecutionOptions, SearchQueryOptions, SearchResult } from \"./port.js\";\n\n/**\n * No-op search backend for graceful degradation.\n * All searches return empty results; all maintenance is a no-op.\n */\nexport class NoopSearchBackend implements SearchBackend {\n async probe(): Promise<boolean> {\n return false;\n }\n\n isAvailable(): boolean {\n return false;\n }\n\n debugStatus(): string {\n return \"backend=noop\";\n }\n\n async search(\n _query: string,\n _collection?: string,\n _maxResults?: number,\n _options?: SearchQueryOptions,\n _execution?: SearchExecutionOptions,\n ): Promise<SearchResult[]> {\n return [];\n }\n\n async searchGlobal(_query: string, _maxResults?: number, _execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n return [];\n }\n\n async bm25Search(_query: string, _collection?: string, _maxResults?: number, _execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n return [];\n }\n\n async vectorSearch(_query: string, _collection?: string, _maxResults?: number, _execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n return [];\n }\n\n async hybridSearch(_query: string, _collection?: string, _maxResults?: number, _execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n return [];\n }\n\n async update(_execution?: SearchExecutionOptions): Promise<void> {}\n async updateCollection(_collection: string, _execution?: SearchExecutionOptions): Promise<void> {}\n updatesAllCollections(): boolean {\n return false;\n }\n async embed(): Promise<void> {}\n async embedCollection(_collection: string): Promise<void> {}\n\n async ensureCollection(_memoryDir: string): Promise<\"skipped\"> {\n return \"skipped\";\n }\n}\n","import path from \"node:path\";\nimport { readdir, readFile } from \"node:fs/promises\";\n\nexport interface IndexableDocument {\n /** Memory ID from frontmatter or filename stem */\n docid: string;\n /** Absolute file path */\n path: string;\n /** Markdown body (no YAML frontmatter) */\n content: string;\n /** First ~200 chars for display */\n snippet: string;\n}\n\n/**\n * Parse YAML frontmatter from a markdown string.\n * Returns the frontmatter key-value pairs and body, or null if no frontmatter block.\n */\nfunction parseFrontmatter(raw: string): { data: Record<string, string>; body: string } | null {\n // Support both LF and CRLF line endings\n const normalized = raw.replace(/\\r\\n/g, \"\\n\");\n const match = normalized.match(/^---\\n([\\s\\S]*?)\\n---\\n?([\\s\\S]*)$/);\n if (!match) return null;\n\n const fmBlock = match[1];\n const body = (match[2] ?? \"\").trim();\n const data: Record<string, string> = {};\n\n for (const line of fmBlock.split(\"\\n\")) {\n const colonIdx = line.indexOf(\":\");\n if (colonIdx === -1) continue;\n const key = line.slice(0, colonIdx).trim();\n const value = line.slice(colonIdx + 1).trim();\n data[key] = value;\n }\n\n return { data, body };\n}\n\n/**\n * Recursively scan a directory for `.md` files and return IndexableDocuments.\n */\nasync function scanDir(dir: string): Promise<IndexableDocument[]> {\n const docs: IndexableDocument[] = [];\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n const sub = await scanDir(fullPath);\n docs.push(...sub);\n } else if (entry.name.endsWith(\".md\")) {\n try {\n const raw = await readFile(fullPath, \"utf-8\");\n const parsed = parseFrontmatter(raw);\n const body = parsed ? parsed.body : raw.trim();\n const docid = parsed?.data.id || path.basename(entry.name, \".md\");\n docs.push({\n docid,\n path: fullPath,\n content: body,\n snippet: body.slice(0, 200),\n });\n } catch {\n // Skip unreadable files\n }\n }\n }\n } catch {\n // Directory doesn't exist yet — not an error\n }\n return docs;\n}\n\n/**\n * Scan `facts/`, `corrections/`, `procedures/`, and `reasoning-traces/`\n * subdirs of memoryDir for indexable markdown documents.\n *\n * Note: reasoning-traces live under their own subtree (issue #564 PR 3).\n * Non-QMD backends (Orama / Meilisearch / LanceDB) build their index\n * through this helper, so any new category subtree must be listed here\n * or those backends silently stop seeing the new memories.\n */\nexport async function scanMemoryDir(memoryDir: string): Promise<IndexableDocument[]> {\n const factsDir = path.join(memoryDir, \"facts\");\n const correctionsDir = path.join(memoryDir, \"corrections\");\n const proceduresDir = path.join(memoryDir, \"procedures\");\n const reasoningTracesDir = path.join(memoryDir, \"reasoning-traces\");\n const [facts, corrections, procedures, reasoningTraces] = await Promise.all([\n scanDir(factsDir),\n scanDir(correctionsDir),\n scanDir(proceduresDir),\n scanDir(reasoningTracesDir),\n ]);\n return [...facts, ...corrections, ...procedures, ...reasoningTraces];\n}\n","import { log } from \"../logger.js\";\nimport type { SearchBackend, SearchExecutionOptions, SearchQueryOptions, SearchResult } from \"./port.js\";\nimport type { EmbedHelper } from \"./embed-helper.js\";\nimport { scanMemoryDir } from \"./document-scanner.js\";\n\nexport interface LanceDbBackendOptions {\n dbPath: string;\n collection: string;\n embedHelper: EmbedHelper;\n memoryDir: string;\n embeddingDimension: number;\n}\n\n/**\n * LanceDB search backend — embedded hybrid FTS+vector with RRF reranking.\n *\n * Uses @lancedb/lancedb for native Arrow-backed storage.\n * One table per collection. Supports full-text, vector, and hybrid search.\n */\nexport class LanceDbBackend implements SearchBackend {\n private readonly dbPath: string;\n private readonly collection: string;\n private readonly embedHelper: EmbedHelper;\n private readonly memoryDir: string;\n private readonly embeddingDimension: number;\n private available = false;\n private db: any = null;\n private lanceModule: any = null;\n\n constructor(opts: LanceDbBackendOptions) {\n this.dbPath = opts.dbPath;\n this.collection = opts.collection;\n this.embedHelper = opts.embedHelper;\n this.memoryDir = opts.memoryDir;\n this.embeddingDimension = opts.embeddingDimension;\n }\n\n async probe(): Promise<boolean> {\n try {\n await this.ensureDb();\n this.available = true;\n return true;\n } catch (err) {\n log.debug(`LanceDbBackend probe failed: ${err}`);\n this.available = false;\n return false;\n }\n }\n\n isAvailable(): boolean {\n return this.available;\n }\n\n debugStatus(): string {\n return `backend=lancedb available=${this.available} dbPath=${this.dbPath}`;\n }\n\n async search(\n query: string,\n _collection?: string,\n maxResults?: number,\n _options?: SearchQueryOptions,\n _execution?: SearchExecutionOptions,\n ): Promise<SearchResult[]> {\n return this.hybridSearch(query, _collection, maxResults);\n }\n\n async searchGlobal(query: string, maxResults?: number, _execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n const limit = maxResults ?? 10;\n if (!this.available) return [];\n\n try {\n const db = await this.ensureDb();\n const tableNames = await db.tableNames();\n const allResults: SearchResult[] = [];\n\n for (const name of tableNames) {\n try {\n const table = await db.openTable(name);\n const results = await this.searchTable(table, query, \"hybrid\", limit);\n allResults.push(...results);\n } catch {\n // Skip tables that fail\n }\n }\n\n allResults.sort((a, b) => b.score - a.score);\n return allResults.slice(0, limit);\n } catch (err) {\n log.debug(`LanceDbBackend searchGlobal failed: ${err}`);\n return [];\n }\n }\n\n async bm25Search(query: string, collection?: string, maxResults?: number, _execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n const table = await this.ensureTableForCollection(collection ?? this.collection);\n if (!table) return [];\n return this.searchTable(table, query, \"fts\", maxResults ?? 10);\n }\n\n async vectorSearch(query: string, collection?: string, maxResults?: number, _execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n const table = await this.ensureTableForCollection(collection ?? this.collection);\n if (!table) return [];\n return this.searchTable(table, query, \"vector\", maxResults ?? 10);\n }\n\n async hybridSearch(query: string, collection?: string, maxResults?: number, _execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n const table = await this.ensureTableForCollection(collection ?? this.collection);\n if (!table) return [];\n return this.searchTable(table, query, \"hybrid\", maxResults ?? 10);\n }\n\n async update(execution?: SearchExecutionOptions): Promise<void> {\n await this.updateCollection(this.collection, execution);\n }\n\n async updateCollection(collection: string, _execution?: SearchExecutionOptions): Promise<void> {\n const table = await this.ensureTableForCollection(collection);\n if (!table) return;\n\n const docs = await scanMemoryDir(this.memoryDir);\n if (docs.length === 0) {\n // Clear stale data when no docs remain\n try {\n const db = await this.ensureDb();\n await db.dropTable(collection).catch(() => {});\n if (collection === this.collection) this.table = null;\n } catch {\n // Best-effort cleanup\n }\n return;\n }\n\n const rows = docs.map((d) => ({\n docid: d.docid,\n path: d.path,\n content: d.content,\n snippet: d.snippet,\n vector: new Array(this.embeddingDimension).fill(0),\n }));\n\n try {\n // Overwrite with fresh data\n const db = await this.ensureDb();\n await db.dropTable(collection).catch(() => {});\n if (collection === this.collection) this.table = null;\n const newTable = await db.createTable(collection, rows);\n // Create FTS index on content column\n try {\n await newTable.createIndex(\"content\", { config: this.lanceIndex.fts() });\n } catch {\n // FTS index creation may fail on some platforms — degrade gracefully\n }\n if (collection === this.collection) this.table = newTable;\n } catch (err) {\n log.debug(`LanceDbBackend update failed: ${err}`);\n }\n }\n\n async embed(): Promise<void> {\n await this.embedCollection(this.collection);\n }\n\n async embedCollection(collection: string): Promise<void> {\n if (!this.embedHelper.isAvailable()) return;\n\n const table = await this.ensureTableForCollection(collection);\n if (!table) return;\n\n try {\n const allRows = await table.query().select([\"docid\", \"content\", \"vector\"]).toArray();\n const needsEmbed = allRows.filter((row: any) => {\n const vec = row.vector;\n if (!vec || (typeof vec !== \"object\")) return true;\n // Support both Array and typed arrays (e.g. Float32Array from Arrow)\n const arr = Array.from(vec as ArrayLike<number>);\n return arr.length === 0 || arr.every((v: number) => v === 0);\n });\n\n if (needsEmbed.length === 0) return;\n\n const texts = needsEmbed.map((row: any) => row.content as string);\n const vectors = await this.embedHelper.embedBatch(texts);\n\n for (let i = 0; i < needsEmbed.length; i++) {\n const vec = vectors[i];\n if (!vec) continue;\n const docid = needsEmbed[i].docid;\n await table.update({ where: `docid = '${docid.replace(/'/g, \"''\")}'`, values: { vector: vec } });\n }\n } catch (err) {\n log.debug(`LanceDbBackend embed failed: ${err}`);\n }\n }\n\n async ensureCollection(_memoryDir: string): Promise<\"present\" | \"missing\" | \"unknown\" | \"skipped\"> {\n try {\n await this.ensureTable();\n return \"present\";\n } catch {\n return \"missing\";\n }\n }\n\n private table: any = null;\n\n private get lanceIndex(): any {\n return this.lanceModule.Index ?? this.lanceModule.default?.Index;\n }\n\n private async ensureDb(): Promise<any> {\n if (this.db) return this.db;\n if (!this.lanceModule) {\n this.lanceModule = await import(\"@lancedb/lancedb\");\n }\n const connect = this.lanceModule.connect ?? this.lanceModule.default?.connect;\n this.db = await connect(this.dbPath);\n return this.db;\n }\n\n private async ensureTableForCollection(collection: string): Promise<any> {\n // For the default collection, use the cached instance\n if (collection === this.collection) return this.ensureTable();\n\n const db = await this.ensureDb();\n const tables = await db.tableNames();\n\n if (tables.includes(collection)) {\n return await db.openTable(collection);\n }\n\n // Create empty table with schema\n const emptyRow = {\n docid: \"__placeholder__\",\n path: \"\",\n content: \"\",\n snippet: \"\",\n vector: new Array(this.embeddingDimension).fill(0),\n };\n const newTable = await db.createTable(collection, [emptyRow]);\n try {\n await newTable.createIndex(\"content\", { config: this.lanceIndex.fts() });\n } catch {\n // FTS index creation may fail — degrade gracefully\n }\n try {\n await newTable.delete(\"docid = '__placeholder__'\");\n } catch {\n // May fail if delete isn't supported on empty-ish tables\n }\n return newTable;\n }\n\n private async ensureTable(): Promise<any> {\n if (this.table) return this.table;\n\n const db = await this.ensureDb();\n const tables = await db.tableNames();\n\n if (tables.includes(this.collection)) {\n this.table = await db.openTable(this.collection);\n return this.table;\n }\n\n // Create empty table with schema\n const emptyRow = {\n docid: \"__placeholder__\",\n path: \"\",\n content: \"\",\n snippet: \"\",\n vector: new Array(this.embeddingDimension).fill(0),\n };\n this.table = await db.createTable(this.collection, [emptyRow]);\n // Create FTS index on content column\n try {\n await this.table.createIndex(\"content\", { config: this.lanceIndex.fts() });\n } catch {\n // FTS index creation may fail — degrade gracefully\n }\n // Remove placeholder row\n try {\n await this.table.delete(\"docid = '__placeholder__'\");\n } catch {\n // May fail if delete isn't supported on empty-ish tables\n }\n return this.table;\n }\n\n private async searchTable(table: any, query: string, mode: \"fts\" | \"vector\" | \"hybrid\", limit: number): Promise<SearchResult[]> {\n try {\n if (mode === \"fts\") {\n const results = await table.search(query, \"fts\").limit(limit).toArray();\n return this.mapRows(results);\n }\n\n if (mode === \"vector\") {\n const vec = await this.embedHelper.embed(query);\n if (!vec) {\n // Fall back to FTS\n const results = await table.search(query, \"fts\").limit(limit).toArray();\n return this.mapRows(results);\n }\n const results = await table.search(vec).limit(limit).toArray();\n return this.mapRows(results);\n }\n\n // hybrid — try FTS+vector with RRF reranking\n const vec = await this.embedHelper.embed(query);\n if (!vec) {\n const results = await table.search(query, \"fts\").limit(limit).toArray();\n return this.mapRows(results);\n }\n\n try {\n const results = await table\n .search(query, \"hybrid\")\n .vector(vec)\n .limit(limit)\n .toArray();\n return this.mapRows(results);\n } catch {\n // Hybrid may not be supported in all LanceDB versions — fall back to vector\n const results = await table.search(vec).limit(limit).toArray();\n return this.mapRows(results);\n }\n } catch (err) {\n log.debug(`LanceDbBackend search (${mode}) failed: ${err}`);\n return [];\n }\n }\n\n private mapRows(rows: any[]): SearchResult[] {\n return (rows ?? [])\n .filter((row) => row.docid && row.docid !== \"__placeholder__\")\n .map((row) => ({\n docid: row.docid ?? \"\",\n path: row.path ?? \"\",\n snippet: row.snippet ?? row.content?.slice(0, 200) ?? \"\",\n score: row._relevance_score ?? (row._distance != null ? 1 / (1 + (row._distance ?? 0)) : 0.5),\n }));\n }\n}\n","import { log } from \"../logger.js\";\nimport type { SearchBackend, SearchExecutionOptions, SearchQueryOptions, SearchResult } from \"./port.js\";\nimport { scanMemoryDir } from \"./document-scanner.js\";\n\nexport interface MeilisearchBackendOptions {\n host: string;\n apiKey?: string;\n collection: string;\n timeoutMs?: number;\n autoIndex?: boolean;\n memoryDir?: string;\n}\n\n/**\n * Meilisearch search backend — server-based SDK client.\n *\n * Requires a running Meilisearch instance. Uses the official `meilisearch` SDK.\n * When `autoIndex` is true, update() pushes docs from the local memory directory.\n */\nexport class MeilisearchBackend implements SearchBackend {\n private readonly host: string;\n private readonly apiKey?: string;\n private readonly collection: string;\n private readonly timeoutMs: number;\n private readonly autoIndex: boolean;\n private readonly memoryDir?: string;\n private available = false;\n private client: any = null;\n private meiliModule: any = null;\n\n constructor(opts: MeilisearchBackendOptions) {\n this.host = opts.host;\n this.apiKey = opts.apiKey;\n this.collection = opts.collection;\n this.timeoutMs = opts.timeoutMs ?? 30_000;\n this.autoIndex = opts.autoIndex ?? false;\n this.memoryDir = opts.memoryDir;\n }\n\n async probe(): Promise<boolean> {\n try {\n const client = await this.ensureClient();\n await client.health();\n this.available = true;\n return true;\n } catch (err) {\n log.debug(`MeilisearchBackend probe failed: ${err}`);\n this.available = false;\n return false;\n }\n }\n\n isAvailable(): boolean {\n return this.available;\n }\n\n debugStatus(): string {\n return `backend=meilisearch available=${this.available} host=${this.host}`;\n }\n\n async search(\n query: string,\n collection?: string,\n maxResults?: number,\n _options?: SearchQueryOptions,\n _execution?: SearchExecutionOptions,\n ): Promise<SearchResult[]> {\n // Try hybrid first; fall back to plain FTS only if hybrid throws (e.g. no embedder configured)\n try {\n return await this.doSearch(query, maxResults ?? 10, { hybrid: { semanticRatio: 0.5, embedder: \"default\" } }, collection, true);\n } catch {\n return this.bm25Search(query, collection, maxResults);\n }\n }\n\n async searchGlobal(query: string, maxResults?: number, _execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n const limit = maxResults ?? 10;\n if (!this.available) return [];\n\n try {\n const client = await this.ensureClient();\n const indexes = await client.getIndexes();\n const queries = (indexes.results ?? []).map((idx: any) => ({\n indexUid: idx.uid,\n q: query,\n limit,\n showRankingScore: true,\n }));\n if (queries.length === 0) return [];\n\n const multiResult = await client.multiSearch({ queries });\n const allResults: SearchResult[] = [];\n for (const result of multiResult.results ?? []) {\n allResults.push(...this.mapHits(result.hits ?? []));\n }\n allResults.sort((a, b) => b.score - a.score);\n return allResults.slice(0, limit);\n } catch (err) {\n log.debug(`MeilisearchBackend searchGlobal failed: ${err}`);\n return [];\n }\n }\n\n async bm25Search(query: string, collection?: string, maxResults?: number, _execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n return this.doSearch(query, maxResults ?? 10, undefined, collection);\n }\n\n async vectorSearch(query: string, collection?: string, maxResults?: number, _execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n return this.doSearch(query, maxResults ?? 10, { hybrid: { semanticRatio: 1.0, embedder: \"default\" } }, collection);\n }\n\n async hybridSearch(query: string, collection?: string, maxResults?: number, _execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n return this.doSearch(query, maxResults ?? 10, { hybrid: { semanticRatio: 0.5, embedder: \"default\" } }, collection);\n }\n\n async update(execution?: SearchExecutionOptions): Promise<void> {\n await this.updateCollection(this.collection, execution);\n }\n\n async updateCollection(collection: string, _execution?: SearchExecutionOptions): Promise<void> {\n if (!this.autoIndex || !this.memoryDir) return;\n if (!this.available) return;\n\n try {\n const client = await this.ensureClient();\n const docs = await scanMemoryDir(this.memoryDir);\n const index = client.index(collection);\n\n const meilDocs = docs.map((d) => ({\n id: d.docid,\n path: d.path,\n content: d.content,\n snippet: d.snippet,\n }));\n\n // Upsert current docs and wait for the task to complete\n const addTask = await index.addDocuments(meilDocs, { primaryKey: \"id\" });\n await client.waitForTask(addTask.taskUid, { timeOutMs: this.timeoutMs });\n\n // Remove docs that no longer exist on disk (paginated to handle large indexes)\n const currentIds = new Set(docs.map((d) => d.docid));\n try {\n const PAGE_SIZE = 1000;\n let offset = 0;\n let staleIds: string[] = [];\n let hasMore = true;\n while (hasMore) {\n const page = await index.getDocuments({ limit: PAGE_SIZE, offset, fields: [\"id\"] });\n const results = page.results ?? [];\n for (const doc of results) {\n const id = doc.id as string;\n if (!currentIds.has(id)) staleIds.push(id);\n }\n offset += results.length;\n hasMore = results.length === PAGE_SIZE;\n }\n if (staleIds.length > 0) {\n const delTask = await index.deleteDocuments(staleIds);\n await client.waitForTask(delTask.taskUid, { timeOutMs: this.timeoutMs });\n }\n } catch {\n // Deletion cleanup is best-effort\n }\n } catch (err) {\n log.debug(`MeilisearchBackend update failed: ${err}`);\n }\n }\n\n async embed(): Promise<void> {\n // Meilisearch handles its own embedding when configured with an embedder\n }\n\n async embedCollection(collection: string): Promise<void> {\n // Meilisearch handles its own embedding when configured with an embedder\n // The collection parameter is accepted for interface compliance but Meilisearch\n // manages embeddings server-side per index (collection).\n }\n\n async ensureCollection(_memoryDir: string): Promise<\"present\" | \"missing\" | \"unknown\" | \"skipped\"> {\n if (!this.available) return \"skipped\";\n try {\n const client = await this.ensureClient();\n try {\n await client.getIndex(this.collection);\n return \"present\";\n } catch {\n // Index doesn't exist — create it\n await client.createIndex(this.collection, { primaryKey: \"id\" });\n return \"present\";\n }\n } catch {\n return \"skipped\";\n }\n }\n\n private async ensureClient(): Promise<any> {\n if (this.client) return this.client;\n if (!this.meiliModule) {\n this.meiliModule = await import(\"meilisearch\");\n }\n const MeiliSearch = this.meiliModule.MeiliSearch ?? this.meiliModule.default?.MeiliSearch;\n this.client = new MeiliSearch({\n host: this.host,\n apiKey: this.apiKey,\n timeout: this.timeoutMs,\n });\n return this.client;\n }\n\n private async doSearch(query: string, limit: number, extra?: Record<string, unknown>, collection?: string, rethrow = false): Promise<SearchResult[]> {\n if (!this.available) return [];\n try {\n const client = await this.ensureClient();\n const index = client.index(collection ?? this.collection);\n const result = await index.search(query, { limit, showRankingScore: true, ...extra });\n return this.mapHits(result.hits ?? []);\n } catch (err) {\n log.debug(`MeilisearchBackend search failed: ${err}`);\n if (rethrow) throw err;\n return [];\n }\n }\n\n private mapHits(hits: any[]): SearchResult[] {\n return hits.map((hit) => ({\n docid: hit.id ?? \"\",\n path: hit.path ?? \"\",\n snippet: hit._formatted?.content ?? hit.snippet ?? hit.content?.slice(0, 200) ?? \"\",\n score: hit._rankingScore ?? 0.5,\n }));\n }\n}\n","import path from \"node:path\";\nimport { mkdir, readdir, readFile, writeFile } from \"node:fs/promises\";\nimport { log } from \"../logger.js\";\nimport type { SearchBackend, SearchExecutionOptions, SearchQueryOptions, SearchResult } from \"./port.js\";\nimport type { EmbedHelper } from \"./embed-helper.js\";\nimport { scanMemoryDir } from \"./document-scanner.js\";\n\nexport interface OramaBackendOptions {\n dbPath: string;\n collection: string;\n embedHelper: EmbedHelper;\n memoryDir: string;\n embeddingDimension: number;\n}\n\n/**\n * Orama search backend — embedded hybrid FTS+vector, pure JS.\n *\n * Uses @orama/orama for full-text search with optional vector support.\n * Persists data to JSON files via @orama/plugin-data-persistence.\n */\nexport class OramaBackend implements SearchBackend {\n private readonly dbPath: string;\n private readonly collection: string;\n private readonly embedHelper: EmbedHelper;\n private readonly memoryDir: string;\n private readonly embeddingDimension: number;\n private available = false;\n private db: any = null;\n private oramaModule: any = null;\n private persistModule: any = null;\n\n constructor(opts: OramaBackendOptions) {\n this.dbPath = opts.dbPath;\n this.collection = opts.collection;\n this.embedHelper = opts.embedHelper;\n this.memoryDir = opts.memoryDir;\n this.embeddingDimension = opts.embeddingDimension;\n }\n\n async probe(): Promise<boolean> {\n try {\n await this.ensureModules();\n await this.ensureDb();\n this.available = true;\n return true;\n } catch (err) {\n log.debug(`OramaBackend probe failed: ${err}`);\n this.available = false;\n return false;\n }\n }\n\n isAvailable(): boolean {\n return this.available;\n }\n\n debugStatus(): string {\n return `backend=orama available=${this.available} dbPath=${this.dbPath}`;\n }\n\n async search(\n query: string,\n _collection?: string,\n maxResults?: number,\n _options?: SearchQueryOptions,\n _execution?: SearchExecutionOptions,\n ): Promise<SearchResult[]> {\n return this.hybridSearch(query, _collection, maxResults);\n }\n\n async searchGlobal(query: string, maxResults?: number, _execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n const limit = maxResults ?? 10;\n if (!this.available) return [];\n try {\n const files = await this.listDbFiles();\n const allResults: SearchResult[] = [];\n for (const file of files) {\n const db = await this.loadDbFromFile(file);\n if (!db) continue;\n const results = await this.searchDb(db, query, \"hybrid\", limit);\n allResults.push(...results);\n }\n allResults.sort((a, b) => b.score - a.score);\n return allResults.slice(0, limit);\n } catch (err) {\n log.debug(`OramaBackend searchGlobal failed: ${err}`);\n return [];\n }\n }\n\n async bm25Search(query: string, collection?: string, maxResults?: number, _execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n const db = await this.ensureDbForCollection(collection ?? this.collection);\n if (!db) return [];\n return this.searchDb(db, query, \"fulltext\", maxResults ?? 10);\n }\n\n async vectorSearch(query: string, collection?: string, maxResults?: number, _execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n const db = await this.ensureDbForCollection(collection ?? this.collection);\n if (!db) return [];\n return this.searchDb(db, query, \"vector\", maxResults ?? 10);\n }\n\n async hybridSearch(query: string, collection?: string, maxResults?: number, _execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n const db = await this.ensureDbForCollection(collection ?? this.collection);\n if (!db) return [];\n return this.searchDb(db, query, \"hybrid\", maxResults ?? 10);\n }\n\n async update(execution?: SearchExecutionOptions): Promise<void> {\n await this.updateCollection(this.collection, execution);\n }\n\n async updateCollection(collection: string, _execution?: SearchExecutionOptions): Promise<void> {\n const db = await this.ensureDbForCollection(collection);\n if (!db) return;\n const { search: oramaSearch, insert, remove, count } = this.oramaModule;\n\n const docs = await scanMemoryDir(this.memoryDir);\n const docMap = new Map(docs.map((d) => [d.docid, d]));\n const { update: oramaUpdate } = this.oramaModule;\n\n // Get existing docs to diff — map user doc ID → { internalId, vector }\n const existingDocs = new Map<string, { internalId: string; vector?: number[] }>();\n const existingCount = await count(db);\n if (existingCount > 0) {\n const allHits = await oramaSearch(db, { term: \"\", limit: existingCount + 100 });\n for (const hit of allHits.hits) {\n if (!docMap.has(hit.document.id)) {\n await remove(db, hit.id);\n } else {\n existingDocs.set(hit.document.id, {\n internalId: hit.id,\n vector: hit.document.vector,\n });\n }\n }\n }\n\n // Insert new docs, update existing ones (preserving vectors since update is remove+insert)\n for (const doc of docs) {\n const existing = existingDocs.get(doc.docid);\n if (existing) {\n const payload: Record<string, unknown> = {\n id: doc.docid,\n path: doc.path,\n content: doc.content,\n snippet: doc.snippet,\n };\n if (existing.vector && existing.vector.length > 0) {\n payload.vector = existing.vector;\n }\n try {\n await oramaUpdate(db, existing.internalId, payload);\n } catch {\n // Update failed — skip and continue with remaining docs\n }\n } else {\n try {\n await insert(db, {\n id: doc.docid,\n path: doc.path,\n content: doc.content,\n snippet: doc.snippet,\n });\n } catch {\n // Duplicate id edge case — skip\n }\n }\n }\n\n await this.persistDbForCollection(db, collection);\n }\n\n async embed(): Promise<void> {\n await this.embedCollection(this.collection);\n }\n\n async embedCollection(collection: string): Promise<void> {\n if (!this.embedHelper.isAvailable()) return;\n\n const db = await this.ensureDbForCollection(collection);\n if (!db) return;\n const { search: oramaSearch, update: oramaUpdate, count } = this.oramaModule;\n\n const existingCount = await count(db);\n if (existingCount === 0) return;\n\n // Find docs without vectors\n const allHits = await oramaSearch(db, { term: \"\", limit: existingCount + 100 });\n const needsEmbed = allHits.hits.filter((h: any) => !h.document.vector || h.document.vector.length === 0);\n\n if (needsEmbed.length === 0) return;\n\n const texts = needsEmbed.map((h: any) => h.document.content as string);\n const vectors = await this.embedHelper.embedBatch(texts);\n\n for (let i = 0; i < needsEmbed.length; i++) {\n const vec = vectors[i];\n if (!vec) continue;\n // Orama update is remove+insert — must include all fields to avoid data loss\n const doc = needsEmbed[i].document;\n await oramaUpdate(db, needsEmbed[i].id, {\n id: doc.id,\n path: doc.path,\n content: doc.content,\n snippet: doc.snippet,\n vector: vec,\n });\n }\n\n await this.persistDbForCollection(db, collection);\n }\n\n async ensureCollection(_memoryDir: string): Promise<\"present\" | \"missing\" | \"unknown\" | \"skipped\"> {\n try {\n await this.ensureModules();\n await this.ensureDb();\n return \"present\";\n } catch {\n return \"missing\";\n }\n }\n\n private async ensureModules(): Promise<void> {\n if (this.oramaModule && this.persistModule) return;\n this.oramaModule = await import(\"@orama/orama\");\n this.persistModule = await import(\"@orama/plugin-data-persistence\");\n }\n\n private async ensureDb(): Promise<any> {\n if (this.db) return this.db;\n await this.ensureModules();\n\n await mkdir(this.dbPath, { recursive: true });\n const filePath = this.dbFilePath(this.collection);\n\n try {\n const raw = await readFile(filePath, \"utf-8\");\n this.db = await this.persistModule.restore(\"json\", raw);\n return this.db;\n } catch {\n // No existing DB — create fresh\n }\n\n const { create } = this.oramaModule;\n const schema: Record<string, string> = {\n id: \"string\",\n path: \"string\",\n content: \"string\",\n snippet: \"string\",\n };\n if (this.embedHelper.isAvailable()) {\n schema.vector = `vector[${this.embeddingDimension}]`;\n }\n this.db = await create({ schema });\n return this.db;\n }\n\n private async ensureDbForCollection(collection: string): Promise<any> {\n // For the default collection, use the cached instance\n if (collection === this.collection) return this.ensureDb();\n\n await this.ensureModules();\n await mkdir(this.dbPath, { recursive: true });\n const filePath = this.dbFilePath(collection);\n\n try {\n const raw = await readFile(filePath, \"utf-8\");\n return await this.persistModule.restore(\"json\", raw);\n } catch {\n // No existing DB — create fresh\n }\n\n const { create } = this.oramaModule;\n const schema: Record<string, string> = {\n id: \"string\",\n path: \"string\",\n content: \"string\",\n snippet: \"string\",\n };\n if (this.embedHelper.isAvailable()) {\n schema.vector = `vector[${this.embeddingDimension}]`;\n }\n return await create({ schema });\n }\n\n private async persistDbForCollection(db: any, collection: string): Promise<void> {\n const data = await this.persistModule.persist(db, \"json\");\n const filePath = this.dbFilePath(collection);\n await mkdir(path.dirname(filePath), { recursive: true });\n await writeFile(filePath, data, \"utf-8\");\n }\n\n private dbFilePath(collection: string): string {\n return path.join(this.dbPath, `${collection}.msp`);\n }\n\n private async listDbFiles(): Promise<string[]> {\n try {\n const entries = await readdir(this.dbPath);\n return entries\n .filter((e) => e.endsWith(\".msp\"))\n .map((e) => path.join(this.dbPath, e));\n } catch {\n return [];\n }\n }\n\n private async loadDbFromFile(filePath: string): Promise<any> {\n try {\n await this.ensureModules();\n const raw = await readFile(filePath, \"utf-8\");\n return await this.persistModule.restore(\"json\", raw);\n } catch {\n return null;\n }\n }\n\n private async searchDb(db: any, query: string, mode: \"fulltext\" | \"vector\" | \"hybrid\", limit: number): Promise<SearchResult[]> {\n const { search: oramaSearch } = this.oramaModule;\n\n try {\n let searchParams: any;\n\n if (mode === \"fulltext\") {\n searchParams = { term: query, limit };\n } else if (mode === \"vector\") {\n const vec = await this.embedHelper.embed(query);\n if (!vec) {\n // Fall back to fulltext if no embeddings available\n searchParams = { term: query, limit };\n } else {\n searchParams = { mode: \"vector\", vector: { value: vec, property: \"vector\" }, limit };\n }\n } else {\n // hybrid\n const vec = await this.embedHelper.embed(query);\n if (!vec) {\n searchParams = { term: query, limit };\n } else {\n searchParams = { mode: \"hybrid\", term: query, vector: { value: vec, property: \"vector\" }, limit };\n }\n }\n\n const result = await oramaSearch(db, searchParams);\n return (result.hits ?? []).map((hit: any) => ({\n docid: hit.document?.id ?? \"\",\n path: hit.document?.path ?? \"\",\n snippet: hit.document?.snippet ?? hit.document?.content?.slice(0, 200) ?? \"\",\n score: hit.score ?? 0,\n }));\n } catch (err) {\n log.debug(`OramaBackend search (${mode}) failed: ${err}`);\n return [];\n }\n }\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { log } from \"../logger.js\";\nimport type { FaissConversationIndexAdapter } from \"./faiss-adapter.js\";\nimport type { ConversationChunk } from \"./chunker.js\";\n\nexport function sanitizeSessionKey(sessionKey: string): string {\n const raw = typeof sessionKey === \"string\" && sessionKey.trim().length > 0\n ? sessionKey\n : \"unknown-session\";\n return raw.toLowerCase().replace(/[^a-z0-9._-]+/g, \"_\").slice(0, 200);\n}\n\nexport async function writeConversationChunks(\n rootDir: string,\n chunks: ConversationChunk[],\n): Promise<string[]> {\n const written: string[] = [];\n for (const c of chunks) {\n const safe = sanitizeSessionKey(c.sessionKey);\n const date = c.startTs.slice(0, 10);\n const dir = path.join(rootDir, safe, date);\n await mkdir(dir, { recursive: true });\n const fp = path.join(dir, `${c.id}.md`);\n const content =\n `---\\n` +\n `kind: conversation_chunk\\n` +\n `sessionKey: ${c.sessionKey}\\n` +\n `startTs: ${c.startTs}\\n` +\n `endTs: ${c.endTs}\\n` +\n `---\\n\\n` +\n c.text +\n \"\\n\";\n await writeFile(fp, content, \"utf-8\");\n written.push(fp);\n }\n return written;\n}\n\nexport interface ConversationChunkUpsertResult {\n upserted: number;\n skipped: boolean;\n reason?: \"adapter-unavailable\" | \"adapter-error\";\n}\n\nexport interface ConversationChunkRebuildResult {\n rebuilt: number;\n skipped: boolean;\n reason?: \"adapter-unavailable\" | \"adapter-error\";\n}\n\nexport async function upsertConversationChunksFailOpen(\n adapter: FaissConversationIndexAdapter | undefined,\n chunks: ConversationChunk[],\n): Promise<ConversationChunkUpsertResult> {\n if (!adapter) {\n return { upserted: 0, skipped: true, reason: \"adapter-unavailable\" };\n }\n try {\n const upserted = await adapter.upsertChunks(chunks);\n return { upserted, skipped: false };\n } catch (err) {\n log.debug(`conversation index FAISS upsert failed (fail-open): ${err}`);\n return { upserted: 0, skipped: true, reason: \"adapter-error\" };\n }\n}\n\nexport async function rebuildConversationChunksFailOpen(\n adapter: FaissConversationIndexAdapter | undefined,\n chunks: ConversationChunk[],\n): Promise<ConversationChunkRebuildResult> {\n if (!adapter) {\n return { rebuilt: 0, skipped: true, reason: \"adapter-unavailable\" };\n }\n try {\n const rebuilt = await adapter.rebuildChunks(chunks);\n return { rebuilt, skipped: false };\n } catch (err) {\n log.debug(`conversation index FAISS rebuild failed (fail-open): ${err}`);\n return { rebuilt: 0, skipped: true, reason: \"adapter-error\" };\n }\n}\n","import type { PluginConfig } from \"../types.js\";\nimport type { SearchBackend } from \"./port.js\";\nimport path from \"node:path\";\nimport { NoopSearchBackend } from \"./noop-backend.js\";\nimport { RemoteSearchBackend } from \"./remote-backend.js\";\nimport { LanceDbBackend } from \"./lancedb-backend.js\";\nimport { MeilisearchBackend } from \"./meilisearch-backend.js\";\nimport { OramaBackend } from \"./orama-backend.js\";\nimport { EmbedHelper } from \"./embed-helper.js\";\nimport { QmdClient, type QmdClientOptions } from \"../qmd.js\";\nimport { log } from \"../logger.js\";\nimport { FaissConversationIndexAdapter } from \"../conversation-index/faiss-adapter.js\";\nimport {\n createConversationIndexBackend,\n type ConversationIndexBackend,\n type ConversationQmdRuntime,\n} from \"../conversation-index/backend.js\";\n\n/**\n * Resolve non-QMD backends from config.\n * Returns a SearchBackend for \"noop\" or \"remote\", or undefined to signal \"use QMD\".\n */\nfunction resolveNonQmdBackend(config: PluginConfig): SearchBackend | undefined {\n const backend = config.searchBackend ?? \"qmd\";\n const collection = config.qmdCollection;\n\n if (backend === \"noop\") {\n return new NoopSearchBackend();\n }\n\n if (backend === \"remote\") {\n const baseUrl = config.remoteSearchBaseUrl || \"http://localhost:8181\";\n if (!config.remoteSearchBaseUrl) {\n log.warn(\"searchBackend is 'remote' but remoteSearchBaseUrl is not configured; using default http://localhost:8181\");\n }\n return new RemoteSearchBackend({\n baseUrl,\n apiKey: config.remoteSearchApiKey,\n timeoutMs: config.remoteSearchTimeoutMs,\n });\n }\n\n if (backend === \"lancedb\") {\n const embedHelper = new EmbedHelper(config);\n return new LanceDbBackend({\n dbPath: config.lanceDbPath!,\n collection,\n embedHelper,\n memoryDir: config.memoryDir,\n embeddingDimension: config.lanceEmbeddingDimension!,\n });\n }\n\n if (backend === \"meilisearch\") {\n return new MeilisearchBackend({\n host: config.meilisearchHost!,\n apiKey: config.meilisearchApiKey,\n collection,\n timeoutMs: config.meilisearchTimeoutMs,\n autoIndex: config.meilisearchAutoIndex,\n memoryDir: config.memoryDir,\n });\n }\n\n if (backend === \"orama\") {\n const embedHelper = new EmbedHelper(config);\n return new OramaBackend({\n dbPath: config.oramaDbPath!,\n collection,\n embedHelper,\n memoryDir: config.memoryDir,\n embeddingDimension: config.oramaEmbeddingDimension!,\n });\n }\n\n return undefined;\n}\n\n/** Shared QMD options derived from plugin config. */\nfunction qmdOptions(config: PluginConfig): QmdClientOptions {\n return {\n slowLog: {\n enabled: config.slowLogEnabled,\n thresholdMs: config.slowLogThresholdMs,\n },\n updateTimeoutMs: config.qmdUpdateTimeoutMs,\n updateMinIntervalMs: config.qmdUpdateMinIntervalMs,\n qmdPath: config.qmdPath,\n daemonUrl: config.qmdDaemonEnabled ? config.qmdDaemonUrl : undefined,\n daemonRecheckIntervalMs: config.qmdDaemonRecheckIntervalMs,\n };\n}\n\n/**\n * Create a SearchBackend from plugin config.\n *\n * - \"noop\" → NoopSearchBackend\n * - \"remote\" → RemoteSearchBackend (HTTP REST)\n * - \"qmd\" (default) → QmdClient if qmdEnabled, else NoopSearchBackend\n */\nexport function createSearchBackend(config: PluginConfig): SearchBackend {\n const nonQmd = resolveNonQmdBackend(config);\n if (nonQmd) return nonQmd;\n\n // Default: QMD — fall back to noop if qmdEnabled is false\n if (!config.qmdEnabled) {\n return new NoopSearchBackend();\n }\n\n return new QmdClient(config.qmdCollection, config.qmdMaxResults, qmdOptions(config));\n}\n\n/**\n * Create a SearchBackend for conversation index use.\n * Returns undefined if conversation index is not enabled or not using qmd backend.\n */\nexport function createConversationSearchBackend(config: PluginConfig): SearchBackend | undefined {\n if (!config.conversationIndexEnabled || config.conversationIndexBackend !== \"qmd\") {\n return undefined;\n }\n\n // Conversation index is QMD-only — do not use lancedb/meilisearch/orama even if\n // searchBackend is set to one of those. Only respect \"noop\" to allow disabling.\n const backend = config.searchBackend ?? \"qmd\";\n if (backend === \"noop\") return undefined;\n\n // QMD — respect qmdEnabled to avoid spawning the binary\n if (!config.qmdEnabled) return undefined;\n\n return new QmdClient(\n config.conversationIndexQmdCollection,\n Math.max(6, config.conversationRecallTopK),\n qmdOptions(config),\n );\n}\n\nexport interface ConversationIndexRuntime {\n qmd?: ConversationQmdRuntime;\n faiss?: FaissConversationIndexAdapter;\n backend?: ConversationIndexBackend;\n}\n\nexport function createConversationIndexRuntime(\n config: PluginConfig,\n overrides?: {\n getQmd?: () => ConversationQmdRuntime | undefined;\n getFaiss?: () => FaissConversationIndexAdapter | undefined;\n },\n): ConversationIndexRuntime {\n const qmd = createConversationSearchBackend(config) as ConversationQmdRuntime | undefined;\n const faiss =\n config.conversationIndexEnabled && config.conversationIndexBackend === \"faiss\"\n ? new FaissConversationIndexAdapter({\n memoryDir: config.memoryDir,\n scriptPath: config.conversationIndexFaissScriptPath,\n pythonBin: config.conversationIndexFaissPythonBin,\n modelId: config.conversationIndexFaissModelId,\n indexDir: config.conversationIndexFaissIndexDir,\n upsertTimeoutMs: config.conversationIndexFaissUpsertTimeoutMs,\n searchTimeoutMs: config.conversationIndexFaissSearchTimeoutMs,\n healthTimeoutMs: config.conversationIndexFaissHealthTimeoutMs,\n maxBatchSize: config.conversationIndexFaissMaxBatchSize,\n maxSearchK: config.conversationIndexFaissMaxSearchK,\n })\n : undefined;\n\n const backend = createConversationIndexBackend({\n enabled: config.conversationIndexEnabled,\n backend: config.conversationIndexBackend,\n getQmd: () => overrides?.getQmd?.() ?? qmd,\n getFaiss: () => overrides?.getFaiss?.() ?? faiss,\n collectionDir: path.join(config.memoryDir, \"conversation-index\"),\n });\n\n return { qmd, faiss, backend };\n}\n","import { log } from \"../logger.js\";\nimport type { SearchBackend, SearchExecutionOptions, SearchQueryOptions, SearchResult } from \"./port.js\";\n\nexport interface RemoteSearchBackendOptions {\n baseUrl: string;\n apiKey?: string;\n timeoutMs?: number;\n}\n\n/**\n * HTTP REST search backend adapter.\n *\n * Delegates search to a remote service. Maintenance methods are no-ops\n * (remote backends manage their own indexing).\n */\nexport class RemoteSearchBackend implements SearchBackend {\n private readonly baseUrl: string;\n private readonly apiKey?: string;\n private readonly timeoutMs: number;\n private available = false;\n\n constructor(opts: RemoteSearchBackendOptions) {\n let url = opts.baseUrl;\n while (url.endsWith(\"/\")) url = url.slice(0, -1);\n this.baseUrl = url;\n this.apiKey = opts.apiKey;\n this.timeoutMs = opts.timeoutMs ?? 30_000;\n }\n\n async probe(): Promise<boolean> {\n try {\n const res = await fetch(`${this.baseUrl}/health`, {\n method: \"GET\",\n headers: this.headers(),\n signal: AbortSignal.timeout(this.timeoutMs),\n });\n this.available = res.ok;\n return this.available;\n } catch (err) {\n log.debug(`RemoteSearchBackend probe failed: ${err}`);\n this.available = false;\n return false;\n }\n }\n\n isAvailable(): boolean {\n return this.available;\n }\n\n debugStatus(): string {\n return `backend=remote available=${this.available} baseUrl=${this.baseUrl}`;\n }\n\n async search(\n query: string,\n collection?: string,\n maxResults?: number,\n _options?: SearchQueryOptions,\n execution?: SearchExecutionOptions,\n ): Promise<SearchResult[]> {\n return this.post(\"/search/deep\", { query, collection, maxResults }, execution);\n }\n\n async searchGlobal(query: string, maxResults?: number, execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n return this.post(\"/search/deep\", { query, maxResults }, execution);\n }\n\n async bm25Search(query: string, collection?: string, maxResults?: number, execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n return this.post(\"/search/bm25\", { query, collection, maxResults }, execution);\n }\n\n async vectorSearch(query: string, collection?: string, maxResults?: number, execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n return this.post(\"/search/vector\", { query, collection, maxResults }, execution);\n }\n\n async hybridSearch(query: string, collection?: string, maxResults?: number, execution?: SearchExecutionOptions): Promise<SearchResult[]> {\n return this.post(\"/search/hybrid\", { query, collection, maxResults }, execution);\n }\n\n async update(_execution?: SearchExecutionOptions): Promise<void> {}\n async updateCollection(_collection: string, _execution?: SearchExecutionOptions): Promise<void> {}\n async embed(): Promise<void> {}\n async embedCollection(_collection: string): Promise<void> {}\n\n async ensureCollection(_memoryDir: string): Promise<\"skipped\"> {\n return \"skipped\";\n }\n\n private headers(): Record<string, string> {\n const h: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (this.apiKey) {\n h[\"Authorization\"] = `Bearer ${this.apiKey}`;\n }\n return h;\n }\n\n private async post(\n endpoint: string,\n body: Record<string, unknown>,\n execution?: SearchExecutionOptions,\n ): Promise<SearchResult[]> {\n if (!this.available) return [];\n try {\n const res = await fetch(`${this.baseUrl}${endpoint}`, {\n method: \"POST\",\n headers: this.headers(),\n body: JSON.stringify(body),\n signal: execution?.signal\n ? AbortSignal.any([execution.signal, AbortSignal.timeout(this.timeoutMs)])\n : AbortSignal.timeout(this.timeoutMs),\n });\n if (!res.ok) {\n log.debug(`RemoteSearchBackend ${endpoint} returned ${res.status}`);\n return [];\n }\n const data = await res.json();\n if (!Array.isArray(data)) return [];\n return data as SearchResult[];\n } catch (err) {\n log.debug(`RemoteSearchBackend ${endpoint} failed: ${err}`);\n return [];\n }\n }\n}\n","import { log } from \"../logger.js\";\nimport type { PluginConfig } from \"../types.js\";\n\ntype ProviderConfig = {\n type: \"openai\" | \"local\";\n model: string;\n endpoint: string;\n headers: Record<string, string>;\n};\n\nconst DEFAULT_OPENAI_MODEL = \"text-embedding-3-small\";\n\n/**\n * Standalone embedding helper for search backend adapters.\n *\n * NOTE: This intentionally duplicates provider resolution from EmbeddingFallback.\n * EmbeddingFallback is tightly integrated with the plugin lifecycle (telemetry,\n * rate-limit backoff, provider rotation). This class is a lightweight standalone\n * utility used by LanceDB/Orama backends which operate outside plugin context.\n * Merging them would break the port/adapter separation between search and plugin layers.\n */\nexport class EmbedHelper {\n private provider: ProviderConfig | null | undefined; // undefined = not yet resolved\n\n constructor(private readonly config: PluginConfig) {}\n\n /**\n * Whether an embedding provider is available.\n * Resolves the provider on first call.\n */\n isAvailable(): boolean {\n if (this.provider === undefined) {\n this.provider = this.resolveProvider();\n }\n return this.provider !== null;\n }\n\n /**\n * Embed a single text string. Returns null if no provider is available.\n */\n async embed(text: string): Promise<number[] | null> {\n const provider = this.getProvider();\n if (!provider) return null;\n return this.callEmbed(text, provider);\n }\n\n /**\n * Embed a batch of texts. Returns an array parallel to input; entries are null on failure.\n */\n async embedBatch(texts: string[], batchSize = 32): Promise<(number[] | null)[]> {\n const provider = this.getProvider();\n if (!provider) return texts.map(() => null);\n\n const results: (number[] | null)[] = new Array(texts.length).fill(null);\n for (let i = 0; i < texts.length; i += batchSize) {\n const batch = texts.slice(i, i + batchSize);\n const batchResults = await Promise.all(batch.map((t) => this.callEmbed(t, provider)));\n for (let j = 0; j < batchResults.length; j++) {\n results[i + j] = batchResults[j];\n }\n }\n return results;\n }\n\n private getProvider(): ProviderConfig | null {\n if (this.provider === undefined) {\n this.provider = this.resolveProvider();\n }\n return this.provider;\n }\n\n private resolveProvider(): ProviderConfig | null {\n if (!this.config.embeddingFallbackEnabled) return null;\n\n const preferred = this.config.embeddingFallbackProvider;\n const providers = preferred === \"auto\" ? [\"openai\", \"local\"] : [preferred];\n\n for (const p of providers) {\n if (p === \"openai\" && this.config.openaiApiKey) {\n const baseUrl = this.config.openaiBaseUrl ?? \"https://api.openai.com/v1\";\n return {\n type: \"openai\",\n model: DEFAULT_OPENAI_MODEL,\n endpoint: `${baseUrl.replace(/\\/$/, \"\")}/embeddings`,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.openaiApiKey}`,\n },\n };\n }\n\n if (p === \"local\" && this.config.localLlmEnabled && this.config.localLlmUrl) {\n const base = this.config.localLlmUrl.replace(/\\/$/, \"\");\n const endpoint = /\\/v1$/i.test(base) ? `${base}/embeddings` : `${base}/v1/embeddings`;\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...(this.config.localLlmHeaders ?? {}),\n };\n if (this.config.localLlmApiKey && this.config.localLlmAuthHeader !== false) {\n headers.Authorization = `Bearer ${this.config.localLlmApiKey}`;\n }\n return {\n type: \"local\",\n model: this.config.localLlmModel || DEFAULT_OPENAI_MODEL,\n endpoint,\n headers,\n };\n }\n }\n\n return null;\n }\n\n private async callEmbed(input: string, provider: ProviderConfig): Promise<number[] | null> {\n try {\n const res = await fetch(provider.endpoint, {\n method: \"POST\",\n headers: provider.headers,\n body: JSON.stringify({\n model: provider.model,\n input: input.slice(0, 8000),\n encoding_format: \"float\",\n }),\n signal: AbortSignal.timeout(30_000),\n });\n if (!res.ok) {\n log.debug(`EmbedHelper request failed: ${provider.type} ${res.status}`);\n return null;\n }\n const payload = (await res.json()) as any;\n const vector = payload?.data?.[0]?.embedding;\n if (!Array.isArray(vector)) return null;\n return vector.map((n: unknown) => { const v = Number(n); return Number.isFinite(v) ? v : 0; });\n } catch (err) {\n log.debug(`EmbedHelper error: ${err}`);\n return null;\n }\n }\n}\n","import { fileURLToPath } from \"node:url\";\nimport path from \"node:path\";\nimport { log } from \"../logger.js\";\nimport type { ConversationChunk } from \"./chunker.js\";\nimport type { ConversationSearchResult } from \"./search.js\";\nimport { launchProcess } from \"../runtime/child-process.js\";\n\nexport interface FaissAdapterConfig {\n memoryDir: string;\n scriptPath?: string;\n pythonBin?: string;\n modelId: string;\n indexDir: string;\n upsertTimeoutMs: number;\n searchTimeoutMs: number;\n healthTimeoutMs: number;\n maxBatchSize: number;\n maxSearchK: number;\n spawnFn?: typeof launchProcess;\n}\n\nexport interface FaissHealthResult {\n ok: boolean;\n status: \"ok\" | \"degraded\" | \"error\";\n indexPath: string;\n message?: string;\n manifest?: {\n version: number;\n modelId: string;\n normalizedModelId: string;\n dimension: number;\n chunkCount: number;\n updatedAt: string;\n lastSuccessfulRebuildAt: string;\n };\n}\n\nexport interface FaissInspectResult extends FaissHealthResult {\n metadata: {\n chunkCount: number;\n hasIndex: boolean;\n hasMetadata: boolean;\n hasManifest: boolean;\n };\n}\n\ntype SidecarCommand = \"upsert\" | \"search\" | \"health\" | \"inspect\" | \"rebuild\";\n\nexport class FaissAdapterError extends Error {\n constructor(message: string, readonly code: \"timeout\" | \"non_zero_exit\" | \"malformed_output\") {\n super(message);\n this.name = \"FaissAdapterError\";\n }\n}\n\ninterface SidecarResult {\n ok?: boolean;\n error?: string;\n upserted?: number;\n rebuilt?: number;\n status?: \"ok\" | \"degraded\" | \"error\";\n manifest?: {\n version?: number;\n modelId?: string;\n normalizedModelId?: string;\n dimension?: number;\n chunkCount?: number;\n updatedAt?: string;\n lastSuccessfulRebuildAt?: string;\n };\n results?: Array<{\n path: string;\n snippet: string;\n score: number;\n }>;\n metadata?: {\n chunkCount?: number;\n hasIndex?: boolean;\n hasMetadata?: boolean;\n hasManifest?: boolean;\n };\n}\n\nfunction parseSidecarManifest(result: SidecarResult): FaissHealthResult[\"manifest\"] | undefined {\n const manifest = result.manifest;\n if (\n !manifest ||\n typeof manifest.version !== \"number\" ||\n typeof manifest.modelId !== \"string\" ||\n typeof manifest.normalizedModelId !== \"string\" ||\n typeof manifest.dimension !== \"number\" ||\n typeof manifest.chunkCount !== \"number\" ||\n typeof manifest.updatedAt !== \"string\" ||\n typeof manifest.lastSuccessfulRebuildAt !== \"string\"\n ) {\n return undefined;\n }\n\n return {\n version: manifest.version,\n modelId: manifest.modelId,\n normalizedModelId: manifest.normalizedModelId,\n dimension: manifest.dimension,\n chunkCount: manifest.chunkCount,\n updatedAt: manifest.updatedAt,\n lastSuccessfulRebuildAt: manifest.lastSuccessfulRebuildAt,\n };\n}\n\nexport function resolveDefaultFaissScriptPath(fromModuleUrl: string = import.meta.url): string {\n const currentFile = fileURLToPath(fromModuleUrl);\n const moduleDir = path.dirname(currentFile);\n\n // Source runtime: src/conversation-index/faiss-adapter.ts\n if (moduleDir.endsWith(`${path.sep}conversation-index`)) {\n return path.resolve(moduleDir, \"..\", \"..\", \"scripts\", \"faiss_index.py\");\n }\n\n // Bundled runtime: dist/index.js (or neighboring dist chunks)\n return path.resolve(moduleDir, \"..\", \"scripts\", \"faiss_index.py\");\n}\n\nexport class FaissConversationIndexAdapter {\n private readonly pythonBin: string;\n private readonly scriptPath: string;\n private readonly indexPath: string;\n private readonly spawnFn: typeof launchProcess;\n\n constructor(private readonly config: FaissAdapterConfig) {\n this.pythonBin = config.pythonBin && config.pythonBin.trim().length > 0 ? config.pythonBin.trim() : \"python3\";\n this.scriptPath = config.scriptPath && config.scriptPath.trim().length > 0\n ? config.scriptPath.trim()\n : resolveDefaultFaissScriptPath();\n this.indexPath = path.isAbsolute(config.indexDir)\n ? config.indexDir\n : path.join(config.memoryDir, config.indexDir);\n this.spawnFn = config.spawnFn ?? launchProcess;\n }\n\n async upsertChunks(chunks: ConversationChunk[]): Promise<number> {\n if (this.config.maxBatchSize <= 0) return 0;\n let totalUpserted = 0;\n for (let offset = 0; offset < chunks.length; offset += this.config.maxBatchSize) {\n const batch = chunks.slice(offset, offset + this.config.maxBatchSize);\n if (batch.length === 0) continue;\n const payload = {\n modelId: this.config.modelId,\n indexPath: this.indexPath,\n chunks: batch.map((chunk) => ({\n id: chunk.id,\n sessionKey: chunk.sessionKey,\n text: chunk.text,\n startTs: chunk.startTs,\n endTs: chunk.endTs,\n })),\n };\n const result = await this.runCommand(\"upsert\", payload, this.config.upsertTimeoutMs);\n const upserted = result.upserted;\n if (typeof upserted !== \"number\" || !Number.isFinite(upserted)) {\n throw new FaissAdapterError(\"FAISS sidecar produced malformed upsert response\", \"malformed_output\");\n }\n totalUpserted += Math.max(0, Math.floor(upserted));\n }\n return totalUpserted;\n }\n\n async searchChunks(query: string, topK: number): Promise<ConversationSearchResult[]> {\n const requestedTopK = Number.isFinite(topK) ? Math.floor(topK) : 0;\n const boundedTopK = this.config.maxSearchK > 0\n ? Math.max(0, Math.min(requestedTopK, this.config.maxSearchK))\n : 0;\n if (boundedTopK <= 0 || query.trim().length === 0) return [];\n const payload = {\n modelId: this.config.modelId,\n indexPath: this.indexPath,\n query,\n topK: boundedTopK,\n };\n const result = await this.runCommand(\"search\", payload, this.config.searchTimeoutMs);\n if (!Array.isArray(result.results)) {\n throw new FaissAdapterError(\"FAISS sidecar produced malformed search response\", \"malformed_output\");\n }\n const rows = result.results;\n return rows\n .filter((row) =>\n row &&\n typeof row.path === \"string\" &&\n typeof row.snippet === \"string\" &&\n typeof row.score === \"number\"\n )\n .map((row) => ({ path: row.path, snippet: row.snippet, score: row.score }));\n }\n\n async health(): Promise<FaissHealthResult> {\n const payload = {\n modelId: this.config.modelId,\n indexPath: this.indexPath,\n };\n const result = await this.runCommand(\"health\", payload, this.config.healthTimeoutMs);\n if (result.status !== \"ok\" && result.status !== \"degraded\" && result.status !== \"error\") {\n throw new FaissAdapterError(\"FAISS sidecar produced malformed health response\", \"malformed_output\");\n }\n return {\n ok: result.ok === true,\n status: result.status,\n indexPath: this.indexPath,\n message: typeof result.error === \"string\" && result.error.length > 0 ? result.error : undefined,\n manifest: parseSidecarManifest(result),\n };\n }\n\n async inspect(): Promise<FaissInspectResult> {\n const payload = {\n modelId: this.config.modelId,\n indexPath: this.indexPath,\n };\n const result = await this.runCommand(\"inspect\", payload, this.config.healthTimeoutMs);\n if (result.status !== \"ok\" && result.status !== \"degraded\" && result.status !== \"error\") {\n throw new FaissAdapterError(\"FAISS sidecar produced malformed inspect response\", \"malformed_output\");\n }\n return {\n ok: result.ok === true,\n status: result.status,\n indexPath: this.indexPath,\n message: typeof result.error === \"string\" && result.error.length > 0 ? result.error : undefined,\n manifest: parseSidecarManifest(result),\n metadata: {\n chunkCount:\n result.metadata && typeof result.metadata.chunkCount === \"number\"\n ? result.metadata.chunkCount\n : 0,\n hasIndex: result.metadata?.hasIndex === true,\n hasMetadata: result.metadata?.hasMetadata === true,\n hasManifest: result.metadata?.hasManifest === true,\n },\n };\n }\n\n async rebuildChunks(chunks: ConversationChunk[]): Promise<number> {\n if (this.config.maxBatchSize <= 0) return 0;\n\n const firstBatch = chunks.slice(0, this.config.maxBatchSize);\n const rebuildPayload = {\n modelId: this.config.modelId,\n indexPath: this.indexPath,\n chunks: firstBatch.map((chunk) => ({\n id: chunk.id,\n sessionKey: chunk.sessionKey,\n text: chunk.text,\n startTs: chunk.startTs,\n endTs: chunk.endTs,\n })),\n };\n const result = await this.runCommand(\"rebuild\", rebuildPayload, this.config.upsertTimeoutMs);\n const rebuilt = result.rebuilt;\n if (typeof rebuilt !== \"number\" || !Number.isFinite(rebuilt)) {\n throw new FaissAdapterError(\"FAISS sidecar produced malformed rebuild response\", \"malformed_output\");\n }\n\n const rebuildCount = Math.max(0, Math.floor(rebuilt));\n const remaining = chunks.slice(firstBatch.length);\n if (remaining.length === 0) return rebuildCount;\n\n const upserted = await this.upsertChunks(remaining);\n return rebuildCount + upserted;\n }\n\n private async runCommand(command: SidecarCommand, payload: object, timeoutMs: number): Promise<SidecarResult> {\n const args = [this.scriptPath, command];\n const child = this.spawnFn(this.pythonBin, args, {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n if (!child.stdin || !child.stdout || !child.stderr) {\n throw new FaissAdapterError(\n `FAISS sidecar missing stdio pipes (${command})`,\n \"non_zero_exit\",\n );\n }\n const stdinPipe = child.stdin;\n const stdoutPipe = child.stdout;\n const stderrPipe = child.stderr;\n\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n let timedOut = false;\n\n const timer = timeoutMs > 0\n ? setTimeout(() => {\n timedOut = true;\n child.kill(\"SIGKILL\");\n }, timeoutMs)\n : undefined;\n\n stdoutPipe.on(\"data\", (chunk: Buffer | string) => {\n stdoutChunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n });\n stderrPipe.on(\"data\", (chunk: Buffer | string) => {\n stderrChunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n });\n\n let code: number | null;\n try {\n stdinPipe.write(JSON.stringify(payload));\n stdinPipe.end();\n\n code = await new Promise<number | null>((resolve, reject) => {\n const rejectAsProcessError = (err: unknown) => {\n const msg = err instanceof Error ? err.message : String(err);\n reject(new FaissAdapterError(`FAISS sidecar stream/process error (${command}): ${msg}`, \"non_zero_exit\"));\n };\n child.once(\"error\", rejectAsProcessError);\n stdinPipe.once(\"error\", rejectAsProcessError);\n child.once(\"close\", (exitCode) => resolve(exitCode));\n });\n } catch (err) {\n if (err instanceof FaissAdapterError) throw err;\n const msg = err instanceof Error ? err.message : String(err);\n throw new FaissAdapterError(`FAISS sidecar stream/process error (${command}): ${msg}`, \"non_zero_exit\");\n } finally {\n if (timer) clearTimeout(timer);\n }\n\n const stdout = Buffer.concat(stdoutChunks).toString(\"utf-8\").trim();\n const stderr = Buffer.concat(stderrChunks).toString(\"utf-8\").trim();\n\n if (timedOut) {\n throw new FaissAdapterError(\n `FAISS sidecar command timed out (${command}, ${timeoutMs}ms)`,\n \"timeout\",\n );\n }\n if (code !== 0) {\n throw new FaissAdapterError(\n `FAISS sidecar exited non-zero (${command}, code=${code ?? \"null\"})${stderr ? `: ${stderr}` : \"\"}`,\n \"non_zero_exit\",\n );\n }\n if (stdout.length === 0) {\n throw new FaissAdapterError(\n `FAISS sidecar produced empty output (${command})`,\n \"malformed_output\",\n );\n }\n\n let parsed: SidecarResult;\n try {\n parsed = JSON.parse(stdout) as SidecarResult;\n } catch {\n throw new FaissAdapterError(\n `FAISS sidecar produced malformed JSON (${command})`,\n \"malformed_output\",\n );\n }\n\n if (parsed.ok === false) {\n const message = typeof parsed.error === \"string\" && parsed.error.length > 0\n ? parsed.error\n : `FAISS sidecar command failed (${command})`;\n throw new FaissAdapterError(message, \"non_zero_exit\");\n }\n if (parsed.ok !== true) {\n throw new FaissAdapterError(\n `FAISS sidecar produced malformed success envelope (${command})`,\n \"malformed_output\",\n );\n }\n\n return parsed;\n }\n}\n\nexport async function failOpenFaissHealth(\n adapter: FaissConversationIndexAdapter | undefined,\n): Promise<FaissHealthResult> {\n if (!adapter) {\n return { ok: false, status: \"error\", indexPath: \"\", message: \"adapter-unavailable\" };\n }\n try {\n return await adapter.health();\n } catch (err) {\n log.debug(`faiss adapter health failed (fail-open): ${err}`);\n return { ok: false, status: \"error\", indexPath: \"\", message: \"adapter-error\" };\n }\n}\n","import { log } from \"../logger.js\";\nimport type { SearchBackend } from \"../search/port.js\";\nimport type { FaissConversationIndexAdapter } from \"./faiss-adapter.js\";\n\nexport interface ConversationSearchResult {\n path: string;\n snippet: string;\n score: number;\n}\n\nexport async function searchConversationIndex(\n qmd: SearchBackend,\n query: string,\n maxResults: number,\n): Promise<ConversationSearchResult[]> {\n try {\n const results = await qmd.search(query, undefined, maxResults);\n return results.map((r) => ({ path: r.path, snippet: r.snippet, score: r.score }));\n } catch (err) {\n log.debug(`conversation index search failed: ${err}`);\n return [];\n }\n}\n\nexport async function searchConversationIndexFaissFailOpen(\n adapter: FaissConversationIndexAdapter | undefined,\n query: string,\n maxResults: number,\n): Promise<ConversationSearchResult[]> {\n if (!adapter) return [];\n try {\n return await adapter.searchChunks(query, maxResults);\n } catch (err) {\n log.debug(`conversation index FAISS search failed (fail-open): ${err}`);\n return [];\n }\n}\n","import type { SearchBackend, SearchExecutionOptions } from \"../search/port.js\";\nimport type { ConversationChunk } from \"./chunker.js\";\nimport { failOpenFaissHealth, type FaissConversationIndexAdapter } from \"./faiss-adapter.js\";\nimport {\n rebuildConversationChunksFailOpen,\n upsertConversationChunksFailOpen,\n} from \"./indexer.js\";\nimport { searchConversationIndex, searchConversationIndexFaissFailOpen, type ConversationSearchResult } from \"./search.js\";\n\ntype CollectionState = \"missing\" | \"unknown\" | \"present\" | \"skipped\";\n\nexport interface ConversationQmdRuntime extends SearchBackend {\n isAvailable(): boolean;\n probe(): Promise<boolean>;\n ensureCollection(baseDir: string): Promise<CollectionState>;\n update(execution?: SearchExecutionOptions): Promise<void>;\n updateCollection(collection: string, execution?: SearchExecutionOptions): Promise<void>;\n embed(): Promise<void>;\n debugStatus(): string;\n}\n\nexport interface ConversationIndexBackendHealth {\n backend: \"qmd\" | \"faiss\";\n status: \"ok\" | \"degraded\" | \"disabled\";\n message?: string;\n qmdAvailable?: boolean;\n faiss?: {\n ok: boolean;\n status: \"ok\" | \"degraded\" | \"error\";\n indexPath: string;\n message?: string;\n manifest?: {\n version: number;\n modelId: string;\n normalizedModelId: string;\n dimension: number;\n chunkCount: number;\n updatedAt: string;\n lastSuccessfulRebuildAt: string;\n };\n };\n}\n\nexport interface ConversationIndexBackendInspection {\n backend: \"qmd\" | \"faiss\";\n status: \"ok\" | \"degraded\" | \"disabled\";\n available: boolean;\n indexPath: string;\n supportsIncrementalUpdate: boolean;\n message?: string;\n metadata: {\n chunkCount: number | null;\n qmdAvailable?: boolean;\n debugStatus?: string;\n hasIndex?: boolean;\n hasMetadata?: boolean;\n hasManifest?: boolean;\n manifest?: {\n version: number;\n modelId: string;\n normalizedModelId: string;\n dimension: number;\n chunkCount: number;\n updatedAt: string;\n lastSuccessfulRebuildAt: string;\n };\n };\n}\n\nexport interface ConversationIndexBackendInitResult {\n enabled: boolean;\n logLevel: \"info\" | \"warn\" | \"debug\";\n message: string;\n}\n\nexport interface ConversationIndexBackend {\n readonly kind: \"qmd\" | \"faiss\";\n initialize(): Promise<ConversationIndexBackendInitResult>;\n search(query: string, maxResults: number): Promise<ConversationSearchResult[]>;\n update(chunks: ConversationChunk[], options: { embed: boolean }): Promise<{ embedded: boolean }>;\n rebuild(chunks: ConversationChunk[], options: { embed: boolean }): Promise<{ embedded: boolean; rebuilt: boolean }>;\n health(): Promise<ConversationIndexBackendHealth>;\n inspect(): Promise<ConversationIndexBackendInspection>;\n}\n\nexport function createConversationIndexBackend(options: {\n enabled: boolean;\n backend: \"qmd\" | \"faiss\";\n getQmd?: () => ConversationQmdRuntime | undefined;\n getFaiss?: () => FaissConversationIndexAdapter | undefined;\n qmd?: ConversationQmdRuntime;\n faiss?: FaissConversationIndexAdapter;\n collectionDir: string;\n}): ConversationIndexBackend | undefined {\n if (!options.enabled) return undefined;\n const getQmd = options.getQmd ?? (() => options.qmd);\n const getFaiss = options.getFaiss ?? (() => options.faiss);\n if (options.backend === \"faiss\") {\n return createFaissBackend(getFaiss);\n }\n return createQmdBackend(getQmd, options.collectionDir);\n}\n\nfunction createQmdBackend(\n getQmd: () => ConversationQmdRuntime | undefined,\n collectionDir: string,\n): ConversationIndexBackend {\n return {\n kind: \"qmd\",\n async initialize() {\n const qmd = getQmd();\n if (!qmd) {\n return {\n enabled: true,\n logLevel: \"warn\",\n message: \"Conversation index QMD: not available search backend disabled or unsupported\",\n };\n }\n\n const available = await qmd.probe();\n if (!available) {\n return {\n enabled: true,\n logLevel: \"warn\",\n message: `Conversation index QMD: not available ${qmd.debugStatus()}`,\n };\n }\n\n const collectionState = await qmd.ensureCollection(collectionDir);\n if (collectionState === \"missing\") {\n return {\n enabled: false,\n logLevel: \"warn\",\n message: \"Conversation index collection missing; disabling conversation semantic recall for this runtime\",\n };\n }\n if (collectionState === \"unknown\") {\n return {\n enabled: true,\n logLevel: \"warn\",\n message: \"Conversation index collection check unavailable; keeping conversation semantic recall enabled for fail-open behavior\",\n };\n }\n if (collectionState === \"skipped\") {\n return {\n enabled: true,\n logLevel: \"debug\",\n message: \"Conversation index collection check skipped in daemon-only mode\",\n };\n }\n\n return {\n enabled: true,\n logLevel: \"info\",\n message: `Conversation index QMD: available ${qmd.debugStatus()}`,\n };\n },\n async search(query: string, maxResults: number) {\n const qmd = getQmd();\n if (!qmd || !qmd.isAvailable()) return [];\n return searchConversationIndex(qmd, query, maxResults);\n },\n async update(_chunks: ConversationChunk[], options: { embed: boolean }) {\n const qmd = getQmd();\n if (!qmd || !qmd.isAvailable()) return { embedded: false };\n await qmd.update();\n if (options.embed) {\n await qmd.embed();\n return { embedded: true };\n }\n return { embedded: false };\n },\n async rebuild(_chunks: ConversationChunk[], options: { embed: boolean }) {\n const qmd = getQmd();\n if (!qmd || !qmd.isAvailable()) return { embedded: false, rebuilt: false };\n await qmd.update();\n if (options.embed) {\n await qmd.embed();\n return { embedded: true, rebuilt: true };\n }\n return { embedded: false, rebuilt: true };\n },\n async health() {\n const qmd = getQmd();\n let qmdAvailable = !!qmd?.isAvailable();\n if (!qmdAvailable && qmd) {\n try {\n qmdAvailable = await qmd.probe();\n } catch {\n qmdAvailable = false;\n }\n }\n\n return {\n backend: \"qmd\",\n status: qmdAvailable ? \"ok\" : \"degraded\",\n qmdAvailable,\n };\n },\n async inspect() {\n const qmd = getQmd();\n let qmdAvailable = !!qmd?.isAvailable();\n if (!qmdAvailable && qmd) {\n try {\n qmdAvailable = await qmd.probe();\n } catch {\n qmdAvailable = false;\n }\n }\n\n return {\n backend: \"qmd\",\n status: qmdAvailable ? \"ok\" : \"degraded\",\n available: qmdAvailable,\n indexPath: collectionDir,\n supportsIncrementalUpdate: true,\n message: qmd ? undefined : \"Conversation index QMD runtime unavailable\",\n metadata: {\n chunkCount: null,\n qmdAvailable,\n debugStatus: qmd?.debugStatus(),\n },\n };\n },\n };\n}\n\nfunction createFaissBackend(\n getFaiss: () => FaissConversationIndexAdapter | undefined,\n): ConversationIndexBackend {\n return {\n kind: \"faiss\",\n async initialize() {\n const health = await failOpenFaissHealth(getFaiss());\n return health.status === \"ok\"\n ? {\n enabled: true,\n logLevel: \"info\",\n message: `Conversation index FAISS: available (status=${health.status})`,\n }\n : {\n enabled: true,\n logLevel: \"warn\",\n message: `Conversation index FAISS: degraded (${health.message ?? health.status})`,\n };\n },\n async search(query: string, maxResults: number) {\n return searchConversationIndexFaissFailOpen(getFaiss(), query, maxResults);\n },\n async update(chunks: ConversationChunk[], _options: { embed: boolean }) {\n await upsertConversationChunksFailOpen(getFaiss(), chunks);\n return { embedded: false };\n },\n async rebuild(chunks: ConversationChunk[], _options: { embed: boolean }) {\n const result = await rebuildConversationChunksFailOpen(getFaiss(), chunks);\n return { embedded: false, rebuilt: result.skipped !== true };\n },\n async health() {\n const faiss = await failOpenFaissHealth(getFaiss());\n return {\n backend: \"faiss\",\n status: faiss.status === \"ok\" ? \"ok\" : \"degraded\",\n message: faiss.message,\n faiss,\n };\n },\n async inspect() {\n const adapter = getFaiss();\n if (!adapter) {\n return {\n backend: \"faiss\",\n status: \"degraded\",\n available: false,\n indexPath: \"\",\n supportsIncrementalUpdate: true,\n message: \"Conversation index FAISS runtime unavailable\",\n metadata: {\n chunkCount: 0,\n hasIndex: false,\n hasMetadata: false,\n hasManifest: false,\n },\n };\n }\n\n try {\n const inspection = await adapter.inspect();\n return {\n backend: \"faiss\",\n status: inspection.status === \"ok\" ? \"ok\" : \"degraded\",\n available: inspection.status === \"ok\",\n indexPath: inspection.indexPath,\n supportsIncrementalUpdate: true,\n message: inspection.message,\n metadata: {\n chunkCount: inspection.metadata.chunkCount,\n hasIndex: inspection.metadata.hasIndex,\n hasMetadata: inspection.metadata.hasMetadata,\n hasManifest: inspection.metadata.hasManifest,\n manifest: inspection.manifest,\n },\n };\n } catch (err) {\n const fallback = await failOpenFaissHealth(adapter);\n return {\n backend: \"faiss\",\n status: \"degraded\",\n available: false,\n indexPath: fallback.indexPath,\n supportsIncrementalUpdate: true,\n message: fallback.message ?? String(err),\n metadata: {\n chunkCount: fallback.manifest?.chunkCount ?? 0,\n hasIndex: false,\n hasMetadata: false,\n hasManifest: !!fallback.manifest,\n manifest: fallback.manifest,\n },\n };\n }\n },\n };\n}\n","import path from \"node:path\";\nimport { access } from \"node:fs/promises\";\nimport { isSafeRouteNamespace } from \"../routing/engine.js\";\nimport { StorageManager } from \"../storage.js\";\nimport type { PluginConfig } from \"../types.js\";\n\nasync function exists(p: string): Promise<boolean> {\n try {\n await access(p);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Storage routing for namespaces.\n *\n * Compatibility note:\n * - When namespaces are enabled, non-default namespaces live under `memoryDir/namespaces/<ns>`.\n * - The default namespace continues to use the legacy `memoryDir` root unless the caller\n * has created `memoryDir/namespaces/<defaultNamespace>` (in which case we use that).\n *\n * This avoids surprising \"lost memories\" when an install flips namespaces on without\n * migrating existing data.\n */\nexport class NamespaceStorageRouter {\n private readonly cache = new Map<string, StorageManager>();\n private defaultNsRootResolved: string | null = null;\n\n constructor(private readonly config: PluginConfig) {}\n\n private async defaultNamespaceRoot(): Promise<string> {\n if (this.defaultNsRootResolved) return this.defaultNsRootResolved;\n if (!this.config.namespacesEnabled) {\n this.defaultNsRootResolved = this.config.memoryDir;\n return this.defaultNsRootResolved;\n }\n\n const nsDir = path.join(this.config.memoryDir, \"namespaces\", this.config.defaultNamespace);\n this.defaultNsRootResolved = (await exists(nsDir)) ? nsDir : this.config.memoryDir;\n return this.defaultNsRootResolved;\n }\n\n private namespaceRootSync(namespace: string): string {\n // NOTE: only used after defaultNamespaceRoot() resolution.\n if (!this.config.namespacesEnabled) return this.config.memoryDir;\n if (namespace === this.config.defaultNamespace) {\n return this.defaultNsRootResolved ?? this.config.memoryDir;\n }\n return path.join(this.config.memoryDir, \"namespaces\", namespace);\n }\n\n async storageFor(namespace: string): Promise<StorageManager> {\n const ns = namespace || this.config.defaultNamespace;\n if (ns !== this.config.defaultNamespace && !isSafeRouteNamespace(ns)) {\n throw new Error(`unsafe namespace: ${ns}`);\n }\n if (this.cache.has(ns)) return this.cache.get(ns)!;\n\n if (ns === this.config.defaultNamespace) {\n await this.defaultNamespaceRoot();\n }\n\n const root = this.namespaceRootSync(ns);\n const sm = new StorageManager(root, this.config.entitySchemas);\n // Propagate the inline-attribution template so that router-created storages\n // (used by extraction and shared-promotion paths) strip citations consistently,\n // matching the behaviour of the primary this.storage instance in the orchestrator.\n sm.citationTemplate = this.config.inlineSourceAttributionFormat;\n this.cache.set(ns, sm);\n return sm;\n }\n}\n","import type { PluginConfig, QmdSearchResult } from \"../types.js\";\nimport type { SearchBackend, SearchExecutionOptions, SearchQueryOptions } from \"../search/port.js\";\nimport { createSearchBackend } from \"../search/factory.js\";\n\nexport function namespaceCollectionName(\n baseCollection: string,\n namespace: string,\n options?: {\n defaultNamespace?: string;\n useLegacyDefaultCollection?: boolean;\n },\n): string {\n const trimmed = namespace.trim();\n const defaultNamespace = options?.defaultNamespace?.trim() || \"default\";\n if (\n options?.useLegacyDefaultCollection === true &&\n trimmed === defaultNamespace\n ) {\n return baseCollection;\n }\n\n const normalized = trimmed\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, \"-\");\n let start = 0;\n let end = normalized.length;\n while (start < end && normalized[start] === \"-\") start += 1;\n while (end > start && normalized[end - 1] === \"-\") end -= 1;\n const token = normalized.slice(start, end) || defaultNamespace;\n return `${baseCollection}--ns--${token}`;\n}\n\ntype StorageRouterLike = {\n storageFor(namespace: string): Promise<{ dir: string }>;\n};\n\ntype NamespaceBackendRecord = {\n backend: SearchBackend;\n collection: string;\n memoryDir: string;\n available: boolean;\n collectionState: \"present\" | \"missing\" | \"unknown\" | \"skipped\";\n};\n\nexport class NamespaceSearchRouter {\n private readonly cache = new Map<string, Promise<NamespaceBackendRecord>>();\n\n constructor(\n private readonly config: PluginConfig,\n private readonly storageRouter: StorageRouterLike,\n private readonly createBackend: (config: PluginConfig) => SearchBackend = createSearchBackend,\n ) {}\n\n async collectionForNamespace(namespace: string): Promise<string> {\n return (await this.backendRecordFor(namespace)).collection;\n }\n\n async searchAcrossNamespaces(options: {\n query: string;\n namespaces: string[];\n maxResults?: number;\n mode?: \"search\" | \"hybrid\" | \"bm25\" | \"vector\";\n searchOptions?: SearchQueryOptions;\n execution?: SearchExecutionOptions;\n }): Promise<QmdSearchResult[]> {\n const query = options.query.trim();\n if (!query) return [];\n const maxResults = Math.max(0, Math.floor(options.maxResults ?? this.config.qmdMaxResults));\n if (maxResults === 0) return [];\n\n const method = options.mode ?? \"search\";\n const namespaces = Array.from(new Set(options.namespaces.map((value) => value.trim()).filter(Boolean)));\n if (namespaces.length === 0) return [];\n\n const resultsByNamespace = await Promise.all(\n namespaces.map(async (namespace) => {\n const record = await this.backendRecordFor(namespace);\n if (!record.available || record.collectionState === \"missing\") return [] as QmdSearchResult[];\n switch (method) {\n case \"hybrid\":\n return await record.backend.hybridSearch(query, undefined, maxResults, options.execution);\n case \"bm25\":\n return await record.backend.bm25Search(query, undefined, maxResults, options.execution);\n case \"vector\":\n return await record.backend.vectorSearch(query, undefined, maxResults, options.execution);\n default:\n return await record.backend.search(\n query,\n undefined,\n maxResults,\n options.searchOptions,\n options.execution,\n );\n }\n }),\n );\n\n return mergeNamespaceSearchResults(resultsByNamespace, maxResults);\n }\n\n /**\n * Update all namespace backends.\n * Returns the number of backends for which an update was attempted\n * (i.e., available and collection present). Callers can treat 0 as a\n * signal that no backend was eligible — useful for success-verification in\n * startup-sync when namespacesEnabled is true.\n */\n async updateNamespaces(\n namespaces: string[],\n execution?: SearchExecutionOptions,\n ): Promise<number> {\n const unique = Array.from(new Set(namespaces.map((value) => value.trim()).filter(Boolean)));\n const eligible = (await Promise.all(\n unique.map(async (namespace) => {\n const record = await this.backendRecordFor(namespace);\n return record.available && record.collectionState !== \"missing\"\n ? record\n : null;\n }),\n )).filter((record): record is NamespaceBackendRecord => record !== null);\n\n const globalRecord = eligible.find((record) => record.backend.updatesAllCollections?.() === true);\n const scopedRecords = globalRecord\n ? eligible.filter((record) => record.backend.updatesAllCollections?.() !== true)\n : eligible;\n\n await Promise.all([\n globalRecord ? globalRecord.backend.update(execution) : Promise.resolve(),\n ...scopedRecords.map((record) => record.backend.update(execution)),\n ]);\n\n return (globalRecord ? 1 : 0) + scopedRecords.length;\n }\n\n async embedNamespaces(namespaces: string[]): Promise<void> {\n const unique = Array.from(new Set(namespaces.map((value) => value.trim()).filter(Boolean)));\n await Promise.all(\n unique.map(async (namespace) => {\n const record = await this.backendRecordFor(namespace);\n if (!record.available || record.collectionState === \"missing\") return;\n await record.backend.embed();\n }),\n );\n }\n\n async ensureNamespaceCollection(namespace: string): Promise<\"present\" | \"missing\" | \"unknown\" | \"skipped\"> {\n const record = await this.backendRecordFor(namespace);\n return record.collectionState;\n }\n\n /** Clear cached backend records so the next access re-probes availability. */\n clearCache(): void {\n this.cache.clear();\n }\n\n private async backendRecordFor(namespace: string): Promise<NamespaceBackendRecord> {\n const key = namespace.trim() || this.config.defaultNamespace;\n const existing = this.cache.get(key);\n if (existing) return await existing;\n\n const pending = (async (): Promise<NamespaceBackendRecord> => {\n const storage = await this.storageRouter.storageFor(key);\n const useLegacyDefaultCollection =\n key === this.config.defaultNamespace && storage.dir === this.config.memoryDir;\n const scopedConfig: PluginConfig = {\n ...this.config,\n memoryDir: storage.dir,\n qmdCollection: namespaceCollectionName(this.config.qmdCollection, key, {\n defaultNamespace: this.config.defaultNamespace,\n useLegacyDefaultCollection,\n }),\n };\n\n const backend = this.createBackend(scopedConfig);\n const available = await backend.probe().catch(() => false);\n const collectionState = available\n ? await backend.ensureCollection(storage.dir).catch(() => \"unknown\" as const)\n : \"unknown\";\n return {\n backend,\n collection: scopedConfig.qmdCollection,\n memoryDir: storage.dir,\n available,\n collectionState,\n };\n })();\n\n this.cache.set(key, pending);\n return await pending;\n }\n}\n\nfunction mergeNamespaceSearchResults(\n lists: QmdSearchResult[][],\n maxResults: number,\n): QmdSearchResult[] {\n const merged = new Map<string, QmdSearchResult>();\n\n for (const list of lists) {\n for (const result of list) {\n const key = result.path || result.docid;\n const existing = merged.get(key);\n if (!existing) {\n merged.set(key, result);\n continue;\n }\n if (result.score > existing.score) {\n merged.set(key, {\n ...result,\n snippet: existing.snippet || result.snippet || \"\",\n });\n }\n }\n }\n\n return [...merged.values()]\n .sort((a, b) => b.score - a.score)\n .slice(0, maxResults);\n}\n"],"mappings":"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","names":["vec","results","path","readdir","readFile","readFile","path","readdir","mkdir","writeFile","path","path","mkdir","writeFile","path","path","path","path","path","path"]}
@@ -1,150 +0,0 @@
1
- import {
2
- isDirectAnswerEligible
3
- } from "./chunk-Y4FHOFJ2.js";
4
- import {
5
- throwIfAborted
6
- } from "./chunk-PVGDJXVK.js";
7
- import {
8
- normalizeRecallTokens
9
- } from "./chunk-DT5TVLJE.js";
10
-
11
- // src/taxonomy/resolver.ts
12
- var DEFAULT_CATEGORY_ID = "facts";
13
- function resolveCategory(content, memoryCategory, taxonomy) {
14
- const contentLower = content.toLowerCase();
15
- const matches = taxonomy.categories.filter(
16
- (cat) => cat.memoryCategories.includes(memoryCategory)
17
- );
18
- if (matches.length === 0) {
19
- const fallback = taxonomy.categories.find((c) => c.id === DEFAULT_CATEGORY_ID) ?? taxonomy.categories[0];
20
- if (!fallback) {
21
- return {
22
- categoryId: DEFAULT_CATEGORY_ID,
23
- confidence: 0,
24
- reason: "Taxonomy is empty; using default category",
25
- alternatives: []
26
- };
27
- }
28
- const alternatives2 = taxonomy.categories.filter((c) => c.id !== fallback.id).map((c) => ({
29
- categoryId: c.id,
30
- reason: c.description
31
- }));
32
- return {
33
- categoryId: fallback.id,
34
- confidence: 0.3,
35
- reason: `No taxonomy category maps to MemoryCategory "${memoryCategory}"; falling back to "${fallback.name}"`,
36
- alternatives: alternatives2
37
- };
38
- }
39
- if (matches.length === 1) {
40
- const match = matches[0];
41
- const alternatives2 = taxonomy.categories.filter((c) => c.id !== match.id).map((c) => ({
42
- categoryId: c.id,
43
- reason: c.description
44
- }));
45
- return {
46
- categoryId: match.id,
47
- confidence: 1,
48
- reason: `Unique match: MemoryCategory "${memoryCategory}" maps to "${match.name}"`,
49
- alternatives: alternatives2
50
- };
51
- }
52
- const scored = matches.map((cat) => ({
53
- cat,
54
- keywordScore: computeKeywordScore(contentLower, cat)
55
- }));
56
- scored.sort((a, b) => {
57
- if (b.keywordScore !== a.keywordScore) return b.keywordScore - a.keywordScore;
58
- return a.cat.priority - b.cat.priority;
59
- });
60
- const best = scored[0];
61
- const runnerUp = scored[1];
62
- const confidence = best.keywordScore > 0 && (!runnerUp || best.keywordScore > runnerUp.keywordScore) ? 0.9 : 0.7;
63
- const alternatives = taxonomy.categories.filter((c) => c.id !== best.cat.id).map((c) => ({
64
- categoryId: c.id,
65
- reason: c.description
66
- }));
67
- const reason = best.keywordScore > 0 ? `Filing rules for "${best.cat.name}" matched content keywords (priority ${best.cat.priority})` : `Priority tie-break: "${best.cat.name}" has lowest priority number (${best.cat.priority})`;
68
- return {
69
- categoryId: best.cat.id,
70
- confidence,
71
- reason,
72
- alternatives
73
- };
74
- }
75
- function computeKeywordScore(contentLower, cat) {
76
- let score = 0;
77
- const ruleText = [...cat.filingRules, cat.description].join(" ").toLowerCase();
78
- const keywords = ruleText.split(/[^a-z0-9]+/).filter((w) => w.length >= 3);
79
- for (const kw of keywords) {
80
- if (contentLower.includes(kw)) {
81
- score += 1;
82
- }
83
- }
84
- return score;
85
- }
86
-
87
- // src/direct-answer-wiring.ts
88
- async function tryDirectAnswer(input) {
89
- const { query, namespace, config, sources, queryEntityRefs, abortSignal } = input;
90
- const eligibilityConfig = {
91
- enabled: config.recallDirectAnswerEnabled,
92
- tokenOverlapFloor: config.recallDirectAnswerTokenOverlapFloor,
93
- importanceFloor: config.recallDirectAnswerImportanceFloor,
94
- ambiguityMargin: config.recallDirectAnswerAmbiguityMargin,
95
- eligibleTaxonomyBuckets: config.recallDirectAnswerEligibleTaxonomyBuckets
96
- };
97
- if (!eligibilityConfig.enabled) {
98
- return isDirectAnswerEligible({
99
- query,
100
- candidates: [],
101
- config: eligibilityConfig,
102
- queryEntityRefs
103
- });
104
- }
105
- if (normalizeRecallTokens(query).length === 0) {
106
- return isDirectAnswerEligible({
107
- query,
108
- candidates: [],
109
- config: eligibilityConfig,
110
- queryEntityRefs
111
- });
112
- }
113
- throwIfAborted(abortSignal, "direct-answer wiring aborted");
114
- const memories = await sources.listCandidateMemories({ namespace, abortSignal });
115
- throwIfAborted(abortSignal, "direct-answer wiring aborted");
116
- const candidates = [];
117
- for (const memory of memories) {
118
- throwIfAborted(abortSignal, "direct-answer wiring aborted");
119
- const trustZone = await sources.trustZoneFor(memory.frontmatter.id);
120
- throwIfAborted(abortSignal, "direct-answer wiring aborted");
121
- if (trustZone !== "trusted") continue;
122
- const decision = resolveCategory(
123
- memory.content,
124
- memory.frontmatter.category,
125
- sources.taxonomy
126
- );
127
- const taxonomyBucket = decision.categoryId;
128
- if (!eligibilityConfig.eligibleTaxonomyBuckets.includes(taxonomyBucket)) continue;
129
- const importanceScore = sources.importanceFor(memory);
130
- candidates.push({
131
- memory,
132
- trustZone,
133
- taxonomyBucket,
134
- importanceScore
135
- });
136
- }
137
- throwIfAborted(abortSignal, "direct-answer wiring aborted");
138
- return isDirectAnswerEligible({
139
- query,
140
- candidates,
141
- config: eligibilityConfig,
142
- queryEntityRefs
143
- });
144
- }
145
-
146
- export {
147
- resolveCategory,
148
- tryDirectAnswer
149
- };
150
- //# sourceMappingURL=chunk-6AUUAZEX.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/taxonomy/resolver.ts","../src/direct-answer-wiring.ts"],"sourcesContent":["/**\n * Resolver decision tree for the MECE taxonomy.\n *\n * Given extracted content and its MemoryCategory, determines which\n * taxonomy category the knowledge should be filed under.\n */\n\nimport type { MemoryCategory } from \"../types.js\";\nimport type { ResolverDecision, Taxonomy, TaxonomyCategory } from \"./types.js\";\n\nconst DEFAULT_CATEGORY_ID = \"facts\";\n\n/**\n * Resolve a piece of content to a taxonomy category.\n *\n * Algorithm:\n * 1. Find all taxonomy categories whose `memoryCategories` include\n * the given `memoryCategory`.\n * 2. If exactly one match, return it with confidence 1.0.\n * 3. If multiple matches, pick the one with the lowest priority\n * number (highest precedence). Apply keyword heuristics from\n * filing rules as a secondary signal.\n * 4. If no match, fall back to the \"facts\" category (or first\n * category if \"facts\" is absent) with low confidence.\n * 5. Always populate `alternatives` with other plausible categories.\n */\nexport function resolveCategory(\n content: string,\n memoryCategory: MemoryCategory,\n taxonomy: Taxonomy,\n): ResolverDecision {\n const contentLower = content.toLowerCase();\n\n // Step 1: find matching categories\n const matches = taxonomy.categories.filter((cat) =>\n cat.memoryCategories.includes(memoryCategory),\n );\n\n if (matches.length === 0) {\n // No taxonomy category accepts this MemoryCategory — fall back\n const fallback =\n taxonomy.categories.find((c) => c.id === DEFAULT_CATEGORY_ID) ??\n taxonomy.categories[0];\n if (!fallback) {\n return {\n categoryId: DEFAULT_CATEGORY_ID,\n confidence: 0,\n reason: \"Taxonomy is empty; using default category\",\n alternatives: [],\n };\n }\n const alternatives = taxonomy.categories\n .filter((c) => c.id !== fallback.id)\n .map((c) => ({\n categoryId: c.id,\n reason: c.description,\n }));\n return {\n categoryId: fallback.id,\n confidence: 0.3,\n reason: `No taxonomy category maps to MemoryCategory \"${memoryCategory}\"; falling back to \"${fallback.name}\"`,\n alternatives,\n };\n }\n\n if (matches.length === 1) {\n const match = matches[0]!;\n const alternatives = taxonomy.categories\n .filter((c) => c.id !== match.id)\n .map((c) => ({\n categoryId: c.id,\n reason: c.description,\n }));\n return {\n categoryId: match.id,\n confidence: 1.0,\n reason: `Unique match: MemoryCategory \"${memoryCategory}\" maps to \"${match.name}\"`,\n alternatives,\n };\n }\n\n // Multiple matches — use filing rule keyword heuristics + priority\n const scored = matches.map((cat) => ({\n cat,\n keywordScore: computeKeywordScore(contentLower, cat),\n }));\n\n // Sort by keyword score descending, then priority ascending (lower wins)\n scored.sort((a, b) => {\n if (b.keywordScore !== a.keywordScore) return b.keywordScore - a.keywordScore;\n return a.cat.priority - b.cat.priority;\n });\n\n const best = scored[0]!;\n const runnerUp = scored[1];\n\n // Confidence is higher when keyword match clearly differentiates\n const confidence =\n best.keywordScore > 0 && (!runnerUp || best.keywordScore > runnerUp.keywordScore)\n ? 0.9\n : 0.7;\n\n const alternatives = taxonomy.categories\n .filter((c) => c.id !== best.cat.id)\n .map((c) => ({\n categoryId: c.id,\n reason: c.description,\n }));\n\n const reason =\n best.keywordScore > 0\n ? `Filing rules for \"${best.cat.name}\" matched content keywords (priority ${best.cat.priority})`\n : `Priority tie-break: \"${best.cat.name}\" has lowest priority number (${best.cat.priority})`;\n\n return {\n categoryId: best.cat.id,\n confidence,\n reason,\n alternatives,\n };\n}\n\n/**\n * Compute a simple keyword overlap score between content and\n * a category's filing rules + description.\n */\nfunction computeKeywordScore(contentLower: string, cat: TaxonomyCategory): number {\n let score = 0;\n const ruleText = [...cat.filingRules, cat.description]\n .join(\" \")\n .toLowerCase();\n\n // Extract meaningful words (3+ chars) from the rule text\n const keywords = ruleText\n .split(/[^a-z0-9]+/)\n .filter((w) => w.length >= 3);\n\n for (const kw of keywords) {\n if (contentLower.includes(kw)) {\n score += 1;\n }\n }\n return score;\n}\n","/**\n * Direct-answer wiring (issue #518 slice 3).\n *\n * Binds the pure eligibility decision (`direct-answer.ts`) to the data\n * sources needed to build candidates: storage, trust-zones, taxonomy,\n * and importance scoring. Kept as a separate module so that:\n *\n * - The eligibility layer stays pure and unit-testable without stores.\n * - Each caller injects its own source accessors. The orchestrator\n * binding is a follow-on slice; tests here use mock sources.\n * - The wiring is safe to ship alone — nothing calls `tryDirectAnswer`\n * yet, so enabling this module's presence does not change recall\n * behavior. The next slice adds exactly one call site before QMD.\n *\n * Short-circuit contract:\n *\n * - When `config.recallDirectAnswerEnabled === false`, the function\n * returns the eligibility verdict with reason `\"disabled\"` without\n * touching any source accessor. This is the documented default.\n * - When enabled, the wiring cheaply drops non-trusted-zone memories\n * and ineligible taxonomy buckets before computing importance, so\n * the eligibility module sees a pre-filtered candidate set. The\n * eligibility module still performs the same checks itself — this\n * module is purely an I/O and prefiltering layer.\n */\n\nimport type { MemoryFile, PluginConfig } from \"./types.js\";\nimport type { TrustZoneName } from \"./trust-zones.js\";\nimport type { Taxonomy } from \"./taxonomy/types.js\";\nimport { resolveCategory } from \"./taxonomy/resolver.js\";\nimport { normalizeRecallTokens } from \"./recall-tokenization.js\";\nimport { throwIfAborted } from \"./abort-error.js\";\nimport {\n isDirectAnswerEligible,\n type DirectAnswerCandidate,\n type DirectAnswerConfig,\n type DirectAnswerResult,\n} from \"./direct-answer.js\";\n\n/**\n * Caller-provided accessors for candidate sourcing. Decouples the\n * wiring from any specific storage / trust-zone / importance backend.\n */\nexport interface DirectAnswerSources {\n /**\n * List memories eligible to be considered for direct-answer.\n * Callers are expected to return only active, non-superseded memories\n * in the requested namespace; the wiring will cheaply re-filter on\n * trust zone and taxonomy bucket and hand the rest to the eligibility\n * module, which applies the full gate ladder.\n */\n listCandidateMemories(options: {\n namespace: string;\n abortSignal?: AbortSignal;\n }): Promise<MemoryFile[]>;\n /**\n * Resolve the trust-zone record for a memory. Returns `null` when\n * the memory has no trust-zone record (treated as not trusted).\n */\n trustZoneFor(memoryId: string): Promise<TrustZoneName | null>;\n /**\n * Resolve a calibrated importance score in [0, 1] for a memory.\n */\n importanceFor(memory: MemoryFile): number;\n /**\n * Taxonomy used to classify memories into direct-answer buckets.\n */\n taxonomy: Taxonomy;\n}\n\nexport interface DirectAnswerWiringInput {\n query: string;\n namespace: string;\n config: Pick<\n PluginConfig,\n | \"recallDirectAnswerEnabled\"\n | \"recallDirectAnswerTokenOverlapFloor\"\n | \"recallDirectAnswerImportanceFloor\"\n | \"recallDirectAnswerAmbiguityMargin\"\n | \"recallDirectAnswerEligibleTaxonomyBuckets\"\n >;\n sources: DirectAnswerSources;\n queryEntityRefs?: string[];\n abortSignal?: AbortSignal;\n}\n\n/**\n * Attempt direct-answer resolution. Returns the eligibility verdict\n * produced by `isDirectAnswerEligible` with candidates materialized\n * from the caller-supplied sources.\n */\nexport async function tryDirectAnswer(\n input: DirectAnswerWiringInput,\n): Promise<DirectAnswerResult> {\n const { query, namespace, config, sources, queryEntityRefs, abortSignal } = input;\n\n const eligibilityConfig: DirectAnswerConfig = {\n enabled: config.recallDirectAnswerEnabled,\n tokenOverlapFloor: config.recallDirectAnswerTokenOverlapFloor,\n importanceFloor: config.recallDirectAnswerImportanceFloor,\n ambiguityMargin: config.recallDirectAnswerAmbiguityMargin,\n eligibleTaxonomyBuckets: config.recallDirectAnswerEligibleTaxonomyBuckets,\n };\n\n // Short-circuit disabled case before touching any I/O.\n if (!eligibilityConfig.enabled) {\n return isDirectAnswerEligible({\n query,\n candidates: [],\n config: eligibilityConfig,\n queryEntityRefs,\n });\n }\n\n // Short-circuit empty-query case before any I/O. isDirectAnswerEligible\n // deterministically returns reason \"empty-query\" when the query\n // normalizes to zero searchable tokens; there's no point materializing\n // candidates just to reach the same verdict, and doing so would\n // surface avoidable upstream errors for requests that should exit\n // immediately.\n if (normalizeRecallTokens(query).length === 0) {\n return isDirectAnswerEligible({\n query,\n candidates: [],\n config: eligibilityConfig,\n queryEntityRefs,\n });\n }\n\n throwIfAborted(abortSignal, \"direct-answer wiring aborted\");\n const memories = await sources.listCandidateMemories({ namespace, abortSignal });\n throwIfAborted(abortSignal, \"direct-answer wiring aborted\");\n const candidates: DirectAnswerCandidate[] = [];\n\n for (const memory of memories) {\n // Throw rather than returning a partial verdict — a mid-loop abort\n // that left competing candidates unprocessed could otherwise surface\n // a spurious \"eligible\" result that the ambiguity gate never got a\n // chance to reject. The check repeats after every await so an\n // abort that lands during the in-flight I/O on the final memory\n // (after which no further iteration would exist) still stops us.\n throwIfAborted(abortSignal, \"direct-answer wiring aborted\");\n\n const trustZone = await sources.trustZoneFor(memory.frontmatter.id);\n throwIfAborted(abortSignal, \"direct-answer wiring aborted\");\n\n // Cheap pre-filter: non-trusted memories can't qualify, so skip\n // taxonomy and importance resolution for them.\n if (trustZone !== \"trusted\") continue;\n\n const decision = resolveCategory(\n memory.content,\n memory.frontmatter.category,\n sources.taxonomy,\n );\n const taxonomyBucket = decision.categoryId;\n if (!eligibilityConfig.eligibleTaxonomyBuckets.includes(taxonomyBucket)) continue;\n\n const importanceScore = sources.importanceFor(memory);\n\n candidates.push({\n memory,\n trustZone,\n taxonomyBucket,\n importanceScore,\n });\n }\n\n // Final check — if abort landed during the trust-zone await for the\n // last memory, the loop condition no longer fires. Guard before we\n // hand candidates to the eligibility gate.\n throwIfAborted(abortSignal, \"direct-answer wiring aborted\");\n\n return isDirectAnswerEligible({\n query,\n candidates,\n config: eligibilityConfig,\n queryEntityRefs,\n });\n}\n"],"mappings":"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","names":["alternatives"]}