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.
@@ -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('[ReasoningBank] Warning: Could not compute embedding:', error.message);
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 retrieveMemories(searchQuery, {
45
- domain: options.domain || 'general',
46
- agent: options.agent || 'memory-agent',
47
- k: options.limit || 10
48
- });
49
- return memories.map((mem)=>{
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] Semantic search failed, using simple query:', error.message);
68
- const dbInstance = db.getDb();
69
- const rows = dbInstance.prepare(`
70
- SELECT * FROM patterns
71
- WHERE pattern_data LIKE ?
72
- ORDER BY confidence DESC, usage_count DESC
73
- LIMIT ?
74
- `).all(`%${searchQuery}%`, options.limit || 10);
75
- return rows.map((row)=>{
76
- try {
77
- const data = JSON.parse(row.pattern_data);
78
- return {
79
- id: row.id,
80
- key: data.key,
81
- value: data.value,
82
- namespace: data.namespace,
83
- confidence: row.confidence,
84
- usage_count: row.usage_count,
85
- created_at: row.created_at
86
- };
87
- } catch {
88
- return null;
89
- }
90
- }).filter(Boolean);
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":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/key-redactor.js"],"sourcesContent":["/**\n * API Key Redaction Utility\n * Prevents sensitive data from leaking into logs, memory, or git commits\n */\n\nexport class KeyRedactor {\n static 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 static 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, showPrefix = true) {\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(obj, deep = true) {\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];\n if (value && value.length > 8) {\n redacted[key] = `${value.substring(0, 4)}...[REDACTED]`;\n } else {\n redacted[key] = '[REDACTED]';\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]);\n }\n });\n\n return redacted;\n }\n\n /**\n * Sanitize text for safe logging\n */\n static sanitize(text) {\n return this.redact(text, true);\n }\n\n /**\n * Sanitize command arguments\n */\n static sanitizeArgs(args) {\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) {\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) {\n const warnings = [];\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) {\n const redacted = {};\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":"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"},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"}
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":"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"}
@@ -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.2",
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.9",
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",