agentdb 3.0.0-alpha.10 → 3.0.0-alpha.12
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.
- package/LICENSE +21 -0
- package/README.md +2821 -225
- package/dist/src/backends/VectorBackend.d.ts +31 -6
- package/dist/src/backends/VectorBackend.d.ts.map +1 -1
- package/dist/src/backends/detector.js.map +1 -1
- package/dist/src/backends/factory.d.ts +16 -33
- package/dist/src/backends/factory.d.ts.map +1 -1
- package/dist/src/backends/factory.js +138 -108
- package/dist/src/backends/factory.js.map +1 -1
- package/dist/src/backends/hnswlib/HNSWLibBackend.d.ts.map +1 -1
- package/dist/src/backends/hnswlib/HNSWLibBackend.js +29 -2
- package/dist/src/backends/hnswlib/HNSWLibBackend.js.map +1 -1
- package/dist/src/backends/ruvector/RuVectorBackend.d.ts +198 -45
- package/dist/src/backends/ruvector/RuVectorBackend.d.ts.map +1 -1
- package/dist/src/backends/ruvector/RuVectorBackend.js +612 -277
- package/dist/src/backends/ruvector/RuVectorBackend.js.map +1 -1
- package/dist/src/backends/ruvector/RuVectorLearning.d.ts +0 -4
- package/dist/src/backends/ruvector/RuVectorLearning.d.ts.map +1 -1
- package/dist/src/backends/ruvector/RuVectorLearning.js +0 -6
- package/dist/src/backends/ruvector/RuVectorLearning.js.map +1 -1
- package/dist/src/backends/rvf/AdaptiveIndexTuner.d.ts +175 -0
- package/dist/src/backends/rvf/AdaptiveIndexTuner.d.ts.map +1 -0
- package/dist/src/backends/rvf/AdaptiveIndexTuner.js +559 -0
- package/dist/src/backends/rvf/AdaptiveIndexTuner.js.map +1 -0
- package/dist/src/backends/rvf/ContrastiveTrainer.d.ts +148 -0
- package/dist/src/backends/rvf/ContrastiveTrainer.d.ts.map +1 -0
- package/dist/src/backends/rvf/ContrastiveTrainer.js +438 -0
- package/dist/src/backends/rvf/ContrastiveTrainer.js.map +1 -0
- package/dist/src/backends/rvf/FederatedSessionManager.d.ts +211 -0
- package/dist/src/backends/rvf/FederatedSessionManager.d.ts.map +1 -0
- package/dist/src/backends/rvf/FederatedSessionManager.js +389 -0
- package/dist/src/backends/rvf/FederatedSessionManager.js.map +1 -0
- package/dist/src/backends/rvf/FilterBuilder.d.ts +136 -0
- package/dist/src/backends/rvf/FilterBuilder.d.ts.map +1 -0
- package/dist/src/backends/rvf/FilterBuilder.js +157 -0
- package/dist/src/backends/rvf/FilterBuilder.js.map +1 -0
- package/dist/src/backends/rvf/NativeAccelerator.d.ts +140 -0
- package/dist/src/backends/rvf/NativeAccelerator.d.ts.map +1 -0
- package/dist/src/backends/rvf/NativeAccelerator.js +630 -0
- package/dist/src/backends/rvf/NativeAccelerator.js.map +1 -0
- package/dist/src/backends/rvf/RvfBackend.d.ts +194 -0
- package/dist/src/backends/rvf/RvfBackend.d.ts.map +1 -0
- package/dist/src/backends/rvf/RvfBackend.js +607 -0
- package/dist/src/backends/rvf/RvfBackend.js.map +1 -0
- package/dist/src/backends/rvf/RvfSolver.d.ts +175 -0
- package/dist/src/backends/rvf/RvfSolver.d.ts.map +1 -0
- package/dist/src/backends/rvf/RvfSolver.js +176 -0
- package/dist/src/backends/rvf/RvfSolver.js.map +1 -0
- package/dist/src/backends/rvf/SelfLearningRvfBackend.d.ts +143 -0
- package/dist/src/backends/rvf/SelfLearningRvfBackend.d.ts.map +1 -0
- package/dist/src/backends/rvf/SelfLearningRvfBackend.js +569 -0
- package/dist/src/backends/rvf/SelfLearningRvfBackend.js.map +1 -0
- package/dist/src/backends/rvf/SemanticQueryRouter.d.ts +128 -0
- package/dist/src/backends/rvf/SemanticQueryRouter.d.ts.map +1 -0
- package/dist/src/backends/rvf/SemanticQueryRouter.js +415 -0
- package/dist/src/backends/rvf/SemanticQueryRouter.js.map +1 -0
- package/dist/src/backends/rvf/SimdFallbacks.d.ts +25 -0
- package/dist/src/backends/rvf/SimdFallbacks.d.ts.map +1 -0
- package/dist/src/backends/rvf/SimdFallbacks.js +287 -0
- package/dist/src/backends/rvf/SimdFallbacks.js.map +1 -0
- package/dist/src/backends/rvf/SolverBandit.d.ts +100 -0
- package/dist/src/backends/rvf/SolverBandit.d.ts.map +1 -0
- package/dist/src/backends/rvf/SolverBandit.js +216 -0
- package/dist/src/backends/rvf/SolverBandit.js.map +1 -0
- package/dist/src/backends/rvf/SonaLearningBackend.d.ts +157 -0
- package/dist/src/backends/rvf/SonaLearningBackend.d.ts.map +1 -0
- package/dist/src/backends/rvf/SonaLearningBackend.js +283 -0
- package/dist/src/backends/rvf/SonaLearningBackend.js.map +1 -0
- package/dist/src/backends/rvf/SqlJsRvfBackend.d.ts +77 -0
- package/dist/src/backends/rvf/SqlJsRvfBackend.d.ts.map +1 -0
- package/dist/src/backends/rvf/SqlJsRvfBackend.js +382 -0
- package/dist/src/backends/rvf/SqlJsRvfBackend.js.map +1 -0
- package/dist/src/backends/rvf/WasmStoreBridge.d.ts +27 -0
- package/dist/src/backends/rvf/WasmStoreBridge.d.ts.map +1 -0
- package/dist/src/backends/rvf/WasmStoreBridge.js +87 -0
- package/dist/src/backends/rvf/WasmStoreBridge.js.map +1 -0
- package/dist/src/backends/rvf/validation.d.ts +20 -0
- package/dist/src/backends/rvf/validation.d.ts.map +1 -0
- package/dist/src/backends/rvf/validation.js +78 -0
- package/dist/src/backends/rvf/validation.js.map +1 -0
- package/dist/src/benchmark/BenchmarkSuite.d.ts +318 -0
- package/dist/src/benchmark/BenchmarkSuite.d.ts.map +1 -0
- package/dist/src/benchmark/BenchmarkSuite.js +984 -0
- package/dist/src/benchmark/BenchmarkSuite.js.map +1 -0
- package/dist/src/benchmark/index.d.ts +29 -0
- package/dist/src/benchmark/index.d.ts.map +1 -0
- package/dist/src/benchmark/index.js +39 -0
- package/dist/src/benchmark/index.js.map +1 -0
- package/dist/src/browser/AttentionBrowser.d.ts.map +1 -1
- package/dist/src/browser/AttentionBrowser.js +1 -0
- package/dist/src/browser/AttentionBrowser.js.map +1 -1
- package/dist/src/cli/agentdb-cli.d.ts +13 -0
- package/dist/src/cli/agentdb-cli.d.ts.map +1 -1
- package/dist/src/cli/agentdb-cli.js +803 -94
- package/dist/src/cli/agentdb-cli.js.map +1 -1
- package/dist/src/cli/commands/hyperbolic.d.ts +11 -0
- package/dist/src/cli/commands/hyperbolic.d.ts.map +1 -0
- package/dist/src/cli/commands/hyperbolic.js +428 -0
- package/dist/src/cli/commands/hyperbolic.js.map +1 -0
- package/dist/src/cli/commands/learn.d.ts +11 -0
- package/dist/src/cli/commands/learn.d.ts.map +1 -0
- package/dist/src/cli/commands/learn.js +404 -0
- package/dist/src/cli/commands/learn.js.map +1 -0
- package/dist/src/cli/commands/migrate.d.ts +15 -0
- package/dist/src/cli/commands/migrate.d.ts.map +1 -1
- package/dist/src/cli/commands/migrate.js +176 -8
- package/dist/src/cli/commands/migrate.js.map +1 -1
- package/dist/src/cli/commands/route.d.ts +11 -0
- package/dist/src/cli/commands/route.d.ts.map +1 -0
- package/dist/src/cli/commands/route.js +414 -0
- package/dist/src/cli/commands/route.js.map +1 -0
- package/dist/src/cli/commands/rvf.d.ts +21 -0
- package/dist/src/cli/commands/rvf.d.ts.map +1 -0
- package/dist/src/cli/commands/rvf.js +448 -0
- package/dist/src/cli/commands/rvf.js.map +1 -0
- package/dist/src/cli/lib/report-store.d.ts +2 -1
- package/dist/src/cli/lib/report-store.d.ts.map +1 -1
- package/dist/src/cli/lib/report-store.js +85 -65
- package/dist/src/cli/lib/report-store.js.map +1 -1
- package/dist/src/cli/lib/simulation-runner.d.ts +40 -3
- package/dist/src/cli/lib/simulation-runner.d.ts.map +1 -1
- package/dist/src/cli/lib/simulation-runner.js +248 -6
- package/dist/src/cli/lib/simulation-runner.js.map +1 -1
- package/dist/src/compatibility/DeprecationWarnings.d.ts +54 -0
- package/dist/src/compatibility/DeprecationWarnings.d.ts.map +1 -0
- package/dist/src/compatibility/DeprecationWarnings.js +131 -0
- package/dist/src/compatibility/DeprecationWarnings.js.map +1 -0
- package/dist/src/compatibility/MigrationUtilities.d.ts +30 -0
- package/dist/src/compatibility/MigrationUtilities.d.ts.map +1 -0
- package/dist/src/compatibility/MigrationUtilities.js +184 -0
- package/dist/src/compatibility/MigrationUtilities.js.map +1 -0
- package/dist/src/compatibility/V1toV2Adapter.d.ts +76 -0
- package/dist/src/compatibility/V1toV2Adapter.d.ts.map +1 -0
- package/dist/src/compatibility/V1toV2Adapter.js +185 -0
- package/dist/src/compatibility/V1toV2Adapter.js.map +1 -0
- package/dist/src/compatibility/VersionDetector.d.ts +32 -0
- package/dist/src/compatibility/VersionDetector.d.ts.map +1 -0
- package/dist/src/compatibility/VersionDetector.js +144 -0
- package/dist/src/compatibility/VersionDetector.js.map +1 -0
- package/dist/src/compatibility/index.d.ts +14 -0
- package/dist/src/compatibility/index.d.ts.map +1 -0
- package/dist/src/compatibility/index.js +21 -0
- package/dist/src/compatibility/index.js.map +1 -0
- package/dist/src/compatibility/types.d.ts +103 -0
- package/dist/src/compatibility/types.d.ts.map +1 -0
- package/dist/src/compatibility/types.js +5 -0
- package/dist/src/compatibility/types.js.map +1 -0
- package/dist/src/controllers/AttentionService.d.ts +99 -202
- package/dist/src/controllers/AttentionService.d.ts.map +1 -1
- package/dist/src/controllers/AttentionService.js +450 -558
- package/dist/src/controllers/AttentionService.js.map +1 -1
- package/dist/src/controllers/CausalMemoryGraph.d.ts +30 -5
- package/dist/src/controllers/CausalMemoryGraph.d.ts.map +1 -1
- package/dist/src/controllers/CausalMemoryGraph.js +89 -13
- package/dist/src/controllers/CausalMemoryGraph.js.map +1 -1
- package/dist/src/controllers/CausalRecall.d.ts +4 -0
- package/dist/src/controllers/CausalRecall.d.ts.map +1 -1
- package/dist/src/controllers/CausalRecall.js +19 -2
- package/dist/src/controllers/CausalRecall.js.map +1 -1
- package/dist/src/controllers/EmbeddingService.d.ts.map +1 -1
- package/dist/src/controllers/EmbeddingService.js +28 -11
- package/dist/src/controllers/EmbeddingService.js.map +1 -1
- package/dist/src/controllers/EnhancedEmbeddingService.d.ts +4 -0
- package/dist/src/controllers/EnhancedEmbeddingService.d.ts.map +1 -1
- package/dist/src/controllers/EnhancedEmbeddingService.js +17 -3
- package/dist/src/controllers/EnhancedEmbeddingService.js.map +1 -1
- package/dist/src/controllers/ExplainableRecall.d.ts +1 -1
- package/dist/src/controllers/ExplainableRecall.d.ts.map +1 -1
- package/dist/src/controllers/ExplainableRecall.js +1 -1
- package/dist/src/controllers/ExplainableRecall.js.map +1 -1
- package/dist/src/controllers/HNSWIndex.d.ts +20 -2
- package/dist/src/controllers/HNSWIndex.d.ts.map +1 -1
- package/dist/src/controllers/HNSWIndex.js +82 -6
- package/dist/src/controllers/HNSWIndex.js.map +1 -1
- package/dist/src/controllers/LearningSystem.d.ts +1 -17
- package/dist/src/controllers/LearningSystem.d.ts.map +1 -1
- package/dist/src/controllers/LearningSystem.js +18 -135
- package/dist/src/controllers/LearningSystem.js.map +1 -1
- package/dist/src/controllers/MemoryController.d.ts +161 -0
- package/dist/src/controllers/MemoryController.d.ts.map +1 -0
- package/dist/src/controllers/MemoryController.js +303 -0
- package/dist/src/controllers/MemoryController.js.map +1 -0
- package/dist/src/controllers/MincutService.d.ts +92 -0
- package/dist/src/controllers/MincutService.d.ts.map +1 -0
- package/dist/src/controllers/MincutService.js +336 -0
- package/dist/src/controllers/MincutService.js.map +1 -0
- package/dist/src/controllers/NightlyLearner.d.ts +5 -1
- package/dist/src/controllers/NightlyLearner.d.ts.map +1 -1
- package/dist/src/controllers/NightlyLearner.js +17 -3
- package/dist/src/controllers/NightlyLearner.js.map +1 -1
- package/dist/src/controllers/QUICClient.d.ts +45 -0
- package/dist/src/controllers/QUICClient.d.ts.map +1 -1
- package/dist/src/controllers/QUICClient.js +190 -0
- package/dist/src/controllers/QUICClient.js.map +1 -1
- package/dist/src/controllers/ReasoningBank.d.ts +6 -3
- package/dist/src/controllers/ReasoningBank.d.ts.map +1 -1
- package/dist/src/controllers/ReasoningBank.js +47 -41
- package/dist/src/controllers/ReasoningBank.js.map +1 -1
- package/dist/src/controllers/ReflexionMemory.d.ts +115 -6
- package/dist/src/controllers/ReflexionMemory.d.ts.map +1 -1
- package/dist/src/controllers/ReflexionMemory.js +541 -213
- package/dist/src/controllers/ReflexionMemory.js.map +1 -1
- package/dist/src/controllers/SkillLibrary.d.ts +27 -3
- package/dist/src/controllers/SkillLibrary.d.ts.map +1 -1
- package/dist/src/controllers/SkillLibrary.js +187 -91
- package/dist/src/controllers/SkillLibrary.js.map +1 -1
- package/dist/src/controllers/SparsificationService.d.ts +151 -0
- package/dist/src/controllers/SparsificationService.d.ts.map +1 -0
- package/dist/src/controllers/SparsificationService.js +375 -0
- package/dist/src/controllers/SparsificationService.js.map +1 -0
- package/dist/src/controllers/SyncCoordinator.d.ts.map +1 -1
- package/dist/src/controllers/SyncCoordinator.js +115 -3
- package/dist/src/controllers/SyncCoordinator.js.map +1 -1
- package/dist/src/controllers/WASMVectorSearch.d.ts +12 -30
- package/dist/src/controllers/WASMVectorSearch.d.ts.map +1 -1
- package/dist/src/controllers/WASMVectorSearch.js +146 -93
- package/dist/src/controllers/WASMVectorSearch.js.map +1 -1
- package/dist/src/controllers/attention/AttentionCache.d.ts +38 -0
- package/dist/src/controllers/attention/AttentionCache.d.ts.map +1 -0
- package/dist/src/controllers/attention/AttentionCache.js +80 -0
- package/dist/src/controllers/attention/AttentionCache.js.map +1 -0
- package/dist/src/controllers/attention/AttentionConfig.d.ts +127 -0
- package/dist/src/controllers/attention/AttentionConfig.d.ts.map +1 -0
- package/dist/src/controllers/attention/AttentionConfig.js +124 -0
- package/dist/src/controllers/attention/AttentionConfig.js.map +1 -0
- package/dist/src/controllers/attention/AttentionCore.d.ts +89 -0
- package/dist/src/controllers/attention/AttentionCore.d.ts.map +1 -0
- package/dist/src/controllers/attention/AttentionCore.js +289 -0
- package/dist/src/controllers/attention/AttentionCore.js.map +1 -0
- package/dist/src/controllers/attention/AttentionHelpers.d.ts +55 -0
- package/dist/src/controllers/attention/AttentionHelpers.d.ts.map +1 -0
- package/dist/src/controllers/attention/AttentionHelpers.js +148 -0
- package/dist/src/controllers/attention/AttentionHelpers.js.map +1 -0
- package/dist/src/controllers/attention/AttentionMetrics.d.ts +55 -0
- package/dist/src/controllers/attention/AttentionMetrics.d.ts.map +1 -0
- package/dist/src/controllers/attention/AttentionMetrics.js +72 -0
- package/dist/src/controllers/attention/AttentionMetrics.js.map +1 -0
- package/dist/src/controllers/attention/AttentionWASM.d.ts +98 -0
- package/dist/src/controllers/attention/AttentionWASM.d.ts.map +1 -0
- package/dist/src/controllers/attention/AttentionWASM.js +147 -0
- package/dist/src/controllers/attention/AttentionWASM.js.map +1 -0
- package/dist/src/controllers/attention/CrossAttentionController.d.ts +141 -0
- package/dist/src/controllers/attention/CrossAttentionController.d.ts.map +1 -0
- package/dist/src/controllers/attention/CrossAttentionController.js +325 -0
- package/dist/src/controllers/attention/CrossAttentionController.js.map +1 -0
- package/dist/src/controllers/attention/MultiHeadAttentionController.d.ts +137 -0
- package/dist/src/controllers/attention/MultiHeadAttentionController.d.ts.map +1 -0
- package/dist/src/controllers/attention/MultiHeadAttentionController.js +336 -0
- package/dist/src/controllers/attention/MultiHeadAttentionController.js.map +1 -0
- package/dist/src/controllers/attention/SelfAttentionController.d.ts +117 -0
- package/dist/src/controllers/attention/SelfAttentionController.d.ts.map +1 -0
- package/dist/src/controllers/attention/SelfAttentionController.js +205 -0
- package/dist/src/controllers/attention/SelfAttentionController.js.map +1 -0
- package/dist/src/controllers/attention/index.d.ts +24 -0
- package/dist/src/controllers/attention/index.d.ts.map +1 -0
- package/dist/src/controllers/attention/index.js +20 -0
- package/dist/src/controllers/attention/index.js.map +1 -0
- package/dist/src/controllers/index.d.ts +14 -27
- package/dist/src/controllers/index.d.ts.map +1 -1
- package/dist/src/controllers/index.js +10 -18
- package/dist/src/controllers/index.js.map +1 -1
- package/dist/src/controllers/prerequisites.d.ts +76 -0
- package/dist/src/controllers/prerequisites.d.ts.map +1 -0
- package/dist/src/controllers/prerequisites.js +235 -0
- package/dist/src/controllers/prerequisites.js.map +1 -0
- package/dist/src/core/AgentDB.d.ts +27 -19
- package/dist/src/core/AgentDB.d.ts.map +1 -1
- package/dist/src/core/AgentDB.js +76 -124
- package/dist/src/core/AgentDB.js.map +1 -1
- package/dist/src/core/QueryCache.d.ts +138 -0
- package/dist/src/core/QueryCache.d.ts.map +1 -0
- package/dist/src/core/QueryCache.js +309 -0
- package/dist/src/core/QueryCache.js.map +1 -0
- package/dist/src/db-fallback.d.ts +10 -1
- package/dist/src/db-fallback.d.ts.map +1 -1
- package/dist/src/db-fallback.js +205 -28
- package/dist/src/db-fallback.js.map +1 -1
- package/dist/src/examples/quic-sync-example.js +2 -2
- package/dist/src/examples/quic-sync-example.js.map +1 -1
- package/dist/src/index.d.ts +15 -15
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +39 -11
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/agentdb-mcp-server.js +47 -2
- package/dist/src/mcp/agentdb-mcp-server.js.map +1 -1
- package/dist/src/model/ModelCacheLoader.d.ts +24 -0
- package/dist/src/model/ModelCacheLoader.d.ts.map +1 -0
- package/dist/src/model/ModelCacheLoader.js +121 -0
- package/dist/src/model/ModelCacheLoader.js.map +1 -0
- package/dist/src/observability/index.d.ts +8 -0
- package/dist/src/observability/index.d.ts.map +1 -0
- package/dist/src/observability/index.js +8 -0
- package/dist/src/observability/index.js.map +1 -0
- package/dist/src/observability/integration.d.ts +32 -0
- package/dist/src/observability/integration.d.ts.map +1 -0
- package/dist/src/observability/integration.js +159 -0
- package/dist/src/observability/integration.js.map +1 -0
- package/dist/src/observability/telemetry.d.ts +137 -0
- package/dist/src/observability/telemetry.d.ts.map +1 -0
- package/dist/src/observability/telemetry.js +416 -0
- package/dist/src/observability/telemetry.js.map +1 -0
- package/dist/src/optimizations/BatchOperations.d.ts +47 -0
- package/dist/src/optimizations/BatchOperations.d.ts.map +1 -1
- package/dist/src/optimizations/BatchOperations.js +183 -31
- package/dist/src/optimizations/BatchOperations.js.map +1 -1
- package/dist/src/optimizations/Quantization.d.ts +330 -0
- package/dist/src/optimizations/Quantization.d.ts.map +1 -0
- package/dist/src/optimizations/Quantization.js +793 -0
- package/dist/src/optimizations/Quantization.js.map +1 -0
- package/dist/src/optimizations/index.d.ts +1 -3
- package/dist/src/optimizations/index.d.ts.map +1 -1
- package/dist/src/optimizations/index.js +0 -1
- package/dist/src/optimizations/index.js.map +1 -1
- package/dist/src/quantization/index.d.ts +7 -0
- package/dist/src/quantization/index.d.ts.map +1 -0
- package/dist/src/quantization/index.js +15 -0
- package/dist/src/quantization/index.js.map +1 -0
- package/dist/src/quantization/vector-quantization.d.ts +388 -0
- package/dist/src/quantization/vector-quantization.d.ts.map +1 -0
- package/dist/src/quantization/vector-quantization.js +1132 -0
- package/dist/src/quantization/vector-quantization.js.map +1 -0
- package/dist/src/search/HybridSearch.d.ts +311 -0
- package/dist/src/search/HybridSearch.d.ts.map +1 -0
- package/dist/src/search/HybridSearch.js +712 -0
- package/dist/src/search/HybridSearch.js.map +1 -0
- package/dist/src/search/index.d.ts +12 -0
- package/dist/src/search/index.d.ts.map +1 -0
- package/dist/src/search/index.js +16 -0
- package/dist/src/search/index.js.map +1 -0
- package/dist/src/services/AttentionService.d.ts +303 -0
- package/dist/src/services/AttentionService.d.ts.map +1 -0
- package/dist/src/services/AttentionService.js +1165 -0
- package/dist/src/services/AttentionService.js.map +1 -0
- package/dist/src/services/LLMRouter.d.ts +61 -7
- package/dist/src/services/LLMRouter.d.ts.map +1 -1
- package/dist/src/services/LLMRouter.js +286 -22
- package/dist/src/services/LLMRouter.js.map +1 -1
- package/dist/src/services/audit-logger.service.d.ts +168 -0
- package/dist/src/services/audit-logger.service.d.ts.map +1 -0
- package/dist/src/services/audit-logger.service.js +331 -0
- package/dist/src/services/audit-logger.service.js.map +1 -0
- package/dist/src/services/enhanced-embeddings.d.ts +271 -0
- package/dist/src/services/enhanced-embeddings.d.ts.map +1 -0
- package/dist/src/services/enhanced-embeddings.js +1035 -0
- package/dist/src/services/enhanced-embeddings.js.map +1 -0
- package/dist/src/services/federated-learning.d.ts +172 -0
- package/dist/src/services/federated-learning.d.ts.map +1 -0
- package/dist/src/services/federated-learning.js +342 -0
- package/dist/src/services/federated-learning.js.map +1 -0
- package/dist/src/simd/index.d.ts +9 -0
- package/dist/src/simd/index.d.ts.map +1 -0
- package/dist/src/simd/index.js +27 -0
- package/dist/src/simd/index.js.map +1 -0
- package/dist/src/simd/simd-vector-ops.d.ts +332 -0
- package/dist/src/simd/simd-vector-ops.d.ts.map +1 -0
- package/dist/src/simd/simd-vector-ops.js +945 -0
- package/dist/src/simd/simd-vector-ops.js.map +1 -0
- package/dist/src/types/database.types.d.ts +275 -0
- package/dist/src/types/database.types.d.ts.map +1 -0
- package/dist/src/types/database.types.js +55 -0
- package/dist/src/types/database.types.js.map +1 -0
- package/dist/src/types/graph.d.ts +29 -0
- package/dist/src/types/graph.d.ts.map +1 -0
- package/dist/src/types/graph.js +8 -0
- package/dist/src/types/graph.js.map +1 -0
- package/dist/src/utils/chalk-fallback.d.ts +3 -0
- package/dist/src/utils/chalk-fallback.d.ts.map +1 -0
- package/dist/src/utils/chalk-fallback.js +20 -0
- package/dist/src/utils/chalk-fallback.js.map +1 -0
- package/dist/src/utils/similarity.d.ts +11 -0
- package/dist/src/utils/similarity.d.ts.map +1 -0
- package/dist/src/utils/similarity.js +25 -0
- package/dist/src/utils/similarity.js.map +1 -0
- package/dist/src/wasm-loader.d.ts +66 -0
- package/dist/src/wasm-loader.d.ts.map +1 -0
- package/dist/src/wasm-loader.js +76 -0
- package/dist/src/wasm-loader.js.map +1 -0
- package/dist/src/wrappers/agentdb-fast.d.ts +139 -0
- package/dist/src/wrappers/agentdb-fast.d.ts.map +1 -0
- package/dist/src/wrappers/agentdb-fast.js +307 -0
- package/dist/src/wrappers/agentdb-fast.js.map +1 -0
- package/dist/src/wrappers/attention-fallbacks.d.ts +343 -0
- package/dist/src/wrappers/attention-fallbacks.d.ts.map +1 -0
- package/dist/src/wrappers/attention-fallbacks.js +1484 -0
- package/dist/src/wrappers/attention-fallbacks.js.map +1 -0
- package/dist/src/wrappers/attention-native.d.ts +111 -0
- package/dist/src/wrappers/attention-native.d.ts.map +1 -0
- package/dist/src/wrappers/attention-native.js +273 -0
- package/dist/src/wrappers/attention-native.js.map +1 -0
- package/dist/src/wrappers/embedding-service.d.ts +117 -0
- package/dist/src/wrappers/embedding-service.d.ts.map +1 -0
- package/dist/src/wrappers/embedding-service.js +370 -0
- package/dist/src/wrappers/embedding-service.js.map +1 -0
- package/dist/src/wrappers/gnn-wrapper.d.ts +71 -0
- package/dist/src/wrappers/gnn-wrapper.d.ts.map +1 -0
- package/dist/src/wrappers/gnn-wrapper.js +236 -0
- package/dist/src/wrappers/gnn-wrapper.js.map +1 -0
- package/dist/src/wrappers/index.d.ts +48 -0
- package/dist/src/wrappers/index.d.ts.map +1 -0
- package/dist/src/wrappers/index.js +83 -0
- package/dist/src/wrappers/index.js.map +1 -0
- package/package.json +77 -76
- package/scripts/postinstall.cjs +13 -144
- package/dist/agentdb.browser.js +0 -1685
- package/dist/agentdb.browser.js.map +0 -7
- package/dist/agentdb.browser.min.js +0 -3
- package/dist/agentdb.browser.min.js.map +0 -7
- package/dist/agentdb.wasm-loader.js +0 -207
- package/dist/backends/VectorBackend.d.ts +0 -120
- package/dist/backends/VectorBackend.js +0 -14
- package/dist/backends/VectorBackend.js.map +0 -1
- package/dist/optimizations/RVFOptimizer.d.ts +0 -225
- package/dist/optimizations/RVFOptimizer.js +0 -541
- package/dist/optimizations/RVFOptimizer.js.map +0 -1
- package/dist/schemas/frontier-schema.sql +0 -378
- package/dist/schemas/schema.sql +0 -382
- package/dist/simulation/cli.d.ts +0 -9
- package/dist/simulation/cli.d.ts.map +0 -1
- package/dist/simulation/cli.js +0 -68
- package/dist/simulation/cli.js.map +0 -1
- package/dist/simulation/runner.d.ts +0 -21
- package/dist/simulation/runner.d.ts.map +0 -1
- package/dist/simulation/runner.js +0 -241
- package/dist/simulation/runner.js.map +0 -1
- package/dist/simulation/scenarios/aidefence-integration.d.ts +0 -24
- package/dist/simulation/scenarios/aidefence-integration.d.ts.map +0 -1
- package/dist/simulation/scenarios/aidefence-integration.js +0 -124
- package/dist/simulation/scenarios/aidefence-integration.js.map +0 -1
- package/dist/simulation/scenarios/bmssp-integration.d.ts +0 -23
- package/dist/simulation/scenarios/bmssp-integration.d.ts.map +0 -1
- package/dist/simulation/scenarios/bmssp-integration.js +0 -104
- package/dist/simulation/scenarios/bmssp-integration.js.map +0 -1
- package/dist/simulation/scenarios/causal-reasoning.d.ts +0 -16
- package/dist/simulation/scenarios/causal-reasoning.d.ts.map +0 -1
- package/dist/simulation/scenarios/causal-reasoning.js +0 -108
- package/dist/simulation/scenarios/causal-reasoning.js.map +0 -1
- package/dist/simulation/scenarios/consciousness-explorer.d.ts +0 -25
- package/dist/simulation/scenarios/consciousness-explorer.d.ts.map +0 -1
- package/dist/simulation/scenarios/consciousness-explorer.js +0 -108
- package/dist/simulation/scenarios/consciousness-explorer.js.map +0 -1
- package/dist/simulation/scenarios/domain-examples/e-commerce-recommendations.d.ts +0 -135
- package/dist/simulation/scenarios/domain-examples/e-commerce-recommendations.d.ts.map +0 -1
- package/dist/simulation/scenarios/domain-examples/e-commerce-recommendations.js +0 -158
- package/dist/simulation/scenarios/domain-examples/e-commerce-recommendations.js.map +0 -1
- package/dist/simulation/scenarios/domain-examples/index.d.ts +0 -14
- package/dist/simulation/scenarios/domain-examples/index.d.ts.map +0 -1
- package/dist/simulation/scenarios/domain-examples/index.js +0 -14
- package/dist/simulation/scenarios/domain-examples/index.js.map +0 -1
- package/dist/simulation/scenarios/domain-examples/iot-sensor-networks.d.ts +0 -178
- package/dist/simulation/scenarios/domain-examples/iot-sensor-networks.d.ts.map +0 -1
- package/dist/simulation/scenarios/domain-examples/iot-sensor-networks.js +0 -218
- package/dist/simulation/scenarios/domain-examples/iot-sensor-networks.js.map +0 -1
- package/dist/simulation/scenarios/domain-examples/medical-imaging.d.ts +0 -122
- package/dist/simulation/scenarios/domain-examples/medical-imaging.d.ts.map +0 -1
- package/dist/simulation/scenarios/domain-examples/medical-imaging.js +0 -129
- package/dist/simulation/scenarios/domain-examples/medical-imaging.js.map +0 -1
- package/dist/simulation/scenarios/domain-examples/robotics-navigation.d.ts +0 -166
- package/dist/simulation/scenarios/domain-examples/robotics-navigation.d.ts.map +0 -1
- package/dist/simulation/scenarios/domain-examples/robotics-navigation.js +0 -161
- package/dist/simulation/scenarios/domain-examples/robotics-navigation.js.map +0 -1
- package/dist/simulation/scenarios/domain-examples/scientific-research.d.ts +0 -151
- package/dist/simulation/scenarios/domain-examples/scientific-research.d.ts.map +0 -1
- package/dist/simulation/scenarios/domain-examples/scientific-research.js +0 -187
- package/dist/simulation/scenarios/domain-examples/scientific-research.js.map +0 -1
- package/dist/simulation/scenarios/domain-examples/trading-systems.d.ts +0 -102
- package/dist/simulation/scenarios/domain-examples/trading-systems.d.ts.map +0 -1
- package/dist/simulation/scenarios/domain-examples/trading-systems.js +0 -100
- package/dist/simulation/scenarios/domain-examples/trading-systems.js.map +0 -1
- package/dist/simulation/scenarios/goalie-integration.d.ts +0 -24
- package/dist/simulation/scenarios/goalie-integration.d.ts.map +0 -1
- package/dist/simulation/scenarios/goalie-integration.js +0 -121
- package/dist/simulation/scenarios/goalie-integration.js.map +0 -1
- package/dist/simulation/scenarios/graph-traversal.d.ts +0 -17
- package/dist/simulation/scenarios/graph-traversal.d.ts.map +0 -1
- package/dist/simulation/scenarios/graph-traversal.js +0 -101
- package/dist/simulation/scenarios/graph-traversal.js.map +0 -1
- package/dist/simulation/scenarios/latent-space/attention-analysis.d.ts +0 -45
- package/dist/simulation/scenarios/latent-space/attention-analysis.d.ts.map +0 -1
- package/dist/simulation/scenarios/latent-space/attention-analysis.js +0 -435
- package/dist/simulation/scenarios/latent-space/attention-analysis.js.map +0 -1
- package/dist/simulation/scenarios/latent-space/clustering-analysis.d.ts +0 -55
- package/dist/simulation/scenarios/latent-space/clustering-analysis.d.ts.map +0 -1
- package/dist/simulation/scenarios/latent-space/clustering-analysis.js +0 -606
- package/dist/simulation/scenarios/latent-space/clustering-analysis.js.map +0 -1
- package/dist/simulation/scenarios/latent-space/hnsw-exploration.d.ts +0 -74
- package/dist/simulation/scenarios/latent-space/hnsw-exploration.d.ts.map +0 -1
- package/dist/simulation/scenarios/latent-space/hnsw-exploration.js +0 -391
- package/dist/simulation/scenarios/latent-space/hnsw-exploration.js.map +0 -1
- package/dist/simulation/scenarios/latent-space/hypergraph-exploration.d.ts +0 -51
- package/dist/simulation/scenarios/latent-space/hypergraph-exploration.d.ts.map +0 -1
- package/dist/simulation/scenarios/latent-space/hypergraph-exploration.js +0 -536
- package/dist/simulation/scenarios/latent-space/hypergraph-exploration.js.map +0 -1
- package/dist/simulation/scenarios/latent-space/index.d.ts +0 -35
- package/dist/simulation/scenarios/latent-space/index.d.ts.map +0 -1
- package/dist/simulation/scenarios/latent-space/index.js +0 -35
- package/dist/simulation/scenarios/latent-space/index.js.map +0 -1
- package/dist/simulation/scenarios/latent-space/neural-augmentation.d.ts +0 -52
- package/dist/simulation/scenarios/latent-space/neural-augmentation.d.ts.map +0 -1
- package/dist/simulation/scenarios/latent-space/neural-augmentation.js +0 -472
- package/dist/simulation/scenarios/latent-space/neural-augmentation.js.map +0 -1
- package/dist/simulation/scenarios/latent-space/quantum-hybrid.d.ts +0 -53
- package/dist/simulation/scenarios/latent-space/quantum-hybrid.d.ts.map +0 -1
- package/dist/simulation/scenarios/latent-space/quantum-hybrid.js +0 -391
- package/dist/simulation/scenarios/latent-space/quantum-hybrid.js.map +0 -1
- package/dist/simulation/scenarios/latent-space/self-organizing-hnsw.d.ts +0 -52
- package/dist/simulation/scenarios/latent-space/self-organizing-hnsw.d.ts.map +0 -1
- package/dist/simulation/scenarios/latent-space/self-organizing-hnsw.js +0 -514
- package/dist/simulation/scenarios/latent-space/self-organizing-hnsw.js.map +0 -1
- package/dist/simulation/scenarios/latent-space/traversal-optimization.d.ts +0 -53
- package/dist/simulation/scenarios/latent-space/traversal-optimization.d.ts.map +0 -1
- package/dist/simulation/scenarios/latent-space/traversal-optimization.js +0 -595
- package/dist/simulation/scenarios/latent-space/traversal-optimization.js.map +0 -1
- package/dist/simulation/scenarios/lean-agentic-swarm.d.ts +0 -18
- package/dist/simulation/scenarios/lean-agentic-swarm.d.ts.map +0 -1
- package/dist/simulation/scenarios/lean-agentic-swarm.js +0 -132
- package/dist/simulation/scenarios/lean-agentic-swarm.js.map +0 -1
- package/dist/simulation/scenarios/multi-agent-swarm.d.ts +0 -17
- package/dist/simulation/scenarios/multi-agent-swarm.d.ts.map +0 -1
- package/dist/simulation/scenarios/multi-agent-swarm.js +0 -111
- package/dist/simulation/scenarios/multi-agent-swarm.js.map +0 -1
- package/dist/simulation/scenarios/psycho-symbolic-reasoner.d.ts +0 -23
- package/dist/simulation/scenarios/psycho-symbolic-reasoner.d.ts.map +0 -1
- package/dist/simulation/scenarios/psycho-symbolic-reasoner.js +0 -98
- package/dist/simulation/scenarios/psycho-symbolic-reasoner.js.map +0 -1
- package/dist/simulation/scenarios/reflexion-learning.d.ts +0 -16
- package/dist/simulation/scenarios/reflexion-learning.d.ts.map +0 -1
- package/dist/simulation/scenarios/reflexion-learning.js +0 -98
- package/dist/simulation/scenarios/reflexion-learning.js.map +0 -1
- package/dist/simulation/scenarios/research-swarm.d.ts +0 -24
- package/dist/simulation/scenarios/research-swarm.d.ts.map +0 -1
- package/dist/simulation/scenarios/research-swarm.js +0 -146
- package/dist/simulation/scenarios/research-swarm.js.map +0 -1
- package/dist/simulation/scenarios/skill-evolution.d.ts +0 -16
- package/dist/simulation/scenarios/skill-evolution.d.ts.map +0 -1
- package/dist/simulation/scenarios/skill-evolution.js +0 -109
- package/dist/simulation/scenarios/skill-evolution.js.map +0 -1
- package/dist/simulation/scenarios/stock-market-emergence.d.ts +0 -33
- package/dist/simulation/scenarios/stock-market-emergence.d.ts.map +0 -1
- package/dist/simulation/scenarios/stock-market-emergence.js +0 -246
- package/dist/simulation/scenarios/stock-market-emergence.js.map +0 -1
- package/dist/simulation/scenarios/strange-loops.d.ts +0 -18
- package/dist/simulation/scenarios/strange-loops.d.ts.map +0 -1
- package/dist/simulation/scenarios/strange-loops.js +0 -133
- package/dist/simulation/scenarios/strange-loops.js.map +0 -1
- package/dist/simulation/scenarios/sublinear-solver.d.ts +0 -22
- package/dist/simulation/scenarios/sublinear-solver.d.ts.map +0 -1
- package/dist/simulation/scenarios/sublinear-solver.js +0 -82
- package/dist/simulation/scenarios/sublinear-solver.js.map +0 -1
- package/dist/simulation/scenarios/temporal-lead-solver.d.ts +0 -23
- package/dist/simulation/scenarios/temporal-lead-solver.d.ts.map +0 -1
- package/dist/simulation/scenarios/temporal-lead-solver.js +0 -90
- package/dist/simulation/scenarios/temporal-lead-solver.js.map +0 -1
- package/dist/simulation/scenarios/voting-system-consensus.d.ts +0 -27
- package/dist/simulation/scenarios/voting-system-consensus.d.ts.map +0 -1
- package/dist/simulation/scenarios/voting-system-consensus.js +0 -175
- package/dist/simulation/scenarios/voting-system-consensus.js.map +0 -1
- package/dist/simulation/types.d.ts +0 -162
- package/dist/simulation/types.d.ts.map +0 -1
- package/dist/simulation/types.js +0 -5
- package/dist/simulation/types.js.map +0 -1
- package/dist/simulation/utils/PerformanceOptimizer.d.ts +0 -115
- package/dist/simulation/utils/PerformanceOptimizer.d.ts.map +0 -1
- package/dist/simulation/utils/PerformanceOptimizer.js +0 -223
- package/dist/simulation/utils/PerformanceOptimizer.js.map +0 -1
- package/dist/src/backends/index.cjs +0 -6
- package/dist/src/backends/ruvector/GuardedVectorBackend.d.ts +0 -93
- package/dist/src/backends/ruvector/GuardedVectorBackend.d.ts.map +0 -1
- package/dist/src/backends/ruvector/GuardedVectorBackend.js +0 -182
- package/dist/src/backends/ruvector/GuardedVectorBackend.js.map +0 -1
- package/dist/src/consensus/RaftConsensus.d.ts +0 -220
- package/dist/src/consensus/RaftConsensus.d.ts.map +0 -1
- package/dist/src/consensus/RaftConsensus.js +0 -762
- package/dist/src/consensus/RaftConsensus.js.map +0 -1
- package/dist/src/controllers/HierarchicalMemory.d.ts +0 -197
- package/dist/src/controllers/HierarchicalMemory.d.ts.map +0 -1
- package/dist/src/controllers/HierarchicalMemory.js +0 -519
- package/dist/src/controllers/HierarchicalMemory.js.map +0 -1
- package/dist/src/controllers/MemoryConsolidation.d.ts +0 -142
- package/dist/src/controllers/MemoryConsolidation.d.ts.map +0 -1
- package/dist/src/controllers/MemoryConsolidation.js +0 -479
- package/dist/src/controllers/MemoryConsolidation.js.map +0 -1
- package/dist/src/controllers/QUICConnection.d.ts +0 -122
- package/dist/src/controllers/QUICConnection.d.ts.map +0 -1
- package/dist/src/controllers/QUICConnection.js +0 -329
- package/dist/src/controllers/QUICConnection.js.map +0 -1
- package/dist/src/controllers/QUICConnectionPool.d.ts +0 -83
- package/dist/src/controllers/QUICConnectionPool.d.ts.map +0 -1
- package/dist/src/controllers/QUICConnectionPool.js +0 -256
- package/dist/src/controllers/QUICConnectionPool.js.map +0 -1
- package/dist/src/controllers/QUICStreamManager.d.ts +0 -114
- package/dist/src/controllers/QUICStreamManager.d.ts.map +0 -1
- package/dist/src/controllers/QUICStreamManager.js +0 -267
- package/dist/src/controllers/QUICStreamManager.js.map +0 -1
- package/dist/src/controllers/StreamingEmbeddingService.d.ts +0 -82
- package/dist/src/controllers/StreamingEmbeddingService.d.ts.map +0 -1
- package/dist/src/controllers/StreamingEmbeddingService.js +0 -243
- package/dist/src/controllers/StreamingEmbeddingService.js.map +0 -1
- package/dist/src/controllers/index.cjs +0 -6
- package/dist/src/coordination/MultiDatabaseCoordinator.d.ts +0 -348
- package/dist/src/coordination/MultiDatabaseCoordinator.d.ts.map +0 -1
- package/dist/src/coordination/MultiDatabaseCoordinator.js +0 -803
- package/dist/src/coordination/MultiDatabaseCoordinator.js.map +0 -1
- package/dist/src/coordination/index.d.ts +0 -10
- package/dist/src/coordination/index.d.ts.map +0 -1
- package/dist/src/coordination/index.js +0 -10
- package/dist/src/coordination/index.js.map +0 -1
- package/dist/src/index.cjs +0 -6
- package/dist/src/optimizations/RVFOptimizer.d.ts +0 -226
- package/dist/src/optimizations/RVFOptimizer.d.ts.map +0 -1
- package/dist/src/optimizations/RVFOptimizer.js +0 -541
- package/dist/src/optimizations/RVFOptimizer.js.map +0 -1
- package/dist/src/security/AttestationLog.d.ts +0 -70
- package/dist/src/security/AttestationLog.d.ts.map +0 -1
- package/dist/src/security/AttestationLog.js +0 -174
- package/dist/src/security/AttestationLog.js.map +0 -1
- package/dist/src/security/MutationGuard.d.ts +0 -83
- package/dist/src/security/MutationGuard.d.ts.map +0 -1
- package/dist/src/security/MutationGuard.js +0 -364
- package/dist/src/security/MutationGuard.js.map +0 -1
- package/dist/src/security/index.cjs +0 -6
- package/dist/src/security/index.d.ts +0 -15
- package/dist/src/security/index.d.ts.map +0 -1
- package/dist/src/security/index.js +0 -18
- package/dist/src/security/index.js.map +0 -1
- package/dist/src/services/GNNService.d.ts +0 -173
- package/dist/src/services/GNNService.d.ts.map +0 -1
- package/dist/src/services/GNNService.js +0 -639
- package/dist/src/services/GNNService.js.map +0 -1
- package/dist/src/services/GraphTransformerService.d.ts +0 -80
- package/dist/src/services/GraphTransformerService.d.ts.map +0 -1
- package/dist/src/services/GraphTransformerService.js +0 -369
- package/dist/src/services/GraphTransformerService.js.map +0 -1
- package/dist/src/services/SemanticRouter.d.ts +0 -83
- package/dist/src/services/SemanticRouter.d.ts.map +0 -1
- package/dist/src/services/SemanticRouter.js +0 -160
- package/dist/src/services/SemanticRouter.js.map +0 -1
- package/dist/src/services/SonaTrajectoryService.d.ts +0 -224
- package/dist/src/services/SonaTrajectoryService.d.ts.map +0 -1
- package/dist/src/services/SonaTrajectoryService.js +0 -539
- package/dist/src/services/SonaTrajectoryService.js.map +0 -1
- package/dist/src/utils/LegacyAttentionAdapter.d.ts +0 -93
- package/dist/src/utils/LegacyAttentionAdapter.d.ts.map +0 -1
- package/dist/src/utils/LegacyAttentionAdapter.js +0 -241
- package/dist/src/utils/LegacyAttentionAdapter.js.map +0 -1
- package/dist/src/utils/vector-math.d.ts +0 -29
- package/dist/src/utils/vector-math.d.ts.map +0 -1
- package/dist/src/utils/vector-math.js +0 -66
- package/dist/src/utils/vector-math.js.map +0 -1
|
@@ -1,432 +1,730 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* RuVectorBackend - High-Performance Vector Storage
|
|
2
|
+
* RuVectorBackend - High-Performance Vector Storage
|
|
3
3
|
*
|
|
4
|
-
* Implements VectorBackend using ruvector with
|
|
5
|
-
*
|
|
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
|
-
* -
|
|
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
|
-
* -
|
|
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
|
+
}
|
|
16
153
|
export class RuVectorBackend {
|
|
17
154
|
name = 'ruvector';
|
|
18
|
-
db; // VectorDB from ruvector
|
|
155
|
+
db; // VectorDB from @ruvector/core
|
|
19
156
|
config;
|
|
20
157
|
metadata = new Map();
|
|
21
158
|
initialized = false;
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
159
|
+
// Concurrency control
|
|
160
|
+
semaphore;
|
|
161
|
+
bufferPool;
|
|
162
|
+
// Statistics tracking
|
|
163
|
+
stats = {
|
|
164
|
+
insertCount: 0,
|
|
165
|
+
insertTotalLatencyMs: 0,
|
|
166
|
+
insertMinLatencyMs: Infinity,
|
|
167
|
+
insertMaxLatencyMs: 0,
|
|
168
|
+
searchCount: 0,
|
|
169
|
+
searchTotalLatencyMs: 0,
|
|
170
|
+
searchMinLatencyMs: Infinity,
|
|
171
|
+
searchMaxLatencyMs: 0,
|
|
172
|
+
cacheHits: 0,
|
|
173
|
+
cacheMisses: 0,
|
|
174
|
+
lastMemoryUsage: 0,
|
|
175
|
+
indexRebuildCount: 0,
|
|
176
|
+
};
|
|
177
|
+
// Mmap support
|
|
178
|
+
mmapEnabled = false;
|
|
179
|
+
mmapBuffer = null;
|
|
25
180
|
constructor(config) {
|
|
26
181
|
// Handle both dimension and dimensions for backward compatibility
|
|
27
182
|
const dimension = config.dimension ?? config.dimensions;
|
|
28
183
|
if (!dimension) {
|
|
29
184
|
throw new Error('Vector dimension is required (use dimension or dimensions)');
|
|
30
185
|
}
|
|
186
|
+
// Validate dimension for security
|
|
187
|
+
validateDimension(dimension);
|
|
31
188
|
// Store both forms for compatibility with different backends
|
|
32
189
|
this.config = { ...config, dimension, dimensions: dimension };
|
|
190
|
+
// Initialize concurrency control with configurable limit (bounded for security)
|
|
191
|
+
const concurrency = Math.min(Math.max(1, config.parallelConcurrency ?? 4), 32);
|
|
192
|
+
this.semaphore = new Semaphore(concurrency);
|
|
193
|
+
// Initialize buffer pool with bounded size
|
|
194
|
+
const bufferPoolSize = Math.min(Math.max(1, config.bufferPoolSize ?? 100), 1000);
|
|
195
|
+
this.bufferPool = new BufferPool(bufferPoolSize);
|
|
196
|
+
// Mmap configuration - validate path if provided
|
|
197
|
+
this.mmapEnabled = config.enableMmap ?? false;
|
|
198
|
+
if (this.mmapEnabled && config.mmapPath) {
|
|
199
|
+
validatePath(config.mmapPath);
|
|
200
|
+
}
|
|
33
201
|
}
|
|
34
202
|
/**
|
|
35
|
-
*
|
|
203
|
+
* Get adaptive HNSW parameters based on expected dataset size
|
|
204
|
+
*/
|
|
205
|
+
getAdaptiveParams(datasetSize) {
|
|
206
|
+
if (datasetSize < 1000) {
|
|
207
|
+
// Small dataset: lower M and efConstruction for faster builds
|
|
208
|
+
return { M: 8, efConstruction: 100, efSearch: 50 };
|
|
209
|
+
}
|
|
210
|
+
else if (datasetSize <= 100000) {
|
|
211
|
+
// Medium dataset: balanced parameters
|
|
212
|
+
return { M: 16, efConstruction: 200, efSearch: 100 };
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
// Large dataset: higher M for better recall
|
|
216
|
+
return { M: 32, efConstruction: 400, efSearch: 200 };
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Initialize RuVector database with optional dependency handling
|
|
36
221
|
*/
|
|
37
222
|
async initialize() {
|
|
38
223
|
if (this.initialized)
|
|
39
224
|
return;
|
|
40
225
|
try {
|
|
41
|
-
// Try main ruvector package first (
|
|
226
|
+
// Try main ruvector package first (includes core, gnn, graph)
|
|
42
227
|
let VectorDB;
|
|
43
|
-
let ruvectorModule;
|
|
44
228
|
try {
|
|
45
|
-
|
|
46
|
-
VectorDB =
|
|
229
|
+
const ruvector = await import('ruvector');
|
|
230
|
+
VectorDB = ruvector.VectorDB || ruvector.default?.VectorDB;
|
|
47
231
|
}
|
|
48
232
|
catch {
|
|
49
233
|
// Fallback to @ruvector/core for backward compatibility
|
|
50
|
-
|
|
51
|
-
|
|
234
|
+
const core = await import('@ruvector/core');
|
|
235
|
+
// ESM and CommonJS both export as VectorDB (capital 'DB')
|
|
236
|
+
VectorDB = core.VectorDB || core.default?.VectorDB;
|
|
52
237
|
}
|
|
53
238
|
if (!VectorDB) {
|
|
54
|
-
throw new Error('Could not find VectorDB export in ruvector');
|
|
239
|
+
throw new Error('Could not find VectorDB export in @ruvector/core');
|
|
55
240
|
}
|
|
56
241
|
// Handle both 'dimension' and 'dimensions' for backward compatibility
|
|
57
242
|
const dimensions = this.config.dimension ?? this.config.dimensions;
|
|
58
243
|
if (!dimensions) {
|
|
59
244
|
throw new Error('Vector dimension is required (use dimension or dimensions)');
|
|
60
245
|
}
|
|
61
|
-
//
|
|
246
|
+
// Determine HNSW parameters (adaptive or explicit)
|
|
247
|
+
const maxElements = this.config.maxElements || 100000;
|
|
248
|
+
const useAdaptive = this.config.adaptiveParams !== false;
|
|
249
|
+
const adaptiveParams = useAdaptive ? this.getAdaptiveParams(maxElements) : null;
|
|
250
|
+
const m = this.config.M ?? adaptiveParams?.M ?? 16;
|
|
251
|
+
const efConstruction = this.config.efConstruction ?? adaptiveParams?.efConstruction ?? 200;
|
|
252
|
+
const efSearch = this.config.efSearch ?? adaptiveParams?.efSearch ?? 100;
|
|
253
|
+
// RuVector VectorDB constructor signature
|
|
62
254
|
this.db = new VectorDB({
|
|
63
|
-
dimensions: dimensions,
|
|
255
|
+
dimensions: dimensions, // Note: config object, not positional arg
|
|
64
256
|
metric: this.config.metric,
|
|
65
|
-
maxElements:
|
|
66
|
-
efConstruction:
|
|
67
|
-
m:
|
|
257
|
+
maxElements: maxElements,
|
|
258
|
+
efConstruction: efConstruction,
|
|
259
|
+
m: m // Note: lowercase 'm'
|
|
68
260
|
});
|
|
69
|
-
//
|
|
70
|
-
if (
|
|
71
|
-
this.
|
|
261
|
+
// Set default efSearch
|
|
262
|
+
if (this.db.setEfSearch) {
|
|
263
|
+
this.db.setEfSearch(efSearch);
|
|
72
264
|
}
|
|
73
|
-
if
|
|
74
|
-
|
|
75
|
-
this.
|
|
265
|
+
// Initialize memory-mapped storage if enabled and available
|
|
266
|
+
if (this.mmapEnabled && this.config.mmapPath) {
|
|
267
|
+
await this.initializeMmap();
|
|
76
268
|
}
|
|
77
269
|
this.initialized = true;
|
|
78
270
|
}
|
|
79
271
|
catch (error) {
|
|
80
272
|
const errorMessage = error.message;
|
|
273
|
+
// Special handling for path validation errors (from ruvector package)
|
|
274
|
+
// When using :memory:, ruvector may reject it as a path traversal attempt
|
|
275
|
+
// This is expected and not critical - users should use file-based paths for ruvector persistence
|
|
81
276
|
if (errorMessage.includes('Path traversal') || errorMessage.includes('Invalid path')) {
|
|
82
277
|
throw new Error(`RuVector does not support :memory: database paths.\n` +
|
|
83
278
|
`Use a file path instead, or RuVector will be skipped and fallback backend will be used.\n` +
|
|
84
279
|
`Original error: ${errorMessage}`);
|
|
85
280
|
}
|
|
86
|
-
throw new Error(`RuVector initialization failed. Please install: npm install ruvector
|
|
281
|
+
throw new Error(`RuVector initialization failed. Please install: npm install ruvector\n` +
|
|
87
282
|
`Or legacy packages: npm install @ruvector/core\n` +
|
|
88
283
|
`Error: ${errorMessage}`);
|
|
89
284
|
}
|
|
90
285
|
}
|
|
91
286
|
/**
|
|
92
|
-
*
|
|
93
|
-
|
|
287
|
+
* Initialize memory-mapped storage for large indices
|
|
288
|
+
*/
|
|
289
|
+
async initializeMmap() {
|
|
290
|
+
if (!this.config.mmapPath)
|
|
291
|
+
return;
|
|
292
|
+
// Validate path for security
|
|
293
|
+
validatePath(this.config.mmapPath);
|
|
294
|
+
let fd = null;
|
|
295
|
+
try {
|
|
296
|
+
const fs = await import('fs');
|
|
297
|
+
const pathModule = await import('path');
|
|
298
|
+
// Check if mmap module is available (optional native dependency)
|
|
299
|
+
let mmapModule = null;
|
|
300
|
+
try {
|
|
301
|
+
// Dynamic import of optional native module - known safe module
|
|
302
|
+
const moduleName = 'mmap-io';
|
|
303
|
+
mmapModule = await import(moduleName);
|
|
304
|
+
}
|
|
305
|
+
catch {
|
|
306
|
+
// mmap-io not available, fall back to regular I/O
|
|
307
|
+
console.debug('[RuVectorBackend] mmap-io not available, using standard I/O');
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
if (!mmapModule)
|
|
311
|
+
return;
|
|
312
|
+
const mmapPath = pathModule.resolve(this.config.mmapPath);
|
|
313
|
+
// Re-validate resolved path
|
|
314
|
+
validatePath(mmapPath);
|
|
315
|
+
const mmap = mmapModule;
|
|
316
|
+
// Create or open the mmap file
|
|
317
|
+
if (fs.existsSync(mmapPath)) {
|
|
318
|
+
fd = fs.openSync(mmapPath, 'r+');
|
|
319
|
+
const stats = fs.fstatSync(fd);
|
|
320
|
+
// Validate file size to prevent excessive memory mapping
|
|
321
|
+
const maxMmapSize = 4 * 1024 * 1024 * 1024; // 4GB max
|
|
322
|
+
if (stats.size > maxMmapSize) {
|
|
323
|
+
throw new Error(`Mmap file size ${stats.size} exceeds maximum of ${maxMmapSize}`);
|
|
324
|
+
}
|
|
325
|
+
this.mmapBuffer = mmap.map(stats.size, mmap.PROT_READ | mmap.PROT_WRITE, mmap.MAP_SHARED, fd, 0);
|
|
326
|
+
fs.closeSync(fd);
|
|
327
|
+
fd = null;
|
|
328
|
+
}
|
|
329
|
+
this.mmapEnabled = true;
|
|
330
|
+
}
|
|
331
|
+
catch (error) {
|
|
332
|
+
console.debug(`[RuVectorBackend] Failed to initialize mmap: ${error.message}`);
|
|
333
|
+
this.mmapEnabled = false;
|
|
334
|
+
}
|
|
335
|
+
finally {
|
|
336
|
+
// Ensure file descriptor is closed even on error
|
|
337
|
+
if (fd !== null) {
|
|
338
|
+
try {
|
|
339
|
+
const fs = await import('fs');
|
|
340
|
+
fs.closeSync(fd);
|
|
341
|
+
}
|
|
342
|
+
catch {
|
|
343
|
+
// Ignore close errors in cleanup
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Insert single vector with optional metadata
|
|
94
350
|
*/
|
|
95
351
|
insert(id, embedding, metadata) {
|
|
96
352
|
this.ensureInitialized();
|
|
97
|
-
//
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
353
|
+
// Validate id
|
|
354
|
+
if (!id || typeof id !== 'string') {
|
|
355
|
+
throw new Error('Vector ID must be a non-empty string');
|
|
356
|
+
}
|
|
357
|
+
// Validate embedding type
|
|
358
|
+
if (!(embedding instanceof Float32Array) && !Array.isArray(embedding)) {
|
|
359
|
+
throw new Error('Embedding must be a Float32Array or array');
|
|
360
|
+
}
|
|
361
|
+
// Check metadata store size limit
|
|
362
|
+
if (metadata && this.metadata.size >= MAX_METADATA_ENTRIES) {
|
|
363
|
+
throw new Error(`Metadata store has reached maximum capacity of ${MAX_METADATA_ENTRIES}`);
|
|
364
|
+
}
|
|
365
|
+
const startTime = this.config.enableStats !== false ? performance.now() : 0;
|
|
366
|
+
// RuVector v0.1.30+ uses object API with 'vector' field
|
|
367
|
+
// Native VectorDB requires Float32Array, not regular array
|
|
368
|
+
this.db.insert({
|
|
369
|
+
id: id,
|
|
370
|
+
vector: embedding instanceof Float32Array ? embedding : new Float32Array(embedding),
|
|
371
|
+
metadata: metadata
|
|
372
|
+
});
|
|
104
373
|
if (metadata) {
|
|
105
|
-
entry.metadata = metadata;
|
|
106
374
|
this.metadata.set(id, metadata);
|
|
107
375
|
}
|
|
108
|
-
//
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
376
|
+
// Track insert latency
|
|
377
|
+
if (this.config.enableStats !== false) {
|
|
378
|
+
const latency = performance.now() - startTime;
|
|
379
|
+
this.stats.insertCount++;
|
|
380
|
+
this.stats.insertTotalLatencyMs += latency;
|
|
381
|
+
this.stats.insertMinLatencyMs = Math.min(this.stats.insertMinLatencyMs, latency);
|
|
382
|
+
this.stats.insertMaxLatencyMs = Math.max(this.stats.insertMaxLatencyMs, latency);
|
|
115
383
|
}
|
|
116
384
|
}
|
|
117
385
|
/**
|
|
118
|
-
* Batch insert for optimal performance
|
|
119
|
-
* Uses ruvector 0.1.99+ insertBatch([{ id, vector, metadata? }])
|
|
386
|
+
* Batch insert for optimal performance (sequential)
|
|
120
387
|
*/
|
|
121
388
|
insertBatch(items) {
|
|
122
389
|
this.ensureInitialized();
|
|
123
|
-
const
|
|
124
|
-
|
|
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
|
-
});
|
|
390
|
+
for (const item of items) {
|
|
391
|
+
this.insert(item.id, item.embedding, item.metadata);
|
|
139
392
|
}
|
|
140
393
|
}
|
|
141
394
|
/**
|
|
142
|
-
*
|
|
395
|
+
* Parallel batch insert with semaphore-controlled concurrency
|
|
396
|
+
*
|
|
397
|
+
* Processes items in parallel batches for improved throughput on multi-core systems.
|
|
398
|
+
* Uses a semaphore to control the maximum number of concurrent insertions.
|
|
399
|
+
*
|
|
400
|
+
* @param items - Array of items to insert
|
|
401
|
+
* @param options - Configuration options
|
|
402
|
+
* @param options.batchSize - Number of items per batch (default: 100)
|
|
403
|
+
* @param options.concurrency - Max concurrent batches (default: config.parallelConcurrency or 4)
|
|
404
|
+
* @returns Promise that resolves when all items are inserted
|
|
143
405
|
*/
|
|
144
|
-
|
|
145
|
-
this.
|
|
406
|
+
async insertBatchParallel(items, options) {
|
|
407
|
+
this.ensureInitialized();
|
|
408
|
+
const batchSize = options?.batchSize ?? 100;
|
|
409
|
+
const concurrency = options?.concurrency ?? this.config.parallelConcurrency ?? 4;
|
|
410
|
+
// Create a semaphore with the specified concurrency
|
|
411
|
+
const semaphore = new Semaphore(concurrency);
|
|
412
|
+
// Split items into batches
|
|
413
|
+
const batches = [];
|
|
414
|
+
for (let i = 0; i < items.length; i += batchSize) {
|
|
415
|
+
batches.push(items.slice(i, i + batchSize));
|
|
416
|
+
}
|
|
417
|
+
// Process batches in parallel with semaphore control
|
|
418
|
+
const promises = batches.map(async (batch) => {
|
|
419
|
+
await semaphore.acquire();
|
|
420
|
+
try {
|
|
421
|
+
for (const item of batch) {
|
|
422
|
+
this.insert(item.id, item.embedding, item.metadata);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
finally {
|
|
426
|
+
semaphore.release();
|
|
427
|
+
}
|
|
428
|
+
});
|
|
429
|
+
await Promise.all(promises);
|
|
146
430
|
}
|
|
147
431
|
/**
|
|
148
|
-
*
|
|
432
|
+
* Insert using buffer pooling to reduce allocations
|
|
433
|
+
*
|
|
434
|
+
* Acquires a buffer from the pool, copies the embedding data,
|
|
435
|
+
* performs the insert, and returns the buffer to the pool.
|
|
436
|
+
*
|
|
437
|
+
* @param id - Vector ID
|
|
438
|
+
* @param embedding - Vector data (can be regular array or Float32Array)
|
|
439
|
+
* @param metadata - Optional metadata
|
|
149
440
|
*/
|
|
150
|
-
|
|
151
|
-
|
|
441
|
+
insertWithPooledBuffer(id, embedding, metadata) {
|
|
442
|
+
this.ensureInitialized();
|
|
443
|
+
const dimension = this.config.dimension;
|
|
444
|
+
// Acquire buffer from pool
|
|
445
|
+
const buffer = this.bufferPool.acquire(dimension);
|
|
446
|
+
try {
|
|
447
|
+
// Copy data to pooled buffer
|
|
448
|
+
if (embedding instanceof Float32Array) {
|
|
449
|
+
buffer.set(embedding);
|
|
450
|
+
}
|
|
451
|
+
else {
|
|
452
|
+
for (let i = 0; i < dimension; i++) {
|
|
453
|
+
buffer[i] = embedding[i] ?? 0;
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
// Insert using pooled buffer
|
|
457
|
+
this.insert(id, buffer, metadata);
|
|
458
|
+
}
|
|
459
|
+
finally {
|
|
460
|
+
// Return buffer to pool
|
|
461
|
+
this.bufferPool.release(buffer);
|
|
462
|
+
}
|
|
152
463
|
}
|
|
153
464
|
/**
|
|
154
|
-
* Search for k-nearest neighbors with optional filtering and
|
|
155
|
-
*
|
|
156
|
-
* Results contain { id, score, vector?, metadata? }
|
|
465
|
+
* Search for k-nearest neighbors with optional filtering and early termination
|
|
466
|
+
* @inline V8 optimization hint - hot path function
|
|
157
467
|
*/
|
|
158
468
|
search(query, k, options) {
|
|
159
469
|
this.ensureInitialized();
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
vector: Array.from(query),
|
|
163
|
-
k
|
|
164
|
-
};
|
|
470
|
+
const startTime = this.config.enableStats !== false ? performance.now() : 0;
|
|
471
|
+
// Apply efSearch parameter if provided
|
|
165
472
|
if (options?.efSearch) {
|
|
166
|
-
|
|
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
|
-
}
|
|
473
|
+
this.db.setEfSearch(options.efSearch);
|
|
189
474
|
}
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
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);
|
|
207
|
-
}
|
|
208
|
-
return true;
|
|
475
|
+
// RuVector v0.1.30+ supports both object API and legacy positional args
|
|
476
|
+
// Use object API for consistency with insert
|
|
477
|
+
// Native VectorDB requires Float32Array, not regular array
|
|
478
|
+
const results = this.db.search({
|
|
479
|
+
vector: query instanceof Float32Array ? query : new Float32Array(query),
|
|
480
|
+
k: k,
|
|
481
|
+
threshold: options?.threshold,
|
|
482
|
+
filter: options?.filter
|
|
209
483
|
});
|
|
210
|
-
//
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
const
|
|
231
|
-
|
|
232
|
-
|
|
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;
|
|
484
|
+
// @inline Early termination threshold for perfect matches
|
|
485
|
+
const earlyTermThreshold = 0.9999;
|
|
486
|
+
let perfectMatches = 0;
|
|
487
|
+
const maxPerfectMatches = k;
|
|
488
|
+
// @inline Convert results and apply filtering with early termination
|
|
489
|
+
const filteredResults = [];
|
|
490
|
+
const resultsLen = results.length | 0;
|
|
491
|
+
for (let i = 0; i < resultsLen; i++) {
|
|
492
|
+
const r = results[i];
|
|
493
|
+
const similarity = this.distanceToSimilarity(r.distance);
|
|
494
|
+
// Apply similarity threshold
|
|
495
|
+
if (options?.threshold && similarity < options.threshold) {
|
|
496
|
+
continue;
|
|
497
|
+
}
|
|
498
|
+
const metadata = this.metadata.get(r.id);
|
|
499
|
+
// Apply metadata filters
|
|
500
|
+
if (options?.filter && metadata) {
|
|
501
|
+
const filterEntries = Object.entries(options.filter);
|
|
502
|
+
let matchesFilter = true;
|
|
503
|
+
for (let j = 0; j < filterEntries.length; j++) {
|
|
504
|
+
const [key, value] = filterEntries[j];
|
|
505
|
+
if (metadata[key] !== value) {
|
|
506
|
+
matchesFilter = false;
|
|
507
|
+
break;
|
|
264
508
|
}
|
|
265
509
|
}
|
|
510
|
+
if (!matchesFilter)
|
|
511
|
+
continue;
|
|
266
512
|
}
|
|
267
|
-
|
|
268
|
-
// Fall through to raw results if GNN enhancement fails
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
return results;
|
|
272
|
-
}
|
|
273
|
-
/**
|
|
274
|
-
* Batch search for parallel query processing (0.1.99+).
|
|
275
|
-
* Executes multiple searches concurrently for throughput.
|
|
276
|
-
*/
|
|
277
|
-
async searchBatch(queries, k, options) {
|
|
278
|
-
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) => ({
|
|
513
|
+
filteredResults.push({
|
|
290
514
|
id: r.id,
|
|
291
|
-
distance:
|
|
292
|
-
similarity
|
|
293
|
-
metadata
|
|
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;
|
|
515
|
+
distance: r.distance,
|
|
516
|
+
similarity,
|
|
517
|
+
metadata
|
|
301
518
|
});
|
|
302
|
-
|
|
303
|
-
|
|
519
|
+
// @inline Early termination for perfect matches
|
|
520
|
+
if (similarity >= earlyTermThreshold) {
|
|
521
|
+
perfectMatches++;
|
|
522
|
+
if (perfectMatches >= maxPerfectMatches) {
|
|
523
|
+
break;
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
// Track search latency
|
|
528
|
+
if (this.config.enableStats !== false) {
|
|
529
|
+
const latency = performance.now() - startTime;
|
|
530
|
+
this.stats.searchCount++;
|
|
531
|
+
this.stats.searchTotalLatencyMs += latency;
|
|
532
|
+
this.stats.searchMinLatencyMs = Math.min(this.stats.searchMinLatencyMs, latency);
|
|
533
|
+
this.stats.searchMaxLatencyMs = Math.max(this.stats.searchMaxLatencyMs, latency);
|
|
534
|
+
}
|
|
535
|
+
return filteredResults;
|
|
304
536
|
}
|
|
305
537
|
/**
|
|
306
|
-
* Remove vector by ID
|
|
307
|
-
* Uses ruvector 0.1.99+ delete(id) instead of remove(id)
|
|
538
|
+
* Remove vector by ID
|
|
308
539
|
*/
|
|
309
540
|
remove(id) {
|
|
310
541
|
this.ensureInitialized();
|
|
311
542
|
this.metadata.delete(id);
|
|
312
543
|
try {
|
|
313
|
-
|
|
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;
|
|
544
|
+
return this.db.remove(id);
|
|
326
545
|
}
|
|
327
546
|
catch {
|
|
328
547
|
return false;
|
|
329
548
|
}
|
|
330
549
|
}
|
|
331
550
|
/**
|
|
332
|
-
* Get database statistics
|
|
551
|
+
* Get database statistics
|
|
333
552
|
*/
|
|
334
553
|
getStats() {
|
|
335
554
|
this.ensureInitialized();
|
|
336
|
-
|
|
337
|
-
|
|
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
|
-
}
|
|
555
|
+
const memoryUsage = this.db.memoryUsage?.() || 0;
|
|
556
|
+
this.stats.lastMemoryUsage = memoryUsage;
|
|
347
557
|
return {
|
|
348
|
-
count,
|
|
558
|
+
count: this.db.count(),
|
|
349
559
|
dimension: this.config.dimension || 384,
|
|
350
560
|
metric: this.config.metric,
|
|
351
561
|
backend: 'ruvector',
|
|
352
|
-
memoryUsage:
|
|
353
|
-
// Extended stats for 0.1.99+
|
|
354
|
-
...(this.isNativeImpl && {
|
|
355
|
-
nativeVersion: this.nativeVersion,
|
|
356
|
-
simdEnabled: true,
|
|
357
|
-
implementation: 'native'
|
|
358
|
-
})
|
|
562
|
+
memoryUsage: memoryUsage
|
|
359
563
|
};
|
|
360
564
|
}
|
|
361
565
|
/**
|
|
362
|
-
* Get extended
|
|
566
|
+
* Get extended performance statistics
|
|
567
|
+
*
|
|
568
|
+
* Returns detailed metrics including latencies, cache stats, and buffer pool info.
|
|
363
569
|
*/
|
|
364
570
|
getExtendedStats() {
|
|
365
|
-
const base = this.getStats();
|
|
366
571
|
return {
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
572
|
+
basic: this.getStats(),
|
|
573
|
+
performance: {
|
|
574
|
+
...this.stats,
|
|
575
|
+
insertAvgLatencyMs: this.stats.insertCount > 0
|
|
576
|
+
? this.stats.insertTotalLatencyMs / this.stats.insertCount
|
|
577
|
+
: 0,
|
|
578
|
+
searchAvgLatencyMs: this.stats.searchCount > 0
|
|
579
|
+
? this.stats.searchTotalLatencyMs / this.stats.searchCount
|
|
580
|
+
: 0,
|
|
581
|
+
},
|
|
582
|
+
bufferPool: this.bufferPool.getStats(),
|
|
583
|
+
config: {
|
|
584
|
+
parallelConcurrency: this.config.parallelConcurrency ?? 4,
|
|
585
|
+
adaptiveParams: this.config.adaptiveParams !== false,
|
|
586
|
+
mmapEnabled: this.mmapEnabled,
|
|
587
|
+
},
|
|
374
588
|
};
|
|
375
589
|
}
|
|
376
590
|
/**
|
|
377
|
-
*
|
|
591
|
+
* Reset performance statistics
|
|
378
592
|
*/
|
|
379
|
-
|
|
593
|
+
resetStats() {
|
|
594
|
+
this.stats = {
|
|
595
|
+
insertCount: 0,
|
|
596
|
+
insertTotalLatencyMs: 0,
|
|
597
|
+
insertMinLatencyMs: Infinity,
|
|
598
|
+
insertMaxLatencyMs: 0,
|
|
599
|
+
searchCount: 0,
|
|
600
|
+
searchTotalLatencyMs: 0,
|
|
601
|
+
searchMinLatencyMs: Infinity,
|
|
602
|
+
searchMaxLatencyMs: 0,
|
|
603
|
+
cacheHits: 0,
|
|
604
|
+
cacheMisses: 0,
|
|
605
|
+
lastMemoryUsage: 0,
|
|
606
|
+
indexRebuildCount: 0,
|
|
607
|
+
};
|
|
608
|
+
}
|
|
609
|
+
/**
|
|
610
|
+
* Update index parameters adaptively based on current dataset size
|
|
611
|
+
*
|
|
612
|
+
* This triggers an index rebuild with optimal parameters for the current size.
|
|
613
|
+
* Should be called after significant data changes.
|
|
614
|
+
*/
|
|
615
|
+
async updateAdaptiveParams() {
|
|
380
616
|
this.ensureInitialized();
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
await this.db.save(path);
|
|
617
|
+
if (this.config.adaptiveParams === false) {
|
|
618
|
+
return;
|
|
384
619
|
}
|
|
620
|
+
const currentCount = this.db.count();
|
|
621
|
+
const params = this.getAdaptiveParams(currentCount);
|
|
622
|
+
// Check if we need to rebuild
|
|
623
|
+
// This would require checking current params vs recommended
|
|
624
|
+
// For now, just set efSearch which doesn't require rebuild
|
|
625
|
+
if (this.db.setEfSearch) {
|
|
626
|
+
this.db.setEfSearch(params.efSearch);
|
|
627
|
+
}
|
|
628
|
+
this.stats.indexRebuildCount++;
|
|
629
|
+
}
|
|
630
|
+
/**
|
|
631
|
+
* Save index and metadata to disk
|
|
632
|
+
*/
|
|
633
|
+
async save(savePath) {
|
|
634
|
+
this.ensureInitialized();
|
|
635
|
+
// Validate path for security
|
|
636
|
+
validatePath(savePath);
|
|
637
|
+
// Save vector index
|
|
638
|
+
this.db.save(savePath);
|
|
385
639
|
// Save metadata separately as JSON
|
|
386
|
-
const metadataPath =
|
|
640
|
+
const metadataPath = savePath + '.meta.json';
|
|
641
|
+
validatePath(metadataPath);
|
|
387
642
|
const fs = await import('fs/promises');
|
|
388
643
|
await fs.writeFile(metadataPath, JSON.stringify(Object.fromEntries(this.metadata), null, 2));
|
|
389
644
|
}
|
|
390
645
|
/**
|
|
391
646
|
* Load index and metadata from disk
|
|
392
647
|
*/
|
|
393
|
-
async load(
|
|
648
|
+
async load(loadPath) {
|
|
394
649
|
this.ensureInitialized();
|
|
395
|
-
//
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
650
|
+
// Validate path for security
|
|
651
|
+
validatePath(loadPath);
|
|
652
|
+
// Load vector index
|
|
653
|
+
this.db.load(loadPath);
|
|
399
654
|
// Load metadata
|
|
400
|
-
const metadataPath =
|
|
655
|
+
const metadataPath = loadPath + '.meta.json';
|
|
656
|
+
validatePath(metadataPath);
|
|
401
657
|
try {
|
|
402
658
|
const fs = await import('fs/promises');
|
|
403
659
|
const data = await fs.readFile(metadataPath, 'utf-8');
|
|
404
|
-
|
|
660
|
+
// Safely parse metadata with validation
|
|
661
|
+
let parsed;
|
|
662
|
+
try {
|
|
663
|
+
parsed = JSON.parse(data);
|
|
664
|
+
}
|
|
665
|
+
catch {
|
|
666
|
+
throw new Error('Invalid JSON in metadata file');
|
|
667
|
+
}
|
|
668
|
+
// Validate parsed data is a plain object
|
|
669
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
670
|
+
throw new Error('Metadata must be a plain object');
|
|
671
|
+
}
|
|
672
|
+
// Check for prototype pollution attempts
|
|
673
|
+
const unsafeKeys = ['__proto__', 'constructor', 'prototype'];
|
|
674
|
+
for (const key of Object.keys(parsed)) {
|
|
675
|
+
if (unsafeKeys.includes(key)) {
|
|
676
|
+
throw new Error(`Forbidden key in metadata: ${key}`);
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
this.metadata = new Map(Object.entries(parsed));
|
|
680
|
+
// Enforce size limit
|
|
681
|
+
if (this.metadata.size > MAX_METADATA_ENTRIES) {
|
|
682
|
+
this.metadata.clear();
|
|
683
|
+
throw new Error(`Loaded metadata exceeds maximum of ${MAX_METADATA_ENTRIES} entries`);
|
|
684
|
+
}
|
|
405
685
|
}
|
|
406
|
-
catch {
|
|
407
|
-
|
|
686
|
+
catch (error) {
|
|
687
|
+
if (error.code === 'ENOENT') {
|
|
688
|
+
// No metadata file - this is okay for backward compatibility
|
|
689
|
+
console.debug(`[RuVectorBackend] No metadata file found at ${metadataPath}`);
|
|
690
|
+
}
|
|
691
|
+
else {
|
|
692
|
+
throw error;
|
|
693
|
+
}
|
|
408
694
|
}
|
|
409
695
|
}
|
|
410
696
|
/**
|
|
411
697
|
* Close and cleanup resources
|
|
412
698
|
*/
|
|
413
699
|
close() {
|
|
700
|
+
// RuVector cleanup if needed
|
|
414
701
|
this.metadata.clear();
|
|
702
|
+
// Clear buffer pool
|
|
703
|
+
this.bufferPool.clear();
|
|
704
|
+
// Clean up mmap buffer
|
|
705
|
+
if (this.mmapBuffer) {
|
|
706
|
+
this.mmapBuffer = null;
|
|
707
|
+
}
|
|
708
|
+
// Reset stats
|
|
709
|
+
this.resetStats();
|
|
415
710
|
}
|
|
416
711
|
/**
|
|
417
|
-
* Convert
|
|
418
|
-
*
|
|
712
|
+
* Convert distance to similarity score based on metric
|
|
713
|
+
*
|
|
714
|
+
* Cosine: distance is already in [0, 2], where 0 = identical
|
|
715
|
+
* L2: exponential decay for unbounded distances
|
|
716
|
+
* IP: negative inner product, so negate for similarity
|
|
419
717
|
*/
|
|
420
|
-
|
|
718
|
+
distanceToSimilarity(distance) {
|
|
421
719
|
switch (this.config.metric) {
|
|
422
720
|
case 'cosine':
|
|
423
|
-
return 1 -
|
|
721
|
+
return 1 - distance; // cosine distance is 1 - similarity
|
|
424
722
|
case 'l2':
|
|
425
|
-
return
|
|
723
|
+
return Math.exp(-distance); // exponential decay
|
|
426
724
|
case 'ip':
|
|
427
|
-
return -
|
|
725
|
+
return -distance; // inner product: higher is better
|
|
428
726
|
default:
|
|
429
|
-
return 1 -
|
|
727
|
+
return 1 - distance;
|
|
430
728
|
}
|
|
431
729
|
}
|
|
432
730
|
/**
|
|
@@ -437,5 +735,42 @@ export class RuVectorBackend {
|
|
|
437
735
|
throw new Error('RuVectorBackend not initialized. Call initialize() first.');
|
|
438
736
|
}
|
|
439
737
|
}
|
|
738
|
+
/**
|
|
739
|
+
* Get the buffer pool instance for advanced use cases
|
|
740
|
+
*/
|
|
741
|
+
getBufferPool() {
|
|
742
|
+
return this.bufferPool;
|
|
743
|
+
}
|
|
744
|
+
/**
|
|
745
|
+
* Get the current concurrency semaphore status
|
|
746
|
+
*/
|
|
747
|
+
getConcurrencyStatus() {
|
|
748
|
+
return {
|
|
749
|
+
available: this.semaphore.available,
|
|
750
|
+
configured: this.config.parallelConcurrency ?? 4,
|
|
751
|
+
};
|
|
752
|
+
}
|
|
753
|
+
/**
|
|
754
|
+
* Check if memory-mapped storage is active
|
|
755
|
+
*/
|
|
756
|
+
isMmapEnabled() {
|
|
757
|
+
return this.mmapEnabled && this.mmapBuffer !== null;
|
|
758
|
+
}
|
|
759
|
+
/**
|
|
760
|
+
* Get recommended adaptive parameters for a given dataset size
|
|
761
|
+
*/
|
|
762
|
+
static getRecommendedParams(datasetSize) {
|
|
763
|
+
if (datasetSize < 1000) {
|
|
764
|
+
return { M: 8, efConstruction: 100, efSearch: 50 };
|
|
765
|
+
}
|
|
766
|
+
else if (datasetSize <= 100000) {
|
|
767
|
+
return { M: 16, efConstruction: 200, efSearch: 100 };
|
|
768
|
+
}
|
|
769
|
+
else {
|
|
770
|
+
return { M: 32, efConstruction: 400, efSearch: 200 };
|
|
771
|
+
}
|
|
772
|
+
}
|
|
440
773
|
}
|
|
774
|
+
// Export helper classes for advanced use cases
|
|
775
|
+
export { Semaphore, BufferPool };
|
|
441
776
|
//# sourceMappingURL=RuVectorBackend.js.map
|