agentic-flow 2.0.1-alpha.12 → 2.0.1-alpha.14
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 +48 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/cli/commands/hooks.d.ts.map +1 -1
- package/dist/cli/commands/hooks.js +6 -1
- package/dist/cli/commands/hooks.js.map +1 -1
- package/dist/intelligence/EmbeddingService.d.ts +95 -0
- package/dist/intelligence/EmbeddingService.d.ts.map +1 -0
- package/dist/intelligence/EmbeddingService.js +297 -0
- package/dist/intelligence/EmbeddingService.js.map +1 -0
- package/dist/intelligence/IntelligenceStore.d.ts +168 -0
- package/dist/intelligence/IntelligenceStore.d.ts.map +1 -0
- package/dist/intelligence/IntelligenceStore.js +364 -0
- package/dist/intelligence/IntelligenceStore.js.map +1 -0
- package/dist/intelligence/embedding-benchmark.d.ts +7 -0
- package/dist/intelligence/embedding-benchmark.d.ts.map +1 -0
- package/dist/intelligence/embedding-benchmark.js +151 -0
- package/dist/intelligence/embedding-benchmark.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.d.ts +13 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.d.ts.map +1 -1
- package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.js +48 -21
- package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.js.map +1 -1
- package/dist/mcp/fastmcp/tools/hooks/intelligence-tools.d.ts.map +1 -1
- package/dist/mcp/fastmcp/tools/hooks/intelligence-tools.js +8 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-tools.js.map +1 -1
- package/package.json +3 -1
- package/wasm/reasoningbank/reasoningbank_wasm_bg.js +2 -2
- package/wasm/reasoningbank/reasoningbank_wasm_bg.wasm +0 -0
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IntelligenceStore - SQLite persistence for RuVector intelligence layer
|
|
3
|
+
*
|
|
4
|
+
* Cross-platform (Linux, macOS, Windows) persistent storage for:
|
|
5
|
+
* - Learning trajectories
|
|
6
|
+
* - Routing patterns
|
|
7
|
+
* - SONA adaptations
|
|
8
|
+
* - HNSW vectors
|
|
9
|
+
*/
|
|
10
|
+
import Database from 'better-sqlite3';
|
|
11
|
+
import { existsSync, mkdirSync } from 'fs';
|
|
12
|
+
import { dirname, join } from 'path';
|
|
13
|
+
import { homedir } from 'os';
|
|
14
|
+
export class IntelligenceStore {
|
|
15
|
+
db;
|
|
16
|
+
static instance = null;
|
|
17
|
+
constructor(dbPath) {
|
|
18
|
+
// Ensure directory exists
|
|
19
|
+
const dir = dirname(dbPath);
|
|
20
|
+
if (!existsSync(dir)) {
|
|
21
|
+
mkdirSync(dir, { recursive: true });
|
|
22
|
+
}
|
|
23
|
+
this.db = new Database(dbPath);
|
|
24
|
+
this.db.pragma('journal_mode = WAL'); // Better concurrent access
|
|
25
|
+
this.db.pragma('synchronous = NORMAL'); // Good balance of speed/safety
|
|
26
|
+
this.initSchema();
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Get singleton instance
|
|
30
|
+
*/
|
|
31
|
+
static getInstance(dbPath) {
|
|
32
|
+
if (!IntelligenceStore.instance) {
|
|
33
|
+
const path = dbPath || IntelligenceStore.getDefaultPath();
|
|
34
|
+
IntelligenceStore.instance = new IntelligenceStore(path);
|
|
35
|
+
}
|
|
36
|
+
return IntelligenceStore.instance;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Get default database path (cross-platform)
|
|
40
|
+
*/
|
|
41
|
+
static getDefaultPath() {
|
|
42
|
+
// Check for project-local .agentic-flow directory first
|
|
43
|
+
const localPath = join(process.cwd(), '.agentic-flow', 'intelligence.db');
|
|
44
|
+
const localDir = dirname(localPath);
|
|
45
|
+
if (existsSync(localDir)) {
|
|
46
|
+
return localPath;
|
|
47
|
+
}
|
|
48
|
+
// Fall back to home directory
|
|
49
|
+
const homeDir = homedir();
|
|
50
|
+
return join(homeDir, '.agentic-flow', 'intelligence.db');
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Initialize database schema
|
|
54
|
+
*/
|
|
55
|
+
initSchema() {
|
|
56
|
+
this.db.exec(`
|
|
57
|
+
-- Trajectories table
|
|
58
|
+
CREATE TABLE IF NOT EXISTS trajectories (
|
|
59
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
60
|
+
task_description TEXT NOT NULL,
|
|
61
|
+
agent TEXT NOT NULL,
|
|
62
|
+
steps INTEGER DEFAULT 0,
|
|
63
|
+
outcome TEXT DEFAULT 'partial',
|
|
64
|
+
start_time INTEGER NOT NULL,
|
|
65
|
+
end_time INTEGER,
|
|
66
|
+
metadata TEXT,
|
|
67
|
+
created_at INTEGER DEFAULT (strftime('%s', 'now'))
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
-- Patterns table (for ReasoningBank)
|
|
71
|
+
CREATE TABLE IF NOT EXISTS patterns (
|
|
72
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
73
|
+
task_type TEXT NOT NULL,
|
|
74
|
+
approach TEXT NOT NULL,
|
|
75
|
+
embedding BLOB,
|
|
76
|
+
similarity REAL DEFAULT 0,
|
|
77
|
+
usage_count INTEGER DEFAULT 0,
|
|
78
|
+
success_rate REAL DEFAULT 0,
|
|
79
|
+
created_at INTEGER DEFAULT (strftime('%s', 'now')),
|
|
80
|
+
updated_at INTEGER DEFAULT (strftime('%s', 'now'))
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
-- Routings table
|
|
84
|
+
CREATE TABLE IF NOT EXISTS routings (
|
|
85
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
86
|
+
task TEXT NOT NULL,
|
|
87
|
+
recommended_agent TEXT NOT NULL,
|
|
88
|
+
confidence REAL NOT NULL,
|
|
89
|
+
latency_ms INTEGER NOT NULL,
|
|
90
|
+
was_successful INTEGER DEFAULT 0,
|
|
91
|
+
timestamp INTEGER DEFAULT (strftime('%s', 'now'))
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
-- Stats table (single row)
|
|
95
|
+
CREATE TABLE IF NOT EXISTS stats (
|
|
96
|
+
id INTEGER PRIMARY KEY CHECK (id = 1),
|
|
97
|
+
total_trajectories INTEGER DEFAULT 0,
|
|
98
|
+
successful_trajectories INTEGER DEFAULT 0,
|
|
99
|
+
total_routings INTEGER DEFAULT 0,
|
|
100
|
+
successful_routings INTEGER DEFAULT 0,
|
|
101
|
+
total_patterns INTEGER DEFAULT 0,
|
|
102
|
+
sona_adaptations INTEGER DEFAULT 0,
|
|
103
|
+
hnsw_queries INTEGER DEFAULT 0,
|
|
104
|
+
last_updated INTEGER DEFAULT (strftime('%s', 'now'))
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
-- Initialize stats row if not exists
|
|
108
|
+
INSERT OR IGNORE INTO stats (id) VALUES (1);
|
|
109
|
+
|
|
110
|
+
-- Indexes for faster queries
|
|
111
|
+
CREATE INDEX IF NOT EXISTS idx_trajectories_agent ON trajectories(agent);
|
|
112
|
+
CREATE INDEX IF NOT EXISTS idx_trajectories_outcome ON trajectories(outcome);
|
|
113
|
+
CREATE INDEX IF NOT EXISTS idx_patterns_task_type ON patterns(task_type);
|
|
114
|
+
CREATE INDEX IF NOT EXISTS idx_routings_agent ON routings(recommended_agent);
|
|
115
|
+
CREATE INDEX IF NOT EXISTS idx_routings_timestamp ON routings(timestamp);
|
|
116
|
+
`);
|
|
117
|
+
}
|
|
118
|
+
// ============ Trajectory Methods ============
|
|
119
|
+
/**
|
|
120
|
+
* Start a new trajectory
|
|
121
|
+
*/
|
|
122
|
+
startTrajectory(taskDescription, agent) {
|
|
123
|
+
const stmt = this.db.prepare(`
|
|
124
|
+
INSERT INTO trajectories (task_description, agent, start_time)
|
|
125
|
+
VALUES (?, ?, ?)
|
|
126
|
+
`);
|
|
127
|
+
const result = stmt.run(taskDescription, agent, Date.now());
|
|
128
|
+
this.incrementStat('total_trajectories');
|
|
129
|
+
return result.lastInsertRowid;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Add step to trajectory
|
|
133
|
+
*/
|
|
134
|
+
addTrajectoryStep(trajectoryId) {
|
|
135
|
+
const stmt = this.db.prepare(`
|
|
136
|
+
UPDATE trajectories SET steps = steps + 1 WHERE id = ?
|
|
137
|
+
`);
|
|
138
|
+
stmt.run(trajectoryId);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* End trajectory with outcome
|
|
142
|
+
*/
|
|
143
|
+
endTrajectory(trajectoryId, outcome, metadata) {
|
|
144
|
+
const stmt = this.db.prepare(`
|
|
145
|
+
UPDATE trajectories
|
|
146
|
+
SET outcome = ?, end_time = ?, metadata = ?
|
|
147
|
+
WHERE id = ?
|
|
148
|
+
`);
|
|
149
|
+
stmt.run(outcome, Date.now(), metadata ? JSON.stringify(metadata) : null, trajectoryId);
|
|
150
|
+
if (outcome === 'success') {
|
|
151
|
+
this.incrementStat('successful_trajectories');
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Get active trajectories (no end_time)
|
|
156
|
+
*/
|
|
157
|
+
getActiveTrajectories() {
|
|
158
|
+
const stmt = this.db.prepare(`
|
|
159
|
+
SELECT * FROM trajectories WHERE end_time IS NULL
|
|
160
|
+
`);
|
|
161
|
+
return stmt.all();
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Get recent trajectories
|
|
165
|
+
*/
|
|
166
|
+
getRecentTrajectories(limit = 10) {
|
|
167
|
+
const stmt = this.db.prepare(`
|
|
168
|
+
SELECT * FROM trajectories ORDER BY start_time DESC LIMIT ?
|
|
169
|
+
`);
|
|
170
|
+
return stmt.all(limit);
|
|
171
|
+
}
|
|
172
|
+
// ============ Pattern Methods ============
|
|
173
|
+
/**
|
|
174
|
+
* Store a pattern
|
|
175
|
+
*/
|
|
176
|
+
storePattern(taskType, approach, embedding) {
|
|
177
|
+
const stmt = this.db.prepare(`
|
|
178
|
+
INSERT INTO patterns (task_type, approach, embedding)
|
|
179
|
+
VALUES (?, ?, ?)
|
|
180
|
+
`);
|
|
181
|
+
const embeddingBuffer = embedding ? Buffer.from(embedding.buffer) : null;
|
|
182
|
+
const result = stmt.run(taskType, approach, embeddingBuffer);
|
|
183
|
+
this.incrementStat('total_patterns');
|
|
184
|
+
return result.lastInsertRowid;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Update pattern usage
|
|
188
|
+
*/
|
|
189
|
+
updatePatternUsage(patternId, wasSuccessful) {
|
|
190
|
+
const stmt = this.db.prepare(`
|
|
191
|
+
UPDATE patterns
|
|
192
|
+
SET usage_count = usage_count + 1,
|
|
193
|
+
success_rate = (success_rate * usage_count + ?) / (usage_count + 1),
|
|
194
|
+
updated_at = strftime('%s', 'now')
|
|
195
|
+
WHERE id = ?
|
|
196
|
+
`);
|
|
197
|
+
stmt.run(wasSuccessful ? 1 : 0, patternId);
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Find patterns by task type
|
|
201
|
+
*/
|
|
202
|
+
findPatterns(taskType, limit = 5) {
|
|
203
|
+
const stmt = this.db.prepare(`
|
|
204
|
+
SELECT * FROM patterns
|
|
205
|
+
WHERE task_type LIKE ?
|
|
206
|
+
ORDER BY success_rate DESC, usage_count DESC
|
|
207
|
+
LIMIT ?
|
|
208
|
+
`);
|
|
209
|
+
return stmt.all(`%${taskType}%`, limit);
|
|
210
|
+
}
|
|
211
|
+
// ============ Routing Methods ============
|
|
212
|
+
/**
|
|
213
|
+
* Record a routing decision
|
|
214
|
+
*/
|
|
215
|
+
recordRouting(task, recommendedAgent, confidence, latencyMs) {
|
|
216
|
+
const stmt = this.db.prepare(`
|
|
217
|
+
INSERT INTO routings (task, recommended_agent, confidence, latency_ms)
|
|
218
|
+
VALUES (?, ?, ?, ?)
|
|
219
|
+
`);
|
|
220
|
+
const result = stmt.run(task, recommendedAgent, confidence, latencyMs);
|
|
221
|
+
this.incrementStat('total_routings');
|
|
222
|
+
return result.lastInsertRowid;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Update routing outcome
|
|
226
|
+
*/
|
|
227
|
+
updateRoutingOutcome(routingId, wasSuccessful) {
|
|
228
|
+
const stmt = this.db.prepare(`
|
|
229
|
+
UPDATE routings SET was_successful = ? WHERE id = ?
|
|
230
|
+
`);
|
|
231
|
+
stmt.run(wasSuccessful ? 1 : 0, routingId);
|
|
232
|
+
if (wasSuccessful) {
|
|
233
|
+
this.incrementStat('successful_routings');
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Get routing accuracy for an agent
|
|
238
|
+
*/
|
|
239
|
+
getAgentAccuracy(agent) {
|
|
240
|
+
const stmt = this.db.prepare(`
|
|
241
|
+
SELECT
|
|
242
|
+
COUNT(*) as total,
|
|
243
|
+
SUM(was_successful) as successful
|
|
244
|
+
FROM routings
|
|
245
|
+
WHERE recommended_agent = ?
|
|
246
|
+
`);
|
|
247
|
+
const result = stmt.get(agent);
|
|
248
|
+
return {
|
|
249
|
+
total: result.total || 0,
|
|
250
|
+
successful: result.successful || 0,
|
|
251
|
+
accuracy: result.total > 0 ? (result.successful || 0) / result.total : 0,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
// ============ Stats Methods ============
|
|
255
|
+
/**
|
|
256
|
+
* Get all stats
|
|
257
|
+
*/
|
|
258
|
+
getStats() {
|
|
259
|
+
const stmt = this.db.prepare(`SELECT * FROM stats WHERE id = 1`);
|
|
260
|
+
const row = stmt.get();
|
|
261
|
+
return {
|
|
262
|
+
totalTrajectories: row?.total_trajectories || 0,
|
|
263
|
+
successfulTrajectories: row?.successful_trajectories || 0,
|
|
264
|
+
totalRoutings: row?.total_routings || 0,
|
|
265
|
+
successfulRoutings: row?.successful_routings || 0,
|
|
266
|
+
totalPatterns: row?.total_patterns || 0,
|
|
267
|
+
sonaAdaptations: row?.sona_adaptations || 0,
|
|
268
|
+
hnswQueries: row?.hnsw_queries || 0,
|
|
269
|
+
lastUpdated: row?.last_updated || Date.now(),
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Increment a stat counter
|
|
274
|
+
*/
|
|
275
|
+
incrementStat(statName, amount = 1) {
|
|
276
|
+
const stmt = this.db.prepare(`
|
|
277
|
+
UPDATE stats SET ${statName} = ${statName} + ?, last_updated = strftime('%s', 'now')
|
|
278
|
+
WHERE id = 1
|
|
279
|
+
`);
|
|
280
|
+
stmt.run(amount);
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Record SONA adaptation
|
|
284
|
+
*/
|
|
285
|
+
recordSonaAdaptation() {
|
|
286
|
+
this.incrementStat('sona_adaptations');
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Record HNSW query
|
|
290
|
+
*/
|
|
291
|
+
recordHnswQuery() {
|
|
292
|
+
this.incrementStat('hnsw_queries');
|
|
293
|
+
}
|
|
294
|
+
// ============ Utility Methods ============
|
|
295
|
+
/**
|
|
296
|
+
* Get summary for display (simplified for UI)
|
|
297
|
+
*/
|
|
298
|
+
getSummary() {
|
|
299
|
+
const stats = this.getStats();
|
|
300
|
+
return {
|
|
301
|
+
trajectories: stats.totalTrajectories,
|
|
302
|
+
routings: stats.totalRoutings,
|
|
303
|
+
patterns: stats.totalPatterns,
|
|
304
|
+
operations: stats.sonaAdaptations + stats.hnswQueries,
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Get detailed summary for reports
|
|
309
|
+
*/
|
|
310
|
+
getDetailedSummary() {
|
|
311
|
+
const stats = this.getStats();
|
|
312
|
+
const activeCount = this.getActiveTrajectories().length;
|
|
313
|
+
return {
|
|
314
|
+
trajectories: {
|
|
315
|
+
total: stats.totalTrajectories,
|
|
316
|
+
active: activeCount,
|
|
317
|
+
successful: stats.successfulTrajectories,
|
|
318
|
+
},
|
|
319
|
+
routings: {
|
|
320
|
+
total: stats.totalRoutings,
|
|
321
|
+
accuracy: stats.totalRoutings > 0
|
|
322
|
+
? stats.successfulRoutings / stats.totalRoutings
|
|
323
|
+
: 0,
|
|
324
|
+
},
|
|
325
|
+
patterns: stats.totalPatterns,
|
|
326
|
+
operations: {
|
|
327
|
+
sona: stats.sonaAdaptations,
|
|
328
|
+
hnsw: stats.hnswQueries,
|
|
329
|
+
},
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Close database connection
|
|
334
|
+
*/
|
|
335
|
+
close() {
|
|
336
|
+
this.db.close();
|
|
337
|
+
IntelligenceStore.instance = null;
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Reset all data (for testing)
|
|
341
|
+
*/
|
|
342
|
+
reset() {
|
|
343
|
+
this.db.exec(`
|
|
344
|
+
DELETE FROM trajectories;
|
|
345
|
+
DELETE FROM patterns;
|
|
346
|
+
DELETE FROM routings;
|
|
347
|
+
UPDATE stats SET
|
|
348
|
+
total_trajectories = 0,
|
|
349
|
+
successful_trajectories = 0,
|
|
350
|
+
total_routings = 0,
|
|
351
|
+
successful_routings = 0,
|
|
352
|
+
total_patterns = 0,
|
|
353
|
+
sona_adaptations = 0,
|
|
354
|
+
hnsw_queries = 0,
|
|
355
|
+
last_updated = strftime('%s', 'now')
|
|
356
|
+
WHERE id = 1;
|
|
357
|
+
`);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
// Export singleton getter
|
|
361
|
+
export function getIntelligenceStore(dbPath) {
|
|
362
|
+
return IntelligenceStore.getInstance(dbPath);
|
|
363
|
+
}
|
|
364
|
+
//# sourceMappingURL=IntelligenceStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IntelligenceStore.js","sourceRoot":"","sources":["../../src/intelligence/IntelligenceStore.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * IntelligenceStore - SQLite persistence for RuVector intelligence layer\n *\n * Cross-platform (Linux, macOS, Windows) persistent storage for:\n * - Learning trajectories\n * - Routing patterns\n * - SONA adaptations\n * - HNSW vectors\n */\n\nimport Database from 'better-sqlite3';\nimport { existsSync, mkdirSync } from 'fs';\nimport { dirname, join } from 'path';\nimport { homedir } from 'os';\n\nexport interface StoredTrajectory {\n id: number;\n taskDescription: string;\n agent: string;\n steps: number;\n outcome: 'success' | 'failure' | 'partial';\n startTime: number;\n endTime: number;\n metadata?: string; // JSON\n}\n\nexport interface StoredPattern {\n id: number;\n taskType: string;\n approach: string;\n embedding: Buffer; // Float32Array as Buffer\n similarity: number;\n usageCount: number;\n successRate: number;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface StoredRouting {\n id: number;\n task: string;\n recommendedAgent: string;\n confidence: number;\n latencyMs: number;\n wasSuccessful: boolean;\n timestamp: number;\n}\n\nexport interface LearningStats {\n totalTrajectories: number;\n successfulTrajectories: number;\n totalRoutings: number;\n successfulRoutings: number;\n totalPatterns: number;\n sonaAdaptations: number;\n hnswQueries: number;\n lastUpdated: number;\n}\n\nexport class IntelligenceStore {\n private db: Database.Database;\n private static instance: IntelligenceStore | null = null;\n\n private constructor(dbPath: string) {\n // Ensure directory exists\n const dir = dirname(dbPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n this.db = new Database(dbPath);\n this.db.pragma('journal_mode = WAL'); // Better concurrent access\n this.db.pragma('synchronous = NORMAL'); // Good balance of speed/safety\n\n this.initSchema();\n }\n\n /**\n * Get singleton instance\n */\n static getInstance(dbPath?: string): IntelligenceStore {\n if (!IntelligenceStore.instance) {\n const path = dbPath || IntelligenceStore.getDefaultPath();\n IntelligenceStore.instance = new IntelligenceStore(path);\n }\n return IntelligenceStore.instance;\n }\n\n /**\n * Get default database path (cross-platform)\n */\n static getDefaultPath(): string {\n // Check for project-local .agentic-flow directory first\n const localPath = join(process.cwd(), '.agentic-flow', 'intelligence.db');\n const localDir = dirname(localPath);\n\n if (existsSync(localDir)) {\n return localPath;\n }\n\n // Fall back to home directory\n const homeDir = homedir();\n return join(homeDir, '.agentic-flow', 'intelligence.db');\n }\n\n /**\n * Initialize database schema\n */\n private initSchema(): void {\n this.db.exec(`\n -- Trajectories table\n CREATE TABLE IF NOT EXISTS trajectories (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n task_description TEXT NOT NULL,\n agent TEXT NOT NULL,\n steps INTEGER DEFAULT 0,\n outcome TEXT DEFAULT 'partial',\n start_time INTEGER NOT NULL,\n end_time INTEGER,\n metadata TEXT,\n created_at INTEGER DEFAULT (strftime('%s', 'now'))\n );\n\n -- Patterns table (for ReasoningBank)\n CREATE TABLE IF NOT EXISTS patterns (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n task_type TEXT NOT NULL,\n approach TEXT NOT NULL,\n embedding BLOB,\n similarity REAL DEFAULT 0,\n usage_count INTEGER DEFAULT 0,\n success_rate REAL DEFAULT 0,\n created_at INTEGER DEFAULT (strftime('%s', 'now')),\n updated_at INTEGER DEFAULT (strftime('%s', 'now'))\n );\n\n -- Routings table\n CREATE TABLE IF NOT EXISTS routings (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n task TEXT NOT NULL,\n recommended_agent TEXT NOT NULL,\n confidence REAL NOT NULL,\n latency_ms INTEGER NOT NULL,\n was_successful INTEGER DEFAULT 0,\n timestamp INTEGER DEFAULT (strftime('%s', 'now'))\n );\n\n -- Stats table (single row)\n CREATE TABLE IF NOT EXISTS stats (\n id INTEGER PRIMARY KEY CHECK (id = 1),\n total_trajectories INTEGER DEFAULT 0,\n successful_trajectories INTEGER DEFAULT 0,\n total_routings INTEGER DEFAULT 0,\n successful_routings INTEGER DEFAULT 0,\n total_patterns INTEGER DEFAULT 0,\n sona_adaptations INTEGER DEFAULT 0,\n hnsw_queries INTEGER DEFAULT 0,\n last_updated INTEGER DEFAULT (strftime('%s', 'now'))\n );\n\n -- Initialize stats row if not exists\n INSERT OR IGNORE INTO stats (id) VALUES (1);\n\n -- Indexes for faster queries\n CREATE INDEX IF NOT EXISTS idx_trajectories_agent ON trajectories(agent);\n CREATE INDEX IF NOT EXISTS idx_trajectories_outcome ON trajectories(outcome);\n CREATE INDEX IF NOT EXISTS idx_patterns_task_type ON patterns(task_type);\n CREATE INDEX IF NOT EXISTS idx_routings_agent ON routings(recommended_agent);\n CREATE INDEX IF NOT EXISTS idx_routings_timestamp ON routings(timestamp);\n `);\n }\n\n // ============ Trajectory Methods ============\n\n /**\n * Start a new trajectory\n */\n startTrajectory(taskDescription: string, agent: string): number {\n const stmt = this.db.prepare(`\n INSERT INTO trajectories (task_description, agent, start_time)\n VALUES (?, ?, ?)\n `);\n const result = stmt.run(taskDescription, agent, Date.now());\n\n this.incrementStat('total_trajectories');\n\n return result.lastInsertRowid as number;\n }\n\n /**\n * Add step to trajectory\n */\n addTrajectoryStep(trajectoryId: number): void {\n const stmt = this.db.prepare(`\n UPDATE trajectories SET steps = steps + 1 WHERE id = ?\n `);\n stmt.run(trajectoryId);\n }\n\n /**\n * End trajectory with outcome\n */\n endTrajectory(trajectoryId: number, outcome: 'success' | 'failure' | 'partial', metadata?: Record<string, any>): void {\n const stmt = this.db.prepare(`\n UPDATE trajectories\n SET outcome = ?, end_time = ?, metadata = ?\n WHERE id = ?\n `);\n stmt.run(outcome, Date.now(), metadata ? JSON.stringify(metadata) : null, trajectoryId);\n\n if (outcome === 'success') {\n this.incrementStat('successful_trajectories');\n }\n }\n\n /**\n * Get active trajectories (no end_time)\n */\n getActiveTrajectories(): StoredTrajectory[] {\n const stmt = this.db.prepare(`\n SELECT * FROM trajectories WHERE end_time IS NULL\n `);\n return stmt.all() as StoredTrajectory[];\n }\n\n /**\n * Get recent trajectories\n */\n getRecentTrajectories(limit: number = 10): StoredTrajectory[] {\n const stmt = this.db.prepare(`\n SELECT * FROM trajectories ORDER BY start_time DESC LIMIT ?\n `);\n return stmt.all(limit) as StoredTrajectory[];\n }\n\n // ============ Pattern Methods ============\n\n /**\n * Store a pattern\n */\n storePattern(taskType: string, approach: string, embedding?: Float32Array): number {\n const stmt = this.db.prepare(`\n INSERT INTO patterns (task_type, approach, embedding)\n VALUES (?, ?, ?)\n `);\n const embeddingBuffer = embedding ? Buffer.from(embedding.buffer) : null;\n const result = stmt.run(taskType, approach, embeddingBuffer);\n\n this.incrementStat('total_patterns');\n\n return result.lastInsertRowid as number;\n }\n\n /**\n * Update pattern usage\n */\n updatePatternUsage(patternId: number, wasSuccessful: boolean): void {\n const stmt = this.db.prepare(`\n UPDATE patterns\n SET usage_count = usage_count + 1,\n success_rate = (success_rate * usage_count + ?) / (usage_count + 1),\n updated_at = strftime('%s', 'now')\n WHERE id = ?\n `);\n stmt.run(wasSuccessful ? 1 : 0, patternId);\n }\n\n /**\n * Find patterns by task type\n */\n findPatterns(taskType: string, limit: number = 5): StoredPattern[] {\n const stmt = this.db.prepare(`\n SELECT * FROM patterns\n WHERE task_type LIKE ?\n ORDER BY success_rate DESC, usage_count DESC\n LIMIT ?\n `);\n return stmt.all(`%${taskType}%`, limit) as StoredPattern[];\n }\n\n // ============ Routing Methods ============\n\n /**\n * Record a routing decision\n */\n recordRouting(task: string, recommendedAgent: string, confidence: number, latencyMs: number): number {\n const stmt = this.db.prepare(`\n INSERT INTO routings (task, recommended_agent, confidence, latency_ms)\n VALUES (?, ?, ?, ?)\n `);\n const result = stmt.run(task, recommendedAgent, confidence, latencyMs);\n\n this.incrementStat('total_routings');\n\n return result.lastInsertRowid as number;\n }\n\n /**\n * Update routing outcome\n */\n updateRoutingOutcome(routingId: number, wasSuccessful: boolean): void {\n const stmt = this.db.prepare(`\n UPDATE routings SET was_successful = ? WHERE id = ?\n `);\n stmt.run(wasSuccessful ? 1 : 0, routingId);\n\n if (wasSuccessful) {\n this.incrementStat('successful_routings');\n }\n }\n\n /**\n * Get routing accuracy for an agent\n */\n getAgentAccuracy(agent: string): { total: number; successful: number; accuracy: number } {\n const stmt = this.db.prepare(`\n SELECT\n COUNT(*) as total,\n SUM(was_successful) as successful\n FROM routings\n WHERE recommended_agent = ?\n `);\n const result = stmt.get(agent) as { total: number; successful: number };\n return {\n total: result.total || 0,\n successful: result.successful || 0,\n accuracy: result.total > 0 ? (result.successful || 0) / result.total : 0,\n };\n }\n\n // ============ Stats Methods ============\n\n /**\n * Get all stats\n */\n getStats(): LearningStats {\n const stmt = this.db.prepare(`SELECT * FROM stats WHERE id = 1`);\n const row = stmt.get() as any;\n\n return {\n totalTrajectories: row?.total_trajectories || 0,\n successfulTrajectories: row?.successful_trajectories || 0,\n totalRoutings: row?.total_routings || 0,\n successfulRoutings: row?.successful_routings || 0,\n totalPatterns: row?.total_patterns || 0,\n sonaAdaptations: row?.sona_adaptations || 0,\n hnswQueries: row?.hnsw_queries || 0,\n lastUpdated: row?.last_updated || Date.now(),\n };\n }\n\n /**\n * Increment a stat counter\n */\n incrementStat(statName: string, amount: number = 1): void {\n const stmt = this.db.prepare(`\n UPDATE stats SET ${statName} = ${statName} + ?, last_updated = strftime('%s', 'now')\n WHERE id = 1\n `);\n stmt.run(amount);\n }\n\n /**\n * Record SONA adaptation\n */\n recordSonaAdaptation(): void {\n this.incrementStat('sona_adaptations');\n }\n\n /**\n * Record HNSW query\n */\n recordHnswQuery(): void {\n this.incrementStat('hnsw_queries');\n }\n\n // ============ Utility Methods ============\n\n /**\n * Get summary for display (simplified for UI)\n */\n getSummary(): {\n trajectories: number;\n routings: number;\n patterns: number;\n operations: number;\n } {\n const stats = this.getStats();\n\n return {\n trajectories: stats.totalTrajectories,\n routings: stats.totalRoutings,\n patterns: stats.totalPatterns,\n operations: stats.sonaAdaptations + stats.hnswQueries,\n };\n }\n\n /**\n * Get detailed summary for reports\n */\n getDetailedSummary(): {\n trajectories: { total: number; active: number; successful: number };\n routings: { total: number; accuracy: number };\n patterns: number;\n operations: { sona: number; hnsw: number };\n } {\n const stats = this.getStats();\n const activeCount = this.getActiveTrajectories().length;\n\n return {\n trajectories: {\n total: stats.totalTrajectories,\n active: activeCount,\n successful: stats.successfulTrajectories,\n },\n routings: {\n total: stats.totalRoutings,\n accuracy: stats.totalRoutings > 0\n ? stats.successfulRoutings / stats.totalRoutings\n : 0,\n },\n patterns: stats.totalPatterns,\n operations: {\n sona: stats.sonaAdaptations,\n hnsw: stats.hnswQueries,\n },\n };\n }\n\n /**\n * Close database connection\n */\n close(): void {\n this.db.close();\n IntelligenceStore.instance = null;\n }\n\n /**\n * Reset all data (for testing)\n */\n reset(): void {\n this.db.exec(`\n DELETE FROM trajectories;\n DELETE FROM patterns;\n DELETE FROM routings;\n UPDATE stats SET\n total_trajectories = 0,\n successful_trajectories = 0,\n total_routings = 0,\n successful_routings = 0,\n total_patterns = 0,\n sona_adaptations = 0,\n hnsw_queries = 0,\n last_updated = strftime('%s', 'now')\n WHERE id = 1;\n `);\n }\n}\n\n// Export singleton getter\nexport function getIntelligenceStore(dbPath?: string): IntelligenceStore {\n return IntelligenceStore.getInstance(dbPath);\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-benchmark.d.ts","sourceRoot":"","sources":["../../src/intelligence/embedding-benchmark.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding Benchmark - Compare simple vs ONNX embeddings
|
|
3
|
+
*
|
|
4
|
+
* Run with: npx ts-node src/intelligence/embedding-benchmark.ts
|
|
5
|
+
*/
|
|
6
|
+
import { getEmbeddingService, EmbeddingService } from './EmbeddingService.js';
|
|
7
|
+
const TEST_TEXTS = [
|
|
8
|
+
'Fix a bug in the authentication system',
|
|
9
|
+
'Implement user login functionality',
|
|
10
|
+
'Write unit tests for the API',
|
|
11
|
+
'Refactor the database layer',
|
|
12
|
+
'Optimize memory usage',
|
|
13
|
+
'Add dark mode to the UI',
|
|
14
|
+
'Deploy to production',
|
|
15
|
+
'Review pull request',
|
|
16
|
+
'Document the API endpoints',
|
|
17
|
+
'Set up CI/CD pipeline',
|
|
18
|
+
];
|
|
19
|
+
const SEMANTIC_PAIRS = [
|
|
20
|
+
{ a: 'I love dogs', b: 'I adore puppies', expected: 'high' },
|
|
21
|
+
{ a: 'Fix authentication bug', b: 'Repair login issue', expected: 'high' },
|
|
22
|
+
{ a: 'Write unit tests', b: 'Create test cases', expected: 'high' },
|
|
23
|
+
{ a: 'Deploy to production', b: 'The weather is nice', expected: 'low' },
|
|
24
|
+
{ a: 'Fix bug', b: 'Add feature', expected: 'medium' },
|
|
25
|
+
{ a: 'Machine learning', b: 'Artificial intelligence', expected: 'high' },
|
|
26
|
+
{ a: 'Pizza recipe', b: 'Quantum physics', expected: 'low' },
|
|
27
|
+
];
|
|
28
|
+
async function runBenchmark() {
|
|
29
|
+
console.log('='.repeat(60));
|
|
30
|
+
console.log('Embedding Benchmark: Simple vs ONNX');
|
|
31
|
+
console.log('='.repeat(60));
|
|
32
|
+
// Benchmark Simple Embeddings
|
|
33
|
+
console.log('\n--- Simple Embeddings ---');
|
|
34
|
+
process.env.AGENTIC_FLOW_EMBEDDINGS = 'simple';
|
|
35
|
+
EmbeddingService.reset();
|
|
36
|
+
const simpleService = getEmbeddingService();
|
|
37
|
+
const simpleResults = await benchmarkService(simpleService, 'simple');
|
|
38
|
+
// Benchmark ONNX Embeddings
|
|
39
|
+
console.log('\n--- ONNX Embeddings ---');
|
|
40
|
+
process.env.AGENTIC_FLOW_EMBEDDINGS = 'onnx';
|
|
41
|
+
EmbeddingService.reset();
|
|
42
|
+
const onnxService = getEmbeddingService();
|
|
43
|
+
const onnxResults = await benchmarkService(onnxService, 'onnx');
|
|
44
|
+
// Summary
|
|
45
|
+
console.log('\n' + '='.repeat(60));
|
|
46
|
+
console.log('SUMMARY');
|
|
47
|
+
console.log('='.repeat(60));
|
|
48
|
+
console.log(`
|
|
49
|
+
| Metric | Simple | ONNX |
|
|
50
|
+
|-----------------------|-------------|-------------|
|
|
51
|
+
| Avg Latency (cold) | ${simpleResults.avgColdLatency.toFixed(2)}ms | ${onnxResults.avgColdLatency.toFixed(2)}ms |
|
|
52
|
+
| Avg Latency (warm) | ${simpleResults.avgWarmLatency.toFixed(2)}ms | ${onnxResults.avgWarmLatency.toFixed(2)}ms |
|
|
53
|
+
| Batch 10 texts | ${simpleResults.batchLatency.toFixed(2)}ms | ${onnxResults.batchLatency.toFixed(2)}ms |
|
|
54
|
+
| Dimension | ${simpleResults.dimension} | ${onnxResults.dimension} |
|
|
55
|
+
| Semantic Accuracy | ${simpleResults.semanticAccuracy}% | ${onnxResults.semanticAccuracy}% |
|
|
56
|
+
`);
|
|
57
|
+
console.log('\nSemantic Similarity Comparison:');
|
|
58
|
+
console.log('-'.repeat(60));
|
|
59
|
+
for (let i = 0; i < SEMANTIC_PAIRS.length; i++) {
|
|
60
|
+
const pair = SEMANTIC_PAIRS[i];
|
|
61
|
+
console.log(`"${pair.a}" vs "${pair.b}"`);
|
|
62
|
+
console.log(` Expected: ${pair.expected}`);
|
|
63
|
+
console.log(` Simple: ${simpleResults.similarities[i].toFixed(3)}`);
|
|
64
|
+
console.log(` ONNX: ${onnxResults.similarities[i].toFixed(3)}`);
|
|
65
|
+
console.log();
|
|
66
|
+
}
|
|
67
|
+
// Recommendation
|
|
68
|
+
console.log('='.repeat(60));
|
|
69
|
+
console.log('RECOMMENDATION');
|
|
70
|
+
console.log('='.repeat(60));
|
|
71
|
+
if (onnxResults.semanticAccuracy > simpleResults.semanticAccuracy + 20) {
|
|
72
|
+
console.log(`
|
|
73
|
+
ONNX embeddings provide significantly better semantic accuracy
|
|
74
|
+
(${onnxResults.semanticAccuracy}% vs ${simpleResults.semanticAccuracy}%).
|
|
75
|
+
|
|
76
|
+
For tasks requiring semantic understanding (routing, pattern matching),
|
|
77
|
+
use ONNX embeddings:
|
|
78
|
+
|
|
79
|
+
export AGENTIC_FLOW_EMBEDDINGS=onnx
|
|
80
|
+
|
|
81
|
+
Note: First embedding takes ~${(onnxResults.avgColdLatency / 1000).toFixed(1)}s (model loading).
|
|
82
|
+
Subsequent embeddings: ~${onnxResults.avgWarmLatency.toFixed(1)}ms.
|
|
83
|
+
`);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
console.log(`
|
|
87
|
+
Simple embeddings are sufficient for your use case.
|
|
88
|
+
Semantic accuracy difference is minimal.
|
|
89
|
+
|
|
90
|
+
Keep using simple embeddings for maximum speed:
|
|
91
|
+
|
|
92
|
+
export AGENTIC_FLOW_EMBEDDINGS=simple
|
|
93
|
+
`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async function benchmarkService(service, name) {
|
|
97
|
+
// Cold start (first embedding, includes model loading for ONNX)
|
|
98
|
+
console.log(`\n[${name}] Cold start embedding...`);
|
|
99
|
+
const coldStart = performance.now();
|
|
100
|
+
await service.embed(TEST_TEXTS[0]);
|
|
101
|
+
const coldLatency = performance.now() - coldStart;
|
|
102
|
+
console.log(` Cold latency: ${coldLatency.toFixed(2)}ms`);
|
|
103
|
+
// Warm embeddings
|
|
104
|
+
console.log(`[${name}] Warm embeddings (${TEST_TEXTS.length} texts)...`);
|
|
105
|
+
service.clearCache();
|
|
106
|
+
const warmStart = performance.now();
|
|
107
|
+
for (const text of TEST_TEXTS) {
|
|
108
|
+
await service.embed(text);
|
|
109
|
+
}
|
|
110
|
+
const warmTotalLatency = performance.now() - warmStart;
|
|
111
|
+
const avgWarmLatency = warmTotalLatency / TEST_TEXTS.length;
|
|
112
|
+
console.log(` Total: ${warmTotalLatency.toFixed(2)}ms, Avg: ${avgWarmLatency.toFixed(2)}ms`);
|
|
113
|
+
// Batch embedding
|
|
114
|
+
console.log(`[${name}] Batch embedding...`);
|
|
115
|
+
service.clearCache();
|
|
116
|
+
const batchStart = performance.now();
|
|
117
|
+
await service.embedBatch(TEST_TEXTS);
|
|
118
|
+
const batchLatency = performance.now() - batchStart;
|
|
119
|
+
console.log(` Batch latency: ${batchLatency.toFixed(2)}ms`);
|
|
120
|
+
// Semantic similarity tests
|
|
121
|
+
console.log(`[${name}] Semantic similarity tests...`);
|
|
122
|
+
const similarities = [];
|
|
123
|
+
let correctCount = 0;
|
|
124
|
+
for (const pair of SEMANTIC_PAIRS) {
|
|
125
|
+
const sim = await service.similarity(pair.a, pair.b);
|
|
126
|
+
similarities.push(sim);
|
|
127
|
+
// For ONNX (semantic), use proper thresholds
|
|
128
|
+
// For simple (hash-based), it will score incorrectly on unrelated pairs
|
|
129
|
+
const isCorrect = (pair.expected === 'high' && sim > 0.5) ||
|
|
130
|
+
(pair.expected === 'medium' && sim >= 0.2 && sim <= 0.6) ||
|
|
131
|
+
(pair.expected === 'low' && sim < 0.3);
|
|
132
|
+
if (isCorrect)
|
|
133
|
+
correctCount++;
|
|
134
|
+
console.log(` "${pair.a.substring(0, 20)}..." vs "${pair.b.substring(0, 20)}...": ${sim.toFixed(3)} (expected: ${pair.expected})`);
|
|
135
|
+
}
|
|
136
|
+
const semanticAccuracy = Math.round((correctCount / SEMANTIC_PAIRS.length) * 100);
|
|
137
|
+
console.log(` Semantic accuracy: ${semanticAccuracy}%`);
|
|
138
|
+
const stats = service.getStats();
|
|
139
|
+
console.log(` Model: ${stats.modelName || 'N/A'}, SIMD: ${stats.simdAvailable ?? 'N/A'}`);
|
|
140
|
+
return {
|
|
141
|
+
avgColdLatency: coldLatency,
|
|
142
|
+
avgWarmLatency,
|
|
143
|
+
batchLatency,
|
|
144
|
+
dimension: stats.dimension,
|
|
145
|
+
semanticAccuracy,
|
|
146
|
+
similarities,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
// Run if executed directly
|
|
150
|
+
runBenchmark().catch(console.error);
|
|
151
|
+
//# sourceMappingURL=embedding-benchmark.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-benchmark.js","sourceRoot":"","sources":["../../src/intelligence/embedding-benchmark.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Embedding Benchmark - Compare simple vs ONNX embeddings\n *\n * Run with: npx ts-node src/intelligence/embedding-benchmark.ts\n */\n\nimport { getEmbeddingService, EmbeddingService } from './EmbeddingService.js';\n\nconst TEST_TEXTS = [\n 'Fix a bug in the authentication system',\n 'Implement user login functionality',\n 'Write unit tests for the API',\n 'Refactor the database layer',\n 'Optimize memory usage',\n 'Add dark mode to the UI',\n 'Deploy to production',\n 'Review pull request',\n 'Document the API endpoints',\n 'Set up CI/CD pipeline',\n];\n\nconst SEMANTIC_PAIRS = [\n { a: 'I love dogs', b: 'I adore puppies', expected: 'high' },\n { a: 'Fix authentication bug', b: 'Repair login issue', expected: 'high' },\n { a: 'Write unit tests', b: 'Create test cases', expected: 'high' },\n { a: 'Deploy to production', b: 'The weather is nice', expected: 'low' },\n { a: 'Fix bug', b: 'Add feature', expected: 'medium' },\n { a: 'Machine learning', b: 'Artificial intelligence', expected: 'high' },\n { a: 'Pizza recipe', b: 'Quantum physics', expected: 'low' },\n];\n\nasync function runBenchmark() {\n console.log('='.repeat(60));\n console.log('Embedding Benchmark: Simple vs ONNX');\n console.log('='.repeat(60));\n\n // Benchmark Simple Embeddings\n console.log('\\n--- Simple Embeddings ---');\n process.env.AGENTIC_FLOW_EMBEDDINGS = 'simple';\n EmbeddingService.reset();\n\n const simpleService = getEmbeddingService();\n const simpleResults = await benchmarkService(simpleService, 'simple');\n\n // Benchmark ONNX Embeddings\n console.log('\\n--- ONNX Embeddings ---');\n process.env.AGENTIC_FLOW_EMBEDDINGS = 'onnx';\n EmbeddingService.reset();\n\n const onnxService = getEmbeddingService();\n const onnxResults = await benchmarkService(onnxService, 'onnx');\n\n // Summary\n console.log('\\n' + '='.repeat(60));\n console.log('SUMMARY');\n console.log('='.repeat(60));\n\n console.log(`\n| Metric | Simple | ONNX |\n|-----------------------|-------------|-------------|\n| Avg Latency (cold) | ${simpleResults.avgColdLatency.toFixed(2)}ms | ${onnxResults.avgColdLatency.toFixed(2)}ms |\n| Avg Latency (warm) | ${simpleResults.avgWarmLatency.toFixed(2)}ms | ${onnxResults.avgWarmLatency.toFixed(2)}ms |\n| Batch 10 texts | ${simpleResults.batchLatency.toFixed(2)}ms | ${onnxResults.batchLatency.toFixed(2)}ms |\n| Dimension | ${simpleResults.dimension} | ${onnxResults.dimension} |\n| Semantic Accuracy | ${simpleResults.semanticAccuracy}% | ${onnxResults.semanticAccuracy}% |\n`);\n\n console.log('\\nSemantic Similarity Comparison:');\n console.log('-'.repeat(60));\n for (let i = 0; i < SEMANTIC_PAIRS.length; i++) {\n const pair = SEMANTIC_PAIRS[i];\n console.log(`\"${pair.a}\" vs \"${pair.b}\"`);\n console.log(` Expected: ${pair.expected}`);\n console.log(` Simple: ${simpleResults.similarities[i].toFixed(3)}`);\n console.log(` ONNX: ${onnxResults.similarities[i].toFixed(3)}`);\n console.log();\n }\n\n // Recommendation\n console.log('='.repeat(60));\n console.log('RECOMMENDATION');\n console.log('='.repeat(60));\n\n if (onnxResults.semanticAccuracy > simpleResults.semanticAccuracy + 20) {\n console.log(`\nONNX embeddings provide significantly better semantic accuracy\n(${onnxResults.semanticAccuracy}% vs ${simpleResults.semanticAccuracy}%).\n\nFor tasks requiring semantic understanding (routing, pattern matching),\nuse ONNX embeddings:\n\n export AGENTIC_FLOW_EMBEDDINGS=onnx\n\nNote: First embedding takes ~${(onnxResults.avgColdLatency / 1000).toFixed(1)}s (model loading).\nSubsequent embeddings: ~${onnxResults.avgWarmLatency.toFixed(1)}ms.\n`);\n } else {\n console.log(`\nSimple embeddings are sufficient for your use case.\nSemantic accuracy difference is minimal.\n\nKeep using simple embeddings for maximum speed:\n\n export AGENTIC_FLOW_EMBEDDINGS=simple\n`);\n }\n}\n\nasync function benchmarkService(\n service: EmbeddingService,\n name: string\n): Promise<{\n avgColdLatency: number;\n avgWarmLatency: number;\n batchLatency: number;\n dimension: number;\n semanticAccuracy: number;\n similarities: number[];\n}> {\n // Cold start (first embedding, includes model loading for ONNX)\n console.log(`\\n[${name}] Cold start embedding...`);\n const coldStart = performance.now();\n await service.embed(TEST_TEXTS[0]);\n const coldLatency = performance.now() - coldStart;\n console.log(` Cold latency: ${coldLatency.toFixed(2)}ms`);\n\n // Warm embeddings\n console.log(`[${name}] Warm embeddings (${TEST_TEXTS.length} texts)...`);\n service.clearCache();\n const warmStart = performance.now();\n for (const text of TEST_TEXTS) {\n await service.embed(text);\n }\n const warmTotalLatency = performance.now() - warmStart;\n const avgWarmLatency = warmTotalLatency / TEST_TEXTS.length;\n console.log(` Total: ${warmTotalLatency.toFixed(2)}ms, Avg: ${avgWarmLatency.toFixed(2)}ms`);\n\n // Batch embedding\n console.log(`[${name}] Batch embedding...`);\n service.clearCache();\n const batchStart = performance.now();\n await service.embedBatch(TEST_TEXTS);\n const batchLatency = performance.now() - batchStart;\n console.log(` Batch latency: ${batchLatency.toFixed(2)}ms`);\n\n // Semantic similarity tests\n console.log(`[${name}] Semantic similarity tests...`);\n const similarities: number[] = [];\n let correctCount = 0;\n\n for (const pair of SEMANTIC_PAIRS) {\n const sim = await service.similarity(pair.a, pair.b);\n similarities.push(sim);\n\n // For ONNX (semantic), use proper thresholds\n // For simple (hash-based), it will score incorrectly on unrelated pairs\n const isCorrect =\n (pair.expected === 'high' && sim > 0.5) ||\n (pair.expected === 'medium' && sim >= 0.2 && sim <= 0.6) ||\n (pair.expected === 'low' && sim < 0.3);\n\n if (isCorrect) correctCount++;\n\n console.log(` \"${pair.a.substring(0, 20)}...\" vs \"${pair.b.substring(0, 20)}...\": ${sim.toFixed(3)} (expected: ${pair.expected})`);\n }\n\n const semanticAccuracy = Math.round((correctCount / SEMANTIC_PAIRS.length) * 100);\n console.log(` Semantic accuracy: ${semanticAccuracy}%`);\n\n const stats = service.getStats();\n console.log(` Model: ${stats.modelName || 'N/A'}, SIMD: ${stats.simdAvailable ?? 'N/A'}`);\n\n return {\n avgColdLatency: coldLatency,\n avgWarmLatency,\n batchLatency,\n dimension: stats.dimension,\n semanticAccuracy,\n similarities,\n };\n}\n\n// Run if executed directly\nrunBenchmark().catch(console.error);\n"]}
|
|
@@ -5,8 +5,15 @@
|
|
|
5
5
|
* - @ruvector/sona: Micro-LoRA, EWC++, ReasoningBank, Trajectories
|
|
6
6
|
* - @ruvector/attention: MoE, Flash, Hyperbolic, Graph attention
|
|
7
7
|
* - ruvector core: HNSW indexing (150x faster search)
|
|
8
|
+
*
|
|
9
|
+
* Persistence: SQLite-based storage for cross-platform compatibility
|
|
8
10
|
*/
|
|
9
11
|
import { RuVectorIntelligence, type AgentRoutingResult, type Trajectory, type LearningOutcome } from '../../../../intelligence/index.js';
|
|
12
|
+
import { type IntelligenceStore } from '../../../../intelligence/IntelligenceStore.js';
|
|
13
|
+
/**
|
|
14
|
+
* Get the SQLite store singleton
|
|
15
|
+
*/
|
|
16
|
+
export declare function getStore(): IntelligenceStore;
|
|
10
17
|
/**
|
|
11
18
|
* Get or create the RuVectorIntelligence singleton
|
|
12
19
|
*/
|
|
@@ -78,6 +85,12 @@ export declare function getIntelligenceStats(): Promise<{
|
|
|
78
85
|
trajectoryCount: number;
|
|
79
86
|
activeTrajectories: number;
|
|
80
87
|
learningEnabled: boolean;
|
|
88
|
+
persistedStats?: {
|
|
89
|
+
trajectories: number;
|
|
90
|
+
routings: number;
|
|
91
|
+
patterns: number;
|
|
92
|
+
operations: number;
|
|
93
|
+
};
|
|
81
94
|
}>;
|
|
82
95
|
/**
|
|
83
96
|
* Force a learning cycle (useful for batch learning)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intelligence-bridge.d.ts","sourceRoot":"","sources":["../../../../../src/mcp/fastmcp/tools/hooks/intelligence-bridge.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"intelligence-bridge.d.ts","sourceRoot":"","sources":["../../../../../src/mcp/fastmcp/tools/hooks/intelligence-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACL,oBAAoB,EAGpB,KAAK,kBAAkB,EACvB,KAAK,UAAU,EACf,KAAK,eAAe,EACrB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAwB,KAAK,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAqB7G;;GAEG;AACH,wBAAgB,QAAQ,IAAI,iBAAiB,CAK5C;AAmBD;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAWrE;AA6CD;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IACR,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GACA,OAAO,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,kBAAkB,EAAE,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC,CAkDD;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAiCrE;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;IACR,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GACA,OAAO,CAAC,IAAI,CAAC,CAyBf;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,MAAY,GACpB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAoBjC;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAcf;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,MAAU,GACf,OAAO,CAAC,KAAK,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC,CAAC,CAkBF;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC;IACpD,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE;QACf,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH,CAAC,CAyBD;AAED;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAG1D;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,YAAY,EAAE,GACzB,OAAO,CAAC,MAAM,EAAE,CAAC,CAOnB;AAGD,YAAY,EAAE,kBAAkB,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC"}
|