ruvector 0.2.23 → 0.2.26

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 (120) hide show
  1. package/bin/cli.js +332 -79
  2. package/bin/mcp-server.js +94 -22
  3. package/dist/analysis/complexity.d.ts +52 -0
  4. package/dist/analysis/complexity.d.ts.map +1 -0
  5. package/dist/analysis/complexity.js +146 -0
  6. package/dist/analysis/index.d.ts +15 -0
  7. package/dist/analysis/index.d.ts.map +1 -0
  8. package/dist/analysis/index.js +38 -0
  9. package/dist/analysis/patterns.d.ts +71 -0
  10. package/dist/analysis/patterns.d.ts.map +1 -0
  11. package/dist/analysis/patterns.js +243 -0
  12. package/dist/analysis/security.d.ts +51 -0
  13. package/dist/analysis/security.d.ts.map +1 -0
  14. package/dist/analysis/security.js +139 -0
  15. package/dist/core/adaptive-embedder.d.ts +156 -0
  16. package/dist/core/adaptive-embedder.d.ts.map +1 -0
  17. package/dist/core/adaptive-embedder.js +838 -0
  18. package/dist/core/agentdb-fast.d.ts +149 -0
  19. package/dist/core/agentdb-fast.d.ts.map +1 -0
  20. package/dist/core/agentdb-fast.js +301 -0
  21. package/dist/core/ast-parser.d.ts +108 -0
  22. package/dist/core/ast-parser.d.ts.map +1 -0
  23. package/dist/core/ast-parser.js +602 -0
  24. package/dist/core/attention-fallbacks.d.ts +321 -0
  25. package/dist/core/attention-fallbacks.d.ts.map +1 -0
  26. package/dist/core/attention-fallbacks.js +552 -0
  27. package/dist/core/cluster-wrapper.d.ts +148 -0
  28. package/dist/core/cluster-wrapper.d.ts.map +1 -0
  29. package/dist/core/cluster-wrapper.js +271 -0
  30. package/dist/core/coverage-router.d.ts +88 -0
  31. package/dist/core/coverage-router.d.ts.map +1 -0
  32. package/dist/core/coverage-router.js +315 -0
  33. package/dist/core/diff-embeddings.d.ts +93 -0
  34. package/dist/core/diff-embeddings.d.ts.map +1 -0
  35. package/dist/core/diff-embeddings.js +334 -0
  36. package/dist/core/diskann-wrapper.d.ts +53 -0
  37. package/dist/core/diskann-wrapper.d.ts.map +1 -0
  38. package/dist/core/diskann-wrapper.js +105 -0
  39. package/dist/core/gnn-wrapper.d.ts +143 -0
  40. package/dist/core/gnn-wrapper.d.ts.map +1 -0
  41. package/dist/core/gnn-wrapper.js +213 -0
  42. package/dist/core/graph-algorithms.d.ts +83 -0
  43. package/dist/core/graph-algorithms.d.ts.map +1 -0
  44. package/dist/core/graph-algorithms.js +514 -0
  45. package/dist/core/graph-wrapper.d.ts +147 -0
  46. package/dist/core/graph-wrapper.d.ts.map +1 -0
  47. package/dist/core/graph-wrapper.js +299 -0
  48. package/dist/core/index.d.ts +50 -0
  49. package/dist/core/index.d.ts.map +1 -0
  50. package/dist/core/index.js +92 -0
  51. package/dist/core/intelligence-engine.d.ts +258 -0
  52. package/dist/core/intelligence-engine.d.ts.map +1 -0
  53. package/dist/core/intelligence-engine.js +1026 -0
  54. package/dist/core/learning-engine.d.ts +162 -0
  55. package/dist/core/learning-engine.d.ts.map +1 -0
  56. package/dist/core/learning-engine.js +609 -0
  57. package/dist/core/neural-embeddings.d.ts +393 -0
  58. package/dist/core/neural-embeddings.d.ts.map +1 -0
  59. package/dist/core/neural-embeddings.js +1091 -0
  60. package/dist/core/neural-perf.d.ts +331 -0
  61. package/dist/core/neural-perf.d.ts.map +1 -0
  62. package/dist/core/neural-perf.js +704 -0
  63. package/dist/core/onnx/loader.js +348 -0
  64. package/dist/core/onnx/pkg/LICENSE +21 -0
  65. package/dist/core/onnx/pkg/loader.js +348 -0
  66. package/dist/core/onnx/pkg/package.json +3 -0
  67. package/dist/core/onnx/pkg/ruvector_onnx_embeddings_wasm.d.ts +112 -0
  68. package/dist/core/onnx/pkg/ruvector_onnx_embeddings_wasm.js +5 -0
  69. package/dist/core/onnx/pkg/ruvector_onnx_embeddings_wasm_bg.js +638 -0
  70. package/dist/core/onnx/pkg/ruvector_onnx_embeddings_wasm_bg.wasm +0 -0
  71. package/dist/core/onnx/pkg/ruvector_onnx_embeddings_wasm_bg.wasm.d.ts +29 -0
  72. package/dist/core/onnx-embedder.d.ts +105 -0
  73. package/dist/core/onnx-embedder.d.ts.map +1 -0
  74. package/dist/core/onnx-embedder.js +414 -0
  75. package/dist/core/onnx-optimized.d.ts +109 -0
  76. package/dist/core/onnx-optimized.d.ts.map +1 -0
  77. package/dist/core/onnx-optimized.js +419 -0
  78. package/dist/core/parallel-intelligence.d.ts +109 -0
  79. package/dist/core/parallel-intelligence.d.ts.map +1 -0
  80. package/dist/core/parallel-intelligence.js +340 -0
  81. package/dist/core/parallel-workers.d.ts +177 -0
  82. package/dist/core/parallel-workers.d.ts.map +1 -0
  83. package/dist/core/parallel-workers.js +783 -0
  84. package/dist/core/router-wrapper.d.ts +75 -0
  85. package/dist/core/router-wrapper.d.ts.map +1 -0
  86. package/dist/core/router-wrapper.js +243 -0
  87. package/dist/core/rvf-wrapper.d.ts +86 -0
  88. package/dist/core/rvf-wrapper.d.ts.map +1 -0
  89. package/dist/core/rvf-wrapper.js +102 -0
  90. package/dist/core/sona-wrapper.d.ts +226 -0
  91. package/dist/core/sona-wrapper.d.ts.map +1 -0
  92. package/dist/core/sona-wrapper.js +282 -0
  93. package/dist/core/tensor-compress.d.ts +134 -0
  94. package/dist/core/tensor-compress.d.ts.map +1 -0
  95. package/dist/core/tensor-compress.js +432 -0
  96. package/dist/index.d.ts +160 -0
  97. package/dist/index.d.ts.map +1 -0
  98. package/dist/index.js +359 -0
  99. package/dist/services/embedding-service.d.ts +136 -0
  100. package/dist/services/embedding-service.d.ts.map +1 -0
  101. package/dist/services/embedding-service.js +294 -0
  102. package/dist/services/index.d.ts +6 -0
  103. package/dist/services/index.d.ts.map +1 -0
  104. package/dist/services/index.js +26 -0
  105. package/dist/types.d.ts +145 -0
  106. package/dist/types.d.ts.map +1 -0
  107. package/dist/types.js +2 -0
  108. package/dist/workers/benchmark.d.ts +44 -0
  109. package/dist/workers/benchmark.d.ts.map +1 -0
  110. package/dist/workers/benchmark.js +230 -0
  111. package/dist/workers/index.d.ts +10 -0
  112. package/dist/workers/index.d.ts.map +1 -0
  113. package/dist/workers/index.js +25 -0
  114. package/dist/workers/native-worker.d.ts +76 -0
  115. package/dist/workers/native-worker.d.ts.map +1 -0
  116. package/dist/workers/native-worker.js +490 -0
  117. package/dist/workers/types.d.ts +69 -0
  118. package/dist/workers/types.d.ts.map +1 -0
  119. package/dist/workers/types.js +7 -0
  120. package/package.json +11 -9
