agentic-qe 1.5.1 → 1.6.0

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 (158) hide show
  1. package/.claude/agents/.claude-flow/metrics/agent-metrics.json +1 -0
  2. package/.claude/agents/.claude-flow/metrics/performance.json +87 -0
  3. package/.claude/agents/.claude-flow/metrics/task-metrics.json +10 -0
  4. package/.claude/agents/qe-api-contract-validator.md +118 -0
  5. package/.claude/agents/qe-chaos-engineer.md +320 -5
  6. package/.claude/agents/qe-code-complexity.md +360 -0
  7. package/.claude/agents/qe-coverage-analyzer.md +112 -0
  8. package/.claude/agents/qe-deployment-readiness.md +322 -6
  9. package/.claude/agents/qe-flaky-test-hunter.md +115 -0
  10. package/.claude/agents/qe-fleet-commander.md +319 -6
  11. package/.claude/agents/qe-performance-tester.md +234 -0
  12. package/.claude/agents/qe-production-intelligence.md +114 -0
  13. package/.claude/agents/qe-quality-analyzer.md +126 -0
  14. package/.claude/agents/qe-quality-gate.md +119 -0
  15. package/.claude/agents/qe-regression-risk-analyzer.md +114 -0
  16. package/.claude/agents/qe-requirements-validator.md +114 -0
  17. package/.claude/agents/qe-security-scanner.md +118 -0
  18. package/.claude/agents/qe-test-data-architect.md +234 -0
  19. package/.claude/agents/qe-test-executor.md +115 -0
  20. package/.claude/agents/qe-test-generator.md +114 -0
  21. package/.claude/agents/qe-visual-tester.md +305 -6
  22. package/.claude/agents/subagents/qe-code-reviewer.md +0 -4
  23. package/.claude/agents/subagents/qe-data-generator.md +0 -16
  24. package/.claude/agents/subagents/qe-integration-tester.md +0 -17
  25. package/.claude/agents/subagents/qe-performance-validator.md +0 -16
  26. package/.claude/agents/subagents/qe-security-auditor.md +0 -16
  27. package/.claude/agents/subagents/qe-test-implementer.md +0 -17
  28. package/.claude/agents/subagents/qe-test-refactorer.md +0 -17
  29. package/.claude/agents/subagents/qe-test-writer.md +0 -19
  30. package/CHANGELOG.md +261 -0
  31. package/README.md +37 -5
  32. package/dist/adapters/MemoryStoreAdapter.d.ts +38 -0
  33. package/dist/adapters/MemoryStoreAdapter.d.ts.map +1 -1
  34. package/dist/adapters/MemoryStoreAdapter.js +22 -0
  35. package/dist/adapters/MemoryStoreAdapter.js.map +1 -1
  36. package/dist/agents/BaseAgent.d.ts.map +1 -1
  37. package/dist/agents/BaseAgent.js +13 -0
  38. package/dist/agents/BaseAgent.js.map +1 -1
  39. package/dist/cli/commands/init.d.ts.map +1 -1
  40. package/dist/cli/commands/init.js +32 -1
  41. package/dist/cli/commands/init.js.map +1 -1
  42. package/dist/core/memory/AgentDBService.d.ts +33 -28
  43. package/dist/core/memory/AgentDBService.d.ts.map +1 -1
  44. package/dist/core/memory/AgentDBService.js +233 -290
  45. package/dist/core/memory/AgentDBService.js.map +1 -1
  46. package/dist/core/memory/EnhancedAgentDBService.d.ts.map +1 -1
  47. package/dist/core/memory/EnhancedAgentDBService.js +5 -3
  48. package/dist/core/memory/EnhancedAgentDBService.js.map +1 -1
  49. package/dist/core/memory/RealAgentDBAdapter.d.ts +9 -2
  50. package/dist/core/memory/RealAgentDBAdapter.d.ts.map +1 -1
  51. package/dist/core/memory/RealAgentDBAdapter.js +126 -100
  52. package/dist/core/memory/RealAgentDBAdapter.js.map +1 -1
  53. package/dist/core/memory/SwarmMemoryManager.d.ts +58 -0
  54. package/dist/core/memory/SwarmMemoryManager.d.ts.map +1 -1
  55. package/dist/core/memory/SwarmMemoryManager.js +176 -0
  56. package/dist/core/memory/SwarmMemoryManager.js.map +1 -1
  57. package/dist/core/memory/index.d.ts.map +1 -1
  58. package/dist/core/memory/index.js +2 -1
  59. package/dist/core/memory/index.js.map +1 -1
  60. package/dist/learning/LearningEngine.d.ts +14 -27
  61. package/dist/learning/LearningEngine.d.ts.map +1 -1
  62. package/dist/learning/LearningEngine.js +57 -119
  63. package/dist/learning/LearningEngine.js.map +1 -1
  64. package/dist/learning/index.d.ts +0 -1
  65. package/dist/learning/index.d.ts.map +1 -1
  66. package/dist/learning/index.js +0 -1
  67. package/dist/learning/index.js.map +1 -1
  68. package/dist/mcp/handlers/learning/learning-query.d.ts +34 -0
  69. package/dist/mcp/handlers/learning/learning-query.d.ts.map +1 -0
  70. package/dist/mcp/handlers/learning/learning-query.js +156 -0
  71. package/dist/mcp/handlers/learning/learning-query.js.map +1 -0
  72. package/dist/mcp/handlers/learning/learning-store-experience.d.ts +30 -0
  73. package/dist/mcp/handlers/learning/learning-store-experience.d.ts.map +1 -0
  74. package/dist/mcp/handlers/learning/learning-store-experience.js +86 -0
  75. package/dist/mcp/handlers/learning/learning-store-experience.js.map +1 -0
  76. package/dist/mcp/handlers/learning/learning-store-pattern.d.ts +31 -0
  77. package/dist/mcp/handlers/learning/learning-store-pattern.d.ts.map +1 -0
  78. package/dist/mcp/handlers/learning/learning-store-pattern.js +126 -0
  79. package/dist/mcp/handlers/learning/learning-store-pattern.js.map +1 -0
  80. package/dist/mcp/handlers/learning/learning-store-qvalue.d.ts +30 -0
  81. package/dist/mcp/handlers/learning/learning-store-qvalue.d.ts.map +1 -0
  82. package/dist/mcp/handlers/learning/learning-store-qvalue.js +100 -0
  83. package/dist/mcp/handlers/learning/learning-store-qvalue.js.map +1 -0
  84. package/dist/mcp/server.d.ts +11 -0
  85. package/dist/mcp/server.d.ts.map +1 -1
  86. package/dist/mcp/server.js +98 -1
  87. package/dist/mcp/server.js.map +1 -1
  88. package/dist/mcp/services/LearningEventListener.d.ts +123 -0
  89. package/dist/mcp/services/LearningEventListener.d.ts.map +1 -0
  90. package/dist/mcp/services/LearningEventListener.js +322 -0
  91. package/dist/mcp/services/LearningEventListener.js.map +1 -0
  92. package/dist/mcp/tools.d.ts +4 -0
  93. package/dist/mcp/tools.d.ts.map +1 -1
  94. package/dist/mcp/tools.js +179 -0
  95. package/dist/mcp/tools.js.map +1 -1
  96. package/dist/types/memory-interfaces.d.ts +71 -0
  97. package/dist/types/memory-interfaces.d.ts.map +1 -1
  98. package/dist/utils/Calculator.d.ts +35 -0
  99. package/dist/utils/Calculator.d.ts.map +1 -0
  100. package/dist/utils/Calculator.js +50 -0
  101. package/dist/utils/Calculator.js.map +1 -0
  102. package/dist/utils/Logger.d.ts.map +1 -1
  103. package/dist/utils/Logger.js +4 -1
  104. package/dist/utils/Logger.js.map +1 -1
  105. package/package.json +7 -5
  106. package/.claude/agents/qe-api-contract-validator.md.backup +0 -1148
  107. package/.claude/agents/qe-api-contract-validator.md.backup-20251107-134747 +0 -1148
  108. package/.claude/agents/qe-api-contract-validator.md.backup-phase2-20251107-140039 +0 -1123
  109. package/.claude/agents/qe-chaos-engineer.md.backup +0 -808
  110. package/.claude/agents/qe-chaos-engineer.md.backup-20251107-134747 +0 -808
  111. package/.claude/agents/qe-chaos-engineer.md.backup-phase2-20251107-140039 +0 -787
  112. package/.claude/agents/qe-code-complexity.md.backup +0 -291
  113. package/.claude/agents/qe-code-complexity.md.backup-20251107-134747 +0 -291
  114. package/.claude/agents/qe-code-complexity.md.backup-phase2-20251107-140039 +0 -286
  115. package/.claude/agents/qe-coverage-analyzer.md.backup +0 -467
  116. package/.claude/agents/qe-coverage-analyzer.md.backup-20251107-134747 +0 -467
  117. package/.claude/agents/qe-coverage-analyzer.md.backup-phase2-20251107-140039 +0 -438
  118. package/.claude/agents/qe-deployment-readiness.md.backup +0 -1166
  119. package/.claude/agents/qe-deployment-readiness.md.backup-20251107-134747 +0 -1166
  120. package/.claude/agents/qe-deployment-readiness.md.backup-phase2-20251107-140039 +0 -1140
  121. package/.claude/agents/qe-flaky-test-hunter.md.backup +0 -1195
  122. package/.claude/agents/qe-flaky-test-hunter.md.backup-20251107-134747 +0 -1195
  123. package/.claude/agents/qe-flaky-test-hunter.md.backup-phase2-20251107-140039 +0 -1162
  124. package/.claude/agents/qe-fleet-commander.md.backup +0 -718
  125. package/.claude/agents/qe-fleet-commander.md.backup-20251107-134747 +0 -718
  126. package/.claude/agents/qe-fleet-commander.md.backup-phase2-20251107-140039 +0 -697
  127. package/.claude/agents/qe-performance-tester.md.backup +0 -428
  128. package/.claude/agents/qe-performance-tester.md.backup-20251107-134747 +0 -428
  129. package/.claude/agents/qe-performance-tester.md.backup-phase2-20251107-140039 +0 -372
  130. package/.claude/agents/qe-production-intelligence.md.backup +0 -1219
  131. package/.claude/agents/qe-production-intelligence.md.backup-20251107-134747 +0 -1219
  132. package/.claude/agents/qe-production-intelligence.md.backup-phase2-20251107-140039 +0 -1194
  133. package/.claude/agents/qe-quality-analyzer.md.backup +0 -425
  134. package/.claude/agents/qe-quality-analyzer.md.backup-20251107-134747 +0 -425
  135. package/.claude/agents/qe-quality-analyzer.md.backup-phase2-20251107-140039 +0 -394
  136. package/.claude/agents/qe-quality-gate.md.backup +0 -446
  137. package/.claude/agents/qe-quality-gate.md.backup-20251107-134747 +0 -446
  138. package/.claude/agents/qe-quality-gate.md.backup-phase2-20251107-140039 +0 -415
  139. package/.claude/agents/qe-regression-risk-analyzer.md.backup +0 -1009
  140. package/.claude/agents/qe-regression-risk-analyzer.md.backup-20251107-134747 +0 -1009
  141. package/.claude/agents/qe-regression-risk-analyzer.md.backup-phase2-20251107-140039 +0 -984
  142. package/.claude/agents/qe-requirements-validator.md.backup +0 -748
  143. package/.claude/agents/qe-requirements-validator.md.backup-20251107-134747 +0 -748
  144. package/.claude/agents/qe-requirements-validator.md.backup-phase2-20251107-140039 +0 -723
  145. package/.claude/agents/qe-security-scanner.md.backup +0 -634
  146. package/.claude/agents/qe-security-scanner.md.backup-20251107-134747 +0 -634
  147. package/.claude/agents/qe-security-scanner.md.backup-phase2-20251107-140039 +0 -573
  148. package/.claude/agents/qe-test-data-architect.md.backup +0 -1064
  149. package/.claude/agents/qe-test-data-architect.md.backup-20251107-134747 +0 -1064
  150. package/.claude/agents/qe-test-data-architect.md.backup-phase2-20251107-140039 +0 -1040
  151. package/.claude/agents/qe-test-executor.md.backup +0 -389
  152. package/.claude/agents/qe-test-executor.md.backup-20251107-134747 +0 -389
  153. package/.claude/agents/qe-test-executor.md.backup-phase2-20251107-140039 +0 -369
  154. package/.claude/agents/qe-test-generator.md.backup +0 -997
  155. package/.claude/agents/qe-test-generator.md.backup-20251107-134747 +0 -997
  156. package/.claude/agents/qe-visual-tester.md.backup +0 -777
  157. package/.claude/agents/qe-visual-tester.md.backup-20251107-134747 +0 -777
  158. package/.claude/agents/qe-visual-tester.md.backup-phase2-20251107-140039 +0 -756
