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.
- package/.claude/agents/.claude-flow/metrics/agent-metrics.json +1 -0
- package/.claude/agents/.claude-flow/metrics/performance.json +87 -0
- package/.claude/agents/.claude-flow/metrics/task-metrics.json +10 -0
- package/.claude/agents/qe-api-contract-validator.md +118 -0
- package/.claude/agents/qe-chaos-engineer.md +320 -5
- package/.claude/agents/qe-code-complexity.md +360 -0
- package/.claude/agents/qe-coverage-analyzer.md +112 -0
- package/.claude/agents/qe-deployment-readiness.md +322 -6
- package/.claude/agents/qe-flaky-test-hunter.md +115 -0
- package/.claude/agents/qe-fleet-commander.md +319 -6
- package/.claude/agents/qe-performance-tester.md +234 -0
- package/.claude/agents/qe-production-intelligence.md +114 -0
- package/.claude/agents/qe-quality-analyzer.md +126 -0
- package/.claude/agents/qe-quality-gate.md +119 -0
- package/.claude/agents/qe-regression-risk-analyzer.md +114 -0
- package/.claude/agents/qe-requirements-validator.md +114 -0
- package/.claude/agents/qe-security-scanner.md +118 -0
- package/.claude/agents/qe-test-data-architect.md +234 -0
- package/.claude/agents/qe-test-executor.md +115 -0
- package/.claude/agents/qe-test-generator.md +114 -0
- package/.claude/agents/qe-visual-tester.md +305 -6
- package/.claude/agents/subagents/qe-code-reviewer.md +0 -4
- package/.claude/agents/subagents/qe-data-generator.md +0 -16
- package/.claude/agents/subagents/qe-integration-tester.md +0 -17
- package/.claude/agents/subagents/qe-performance-validator.md +0 -16
- package/.claude/agents/subagents/qe-security-auditor.md +0 -16
- package/.claude/agents/subagents/qe-test-implementer.md +0 -17
- package/.claude/agents/subagents/qe-test-refactorer.md +0 -17
- package/.claude/agents/subagents/qe-test-writer.md +0 -19
- package/CHANGELOG.md +261 -0
- package/README.md +37 -5
- package/dist/adapters/MemoryStoreAdapter.d.ts +38 -0
- package/dist/adapters/MemoryStoreAdapter.d.ts.map +1 -1
- package/dist/adapters/MemoryStoreAdapter.js +22 -0
- package/dist/adapters/MemoryStoreAdapter.js.map +1 -1
- package/dist/agents/BaseAgent.d.ts.map +1 -1
- package/dist/agents/BaseAgent.js +13 -0
- package/dist/agents/BaseAgent.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +32 -1
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/core/memory/AgentDBService.d.ts +33 -28
- package/dist/core/memory/AgentDBService.d.ts.map +1 -1
- package/dist/core/memory/AgentDBService.js +233 -290
- package/dist/core/memory/AgentDBService.js.map +1 -1
- package/dist/core/memory/EnhancedAgentDBService.d.ts.map +1 -1
- package/dist/core/memory/EnhancedAgentDBService.js +5 -3
- package/dist/core/memory/EnhancedAgentDBService.js.map +1 -1
- package/dist/core/memory/RealAgentDBAdapter.d.ts +9 -2
- package/dist/core/memory/RealAgentDBAdapter.d.ts.map +1 -1
- package/dist/core/memory/RealAgentDBAdapter.js +126 -100
- package/dist/core/memory/RealAgentDBAdapter.js.map +1 -1
- package/dist/core/memory/SwarmMemoryManager.d.ts +58 -0
- package/dist/core/memory/SwarmMemoryManager.d.ts.map +1 -1
- package/dist/core/memory/SwarmMemoryManager.js +176 -0
- package/dist/core/memory/SwarmMemoryManager.js.map +1 -1
- package/dist/core/memory/index.d.ts.map +1 -1
- package/dist/core/memory/index.js +2 -1
- package/dist/core/memory/index.js.map +1 -1
- package/dist/learning/LearningEngine.d.ts +14 -27
- package/dist/learning/LearningEngine.d.ts.map +1 -1
- package/dist/learning/LearningEngine.js +57 -119
- package/dist/learning/LearningEngine.js.map +1 -1
- package/dist/learning/index.d.ts +0 -1
- package/dist/learning/index.d.ts.map +1 -1
- package/dist/learning/index.js +0 -1
- package/dist/learning/index.js.map +1 -1
- package/dist/mcp/handlers/learning/learning-query.d.ts +34 -0
- package/dist/mcp/handlers/learning/learning-query.d.ts.map +1 -0
- package/dist/mcp/handlers/learning/learning-query.js +156 -0
- package/dist/mcp/handlers/learning/learning-query.js.map +1 -0
- package/dist/mcp/handlers/learning/learning-store-experience.d.ts +30 -0
- package/dist/mcp/handlers/learning/learning-store-experience.d.ts.map +1 -0
- package/dist/mcp/handlers/learning/learning-store-experience.js +86 -0
- package/dist/mcp/handlers/learning/learning-store-experience.js.map +1 -0
- package/dist/mcp/handlers/learning/learning-store-pattern.d.ts +31 -0
- package/dist/mcp/handlers/learning/learning-store-pattern.d.ts.map +1 -0
- package/dist/mcp/handlers/learning/learning-store-pattern.js +126 -0
- package/dist/mcp/handlers/learning/learning-store-pattern.js.map +1 -0
- package/dist/mcp/handlers/learning/learning-store-qvalue.d.ts +30 -0
- package/dist/mcp/handlers/learning/learning-store-qvalue.d.ts.map +1 -0
- package/dist/mcp/handlers/learning/learning-store-qvalue.js +100 -0
- package/dist/mcp/handlers/learning/learning-store-qvalue.js.map +1 -0
- package/dist/mcp/server.d.ts +11 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +98 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/services/LearningEventListener.d.ts +123 -0
- package/dist/mcp/services/LearningEventListener.d.ts.map +1 -0
- package/dist/mcp/services/LearningEventListener.js +322 -0
- package/dist/mcp/services/LearningEventListener.js.map +1 -0
- package/dist/mcp/tools.d.ts +4 -0
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +179 -0
- package/dist/mcp/tools.js.map +1 -1
- package/dist/types/memory-interfaces.d.ts +71 -0
- package/dist/types/memory-interfaces.d.ts.map +1 -1
- package/dist/utils/Calculator.d.ts +35 -0
- package/dist/utils/Calculator.d.ts.map +1 -0
- package/dist/utils/Calculator.js +50 -0
- package/dist/utils/Calculator.js.map +1 -0
- package/dist/utils/Logger.d.ts.map +1 -1
- package/dist/utils/Logger.js +4 -1
- package/dist/utils/Logger.js.map +1 -1
- package/package.json +7 -5
- package/.claude/agents/qe-api-contract-validator.md.backup +0 -1148
- package/.claude/agents/qe-api-contract-validator.md.backup-20251107-134747 +0 -1148
- package/.claude/agents/qe-api-contract-validator.md.backup-phase2-20251107-140039 +0 -1123
- package/.claude/agents/qe-chaos-engineer.md.backup +0 -808
- package/.claude/agents/qe-chaos-engineer.md.backup-20251107-134747 +0 -808
- package/.claude/agents/qe-chaos-engineer.md.backup-phase2-20251107-140039 +0 -787
- package/.claude/agents/qe-code-complexity.md.backup +0 -291
- package/.claude/agents/qe-code-complexity.md.backup-20251107-134747 +0 -291
- package/.claude/agents/qe-code-complexity.md.backup-phase2-20251107-140039 +0 -286
- package/.claude/agents/qe-coverage-analyzer.md.backup +0 -467
- package/.claude/agents/qe-coverage-analyzer.md.backup-20251107-134747 +0 -467
- package/.claude/agents/qe-coverage-analyzer.md.backup-phase2-20251107-140039 +0 -438
- package/.claude/agents/qe-deployment-readiness.md.backup +0 -1166
- package/.claude/agents/qe-deployment-readiness.md.backup-20251107-134747 +0 -1166
- package/.claude/agents/qe-deployment-readiness.md.backup-phase2-20251107-140039 +0 -1140
- package/.claude/agents/qe-flaky-test-hunter.md.backup +0 -1195
- package/.claude/agents/qe-flaky-test-hunter.md.backup-20251107-134747 +0 -1195
- package/.claude/agents/qe-flaky-test-hunter.md.backup-phase2-20251107-140039 +0 -1162
- package/.claude/agents/qe-fleet-commander.md.backup +0 -718
- package/.claude/agents/qe-fleet-commander.md.backup-20251107-134747 +0 -718
- package/.claude/agents/qe-fleet-commander.md.backup-phase2-20251107-140039 +0 -697
- package/.claude/agents/qe-performance-tester.md.backup +0 -428
- package/.claude/agents/qe-performance-tester.md.backup-20251107-134747 +0 -428
- package/.claude/agents/qe-performance-tester.md.backup-phase2-20251107-140039 +0 -372
- package/.claude/agents/qe-production-intelligence.md.backup +0 -1219
- package/.claude/agents/qe-production-intelligence.md.backup-20251107-134747 +0 -1219
- package/.claude/agents/qe-production-intelligence.md.backup-phase2-20251107-140039 +0 -1194
- package/.claude/agents/qe-quality-analyzer.md.backup +0 -425
- package/.claude/agents/qe-quality-analyzer.md.backup-20251107-134747 +0 -425
- package/.claude/agents/qe-quality-analyzer.md.backup-phase2-20251107-140039 +0 -394
- package/.claude/agents/qe-quality-gate.md.backup +0 -446
- package/.claude/agents/qe-quality-gate.md.backup-20251107-134747 +0 -446
- package/.claude/agents/qe-quality-gate.md.backup-phase2-20251107-140039 +0 -415
- package/.claude/agents/qe-regression-risk-analyzer.md.backup +0 -1009
- package/.claude/agents/qe-regression-risk-analyzer.md.backup-20251107-134747 +0 -1009
- package/.claude/agents/qe-regression-risk-analyzer.md.backup-phase2-20251107-140039 +0 -984
- package/.claude/agents/qe-requirements-validator.md.backup +0 -748
- package/.claude/agents/qe-requirements-validator.md.backup-20251107-134747 +0 -748
- package/.claude/agents/qe-requirements-validator.md.backup-phase2-20251107-140039 +0 -723
- package/.claude/agents/qe-security-scanner.md.backup +0 -634
- package/.claude/agents/qe-security-scanner.md.backup-20251107-134747 +0 -634
- package/.claude/agents/qe-security-scanner.md.backup-phase2-20251107-140039 +0 -573
- package/.claude/agents/qe-test-data-architect.md.backup +0 -1064
- package/.claude/agents/qe-test-data-architect.md.backup-20251107-134747 +0 -1064
- package/.claude/agents/qe-test-data-architect.md.backup-phase2-20251107-140039 +0 -1040
- package/.claude/agents/qe-test-executor.md.backup +0 -389
- package/.claude/agents/qe-test-executor.md.backup-20251107-134747 +0 -389
- package/.claude/agents/qe-test-executor.md.backup-phase2-20251107-140039 +0 -369
- package/.claude/agents/qe-test-generator.md.backup +0 -997
- package/.claude/agents/qe-test-generator.md.backup-20251107-134747 +0 -997
- package/.claude/agents/qe-visual-tester.md.backup +0 -777
- package/.claude/agents/qe-visual-tester.md.backup-20251107-134747 +0 -777
- 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 ||
|
|
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
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
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.
|
|
118
|
+
this.logger.log('[AgentDBService] Initialized successfully', {
|
|
113
119
|
dbPath: this.config.dbPath,
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
enableQuantization: this.config.enableQuantization
|
|
120
|
+
hnswEnabled: this.config.enableHNSW,
|
|
121
|
+
embeddingDim: this.config.embeddingDim
|
|
117
122
|
});
|
|
118
123
|
}
|
|
119
124
|
catch (error) {
|
|
120
|
-
|
|
125
|
+
this.logger.error('[AgentDBService] Initialization failed:', error);
|
|
126
|
+
throw error;
|
|
121
127
|
}
|
|
122
128
|
}
|
|
123
129
|
/**
|
|
124
|
-
*
|
|
130
|
+
* Create patterns table with vector embeddings
|
|
125
131
|
*/
|
|
126
|
-
async
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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
|
|
155
|
+
* Store a pattern with vector embedding
|
|
141
156
|
*/
|
|
142
157
|
async storePattern(pattern, embedding) {
|
|
143
158
|
this.ensureInitialized();
|
|
144
159
|
try {
|
|
145
|
-
const
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
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
|
-
//
|
|
151
|
-
|
|
152
|
-
|
|
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
|
|
197
|
-
throw
|
|
192
|
+
this.logger.error('[AgentDBService] Failed to store pattern:', error);
|
|
193
|
+
throw error;
|
|
198
194
|
}
|
|
199
195
|
}
|
|
200
196
|
/**
|
|
201
|
-
*
|
|
197
|
+
* Batch store patterns for better performance
|
|
202
198
|
*/
|
|
203
|
-
async
|
|
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
|
-
//
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
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:
|
|
214
|
+
index: i,
|
|
215
|
+
error: error instanceof Error ? error.message : String(error)
|
|
276
216
|
});
|
|
277
|
-
return null;
|
|
278
217
|
}
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
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
|
-
|
|
317
|
-
this.
|
|
318
|
-
|
|
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
|
-
*
|
|
239
|
+
* Search for similar patterns using HNSW or WASM vector search
|
|
328
240
|
*/
|
|
329
|
-
async
|
|
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
|
-
|
|
333
|
-
if
|
|
334
|
-
|
|
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
|
|
297
|
+
return results;
|
|
337
298
|
}
|
|
338
299
|
catch (error) {
|
|
339
|
-
this.logger.error('
|
|
340
|
-
throw
|
|
300
|
+
this.logger.error('[AgentDBService] Pattern search failed:', error);
|
|
301
|
+
throw error;
|
|
341
302
|
}
|
|
342
303
|
}
|
|
343
304
|
/**
|
|
344
|
-
* Get
|
|
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
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
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.
|
|
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
|
|
361
|
+
* Close database and cleanup
|
|
379
362
|
*/
|
|
380
363
|
async close() {
|
|
381
|
-
if (
|
|
382
|
-
|
|
364
|
+
if (this.hnswIndex) {
|
|
365
|
+
this.hnswIndex.clear();
|
|
383
366
|
}
|
|
384
|
-
|
|
385
|
-
this.
|
|
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
|
-
|
|
391
|
-
|
|
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
|
|
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
|
-
*
|
|
386
|
+
* Factory function to create and initialize AgentDBService
|
|
435
387
|
*/
|
|
436
|
-
function createAgentDBService(
|
|
437
|
-
const
|
|
438
|
-
|
|
439
|
-
|
|
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
|