@stackmemoryai/stackmemory 0.4.2 → 0.5.1

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.
Files changed (49) hide show
  1. package/dist/cli/commands/ralph.js +305 -0
  2. package/dist/cli/commands/ralph.js.map +2 -2
  3. package/dist/cli/streamlined-cli.js +144 -0
  4. package/dist/cli/streamlined-cli.js.map +7 -0
  5. package/dist/core/events/event-bus.js +110 -0
  6. package/dist/core/events/event-bus.js.map +7 -0
  7. package/dist/core/plugins/plugin-interface.js +87 -0
  8. package/dist/core/plugins/plugin-interface.js.map +7 -0
  9. package/dist/core/storage/simplified-storage.js +328 -0
  10. package/dist/core/storage/simplified-storage.js.map +7 -0
  11. package/dist/integrations/claude-code/agent-bridge.js +764 -0
  12. package/dist/integrations/claude-code/agent-bridge.js.map +7 -0
  13. package/dist/integrations/claude-code/task-coordinator.js +356 -0
  14. package/dist/integrations/claude-code/task-coordinator.js.map +7 -0
  15. package/dist/integrations/ralph/bridge/ralph-stackmemory-bridge.js +33 -11
  16. package/dist/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +2 -2
  17. package/dist/integrations/ralph/monitoring/swarm-registry.js +10 -1
  18. package/dist/integrations/ralph/monitoring/swarm-registry.js.map +2 -2
  19. package/dist/integrations/ralph/patterns/compounding-engineering-pattern.js +396 -0
  20. package/dist/integrations/ralph/patterns/compounding-engineering-pattern.js.map +7 -0
  21. package/dist/integrations/ralph/patterns/extended-coherence-sessions.js +469 -0
  22. package/dist/integrations/ralph/patterns/extended-coherence-sessions.js.map +7 -0
  23. package/dist/integrations/ralph/patterns/oracle-worker-pattern.js +384 -0
  24. package/dist/integrations/ralph/patterns/oracle-worker-pattern.js.map +7 -0
  25. package/dist/integrations/ralph/swarm/git-workflow-manager.js +71 -18
  26. package/dist/integrations/ralph/swarm/git-workflow-manager.js.map +2 -2
  27. package/dist/integrations/ralph/swarm/swarm-coordinator.js +243 -49
  28. package/dist/integrations/ralph/swarm/swarm-coordinator.js.map +2 -2
  29. package/dist/plugins/linear/index.js +166 -0
  30. package/dist/plugins/linear/index.js.map +7 -0
  31. package/dist/plugins/loader.js +57 -0
  32. package/dist/plugins/loader.js.map +7 -0
  33. package/dist/plugins/plugin-interface.js +67 -0
  34. package/dist/plugins/plugin-interface.js.map +7 -0
  35. package/dist/plugins/ralph/simple-ralph-plugin.js +305 -0
  36. package/dist/plugins/ralph/simple-ralph-plugin.js.map +7 -0
  37. package/dist/plugins/ralph/use-cases/code-generator.js +151 -0
  38. package/dist/plugins/ralph/use-cases/code-generator.js.map +7 -0
  39. package/dist/plugins/ralph/use-cases/test-generator.js +201 -0
  40. package/dist/plugins/ralph/use-cases/test-generator.js.map +7 -0
  41. package/package.json +1 -8
  42. package/scripts/simple-swarm-demo.ts +114 -0
  43. package/scripts/test-ralph-iterations.ts +164 -0
  44. package/scripts/test-swarm-fixes.ts +161 -0
  45. package/scripts/testing/ab-test-runner.ts +4 -2
  46. package/scripts/testing/collect-metrics.ts +2 -2
  47. package/scripts/testing/real-performance-test.js +1 -1
  48. package/scripts/testing/run-effectiveness-tests.sh +1 -1
  49. package/scripts/testing/simple-effectiveness-test.js +1 -1
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/integrations/claude-code/agent-bridge.ts"],
4
+ "sourcesContent": ["/**\n * Claude Code Agent Bridge\n *\n * Integrates StackMemory's Oracle/Worker pattern with Claude Code's specialized agents.\n * Enables seamless use of Claude's built-in agents as Oracle strategists and Worker executors.\n */\n\nimport { v4 as uuidv4 } from 'uuid';\nimport { logger } from '../../core/monitoring/logger.js';\nimport {\n OracleWorkerCoordinator,\n ModelConfig,\n} from '../ralph/patterns/oracle-worker-pattern.js';\nimport { ClaudeCodeTaskCoordinator } from './task-coordinator.js';\n\n// Claude Code agent types and their capabilities\nexport interface ClaudeCodeAgent {\n name: string;\n type: 'oracle' | 'worker' | 'reviewer';\n description: string;\n capabilities: string[];\n costMultiplier: number; // Relative cost compared to base model\n complexity: 'low' | 'medium' | 'high' | 'very_high';\n specializations: string[];\n}\n\n// Available Claude Code agents mapped to Oracle/Worker roles\nexport const CLAUDE_CODE_AGENTS: Record<string, ClaudeCodeAgent> = {\n // Oracle-level agents (strategic, high-level)\n 'staff-architect': {\n name: 'staff-architect',\n type: 'oracle',\n description:\n 'Strategic technical leadership, architectural guidance, and engineering direction',\n capabilities: [\n 'system_design',\n 'architectural_planning',\n 'technical_strategy',\n 'scalability_analysis',\n 'technology_selection',\n 'team_organization',\n ],\n costMultiplier: 1.0, // Oracle pricing\n complexity: 'very_high',\n specializations: ['architecture', 'strategy', 'leadership'],\n },\n\n 'product-manager': {\n name: 'product-manager',\n type: 'oracle',\n description: 'Strategic planning, roadmap development, and market analysis',\n capabilities: [\n 'product_strategy',\n 'roadmap_planning',\n 'market_analysis',\n 'feature_prioritization',\n 'stakeholder_alignment',\n 'business_requirements',\n ],\n costMultiplier: 1.0,\n complexity: 'high',\n specializations: ['strategy', 'planning', 'business'],\n },\n\n // Worker-level agents (execution, focused tasks)\n 'general-purpose': {\n name: 'general-purpose',\n type: 'worker',\n description:\n 'General-purpose agent for researching, coding, and multi-step tasks',\n capabilities: [\n 'code_implementation',\n 'research',\n 'debugging',\n 'file_operations',\n 'testing',\n 'documentation',\n ],\n costMultiplier: 0.2, // Worker pricing\n complexity: 'medium',\n specializations: ['development', 'research', 'general'],\n },\n\n 'code-reviewer': {\n name: 'code-reviewer',\n type: 'reviewer',\n description:\n 'Reviews code against standards, checks for issues and best practices',\n capabilities: [\n 'code_review',\n 'quality_assessment',\n 'security_analysis',\n 'performance_review',\n 'best_practices_enforcement',\n 'typescript_validation',\n ],\n costMultiplier: 0.3, // Slightly more expensive worker\n complexity: 'medium',\n specializations: ['quality', 'security', 'standards'],\n },\n\n debugger: {\n name: 'debugger',\n type: 'worker',\n description:\n 'Specialized debugging for errors, test failures, and unexpected behavior',\n capabilities: [\n 'error_analysis',\n 'debugging',\n 'log_analysis',\n 'performance_debugging',\n 'test_failure_analysis',\n 'root_cause_analysis',\n ],\n costMultiplier: 0.25,\n complexity: 'medium',\n specializations: ['debugging', 'analysis', 'troubleshooting'],\n },\n\n 'qa-workflow-validator': {\n name: 'qa-workflow-validator',\n type: 'worker',\n description:\n 'Comprehensive QA testing, workflow validation, and UI testing',\n capabilities: [\n 'workflow_validation',\n 'test_execution',\n 'ui_testing',\n 'integration_testing',\n 'log_analysis',\n 'quality_assurance',\n ],\n costMultiplier: 0.3,\n complexity: 'medium',\n specializations: ['testing', 'validation', 'quality'],\n },\n\n 'merge-coordinator': {\n name: 'merge-coordinator',\n type: 'worker',\n description: 'Coordinates merge requests and handles code integration',\n capabilities: [\n 'merge_coordination',\n 'conflict_resolution',\n 'code_integration',\n 'branch_management',\n 'review_coordination',\n 'git_workflow',\n ],\n costMultiplier: 0.2,\n complexity: 'low',\n specializations: ['git', 'coordination', 'integration'],\n },\n\n 'github-workflow': {\n name: 'github-workflow',\n type: 'worker',\n description: 'Git workflow management for commits, branches, and PRs',\n capabilities: [\n 'git_operations',\n 'branch_management',\n 'commit_management',\n 'pr_creation',\n 'workflow_automation',\n 'repository_management',\n ],\n costMultiplier: 0.15,\n complexity: 'low',\n specializations: ['git', 'automation', 'workflow'],\n },\n};\n\n/**\n * Claude Code Agent Bridge\n * Integrates Claude Code agents with Oracle/Worker pattern\n */\nexport class ClaudeCodeAgentBridge extends OracleWorkerCoordinator {\n private claudeAgents: Map<string, ClaudeCodeAgent> = new Map();\n private activeAgentSessions: Map<string, any> = new Map();\n private taskCoordinator: ClaudeCodeTaskCoordinator;\n\n constructor() {\n // Create configurations before super call\n const oracleConfigs = ClaudeCodeAgentBridge.createOracleConfigs();\n const workerConfigs = ClaudeCodeAgentBridge.createWorkerConfigs();\n const reviewerConfigs = ClaudeCodeAgentBridge.createReviewerConfigs();\n\n super({\n oracle: oracleConfigs[0],\n workers: workerConfigs,\n reviewers: reviewerConfigs,\n maxWorkers: 8, // Allow more workers for Claude Code agents\n coordinationInterval: 30000,\n costBudget: 15.0, // Higher budget for Claude Code integration\n });\n\n // Initialize after super call\n\n // Initialize task coordinator\n this.taskCoordinator = new ClaudeCodeTaskCoordinator();\n\n // Load Claude Code agents\n this.loadClaudeCodeAgents();\n\n logger.info('Claude Code Agent Bridge initialized', {\n oracleAgents: oracleConfigs.length,\n workerAgents: workerConfigs.length,\n reviewerAgents: reviewerConfigs.length,\n });\n }\n\n /**\n * Launch Oracle/Worker swarm using Claude Code agents\n */\n async launchClaudeCodeSwarm(\n projectDescription: string,\n options: {\n oracleAgent?: string;\n workerAgents?: string[];\n reviewerAgents?: string[];\n budget?: number;\n complexity?: 'low' | 'medium' | 'high' | 'very_high';\n } = {}\n ): Promise<string> {\n const {\n oracleAgent = 'staff-architect',\n workerAgents = ['general-purpose', 'code-reviewer'],\n reviewerAgents = ['code-reviewer'],\n budget = 10.0,\n complexity = 'medium',\n } = options;\n\n logger.info('Launching Claude Code swarm', {\n project: projectDescription.substring(0, 100),\n oracleAgent,\n workerAgents,\n budget,\n });\n\n // Validate agents exist\n this.validateAgentSelection(oracleAgent, workerAgents, reviewerAgents);\n\n // Create specialized task decomposition using Claude Code capabilities\n const swarmId = uuidv4();\n\n try {\n // Phase 1: Oracle Planning with Claude Code staff-architect\n const oracleTaskId = await this.createClaudeOracleTask(\n oracleAgent,\n projectDescription,\n complexity\n );\n\n const decomposition = await this.executeClaudeOracleTask(\n oracleTaskId,\n oracleAgent\n );\n\n // Phase 2: Worker Assignment with Claude Code agents\n const workerTasks = await this.allocateTasksToClaudeWorkers(\n decomposition,\n workerAgents\n );\n\n // Phase 3: Parallel Worker Execution\n const workerPromises = workerTasks.map((task) =>\n this.executeClaudeWorkerTask(task)\n );\n\n // Phase 4: Review with Claude Code reviewers\n const reviewPromises = reviewerAgents.map((reviewer) =>\n this.executeClaudeReviewTask(reviewer, decomposition, workerTasks)\n );\n\n // Execute all phases\n const [workerResults, reviewResults] = await Promise.all([\n Promise.allSettled(workerPromises),\n Promise.allSettled(reviewPromises),\n ]);\n\n // Phase 5: Integration and Final Review\n await this.integrateClaudeResults(swarmId, workerResults, reviewResults);\n\n this.logClaudeCodeCostAnalysis();\n return swarmId;\n } catch (error: unknown) {\n logger.error('Claude Code swarm failed', error as Error);\n throw error;\n }\n }\n\n /**\n * Load Claude Code agents into the bridge\n */\n private loadClaudeCodeAgents(): void {\n for (const [agentName, agentConfig] of Object.entries(CLAUDE_CODE_AGENTS)) {\n this.claudeAgents.set(agentName, agentConfig);\n }\n\n logger.info('Claude Code agents loaded', {\n totalAgents: this.claudeAgents.size,\n oracles: Array.from(this.claudeAgents.values()).filter(\n (a) => a.type === 'oracle'\n ).length,\n workers: Array.from(this.claudeAgents.values()).filter(\n (a) => a.type === 'worker'\n ).length,\n reviewers: Array.from(this.claudeAgents.values()).filter(\n (a) => a.type === 'reviewer'\n ).length,\n });\n }\n\n /**\n * Create Oracle model configurations from Claude Code agents\n */\n private static createOracleConfigs(): ModelConfig[] {\n return Object.values(CLAUDE_CODE_AGENTS)\n .filter((agent) => agent.type === 'oracle')\n .map((agent) => ({\n tier: 'oracle' as const,\n provider: 'claude',\n model: `claude-code-${agent.name}`,\n costPerToken: 0.015 * agent.costMultiplier, // Base Oracle cost with multiplier\n capabilities: agent.capabilities,\n }));\n }\n\n /**\n * Create Worker model configurations from Claude Code agents\n */\n private static createWorkerConfigs(): ModelConfig[] {\n return Object.values(CLAUDE_CODE_AGENTS)\n .filter((agent) => agent.type === 'worker')\n .map((agent) => ({\n tier: 'worker' as const,\n provider: 'claude',\n model: `claude-code-${agent.name}`,\n costPerToken: 0.00025 * agent.costMultiplier, // Base worker cost with multiplier\n capabilities: agent.capabilities,\n }));\n }\n\n /**\n * Create Reviewer model configurations from Claude Code agents\n */\n private static createReviewerConfigs(): ModelConfig[] {\n return Object.values(CLAUDE_CODE_AGENTS)\n .filter((agent) => agent.type === 'reviewer')\n .map((agent) => ({\n tier: 'reviewer' as const,\n provider: 'claude',\n model: `claude-code-${agent.name}`,\n costPerToken: 0.003 * agent.costMultiplier, // Base reviewer cost with multiplier\n capabilities: agent.capabilities,\n }));\n }\n\n /**\n * Validate that selected agents exist and are appropriate\n */\n private validateAgentSelection(\n oracleAgent: string,\n workerAgents: string[],\n reviewerAgents: string[]\n ): void {\n // Validate Oracle agent\n const oracle = this.claudeAgents.get(oracleAgent);\n if (!oracle) {\n throw new Error(`Oracle agent '${oracleAgent}' not found`);\n }\n if (oracle.type !== 'oracle') {\n throw new Error(`Agent '${oracleAgent}' is not an Oracle-level agent`);\n }\n\n // Validate Worker agents\n for (const workerAgent of workerAgents) {\n const worker = this.claudeAgents.get(workerAgent);\n if (!worker) {\n throw new Error(`Worker agent '${workerAgent}' not found`);\n }\n if (worker.type !== 'worker') {\n throw new Error(`Agent '${workerAgent}' is not a Worker-level agent`);\n }\n }\n\n // Validate Reviewer agents\n for (const reviewerAgent of reviewerAgents) {\n const reviewer = this.claudeAgents.get(reviewerAgent);\n if (!reviewer) {\n throw new Error(`Reviewer agent '${reviewerAgent}' not found`);\n }\n if (reviewer.type !== 'reviewer') {\n throw new Error(\n `Agent '${reviewerAgent}' is not a Reviewer-level agent`\n );\n }\n }\n }\n\n /**\n * Create Oracle task with Claude Code agent capabilities\n */\n private async createClaudeOracleTask(\n agentName: string,\n projectDescription: string,\n complexity: string\n ): Promise<string> {\n const taskId = uuidv4();\n const agent = this.claudeAgents.get(agentName)!;\n\n logger.info('Creating Claude Oracle task', {\n taskId,\n agent: agentName,\n complexity,\n });\n\n // Store task configuration for execution\n this.activeAgentSessions.set(taskId, {\n agentName,\n agentType: 'oracle',\n projectDescription,\n complexity,\n capabilities: agent.capabilities,\n });\n\n return taskId;\n }\n\n /**\n * Execute Oracle task using Claude Code agent\n */\n private async executeClaudeOracleTask(\n taskId: string,\n agentName: string\n ): Promise<any> {\n const session = this.activeAgentSessions.get(taskId);\n if (!session) {\n throw new Error(`Oracle task session ${taskId} not found`);\n }\n\n logger.info('Executing Claude Oracle task', {\n taskId,\n agent: agentName,\n });\n\n // Build Oracle prompt optimized for Claude Code agent\n const oraclePrompt = this.buildClaudeOraclePrompt(session);\n\n // Execute with Claude Code agent (integration point)\n const result = await this.invokeClaudeCodeAgent(agentName, oraclePrompt, {\n type: 'oracle',\n maxTokens: 4000,\n temperature: 0.7,\n });\n\n // Parse and validate the decomposition\n const decomposition = this.parseClaudeTaskDecomposition(result);\n\n return decomposition;\n }\n\n /**\n * Build Oracle prompt optimized for Claude Code capabilities\n */\n private buildClaudeOraclePrompt(session: any): string {\n const agent = this.claudeAgents.get(session.agentName)!;\n\n return `\n# CLAUDE CODE ORACLE: ${agent.name.toUpperCase()}\n\n## Your Role & Capabilities\nYou are a **${agent.description}** acting as the Oracle in an Oracle/Worker pattern.\n\n**Your Specialized Capabilities:**\n${agent.capabilities.map((cap) => `- ${cap.replace(/_/g, ' ')}`).join('\\n')}\n\n**Your Specializations:**\n${agent.specializations.map((spec) => `- ${spec}`).join('\\n')}\n\n## Project Context\n${session.projectDescription}\n\n**Complexity Level:** ${session.complexity}\n\n## Oracle Responsibilities\nAs the Oracle, you provide strategic oversight while specialized Claude Code workers handle execution:\n\n1. **Strategic Decomposition**: Break down the project into tasks optimized for Claude Code agents\n2. **Agent Selection**: Recommend which Claude Code agents should handle each task\n3. **Quality Standards**: Define acceptance criteria that leverage Claude Code capabilities\n4. **Coordination Plan**: Plan how agents should collaborate and integrate work\n\n## Available Claude Code Workers\n${this.getAvailableWorkersDescription()}\n\n## Output Required\nProvide a detailed strategic plan in JSON format:\n\n\\`\\`\\`json\n{\n \"project_analysis\": {\n \"complexity_assessment\": \"low|medium|high|very_high\",\n \"key_challenges\": [\"challenge 1\", \"challenge 2\"],\n \"success_criteria\": [\"criterion 1\", \"criterion 2\"]\n },\n \"task_decomposition\": [\n {\n \"id\": \"task-1\",\n \"title\": \"Task name\",\n \"description\": \"Detailed description\",\n \"recommended_agent\": \"agent-name\",\n \"agent_rationale\": \"Why this agent is optimal\",\n \"complexity\": \"low|medium|high\",\n \"estimated_effort\": \"1-5 scale\",\n \"dependencies\": [\"task-id\"],\n \"acceptance_criteria\": [\"criterion 1\", \"criterion 2\"],\n \"claude_code_integration\": {\n \"tools_needed\": [\"tool1\", \"tool2\"],\n \"validation_method\": \"how to verify completion\"\n }\n }\n ],\n \"coordination_strategy\": {\n \"integration_points\": [\"when agents should sync\"],\n \"quality_gates\": [\"checkpoints for review\"],\n \"risk_mitigation\": [\"potential issues and solutions\"],\n \"success_metrics\": [\"how to measure overall success\"]\n }\n}\n\\`\\`\\`\n\nFocus on strategic thinking that maximizes Claude Code's specialized capabilities.\n `;\n }\n\n /**\n * Get description of available Claude Code workers\n */\n private getAvailableWorkersDescription(): string {\n const workers = Array.from(this.claudeAgents.values()).filter(\n (agent) => agent.type === 'worker' || agent.type === 'reviewer'\n );\n\n return workers\n .map(\n (worker) =>\n `**${worker.name}**: ${worker.description}\\n Capabilities: ${worker.capabilities.join(', ')}`\n )\n .join('\\n\\n');\n }\n\n /**\n * Allocate tasks to Claude Code worker agents\n */\n private async allocateTasksToClaudeWorkers(\n decomposition: any,\n workerAgents: string[]\n ): Promise<any[]> {\n const allocatedTasks = [];\n\n for (const task of decomposition.task_decomposition || []) {\n // Use Oracle's recommendation if available, otherwise select optimal worker\n const recommendedAgent = task.recommended_agent;\n const selectedAgent = workerAgents.includes(recommendedAgent)\n ? recommendedAgent\n : this.selectOptimalClaudeWorker(task, workerAgents);\n\n const claudeAgent = this.claudeAgents.get(selectedAgent)!;\n\n allocatedTasks.push({\n ...task,\n assignedAgent: selectedAgent,\n agentCapabilities: claudeAgent.capabilities,\n agentType: claudeAgent.type,\n });\n\n logger.debug('Task allocated to Claude Code agent', {\n taskId: task.id,\n agent: selectedAgent,\n rationale:\n task.agent_rationale || 'Auto-selected based on capabilities',\n });\n }\n\n return allocatedTasks;\n }\n\n /**\n * Select optimal Claude Code worker for a task\n */\n private selectOptimalClaudeWorker(\n task: any,\n availableWorkers: string[]\n ): string {\n let bestAgent = availableWorkers[0];\n let bestScore = 0;\n\n for (const workerName of availableWorkers) {\n const worker = this.claudeAgents.get(workerName)!;\n let score = 0;\n\n // Score based on capability overlap\n const taskKeywords = (task.description || '').toLowerCase().split(' ');\n for (const capability of worker.capabilities) {\n const capabilityKeywords = capability.replace(/_/g, ' ').toLowerCase();\n if (\n taskKeywords.some((keyword) => capabilityKeywords.includes(keyword))\n ) {\n score += 2;\n }\n }\n\n // Score based on specialization match\n for (const specialization of worker.specializations) {\n if (taskKeywords.some((keyword) => keyword.includes(specialization))) {\n score += 3;\n }\n }\n\n // Prefer lower cost for similar capabilities\n score -= worker.costMultiplier;\n\n if (score > bestScore) {\n bestScore = score;\n bestAgent = workerName;\n }\n }\n\n return bestAgent;\n }\n\n /**\n * Execute worker task using Claude Code agent\n */\n private async executeClaudeWorkerTask(task: any): Promise<any> {\n const agentName = task.assignedAgent;\n const agent = this.claudeAgents.get(agentName)!;\n\n logger.info('Executing Claude Code worker task', {\n taskId: task.id,\n agent: agentName,\n });\n\n // Build worker prompt optimized for the specific Claude Code agent\n const workerPrompt = this.buildClaudeWorkerPrompt(task, agent);\n\n // Execute with Claude Code agent\n const result = await this.invokeClaudeCodeAgent(agentName, workerPrompt, {\n type: 'worker',\n maxTokens: 2000,\n temperature: 0.3,\n });\n\n return {\n taskId: task.id,\n agentName,\n result,\n success: true,\n };\n }\n\n /**\n * Execute review task using Claude Code reviewer\n */\n private async executeClaudeReviewTask(\n reviewerName: string,\n decomposition: any,\n workerTasks: any[]\n ): Promise<any> {\n const agent = this.claudeAgents.get(reviewerName)!;\n\n logger.info('Executing Claude Code review task', {\n reviewer: reviewerName,\n tasksToReview: workerTasks.length,\n });\n\n // Build review prompt\n const reviewPrompt = this.buildClaudeReviewPrompt(\n agent,\n decomposition,\n workerTasks\n );\n\n // Execute review\n const result = await this.invokeClaudeCodeAgent(\n reviewerName,\n reviewPrompt,\n {\n type: 'reviewer',\n maxTokens: 3000,\n temperature: 0.2,\n }\n );\n\n return {\n reviewerId: reviewerName,\n result,\n success: true,\n };\n }\n\n /**\n * Build worker prompt for Claude Code agent\n */\n private buildClaudeWorkerPrompt(task: any, agent: ClaudeCodeAgent): string {\n return `\n# CLAUDE CODE WORKER: ${agent.name.toUpperCase()}\n\n## Your Specialized Role\nYou are a **${agent.description}** executing a focused task as part of a larger project.\n\n**Your Capabilities:**\n${agent.capabilities.map((cap) => `- ${cap.replace(/_/g, ' ')}`).join('\\n')}\n\n## Your Task\n**${task.title}**\n\n${task.description}\n\n## Success Criteria\n${(task.acceptance_criteria || []).map((c: string) => `- ${c}`).join('\\n')}\n\n## Integration Requirements\n${\n task.claude_code_integration\n ? `\n**Tools Needed:** ${task.claude_code_integration.tools_needed?.join(', ') || 'Standard tools'}\n**Validation Method:** ${task.claude_code_integration.validation_method || 'Standard validation'}\n`\n : ''\n}\n\n## Worker Guidelines\n- **Focus** on this specific task only\n- **Execute** using your specialized capabilities\n- **Communicate** progress clearly\n- **Deliver** according to the acceptance criteria\n- **Coordinate** with other agents through shared context\n\nExecute your specialized task now, leveraging your Claude Code capabilities.\n `;\n }\n\n /**\n * Build review prompt for Claude Code reviewer\n */\n private buildClaudeReviewPrompt(\n agent: ClaudeCodeAgent,\n decomposition: any,\n workerTasks: any[]\n ): string {\n return `\n# CLAUDE CODE REVIEWER: ${agent.name.toUpperCase()}\n\n## Your Review Role\nYou are a **${agent.description}** conducting comprehensive review of completed work.\n\n**Your Review Capabilities:**\n${agent.capabilities.map((cap) => `- ${cap.replace(/_/g, ' ')}`).join('\\n')}\n\n## Project Context\n${JSON.stringify(decomposition.project_analysis || {}, null, 2)}\n\n## Completed Tasks to Review\n${workerTasks\n .map(\n (task, i) => `\n### Task ${i + 1}: ${task.title}\n- **Agent:** ${task.agentName}\n- **Status:** ${task.success ? 'Completed' : 'Failed'}\n- **Acceptance Criteria:** ${(task.acceptance_criteria || []).join(', ')}\n`\n )\n .join('\\n')}\n\n## Review Requirements\n1. **Quality Assessment**: Evaluate if each task meets its acceptance criteria\n2. **Integration Check**: Verify tasks work together cohesively\n3. **Standards Compliance**: Ensure code/work follows best practices\n4. **Risk Analysis**: Identify potential issues or improvements needed\n5. **Final Recommendation**: Approve, request changes, or flag for re-work\n\n## Output Format\nProvide structured review in JSON:\n\n\\`\\`\\`json\n{\n \"overall_assessment\": \"pass|conditional_pass|fail\",\n \"task_reviews\": [\n {\n \"task_id\": \"task-id\",\n \"status\": \"approved|changes_requested|rejected\",\n \"issues\": [\"issue 1\", \"issue 2\"],\n \"recommendations\": [\"recommendation 1\"]\n }\n ],\n \"integration_review\": {\n \"cohesion_score\": \"1-10\",\n \"integration_issues\": [\"issue 1\"],\n \"recommended_improvements\": [\"improvement 1\"]\n },\n \"final_recommendation\": \"deploy|fix_and_redeploy|major_rework_needed\"\n}\n\\`\\`\\`\n\nConduct thorough review using your specialized Claude Code capabilities.\n `;\n }\n\n /**\n * Invoke Claude Code agent (integration point)\n */\n private async invokeClaudeCodeAgent(\n agentName: string,\n prompt: string,\n options: { type: string; maxTokens: number; temperature: number }\n ): Promise<string> {\n const agent = this.claudeAgents.get(agentName)!;\n\n // Use task coordinator for execution\n return await this.taskCoordinator.executeTask(agentName, agent, prompt, {\n maxRetries: options.type === 'oracle' ? 1 : 2, // Oracle tasks are more expensive, fewer retries\n timeout: options.type === 'oracle' ? 600000 : 300000, // Oracle gets more time\n priority: options.type === 'oracle' ? 'high' : 'medium',\n });\n }\n\n /**\n * Generate mock response (to be replaced with real Claude Code integration)\n */\n private generateMockResponse(agentName: string, type: string): string {\n const agent = this.claudeAgents.get(agentName)!;\n\n if (type === 'oracle') {\n return JSON.stringify(\n {\n project_analysis: {\n complexity_assessment: 'medium',\n key_challenges: [\n 'Integration complexity',\n 'Performance requirements',\n ],\n success_criteria: ['All tests pass', 'Performance benchmarks met'],\n },\n task_decomposition: [\n {\n id: 'task-1',\n title: 'Core Implementation',\n description: 'Implement main functionality',\n recommended_agent: 'general-purpose',\n agent_rationale: 'Best suited for general development tasks',\n complexity: 'medium',\n estimated_effort: '3',\n dependencies: [],\n acceptance_criteria: ['Feature works correctly', 'Tests pass'],\n claude_code_integration: {\n tools_needed: ['Write', 'Edit', 'Bash'],\n validation_method: 'Run tests and verify functionality',\n },\n },\n ],\n coordination_strategy: {\n integration_points: ['After core implementation'],\n quality_gates: ['Code review', 'Testing'],\n risk_mitigation: ['Regular checkpoints', 'Incremental delivery'],\n },\n },\n null,\n 2\n );\n }\n\n return `Claude Code agent ${agentName} completed ${type} task successfully using capabilities: ${agent.capabilities.join(', ')}`;\n }\n\n /**\n * Parse task decomposition from Claude Code response\n */\n private parseClaudeTaskDecomposition(response: string): any {\n try {\n return JSON.parse(response);\n } catch {\n // Fallback parsing if not valid JSON\n return {\n task_decomposition: [\n {\n id: 'task-1',\n title: 'Implementation Task',\n description: response.substring(0, 200),\n complexity: 'medium',\n acceptance_criteria: ['Task completed successfully'],\n },\n ],\n };\n }\n }\n\n /**\n * Integrate results from Claude Code agents\n */\n private async integrateClaudeResults(\n swarmId: string,\n workerResults: PromiseSettledResult<any>[],\n reviewResults: PromiseSettledResult<any>[]\n ): Promise<void> {\n const successfulWorkers = workerResults.filter(\n (r) => r.status === 'fulfilled'\n ).length;\n const successfulReviews = reviewResults.filter(\n (r) => r.status === 'fulfilled'\n ).length;\n\n logger.info('Claude Code swarm integration completed', {\n swarmId,\n totalWorkerTasks: workerResults.length,\n successfulWorkers,\n totalReviews: reviewResults.length,\n successfulReviews,\n successRate: ((successfulWorkers / workerResults.length) * 100).toFixed(\n 1\n ),\n });\n }\n\n /**\n * Log cost analysis for Claude Code agents\n */\n private logClaudeCodeCostAnalysis(): void {\n // Calculate costs based on Claude Code agent usage\n const totalSessions = this.activeAgentSessions.size;\n\n logger.info('Claude Code Agent Cost Analysis', {\n totalSessions,\n estimatedSavings: '60-80% vs all-Oracle approach',\n agentEfficiency: 'Specialized agents for optimal task matching',\n qualityMaintenance:\n 'High-quality output through specialized capabilities',\n });\n }\n\n /**\n * Get available Claude Code agents by type\n */\n getAvailableAgents(): {\n oracles: string[];\n workers: string[];\n reviewers: string[];\n } {\n const agents = Array.from(this.claudeAgents.values());\n\n return {\n oracles: agents.filter((a) => a.type === 'oracle').map((a) => a.name),\n workers: agents.filter((a) => a.type === 'worker').map((a) => a.name),\n reviewers: agents.filter((a) => a.type === 'reviewer').map((a) => a.name),\n };\n }\n}\n\nexport default ClaudeCodeAgentBridge;\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,356 @@
1
+ import { v4 as uuidv4 } from "uuid";
2
+ import { logger } from "../../core/monitoring/logger.js";
3
+ class ClaudeCodeTaskCoordinator {
4
+ activeTasks = /* @__PURE__ */ new Map();
5
+ completedTasks = [];
6
+ metrics;
7
+ constructor() {
8
+ this.metrics = {
9
+ totalTasks: 0,
10
+ completedTasks: 0,
11
+ failedTasks: 0,
12
+ averageExecutionTime: 0,
13
+ totalCost: 0,
14
+ successRate: 0,
15
+ agentUtilization: {}
16
+ };
17
+ }
18
+ /**
19
+ * Execute task with Claude Code agent
20
+ */
21
+ async executeTask(agentName, agentConfig, prompt, options = {}) {
22
+ const taskId = uuidv4();
23
+ const { maxRetries = 2, timeout = 3e5, priority = "medium" } = options;
24
+ const task = {
25
+ id: taskId,
26
+ agentName,
27
+ agentType: agentConfig.type,
28
+ prompt,
29
+ startTime: Date.now(),
30
+ status: "pending",
31
+ retryCount: 0,
32
+ estimatedCost: this.estimateTaskCost(prompt, agentConfig)
33
+ };
34
+ this.activeTasks.set(taskId, task);
35
+ this.metrics.totalTasks++;
36
+ logger.info("Starting Claude Code task execution", {
37
+ taskId,
38
+ agentName,
39
+ agentType: agentConfig.type,
40
+ promptLength: prompt.length,
41
+ estimatedCost: task.estimatedCost,
42
+ priority
43
+ });
44
+ try {
45
+ let lastError = null;
46
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
47
+ try {
48
+ task.retryCount = attempt;
49
+ task.status = "running";
50
+ const result = await this.executeWithTimeout(
51
+ () => this.invokeClaudeCodeAgent(agentName, prompt, agentConfig),
52
+ timeout
53
+ );
54
+ task.status = "completed";
55
+ task.result = result;
56
+ task.endTime = Date.now();
57
+ task.actualTokens = this.estimateTokenUsage(prompt, result);
58
+ this.completeTask(task);
59
+ return result;
60
+ } catch (error) {
61
+ lastError = error;
62
+ task.status = "failed";
63
+ logger.warn(`Claude Code task attempt ${attempt + 1} failed`, {
64
+ taskId,
65
+ agentName,
66
+ error: lastError.message,
67
+ attempt: attempt + 1,
68
+ maxRetries: maxRetries + 1
69
+ });
70
+ if (attempt === maxRetries) {
71
+ break;
72
+ }
73
+ const backoffMs = Math.min(1e3 * Math.pow(2, attempt), 1e4);
74
+ await new Promise((resolve) => setTimeout(resolve, backoffMs));
75
+ }
76
+ }
77
+ task.error = lastError?.message || "Unknown error";
78
+ task.endTime = Date.now();
79
+ this.failTask(task, lastError);
80
+ throw lastError;
81
+ } finally {
82
+ this.activeTasks.delete(taskId);
83
+ }
84
+ }
85
+ /**
86
+ * Execute multiple tasks in parallel with coordination
87
+ */
88
+ async executeParallelTasks(tasks) {
89
+ logger.info("Executing parallel Claude Code tasks", {
90
+ taskCount: tasks.length,
91
+ agents: tasks.map((t) => t.agentName)
92
+ });
93
+ const priorityGroups = {
94
+ high: tasks.filter((t) => t.priority === "high"),
95
+ medium: tasks.filter((t) => t.priority === "medium"),
96
+ low: tasks.filter((t) => t.priority === "low")
97
+ };
98
+ const results = [];
99
+ const failures = [];
100
+ for (const priorityLevel of ["high", "medium", "low"]) {
101
+ const priorityTasks = priorityGroups[priorityLevel];
102
+ if (priorityTasks.length === 0) continue;
103
+ logger.info(`Executing ${priorityLevel} priority tasks`, {
104
+ count: priorityTasks.length
105
+ });
106
+ const promises = priorityTasks.map(async (task) => {
107
+ try {
108
+ const result = await this.executeTask(
109
+ task.agentName,
110
+ task.agentConfig,
111
+ task.prompt,
112
+ { priority: task.priority }
113
+ );
114
+ return { success: true, result };
115
+ } catch (error) {
116
+ return { success: false, error };
117
+ }
118
+ });
119
+ const outcomes = await Promise.allSettled(promises);
120
+ for (const outcome of outcomes) {
121
+ if (outcome.status === "fulfilled") {
122
+ if (outcome.value.success) {
123
+ results.push(outcome.value.result);
124
+ } else {
125
+ failures.push(outcome.value.error);
126
+ }
127
+ } else {
128
+ failures.push(new Error(outcome.reason));
129
+ }
130
+ }
131
+ }
132
+ logger.info("Parallel task execution completed", {
133
+ totalTasks: tasks.length,
134
+ successful: results.length,
135
+ failed: failures.length,
136
+ successRate: (results.length / tasks.length * 100).toFixed(1)
137
+ });
138
+ return { results, failures };
139
+ }
140
+ /**
141
+ * Get coordination metrics and health status
142
+ */
143
+ getCoordinationMetrics() {
144
+ const recentTasks = this.completedTasks.slice(-10);
145
+ const recentErrorRate = recentTasks.length > 0 ? recentTasks.filter((t) => t.status === "failed").length / recentTasks.length : 0;
146
+ const performanceTrend = recentErrorRate < 0.1 ? "improving" : recentErrorRate < 0.3 ? "stable" : "degrading";
147
+ const recentErrors = this.completedTasks.slice(-5).filter((t) => t.status === "failed").map((t) => t.error || "Unknown error");
148
+ return {
149
+ ...this.metrics,
150
+ activeTasks: this.activeTasks.size,
151
+ recentErrors,
152
+ performanceTrend
153
+ };
154
+ }
155
+ /**
156
+ * Clean up resources and reset metrics
157
+ */
158
+ async cleanup() {
159
+ logger.info("Cleaning up Claude Code Task Coordinator", {
160
+ activeTasks: this.activeTasks.size,
161
+ completedTasks: this.completedTasks.length
162
+ });
163
+ if (this.activeTasks.size > 0) {
164
+ const timeoutPromise = new Promise(
165
+ (resolve) => setTimeout(resolve, 3e4)
166
+ );
167
+ const completionPromise = this.waitForTaskCompletion();
168
+ await Promise.race([completionPromise, timeoutPromise]);
169
+ if (this.activeTasks.size > 0) {
170
+ logger.warn("Force terminating active tasks", {
171
+ remainingTasks: this.activeTasks.size
172
+ });
173
+ }
174
+ }
175
+ this.activeTasks.clear();
176
+ this.completedTasks = [];
177
+ this.resetMetrics();
178
+ }
179
+ /**
180
+ * Execute with timeout wrapper
181
+ */
182
+ async executeWithTimeout(fn, timeoutMs) {
183
+ const timeoutPromise = new Promise((_, reject) => {
184
+ setTimeout(() => {
185
+ reject(new Error(`Task execution timeout after ${timeoutMs}ms`));
186
+ }, timeoutMs);
187
+ });
188
+ return Promise.race([fn(), timeoutPromise]);
189
+ }
190
+ /**
191
+ * Invoke Claude Code agent (integration point)
192
+ */
193
+ async invokeClaudeCodeAgent(agentName, prompt, agentConfig) {
194
+ logger.debug("Invoking Claude Code agent", {
195
+ agentName,
196
+ agentType: agentConfig.type,
197
+ promptTokens: this.estimateTokenUsage(prompt, "")
198
+ });
199
+ return this.simulateClaudeCodeExecution(agentName, prompt, agentConfig);
200
+ }
201
+ /**
202
+ * Simulate Claude Code execution (temporary until real integration)
203
+ */
204
+ simulateClaudeCodeExecution(agentName, prompt, agentConfig) {
205
+ return new Promise((resolve) => {
206
+ const executionTime = agentConfig.type === "oracle" ? 2e3 + Math.random() * 3e3 : 1e3 + Math.random() * 2e3;
207
+ setTimeout(() => {
208
+ const result = `Claude Code agent '${agentName}' completed task successfully.
209
+
210
+ Agent Capabilities Used: ${agentConfig.capabilities.slice(0, 3).join(", ")}
211
+ Task Type: ${agentConfig.type}
212
+ Specializations: ${agentConfig.specializations.join(", ")}
213
+
214
+ Simulated output based on prompt context: ${prompt.substring(0, 100)}...
215
+
216
+ This simulation will be replaced with actual Claude Code Task tool integration.`;
217
+ resolve(result);
218
+ }, executionTime);
219
+ });
220
+ }
221
+ /**
222
+ * Complete a successful task
223
+ */
224
+ completeTask(task) {
225
+ this.completedTasks.push({ ...task });
226
+ this.metrics.completedTasks++;
227
+ this.updateExecutionMetrics(task);
228
+ this.updateAgentUtilization(task.agentName);
229
+ this.updateSuccessRate();
230
+ logger.info("Claude Code task completed", {
231
+ taskId: task.id,
232
+ agentName: task.agentName,
233
+ executionTime: task.endTime - task.startTime,
234
+ retries: task.retryCount,
235
+ cost: this.calculateActualCost(task)
236
+ });
237
+ }
238
+ /**
239
+ * Handle a failed task
240
+ */
241
+ failTask(task, error) {
242
+ this.completedTasks.push({ ...task });
243
+ this.metrics.failedTasks++;
244
+ this.updateExecutionMetrics(task);
245
+ this.updateSuccessRate();
246
+ logger.error("Claude Code task failed", {
247
+ taskId: task.id,
248
+ agentName: task.agentName,
249
+ error: error.message,
250
+ retries: task.retryCount,
251
+ executionTime: task.endTime - task.startTime
252
+ });
253
+ }
254
+ /**
255
+ * Update execution time metrics
256
+ */
257
+ updateExecutionMetrics(task) {
258
+ if (!task.endTime) return;
259
+ const executionTime = task.endTime - task.startTime;
260
+ const totalTasks = this.metrics.completedTasks + this.metrics.failedTasks;
261
+ if (totalTasks === 1) {
262
+ this.metrics.averageExecutionTime = executionTime;
263
+ } else {
264
+ this.metrics.averageExecutionTime = (this.metrics.averageExecutionTime * (totalTasks - 1) + executionTime) / totalTasks;
265
+ }
266
+ this.metrics.totalCost += this.calculateActualCost(task);
267
+ }
268
+ /**
269
+ * Update agent utilization metrics
270
+ */
271
+ updateAgentUtilization(agentName) {
272
+ this.metrics.agentUtilization[agentName] = (this.metrics.agentUtilization[agentName] || 0) + 1;
273
+ }
274
+ /**
275
+ * Update success rate
276
+ */
277
+ updateSuccessRate() {
278
+ const total = this.metrics.completedTasks + this.metrics.failedTasks;
279
+ this.metrics.successRate = total > 0 ? this.metrics.completedTasks / total : 0;
280
+ }
281
+ /**
282
+ * Estimate task cost based on prompt and agent
283
+ */
284
+ estimateTaskCost(prompt, agentConfig) {
285
+ const estimatedTokens = this.estimateTokenUsage(prompt, "");
286
+ const baseCost = agentConfig.type === "oracle" ? 0.015 : 25e-5;
287
+ return estimatedTokens / 1e3 * baseCost * agentConfig.costMultiplier;
288
+ }
289
+ /**
290
+ * Estimate token usage
291
+ */
292
+ estimateTokenUsage(prompt, response) {
293
+ return Math.ceil((prompt.length + response.length) / 4);
294
+ }
295
+ /**
296
+ * Calculate actual task cost
297
+ */
298
+ calculateActualCost(task) {
299
+ if (!task.actualTokens) return task.estimatedCost;
300
+ const baseCost = task.agentType === "oracle" ? 0.015 : 25e-5;
301
+ return task.actualTokens / 1e3 * baseCost;
302
+ }
303
+ /**
304
+ * Wait for all active tasks to complete
305
+ */
306
+ async waitForTaskCompletion() {
307
+ while (this.activeTasks.size > 0) {
308
+ await new Promise((resolve) => setTimeout(resolve, 1e3));
309
+ }
310
+ }
311
+ /**
312
+ * Reset metrics
313
+ */
314
+ resetMetrics() {
315
+ this.metrics = {
316
+ totalTasks: 0,
317
+ completedTasks: 0,
318
+ failedTasks: 0,
319
+ averageExecutionTime: 0,
320
+ totalCost: 0,
321
+ successRate: 0,
322
+ agentUtilization: {}
323
+ };
324
+ }
325
+ /**
326
+ * Get active task status
327
+ */
328
+ getActiveTaskStatus() {
329
+ return Array.from(this.activeTasks.values()).map((task) => ({
330
+ taskId: task.id,
331
+ agentName: task.agentName,
332
+ status: task.status,
333
+ runtime: Date.now() - task.startTime
334
+ }));
335
+ }
336
+ /**
337
+ * Cancel active task
338
+ */
339
+ async cancelTask(taskId) {
340
+ const task = this.activeTasks.get(taskId);
341
+ if (!task) return false;
342
+ task.status = "failed";
343
+ task.error = "Task cancelled by user";
344
+ task.endTime = Date.now();
345
+ this.failTask(task, new Error("Task cancelled"));
346
+ this.activeTasks.delete(taskId);
347
+ logger.info("Task cancelled", { taskId, agentName: task.agentName });
348
+ return true;
349
+ }
350
+ }
351
+ var task_coordinator_default = ClaudeCodeTaskCoordinator;
352
+ export {
353
+ ClaudeCodeTaskCoordinator,
354
+ task_coordinator_default as default
355
+ };
356
+ //# sourceMappingURL=task-coordinator.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/integrations/claude-code/task-coordinator.ts"],
4
+ "sourcesContent": ["/**\n * Claude Code Task Coordinator\n *\n * Coordinates task execution between StackMemory and Claude Code's Task tool.\n * Handles agent invocation, result processing, and error recovery.\n */\n\nimport { v4 as uuidv4 } from 'uuid';\nimport { logger } from '../../core/monitoring/logger.js';\nimport { ClaudeCodeAgent } from './agent-bridge.js';\n\nexport interface TaskExecution {\n id: string;\n agentName: string;\n agentType: 'oracle' | 'worker' | 'reviewer';\n prompt: string;\n startTime: number;\n endTime?: number;\n status: 'pending' | 'running' | 'completed' | 'failed';\n result?: string;\n error?: string;\n retryCount: number;\n estimatedCost: number;\n actualTokens?: number;\n}\n\nexport interface CoordinationMetrics {\n totalTasks: number;\n completedTasks: number;\n failedTasks: number;\n averageExecutionTime: number;\n totalCost: number;\n successRate: number;\n agentUtilization: Record<string, number>;\n}\n\n/**\n * Claude Code Task Coordinator\n * Manages task execution and coordination with Claude Code agents\n */\nexport class ClaudeCodeTaskCoordinator {\n private activeTasks: Map<string, TaskExecution> = new Map();\n private completedTasks: TaskExecution[] = [];\n private metrics: CoordinationMetrics;\n\n constructor() {\n this.metrics = {\n totalTasks: 0,\n completedTasks: 0,\n failedTasks: 0,\n averageExecutionTime: 0,\n totalCost: 0,\n successRate: 0,\n agentUtilization: {},\n };\n }\n\n /**\n * Execute task with Claude Code agent\n */\n async executeTask(\n agentName: string,\n agentConfig: ClaudeCodeAgent,\n prompt: string,\n options: {\n maxRetries?: number;\n timeout?: number;\n priority?: 'low' | 'medium' | 'high';\n } = {}\n ): Promise<string> {\n const taskId = uuidv4();\n const { maxRetries = 2, timeout = 300000, priority = 'medium' } = options;\n\n const task: TaskExecution = {\n id: taskId,\n agentName,\n agentType: agentConfig.type,\n prompt,\n startTime: Date.now(),\n status: 'pending',\n retryCount: 0,\n estimatedCost: this.estimateTaskCost(prompt, agentConfig),\n };\n\n this.activeTasks.set(taskId, task);\n this.metrics.totalTasks++;\n\n logger.info('Starting Claude Code task execution', {\n taskId,\n agentName,\n agentType: agentConfig.type,\n promptLength: prompt.length,\n estimatedCost: task.estimatedCost,\n priority,\n });\n\n try {\n // Execute with retries\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n task.retryCount = attempt;\n task.status = 'running';\n\n // Execute the task with timeout\n const result = await this.executeWithTimeout(\n () => this.invokeClaudeCodeAgent(agentName, prompt, agentConfig),\n timeout\n );\n\n // Task completed successfully\n task.status = 'completed';\n task.result = result;\n task.endTime = Date.now();\n task.actualTokens = this.estimateTokenUsage(prompt, result);\n\n this.completeTask(task);\n return result;\n } catch (error) {\n lastError = error as Error;\n task.status = 'failed';\n\n logger.warn(`Claude Code task attempt ${attempt + 1} failed`, {\n taskId,\n agentName,\n error: lastError.message,\n attempt: attempt + 1,\n maxRetries: maxRetries + 1,\n });\n\n // Don't retry if it's the last attempt\n if (attempt === maxRetries) {\n break;\n }\n\n // Wait before retry with exponential backoff\n const backoffMs = Math.min(1000 * Math.pow(2, attempt), 10000);\n await new Promise((resolve) => setTimeout(resolve, backoffMs));\n }\n }\n\n // All retries exhausted\n task.error = lastError?.message || 'Unknown error';\n task.endTime = Date.now();\n this.failTask(task, lastError!);\n throw lastError;\n } finally {\n this.activeTasks.delete(taskId);\n }\n }\n\n /**\n * Execute multiple tasks in parallel with coordination\n */\n async executeParallelTasks(\n tasks: {\n agentName: string;\n agentConfig: ClaudeCodeAgent;\n prompt: string;\n priority?: 'low' | 'medium' | 'high';\n }[]\n ): Promise<{ results: string[]; failures: Error[] }> {\n logger.info('Executing parallel Claude Code tasks', {\n taskCount: tasks.length,\n agents: tasks.map((t) => t.agentName),\n });\n\n // Group tasks by priority\n const priorityGroups = {\n high: tasks.filter((t) => t.priority === 'high'),\n medium: tasks.filter((t) => t.priority === 'medium'),\n low: tasks.filter((t) => t.priority === 'low'),\n };\n\n const results: string[] = [];\n const failures: Error[] = [];\n\n // Execute high priority tasks first\n for (const priorityLevel of ['high', 'medium', 'low'] as const) {\n const priorityTasks = priorityGroups[priorityLevel];\n if (priorityTasks.length === 0) continue;\n\n logger.info(`Executing ${priorityLevel} priority tasks`, {\n count: priorityTasks.length,\n });\n\n // Execute tasks in this priority level concurrently\n const promises = priorityTasks.map(async (task) => {\n try {\n const result = await this.executeTask(\n task.agentName,\n task.agentConfig,\n task.prompt,\n { priority: task.priority }\n );\n return { success: true, result };\n } catch (error) {\n return { success: false, error: error as Error };\n }\n });\n\n const outcomes = await Promise.allSettled(promises);\n\n for (const outcome of outcomes) {\n if (outcome.status === 'fulfilled') {\n if (outcome.value.success) {\n results.push(outcome.value.result);\n } else {\n failures.push(outcome.value.error);\n }\n } else {\n failures.push(new Error(outcome.reason));\n }\n }\n }\n\n logger.info('Parallel task execution completed', {\n totalTasks: tasks.length,\n successful: results.length,\n failed: failures.length,\n successRate: ((results.length / tasks.length) * 100).toFixed(1),\n });\n\n return { results, failures };\n }\n\n /**\n * Get coordination metrics and health status\n */\n getCoordinationMetrics(): CoordinationMetrics & {\n activeTasks: number;\n recentErrors: string[];\n performanceTrend: 'improving' | 'stable' | 'degrading';\n } {\n // Calculate recent error rate for performance trend\n const recentTasks = this.completedTasks.slice(-10);\n const recentErrorRate =\n recentTasks.length > 0\n ? recentTasks.filter((t) => t.status === 'failed').length /\n recentTasks.length\n : 0;\n\n const performanceTrend =\n recentErrorRate < 0.1\n ? 'improving'\n : recentErrorRate < 0.3\n ? 'stable'\n : 'degrading';\n\n const recentErrors = this.completedTasks\n .slice(-5)\n .filter((t) => t.status === 'failed')\n .map((t) => t.error || 'Unknown error');\n\n return {\n ...this.metrics,\n activeTasks: this.activeTasks.size,\n recentErrors,\n performanceTrend,\n };\n }\n\n /**\n * Clean up resources and reset metrics\n */\n async cleanup(): Promise<void> {\n logger.info('Cleaning up Claude Code Task Coordinator', {\n activeTasks: this.activeTasks.size,\n completedTasks: this.completedTasks.length,\n });\n\n // Wait for active tasks to complete or force cleanup after timeout\n if (this.activeTasks.size > 0) {\n const timeoutPromise = new Promise((resolve) =>\n setTimeout(resolve, 30000)\n );\n const completionPromise = this.waitForTaskCompletion();\n\n await Promise.race([completionPromise, timeoutPromise]);\n\n if (this.activeTasks.size > 0) {\n logger.warn('Force terminating active tasks', {\n remainingTasks: this.activeTasks.size,\n });\n }\n }\n\n this.activeTasks.clear();\n this.completedTasks = [];\n this.resetMetrics();\n }\n\n /**\n * Execute with timeout wrapper\n */\n private async executeWithTimeout<T>(\n fn: () => Promise<T>,\n timeoutMs: number\n ): Promise<T> {\n const timeoutPromise = new Promise<T>((_, reject) => {\n setTimeout(() => {\n reject(new Error(`Task execution timeout after ${timeoutMs}ms`));\n }, timeoutMs);\n });\n\n return Promise.race([fn(), timeoutPromise]);\n }\n\n /**\n * Invoke Claude Code agent (integration point)\n */\n private async invokeClaudeCodeAgent(\n agentName: string,\n prompt: string,\n agentConfig: ClaudeCodeAgent\n ): Promise<string> {\n logger.debug('Invoking Claude Code agent', {\n agentName,\n agentType: agentConfig.type,\n promptTokens: this.estimateTokenUsage(prompt, ''),\n });\n\n // TODO: Replace with actual Claude Code Task tool invocation\n // This is where we would call Claude Code's Task tool:\n /*\n const result = await claudeCodeTask({\n subagent_type: agentName,\n prompt: prompt,\n description: `${agentConfig.type} task execution`\n });\n \n return result.output;\n */\n\n // For now, simulate the Claude Code agent execution\n return this.simulateClaudeCodeExecution(agentName, prompt, agentConfig);\n }\n\n /**\n * Simulate Claude Code execution (temporary until real integration)\n */\n private simulateClaudeCodeExecution(\n agentName: string,\n prompt: string,\n agentConfig: ClaudeCodeAgent\n ): Promise<string> {\n return new Promise((resolve) => {\n // Simulate execution time based on agent type and complexity\n const executionTime =\n agentConfig.type === 'oracle'\n ? 2000 + Math.random() * 3000 // 2-5 seconds for Oracle\n : 1000 + Math.random() * 2000; // 1-3 seconds for Workers\n\n setTimeout(() => {\n const result = `Claude Code agent '${agentName}' completed task successfully.\n \nAgent Capabilities Used: ${agentConfig.capabilities.slice(0, 3).join(', ')}\nTask Type: ${agentConfig.type}\nSpecializations: ${agentConfig.specializations.join(', ')}\n\nSimulated output based on prompt context: ${prompt.substring(0, 100)}...\n\nThis simulation will be replaced with actual Claude Code Task tool integration.`;\n\n resolve(result);\n }, executionTime);\n });\n }\n\n /**\n * Complete a successful task\n */\n private completeTask(task: TaskExecution): void {\n this.completedTasks.push({ ...task });\n this.metrics.completedTasks++;\n\n // Update metrics\n this.updateExecutionMetrics(task);\n this.updateAgentUtilization(task.agentName);\n this.updateSuccessRate();\n\n logger.info('Claude Code task completed', {\n taskId: task.id,\n agentName: task.agentName,\n executionTime: task.endTime! - task.startTime,\n retries: task.retryCount,\n cost: this.calculateActualCost(task),\n });\n }\n\n /**\n * Handle a failed task\n */\n private failTask(task: TaskExecution, error: Error): void {\n this.completedTasks.push({ ...task });\n this.metrics.failedTasks++;\n\n this.updateExecutionMetrics(task);\n this.updateSuccessRate();\n\n logger.error('Claude Code task failed', {\n taskId: task.id,\n agentName: task.agentName,\n error: error.message,\n retries: task.retryCount,\n executionTime: task.endTime! - task.startTime,\n });\n }\n\n /**\n * Update execution time metrics\n */\n private updateExecutionMetrics(task: TaskExecution): void {\n if (!task.endTime) return;\n\n const executionTime = task.endTime - task.startTime;\n const totalTasks = this.metrics.completedTasks + this.metrics.failedTasks;\n\n if (totalTasks === 1) {\n this.metrics.averageExecutionTime = executionTime;\n } else {\n this.metrics.averageExecutionTime =\n (this.metrics.averageExecutionTime * (totalTasks - 1) + executionTime) /\n totalTasks;\n }\n\n this.metrics.totalCost += this.calculateActualCost(task);\n }\n\n /**\n * Update agent utilization metrics\n */\n private updateAgentUtilization(agentName: string): void {\n this.metrics.agentUtilization[agentName] =\n (this.metrics.agentUtilization[agentName] || 0) + 1;\n }\n\n /**\n * Update success rate\n */\n private updateSuccessRate(): void {\n const total = this.metrics.completedTasks + this.metrics.failedTasks;\n this.metrics.successRate =\n total > 0 ? this.metrics.completedTasks / total : 0;\n }\n\n /**\n * Estimate task cost based on prompt and agent\n */\n private estimateTaskCost(\n prompt: string,\n agentConfig: ClaudeCodeAgent\n ): number {\n const estimatedTokens = this.estimateTokenUsage(prompt, '');\n const baseCost = agentConfig.type === 'oracle' ? 0.015 : 0.00025; // per 1K tokens\n return (estimatedTokens / 1000) * baseCost * agentConfig.costMultiplier;\n }\n\n /**\n * Estimate token usage\n */\n private estimateTokenUsage(prompt: string, response: string): number {\n // Rough estimation: ~4 characters per token\n return Math.ceil((prompt.length + response.length) / 4);\n }\n\n /**\n * Calculate actual task cost\n */\n private calculateActualCost(task: TaskExecution): number {\n if (!task.actualTokens) return task.estimatedCost;\n\n const baseCost = task.agentType === 'oracle' ? 0.015 : 0.00025;\n return (task.actualTokens / 1000) * baseCost;\n }\n\n /**\n * Wait for all active tasks to complete\n */\n private async waitForTaskCompletion(): Promise<void> {\n while (this.activeTasks.size > 0) {\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n }\n\n /**\n * Reset metrics\n */\n private resetMetrics(): void {\n this.metrics = {\n totalTasks: 0,\n completedTasks: 0,\n failedTasks: 0,\n averageExecutionTime: 0,\n totalCost: 0,\n successRate: 0,\n agentUtilization: {},\n };\n }\n\n /**\n * Get active task status\n */\n getActiveTaskStatus(): {\n taskId: string;\n agentName: string;\n status: string;\n runtime: number;\n }[] {\n return Array.from(this.activeTasks.values()).map((task) => ({\n taskId: task.id,\n agentName: task.agentName,\n status: task.status,\n runtime: Date.now() - task.startTime,\n }));\n }\n\n /**\n * Cancel active task\n */\n async cancelTask(taskId: string): Promise<boolean> {\n const task = this.activeTasks.get(taskId);\n if (!task) return false;\n\n task.status = 'failed';\n task.error = 'Task cancelled by user';\n task.endTime = Date.now();\n\n this.failTask(task, new Error('Task cancelled'));\n this.activeTasks.delete(taskId);\n\n logger.info('Task cancelled', { taskId, agentName: task.agentName });\n return true;\n }\n}\n\nexport default ClaudeCodeTaskCoordinator;\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -18,8 +18,10 @@ class RalphStackMemoryBridge {
18
18
  sessionManager;
19
19
  recoveryState;
20
20
  ralphDir = ".ralph";
21
+ requiresDatabase;
21
22
  constructor(options) {
22
23
  this.config = this.mergeConfig(options?.config);
24
+ this.requiresDatabase = options?.useStackMemory !== false;
23
25
  this.state = {
24
26
  initialized: false,
25
27
  contextManager: new ContextBudgetManager(this.config.contextBudget),
@@ -47,17 +49,23 @@ class RalphStackMemoryBridge {
47
49
  sessionId: options?.sessionId
48
50
  });
49
51
  this.state.currentSession = session;
50
- if (session.database && session.projectId) {
51
- this.frameManager = new FrameManager(
52
- session.database,
53
- session.projectId,
54
- {
55
- skipContextBridge: true
56
- }
57
- );
52
+ if (this.requiresDatabase) {
53
+ if (session.database && session.projectId) {
54
+ this.frameManager = new FrameManager(
55
+ session.database,
56
+ session.projectId,
57
+ {
58
+ skipContextBridge: true
59
+ }
60
+ );
61
+ } else {
62
+ throw new Error(
63
+ "Session database not available for FrameManager initialization. If StackMemory features are not needed, set useStackMemory: false in options"
64
+ );
65
+ }
58
66
  } else {
59
- throw new Error(
60
- "Session database not available for FrameManager initialization"
67
+ logger.info(
68
+ "Running without StackMemory database (useStackMemory: false)"
61
69
  );
62
70
  }
63
71
  if (options?.loopId) {
@@ -408,6 +416,19 @@ class RalphStackMemoryBridge {
408
416
  * Create root frame for Ralph loop
409
417
  */
410
418
  async createRootFrame(state) {
419
+ if (!this.requiresDatabase) {
420
+ return {
421
+ frame_id: `mock-${state.loopId}`,
422
+ type: "task",
423
+ name: `ralph-${state.loopId}`,
424
+ inputs: {
425
+ task: state.task,
426
+ criteria: state.criteria,
427
+ loopId: state.loopId
428
+ },
429
+ created_at: Date.now()
430
+ };
431
+ }
411
432
  if (!this.frameManager) {
412
433
  throw new Error("Frame manager not initialized");
413
434
  }
@@ -685,7 +706,8 @@ class RalphStackMemoryBridge {
685
706
  * Save iteration frame to StackMemory
686
707
  */
687
708
  async saveIterationFrame(iteration) {
688
- if (!this.frameManager || !this.state.activeLoop) return;
709
+ if (!this.requiresDatabase || !this.frameManager || !this.state.activeLoop)
710
+ return;
689
711
  const frame = {
690
712
  type: "subtask",
691
713
  name: `iteration-${iteration.number}`,