agentdb 3.0.0-alpha.8 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (718) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +248 -269
  3. package/dist/schemas/frontier-schema.sql +7 -0
  4. package/dist/schemas/schema.sql +7 -0
  5. package/dist/src/backends/VectorBackend.d.ts +48 -6
  6. package/dist/src/backends/VectorBackend.d.ts.map +1 -1
  7. package/dist/src/backends/VectorBackend.js +13 -1
  8. package/dist/src/backends/VectorBackend.js.map +1 -1
  9. package/dist/src/backends/detector.js.map +1 -1
  10. package/dist/src/backends/factory.d.ts +16 -33
  11. package/dist/src/backends/factory.d.ts.map +1 -1
  12. package/dist/src/backends/factory.js +140 -110
  13. package/dist/src/backends/factory.js.map +1 -1
  14. package/dist/src/backends/graph/GraphDatabaseAdapter.d.ts +54 -6
  15. package/dist/src/backends/graph/GraphDatabaseAdapter.d.ts.map +1 -1
  16. package/dist/src/backends/graph/GraphDatabaseAdapter.js +143 -6
  17. package/dist/src/backends/graph/GraphDatabaseAdapter.js.map +1 -1
  18. package/dist/src/backends/hnswlib/HNSWLibBackend.d.ts.map +1 -1
  19. package/dist/src/backends/hnswlib/HNSWLibBackend.js +35 -8
  20. package/dist/src/backends/hnswlib/HNSWLibBackend.js.map +1 -1
  21. package/dist/src/backends/index.d.ts +2 -1
  22. package/dist/src/backends/index.d.ts.map +1 -1
  23. package/dist/src/backends/index.js +2 -0
  24. package/dist/src/backends/index.js.map +1 -1
  25. package/dist/src/backends/ruvector/RuVectorBackend.d.ts +256 -45
  26. package/dist/src/backends/ruvector/RuVectorBackend.d.ts.map +1 -1
  27. package/dist/src/backends/ruvector/RuVectorBackend.js +764 -290
  28. package/dist/src/backends/ruvector/RuVectorBackend.js.map +1 -1
  29. package/dist/src/backends/ruvector/RuVectorLearning.d.ts +0 -4
  30. package/dist/src/backends/ruvector/RuVectorLearning.d.ts.map +1 -1
  31. package/dist/src/backends/ruvector/RuVectorLearning.js +0 -6
  32. package/dist/src/backends/ruvector/RuVectorLearning.js.map +1 -1
  33. package/dist/src/backends/rvf/AdaptiveIndexTuner.d.ts +175 -0
  34. package/dist/src/backends/rvf/AdaptiveIndexTuner.d.ts.map +1 -0
  35. package/dist/src/backends/rvf/AdaptiveIndexTuner.js +567 -0
  36. package/dist/src/backends/rvf/AdaptiveIndexTuner.js.map +1 -0
  37. package/dist/src/backends/rvf/ContrastiveTrainer.d.ts +148 -0
  38. package/dist/src/backends/rvf/ContrastiveTrainer.d.ts.map +1 -0
  39. package/dist/src/backends/rvf/ContrastiveTrainer.js +438 -0
  40. package/dist/src/backends/rvf/ContrastiveTrainer.js.map +1 -0
  41. package/dist/src/backends/rvf/FederatedSessionManager.d.ts +212 -0
  42. package/dist/src/backends/rvf/FederatedSessionManager.d.ts.map +1 -0
  43. package/dist/src/backends/rvf/FederatedSessionManager.js +397 -0
  44. package/dist/src/backends/rvf/FederatedSessionManager.js.map +1 -0
  45. package/dist/src/backends/rvf/FilterBuilder.d.ts +136 -0
  46. package/dist/src/backends/rvf/FilterBuilder.d.ts.map +1 -0
  47. package/dist/src/backends/rvf/FilterBuilder.js +157 -0
  48. package/dist/src/backends/rvf/FilterBuilder.js.map +1 -0
  49. package/dist/src/backends/rvf/NativeAccelerator.d.ts +158 -0
  50. package/dist/src/backends/rvf/NativeAccelerator.d.ts.map +1 -0
  51. package/dist/src/backends/rvf/NativeAccelerator.js +702 -0
  52. package/dist/src/backends/rvf/NativeAccelerator.js.map +1 -0
  53. package/dist/src/backends/rvf/RvfBackend.d.ts +207 -0
  54. package/dist/src/backends/rvf/RvfBackend.d.ts.map +1 -0
  55. package/dist/src/backends/rvf/RvfBackend.js +651 -0
  56. package/dist/src/backends/rvf/RvfBackend.js.map +1 -0
  57. package/dist/src/backends/rvf/RvfSolver.d.ts +175 -0
  58. package/dist/src/backends/rvf/RvfSolver.d.ts.map +1 -0
  59. package/dist/src/backends/rvf/RvfSolver.js +176 -0
  60. package/dist/src/backends/rvf/RvfSolver.js.map +1 -0
  61. package/dist/src/backends/rvf/SelfLearningRvfBackend.d.ts +143 -0
  62. package/dist/src/backends/rvf/SelfLearningRvfBackend.d.ts.map +1 -0
  63. package/dist/src/backends/rvf/SelfLearningRvfBackend.js +612 -0
  64. package/dist/src/backends/rvf/SelfLearningRvfBackend.js.map +1 -0
  65. package/dist/src/backends/rvf/SemanticQueryRouter.d.ts +128 -0
  66. package/dist/src/backends/rvf/SemanticQueryRouter.d.ts.map +1 -0
  67. package/dist/src/backends/rvf/SemanticQueryRouter.js +415 -0
  68. package/dist/src/backends/rvf/SemanticQueryRouter.js.map +1 -0
  69. package/dist/src/backends/rvf/SimdFallbacks.d.ts +25 -0
  70. package/dist/src/backends/rvf/SimdFallbacks.d.ts.map +1 -0
  71. package/dist/src/backends/rvf/SimdFallbacks.js +287 -0
  72. package/dist/src/backends/rvf/SimdFallbacks.js.map +1 -0
  73. package/dist/src/backends/rvf/SolverBandit.d.ts +100 -0
  74. package/dist/src/backends/rvf/SolverBandit.d.ts.map +1 -0
  75. package/dist/src/backends/rvf/SolverBandit.js +216 -0
  76. package/dist/src/backends/rvf/SolverBandit.js.map +1 -0
  77. package/dist/src/backends/rvf/SonaLearningBackend.d.ts +157 -0
  78. package/dist/src/backends/rvf/SonaLearningBackend.d.ts.map +1 -0
  79. package/dist/src/backends/rvf/SonaLearningBackend.js +283 -0
  80. package/dist/src/backends/rvf/SonaLearningBackend.js.map +1 -0
  81. package/dist/src/backends/rvf/SqlJsRvfBackend.d.ts +104 -0
  82. package/dist/src/backends/rvf/SqlJsRvfBackend.d.ts.map +1 -0
  83. package/dist/src/backends/rvf/SqlJsRvfBackend.js +464 -0
  84. package/dist/src/backends/rvf/SqlJsRvfBackend.js.map +1 -0
  85. package/dist/src/backends/rvf/WasmStoreBridge.d.ts +27 -0
  86. package/dist/src/backends/rvf/WasmStoreBridge.d.ts.map +1 -0
  87. package/dist/src/backends/rvf/WasmStoreBridge.js +87 -0
  88. package/dist/src/backends/rvf/WasmStoreBridge.js.map +1 -0
  89. package/dist/src/backends/rvf/validation.d.ts +20 -0
  90. package/dist/src/backends/rvf/validation.d.ts.map +1 -0
  91. package/dist/src/backends/rvf/validation.js +78 -0
  92. package/dist/src/backends/rvf/validation.js.map +1 -0
  93. package/dist/src/benchmark/BenchmarkSuite.d.ts +318 -0
  94. package/dist/src/benchmark/BenchmarkSuite.d.ts.map +1 -0
  95. package/dist/src/benchmark/BenchmarkSuite.js +984 -0
  96. package/dist/src/benchmark/BenchmarkSuite.js.map +1 -0
  97. package/dist/src/benchmark/index.d.ts +29 -0
  98. package/dist/src/benchmark/index.d.ts.map +1 -0
  99. package/dist/src/benchmark/index.js +39 -0
  100. package/dist/src/benchmark/index.js.map +1 -0
  101. package/dist/src/browser/AttentionBrowser.d.ts.map +1 -1
  102. package/dist/src/browser/AttentionBrowser.js +1 -0
  103. package/dist/src/browser/AttentionBrowser.js.map +1 -1
  104. package/dist/src/cli/agentdb-cli.d.ts +14 -0
  105. package/dist/src/cli/agentdb-cli.d.ts.map +1 -1
  106. package/dist/src/cli/agentdb-cli.js +839 -143
  107. package/dist/src/cli/agentdb-cli.js.map +1 -1
  108. package/dist/src/cli/commands/attention.js +12 -2
  109. package/dist/src/cli/commands/attention.js.map +1 -1
  110. package/dist/src/cli/commands/doctor.js +5 -5
  111. package/dist/src/cli/commands/doctor.js.map +1 -1
  112. package/dist/src/cli/commands/hyperbolic.d.ts +11 -0
  113. package/dist/src/cli/commands/hyperbolic.d.ts.map +1 -0
  114. package/dist/src/cli/commands/hyperbolic.js +440 -0
  115. package/dist/src/cli/commands/hyperbolic.js.map +1 -0
  116. package/dist/src/cli/commands/install-embeddings.d.ts +1 -1
  117. package/dist/src/cli/commands/install-embeddings.d.ts.map +1 -1
  118. package/dist/src/cli/commands/install-embeddings.js +17 -11
  119. package/dist/src/cli/commands/install-embeddings.js.map +1 -1
  120. package/dist/src/cli/commands/learn.d.ts +11 -0
  121. package/dist/src/cli/commands/learn.d.ts.map +1 -0
  122. package/dist/src/cli/commands/learn.js +410 -0
  123. package/dist/src/cli/commands/learn.js.map +1 -0
  124. package/dist/src/cli/commands/migrate.d.ts +15 -0
  125. package/dist/src/cli/commands/migrate.d.ts.map +1 -1
  126. package/dist/src/cli/commands/migrate.js +190 -10
  127. package/dist/src/cli/commands/migrate.js.map +1 -1
  128. package/dist/src/cli/commands/route.d.ts +11 -0
  129. package/dist/src/cli/commands/route.d.ts.map +1 -0
  130. package/dist/src/cli/commands/route.js +419 -0
  131. package/dist/src/cli/commands/route.js.map +1 -0
  132. package/dist/src/cli/commands/rvf.d.ts +21 -0
  133. package/dist/src/cli/commands/rvf.d.ts.map +1 -0
  134. package/dist/src/cli/commands/rvf.js +448 -0
  135. package/dist/src/cli/commands/rvf.js.map +1 -0
  136. package/dist/src/cli/commands/simulate-report.js +14 -2
  137. package/dist/src/cli/commands/simulate-report.js.map +1 -1
  138. package/dist/src/cli/lib/report-store.d.ts +2 -1
  139. package/dist/src/cli/lib/report-store.d.ts.map +1 -1
  140. package/dist/src/cli/lib/report-store.js +85 -65
  141. package/dist/src/cli/lib/report-store.js.map +1 -1
  142. package/dist/src/cli/lib/simulation-runner.d.ts +40 -3
  143. package/dist/src/cli/lib/simulation-runner.d.ts.map +1 -1
  144. package/dist/src/cli/lib/simulation-runner.js +248 -6
  145. package/dist/src/cli/lib/simulation-runner.js.map +1 -1
  146. package/dist/src/compatibility/DeprecationWarnings.d.ts +54 -0
  147. package/dist/src/compatibility/DeprecationWarnings.d.ts.map +1 -0
  148. package/dist/src/compatibility/DeprecationWarnings.js +131 -0
  149. package/dist/src/compatibility/DeprecationWarnings.js.map +1 -0
  150. package/dist/src/compatibility/MigrationUtilities.d.ts +30 -0
  151. package/dist/src/compatibility/MigrationUtilities.d.ts.map +1 -0
  152. package/dist/src/compatibility/MigrationUtilities.js +184 -0
  153. package/dist/src/compatibility/MigrationUtilities.js.map +1 -0
  154. package/dist/src/compatibility/V1toV2Adapter.d.ts +76 -0
  155. package/dist/src/compatibility/V1toV2Adapter.d.ts.map +1 -0
  156. package/dist/src/compatibility/V1toV2Adapter.js +185 -0
  157. package/dist/src/compatibility/V1toV2Adapter.js.map +1 -0
  158. package/dist/src/compatibility/VersionDetector.d.ts +32 -0
  159. package/dist/src/compatibility/VersionDetector.d.ts.map +1 -0
  160. package/dist/src/compatibility/VersionDetector.js +144 -0
  161. package/dist/src/compatibility/VersionDetector.js.map +1 -0
  162. package/dist/src/compatibility/index.d.ts +14 -0
  163. package/dist/src/compatibility/index.d.ts.map +1 -0
  164. package/dist/src/compatibility/index.js +21 -0
  165. package/dist/src/compatibility/index.js.map +1 -0
  166. package/dist/src/compatibility/types.d.ts +103 -0
  167. package/dist/src/compatibility/types.d.ts.map +1 -0
  168. package/dist/src/compatibility/types.js +5 -0
  169. package/dist/src/compatibility/types.js.map +1 -0
  170. package/dist/src/controllers/AttentionService.d.ts +99 -202
  171. package/dist/src/controllers/AttentionService.d.ts.map +1 -1
  172. package/dist/src/controllers/AttentionService.js +450 -558
  173. package/dist/src/controllers/AttentionService.js.map +1 -1
  174. package/dist/src/controllers/CausalMemoryGraph.d.ts +30 -5
  175. package/dist/src/controllers/CausalMemoryGraph.d.ts.map +1 -1
  176. package/dist/src/controllers/CausalMemoryGraph.js +92 -15
  177. package/dist/src/controllers/CausalMemoryGraph.js.map +1 -1
  178. package/dist/src/controllers/CausalRecall.d.ts +4 -0
  179. package/dist/src/controllers/CausalRecall.d.ts.map +1 -1
  180. package/dist/src/controllers/CausalRecall.js +23 -5
  181. package/dist/src/controllers/CausalRecall.js.map +1 -1
  182. package/dist/src/controllers/EmbeddingService.d.ts +29 -0
  183. package/dist/src/controllers/EmbeddingService.d.ts.map +1 -1
  184. package/dist/src/controllers/EmbeddingService.js +154 -32
  185. package/dist/src/controllers/EmbeddingService.js.map +1 -1
  186. package/dist/src/controllers/EnhancedEmbeddingService.d.ts +4 -0
  187. package/dist/src/controllers/EnhancedEmbeddingService.d.ts.map +1 -1
  188. package/dist/src/controllers/EnhancedEmbeddingService.js +21 -7
  189. package/dist/src/controllers/EnhancedEmbeddingService.js.map +1 -1
  190. package/dist/src/controllers/ExplainableRecall.d.ts +1 -1
  191. package/dist/src/controllers/ExplainableRecall.d.ts.map +1 -1
  192. package/dist/src/controllers/ExplainableRecall.js +1 -1
  193. package/dist/src/controllers/ExplainableRecall.js.map +1 -1
  194. package/dist/src/controllers/HNSWIndex.d.ts +20 -2
  195. package/dist/src/controllers/HNSWIndex.d.ts.map +1 -1
  196. package/dist/src/controllers/HNSWIndex.js +114 -39
  197. package/dist/src/controllers/HNSWIndex.js.map +1 -1
  198. package/dist/src/controllers/LearningSystem.d.ts +6 -17
  199. package/dist/src/controllers/LearningSystem.d.ts.map +1 -1
  200. package/dist/src/controllers/LearningSystem.js +66 -155
  201. package/dist/src/controllers/LearningSystem.js.map +1 -1
  202. package/dist/src/controllers/MemoryController.d.ts +174 -0
  203. package/dist/src/controllers/MemoryController.d.ts.map +1 -0
  204. package/dist/src/controllers/MemoryController.js +320 -0
  205. package/dist/src/controllers/MemoryController.js.map +1 -0
  206. package/dist/src/controllers/MetadataFilter.d.ts.map +1 -1
  207. package/dist/src/controllers/MetadataFilter.js +38 -26
  208. package/dist/src/controllers/MetadataFilter.js.map +1 -1
  209. package/dist/src/controllers/MincutService.d.ts +92 -0
  210. package/dist/src/controllers/MincutService.d.ts.map +1 -0
  211. package/dist/src/controllers/MincutService.js +336 -0
  212. package/dist/src/controllers/MincutService.js.map +1 -0
  213. package/dist/src/controllers/NightlyLearner.d.ts +5 -1
  214. package/dist/src/controllers/NightlyLearner.d.ts.map +1 -1
  215. package/dist/src/controllers/NightlyLearner.js +45 -31
  216. package/dist/src/controllers/NightlyLearner.js.map +1 -1
  217. package/dist/src/controllers/QUICClient.d.ts +45 -0
  218. package/dist/src/controllers/QUICClient.d.ts.map +1 -1
  219. package/dist/src/controllers/QUICClient.js +211 -21
  220. package/dist/src/controllers/QUICClient.js.map +1 -1
  221. package/dist/src/controllers/QUICServer.d.ts.map +1 -1
  222. package/dist/src/controllers/QUICServer.js +36 -27
  223. package/dist/src/controllers/QUICServer.js.map +1 -1
  224. package/dist/src/controllers/ReasoningBank.d.ts +6 -3
  225. package/dist/src/controllers/ReasoningBank.d.ts.map +1 -1
  226. package/dist/src/controllers/ReasoningBank.js +77 -56
  227. package/dist/src/controllers/ReasoningBank.js.map +1 -1
  228. package/dist/src/controllers/ReflexionMemory.d.ts +129 -6
  229. package/dist/src/controllers/ReflexionMemory.d.ts.map +1 -1
  230. package/dist/src/controllers/ReflexionMemory.js +678 -220
  231. package/dist/src/controllers/ReflexionMemory.js.map +1 -1
  232. package/dist/src/controllers/SkillLibrary.d.ts +32 -3
  233. package/dist/src/controllers/SkillLibrary.d.ts.map +1 -1
  234. package/dist/src/controllers/SkillLibrary.js +239 -104
  235. package/dist/src/controllers/SkillLibrary.js.map +1 -1
  236. package/dist/src/controllers/SparsificationService.d.ts +151 -0
  237. package/dist/src/controllers/SparsificationService.d.ts.map +1 -0
  238. package/dist/src/controllers/SparsificationService.js +375 -0
  239. package/dist/src/controllers/SparsificationService.js.map +1 -0
  240. package/dist/src/controllers/SyncCoordinator.d.ts.map +1 -1
  241. package/dist/src/controllers/SyncCoordinator.js +126 -12
  242. package/dist/src/controllers/SyncCoordinator.js.map +1 -1
  243. package/dist/src/controllers/WASMVectorSearch.d.ts +12 -30
  244. package/dist/src/controllers/WASMVectorSearch.d.ts.map +1 -1
  245. package/dist/src/controllers/WASMVectorSearch.js +161 -102
  246. package/dist/src/controllers/WASMVectorSearch.js.map +1 -1
  247. package/dist/src/controllers/attention/AttentionCache.d.ts +38 -0
  248. package/dist/src/controllers/attention/AttentionCache.d.ts.map +1 -0
  249. package/dist/src/controllers/attention/AttentionCache.js +80 -0
  250. package/dist/src/controllers/attention/AttentionCache.js.map +1 -0
  251. package/dist/src/controllers/attention/AttentionConfig.d.ts +127 -0
  252. package/dist/src/controllers/attention/AttentionConfig.d.ts.map +1 -0
  253. package/dist/src/controllers/attention/AttentionConfig.js +124 -0
  254. package/dist/src/controllers/attention/AttentionConfig.js.map +1 -0
  255. package/dist/src/controllers/attention/AttentionCore.d.ts +89 -0
  256. package/dist/src/controllers/attention/AttentionCore.d.ts.map +1 -0
  257. package/dist/src/controllers/attention/AttentionCore.js +289 -0
  258. package/dist/src/controllers/attention/AttentionCore.js.map +1 -0
  259. package/dist/src/controllers/attention/AttentionHelpers.d.ts +55 -0
  260. package/dist/src/controllers/attention/AttentionHelpers.d.ts.map +1 -0
  261. package/dist/src/controllers/attention/AttentionHelpers.js +148 -0
  262. package/dist/src/controllers/attention/AttentionHelpers.js.map +1 -0
  263. package/dist/src/controllers/attention/AttentionMetrics.d.ts +55 -0
  264. package/dist/src/controllers/attention/AttentionMetrics.d.ts.map +1 -0
  265. package/dist/src/controllers/attention/AttentionMetrics.js +72 -0
  266. package/dist/src/controllers/attention/AttentionMetrics.js.map +1 -0
  267. package/dist/src/controllers/attention/AttentionWASM.d.ts +98 -0
  268. package/dist/src/controllers/attention/AttentionWASM.d.ts.map +1 -0
  269. package/dist/src/controllers/attention/AttentionWASM.js +147 -0
  270. package/dist/src/controllers/attention/AttentionWASM.js.map +1 -0
  271. package/dist/src/controllers/attention/CrossAttentionController.d.ts +141 -0
  272. package/dist/src/controllers/attention/CrossAttentionController.d.ts.map +1 -0
  273. package/dist/src/controllers/attention/CrossAttentionController.js +325 -0
  274. package/dist/src/controllers/attention/CrossAttentionController.js.map +1 -0
  275. package/dist/src/controllers/attention/MultiHeadAttentionController.d.ts +137 -0
  276. package/dist/src/controllers/attention/MultiHeadAttentionController.d.ts.map +1 -0
  277. package/dist/src/controllers/attention/MultiHeadAttentionController.js +336 -0
  278. package/dist/src/controllers/attention/MultiHeadAttentionController.js.map +1 -0
  279. package/dist/src/controllers/attention/SelfAttentionController.d.ts +117 -0
  280. package/dist/src/controllers/attention/SelfAttentionController.d.ts.map +1 -0
  281. package/dist/src/controllers/attention/SelfAttentionController.js +205 -0
  282. package/dist/src/controllers/attention/SelfAttentionController.js.map +1 -0
  283. package/dist/src/controllers/attention/index.d.ts +24 -0
  284. package/dist/src/controllers/attention/index.d.ts.map +1 -0
  285. package/dist/src/controllers/attention/index.js +20 -0
  286. package/dist/src/controllers/attention/index.js.map +1 -0
  287. package/dist/src/controllers/index.d.ts +15 -28
  288. package/dist/src/controllers/index.d.ts.map +1 -1
  289. package/dist/src/controllers/index.js +11 -19
  290. package/dist/src/controllers/index.js.map +1 -1
  291. package/dist/src/controllers/prerequisites.d.ts +76 -0
  292. package/dist/src/controllers/prerequisites.d.ts.map +1 -0
  293. package/dist/src/controllers/prerequisites.js +235 -0
  294. package/dist/src/controllers/prerequisites.js.map +1 -0
  295. package/dist/src/core/AgentDB.d.ts +33 -19
  296. package/dist/src/core/AgentDB.d.ts.map +1 -1
  297. package/dist/src/core/AgentDB.js +87 -127
  298. package/dist/src/core/AgentDB.js.map +1 -1
  299. package/dist/src/core/QueryCache.d.ts +138 -0
  300. package/dist/src/core/QueryCache.d.ts.map +1 -0
  301. package/dist/src/core/QueryCache.js +309 -0
  302. package/dist/src/core/QueryCache.js.map +1 -0
  303. package/dist/src/db-fallback.d.ts +52 -4
  304. package/dist/src/db-fallback.d.ts.map +1 -1
  305. package/dist/src/db-fallback.js +521 -71
  306. package/dist/src/db-fallback.js.map +1 -1
  307. package/dist/src/db-unified.d.ts.map +1 -1
  308. package/dist/src/db-unified.js +32 -30
  309. package/dist/src/db-unified.js.map +1 -1
  310. package/dist/src/embedding/EmbeddingSpaceIdentity.d.ts +58 -0
  311. package/dist/src/embedding/EmbeddingSpaceIdentity.d.ts.map +1 -0
  312. package/dist/src/embedding/EmbeddingSpaceIdentity.js +137 -0
  313. package/dist/src/embedding/EmbeddingSpaceIdentity.js.map +1 -0
  314. package/dist/src/embedding/index.d.ts +3 -0
  315. package/dist/src/embedding/index.d.ts.map +1 -0
  316. package/dist/src/embedding/index.js +2 -0
  317. package/dist/src/embedding/index.js.map +1 -0
  318. package/dist/src/examples/quic-sync-example.js +2 -2
  319. package/dist/src/examples/quic-sync-example.js.map +1 -1
  320. package/dist/src/governance/MetaHarnessGateway.d.ts +55 -0
  321. package/dist/src/governance/MetaHarnessGateway.d.ts.map +1 -0
  322. package/dist/src/governance/MetaHarnessGateway.js +65 -0
  323. package/dist/src/governance/MetaHarnessGateway.js.map +1 -0
  324. package/dist/src/governance/RvfExperimentBranch.d.ts +65 -0
  325. package/dist/src/governance/RvfExperimentBranch.d.ts.map +1 -0
  326. package/dist/src/governance/RvfExperimentBranch.js +115 -0
  327. package/dist/src/governance/RvfExperimentBranch.js.map +1 -0
  328. package/dist/src/index.d.ts +20 -16
  329. package/dist/src/index.d.ts.map +1 -1
  330. package/dist/src/index.js +44 -12
  331. package/dist/src/index.js.map +1 -1
  332. package/dist/src/mcp/agentdb-mcp-server.js +178 -15
  333. package/dist/src/mcp/agentdb-mcp-server.js.map +1 -1
  334. package/dist/src/mcp/reset-database.d.ts +15 -0
  335. package/dist/src/mcp/reset-database.d.ts.map +1 -0
  336. package/dist/src/mcp/reset-database.js +45 -0
  337. package/dist/src/mcp/reset-database.js.map +1 -0
  338. package/dist/src/model/ModelCacheLoader.d.ts +31 -0
  339. package/dist/src/model/ModelCacheLoader.d.ts.map +1 -0
  340. package/dist/src/model/ModelCacheLoader.js +209 -0
  341. package/dist/src/model/ModelCacheLoader.js.map +1 -0
  342. package/dist/src/observability/index.d.ts +8 -0
  343. package/dist/src/observability/index.d.ts.map +1 -0
  344. package/dist/src/observability/index.js +8 -0
  345. package/dist/src/observability/index.js.map +1 -0
  346. package/dist/src/observability/integration.d.ts +32 -0
  347. package/dist/src/observability/integration.d.ts.map +1 -0
  348. package/dist/src/observability/integration.js +159 -0
  349. package/dist/src/observability/integration.js.map +1 -0
  350. package/dist/src/observability/telemetry.d.ts +137 -0
  351. package/dist/src/observability/telemetry.d.ts.map +1 -0
  352. package/dist/src/observability/telemetry.js +424 -0
  353. package/dist/src/observability/telemetry.js.map +1 -0
  354. package/dist/src/optimizations/BatchOperations.d.ts +47 -0
  355. package/dist/src/optimizations/BatchOperations.d.ts.map +1 -1
  356. package/dist/src/optimizations/BatchOperations.js +189 -35
  357. package/dist/src/optimizations/BatchOperations.js.map +1 -1
  358. package/dist/src/optimizations/Quantization.d.ts +330 -0
  359. package/dist/src/optimizations/Quantization.d.ts.map +1 -0
  360. package/dist/src/optimizations/Quantization.js +793 -0
  361. package/dist/src/optimizations/Quantization.js.map +1 -0
  362. package/dist/src/optimizations/index.d.ts +1 -3
  363. package/dist/src/optimizations/index.d.ts.map +1 -1
  364. package/dist/src/optimizations/index.js +0 -1
  365. package/dist/src/optimizations/index.js.map +1 -1
  366. package/dist/src/quantization/index.d.ts +7 -0
  367. package/dist/src/quantization/index.d.ts.map +1 -0
  368. package/dist/src/quantization/index.js +15 -0
  369. package/dist/src/quantization/index.js.map +1 -0
  370. package/dist/src/quantization/vector-quantization.d.ts +388 -0
  371. package/dist/src/quantization/vector-quantization.d.ts.map +1 -0
  372. package/dist/src/quantization/vector-quantization.js +1132 -0
  373. package/dist/src/quantization/vector-quantization.js.map +1 -0
  374. package/dist/src/schemas/inline.d.ts +3 -0
  375. package/dist/src/schemas/inline.d.ts.map +1 -0
  376. package/dist/src/schemas/inline.js +10 -0
  377. package/dist/src/schemas/inline.js.map +1 -0
  378. package/dist/src/search/HybridSearch.d.ts +311 -0
  379. package/dist/src/search/HybridSearch.d.ts.map +1 -0
  380. package/dist/src/search/HybridSearch.js +713 -0
  381. package/dist/src/search/HybridSearch.js.map +1 -0
  382. package/dist/src/search/index.d.ts +12 -0
  383. package/dist/src/search/index.d.ts.map +1 -0
  384. package/dist/src/search/index.js +16 -0
  385. package/dist/src/search/index.js.map +1 -0
  386. package/dist/src/security/input-validation.d.ts +30 -0
  387. package/dist/src/security/input-validation.d.ts.map +1 -1
  388. package/dist/src/security/input-validation.js +77 -3
  389. package/dist/src/security/input-validation.js.map +1 -1
  390. package/dist/src/security/limits.d.ts.map +1 -1
  391. package/dist/src/security/limits.js +12 -3
  392. package/dist/src/security/limits.js.map +1 -1
  393. package/dist/src/security/mcp-policy.d.ts +17 -0
  394. package/dist/src/security/mcp-policy.d.ts.map +1 -0
  395. package/dist/src/security/mcp-policy.js +90 -0
  396. package/dist/src/security/mcp-policy.js.map +1 -0
  397. package/dist/src/security/path-security.d.ts.map +1 -1
  398. package/dist/src/security/path-security.js +3 -1
  399. package/dist/src/security/path-security.js.map +1 -1
  400. package/dist/src/security/validation.js +3 -3
  401. package/dist/src/security/validation.js.map +1 -1
  402. package/dist/src/services/AttentionService.d.ts +303 -0
  403. package/dist/src/services/AttentionService.d.ts.map +1 -0
  404. package/dist/src/services/AttentionService.js +1165 -0
  405. package/dist/src/services/AttentionService.js.map +1 -0
  406. package/dist/src/services/LLMRouter.d.ts +70 -8
  407. package/dist/src/services/LLMRouter.d.ts.map +1 -1
  408. package/dist/src/services/LLMRouter.js +279 -28
  409. package/dist/src/services/LLMRouter.js.map +1 -1
  410. package/dist/src/services/audit-logger.service.d.ts +168 -0
  411. package/dist/src/services/audit-logger.service.d.ts.map +1 -0
  412. package/dist/src/services/audit-logger.service.js +331 -0
  413. package/dist/src/services/audit-logger.service.js.map +1 -0
  414. package/dist/src/services/enhanced-embeddings.d.ts +271 -0
  415. package/dist/src/services/enhanced-embeddings.d.ts.map +1 -0
  416. package/dist/src/services/enhanced-embeddings.js +1036 -0
  417. package/dist/src/services/enhanced-embeddings.js.map +1 -0
  418. package/dist/src/services/federated-learning.d.ts +172 -0
  419. package/dist/src/services/federated-learning.d.ts.map +1 -0
  420. package/dist/src/services/federated-learning.js +344 -0
  421. package/dist/src/services/federated-learning.js.map +1 -0
  422. package/dist/src/simd/index.d.ts +9 -0
  423. package/dist/src/simd/index.d.ts.map +1 -0
  424. package/dist/src/simd/index.js +27 -0
  425. package/dist/src/simd/index.js.map +1 -0
  426. package/dist/src/simd/simd-vector-ops.d.ts +332 -0
  427. package/dist/src/simd/simd-vector-ops.d.ts.map +1 -0
  428. package/dist/src/simd/simd-vector-ops.js +945 -0
  429. package/dist/src/simd/simd-vector-ops.js.map +1 -0
  430. package/dist/src/types/database.types.d.ts +275 -0
  431. package/dist/src/types/database.types.d.ts.map +1 -0
  432. package/dist/src/types/database.types.js +55 -0
  433. package/dist/src/types/database.types.js.map +1 -0
  434. package/dist/src/types/graph.d.ts +29 -0
  435. package/dist/src/types/graph.d.ts.map +1 -0
  436. package/dist/src/types/graph.js +8 -0
  437. package/dist/src/types/graph.js.map +1 -0
  438. package/dist/src/utils/chalk-fallback.d.ts +3 -0
  439. package/dist/src/utils/chalk-fallback.d.ts.map +1 -0
  440. package/dist/src/utils/chalk-fallback.js +20 -0
  441. package/dist/src/utils/chalk-fallback.js.map +1 -0
  442. package/dist/src/utils/similarity.d.ts +11 -0
  443. package/dist/src/utils/similarity.d.ts.map +1 -0
  444. package/dist/src/utils/similarity.js +25 -0
  445. package/dist/src/utils/similarity.js.map +1 -0
  446. package/dist/src/wasm-loader.d.ts +66 -0
  447. package/dist/src/wasm-loader.d.ts.map +1 -0
  448. package/dist/src/wasm-loader.js +76 -0
  449. package/dist/src/wasm-loader.js.map +1 -0
  450. package/dist/src/wrappers/agentdb-fast.d.ts +140 -0
  451. package/dist/src/wrappers/agentdb-fast.d.ts.map +1 -0
  452. package/dist/src/wrappers/agentdb-fast.js +309 -0
  453. package/dist/src/wrappers/agentdb-fast.js.map +1 -0
  454. package/dist/src/wrappers/attention-fallbacks.d.ts +343 -0
  455. package/dist/src/wrappers/attention-fallbacks.d.ts.map +1 -0
  456. package/dist/src/wrappers/attention-fallbacks.js +1484 -0
  457. package/dist/src/wrappers/attention-fallbacks.js.map +1 -0
  458. package/dist/src/wrappers/attention-native.d.ts +111 -0
  459. package/dist/src/wrappers/attention-native.d.ts.map +1 -0
  460. package/dist/src/wrappers/attention-native.js +273 -0
  461. package/dist/src/wrappers/attention-native.js.map +1 -0
  462. package/dist/src/wrappers/embedding-service.d.ts +117 -0
  463. package/dist/src/wrappers/embedding-service.d.ts.map +1 -0
  464. package/dist/src/wrappers/embedding-service.js +370 -0
  465. package/dist/src/wrappers/embedding-service.js.map +1 -0
  466. package/dist/src/wrappers/gnn-wrapper.d.ts +71 -0
  467. package/dist/src/wrappers/gnn-wrapper.d.ts.map +1 -0
  468. package/dist/src/wrappers/gnn-wrapper.js +236 -0
  469. package/dist/src/wrappers/gnn-wrapper.js.map +1 -0
  470. package/dist/src/wrappers/index.d.ts +48 -0
  471. package/dist/src/wrappers/index.d.ts.map +1 -0
  472. package/dist/src/wrappers/index.js +83 -0
  473. package/dist/src/wrappers/index.js.map +1 -0
  474. package/package.json +130 -80
  475. package/scripts/postinstall.cjs +13 -144
  476. package/dist/agentdb.browser.js +0 -1685
  477. package/dist/agentdb.browser.js.map +0 -7
  478. package/dist/agentdb.browser.min.js +0 -3
  479. package/dist/agentdb.browser.min.js.map +0 -7
  480. package/dist/agentdb.wasm-loader.js +0 -207
  481. package/dist/backends/VectorBackend.d.ts +0 -120
  482. package/dist/backends/VectorBackend.js +0 -14
  483. package/dist/backends/VectorBackend.js.map +0 -1
  484. package/dist/optimizations/RVFOptimizer.d.ts +0 -225
  485. package/dist/optimizations/RVFOptimizer.js +0 -541
  486. package/dist/optimizations/RVFOptimizer.js.map +0 -1
  487. package/dist/simulation/cli.d.ts +0 -9
  488. package/dist/simulation/cli.d.ts.map +0 -1
  489. package/dist/simulation/cli.js +0 -68
  490. package/dist/simulation/cli.js.map +0 -1
  491. package/dist/simulation/runner.d.ts +0 -21
  492. package/dist/simulation/runner.d.ts.map +0 -1
  493. package/dist/simulation/runner.js +0 -241
  494. package/dist/simulation/runner.js.map +0 -1
  495. package/dist/simulation/scenarios/aidefence-integration.d.ts +0 -24
  496. package/dist/simulation/scenarios/aidefence-integration.d.ts.map +0 -1
  497. package/dist/simulation/scenarios/aidefence-integration.js +0 -124
  498. package/dist/simulation/scenarios/aidefence-integration.js.map +0 -1
  499. package/dist/simulation/scenarios/bmssp-integration.d.ts +0 -23
  500. package/dist/simulation/scenarios/bmssp-integration.d.ts.map +0 -1
  501. package/dist/simulation/scenarios/bmssp-integration.js +0 -104
  502. package/dist/simulation/scenarios/bmssp-integration.js.map +0 -1
  503. package/dist/simulation/scenarios/causal-reasoning.d.ts +0 -16
  504. package/dist/simulation/scenarios/causal-reasoning.d.ts.map +0 -1
  505. package/dist/simulation/scenarios/causal-reasoning.js +0 -108
  506. package/dist/simulation/scenarios/causal-reasoning.js.map +0 -1
  507. package/dist/simulation/scenarios/consciousness-explorer.d.ts +0 -25
  508. package/dist/simulation/scenarios/consciousness-explorer.d.ts.map +0 -1
  509. package/dist/simulation/scenarios/consciousness-explorer.js +0 -108
  510. package/dist/simulation/scenarios/consciousness-explorer.js.map +0 -1
  511. package/dist/simulation/scenarios/domain-examples/e-commerce-recommendations.d.ts +0 -135
  512. package/dist/simulation/scenarios/domain-examples/e-commerce-recommendations.d.ts.map +0 -1
  513. package/dist/simulation/scenarios/domain-examples/e-commerce-recommendations.js +0 -158
  514. package/dist/simulation/scenarios/domain-examples/e-commerce-recommendations.js.map +0 -1
  515. package/dist/simulation/scenarios/domain-examples/index.d.ts +0 -14
  516. package/dist/simulation/scenarios/domain-examples/index.d.ts.map +0 -1
  517. package/dist/simulation/scenarios/domain-examples/index.js +0 -14
  518. package/dist/simulation/scenarios/domain-examples/index.js.map +0 -1
  519. package/dist/simulation/scenarios/domain-examples/iot-sensor-networks.d.ts +0 -178
  520. package/dist/simulation/scenarios/domain-examples/iot-sensor-networks.d.ts.map +0 -1
  521. package/dist/simulation/scenarios/domain-examples/iot-sensor-networks.js +0 -218
  522. package/dist/simulation/scenarios/domain-examples/iot-sensor-networks.js.map +0 -1
  523. package/dist/simulation/scenarios/domain-examples/medical-imaging.d.ts +0 -122
  524. package/dist/simulation/scenarios/domain-examples/medical-imaging.d.ts.map +0 -1
  525. package/dist/simulation/scenarios/domain-examples/medical-imaging.js +0 -129
  526. package/dist/simulation/scenarios/domain-examples/medical-imaging.js.map +0 -1
  527. package/dist/simulation/scenarios/domain-examples/robotics-navigation.d.ts +0 -166
  528. package/dist/simulation/scenarios/domain-examples/robotics-navigation.d.ts.map +0 -1
  529. package/dist/simulation/scenarios/domain-examples/robotics-navigation.js +0 -161
  530. package/dist/simulation/scenarios/domain-examples/robotics-navigation.js.map +0 -1
  531. package/dist/simulation/scenarios/domain-examples/scientific-research.d.ts +0 -151
  532. package/dist/simulation/scenarios/domain-examples/scientific-research.d.ts.map +0 -1
  533. package/dist/simulation/scenarios/domain-examples/scientific-research.js +0 -187
  534. package/dist/simulation/scenarios/domain-examples/scientific-research.js.map +0 -1
  535. package/dist/simulation/scenarios/domain-examples/trading-systems.d.ts +0 -102
  536. package/dist/simulation/scenarios/domain-examples/trading-systems.d.ts.map +0 -1
  537. package/dist/simulation/scenarios/domain-examples/trading-systems.js +0 -100
  538. package/dist/simulation/scenarios/domain-examples/trading-systems.js.map +0 -1
  539. package/dist/simulation/scenarios/goalie-integration.d.ts +0 -24
  540. package/dist/simulation/scenarios/goalie-integration.d.ts.map +0 -1
  541. package/dist/simulation/scenarios/goalie-integration.js +0 -121
  542. package/dist/simulation/scenarios/goalie-integration.js.map +0 -1
  543. package/dist/simulation/scenarios/graph-traversal.d.ts +0 -17
  544. package/dist/simulation/scenarios/graph-traversal.d.ts.map +0 -1
  545. package/dist/simulation/scenarios/graph-traversal.js +0 -101
  546. package/dist/simulation/scenarios/graph-traversal.js.map +0 -1
  547. package/dist/simulation/scenarios/latent-space/attention-analysis.d.ts +0 -45
  548. package/dist/simulation/scenarios/latent-space/attention-analysis.d.ts.map +0 -1
  549. package/dist/simulation/scenarios/latent-space/attention-analysis.js +0 -435
  550. package/dist/simulation/scenarios/latent-space/attention-analysis.js.map +0 -1
  551. package/dist/simulation/scenarios/latent-space/clustering-analysis.d.ts +0 -55
  552. package/dist/simulation/scenarios/latent-space/clustering-analysis.d.ts.map +0 -1
  553. package/dist/simulation/scenarios/latent-space/clustering-analysis.js +0 -606
  554. package/dist/simulation/scenarios/latent-space/clustering-analysis.js.map +0 -1
  555. package/dist/simulation/scenarios/latent-space/hnsw-exploration.d.ts +0 -74
  556. package/dist/simulation/scenarios/latent-space/hnsw-exploration.d.ts.map +0 -1
  557. package/dist/simulation/scenarios/latent-space/hnsw-exploration.js +0 -391
  558. package/dist/simulation/scenarios/latent-space/hnsw-exploration.js.map +0 -1
  559. package/dist/simulation/scenarios/latent-space/hypergraph-exploration.d.ts +0 -51
  560. package/dist/simulation/scenarios/latent-space/hypergraph-exploration.d.ts.map +0 -1
  561. package/dist/simulation/scenarios/latent-space/hypergraph-exploration.js +0 -536
  562. package/dist/simulation/scenarios/latent-space/hypergraph-exploration.js.map +0 -1
  563. package/dist/simulation/scenarios/latent-space/index.d.ts +0 -35
  564. package/dist/simulation/scenarios/latent-space/index.d.ts.map +0 -1
  565. package/dist/simulation/scenarios/latent-space/index.js +0 -35
  566. package/dist/simulation/scenarios/latent-space/index.js.map +0 -1
  567. package/dist/simulation/scenarios/latent-space/neural-augmentation.d.ts +0 -52
  568. package/dist/simulation/scenarios/latent-space/neural-augmentation.d.ts.map +0 -1
  569. package/dist/simulation/scenarios/latent-space/neural-augmentation.js +0 -472
  570. package/dist/simulation/scenarios/latent-space/neural-augmentation.js.map +0 -1
  571. package/dist/simulation/scenarios/latent-space/quantum-hybrid.d.ts +0 -53
  572. package/dist/simulation/scenarios/latent-space/quantum-hybrid.d.ts.map +0 -1
  573. package/dist/simulation/scenarios/latent-space/quantum-hybrid.js +0 -391
  574. package/dist/simulation/scenarios/latent-space/quantum-hybrid.js.map +0 -1
  575. package/dist/simulation/scenarios/latent-space/self-organizing-hnsw.d.ts +0 -52
  576. package/dist/simulation/scenarios/latent-space/self-organizing-hnsw.d.ts.map +0 -1
  577. package/dist/simulation/scenarios/latent-space/self-organizing-hnsw.js +0 -514
  578. package/dist/simulation/scenarios/latent-space/self-organizing-hnsw.js.map +0 -1
  579. package/dist/simulation/scenarios/latent-space/traversal-optimization.d.ts +0 -53
  580. package/dist/simulation/scenarios/latent-space/traversal-optimization.d.ts.map +0 -1
  581. package/dist/simulation/scenarios/latent-space/traversal-optimization.js +0 -595
  582. package/dist/simulation/scenarios/latent-space/traversal-optimization.js.map +0 -1
  583. package/dist/simulation/scenarios/lean-agentic-swarm.d.ts +0 -18
  584. package/dist/simulation/scenarios/lean-agentic-swarm.d.ts.map +0 -1
  585. package/dist/simulation/scenarios/lean-agentic-swarm.js +0 -132
  586. package/dist/simulation/scenarios/lean-agentic-swarm.js.map +0 -1
  587. package/dist/simulation/scenarios/multi-agent-swarm.d.ts +0 -17
  588. package/dist/simulation/scenarios/multi-agent-swarm.d.ts.map +0 -1
  589. package/dist/simulation/scenarios/multi-agent-swarm.js +0 -111
  590. package/dist/simulation/scenarios/multi-agent-swarm.js.map +0 -1
  591. package/dist/simulation/scenarios/psycho-symbolic-reasoner.d.ts +0 -23
  592. package/dist/simulation/scenarios/psycho-symbolic-reasoner.d.ts.map +0 -1
  593. package/dist/simulation/scenarios/psycho-symbolic-reasoner.js +0 -98
  594. package/dist/simulation/scenarios/psycho-symbolic-reasoner.js.map +0 -1
  595. package/dist/simulation/scenarios/reflexion-learning.d.ts +0 -16
  596. package/dist/simulation/scenarios/reflexion-learning.d.ts.map +0 -1
  597. package/dist/simulation/scenarios/reflexion-learning.js +0 -98
  598. package/dist/simulation/scenarios/reflexion-learning.js.map +0 -1
  599. package/dist/simulation/scenarios/research-swarm.d.ts +0 -24
  600. package/dist/simulation/scenarios/research-swarm.d.ts.map +0 -1
  601. package/dist/simulation/scenarios/research-swarm.js +0 -146
  602. package/dist/simulation/scenarios/research-swarm.js.map +0 -1
  603. package/dist/simulation/scenarios/skill-evolution.d.ts +0 -16
  604. package/dist/simulation/scenarios/skill-evolution.d.ts.map +0 -1
  605. package/dist/simulation/scenarios/skill-evolution.js +0 -109
  606. package/dist/simulation/scenarios/skill-evolution.js.map +0 -1
  607. package/dist/simulation/scenarios/stock-market-emergence.d.ts +0 -33
  608. package/dist/simulation/scenarios/stock-market-emergence.d.ts.map +0 -1
  609. package/dist/simulation/scenarios/stock-market-emergence.js +0 -246
  610. package/dist/simulation/scenarios/stock-market-emergence.js.map +0 -1
  611. package/dist/simulation/scenarios/strange-loops.d.ts +0 -18
  612. package/dist/simulation/scenarios/strange-loops.d.ts.map +0 -1
  613. package/dist/simulation/scenarios/strange-loops.js +0 -133
  614. package/dist/simulation/scenarios/strange-loops.js.map +0 -1
  615. package/dist/simulation/scenarios/sublinear-solver.d.ts +0 -22
  616. package/dist/simulation/scenarios/sublinear-solver.d.ts.map +0 -1
  617. package/dist/simulation/scenarios/sublinear-solver.js +0 -82
  618. package/dist/simulation/scenarios/sublinear-solver.js.map +0 -1
  619. package/dist/simulation/scenarios/temporal-lead-solver.d.ts +0 -23
  620. package/dist/simulation/scenarios/temporal-lead-solver.d.ts.map +0 -1
  621. package/dist/simulation/scenarios/temporal-lead-solver.js +0 -90
  622. package/dist/simulation/scenarios/temporal-lead-solver.js.map +0 -1
  623. package/dist/simulation/scenarios/voting-system-consensus.d.ts +0 -27
  624. package/dist/simulation/scenarios/voting-system-consensus.d.ts.map +0 -1
  625. package/dist/simulation/scenarios/voting-system-consensus.js +0 -175
  626. package/dist/simulation/scenarios/voting-system-consensus.js.map +0 -1
  627. package/dist/simulation/types.d.ts +0 -162
  628. package/dist/simulation/types.d.ts.map +0 -1
  629. package/dist/simulation/types.js +0 -5
  630. package/dist/simulation/types.js.map +0 -1
  631. package/dist/simulation/utils/PerformanceOptimizer.d.ts +0 -115
  632. package/dist/simulation/utils/PerformanceOptimizer.d.ts.map +0 -1
  633. package/dist/simulation/utils/PerformanceOptimizer.js +0 -223
  634. package/dist/simulation/utils/PerformanceOptimizer.js.map +0 -1
  635. package/dist/src/backends/index.cjs +0 -6
  636. package/dist/src/backends/ruvector/GuardedVectorBackend.d.ts +0 -93
  637. package/dist/src/backends/ruvector/GuardedVectorBackend.d.ts.map +0 -1
  638. package/dist/src/backends/ruvector/GuardedVectorBackend.js +0 -182
  639. package/dist/src/backends/ruvector/GuardedVectorBackend.js.map +0 -1
  640. package/dist/src/consensus/RaftConsensus.d.ts +0 -220
  641. package/dist/src/consensus/RaftConsensus.d.ts.map +0 -1
  642. package/dist/src/consensus/RaftConsensus.js +0 -762
  643. package/dist/src/consensus/RaftConsensus.js.map +0 -1
  644. package/dist/src/controllers/HierarchicalMemory.d.ts +0 -197
  645. package/dist/src/controllers/HierarchicalMemory.d.ts.map +0 -1
  646. package/dist/src/controllers/HierarchicalMemory.js +0 -519
  647. package/dist/src/controllers/HierarchicalMemory.js.map +0 -1
  648. package/dist/src/controllers/MemoryConsolidation.d.ts +0 -142
  649. package/dist/src/controllers/MemoryConsolidation.d.ts.map +0 -1
  650. package/dist/src/controllers/MemoryConsolidation.js +0 -479
  651. package/dist/src/controllers/MemoryConsolidation.js.map +0 -1
  652. package/dist/src/controllers/QUICConnection.d.ts +0 -122
  653. package/dist/src/controllers/QUICConnection.d.ts.map +0 -1
  654. package/dist/src/controllers/QUICConnection.js +0 -329
  655. package/dist/src/controllers/QUICConnection.js.map +0 -1
  656. package/dist/src/controllers/QUICConnectionPool.d.ts +0 -83
  657. package/dist/src/controllers/QUICConnectionPool.d.ts.map +0 -1
  658. package/dist/src/controllers/QUICConnectionPool.js +0 -256
  659. package/dist/src/controllers/QUICConnectionPool.js.map +0 -1
  660. package/dist/src/controllers/QUICStreamManager.d.ts +0 -114
  661. package/dist/src/controllers/QUICStreamManager.d.ts.map +0 -1
  662. package/dist/src/controllers/QUICStreamManager.js +0 -267
  663. package/dist/src/controllers/QUICStreamManager.js.map +0 -1
  664. package/dist/src/controllers/StreamingEmbeddingService.d.ts +0 -82
  665. package/dist/src/controllers/StreamingEmbeddingService.d.ts.map +0 -1
  666. package/dist/src/controllers/StreamingEmbeddingService.js +0 -243
  667. package/dist/src/controllers/StreamingEmbeddingService.js.map +0 -1
  668. package/dist/src/controllers/index.cjs +0 -6
  669. package/dist/src/coordination/MultiDatabaseCoordinator.d.ts +0 -348
  670. package/dist/src/coordination/MultiDatabaseCoordinator.d.ts.map +0 -1
  671. package/dist/src/coordination/MultiDatabaseCoordinator.js +0 -803
  672. package/dist/src/coordination/MultiDatabaseCoordinator.js.map +0 -1
  673. package/dist/src/coordination/index.d.ts +0 -10
  674. package/dist/src/coordination/index.d.ts.map +0 -1
  675. package/dist/src/coordination/index.js +0 -10
  676. package/dist/src/coordination/index.js.map +0 -1
  677. package/dist/src/index.cjs +0 -6
  678. package/dist/src/optimizations/RVFOptimizer.d.ts +0 -226
  679. package/dist/src/optimizations/RVFOptimizer.d.ts.map +0 -1
  680. package/dist/src/optimizations/RVFOptimizer.js +0 -541
  681. package/dist/src/optimizations/RVFOptimizer.js.map +0 -1
  682. package/dist/src/security/AttestationLog.d.ts +0 -70
  683. package/dist/src/security/AttestationLog.d.ts.map +0 -1
  684. package/dist/src/security/AttestationLog.js +0 -174
  685. package/dist/src/security/AttestationLog.js.map +0 -1
  686. package/dist/src/security/MutationGuard.d.ts +0 -83
  687. package/dist/src/security/MutationGuard.d.ts.map +0 -1
  688. package/dist/src/security/MutationGuard.js +0 -364
  689. package/dist/src/security/MutationGuard.js.map +0 -1
  690. package/dist/src/security/index.cjs +0 -6
  691. package/dist/src/security/index.d.ts +0 -15
  692. package/dist/src/security/index.d.ts.map +0 -1
  693. package/dist/src/security/index.js +0 -18
  694. package/dist/src/security/index.js.map +0 -1
  695. package/dist/src/services/GNNService.d.ts +0 -172
  696. package/dist/src/services/GNNService.d.ts.map +0 -1
  697. package/dist/src/services/GNNService.js +0 -612
  698. package/dist/src/services/GNNService.js.map +0 -1
  699. package/dist/src/services/GraphTransformerService.d.ts +0 -80
  700. package/dist/src/services/GraphTransformerService.d.ts.map +0 -1
  701. package/dist/src/services/GraphTransformerService.js +0 -369
  702. package/dist/src/services/GraphTransformerService.js.map +0 -1
  703. package/dist/src/services/SemanticRouter.d.ts +0 -83
  704. package/dist/src/services/SemanticRouter.d.ts.map +0 -1
  705. package/dist/src/services/SemanticRouter.js +0 -160
  706. package/dist/src/services/SemanticRouter.js.map +0 -1
  707. package/dist/src/services/SonaTrajectoryService.d.ts +0 -224
  708. package/dist/src/services/SonaTrajectoryService.d.ts.map +0 -1
  709. package/dist/src/services/SonaTrajectoryService.js +0 -539
  710. package/dist/src/services/SonaTrajectoryService.js.map +0 -1
  711. package/dist/src/utils/LegacyAttentionAdapter.d.ts +0 -93
  712. package/dist/src/utils/LegacyAttentionAdapter.d.ts.map +0 -1
  713. package/dist/src/utils/LegacyAttentionAdapter.js +0 -241
  714. package/dist/src/utils/LegacyAttentionAdapter.js.map +0 -1
  715. package/dist/src/utils/vector-math.d.ts +0 -29
  716. package/dist/src/utils/vector-math.d.ts.map +0 -1
  717. package/dist/src/utils/vector-math.js +0 -66
  718. package/dist/src/utils/vector-math.js.map +0 -1