@@ -0,0 +1,105 @@
1
+ /**
2
+ * ONNX WASM Embedder - Semantic embeddings for hooks
3
+ *
4
+ * Provides real transformer-based embeddings using all-MiniLM-L6-v2
5
+ * running in pure WASM (no native dependencies).
6
+ *
7
+ * Uses bundled ONNX WASM files from src/core/onnx/
8
+ *
9
+ * Features:
10
+ * - 384-dimensional semantic embeddings
11
+ * - Real semantic understanding (not hash-based)
12
+ * - Cached model loading (downloads from HuggingFace on first use)
13
+ * - Batch embedding support
14
+ * - Optional parallel workers for 3.8x batch speedup
15
+ */
16
+ declare global {
17
+ var __ruvector_require: NodeRequire | undefined;
18
+ }
19
+ export interface OnnxEmbedderConfig {
20
+ modelId?: string;
21
+ maxLength?: number;
22
+ normalize?: boolean;
23
+ cacheDir?: string;
24
+ /**
25
+ * Enable parallel workers for batch operations
26
+ * - 'auto' (default): Enable for long-running processes, skip for CLI
27
+ * - true: Always enable workers
28
+ * - false: Never use workers
29
+ */
30
+ enableParallel?: boolean | 'auto';
31
+ /** Number of worker threads (default: CPU cores - 1) */
32
+ numWorkers?: number;
33
+ /** Minimum batch size to use parallel processing (default: 4) */
34
+ parallelThreshold?: number;
35
+ }
36
+ export interface EmbeddingResult {
37
+ embedding: number[];
38
+ dimension: number;
39
+ timeMs: number;
40
+ }
41
+ export interface SimilarityResult {
42
+ similarity: number;
43
+ timeMs: number;
44
+ }
45
+ /**
46
+ * Check if ONNX embedder is available (bundled files exist)
47
+ */
48
+ export declare function isOnnxAvailable(): boolean;
49
+ /**
50
+ * Initialize the ONNX embedder (downloads model if needed)
51
+ */
52
+ export declare function initOnnxEmbedder(config?: OnnxEmbedderConfig): Promise<boolean>;
53
+ /**
54
+ * Generate embedding for text
55
+ */
56
+ export declare function embed(text: string): Promise<EmbeddingResult>;
57
+ /**
58
+ * Generate embeddings for multiple texts
59
+ * Uses parallel workers automatically for batches >= parallelThreshold
60
+ */
61
+ export declare function embedBatch(texts: string[]): Promise<EmbeddingResult[]>;
62
+ /**
63
+ * Calculate cosine similarity between two texts
64
+ */
65
+ export declare function similarity(text1: string, text2: string): Promise<SimilarityResult>;
66
+ /**
67
+ * Calculate cosine similarity between two embeddings
68
+ */
69
+ export declare function cosineSimilarity(a: number[], b: number[]): number;
70
+ /**
71
+ * Get embedding dimension
72
+ */
73
+ export declare function getDimension(): number;
74
+ /**
75
+ * Check if embedder is ready
76
+ */
77
+ export declare function isReady(): boolean;
78
+ /**
79
+ * Get embedder stats including SIMD and parallel capabilities
80
+ */
81
+ export declare function getStats(): {
82
+ ready: boolean;
83
+ dimension: number;
84
+ model: string;
85
+ simd: boolean;
86
+ parallel: boolean;
87
+ parallelWorkers: number;
88
+ parallelThreshold: number;
89
+ };
90
+ /**
91
+ * Shutdown parallel workers (call on exit)
92
+ */
93
+ export declare function shutdown(): Promise<void>;
94
+ export declare class OnnxEmbedder {
95
+ private config;
96
+ constructor(config?: OnnxEmbedderConfig);
97
+ init(): Promise<boolean>;
98
+ embed(text: string): Promise<number[]>;
99
+ embedBatch(texts: string[]): Promise<number[][]>;
100
+ similarity(text1: string, text2: string): Promise<number>;
101
+ get dimension(): number;
102
+ get ready(): boolean;
103
+ }
104
+ export default OnnxEmbedder;
105
+ //# sourceMappingURL=onnx-embedder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onnx-embedder.d.ts","sourceRoot":"","sources":["../../src/core/onnx-embedder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAQH,OAAO,CAAC,MAAM,CAAC;IAEb,IAAI,kBAAkB,EAAE,WAAW,GAAG,SAAS,CAAC;CACjD;AAuBD,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAClC,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAMD,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAeD;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAOzC;AA6DD;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,GAAE,kBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC,CAkGxF;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAiBlE;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAwC5E;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAaxF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAiBjE;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAgB,OAAO,IAAI,OAAO,CAEjC;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAUA;AAED;;GAEG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAM9C;AAGD,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAqB;gBAEvB,MAAM,GAAE,kBAAuB;IAIrC,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAIxB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKtC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAKhD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK/D,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,KAAK,IAAI,OAAO,CAEnB;CACF;AAED,eAAe,YAAY,CAAC"}
@@ -0,0 +1,414 @@
1
+ "use strict";
2
+ /**
3
+ * ONNX WASM Embedder - Semantic embeddings for hooks
4
+ *
5
+ * Provides real transformer-based embeddings using all-MiniLM-L6-v2
6
+ * running in pure WASM (no native dependencies).
7
+ *
8
+ * Uses bundled ONNX WASM files from src/core/onnx/
9
+ *
10
+ * Features:
11
+ * - 384-dimensional semantic embeddings
12
+ * - Real semantic understanding (not hash-based)
13
+ * - Cached model loading (downloads from HuggingFace on first use)
14
+ * - Batch embedding support
15
+ * - Optional parallel workers for 3.8x batch speedup
16
+ */
17
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ var desc = Object.getOwnPropertyDescriptor(m, k);
20
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
21
+ desc = { enumerable: true, get: function() { return m[k]; } };
22
+ }
23
+ Object.defineProperty(o, k2, desc);
24
+ }) : (function(o, m, k, k2) {
25
+ if (k2 === undefined) k2 = k;
26
+ o[k2] = m[k];
27
+ }));
28
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
29
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
30
+ }) : function(o, v) {
31
+ o["default"] = v;
32
+ });
33
+ var __importStar = (this && this.__importStar) || (function () {
34
+ var ownKeys = function(o) {
35
+ ownKeys = Object.getOwnPropertyNames || function (o) {
36
+ var ar = [];
37
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
38
+ return ar;
39
+ };
40
+ return ownKeys(o);
41
+ };
42
+ return function (mod) {
43
+ if (mod && mod.__esModule) return mod;
44
+ var result = {};
45
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
46
+ __setModuleDefault(result, mod);
47
+ return result;
48
+ };
49
+ })();
50
+ Object.defineProperty(exports, "__esModule", { value: true });
51
+ exports.OnnxEmbedder = void 0;
52
+ exports.isOnnxAvailable = isOnnxAvailable;
53
+ exports.initOnnxEmbedder = initOnnxEmbedder;
54
+ exports.embed = embed;
55
+ exports.embedBatch = embedBatch;
56
+ exports.similarity = similarity;
57
+ exports.cosineSimilarity = cosineSimilarity;
58
+ exports.getDimension = getDimension;
59
+ exports.isReady = isReady;
60
+ exports.getStats = getStats;
61
+ exports.shutdown = shutdown;
62
+ const path = __importStar(require("path"));
63
+ const fs = __importStar(require("fs"));
64
+ const url_1 = require("url");
65
+ const module_1 = require("module");
66
+ // Set up ESM-compatible require for WASM module (fixes Windows/ESM compatibility)
67
+ // The WASM bindings use module.require for Node.js crypto, this provides a fallback
68
+ if (typeof globalThis !== 'undefined' && !globalThis.__ruvector_require) {
69
+ try {
70
+ // In ESM context, use createRequire with __filename
71
+ globalThis.__ruvector_require = (0, module_1.createRequire)(__filename);
72
+ }
73
+ catch {
74
+ // Fallback: require should be available in CommonJS
75
+ try {
76
+ globalThis.__ruvector_require = require;
77
+ }
78
+ catch {
79
+ // Neither available - WASM will fall back to crypto.getRandomValues
80
+ }
81
+ }
82
+ }
83
+ // Force native dynamic import (avoids TypeScript transpiling to require)
84
+ // eslint-disable-next-line @typescript-eslint/no-implied-eval
85
+ const dynamicImport = new Function('specifier', 'return import(specifier)');
86
+ // Capability detection
87
+ let simdAvailable = false;
88
+ let parallelAvailable = false;
89
+ // Lazy-loaded module state
90
+ let wasmModule = null;
91
+ let embedder = null;
92
+ let parallelEmbedder = null;
93
+ let loadError = null;
94
+ let loadPromise = null;
95
+ let isInitialized = false;
96
+ let parallelEnabled = false;
97
+ let parallelThreshold = 4;
98
+ // Default model
99
+ const DEFAULT_MODEL = 'all-MiniLM-L6-v2';
100
+ /**
101
+ * Check if ONNX embedder is available (bundled files exist)
102
+ */
103
+ function isOnnxAvailable() {
104
+ try {
105
+ const pkgPath = path.join(__dirname, 'onnx', 'pkg', 'ruvector_onnx_embeddings_wasm.js');
106
+ return fs.existsSync(pkgPath);
107
+ }
108
+ catch {
109
+ return false;
110
+ }
111
+ }
112
+ /**
113
+ * Check if parallel workers are available (npm package installed)
114
+ */
115
+ async function detectParallelAvailable() {
116
+ try {
117
+ await dynamicImport('ruvector-onnx-embeddings-wasm/parallel');
118
+ parallelAvailable = true;
119
+ return true;
120
+ }
121
+ catch {
122
+ parallelAvailable = false;
123
+ return false;
124
+ }
125
+ }
126
+ /**
127
+ * Check if SIMD is available (from WASM module)
128
+ */
129
+ function detectSimd() {
130
+ try {
131
+ if (wasmModule && typeof wasmModule.simd_available === 'function') {
132
+ simdAvailable = wasmModule.simd_available();
133
+ return simdAvailable;
134
+ }
135
+ }
136
+ catch { }
137
+ return false;
138
+ }
139
+ /**
140
+ * Try to load ParallelEmbedder from npm package (optional)
141
+ */
142
+ async function tryInitParallel(config) {
143
+ // Skip if explicitly disabled
144
+ if (config.enableParallel === false)
145
+ return false;
146
+ // For 'auto' or true, try to initialize
147
+ try {
148
+ const parallelModule = await dynamicImport('ruvector-onnx-embeddings-wasm/parallel');
149
+ const { ParallelEmbedder } = parallelModule;
150
+ parallelEmbedder = new ParallelEmbedder({
151
+ numWorkers: config.numWorkers,
152
+ });
153
+ await parallelEmbedder.init(config.modelId || DEFAULT_MODEL);
154
+ parallelThreshold = config.parallelThreshold || 4;
155
+ parallelEnabled = true;
156
+ parallelAvailable = true;
157
+ console.error(`Parallel embedder ready: ${parallelEmbedder.numWorkers} workers, SIMD: ${simdAvailable}`);
158
+ return true;
159
+ }
160
+ catch (e) {
161
+ parallelAvailable = false;
162
+ if (config.enableParallel === true) {
163
+ // Only warn if explicitly requested
164
+ console.error(`Parallel embedder not available: ${e.message}`);
165
+ }
166
+ return false;
167
+ }
168
+ }
169
+ /**
170
+ * Initialize the ONNX embedder (downloads model if needed)
171
+ */
172
+ async function initOnnxEmbedder(config = {}) {
173
+ if (isInitialized)
174
+ return true;
175
+ if (loadError)
176
+ throw loadError;
177
+ if (loadPromise) {
178
+ await loadPromise;
179
+ return isInitialized;
180
+ }
181
+ loadPromise = (async () => {
182
+ try {
183
+ // Paths to bundled ONNX files
184
+ const bgJsPath = path.join(__dirname, 'onnx', 'pkg', 'ruvector_onnx_embeddings_wasm_bg.js');
185
+ const wasmPath = path.join(__dirname, 'onnx', 'pkg', 'ruvector_onnx_embeddings_wasm_bg.wasm');
186
+ const loaderPath = path.join(__dirname, 'onnx', 'loader.js');
187
+ if (!fs.existsSync(bgJsPath) || !fs.existsSync(wasmPath)) {
188
+ throw new Error('ONNX WASM files not bundled. The onnx/ directory is missing.');
189
+ }
190
+ // Load the bg.js module directly (avoids the ESM `import * as wasm from "*.wasm"`
191
+ // in the main .js shim which requires --experimental-wasm-modules on Node 18-24).
192
+ const bgUrl = (0, url_1.pathToFileURL)(bgJsPath).href;
193
+ const loaderUrl = (0, url_1.pathToFileURL)(loaderPath).href;
194
+ wasmModule = await dynamicImport(bgUrl);
195
+ // Instantiate the .wasm bytes via WebAssembly API (no --experimental-wasm-modules needed).
196
+ const wasmBytes = fs.readFileSync(wasmPath);
197
+ const wasmResult = await WebAssembly.instantiate(wasmBytes, { './ruvector_onnx_embeddings_wasm_bg.js': wasmModule });
198
+ const wasmExports = wasmResult.instance.exports;
199
+ if (typeof wasmModule.__wbg_set_wasm === 'function') {
200
+ wasmModule.__wbg_set_wasm(wasmExports);
201
+ }
202
+ if (typeof wasmExports.__wbindgen_start === 'function') {
203
+ wasmExports.__wbindgen_start();
204
+ }
205
+ const loaderModule = await dynamicImport(loaderUrl);
206
+ const { ModelLoader } = loaderModule;
207
+ // Create model loader with caching
208
+ const modelLoader = new ModelLoader({
209
+ cache: true,
210
+ cacheDir: config.cacheDir || path.join(process.env.HOME || '/tmp', '.ruvector', 'models'),
211
+ });
212
+ // Load model (downloads from HuggingFace on first use)
213
+ const modelId = config.modelId || DEFAULT_MODEL;
214
+ console.error(`Loading ONNX model: ${modelId}...`);
215
+ const { modelBytes, tokenizerJson, config: modelConfig } = await modelLoader.loadModel(modelId);
216
+ // Create embedder with config
217
+ const embedderConfig = new wasmModule.WasmEmbedderConfig()
218
+ .setMaxLength(config.maxLength || modelConfig.maxLength || 256)
219
+ .setNormalize(config.normalize !== false)
220
+ .setPooling(0); // Mean pooling
221
+ embedder = wasmModule.WasmEmbedder.withConfig(modelBytes, tokenizerJson, embedderConfig);
222
+ // Detect SIMD capability
223
+ detectSimd();
224
+ console.error(`ONNX embedder ready: ${embedder.dimension()}d, SIMD: ${simdAvailable}`);
225
+ isInitialized = true;
226
+ // Determine if we should use parallel workers
227
+ // - true: always enable
228
+ // - false: never enable
229
+ // - 'auto'/undefined: enable for long-running processes (MCP, servers), skip for CLI
230
+ let shouldTryParallel = false;
231
+ if (config.enableParallel === true) {
232
+ shouldTryParallel = true;
233
+ }
234
+ else if (config.enableParallel === false) {
235
+ shouldTryParallel = false;
236
+ }
237
+ else {
238
+ // Auto-detect: check if running as CLI hook or long-running process
239
+ const isCLI = process.argv[1]?.includes('cli.js') ||
240
+ process.argv[1]?.includes('bin/ruvector') ||
241
+ process.env.RUVECTOR_CLI === '1';
242
+ const isMCP = process.env.MCP_SERVER === '1' ||
243
+ process.argv.some(a => a.includes('mcp'));
244
+ const forceParallel = process.env.RUVECTOR_PARALLEL === '1';
245
+ // Enable parallel for MCP/servers or if explicitly requested, skip for CLI
246
+ shouldTryParallel = forceParallel || (isMCP && !isCLI);
247
+ }
248
+ if (shouldTryParallel) {
249
+ await tryInitParallel(config);
250
+ }
251
+ }
252
+ catch (e) {
253
+ loadError = new Error(`Failed to initialize ONNX embedder: ${e.message}`);
254
+ throw loadError;
255
+ }
256
+ })();
257
+ await loadPromise;
258
+ return isInitialized;
259
+ }
260
+ /**
261
+ * Generate embedding for text
262
+ */
263
+ async function embed(text) {
264
+ if (!isInitialized) {
265
+ await initOnnxEmbedder();
266
+ }
267
+ if (!embedder) {
268
+ throw new Error('ONNX embedder not initialized');
269
+ }
270
+ const start = performance.now();
271
+ const embedding = embedder.embedOne(text);
272
+ const timeMs = performance.now() - start;
273
+ return {
274
+ embedding: Array.from(embedding),
275
+ dimension: embedding.length,
276
+ timeMs,
277
+ };
278
+ }
279
+ /**
280
+ * Generate embeddings for multiple texts
281
+ * Uses parallel workers automatically for batches >= parallelThreshold
282
+ */
283
+ async function embedBatch(texts) {
284
+ if (!isInitialized) {
285
+ await initOnnxEmbedder();
286
+ }
287
+ if (!embedder) {
288
+ throw new Error('ONNX embedder not initialized');
289
+ }
290
+ const start = performance.now();
291
+ // Use parallel workers for large batches
292
+ if (parallelEnabled && parallelEmbedder && texts.length >= parallelThreshold) {
293
+ const batchResults = await parallelEmbedder.embedBatch(texts);
294
+ const totalTime = performance.now() - start;
295
+ const dimension = parallelEmbedder.dimension || 384;
296
+ return batchResults.map((emb) => ({
297
+ embedding: Array.from(emb),
298
+ dimension,
299
+ timeMs: totalTime / texts.length,
300
+ }));
301
+ }
302
+ // Sequential fallback
303
+ const batchEmbeddings = embedder.embedBatch(texts);
304
+ const totalTime = performance.now() - start;
305
+ const dimension = embedder.dimension();
306
+ const results = [];
307
+ for (let i = 0; i < texts.length; i++) {
308
+ const embedding = batchEmbeddings.slice(i * dimension, (i + 1) * dimension);
309
+ results.push({
310
+ embedding: Array.from(embedding),
311
+ dimension,
312
+ timeMs: totalTime / texts.length,
313
+ });
314
+ }
315
+ return results;
316
+ }
317
+ /**
318
+ * Calculate cosine similarity between two texts
319
+ */
320
+ async function similarity(text1, text2) {
321
+ if (!isInitialized) {
322
+ await initOnnxEmbedder();
323
+ }
324
+ if (!embedder) {
325
+ throw new Error('ONNX embedder not initialized');
326
+ }
327
+ const start = performance.now();
328
+ const sim = embedder.similarity(text1, text2);
329
+ const timeMs = performance.now() - start;
330
+ return { similarity: sim, timeMs };
331
+ }
332
+ /**
333
+ * Calculate cosine similarity between two embeddings
334
+ */
335
+ function cosineSimilarity(a, b) {
336
+ if (a.length !== b.length) {
337
+ throw new Error('Embeddings must have same dimension');
338
+ }
339
+ let dotProduct = 0;
340
+ let normA = 0;
341
+ let normB = 0;
342
+ for (let i = 0; i < a.length; i++) {
343
+ dotProduct += a[i] * b[i];
344
+ normA += a[i] * a[i];
345
+ normB += b[i] * b[i];
346
+ }
347
+ const magnitude = Math.sqrt(normA) * Math.sqrt(normB);
348
+ return magnitude === 0 ? 0 : dotProduct / magnitude;
349
+ }
350
+ /**
351
+ * Get embedding dimension
352
+ */
353
+ function getDimension() {
354
+ return embedder ? embedder.dimension() : 384;
355
+ }
356
+ /**
357
+ * Check if embedder is ready
358
+ */
359
+ function isReady() {
360
+ return isInitialized;
361
+ }
362
+ /**
363
+ * Get embedder stats including SIMD and parallel capabilities
364
+ */
365
+ function getStats() {
366
+ return {
367
+ ready: isInitialized,
368
+ dimension: embedder ? embedder.dimension() : 384,
369
+ model: DEFAULT_MODEL,
370
+ simd: simdAvailable,
371
+ parallel: parallelEnabled,
372
+ parallelWorkers: parallelEmbedder?.numWorkers || 0,
373
+ parallelThreshold,
374
+ };
375
+ }
376
+ /**
377
+ * Shutdown parallel workers (call on exit)
378
+ */
379
+ async function shutdown() {
380
+ if (parallelEmbedder) {
381
+ await parallelEmbedder.shutdown();
382
+ parallelEmbedder = null;
383
+ parallelEnabled = false;
384
+ }
385
+ }
386
+ // Export class wrapper for compatibility
387
+ class OnnxEmbedder {
388
+ constructor(config = {}) {
389
+ this.config = config;
390
+ }
391
+ async init() {
392
+ return initOnnxEmbedder(this.config);
393
+ }
394
+ async embed(text) {
395
+ const result = await embed(text);
396
+ return result.embedding;
397
+ }
398
+ async embedBatch(texts) {
399
+ const results = await embedBatch(texts);
400
+ return results.map(r => r.embedding);
401
+ }
402
+ async similarity(text1, text2) {
403
+ const result = await similarity(text1, text2);
404
+ return result.similarity;
405
+ }
406
+ get dimension() {
407
+ return getDimension();
408
+ }
409
+ get ready() {
410
+ return isReady();
411
+ }
412
+ }
413
+ exports.OnnxEmbedder = OnnxEmbedder;
414
+ exports.default = OnnxEmbedder;
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Optimized ONNX Embedder for RuVector
3
+ *
4
+ * Performance optimizations:
5
+ * 1. TOKENIZER CACHING - Cache tokenization results (~10-20ms savings per repeat)
6
+ * 2. EMBEDDING LRU CACHE - Full embedding cache with configurable size
7
+ * 3. QUANTIZED MODELS - INT8/FP16 models for 2-4x speedup
8
+ * 4. LAZY INITIALIZATION - Defer model loading until first use
9
+ * 5. DYNAMIC BATCHING - Optimize batch sizes based on input
10
+ * 6. MEMORY OPTIMIZATION - Float32Array for all operations
11
+ *
12
+ * Usage:
13
+ * const embedder = new OptimizedOnnxEmbedder({ cacheSize: 1000 });
14
+ * await embedder.init();
15
+ * const embedding = await embedder.embed("Hello world");
16
+ */
17
+ export interface OptimizedOnnxConfig {
18
+ /** Model to use (default: 'all-MiniLM-L6-v2') */
19
+ modelId?: string;
20
+ /** Use quantized model if available (default: true) */
21
+ useQuantized?: boolean;
22
+ /** Quantization type: 'fp16' | 'int8' | 'dynamic' */
23
+ quantization?: 'fp16' | 'int8' | 'dynamic' | 'none';
24
+ /** Max input length (default: 256) */
25
+ maxLength?: number;
26
+ /** Embedding cache size (default: 512) */
27
+ cacheSize?: number;
28
+ /** Tokenizer cache size (default: 256) */
29
+ tokenizerCacheSize?: number;
30
+ /** Enable lazy initialization (default: true) */
31
+ lazyInit?: boolean;
32
+ /** Batch size for dynamic batching (default: 32) */
33
+ batchSize?: number;
34
+ /** Minimum texts to trigger batching (default: 4) */
35
+ batchThreshold?: number;
36
+ }
37
+ export declare class OptimizedOnnxEmbedder {
38
+ private config;
39
+ private wasmModule;
40
+ private embedder;
41
+ private initialized;
42
+ private initPromise;
43
+ private embeddingCache;
44
+ private tokenizerCache;
45
+ private totalEmbeds;
46
+ private totalTimeMs;
47
+ private dimension;
48
+ constructor(config?: OptimizedOnnxConfig);
49
+ /**
50
+ * Initialize the embedder (loads model)
51
+ */
52
+ init(): Promise<void>;
53
+ private doInit;
54
+ /**
55
+ * Embed a single text with caching
56
+ */
57
+ embed(text: string): Promise<Float32Array>;
58
+ /**
59
+ * Embed multiple texts with batching and caching
60
+ */
61
+ embedBatch(texts: string[]): Promise<Float32Array[]>;
62
+ /**
63
+ * Calculate similarity between two texts
64
+ */
65
+ similarity(text1: string, text2: string): Promise<number>;
66
+ /**
67
+ * Fast cosine similarity with loop unrolling
68
+ */
69
+ cosineSimilarity(a: Float32Array, b: Float32Array): number;
70
+ /**
71
+ * Get cache statistics
72
+ */
73
+ getCacheStats(): {
74
+ embedding: {
75
+ hits: number;
76
+ misses: number;
77
+ hitRate: number;
78
+ size: number;
79
+ };
80
+ tokenizer: {
81
+ hits: number;
82
+ misses: number;
83
+ hitRate: number;
84
+ size: number;
85
+ };
86
+ avgTimeMs: number;
87
+ totalEmbeds: number;
88
+ };
89
+ /**
90
+ * Clear all caches
91
+ */
92
+ clearCache(): void;
93
+ /**
94
+ * Get embedding dimension
95
+ */
96
+ getDimension(): number;
97
+ /**
98
+ * Check if initialized
99
+ */
100
+ isReady(): boolean;
101
+ /**
102
+ * Get configuration
103
+ */
104
+ getConfig(): Required<OptimizedOnnxConfig>;
105
+ }
106
+ export declare function getOptimizedOnnxEmbedder(config?: OptimizedOnnxConfig): OptimizedOnnxEmbedder;
107
+ export declare function initOptimizedOnnx(config?: OptimizedOnnxConfig): Promise<OptimizedOnnxEmbedder>;
108
+ export default OptimizedOnnxEmbedder;
109
+ //# sourceMappingURL=onnx-optimized.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onnx-optimized.d.ts","sourceRoot":"","sources":["../../src/core/onnx-optimized.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAcH,MAAM,WAAW,mBAAmB;IAClC,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,qDAAqD;IACrD,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;IACpD,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iDAAiD;IACjD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AA0HD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAA8B;IAGjD,OAAO,CAAC,cAAc,CAAiC;IACvD,OAAO,CAAC,cAAc,CAAwB;IAG9C,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,SAAS,CAAO;gBAEZ,MAAM,GAAE,mBAAwB;IAiB5C;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAWb,MAAM;IA8EpB;;OAEG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAiChD;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAmD1D;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK/D;;OAEG;IACH,gBAAgB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM;IAmB1D;;OAEG;IACH,aAAa,IAAI;QACf,SAAS,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;QAC3E,SAAS,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;QAC3E,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;KACrB;IASD;;OAEG;IACH,UAAU,IAAI,IAAI;IAKlB;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,OAAO,IAAI,OAAO;IAIlB;;OAEG;IACH,SAAS,IAAI,QAAQ,CAAC,mBAAmB,CAAC;CAG3C;AAQD,wBAAgB,wBAAwB,CAAC,MAAM,CAAC,EAAE,mBAAmB,GAAG,qBAAqB,CAK5F;AAED,wBAAsB,iBAAiB,CAAC,MAAM,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAIpG;AAED,eAAe,qBAAqB,CAAC"}