claude-flow 2.7.0-alpha.2 → 2.7.0-alpha.5
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/bin/claude-flow +1 -1
- package/dist/src/cli/help-formatter.js +0 -5
- package/dist/src/cli/simple-cli.js +173 -79
- package/dist/src/cli/simple-cli.js.map +1 -1
- package/dist/src/cli/simple-commands/config.js +115 -257
- package/dist/src/cli/simple-commands/config.js.map +1 -1
- package/dist/src/core/version.js +2 -2
- package/dist/src/core/version.js.map +1 -1
- package/dist/src/reasoningbank/reasoningbank-adapter.js +149 -32
- package/dist/src/reasoningbank/reasoningbank-adapter.js.map +1 -1
- package/dist/src/utils/key-redactor.js.map +1 -1
- package/docs/REASONINGBANK-STATUS.md +163 -0
- package/package.json +2 -2
- package/src/reasoningbank/reasoningbank-adapter.js +219 -45
|
@@ -1,10 +1,40 @@
|
|
|
1
1
|
import { db, initialize, retrieveMemories, computeEmbedding, loadConfig } from 'agentic-flow/dist/reasoningbank/index.js';
|
|
2
2
|
import { v4 as uuidv4 } from 'uuid';
|
|
3
|
+
const queryCache = new Map();
|
|
4
|
+
const CACHE_SIZE = 100;
|
|
5
|
+
const CACHE_TTL = 60000;
|
|
6
|
+
const embeddingQueue = [];
|
|
7
|
+
let processingQueue = false;
|
|
3
8
|
export async function initializeReasoningBank() {
|
|
4
9
|
process.env.CLAUDE_FLOW_DB_PATH = '.swarm/memory.db';
|
|
5
10
|
await initialize();
|
|
11
|
+
await optimizeDatabase();
|
|
6
12
|
return true;
|
|
7
13
|
}
|
|
14
|
+
async function optimizeDatabase() {
|
|
15
|
+
try {
|
|
16
|
+
const dbInstance = db.getDb();
|
|
17
|
+
dbInstance.exec(`
|
|
18
|
+
-- Index on confidence for sorting
|
|
19
|
+
CREATE INDEX IF NOT EXISTS idx_patterns_confidence
|
|
20
|
+
ON patterns(confidence DESC);
|
|
21
|
+
|
|
22
|
+
-- Index on usage_count for sorting
|
|
23
|
+
CREATE INDEX IF NOT EXISTS idx_patterns_usage
|
|
24
|
+
ON patterns(usage_count DESC);
|
|
25
|
+
|
|
26
|
+
-- Index on created_at for time-based queries
|
|
27
|
+
CREATE INDEX IF NOT EXISTS idx_patterns_created
|
|
28
|
+
ON patterns(created_at DESC);
|
|
29
|
+
|
|
30
|
+
-- Index on memory_id for embeddings lookup
|
|
31
|
+
CREATE INDEX IF NOT EXISTS idx_embeddings_memory
|
|
32
|
+
ON pattern_embeddings(memory_id);
|
|
33
|
+
`);
|
|
34
|
+
} catch (error) {
|
|
35
|
+
console.warn('[ReasoningBank] Failed to create indexes:', error.message);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
8
38
|
export async function storeMemory(key, value, options = {}) {
|
|
9
39
|
const memoryId = `mem_${uuidv4()}`;
|
|
10
40
|
const memory = {
|
|
@@ -22,6 +52,29 @@ export async function storeMemory(key, value, options = {}) {
|
|
|
22
52
|
created_at: new Date().toISOString()
|
|
23
53
|
};
|
|
24
54
|
db.upsertMemory(memory);
|
|
55
|
+
queryCache.clear();
|
|
56
|
+
if (options.async !== false) {
|
|
57
|
+
embeddingQueue.push({
|
|
58
|
+
memoryId,
|
|
59
|
+
key,
|
|
60
|
+
value
|
|
61
|
+
});
|
|
62
|
+
processEmbeddingQueue();
|
|
63
|
+
} else {
|
|
64
|
+
await computeAndStoreEmbedding(memoryId, key, value);
|
|
65
|
+
}
|
|
66
|
+
return memoryId;
|
|
67
|
+
}
|
|
68
|
+
async function processEmbeddingQueue() {
|
|
69
|
+
if (processingQueue || embeddingQueue.length === 0) return;
|
|
70
|
+
processingQueue = true;
|
|
71
|
+
while(embeddingQueue.length > 0){
|
|
72
|
+
const batch = embeddingQueue.splice(0, 5);
|
|
73
|
+
await Promise.allSettled(batch.map(({ memoryId, key, value })=>computeAndStoreEmbedding(memoryId, key, value)));
|
|
74
|
+
}
|
|
75
|
+
processingQueue = false;
|
|
76
|
+
}
|
|
77
|
+
async function computeAndStoreEmbedding(memoryId, key, value) {
|
|
25
78
|
try {
|
|
26
79
|
const config = loadConfig();
|
|
27
80
|
const embeddingModel = config.embeddings.provider || 'claude';
|
|
@@ -35,18 +88,25 @@ export async function storeMemory(key, value, options = {}) {
|
|
|
35
88
|
created_at: new Date().toISOString()
|
|
36
89
|
});
|
|
37
90
|
} catch (error) {
|
|
38
|
-
console.warn(
|
|
91
|
+
console.warn(`[ReasoningBank] Failed to compute embedding for ${memoryId}:`, error.message);
|
|
39
92
|
}
|
|
40
|
-
return memoryId;
|
|
41
93
|
}
|
|
42
94
|
export async function queryMemories(searchQuery, options = {}) {
|
|
95
|
+
const cached = getCachedQuery(searchQuery, options);
|
|
96
|
+
if (cached) {
|
|
97
|
+
return cached;
|
|
98
|
+
}
|
|
99
|
+
const timeout = options.timeout || 3000;
|
|
43
100
|
try {
|
|
44
|
-
const memories = await
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
101
|
+
const memories = await Promise.race([
|
|
102
|
+
retrieveMemories(searchQuery, {
|
|
103
|
+
domain: options.domain || 'general',
|
|
104
|
+
agent: options.agent || 'memory-agent',
|
|
105
|
+
k: options.limit || 10
|
|
106
|
+
}),
|
|
107
|
+
new Promise((_, reject)=>setTimeout(()=>reject(new Error('Query timeout')), timeout))
|
|
108
|
+
]);
|
|
109
|
+
const results = memories.map((mem)=>{
|
|
50
110
|
try {
|
|
51
111
|
const data = JSON.parse(mem.pattern_data);
|
|
52
112
|
return {
|
|
@@ -63,32 +123,89 @@ export async function queryMemories(searchQuery, options = {}) {
|
|
|
63
123
|
return null;
|
|
64
124
|
}
|
|
65
125
|
}).filter(Boolean);
|
|
126
|
+
if (results.length === 0) {
|
|
127
|
+
console.warn('[ReasoningBank] Semantic search returned 0 results, trying SQL fallback');
|
|
128
|
+
const fallbackResults = await queryMemoriesFast(searchQuery, options);
|
|
129
|
+
setCachedQuery(searchQuery, options, fallbackResults);
|
|
130
|
+
return fallbackResults;
|
|
131
|
+
}
|
|
132
|
+
setCachedQuery(searchQuery, options, results);
|
|
133
|
+
return results;
|
|
66
134
|
} catch (error) {
|
|
67
|
-
console.warn('[ReasoningBank]
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
135
|
+
console.warn('[ReasoningBank] Using fast SQL fallback:', error.message);
|
|
136
|
+
const results = await queryMemoriesFast(searchQuery, options);
|
|
137
|
+
setCachedQuery(searchQuery, options, results);
|
|
138
|
+
return results;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
async function queryMemoriesFast(searchQuery, options = {}) {
|
|
142
|
+
const dbInstance = db.getDb();
|
|
143
|
+
const limit = options.limit || 10;
|
|
144
|
+
const namespace = options.namespace;
|
|
145
|
+
let query = `
|
|
146
|
+
SELECT
|
|
147
|
+
id,
|
|
148
|
+
pattern_data,
|
|
149
|
+
confidence,
|
|
150
|
+
usage_count,
|
|
151
|
+
created_at
|
|
152
|
+
FROM patterns
|
|
153
|
+
WHERE 1=1
|
|
154
|
+
`;
|
|
155
|
+
const params = [];
|
|
156
|
+
if (namespace) {
|
|
157
|
+
query += ` AND pattern_data LIKE ?`;
|
|
158
|
+
params.push(`%"namespace":"${namespace}"%`);
|
|
159
|
+
}
|
|
160
|
+
query += ` AND (
|
|
161
|
+
pattern_data LIKE ? OR
|
|
162
|
+
pattern_data LIKE ?
|
|
163
|
+
)`;
|
|
164
|
+
params.push(`%"key":"%${searchQuery}%"%`, `%"value":"%${searchQuery}%"%`);
|
|
165
|
+
query += ` ORDER BY confidence DESC, usage_count DESC LIMIT ?`;
|
|
166
|
+
params.push(limit);
|
|
167
|
+
const rows = dbInstance.prepare(query).all(...params);
|
|
168
|
+
return rows.map((row)=>{
|
|
169
|
+
try {
|
|
170
|
+
const data = JSON.parse(row.pattern_data);
|
|
171
|
+
return {
|
|
172
|
+
id: row.id,
|
|
173
|
+
key: data.key,
|
|
174
|
+
value: data.value,
|
|
175
|
+
namespace: data.namespace,
|
|
176
|
+
confidence: row.confidence,
|
|
177
|
+
usage_count: row.usage_count,
|
|
178
|
+
created_at: row.created_at
|
|
179
|
+
};
|
|
180
|
+
} catch {
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
}).filter(Boolean);
|
|
184
|
+
}
|
|
185
|
+
function getCachedQuery(searchQuery, options) {
|
|
186
|
+
const cacheKey = JSON.stringify({
|
|
187
|
+
searchQuery,
|
|
188
|
+
options
|
|
189
|
+
});
|
|
190
|
+
const cached = queryCache.get(cacheKey);
|
|
191
|
+
if (cached && Date.now() - cached.timestamp < CACHE_TTL) {
|
|
192
|
+
return cached.results;
|
|
193
|
+
}
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
function setCachedQuery(searchQuery, options, results) {
|
|
197
|
+
const cacheKey = JSON.stringify({
|
|
198
|
+
searchQuery,
|
|
199
|
+
options
|
|
200
|
+
});
|
|
201
|
+
if (queryCache.size >= CACHE_SIZE) {
|
|
202
|
+
const firstKey = queryCache.keys().next().value;
|
|
203
|
+
queryCache.delete(firstKey);
|
|
91
204
|
}
|
|
205
|
+
queryCache.set(cacheKey, {
|
|
206
|
+
results,
|
|
207
|
+
timestamp: Date.now()
|
|
208
|
+
});
|
|
92
209
|
}
|
|
93
210
|
export async function listMemories(options = {}) {
|
|
94
211
|
const dbInstance = db.getDb();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/reasoningbank/reasoningbank-adapter.js"],"sourcesContent":["/**\n * ReasoningBank Adapter for Claude-Flow\n *\n * Wraps agentic-flow's ReasoningBank SDK for use in claude-flow memory commands\n */\n\nimport { db, initialize, retrieveMemories, computeEmbedding, loadConfig } from 'agentic-flow/dist/reasoningbank/index.js';\nimport { v4 as uuidv4 } from 'uuid';\n\n/**\n * Initialize ReasoningBank database\n */\nexport async function initializeReasoningBank() {\n // Set database path\n process.env.CLAUDE_FLOW_DB_PATH = '.swarm/memory.db';\n\n await initialize();\n return true;\n}\n\n/**\n * Store a memory in ReasoningBank\n */\nexport async function storeMemory(key, value, options = {}) {\n const memoryId = `mem_${uuidv4()}`;\n\n const memory = {\n id: memoryId,\n type: options.type || 'fact',\n pattern_data: JSON.stringify({\n key,\n value,\n namespace: options.namespace || 'default',\n agent: options.agent || 'memory-agent',\n domain: options.domain || 'general',\n }),\n confidence: options.confidence || 0.8,\n usage_count: 0,\n created_at: new Date().toISOString(),\n };\n\n // Store memory\n db.upsertMemory(memory);\n\n // Compute and store embedding for semantic search\n try {\n const config = loadConfig();\n const embeddingModel = config.embeddings.provider || 'claude';\n\n const embedding = await computeEmbedding(`${key}: ${value}`);\n const vectorArray = new Float32Array(embedding);\n\n db.upsertEmbedding({\n memory_id: memoryId,\n vector: vectorArray,\n model: embeddingModel, // Dynamic model from config\n dims: vectorArray.length, // Required: embedding dimensions\n created_at: new Date().toISOString(),\n });\n } catch (error) {\n console.warn('[ReasoningBank] Warning: Could not compute embedding:', error.message);\n // Continue without embedding - memory is still stored\n }\n\n return memoryId;\n}\n\n/**\n * Query memories from ReasoningBank\n */\nexport async function queryMemories(searchQuery, options = {}) {\n try {\n // Use ReasoningBank's semantic retrieval\n const memories = await retrieveMemories(searchQuery, {\n domain: options.domain || 'general',\n agent: options.agent || 'memory-agent',\n k: options.limit || 10,\n });\n\n return memories.map(mem => {\n try {\n const data = JSON.parse(mem.pattern_data);\n return {\n id: mem.id,\n key: data.key,\n value: data.value,\n namespace: data.namespace,\n confidence: mem.confidence,\n usage_count: mem.usage_count,\n created_at: mem.created_at,\n score: mem.score || 0,\n };\n } catch {\n return null;\n }\n }).filter(Boolean);\n } catch (error) {\n // Fallback to simple query if semantic search fails\n console.warn('[ReasoningBank] Semantic search failed, using simple query:', error.message);\n\n const dbInstance = db.getDb();\n const rows = dbInstance.prepare(`\n SELECT * FROM patterns\n WHERE pattern_data LIKE ?\n ORDER BY confidence DESC, usage_count DESC\n LIMIT ?\n `).all(`%${searchQuery}%`, options.limit || 10);\n\n return rows.map(row => {\n try {\n const data = JSON.parse(row.pattern_data);\n return {\n id: row.id,\n key: data.key,\n value: data.value,\n namespace: data.namespace,\n confidence: row.confidence,\n usage_count: row.usage_count,\n created_at: row.created_at,\n };\n } catch {\n return null;\n }\n }).filter(Boolean);\n }\n}\n\n/**\n * List all memories\n */\nexport async function listMemories(options = {}) {\n const dbInstance = db.getDb();\n\n const limit = options.limit || 10;\n const sortBy = options.sort || 'created_at';\n const sortOrder = options.order || 'DESC';\n\n const rows = dbInstance.prepare(`\n SELECT * FROM patterns\n ORDER BY ${sortBy} ${sortOrder}\n LIMIT ?\n `).all(limit);\n\n return rows.map(row => {\n try {\n const data = JSON.parse(row.pattern_data);\n return {\n id: row.id,\n key: data.key,\n value: data.value,\n namespace: data.namespace,\n confidence: row.confidence,\n usage_count: row.usage_count,\n created_at: row.created_at,\n };\n } catch {\n return null;\n }\n }).filter(Boolean);\n}\n\n/**\n * Get ReasoningBank statistics\n */\nexport async function getStatus() {\n const dbInstance = db.getDb();\n\n const stats = dbInstance.prepare(`\n SELECT\n COUNT(*) as total_memories,\n AVG(confidence) as avg_confidence,\n SUM(usage_count) as total_usage\n FROM patterns\n `).get();\n\n const embeddingCount = dbInstance.prepare(`\n SELECT COUNT(*) as count FROM pattern_embeddings\n `).get();\n\n const trajectoryCount = dbInstance.prepare(`\n SELECT COUNT(*) as count FROM task_trajectories\n `).get();\n\n return {\n total_memories: stats.total_memories || 0,\n avg_confidence: stats.avg_confidence || 0,\n total_usage: stats.total_usage || 0,\n total_embeddings: embeddingCount.count || 0,\n total_trajectories: trajectoryCount.count || 0,\n };\n}\n\n/**\n * Check which ReasoningBank tables are present in the database\n * Returns object with table names and their existence status\n */\nexport async function checkReasoningBankTables() {\n try {\n const dbInstance = db.getDb();\n\n // Required ReasoningBank tables\n const requiredTables = [\n 'patterns',\n 'pattern_embeddings',\n 'pattern_links',\n 'task_trajectories',\n 'matts_runs',\n 'consolidation_runs',\n 'metrics_log'\n ];\n\n // Query existing tables\n const existingTables = dbInstance.prepare(`\n SELECT name FROM sqlite_master\n WHERE type='table'\n `).all().map(row => row.name);\n\n // Check which required tables are missing\n const missingTables = requiredTables.filter(table => !existingTables.includes(table));\n\n return {\n exists: missingTables.length === 0,\n existingTables,\n missingTables,\n requiredTables\n };\n } catch (error) {\n return {\n exists: false,\n existingTables: [],\n missingTables: [],\n requiredTables: [],\n error: error.message\n };\n }\n}\n\n/**\n * Migrate existing database to add missing ReasoningBank tables\n */\nexport async function migrateReasoningBank() {\n try {\n // Check current state\n const tableCheck = await checkReasoningBankTables();\n\n if (tableCheck.exists) {\n return {\n success: true,\n message: 'All ReasoningBank tables already exist',\n migrated: false\n };\n }\n\n // Run full initialization which will create missing tables\n await initializeReasoningBank();\n\n // Verify migration\n const afterCheck = await checkReasoningBankTables();\n\n return {\n success: afterCheck.exists,\n message: `Migration completed: ${tableCheck.missingTables.length} tables added`,\n migrated: true,\n addedTables: tableCheck.missingTables\n };\n } catch (error) {\n return {\n success: false,\n message: `Migration failed: ${error.message}`,\n error: error.message\n };\n }\n}\n"],"names":["db","initialize","retrieveMemories","computeEmbedding","loadConfig","v4","uuidv4","initializeReasoningBank","process","env","CLAUDE_FLOW_DB_PATH","storeMemory","key","value","options","memoryId","memory","id","type","pattern_data","JSON","stringify","namespace","agent","domain","confidence","usage_count","created_at","Date","toISOString","upsertMemory","config","embeddingModel","embeddings","provider","embedding","vectorArray","Float32Array","upsertEmbedding","memory_id","vector","model","dims","length","error","console","warn","message","queryMemories","searchQuery","memories","k","limit","map","mem","data","parse","score","filter","Boolean","dbInstance","getDb","rows","prepare","all","row","listMemories","sortBy","sort","sortOrder","order","getStatus","stats","get","embeddingCount","trajectoryCount","total_memories","avg_confidence","total_usage","total_embeddings","count","total_trajectories","checkReasoningBankTables","requiredTables","existingTables","name","missingTables","table","includes","exists","migrateReasoningBank","tableCheck","success","migrated","afterCheck","addedTables"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/reasoningbank/reasoningbank-adapter.js"],"sourcesContent":["/**\n * ReasoningBank Adapter for Claude-Flow\n *\n * Wraps agentic-flow's ReasoningBank SDK for use in claude-flow memory commands\n * Performance-optimized with caching, timeouts, and async embeddings\n */\n\nimport { db, initialize, retrieveMemories, computeEmbedding, loadConfig } from 'agentic-flow/dist/reasoningbank/index.js';\nimport { v4 as uuidv4 } from 'uuid';\n\n// Query result cache (LRU)\nconst queryCache = new Map();\nconst CACHE_SIZE = 100;\nconst CACHE_TTL = 60000; // 60 seconds\n\n// Async embedding processing queue\nconst embeddingQueue = [];\nlet processingQueue = false;\n\n/**\n * Initialize ReasoningBank database with performance optimizations\n */\nexport async function initializeReasoningBank() {\n // Set database path\n process.env.CLAUDE_FLOW_DB_PATH = '.swarm/memory.db';\n\n await initialize();\n await optimizeDatabase();\n return true;\n}\n\n/**\n * Add database indexes for query performance\n */\nasync function optimizeDatabase() {\n try {\n const dbInstance = db.getDb();\n\n // Add indexes for common queries\n dbInstance.exec(`\n -- Index on confidence for sorting\n CREATE INDEX IF NOT EXISTS idx_patterns_confidence\n ON patterns(confidence DESC);\n\n -- Index on usage_count for sorting\n CREATE INDEX IF NOT EXISTS idx_patterns_usage\n ON patterns(usage_count DESC);\n\n -- Index on created_at for time-based queries\n CREATE INDEX IF NOT EXISTS idx_patterns_created\n ON patterns(created_at DESC);\n\n -- Index on memory_id for embeddings lookup\n CREATE INDEX IF NOT EXISTS idx_embeddings_memory\n ON pattern_embeddings(memory_id);\n `);\n } catch (error) {\n console.warn('[ReasoningBank] Failed to create indexes:', error.message);\n }\n}\n\n/**\n * Store a memory in ReasoningBank (optimized with async embeddings)\n */\nexport async function storeMemory(key, value, options = {}) {\n const memoryId = `mem_${uuidv4()}`;\n\n const memory = {\n id: memoryId,\n type: options.type || 'fact',\n pattern_data: JSON.stringify({\n key,\n value,\n namespace: options.namespace || 'default',\n agent: options.agent || 'memory-agent',\n domain: options.domain || 'general',\n }),\n confidence: options.confidence || 0.8,\n usage_count: 0,\n created_at: new Date().toISOString(),\n };\n\n // Store memory immediately (fast, no blocking)\n db.upsertMemory(memory);\n\n // Invalidate query cache when new memory is added\n queryCache.clear();\n\n // Queue embedding computation for background processing (unless disabled)\n if (options.async !== false) {\n embeddingQueue.push({ memoryId, key, value });\n processEmbeddingQueue(); // Non-blocking\n } else {\n // Synchronous mode for critical operations\n await computeAndStoreEmbedding(memoryId, key, value);\n }\n\n return memoryId;\n}\n\n/**\n * Process embedding queue in background\n */\nasync function processEmbeddingQueue() {\n if (processingQueue || embeddingQueue.length === 0) return;\n\n processingQueue = true;\n\n while (embeddingQueue.length > 0) {\n const batch = embeddingQueue.splice(0, 5); // Process 5 at a time\n\n await Promise.allSettled(\n batch.map(({ memoryId, key, value }) =>\n computeAndStoreEmbedding(memoryId, key, value)\n )\n );\n }\n\n processingQueue = false;\n}\n\n/**\n * Compute and store embedding for a memory\n */\nasync function computeAndStoreEmbedding(memoryId, key, value) {\n try {\n const config = loadConfig();\n const embeddingModel = config.embeddings.provider || 'claude';\n\n const embedding = await computeEmbedding(`${key}: ${value}`);\n const vectorArray = new Float32Array(embedding);\n\n db.upsertEmbedding({\n memory_id: memoryId,\n vector: vectorArray,\n model: embeddingModel,\n dims: vectorArray.length,\n created_at: new Date().toISOString(),\n });\n } catch (error) {\n console.warn(`[ReasoningBank] Failed to compute embedding for ${memoryId}:`, error.message);\n }\n}\n\n/**\n * Query memories from ReasoningBank (optimized with caching and timeout)\n */\nexport async function queryMemories(searchQuery, options = {}) {\n // Check cache first\n const cached = getCachedQuery(searchQuery, options);\n if (cached) {\n return cached;\n }\n\n const timeout = options.timeout || 3000; // 3s default timeout\n\n try {\n // Race between semantic search and timeout\n const memories = await Promise.race([\n retrieveMemories(searchQuery, {\n domain: options.domain || 'general',\n agent: options.agent || 'memory-agent',\n k: options.limit || 10,\n }),\n new Promise((_, reject) =>\n setTimeout(() => reject(new Error('Query timeout')), timeout)\n )\n ]);\n\n const results = memories.map(mem => {\n try {\n const data = JSON.parse(mem.pattern_data);\n return {\n id: mem.id,\n key: data.key,\n value: data.value,\n namespace: data.namespace,\n confidence: mem.confidence,\n usage_count: mem.usage_count,\n created_at: mem.created_at,\n score: mem.score || 0,\n };\n } catch {\n return null;\n }\n }).filter(Boolean);\n\n // If semantic search returns no results, try SQL fallback\n // (handles case where embeddings don't exist yet)\n if (results.length === 0) {\n console.warn('[ReasoningBank] Semantic search returned 0 results, trying SQL fallback');\n const fallbackResults = await queryMemoriesFast(searchQuery, options);\n setCachedQuery(searchQuery, options, fallbackResults);\n return fallbackResults;\n }\n\n // Cache successful results\n setCachedQuery(searchQuery, options, results);\n return results;\n } catch (error) {\n // Fast SQL fallback on timeout or error\n console.warn('[ReasoningBank] Using fast SQL fallback:', error.message);\n const results = await queryMemoriesFast(searchQuery, options);\n\n // Cache fallback results too\n setCachedQuery(searchQuery, options, results);\n return results;\n }\n}\n\n/**\n * Fast SQL-based query fallback (optimized)\n */\nasync function queryMemoriesFast(searchQuery, options = {}) {\n const dbInstance = db.getDb();\n const limit = options.limit || 10;\n const namespace = options.namespace;\n\n // Use optimized query with indexes\n let query = `\n SELECT\n id,\n pattern_data,\n confidence,\n usage_count,\n created_at\n FROM patterns\n WHERE 1=1\n `;\n\n const params = [];\n\n // Add namespace filter if provided\n if (namespace) {\n query += ` AND pattern_data LIKE ?`;\n params.push(`%\"namespace\":\"${namespace}\"%`);\n }\n\n // Add search filter - check both key and value\n query += ` AND (\n pattern_data LIKE ? OR\n pattern_data LIKE ?\n )`;\n params.push(`%\"key\":\"%${searchQuery}%\"%`, `%\"value\":\"%${searchQuery}%\"%`);\n\n // Use indexed sort\n query += ` ORDER BY confidence DESC, usage_count DESC LIMIT ?`;\n params.push(limit);\n\n const rows = dbInstance.prepare(query).all(...params);\n\n return rows.map(row => {\n try {\n const data = JSON.parse(row.pattern_data);\n return {\n id: row.id,\n key: data.key,\n value: data.value,\n namespace: data.namespace,\n confidence: row.confidence,\n usage_count: row.usage_count,\n created_at: row.created_at,\n };\n } catch {\n return null;\n }\n }).filter(Boolean);\n}\n\n/**\n * Get cached query results\n */\nfunction getCachedQuery(searchQuery, options) {\n const cacheKey = JSON.stringify({ searchQuery, options });\n const cached = queryCache.get(cacheKey);\n\n if (cached && Date.now() - cached.timestamp < CACHE_TTL) {\n return cached.results;\n }\n\n return null;\n}\n\n/**\n * Set cached query results (LRU eviction)\n */\nfunction setCachedQuery(searchQuery, options, results) {\n const cacheKey = JSON.stringify({ searchQuery, options });\n\n // LRU eviction\n if (queryCache.size >= CACHE_SIZE) {\n const firstKey = queryCache.keys().next().value;\n queryCache.delete(firstKey);\n }\n\n queryCache.set(cacheKey, {\n results,\n timestamp: Date.now()\n });\n}\n\n/**\n * List all memories\n */\nexport async function listMemories(options = {}) {\n const dbInstance = db.getDb();\n\n const limit = options.limit || 10;\n const sortBy = options.sort || 'created_at';\n const sortOrder = options.order || 'DESC';\n\n const rows = dbInstance.prepare(`\n SELECT * FROM patterns\n ORDER BY ${sortBy} ${sortOrder}\n LIMIT ?\n `).all(limit);\n\n return rows.map(row => {\n try {\n const data = JSON.parse(row.pattern_data);\n return {\n id: row.id,\n key: data.key,\n value: data.value,\n namespace: data.namespace,\n confidence: row.confidence,\n usage_count: row.usage_count,\n created_at: row.created_at,\n };\n } catch {\n return null;\n }\n }).filter(Boolean);\n}\n\n/**\n * Get ReasoningBank statistics\n */\nexport async function getStatus() {\n const dbInstance = db.getDb();\n\n const stats = dbInstance.prepare(`\n SELECT\n COUNT(*) as total_memories,\n AVG(confidence) as avg_confidence,\n SUM(usage_count) as total_usage\n FROM patterns\n `).get();\n\n const embeddingCount = dbInstance.prepare(`\n SELECT COUNT(*) as count FROM pattern_embeddings\n `).get();\n\n const trajectoryCount = dbInstance.prepare(`\n SELECT COUNT(*) as count FROM task_trajectories\n `).get();\n\n return {\n total_memories: stats.total_memories || 0,\n avg_confidence: stats.avg_confidence || 0,\n total_usage: stats.total_usage || 0,\n total_embeddings: embeddingCount.count || 0,\n total_trajectories: trajectoryCount.count || 0,\n };\n}\n\n/**\n * Check which ReasoningBank tables are present in the database\n * Returns object with table names and their existence status\n */\nexport async function checkReasoningBankTables() {\n try {\n const dbInstance = db.getDb();\n\n // Required ReasoningBank tables\n const requiredTables = [\n 'patterns',\n 'pattern_embeddings',\n 'pattern_links',\n 'task_trajectories',\n 'matts_runs',\n 'consolidation_runs',\n 'metrics_log'\n ];\n\n // Query existing tables\n const existingTables = dbInstance.prepare(`\n SELECT name FROM sqlite_master\n WHERE type='table'\n `).all().map(row => row.name);\n\n // Check which required tables are missing\n const missingTables = requiredTables.filter(table => !existingTables.includes(table));\n\n return {\n exists: missingTables.length === 0,\n existingTables,\n missingTables,\n requiredTables\n };\n } catch (error) {\n return {\n exists: false,\n existingTables: [],\n missingTables: [],\n requiredTables: [],\n error: error.message\n };\n }\n}\n\n/**\n * Migrate existing database to add missing ReasoningBank tables\n */\nexport async function migrateReasoningBank() {\n try {\n // Check current state\n const tableCheck = await checkReasoningBankTables();\n\n if (tableCheck.exists) {\n return {\n success: true,\n message: 'All ReasoningBank tables already exist',\n migrated: false\n };\n }\n\n // Run full initialization which will create missing tables\n await initializeReasoningBank();\n\n // Verify migration\n const afterCheck = await checkReasoningBankTables();\n\n return {\n success: afterCheck.exists,\n message: `Migration completed: ${tableCheck.missingTables.length} tables added`,\n migrated: true,\n addedTables: tableCheck.missingTables\n };\n } catch (error) {\n return {\n success: false,\n message: `Migration failed: ${error.message}`,\n error: error.message\n };\n }\n}\n"],"names":["db","initialize","retrieveMemories","computeEmbedding","loadConfig","v4","uuidv4","queryCache","Map","CACHE_SIZE","CACHE_TTL","embeddingQueue","processingQueue","initializeReasoningBank","process","env","CLAUDE_FLOW_DB_PATH","optimizeDatabase","dbInstance","getDb","exec","error","console","warn","message","storeMemory","key","value","options","memoryId","memory","id","type","pattern_data","JSON","stringify","namespace","agent","domain","confidence","usage_count","created_at","Date","toISOString","upsertMemory","clear","async","push","processEmbeddingQueue","computeAndStoreEmbedding","length","batch","splice","Promise","allSettled","map","config","embeddingModel","embeddings","provider","embedding","vectorArray","Float32Array","upsertEmbedding","memory_id","vector","model","dims","queryMemories","searchQuery","cached","getCachedQuery","timeout","memories","race","k","limit","_","reject","setTimeout","Error","results","mem","data","parse","score","filter","Boolean","fallbackResults","queryMemoriesFast","setCachedQuery","query","params","rows","prepare","all","row","cacheKey","get","now","timestamp","size","firstKey","keys","next","delete","set","listMemories","sortBy","sort","sortOrder","order","getStatus","stats","embeddingCount","trajectoryCount","total_memories","avg_confidence","total_usage","total_embeddings","count","total_trajectories","checkReasoningBankTables","requiredTables","existingTables","name","missingTables","table","includes","exists","migrateReasoningBank","tableCheck","success","migrated","afterCheck","addedTables"],"mappings":"AAOA,SAAUA,EAAE,EAAEC,UAAU,EAAEC,gBAAgB,EAAEC,gBAAgB,EAAEC,UAAU,QAAQ,2CAA2C;AAC3H,SAASC,MAAMC,MAAM,QAAQ,OAAO;AAGpC,MAAMC,aAAa,IAAIC;AACvB,MAAMC,aAAa;AACnB,MAAMC,YAAY;AAGlB,MAAMC,iBAAiB,EAAE;AACzB,IAAIC,kBAAkB;AAKtB,OAAO,eAAeC;IAEpBC,QAAQC,GAAG,CAACC,mBAAmB,GAAG;IAElC,MAAMf;IACN,MAAMgB;IACN,OAAO;AACT;AAKA,eAAeA;IACb,IAAI;QACF,MAAMC,aAAalB,GAAGmB,KAAK;QAG3BD,WAAWE,IAAI,CAAC,CAAC;;;;;;;;;;;;;;;;IAgBjB,CAAC;IACH,EAAE,OAAOC,OAAO;QACdC,QAAQC,IAAI,CAAC,6CAA6CF,MAAMG,OAAO;IACzE;AACF;AAKA,OAAO,eAAeC,YAAYC,GAAG,EAAEC,KAAK,EAAEC,UAAU,CAAC,CAAC;IACxD,MAAMC,WAAW,CAAC,IAAI,EAAEvB,UAAU;IAElC,MAAMwB,SAAS;QACbC,IAAIF;QACJG,MAAMJ,QAAQI,IAAI,IAAI;QACtBC,cAAcC,KAAKC,SAAS,CAAC;YAC3BT;YACAC;YACAS,WAAWR,QAAQQ,SAAS,IAAI;YAChCC,OAAOT,QAAQS,KAAK,IAAI;YACxBC,QAAQV,QAAQU,MAAM,IAAI;QAC5B;QACAC,YAAYX,QAAQW,UAAU,IAAI;QAClCC,aAAa;QACbC,YAAY,IAAIC,OAAOC,WAAW;IACpC;IAGA3C,GAAG4C,YAAY,CAACd;IAGhBvB,WAAWsC,KAAK;IAGhB,IAAIjB,QAAQkB,KAAK,KAAK,OAAO;QAC3BnC,eAAeoC,IAAI,CAAC;YAAElB;YAAUH;YAAKC;QAAM;QAC3CqB;IACF,OAAO;QAEL,MAAMC,yBAAyBpB,UAAUH,KAAKC;IAChD;IAEA,OAAOE;AACT;AAKA,eAAemB;IACb,IAAIpC,mBAAmBD,eAAeuC,MAAM,KAAK,GAAG;IAEpDtC,kBAAkB;IAElB,MAAOD,eAAeuC,MAAM,GAAG,EAAG;QAChC,MAAMC,QAAQxC,eAAeyC,MAAM,CAAC,GAAG;QAEvC,MAAMC,QAAQC,UAAU,CACtBH,MAAMI,GAAG,CAAC,CAAC,EAAE1B,QAAQ,EAAEH,GAAG,EAAEC,KAAK,EAAE,GACjCsB,yBAAyBpB,UAAUH,KAAKC;IAG9C;IAEAf,kBAAkB;AACpB;AAKA,eAAeqC,yBAAyBpB,QAAQ,EAAEH,GAAG,EAAEC,KAAK;IAC1D,IAAI;QACF,MAAM6B,SAASpD;QACf,MAAMqD,iBAAiBD,OAAOE,UAAU,CAACC,QAAQ,IAAI;QAErD,MAAMC,YAAY,MAAMzD,iBAAiB,GAAGuB,IAAI,EAAE,EAAEC,OAAO;QAC3D,MAAMkC,cAAc,IAAIC,aAAaF;QAErC5D,GAAG+D,eAAe,CAAC;YACjBC,WAAWnC;YACXoC,QAAQJ;YACRK,OAAOT;YACPU,MAAMN,YAAYX,MAAM;YACxBT,YAAY,IAAIC,OAAOC,WAAW;QACpC;IACF,EAAE,OAAOtB,OAAO;QACdC,QAAQC,IAAI,CAAC,CAAC,gDAAgD,EAAEM,SAAS,CAAC,CAAC,EAAER,MAAMG,OAAO;IAC5F;AACF;AAKA,OAAO,eAAe4C,cAAcC,WAAW,EAAEzC,UAAU,CAAC,CAAC;IAE3D,MAAM0C,SAASC,eAAeF,aAAazC;IAC3C,IAAI0C,QAAQ;QACV,OAAOA;IACT;IAEA,MAAME,UAAU5C,QAAQ4C,OAAO,IAAI;IAEnC,IAAI;QAEF,MAAMC,WAAW,MAAMpB,QAAQqB,IAAI,CAAC;YAClCxE,iBAAiBmE,aAAa;gBAC5B/B,QAAQV,QAAQU,MAAM,IAAI;gBAC1BD,OAAOT,QAAQS,KAAK,IAAI;gBACxBsC,GAAG/C,QAAQgD,KAAK,IAAI;YACtB;YACA,IAAIvB,QAAQ,CAACwB,GAAGC,SACdC,WAAW,IAAMD,OAAO,IAAIE,MAAM,mBAAmBR;SAExD;QAED,MAAMS,UAAUR,SAASlB,GAAG,CAAC2B,CAAAA;YAC3B,IAAI;gBACF,MAAMC,OAAOjD,KAAKkD,KAAK,CAACF,IAAIjD,YAAY;gBACxC,OAAO;oBACLF,IAAImD,IAAInD,EAAE;oBACVL,KAAKyD,KAAKzD,GAAG;oBACbC,OAAOwD,KAAKxD,KAAK;oBACjBS,WAAW+C,KAAK/C,SAAS;oBACzBG,YAAY2C,IAAI3C,UAAU;oBAC1BC,aAAa0C,IAAI1C,WAAW;oBAC5BC,YAAYyC,IAAIzC,UAAU;oBAC1B4C,OAAOH,IAAIG,KAAK,IAAI;gBACtB;YACF,EAAE,OAAM;gBACN,OAAO;YACT;QACF,GAAGC,MAAM,CAACC;QAIV,IAAIN,QAAQ/B,MAAM,KAAK,GAAG;YACxB5B,QAAQC,IAAI,CAAC;YACb,MAAMiE,kBAAkB,MAAMC,kBAAkBpB,aAAazC;YAC7D8D,eAAerB,aAAazC,SAAS4D;YACrC,OAAOA;QACT;QAGAE,eAAerB,aAAazC,SAASqD;QACrC,OAAOA;IACT,EAAE,OAAO5D,OAAO;QAEdC,QAAQC,IAAI,CAAC,4CAA4CF,MAAMG,OAAO;QACtE,MAAMyD,UAAU,MAAMQ,kBAAkBpB,aAAazC;QAGrD8D,eAAerB,aAAazC,SAASqD;QACrC,OAAOA;IACT;AACF;AAKA,eAAeQ,kBAAkBpB,WAAW,EAAEzC,UAAU,CAAC,CAAC;IACxD,MAAMV,aAAalB,GAAGmB,KAAK;IAC3B,MAAMyD,QAAQhD,QAAQgD,KAAK,IAAI;IAC/B,MAAMxC,YAAYR,QAAQQ,SAAS;IAGnC,IAAIuD,QAAQ,CAAC;;;;;;;;;EASb,CAAC;IAED,MAAMC,SAAS,EAAE;IAGjB,IAAIxD,WAAW;QACbuD,SAAS,CAAC,wBAAwB,CAAC;QACnCC,OAAO7C,IAAI,CAAC,CAAC,cAAc,EAAEX,UAAU,EAAE,CAAC;IAC5C;IAGAuD,SAAS,CAAC;;;GAGT,CAAC;IACFC,OAAO7C,IAAI,CAAC,CAAC,SAAS,EAAEsB,YAAY,GAAG,CAAC,EAAE,CAAC,WAAW,EAAEA,YAAY,GAAG,CAAC;IAGxEsB,SAAS,CAAC,mDAAmD,CAAC;IAC9DC,OAAO7C,IAAI,CAAC6B;IAEZ,MAAMiB,OAAO3E,WAAW4E,OAAO,CAACH,OAAOI,GAAG,IAAIH;IAE9C,OAAOC,KAAKtC,GAAG,CAACyC,CAAAA;QACd,IAAI;YACF,MAAMb,OAAOjD,KAAKkD,KAAK,CAACY,IAAI/D,YAAY;YACxC,OAAO;gBACLF,IAAIiE,IAAIjE,EAAE;gBACVL,KAAKyD,KAAKzD,GAAG;gBACbC,OAAOwD,KAAKxD,KAAK;gBACjBS,WAAW+C,KAAK/C,SAAS;gBACzBG,YAAYyD,IAAIzD,UAAU;gBAC1BC,aAAawD,IAAIxD,WAAW;gBAC5BC,YAAYuD,IAAIvD,UAAU;YAC5B;QACF,EAAE,OAAM;YACN,OAAO;QACT;IACF,GAAG6C,MAAM,CAACC;AACZ;AAKA,SAAShB,eAAeF,WAAW,EAAEzC,OAAO;IAC1C,MAAMqE,WAAW/D,KAAKC,SAAS,CAAC;QAAEkC;QAAazC;IAAQ;IACvD,MAAM0C,SAAS/D,WAAW2F,GAAG,CAACD;IAE9B,IAAI3B,UAAU5B,KAAKyD,GAAG,KAAK7B,OAAO8B,SAAS,GAAG1F,WAAW;QACvD,OAAO4D,OAAOW,OAAO;IACvB;IAEA,OAAO;AACT;AAKA,SAASS,eAAerB,WAAW,EAAEzC,OAAO,EAAEqD,OAAO;IACnD,MAAMgB,WAAW/D,KAAKC,SAAS,CAAC;QAAEkC;QAAazC;IAAQ;IAGvD,IAAIrB,WAAW8F,IAAI,IAAI5F,YAAY;QACjC,MAAM6F,WAAW/F,WAAWgG,IAAI,GAAGC,IAAI,GAAG7E,KAAK;QAC/CpB,WAAWkG,MAAM,CAACH;IACpB;IAEA/F,WAAWmG,GAAG,CAACT,UAAU;QACvBhB;QACAmB,WAAW1D,KAAKyD,GAAG;IACrB;AACF;AAKA,OAAO,eAAeQ,aAAa/E,UAAU,CAAC,CAAC;IAC7C,MAAMV,aAAalB,GAAGmB,KAAK;IAE3B,MAAMyD,QAAQhD,QAAQgD,KAAK,IAAI;IAC/B,MAAMgC,SAAShF,QAAQiF,IAAI,IAAI;IAC/B,MAAMC,YAAYlF,QAAQmF,KAAK,IAAI;IAEnC,MAAMlB,OAAO3E,WAAW4E,OAAO,CAAC,CAAC;;aAEtB,EAAEc,OAAO,CAAC,EAAEE,UAAU;;EAEjC,CAAC,EAAEf,GAAG,CAACnB;IAEP,OAAOiB,KAAKtC,GAAG,CAACyC,CAAAA;QACd,IAAI;YACF,MAAMb,OAAOjD,KAAKkD,KAAK,CAACY,IAAI/D,YAAY;YACxC,OAAO;gBACLF,IAAIiE,IAAIjE,EAAE;gBACVL,KAAKyD,KAAKzD,GAAG;gBACbC,OAAOwD,KAAKxD,KAAK;gBACjBS,WAAW+C,KAAK/C,SAAS;gBACzBG,YAAYyD,IAAIzD,UAAU;gBAC1BC,aAAawD,IAAIxD,WAAW;gBAC5BC,YAAYuD,IAAIvD,UAAU;YAC5B;QACF,EAAE,OAAM;YACN,OAAO;QACT;IACF,GAAG6C,MAAM,CAACC;AACZ;AAKA,OAAO,eAAeyB;IACpB,MAAM9F,aAAalB,GAAGmB,KAAK;IAE3B,MAAM8F,QAAQ/F,WAAW4E,OAAO,CAAC,CAAC;;;;;;EAMlC,CAAC,EAAEI,GAAG;IAEN,MAAMgB,iBAAiBhG,WAAW4E,OAAO,CAAC,CAAC;;EAE3C,CAAC,EAAEI,GAAG;IAEN,MAAMiB,kBAAkBjG,WAAW4E,OAAO,CAAC,CAAC;;EAE5C,CAAC,EAAEI,GAAG;IAEN,OAAO;QACLkB,gBAAgBH,MAAMG,cAAc,IAAI;QACxCC,gBAAgBJ,MAAMI,cAAc,IAAI;QACxCC,aAAaL,MAAMK,WAAW,IAAI;QAClCC,kBAAkBL,eAAeM,KAAK,IAAI;QAC1CC,oBAAoBN,gBAAgBK,KAAK,IAAI;IAC/C;AACF;AAMA,OAAO,eAAeE;IACpB,IAAI;QACF,MAAMxG,aAAalB,GAAGmB,KAAK;QAG3B,MAAMwG,iBAAiB;YACrB;YACA;YACA;YACA;YACA;YACA;YACA;SACD;QAGD,MAAMC,iBAAiB1G,WAAW4E,OAAO,CAAC,CAAC;;;IAG3C,CAAC,EAAEC,GAAG,GAAGxC,GAAG,CAACyC,CAAAA,MAAOA,IAAI6B,IAAI;QAG5B,MAAMC,gBAAgBH,eAAerC,MAAM,CAACyC,CAAAA,QAAS,CAACH,eAAeI,QAAQ,CAACD;QAE9E,OAAO;YACLE,QAAQH,cAAc5E,MAAM,KAAK;YACjC0E;YACAE;YACAH;QACF;IACF,EAAE,OAAOtG,OAAO;QACd,OAAO;YACL4G,QAAQ;YACRL,gBAAgB,EAAE;YAClBE,eAAe,EAAE;YACjBH,gBAAgB,EAAE;YAClBtG,OAAOA,MAAMG,OAAO;QACtB;IACF;AACF;AAKA,OAAO,eAAe0G;IACpB,IAAI;QAEF,MAAMC,aAAa,MAAMT;QAEzB,IAAIS,WAAWF,MAAM,EAAE;YACrB,OAAO;gBACLG,SAAS;gBACT5G,SAAS;gBACT6G,UAAU;YACZ;QACF;QAGA,MAAMxH;QAGN,MAAMyH,aAAa,MAAMZ;QAEzB,OAAO;YACLU,SAASE,WAAWL,MAAM;YAC1BzG,SAAS,CAAC,qBAAqB,EAAE2G,WAAWL,aAAa,CAAC5E,MAAM,CAAC,aAAa,CAAC;YAC/EmF,UAAU;YACVE,aAAaJ,WAAWL,aAAa;QACvC;IACF,EAAE,OAAOzG,OAAO;QACd,OAAO;YACL+G,SAAS;YACT5G,SAAS,CAAC,kBAAkB,EAAEH,MAAMG,OAAO,EAAE;YAC7CH,OAAOA,MAAMG,OAAO;QACtB;IACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/utils/key-redactor.
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/key-redactor.ts"],"sourcesContent":["/**\n * API Key Redaction Utility\n * Prevents sensitive data from leaking into logs, memory, or git commits\n */\n\nexport interface RedactionConfig {\n patterns: RegExp[];\n replacement: string;\n maskLength: number;\n}\n\nexport class KeyRedactor {\n private static readonly API_KEY_PATTERNS = [\n // Anthropic API keys\n /sk-ant-[a-zA-Z0-9_-]{95,}/gi,\n\n // OpenRouter API keys\n /sk-or-[a-zA-Z0-9_-]{32,}/gi,\n\n // Google/Gemini API keys\n /AIza[a-zA-Z0-9_-]{35}/gi,\n\n // Generic API keys\n /[a-zA-Z0-9_-]{20,}API[a-zA-Z0-9_-]{20,}/gi,\n\n // Bearer tokens\n /Bearer\\s+[a-zA-Z0-9_\\-\\.]{20,}/gi,\n\n // Environment variable format\n /([A-Z_]+_API_KEY|[A-Z_]+_TOKEN|[A-Z_]+_SECRET)=[\"']?([^\"'\\s]+)[\"']?/gi,\n\n // Supabase keys\n /eyJ[a-zA-Z0-9_-]*\\.eyJ[a-zA-Z0-9_-]*\\.[a-zA-Z0-9_-]*/gi,\n ];\n\n private static readonly SENSITIVE_FIELDS = [\n 'apiKey',\n 'api_key',\n 'token',\n 'secret',\n 'password',\n 'private_key',\n 'privateKey',\n 'accessToken',\n 'access_token',\n 'refreshToken',\n 'refresh_token',\n ];\n\n /**\n * Redact API keys and sensitive data from text\n */\n static redact(text: string, showPrefix = true): string {\n if (!text) return text;\n\n let redacted = text;\n\n // Redact using patterns\n this.API_KEY_PATTERNS.forEach(pattern => {\n redacted = redacted.replace(pattern, (match) => {\n if (showPrefix && match.length > 8) {\n const prefix = match.substring(0, 8);\n return `${prefix}...[REDACTED]`;\n }\n return '[REDACTED_API_KEY]';\n });\n });\n\n return redacted;\n }\n\n /**\n * Redact sensitive fields in objects\n */\n static redactObject<T extends Record<string, any>>(obj: T, deep = true): T {\n if (!obj || typeof obj !== 'object') return obj;\n\n const redacted = { ...obj };\n\n Object.keys(redacted).forEach(key => {\n const lowerKey = key.toLowerCase();\n\n // Check if field name is sensitive\n const isSensitive = this.SENSITIVE_FIELDS.some(field =>\n lowerKey.includes(field)\n );\n\n if (isSensitive && typeof redacted[key] === 'string') {\n const value = redacted[key] as string;\n if (value && value.length > 8) {\n redacted[key] = `${value.substring(0, 4)}...[REDACTED]` as any;\n } else {\n redacted[key] = '[REDACTED]' as any;\n }\n } else if (deep && typeof redacted[key] === 'object' && redacted[key] !== null) {\n redacted[key] = this.redactObject(redacted[key], deep);\n } else if (typeof redacted[key] === 'string') {\n // Redact any API keys in string values\n redacted[key] = this.redact(redacted[key]) as any;\n }\n });\n\n return redacted;\n }\n\n /**\n * Sanitize text for safe logging\n */\n static sanitize(text: string): string {\n return this.redact(text, true);\n }\n\n /**\n * Sanitize command arguments\n */\n static sanitizeArgs(args: string[]): string[] {\n return args.map(arg => {\n // Check if arg is a flag value pair\n if (arg.includes('key') || arg.includes('token') || arg.includes('secret')) {\n return this.redact(arg);\n }\n return arg;\n });\n }\n\n /**\n * Check if text contains unredacted sensitive data\n */\n static containsSensitiveData(text: string): boolean {\n return this.API_KEY_PATTERNS.some(pattern => pattern.test(text));\n }\n\n /**\n * Validate that text is safe for logging/storage\n */\n static validate(text: string): { safe: boolean; warnings: string[] } {\n const warnings: string[] = [];\n\n this.API_KEY_PATTERNS.forEach((pattern, index) => {\n if (pattern.test(text)) {\n warnings.push(`Potential API key detected (pattern ${index + 1})`);\n }\n });\n\n return {\n safe: warnings.length === 0,\n warnings,\n };\n }\n\n /**\n * Redact environment variables\n */\n static redactEnv(env: Record<string, string | undefined>): Record<string, string> {\n const redacted: Record<string, string> = {};\n\n Object.keys(env).forEach(key => {\n const value = env[key];\n if (!value) {\n redacted[key] = '';\n return;\n }\n\n const lowerKey = key.toLowerCase();\n const isSensitive = lowerKey.includes('key') ||\n lowerKey.includes('token') ||\n lowerKey.includes('secret') ||\n lowerKey.includes('password');\n\n if (isSensitive) {\n redacted[key] = value.length > 8\n ? `${value.substring(0, 4)}...[REDACTED]`\n : '[REDACTED]';\n } else {\n redacted[key] = value;\n }\n });\n\n return redacted;\n }\n}\n\n// Export singleton instance\nexport const redactor = KeyRedactor;\n"],"names":["KeyRedactor","API_KEY_PATTERNS","SENSITIVE_FIELDS","redact","text","showPrefix","redacted","forEach","pattern","replace","match","length","prefix","substring","redactObject","obj","deep","Object","keys","key","lowerKey","toLowerCase","isSensitive","some","field","includes","value","sanitize","sanitizeArgs","args","map","arg","containsSensitiveData","test","validate","warnings","index","push","safe","redactEnv","env","redactor"],"mappings":"AAWA,OAAO,MAAMA;IACX,OAAwBC,mBAAmB;QAEzC;QAGA;QAGA;QAGA;QAGA;QAGA;QAGA;KACD,CAAC;IAEF,OAAwBC,mBAAmB;QACzC;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;KACD,CAAC;IAKF,OAAOC,OAAOC,IAAY,EAAEC,aAAa,IAAI,EAAU;QACrD,IAAI,CAACD,MAAM,OAAOA;QAElB,IAAIE,WAAWF;QAGf,IAAI,CAACH,gBAAgB,CAACM,OAAO,CAACC,CAAAA;YAC5BF,WAAWA,SAASG,OAAO,CAACD,SAAS,CAACE;gBACpC,IAAIL,cAAcK,MAAMC,MAAM,GAAG,GAAG;oBAClC,MAAMC,SAASF,MAAMG,SAAS,CAAC,GAAG;oBAClC,OAAO,GAAGD,OAAO,aAAa,CAAC;gBACjC;gBACA,OAAO;YACT;QACF;QAEA,OAAON;IACT;IAKA,OAAOQ,aAA4CC,GAAM,EAAEC,OAAO,IAAI,EAAK;QACzE,IAAI,CAACD,OAAO,OAAOA,QAAQ,UAAU,OAAOA;QAE5C,MAAMT,WAAW;YAAE,GAAGS,GAAG;QAAC;QAE1BE,OAAOC,IAAI,CAACZ,UAAUC,OAAO,CAACY,CAAAA;YAC5B,MAAMC,WAAWD,IAAIE,WAAW;YAGhC,MAAMC,cAAc,IAAI,CAACpB,gBAAgB,CAACqB,IAAI,CAACC,CAAAA,QAC7CJ,SAASK,QAAQ,CAACD;YAGpB,IAAIF,eAAe,OAAOhB,QAAQ,CAACa,IAAI,KAAK,UAAU;gBACpD,MAAMO,QAAQpB,QAAQ,CAACa,IAAI;gBAC3B,IAAIO,SAASA,MAAMf,MAAM,GAAG,GAAG;oBAC7BL,QAAQ,CAACa,IAAI,GAAG,GAAGO,MAAMb,SAAS,CAAC,GAAG,GAAG,aAAa,CAAC;gBACzD,OAAO;oBACLP,QAAQ,CAACa,IAAI,GAAG;gBAClB;YACF,OAAO,IAAIH,QAAQ,OAAOV,QAAQ,CAACa,IAAI,KAAK,YAAYb,QAAQ,CAACa,IAAI,KAAK,MAAM;gBAC9Eb,QAAQ,CAACa,IAAI,GAAG,IAAI,CAACL,YAAY,CAACR,QAAQ,CAACa,IAAI,EAAEH;YACnD,OAAO,IAAI,OAAOV,QAAQ,CAACa,IAAI,KAAK,UAAU;gBAE5Cb,QAAQ,CAACa,IAAI,GAAG,IAAI,CAAChB,MAAM,CAACG,QAAQ,CAACa,IAAI;YAC3C;QACF;QAEA,OAAOb;IACT;IAKA,OAAOqB,SAASvB,IAAY,EAAU;QACpC,OAAO,IAAI,CAACD,MAAM,CAACC,MAAM;IAC3B;IAKA,OAAOwB,aAAaC,IAAc,EAAY;QAC5C,OAAOA,KAAKC,GAAG,CAACC,CAAAA;YAEd,IAAIA,IAAIN,QAAQ,CAAC,UAAUM,IAAIN,QAAQ,CAAC,YAAYM,IAAIN,QAAQ,CAAC,WAAW;gBAC1E,OAAO,IAAI,CAACtB,MAAM,CAAC4B;YACrB;YACA,OAAOA;QACT;IACF;IAKA,OAAOC,sBAAsB5B,IAAY,EAAW;QAClD,OAAO,IAAI,CAACH,gBAAgB,CAACsB,IAAI,CAACf,CAAAA,UAAWA,QAAQyB,IAAI,CAAC7B;IAC5D;IAKA,OAAO8B,SAAS9B,IAAY,EAAyC;QACnE,MAAM+B,WAAqB,EAAE;QAE7B,IAAI,CAAClC,gBAAgB,CAACM,OAAO,CAAC,CAACC,SAAS4B;YACtC,IAAI5B,QAAQyB,IAAI,CAAC7B,OAAO;gBACtB+B,SAASE,IAAI,CAAC,CAAC,oCAAoC,EAAED,QAAQ,EAAE,CAAC,CAAC;YACnE;QACF;QAEA,OAAO;YACLE,MAAMH,SAASxB,MAAM,KAAK;YAC1BwB;QACF;IACF;IAKA,OAAOI,UAAUC,GAAuC,EAA0B;QAChF,MAAMlC,WAAmC,CAAC;QAE1CW,OAAOC,IAAI,CAACsB,KAAKjC,OAAO,CAACY,CAAAA;YACvB,MAAMO,QAAQc,GAAG,CAACrB,IAAI;YACtB,IAAI,CAACO,OAAO;gBACVpB,QAAQ,CAACa,IAAI,GAAG;gBAChB;YACF;YAEA,MAAMC,WAAWD,IAAIE,WAAW;YAChC,MAAMC,cAAcF,SAASK,QAAQ,CAAC,UACnBL,SAASK,QAAQ,CAAC,YAClBL,SAASK,QAAQ,CAAC,aAClBL,SAASK,QAAQ,CAAC;YAErC,IAAIH,aAAa;gBACfhB,QAAQ,CAACa,IAAI,GAAGO,MAAMf,MAAM,GAAG,IAC3B,GAAGe,MAAMb,SAAS,CAAC,GAAG,GAAG,aAAa,CAAC,GACvC;YACN,OAAO;gBACLP,QAAQ,CAACa,IAAI,GAAGO;YAClB;QACF;QAEA,OAAOpB;IACT;AACF;AAGA,OAAO,MAAMmC,WAAWzC,YAAY"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
# ReasoningBank Status - v2.7.0-alpha.5
|
|
2
|
+
|
|
3
|
+
## Current Status: Experimental (Not Production-Ready)
|
|
4
|
+
|
|
5
|
+
**Last Updated:** 2025-10-13
|
|
6
|
+
**Version:** v2.7.0-alpha.5
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Summary
|
|
11
|
+
|
|
12
|
+
ReasoningBank integration is **experimental** and has known performance issues. We recommend using **Basic Mode** for all production use.
|
|
13
|
+
|
|
14
|
+
## Performance Status
|
|
15
|
+
|
|
16
|
+
| Component | Status | Performance | Recommendation |
|
|
17
|
+
|-----------|--------|-------------|----------------|
|
|
18
|
+
| **Basic Mode** | ✅ **Production Ready** | <100ms queries, <500ms storage | **Use This** |
|
|
19
|
+
| **ReasoningBank** | ⚠️ Experimental | Adapter needs WASM update | Avoid for now |
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## What Works
|
|
24
|
+
|
|
25
|
+
✅ **Basic Mode (Recommended)**
|
|
26
|
+
```bash
|
|
27
|
+
# Fast, reliable, production-tested
|
|
28
|
+
npx claude-flow@alpha memory store "key" "value"
|
|
29
|
+
npx claude-flow@alpha memory query "key"
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**Performance:**
|
|
33
|
+
- Query: <100ms
|
|
34
|
+
- Storage: <500ms
|
|
35
|
+
- Throughput: 100+ ops/sec
|
|
36
|
+
- Reliability: 100% success rate
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## ReasoningBank Issues
|
|
41
|
+
|
|
42
|
+
### Problem: Adapter Not Using WASM
|
|
43
|
+
|
|
44
|
+
**Root Cause:** Our adapter (`src/reasoningbank/reasoningbank-adapter.js`) imports from the old SDK API:
|
|
45
|
+
```javascript
|
|
46
|
+
// Current (slow):
|
|
47
|
+
import { db, initialize } from 'agentic-flow/dist/reasoningbank/index.js';
|
|
48
|
+
|
|
49
|
+
// Should be (fast):
|
|
50
|
+
import { createReasoningBank } from 'agentic-flow/dist/reasoningbank/wasm-adapter.js';
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Performance Impact
|
|
54
|
+
|
|
55
|
+
- **Expected (WASM)**: 0.04ms/op, 10,000-25,000 ops/sec
|
|
56
|
+
- **Actual (SDK)**: >30s timeout (300x+ slower)
|
|
57
|
+
- **Cause**: Synchronous embedding generation blocks event loop
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Changes in v2.7.0-alpha.5
|
|
62
|
+
|
|
63
|
+
### ✅ What's Fixed
|
|
64
|
+
1. **Dependency Updated**: agentic-flow v1.5.9 → v1.5.11
|
|
65
|
+
2. **WASM Available**: `node_modules/agentic-flow/wasm/reasoningbank/reasoningbank_wasm_bg.wasm` (211KB)
|
|
66
|
+
3. **Query Fallback**: SQL fallback when semantic search times out
|
|
67
|
+
4. **Migration Support**: Both `init --force` and `memory init --reasoningbank` detect and migrate old databases
|
|
68
|
+
|
|
69
|
+
### ❌ What's Not Fixed
|
|
70
|
+
1. **Storage Performance**: Adapter still uses slow SDK API
|
|
71
|
+
2. **WASM Integration**: Requires adapter refactoring to use WASM directly
|
|
72
|
+
3. **Production Readiness**: ReasoningBank remains experimental
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Roadmap
|
|
77
|
+
|
|
78
|
+
### Short Term (Next Release)
|
|
79
|
+
- [ ] Refactor adapter to use WASM API (`createReasoningBank`)
|
|
80
|
+
- [ ] Add performance tests comparing SDK vs WASM
|
|
81
|
+
- [ ] Validate <100ms storage with WASM
|
|
82
|
+
|
|
83
|
+
### Long Term
|
|
84
|
+
- [ ] Full WASM integration
|
|
85
|
+
- [ ] Production validation suite
|
|
86
|
+
- [ ] Performance benchmarks
|
|
87
|
+
- [ ] Migration from Basic Mode to ReasoningBank
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Recommendations
|
|
92
|
+
|
|
93
|
+
### For Production Use
|
|
94
|
+
```bash
|
|
95
|
+
# ✅ Use Basic Mode (fast and reliable)
|
|
96
|
+
npx claude-flow@alpha init
|
|
97
|
+
npx claude-flow@alpha memory store "key" "value"
|
|
98
|
+
npx claude-flow@alpha memory query "key"
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### For Experimentation
|
|
102
|
+
```bash
|
|
103
|
+
# ⚠️ ReasoningBank (experimental, slow)
|
|
104
|
+
npx claude-flow@alpha init --reasoningbank
|
|
105
|
+
npx claude-flow@alpha memory store "key" "value" --reasoningbank
|
|
106
|
+
# Expect: 30s+ timeout on storage
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Technical Details
|
|
112
|
+
|
|
113
|
+
### agentic-flow@1.5.11 WASM Performance
|
|
114
|
+
- **Storage**: 0.04ms/op (tested in agentic-flow)
|
|
115
|
+
- **Throughput**: 10,000-25,000 ops/sec
|
|
116
|
+
- **Memory**: Stable (<1MB delta for 100 ops)
|
|
117
|
+
- **Tests**: 13/13 passing
|
|
118
|
+
|
|
119
|
+
### Why Our Adapter Is Slow
|
|
120
|
+
1. Uses old SDK API (`agentic-flow/dist/reasoningbank/index.js`)
|
|
121
|
+
2. SDK calls `computeEmbedding()` synchronously
|
|
122
|
+
3. Requires AI API call for each storage operation
|
|
123
|
+
4. Blocks event loop until embedding completes (30s+)
|
|
124
|
+
|
|
125
|
+
### How to Fix
|
|
126
|
+
Update `src/reasoningbank/reasoningbank-adapter.js` to use WASM:
|
|
127
|
+
```javascript
|
|
128
|
+
import { createReasoningBank } from 'agentic-flow/dist/reasoningbank/wasm-adapter.js';
|
|
129
|
+
|
|
130
|
+
// Use WASM API instead of SDK
|
|
131
|
+
const rb = await createReasoningBank('claude-flow-memory');
|
|
132
|
+
const patternId = await rb.storePattern({
|
|
133
|
+
task_description: value,
|
|
134
|
+
task_category: options.namespace || 'default',
|
|
135
|
+
strategy: key,
|
|
136
|
+
success_score: options.confidence || 0.8
|
|
137
|
+
});
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## Comparison
|
|
143
|
+
|
|
144
|
+
| Feature | Basic Mode | ReasoningBank (SDK) | ReasoningBank (WASM) |
|
|
145
|
+
|---------|------------|---------------------|----------------------|
|
|
146
|
+
| Storage Speed | <500ms | >30s (timeout) | 0.04ms (expected) |
|
|
147
|
+
| Query Speed | <100ms | Varies | <1ms (expected) |
|
|
148
|
+
| Semantic Search | ❌ No | ✅ Yes | ✅ Yes |
|
|
149
|
+
| Production Ready | ✅ Yes | ❌ No | 🔄 Pending |
|
|
150
|
+
| API Compatibility | ✅ Stable | ⚠️ Experimental | 🔄 New |
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## Support
|
|
155
|
+
|
|
156
|
+
- **Use Basic Mode**: Recommended for all users
|
|
157
|
+
- **Report Issues**: [GitHub Issues](https://github.com/ruvnet/claude-code-flow/issues)
|
|
158
|
+
- **Documentation**: [README.md](../README.md)
|
|
159
|
+
- **Performance Reports**: See REASONINGBANK-INTEGRATION-STATUS.md
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
**Bottom Line**: Use Basic Mode for production. ReasoningBank will be ready when adapter is refactored to use WASM.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-flow",
|
|
3
|
-
"version": "2.7.0-alpha.
|
|
3
|
+
"version": "2.7.0-alpha.5",
|
|
4
4
|
"description": "Enterprise-grade AI agent orchestration with multi-provider execution engine",
|
|
5
5
|
"mcpName": "io.github.ruvnet/claude-flow",
|
|
6
6
|
"main": "cli.mjs",
|
|
@@ -121,7 +121,7 @@
|
|
|
121
121
|
"@anthropic-ai/sdk": "^0.65.0",
|
|
122
122
|
"@modelcontextprotocol/sdk": "^1.0.4",
|
|
123
123
|
"@types/better-sqlite3": "^7.6.13",
|
|
124
|
-
"agentic-flow": "^1.5.
|
|
124
|
+
"agentic-flow": "^1.5.11",
|
|
125
125
|
"blessed": "^0.1.81",
|
|
126
126
|
"chalk": "^4.1.2",
|
|
127
127
|
"cli-table3": "^0.6.3",
|