claude-flow 2.7.0-alpha.1 → 2.7.0-alpha.4

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 +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"],"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"],"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,13 +1,11 @@
1
- import { promises as fs } from 'fs';
2
- import path from 'path';
1
+ import * as fs from 'fs/promises';
2
+ import * as path from 'path';
3
3
  import { exec } from 'child_process';
4
4
  import { promisify } from 'util';
5
5
  const execAsync = promisify(exec);
6
- let MetricsReader = class MetricsReader {
7
- constructor(){
8
- this.metricsDir = '.claude-flow/metrics';
9
- this.sessionsDir = '.claude-flow/sessions';
10
- }
6
+ export class MetricsReader {
7
+ metricsDir = '.claude-flow/metrics';
8
+ sessionsDir = '.claude-flow/sessions';
11
9
  async getSystemMetrics() {
12
10
  try {
13
11
  const filePath = path.join(this.metricsDir, 'system-metrics.json');
@@ -18,15 +16,6 @@ let MetricsReader = class MetricsReader {
18
16
  return null;
19
17
  }
20
18
  }
21
- async getTaskQueue() {
22
- try {
23
- const queueFile = '.claude-flow/tasks/queue.json';
24
- const content = await fs.readFile(queueFile, 'utf8');
25
- return JSON.parse(content);
26
- } catch (error) {
27
- return [];
28
- }
29
- }
30
19
  async getTaskMetrics() {
31
20
  try {
32
21
  const filePath = path.join(this.metricsDir, 'task-metrics.json');
@@ -47,30 +36,30 @@ let MetricsReader = class MetricsReader {
47
36
  }
48
37
  async getActiveAgents() {
49
38
  try {
39
+ const perfMetrics = await this.getPerformanceMetrics();
40
+ const sessionFiles = await this.getSessionFiles();
50
41
  const agents = [];
51
- const agentsDir = '.claude-flow/agents';
52
- try {
53
- const agentFiles = await fs.readdir(agentsDir);
54
- for (const file of agentFiles){
55
- if (file.endsWith('.json')) {
56
- try {
57
- const content = await fs.readFile(path.join(agentsDir, file), 'utf8');
58
- const agent = JSON.parse(content);
59
- agents.push(agent);
60
- } catch {}
42
+ for (const file of sessionFiles){
43
+ try {
44
+ const content = await fs.readFile(path.join(this.sessionsDir, 'pair', file), 'utf8');
45
+ const sessionData = JSON.parse(content);
46
+ if (sessionData.agents && Array.isArray(sessionData.agents)) {
47
+ agents.push(...sessionData.agents);
61
48
  }
62
- }
63
- } catch {}
64
- if (agents.length === 0) {
65
- const sessionFiles = await this.getSessionFiles();
66
- for (const file of sessionFiles){
67
- try {
68
- const content = await fs.readFile(path.join(this.sessionsDir, 'pair', file), 'utf8');
69
- const sessionData = JSON.parse(content);
70
- if (sessionData.agents && Array.isArray(sessionData.agents)) {
71
- agents.push(...sessionData.agents);
72
- }
73
- } catch {}
49
+ } catch {}
50
+ }
51
+ if (agents.length === 0 && perfMetrics) {
52
+ const activeCount = perfMetrics.activeAgents || 0;
53
+ const totalCount = perfMetrics.totalAgents || 0;
54
+ for(let i = 0; i < totalCount; i++){
55
+ agents.push({
56
+ id: `agent-${i + 1}`,
57
+ name: `Agent ${i + 1}`,
58
+ type: i === 0 ? 'orchestrator' : 'worker',
59
+ status: i < activeCount ? 'active' : 'idle',
60
+ activeTasks: i < activeCount ? 1 : 0,
61
+ lastActivity: Date.now() - i * 1000
62
+ });
74
63
  }
75
64
  }
76
65
  return agents;
@@ -146,7 +135,7 @@ let MetricsReader = class MetricsReader {
146
135
  }
147
136
  async getMCPServerStatus() {
148
137
  try {
149
- const { stdout } = await execAsync('ps aux | grep -E "mcp" | grep -v grep | wc -l');
138
+ const { stdout } = await execAsync('ps aux | grep -E "mcp-server\\.js|claude-flow mcp start" | grep -v grep | wc -l');
150
139
  const processCount = parseInt(stdout.trim(), 10);
151
140
  const { stdout: orchestratorOut } = await execAsync('ps aux | grep -E "claude-flow start" | grep -v grep | wc -l');
152
141
  const orchestratorRunning = parseInt(orchestratorOut.trim(), 10) > 0;
@@ -175,7 +164,6 @@ let MetricsReader = class MetricsReader {
175
164
  };
176
165
  }
177
166
  }
178
- };
179
- export { MetricsReader };
167
+ }
180
168
 
181
169
  //# sourceMappingURL=metrics-reader.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/metrics-reader.js"],"sourcesContent":["import { promises as fs } from 'fs';\nimport path from 'path';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\n\nconst execAsync = promisify(exec);\n\nclass MetricsReader {\n constructor() {\n this.metricsDir = '.claude-flow/metrics';\n this.sessionsDir = '.claude-flow/sessions';\n }\n\n async getSystemMetrics() {\n try {\n const filePath = path.join(this.metricsDir, 'system-metrics.json');\n const content = await fs.readFile(filePath, 'utf8');\n const metrics = JSON.parse(content);\n \n // Return the most recent metric\n return metrics.length > 0 ? metrics[metrics.length - 1] : null;\n } catch (error) {\n return null;\n }\n }\n\n async getTaskQueue() {\n try {\n const queueFile = '.claude-flow/tasks/queue.json';\n const content = await fs.readFile(queueFile, 'utf8');\n return JSON.parse(content);\n } catch (error) {\n return [];\n }\n }\n\n async getTaskMetrics() {\n try {\n const filePath = path.join(this.metricsDir, 'task-metrics.json');\n const content = await fs.readFile(filePath, 'utf8');\n return JSON.parse(content);\n } catch (error) {\n return [];\n }\n }\n\n async getPerformanceMetrics() {\n try {\n const filePath = path.join(this.metricsDir, 'performance.json');\n const content = await fs.readFile(filePath, 'utf8');\n return JSON.parse(content);\n } catch (error) {\n return null;\n }\n }\n\n async getActiveAgents() {\n try {\n const agents = [];\n \n // Check for agents in the .claude-flow/agents directory\n const agentsDir = '.claude-flow/agents';\n try {\n const agentFiles = await fs.readdir(agentsDir);\n for (const file of agentFiles) {\n if (file.endsWith('.json')) {\n try {\n const content = await fs.readFile(path.join(agentsDir, file), 'utf8');\n const agent = JSON.parse(content);\n agents.push(agent);\n } catch {\n // Skip invalid agent files\n }\n }\n }\n } catch {\n // Agents directory doesn't exist yet\n }\n \n // If no agents found in directory, check session files\n if (agents.length === 0) {\n const sessionFiles = await this.getSessionFiles();\n for (const file of sessionFiles) {\n try {\n const content = await fs.readFile(path.join(this.sessionsDir, 'pair', file), 'utf8');\n const sessionData = JSON.parse(content);\n \n if (sessionData.agents && Array.isArray(sessionData.agents)) {\n agents.push(...sessionData.agents);\n }\n } catch {\n // Skip invalid session files\n }\n }\n }\n \n return agents;\n } catch (error) {\n return [];\n }\n }\n\n async getSessionStatus() {\n try {\n const sessionFiles = await this.getSessionFiles();\n \n if (sessionFiles.length === 0) {\n return null;\n }\n \n // Get the most recent session\n const mostRecentFile = sessionFiles[sessionFiles.length - 1];\n const content = await fs.readFile(path.join(this.sessionsDir, 'pair', mostRecentFile), 'utf8');\n return JSON.parse(content);\n } catch (error) {\n return null;\n }\n }\n\n async getRecentTasks(limit = 10) {\n try {\n const taskMetrics = await this.getTaskMetrics();\n \n // Sort by timestamp descending and take the limit\n return taskMetrics\n .sort((a, b) => b.timestamp - a.timestamp)\n .slice(0, limit)\n .map(task => ({\n id: task.id,\n type: task.type,\n status: task.success ? 'completed' : 'failed',\n startTime: task.timestamp - task.duration,\n endTime: task.timestamp,\n duration: task.duration\n }));\n } catch (error) {\n return [];\n }\n }\n\n async getOverallHealth() {\n try {\n const systemMetrics = await this.getSystemMetrics();\n const perfMetrics = await this.getPerformanceMetrics();\n \n if (!systemMetrics && !perfMetrics) {\n return 'error';\n }\n \n // Check memory usage\n if (systemMetrics && systemMetrics.memoryUsagePercent > 90) {\n return 'error';\n }\n \n if (systemMetrics && systemMetrics.memoryUsagePercent > 75) {\n return 'warning';\n }\n \n // Check CPU load\n if (systemMetrics && systemMetrics.cpuLoad > 0.8) {\n return 'warning';\n }\n \n // Check task failure rate\n if (perfMetrics && perfMetrics.totalTasks > 0) {\n const failureRate = perfMetrics.failedTasks / perfMetrics.totalTasks;\n if (failureRate > 0.5) {\n return 'error';\n }\n if (failureRate > 0.2) {\n return 'warning';\n }\n }\n \n return 'healthy';\n } catch (error) {\n return 'error';\n }\n }\n\n async getSessionFiles() {\n try {\n const files = await fs.readdir(path.join(this.sessionsDir, 'pair'));\n return files.filter(f => f.endsWith('.json')).sort();\n } catch (error) {\n return [];\n }\n }\n\n async getMCPServerStatus() {\n try {\n // Check if MCP server process is running (including flow-nexus and other MCP variants)\n const { stdout } = await execAsync('ps aux | grep -E \"mcp\" | grep -v grep | wc -l');\n const processCount = parseInt(stdout.trim(), 10);\n \n // Check for orchestrator running\n const { stdout: orchestratorOut } = await execAsync('ps aux | grep -E \"claude-flow start\" | grep -v grep | wc -l');\n const orchestratorRunning = parseInt(orchestratorOut.trim(), 10) > 0;\n \n // Determine status\n const isRunning = processCount > 0;\n \n // Try to get port from process (default is 3000)\n let port = 3000;\n try {\n const { stdout: portOut } = await execAsync('lsof -i :3000 2>/dev/null | grep LISTEN | wc -l');\n if (parseInt(portOut.trim(), 10) === 0) {\n // If port 3000 not listening, check other common ports\n port = null;\n }\n } catch {\n // lsof might not be available or port not in use\n }\n \n return {\n running: isRunning,\n processCount,\n orchestratorRunning,\n port,\n connections: processCount > 0 ? Math.max(1, processCount - 1) : 0 // Estimate connections\n };\n } catch (error) {\n // Fallback if commands fail\n return {\n running: false,\n processCount: 0,\n orchestratorRunning: false,\n port: null,\n connections: 0\n };\n }\n }\n}\n\nexport { MetricsReader };"],"names":["promises","fs","path","exec","promisify","execAsync","MetricsReader","metricsDir","sessionsDir","getSystemMetrics","filePath","join","content","readFile","metrics","JSON","parse","length","error","getTaskQueue","queueFile","getTaskMetrics","getPerformanceMetrics","getActiveAgents","agents","agentsDir","agentFiles","readdir","file","endsWith","agent","push","sessionFiles","getSessionFiles","sessionData","Array","isArray","getSessionStatus","mostRecentFile","getRecentTasks","limit","taskMetrics","sort","a","b","timestamp","slice","map","task","id","type","status","success","startTime","duration","endTime","getOverallHealth","systemMetrics","perfMetrics","memoryUsagePercent","cpuLoad","totalTasks","failureRate","failedTasks","files","filter","f","getMCPServerStatus","stdout","processCount","parseInt","trim","orchestratorOut","orchestratorRunning","isRunning","port","portOut","running","connections","Math","max"],"mappings":"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"}AG,KAAK;gBAChD,OAAO;YACT;YAGA,IAAIzC,eAAeA,YAAY0C,UAAU,GAAG,GAAG;gBAC7C,MAAMC,cAAc3C,YAAY4C,WAAW,GAAG5C,YAAY0C,UAAU;gBACpE,IAAIC,cAAc,KAAK;oBACrB,OAAO;gBACT;gBACA,IAAIA,cAAc,KAAK;oBACrB,OAAO;gBACT;YACF;YAEA,OAAO;QACT,EAAE,OAAO/C,OAAO;YACd,OAAO;QACT;IACF;IAEA,MAAcM,kBAAqC;QACjD,IAAI;YACF,MAAM2C,QAAQ,MAAMlE,GAAGmE,OAAO,CAAClE,KAAKS,IAAI,CAAC,IAAI,CAACH,WAAW,EAAE;YAC3D,OAAO2D,MAAME,MAAM,CAACC,CAAAA,IAAKA,EAAEC,QAAQ,CAAC,UAAUtB,IAAI;QACpD,EAAE,OAAO/B,OAAO;YACd,OAAO,EAAE;QACX;IACF;IAEA,MAAMsD,qBAA+C;QACnD,IAAI;YAEF,MAAM,EAAEC,MAAM,EAAE,GAAG,MAAMpE,UAAU;YACnC,MAAMqE,eAAeC,SAASF,OAAOG,IAAI,IAAI;YAG7C,MAAM,EAAEH,QAAQI,eAAe,EAAE,GAAG,MAAMxE,UAAU;YACpD,MAAMyE,sBAAsBH,SAASE,gBAAgBD,IAAI,IAAI,MAAM;YAGnE,MAAMG,YAAYL,eAAe;YAGjC,IAAIM,OAAsB;YAC1B,IAAI;gBACF,MAAM,EAAEP,QAAQQ,OAAO,EAAE,GAAG,MAAM5E,UAAU;gBAC5C,IAAIsE,SAASM,QAAQL,IAAI,IAAI,QAAQ,GAAG;oBAEtCI,OAAO;gBACT;YACF,EAAE,OAAM,CAER;YAEA,OAAO;gBACLE,SAASH;gBACTL;gBACAI;gBACAE;gBACAG,aAAaT,eAAe,IAAIU,KAAKC,GAAG,CAAC,GAAGX,eAAe,KAAK;YAClE;QACF,EAAE,OAAOxD,OAAO;YAEd,OAAO;gBACLgE,SAAS;gBACTR,cAAc;gBACdI,qBAAqB;gBACrBE,MAAM;gBACNG,aAAa;YACf;QACF;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/utils/metrics-reader.ts"],"sourcesContent":["import * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\n\nconst execAsync = promisify(exec);\n\ninterface SystemMetrics {\n timestamp: number;\n memoryTotal: number;\n memoryUsed: number;\n memoryFree: number;\n memoryUsagePercent: number;\n memoryEfficiency: number;\n cpuCount: number;\n cpuLoad: number;\n platform: string;\n uptime: number;\n}\n\ninterface TaskMetric {\n id: string;\n type: string;\n success: boolean;\n duration: number;\n timestamp: number;\n metadata: Record<string, any>;\n}\n\ninterface PerformanceMetrics {\n startTime: number;\n totalTasks: number;\n successfulTasks: number;\n failedTasks: number;\n totalAgents: number;\n activeAgents: number;\n neuralEvents: number;\n}\n\ninterface Agent {\n id: string;\n name: string;\n type: string;\n status: 'active' | 'idle' | 'busy';\n activeTasks: number;\n lastActivity?: number;\n}\n\ninterface SessionData {\n id: string;\n startTime: number;\n endTime?: number;\n agents: Agent[];\n tasks: any[];\n status: 'active' | 'completed' | 'paused';\n}\n\ninterface MCPServerStatus {\n running: boolean;\n processCount: number;\n orchestratorRunning: boolean;\n port: number | null;\n connections: number;\n}\n\nexport class MetricsReader {\n private metricsDir = '.claude-flow/metrics';\n private sessionsDir = '.claude-flow/sessions';\n\n async getSystemMetrics(): Promise<SystemMetrics | null> {\n try {\n const filePath = path.join(this.metricsDir, 'system-metrics.json');\n const content = await fs.readFile(filePath, 'utf8');\n const metrics: SystemMetrics[] = JSON.parse(content);\n \n // Return the most recent metric\n return metrics.length > 0 ? metrics[metrics.length - 1] : null;\n } catch (error) {\n return null;\n }\n }\n\n async getTaskMetrics(): Promise<TaskMetric[]> {\n try {\n const filePath = path.join(this.metricsDir, 'task-metrics.json');\n const content = await fs.readFile(filePath, 'utf8');\n return JSON.parse(content);\n } catch (error) {\n return [];\n }\n }\n\n async getPerformanceMetrics(): Promise<PerformanceMetrics | null> {\n try {\n const filePath = path.join(this.metricsDir, 'performance.json');\n const content = await fs.readFile(filePath, 'utf8');\n return JSON.parse(content);\n } catch (error) {\n return null;\n }\n }\n\n async getActiveAgents(): Promise<Agent[]> {\n try {\n // First check performance metrics for agent count\n const perfMetrics = await this.getPerformanceMetrics();\n \n // Also check session files for more detailed agent info\n const sessionFiles = await this.getSessionFiles();\n const agents: Agent[] = [];\n \n for (const file of sessionFiles) {\n try {\n const content = await fs.readFile(path.join(this.sessionsDir, 'pair', file), 'utf8');\n const sessionData = JSON.parse(content);\n \n if (sessionData.agents && Array.isArray(sessionData.agents)) {\n agents.push(...sessionData.agents);\n }\n } catch {\n // Skip invalid session files\n }\n }\n \n // If no agents found in sessions, create mock agents based on performance metrics\n if (agents.length === 0 && perfMetrics) {\n const activeCount = perfMetrics.activeAgents || 0;\n const totalCount = perfMetrics.totalAgents || 0;\n \n for (let i = 0; i < totalCount; i++) {\n agents.push({\n id: `agent-${i + 1}`,\n name: `Agent ${i + 1}`,\n type: i === 0 ? 'orchestrator' : 'worker',\n status: i < activeCount ? 'active' : 'idle',\n activeTasks: i < activeCount ? 1 : 0,\n lastActivity: Date.now() - (i * 1000)\n });\n }\n }\n \n return agents;\n } catch (error) {\n return [];\n }\n }\n\n async getSessionStatus(): Promise<SessionData | null> {\n try {\n const sessionFiles = await this.getSessionFiles();\n \n if (sessionFiles.length === 0) {\n return null;\n }\n \n // Get the most recent session\n const mostRecentFile = sessionFiles[sessionFiles.length - 1];\n const content = await fs.readFile(path.join(this.sessionsDir, 'pair', mostRecentFile), 'utf8');\n return JSON.parse(content);\n } catch (error) {\n return null;\n }\n }\n\n async getRecentTasks(limit: number = 10): Promise<any[]> {\n try {\n const taskMetrics = await this.getTaskMetrics();\n \n // Sort by timestamp descending and take the limit\n return taskMetrics\n .sort((a, b) => b.timestamp - a.timestamp)\n .slice(0, limit)\n .map(task => ({\n id: task.id,\n type: task.type,\n status: task.success ? 'completed' : 'failed',\n startTime: task.timestamp - task.duration,\n endTime: task.timestamp,\n duration: task.duration\n }));\n } catch (error) {\n return [];\n }\n }\n\n async getOverallHealth(): Promise<'healthy' | 'warning' | 'error'> {\n try {\n const systemMetrics = await this.getSystemMetrics();\n const perfMetrics = await this.getPerformanceMetrics();\n \n if (!systemMetrics && !perfMetrics) {\n return 'error';\n }\n \n // Check memory usage\n if (systemMetrics && systemMetrics.memoryUsagePercent > 90) {\n return 'error';\n }\n \n if (systemMetrics && systemMetrics.memoryUsagePercent > 75) {\n return 'warning';\n }\n \n // Check CPU load\n if (systemMetrics && systemMetrics.cpuLoad > 0.8) {\n return 'warning';\n }\n \n // Check task failure rate\n if (perfMetrics && perfMetrics.totalTasks > 0) {\n const failureRate = perfMetrics.failedTasks / perfMetrics.totalTasks;\n if (failureRate > 0.5) {\n return 'error';\n }\n if (failureRate > 0.2) {\n return 'warning';\n }\n }\n \n return 'healthy';\n } catch (error) {\n return 'error';\n }\n }\n\n private async getSessionFiles(): Promise<string[]> {\n try {\n const files = await fs.readdir(path.join(this.sessionsDir, 'pair'));\n return files.filter(f => f.endsWith('.json')).sort();\n } catch (error) {\n return [];\n }\n }\n\n async getMCPServerStatus(): Promise<MCPServerStatus> {\n try {\n // Check if MCP server process is running\n const { stdout } = await execAsync('ps aux | grep -E \"mcp-server\\\\.js|claude-flow mcp start\" | grep -v grep | wc -l');\n const processCount = parseInt(stdout.trim(), 10);\n \n // Check for orchestrator running\n const { stdout: orchestratorOut } = await execAsync('ps aux | grep -E \"claude-flow start\" | grep -v grep | wc -l');\n const orchestratorRunning = parseInt(orchestratorOut.trim(), 10) > 0;\n \n // Determine status\n const isRunning = processCount > 0;\n \n // Try to get port from process (default is 3000)\n let port: number | null = 3000;\n try {\n const { stdout: portOut } = await execAsync('lsof -i :3000 2>/dev/null | grep LISTEN | wc -l');\n if (parseInt(portOut.trim(), 10) === 0) {\n // If port 3000 not listening, check other common ports\n port = null;\n }\n } catch {\n // lsof might not be available or port not in use\n }\n \n return {\n running: isRunning,\n processCount,\n orchestratorRunning,\n port,\n connections: processCount > 0 ? Math.max(1, processCount - 1) : 0 // Estimate connections\n };\n } catch (error) {\n // Fallback if commands fail\n return {\n running: false,\n processCount: 0,\n orchestratorRunning: false,\n port: null,\n connections: 0\n };\n }\n }\n}"],"names":["fs","path","exec","promisify","execAsync","MetricsReader","metricsDir","sessionsDir","getSystemMetrics","filePath","join","content","readFile","metrics","JSON","parse","length","error","getTaskMetrics","getPerformanceMetrics","getActiveAgents","perfMetrics","sessionFiles","getSessionFiles","agents","file","sessionData","Array","isArray","push","activeCount","activeAgents","totalCount","totalAgents","i","id","name","type","status","activeTasks","lastActivity","Date","now","getSessionStatus","mostRecentFile","getRecentTasks","limit","taskMetrics","sort","a","b","timestamp","slice","map","task","success","startTime","duration","endTime","getOverallHealth","systemMetrics","memoryUsagePercent","cpuLoad","totalTasks","failureRate","failedTasks","files","readdir","filter","f","endsWith","getMCPServerStatus","stdout","processCount","parseInt","trim","orchestratorOut","orchestratorRunning","isRunning","port","portOut","running","connections","Math","max"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-flow",
3
- "version": "2.7.0-alpha.1",
3
+ "version": "2.7.0-alpha.4",
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",
@@ -1568,6 +1568,57 @@ ${commands.map((cmd) => `- [${cmd}](./${cmd}.md)`).join('\n')}
1568
1568
 
1569
1569
  // Initialize memory database with fallback support
1570
1570
  try {
1571
+ // Check if database exists BEFORE creating it
1572
+ const dbPath = '.swarm/memory.db';
1573
+ const { existsSync } = await import('fs');
1574
+ const dbExistedBefore = existsSync(dbPath);
1575
+
1576
+ // Handle ReasoningBank migration BEFORE FallbackMemoryStore initialization
1577
+ // This prevents schema conflicts with old databases
1578
+ if (dbExistedBefore) {
1579
+ console.log(' 🔍 Checking existing database for ReasoningBank schema...');
1580
+
1581
+ try {
1582
+ const {
1583
+ initializeReasoningBank,
1584
+ checkReasoningBankTables,
1585
+ migrateReasoningBank
1586
+ } = await import('../../../reasoningbank/reasoningbank-adapter.js');
1587
+
1588
+ // Set the database path for ReasoningBank
1589
+ process.env.CLAUDE_FLOW_DB_PATH = dbPath;
1590
+
1591
+ const tableCheck = await checkReasoningBankTables();
1592
+
1593
+ if (tableCheck.exists) {
1594
+ console.log(' ✅ ReasoningBank schema already complete');
1595
+ } else if (force) {
1596
+ // User used --force flag, migrate the database
1597
+ console.log(` 🔄 Migrating database: ${tableCheck.missingTables.length} tables missing`);
1598
+ console.log(` Missing: ${tableCheck.missingTables.join(', ')}`);
1599
+
1600
+ const migrationResult = await migrateReasoningBank();
1601
+
1602
+ if (migrationResult.success) {
1603
+ printSuccess(` ✓ Migration complete: added ${migrationResult.addedTables?.length || 0} tables`);
1604
+ console.log(' Use --reasoningbank flag to enable AI-powered memory features');
1605
+ } else {
1606
+ console.log(` âš ī¸ Migration failed: ${migrationResult.message}`);
1607
+ console.log(' Basic memory will work, use: memory init --reasoningbank to retry');
1608
+ }
1609
+ } else {
1610
+ // Database exists with missing tables but no --force flag
1611
+ console.log(` â„šī¸ Database has ${tableCheck.missingTables.length} missing ReasoningBank tables`);
1612
+ console.log(` Missing: ${tableCheck.missingTables.join(', ')}`);
1613
+ console.log(' Use --force to migrate existing database');
1614
+ console.log(' Or use: memory init --reasoningbank');
1615
+ }
1616
+ } catch (rbErr) {
1617
+ console.log(` âš ī¸ ReasoningBank check failed: ${rbErr.message}`);
1618
+ console.log(' Will attempt normal initialization...');
1619
+ }
1620
+ }
1621
+
1571
1622
  // Import and initialize FallbackMemoryStore to create the database
1572
1623
  const { FallbackMemoryStore } = await import('../../../memory/fallback-store.js');
1573
1624
  const memoryStore = new FallbackMemoryStore();
@@ -1580,6 +1631,25 @@ ${commands.map((cmd) => `- [${cmd}](./${cmd}.md)`).join('\n')}
1580
1631
  );
1581
1632
  } else {
1582
1633
  printSuccess('✓ Initialized memory database (.swarm/memory.db)');
1634
+
1635
+ // Initialize ReasoningBank schema for fresh databases
1636
+ if (!dbExistedBefore) {
1637
+ try {
1638
+ const {
1639
+ initializeReasoningBank
1640
+ } = await import('../../../reasoningbank/reasoningbank-adapter.js');
1641
+
1642
+ // Set the database path for ReasoningBank
1643
+ process.env.CLAUDE_FLOW_DB_PATH = dbPath;
1644
+
1645
+ console.log(' 🧠 Initializing ReasoningBank schema...');
1646
+ await initializeReasoningBank();
1647
+ printSuccess(' ✓ ReasoningBank schema initialized (use --reasoningbank flag for AI-powered memory)');
1648
+ } catch (rbErr) {
1649
+ console.log(` âš ī¸ ReasoningBank initialization failed: ${rbErr.message}`);
1650
+ console.log(' Basic memory will work, use: memory init --reasoningbank to retry');
1651
+ }
1652
+ }
1583
1653
  }
1584
1654
 
1585
1655
  memoryStore.close();
@@ -423,17 +423,55 @@ async function handleReasoningBankCommand(command, subArgs, flags) {
423
423
  const initialized = await isReasoningBankInitialized();
424
424
 
425
425
  // Lazy load the adapter (ES modules)
426
- const { initializeReasoningBank, storeMemory, queryMemories, listMemories, getStatus } = await import('../../reasoningbank/reasoningbank-adapter.js');
426
+ const { initializeReasoningBank, storeMemory, queryMemories, listMemories, getStatus, checkReasoningBankTables, migrateReasoningBank } = await import('../../reasoningbank/reasoningbank-adapter.js');
427
427
 
428
428
  // Special handling for 'init' command
429
429
  if (command === 'init') {
430
+ const dbPath = '.swarm/memory.db';
431
+
430
432
  if (initialized) {
431
- printWarning('âš ī¸ ReasoningBank already initialized');
432
- console.log('Database: .swarm/memory.db');
433
- console.log('\nTo reinitialize, delete .swarm/memory.db first');
433
+ // Database exists - check if migration is needed
434
+ printInfo('🔍 Checking existing database for ReasoningBank schema...\n');
435
+
436
+ try {
437
+ // Set the database path for ReasoningBank
438
+ process.env.CLAUDE_FLOW_DB_PATH = dbPath;
439
+
440
+ const tableCheck = await checkReasoningBankTables();
441
+
442
+ if (tableCheck.exists) {
443
+ printSuccess('✅ ReasoningBank already complete');
444
+ console.log('Database: .swarm/memory.db');
445
+ console.log('All ReasoningBank tables present\n');
446
+ console.log('Use --reasoningbank flag with memory commands to enable AI features');
447
+ return;
448
+ }
449
+
450
+ // Missing tables found - run migration
451
+ console.log(`🔄 Migrating database: ${tableCheck.missingTables.length} tables missing`);
452
+ console.log(` Missing: ${tableCheck.missingTables.join(', ')}\n`);
453
+
454
+ const migrationResult = await migrateReasoningBank();
455
+
456
+ if (migrationResult.success) {
457
+ printSuccess(`✓ Migration complete: added ${migrationResult.addedTables?.length || 0} tables`);
458
+ console.log('\nNext steps:');
459
+ console.log(' 1. Store memories: memory store key "value" --reasoningbank');
460
+ console.log(' 2. Query memories: memory query "search" --reasoningbank');
461
+ console.log(' 3. Check status: memory status --reasoningbank');
462
+ } else {
463
+ printError(`❌ Migration failed: ${migrationResult.message}`);
464
+ console.log('Try running: init --force to reinitialize');
465
+ }
466
+ } catch (error) {
467
+ printError('❌ Migration check failed');
468
+ console.error(error.message);
469
+ console.log('\nTry running: init --force to reinitialize');
470
+ }
434
471
  return;
435
472
  }
436
473
 
474
+ // Fresh initialization
437
475
  printInfo('🧠 Initializing ReasoningBank...');
438
476
  console.log('This will create: .swarm/memory.db\n');
439
477