agentic-flow 2.0.1-alpha.2 → 2.0.1-alpha.20
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 +352 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/agentdb/controllers/EmbeddingService.d.ts +37 -0
- package/dist/agentdb/controllers/EmbeddingService.d.ts.map +1 -0
- package/dist/agentdb/controllers/EmbeddingService.js +1 -0
- package/dist/agentdb/controllers/EmbeddingService.js.map +1 -0
- package/dist/billing/mcp/tools.d.ts.map +1 -1
- package/dist/billing/mcp/tools.js +2 -0
- package/dist/billing/mcp/tools.js.map +1 -1
- package/dist/cli/commands/hooks.d.ts +18 -0
- package/dist/cli/commands/hooks.d.ts.map +1 -0
- package/dist/cli/commands/hooks.js +755 -0
- package/dist/cli/commands/hooks.js.map +1 -0
- package/dist/cli-proxy.d.ts +1 -1
- package/dist/cli-proxy.d.ts.map +1 -1
- package/dist/cli-proxy.js +28 -1
- package/dist/cli-proxy.js.map +1 -1
- package/dist/core/agentdb-fast.js +3 -3
- package/dist/core/agentdb-fast.js.map +1 -1
- package/dist/core/agentdb-wrapper-enhanced.d.ts.map +1 -1
- package/dist/core/agentdb-wrapper-enhanced.js +32 -17
- package/dist/core/agentdb-wrapper-enhanced.js.map +1 -1
- package/dist/core/attention-native.d.ts +1 -0
- package/dist/core/attention-native.d.ts.map +1 -1
- package/dist/core/attention-native.js +6 -1
- package/dist/core/attention-native.js.map +1 -1
- package/dist/federation/integrations/supabase-adapter-debug.js +3 -3
- package/dist/federation/integrations/supabase-adapter-debug.js.map +1 -1
- package/dist/intelligence/EmbeddingCache.d.ts +112 -0
- package/dist/intelligence/EmbeddingCache.d.ts.map +1 -0
- package/dist/intelligence/EmbeddingCache.js +624 -0
- package/dist/intelligence/EmbeddingCache.js.map +1 -0
- package/dist/intelligence/EmbeddingService.d.ts +380 -0
- package/dist/intelligence/EmbeddingService.d.ts.map +1 -0
- package/dist/intelligence/EmbeddingService.js +1484 -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/RuVectorIntelligence.d.ts +362 -0
- package/dist/intelligence/RuVectorIntelligence.d.ts.map +1 -0
- package/dist/intelligence/RuVectorIntelligence.js +853 -0
- package/dist/intelligence/RuVectorIntelligence.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 +155 -0
- package/dist/intelligence/embedding-benchmark.js.map +1 -0
- package/dist/intelligence/index.d.ts +14 -0
- package/dist/intelligence/index.d.ts.map +1 -0
- package/dist/intelligence/index.js +14 -0
- package/dist/intelligence/index.js.map +1 -0
- package/dist/llm/RuvLLMOrchestrator.d.ts +184 -0
- package/dist/llm/RuvLLMOrchestrator.d.ts.map +1 -0
- package/dist/llm/RuvLLMOrchestrator.js +442 -0
- package/dist/llm/RuvLLMOrchestrator.js.map +1 -0
- package/dist/llm/index.d.ts +9 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +8 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/mcp/claudeFlowSdkServer.d.ts.map +1 -1
- package/dist/mcp/claudeFlowSdkServer.js +86 -21
- package/dist/mcp/claudeFlowSdkServer.js.map +1 -1
- package/dist/mcp/fastmcp/servers/hooks-server.d.ts +15 -0
- package/dist/mcp/fastmcp/servers/hooks-server.d.ts.map +1 -0
- package/dist/mcp/fastmcp/servers/hooks-server.js +63 -0
- package/dist/mcp/fastmcp/servers/hooks-server.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/benchmark.d.ts +20 -0
- package/dist/mcp/fastmcp/tools/hooks/benchmark.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/benchmark.js +110 -0
- package/dist/mcp/fastmcp/tools/hooks/benchmark.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/build-agents.d.ts +7 -0
- package/dist/mcp/fastmcp/tools/hooks/build-agents.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/build-agents.js +276 -0
- package/dist/mcp/fastmcp/tools/hooks/build-agents.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/explain.d.ts +6 -0
- package/dist/mcp/fastmcp/tools/hooks/explain.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/explain.js +164 -0
- package/dist/mcp/fastmcp/tools/hooks/explain.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/index.d.ts +28 -0
- package/dist/mcp/fastmcp/tools/hooks/index.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/index.js +59 -0
- package/dist/mcp/fastmcp/tools/hooks/index.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.d.ts +307 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.js +714 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-tools.d.ts +58 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-tools.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-tools.js +425 -0
- package/dist/mcp/fastmcp/tools/hooks/intelligence-tools.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/metrics.d.ts +6 -0
- package/dist/mcp/fastmcp/tools/hooks/metrics.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/metrics.js +137 -0
- package/dist/mcp/fastmcp/tools/hooks/metrics.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/post-command.d.ts +7 -0
- package/dist/mcp/fastmcp/tools/hooks/post-command.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/post-command.js +91 -0
- package/dist/mcp/fastmcp/tools/hooks/post-command.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/post-edit.d.ts +12 -0
- package/dist/mcp/fastmcp/tools/hooks/post-edit.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/post-edit.js +146 -0
- package/dist/mcp/fastmcp/tools/hooks/post-edit.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/pre-command.d.ts +7 -0
- package/dist/mcp/fastmcp/tools/hooks/pre-command.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/pre-command.js +70 -0
- package/dist/mcp/fastmcp/tools/hooks/pre-command.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/pre-edit.d.ts +14 -0
- package/dist/mcp/fastmcp/tools/hooks/pre-edit.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/pre-edit.js +121 -0
- package/dist/mcp/fastmcp/tools/hooks/pre-edit.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/pretrain.d.ts +7 -0
- package/dist/mcp/fastmcp/tools/hooks/pretrain.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/pretrain.js +171 -0
- package/dist/mcp/fastmcp/tools/hooks/pretrain.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/route.d.ts +12 -0
- package/dist/mcp/fastmcp/tools/hooks/route.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/route.js +267 -0
- package/dist/mcp/fastmcp/tools/hooks/route.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/shared.d.ts +46 -0
- package/dist/mcp/fastmcp/tools/hooks/shared.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/shared.js +159 -0
- package/dist/mcp/fastmcp/tools/hooks/shared.js.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/transfer.d.ts +7 -0
- package/dist/mcp/fastmcp/tools/hooks/transfer.d.ts.map +1 -0
- package/dist/mcp/fastmcp/tools/hooks/transfer.js +151 -0
- package/dist/mcp/fastmcp/tools/hooks/transfer.js.map +1 -0
- package/dist/mcp/tools/agent-booster-tools.d.ts +10 -1
- package/dist/mcp/tools/agent-booster-tools.d.ts.map +1 -1
- package/dist/mcp/tools/agent-booster-tools.js.map +1 -1
- package/dist/mcp/tools/sona-tools.d.ts.map +1 -1
- package/dist/mcp/tools/sona-tools.js +15 -3
- package/dist/mcp/tools/sona-tools.js.map +1 -1
- package/dist/memory/SharedMemoryPool.d.ts +16 -3
- package/dist/memory/SharedMemoryPool.d.ts.map +1 -1
- package/dist/memory/SharedMemoryPool.js +33 -1
- package/dist/memory/SharedMemoryPool.js.map +1 -1
- package/dist/middleware/auth.middleware.d.ts +114 -0
- package/dist/middleware/auth.middleware.d.ts.map +1 -0
- package/dist/middleware/auth.middleware.js +222 -0
- package/dist/middleware/auth.middleware.js.map +1 -0
- package/dist/optimizations/agent-booster-migration.d.ts.map +1 -1
- package/dist/optimizations/agent-booster-migration.js.map +1 -1
- package/dist/proxy/anthropic-to-gemini.d.ts.map +1 -1
- package/dist/proxy/anthropic-to-gemini.js.map +1 -1
- package/dist/proxy/anthropic-to-openrouter.d.ts.map +1 -1
- package/dist/proxy/anthropic-to-openrouter.js.map +1 -1
- package/dist/proxy/anthropic-to-requesty.d.ts.map +1 -1
- package/dist/proxy/anthropic-to-requesty.js.map +1 -1
- package/dist/proxy/quic-proxy.d.ts +0 -1
- package/dist/proxy/quic-proxy.d.ts.map +1 -1
- package/dist/proxy/quic-proxy.js +2 -1
- package/dist/proxy/quic-proxy.js.map +1 -1
- package/dist/reasoningbank/AdvancedMemory.d.ts.map +1 -1
- package/dist/reasoningbank/AdvancedMemory.js +12 -1
- package/dist/reasoningbank/AdvancedMemory.js.map +1 -1
- package/dist/reasoningbank/HybridBackend.d.ts +9 -0
- package/dist/reasoningbank/HybridBackend.d.ts.map +1 -1
- package/dist/reasoningbank/HybridBackend.js +48 -4
- package/dist/reasoningbank/HybridBackend.js.map +1 -1
- package/dist/reasoningbank/backend-selector.d.ts +1 -1
- package/dist/reasoningbank/backend-selector.d.ts.map +1 -1
- package/dist/reasoningbank/backend-selector.js.map +1 -1
- package/dist/reasoningbank/index-new.d.ts +0 -6
- package/dist/reasoningbank/index-new.d.ts.map +1 -1
- package/dist/reasoningbank/index-new.js +9 -7
- package/dist/reasoningbank/index-new.js.map +1 -1
- package/dist/reasoningbank/index.d.ts +1 -6
- package/dist/reasoningbank/index.d.ts.map +1 -1
- package/dist/reasoningbank/index.js +10 -7
- package/dist/reasoningbank/index.js.map +1 -1
- package/dist/router/providers/onnx-local.d.ts.map +1 -1
- package/dist/router/providers/onnx-local.js +3 -1
- package/dist/router/providers/onnx-local.js.map +1 -1
- package/dist/routing/CircuitBreakerRouter.d.ts +187 -0
- package/dist/routing/CircuitBreakerRouter.d.ts.map +1 -0
- package/dist/routing/CircuitBreakerRouter.js +460 -0
- package/dist/routing/CircuitBreakerRouter.js.map +1 -0
- package/dist/routing/SemanticRouter.d.ts +164 -0
- package/dist/routing/SemanticRouter.d.ts.map +1 -0
- package/dist/routing/SemanticRouter.js +291 -0
- package/dist/routing/SemanticRouter.js.map +1 -0
- package/dist/routing/index.d.ts +12 -0
- package/dist/routing/index.d.ts.map +1 -0
- package/dist/routing/index.js +10 -0
- package/dist/routing/index.js.map +1 -0
- package/dist/services/embedding-service.d.ts.map +1 -1
- package/dist/services/embedding-service.js +5 -2
- package/dist/services/embedding-service.js.map +1 -1
- package/dist/services/sona-agent-training.js +1 -1
- package/dist/services/sona-agent-training.js.map +1 -1
- package/dist/services/sona-agentdb-integration.d.ts.map +1 -1
- package/dist/services/sona-agentdb-integration.js +10 -5
- package/dist/services/sona-agentdb-integration.js.map +1 -1
- package/dist/services/sona-service.d.ts +6 -6
- package/dist/services/sona-service.d.ts.map +1 -1
- package/dist/services/sona-service.js +3 -1
- package/dist/services/sona-service.js.map +1 -1
- package/dist/utils/agentdb-runtime-patch.d.ts +1 -0
- package/dist/utils/agentdb-runtime-patch.d.ts.map +1 -1
- package/dist/utils/agentdb-runtime-patch.js +97 -2
- package/dist/utils/agentdb-runtime-patch.js.map +1 -1
- package/dist/utils/audit-logger.d.ts +115 -0
- package/dist/utils/audit-logger.d.ts.map +1 -0
- package/dist/utils/audit-logger.js +228 -0
- package/dist/utils/audit-logger.js.map +1 -0
- package/dist/utils/cli.d.ts +1 -1
- package/dist/utils/cli.d.ts.map +1 -1
- package/dist/utils/cli.js +5 -0
- package/dist/utils/cli.js.map +1 -1
- package/dist/utils/input-validator.d.ts +116 -0
- package/dist/utils/input-validator.d.ts.map +1 -0
- package/dist/utils/input-validator.js +299 -0
- package/dist/utils/input-validator.js.map +1 -0
- package/dist/utils/rate-limiter.js +2 -2
- package/dist/utils/rate-limiter.js.map +1 -1
- package/package.json +14 -3
- package/scripts/postinstall.js +72 -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"]}
|