@@ -7,31 +7,71 @@
7
7
  * Based on: "Reflexion: Language Agents with Verbal Reinforcement Learning"
8
8
  * https://arxiv.org/abs/2303.11366
9
9
  */
10
+ import { normalizeRowId } from '../types/database.types.js';
11
+ import { searchVectors } from '../backends/VectorBackend.js';
10
12
  import { NodeIdMapper } from '../utils/NodeIdMapper.js';
11
- import { cosineSimilarity } from '../utils/vector-math.js';
13
+ import { QueryCache } from '../core/QueryCache.js';
14
+ function finiteNumber(value, name) {
15
+ const n = Number(value);
16
+ if (!Number.isFinite(n))
17
+ throw new Error(`${name} must be a finite number`);
18
+ return n;
19
+ }
20
+ function positiveInt(value, name) {
21
+ const n = Math.floor(finiteNumber(value, name));
22
+ if (n < 1)
23
+ throw new Error(`${name} must be a positive integer`);
24
+ return n;
25
+ }
26
+ /** Vector ids this controller writes: the bare episode row id */
27
+ const EPISODE_VECTOR_ID = /^\d+$/;
28
+ /** Parse JSON from DB row values without throwing on malformed data. */
29
+ function safeJsonParse(value, fallback) {
30
+ if (!value)
31
+ return fallback;
32
+ try {
33
+ return JSON.parse(value);
34
+ }
35
+ catch {
36
+ return fallback;
37
+ }
38
+ }
12
39
  export class ReflexionMemory {
13
40
  db;
14
41
  embedder;
15
42
  vectorBackend;
16
43
  learningBackend;
17
44
  graphBackend;
18
- constructor(db, embedder, vectorBackend, learningBackend, graphBackend) {
45
+ queryCache;
46
+ constructor(db, embedder, vectorBackend, learningBackend, graphBackend, cacheConfig) {
19
47
  this.db = db;
20
48
  this.embedder = embedder;
21
49
  this.vectorBackend = vectorBackend;
22
50
  this.learningBackend = learningBackend;
23
51
  this.graphBackend = graphBackend;
52
+ this.queryCache = new QueryCache(cacheConfig);
24
53
  }
25
54
  /**
26
55
  * Store a new episode with its critique and outcome
56
+ * Invalidates relevant cache entries
57
+ *
58
+ * Persistence guarantee (issue #128 fix):
59
+ * storeEpisode() always writes to the SQLite `episodes` and
60
+ * `episode_embeddings` tables when a SQL-capable connection is present,
61
+ * even when a graph or vector backend handles the primary index. This
62
+ * ensures data survives process restarts (graph/vector backends are
63
+ * often in-memory or rebuildable from SQL).
27
64
  */
28
65
  async storeEpisode(episode) {
66
+ // Invalidate episode caches on write
67
+ this.queryCache.invalidateCategory('episodes');
68
+ this.queryCache.invalidateCategory('task-stats');
29
69
  // Use GraphDatabaseAdapter if available (AgentDB v2)
30
70
  if (this.graphBackend && 'storeEpisode' in this.graphBackend) {
31
71
  // GraphDatabaseAdapter has specialized storeEpisode method
32
72
  const graphAdapter = this.graphBackend;
33
73
  // Generate embedding for the task
34
- const taskEmbedding = await this.embedder.embed(episode.task);
74
+ const taskEmbedding = await this.embedder.embedPassage(episode.task);
35
75
  // Create episode node using GraphDatabaseAdapter
36
76
  const nodeId = await graphAdapter.storeEpisode({
37
77
  id: episode.id ? `episode-${episode.id}` : `episode-${Date.now()}-${Math.random()}`,
@@ -44,18 +84,21 @@ export class ReflexionMemory {
44
84
  critique: episode.critique,
45
85
  createdAt: episode.ts ? episode.ts * 1000 : Date.now(),
46
86
  tokensUsed: episode.tokensUsed,
47
- latencyMs: episode.latencyMs
87
+ latencyMs: episode.latencyMs,
48
88
  }, taskEmbedding);
49
89
  // Return a numeric ID (parse from string ID)
50
90
  const numericId = parseInt(nodeId.split('-').pop() || '0', 36);
51
91
  // Register mapping for later use by CausalMemoryGraph
52
92
  NodeIdMapper.getInstance().register(numericId, nodeId);
93
+ // #128: dual-write to SQL for restart-safe persistence. Graph adapter
94
+ // index is typically in-memory; SQL is the durable record.
95
+ this.dualWriteEpisodeToSQL(episode, taskEmbedding);
53
96
  return numericId;
54
97
  }
55
98
  // Use generic GraphBackend if available
56
99
  if (this.graphBackend) {
57
100
  // Generate embedding for the task
58
- const taskEmbedding = await this.embedder.embed(episode.task);
101
+ const taskEmbedding = await this.embedder.embedPassage(episode.task);
59
102
  // Create episode node ID
60
103
  const nodeId = await this.graphBackend.createNode(['Episode'], {
61
104
  sessionId: episode.sessionId,
@@ -69,22 +112,21 @@ export class ReflexionMemory {
69
112
  tokensUsed: episode.tokensUsed || 0,
70
113
  tags: episode.tags ? JSON.stringify(episode.tags) : '[]',
71
114
  metadata: episode.metadata ? JSON.stringify(episode.metadata) : '{}',
72
- createdAt: Date.now()
115
+ createdAt: Date.now(),
73
116
  });
74
117
  // Store embedding using vectorBackend if available
75
118
  if (this.vectorBackend && taskEmbedding) {
76
- try {
77
- this.vectorBackend.insert(nodeId, taskEmbedding, {
78
- type: 'episode',
79
- sessionId: episode.sessionId
80
- });
81
- }
82
- catch { /* vectorBackend insert failed — graph node still created */ }
119
+ this.vectorBackend.insert(nodeId, taskEmbedding, {
120
+ type: 'episode',
121
+ sessionId: episode.sessionId,
122
+ });
83
123
  }
84
124
  // Return a numeric ID (parse from string ID)
85
125
  const numericId = parseInt(nodeId.split('-').pop() || '0', 36);
86
126
  // Register mapping for later use by CausalMemoryGraph
87
127
  NodeIdMapper.getInstance().register(numericId, nodeId);
128
+ // #128: dual-write to SQL for restart-safe persistence.
129
+ this.dualWriteEpisodeToSQL(episode, taskEmbedding);
88
130
  return numericId;
89
131
  }
90
132
  // Fallback to SQLite (v1 compatibility)
@@ -97,16 +139,13 @@ export class ReflexionMemory {
97
139
  const tags = episode.tags ? JSON.stringify(episode.tags) : null;
98
140
  const metadata = episode.metadata ? JSON.stringify(episode.metadata) : null;
99
141
  const result = stmt.run(episode.sessionId, episode.task, episode.input || null, episode.output || null, episode.critique || null, episode.reward, episode.success ? 1 : 0, episode.latencyMs || null, episode.tokensUsed || null, tags, metadata);
100
- const episodeId = result.lastInsertRowid;
142
+ const episodeId = normalizeRowId(result.lastInsertRowid);
101
143
  // Generate and store embedding
102
144
  const text = this.buildEpisodeText(episode);
103
- const embedding = await this.embedder.embed(text);
145
+ const embedding = await this.embedder.embedPassage(text);
104
146
  // Use vector backend if available (150x faster retrieval)
105
147
  if (this.vectorBackend) {
106
- try {
107
- this.vectorBackend.insert(episodeId.toString(), embedding);
108
- }
109
- catch { /* vectorBackend insert failed — SQL fallback used */ }
148
+ this.vectorBackend.insert(episodeId.toString(), embedding);
110
149
  }
111
150
  // Also store in SQL for fallback
112
151
  this.storeEmbedding(episodeId, embedding);
@@ -124,155 +163,206 @@ export class ReflexionMemory {
124
163
  task: episode.task,
125
164
  sessionId: episode.sessionId,
126
165
  latencyMs: episode.latencyMs,
127
- tokensUsed: episode.tokensUsed
128
- }
166
+ tokensUsed: episode.tokensUsed,
167
+ },
129
168
  });
130
169
  }
131
170
  return episodeId;
132
171
  }
133
172
  /**
134
173
  * Retrieve relevant past episodes for a new task attempt
174
+ * Results are cached for improved performance
135
175
  */
136
176
  async retrieveRelevant(query) {
137
- const { task, currentState = '', k = 5, minReward, onlyFailures = false, onlySuccesses = false, timeWindowDays } = query;
138
- // Generate query embedding
177
+ const { task, currentState = '', k = 5, minReward, onlyFailures = false, onlySuccesses = false, timeWindowDays, } = query;
178
+ // Check cache first
179
+ const cacheKey = this.queryCache.generateKey('retrieveRelevant', [task, currentState, k, minReward, onlyFailures, onlySuccesses, timeWindowDays], 'episodes');
180
+ const cached = this.queryCache.get(cacheKey);
181
+ if (cached) {
182
+ return cached;
183
+ }
184
+ // Generate and enhance query embedding
185
+ const queryEmbedding = await this.prepareQueryEmbedding(task, currentState, k);
186
+ // Try different retrieval strategies in order of preference
187
+ let episodes = [];
188
+ if (this.graphBackend && 'searchSimilarEpisodes' in this.graphBackend) {
189
+ episodes = await this.retrieveFromGraphAdapter(queryEmbedding, query);
190
+ }
191
+ else if (this.graphBackend && 'execute' in this.graphBackend) {
192
+ episodes = await this.retrieveFromGenericGraph(query);
193
+ }
194
+ else if (this.vectorBackend) {
195
+ episodes = await this.retrieveFromVectorBackend(queryEmbedding, query);
196
+ }
197
+ else {
198
+ episodes = await this.retrieveFromSQLFallback(queryEmbedding, query);
199
+ }
200
+ // Cache and return results
201
+ this.queryCache.set(cacheKey, episodes);
202
+ return episodes;
203
+ }
204
+ /**
205
+ * Prepare and enhance query embedding for search
206
+ */
207
+ async prepareQueryEmbedding(task, currentState, k) {
139
208
  const queryText = currentState ? `${task}\n${currentState}` : task;
140
- let queryEmbedding = await this.embedder.embed(queryText);
209
+ let queryEmbedding = await this.embedder.embedQuery(queryText);
141
210
  // Enhance query with GNN if learning backend available
142
211
  if (this.learningBackend) {
143
212
  queryEmbedding = await this.enhanceQueryWithGNN(queryEmbedding, k);
144
213
  }
145
- // Use GraphDatabaseAdapter if available (AgentDB v2)
146
- if (this.graphBackend && 'searchSimilarEpisodes' in this.graphBackend) {
147
- const graphAdapter = this.graphBackend;
148
- // Search using vector similarity
149
- const results = await graphAdapter.searchSimilarEpisodes(queryEmbedding, k * 3);
150
- // Apply filters
151
- const filtered = results.filter((ep) => {
152
- if (minReward !== undefined && ep.reward < minReward)
153
- return false;
154
- if (onlyFailures && ep.success)
155
- return false;
156
- if (onlySuccesses && !ep.success)
157
- return false;
158
- if (timeWindowDays && ep.createdAt < (Date.now() - timeWindowDays * 86400000))
159
- return false;
160
- return true;
161
- });
162
- // Convert to EpisodeWithEmbedding format
163
- const episodes = filtered.slice(0, k).map((ep) => ({
164
- id: parseInt(ep.id.split('-').pop() || '0', 36),
165
- sessionId: ep.sessionId,
166
- task: ep.task,
167
- input: ep.input,
168
- output: ep.output,
169
- critique: ep.critique,
170
- reward: ep.reward,
171
- success: ep.success,
172
- latencyMs: ep.latencyMs,
173
- tokensUsed: ep.tokensUsed,
174
- ts: Math.floor(ep.createdAt / 1000)
175
- }));
176
- return episodes;
177
- }
178
- // Use generic GraphBackend if available
179
- if (this.graphBackend && 'execute' in this.graphBackend) {
180
- // Build Cypher query with filters
181
- let cypherQuery = 'MATCH (e:Episode) WHERE 1=1';
182
- if (minReward !== undefined) {
183
- cypherQuery += ` AND e.reward >= ${minReward}`;
184
- }
185
- if (onlyFailures) {
186
- cypherQuery += ` AND e.success = false`;
187
- }
188
- if (onlySuccesses) {
189
- cypherQuery += ` AND e.success = true`;
190
- }
191
- if (timeWindowDays) {
192
- const cutoff = Date.now() - timeWindowDays * 86400000;
193
- cypherQuery += ` AND e.createdAt >= ${cutoff}`;
214
+ return queryEmbedding;
215
+ }
216
+ /**
217
+ * Retrieve episodes using GraphDatabaseAdapter (AgentDB v2)
218
+ */
219
+ async retrieveFromGraphAdapter(queryEmbedding, query) {
220
+ const { k = 5, minReward, onlyFailures, onlySuccesses, timeWindowDays } = query;
221
+ const graphAdapter = this.graphBackend;
222
+ // Search using vector similarity
223
+ const results = await graphAdapter.searchSimilarEpisodes(queryEmbedding, k * 3);
224
+ // Apply filters
225
+ const filtered = this.applyEpisodeFilters(results, {
226
+ minReward,
227
+ onlyFailures,
228
+ onlySuccesses,
229
+ timeWindowDays,
230
+ });
231
+ // Convert to EpisodeWithEmbedding format
232
+ return filtered.slice(0, k).map((ep) => this.convertGraphEpisode(ep));
233
+ }
234
+ /**
235
+ * Retrieve episodes using generic GraphBackend
236
+ */
237
+ async retrieveFromGenericGraph(query) {
238
+ const { k = 5 } = query;
239
+ const cypherQuery = this.buildCypherQuery(query);
240
+ const result = await this.graphBackend.execute(cypherQuery);
241
+ // Convert to EpisodeWithEmbedding format
242
+ const episodes = result.rows.map((row) => this.convertCypherEpisode(row.e));
243
+ return episodes.slice(0, k);
244
+ }
245
+ /**
246
+ * Retrieve episodes using VectorBackend (150x faster)
247
+ */
248
+ async retrieveFromVectorBackend(queryEmbedding, query) {
249
+ const { k = 5, minReward, onlyFailures, onlySuccesses, timeWindowDays } = query;
250
+ // Get candidates from vector backend
251
+ const searchResults = await searchVectors(this.vectorBackend, queryEmbedding, k * 3, {
252
+ threshold: 0.0,
253
+ });
254
+ // The vector backend may be shared with other controllers ("skill:N",
255
+ // "causal-edge:N"); episode vectors use the bare numeric row id.
256
+ const episodeResults = searchResults.filter((r) => EPISODE_VECTOR_ID.test(r.id));
257
+ const episodeIds = episodeResults.map((r) => Number(r.id));
258
+ if (episodeIds.length === 0) {
259
+ // No usable hits although episodes exist (empty or crowded-out index):
260
+ // answer from the SQL embeddings instead of returning nothing.
261
+ if (this.db.prepare('SELECT 1 FROM episode_embeddings LIMIT 1').get()) {
262
+ return this.retrieveFromSQLFallback(queryEmbedding, query);
194
263
  }
195
- cypherQuery += ` RETURN e LIMIT ${k * 3}`;
196
- const result = await this.graphBackend.execute(cypherQuery);
197
- // Convert to EpisodeWithEmbedding format
198
- const episodes = result.rows.map((row) => {
199
- const node = row.e;
200
- return {
201
- id: parseInt(node.id.split('-').pop() || '0', 36),
202
- sessionId: node.properties.sessionId,
203
- task: node.properties.task,
204
- input: node.properties.input,
205
- output: node.properties.output,
206
- critique: node.properties.critique,
207
- reward: typeof node.properties.reward === 'string' ? parseFloat(node.properties.reward) : node.properties.reward,
208
- success: typeof node.properties.success === 'string' ? node.properties.success === 'true' : node.properties.success,
209
- latencyMs: node.properties.latencyMs,
210
- tokensUsed: node.properties.tokensUsed,
211
- tags: node.properties.tags ? JSON.parse(node.properties.tags) : [],
212
- metadata: node.properties.metadata ? JSON.parse(node.properties.metadata) : {},
213
- ts: Math.floor(node.properties.createdAt / 1000)
214
- };
215
- });
216
- return episodes.slice(0, k);
264
+ return [];
217
265
  }
218
- // Use optimized vector backend if available (150x faster)
219
- if (this.vectorBackend) {
220
- try {
221
- // Get candidates from vector backend
222
- const searchResults = this.vectorBackend.search(queryEmbedding, k * 3, {
223
- threshold: 0.0
224
- });
225
- // Fetch full episode data from DB
226
- const episodeIds = searchResults.map(r => parseInt(r.id));
227
- if (episodeIds.length === 0) {
228
- return [];
229
- }
230
- const placeholders = episodeIds.map(() => '?').join(',');
231
- const stmt = this.db.prepare(`
232
- SELECT * FROM episodes
233
- WHERE id IN (${placeholders})
234
- `);
235
- const rows = stmt.all(...episodeIds);
236
- const episodeMap = new Map(rows.map(r => [r.id.toString(), r]));
237
- // Map results back with similarity scores and apply filters
238
- const episodes = [];
239
- for (const result of searchResults) {
240
- const row = episodeMap.get(result.id);
241
- if (!row)
242
- continue;
243
- // Apply additional filters
244
- if (minReward !== undefined && row.reward < minReward)
245
- continue;
246
- if (onlyFailures && row.success === 1)
247
- continue;
248
- if (onlySuccesses && row.success === 0)
249
- continue;
250
- if (timeWindowDays && row.ts < (Date.now() / 1000 - timeWindowDays * 86400))
251
- continue;
252
- episodes.push({
253
- id: row.id,
254
- ts: row.ts,
255
- sessionId: row.session_id,
256
- task: row.task,
257
- input: row.input,
258
- output: row.output,
259
- critique: row.critique,
260
- reward: row.reward,
261
- success: row.success === 1,
262
- latencyMs: row.latency_ms,
263
- tokensUsed: row.tokens_used,
264
- tags: row.tags ? JSON.parse(row.tags) : undefined,
265
- metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
266
- similarity: result.similarity
267
- });
268
- if (episodes.length >= k)
269
- break;
270
- }
271
- return episodes;
266
+ const rows = this.fetchEpisodesByIds(episodeIds);
267
+ const episodeMap = new Map(rows.map((r) => [r.id.toString(), r]));
268
+ // Map results with similarity scores and apply filters
269
+ const episodes = [];
270
+ for (const result of episodeResults) {
271
+ const row = episodeMap.get(result.id);
272
+ if (!row)
273
+ continue;
274
+ // Apply filters
275
+ if (!this.passesEpisodeFilters(row, { minReward, onlyFailures, onlySuccesses, timeWindowDays })) {
276
+ continue;
272
277
  }
273
- catch { /* vectorBackend search failed — fall through to SQL */ }
278
+ episodes.push(this.convertDatabaseEpisode(row, result.similarity));
279
+ if (episodes.length >= k)
280
+ break;
274
281
  }
275
- // Fallback to SQL-based similarity search
282
+ return episodes;
283
+ }
284
+ /**
285
+ * Retrieve episodes using SQL-based similarity search (fallback)
286
+ */
287
+ async retrieveFromSQLFallback(queryEmbedding, query) {
288
+ const { k = 5 } = query;
289
+ const { whereClause, params } = this.buildSQLFilters(query);
290
+ const stmt = this.db.prepare(`
291
+ SELECT e.*, ee.embedding
292
+ FROM episodes e
293
+ JOIN episode_embeddings ee ON e.id = ee.episode_id
294
+ ${whereClause}
295
+ ORDER BY e.reward DESC
296
+ `);
297
+ const rows = stmt.all(...params);
298
+ // Calculate similarities and convert
299
+ const episodes = rows.map((row) => {
300
+ const embedding = this.deserializeEmbedding(row.embedding);
301
+ const similarity = this.cosineSimilarity(queryEmbedding, embedding);
302
+ return this.convertDatabaseEpisode(row, similarity, embedding);
303
+ });
304
+ // Sort by similarity and return top-k
305
+ episodes.sort((a, b) => (b.similarity || 0) - (a.similarity || 0));
306
+ return episodes.slice(0, k);
307
+ }
308
+ /**
309
+ * Apply episode filters to search results
310
+ */
311
+ applyEpisodeFilters(episodes, filters) {
312
+ return episodes.filter((ep) => {
313
+ if (filters.minReward !== undefined && ep.reward < filters.minReward)
314
+ return false;
315
+ if (filters.onlyFailures && ep.success)
316
+ return false;
317
+ if (filters.onlySuccesses && !ep.success)
318
+ return false;
319
+ if (filters.timeWindowDays && ep.createdAt < Date.now() - filters.timeWindowDays * 86400000)
320
+ return false;
321
+ return true;
322
+ });
323
+ }
324
+ /**
325
+ * Check if database row passes episode filters
326
+ */
327
+ passesEpisodeFilters(row, filters) {
328
+ if (filters.minReward !== undefined && row.reward < filters.minReward)
329
+ return false;
330
+ if (filters.onlyFailures && row.success === 1)
331
+ return false;
332
+ if (filters.onlySuccesses && row.success === 0)
333
+ return false;
334
+ if (filters.timeWindowDays && row.ts < Date.now() / 1000 - filters.timeWindowDays * 86400)
335
+ return false;
336
+ return true;
337
+ }
338
+ /**
339
+ * Build Cypher query with filters
340
+ */
341
+ buildCypherQuery(query) {
342
+ const { k = 5, minReward, onlyFailures, onlySuccesses, timeWindowDays } = query;
343
+ let cypherQuery = 'MATCH (e:Episode) WHERE 1=1';
344
+ // Values are spliced into Cypher text, so only finite numbers get through
345
+ if (minReward !== undefined) {
346
+ cypherQuery += ` AND e.reward >= ${finiteNumber(minReward, 'minReward')}`;
347
+ }
348
+ if (onlyFailures) {
349
+ cypherQuery += ` AND e.success = false`;
350
+ }
351
+ if (onlySuccesses) {
352
+ cypherQuery += ` AND e.success = true`;
353
+ }
354
+ if (timeWindowDays) {
355
+ const cutoff = Date.now() - finiteNumber(timeWindowDays, 'timeWindowDays') * 86400000;
356
+ cypherQuery += ` AND e.createdAt >= ${cutoff}`;
357
+ }
358
+ cypherQuery += ` RETURN e LIMIT ${positiveInt(k, 'k') * 3}`;
359
+ return cypherQuery;
360
+ }
361
+ /**
362
+ * Build SQL WHERE clause and parameters for filters
363
+ */
364
+ buildSQLFilters(query) {
365
+ const { minReward, onlyFailures, onlySuccesses, timeWindowDays } = query;
276
366
  const filters = [];
277
367
  const params = [];
278
368
  if (minReward !== undefined) {
@@ -290,46 +380,93 @@ export class ReflexionMemory {
290
380
  params.push(timeWindowDays * 86400);
291
381
  }
292
382
  const whereClause = filters.length > 0 ? `WHERE ${filters.join(' AND ')}` : '';
383
+ return { whereClause, params };
384
+ }
385
+ /**
386
+ * Fetch episodes by IDs from database
387
+ */
388
+ fetchEpisodesByIds(episodeIds) {
389
+ const placeholders = episodeIds.map(() => '?').join(',');
293
390
  const stmt = this.db.prepare(`
294
- SELECT
295
- e.*,
296
- ee.embedding
297
- FROM episodes e
298
- JOIN episode_embeddings ee ON e.id = ee.episode_id
299
- ${whereClause}
300
- ORDER BY e.reward DESC
391
+ SELECT * FROM episodes
392
+ WHERE id IN (${placeholders})
301
393
  `);
302
- const rows = stmt.all(...params);
303
- // Calculate similarities manually
304
- const episodes = rows.map(row => {
305
- const embedding = this.deserializeEmbedding(row.embedding);
306
- const similarity = cosineSimilarity(queryEmbedding, embedding);
307
- return {
308
- id: row.id,
309
- ts: row.ts,
310
- sessionId: row.session_id,
311
- task: row.task,
312
- input: row.input,
313
- output: row.output,
314
- critique: row.critique,
315
- reward: row.reward,
316
- success: row.success === 1,
317
- latencyMs: row.latency_ms,
318
- tokensUsed: row.tokens_used,
319
- tags: row.tags ? JSON.parse(row.tags) : undefined,
320
- metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
321
- embedding,
322
- similarity
323
- };
324
- });
325
- // Sort by similarity and return top-k
326
- episodes.sort((a, b) => (b.similarity || 0) - (a.similarity || 0));
327
- return episodes.slice(0, k);
394
+ return stmt.all(...episodeIds);
395
+ }
396
+ /**
397
+ * Convert GraphDatabaseAdapter episode to EpisodeWithEmbedding
398
+ */
399
+ convertGraphEpisode(ep) {
400
+ return {
401
+ id: parseInt(ep.id.split('-').pop() || '0', 36),
402
+ sessionId: ep.sessionId,
403
+ task: ep.task,
404
+ input: ep.input,
405
+ output: ep.output,
406
+ critique: ep.critique,
407
+ reward: ep.reward,
408
+ success: ep.success,
409
+ latencyMs: ep.latencyMs,
410
+ tokensUsed: ep.tokensUsed,
411
+ ts: Math.floor(ep.createdAt / 1000),
412
+ };
413
+ }
414
+ /**
415
+ * Convert Cypher query result to EpisodeWithEmbedding
416
+ */
417
+ convertCypherEpisode(node) {
418
+ return {
419
+ id: parseInt(node.id.split('-').pop() || '0', 36),
420
+ sessionId: node.properties.sessionId,
421
+ task: node.properties.task,
422
+ input: node.properties.input,
423
+ output: node.properties.output,
424
+ critique: node.properties.critique,
425
+ reward: typeof node.properties.reward === 'string'
426
+ ? parseFloat(node.properties.reward)
427
+ : node.properties.reward,
428
+ success: typeof node.properties.success === 'string'
429
+ ? node.properties.success === 'true'
430
+ : node.properties.success,
431
+ latencyMs: node.properties.latencyMs,
432
+ tokensUsed: node.properties.tokensUsed,
433
+ tags: safeJsonParse(node.properties.tags, []),
434
+ metadata: safeJsonParse(node.properties.metadata, {}),
435
+ ts: Math.floor(node.properties.createdAt / 1000),
436
+ };
328
437
  }
329
438
  /**
330
- * Get statistics for a task
439
+ * Convert database row to EpisodeWithEmbedding
440
+ */
441
+ convertDatabaseEpisode(row, similarity, embedding) {
442
+ return {
443
+ id: row.id,
444
+ ts: row.ts,
445
+ sessionId: row.session_id,
446
+ task: row.task,
447
+ input: row.input ?? undefined,
448
+ output: row.output ?? undefined,
449
+ critique: row.critique ?? undefined,
450
+ reward: row.reward,
451
+ success: row.success === 1,
452
+ latencyMs: row.latency_ms ?? undefined,
453
+ tokensUsed: row.tokens_used ?? undefined,
454
+ tags: safeJsonParse(row.tags, undefined),
455
+ metadata: safeJsonParse(row.metadata, undefined),
456
+ embedding,
457
+ similarity,
458
+ };
459
+ }
460
+ /**
461
+ * Get statistics for a task (cached)
331
462
  */
332
463
  getTaskStats(task, timeWindowDays) {
464
+ // Check cache first
465
+ const cacheKey = this.queryCache.generateKey('getTaskStats', [task, timeWindowDays], 'task-stats');
466
+ const cached = this.queryCache.get(cacheKey);
467
+ if (cached) {
468
+ return cached;
469
+ }
333
470
  const windowFilter = timeWindowDays
334
471
  ? `AND ts > strftime('%s', 'now') - ${timeWindowDays * 86400}`
335
472
  : '';
@@ -359,41 +496,59 @@ export class ReflexionMemory {
359
496
  const improvementTrend = trend.recent_reward && trend.older_reward
360
497
  ? (trend.recent_reward - trend.older_reward) / trend.older_reward
361
498
  : 0;
362
- return {
363
- totalAttempts: stats.total || 0,
364
- successRate: stats.success_rate || 0,
365
- avgReward: stats.avg_reward || 0,
366
- avgLatency: stats.avg_latency || 0,
367
- improvementTrend
499
+ const results = {
500
+ totalAttempts: stats?.total ?? 0,
501
+ successRate: stats?.success_rate ?? 0,
502
+ avgReward: stats?.avg_reward ?? 0,
503
+ avgLatency: stats?.avg_latency ?? 0,
504
+ improvementTrend,
368
505
  };
506
+ // Cache the results
507
+ this.queryCache.set(cacheKey, results);
508
+ return results;
369
509
  }
370
510
  /**
371
- * Build critique summary from similar failed episodes
511
+ * Build critique summary from similar failed episodes (cached)
372
512
  */
373
513
  async getCritiqueSummary(query) {
514
+ // Check cache first
515
+ const cacheKey = this.queryCache.generateKey('getCritiqueSummary', [query.task, query.k], 'episodes');
516
+ const cached = this.queryCache.get(cacheKey);
517
+ if (cached) {
518
+ return cached;
519
+ }
374
520
  const failures = await this.retrieveRelevant({
375
521
  ...query,
376
522
  onlyFailures: true,
377
- k: 3
523
+ k: 3,
378
524
  });
379
525
  if (failures.length === 0) {
380
526
  return 'No prior failures found for this task.';
381
527
  }
382
528
  const critiques = failures
383
- .filter(ep => ep.critique)
529
+ .filter((ep) => ep.critique)
384
530
  .map((ep, i) => `${i + 1}. ${ep.critique} (reward: ${ep.reward.toFixed(2)})`)
385
531
  .join('\n');
386
- return `Prior failures and lessons learned:\n${critiques}`;
532
+ const result = `Prior failures and lessons learned:\n${critiques}`;
533
+ // Cache the result
534
+ this.queryCache.set(cacheKey, result);
535
+ return result;
387
536
  }
388
537
  /**
389
- * Get successful strategies for a task
538
+ * Get successful strategies for a task (cached)
390
539
  */
391
540
  async getSuccessStrategies(query) {
541
+ // Check cache first
542
+ const cacheKey = this.queryCache.generateKey('getSuccessStrategies', [query.task, query.k], 'episodes');
543
+ const cached = this.queryCache.get(cacheKey);
544
+ if (cached) {
545
+ return cached;
546
+ }
392
547
  const successes = await this.retrieveRelevant({
393
548
  ...query,
394
549
  onlySuccesses: true,
395
550
  minReward: 0.7,
396
- k: 3
551
+ k: 3,
397
552
  });
398
553
  if (successes.length === 0) {
399
554
  return 'No successful strategies found for this task.';
@@ -404,7 +559,10 @@ export class ReflexionMemory {
404
559
  return `${i + 1}. Approach (reward ${ep.reward.toFixed(2)}): ${approach}...`;
405
560
  })
406
561
  .join('\n');
407
- return `Successful strategies:\n${strategies}`;
562
+ const result = `Successful strategies:\n${strategies}`;
563
+ // Cache the result
564
+ this.queryCache.set(cacheKey, result);
565
+ return result;
408
566
  }
409
567
  /**
410
568
  * Get recent episodes for a session
@@ -417,24 +575,25 @@ export class ReflexionMemory {
417
575
  LIMIT ?
418
576
  `);
419
577
  const rows = stmt.all(sessionId, limit);
420
- return rows.map(row => ({
578
+ return rows.map((row) => ({
421
579
  id: row.id,
422
580
  ts: row.ts,
423
581
  sessionId: row.session_id,
424
582
  task: row.task,
425
- input: row.input,
426
- output: row.output,
427
- critique: row.critique,
583
+ input: row.input ?? undefined,
584
+ output: row.output ?? undefined,
585
+ critique: row.critique ?? undefined,
428
586
  reward: row.reward,
429
587
  success: row.success === 1,
430
- latencyMs: row.latency_ms,
431
- tokensUsed: row.tokens_used,
432
- tags: row.tags ? JSON.parse(row.tags) : undefined,
433
- metadata: row.metadata ? JSON.parse(row.metadata) : undefined
588
+ latencyMs: row.latency_ms ?? undefined,
589
+ tokensUsed: row.tokens_used ?? undefined,
590
+ tags: safeJsonParse(row.tags, undefined),
591
+ metadata: safeJsonParse(row.metadata, undefined),
434
592
  }));
435
593
  }
436
594
  /**
437
595
  * Prune low-quality episodes based on TTL and quality threshold
596
+ * Invalidates cache on completion
438
597
  */
439
598
  pruneEpisodes(config) {
440
599
  const { minReward = 0.3, maxAgeDays = 30, keepMinPerTask = 5 } = config;
@@ -455,6 +614,11 @@ export class ReflexionMemory {
455
614
  )
456
615
  `);
457
616
  const result = stmt.run(minReward, maxAgeDays * 86400, keepMinPerTask);
617
+ // Invalidate caches after pruning
618
+ if (result.changes > 0) {
619
+ this.queryCache.invalidateCategory('episodes');
620
+ this.queryCache.invalidateCategory('task-stats');
621
+ }
458
622
  return result.changes;
459
623
  }
460
624
  // ========================================================================
@@ -485,6 +649,17 @@ export class ReflexionMemory {
485
649
  deserializeEmbedding(buffer) {
486
650
  return new Float32Array(buffer.buffer, buffer.byteOffset, buffer.length / 4);
487
651
  }
652
+ cosineSimilarity(a, b) {
653
+ let dotProduct = 0;
654
+ let normA = 0;
655
+ let normB = 0;
656
+ for (let i = 0; i < a.length; i++) {
657
+ dotProduct += a[i] * b[i];
658
+ normA += a[i] * a[i];
659
+ normB += b[i] * b[i];
660
+ }
661
+ return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
662
+ }
488
663
  // ========================================================================
489
664
  // GNN and Graph Integration Methods
490
665
  // ========================================================================
@@ -503,7 +678,7 @@ export class ReflexionMemory {
503
678
  success: episode.success,
504
679
  timestamp: episode.ts || Date.now(),
505
680
  latencyMs: episode.latencyMs,
506
- tokensUsed: episode.tokensUsed
681
+ tokensUsed: episode.tokensUsed,
507
682
  });
508
683
  // Find similar episodes using graph vector search
509
684
  const similarEpisodes = await this.graphBackend.vectorSearch(embedding, 5, nodeId);
@@ -511,8 +686,8 @@ export class ReflexionMemory {
511
686
  for (const similar of similarEpisodes) {
512
687
  if (similar.id !== nodeId && similar.properties.episodeId !== episodeId) {
513
688
  await this.graphBackend.createRelationship(nodeId, similar.id, 'SIMILAR_TO', {
514
- similarity: cosineSimilarity(embedding, similar.embedding || new Float32Array()),
515
- createdAt: Date.now()
689
+ similarity: this.cosineSimilarity(embedding, similar.embedding || new Float32Array()),
690
+ createdAt: Date.now(),
516
691
  });
517
692
  }
518
693
  }
@@ -523,13 +698,15 @@ export class ReflexionMemory {
523
698
  // Create session node if doesn't exist
524
699
  sessionNodeId = await this.graphBackend.createNode(['Session'], {
525
700
  sessionId: episode.sessionId,
526
- startTime: episode.ts || Date.now()
701
+ startTime: episode.ts || Date.now(),
527
702
  });
528
703
  }
529
704
  else {
530
705
  sessionNodeId = sessionNodes.rows[0].s.id;
531
706
  }
532
- await this.graphBackend.createRelationship(nodeId, sessionNodeId, 'BELONGS_TO_SESSION', { timestamp: episode.ts || Date.now() });
707
+ await this.graphBackend.createRelationship(nodeId, sessionNodeId, 'BELONGS_TO_SESSION', {
708
+ timestamp: episode.ts || Date.now(),
709
+ });
533
710
  // If episode has critique, create causal relationship to previous failures
534
711
  if (episode.critique && !episode.success) {
535
712
  const previousFailures = await this.graphBackend.execute(`MATCH (e:Episode:Failure {sessionId: $sessionId})
@@ -540,7 +717,7 @@ export class ReflexionMemory {
540
717
  for (const prevFailure of previousFailures.rows) {
541
718
  await this.graphBackend.createRelationship(nodeId, prevFailure.e.id, 'LEARNED_FROM', {
542
719
  critique: episode.critique,
543
- improvementAttempt: true
720
+ improvementAttempt: true,
544
721
  });
545
722
  }
546
723
  }
@@ -554,8 +731,8 @@ export class ReflexionMemory {
554
731
  }
555
732
  try {
556
733
  // Get initial neighbors
557
- const initialResults = this.vectorBackend.search(queryEmbedding, k * 2, {
558
- threshold: 0.0
734
+ const initialResults = await searchVectors(this.vectorBackend, queryEmbedding, k * 2, {
735
+ threshold: 0.0,
559
736
  });
560
737
  if (initialResults.length === 0) {
561
738
  return queryEmbedding;
@@ -563,14 +740,19 @@ export class ReflexionMemory {
563
740
  // Fetch neighbor embeddings
564
741
  const neighborEmbeddings = [];
565
742
  const weights = [];
566
- const episodeIds = initialResults.map(r => r.id);
743
+ const episodeIds = initialResults.map((r) => r.id).filter((id) => EPISODE_VECTOR_ID.test(id));
744
+ if (episodeIds.length === 0) {
745
+ return queryEmbedding;
746
+ }
567
747
  const placeholders = episodeIds.map(() => '?').join(',');
568
- const episodes = this.db.prepare(`
748
+ const episodes = this.db
749
+ .prepare(`
569
750
  SELECT ee.embedding, e.reward
570
751
  FROM episode_embeddings ee
571
752
  JOIN episodes e ON e.id = ee.episode_id
572
753
  WHERE ee.episode_id IN (${placeholders})
573
- `).all(...episodeIds);
754
+ `)
755
+ .all(...episodeIds);
574
756
  for (const ep of episodes) {
575
757
  const embedding = this.deserializeEmbedding(ep.embedding);
576
758
  neighborEmbeddings.push(embedding);
@@ -607,7 +789,7 @@ export class ReflexionMemory {
607
789
  return {
608
790
  similar: (row.similar || []).filter((id) => id != null),
609
791
  session: row.session || '',
610
- learnedFrom: (row.learnedFrom || []).filter((id) => id != null)
792
+ learnedFrom: (row.learnedFrom || []).filter((id) => id != null),
611
793
  };
612
794
  }
613
795
  /**
@@ -624,11 +806,11 @@ export class ReflexionMemory {
624
806
  return;
625
807
  }
626
808
  const result = await this.learningBackend.train(options);
627
- console.log('[ReflexionMemory] GNN training complete:', {
809
+ console.error('[ReflexionMemory] GNN training complete:', {
628
810
  epochs: result.epochs,
629
811
  finalLoss: result.finalLoss.toFixed(4),
630
812
  improvement: `${(result.improvement * 100).toFixed(1)}%`,
631
- duration: `${result.duration}ms`
813
+ duration: `${result.duration}ms`,
632
814
  });
633
815
  }
634
816
  /**
@@ -649,5 +831,281 @@ export class ReflexionMemory {
649
831
  }
650
832
  return this.graphBackend.getStats();
651
833
  }
834
+ /**
835
+ * Get query cache statistics
836
+ */
837
+ getCacheStats() {
838
+ return this.queryCache.getStatistics();
839
+ }
840
+ /**
841
+ * Clear query cache
842
+ */
843
+ clearCache() {
844
+ this.queryCache.clear();
845
+ }
846
+ /**
847
+ * Prune expired cache entries
848
+ */
849
+ pruneCache() {
850
+ return this.queryCache.pruneExpired();
851
+ }
852
+ /**
853
+ * Warm cache with common queries
854
+ */
855
+ async warmCache(sessionId) {
856
+ await this.queryCache.warm(async (cache) => {
857
+ // Warm cache with recent sessions if sessionId provided
858
+ if (sessionId) {
859
+ const recent = await this.getRecentEpisodes(sessionId, 10);
860
+ // Episodes are already loaded, cache will be populated on next access
861
+ }
862
+ });
863
+ }
864
+ /**
865
+ * Delete an episode by id. Closes the gap from issue #150 (downstream:
866
+ * ruflo#1784, RuVector#427) — once an episode is written there was no
867
+ * first-class way to remove it through any backend.
868
+ *
869
+ * Strategy mirrors storeEpisode: when a graph backend is present we go
870
+ * through it (`graphAdapter.deleteNode` / `graphBackend.deleteNode` —
871
+ * both Cypher-backed under the hood), and we ALWAYS also purge the SQL
872
+ * `episodes` and `episode_embeddings` rows so durable storage stays in
873
+ * sync. Vector backend entries are removed too when present.
874
+ *
875
+ * @returns True if the episode existed in any backend and was removed.
876
+ */
877
+ async deleteEpisode(id) {
878
+ const numericId = typeof id === 'number' ? id : parseInt(String(id), 10);
879
+ const stringId = String(id);
880
+ // Invalidate caches up front — failures below shouldn't leave stale reads.
881
+ this.queryCache.invalidateCategory('episodes');
882
+ this.queryCache.invalidateCategory('task-stats');
883
+ let removed = false;
884
+ // 1. Graph adapter (AgentDB v2 fast path)
885
+ if (this.graphBackend && 'storeEpisode' in this.graphBackend) {
886
+ const adapter = this.graphBackend;
887
+ if (typeof adapter.deleteNode === 'function') {
888
+ try {
889
+ // Adapter accepts either the canonical "episode-<id>" key or a raw
890
+ // id; try the canonical form first since that's what storeEpisode
891
+ // emits.
892
+ const r = await adapter.deleteNode(`episode-${numericId}`, { cascade: true });
893
+ if (r?.deletedNode)
894
+ removed = true;
895
+ if (!removed) {
896
+ const r2 = await adapter.deleteNode(stringId, { cascade: true });
897
+ if (r2?.deletedNode)
898
+ removed = true;
899
+ }
900
+ }
901
+ catch (err) {
902
+ const msg = err instanceof Error ? err.message : String(err);
903
+ // eslint-disable-next-line no-console
904
+ console.warn(`[ReflexionMemory] deleteEpisode: graph adapter delete failed: ${msg}`);
905
+ }
906
+ }
907
+ }
908
+ // 2. Generic graph backend
909
+ else if (this.graphBackend && typeof this.graphBackend.deleteNode === 'function') {
910
+ try {
911
+ const r = await this.graphBackend.deleteNode(stringId);
912
+ if (r === true)
913
+ removed = true;
914
+ }
915
+ catch (err) {
916
+ const msg = err instanceof Error ? err.message : String(err);
917
+ // eslint-disable-next-line no-console
918
+ console.warn(`[ReflexionMemory] deleteEpisode: graph backend delete failed: ${msg}`);
919
+ }
920
+ }
921
+ // 3. Vector backend (HNSW/RuVector); some implementations don't expose
922
+ // delete — guard with a feature check.
923
+ if (this.vectorBackend && typeof this.vectorBackend.delete === 'function') {
924
+ try {
925
+ const r = await this.vectorBackend.delete(String(numericId));
926
+ if (r === true)
927
+ removed = true;
928
+ }
929
+ catch (err) {
930
+ const msg = err instanceof Error ? err.message : String(err);
931
+ // eslint-disable-next-line no-console
932
+ console.warn(`[ReflexionMemory] deleteEpisode: vector backend delete failed: ${msg}`);
933
+ }
934
+ }
935
+ // 4. SQL durable storage — always attempt so persistence stays clean
936
+ // even when the primary backend was a no-op.
937
+ if (this.db && typeof this.db.prepare === 'function' && Number.isFinite(numericId)) {
938
+ try {
939
+ const embStmt = this.db.prepare(`DELETE FROM episode_embeddings WHERE episode_id = ?`);
940
+ embStmt.run(numericId);
941
+ const stmt = this.db.prepare(`DELETE FROM episodes WHERE id = ?`);
942
+ const r = stmt.run(numericId);
943
+ const changes = r?.changes ?? 0;
944
+ if (changes > 0)
945
+ removed = true;
946
+ }
947
+ catch (err) {
948
+ const msg = err instanceof Error ? err.message : String(err);
949
+ if (!/no such table/i.test(msg)) {
950
+ // eslint-disable-next-line no-console
951
+ console.warn(`[ReflexionMemory] deleteEpisode: SQL delete failed: ${msg}`);
952
+ }
953
+ }
954
+ }
955
+ return removed;
956
+ }
957
+ /**
958
+ * Dual-write helper for issue #128.
959
+ *
960
+ * Inserts the given episode into the SQLite `episodes` and
961
+ * `episode_embeddings` tables when the underlying connection supports it.
962
+ * Used when a graph or vector backend handles the primary index but the
963
+ * caller still wants restart-safe persistence.
964
+ *
965
+ * Errors are swallowed and logged — the primary write to the graph/vector
966
+ * backend has already succeeded, and we don't want to fail the caller if
967
+ * SQL persistence is unavailable (e.g. read-only DB, schema not present).
968
+ */
969
+ dualWriteEpisodeToSQL(episode, embedding) {
970
+ if (!this.db || typeof this.db.prepare !== 'function')
971
+ return;
972
+ try {
973
+ const stmt = this.db.prepare(`
974
+ INSERT INTO episodes (
975
+ session_id, task, input, output, critique, reward, success,
976
+ latency_ms, tokens_used, tags, metadata
977
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
978
+ `);
979
+ const tags = episode.tags ? JSON.stringify(episode.tags) : null;
980
+ const metadata = episode.metadata ? JSON.stringify(episode.metadata) : null;
981
+ const result = stmt.run(episode.sessionId, episode.task, episode.input ?? null, episode.output ?? null, episode.critique ?? null, episode.reward, episode.success ? 1 : 0, episode.latencyMs ?? null, episode.tokensUsed ?? null, tags, metadata);
982
+ if (embedding) {
983
+ const episodeId = normalizeRowId(result.lastInsertRowid);
984
+ this.storeEmbedding(episodeId, embedding);
985
+ }
986
+ }
987
+ catch (err) {
988
+ // The expected failure here is "no such table: episodes" on databases
989
+ // that intentionally don't carry the v1 schema. Don't escalate — the
990
+ // primary backend already has the data.
991
+ const msg = err instanceof Error ? err.message : String(err);
992
+ if (!/no such table/i.test(msg)) {
993
+ // eslint-disable-next-line no-console
994
+ console.warn('[ReflexionMemory] dualWriteEpisodeToSQL failed:', msg);
995
+ }
996
+ }
997
+ }
998
+ /**
999
+ * Rebuild the in-memory vector index from the SQLite `episodes` /
1000
+ * `episode_embeddings` tables, going through the proper backend channels
1001
+ * so `retrieveRelevant()` sees the data afterwards.
1002
+ *
1003
+ * Fixes the user's recovery use-case from issue #129: rather than calling
1004
+ * `vectorBackend.getInner().insert()` directly (which bypasses the
1005
+ * GuardedBackend wrapper and confuses retrieveRelevant), call this method
1006
+ * to re-hydrate the vector and graph indices from durable storage.
1007
+ *
1008
+ * Returns the number of episodes re-indexed. No-ops cleanly when the SQL
1009
+ * tables are empty or absent.
1010
+ */
1011
+ async rebuildIndex(options = {}) {
1012
+ if (!this.db || typeof this.db.prepare !== 'function')
1013
+ return 0;
1014
+ const where = options.fromTimestamp !== undefined ? 'WHERE e.ts >= ?' : '';
1015
+ const params = options.fromTimestamp !== undefined ? [options.fromTimestamp] : [];
1016
+ let rows = [];
1017
+ try {
1018
+ const stmt = this.db.prepare(`
1019
+ SELECT
1020
+ e.id, e.ts, e.session_id, e.task, e.input, e.output, e.critique,
1021
+ e.reward, e.success, e.latency_ms, e.tokens_used, e.tags, e.metadata,
1022
+ ee.embedding
1023
+ FROM episodes e
1024
+ LEFT JOIN episode_embeddings ee ON ee.episode_id = e.id
1025
+ ${where}
1026
+ ORDER BY e.id ASC
1027
+ `);
1028
+ rows = stmt.all(...params);
1029
+ }
1030
+ catch (err) {
1031
+ const msg = err instanceof Error ? err.message : String(err);
1032
+ if (/no such table/i.test(msg))
1033
+ return 0;
1034
+ throw err;
1035
+ }
1036
+ let reindexed = 0;
1037
+ for (const row of rows) {
1038
+ const episode = {
1039
+ id: row.id,
1040
+ ts: row.ts,
1041
+ sessionId: row.session_id,
1042
+ task: row.task,
1043
+ input: row.input ?? undefined,
1044
+ output: row.output ?? undefined,
1045
+ critique: row.critique ?? undefined,
1046
+ reward: row.reward,
1047
+ success: row.success === 1,
1048
+ latencyMs: row.latency_ms ?? undefined,
1049
+ tokensUsed: row.tokens_used ?? undefined,
1050
+ tags: safeJsonParse(row.tags, undefined),
1051
+ metadata: safeJsonParse(row.metadata, undefined),
1052
+ };
1053
+ // Prefer the stored embedding; fall back to recomputing if missing.
1054
+ let embedding;
1055
+ if (row.embedding) {
1056
+ const buf = row.embedding;
1057
+ embedding = new Float32Array(buf.buffer, buf.byteOffset, buf.length / 4);
1058
+ }
1059
+ else {
1060
+ embedding = await this.embedder.embedPassage(this.buildEpisodeText(episode));
1061
+ }
1062
+ // Re-insert through the proper public APIs so the GuardedBackend
1063
+ // wrapper, graph adapter, and HNSW all stay in sync.
1064
+ if (this.vectorBackend) {
1065
+ try {
1066
+ this.vectorBackend.insert(String(row.id), embedding, {
1067
+ type: 'episode',
1068
+ sessionId: episode.sessionId,
1069
+ reward: episode.reward,
1070
+ success: episode.success,
1071
+ });
1072
+ }
1073
+ catch (err) {
1074
+ const msg = err instanceof Error ? err.message : String(err);
1075
+ // eslint-disable-next-line no-console
1076
+ console.warn(`[ReflexionMemory] rebuildIndex: vector insert failed for ${row.id}: ${msg}`);
1077
+ }
1078
+ }
1079
+ if (this.graphBackend && 'storeEpisode' in this.graphBackend) {
1080
+ const adapter = this.graphBackend;
1081
+ try {
1082
+ await adapter.storeEpisode({
1083
+ id: `episode-${row.id}`,
1084
+ sessionId: episode.sessionId,
1085
+ task: episode.task,
1086
+ reward: episode.reward,
1087
+ success: episode.success,
1088
+ input: episode.input,
1089
+ output: episode.output,
1090
+ critique: episode.critique,
1091
+ createdAt: (episode.ts ?? Date.now() / 1000) * 1000,
1092
+ tokensUsed: episode.tokensUsed,
1093
+ latencyMs: episode.latencyMs,
1094
+ }, embedding);
1095
+ }
1096
+ catch (err) {
1097
+ const msg = err instanceof Error ? err.message : String(err);
1098
+ // eslint-disable-next-line no-console
1099
+ console.warn(`[ReflexionMemory] rebuildIndex: graph store failed for ${row.id}: ${msg}`);
1100
+ }
1101
+ }
1102
+ reindexed++;
1103
+ }
1104
+ // Bust any stale read caches so the next retrieveRelevant sees the
1105
+ // freshly-rebuilt index.
1106
+ this.queryCache.invalidateCategory('episodes');
1107
+ this.queryCache.invalidateCategory('task-stats');
1108
+ return reindexed;
1109
+ }
652
1110
  }
653
1111
  //# sourceMappingURL=ReflexionMemory.js.map