ruvector 0.1.38 → 0.1.39
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/.claude-flow/metrics/agent-metrics.json +1 -0
- package/.claude-flow/metrics/performance.json +87 -0
- package/.claude-flow/metrics/task-metrics.json +10 -0
- package/PACKAGE_SUMMARY.md +409 -0
- package/README.md +1679 -508
- package/bin/cli.js +2427 -0
- package/dist/core/agentdb-fast.d.ts +149 -0
- package/dist/core/agentdb-fast.d.ts.map +1 -0
- package/dist/core/agentdb-fast.js +301 -0
- package/dist/core/attention-fallbacks.d.ts +221 -0
- package/dist/core/attention-fallbacks.d.ts.map +1 -0
- package/dist/core/attention-fallbacks.js +361 -0
- package/dist/core/gnn-wrapper.d.ts +143 -0
- package/dist/core/gnn-wrapper.d.ts.map +1 -0
- package/dist/core/gnn-wrapper.js +213 -0
- package/dist/core/index.d.ts +15 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +39 -0
- package/dist/core/sona-wrapper.d.ts +215 -0
- package/dist/core/sona-wrapper.d.ts.map +1 -0
- package/dist/core/sona-wrapper.js +258 -0
- package/dist/index.d.ts +87 -82
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +169 -89
- package/dist/services/embedding-service.d.ts +136 -0
- package/dist/services/embedding-service.d.ts.map +1 -0
- package/dist/services/embedding-service.js +294 -0
- package/dist/services/index.d.ts +6 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +26 -0
- package/dist/types.d.ts +145 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/examples/api-usage.js +211 -0
- package/examples/cli-demo.sh +85 -0
- package/package.json +41 -93
- package/bin/ruvector.js +0 -1150
- package/dist/index.d.mts +0 -95
- package/dist/index.mjs +0 -5
package/dist/index.js
CHANGED
|
@@ -1,98 +1,178 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
3
|
+
* ruvector - High-performance vector database for Node.js
|
|
4
|
+
*
|
|
5
|
+
* This package automatically detects and uses the best available implementation:
|
|
6
|
+
* 1. Native (Rust-based, fastest) - if available for your platform
|
|
7
|
+
* 2. WASM (WebAssembly, universal fallback) - works everywhere
|
|
8
|
+
*
|
|
9
|
+
* Also provides safe wrappers for GNN and Attention modules that handle
|
|
10
|
+
* array type conversions automatically.
|
|
5
11
|
*/
|
|
12
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
15
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
16
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
17
|
+
}
|
|
18
|
+
Object.defineProperty(o, k2, desc);
|
|
19
|
+
}) : (function(o, m, k, k2) {
|
|
20
|
+
if (k2 === undefined) k2 = k;
|
|
21
|
+
o[k2] = m[k];
|
|
22
|
+
}));
|
|
23
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
24
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
25
|
+
};
|
|
6
26
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.
|
|
8
|
-
exports.
|
|
9
|
-
exports.
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
} catch (wasmError) {
|
|
26
|
-
throw new Error('Failed to load rUvector backend. Please install @ruvector/core or @ruvector/wasm.');
|
|
27
|
+
exports.NativeVectorDb = exports.VectorDB = exports.VectorDb = void 0;
|
|
28
|
+
exports.getImplementationType = getImplementationType;
|
|
29
|
+
exports.isNative = isNative;
|
|
30
|
+
exports.isWasm = isWasm;
|
|
31
|
+
exports.getVersion = getVersion;
|
|
32
|
+
__exportStar(require("./types"), exports);
|
|
33
|
+
// Export core wrappers (safe interfaces with automatic type conversion)
|
|
34
|
+
__exportStar(require("./core"), exports);
|
|
35
|
+
__exportStar(require("./services"), exports);
|
|
36
|
+
let implementation;
|
|
37
|
+
let implementationType = 'wasm';
|
|
38
|
+
try {
|
|
39
|
+
// Try to load native module first
|
|
40
|
+
implementation = require('@ruvector/core');
|
|
41
|
+
implementationType = 'native';
|
|
42
|
+
// Verify it's actually working
|
|
43
|
+
if (typeof implementation.VectorDB !== 'function') {
|
|
44
|
+
throw new Error('Native module loaded but VectorDB not found');
|
|
27
45
|
}
|
|
28
|
-
}
|
|
29
46
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
for (let i = 0; i < vectors.length; i += batchSize) {
|
|
41
|
-
const batch = vectors.slice(i, Math.min(i + batchSize, vectors.length));
|
|
42
|
-
await Promise.all(batch.map(v => this.insert(v)));
|
|
43
|
-
if (options?.progressCallback) options.progressCallback(Math.min(i + batchSize, vectors.length) / vectors.length);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
async search(query, options) { return this.index.search(query, options); }
|
|
47
|
-
async get(id) { return this.index.get(id); }
|
|
48
|
-
async delete(id) { return this.index.delete(id); }
|
|
49
|
-
async stats() { return this.index.stats(); }
|
|
50
|
-
async save(path) { return this.index.save(path); }
|
|
51
|
-
static async load(path) {
|
|
52
|
-
const backend = loadBackend();
|
|
53
|
-
const index = await backend.VectorIndex.load(path);
|
|
54
|
-
const wrapper = Object.create(VectorIndex.prototype);
|
|
55
|
-
wrapper.index = index;
|
|
56
|
-
return wrapper;
|
|
57
|
-
}
|
|
58
|
-
async clear() { return this.index.clear(); }
|
|
59
|
-
async optimize() { if (this.index.optimize) return this.index.optimize(); }
|
|
47
|
+
catch (e) {
|
|
48
|
+
// No WASM fallback available yet
|
|
49
|
+
throw new Error(`Failed to load ruvector native module.\n` +
|
|
50
|
+
`Error: ${e.message}\n` +
|
|
51
|
+
`\nSupported platforms:\n` +
|
|
52
|
+
`- Linux x64/ARM64\n` +
|
|
53
|
+
`- macOS Intel/Apple Silicon\n` +
|
|
54
|
+
`- Windows x64\n` +
|
|
55
|
+
`\nIf you're on a supported platform, try:\n` +
|
|
56
|
+
` npm install --force @ruvector/core`);
|
|
60
57
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
let dotProduct = 0, normA = 0, normB = 0;
|
|
67
|
-
for (let i = 0; i < a.length; i++) { dotProduct += a[i] * b[i]; normA += a[i] * a[i]; normB += b[i] * b[i]; }
|
|
68
|
-
return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
|
|
69
|
-
},
|
|
70
|
-
euclideanDistance(a, b) {
|
|
71
|
-
if (a.length !== b.length) throw new Error('Vectors must have the same dimension');
|
|
72
|
-
let sum = 0;
|
|
73
|
-
for (let i = 0; i < a.length; i++) { const diff = a[i] - b[i]; sum += diff * diff; }
|
|
74
|
-
return Math.sqrt(sum);
|
|
75
|
-
},
|
|
76
|
-
normalize(vector) {
|
|
77
|
-
const norm = Math.sqrt(vector.reduce((sum, val) => sum + val * val, 0));
|
|
78
|
-
return vector.map(val => val / norm);
|
|
79
|
-
},
|
|
80
|
-
randomVector(dimension) {
|
|
81
|
-
const vector = new Array(dimension);
|
|
82
|
-
for (let i = 0; i < dimension; i++) vector[i] = Math.random() * 2 - 1;
|
|
83
|
-
return this.normalize(vector);
|
|
84
|
-
}
|
|
85
|
-
};
|
|
86
|
-
exports.Utils = Utils;
|
|
87
|
-
|
|
88
|
-
function getBackendInfo() {
|
|
89
|
-
loadBackend();
|
|
90
|
-
const features = backendType === 'native' ? ['SIMD', 'Multi-threading', 'Memory-mapped I/O'] : ['Browser-compatible', 'No native dependencies'];
|
|
91
|
-
return { type: backendType, version: require('../package.json').version, features };
|
|
58
|
+
/**
|
|
59
|
+
* Get the current implementation type
|
|
60
|
+
*/
|
|
61
|
+
function getImplementationType() {
|
|
62
|
+
return implementationType;
|
|
92
63
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
64
|
+
/**
|
|
65
|
+
* Check if native implementation is being used
|
|
66
|
+
*/
|
|
67
|
+
function isNative() {
|
|
68
|
+
return implementationType === 'native';
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Check if WASM implementation is being used
|
|
72
|
+
*/
|
|
73
|
+
function isWasm() {
|
|
74
|
+
return implementationType === 'wasm';
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Get version information
|
|
78
|
+
*/
|
|
79
|
+
function getVersion() {
|
|
80
|
+
const pkg = require('../package.json');
|
|
81
|
+
return {
|
|
82
|
+
version: pkg.version,
|
|
83
|
+
implementation: implementationType
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Wrapper class that automatically handles metadata JSON conversion
|
|
88
|
+
*/
|
|
89
|
+
class VectorDBWrapper {
|
|
90
|
+
constructor(options) {
|
|
91
|
+
this.db = new implementation.VectorDb(options);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Insert a vector with optional metadata (objects are auto-converted to JSON)
|
|
95
|
+
*/
|
|
96
|
+
async insert(entry) {
|
|
97
|
+
const nativeEntry = {
|
|
98
|
+
id: entry.id,
|
|
99
|
+
vector: entry.vector instanceof Float32Array ? entry.vector : new Float32Array(entry.vector),
|
|
100
|
+
};
|
|
101
|
+
// Auto-convert metadata object to JSON string
|
|
102
|
+
if (entry.metadata) {
|
|
103
|
+
nativeEntry.metadata = JSON.stringify(entry.metadata);
|
|
104
|
+
}
|
|
105
|
+
return this.db.insert(nativeEntry);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Insert multiple vectors in batch
|
|
109
|
+
*/
|
|
110
|
+
async insertBatch(entries) {
|
|
111
|
+
const nativeEntries = entries.map(entry => ({
|
|
112
|
+
id: entry.id,
|
|
113
|
+
vector: entry.vector instanceof Float32Array ? entry.vector : new Float32Array(entry.vector),
|
|
114
|
+
metadata: entry.metadata ? JSON.stringify(entry.metadata) : undefined,
|
|
115
|
+
}));
|
|
116
|
+
return this.db.insertBatch(nativeEntries);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Search for similar vectors (metadata is auto-parsed from JSON)
|
|
120
|
+
*/
|
|
121
|
+
async search(query) {
|
|
122
|
+
const nativeQuery = {
|
|
123
|
+
vector: query.vector instanceof Float32Array ? query.vector : new Float32Array(query.vector),
|
|
124
|
+
k: query.k,
|
|
125
|
+
efSearch: query.efSearch,
|
|
126
|
+
};
|
|
127
|
+
// Auto-convert filter object to JSON string
|
|
128
|
+
if (query.filter) {
|
|
129
|
+
nativeQuery.filter = JSON.stringify(query.filter);
|
|
130
|
+
}
|
|
131
|
+
const results = await this.db.search(nativeQuery);
|
|
132
|
+
// Auto-parse metadata JSON strings back to objects
|
|
133
|
+
return results.map((r) => ({
|
|
134
|
+
id: r.id,
|
|
135
|
+
score: r.score,
|
|
136
|
+
vector: r.vector,
|
|
137
|
+
metadata: r.metadata ? JSON.parse(r.metadata) : undefined,
|
|
138
|
+
}));
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Get a vector by ID (metadata is auto-parsed from JSON)
|
|
142
|
+
*/
|
|
143
|
+
async get(id) {
|
|
144
|
+
const entry = await this.db.get(id);
|
|
145
|
+
if (!entry)
|
|
146
|
+
return null;
|
|
147
|
+
return {
|
|
148
|
+
id: entry.id,
|
|
149
|
+
vector: entry.vector,
|
|
150
|
+
metadata: entry.metadata ? JSON.parse(entry.metadata) : undefined,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Delete a vector by ID
|
|
155
|
+
*/
|
|
156
|
+
async delete(id) {
|
|
157
|
+
return this.db.delete(id);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Get the number of vectors in the database
|
|
161
|
+
*/
|
|
162
|
+
async len() {
|
|
163
|
+
return this.db.len();
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Check if the database is empty
|
|
167
|
+
*/
|
|
168
|
+
async isEmpty() {
|
|
169
|
+
return this.db.isEmpty();
|
|
170
|
+
}
|
|
96
171
|
}
|
|
97
|
-
|
|
98
|
-
exports.
|
|
172
|
+
// Export the wrapper class (aliased as VectorDB for backwards compatibility)
|
|
173
|
+
exports.VectorDb = VectorDBWrapper;
|
|
174
|
+
exports.VectorDB = VectorDBWrapper;
|
|
175
|
+
// Also export the raw native implementation for advanced users
|
|
176
|
+
exports.NativeVectorDb = implementation.VectorDb;
|
|
177
|
+
// Export everything from the implementation
|
|
178
|
+
exports.default = implementation;
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding Service - Unified embedding generation and management
|
|
3
|
+
*
|
|
4
|
+
* This service provides a unified interface for generating, caching, and
|
|
5
|
+
* managing embeddings from various sources (local models, APIs, etc.)
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Embedding provider interface
|
|
9
|
+
*/
|
|
10
|
+
export interface EmbeddingProvider {
|
|
11
|
+
/** Provider name */
|
|
12
|
+
name: string;
|
|
13
|
+
/** Generate embeddings for texts */
|
|
14
|
+
embed(texts: string[]): Promise<number[][]>;
|
|
15
|
+
/** Get embedding dimensions */
|
|
16
|
+
getDimensions(): number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Embedding service configuration
|
|
20
|
+
*/
|
|
21
|
+
export interface EmbeddingServiceConfig {
|
|
22
|
+
/** Default provider to use */
|
|
23
|
+
defaultProvider?: string;
|
|
24
|
+
/** Maximum cache size */
|
|
25
|
+
maxCacheSize?: number;
|
|
26
|
+
/** Cache TTL in milliseconds */
|
|
27
|
+
cacheTtl?: number;
|
|
28
|
+
/** Batch size for embedding generation */
|
|
29
|
+
batchSize?: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Mock embedding provider for testing
|
|
33
|
+
*/
|
|
34
|
+
export declare class MockEmbeddingProvider implements EmbeddingProvider {
|
|
35
|
+
name: string;
|
|
36
|
+
private dimensions;
|
|
37
|
+
constructor(dimensions?: number);
|
|
38
|
+
embed(texts: string[]): Promise<number[][]>;
|
|
39
|
+
getDimensions(): number;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Simple local embedding using character n-grams
|
|
43
|
+
* This is a fallback when no external provider is available
|
|
44
|
+
*/
|
|
45
|
+
export declare class LocalNGramProvider implements EmbeddingProvider {
|
|
46
|
+
name: string;
|
|
47
|
+
private dimensions;
|
|
48
|
+
private ngramSize;
|
|
49
|
+
constructor(dimensions?: number, ngramSize?: number);
|
|
50
|
+
embed(texts: string[]): Promise<number[][]>;
|
|
51
|
+
private embedSingle;
|
|
52
|
+
private hashNgram;
|
|
53
|
+
getDimensions(): number;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Embedding service with caching and batching
|
|
57
|
+
*/
|
|
58
|
+
export declare class EmbeddingService {
|
|
59
|
+
private providers;
|
|
60
|
+
private cache;
|
|
61
|
+
private config;
|
|
62
|
+
constructor(config?: EmbeddingServiceConfig);
|
|
63
|
+
/**
|
|
64
|
+
* Register an embedding provider
|
|
65
|
+
*/
|
|
66
|
+
registerProvider(provider: EmbeddingProvider): void;
|
|
67
|
+
/**
|
|
68
|
+
* Get a registered provider
|
|
69
|
+
*/
|
|
70
|
+
getProvider(name?: string): EmbeddingProvider;
|
|
71
|
+
/**
|
|
72
|
+
* Generate embeddings for texts with caching
|
|
73
|
+
*
|
|
74
|
+
* @param texts - Texts to embed
|
|
75
|
+
* @param provider - Provider name (uses default if not specified)
|
|
76
|
+
* @returns Array of embeddings
|
|
77
|
+
*/
|
|
78
|
+
embed(texts: string[], provider?: string): Promise<number[][]>;
|
|
79
|
+
/**
|
|
80
|
+
* Generate a single embedding
|
|
81
|
+
*/
|
|
82
|
+
embedOne(text: string, provider?: string): Promise<number[]>;
|
|
83
|
+
/**
|
|
84
|
+
* Add entry to cache with LRU eviction
|
|
85
|
+
*/
|
|
86
|
+
private addToCache;
|
|
87
|
+
/**
|
|
88
|
+
* Compute cosine similarity between two embeddings
|
|
89
|
+
*/
|
|
90
|
+
cosineSimilarity(a: number[], b: number[]): number;
|
|
91
|
+
/**
|
|
92
|
+
* Find most similar texts from a corpus
|
|
93
|
+
*/
|
|
94
|
+
findSimilar(query: string, corpus: string[], k?: number, provider?: string): Promise<{
|
|
95
|
+
text: string;
|
|
96
|
+
similarity: number;
|
|
97
|
+
index: number;
|
|
98
|
+
}[]>;
|
|
99
|
+
/**
|
|
100
|
+
* Get cache statistics
|
|
101
|
+
*/
|
|
102
|
+
getCacheStats(): {
|
|
103
|
+
size: number;
|
|
104
|
+
maxSize: number;
|
|
105
|
+
hitRate: number;
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* Clear the cache
|
|
109
|
+
*/
|
|
110
|
+
clearCache(): void;
|
|
111
|
+
/**
|
|
112
|
+
* Get embedding dimensions for a provider
|
|
113
|
+
*/
|
|
114
|
+
getDimensions(provider?: string): number;
|
|
115
|
+
/**
|
|
116
|
+
* List available providers
|
|
117
|
+
*/
|
|
118
|
+
listProviders(): string[];
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Create an embedding service instance
|
|
122
|
+
*/
|
|
123
|
+
export declare function createEmbeddingService(config?: EmbeddingServiceConfig): EmbeddingService;
|
|
124
|
+
/**
|
|
125
|
+
* Get the default embedding service instance
|
|
126
|
+
*/
|
|
127
|
+
export declare function getDefaultEmbeddingService(): EmbeddingService;
|
|
128
|
+
declare const _default: {
|
|
129
|
+
EmbeddingService: typeof EmbeddingService;
|
|
130
|
+
LocalNGramProvider: typeof LocalNGramProvider;
|
|
131
|
+
MockEmbeddingProvider: typeof MockEmbeddingProvider;
|
|
132
|
+
createEmbeddingService: typeof createEmbeddingService;
|
|
133
|
+
getDefaultEmbeddingService: typeof getDefaultEmbeddingService;
|
|
134
|
+
};
|
|
135
|
+
export default _default;
|
|
136
|
+
//# sourceMappingURL=embedding-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-service.d.ts","sourceRoot":"","sources":["../../src/services/embedding-service.ts"],"names":[],"mappings":"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"}
|