@@ -14,6 +14,7 @@
14
14
  * - Batch Insert: 2ms for 100 patterns
15
15
  *
16
16
  * @module AgentDBService
17
+ * @version 2.0.0 - Updated for agentdb@1.6.1
17
18
  */
18
19
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
19
20
  if (k2 === undefined) k2 = k;
@@ -55,15 +56,28 @@ const agentdb_1 = require("agentdb");
55
56
  const path = __importStar(require("path"));
56
57
  const fs = __importStar(require("fs"));
57
58
  /**
58
- * AgentDB Service - Core implementation
59
+ * AgentDB Service - Core implementation (v2.0.0)
60
+ * Updated for agentdb@1.6.1 with WASMVectorSearch and HNSWIndex
59
61
  */
60
62
  class AgentDBService {
61
63
  constructor(config) {
62
- this.db = null;
64
+ this.db = null; // Database instance from createDatabase()
65
+ this.wasmSearch = null;
66
+ this.hnswIndex = null;
63
67
  this.isInitialized = false;
68
+ this.queryCache = new Map();
64
69
  this.config = {
65
70
  ...config,
66
- hnswConfig: config.hnswConfig || agentdb_1.DEFAULT_HNSW_CONFIG,
71
+ hnswConfig: config.hnswConfig || {
72
+ M: 16,
73
+ efConstruction: 200,
74
+ efSearch: 100,
75
+ metric: 'cosine',
76
+ dimension: config.embeddingDim,
77
+ maxElements: 100000,
78
+ persistIndex: true,
79
+ rebuildThreshold: 0.1
80
+ },
67
81
  cacheSize: config.cacheSize || 1000,
68
82
  cacheTTL: config.cacheTTL || 3600000,
69
83
  quantizationBits: config.quantizationBits || 8
@@ -83,368 +97,297 @@ class AgentDBService {
83
97
  if (!fs.existsSync(dbDir)) {
84
98
  fs.mkdirSync(dbDir, { recursive: true });
85
99
  }
86
- // Create database configuration
87
- const dbConfig = {
88
- path: this.config.dbPath,
89
- memoryMode: false,
90
- walMode: true,
91
- cacheSize: this.config.cacheSize,
92
- queryCache: {
93
- enabled: this.config.enableCache,
94
- maxSize: this.config.cacheSize,
95
- ttl: this.config.cacheTTL,
96
- enableStats: true
97
- },
98
- quantization: this.config.enableQuantization ? {
99
- enabled: true,
100
- dimensions: this.config.embeddingDim,
101
- subvectors: 8,
102
- bits: this.config.quantizationBits ?? 8, // Default to 8 bits if not specified
103
- trainOnInsert: true,
104
- minVectorsForTraining: 100
105
- } : undefined
106
- };
107
- // Create vector database
108
- this.db = await (0, agentdb_1.createVectorDB)(dbConfig);
109
- // Initialize database schema
110
- await this.initializeSchema();
100
+ // Create database with agentdb@1.6.1 API
101
+ this.db = await (0, agentdb_1.createDatabase)(this.config.dbPath);
102
+ // Create patterns table
103
+ await this.createPatternsTable();
104
+ // Initialize WASM vector search
105
+ this.wasmSearch = new agentdb_1.WASMVectorSearch(this.db, {
106
+ enableWASM: true,
107
+ enableSIMD: true,
108
+ batchSize: 100,
109
+ indexThreshold: 1000
110
+ });
111
+ // Initialize HNSW index if enabled
112
+ if (this.config.enableHNSW && this.config.hnswConfig) {
113
+ this.hnswIndex = new agentdb_1.HNSWIndex(this.db, this.config.hnswConfig);
114
+ await this.hnswIndex.buildIndex('patterns');
115
+ this.logger.log('[AgentDBService] HNSW index built successfully');
116
+ }
111
117
  this.isInitialized = true;
112
- this.logger.info('AgentDBService initialized successfully', {
118
+ this.logger.log('[AgentDBService] Initialized successfully', {
113
119
  dbPath: this.config.dbPath,
114
- enableHNSW: this.config.enableHNSW,
115
- enableCache: this.config.enableCache,
116
- enableQuantization: this.config.enableQuantization
120
+ hnswEnabled: this.config.enableHNSW,
121
+ embeddingDim: this.config.embeddingDim
117
122
  });
118
123
  }
119
124
  catch (error) {
120
- throw new Error(`Failed to initialize AgentDBService: ${error.message}`);
125
+ this.logger.error('[AgentDBService] Initialization failed:', error);
126
+ throw error;
121
127
  }
122
128
  }
123
129
  /**
124
- * Initialize database schema for patterns
130
+ * Create patterns table with vector embeddings
125
131
  */
126
- async initializeSchema() {
127
- if (!this.db) {
128
- throw new Error('Database not initialized');
129
- }
130
- try {
131
- // The SQLiteVectorDB creates the vectors table automatically
132
- // We'll use the metadata field to store pattern information
133
- this.logger.info('Database schema initialized');
134
- }
135
- catch (error) {
136
- throw new Error(`Failed to initialize schema: ${error.message}`);
137
- }
132
+ async createPatternsTable() {
133
+ const sql = `
134
+ CREATE TABLE IF NOT EXISTS patterns (
135
+ id TEXT PRIMARY KEY,
136
+ type TEXT NOT NULL,
137
+ domain TEXT NOT NULL,
138
+ data TEXT NOT NULL,
139
+ confidence REAL NOT NULL,
140
+ usage_count INTEGER NOT NULL DEFAULT 0,
141
+ success_count INTEGER NOT NULL DEFAULT 0,
142
+ embedding BLOB,
143
+ created_at INTEGER NOT NULL,
144
+ last_used INTEGER NOT NULL,
145
+ metadata TEXT
146
+ )
147
+ `;
148
+ await this.db.exec(sql);
149
+ // Create indexes for fast filtering
150
+ await this.db.exec('CREATE INDEX IF NOT EXISTS idx_patterns_type ON patterns(type)');
151
+ await this.db.exec('CREATE INDEX IF NOT EXISTS idx_patterns_domain ON patterns(domain)');
152
+ await this.db.exec('CREATE INDEX IF NOT EXISTS idx_patterns_confidence ON patterns(confidence)');
138
153
  }
139
154
  /**
140
- * Store a pattern with its embedding
155
+ * Store a pattern with vector embedding
141
156
  */
142
157
  async storePattern(pattern, embedding) {
143
158
  this.ensureInitialized();
144
159
  try {
145
- const startTime = Date.now();
146
- // Validate embedding dimension
147
- if (embedding.length !== this.config.embeddingDim) {
148
- throw new Error(`Embedding dimension mismatch: expected ${this.config.embeddingDim}, got ${embedding.length}`);
160
+ const sql = `
161
+ INSERT OR REPLACE INTO patterns
162
+ (id, type, domain, data, confidence, usage_count, success_count, embedding, created_at, last_used, metadata)
163
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
164
+ `;
165
+ await this.db.run(sql, [
166
+ pattern.id,
167
+ pattern.type,
168
+ pattern.domain,
169
+ JSON.stringify(pattern.data),
170
+ pattern.confidence,
171
+ pattern.usageCount,
172
+ pattern.successCount,
173
+ Buffer.from(embedding.buffer),
174
+ pattern.createdAt,
175
+ pattern.lastUsed,
176
+ pattern.metadata ? JSON.stringify(pattern.metadata) : null
177
+ ]);
178
+ // Add to HNSW index if enabled
179
+ if (this.hnswIndex && this.hnswIndex.isReady()) {
180
+ // Get the row ID for the pattern
181
+ const result = await this.db.get('SELECT rowid FROM patterns WHERE id = ?', [pattern.id]);
182
+ if (result) {
183
+ this.hnswIndex.addVector(result.rowid, embedding);
184
+ }
149
185
  }
150
- // Create vector with metadata
151
- const vector = {
152
- id: pattern.id,
153
- embedding: embedding,
154
- metadata: {
155
- type: pattern.type,
156
- domain: pattern.domain,
157
- data: JSON.stringify(pattern.data),
158
- confidence: pattern.confidence,
159
- usageCount: pattern.usageCount,
160
- successCount: pattern.successCount,
161
- createdAt: pattern.createdAt,
162
- lastUsed: pattern.lastUsed,
163
- ...pattern.metadata
164
- },
165
- timestamp: pattern.createdAt
166
- };
167
- // Insert into AgentDB
168
- const insertedId = this.db.insert(vector);
169
- const duration = Date.now() - startTime;
170
- this.logger.info('Pattern stored successfully', {
171
- id: insertedId,
172
- type: pattern.type,
173
- domain: pattern.domain,
174
- duration: `${duration}ms`
175
- });
176
- return insertedId;
177
- }
178
- catch (error) {
179
- this.logger.error('Failed to store pattern', { error: error.message });
180
- throw new Error(`Failed to store pattern: ${error.message}`);
181
- }
182
- }
183
- /**
184
- * Retrieve a pattern by ID
185
- */
186
- async retrievePattern(id) {
187
- this.ensureInitialized();
188
- try {
189
- const vector = this.db.get(id);
190
- if (!vector || !vector.metadata) {
191
- return null;
186
+ // Clear cache
187
+ if (this.config.enableCache) {
188
+ this.queryCache.clear();
192
189
  }
193
- return this.vectorToPattern(vector);
194
190
  }
195
191
  catch (error) {
196
- this.logger.error('Failed to retrieve pattern', { id, error: error.message });
197
- throw new Error(`Failed to retrieve pattern: ${error.message}`);
192
+ this.logger.error('[AgentDBService] Failed to store pattern:', error);
193
+ throw error;
198
194
  }
199
195
  }
200
196
  /**
201
- * Search for similar patterns using HNSW
197
+ * Batch store patterns for better performance
202
198
  */
203
- async searchSimilar(queryEmbedding, options = {}) {
204
- this.ensureInitialized();
205
- try {
206
- const startTime = Date.now();
207
- // Validate embedding dimension
208
- if (queryEmbedding.length !== this.config.embeddingDim) {
209
- throw new Error(`Query embedding dimension mismatch: expected ${this.config.embeddingDim}, got ${queryEmbedding.length}`);
210
- }
211
- const { k = 10, metric = 'cosine', threshold = 0.0, domain, type, minConfidence } = options;
212
- // Perform vector search
213
- const results = this.db.search(queryEmbedding, k, metric, threshold);
214
- // Convert to pattern results and apply filters
215
- let patternResults = results
216
- .map(result => {
217
- const pattern = this.vectorToPattern({
218
- id: result.id,
219
- embedding: result.embedding,
220
- metadata: result.metadata
221
- });
222
- return {
223
- pattern,
224
- similarity: result.score,
225
- distance: 1 - result.score // Convert similarity to distance
226
- };
227
- })
228
- .filter(result => {
229
- // Apply domain filter
230
- if (domain && result.pattern.domain !== domain) {
231
- return false;
232
- }
233
- // Apply type filter
234
- if (type && result.pattern.type !== type) {
235
- return false;
236
- }
237
- // Apply confidence filter
238
- if (minConfidence !== undefined && result.pattern.confidence < minConfidence) {
239
- return false;
240
- }
241
- return true;
242
- });
243
- const duration = Date.now() - startTime;
244
- this.logger.info('Pattern search completed', {
245
- resultsCount: patternResults.length,
246
- duration: `${duration}ms`,
247
- filters: { domain, type, minConfidence }
248
- });
249
- return patternResults;
250
- }
251
- catch (error) {
252
- this.logger.error('Failed to search patterns', { error: error.message });
253
- throw new Error(`Failed to search patterns: ${error.message}`);
254
- }
255
- }
256
- /**
257
- * Store multiple patterns in a batch (high performance)
258
- */
259
- async storeBatch(patterns, embeddings) {
199
+ async storePatternsInBatch(patterns) {
260
200
  this.ensureInitialized();
261
201
  const startTime = Date.now();
262
202
  const insertedIds = [];
263
203
  const errors = [];
264
204
  try {
265
- // Validate inputs
266
- if (patterns.length !== embeddings.length) {
267
- throw new Error('Patterns and embeddings arrays must have the same length');
268
- }
269
- // Create vectors for batch insert
270
- const vectors = patterns.map((pattern, index) => {
271
- // Validate embedding dimension
272
- if (embeddings[index].length !== this.config.embeddingDim) {
205
+ // Begin transaction
206
+ await this.db.exec('BEGIN TRANSACTION');
207
+ for (let i = 0; i < patterns.length; i++) {
208
+ try {
209
+ await this.storePattern(patterns[i].pattern, patterns[i].embedding);
210
+ insertedIds.push(patterns[i].pattern.id);
211
+ }
212
+ catch (error) {
273
213
  errors.push({
274
- index,
275
- error: `Embedding dimension mismatch: expected ${this.config.embeddingDim}, got ${embeddings[index].length}`
214
+ index: i,
215
+ error: error instanceof Error ? error.message : String(error)
276
216
  });
277
- return null;
278
217
  }
279
- return {
280
- id: pattern.id,
281
- embedding: embeddings[index],
282
- metadata: {
283
- type: pattern.type,
284
- domain: pattern.domain,
285
- data: JSON.stringify(pattern.data),
286
- confidence: pattern.confidence,
287
- usageCount: pattern.usageCount,
288
- successCount: pattern.successCount,
289
- createdAt: pattern.createdAt,
290
- lastUsed: pattern.lastUsed,
291
- ...pattern.metadata
292
- },
293
- timestamp: pattern.createdAt
294
- };
295
- }).filter(v => v !== null);
296
- // Batch insert
297
- const ids = this.db.insertBatch(vectors);
298
- insertedIds.push(...ids);
299
- const duration = Date.now() - startTime;
300
- const success = errors.length === 0;
301
- this.logger.info('Batch insert completed', {
302
- totalPatterns: patterns.length,
303
- inserted: insertedIds.length,
304
- errors: errors.length,
305
- duration: `${duration}ms`,
306
- throughput: `${(patterns.length / (duration / 1000)).toFixed(0)} patterns/sec`
307
- });
218
+ }
219
+ // Commit transaction
220
+ await this.db.exec('COMMIT');
221
+ // Rebuild HNSW index if needed
222
+ if (this.hnswIndex && this.hnswIndex.needsRebuild()) {
223
+ await this.hnswIndex.buildIndex('patterns');
224
+ }
308
225
  return {
309
- success,
226
+ success: errors.length === 0,
310
227
  insertedIds,
311
228
  errors,
312
- duration
229
+ duration: Date.now() - startTime
313
230
  };
314
231
  }
315
232
  catch (error) {
316
- const duration = Date.now() - startTime;
317
- this.logger.error('Batch insert failed', { error: error.message });
318
- return {
319
- success: false,
320
- insertedIds,
321
- errors: [{ index: -1, error: error.message }],
322
- duration
323
- };
233
+ // Rollback on error
234
+ await this.db.exec('ROLLBACK');
235
+ throw error;
324
236
  }
325
237
  }
326
238
  /**
327
- * Delete a pattern by ID
239
+ * Search for similar patterns using HNSW or WASM vector search
328
240
  */
329
- async deletePattern(id) {
241
+ async searchPatterns(queryEmbedding, options = {}) {
330
242
  this.ensureInitialized();
243
+ const { k = 10, threshold = 0.7, metric = 'cosine', domain, type, minConfidence } = options;
244
+ // Check cache
245
+ const cacheKey = `${queryEmbedding.toString()}-${k}-${threshold}-${domain}-${type}-${minConfidence}`;
246
+ if (this.config.enableCache) {
247
+ const cached = this.queryCache.get(cacheKey);
248
+ if (cached && Date.now() - cached.timestamp < (this.config.cacheTTL || 3600000)) {
249
+ return cached.result;
250
+ }
251
+ }
331
252
  try {
332
- const deleted = this.db.delete(id);
333
- if (deleted) {
334
- this.logger.info('Pattern deleted', { id });
253
+ let searchResults;
254
+ // Use HNSW index if available and built
255
+ if (this.hnswIndex && this.hnswIndex.isReady()) {
256
+ searchResults = await this.hnswIndex.search(queryEmbedding, k, {
257
+ threshold,
258
+ filters: this.buildFilters(domain, type, minConfidence)
259
+ });
260
+ }
261
+ else if (this.wasmSearch) {
262
+ // Fallback to WASM vector search
263
+ searchResults = await this.wasmSearch.findKNN(queryEmbedding, k, 'patterns', {
264
+ threshold,
265
+ filters: this.buildFilters(domain, type, minConfidence)
266
+ });
267
+ }
268
+ else {
269
+ throw new Error('No search backend available');
270
+ }
271
+ // Convert search results to PatternSearchResult
272
+ const results = [];
273
+ for (const result of searchResults) {
274
+ const pattern = await this.getPatternById(result.id);
275
+ if (pattern) {
276
+ results.push({
277
+ pattern,
278
+ similarity: result.similarity,
279
+ distance: result.distance
280
+ });
281
+ }
282
+ }
283
+ // Cache results
284
+ if (this.config.enableCache) {
285
+ this.queryCache.set(cacheKey, {
286
+ result: results,
287
+ timestamp: Date.now()
288
+ });
289
+ // Evict old entries if cache is full
290
+ if (this.queryCache.size > (this.config.cacheSize || 1000)) {
291
+ const firstKey = this.queryCache.keys().next().value;
292
+ if (firstKey !== undefined) {
293
+ this.queryCache.delete(firstKey);
294
+ }
295
+ }
335
296
  }
336
- return deleted;
297
+ return results;
337
298
  }
338
299
  catch (error) {
339
- this.logger.error('Failed to delete pattern', { id, error: error.message });
340
- throw new Error(`Failed to delete pattern: ${error.message}`);
300
+ this.logger.error('[AgentDBService] Pattern search failed:', error);
301
+ throw error;
341
302
  }
342
303
  }
343
304
  /**
344
- * Get database statistics
305
+ * Get pattern by ID
306
+ */
307
+ async getPatternById(rowId) {
308
+ const sql = 'SELECT * FROM patterns WHERE rowid = ?';
309
+ const row = await this.db.get(sql, [rowId]);
310
+ if (!row) {
311
+ return null;
312
+ }
313
+ return {
314
+ id: row.id,
315
+ type: row.type,
316
+ domain: row.domain,
317
+ data: JSON.parse(row.data),
318
+ confidence: row.confidence,
319
+ usageCount: row.usage_count,
320
+ successCount: row.success_count,
321
+ createdAt: row.created_at,
322
+ lastUsed: row.last_used,
323
+ metadata: row.metadata ? JSON.parse(row.metadata) : undefined
324
+ };
325
+ }
326
+ /**
327
+ * Build SQL filters for pattern search
328
+ */
329
+ buildFilters(domain, type, minConfidence) {
330
+ const filters = {};
331
+ if (domain)
332
+ filters.domain = domain;
333
+ if (type)
334
+ filters.type = type;
335
+ if (minConfidence !== undefined)
336
+ filters.confidence_gte = minConfidence;
337
+ return filters;
338
+ }
339
+ /**
340
+ * Get service statistics
345
341
  */
346
342
  async getStats() {
347
343
  this.ensureInitialized();
348
- try {
349
- const stats = this.db.stats();
350
- const cacheStats = this.db.getCacheStats();
351
- const compressionStats = this.db.getCompressionStats();
352
- return {
353
- count: stats.count,
354
- size: stats.size,
355
- cacheStats,
356
- compressionStats
357
- };
358
- }
359
- catch (error) {
360
- this.logger.error('Failed to get stats', { error: error.message });
361
- throw new Error(`Failed to get stats: ${error.message}`);
362
- }
344
+ const countResult = await this.db.get('SELECT COUNT(*) as count FROM patterns');
345
+ const totalPatterns = countResult?.count || 0;
346
+ return {
347
+ totalPatterns,
348
+ hnswEnabled: this.config.enableHNSW,
349
+ hnswStats: this.hnswIndex?.getStats(),
350
+ wasmStats: this.wasmSearch?.getStats(),
351
+ cacheSize: this.queryCache.size
352
+ };
363
353
  }
364
354
  /**
365
355
  * Clear query cache
366
356
  */
367
357
  clearCache() {
368
- this.ensureInitialized();
369
- try {
370
- this.db.clearCache();
371
- this.logger.info('Cache cleared');
372
- }
373
- catch (error) {
374
- this.logger.error('Failed to clear cache', { error: error.message });
375
- }
358
+ this.queryCache.clear();
376
359
  }
377
360
  /**
378
- * Close database connection
361
+ * Close database and cleanup
379
362
  */
380
363
  async close() {
381
- if (!this.isInitialized || !this.db) {
382
- return;
364
+ if (this.hnswIndex) {
365
+ this.hnswIndex.clear();
383
366
  }
384
- try {
385
- this.db.close();
386
- this.db = null;
387
- this.isInitialized = false;
388
- this.logger.info('AgentDBService closed');
367
+ if (this.wasmSearch) {
368
+ this.wasmSearch.clearIndex();
389
369
  }
390
- catch (error) {
391
- throw new Error(`Failed to close AgentDBService: ${error.message}`);
370
+ if (this.db) {
371
+ await this.db.close();
392
372
  }
393
- }
394
- /**
395
- * Convert AgentDB vector to QE pattern
396
- */
397
- vectorToPattern(vector) {
398
- const metadata = vector.metadata || {};
399
- return {
400
- id: vector.id,
401
- type: metadata.type || 'unknown',
402
- domain: metadata.domain || 'unknown',
403
- data: metadata.data ? JSON.parse(metadata.data) : {},
404
- confidence: metadata.confidence || 0,
405
- usageCount: metadata.usageCount || 0,
406
- successCount: metadata.successCount || 0,
407
- createdAt: metadata.createdAt || vector.timestamp || Date.now(),
408
- lastUsed: metadata.lastUsed || vector.timestamp || Date.now(),
409
- metadata: {
410
- ...metadata,
411
- // Remove duplicates
412
- type: undefined,
413
- domain: undefined,
414
- data: undefined,
415
- confidence: undefined,
416
- usageCount: undefined,
417
- successCount: undefined,
418
- createdAt: undefined,
419
- lastUsed: undefined
420
- }
421
- };
373
+ this.isInitialized = false;
422
374
  }
423
375
  /**
424
376
  * Ensure service is initialized
425
377
  */
426
378
  ensureInitialized() {
427
- if (!this.isInitialized || !this.db) {
379
+ if (!this.isInitialized) {
428
380
  throw new Error('AgentDBService not initialized. Call initialize() first.');
429
381
  }
430
382
  }
431
383
  }
432
384
  exports.AgentDBService = AgentDBService;
433
385
  /**
434
- * Create AgentDB service with default configuration
386
+ * Factory function to create and initialize AgentDBService
435
387
  */
436
- function createAgentDBService(overrides = {}) {
437
- const defaultConfig = {
438
- dbPath: '.agentic-qe/agentdb/patterns.db',
439
- embeddingDim: 384, // all-MiniLM-L6-v2 dimension
440
- enableHNSW: true,
441
- enableCache: true,
442
- cacheSize: 1000,
443
- cacheTTL: 3600000, // 1 hour
444
- enableQuantization: false, // Disabled by default for accuracy
445
- quantizationBits: 8
446
- };
447
- const config = { ...defaultConfig, ...overrides };
448
- return new AgentDBService(config);
388
+ async function createAgentDBService(config) {
389
+ const service = new AgentDBService(config);
390
+ await service.initialize();
391
+ return service;
449
392
  }
450
393
  //# sourceMappingURL=AgentDBService.js.map