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,615 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MigrationTools - AgentDB to RuVector Migration Utilities
|
|
4
|
+
*
|
|
5
|
+
* Provides comprehensive migration capabilities for transitioning test patterns
|
|
6
|
+
* from AgentDB/SQLite storage to high-performance RuVector backend.
|
|
7
|
+
*
|
|
8
|
+
* Key Features:
|
|
9
|
+
* - Export patterns from AgentDB SQLite database
|
|
10
|
+
* - Transform legacy pattern format to RuVector TestPattern interface
|
|
11
|
+
* - Batch import with progress tracking and error handling
|
|
12
|
+
* - Dry-run mode for safe migration validation
|
|
13
|
+
* - Rollback support with backup creation
|
|
14
|
+
* - Dual-write proxy for zero-downtime migration
|
|
15
|
+
* - Comprehensive validation and integrity checks
|
|
16
|
+
*
|
|
17
|
+
* Migration Performance:
|
|
18
|
+
* - Batch processing: 1000 patterns per batch (configurable)
|
|
19
|
+
* - RuVector import: 2.7M+ ops/sec (native backend)
|
|
20
|
+
* - Parallel export/import for maximum throughput
|
|
21
|
+
*
|
|
22
|
+
* @module core/memory/MigrationTools
|
|
23
|
+
* @version 1.0.0
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* // Simple migration
|
|
28
|
+
* const migrator = new PatternMigrator();
|
|
29
|
+
* const result = await migrator.migrate({
|
|
30
|
+
* sourcePath: './data/agentic-qe.db',
|
|
31
|
+
* targetPath: './data/patterns.ruvector',
|
|
32
|
+
* batchSize: 1000,
|
|
33
|
+
* verbose: true
|
|
34
|
+
* });
|
|
35
|
+
*
|
|
36
|
+
* // Dry-run validation
|
|
37
|
+
* const dryRun = await migrator.migrate({
|
|
38
|
+
* sourcePath: './data/agentic-qe.db',
|
|
39
|
+
* dryRun: true
|
|
40
|
+
* });
|
|
41
|
+
*
|
|
42
|
+
* // Dual-write for safe transition
|
|
43
|
+
* const proxy = new DualWriteProxy(agentDbStore, ruVectorStore);
|
|
44
|
+
* await proxy.initialize();
|
|
45
|
+
* await proxy.storePattern(pattern); // Writes to both
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
49
|
+
if (k2 === undefined) k2 = k;
|
|
50
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
51
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
52
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
53
|
+
}
|
|
54
|
+
Object.defineProperty(o, k2, desc);
|
|
55
|
+
}) : (function(o, m, k, k2) {
|
|
56
|
+
if (k2 === undefined) k2 = k;
|
|
57
|
+
o[k2] = m[k];
|
|
58
|
+
}));
|
|
59
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
60
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
61
|
+
}) : function(o, v) {
|
|
62
|
+
o["default"] = v;
|
|
63
|
+
});
|
|
64
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
65
|
+
var ownKeys = function(o) {
|
|
66
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
67
|
+
var ar = [];
|
|
68
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
69
|
+
return ar;
|
|
70
|
+
};
|
|
71
|
+
return ownKeys(o);
|
|
72
|
+
};
|
|
73
|
+
return function (mod) {
|
|
74
|
+
if (mod && mod.__esModule) return mod;
|
|
75
|
+
var result = {};
|
|
76
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
77
|
+
__setModuleDefault(result, mod);
|
|
78
|
+
return result;
|
|
79
|
+
};
|
|
80
|
+
})();
|
|
81
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
82
|
+
exports.DualWriteProxy = exports.PatternMigrator = void 0;
|
|
83
|
+
exports.createDualWriteProxy = createDualWriteProxy;
|
|
84
|
+
exports.checkMigrationStatus = checkMigrationStatus;
|
|
85
|
+
const fs = __importStar(require("fs/promises"));
|
|
86
|
+
const RuVectorPatternStore_1 = require("./RuVectorPatternStore");
|
|
87
|
+
const PatternStoreFactory_1 = require("./PatternStoreFactory");
|
|
88
|
+
/**
|
|
89
|
+
* PatternMigrator - Main migration orchestrator
|
|
90
|
+
*
|
|
91
|
+
* Handles the complete migration workflow from AgentDB to RuVector
|
|
92
|
+
* with comprehensive error handling and validation.
|
|
93
|
+
*/
|
|
94
|
+
class PatternMigrator {
|
|
95
|
+
constructor() {
|
|
96
|
+
this.backupPaths = [];
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Execute pattern migration with full orchestration
|
|
100
|
+
*/
|
|
101
|
+
async migrate(options) {
|
|
102
|
+
const startTime = Date.now();
|
|
103
|
+
const verbose = options.verbose ?? false;
|
|
104
|
+
const dryRun = options.dryRun ?? false;
|
|
105
|
+
const batchSize = options.batchSize ?? 1000;
|
|
106
|
+
const createBackup = options.createBackup ?? true;
|
|
107
|
+
const dimension = options.dimension ?? 384;
|
|
108
|
+
const sourcePath = options.sourcePath ?? './data/agentic-qe.db';
|
|
109
|
+
const targetPath = options.targetPath ?? './data/patterns.ruvector';
|
|
110
|
+
const result = {
|
|
111
|
+
totalPatterns: 0,
|
|
112
|
+
migratedCount: 0,
|
|
113
|
+
skippedCount: 0,
|
|
114
|
+
errors: [],
|
|
115
|
+
duration: 0,
|
|
116
|
+
};
|
|
117
|
+
try {
|
|
118
|
+
if (verbose) {
|
|
119
|
+
console.log('[MigrationTools] Starting migration...');
|
|
120
|
+
console.log(`[MigrationTools] Source: ${sourcePath}`);
|
|
121
|
+
console.log(`[MigrationTools] Target: ${targetPath}`);
|
|
122
|
+
console.log(`[MigrationTools] Mode: ${dryRun ? 'DRY-RUN' : 'PRODUCTION'}`);
|
|
123
|
+
}
|
|
124
|
+
// Step 1: Validate source database
|
|
125
|
+
if (verbose)
|
|
126
|
+
console.log('[MigrationTools] Step 1/5: Validating source...');
|
|
127
|
+
const sourceValid = await this.validateSource(sourcePath);
|
|
128
|
+
if (!sourceValid) {
|
|
129
|
+
throw new Error(`Source database validation failed: ${sourcePath}`);
|
|
130
|
+
}
|
|
131
|
+
// Step 2: Create backup (if enabled and not dry-run)
|
|
132
|
+
if (createBackup && !dryRun) {
|
|
133
|
+
if (verbose)
|
|
134
|
+
console.log('[MigrationTools] Step 2/5: Creating backup...');
|
|
135
|
+
result.backupPath = await this.createBackup(sourcePath);
|
|
136
|
+
if (verbose)
|
|
137
|
+
console.log(`[MigrationTools] Backup created: ${result.backupPath}`);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
if (verbose)
|
|
141
|
+
console.log('[MigrationTools] Step 2/5: Skipping backup (dry-run or disabled)');
|
|
142
|
+
}
|
|
143
|
+
// Step 3: Export patterns from AgentDB
|
|
144
|
+
if (verbose)
|
|
145
|
+
console.log('[MigrationTools] Step 3/5: Exporting from AgentDB...');
|
|
146
|
+
const patterns = await this.exportFromAgentDB(sourcePath, options.generateEmbedding, dimension);
|
|
147
|
+
result.totalPatterns = patterns.length;
|
|
148
|
+
if (verbose)
|
|
149
|
+
console.log(`[MigrationTools] Exported ${patterns.length} patterns`);
|
|
150
|
+
// Step 4: Import to RuVector (skip in dry-run)
|
|
151
|
+
if (!dryRun) {
|
|
152
|
+
if (verbose)
|
|
153
|
+
console.log('[MigrationTools] Step 4/5: Importing to RuVector...');
|
|
154
|
+
const importResult = await this.importToRuVector(patterns, targetPath, batchSize, dimension, verbose);
|
|
155
|
+
result.migratedCount = importResult.imported;
|
|
156
|
+
result.skippedCount = importResult.skipped;
|
|
157
|
+
result.errors.push(...importResult.errors);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
if (verbose)
|
|
161
|
+
console.log('[MigrationTools] Step 4/5: Skipping import (dry-run)');
|
|
162
|
+
result.migratedCount = 0;
|
|
163
|
+
result.skippedCount = 0;
|
|
164
|
+
}
|
|
165
|
+
// Step 5: Validation
|
|
166
|
+
if (verbose)
|
|
167
|
+
console.log('[MigrationTools] Step 5/5: Running validation...');
|
|
168
|
+
const validation = await this.validateMigration(sourcePath, targetPath, dryRun);
|
|
169
|
+
result.validation = validation;
|
|
170
|
+
result.duration = Date.now() - startTime;
|
|
171
|
+
if (verbose) {
|
|
172
|
+
console.log('[MigrationTools] ✅ Migration completed successfully');
|
|
173
|
+
console.log(`[MigrationTools] Duration: ${result.duration}ms`);
|
|
174
|
+
console.log(`[MigrationTools] Total: ${result.totalPatterns}`);
|
|
175
|
+
console.log(`[MigrationTools] Migrated: ${result.migratedCount}`);
|
|
176
|
+
console.log(`[MigrationTools] Skipped: ${result.skippedCount}`);
|
|
177
|
+
console.log(`[MigrationTools] Errors: ${result.errors.length}`);
|
|
178
|
+
}
|
|
179
|
+
return result;
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
result.errors.push(error.message);
|
|
183
|
+
result.duration = Date.now() - startTime;
|
|
184
|
+
if (verbose) {
|
|
185
|
+
console.error('[MigrationTools] ❌ Migration failed:', error.message);
|
|
186
|
+
}
|
|
187
|
+
throw new Error(`Migration failed: ${error.message}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Validate source database exists and is readable
|
|
192
|
+
*/
|
|
193
|
+
async validateSource(sourcePath) {
|
|
194
|
+
try {
|
|
195
|
+
// Check if file exists
|
|
196
|
+
await fs.access(sourcePath, fs.constants.R_OK);
|
|
197
|
+
// Check if it's a SQLite database (basic check for SQLite header)
|
|
198
|
+
const buffer = Buffer.alloc(16);
|
|
199
|
+
const fd = await fs.open(sourcePath, 'r');
|
|
200
|
+
await fd.read(buffer, 0, 16, 0);
|
|
201
|
+
await fd.close();
|
|
202
|
+
const header = buffer.toString('ascii', 0, 15);
|
|
203
|
+
if (!header.startsWith('SQLite format 3')) {
|
|
204
|
+
console.warn('[MigrationTools] Warning: Source file may not be a SQLite database');
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
return true;
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
console.error('[MigrationTools] Source validation failed:', error.message);
|
|
211
|
+
return false;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Create backup of source database
|
|
216
|
+
*/
|
|
217
|
+
async createBackup(sourcePath) {
|
|
218
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
219
|
+
const backupPath = sourcePath.replace(/\.db$/, `.backup-${timestamp}.db`);
|
|
220
|
+
try {
|
|
221
|
+
await fs.copyFile(sourcePath, backupPath);
|
|
222
|
+
this.backupPaths.push(backupPath);
|
|
223
|
+
return backupPath;
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
throw new Error(`Backup creation failed: ${error.message}`);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Export patterns from AgentDB SQLite database
|
|
231
|
+
*/
|
|
232
|
+
async exportFromAgentDB(sourcePath, generateEmbedding, dimension = 384) {
|
|
233
|
+
try {
|
|
234
|
+
// Use better-sqlite3 for synchronous SQLite access
|
|
235
|
+
const Database = require('better-sqlite3');
|
|
236
|
+
const db = new Database(sourcePath, { readonly: true });
|
|
237
|
+
// Query all patterns from database
|
|
238
|
+
const rows = db.prepare('SELECT * FROM patterns').all();
|
|
239
|
+
const patterns = [];
|
|
240
|
+
for (const row of rows) {
|
|
241
|
+
try {
|
|
242
|
+
const pattern = await this.transformLegacyPattern(row, generateEmbedding, dimension);
|
|
243
|
+
patterns.push(pattern);
|
|
244
|
+
}
|
|
245
|
+
catch (error) {
|
|
246
|
+
console.warn(`[MigrationTools] Failed to transform pattern ${row.id}: ${error.message}`);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
db.close();
|
|
250
|
+
return patterns;
|
|
251
|
+
}
|
|
252
|
+
catch (error) {
|
|
253
|
+
throw new Error(`AgentDB export failed: ${error.message}`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Transform legacy AgentDB pattern to RuVector TestPattern format
|
|
258
|
+
*/
|
|
259
|
+
async transformLegacyPattern(legacy, generateEmbedding, dimension = 384) {
|
|
260
|
+
// Generate or use placeholder embedding
|
|
261
|
+
let embedding;
|
|
262
|
+
if (generateEmbedding) {
|
|
263
|
+
embedding = await generateEmbedding(legacy);
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
// Use normalized random embedding as placeholder
|
|
267
|
+
embedding = Array.from({ length: dimension }, () => Math.random() - 0.5);
|
|
268
|
+
const norm = Math.sqrt(embedding.reduce((sum, val) => sum + val * val, 0));
|
|
269
|
+
embedding = embedding.map(val => val / norm);
|
|
270
|
+
}
|
|
271
|
+
// Parse JSON fields
|
|
272
|
+
let examples = [];
|
|
273
|
+
try {
|
|
274
|
+
examples = JSON.parse(legacy.examples);
|
|
275
|
+
}
|
|
276
|
+
catch {
|
|
277
|
+
examples = [];
|
|
278
|
+
}
|
|
279
|
+
let metadata = {};
|
|
280
|
+
try {
|
|
281
|
+
metadata = JSON.parse(legacy.metadata);
|
|
282
|
+
}
|
|
283
|
+
catch {
|
|
284
|
+
metadata = {};
|
|
285
|
+
}
|
|
286
|
+
// Build content from pattern information
|
|
287
|
+
const content = `
|
|
288
|
+
Pattern: ${legacy.name}
|
|
289
|
+
Description: ${legacy.description || 'N/A'}
|
|
290
|
+
Template: ${legacy.template}
|
|
291
|
+
Examples: ${examples.join(', ')}
|
|
292
|
+
`.trim();
|
|
293
|
+
// Map to TestPattern interface
|
|
294
|
+
const pattern = {
|
|
295
|
+
id: legacy.id,
|
|
296
|
+
type: legacy.category,
|
|
297
|
+
domain: legacy.framework || 'unknown',
|
|
298
|
+
embedding,
|
|
299
|
+
content,
|
|
300
|
+
framework: legacy.framework,
|
|
301
|
+
coverage: legacy.quality,
|
|
302
|
+
flakinessScore: legacy.success_rate < 0.8 ? 1 - legacy.success_rate : 0,
|
|
303
|
+
verdict: legacy.success_rate >= 0.9 ? 'success' : legacy.success_rate >= 0.7 ? 'flaky' : 'failure',
|
|
304
|
+
createdAt: legacy.created_at ? new Date(legacy.created_at).getTime() : Date.now(),
|
|
305
|
+
lastUsed: legacy.updated_at ? new Date(legacy.updated_at).getTime() : Date.now(),
|
|
306
|
+
usageCount: legacy.usage_count,
|
|
307
|
+
metadata: {
|
|
308
|
+
...metadata,
|
|
309
|
+
// Preserve original fields
|
|
310
|
+
originalName: legacy.name,
|
|
311
|
+
originalCategory: legacy.category,
|
|
312
|
+
language: legacy.language,
|
|
313
|
+
template: legacy.template,
|
|
314
|
+
examples,
|
|
315
|
+
confidence: legacy.confidence,
|
|
316
|
+
description: legacy.description,
|
|
317
|
+
},
|
|
318
|
+
};
|
|
319
|
+
return pattern;
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Import patterns to RuVector in batches
|
|
323
|
+
*/
|
|
324
|
+
async importToRuVector(patterns, targetPath, batchSize, dimension, verbose) {
|
|
325
|
+
const result = {
|
|
326
|
+
imported: 0,
|
|
327
|
+
skipped: 0,
|
|
328
|
+
errors: [],
|
|
329
|
+
};
|
|
330
|
+
try {
|
|
331
|
+
// Create RuVector store
|
|
332
|
+
const store = new RuVectorPatternStore_1.RuVectorPatternStore({
|
|
333
|
+
dimension,
|
|
334
|
+
metric: 'cosine',
|
|
335
|
+
storagePath: targetPath,
|
|
336
|
+
autoPersist: true,
|
|
337
|
+
enableMetrics: true,
|
|
338
|
+
});
|
|
339
|
+
await store.initialize();
|
|
340
|
+
// Process in batches for optimal performance
|
|
341
|
+
const batches = Math.ceil(patterns.length / batchSize);
|
|
342
|
+
for (let i = 0; i < batches; i++) {
|
|
343
|
+
const start = i * batchSize;
|
|
344
|
+
const end = Math.min(start + batchSize, patterns.length);
|
|
345
|
+
const batch = patterns.slice(start, end);
|
|
346
|
+
try {
|
|
347
|
+
await store.storeBatch(batch);
|
|
348
|
+
result.imported += batch.length;
|
|
349
|
+
if (verbose) {
|
|
350
|
+
const progress = ((end / patterns.length) * 100).toFixed(1);
|
|
351
|
+
console.log(`[MigrationTools] Progress: ${progress}% (${end}/${patterns.length})`);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
catch (error) {
|
|
355
|
+
result.skipped += batch.length;
|
|
356
|
+
result.errors.push(`Batch ${i + 1} failed: ${error.message}`);
|
|
357
|
+
if (verbose) {
|
|
358
|
+
console.warn(`[MigrationTools] Batch ${i + 1} failed: ${error.message}`);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
// Build index for optimal search performance
|
|
363
|
+
await store.buildIndex();
|
|
364
|
+
// Get final stats
|
|
365
|
+
const stats = await store.getStats();
|
|
366
|
+
if (verbose) {
|
|
367
|
+
console.log('[MigrationTools] Final stats:', stats);
|
|
368
|
+
}
|
|
369
|
+
await store.shutdown();
|
|
370
|
+
}
|
|
371
|
+
catch (error) {
|
|
372
|
+
result.errors.push(`Import failed: ${error.message}`);
|
|
373
|
+
throw new Error(`RuVector import failed: ${error.message}`);
|
|
374
|
+
}
|
|
375
|
+
return result;
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Validate migration integrity
|
|
379
|
+
*/
|
|
380
|
+
async validateMigration(sourcePath, targetPath, dryRun) {
|
|
381
|
+
const checks = [];
|
|
382
|
+
// Validate source
|
|
383
|
+
const sourceValid = await this.validateSource(sourcePath);
|
|
384
|
+
checks.push(`Source validation: ${sourceValid ? 'PASS' : 'FAIL'}`);
|
|
385
|
+
// Validate target (skip in dry-run)
|
|
386
|
+
let targetValid = true;
|
|
387
|
+
if (!dryRun) {
|
|
388
|
+
try {
|
|
389
|
+
await fs.access(targetPath, fs.constants.R_OK);
|
|
390
|
+
targetValid = true;
|
|
391
|
+
checks.push('Target validation: PASS');
|
|
392
|
+
}
|
|
393
|
+
catch {
|
|
394
|
+
targetValid = false;
|
|
395
|
+
checks.push('Target validation: FAIL');
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
else {
|
|
399
|
+
checks.push('Target validation: SKIPPED (dry-run)');
|
|
400
|
+
}
|
|
401
|
+
return {
|
|
402
|
+
sourceValid,
|
|
403
|
+
targetValid,
|
|
404
|
+
integrityChecks: checks,
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Rollback migration by restoring from backup
|
|
409
|
+
*/
|
|
410
|
+
async rollback() {
|
|
411
|
+
if (this.backupPaths.length === 0) {
|
|
412
|
+
throw new Error('No backup available for rollback');
|
|
413
|
+
}
|
|
414
|
+
const latestBackup = this.backupPaths[this.backupPaths.length - 1];
|
|
415
|
+
const originalPath = latestBackup.replace(/\.backup-.*\.db$/, '.db');
|
|
416
|
+
try {
|
|
417
|
+
await fs.copyFile(latestBackup, originalPath);
|
|
418
|
+
console.log(`[MigrationTools] ✅ Rollback completed: ${originalPath} restored from ${latestBackup}`);
|
|
419
|
+
}
|
|
420
|
+
catch (error) {
|
|
421
|
+
throw new Error(`Rollback failed: ${error.message}`);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
exports.PatternMigrator = PatternMigrator;
|
|
426
|
+
/**
|
|
427
|
+
* DualWriteProxy - Write to both AgentDB and RuVector during transition
|
|
428
|
+
*
|
|
429
|
+
* Enables zero-downtime migration by:
|
|
430
|
+
* - Writing to both old and new backends
|
|
431
|
+
* - Reading from new backend (RuVector) for performance
|
|
432
|
+
* - Falling back to old backend on RuVector errors
|
|
433
|
+
*
|
|
434
|
+
* Use this during the transition period to ensure data consistency
|
|
435
|
+
* and enable safe rollback if issues occur.
|
|
436
|
+
*/
|
|
437
|
+
class DualWriteProxy {
|
|
438
|
+
/**
|
|
439
|
+
* Create dual-write proxy
|
|
440
|
+
* @param primaryStore - Primary store (usually RuVector for reads)
|
|
441
|
+
* @param secondaryStore - Secondary store (usually AgentDB for backup)
|
|
442
|
+
*/
|
|
443
|
+
constructor(primaryStore, secondaryStore) {
|
|
444
|
+
this.initialized = false;
|
|
445
|
+
this.primaryStore = primaryStore;
|
|
446
|
+
this.secondaryStore = secondaryStore;
|
|
447
|
+
}
|
|
448
|
+
async initialize() {
|
|
449
|
+
await Promise.all([
|
|
450
|
+
this.primaryStore.initialize(),
|
|
451
|
+
this.secondaryStore.initialize(),
|
|
452
|
+
]);
|
|
453
|
+
this.initialized = true;
|
|
454
|
+
console.log('[MigrationTools] DualWriteProxy initialized');
|
|
455
|
+
}
|
|
456
|
+
async storePattern(pattern) {
|
|
457
|
+
// Write to both stores
|
|
458
|
+
await Promise.all([
|
|
459
|
+
this.primaryStore.storePattern(pattern),
|
|
460
|
+
this.secondaryStore.storePattern(pattern).catch(err => {
|
|
461
|
+
console.warn('[MigrationTools] Secondary store write failed:', err.message);
|
|
462
|
+
}),
|
|
463
|
+
]);
|
|
464
|
+
}
|
|
465
|
+
async storeBatch(patterns) {
|
|
466
|
+
// Write to both stores
|
|
467
|
+
await Promise.all([
|
|
468
|
+
this.primaryStore.storeBatch(patterns),
|
|
469
|
+
this.secondaryStore.storeBatch(patterns).catch(err => {
|
|
470
|
+
console.warn('[MigrationTools] Secondary batch write failed:', err.message);
|
|
471
|
+
}),
|
|
472
|
+
]);
|
|
473
|
+
}
|
|
474
|
+
async searchSimilar(queryEmbedding, options) {
|
|
475
|
+
// Read from primary (RuVector) with fallback to secondary
|
|
476
|
+
try {
|
|
477
|
+
return await this.primaryStore.searchSimilar(queryEmbedding, options);
|
|
478
|
+
}
|
|
479
|
+
catch (error) {
|
|
480
|
+
console.warn('[MigrationTools] Primary search failed, falling back to secondary:', error.message);
|
|
481
|
+
return await this.secondaryStore.searchSimilar(queryEmbedding, options);
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
async getPattern(id) {
|
|
485
|
+
// Read from primary with fallback
|
|
486
|
+
try {
|
|
487
|
+
return await this.primaryStore.getPattern(id);
|
|
488
|
+
}
|
|
489
|
+
catch (error) {
|
|
490
|
+
console.warn('[MigrationTools] Primary get failed, falling back to secondary:', error.message);
|
|
491
|
+
return await this.secondaryStore.getPattern(id);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
async deletePattern(id) {
|
|
495
|
+
// Delete from both stores
|
|
496
|
+
const [primaryResult, secondaryResult] = await Promise.allSettled([
|
|
497
|
+
this.primaryStore.deletePattern(id),
|
|
498
|
+
this.secondaryStore.deletePattern(id),
|
|
499
|
+
]);
|
|
500
|
+
return primaryResult.status === 'fulfilled' && primaryResult.value;
|
|
501
|
+
}
|
|
502
|
+
async recordUsage(id) {
|
|
503
|
+
// Record in both stores
|
|
504
|
+
await Promise.all([
|
|
505
|
+
this.primaryStore.recordUsage(id),
|
|
506
|
+
this.secondaryStore.recordUsage(id).catch(err => {
|
|
507
|
+
console.warn('[MigrationTools] Secondary usage recording failed:', err.message);
|
|
508
|
+
}),
|
|
509
|
+
]);
|
|
510
|
+
}
|
|
511
|
+
async buildIndex() {
|
|
512
|
+
await Promise.all([
|
|
513
|
+
this.primaryStore.buildIndex(),
|
|
514
|
+
this.secondaryStore.buildIndex().catch(err => {
|
|
515
|
+
console.warn('[MigrationTools] Secondary index build failed:', err.message);
|
|
516
|
+
}),
|
|
517
|
+
]);
|
|
518
|
+
}
|
|
519
|
+
async optimize() {
|
|
520
|
+
await Promise.all([
|
|
521
|
+
this.primaryStore.optimize(),
|
|
522
|
+
this.secondaryStore.optimize().catch(err => {
|
|
523
|
+
console.warn('[MigrationTools] Secondary optimization failed:', err.message);
|
|
524
|
+
}),
|
|
525
|
+
]);
|
|
526
|
+
}
|
|
527
|
+
async getStats() {
|
|
528
|
+
// Get stats from primary
|
|
529
|
+
return await this.primaryStore.getStats();
|
|
530
|
+
}
|
|
531
|
+
async clear() {
|
|
532
|
+
await Promise.all([
|
|
533
|
+
this.primaryStore.clear(),
|
|
534
|
+
this.secondaryStore.clear(),
|
|
535
|
+
]);
|
|
536
|
+
}
|
|
537
|
+
async shutdown() {
|
|
538
|
+
await Promise.all([
|
|
539
|
+
this.primaryStore.shutdown(),
|
|
540
|
+
this.secondaryStore.shutdown(),
|
|
541
|
+
]);
|
|
542
|
+
this.initialized = false;
|
|
543
|
+
console.log('[MigrationTools] DualWriteProxy shut down');
|
|
544
|
+
}
|
|
545
|
+
getImplementationInfo() {
|
|
546
|
+
const primaryInfo = this.primaryStore.getImplementationInfo();
|
|
547
|
+
const secondaryInfo = this.secondaryStore.getImplementationInfo();
|
|
548
|
+
return {
|
|
549
|
+
type: primaryInfo.type,
|
|
550
|
+
version: `${primaryInfo.version} + ${secondaryInfo.version}`,
|
|
551
|
+
features: [
|
|
552
|
+
...primaryInfo.features,
|
|
553
|
+
'dual-write',
|
|
554
|
+
'automatic-fallback',
|
|
555
|
+
'zero-downtime-migration',
|
|
556
|
+
],
|
|
557
|
+
};
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
exports.DualWriteProxy = DualWriteProxy;
|
|
561
|
+
/**
|
|
562
|
+
* Convenience function to create a dual-write proxy
|
|
563
|
+
*/
|
|
564
|
+
async function createDualWriteProxy(primaryConfig, secondaryConfig) {
|
|
565
|
+
// Create primary store (RuVector)
|
|
566
|
+
const primaryResult = await PatternStoreFactory_1.PatternStoreFactory.create({
|
|
567
|
+
preferredBackend: 'ruvector',
|
|
568
|
+
storagePath: primaryConfig.storagePath ?? './data/patterns.ruvector',
|
|
569
|
+
dimension: primaryConfig.dimension ?? 384,
|
|
570
|
+
});
|
|
571
|
+
// Create secondary store (can be AgentDB or fallback)
|
|
572
|
+
const secondaryResult = await PatternStoreFactory_1.PatternStoreFactory.create({
|
|
573
|
+
preferredBackend: 'agentdb',
|
|
574
|
+
storagePath: secondaryConfig.storagePath ?? './data/patterns-backup.db',
|
|
575
|
+
dimension: secondaryConfig.dimension ?? 384,
|
|
576
|
+
});
|
|
577
|
+
const proxy = new DualWriteProxy(primaryResult.store, secondaryResult.store);
|
|
578
|
+
await proxy.initialize();
|
|
579
|
+
return proxy;
|
|
580
|
+
}
|
|
581
|
+
/**
|
|
582
|
+
* Migration status checker - verify migration progress
|
|
583
|
+
*/
|
|
584
|
+
async function checkMigrationStatus(sourcePath, targetPath) {
|
|
585
|
+
try {
|
|
586
|
+
// Count patterns in source (SQLite)
|
|
587
|
+
const Database = require('better-sqlite3');
|
|
588
|
+
const db = new Database(sourcePath, { readonly: true });
|
|
589
|
+
const sourceResult = db.prepare('SELECT COUNT(*) as count FROM patterns').get();
|
|
590
|
+
const sourceCount = sourceResult.count;
|
|
591
|
+
db.close();
|
|
592
|
+
// Count patterns in target (RuVector)
|
|
593
|
+
const targetStore = new RuVectorPatternStore_1.RuVectorPatternStore({
|
|
594
|
+
dimension: 384,
|
|
595
|
+
storagePath: targetPath,
|
|
596
|
+
});
|
|
597
|
+
await targetStore.initialize();
|
|
598
|
+
const targetStats = await targetStore.getStats();
|
|
599
|
+
const targetCount = targetStats.count;
|
|
600
|
+
await targetStore.shutdown();
|
|
601
|
+
const coverage = sourceCount > 0 ? (targetCount / sourceCount) : 0;
|
|
602
|
+
const migrationComplete = coverage >= 0.99;
|
|
603
|
+
return {
|
|
604
|
+
sourceCount,
|
|
605
|
+
targetCount,
|
|
606
|
+
migrationComplete,
|
|
607
|
+
coverage,
|
|
608
|
+
};
|
|
609
|
+
}
|
|
610
|
+
catch (error) {
|
|
611
|
+
throw new Error(`Migration status check failed: ${error.message}`);
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
exports.default = PatternMigrator;
|
|
615
|
+
//# sourceMappingURL=MigrationTools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MigrationTools.js","sourceRoot":"","sources":["../../../src/core/memory/MigrationTools.ts"],"names":[],"mappings":"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"}
|