agentdb 3.0.0-alpha.8 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +248 -269
- package/dist/schemas/frontier-schema.sql +7 -0
- package/dist/schemas/schema.sql +7 -0
- package/dist/src/backends/VectorBackend.d.ts +48 -6
- package/dist/src/backends/VectorBackend.d.ts.map +1 -1
- package/dist/src/backends/VectorBackend.js +13 -1
- package/dist/src/backends/VectorBackend.js.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 +140 -110
- package/dist/src/backends/factory.js.map +1 -1
- package/dist/src/backends/graph/GraphDatabaseAdapter.d.ts +54 -6
- package/dist/src/backends/graph/GraphDatabaseAdapter.d.ts.map +1 -1
- package/dist/src/backends/graph/GraphDatabaseAdapter.js +143 -6
- package/dist/src/backends/graph/GraphDatabaseAdapter.js.map +1 -1
- package/dist/src/backends/hnswlib/HNSWLibBackend.d.ts.map +1 -1
- package/dist/src/backends/hnswlib/HNSWLibBackend.js +35 -8
- package/dist/src/backends/hnswlib/HNSWLibBackend.js.map +1 -1
- package/dist/src/backends/index.d.ts +2 -1
- package/dist/src/backends/index.d.ts.map +1 -1
- package/dist/src/backends/index.js +2 -0
- package/dist/src/backends/index.js.map +1 -1
- package/dist/src/backends/ruvector/RuVectorBackend.d.ts +256 -45
- package/dist/src/backends/ruvector/RuVectorBackend.d.ts.map +1 -1
- package/dist/src/backends/ruvector/RuVectorBackend.js +764 -290
- 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 +567 -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 +212 -0
- package/dist/src/backends/rvf/FederatedSessionManager.d.ts.map +1 -0
- package/dist/src/backends/rvf/FederatedSessionManager.js +397 -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 +158 -0
- package/dist/src/backends/rvf/NativeAccelerator.d.ts.map +1 -0
- package/dist/src/backends/rvf/NativeAccelerator.js +702 -0
- package/dist/src/backends/rvf/NativeAccelerator.js.map +1 -0
- package/dist/src/backends/rvf/RvfBackend.d.ts +207 -0
- package/dist/src/backends/rvf/RvfBackend.d.ts.map +1 -0
- package/dist/src/backends/rvf/RvfBackend.js +651 -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 +612 -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 +104 -0
- package/dist/src/backends/rvf/SqlJsRvfBackend.d.ts.map +1 -0
- package/dist/src/backends/rvf/SqlJsRvfBackend.js +464 -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 +14 -0
- package/dist/src/cli/agentdb-cli.d.ts.map +1 -1
- package/dist/src/cli/agentdb-cli.js +839 -143
- package/dist/src/cli/agentdb-cli.js.map +1 -1
- package/dist/src/cli/commands/attention.js +12 -2
- package/dist/src/cli/commands/attention.js.map +1 -1
- package/dist/src/cli/commands/doctor.js +5 -5
- package/dist/src/cli/commands/doctor.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 +440 -0
- package/dist/src/cli/commands/hyperbolic.js.map +1 -0
- package/dist/src/cli/commands/install-embeddings.d.ts +1 -1
- package/dist/src/cli/commands/install-embeddings.d.ts.map +1 -1
- package/dist/src/cli/commands/install-embeddings.js +17 -11
- package/dist/src/cli/commands/install-embeddings.js.map +1 -1
- 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 +410 -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 +190 -10
- 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 +419 -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/commands/simulate-report.js +14 -2
- package/dist/src/cli/commands/simulate-report.js.map +1 -1
- 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 +92 -15
- 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 +23 -5
- package/dist/src/controllers/CausalRecall.js.map +1 -1
- package/dist/src/controllers/EmbeddingService.d.ts +29 -0
- package/dist/src/controllers/EmbeddingService.d.ts.map +1 -1
- package/dist/src/controllers/EmbeddingService.js +154 -32
- 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 +21 -7
- 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 +114 -39
- package/dist/src/controllers/HNSWIndex.js.map +1 -1
- package/dist/src/controllers/LearningSystem.d.ts +6 -17
- package/dist/src/controllers/LearningSystem.d.ts.map +1 -1
- package/dist/src/controllers/LearningSystem.js +66 -155
- package/dist/src/controllers/LearningSystem.js.map +1 -1
- package/dist/src/controllers/MemoryController.d.ts +174 -0
- package/dist/src/controllers/MemoryController.d.ts.map +1 -0
- package/dist/src/controllers/MemoryController.js +320 -0
- package/dist/src/controllers/MemoryController.js.map +1 -0
- package/dist/src/controllers/MetadataFilter.d.ts.map +1 -1
- package/dist/src/controllers/MetadataFilter.js +38 -26
- package/dist/src/controllers/MetadataFilter.js.map +1 -1
- 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 +45 -31
- 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 +211 -21
- package/dist/src/controllers/QUICClient.js.map +1 -1
- package/dist/src/controllers/QUICServer.d.ts.map +1 -1
- package/dist/src/controllers/QUICServer.js +36 -27
- package/dist/src/controllers/QUICServer.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 +77 -56
- package/dist/src/controllers/ReasoningBank.js.map +1 -1
- package/dist/src/controllers/ReflexionMemory.d.ts +129 -6
- package/dist/src/controllers/ReflexionMemory.d.ts.map +1 -1
- package/dist/src/controllers/ReflexionMemory.js +678 -220
- package/dist/src/controllers/ReflexionMemory.js.map +1 -1
- package/dist/src/controllers/SkillLibrary.d.ts +32 -3
- package/dist/src/controllers/SkillLibrary.d.ts.map +1 -1
- package/dist/src/controllers/SkillLibrary.js +239 -104
- 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 +126 -12
- 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 +161 -102
- 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 +15 -28
- package/dist/src/controllers/index.d.ts.map +1 -1
- package/dist/src/controllers/index.js +11 -19
- 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 +33 -19
- package/dist/src/core/AgentDB.d.ts.map +1 -1
- package/dist/src/core/AgentDB.js +87 -127
- 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 +52 -4
- package/dist/src/db-fallback.d.ts.map +1 -1
- package/dist/src/db-fallback.js +521 -71
- package/dist/src/db-fallback.js.map +1 -1
- package/dist/src/db-unified.d.ts.map +1 -1
- package/dist/src/db-unified.js +32 -30
- package/dist/src/db-unified.js.map +1 -1
- package/dist/src/embedding/EmbeddingSpaceIdentity.d.ts +58 -0
- package/dist/src/embedding/EmbeddingSpaceIdentity.d.ts.map +1 -0
- package/dist/src/embedding/EmbeddingSpaceIdentity.js +137 -0
- package/dist/src/embedding/EmbeddingSpaceIdentity.js.map +1 -0
- package/dist/src/embedding/index.d.ts +3 -0
- package/dist/src/embedding/index.d.ts.map +1 -0
- package/dist/src/embedding/index.js +2 -0
- package/dist/src/embedding/index.js.map +1 -0
- package/dist/src/examples/quic-sync-example.js +2 -2
- package/dist/src/examples/quic-sync-example.js.map +1 -1
- package/dist/src/governance/MetaHarnessGateway.d.ts +55 -0
- package/dist/src/governance/MetaHarnessGateway.d.ts.map +1 -0
- package/dist/src/governance/MetaHarnessGateway.js +65 -0
- package/dist/src/governance/MetaHarnessGateway.js.map +1 -0
- package/dist/src/governance/RvfExperimentBranch.d.ts +65 -0
- package/dist/src/governance/RvfExperimentBranch.d.ts.map +1 -0
- package/dist/src/governance/RvfExperimentBranch.js +115 -0
- package/dist/src/governance/RvfExperimentBranch.js.map +1 -0
- package/dist/src/index.d.ts +20 -16
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +44 -12
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/agentdb-mcp-server.js +178 -15
- package/dist/src/mcp/agentdb-mcp-server.js.map +1 -1
- package/dist/src/mcp/reset-database.d.ts +15 -0
- package/dist/src/mcp/reset-database.d.ts.map +1 -0
- package/dist/src/mcp/reset-database.js +45 -0
- package/dist/src/mcp/reset-database.js.map +1 -0
- package/dist/src/model/ModelCacheLoader.d.ts +31 -0
- package/dist/src/model/ModelCacheLoader.d.ts.map +1 -0
- package/dist/src/model/ModelCacheLoader.js +209 -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 +424 -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 +189 -35
- 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/schemas/inline.d.ts +3 -0
- package/dist/src/schemas/inline.d.ts.map +1 -0
- package/dist/src/schemas/inline.js +10 -0
- package/dist/src/schemas/inline.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 +713 -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/security/input-validation.d.ts +30 -0
- package/dist/src/security/input-validation.d.ts.map +1 -1
- package/dist/src/security/input-validation.js +77 -3
- package/dist/src/security/input-validation.js.map +1 -1
- package/dist/src/security/limits.d.ts.map +1 -1
- package/dist/src/security/limits.js +12 -3
- package/dist/src/security/limits.js.map +1 -1
- package/dist/src/security/mcp-policy.d.ts +17 -0
- package/dist/src/security/mcp-policy.d.ts.map +1 -0
- package/dist/src/security/mcp-policy.js +90 -0
- package/dist/src/security/mcp-policy.js.map +1 -0
- package/dist/src/security/path-security.d.ts.map +1 -1
- package/dist/src/security/path-security.js +3 -1
- package/dist/src/security/path-security.js.map +1 -1
- package/dist/src/security/validation.js +3 -3
- package/dist/src/security/validation.js.map +1 -1
- 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 +70 -8
- package/dist/src/services/LLMRouter.d.ts.map +1 -1
- package/dist/src/services/LLMRouter.js +279 -28
- 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 +1036 -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 +344 -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 +140 -0
- package/dist/src/wrappers/agentdb-fast.d.ts.map +1 -0
- package/dist/src/wrappers/agentdb-fast.js +309 -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 +130 -80
- 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/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 -172
- package/dist/src/services/GNNService.d.ts.map +0 -1
- package/dist/src/services/GNNService.js +0 -612
- 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,869 @@
|
|
|
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
|
+
}
|
|
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; //
|
|
161
|
+
db; // VectorDb from ruvector / @ruvector/core (every method is async)
|
|
19
162
|
config;
|
|
20
163
|
metadata = new Map();
|
|
21
164
|
initialized = false;
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
*
|
|
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 (
|
|
341
|
+
// Try main ruvector package first (includes core, gnn, graph)
|
|
42
342
|
let VectorDB;
|
|
43
|
-
let ruvectorModule;
|
|
44
343
|
try {
|
|
45
|
-
|
|
46
|
-
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
|
|
50
|
-
|
|
51
|
-
|
|
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
|
|
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
|
-
//
|
|
62
|
-
this.
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
//
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
|
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
|
-
*
|
|
93
|
-
* Uses ruvector 0.1.99+ object-style API: insert({ id, vector, metadata? })
|
|
406
|
+
* Initialize memory-mapped storage for large indices
|
|
94
407
|
*/
|
|
95
|
-
|
|
96
|
-
this.
|
|
97
|
-
|
|
98
|
-
//
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
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
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
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
|
-
*
|
|
119
|
-
*
|
|
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
|
-
|
|
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
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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
|
-
*
|
|
491
|
+
* Batch insert (queued; see insert())
|
|
143
492
|
*/
|
|
144
|
-
|
|
145
|
-
|
|
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
|
-
*
|
|
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
|
-
|
|
151
|
-
|
|
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
|
-
*
|
|
155
|
-
*
|
|
156
|
-
*
|
|
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
|
-
|
|
537
|
+
insertWithPooledBuffer(id, embedding, metadata) {
|
|
159
538
|
this.ensureInitialized();
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
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
|
-
}
|
|
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
|
-
|
|
209
|
-
|
|
210
|
-
|
|
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
|
-
|
|
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
|
-
*
|
|
275
|
-
*
|
|
568
|
+
* Search for k-nearest neighbors with optional filtering.
|
|
569
|
+
* Waits for queued writes so a preceding insert is visible.
|
|
276
570
|
*/
|
|
277
|
-
async
|
|
571
|
+
async searchAsync(query, k, options) {
|
|
278
572
|
this.ensureInitialized();
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
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
|
-
*
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
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(
|
|
739
|
+
async save(savePath) {
|
|
380
740
|
this.ensureInitialized();
|
|
381
|
-
//
|
|
382
|
-
|
|
383
|
-
|
|
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 =
|
|
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(
|
|
761
|
+
async load(loadPath) {
|
|
394
762
|
this.ensureInitialized();
|
|
395
|
-
//
|
|
396
|
-
|
|
397
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
418
|
-
*
|
|
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
|
-
|
|
857
|
+
distanceToSimilarity(distance) {
|
|
421
858
|
switch (this.config.metric) {
|
|
422
859
|
case 'cosine':
|
|
423
|
-
return 1 -
|
|
860
|
+
return 1 - distance; // cosine distance is 1 - similarity
|
|
424
861
|
case 'l2':
|
|
425
|
-
return
|
|
862
|
+
return Math.exp(-distance); // exponential decay
|
|
426
863
|
case 'ip':
|
|
427
|
-
return -
|
|
864
|
+
return -distance; // inner product: higher is better
|
|
428
865
|
default:
|
|
429
|
-
return 1 -
|
|
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
|