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
@@ -1,432 +1,869 @@
1
1
  /**
2
- * RuVectorBackend - High-Performance Vector Storage (v0.1.99+)
2
+ * RuVectorBackend - High-Performance Vector Storage
3
3
  *
4
- * Implements VectorBackend using ruvector with native SIMD and multi-threading.
5
- * Updated for ruvector 0.1.99+ async API with object-style insert/search.
4
+ * Implements VectorBackend using @ruvector/core with optional GNN support.
5
+ * Provides <100µs search latency with native SIMD optimizations.
6
6
  *
7
7
  * Features:
8
- * - Native SIMD acceleration (2-4x faster vector ops)
9
- * - Automatic fallback when ruvector packages not installed
8
+ * - Automatic fallback when @ruvector packages not installed
10
9
  * - Separate metadata storage for rich queries
11
- * - Score-to-similarity conversion for all metrics
10
+ * - Distance-to-similarity conversion for all metrics
12
11
  * - Batch operations for optimal throughput
13
- * - Parallel batch search via searchBatch()
14
12
  * - Persistent storage with separate metadata files
13
+ * - Parallel batch insert with configurable concurrency
14
+ * - Buffer pooling to reduce memory allocations
15
+ * - Adaptive index parameters based on dataset size
16
+ * - Memory-mapped support for large indices
17
+ * - Statistics tracking for performance monitoring
15
18
  */
