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.
Files changed (39) hide show
  1. package/.claude-flow/metrics/agent-metrics.json +1 -0
  2. package/.claude-flow/metrics/performance.json +87 -0
  3. package/.claude-flow/metrics/task-metrics.json +10 -0
  4. package/PACKAGE_SUMMARY.md +409 -0
  5. package/README.md +1679 -508
  6. package/bin/cli.js +2427 -0
  7. package/dist/core/agentdb-fast.d.ts +149 -0
  8. package/dist/core/agentdb-fast.d.ts.map +1 -0
  9. package/dist/core/agentdb-fast.js +301 -0
  10. package/dist/core/attention-fallbacks.d.ts +221 -0
  11. package/dist/core/attention-fallbacks.d.ts.map +1 -0
  12. package/dist/core/attention-fallbacks.js +361 -0
  13. package/dist/core/gnn-wrapper.d.ts +143 -0
  14. package/dist/core/gnn-wrapper.d.ts.map +1 -0
  15. package/dist/core/gnn-wrapper.js +213 -0
  16. package/dist/core/index.d.ts +15 -0
  17. package/dist/core/index.d.ts.map +1 -0
  18. package/dist/core/index.js +39 -0
  19. package/dist/core/sona-wrapper.d.ts +215 -0
  20. package/dist/core/sona-wrapper.d.ts.map +1 -0
  21. package/dist/core/sona-wrapper.js +258 -0
  22. package/dist/index.d.ts +87 -82
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +169 -89
  25. package/dist/services/embedding-service.d.ts +136 -0
  26. package/dist/services/embedding-service.d.ts.map +1 -0
  27. package/dist/services/embedding-service.js +294 -0
  28. package/dist/services/index.d.ts +6 -0
  29. package/dist/services/index.d.ts.map +1 -0
  30. package/dist/services/index.js +26 -0
  31. package/dist/types.d.ts +145 -0
  32. package/dist/types.d.ts.map +1 -0
  33. package/dist/types.js +2 -0
  34. package/examples/api-usage.js +211 -0
  35. package/examples/cli-demo.sh +85 -0
  36. package/package.json +41 -93
  37. package/bin/ruvector.js +0 -1150
  38. package/dist/index.d.mts +0 -95
  39. package/dist/index.mjs +0 -5
package/dist/index.js CHANGED
@@ -1,98 +1,178 @@
1
1
  "use strict";
2
2
  /**
3
- * rUvector - High-performance vector database
4
- * Smart loader that tries native bindings first, falls back to WASM
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.VectorIndex = exports.Utils = void 0;
8
- exports.getBackendInfo = getBackendInfo;
9
- exports.isNativeAvailable = isNativeAvailable;
10
-
11
- let backend;
12
- let backendType = 'wasm';
13
-
14
- function loadBackend() {
15
- if (backend) return backend;
16
- try {
17
- backend = require('@ruvector/core');
18
- backendType = 'native';
19
- return backend;
20
- } catch (e) {
21
- try {
22
- backend = require('@ruvector/wasm');
23
- backendType = 'wasm';
24
- return backend;
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
- class VectorIndex {
32
- constructor(options) {
33
- const backend = loadBackend();
34
- this.index = new backend.VectorIndex(options);
35
- }
36
- async insert(vector) { return this.index.insert(vector); }
37
- async insertBatch(vectors, options) {
38
- if (this.index.insertBatch) return this.index.insertBatch(vectors, options);
39
- const batchSize = options?.batchSize || 1000;
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
- exports.VectorIndex = VectorIndex;
62
-
63
- const Utils = {
64
- cosineSimilarity(a, b) {
65
- if (a.length !== b.length) throw new Error('Vectors must have the same dimension');
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
- function isNativeAvailable() {
95
- try { require.resolve('@ruvector/core'); return true; } catch { return false; }
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.default = VectorIndex;
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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"}