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