agentic-qe 1.9.3 → 1.9.4
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/CHANGELOG.md +54 -0
- package/README.md +30 -5
- package/config/.env.otel.example +25 -0
- package/config/OTEL-QUICK-REFERENCE.md +137 -0
- package/config/README-OTEL.md +222 -0
- package/config/alerting-rules.yml +518 -0
- package/config/docker-compose.otel.yml +187 -0
- package/config/grafana/dashboards/agentic-qe-overview.json +286 -0
- package/config/grafana/provisioning/dashboards/dashboards.yml +19 -0
- package/config/grafana/provisioning/datasources/datasources.yml +53 -0
- package/config/otel-collector-config.yaml.example +145 -0
- package/config/prometheus.yml.example +106 -0
- package/dist/alerting/AlertManager.d.ts +120 -0
- package/dist/alerting/AlertManager.d.ts.map +1 -0
- package/dist/alerting/AlertManager.js +345 -0
- package/dist/alerting/AlertManager.js.map +1 -0
- package/dist/alerting/FeedbackRouter.d.ts +98 -0
- package/dist/alerting/FeedbackRouter.d.ts.map +1 -0
- package/dist/alerting/FeedbackRouter.js +331 -0
- package/dist/alerting/FeedbackRouter.js.map +1 -0
- package/dist/alerting/StrategyApplicator.d.ts +120 -0
- package/dist/alerting/StrategyApplicator.d.ts.map +1 -0
- package/dist/alerting/StrategyApplicator.js +299 -0
- package/dist/alerting/StrategyApplicator.js.map +1 -0
- package/dist/alerting/index.d.ts +68 -0
- package/dist/alerting/index.d.ts.map +1 -0
- package/dist/alerting/index.js +112 -0
- package/dist/alerting/index.js.map +1 -0
- package/dist/alerting/types.d.ts +118 -0
- package/dist/alerting/types.d.ts.map +1 -0
- package/dist/alerting/types.js +11 -0
- package/dist/alerting/types.js.map +1 -0
- package/dist/cli/init/claude-config.d.ts.map +1 -1
- package/dist/cli/init/claude-config.js +12 -7
- package/dist/cli/init/claude-config.js.map +1 -1
- package/dist/core/memory/IPatternStore.d.ts +209 -0
- package/dist/core/memory/IPatternStore.d.ts.map +1 -0
- package/dist/core/memory/IPatternStore.js +15 -0
- package/dist/core/memory/IPatternStore.js.map +1 -0
- package/dist/core/memory/MigrationTools.d.ts +192 -0
- package/dist/core/memory/MigrationTools.d.ts.map +1 -0
- package/dist/core/memory/MigrationTools.js +615 -0
- package/dist/core/memory/MigrationTools.js.map +1 -0
- package/dist/core/memory/NeuralEnhancement.d.ts +154 -0
- package/dist/core/memory/NeuralEnhancement.d.ts.map +1 -0
- package/dist/core/memory/NeuralEnhancement.js +598 -0
- package/dist/core/memory/NeuralEnhancement.js.map +1 -0
- package/dist/core/memory/PatternStoreFactory.d.ts +143 -0
- package/dist/core/memory/PatternStoreFactory.d.ts.map +1 -0
- package/dist/core/memory/PatternStoreFactory.js +370 -0
- package/dist/core/memory/PatternStoreFactory.js.map +1 -0
- package/dist/core/memory/RealAgentDBAdapter.d.ts +1 -0
- package/dist/core/memory/RealAgentDBAdapter.d.ts.map +1 -1
- package/dist/core/memory/RealAgentDBAdapter.js +28 -20
- package/dist/core/memory/RealAgentDBAdapter.js.map +1 -1
- package/dist/core/memory/RuVectorPatternStore.d.ts +198 -0
- package/dist/core/memory/RuVectorPatternStore.d.ts.map +1 -0
- package/dist/core/memory/RuVectorPatternStore.js +605 -0
- package/dist/core/memory/RuVectorPatternStore.js.map +1 -0
- package/dist/core/memory/SelfHealingMonitor.d.ts +186 -0
- package/dist/core/memory/SelfHealingMonitor.d.ts.map +1 -0
- package/dist/core/memory/SelfHealingMonitor.js +451 -0
- package/dist/core/memory/SelfHealingMonitor.js.map +1 -0
- package/dist/core/memory/SwarmMemoryManager.d.ts +62 -0
- package/dist/core/memory/SwarmMemoryManager.d.ts.map +1 -1
- package/dist/core/memory/SwarmMemoryManager.js +97 -0
- package/dist/core/memory/SwarmMemoryManager.js.map +1 -1
- package/dist/core/memory/index.d.ts +11 -0
- package/dist/core/memory/index.d.ts.map +1 -1
- package/dist/core/memory/index.js +36 -1
- package/dist/core/memory/index.js.map +1 -1
- package/dist/reasoning/RuVectorReasoningAdapter.d.ts +232 -0
- package/dist/reasoning/RuVectorReasoningAdapter.d.ts.map +1 -0
- package/dist/reasoning/RuVectorReasoningAdapter.js +585 -0
- package/dist/reasoning/RuVectorReasoningAdapter.js.map +1 -0
- package/dist/reasoning/index.d.ts +2 -0
- package/dist/reasoning/index.d.ts.map +1 -1
- package/dist/reasoning/index.js +6 -1
- package/dist/reasoning/index.js.map +1 -1
- package/dist/reporting/ResultAggregator.d.ts +107 -0
- package/dist/reporting/ResultAggregator.d.ts.map +1 -0
- package/dist/reporting/ResultAggregator.js +435 -0
- package/dist/reporting/ResultAggregator.js.map +1 -0
- package/dist/reporting/index.d.ts +48 -0
- package/dist/reporting/index.d.ts.map +1 -0
- package/dist/reporting/index.js +154 -0
- package/dist/reporting/index.js.map +1 -0
- package/dist/reporting/reporters/ControlLoopReporter.d.ts +128 -0
- package/dist/reporting/reporters/ControlLoopReporter.d.ts.map +1 -0
- package/dist/reporting/reporters/ControlLoopReporter.js +417 -0
- package/dist/reporting/reporters/ControlLoopReporter.js.map +1 -0
- package/dist/reporting/reporters/HumanReadableReporter.d.ts +140 -0
- package/dist/reporting/reporters/HumanReadableReporter.d.ts.map +1 -0
- package/dist/reporting/reporters/HumanReadableReporter.js +524 -0
- package/dist/reporting/reporters/HumanReadableReporter.js.map +1 -0
- package/dist/reporting/reporters/JSONReporter.d.ts +193 -0
- package/dist/reporting/reporters/JSONReporter.d.ts.map +1 -0
- package/dist/reporting/reporters/JSONReporter.js +324 -0
- package/dist/reporting/reporters/JSONReporter.js.map +1 -0
- package/dist/reporting/reporters/index.d.ts +14 -0
- package/dist/reporting/reporters/index.d.ts.map +1 -0
- package/dist/reporting/reporters/index.js +19 -0
- package/dist/reporting/reporters/index.js.map +1 -0
- package/dist/reporting/types.d.ts +427 -0
- package/dist/reporting/types.d.ts.map +1 -0
- package/dist/reporting/types.js +12 -0
- package/dist/reporting/types.js.map +1 -0
- package/package.json +9 -1
|
@@ -0,0 +1,605 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* RuVector Pattern Store
|
|
4
|
+
*
|
|
5
|
+
* High-performance vector database wrapper for test pattern storage.
|
|
6
|
+
* Uses RuVector (@ruvector/core) for exceptional performance:
|
|
7
|
+
*
|
|
8
|
+
* Benchmark Results (ARM64 Linux, Nov 30, 2025):
|
|
9
|
+
* - Search p50: 1.5 µs (170x faster than baseline)
|
|
10
|
+
* - QPS: 192,840 queries/sec (53x higher)
|
|
11
|
+
* - Batch insert: 2,703,923 ops/sec (129x faster)
|
|
12
|
+
* - Memory: 18% less than baseline
|
|
13
|
+
*
|
|
14
|
+
* Features:
|
|
15
|
+
* - HNSW indexing with configurable M, efConstruction, efSearch
|
|
16
|
+
* - Automatic native/fallback detection
|
|
17
|
+
* - Cosine, Euclidean, and Dot product distance metrics
|
|
18
|
+
* - Float32Array optimization for native performance
|
|
19
|
+
* - Performance metrics tracking
|
|
20
|
+
*
|
|
21
|
+
* PLATFORM SUPPORT:
|
|
22
|
+
* - Linux x64 (native)
|
|
23
|
+
* - Linux ARM64 (native via ruvector-core-linux-arm64-gnu)
|
|
24
|
+
* - macOS Intel/Apple Silicon (native)
|
|
25
|
+
* - Windows x64 (native)
|
|
26
|
+
*
|
|
27
|
+
* @module core/memory/RuVectorPatternStore
|
|
28
|
+
* @version 2.0.0
|
|
29
|
+
*/
|
|
30
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
+
exports.RuVectorPatternStore = void 0;
|
|
32
|
+
exports.isRuVectorAvailable = isRuVectorAvailable;
|
|
33
|
+
exports.getRuVectorInfo = getRuVectorInfo;
|
|
34
|
+
exports.createQEPatternStore = createQEPatternStore;
|
|
35
|
+
exports.createHighPerformancePatternStore = createHighPerformancePatternStore;
|
|
36
|
+
/**
|
|
37
|
+
* Check if RuVector native module is available
|
|
38
|
+
*/
|
|
39
|
+
function isRuVectorAvailable() {
|
|
40
|
+
try {
|
|
41
|
+
require('@ruvector/core');
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get RuVector availability info
|
|
50
|
+
*/
|
|
51
|
+
function getRuVectorInfo() {
|
|
52
|
+
const platform = process.platform;
|
|
53
|
+
const arch = process.arch;
|
|
54
|
+
try {
|
|
55
|
+
const ruvector = require('@ruvector/core');
|
|
56
|
+
return {
|
|
57
|
+
available: true,
|
|
58
|
+
platform,
|
|
59
|
+
arch,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
return {
|
|
64
|
+
available: false,
|
|
65
|
+
reason: error.message,
|
|
66
|
+
platform,
|
|
67
|
+
arch,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* High-performance vector pattern store using RuVector
|
|
73
|
+
*
|
|
74
|
+
* Implements IPatternStore interface for unified pattern storage.
|
|
75
|
+
* Falls back to in-memory implementation when native module unavailable.
|
|
76
|
+
*
|
|
77
|
+
* @implements {IPatternStore}
|
|
78
|
+
*/
|
|
79
|
+
class RuVectorPatternStore {
|
|
80
|
+
constructor(config = {}) {
|
|
81
|
+
this.initialized = false;
|
|
82
|
+
this.useNative = false;
|
|
83
|
+
this.nativeDb = null;
|
|
84
|
+
// Fallback in-memory storage
|
|
85
|
+
this.patterns = new Map();
|
|
86
|
+
// Performance tracking
|
|
87
|
+
this.metrics = {
|
|
88
|
+
searchTimes: [],
|
|
89
|
+
insertTimes: [],
|
|
90
|
+
totalSearches: 0,
|
|
91
|
+
totalInserts: 0,
|
|
92
|
+
lastQPS: 0,
|
|
93
|
+
};
|
|
94
|
+
this.config = {
|
|
95
|
+
dimension: config.dimension ?? 384,
|
|
96
|
+
metric: config.metric ?? 'cosine',
|
|
97
|
+
storagePath: config.storagePath ?? './data/ruvector-patterns.db',
|
|
98
|
+
autoPersist: config.autoPersist ?? true,
|
|
99
|
+
hnsw: {
|
|
100
|
+
// Optimized defaults from ruv's benchmarks
|
|
101
|
+
m: config.hnsw?.m ?? 32, // Increased from 16 for better recall
|
|
102
|
+
efConstruction: config.hnsw?.efConstruction ?? 200,
|
|
103
|
+
efSearch: config.hnsw?.efSearch ?? 100,
|
|
104
|
+
},
|
|
105
|
+
preferredBackend: config.preferredBackend ?? 'auto',
|
|
106
|
+
enableMetrics: config.enableMetrics ?? true,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Initialize the vector database
|
|
111
|
+
*/
|
|
112
|
+
async initialize() {
|
|
113
|
+
if (this.initialized)
|
|
114
|
+
return;
|
|
115
|
+
// Try to load native RuVector from @ruvector/core
|
|
116
|
+
try {
|
|
117
|
+
const ruvector = require('@ruvector/core');
|
|
118
|
+
// Map our metric names to RuVector's DistanceMetric enum
|
|
119
|
+
const metricMap = {
|
|
120
|
+
cosine: 'Cosine',
|
|
121
|
+
euclidean: 'Euclidean',
|
|
122
|
+
dot: 'DotProduct',
|
|
123
|
+
};
|
|
124
|
+
// Note: VectorDb with lowercase 'd' (NAPI-RS naming convention)
|
|
125
|
+
this.nativeDb = new ruvector.VectorDb({
|
|
126
|
+
dimensions: this.config.dimension,
|
|
127
|
+
distanceMetric: metricMap[this.config.metric] || 'Cosine',
|
|
128
|
+
storagePath: this.config.storagePath,
|
|
129
|
+
hnswConfig: {
|
|
130
|
+
m: this.config.hnsw.m,
|
|
131
|
+
efConstruction: this.config.hnsw.efConstruction,
|
|
132
|
+
efSearch: this.config.hnsw.efSearch,
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
this.useNative = true;
|
|
136
|
+
console.log(`[RuVector] ✅ Using native @ruvector/core (${process.arch})`);
|
|
137
|
+
console.log(`[RuVector] HNSW: M=${this.config.hnsw.m}, efConstruction=${this.config.hnsw.efConstruction}, efSearch=${this.config.hnsw.efSearch}`);
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
// Fallback to in-memory implementation
|
|
141
|
+
this.useNative = false;
|
|
142
|
+
console.log(`[RuVector] ⚠️ Native unavailable (${process.arch}): ${error.message}`);
|
|
143
|
+
console.log(`[RuVector] Using in-memory fallback`);
|
|
144
|
+
}
|
|
145
|
+
this.initialized = true;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Get implementation info
|
|
149
|
+
*/
|
|
150
|
+
getImplementationInfo() {
|
|
151
|
+
if (this.useNative) {
|
|
152
|
+
try {
|
|
153
|
+
const ruvector = require('@ruvector/core');
|
|
154
|
+
const ver = ruvector.version ? ruvector.version() : '0.1.x';
|
|
155
|
+
return {
|
|
156
|
+
type: 'ruvector',
|
|
157
|
+
version: ver,
|
|
158
|
+
features: [
|
|
159
|
+
'hnsw-indexing',
|
|
160
|
+
'batch-insert',
|
|
161
|
+
'native-float32',
|
|
162
|
+
'cosine-similarity',
|
|
163
|
+
'euclidean-distance',
|
|
164
|
+
'dot-product',
|
|
165
|
+
],
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return {
|
|
170
|
+
type: 'ruvector',
|
|
171
|
+
version: 'unknown',
|
|
172
|
+
features: ['hnsw-indexing', 'batch-insert'],
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return {
|
|
177
|
+
type: 'fallback',
|
|
178
|
+
version: '2.0.0-fallback',
|
|
179
|
+
features: ['in-memory', 'cosine-similarity'],
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Store a test pattern
|
|
184
|
+
*/
|
|
185
|
+
async storePattern(pattern) {
|
|
186
|
+
this.ensureInitialized();
|
|
187
|
+
const startTime = performance.now();
|
|
188
|
+
const entry = {
|
|
189
|
+
id: pattern.id,
|
|
190
|
+
vector: pattern.embedding,
|
|
191
|
+
metadata: {
|
|
192
|
+
type: pattern.type,
|
|
193
|
+
domain: pattern.domain,
|
|
194
|
+
content: pattern.content,
|
|
195
|
+
framework: pattern.framework,
|
|
196
|
+
coverage: pattern.coverage,
|
|
197
|
+
flakinessScore: pattern.flakinessScore,
|
|
198
|
+
verdict: pattern.verdict,
|
|
199
|
+
createdAt: pattern.createdAt ?? Date.now(),
|
|
200
|
+
lastUsed: pattern.lastUsed ?? Date.now(),
|
|
201
|
+
usageCount: pattern.usageCount ?? 0,
|
|
202
|
+
...pattern.metadata,
|
|
203
|
+
},
|
|
204
|
+
};
|
|
205
|
+
if (this.useNative) {
|
|
206
|
+
// RuVector requires Float32Array for vectors
|
|
207
|
+
// Note: insert() returns a Promise in @ruvector/core
|
|
208
|
+
await this.nativeDb.insert({
|
|
209
|
+
id: entry.id,
|
|
210
|
+
vector: new Float32Array(entry.vector),
|
|
211
|
+
});
|
|
212
|
+
// Store metadata separately in our map for retrieval
|
|
213
|
+
this.patterns.set(entry.id, entry);
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
this.patterns.set(entry.id, entry);
|
|
217
|
+
}
|
|
218
|
+
// Track performance
|
|
219
|
+
if (this.config.enableMetrics) {
|
|
220
|
+
const duration = performance.now() - startTime;
|
|
221
|
+
this.metrics.insertTimes.push(duration);
|
|
222
|
+
this.metrics.totalInserts++;
|
|
223
|
+
if (this.metrics.insertTimes.length > 1000) {
|
|
224
|
+
this.metrics.insertTimes.shift();
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Store multiple patterns in batch (optimized for high throughput)
|
|
230
|
+
* Achieves 2.7M+ ops/sec on native backend
|
|
231
|
+
*/
|
|
232
|
+
async storeBatch(patterns) {
|
|
233
|
+
this.ensureInitialized();
|
|
234
|
+
const startTime = performance.now();
|
|
235
|
+
const entries = patterns.map((pattern) => ({
|
|
236
|
+
id: pattern.id,
|
|
237
|
+
vector: pattern.embedding,
|
|
238
|
+
metadata: {
|
|
239
|
+
type: pattern.type,
|
|
240
|
+
domain: pattern.domain,
|
|
241
|
+
content: pattern.content,
|
|
242
|
+
framework: pattern.framework,
|
|
243
|
+
coverage: pattern.coverage,
|
|
244
|
+
flakinessScore: pattern.flakinessScore,
|
|
245
|
+
verdict: pattern.verdict,
|
|
246
|
+
createdAt: pattern.createdAt ?? Date.now(),
|
|
247
|
+
lastUsed: pattern.lastUsed ?? Date.now(),
|
|
248
|
+
usageCount: pattern.usageCount ?? 0,
|
|
249
|
+
...pattern.metadata,
|
|
250
|
+
},
|
|
251
|
+
}));
|
|
252
|
+
if (this.useNative) {
|
|
253
|
+
// RuVector batch insert - highly optimized (2.7M ops/sec)
|
|
254
|
+
// Note: insertBatch() returns a Promise in @ruvector/core
|
|
255
|
+
const ruVectorEntries = entries.map((e) => ({
|
|
256
|
+
id: e.id,
|
|
257
|
+
vector: new Float32Array(e.vector),
|
|
258
|
+
}));
|
|
259
|
+
await this.nativeDb.insertBatch(ruVectorEntries);
|
|
260
|
+
// Store metadata separately
|
|
261
|
+
for (const entry of entries) {
|
|
262
|
+
this.patterns.set(entry.id, entry);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
for (const entry of entries) {
|
|
267
|
+
this.patterns.set(entry.id, entry);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
// Track performance
|
|
271
|
+
if (this.config.enableMetrics) {
|
|
272
|
+
const duration = performance.now() - startTime;
|
|
273
|
+
const perItem = duration / patterns.length;
|
|
274
|
+
for (let i = 0; i < Math.min(patterns.length, 100); i++) {
|
|
275
|
+
this.metrics.insertTimes.push(perItem);
|
|
276
|
+
}
|
|
277
|
+
this.metrics.totalInserts += patterns.length;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Search for similar patterns
|
|
282
|
+
* Achieves 192K+ QPS on native backend
|
|
283
|
+
*/
|
|
284
|
+
async searchSimilar(queryEmbedding, options = {}) {
|
|
285
|
+
this.ensureInitialized();
|
|
286
|
+
const startTime = performance.now();
|
|
287
|
+
const k = options.k ?? 10;
|
|
288
|
+
const threshold = options.threshold ?? 0;
|
|
289
|
+
let results;
|
|
290
|
+
if (this.useNative) {
|
|
291
|
+
// RuVector search API requires Float32Array and object format
|
|
292
|
+
// Note: search() returns a Promise in @ruvector/core
|
|
293
|
+
const rawSearchResults = await this.nativeDb.search({
|
|
294
|
+
vector: new Float32Array(queryEmbedding),
|
|
295
|
+
k,
|
|
296
|
+
});
|
|
297
|
+
// Ensure searchResults is an array (handles various return types)
|
|
298
|
+
const searchResults = Array.isArray(rawSearchResults)
|
|
299
|
+
? rawSearchResults
|
|
300
|
+
: rawSearchResults?.results ?? [];
|
|
301
|
+
// Map results back to patterns with metadata from our store
|
|
302
|
+
const patternResults = [];
|
|
303
|
+
for (const result of searchResults) {
|
|
304
|
+
const entry = this.patterns.get(result.id);
|
|
305
|
+
if (!entry)
|
|
306
|
+
continue;
|
|
307
|
+
// Apply filters
|
|
308
|
+
if (options.domain && entry.metadata?.domain !== options.domain)
|
|
309
|
+
continue;
|
|
310
|
+
if (options.type && entry.metadata?.type !== options.type)
|
|
311
|
+
continue;
|
|
312
|
+
if (options.framework && entry.metadata?.framework !== options.framework)
|
|
313
|
+
continue;
|
|
314
|
+
// Convert distance to similarity score (RuVector returns distance, lower is better)
|
|
315
|
+
// For cosine, score is 1 - distance
|
|
316
|
+
const score = 1 - result.score;
|
|
317
|
+
if (score >= threshold) {
|
|
318
|
+
patternResults.push({
|
|
319
|
+
pattern: this.entryToPattern(entry),
|
|
320
|
+
score,
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
results = patternResults;
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
// Fallback: brute-force cosine similarity
|
|
328
|
+
const rawResults = [];
|
|
329
|
+
for (const entry of Array.from(this.patterns.values())) {
|
|
330
|
+
// Apply filters
|
|
331
|
+
if (options.domain && entry.metadata?.domain !== options.domain)
|
|
332
|
+
continue;
|
|
333
|
+
if (options.type && entry.metadata?.type !== options.type)
|
|
334
|
+
continue;
|
|
335
|
+
if (options.framework && entry.metadata?.framework !== options.framework)
|
|
336
|
+
continue;
|
|
337
|
+
const score = this.cosineSimilarity(queryEmbedding, entry.vector);
|
|
338
|
+
if (score >= threshold) {
|
|
339
|
+
rawResults.push({ entry, score });
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
// Sort by score descending and take top k
|
|
343
|
+
rawResults.sort((a, b) => b.score - a.score);
|
|
344
|
+
const topK = rawResults.slice(0, k);
|
|
345
|
+
results = topK.map(({ entry, score }) => ({
|
|
346
|
+
pattern: this.entryToPattern(entry),
|
|
347
|
+
score,
|
|
348
|
+
}));
|
|
349
|
+
}
|
|
350
|
+
// Track performance
|
|
351
|
+
if (this.config.enableMetrics) {
|
|
352
|
+
const duration = performance.now() - startTime;
|
|
353
|
+
this.metrics.searchTimes.push(duration);
|
|
354
|
+
this.metrics.totalSearches++;
|
|
355
|
+
if (this.metrics.searchTimes.length > 1000) {
|
|
356
|
+
this.metrics.searchTimes.shift();
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
return results;
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Get a pattern by ID
|
|
363
|
+
*/
|
|
364
|
+
async getPattern(id) {
|
|
365
|
+
this.ensureInitialized();
|
|
366
|
+
// Metadata is stored locally for both native and fallback
|
|
367
|
+
const entry = this.patterns.get(id);
|
|
368
|
+
if (!entry)
|
|
369
|
+
return null;
|
|
370
|
+
return this.entryToPattern(entry);
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Delete a pattern by ID
|
|
374
|
+
*/
|
|
375
|
+
async deletePattern(id) {
|
|
376
|
+
this.ensureInitialized();
|
|
377
|
+
if (this.useNative) {
|
|
378
|
+
try {
|
|
379
|
+
this.nativeDb.delete(id);
|
|
380
|
+
}
|
|
381
|
+
catch {
|
|
382
|
+
// Ignore deletion errors from native
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
return this.patterns.delete(id);
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Record pattern usage
|
|
389
|
+
*/
|
|
390
|
+
async recordUsage(id) {
|
|
391
|
+
this.ensureInitialized();
|
|
392
|
+
const entry = this.patterns.get(id);
|
|
393
|
+
if (entry) {
|
|
394
|
+
entry.metadata = {
|
|
395
|
+
...entry.metadata,
|
|
396
|
+
lastUsed: Date.now(),
|
|
397
|
+
usageCount: (entry.metadata?.usageCount ?? 0) + 1,
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Build HNSW index
|
|
403
|
+
*/
|
|
404
|
+
async buildIndex() {
|
|
405
|
+
this.ensureInitialized();
|
|
406
|
+
if (this.useNative && this.nativeDb.buildIndex) {
|
|
407
|
+
this.nativeDb.buildIndex();
|
|
408
|
+
}
|
|
409
|
+
// Fallback doesn't use HNSW index
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Optimize database
|
|
413
|
+
*/
|
|
414
|
+
async optimize() {
|
|
415
|
+
this.ensureInitialized();
|
|
416
|
+
if (this.useNative && this.nativeDb.optimize) {
|
|
417
|
+
this.nativeDb.optimize();
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* Get database statistics
|
|
422
|
+
*/
|
|
423
|
+
async getStats() {
|
|
424
|
+
this.ensureInitialized();
|
|
425
|
+
const baseStats = {
|
|
426
|
+
count: this.patterns.size,
|
|
427
|
+
dimension: this.config.dimension,
|
|
428
|
+
metric: this.config.metric,
|
|
429
|
+
implementation: this.useNative ? 'ruvector' : 'fallback',
|
|
430
|
+
};
|
|
431
|
+
// Add performance metrics if available
|
|
432
|
+
if (this.config.enableMetrics && this.metrics.searchTimes.length > 0) {
|
|
433
|
+
const sorted = [...this.metrics.searchTimes].sort((a, b) => a - b);
|
|
434
|
+
const p50Index = Math.floor(sorted.length * 0.5);
|
|
435
|
+
const p99Index = Math.floor(sorted.length * 0.99);
|
|
436
|
+
baseStats.p50Latency = sorted[p50Index];
|
|
437
|
+
baseStats.p99Latency = sorted[p99Index];
|
|
438
|
+
// Calculate QPS from recent searches
|
|
439
|
+
if (sorted.length > 0) {
|
|
440
|
+
const avgTime = sorted.reduce((a, b) => a + b, 0) / sorted.length;
|
|
441
|
+
baseStats.qps = avgTime > 0 ? 1000 / avgTime : 0;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
if (this.useNative) {
|
|
445
|
+
try {
|
|
446
|
+
const nativeCount = this.nativeDb.len();
|
|
447
|
+
baseStats.count = nativeCount;
|
|
448
|
+
baseStats.indexType = 'HNSW';
|
|
449
|
+
}
|
|
450
|
+
catch {
|
|
451
|
+
// Use pattern map count as fallback
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
return baseStats;
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* Save database (no-op for @ruvector/core - it handles persistence internally)
|
|
458
|
+
*/
|
|
459
|
+
async save(_path) {
|
|
460
|
+
this.ensureInitialized();
|
|
461
|
+
// @ruvector/core handles persistence automatically via storagePath config
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Load database (no-op for @ruvector/core - it loads automatically on init)
|
|
465
|
+
*/
|
|
466
|
+
async load(_path) {
|
|
467
|
+
this.ensureInitialized();
|
|
468
|
+
// @ruvector/core handles loading automatically via storagePath config
|
|
469
|
+
}
|
|
470
|
+
/**
|
|
471
|
+
* Clear all patterns
|
|
472
|
+
*/
|
|
473
|
+
async clear() {
|
|
474
|
+
this.ensureInitialized();
|
|
475
|
+
// Clear local pattern store
|
|
476
|
+
this.patterns.clear();
|
|
477
|
+
// Reset metrics
|
|
478
|
+
this.metrics = {
|
|
479
|
+
searchTimes: [],
|
|
480
|
+
insertTimes: [],
|
|
481
|
+
totalSearches: 0,
|
|
482
|
+
totalInserts: 0,
|
|
483
|
+
lastQPS: 0,
|
|
484
|
+
};
|
|
485
|
+
// Note: @ruvector/core doesn't have a clear method, would need to recreate
|
|
486
|
+
}
|
|
487
|
+
/**
|
|
488
|
+
* Shutdown
|
|
489
|
+
*/
|
|
490
|
+
async shutdown() {
|
|
491
|
+
this.patterns.clear();
|
|
492
|
+
this.nativeDb = null;
|
|
493
|
+
this.initialized = false;
|
|
494
|
+
}
|
|
495
|
+
/**
|
|
496
|
+
* Get performance metrics
|
|
497
|
+
*/
|
|
498
|
+
getPerformanceMetrics() {
|
|
499
|
+
const searchTimes = this.metrics.searchTimes;
|
|
500
|
+
const insertTimes = this.metrics.insertTimes;
|
|
501
|
+
if (searchTimes.length === 0) {
|
|
502
|
+
return {
|
|
503
|
+
avgSearchTime: 0,
|
|
504
|
+
p50SearchTime: 0,
|
|
505
|
+
p99SearchTime: 0,
|
|
506
|
+
avgInsertTime: 0,
|
|
507
|
+
totalSearches: 0,
|
|
508
|
+
totalInserts: 0,
|
|
509
|
+
estimatedQPS: 0,
|
|
510
|
+
};
|
|
511
|
+
}
|
|
512
|
+
const sortedSearch = [...searchTimes].sort((a, b) => a - b);
|
|
513
|
+
const sortedInsert = [...insertTimes].sort((a, b) => a - b);
|
|
514
|
+
const avgSearch = searchTimes.reduce((a, b) => a + b, 0) / searchTimes.length;
|
|
515
|
+
const p50Index = Math.floor(sortedSearch.length * 0.5);
|
|
516
|
+
const p99Index = Math.floor(sortedSearch.length * 0.99);
|
|
517
|
+
return {
|
|
518
|
+
avgSearchTime: avgSearch,
|
|
519
|
+
p50SearchTime: sortedSearch[p50Index] || 0,
|
|
520
|
+
p99SearchTime: sortedSearch[p99Index] || 0,
|
|
521
|
+
avgInsertTime: insertTimes.length > 0
|
|
522
|
+
? insertTimes.reduce((a, b) => a + b, 0) / insertTimes.length
|
|
523
|
+
: 0,
|
|
524
|
+
totalSearches: this.metrics.totalSearches,
|
|
525
|
+
totalInserts: this.metrics.totalInserts,
|
|
526
|
+
estimatedQPS: avgSearch > 0 ? 1000 / avgSearch : 0,
|
|
527
|
+
};
|
|
528
|
+
}
|
|
529
|
+
ensureInitialized() {
|
|
530
|
+
if (!this.initialized) {
|
|
531
|
+
throw new Error('RuVectorPatternStore not initialized. Call initialize() first.');
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
cosineSimilarity(a, b) {
|
|
535
|
+
if (a.length !== b.length)
|
|
536
|
+
return 0;
|
|
537
|
+
let dotProduct = 0;
|
|
538
|
+
let normA = 0;
|
|
539
|
+
let normB = 0;
|
|
540
|
+
for (let i = 0; i < a.length; i++) {
|
|
541
|
+
dotProduct += a[i] * b[i];
|
|
542
|
+
normA += a[i] * a[i];
|
|
543
|
+
normB += b[i] * b[i];
|
|
544
|
+
}
|
|
545
|
+
const magnitude = Math.sqrt(normA) * Math.sqrt(normB);
|
|
546
|
+
return magnitude > 0 ? dotProduct / magnitude : 0;
|
|
547
|
+
}
|
|
548
|
+
entryToPattern(entry) {
|
|
549
|
+
return {
|
|
550
|
+
id: entry.id,
|
|
551
|
+
embedding: entry.vector,
|
|
552
|
+
type: entry.metadata?.type ?? 'unknown',
|
|
553
|
+
domain: entry.metadata?.domain ?? 'unknown',
|
|
554
|
+
content: entry.metadata?.content ?? '',
|
|
555
|
+
framework: entry.metadata?.framework,
|
|
556
|
+
coverage: entry.metadata?.coverage,
|
|
557
|
+
flakinessScore: entry.metadata?.flakinessScore,
|
|
558
|
+
verdict: entry.metadata?.verdict,
|
|
559
|
+
createdAt: entry.metadata?.createdAt,
|
|
560
|
+
lastUsed: entry.metadata?.lastUsed,
|
|
561
|
+
usageCount: entry.metadata?.usageCount,
|
|
562
|
+
metadata: entry.metadata,
|
|
563
|
+
};
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
exports.RuVectorPatternStore = RuVectorPatternStore;
|
|
567
|
+
/**
|
|
568
|
+
* Create a pre-configured RuVector store for QE patterns
|
|
569
|
+
* Uses optimized HNSW parameters from benchmark testing
|
|
570
|
+
*/
|
|
571
|
+
function createQEPatternStore(storagePath) {
|
|
572
|
+
return new RuVectorPatternStore({
|
|
573
|
+
dimension: 384,
|
|
574
|
+
metric: 'cosine',
|
|
575
|
+
storagePath: storagePath ?? './data/qe-patterns.ruvector',
|
|
576
|
+
autoPersist: true,
|
|
577
|
+
enableMetrics: true,
|
|
578
|
+
hnsw: {
|
|
579
|
+
// Optimized from ruv's AgentDB v2 benchmarks
|
|
580
|
+
m: 32, // Higher M for better recall
|
|
581
|
+
efConstruction: 200,
|
|
582
|
+
efSearch: 100,
|
|
583
|
+
},
|
|
584
|
+
});
|
|
585
|
+
}
|
|
586
|
+
/**
|
|
587
|
+
* Create a high-performance RuVector store optimized for throughput
|
|
588
|
+
* Best for batch operations and high-QPS workloads
|
|
589
|
+
*/
|
|
590
|
+
function createHighPerformancePatternStore(storagePath) {
|
|
591
|
+
return new RuVectorPatternStore({
|
|
592
|
+
dimension: 384,
|
|
593
|
+
metric: 'cosine',
|
|
594
|
+
storagePath: storagePath ?? './data/hp-patterns.ruvector',
|
|
595
|
+
autoPersist: true,
|
|
596
|
+
enableMetrics: true,
|
|
597
|
+
hnsw: {
|
|
598
|
+
// Tuned for maximum throughput
|
|
599
|
+
m: 48, // Even higher for large datasets
|
|
600
|
+
efConstruction: 300,
|
|
601
|
+
efSearch: 150,
|
|
602
|
+
},
|
|
603
|
+
});
|
|
604
|
+
}
|
|
605
|
+
//# sourceMappingURL=RuVectorPatternStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RuVectorPatternStore.js","sourceRoot":"","sources":["../../../src/core/memory/RuVectorPatternStore.ts"],"names":[],"mappings":"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"}
|