claude-flow 2.7.23 → 2.7.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/claude-flow +1 -1
- package/dist/src/cli/simple-commands/config.js +115 -257
- package/dist/src/cli/simple-commands/config.js.map +1 -1
- package/dist/src/core/version.js +2 -2
- package/dist/src/core/version.js.map +1 -1
- package/dist/src/memory/swarm-memory.js +416 -348
- package/dist/src/memory/swarm-memory.js.map +1 -1
- package/dist/src/utils/metrics-reader.js +0 -10
- package/docs/OPTIONAL_LOCAL_EMBEDDINGS.md +462 -0
- package/docs/TRANSFORMER_INITIALIZATION_ISSUE.md +362 -0
- package/package.json +3 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/memory/swarm-memory.ts"],"sourcesContent":["import { EventEmitter } from 'node:events';\nimport { Logger } from '../core/logger.js';\nimport { MemoryManager } from './manager.js';\nimport { EventBus } from '../core/event-bus.js';\nimport { generateId } from '../utils/helpers.js';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\nexport interface SwarmMemoryEntry {\n id: string;\n agentId: string;\n type: 'knowledge' | 'result' | 'state' | 'communication' | 'error';\n content: any;\n timestamp: Date;\n metadata: {\n taskId?: string;\n objectiveId?: string;\n tags?: string[];\n priority?: number;\n shareLevel?: 'private' | 'team' | 'public';\n };\n}\n\nexport interface SwarmMemoryQuery {\n agentId?: string;\n type?: SwarmMemoryEntry['type'];\n taskId?: string;\n objectiveId?: string;\n tags?: string[];\n since?: Date;\n before?: Date;\n limit?: number;\n shareLevel?: SwarmMemoryEntry['metadata']['shareLevel'];\n}\n\nexport interface SwarmKnowledgeBase {\n id: string;\n name: string;\n description: string;\n entries: SwarmMemoryEntry[];\n metadata: {\n domain: string;\n expertise: string[];\n contributors: string[];\n lastUpdated: Date;\n };\n}\n\nexport interface SwarmMemoryConfig {\n namespace: string;\n enableDistribution: boolean;\n enableReplication: boolean;\n syncInterval: number;\n maxEntries: number;\n compressionThreshold: number;\n enableKnowledgeBase: boolean;\n enableCrossAgentSharing: boolean;\n persistencePath: string;\n}\n\nexport class SwarmMemoryManager extends EventEmitter {\n private logger: Logger;\n private config: SwarmMemoryConfig;\n private baseMemory: MemoryManager;\n private entries: Map<string, SwarmMemoryEntry>;\n private knowledgeBases: Map<string, SwarmKnowledgeBase>;\n private agentMemories: Map<string, Set<string>>; // agentId -> set of entry IDs\n private syncTimer?: NodeJS.Timeout;\n private isInitialized: boolean = false;\n\n constructor(config: Partial<SwarmMemoryConfig> = {}) {\n super();\n this.logger = new Logger('SwarmMemoryManager');\n this.config = {\n namespace: 'swarm',\n enableDistribution: true,\n enableReplication: true,\n syncInterval: 10000, // 10 seconds\n maxEntries: 10000,\n compressionThreshold: 1000,\n enableKnowledgeBase: true,\n enableCrossAgentSharing: true,\n persistencePath: './swarm-memory',\n ...config,\n };\n\n this.entries = new Map();\n this.knowledgeBases = new Map();\n this.agentMemories = new Map();\n\n const eventBus = EventBus.getInstance();\n this.baseMemory = new MemoryManager(\n {\n backend: 'sqlite',\n namespace: this.config.namespace,\n cacheSizeMB: 50,\n syncOnExit: true,\n maxEntries: this.config.maxEntries,\n ttlMinutes: 60,\n },\n eventBus,\n this.logger,\n );\n }\n\n async initialize(): Promise<void> {\n if (this.isInitialized) return;\n\n this.logger.info('Initializing swarm memory manager...');\n\n // Initialize base memory\n await this.baseMemory.initialize();\n\n // Create persistence directory\n await fs.mkdir(this.config.persistencePath, { recursive: true });\n\n // Load existing memory\n await this.loadMemoryState();\n\n // Start sync timer\n if (this.config.syncInterval > 0) {\n this.syncTimer = setInterval(() => {\n this.syncMemoryState();\n }, this.config.syncInterval);\n }\n\n this.isInitialized = true;\n this.emit('memory:initialized');\n }\n\n async shutdown(): Promise<void> {\n if (!this.isInitialized) return;\n\n this.logger.info('Shutting down swarm memory manager...');\n\n // Stop sync timer\n if (this.syncTimer) {\n clearInterval(this.syncTimer);\n this.syncTimer = undefined;\n }\n\n // Save final state\n await this.saveMemoryState();\n\n this.isInitialized = false;\n this.emit('memory:shutdown');\n }\n\n async remember(\n agentId: string,\n type: SwarmMemoryEntry['type'],\n content: any,\n metadata: Partial<SwarmMemoryEntry['metadata']> = {},\n ): Promise<string> {\n const entryId = generateId('mem');\n const entry: SwarmMemoryEntry = {\n id: entryId,\n agentId,\n type,\n content,\n timestamp: new Date(),\n metadata: {\n shareLevel: 'team',\n priority: 1,\n ...metadata,\n },\n };\n\n this.entries.set(entryId, entry);\n\n // Associate with agent\n if (!this.agentMemories.has(agentId)) {\n this.agentMemories.set(agentId, new Set());\n }\n this.agentMemories.get(agentId)!.add(entryId);\n\n // Store in base memory for persistence\n await this.baseMemory.remember({\n namespace: this.config.namespace,\n key: `entry:${entryId}`,\n content: JSON.stringify(entry),\n metadata: {\n type: 'swarm-memory',\n agentId,\n entryType: type,\n shareLevel: entry.metadata.shareLevel,\n },\n });\n\n this.logger.debug(`Agent ${agentId} remembered: ${type} - ${entryId}`);\n this.emit('memory:added', entry);\n\n // Update knowledge base if applicable\n if (type === 'knowledge' && this.config.enableKnowledgeBase) {\n await this.updateKnowledgeBase(entry);\n }\n\n // Check for memory limits\n await this.enforceMemoryLimits();\n\n return entryId;\n }\n\n async recall(query: SwarmMemoryQuery): Promise<SwarmMemoryEntry[]> {\n let results = Array.from(this.entries.values());\n\n // Apply filters\n if (query.agentId) {\n results = results.filter((e) => e.agentId === query.agentId);\n }\n\n if (query.type) {\n results = results.filter((e) => e.type === query.type);\n }\n\n if (query.taskId) {\n results = results.filter((e) => e.metadata.taskId === query.taskId);\n }\n\n if (query.objectiveId) {\n results = results.filter((e) => e.metadata.objectiveId === query.objectiveId);\n }\n\n if (query.tags && query.tags.length > 0) {\n results = results.filter(\n (e) => e.metadata.tags && query.tags!.some((tag) => e.metadata.tags!.includes(tag)),\n );\n }\n\n if (query.since) {\n results = results.filter((e) => e.timestamp >= query.since!);\n }\n\n if (query.before) {\n results = results.filter((e) => e.timestamp <= query.before!);\n }\n\n if (query.shareLevel) {\n results = results.filter((e) => e.metadata.shareLevel === query.shareLevel);\n }\n\n // Sort by timestamp (newest first)\n results.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());\n\n // Apply limit\n if (query.limit) {\n results = results.slice(0, query.limit);\n }\n\n this.logger.debug(`Recalled ${results.length} memories for query`);\n return results;\n }\n\n async shareMemory(entryId: string, targetAgentId: string): Promise<void> {\n const entry = this.entries.get(entryId);\n if (!entry) {\n throw new Error('Memory entry not found');\n }\n\n if (!this.config.enableCrossAgentSharing) {\n throw new Error('Cross-agent sharing is disabled');\n }\n\n // Check share level permissions\n if (entry.metadata.shareLevel === 'private') {\n throw new Error('Memory entry is private and cannot be shared');\n }\n\n // Create a shared copy for the target agent\n const sharedEntry: SwarmMemoryEntry = {\n ...entry,\n id: generateId('mem'),\n metadata: {\n ...entry.metadata,\n originalId: entryId,\n sharedFrom: entry.agentId,\n sharedTo: targetAgentId,\n sharedAt: new Date(),\n },\n };\n\n this.entries.set(sharedEntry.id, sharedEntry);\n\n // Associate with target agent\n if (!this.agentMemories.has(targetAgentId)) {\n this.agentMemories.set(targetAgentId, new Set());\n }\n this.agentMemories.get(targetAgentId)!.add(sharedEntry.id);\n\n this.logger.info(`Shared memory ${entryId} from ${entry.agentId} to ${targetAgentId}`);\n this.emit('memory:shared', { original: entry, shared: sharedEntry });\n }\n\n async broadcastMemory(entryId: string, agentIds?: string[]): Promise<void> {\n const entry = this.entries.get(entryId);\n if (!entry) {\n throw new Error('Memory entry not found');\n }\n\n if (entry.metadata.shareLevel === 'private') {\n throw new Error('Cannot broadcast private memory');\n }\n\n const targets =\n agentIds || Array.from(this.agentMemories.keys()).filter((id) => id !== entry.agentId);\n\n for (const targetId of targets) {\n try {\n await this.shareMemory(entryId, targetId);\n } catch (error) {\n this.logger.warn(`Failed to share memory to ${targetId}:`, error);\n }\n }\n\n this.logger.info(`Broadcasted memory ${entryId} to ${targets.length} agents`);\n }\n\n async createKnowledgeBase(\n name: string,\n description: string,\n domain: string,\n expertise: string[],\n ): Promise<string> {\n const kbId = generateId('kb');\n const knowledgeBase: SwarmKnowledgeBase = {\n id: kbId,\n name,\n description,\n entries: [],\n metadata: {\n domain,\n expertise,\n contributors: [],\n lastUpdated: new Date(),\n },\n };\n\n this.knowledgeBases.set(kbId, knowledgeBase);\n\n this.logger.info(`Created knowledge base: ${name} (${kbId})`);\n this.emit('knowledgebase:created', knowledgeBase);\n\n return kbId;\n }\n\n async updateKnowledgeBase(entry: SwarmMemoryEntry): Promise<void> {\n if (!this.config.enableKnowledgeBase) return;\n\n // Find relevant knowledge bases\n const relevantKBs = Array.from(this.knowledgeBases.values()).filter((kb) => {\n // Simple matching based on tags and content\n const tags = entry.metadata.tags || [];\n return tags.some((tag) =>\n kb.metadata.expertise.some(\n (exp) =>\n exp.toLowerCase().includes(tag.toLowerCase()) ||\n tag.toLowerCase().includes(exp.toLowerCase()),\n ),\n );\n });\n\n for (const kb of relevantKBs) {\n // Add entry to knowledge base\n kb.entries.push(entry);\n kb.metadata.lastUpdated = new Date();\n\n // Add contributor\n if (!kb.metadata.contributors.includes(entry.agentId)) {\n kb.metadata.contributors.push(entry.agentId);\n }\n\n this.logger.debug(`Updated knowledge base ${kb.id} with entry ${entry.id}`);\n }\n }\n\n async searchKnowledge(\n query: string,\n domain?: string,\n expertise?: string[],\n ): Promise<SwarmMemoryEntry[]> {\n const allEntries: SwarmMemoryEntry[] = [];\n\n // Search in knowledge bases\n for (const kb of this.knowledgeBases.values()) {\n if (domain && kb.metadata.domain !== domain) continue;\n\n if (expertise && !expertise.some((exp) => kb.metadata.expertise.includes(exp))) {\n continue;\n }\n\n allEntries.push(...kb.entries);\n }\n\n // Simple text search (in real implementation, use better search)\n const queryLower = query.toLowerCase();\n const results = allEntries.filter((entry) => {\n const contentStr = JSON.stringify(entry.content).toLowerCase();\n return contentStr.includes(queryLower);\n });\n\n return results.slice(0, 50); // Limit results\n }\n\n async getAgentMemorySnapshot(agentId: string): Promise<{\n totalEntries: number;\n recentEntries: SwarmMemoryEntry[];\n knowledgeContributions: number;\n sharedEntries: number;\n }> {\n const agentEntryIds = this.agentMemories.get(agentId) || new Set();\n const agentEntries = Array.from(agentEntryIds)\n .map((id) => this.entries.get(id))\n .filter(Boolean) as SwarmMemoryEntry[];\n\n const recentEntries = agentEntries\n .sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime())\n .slice(0, 10);\n\n const knowledgeContributions = agentEntries.filter((e) => e.type === 'knowledge').length;\n\n const sharedEntries = agentEntries.filter(\n (e) => e.metadata.shareLevel === 'public' || e.metadata.shareLevel === 'team',\n ).length;\n\n return {\n totalEntries: agentEntries.length,\n recentEntries,\n knowledgeContributions,\n sharedEntries,\n };\n }\n\n private async loadMemoryState(): Promise<void> {\n try {\n // Load entries\n const entriesFile = path.join(this.config.persistencePath, 'entries.json');\n try {\n const entriesData = await fs.readFile(entriesFile, 'utf-8');\n const entriesArray = JSON.parse(entriesData);\n\n for (const entry of entriesArray) {\n this.entries.set(entry.id, {\n ...entry,\n timestamp: new Date(entry.timestamp),\n });\n\n // Rebuild agent memory associations\n if (!this.agentMemories.has(entry.agentId)) {\n this.agentMemories.set(entry.agentId, new Set());\n }\n this.agentMemories.get(entry.agentId)!.add(entry.id);\n }\n\n this.logger.info(`Loaded ${entriesArray.length} memory entries`);\n } catch (error) {\n this.logger.warn('No existing memory entries found');\n }\n\n // Load knowledge bases\n const kbFile = path.join(this.config.persistencePath, 'knowledge-bases.json');\n try {\n const kbData = await fs.readFile(kbFile, 'utf-8');\n const kbArray = JSON.parse(kbData);\n\n for (const kb of kbArray) {\n this.knowledgeBases.set(kb.id, {\n ...kb,\n metadata: {\n ...kb.metadata,\n lastUpdated: new Date(kb.metadata.lastUpdated),\n },\n entries: kb.entries.map((e: any) => ({\n ...e,\n timestamp: new Date(e.timestamp),\n })),\n });\n }\n\n this.logger.info(`Loaded ${kbArray.length} knowledge bases`);\n } catch (error) {\n this.logger.warn('No existing knowledge bases found');\n }\n } catch (error) {\n this.logger.error('Error loading memory state:', error);\n }\n }\n\n private async saveMemoryState(): Promise<void> {\n try {\n // Save entries\n const entriesArray = Array.from(this.entries.values());\n const entriesFile = path.join(this.config.persistencePath, 'entries.json');\n await fs.writeFile(entriesFile, JSON.stringify(entriesArray, null, 2));\n\n // Save knowledge bases\n const kbArray = Array.from(this.knowledgeBases.values());\n const kbFile = path.join(this.config.persistencePath, 'knowledge-bases.json');\n await fs.writeFile(kbFile, JSON.stringify(kbArray, null, 2));\n\n this.logger.debug('Saved memory state to disk');\n } catch (error) {\n this.logger.error('Error saving memory state:', error);\n }\n }\n\n private async syncMemoryState(): Promise<void> {\n try {\n await this.saveMemoryState();\n this.emit('memory:synced');\n } catch (error) {\n this.logger.error('Error syncing memory state:', error);\n }\n }\n\n private async enforceMemoryLimits(): Promise<void> {\n if (this.entries.size <= this.config.maxEntries) return;\n\n this.logger.info('Enforcing memory limits...');\n\n // Remove oldest entries that are not marked as important\n const entries = Array.from(this.entries.values())\n .filter((e) => (e.metadata.priority || 1) <= 1) // Only remove low priority\n .sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());\n\n const toRemove = entries.slice(0, this.entries.size - this.config.maxEntries);\n\n for (const entry of toRemove) {\n this.entries.delete(entry.id);\n\n // Remove from agent memory\n const agentEntries = this.agentMemories.get(entry.agentId);\n if (agentEntries) {\n agentEntries.delete(entry.id);\n }\n\n this.logger.debug(`Removed old memory entry: ${entry.id}`);\n }\n\n this.emit('memory:cleaned', toRemove.length);\n }\n\n // Public API methods\n getMemoryStats(): {\n totalEntries: number;\n entriesByType: Record<string, number>;\n entriesByAgent: Record<string, number>;\n knowledgeBases: number;\n memoryUsage: number;\n } {\n const entries = Array.from(this.entries.values());\n const entriesByType: Record<string, number> = {};\n const entriesByAgent: Record<string, number> = {};\n\n for (const entry of entries) {\n entriesByType[entry.type] = (entriesByType[entry.type] || 0) + 1;\n entriesByAgent[entry.agentId] = (entriesByAgent[entry.agentId] || 0) + 1;\n }\n\n // Rough memory usage calculation\n const memoryUsage = JSON.stringify(entries).length;\n\n return {\n totalEntries: entries.length,\n entriesByType,\n entriesByAgent,\n knowledgeBases: this.knowledgeBases.size,\n memoryUsage,\n };\n }\n\n async exportMemory(agentId?: string): Promise<any> {\n const entries = agentId ? await this.recall({ agentId }) : Array.from(this.entries.values());\n\n return {\n entries,\n knowledgeBases: agentId\n ? Array.from(this.knowledgeBases.values()).filter((kb) =>\n kb.metadata.contributors.includes(agentId),\n )\n : Array.from(this.knowledgeBases.values()),\n exportedAt: new Date(),\n stats: this.getMemoryStats(),\n };\n }\n\n async clearMemory(agentId?: string): Promise<void> {\n if (agentId) {\n // Clear specific agent's memory\n const entryIds = this.agentMemories.get(agentId) || new Set();\n for (const entryId of entryIds) {\n this.entries.delete(entryId);\n }\n this.agentMemories.delete(agentId);\n this.logger.info(`Cleared memory for agent ${agentId}`);\n } else {\n // Clear all memory\n this.entries.clear();\n this.agentMemories.clear();\n this.knowledgeBases.clear();\n this.logger.info('Cleared all swarm memory');\n }\n\n this.emit('memory:cleared', { agentId });\n }\n\n // Compatibility methods for hive.ts\n async store(key: string, value: any): Promise<void> {\n // Extract namespace and actual key from the path\n const parts = key.split('/');\n const type = (parts[0] as SwarmMemoryEntry['type']) || 'state';\n const agentId = parts[1] || 'system';\n\n await this.remember(agentId, type, value, {\n tags: [parts[0], parts[1]].filter(Boolean),\n shareLevel: 'team',\n });\n }\n\n async search(pattern: string, limit: number = 10): Promise<any[]> {\n // Simple pattern matching on stored keys/content\n const results: any[] = [];\n\n for (const entry of this.entries.values()) {\n const entryString = JSON.stringify(entry);\n if (entryString.includes(pattern.replace('*', ''))) {\n results.push(entry.content);\n if (results.length >= limit) break;\n }\n }\n\n return results;\n }\n}\n"],"names":["EventEmitter","Logger","MemoryManager","EventBus","generateId","fs","path","SwarmMemoryManager","logger","config","baseMemory","entries","knowledgeBases","agentMemories","syncTimer","isInitialized","namespace","enableDistribution","enableReplication","syncInterval","maxEntries","compressionThreshold","enableKnowledgeBase","enableCrossAgentSharing","persistencePath","Map","eventBus","getInstance","backend","cacheSizeMB","syncOnExit","ttlMinutes","initialize","info","mkdir","recursive","loadMemoryState","setInterval","syncMemoryState","emit","shutdown","clearInterval","undefined","saveMemoryState","remember","agentId","type","content","metadata","entryId","entry","id","timestamp","Date","shareLevel","priority","set","has","Set","get","add","key","JSON","stringify","entryType","debug","updateKnowledgeBase","enforceMemoryLimits","recall","query","results","Array","from","values","filter","e","taskId","objectiveId","tags","length","some","tag","includes","since","before","sort","a","b","getTime","limit","slice","shareMemory","targetAgentId","Error","sharedEntry","originalId","sharedFrom","sharedTo","sharedAt","original","shared","broadcastMemory","agentIds","targets","keys","targetId","error","warn","createKnowledgeBase","name","description","domain","expertise","kbId","knowledgeBase","contributors","lastUpdated","relevantKBs","kb","exp","toLowerCase","push","searchKnowledge","allEntries","queryLower","contentStr","getAgentMemorySnapshot","agentEntryIds","agentEntries","map","Boolean","recentEntries","knowledgeContributions","sharedEntries","totalEntries","entriesFile","join","entriesData","readFile","entriesArray","parse","kbFile","kbData","kbArray","writeFile","size","toRemove","delete","getMemoryStats","entriesByType","entriesByAgent","memoryUsage","exportMemory","exportedAt","stats","clearMemory","entryIds","clear","store","value","parts","split","search","pattern","entryString","replace"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/memory/swarm-memory.js"],"sourcesContent":["/**\n * SwarmMemory - MCP-specific memory persistence extending SharedMemory\n * Provides swarm-specific features like agent coordination, task tracking, and neural patterns\n *\n * @module swarm-memory\n */\n\nimport { SharedMemory } from './shared-memory.js';\nimport path from 'path';\n\n/**\n * Swarm-specific namespaces\n */\nconst SWARM_NAMESPACES = {\n AGENTS: 'swarm:agents',\n TASKS: 'swarm:tasks',\n COMMUNICATIONS: 'swarm:communications',\n CONSENSUS: 'swarm:consensus',\n PATTERNS: 'swarm:patterns',\n METRICS: 'swarm:metrics',\n COORDINATION: 'swarm:coordination',\n};\n\n/**\n * SwarmMemory class - Extends SharedMemory with MCP features\n */\nexport class SwarmMemory extends SharedMemory {\n constructor(options = {}) {\n // Default to .swarm directory for MCP\n super({\n directory: options.directory || '.swarm',\n filename: options.filename || 'swarm-memory.db',\n ...options,\n });\n\n this.swarmId = options.swarmId || 'default';\n this.mcpMode = options.mcpMode !== false;\n\n // Additional swarm-specific caches\n this.agentCache = new Map();\n this.taskCache = new Map();\n this.patternCache = new Map();\n }\n\n /**\n * Initialize with swarm-specific setup\n */\n async initialize() {\n await super.initialize();\n\n // Initialize swarm-specific namespaces\n await this._initializeSwarmNamespaces();\n\n // Load active agents and tasks into cache\n await this._loadSwarmState();\n\n this.emit('swarm:initialized', { swarmId: this.swarmId });\n }\n\n /**\n * Store agent information\n */\n async storeAgent(agentId, agentData) {\n const key = `agent:${agentId}`;\n const enrichedData = {\n ...agentData,\n swarmId: this.swarmId,\n lastUpdated: new Date().toISOString(),\n };\n\n await this.store(key, enrichedData, {\n namespace: SWARM_NAMESPACES.AGENTS,\n tags: ['agent', agentData.type, agentData.status],\n metadata: {\n swarmId: this.swarmId,\n agentType: agentData.type,\n },\n });\n\n // Update agent cache\n this.agentCache.set(agentId, enrichedData);\n\n this.emit('swarm:agentStored', { agentId, type: agentData.type });\n\n return { agentId, stored: true };\n }\n\n /**\n * Retrieve agent information\n */\n async getAgent(agentId) {\n // Check cache first\n if (this.agentCache.has(agentId)) {\n return this.agentCache.get(agentId);\n }\n\n const key = `agent:${agentId}`;\n const agent = await this.retrieve(key, SWARM_NAMESPACES.AGENTS);\n\n if (agent) {\n this.agentCache.set(agentId, agent);\n }\n\n return agent;\n }\n\n /**\n * List all agents in swarm\n */\n async listAgents(filter = {}) {\n const agents = await this.list(SWARM_NAMESPACES.AGENTS, {\n limit: filter.limit || 100,\n });\n\n return agents\n .map((entry) => entry.value)\n .filter((agent) => {\n if (filter.type && agent.type !== filter.type) return false;\n if (filter.status && agent.status !== filter.status) return false;\n if (filter.swarmId && agent.swarmId !== filter.swarmId) return false;\n return true;\n });\n }\n\n /**\n * Store task information\n */\n async storeTask(taskId, taskData) {\n const key = `task:${taskId}`;\n const enrichedData = {\n ...taskData,\n swarmId: this.swarmId,\n createdAt: taskData.createdAt || new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n await this.store(key, enrichedData, {\n namespace: SWARM_NAMESPACES.TASKS,\n tags: ['task', taskData.status, taskData.priority],\n metadata: {\n swarmId: this.swarmId,\n assignedAgents: taskData.assignedAgents || [],\n },\n });\n\n // Update task cache\n this.taskCache.set(taskId, enrichedData);\n\n this.emit('swarm:taskStored', { taskId, status: taskData.status });\n\n return { taskId, stored: true };\n }\n\n /**\n * Update task status\n */\n async updateTaskStatus(taskId, status, result = null) {\n const task = await this.getTask(taskId);\n if (!task) {\n throw new Error(`Task ${taskId} not found`);\n }\n\n task.status = status;\n task.updatedAt = new Date().toISOString();\n\n if (result) {\n task.result = result;\n }\n\n if (status === 'completed') {\n task.completedAt = new Date().toISOString();\n }\n\n await this.storeTask(taskId, task);\n\n this.emit('swarm:taskStatusUpdated', { taskId, status });\n\n return { taskId, status, updated: true };\n }\n\n /**\n * Get task information\n */\n async getTask(taskId) {\n // Check cache first\n if (this.taskCache.has(taskId)) {\n return this.taskCache.get(taskId);\n }\n\n const key = `task:${taskId}`;\n const task = await this.retrieve(key, SWARM_NAMESPACES.TASKS);\n\n if (task) {\n this.taskCache.set(taskId, task);\n }\n\n return task;\n }\n\n /**\n * Store inter-agent communication\n */\n async storeCommunication(fromAgent, toAgent, message) {\n const commId = `comm:${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n const communication = {\n id: commId,\n fromAgent,\n toAgent,\n message,\n swarmId: this.swarmId,\n timestamp: new Date().toISOString(),\n };\n\n await this.store(commId, communication, {\n namespace: SWARM_NAMESPACES.COMMUNICATIONS,\n ttl: 86400, // 24 hours\n tags: ['communication', message.type],\n metadata: {\n fromAgent,\n toAgent,\n messageType: message.type,\n },\n });\n\n this.emit('swarm:communication', { fromAgent, toAgent, type: message.type });\n\n return { id: commId, stored: true };\n }\n\n /**\n * Store consensus decision\n */\n async storeConsensus(consensusId, decision) {\n const key = `consensus:${consensusId}`;\n const consensusData = {\n ...decision,\n swarmId: this.swarmId,\n timestamp: new Date().toISOString(),\n };\n\n await this.store(key, consensusData, {\n namespace: SWARM_NAMESPACES.CONSENSUS,\n tags: ['consensus', decision.status],\n metadata: {\n swarmId: this.swarmId,\n taskId: decision.taskId,\n threshold: decision.threshold,\n },\n });\n\n this.emit('swarm:consensus', { consensusId, status: decision.status });\n\n return { consensusId, stored: true };\n }\n\n /**\n * Store neural pattern\n */\n async storePattern(patternId, pattern) {\n const key = `pattern:${patternId}`;\n const patternData = {\n ...pattern,\n swarmId: this.swarmId,\n createdAt: new Date().toISOString(),\n usageCount: 0,\n successRate: 0,\n };\n\n await this.store(key, patternData, {\n namespace: SWARM_NAMESPACES.PATTERNS,\n tags: ['pattern', pattern.type],\n metadata: {\n swarmId: this.swarmId,\n patternType: pattern.type,\n confidence: pattern.confidence || 0,\n },\n });\n\n // Cache frequently used patterns\n if (pattern.type === 'coordination' || pattern.type === 'optimization') {\n this.patternCache.set(patternId, patternData);\n }\n\n this.emit('swarm:patternStored', { patternId, type: pattern.type });\n\n return { patternId, stored: true };\n }\n\n /**\n * Update pattern usage and success metrics\n */\n async updatePatternMetrics(patternId, success = true) {\n const pattern = await this.getPattern(patternId);\n if (!pattern) {\n throw new Error(`Pattern ${patternId} not found`);\n }\n\n pattern.usageCount++;\n pattern.lastUsedAt = new Date().toISOString();\n\n // Update success rate with exponential moving average\n const alpha = 0.1; // Smoothing factor\n const currentSuccess = success ? 1 : 0;\n pattern.successRate = alpha * currentSuccess + (1 - alpha) * (pattern.successRate || 0);\n\n await this.storePattern(patternId, pattern);\n\n return { patternId, usageCount: pattern.usageCount, successRate: pattern.successRate };\n }\n\n /**\n * Get pattern\n */\n async getPattern(patternId) {\n // Check cache first\n if (this.patternCache.has(patternId)) {\n return this.patternCache.get(patternId);\n }\n\n const key = `pattern:${patternId}`;\n return await this.retrieve(key, SWARM_NAMESPACES.PATTERNS);\n }\n\n /**\n * Find best patterns for a given context\n */\n async findBestPatterns(context, limit = 5) {\n const patterns = await this.search({\n namespace: SWARM_NAMESPACES.PATTERNS,\n tags: context.tags,\n limit: 100,\n });\n\n // Score patterns based on success rate and relevance\n const scored = patterns.map((entry) => {\n const pattern = entry.value;\n const score =\n pattern.successRate * 0.7 +\n (pattern.confidence || 0) * 0.2 +\n (pattern.usageCount > 0 ? 0.1 : 0);\n\n return { ...pattern, score };\n });\n\n // Sort by score and return top patterns\n return scored.sort((a, b) => b.score - a.score).slice(0, limit);\n }\n\n /**\n * Store coordination state\n */\n async storeCoordination(key, state) {\n await this.store(key, state, {\n namespace: SWARM_NAMESPACES.COORDINATION,\n ttl: 3600, // 1 hour\n metadata: {\n swarmId: this.swarmId,\n timestamp: new Date().toISOString(),\n },\n });\n\n return { key, stored: true };\n }\n\n /**\n * Get coordination state\n */\n async getCoordination(key) {\n return await this.retrieve(key, SWARM_NAMESPACES.COORDINATION);\n }\n\n /**\n * Store performance metrics\n */\n async storeMetrics(metricsId, metrics) {\n const key = `metrics:${metricsId}`;\n await this.store(key, metrics, {\n namespace: SWARM_NAMESPACES.METRICS,\n ttl: 86400 * 7, // 7 days\n tags: ['metrics', metrics.type],\n metadata: {\n swarmId: this.swarmId,\n agentId: metrics.agentId,\n timestamp: new Date().toISOString(),\n },\n });\n\n this.emit('swarm:metricsStored', { metricsId, type: metrics.type });\n\n return { metricsId, stored: true };\n }\n\n /**\n * Get swarm statistics\n */\n async getSwarmStats() {\n const baseStats = await this.getStats();\n\n // Add swarm-specific stats\n const agentCount = await this._countNamespace(SWARM_NAMESPACES.AGENTS);\n const taskCount = await this._countNamespace(SWARM_NAMESPACES.TASKS);\n const patternCount = await this._countNamespace(SWARM_NAMESPACES.PATTERNS);\n\n // Get active agents\n const activeAgents = Array.from(this.agentCache.values()).filter(\n (agent) => agent.status === 'active' || agent.status === 'busy',\n ).length;\n\n // Get task statistics\n const tasks = Array.from(this.taskCache.values());\n const taskStats = {\n total: tasks.length,\n pending: tasks.filter((t) => t.status === 'pending').length,\n inProgress: tasks.filter((t) => t.status === 'in_progress').length,\n completed: tasks.filter((t) => t.status === 'completed').length,\n failed: tasks.filter((t) => t.status === 'failed').length,\n };\n\n return {\n ...baseStats,\n swarm: {\n swarmId: this.swarmId,\n agents: {\n total: agentCount,\n active: activeAgents,\n cached: this.agentCache.size,\n },\n tasks: taskStats,\n patterns: {\n total: patternCount,\n cached: this.patternCache.size,\n },\n namespaces: Object.values(SWARM_NAMESPACES),\n },\n };\n }\n\n /**\n * Clean up old swarm data\n */\n async cleanupSwarmData(options = {}) {\n const {\n maxAge = 86400 * 7, // 7 days\n keepPatterns = true,\n keepConsensus = true,\n } = options;\n\n const cutoffTime = Date.now() - maxAge * 1000;\n let cleaned = 0;\n\n // Clean old communications\n const comms = await this.list(SWARM_NAMESPACES.COMMUNICATIONS);\n for (const comm of comms) {\n if (new Date(comm.value.timestamp).getTime() < cutoffTime) {\n await this.delete(comm.key, SWARM_NAMESPACES.COMMUNICATIONS);\n cleaned++;\n }\n }\n\n // Clean completed tasks\n const tasks = await this.list(SWARM_NAMESPACES.TASKS);\n for (const task of tasks) {\n if (\n task.value.status === 'completed' &&\n new Date(task.value.completedAt).getTime() < cutoffTime\n ) {\n await this.delete(task.key, SWARM_NAMESPACES.TASKS);\n this.taskCache.delete(task.value.id);\n cleaned++;\n }\n }\n\n // Clean old metrics\n const metrics = await this.list(SWARM_NAMESPACES.METRICS);\n for (const metric of metrics) {\n if (new Date(metric.createdAt).getTime() < cutoffTime) {\n await this.delete(metric.key, SWARM_NAMESPACES.METRICS);\n cleaned++;\n }\n }\n\n this.emit('swarm:cleanup', { cleaned, maxAge });\n\n return { cleaned };\n }\n\n /**\n * Export swarm state\n */\n async exportSwarmState() {\n const agents = await this.listAgents();\n const tasks = Array.from(this.taskCache.values());\n const patterns = await this.list(SWARM_NAMESPACES.PATTERNS);\n\n return {\n swarmId: this.swarmId,\n exportedAt: new Date().toISOString(),\n agents: agents,\n tasks: tasks,\n patterns: patterns.map((p) => p.value),\n statistics: await this.getSwarmStats(),\n };\n }\n\n /**\n * Import swarm state\n */\n async importSwarmState(state) {\n let imported = {\n agents: 0,\n tasks: 0,\n patterns: 0,\n };\n\n // Import agents\n if (state.agents) {\n for (const agent of state.agents) {\n await this.storeAgent(agent.id, agent);\n imported.agents++;\n }\n }\n\n // Import tasks\n if (state.tasks) {\n for (const task of state.tasks) {\n await this.storeTask(task.id, task);\n imported.tasks++;\n }\n }\n\n // Import patterns\n if (state.patterns) {\n for (const pattern of state.patterns) {\n await this.storePattern(pattern.id, pattern);\n imported.patterns++;\n }\n }\n\n this.emit('swarm:imported', imported);\n\n return imported;\n }\n\n /**\n * Private helper methods\n */\n\n async _initializeSwarmNamespaces() {\n // Create swarm metadata\n await this.store(\n 'swarm:metadata',\n {\n swarmId: this.swarmId,\n createdAt: new Date().toISOString(),\n version: '1.0.0',\n namespaces: Object.values(SWARM_NAMESPACES),\n },\n {\n namespace: 'swarm:system',\n },\n );\n }\n\n async _loadSwarmState() {\n // Load active agents\n const agents = await this.list(SWARM_NAMESPACES.AGENTS, { limit: 100 });\n for (const entry of agents) {\n if (entry.value.status === 'active' || entry.value.status === 'busy') {\n this.agentCache.set(entry.value.id, entry.value);\n }\n }\n\n // Load in-progress tasks\n const tasks = await this.search({\n namespace: SWARM_NAMESPACES.TASKS,\n tags: ['in_progress'],\n limit: 100,\n });\n for (const entry of tasks) {\n this.taskCache.set(entry.value.id, entry.value);\n }\n\n // Load high-confidence patterns\n const patterns = await this.list(SWARM_NAMESPACES.PATTERNS, { limit: 50 });\n for (const entry of patterns) {\n if (entry.value.confidence > 0.7 || entry.value.successRate > 0.8) {\n this.patternCache.set(entry.value.id, entry.value);\n }\n }\n }\n\n async _countNamespace(namespace) {\n const stats = await this.getStats();\n return stats.namespaces[namespace]?.count || 0;\n }\n}\n\n// Export factory function for easy creation\nexport function createSwarmMemory(options = {}) {\n return new SwarmMemory(options);\n}\n\n// Export for backwards compatibility\nexport default SwarmMemory;\n"],"names":["SharedMemory","SWARM_NAMESPACES","AGENTS","TASKS","COMMUNICATIONS","CONSENSUS","PATTERNS","METRICS","COORDINATION","SwarmMemory","options","directory","filename","swarmId","mcpMode","agentCache","Map","taskCache","patternCache","initialize","_initializeSwarmNamespaces","_loadSwarmState","emit","storeAgent","agentId","agentData","key","enrichedData","lastUpdated","Date","toISOString","store","namespace","tags","type","status","metadata","agentType","set","stored","getAgent","has","get","agent","retrieve","listAgents","filter","agents","list","limit","map","entry","value","storeTask","taskId","taskData","createdAt","updatedAt","priority","assignedAgents","updateTaskStatus","result","task","getTask","Error","completedAt","updated","storeCommunication","fromAgent","toAgent","message","commId","now","Math","random","toString","substr","communication","id","timestamp","ttl","messageType","storeConsensus","consensusId","decision","consensusData","threshold","storePattern","patternId","pattern","patternData","usageCount","successRate","patternType","confidence","updatePatternMetrics","success","getPattern","lastUsedAt","alpha","currentSuccess","findBestPatterns","context","patterns","search","scored","score","sort","a","b","slice","storeCoordination","state","getCoordination","storeMetrics","metricsId","metrics","getSwarmStats","baseStats","getStats","agentCount","_countNamespace","taskCount","patternCount","activeAgents","Array","from","values","length","tasks","taskStats","total","pending","t","inProgress","completed","failed","swarm","active","cached","size","namespaces","Object","cleanupSwarmData","maxAge","keepPatterns","keepConsensus","cutoffTime","cleaned","comms","comm","getTime","delete","metric","exportSwarmState","exportedAt","p","statistics","importSwarmState","imported","version","stats","count","createSwarmMemory"],"mappings":"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"}
|
|
@@ -166,14 +166,4 @@ export class MetricsReader {
|
|
|
166
166
|
}
|
|
167
167
|
}
|
|
168
168
|
|
|
169
|
-
//# sourceMappingURL=metrics-reader.js.map processCount: 0,
|
|
170
|
-
orchestratorRunning: false,
|
|
171
|
-
port: null,
|
|
172
|
-
connections: 0
|
|
173
|
-
};
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
};
|
|
177
|
-
export { MetricsReader };
|
|
178
|
-
|
|
179
169
|
//# sourceMappingURL=metrics-reader.js.map
|
|
@@ -0,0 +1,462 @@
|
|
|
1
|
+
# Optional: Local Semantic Search with Transformers.js
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
By default, the memory system works perfectly **without any embeddings** using database pattern matching. This optional enhancement adds true semantic search using local AI models.
|
|
6
|
+
|
|
7
|
+
## Current Default Behavior ✅
|
|
8
|
+
|
|
9
|
+
**Already works out of the box:**
|
|
10
|
+
```bash
|
|
11
|
+
npx claude-flow@alpha memory store "api-design" "REST with JWT"
|
|
12
|
+
npx claude-flow@alpha memory list
|
|
13
|
+
# ✅ Works perfectly - no setup required!
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
**Memory query uses database fallback:**
|
|
17
|
+
```bash
|
|
18
|
+
npx claude-flow@alpha memory query "api"
|
|
19
|
+
# ✅ Works with pattern matching (exact/partial text search)
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Optional Enhancement: True Semantic Search
|
|
23
|
+
|
|
24
|
+
Add AI-powered semantic similarity for better query results.
|
|
25
|
+
|
|
26
|
+
### Installation Options
|
|
27
|
+
|
|
28
|
+
**Option 1: Package-level (Recommended for Development)**
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
# In agentic-flow repository
|
|
32
|
+
npm install @xenova/transformers --save-optional
|
|
33
|
+
|
|
34
|
+
# Or in claude-flow
|
|
35
|
+
npm install @xenova/transformers --save-optional
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**Option 2: User-level (Recommended for Production)**
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
# Users can enable semantic search with:
|
|
42
|
+
npm install -g @xenova/transformers
|
|
43
|
+
|
|
44
|
+
# Or with npx:
|
|
45
|
+
npx -p @xenova/transformers -p claude-flow@alpha claude-flow memory query "api"
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**Option 3: Environment Variable Flag**
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# Enable semantic search
|
|
52
|
+
export CLAUDE_FLOW_SEMANTIC_SEARCH=true
|
|
53
|
+
|
|
54
|
+
# Run memory commands
|
|
55
|
+
npx claude-flow@alpha memory query "authentication patterns"
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Implementation Strategy
|
|
61
|
+
|
|
62
|
+
### 1. Make @xenova/transformers Optional in package.json
|
|
63
|
+
|
|
64
|
+
**File: `agentic-flow/package.json` or `claude-flow/package.json`**
|
|
65
|
+
|
|
66
|
+
```json
|
|
67
|
+
{
|
|
68
|
+
"dependencies": {
|
|
69
|
+
"agentdb": "^1.4.3",
|
|
70
|
+
"better-sqlite3": "^11.10.0"
|
|
71
|
+
// ... existing deps
|
|
72
|
+
},
|
|
73
|
+
"optionalDependencies": {
|
|
74
|
+
"@xenova/transformers": "^3.2.0"
|
|
75
|
+
},
|
|
76
|
+
"peerDependencies": {
|
|
77
|
+
"@xenova/transformers": "^3.0.0"
|
|
78
|
+
},
|
|
79
|
+
"peerDependenciesMeta": {
|
|
80
|
+
"@xenova/transformers": {
|
|
81
|
+
"optional": true
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### 2. Update Embeddings Utility with Graceful Fallback
|
|
88
|
+
|
|
89
|
+
**File: `src/reasoningbank/utils/embeddings.ts`**
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
/**
|
|
93
|
+
* Embedding utilities with optional local model support
|
|
94
|
+
*/
|
|
95
|
+
|
|
96
|
+
let transformersAvailable = false;
|
|
97
|
+
let embeddingPipeline: any = null;
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Check if transformers.js is available
|
|
101
|
+
*/
|
|
102
|
+
async function checkTransformersAvailable(): Promise<boolean> {
|
|
103
|
+
try {
|
|
104
|
+
const transformers = await import('@xenova/transformers');
|
|
105
|
+
return true;
|
|
106
|
+
} catch (error) {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Initialize embeddings if available
|
|
113
|
+
*/
|
|
114
|
+
async function initializeEmbeddings(): Promise<boolean> {
|
|
115
|
+
if (embeddingPipeline) return true; // Already initialized
|
|
116
|
+
|
|
117
|
+
// Check if feature is enabled
|
|
118
|
+
const semanticSearchEnabled = process.env.CLAUDE_FLOW_SEMANTIC_SEARCH === 'true';
|
|
119
|
+
if (!semanticSearchEnabled) {
|
|
120
|
+
console.log('[Embeddings] Semantic search disabled (set CLAUDE_FLOW_SEMANTIC_SEARCH=true to enable)');
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Check if transformers is available
|
|
125
|
+
transformersAvailable = await checkTransformersAvailable();
|
|
126
|
+
|
|
127
|
+
if (!transformersAvailable) {
|
|
128
|
+
console.log('[Embeddings] @xenova/transformers not installed');
|
|
129
|
+
console.log('');
|
|
130
|
+
console.log('📝 To enable semantic search, run:');
|
|
131
|
+
console.log(' npm install -g @xenova/transformers');
|
|
132
|
+
console.log(' export CLAUDE_FLOW_SEMANTIC_SEARCH=true');
|
|
133
|
+
console.log('');
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
try {
|
|
138
|
+
const { pipeline } = await import('@xenova/transformers');
|
|
139
|
+
|
|
140
|
+
console.log('[Embeddings] Loading local model (first time: ~23 MB download)...');
|
|
141
|
+
embeddingPipeline = await pipeline(
|
|
142
|
+
'feature-extraction',
|
|
143
|
+
'Xenova/all-MiniLM-L6-v2'
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
console.log('[Embeddings] ✅ Semantic search enabled (Xenova/all-MiniLM-L6-v2)');
|
|
147
|
+
return true;
|
|
148
|
+
|
|
149
|
+
} catch (error) {
|
|
150
|
+
console.warn('[Embeddings] Failed to initialize:', error.message);
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Compute embedding (returns null if not available)
|
|
157
|
+
*/
|
|
158
|
+
export async function computeEmbedding(text: string): Promise<Float32Array | null> {
|
|
159
|
+
const initialized = await initializeEmbeddings();
|
|
160
|
+
|
|
161
|
+
if (!initialized || !embeddingPipeline) {
|
|
162
|
+
return null; // Feature not available
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
try {
|
|
166
|
+
const output = await embeddingPipeline(text, {
|
|
167
|
+
pooling: 'mean',
|
|
168
|
+
normalize: true
|
|
169
|
+
});
|
|
170
|
+
return new Float32Array(output.data);
|
|
171
|
+
} catch (error) {
|
|
172
|
+
console.error('[Embeddings] Generation failed:', error.message);
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Check if semantic search is available
|
|
179
|
+
*/
|
|
180
|
+
export async function isSemanticSearchAvailable(): Promise<boolean> {
|
|
181
|
+
return await initializeEmbeddings();
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Clear embedding cache (no-op if not initialized)
|
|
186
|
+
*/
|
|
187
|
+
export function clearEmbeddingCache(): void {
|
|
188
|
+
// No-op for now
|
|
189
|
+
}
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### 3. Update Retrieval to Handle Optional Embeddings
|
|
193
|
+
|
|
194
|
+
**File: `src/reasoningbank/core/retrieve.ts`**
|
|
195
|
+
|
|
196
|
+
```typescript
|
|
197
|
+
import { computeEmbedding, isSemanticSearchAvailable } from '../utils/embeddings.js';
|
|
198
|
+
import { cosineSimilarity } from '../utils/mmr.js';
|
|
199
|
+
import { fetchMemoryCandidates } from '../db/queries.js';
|
|
200
|
+
|
|
201
|
+
export async function retrieveMemories(
|
|
202
|
+
query: string,
|
|
203
|
+
options: RetrievalOptions
|
|
204
|
+
): Promise<any[]> {
|
|
205
|
+
console.log(`[INFO] Retrieving memories for query: ${query}...`);
|
|
206
|
+
|
|
207
|
+
// Fetch candidates from database
|
|
208
|
+
const candidates = fetchMemoryCandidates(options);
|
|
209
|
+
|
|
210
|
+
if (candidates.length === 0) {
|
|
211
|
+
console.log('[INFO] No memory candidates found');
|
|
212
|
+
return [];
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
console.log(`[INFO] Found ${candidates.length} candidates`);
|
|
216
|
+
|
|
217
|
+
// Check if semantic search is available
|
|
218
|
+
const semanticAvailable = await isSemanticSearchAvailable();
|
|
219
|
+
|
|
220
|
+
if (!semanticAvailable) {
|
|
221
|
+
console.log('[INFO] Using database pattern matching (semantic search not enabled)');
|
|
222
|
+
return candidates.slice(0, options.k);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// Try semantic search
|
|
226
|
+
try {
|
|
227
|
+
const queryEmbedding = await computeEmbedding(query);
|
|
228
|
+
|
|
229
|
+
if (!queryEmbedding) {
|
|
230
|
+
console.log('[INFO] Semantic search unavailable, using database fallback');
|
|
231
|
+
return candidates.slice(0, options.k);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
console.log('[INFO] Using semantic search with local embeddings');
|
|
235
|
+
|
|
236
|
+
// Compute similarities
|
|
237
|
+
const scoredCandidates = candidates
|
|
238
|
+
.map(candidate => {
|
|
239
|
+
if (!candidate.embedding || candidate.embedding.length !== queryEmbedding.length) {
|
|
240
|
+
return { ...candidate, similarity: 0 };
|
|
241
|
+
}
|
|
242
|
+
const similarity = cosineSimilarity(queryEmbedding, candidate.embedding);
|
|
243
|
+
return { ...candidate, similarity };
|
|
244
|
+
})
|
|
245
|
+
.sort((a, b) => b.similarity - a.similarity);
|
|
246
|
+
|
|
247
|
+
return scoredCandidates.slice(0, options.k);
|
|
248
|
+
|
|
249
|
+
} catch (error) {
|
|
250
|
+
console.error('[ERROR] Semantic search failed:', error.message);
|
|
251
|
+
console.log('[INFO] Falling back to database pattern matching');
|
|
252
|
+
return candidates.slice(0, options.k);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### 4. Update CLI to Show Status
|
|
258
|
+
|
|
259
|
+
**File: `src/cli/simple-commands/memory.js`**
|
|
260
|
+
|
|
261
|
+
```javascript
|
|
262
|
+
async function handleQueryCommand(query, options) {
|
|
263
|
+
console.log('\nℹ️ 🧠 Using ReasoningBank mode...');
|
|
264
|
+
|
|
265
|
+
// Check semantic search availability
|
|
266
|
+
const { isSemanticSearchAvailable } = await import('../../reasoningbank/utils/embeddings.js');
|
|
267
|
+
const semanticEnabled = await isSemanticSearchAvailable();
|
|
268
|
+
|
|
269
|
+
if (!semanticEnabled) {
|
|
270
|
+
console.log('💡 Tip: Enable semantic search for better results:');
|
|
271
|
+
console.log(' npm install -g @xenova/transformers');
|
|
272
|
+
console.log(' export CLAUDE_FLOW_SEMANTIC_SEARCH=true');
|
|
273
|
+
console.log('');
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// ... rest of query logic
|
|
277
|
+
}
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
---
|
|
281
|
+
|
|
282
|
+
## User Experience
|
|
283
|
+
|
|
284
|
+
### Default Experience (No Setup)
|
|
285
|
+
|
|
286
|
+
```bash
|
|
287
|
+
$ npx claude-flow@alpha memory query "api"
|
|
288
|
+
|
|
289
|
+
ℹ️ 🧠 Using ReasoningBank mode...
|
|
290
|
+
[ReasoningBank] Initializing...
|
|
291
|
+
[ReasoningBank] Enabled: true (initializing...)
|
|
292
|
+
[INFO] Retrieving memories for query: api...
|
|
293
|
+
[INFO] Found 5 candidates
|
|
294
|
+
[INFO] Using database pattern matching (semantic search not enabled)
|
|
295
|
+
✅ Found 2 results
|
|
296
|
+
|
|
297
|
+
📌 api-design
|
|
298
|
+
Value: REST with JWT auth
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
### Enhanced Experience (With Setup)
|
|
302
|
+
|
|
303
|
+
```bash
|
|
304
|
+
$ npm install -g @xenova/transformers
|
|
305
|
+
$ export CLAUDE_FLOW_SEMANTIC_SEARCH=true
|
|
306
|
+
$ npx claude-flow@alpha memory query "authentication patterns"
|
|
307
|
+
|
|
308
|
+
ℹ️ 🧠 Using ReasoningBank mode...
|
|
309
|
+
[ReasoningBank] Initializing...
|
|
310
|
+
[Embeddings] Loading local model (first time: ~23 MB download)...
|
|
311
|
+
[Embeddings] ✅ Semantic search enabled (Xenova/all-MiniLM-L6-v2)
|
|
312
|
+
[INFO] Using semantic search with local embeddings
|
|
313
|
+
✅ Found 3 results (semantic similarity):
|
|
314
|
+
|
|
315
|
+
📌 api-design
|
|
316
|
+
Value: REST with JWT auth
|
|
317
|
+
Match Score: 89.3% ← Semantic similarity!
|
|
318
|
+
|
|
319
|
+
📌 oauth-config
|
|
320
|
+
Value: OAuth 2.0 with PKCE
|
|
321
|
+
Match Score: 76.2% ← Related concept!
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
---
|
|
325
|
+
|
|
326
|
+
## Documentation Updates
|
|
327
|
+
|
|
328
|
+
### README.md
|
|
329
|
+
|
|
330
|
+
```markdown
|
|
331
|
+
## Memory System
|
|
332
|
+
|
|
333
|
+
The memory system works out of the box with database pattern matching.
|
|
334
|
+
|
|
335
|
+
### Optional: Semantic Search
|
|
336
|
+
|
|
337
|
+
For AI-powered semantic similarity, install the optional transformer models:
|
|
338
|
+
|
|
339
|
+
```bash
|
|
340
|
+
# Enable semantic search
|
|
341
|
+
npm install -g @xenova/transformers
|
|
342
|
+
export CLAUDE_FLOW_SEMANTIC_SEARCH=true
|
|
343
|
+
|
|
344
|
+
# Now queries use semantic similarity
|
|
345
|
+
npx claude-flow@alpha memory query "authentication"
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
**Benefits:**
|
|
349
|
+
- Find related concepts (e.g., "auth" matches "JWT", "OAuth")
|
|
350
|
+
- 50-100ms per query
|
|
351
|
+
- Works offline
|
|
352
|
+
- Free (no API costs)
|
|
353
|
+
- ~23 MB one-time download
|
|
354
|
+
|
|
355
|
+
**Without semantic search:**
|
|
356
|
+
- Database pattern matching (exact/partial text)
|
|
357
|
+
- Instant (no model loading)
|
|
358
|
+
- Zero dependencies
|
|
359
|
+
- Always works
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
---
|
|
363
|
+
|
|
364
|
+
## Package Configuration
|
|
365
|
+
|
|
366
|
+
### package.json Changes
|
|
367
|
+
|
|
368
|
+
```json
|
|
369
|
+
{
|
|
370
|
+
"optionalDependencies": {
|
|
371
|
+
"@xenova/transformers": "^3.2.0"
|
|
372
|
+
},
|
|
373
|
+
"scripts": {
|
|
374
|
+
"postinstall": "node scripts/check-optional-deps.js"
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
### scripts/check-optional-deps.js
|
|
380
|
+
|
|
381
|
+
```javascript
|
|
382
|
+
// Check if optional dependencies are available
|
|
383
|
+
const fs = require('fs');
|
|
384
|
+
const path = require('path');
|
|
385
|
+
|
|
386
|
+
const transformersPath = path.join(__dirname, '../node_modules/@xenova/transformers');
|
|
387
|
+
|
|
388
|
+
if (fs.existsSync(transformersPath)) {
|
|
389
|
+
console.log('✅ Optional: Semantic search available (@xenova/transformers installed)');
|
|
390
|
+
} else {
|
|
391
|
+
console.log('');
|
|
392
|
+
console.log('💡 Optional Enhancement Available:');
|
|
393
|
+
console.log(' Install @xenova/transformers for semantic search');
|
|
394
|
+
console.log(' npm install -g @xenova/transformers');
|
|
395
|
+
console.log('');
|
|
396
|
+
}
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
---
|
|
400
|
+
|
|
401
|
+
## Benefits of Optional Approach
|
|
402
|
+
|
|
403
|
+
### ✅ Advantages
|
|
404
|
+
|
|
405
|
+
1. **Zero friction for basic use** - Works immediately with npx
|
|
406
|
+
2. **No large downloads required** - Users choose when to download 23 MB model
|
|
407
|
+
3. **Graceful degradation** - Falls back to database search automatically
|
|
408
|
+
4. **User choice** - Install only if semantic search is needed
|
|
409
|
+
5. **Clear communication** - Users know what they're missing and how to get it
|
|
410
|
+
|
|
411
|
+
### ❌ Avoids Problems
|
|
412
|
+
|
|
413
|
+
1. No mandatory 23 MB download for users who don't need semantic search
|
|
414
|
+
2. No install failures due to native dependencies
|
|
415
|
+
3. No confusion about why embeddings aren't working
|
|
416
|
+
4. No breaking changes to existing functionality
|
|
417
|
+
|
|
418
|
+
---
|
|
419
|
+
|
|
420
|
+
## Testing Strategy
|
|
421
|
+
|
|
422
|
+
### Test 1: Default (No Semantic Search)
|
|
423
|
+
```bash
|
|
424
|
+
# Fresh install
|
|
425
|
+
npx claude-flow@alpha memory store "test" "value"
|
|
426
|
+
npx claude-flow@alpha memory query "test"
|
|
427
|
+
# ✅ Should work with database pattern matching
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
### Test 2: Enhanced (With Semantic Search)
|
|
431
|
+
```bash
|
|
432
|
+
# Install optional dep
|
|
433
|
+
npm install -g @xenova/transformers
|
|
434
|
+
export CLAUDE_FLOW_SEMANTIC_SEARCH=true
|
|
435
|
+
|
|
436
|
+
npx claude-flow@alpha memory query "test"
|
|
437
|
+
# ✅ Should use semantic similarity
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
### Test 3: Graceful Fallback
|
|
441
|
+
```bash
|
|
442
|
+
# Enable flag but don't install package
|
|
443
|
+
export CLAUDE_FLOW_SEMANTIC_SEARCH=true
|
|
444
|
+
unset npm_config_prefix # Ensure transformers not available
|
|
445
|
+
|
|
446
|
+
npx claude-flow@alpha memory query "test"
|
|
447
|
+
# ✅ Should show helpful message and fall back to database search
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
---
|
|
451
|
+
|
|
452
|
+
## Summary
|
|
453
|
+
|
|
454
|
+
This approach gives you:
|
|
455
|
+
|
|
456
|
+
✅ **Works out of the box** - No setup required for basic memory system
|
|
457
|
+
✅ **Optional enhancement** - Users install @xenova/transformers only if they want semantic search
|
|
458
|
+
✅ **Graceful fallback** - Always works, even without transformers installed
|
|
459
|
+
✅ **Clear messaging** - Users know what's available and how to enable it
|
|
460
|
+
✅ **Zero breaking changes** - Existing functionality unchanged
|
|
461
|
+
|
|
462
|
+
**Recommendation:** Implement this optional approach for maximum user flexibility and zero friction.
|