19
+ // ============================================================================
20
+ // Performance & Security Constants
21
+ // ============================================================================
22
+ /** @inline Maximum supported vector dimension for bounds checking */
23
+ export const MAX_VECTOR_DIMENSION = 4096;
24
+ /** @inline Maximum batch size for optimal cache utilization */
25
+ export const MAX_BATCH_SIZE = 10000;
26
+ /** @inline Default cache size for embedding storage */
27
+ export const DEFAULT_CACHE_SIZE = 10000;
28
+ /** @inline Small epsilon for numerical stability */
29
+ const EPSILON = 1e-10;
30
+ /** @inline Maximum metadata entries to prevent memory exhaustion */
31
+ const MAX_METADATA_ENTRIES = 10_000_000;
32
+ /** @inline Maximum path length for file operations */
33
+ const MAX_PATH_LENGTH = 4096;
34
+ /** Forbidden path patterns for security */
35
+ const FORBIDDEN_PATH_PATTERNS = [
36
+ /\.\./, // Path traversal
37
+ /^\/etc\//i, // System config
38
+ /^\/proc\//i, // Process info
39
+ /^\/sys\//i, // System info
40
+ /^\/dev\//i, // Devices
41
+ ];
42
+ // ============================================================================
43
+ // Security Validation Helpers
44
+ // ============================================================================
45
+ /**
46
+ * Validate a file path is safe
47
+ */
48
+ function validatePath(inputPath) {
49
+ if (!inputPath || typeof inputPath !== 'string') {
50
+ throw new Error('Path must be a non-empty string');
51
+ }
52
+ if (inputPath.length > MAX_PATH_LENGTH) {
53
+ throw new Error(`Path exceeds maximum length of ${MAX_PATH_LENGTH}`);
54
+ }
55
+ for (const pattern of FORBIDDEN_PATH_PATTERNS) {
56
+ if (pattern.test(inputPath)) {
57
+ throw new Error(`Path contains forbidden pattern`);
58
+ }
59
+ }
60
+ }
61
+ /**
62
+ * Validate vector dimension is within safe limits
63
+ */
64
+ function validateDimension(dimension) {
65
+ if (!Number.isFinite(dimension) || dimension < 1 || dimension > MAX_VECTOR_DIMENSION) {
66
+ throw new Error(`Dimension must be between 1 and ${MAX_VECTOR_DIMENSION}`);
67
+ }
68
+ }
69
+ /**
70
+ * Semaphore for controlling concurrent operations
71
+ */
72
+ class Semaphore {
73
+ permits;
74
+ waiting = [];
75
+ constructor(permits) {
76
+ this.permits = permits;
77
+ }
78
+ async acquire() {
79
+ if (this.permits > 0) {
80
+ this.permits--;
81
+ return Promise.resolve();
82
+ }
83
+ return new Promise((resolve) => {
84
+ this.waiting.push(resolve);
85
+ });
86
+ }
87
+ release() {
88
+ if (this.waiting.length > 0) {
89
+ const resolve = this.waiting.shift();
90
+ resolve();
91
+ }
92
+ else {
93
+ this.permits++;
94
+ }
95
+ }
96
+ get available() {
97
+ return this.permits;
98
+ }
99
+ }
100
+ /**
101
+ * Buffer pool for reusing Float32Array buffers
102
+ */
103
+ class BufferPool {
104
+ pools = new Map();
105
+ maxPoolSize;
106
+ constructor(maxPoolSize = 100) {
107
+ this.maxPoolSize = maxPoolSize;
108
+ }
109
+ /**
110
+ * Acquire a buffer of the specified size
111
+ */
112
+ acquire(size) {
113
+ const pool = this.pools.get(size);
114
+ if (pool && pool.length > 0) {
115
+ return pool.pop();
116
+ }
117
+ return new Float32Array(size);
118
+ }
119
+ /**
120
+ * Release a buffer back to the pool
121
+ */
122
+ release(buffer) {
123
+ const size = buffer.length;
124
+ if (!this.pools.has(size)) {
125
+ this.pools.set(size, []);
126
+ }
127
+ const pool = this.pools.get(size);
128
+ if (pool.length < this.maxPoolSize) {
129
+ // Clear buffer before returning to pool
130
+ buffer.fill(0);
131
+ pool.push(buffer);
132
+ }
133
+ }
134
+ /**
135
+ * Clear all pooled buffers
136
+ */
137
+ clear() {
138
+ this.pools.clear();
139
+ }
140
+ /**
141
+ * Get pool statistics
142
+ */
143
+ getStats() {
144
+ let totalBuffers = 0;
145
+ let totalMemory = 0;
146
+ for (const [size, pool] of this.pools) {
147
+ totalBuffers += pool.length;
148
+ totalMemory += pool.length * size * 4; // Float32 = 4 bytes
149
+ }
150
+ return { totalBuffers, totalMemory };
151
+ }
152
+ }
153
+ /** ruvector-core distance metric names */
154
+ const NATIVE_METRIC = {
155
+ cosine: 'Cosine',
156
+ l2: 'Euclidean',
157
+ ip: 'DotProduct',
158
+ };
16
159
  export class RuVectorBackend {
17
160
  name = 'ruvector';
18
- db; // VectorDB from ruvector 0.1.99+
161
+ db; // VectorDb from ruvector / @ruvector/core (every method is async)
19
162
  config;
20
163
  metadata = new Map();
21
164
  initialized = false;
22
- learning = null;
23
- nativeVersion = 'unknown';
24
- isNativeImpl = false;
165
+ // Native calls are async; they run one at a time through this queue so a
166
+ // sync insert followed by a remove (or a search) observes them in order.
167
+ queue = Promise.resolve();
168
+ lastWriteError = null;
169
+ cachedCount = 0;
170
+ knownIds = new Set();
171
+ storeWasEmpty = true;
172
+ storagePath = '';
173
+ ownedTempDir = null;
174
+ defaultEfSearch;
175
+ VectorDbCtor;
176
+ nativeOptions = {};
177
+ // Concurrency control
178
+ semaphore;
179
+ bufferPool;
180
+ // Statistics tracking
181
+ stats = {
182
+ insertCount: 0,
183
+ insertTotalLatencyMs: 0,
184
+ insertMinLatencyMs: Infinity,
185
+ insertMaxLatencyMs: 0,
186
+ searchCount: 0,
187
+ searchTotalLatencyMs: 0,
188
+ searchMinLatencyMs: Infinity,
189
+ searchMaxLatencyMs: 0,
190
+ cacheHits: 0,
191
+ cacheMisses: 0,
192
+ lastMemoryUsage: 0,
193
+ indexRebuildCount: 0,
194
+ };
195
+ // Mmap support
196
+ mmapEnabled = false;
197
+ mmapBuffer = null;
25
198
  constructor(config) {
26
199
  // Handle both dimension and dimensions for backward compatibility
27
200
  const dimension = config.dimension ?? config.dimensions;
28
201
  if (!dimension) {
29
202
  throw new Error('Vector dimension is required (use dimension or dimensions)');
30
203
  }
204
+ // Validate dimension for security
205
+ validateDimension(dimension);
31
206
  // Store both forms for compatibility with different backends
32
207
  this.config = { ...config, dimension, dimensions: dimension };
208
+ // Initialize concurrency control with configurable limit (bounded for security)
209
+ const concurrency = Math.min(Math.max(1, config.parallelConcurrency ?? 4), 32);
210
+ this.semaphore = new Semaphore(concurrency);
211
+ // Initialize buffer pool with bounded size
212
+ const bufferPoolSize = Math.min(Math.max(1, config.bufferPoolSize ?? 100), 1000);
213
+ this.bufferPool = new BufferPool(bufferPoolSize);
214
+ // Mmap configuration - validate path if provided
215
+ this.mmapEnabled = config.enableMmap ?? false;
216
+ if (this.mmapEnabled && config.mmapPath) {
217
+ validatePath(config.mmapPath);
218
+ }
219
+ }
220
+ /**
221
+ * Get adaptive HNSW parameters based on expected dataset size
222
+ */
223
+ getAdaptiveParams(datasetSize) {
224
+ if (datasetSize < 1000) {
225
+ // Small dataset: lower M and efConstruction for faster builds
226
+ return { M: 8, efConstruction: 100, efSearch: 50 };
227
+ }
228
+ else if (datasetSize <= 100000) {
229
+ // Medium dataset: balanced parameters
230
+ return { M: 16, efConstruction: 200, efSearch: 100 };
231
+ }
232
+ else {
233
+ // Large dataset: higher M for better recall
234
+ return { M: 32, efConstruction: 400, efSearch: 200 };
235
+ }
236
+ }
237
+ /**
238
+ * Pick the native storage file: the configured path, or a fresh private
239
+ * temp directory that close() removes.
240
+ */
241
+ async resolveStoragePath() {
242
+ const pathModule = await import('path');
243
+ // ':memory:' would become a literal file of that name in the cwd
244
+ if (this.config.storagePath && this.config.storagePath !== ':memory:') {
245
+ validatePath(this.config.storagePath);
246
+ return pathModule.resolve(this.config.storagePath);
247
+ }
248
+ const fs = await import('fs');
249
+ const os = await import('os');
250
+ this.ownedTempDir = fs.mkdtempSync(pathModule.join(os.tmpdir(), 'agentdb-ruvector-'));
251
+ return pathModule.join(this.ownedTempDir, 'index.db');
252
+ }
253
+ removeOwnedTempDir() {
254
+ if (!this.ownedTempDir)
255
+ return;
256
+ const dir = this.ownedTempDir;
257
+ this.ownedTempDir = null;
258
+ import('fs')
259
+ .then((fs) => fs.rmSync(dir, { recursive: true, force: true }))
260
+ .catch(() => { });
261
+ }
262
+ /**
263
+ * Run a native operation after every earlier one has settled.
264
+ * A failure is recorded (and surfaced by flush()) without breaking the queue.
265
+ */
266
+ enqueue(op) {
267
+ const result = this.queue.then(op);
268
+ this.queue = result.then(() => undefined, (err) => {
269
+ this.lastWriteError = err;
270
+ console.error(`[RuVectorBackend] native operation failed: ${err?.message ?? err}`);
271
+ });
272
+ return result;
33
273
  }
34
274
  /**
35
- * Initialize RuVector database with SIMD and multi-threading (0.1.99+)
275
+ * Write entries to the native index with upsert semantics. ruvector-core
276
+ * keeps a stale HNSW node when an existing id is re-inserted, so an id that
277
+ * may already be stored is deleted first.
278
+ */
279
+ async writeNative(entries) {
280
+ const latest = new Map();
281
+ for (const e of entries)
282
+ latest.set(e.id, e.vector);
283
+ let replaced = 0;
284
+ for (const id of latest.keys()) {
285
+ if (this.knownIds.has(id) || !this.storeWasEmpty) {
286
+ if (await this.db.delete(id))
287
+ replaced++;
288
+ }
289
+ }
290
+ const batch = Array.from(latest, ([id, vector]) => ({ id, vector }));
291
+ if (batch.length === 1) {
292
+ await this.db.insert(batch[0]);
293
+ }
294
+ else {
295
+ await this.db.insertBatch(batch);
296
+ }
297
+ for (const { id } of batch)
298
+ this.knownIds.add(id);
299
+ this.cachedCount += batch.length - replaced;
300
+ }
301
+ async deleteNative(id) {
302
+ const removed = await this.db.delete(id);
303
+ this.knownIds.delete(id);
304
+ if (removed)
305
+ this.cachedCount--;
306
+ return removed;
307
+ }
308
+ validateEntry(id, embedding, metadata) {
309
+ if (!id || typeof id !== 'string') {
310
+ throw new Error('Vector ID must be a non-empty string');
311
+ }
312
+ if (!(embedding instanceof Float32Array) && !Array.isArray(embedding)) {
313
+ throw new Error('Embedding must be a Float32Array or array');
314
+ }
315
+ if (embedding.length !== this.config.dimension) {
316
+ throw new Error(`Vector dimension ${embedding.length} does not match expected ${this.config.dimension}`);
317
+ }
318
+ if (metadata && !this.metadata.has(id) && this.metadata.size >= MAX_METADATA_ENTRIES) {
319
+ throw new Error(`Metadata store has reached maximum capacity of ${MAX_METADATA_ENTRIES}`);
320
+ }
321
+ // Copy: callers (and insertWithPooledBuffer) may reuse the buffer before
322
+ // the queued native write runs.
323
+ return new Float32Array(embedding);
324
+ }
325
+ recordInsertLatency(startTime) {
326
+ if (this.config.enableStats === false)
327
+ return;
328
+ const latency = performance.now() - startTime;
329
+ this.stats.insertCount++;
330
+ this.stats.insertTotalLatencyMs += latency;
331
+ this.stats.insertMinLatencyMs = Math.min(this.stats.insertMinLatencyMs, latency);
332
+ this.stats.insertMaxLatencyMs = Math.max(this.stats.insertMaxLatencyMs, latency);
333
+ }
334
+ /**
335
+ * Initialize RuVector database with optional dependency handling
36
336
  */
37
337
  async initialize() {
38
338
  if (this.initialized)
39
339
  return;
40
340
  try {
41
- // Try main ruvector package first (0.1.99+ with native SIMD)
341
+ // Try main ruvector package first (includes core, gnn, graph)
42
342
  let VectorDB;
43
- let ruvectorModule;
44
343
  try {
45
- ruvectorModule = await import('ruvector');
46
- VectorDB = ruvectorModule.VectorDB || ruvectorModule.default?.VectorDB;
344
+ const ruvector = await import('ruvector');
345
+ VectorDB = ruvector.VectorDb || ruvector.VectorDB
346
+ || ruvector.default?.VectorDb || ruvector.default?.VectorDB;
47
347
  }
48
348
  catch {
49
- // Fallback to @ruvector/core for backward compatibility
50
- ruvectorModule = await import('@ruvector/core');
51
- VectorDB = ruvectorModule.VectorDB || ruvectorModule.default?.VectorDB;
349
+ // Fallback to @ruvector/core. Its canonical export is VectorDb;
350
+ // VectorDB is only an alias in some versions.
351
+ const core = await import('@ruvector/core');
352
+ VectorDB = core.VectorDb || core.VectorDB
353
+ || core.default?.VectorDb || core.default?.VectorDB;
52
354
  }
53
355
  if (!VectorDB) {
54
- throw new Error('Could not find VectorDB export in ruvector');
356
+ throw new Error('Could not find VectorDb export in ruvector or @ruvector/core');
55
357
  }
56
358
  // Handle both 'dimension' and 'dimensions' for backward compatibility
57
359
  const dimensions = this.config.dimension ?? this.config.dimensions;
58
360
  if (!dimensions) {
59
361
  throw new Error('Vector dimension is required (use dimension or dimensions)');
60
362
  }
61
- // RuVector 0.1.99+ constructor - uses 'dimensions' (plural)
62
- this.db = new VectorDB({
63
- dimensions: dimensions,
64
- metric: this.config.metric,
65
- maxElements: this.config.maxElements || 100000,
66
- efConstruction: this.config.efConstruction || 200,
67
- m: this.config.M || 16
68
- });
69
- // Detect native SIMD availability
70
- if (ruvectorModule.isNative) {
71
- this.isNativeImpl = ruvectorModule.isNative();
72
- }
73
- if (ruvectorModule.getVersion) {
74
- const vInfo = ruvectorModule.getVersion();
75
- this.nativeVersion = typeof vInfo === 'string' ? vInfo : vInfo?.version || 'unknown';
363
+ // Determine HNSW parameters (adaptive or explicit)
364
+ const maxElements = this.config.maxElements || 100000;
365
+ const useAdaptive = this.config.adaptiveParams !== false;
366
+ const adaptiveParams = useAdaptive ? this.getAdaptiveParams(maxElements) : null;
367
+ const m = this.config.M ?? adaptiveParams?.M ?? 16;
368
+ const efConstruction = this.config.efConstruction ?? adaptiveParams?.efConstruction ?? 200;
369
+ const efSearch = this.config.efSearch ?? adaptiveParams?.efSearch ?? 100;
370
+ this.storagePath = await this.resolveStoragePath();
371
+ // HNSW parameters must go under `hnswConfig`: the binding ignores
372
+ // top-level keys, and an omitted hnswConfig selects a flat index.
373
+ this.VectorDbCtor = VectorDB;
374
+ this.nativeOptions = {
375
+ dimensions,
376
+ distanceMetric: NATIVE_METRIC[this.config.metric] ?? NATIVE_METRIC.cosine,
377
+ hnswConfig: { m, efConstruction, efSearch, maxElements },
378
+ };
379
+ this.db = new VectorDB({ ...this.nativeOptions, storagePath: this.storagePath });
380
+ this.defaultEfSearch = efSearch;
381
+ this.cachedCount = await this.db.len();
382
+ this.storeWasEmpty = this.cachedCount === 0;
383
+ // Initialize memory-mapped storage if enabled and available
384
+ if (this.mmapEnabled && this.config.mmapPath) {
385
+ await this.initializeMmap();
76
386
  }
77
387
  this.initialized = true;
78
388
  }
79
389
  catch (error) {
390
+ this.removeOwnedTempDir();
80
391
  const errorMessage = error.message;
392
+ // Special handling for path validation errors (from ruvector package)
393
+ // When using :memory:, ruvector may reject it as a path traversal attempt
394
+ // This is expected and not critical - users should use file-based paths for ruvector persistence
81
395
  if (errorMessage.includes('Path traversal') || errorMessage.includes('Invalid path')) {
82
396
  throw new Error(`RuVector does not support :memory: database paths.\n` +
83
397
  `Use a file path instead, or RuVector will be skipped and fallback backend will be used.\n` +
84
398
  `Original error: ${errorMessage}`);
85
399
  }
86
- throw new Error(`RuVector initialization failed. Please install: npm install ruvector@latest\n` +
400
+ throw new Error(`RuVector initialization failed. Please install: npm install ruvector\n` +
87
401
  `Or legacy packages: npm install @ruvector/core\n` +
88
402
  `Error: ${errorMessage}`);
89
403
  }
90
404
  }
91
405
  /**
92
- * Insert single vector with optional metadata.
93
- * Uses ruvector 0.1.99+ object-style API: insert({ id, vector, metadata? })
406
+ * Initialize memory-mapped storage for large indices
94
407
  */
95
- insert(id, embedding, metadata) {
96
- this.ensureInitialized();
97
- // ruvector 0.1.99+ uses object-style insert with async support
98
- // The VectorBackend interface is sync, so we call without awaiting.
99
- // The underlying native impl handles this via napi-rs sync path.
100
- const entry = {
101
- id,
102
- vector: Array.from(embedding)
103
- };
104
- if (metadata) {
105
- entry.metadata = metadata;
106
- this.metadata.set(id, metadata);
408
+ async initializeMmap() {
409
+ if (!this.config.mmapPath)
410
+ return;
411
+ // Validate path for security
412
+ validatePath(this.config.mmapPath);
413
+ let fd = null;
414
+ try {
415
+ const fs = await import('fs');
416
+ const pathModule = await import('path');
417
+ // Check if mmap module is available (optional native dependency)
418
+ let mmapModule = null;
419
+ try {
420
+ // Dynamic import of optional native module - known safe module
421
+ const moduleName = 'mmap-io';
422
+ mmapModule = await import(moduleName);
423
+ }
424
+ catch {
425
+ // mmap-io not available, fall back to regular I/O
426
+ console.error('[RuVectorBackend] mmap-io not available, using standard I/O');
427
+ return;
428
+ }
429
+ if (!mmapModule)
430
+ return;
431
+ const mmapPath = pathModule.resolve(this.config.mmapPath);
432
+ // Re-validate resolved path
433
+ validatePath(mmapPath);
434
+ const mmap = mmapModule;
435
+ // Create or open the mmap file
436
+ if (fs.existsSync(mmapPath)) {
437
+ fd = fs.openSync(mmapPath, 'r+');
438
+ const stats = fs.fstatSync(fd);
439
+ // Validate file size to prevent excessive memory mapping
440
+ const maxMmapSize = 4 * 1024 * 1024 * 1024; // 4GB max
441
+ if (stats.size > maxMmapSize) {
442
+ throw new Error(`Mmap file size ${stats.size} exceeds maximum of ${maxMmapSize}`);
443
+ }
444
+ this.mmapBuffer = mmap.map(stats.size, mmap.PROT_READ | mmap.PROT_WRITE, mmap.MAP_SHARED, fd, 0);
445
+ fs.closeSync(fd);
446
+ fd = null;
447
+ }
448
+ this.mmapEnabled = true;
107
449
  }
108
- // ruvector 0.1.99+ insert returns a promise, but the native layer
109
- // executes synchronously. We fire-and-forget for interface compat.
110
- const result = this.db.insert(entry);
111
- if (result && typeof result.catch === 'function') {
112
- result.catch((err) => {
113
- console.error(`[RuVectorBackend] Insert failed for ${id}: ${err.message}`);
114
- });
450
+ catch (error) {
451
+ console.error(`[RuVectorBackend] Failed to initialize mmap: ${error.message}`);
452
+ this.mmapEnabled = false;
453
+ }
454
+ finally {
455
+ // Ensure file descriptor is closed even on error
456
+ if (fd !== null) {
457
+ try {
458
+ const fs = await import('fs');
459
+ fs.closeSync(fd);
460
+ }
461
+ catch {
462
+ // Ignore close errors in cleanup
463
+ }
464
+ }
115
465
  }
116
466
  }
117
467
  /**
118
- * Batch insert for optimal performance.
119
- * Uses ruvector 0.1.99+ insertBatch([{ id, vector, metadata? }])
468
+ * Insert single vector with optional metadata.
469
+ *
470
+ * The native write is queued; searchAsync()/flush() wait for it. Use
471
+ * insertAsync() to await the write and observe its errors directly.
120
472
  */
121
- insertBatch(items) {
473
+ insert(id, embedding, metadata) {
474
+ // Validation errors throw here; native write errors are recorded by
475
+ // enqueue() and surfaced by flush()
476
+ this.queueInsert(id, embedding, metadata).catch(() => { });
477
+ }
478
+ async insertAsync(id, embedding, metadata) {
479
+ await this.queueInsert(id, embedding, metadata);
480
+ }
481
+ queueInsert(id, embedding, metadata) {
122
482
  this.ensureInitialized();
123
- const entries = items.map(item => {
124
- const entry = {
125
- id: item.id,
126
- vector: Array.from(item.embedding)
127
- };
128
- if (item.metadata) {
129
- entry.metadata = item.metadata;
130
- this.metadata.set(item.id, item.metadata);
131
- }
132
- return entry;
133
- });
134
- const result = this.db.insertBatch(entries);
135
- if (result && typeof result.catch === 'function') {
136
- result.catch((err) => {
137
- console.error(`[RuVectorBackend] Batch insert failed: ${err.message}`);
138
- });
139
- }
483
+ const startTime = this.config.enableStats !== false ? performance.now() : 0;
484
+ const vector = this.validateEntry(id, embedding, metadata);
485
+ this.setMetadata(id, metadata);
486
+ const write = this.enqueue(() => this.writeNative([{ id, vector }]));
487
+ this.recordInsertLatency(startTime);
488
+ return write;
140
489
  }
141
490
  /**
142
- * Set a RuVectorLearning instance for GNN-enhanced search
491
+ * Batch insert (queued; see insert())
143
492
  */
144
- setLearning(learning) {
145
- this.learning = learning;
493
+ insertBatch(items) {
494
+ // Validation errors throw here; see insert()
495
+ this.queueBatch(items).catch(() => { });
496
+ }
497
+ async insertBatchAsync(items) {
498
+ await this.queueBatch(items);
499
+ }
500
+ queueBatch(items) {
501
+ this.ensureInitialized();
502
+ const entries = [];
503
+ for (const item of items) {
504
+ entries.push({ id: item.id, vector: this.validateEntry(item.id, item.embedding, item.metadata) });
505
+ }
506
+ for (const item of items)
507
+ this.setMetadata(item.id, item.metadata);
508
+ const writes = [];
509
+ for (let i = 0; i < entries.length; i += MAX_BATCH_SIZE) {
510
+ const chunk = entries.slice(i, i + MAX_BATCH_SIZE);
511
+ writes.push(this.enqueue(() => this.writeNative(chunk)));
512
+ }
513
+ return Promise.all(writes).then(() => undefined);
146
514
  }
147
515
  /**
148
- * Get the current RuVectorLearning instance, if any
516
+ * Batch insert in chunks of `batchSize`.
517
+ *
518
+ * Native writes are serialized through the backend queue, so `concurrency`
519
+ * no longer changes throughput; it is kept for API compatibility.
149
520
  */
150
- getLearning() {
151
- return this.learning;
521
+ async insertBatchParallel(items, options) {
522
+ const batchSize = Math.max(1, options?.batchSize ?? 100);
523
+ for (let i = 0; i < items.length; i += batchSize) {
524
+ await this.insertBatchAsync(items.slice(i, i + batchSize));
525
+ }
152
526
  }
153
527
  /**
154
- * Search for k-nearest neighbors with optional filtering and GNN enhancement.
155
- * Uses ruvector 0.1.99+ search({ vector, k, efSearch?, filter? })
156
- * Results contain { id, score, vector?, metadata? }
528
+ * Insert using buffer pooling to reduce allocations
529
+ *
530
+ * Acquires a buffer from the pool, copies the embedding data,
531
+ * performs the insert, and returns the buffer to the pool.
532
+ *
533
+ * @param id - Vector ID
534
+ * @param embedding - Vector data (can be regular array or Float32Array)
535
+ * @param metadata - Optional metadata
157
536
  */
158
- search(query, k, options) {
537
+ insertWithPooledBuffer(id, embedding, metadata) {
159
538
  this.ensureInitialized();
160
- // Build search query for ruvector 0.1.99+ API
161
- const searchQuery = {
162
- vector: Array.from(query),
163
- k
164
- };
165
- if (options?.efSearch) {
166
- searchQuery.efSearch = options.efSearch;
167
- }
168
- if (options?.filter) {
169
- searchQuery.filter = options.filter;
170
- }
171
- // ruvector 0.1.99+ search is async but native layer is sync
172
- let rawResults = [];
173
- const searchPromise = this.db.search(searchQuery);
174
- if (searchPromise && typeof searchPromise.then === 'function') {
175
- // Synchronous extraction for interface compat - the native binding
176
- // resolves immediately when using N-API sync path
177
- // For truly async scenarios, use searchBatch() instead
178
- let resolved = false;
179
- searchPromise.then((r) => {
180
- rawResults = r || [];
181
- resolved = true;
182
- });
183
- // If promise resolved synchronously (common with native bindings)
184
- if (!resolved) {
185
- // Fallback: return empty and log warning
186
- console.warn('[RuVectorBackend] Search returned async promise; use searchBatch() for async searches');
187
- return [];
188
- }
189
- }
190
- else {
191
- rawResults = searchPromise || [];
192
- }
193
- // Convert ruvector 0.1.99+ results (score-based) to SearchResult format
194
- let results = rawResults
195
- .map((r) => ({
196
- id: r.id,
197
- distance: this.scoreToDistance(r.score),
198
- similarity: r.score,
199
- metadata: r.metadata || this.metadata.get(r.id)
200
- }))
201
- .filter((r) => {
202
- if (options?.threshold && r.similarity < options.threshold) {
203
- return false;
204
- }
205
- if (options?.filter && r.metadata) {
206
- return Object.entries(options.filter).every(([key, value]) => r.metadata[key] === value);
539
+ const dimension = this.config.dimension;
540
+ // Acquire buffer from pool
541
+ const buffer = this.bufferPool.acquire(dimension);
542
+ try {
543
+ // Copy data to pooled buffer
544
+ if (embedding instanceof Float32Array) {
545
+ buffer.set(embedding);
207
546
  }
208
- return true;
209
- });
210
- // Enhance with GNN if available
211
- if (this.learning && this.learning.getState().initialized && results.length > 0) {
212
- try {
213
- const neighbors = [];
214
- const weights = [];
215
- for (const r of results) {
216
- weights.push(r.similarity);
217
- neighbors.push(query);
218
- }
219
- for (let i = 0; i < rawResults.length && i < results.length; i++) {
220
- const raw = rawResults[i];
221
- if (raw.vector) {
222
- const vec = raw.vector instanceof Float32Array
223
- ? raw.vector
224
- : new Float32Array(Object.values(raw.vector));
225
- neighbors[i] = vec;
226
- }
547
+ else {
548
+ for (let i = 0; i < dimension; i++) {
549
+ buffer[i] = embedding[i] ?? 0;
227
550
  }
228
- const enhanced = this.learning.enhance(query, neighbors, weights);
229
- if (enhanced && enhanced.length > 0) {
230
- const enhancedQuery = {
231
- vector: Array.from(enhanced),
232
- k
233
- };
234
- if (options?.efSearch)
235
- enhancedQuery.efSearch = options.efSearch;
236
- const enhancedPromise = this.db.search(enhancedQuery);
237
- let enhancedRaw = [];
238
- if (enhancedPromise && typeof enhancedPromise.then === 'function') {
239
- let resolved = false;
240
- enhancedPromise.then((r) => { enhancedRaw = r || []; resolved = true; });
241
- if (!resolved)
242
- return results;
243
- }
244
- else {
245
- enhancedRaw = enhancedPromise || [];
246
- }
247
- const enhancedResults = enhancedRaw
248
- .map((r) => ({
249
- id: r.id,
250
- distance: this.scoreToDistance(r.score),
251
- similarity: r.score,
252
- metadata: r.metadata || this.metadata.get(r.id)
253
- }))
254
- .filter((r) => {
255
- if (options?.threshold && r.similarity < options.threshold)
256
- return false;
257
- if (options?.filter && r.metadata) {
258
- return Object.entries(options.filter).every(([key, value]) => r.metadata[key] === value);
259
- }
260
- return true;
261
- });
262
- if (enhancedResults.length > 0) {
263
- results = enhancedResults;
264
- }
265
- }
266
- }
267
- catch {
268
- // Fall through to raw results if GNN enhancement fails
269
551
  }
552
+ // insert() copies the vector before queueing, so the buffer can be reused
553
+ this.insert(id, buffer, metadata);
270
554
  }
271
- return results;
555
+ finally {
556
+ // Return buffer to pool
557
+ this.bufferPool.release(buffer);
558
+ }
559
+ }
560
+ /**
561
+ * Synchronous search is not possible: every ruvector-core call is async.
562
+ * Use searchAsync() (or searchVectors() from VectorBackend.ts).
563
+ */
564
+ search(_query, _k, _options) {
565
+ throw new Error('RuVectorBackend search is async-only. Use searchAsync() or the VectorBackendAsync interface.');
272
566
  }
273
567
  /**
274
- * Batch search for parallel query processing (0.1.99+).
275
- * Executes multiple searches concurrently for throughput.
568
+ * Search for k-nearest neighbors with optional filtering.
569
+ * Waits for queued writes so a preceding insert is visible.
276
570
  */
277
- async searchBatch(queries, k, options) {
571
+ async searchAsync(query, k, options) {
278
572
  this.ensureInitialized();
279
- const results = await Promise.all(queries.map(async (query) => {
280
- const searchQuery = {
281
- vector: Array.from(query),
282
- k
283
- };
284
- if (options?.efSearch)
285
- searchQuery.efSearch = options.efSearch;
286
- if (options?.filter)
287
- searchQuery.filter = options.filter;
288
- const rawResults = await this.db.search(searchQuery);
289
- return (rawResults || []).map((r) => ({
290
- id: r.id,
291
- distance: this.scoreToDistance(r.score),
292
- similarity: r.score,
293
- metadata: r.metadata || this.metadata.get(r.id)
294
- })).filter((r) => {
295
- if (options?.threshold && r.similarity < options.threshold)
296
- return false;
297
- if (options?.filter && r.metadata) {
298
- return Object.entries(options.filter).every(([key, value]) => r.metadata[key] === value);
299
- }
300
- return true;
301
- });
302
- }));
573
+ await this.queue;
574
+ const startTime = this.config.enableStats !== false ? performance.now() : 0;
575
+ const hasFilter = !!options?.filter && Object.keys(options.filter).length > 0;
576
+ // Metadata filters are applied after the ANN search, so over-fetch.
577
+ const fetchK = hasFilter ? Math.min(k * 4, Math.max(k, this.cachedCount)) : k;
578
+ const raw = fetchK > 0
579
+ ? await this.db.search({
580
+ vector: query instanceof Float32Array ? query : new Float32Array(query),
581
+ k: fetchK,
582
+ efSearch: options?.efSearch ?? this.defaultEfSearch,
583
+ })
584
+ : [];
585
+ const results = [];
586
+ for (const r of raw) {
587
+ // ruvector-core reports a distance in `score` (0 = identical for cosine)
588
+ const distance = r.score;
589
+ const similarity = this.distanceToSimilarity(distance);
590
+ if (options?.threshold !== undefined && similarity < options.threshold)
591
+ continue;
592
+ const metadata = this.metadata.get(r.id);
593
+ if (hasFilter && !this.matchesFilter(metadata, options.filter))
594
+ continue;
595
+ results.push({ id: r.id, distance, similarity, metadata });
596
+ if (results.length >= k)
597
+ break;
598
+ }
599
+ if (this.config.enableStats !== false) {
600
+ const latency = performance.now() - startTime;
601
+ this.stats.searchCount++;
602
+ this.stats.searchTotalLatencyMs += latency;
603
+ this.stats.searchMinLatencyMs = Math.min(this.stats.searchMinLatencyMs, latency);
604
+ this.stats.searchMaxLatencyMs = Math.max(this.stats.searchMaxLatencyMs, latency);
605
+ }
303
606
  return results;
304
607
  }
608
+ matchesFilter(metadata, filter) {
609
+ if (!metadata)
610
+ return false;
611
+ for (const [key, value] of Object.entries(filter)) {
612
+ if (metadata[key] !== value)
613
+ return false;
614
+ }
615
+ return true;
616
+ }
617
+ setMetadata(id, metadata) {
618
+ if (metadata) {
619
+ this.metadata.set(id, metadata);
620
+ }
621
+ else {
622
+ this.metadata.delete(id);
623
+ }
624
+ }
305
625
  /**
306
- * Remove vector by ID.
307
- * Uses ruvector 0.1.99+ delete(id) instead of remove(id)
626
+ * Remove vector by ID. The native delete is queued; the return value only
627
+ * reports whether this instance has seen the id. Use removeAsync() for the
628
+ * authoritative result.
308
629
  */
309
630
  remove(id) {
631
+ this.ensureInitialized();
632
+ const known = this.knownIds.has(id) || this.metadata.has(id);
633
+ this.removeAsync(id).catch(() => { });
634
+ return known;
635
+ }
636
+ async removeAsync(id) {
310
637
  this.ensureInitialized();
311
638
  this.metadata.delete(id);
312
- try {
313
- const result = this.db.delete(id);
314
- // Handle async result
315
- if (result && typeof result.then === 'function') {
316
- let resolved = false;
317
- let success = false;
318
- result.then((r) => { success = r; resolved = true; });
319
- if (resolved)
320
- return success;
321
- // Fire-and-forget for async case
322
- result.catch(() => { });
323
- return true;
324
- }
325
- return result !== false;
326
- }
327
- catch {
328
- return false;
329
- }
639
+ return this.enqueue(() => this.deleteNative(id));
330
640
  }
331
641
  /**
332
- * Get database statistics including native SIMD status
642
+ * Get database statistics. `count` reflects settled writes; await flush()
643
+ * or use getStatsAsync() to include queued ones.
333
644
  */
334
645
  getStats() {
335
646
  this.ensureInitialized();
336
- let count = 0;
337
- const lenResult = this.db.len();
338
- if (lenResult && typeof lenResult.then === 'function') {
339
- let resolved = false;
340
- lenResult.then((c) => { count = c; resolved = true; });
341
- if (!resolved)
342
- count = this.metadata.size; // fallback
343
- }
344
- else {
345
- count = lenResult || 0;
346
- }
347
647
  return {
348
- count,
648
+ count: this.cachedCount,
349
649
  dimension: this.config.dimension || 384,
350
650
  metric: this.config.metric,
351
651
  backend: 'ruvector',
352
652
  memoryUsage: 0,
353
- // Extended stats for 0.1.99+
354
- ...(this.isNativeImpl && {
355
- nativeVersion: this.nativeVersion,
356
- simdEnabled: true,
357
- implementation: 'native'
358
- })
359
653
  };
360
654
  }
655
+ async getStatsAsync() {
656
+ this.ensureInitialized();
657
+ await this.queue;
658
+ this.cachedCount = await this.db.len();
659
+ return this.getStats();
660
+ }
661
+ /**
662
+ * Wait for every queued native write. Throws the most recent write failure
663
+ * since the last flush, if any.
664
+ */
665
+ async flush() {
666
+ if (!this.initialized)
667
+ return;
668
+ await this.queue;
669
+ if (this.lastWriteError) {
670
+ const err = this.lastWriteError;
671
+ this.lastWriteError = null;
672
+ throw err;
673
+ }
674
+ }
361
675
  /**
362
- * Get extended stats including SIMD and version info
676
+ * Get extended performance statistics
677
+ *
678
+ * Returns detailed metrics including latencies, cache stats, and buffer pool info.
363
679
  */
364
680
  getExtendedStats() {
365
- const base = this.getStats();
366
681
  return {
367
- count: base.count,
368
- dimension: base.dimension,
369
- metric: base.metric,
370
- backend: base.backend,
371
- nativeVersion: this.nativeVersion,
372
- isNative: this.isNativeImpl,
373
- simdEnabled: this.isNativeImpl
682
+ basic: this.getStats(),
683
+ performance: {
684
+ ...this.stats,
685
+ insertAvgLatencyMs: this.stats.insertCount > 0
686
+ ? this.stats.insertTotalLatencyMs / this.stats.insertCount
687
+ : 0,
688
+ searchAvgLatencyMs: this.stats.searchCount > 0
689
+ ? this.stats.searchTotalLatencyMs / this.stats.searchCount
690
+ : 0,
691
+ },
692
+ bufferPool: this.bufferPool.getStats(),
693
+ config: {
694
+ parallelConcurrency: this.config.parallelConcurrency ?? 4,
695
+ adaptiveParams: this.config.adaptiveParams !== false,
696
+ mmapEnabled: this.mmapEnabled,
697
+ },
374
698
  };
375
699
  }
700
+ /**
701
+ * Reset performance statistics
702
+ */
703
+ resetStats() {
704
+ this.stats = {
705
+ insertCount: 0,
706
+ insertTotalLatencyMs: 0,
707
+ insertMinLatencyMs: Infinity,
708
+ insertMaxLatencyMs: 0,
709
+ searchCount: 0,
710
+ searchTotalLatencyMs: 0,
711
+ searchMinLatencyMs: Infinity,
712
+ searchMaxLatencyMs: 0,
713
+ cacheHits: 0,
714
+ cacheMisses: 0,
715
+ lastMemoryUsage: 0,
716
+ indexRebuildCount: 0,
717
+ };
718
+ }
719
+ /**
720
+ * Update index parameters adaptively based on current dataset size
721
+ *
722
+ * This triggers an index rebuild with optimal parameters for the current size.
723
+ * Should be called after significant data changes.
724
+ */
725
+ async updateAdaptiveParams() {
726
+ this.ensureInitialized();
727
+ if (this.config.adaptiveParams === false) {
728
+ return;
729
+ }
730
+ const params = this.getAdaptiveParams(this.cachedCount);
731
+ // M and efConstruction are fixed when the native index is built; efSearch
732
+ // is a per-query parameter, so adopt the recommended value as the default.
733
+ this.defaultEfSearch = params.efSearch;
734
+ this.stats.indexRebuildCount++;
735
+ }
376
736
  /**
377
737
  * Save index and metadata to disk
378
738
  */
379
- async save(path) {
739
+ async save(savePath) {
380
740
  this.ensureInitialized();
381
- // Save vector index (if ruvector supports it)
382
- if (typeof this.db.save === 'function') {
383
- await this.db.save(path);
741
+ // Validate path for security
742
+ validatePath(savePath);
743
+ // The native index persists itself at storagePath; once queued writes have
744
+ // settled, saving elsewhere is a file copy.
745
+ await this.flush();
746
+ const pathModule = await import('path');
747
+ const target = pathModule.resolve(savePath);
748
+ if (target !== this.storagePath) {
749
+ const fsp = await import('fs/promises');
750
+ await fsp.copyFile(this.storagePath, target);
384
751
  }
385
752
  // Save metadata separately as JSON
386
- const metadataPath = path + '.meta.json';
753
+ const metadataPath = savePath + '.meta.json';
754
+ validatePath(metadataPath);
387
755
  const fs = await import('fs/promises');
388
756
  await fs.writeFile(metadataPath, JSON.stringify(Object.fromEntries(this.metadata), null, 2));
389
757
  }
390
758
  /**
391
759
  * Load index and metadata from disk
392
760
  */
393
- async load(path) {
761
+ async load(loadPath) {
394
762
  this.ensureInitialized();
395
- // Load vector index (if ruvector supports it)
396
- if (typeof this.db.load === 'function') {
397
- await this.db.load(path);
763
+ // Validate path for security
764
+ validatePath(loadPath);
765
+ // Reopen the native index at loadPath
766
+ await this.flush();
767
+ const pathModule = await import('path');
768
+ const source = pathModule.resolve(loadPath);
769
+ if (source !== this.storagePath) {
770
+ const fsSync = await import('fs');
771
+ if (!fsSync.existsSync(source)) {
772
+ throw new Error(`RuVector index not found: ${loadPath}`);
773
+ }
774
+ this.db = new this.VectorDbCtor({ ...this.nativeOptions, storagePath: source });
775
+ this.removeOwnedTempDir();
776
+ this.storagePath = source;
398
777
  }
778
+ this.cachedCount = await this.db.len();
779
+ this.storeWasEmpty = this.cachedCount === 0;
780
+ this.knownIds.clear();
781
+ this.metadata.clear();
399
782
  // Load metadata
400
- const metadataPath = path + '.meta.json';
783
+ const metadataPath = loadPath + '.meta.json';
784
+ validatePath(metadataPath);
401
785
  try {
402
786
  const fs = await import('fs/promises');
403
787
  const data = await fs.readFile(metadataPath, 'utf-8');
404
- this.metadata = new Map(Object.entries(JSON.parse(data)));
788
+ // Safely parse metadata with validation
789
+ let parsed;
790
+ try {
791
+ parsed = JSON.parse(data);
792
+ }
793
+ catch {
794
+ throw new Error('Invalid JSON in metadata file');
795
+ }
796
+ // Validate parsed data is a plain object
797
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
798
+ throw new Error('Metadata must be a plain object');
799
+ }
800
+ // Check for prototype pollution attempts
801
+ const unsafeKeys = ['__proto__', 'constructor', 'prototype'];
802
+ for (const key of Object.keys(parsed)) {
803
+ if (unsafeKeys.includes(key)) {
804
+ throw new Error(`Forbidden key in metadata: ${key}`);
805
+ }
806
+ }
807
+ this.metadata = new Map(Object.entries(parsed));
808
+ // Enforce size limit
809
+ if (this.metadata.size > MAX_METADATA_ENTRIES) {
810
+ this.metadata.clear();
811
+ throw new Error(`Loaded metadata exceeds maximum of ${MAX_METADATA_ENTRIES} entries`);
812
+ }
405
813
  }
406
- catch {
407
- console.debug(`[RuVectorBackend] No metadata file found at ${metadataPath}`);
814
+ catch (error) {
815
+ if (error.code === 'ENOENT') {
816
+ // No metadata file - this is okay for backward compatibility
817
+ console.error(`[RuVectorBackend] No metadata file found at ${metadataPath}`);
818
+ }
819
+ else {
820
+ throw error;
821
+ }
408
822
  }
409
823
  }
410
824
  /**
411
825
  * Close and cleanup resources
412
826
  */
413
827
  close() {
828
+ // The native binding has no close(); drop our reference once queued
829
+ // writes settle, then remove a temp index this instance created.
830
+ const ownedTempDir = this.ownedTempDir;
831
+ this.ownedTempDir = null;
832
+ if (ownedTempDir) {
833
+ this.queue.finally(() => {
834
+ this.ownedTempDir = ownedTempDir;
835
+ this.removeOwnedTempDir();
836
+ });
837
+ }
838
+ this.initialized = false;
839
+ this.knownIds.clear();
414
840
  this.metadata.clear();
841
+ // Clear buffer pool
842
+ this.bufferPool.clear();
843
+ // Clean up mmap buffer
844
+ if (this.mmapBuffer) {
845
+ this.mmapBuffer = null;
846
+ }
847
+ // Reset stats
848
+ this.resetStats();
415
849
  }
416
850
  /**
417
- * Convert score to distance for backward compatibility.
418
- * ruvector 0.1.99+ returns scores (higher = more similar).
851
+ * Convert distance to similarity score based on metric
852
+ *
853
+ * Cosine: distance is already in [0, 2], where 0 = identical
854
+ * L2: exponential decay for unbounded distances
855
+ * IP: negative inner product, so negate for similarity
419
856
  */
420
- scoreToDistance(score) {
857
+ distanceToSimilarity(distance) {
421
858
  switch (this.config.metric) {
422
859
  case 'cosine':
423
- return 1 - score;
860
+ return 1 - distance; // cosine distance is 1 - similarity
424
861
  case 'l2':
425
- return score === 0 ? Infinity : -Math.log(score);
862
+ return Math.exp(-distance); // exponential decay
426
863
  case 'ip':
427
- return -score;
864
+ return -distance; // inner product: higher is better
428
865
  default:
429
- return 1 - score;
866
+ return 1 - distance;
430
867
  }
431
868
  }
432
869
  /**
@@ -437,5 +874,42 @@ export class RuVectorBackend {
437
874
  throw new Error('RuVectorBackend not initialized. Call initialize() first.');
438
875
  }
439
876
  }
877
+ /**
878
+ * Get the buffer pool instance for advanced use cases
879
+ */
880
+ getBufferPool() {
881
+ return this.bufferPool;
882
+ }
883
+ /**
884
+ * Get the current concurrency semaphore status
885
+ */
886
+ getConcurrencyStatus() {
887
+ return {
888
+ available: this.semaphore.available,
889
+ configured: this.config.parallelConcurrency ?? 4,
890
+ };
891
+ }
892
+ /**
893
+ * Check if memory-mapped storage is active
894
+ */
895
+ isMmapEnabled() {
896
+ return this.mmapEnabled && this.mmapBuffer !== null;
897
+ }
898
+ /**
899
+ * Get recommended adaptive parameters for a given dataset size
900
+ */
901
+ static getRecommendedParams(datasetSize) {
902
+ if (datasetSize < 1000) {
903
+ return { M: 8, efConstruction: 100, efSearch: 50 };
904
+ }
905
+ else if (datasetSize <= 100000) {
906
+ return { M: 16, efConstruction: 200, efSearch: 100 };
907
+ }
908
+ else {
909
+ return { M: 32, efConstruction: 400, efSearch: 200 };
910
+ }
911
+ }
440
912
  }
913
+ // Export helper classes for advanced use cases
914
+ export { Semaphore, BufferPool };
441
915
  //# sourceMappingURL=RuVectorBackend.js.map