@stackmemoryai/stackmemory 0.5.33 → 0.5.34

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 (107) hide show
  1. package/dist/agents/core/agent-task-manager.js.map +1 -1
  2. package/dist/cli/commands/clear.js +1 -1
  3. package/dist/cli/commands/clear.js.map +1 -1
  4. package/dist/cli/commands/context.js +1 -1
  5. package/dist/cli/commands/context.js.map +1 -1
  6. package/dist/cli/commands/dashboard.js.map +1 -1
  7. package/dist/cli/commands/discovery.js +1 -1
  8. package/dist/cli/commands/discovery.js.map +1 -1
  9. package/dist/cli/commands/handoff.js +1 -1
  10. package/dist/cli/commands/handoff.js.map +1 -1
  11. package/dist/cli/commands/monitor.js +1 -1
  12. package/dist/cli/commands/monitor.js.map +1 -1
  13. package/dist/cli/commands/quality.js +1 -1
  14. package/dist/cli/commands/quality.js.map +1 -1
  15. package/dist/cli/commands/skills.js +1 -1
  16. package/dist/cli/commands/skills.js.map +1 -1
  17. package/dist/cli/commands/workflow.js +1 -1
  18. package/dist/cli/commands/workflow.js.map +1 -1
  19. package/dist/cli/commands/worktree.js +1 -1
  20. package/dist/cli/commands/worktree.js.map +1 -1
  21. package/dist/cli/index.js +1 -1
  22. package/dist/cli/index.js.map +1 -1
  23. package/dist/core/context/auto-context.js.map +1 -1
  24. package/dist/core/context/compaction-handler.js.map +2 -2
  25. package/dist/core/context/context-bridge.js.map +2 -2
  26. package/dist/core/context/dual-stack-manager.js +1 -1
  27. package/dist/core/context/dual-stack-manager.js.map +1 -1
  28. package/dist/core/context/enhanced-rehydration.js.map +1 -1
  29. package/dist/core/context/frame-database.js +8 -0
  30. package/dist/core/context/frame-database.js.map +2 -2
  31. package/dist/core/context/frame-handoff-manager.js.map +1 -1
  32. package/dist/core/context/frame-lifecycle-hooks.js +119 -0
  33. package/dist/core/context/frame-lifecycle-hooks.js.map +7 -0
  34. package/dist/core/context/frame-stack.js +29 -0
  35. package/dist/core/context/frame-stack.js.map +2 -2
  36. package/dist/core/context/incremental-gc.js.map +2 -2
  37. package/dist/core/context/index.js +4 -22
  38. package/dist/core/context/index.js.map +2 -2
  39. package/dist/core/context/refactored-frame-manager.js +140 -34
  40. package/dist/core/context/refactored-frame-manager.js.map +3 -3
  41. package/dist/core/context/shared-context-layer.js.map +1 -1
  42. package/dist/core/context/stack-merge-resolver.js.map +1 -1
  43. package/dist/core/database/database-adapter.js.map +1 -1
  44. package/dist/core/database/paradedb-adapter.js.map +1 -1
  45. package/dist/core/database/query-router.js.map +1 -1
  46. package/dist/core/database/sqlite-adapter.js.map +1 -1
  47. package/dist/core/digest/frame-digest-integration.js.map +1 -1
  48. package/dist/core/digest/hybrid-digest-generator.js.map +1 -1
  49. package/dist/core/digest/types.js.map +1 -1
  50. package/dist/core/errors/index.js +249 -0
  51. package/dist/core/errors/index.js.map +2 -2
  52. package/dist/core/frame/workflow-templates.js.map +2 -2
  53. package/dist/core/merge/conflict-detector.js.map +1 -1
  54. package/dist/core/merge/resolution-engine.js.map +1 -1
  55. package/dist/core/merge/stack-diff.js.map +1 -1
  56. package/dist/core/models/model-router.js +10 -1
  57. package/dist/core/models/model-router.js.map +2 -2
  58. package/dist/core/monitoring/error-handler.js +37 -270
  59. package/dist/core/monitoring/error-handler.js.map +3 -3
  60. package/dist/core/monitoring/session-monitor.js.map +1 -1
  61. package/dist/core/performance/lazy-context-loader.js.map +1 -1
  62. package/dist/core/performance/optimized-frame-context.js.map +1 -1
  63. package/dist/core/retrieval/context-retriever.js.map +1 -1
  64. package/dist/core/retrieval/graph-retrieval.js.map +1 -1
  65. package/dist/core/retrieval/hierarchical-retrieval.js.map +1 -1
  66. package/dist/core/retrieval/llm-context-retrieval.js.map +1 -1
  67. package/dist/core/retrieval/retrieval-benchmarks.js.map +1 -1
  68. package/dist/core/retrieval/summary-generator.js.map +1 -1
  69. package/dist/core/retrieval/types.js.map +1 -1
  70. package/dist/core/storage/chromadb-adapter.js.map +1 -1
  71. package/dist/core/storage/infinite-storage.js.map +1 -1
  72. package/dist/core/storage/two-tier-storage.js.map +1 -1
  73. package/dist/features/tasks/task-aware-context.js.map +1 -1
  74. package/dist/features/web/server/index.js +1 -1
  75. package/dist/features/web/server/index.js.map +1 -1
  76. package/dist/hooks/schemas.js +50 -0
  77. package/dist/hooks/schemas.js.map +2 -2
  78. package/dist/hooks/sms-action-runner.js +4 -0
  79. package/dist/hooks/sms-action-runner.js.map +2 -2
  80. package/dist/hooks/whatsapp-commands.js +142 -2
  81. package/dist/hooks/whatsapp-commands.js.map +2 -2
  82. package/dist/hooks/whatsapp-sync.js +34 -0
  83. package/dist/hooks/whatsapp-sync.js.map +2 -2
  84. package/dist/index.js +1 -1
  85. package/dist/index.js.map +1 -1
  86. package/dist/integrations/mcp/handlers/context-handlers.js.map +1 -1
  87. package/dist/integrations/mcp/handlers/discovery-handlers.js.map +1 -1
  88. package/dist/integrations/mcp/server.js +1 -1
  89. package/dist/integrations/mcp/server.js.map +1 -1
  90. package/dist/integrations/ralph/bridge/ralph-stackmemory-bridge.js +1 -1
  91. package/dist/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +1 -1
  92. package/dist/integrations/ralph/context/stackmemory-context-loader.js +1 -1
  93. package/dist/integrations/ralph/context/stackmemory-context-loader.js.map +1 -1
  94. package/dist/integrations/ralph/learning/pattern-learner.js +1 -1
  95. package/dist/integrations/ralph/learning/pattern-learner.js.map +1 -1
  96. package/dist/integrations/ralph/orchestration/multi-loop-orchestrator.js +1 -1
  97. package/dist/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +1 -1
  98. package/dist/integrations/ralph/swarm/swarm-coordinator.js +1 -1
  99. package/dist/integrations/ralph/swarm/swarm-coordinator.js.map +1 -1
  100. package/dist/integrations/ralph/visualization/ralph-debugger.js +1 -1
  101. package/dist/integrations/ralph/visualization/ralph-debugger.js.map +1 -1
  102. package/dist/mcp/stackmemory-mcp-server.js +1 -1
  103. package/dist/mcp/stackmemory-mcp-server.js.map +1 -1
  104. package/dist/skills/claude-skills.js.map +1 -1
  105. package/dist/skills/recursive-agent-orchestrator.js.map +1 -1
  106. package/dist/skills/unified-rlm-orchestrator.js.map +1 -1
  107. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/integrations/ralph/orchestration/multi-loop-orchestrator.ts"],
4
- "sourcesContent": ["/**\n * Multi-Loop Orchestrator for Complex Tasks\n * Manages multiple Ralph loops working together on large, complex tasks\n */\n\nimport { v4 as uuidv4 } from 'uuid';\nimport { logger } from '../../../core/monitoring/logger.js';\nimport { FrameManager } from '../../../core/context/frame-manager.js';\nimport { sessionManager } from '../../../core/session/index.js';\nimport { RalphStackMemoryBridge } from '../bridge/ralph-stackmemory-bridge.js';\nimport {\n OrchestratedTask,\n TaskDependency,\n LoopCoordination,\n ParallelExecution,\n TaskBreakdown,\n ExecutionPlan,\n OrchestrationResult\n} from '../types.js';\n\nexport interface OrchestrationConfig {\n maxConcurrentLoops: number;\n dependencyResolutionTimeout: number;\n enableAdaptivePlanning: boolean;\n sharedContextEnabled: boolean;\n fallbackStrategy: 'sequential' | 'abort' | 'manual';\n}\n\nexport class MultiLoopOrchestrator {\n private frameManager?: FrameManager;\n private activeTasks: Map<string, OrchestratedTask> = new Map();\n private activeLoops: Map<string, RalphStackMemoryBridge> = new Map();\n private config: OrchestrationConfig;\n\n constructor(config?: Partial<OrchestrationConfig>) {\n this.config = {\n maxConcurrentLoops: 3,\n dependencyResolutionTimeout: 30000, // 30 seconds\n enableAdaptivePlanning: true,\n sharedContextEnabled: true,\n fallbackStrategy: 'sequential',\n ...config\n };\n\n logger.info('Multi-loop orchestrator initialized', this.config);\n }\n\n async initialize(): Promise<void> {\n try {\n await sessionManager.initialize();\n\n const session = await sessionManager.getOrCreateSession({});\n if (session.database) {\n this.frameManager = new FrameManager(session.database, session.projectId);\n }\n\n logger.info('Orchestrator initialized successfully');\n } catch (error: unknown) {\n logger.error('Failed to initialize orchestrator', error as Error);\n throw error;\n }\n }\n\n /**\n * Break down complex task into manageable loops\n */\n async orchestrateComplexTask(\n description: string, \n criteria: string[], \n options?: {\n maxLoops?: number;\n forceSequential?: boolean;\n customBreakdown?: TaskBreakdown[];\n }\n ): Promise<OrchestrationResult> {\n logger.info('Orchestrating complex task', {\n task: description.substring(0, 100),\n criteriaCount: criteria.length,\n maxLoops: options?.maxLoops || this.config.maxConcurrentLoops\n });\n\n const orchestrationId = uuidv4();\n\n try {\n // 1. Break down task into subtasks\n const breakdown = options?.customBreakdown || \n await this.analyzeAndBreakdownTask(description, criteria);\n\n // 2. Create execution plan\n const executionPlan = await this.createExecutionPlan(breakdown, options);\n\n // 3. Validate dependencies\n const dependencyErrors = this.validateDependencies(executionPlan);\n if (dependencyErrors.length > 0) {\n throw new Error(`Dependency errors: ${dependencyErrors.join(', ')}`);\n }\n\n // 4. Create orchestrated task\n const orchestratedTask: OrchestratedTask = {\n id: orchestrationId,\n description,\n breakdown,\n executionPlan,\n status: 'planning',\n startTime: Date.now(),\n loops: new Map(),\n sharedContext: {}\n };\n\n this.activeTasks.set(orchestrationId, orchestratedTask);\n\n // 5. Execute the plan\n const result = await this.executeOrchestration(orchestratedTask);\n\n logger.info('Complex task orchestration completed', {\n orchestrationId,\n status: result.success ? 'success' : 'failure',\n loopsExecuted: result.completedLoops.length,\n duration: Date.now() - orchestratedTask.startTime\n });\n\n return result;\n\n } catch (error: unknown) {\n logger.error('Orchestration failed', error as Error);\n throw error;\n } finally {\n this.activeTasks.delete(orchestrationId);\n }\n }\n\n /**\n * Execute coordinated parallel loops\n */\n async executeParallelLoops(\n tasks: TaskBreakdown[],\n coordination?: LoopCoordination\n ): Promise<ParallelExecution> {\n logger.info(`Executing ${tasks.length} parallel loops`);\n\n const execution: ParallelExecution = {\n id: uuidv4(),\n tasks: tasks,\n startTime: Date.now(),\n results: new Map(),\n sharedState: coordination?.sharedState || {}\n };\n\n const promises = tasks.map(task => this.executeParallelTask(task, execution));\n \n try {\n await Promise.allSettled(promises);\n\n execution.endTime = Date.now();\n execution.status = Array.from(execution.results.values()).every(r => r.success) ? 'success' : 'partial';\n\n return execution;\n\n } catch (error: unknown) {\n logger.error('Parallel execution failed', error as Error);\n execution.status = 'failed';\n execution.error = (error as Error).message;\n return execution;\n }\n }\n\n /**\n * Analyze and break down complex task\n */\n private async analyzeAndBreakdownTask(\n description: string,\n criteria: string[]\n ): Promise<TaskBreakdown[]> {\n // Intelligent task breakdown using patterns and heuristics\n const complexity = this.assessTaskComplexity(description);\n \n if (complexity.score < 5) {\n // Simple task - no breakdown needed\n return [{\n id: uuidv4(),\n title: description,\n description,\n criteria: criteria,\n priority: 1,\n estimatedIterations: 3,\n dependencies: [],\n type: 'single'\n }];\n }\n\n // Complex task - break down by patterns\n const subtasks: TaskBreakdown[] = [];\n \n // Pattern 1: Setup/Foundation tasks\n if (this.needsSetup(description)) {\n subtasks.push({\n id: uuidv4(),\n title: 'Project Setup',\n description: 'Set up project structure and dependencies',\n criteria: ['Project structure created', 'Dependencies installed'],\n priority: 1,\n estimatedIterations: 2,\n dependencies: [],\n type: 'setup'\n });\n }\n\n // Pattern 2: Core implementation\n const coreTask = this.extractCoreTask(description);\n if (coreTask) {\n subtasks.push({\n id: uuidv4(),\n title: 'Core Implementation',\n description: coreTask,\n criteria: criteria.filter(c => c.toLowerCase().includes('function') || c.toLowerCase().includes('implement')),\n priority: 2,\n estimatedIterations: 5,\n dependencies: subtasks.length > 0 ? [subtasks[0].id] : [],\n type: 'implementation'\n });\n }\n\n // Pattern 3: Testing tasks\n if (this.needsTesting(criteria)) {\n subtasks.push({\n id: uuidv4(),\n title: 'Testing Implementation',\n description: 'Create comprehensive tests',\n criteria: criteria.filter(c => c.toLowerCase().includes('test')),\n priority: 3,\n estimatedIterations: 3,\n dependencies: subtasks.length > 0 ? [subtasks[subtasks.length - 1].id] : [],\n type: 'testing'\n });\n }\n\n // Pattern 4: Documentation tasks\n if (this.needsDocumentation(criteria)) {\n subtasks.push({\n id: uuidv4(),\n title: 'Documentation',\n description: 'Create documentation and examples',\n criteria: criteria.filter(c => c.toLowerCase().includes('doc')),\n priority: 4,\n estimatedIterations: 2,\n dependencies: [],\n type: 'documentation'\n });\n }\n\n return subtasks.length > 0 ? subtasks : [{\n id: uuidv4(),\n title: description,\n description,\n criteria,\n priority: 1,\n estimatedIterations: Math.min(8, Math.max(3, complexity.score)),\n dependencies: [],\n type: 'single'\n }];\n }\n\n /**\n * Create execution plan from breakdown\n */\n private async createExecutionPlan(\n breakdown: TaskBreakdown[],\n options?: { forceSequential?: boolean }\n ): Promise<ExecutionPlan> {\n const plan: ExecutionPlan = {\n phases: [],\n totalEstimatedTime: 0,\n parallelizable: !options?.forceSequential && breakdown.length > 1\n };\n\n if (options?.forceSequential || !this.canExecuteInParallel(breakdown)) {\n // Sequential execution\n plan.phases = breakdown.map((task, index) => ({\n id: `phase-${index + 1}`,\n tasks: [task],\n dependencies: index > 0 ? [`phase-${index}`] : [],\n parallelExecution: false\n }));\n } else {\n // Group tasks by dependencies for parallel execution\n const phases = this.groupTasksByDependencies(breakdown);\n plan.phases = phases;\n }\n\n plan.totalEstimatedTime = plan.phases.reduce(\n (sum, phase) => sum + Math.max(...phase.tasks.map(t => t.estimatedIterations)) * 30000, // 30s per iteration\n 0\n );\n\n return plan;\n }\n\n /**\n * Execute the orchestration plan\n */\n private async executeOrchestration(task: OrchestratedTask): Promise<OrchestrationResult> {\n const result: OrchestrationResult = {\n orchestrationId: task.id,\n success: false,\n completedLoops: [],\n failedLoops: [],\n totalDuration: 0,\n insights: []\n };\n\n try {\n task.status = 'executing';\n\n for (const phase of task.executionPlan.phases) {\n logger.info(`Executing phase ${phase.id} with ${phase.tasks.length} tasks`);\n\n if (phase.parallelExecution && phase.tasks.length > 1) {\n // Parallel execution\n const parallelResult = await this.executeParallelLoops(phase.tasks);\n \n for (const [taskId, taskResult] of parallelResult.results) {\n if (taskResult.success) {\n result.completedLoops.push(taskResult.loopId);\n } else {\n result.failedLoops.push({ loopId: taskResult.loopId, error: taskResult.error || 'Unknown error' });\n }\n }\n } else {\n // Sequential execution\n for (const phaseTask of phase.tasks) {\n const loopResult = await this.executeTaskLoop(phaseTask, task);\n \n if (loopResult.success) {\n result.completedLoops.push(loopResult.loopId);\n \n // Share learnings with other tasks\n if (this.config.sharedContextEnabled) {\n await this.updateSharedContext(task, loopResult);\n }\n } else {\n result.failedLoops.push({ loopId: loopResult.loopId, error: loopResult.error || 'Unknown error' });\n \n // Handle failure based on strategy\n if (this.config.fallbackStrategy === 'abort') {\n throw new Error(`Task failed: ${loopResult.error}`);\n }\n }\n }\n }\n }\n\n task.status = 'completed';\n result.success = result.failedLoops.length === 0;\n result.totalDuration = Date.now() - task.startTime;\n\n // Generate insights\n result.insights = this.generateOrchestrationInsights(task, result);\n\n return result;\n\n } catch (error: unknown) {\n task.status = 'failed';\n result.success = false;\n result.error = (error as Error).message;\n return result;\n }\n }\n\n /**\n * Execute a single task as a Ralph loop\n */\n private async executeTaskLoop(\n taskBreakdown: TaskBreakdown,\n orchestratedTask: OrchestratedTask\n ): Promise<{ success: boolean; loopId: string; error?: string }> {\n try {\n // Create Ralph loop with shared context\n const bridge = new RalphStackMemoryBridge({\n baseDir: `.ralph-${taskBreakdown.id}`,\n maxIterations: taskBreakdown.estimatedIterations * 2, // Allow extra iterations\n useStackMemory: true\n });\n\n await bridge.initialize({\n task: taskBreakdown.description,\n criteria: taskBreakdown.criteria.join('\\n')\n });\n\n // Store loop reference\n this.activeLoops.set(taskBreakdown.id, bridge);\n orchestratedTask.loops.set(taskBreakdown.id, {\n bridge,\n status: 'running',\n startTime: Date.now()\n });\n\n // Run the loop\n await bridge.run();\n\n // Check result\n const loopInfo = orchestratedTask.loops.get(taskBreakdown.id);\n if (loopInfo) {\n loopInfo.status = 'completed';\n loopInfo.endTime = Date.now();\n }\n\n this.activeLoops.delete(taskBreakdown.id);\n\n return { success: true, loopId: taskBreakdown.id };\n\n } catch (error: unknown) {\n logger.error(`Task loop failed: ${taskBreakdown.title}`, error as Error);\n \n const loopInfo = orchestratedTask.loops.get(taskBreakdown.id);\n if (loopInfo) {\n loopInfo.status = 'failed';\n loopInfo.error = (error as Error).message;\n loopInfo.endTime = Date.now();\n }\n\n this.activeLoops.delete(taskBreakdown.id);\n\n return { success: false, loopId: taskBreakdown.id, error: (error as Error).message };\n }\n }\n\n /**\n * Execute a task in parallel context\n */\n private async executeParallelTask(\n task: TaskBreakdown,\n execution: ParallelExecution\n ): Promise<void> {\n try {\n const result = await this.executeTaskLoop(task, {\n id: execution.id,\n description: `Parallel task: ${task.title}`,\n breakdown: [task],\n executionPlan: { phases: [], totalEstimatedTime: 0, parallelizable: false },\n status: 'executing',\n startTime: execution.startTime,\n loops: new Map(),\n sharedContext: execution.sharedState\n });\n\n execution.results.set(task.id, result);\n\n } catch (error: unknown) {\n execution.results.set(task.id, {\n success: false,\n loopId: task.id,\n error: (error as Error).message\n });\n }\n }\n\n /**\n * Update shared context between tasks\n */\n private async updateSharedContext(\n orchestratedTask: OrchestratedTask,\n loopResult: { loopId: string }\n ): Promise<void> {\n // Extract learnings from completed loop and share with other active loops\n // This would integrate with StackMemory's shared context layer\n logger.debug('Updating shared context', { orchestrationId: orchestratedTask.id, loopId: loopResult.loopId });\n }\n\n /**\n * Generate insights from orchestration\n */\n private generateOrchestrationInsights(\n task: OrchestratedTask,\n result: OrchestrationResult\n ): string[] {\n const insights: string[] = [];\n\n // Performance insights\n const avgLoopDuration = Array.from(task.loops.values())\n .filter(l => l.endTime && l.startTime)\n .map(l => l.endTime! - l.startTime)\n .reduce((sum, duration) => sum + duration, 0) / task.loops.size;\n\n if (avgLoopDuration > 0) {\n insights.push(`Average loop duration: ${Math.round(avgLoopDuration / 1000)}s`);\n }\n\n // Success rate insights\n const successRate = result.completedLoops.length / (result.completedLoops.length + result.failedLoops.length);\n insights.push(`Success rate: ${Math.round(successRate * 100)}%`);\n\n // Complexity insights\n if (task.breakdown.length > 3) {\n insights.push('Complex task benefited from breakdown into multiple loops');\n }\n\n return insights;\n }\n\n // Helper methods for task analysis\n private assessTaskComplexity(description: string): { score: number; factors: string[] } {\n const factors: string[] = [];\n let score = 1;\n\n if (description.length > 200) { score += 2; factors.push('long description'); }\n if (description.includes('and')) { score += 1; factors.push('multiple requirements'); }\n if (description.toLowerCase().includes('test')) { score += 2; factors.push('testing required'); }\n if (description.toLowerCase().includes('document')) { score += 1; factors.push('documentation needed'); }\n if (description.toLowerCase().includes('refactor')) { score += 3; factors.push('refactoring complexity'); }\n\n return { score, factors };\n }\n\n private needsSetup(description: string): boolean {\n const setupKeywords = ['project', 'initialize', 'setup', 'scaffold', 'create structure'];\n return setupKeywords.some(keyword => description.toLowerCase().includes(keyword));\n }\n\n private needsTesting(criteria: string[]): boolean {\n return criteria.some(c => c.toLowerCase().includes('test'));\n }\n\n private needsDocumentation(criteria: string[]): boolean {\n return criteria.some(c => c.toLowerCase().includes('doc'));\n }\n\n private extractCoreTask(description: string): string | null {\n // Extract the main implementation task from description\n const sentences = description.split('.');\n return sentences.find(s => s.toLowerCase().includes('implement') || s.toLowerCase().includes('create') || s.toLowerCase().includes('add')) || null;\n }\n\n private canExecuteInParallel(breakdown: TaskBreakdown[]): boolean {\n // Check if tasks can be executed in parallel based on dependencies\n return breakdown.some(task => task.dependencies.length === 0);\n }\n\n private groupTasksByDependencies(breakdown: TaskBreakdown[]): any[] {\n // Group tasks into phases based on dependencies\n const phases: any[] = [];\n const processed = new Set<string>();\n \n while (processed.size < breakdown.length) {\n const readyTasks = breakdown.filter(task => \n !processed.has(task.id) && \n task.dependencies.every(dep => processed.has(dep))\n );\n\n if (readyTasks.length === 0) break; // Circular dependency\n\n phases.push({\n id: `phase-${phases.length + 1}`,\n tasks: readyTasks,\n dependencies: phases.length > 0 ? [`phase-${phases.length}`] : [],\n parallelExecution: readyTasks.length > 1\n });\n\n readyTasks.forEach(task => processed.add(task.id));\n }\n\n return phases;\n }\n\n private validateDependencies(plan: ExecutionPlan): string[] {\n const errors: string[] = [];\n const allTaskIds = new Set(\n plan.phases.flatMap(phase => phase.tasks.map(task => task.id))\n );\n\n for (const phase of plan.phases) {\n for (const task of phase.tasks) {\n for (const dep of task.dependencies) {\n if (!allTaskIds.has(dep)) {\n errors.push(`Task ${task.id} depends on non-existent task ${dep}`);\n }\n }\n }\n }\n\n return errors;\n }\n\n /**\n * Monitor orchestration progress\n */\n getOrchestrationStatus(orchestrationId: string): OrchestratedTask | null {\n return this.activeTasks.get(orchestrationId) || null;\n }\n\n /**\n * Stop orchestration\n */\n async stopOrchestration(orchestrationId: string): Promise<void> {\n const task = this.activeTasks.get(orchestrationId);\n if (!task) return;\n\n // Stop all active loops\n for (const [loopId, loopInfo] of task.loops) {\n if (loopInfo.status === 'running') {\n try {\n // Signal stop to the loop\n loopInfo.status = 'stopped';\n this.activeLoops.delete(loopId);\n } catch (error: unknown) {\n logger.error(`Failed to stop loop ${loopId}`, error as Error);\n }\n }\n }\n\n task.status = 'stopped';\n this.activeTasks.delete(orchestrationId);\n\n logger.info('Orchestration stopped', { orchestrationId });\n }\n}\n\n// Export default instance\nexport const multiLoopOrchestrator = new MultiLoopOrchestrator();"],
4
+ "sourcesContent": ["/**\n * Multi-Loop Orchestrator for Complex Tasks\n * Manages multiple Ralph loops working together on large, complex tasks\n */\n\nimport { v4 as uuidv4 } from 'uuid';\nimport { logger } from '../../../core/monitoring/logger.js';\nimport { FrameManager } from '../../../core/context/index.js';\nimport { sessionManager } from '../../../core/session/index.js';\nimport { RalphStackMemoryBridge } from '../bridge/ralph-stackmemory-bridge.js';\nimport {\n OrchestratedTask,\n TaskDependency,\n LoopCoordination,\n ParallelExecution,\n TaskBreakdown,\n ExecutionPlan,\n OrchestrationResult\n} from '../types.js';\n\nexport interface OrchestrationConfig {\n maxConcurrentLoops: number;\n dependencyResolutionTimeout: number;\n enableAdaptivePlanning: boolean;\n sharedContextEnabled: boolean;\n fallbackStrategy: 'sequential' | 'abort' | 'manual';\n}\n\nexport class MultiLoopOrchestrator {\n private frameManager?: FrameManager;\n private activeTasks: Map<string, OrchestratedTask> = new Map();\n private activeLoops: Map<string, RalphStackMemoryBridge> = new Map();\n private config: OrchestrationConfig;\n\n constructor(config?: Partial<OrchestrationConfig>) {\n this.config = {\n maxConcurrentLoops: 3,\n dependencyResolutionTimeout: 30000, // 30 seconds\n enableAdaptivePlanning: true,\n sharedContextEnabled: true,\n fallbackStrategy: 'sequential',\n ...config\n };\n\n logger.info('Multi-loop orchestrator initialized', this.config);\n }\n\n async initialize(): Promise<void> {\n try {\n await sessionManager.initialize();\n\n const session = await sessionManager.getOrCreateSession({});\n if (session.database) {\n this.frameManager = new FrameManager(session.database, session.projectId);\n }\n\n logger.info('Orchestrator initialized successfully');\n } catch (error: unknown) {\n logger.error('Failed to initialize orchestrator', error as Error);\n throw error;\n }\n }\n\n /**\n * Break down complex task into manageable loops\n */\n async orchestrateComplexTask(\n description: string, \n criteria: string[], \n options?: {\n maxLoops?: number;\n forceSequential?: boolean;\n customBreakdown?: TaskBreakdown[];\n }\n ): Promise<OrchestrationResult> {\n logger.info('Orchestrating complex task', {\n task: description.substring(0, 100),\n criteriaCount: criteria.length,\n maxLoops: options?.maxLoops || this.config.maxConcurrentLoops\n });\n\n const orchestrationId = uuidv4();\n\n try {\n // 1. Break down task into subtasks\n const breakdown = options?.customBreakdown || \n await this.analyzeAndBreakdownTask(description, criteria);\n\n // 2. Create execution plan\n const executionPlan = await this.createExecutionPlan(breakdown, options);\n\n // 3. Validate dependencies\n const dependencyErrors = this.validateDependencies(executionPlan);\n if (dependencyErrors.length > 0) {\n throw new Error(`Dependency errors: ${dependencyErrors.join(', ')}`);\n }\n\n // 4. Create orchestrated task\n const orchestratedTask: OrchestratedTask = {\n id: orchestrationId,\n description,\n breakdown,\n executionPlan,\n status: 'planning',\n startTime: Date.now(),\n loops: new Map(),\n sharedContext: {}\n };\n\n this.activeTasks.set(orchestrationId, orchestratedTask);\n\n // 5. Execute the plan\n const result = await this.executeOrchestration(orchestratedTask);\n\n logger.info('Complex task orchestration completed', {\n orchestrationId,\n status: result.success ? 'success' : 'failure',\n loopsExecuted: result.completedLoops.length,\n duration: Date.now() - orchestratedTask.startTime\n });\n\n return result;\n\n } catch (error: unknown) {\n logger.error('Orchestration failed', error as Error);\n throw error;\n } finally {\n this.activeTasks.delete(orchestrationId);\n }\n }\n\n /**\n * Execute coordinated parallel loops\n */\n async executeParallelLoops(\n tasks: TaskBreakdown[],\n coordination?: LoopCoordination\n ): Promise<ParallelExecution> {\n logger.info(`Executing ${tasks.length} parallel loops`);\n\n const execution: ParallelExecution = {\n id: uuidv4(),\n tasks: tasks,\n startTime: Date.now(),\n results: new Map(),\n sharedState: coordination?.sharedState || {}\n };\n\n const promises = tasks.map(task => this.executeParallelTask(task, execution));\n \n try {\n await Promise.allSettled(promises);\n\n execution.endTime = Date.now();\n execution.status = Array.from(execution.results.values()).every(r => r.success) ? 'success' : 'partial';\n\n return execution;\n\n } catch (error: unknown) {\n logger.error('Parallel execution failed', error as Error);\n execution.status = 'failed';\n execution.error = (error as Error).message;\n return execution;\n }\n }\n\n /**\n * Analyze and break down complex task\n */\n private async analyzeAndBreakdownTask(\n description: string,\n criteria: string[]\n ): Promise<TaskBreakdown[]> {\n // Intelligent task breakdown using patterns and heuristics\n const complexity = this.assessTaskComplexity(description);\n \n if (complexity.score < 5) {\n // Simple task - no breakdown needed\n return [{\n id: uuidv4(),\n title: description,\n description,\n criteria: criteria,\n priority: 1,\n estimatedIterations: 3,\n dependencies: [],\n type: 'single'\n }];\n }\n\n // Complex task - break down by patterns\n const subtasks: TaskBreakdown[] = [];\n \n // Pattern 1: Setup/Foundation tasks\n if (this.needsSetup(description)) {\n subtasks.push({\n id: uuidv4(),\n title: 'Project Setup',\n description: 'Set up project structure and dependencies',\n criteria: ['Project structure created', 'Dependencies installed'],\n priority: 1,\n estimatedIterations: 2,\n dependencies: [],\n type: 'setup'\n });\n }\n\n // Pattern 2: Core implementation\n const coreTask = this.extractCoreTask(description);\n if (coreTask) {\n subtasks.push({\n id: uuidv4(),\n title: 'Core Implementation',\n description: coreTask,\n criteria: criteria.filter(c => c.toLowerCase().includes('function') || c.toLowerCase().includes('implement')),\n priority: 2,\n estimatedIterations: 5,\n dependencies: subtasks.length > 0 ? [subtasks[0].id] : [],\n type: 'implementation'\n });\n }\n\n // Pattern 3: Testing tasks\n if (this.needsTesting(criteria)) {\n subtasks.push({\n id: uuidv4(),\n title: 'Testing Implementation',\n description: 'Create comprehensive tests',\n criteria: criteria.filter(c => c.toLowerCase().includes('test')),\n priority: 3,\n estimatedIterations: 3,\n dependencies: subtasks.length > 0 ? [subtasks[subtasks.length - 1].id] : [],\n type: 'testing'\n });\n }\n\n // Pattern 4: Documentation tasks\n if (this.needsDocumentation(criteria)) {\n subtasks.push({\n id: uuidv4(),\n title: 'Documentation',\n description: 'Create documentation and examples',\n criteria: criteria.filter(c => c.toLowerCase().includes('doc')),\n priority: 4,\n estimatedIterations: 2,\n dependencies: [],\n type: 'documentation'\n });\n }\n\n return subtasks.length > 0 ? subtasks : [{\n id: uuidv4(),\n title: description,\n description,\n criteria,\n priority: 1,\n estimatedIterations: Math.min(8, Math.max(3, complexity.score)),\n dependencies: [],\n type: 'single'\n }];\n }\n\n /**\n * Create execution plan from breakdown\n */\n private async createExecutionPlan(\n breakdown: TaskBreakdown[],\n options?: { forceSequential?: boolean }\n ): Promise<ExecutionPlan> {\n const plan: ExecutionPlan = {\n phases: [],\n totalEstimatedTime: 0,\n parallelizable: !options?.forceSequential && breakdown.length > 1\n };\n\n if (options?.forceSequential || !this.canExecuteInParallel(breakdown)) {\n // Sequential execution\n plan.phases = breakdown.map((task, index) => ({\n id: `phase-${index + 1}`,\n tasks: [task],\n dependencies: index > 0 ? [`phase-${index}`] : [],\n parallelExecution: false\n }));\n } else {\n // Group tasks by dependencies for parallel execution\n const phases = this.groupTasksByDependencies(breakdown);\n plan.phases = phases;\n }\n\n plan.totalEstimatedTime = plan.phases.reduce(\n (sum, phase) => sum + Math.max(...phase.tasks.map(t => t.estimatedIterations)) * 30000, // 30s per iteration\n 0\n );\n\n return plan;\n }\n\n /**\n * Execute the orchestration plan\n */\n private async executeOrchestration(task: OrchestratedTask): Promise<OrchestrationResult> {\n const result: OrchestrationResult = {\n orchestrationId: task.id,\n success: false,\n completedLoops: [],\n failedLoops: [],\n totalDuration: 0,\n insights: []\n };\n\n try {\n task.status = 'executing';\n\n for (const phase of task.executionPlan.phases) {\n logger.info(`Executing phase ${phase.id} with ${phase.tasks.length} tasks`);\n\n if (phase.parallelExecution && phase.tasks.length > 1) {\n // Parallel execution\n const parallelResult = await this.executeParallelLoops(phase.tasks);\n \n for (const [taskId, taskResult] of parallelResult.results) {\n if (taskResult.success) {\n result.completedLoops.push(taskResult.loopId);\n } else {\n result.failedLoops.push({ loopId: taskResult.loopId, error: taskResult.error || 'Unknown error' });\n }\n }\n } else {\n // Sequential execution\n for (const phaseTask of phase.tasks) {\n const loopResult = await this.executeTaskLoop(phaseTask, task);\n \n if (loopResult.success) {\n result.completedLoops.push(loopResult.loopId);\n \n // Share learnings with other tasks\n if (this.config.sharedContextEnabled) {\n await this.updateSharedContext(task, loopResult);\n }\n } else {\n result.failedLoops.push({ loopId: loopResult.loopId, error: loopResult.error || 'Unknown error' });\n \n // Handle failure based on strategy\n if (this.config.fallbackStrategy === 'abort') {\n throw new Error(`Task failed: ${loopResult.error}`);\n }\n }\n }\n }\n }\n\n task.status = 'completed';\n result.success = result.failedLoops.length === 0;\n result.totalDuration = Date.now() - task.startTime;\n\n // Generate insights\n result.insights = this.generateOrchestrationInsights(task, result);\n\n return result;\n\n } catch (error: unknown) {\n task.status = 'failed';\n result.success = false;\n result.error = (error as Error).message;\n return result;\n }\n }\n\n /**\n * Execute a single task as a Ralph loop\n */\n private async executeTaskLoop(\n taskBreakdown: TaskBreakdown,\n orchestratedTask: OrchestratedTask\n ): Promise<{ success: boolean; loopId: string; error?: string }> {\n try {\n // Create Ralph loop with shared context\n const bridge = new RalphStackMemoryBridge({\n baseDir: `.ralph-${taskBreakdown.id}`,\n maxIterations: taskBreakdown.estimatedIterations * 2, // Allow extra iterations\n useStackMemory: true\n });\n\n await bridge.initialize({\n task: taskBreakdown.description,\n criteria: taskBreakdown.criteria.join('\\n')\n });\n\n // Store loop reference\n this.activeLoops.set(taskBreakdown.id, bridge);\n orchestratedTask.loops.set(taskBreakdown.id, {\n bridge,\n status: 'running',\n startTime: Date.now()\n });\n\n // Run the loop\n await bridge.run();\n\n // Check result\n const loopInfo = orchestratedTask.loops.get(taskBreakdown.id);\n if (loopInfo) {\n loopInfo.status = 'completed';\n loopInfo.endTime = Date.now();\n }\n\n this.activeLoops.delete(taskBreakdown.id);\n\n return { success: true, loopId: taskBreakdown.id };\n\n } catch (error: unknown) {\n logger.error(`Task loop failed: ${taskBreakdown.title}`, error as Error);\n \n const loopInfo = orchestratedTask.loops.get(taskBreakdown.id);\n if (loopInfo) {\n loopInfo.status = 'failed';\n loopInfo.error = (error as Error).message;\n loopInfo.endTime = Date.now();\n }\n\n this.activeLoops.delete(taskBreakdown.id);\n\n return { success: false, loopId: taskBreakdown.id, error: (error as Error).message };\n }\n }\n\n /**\n * Execute a task in parallel context\n */\n private async executeParallelTask(\n task: TaskBreakdown,\n execution: ParallelExecution\n ): Promise<void> {\n try {\n const result = await this.executeTaskLoop(task, {\n id: execution.id,\n description: `Parallel task: ${task.title}`,\n breakdown: [task],\n executionPlan: { phases: [], totalEstimatedTime: 0, parallelizable: false },\n status: 'executing',\n startTime: execution.startTime,\n loops: new Map(),\n sharedContext: execution.sharedState\n });\n\n execution.results.set(task.id, result);\n\n } catch (error: unknown) {\n execution.results.set(task.id, {\n success: false,\n loopId: task.id,\n error: (error as Error).message\n });\n }\n }\n\n /**\n * Update shared context between tasks\n */\n private async updateSharedContext(\n orchestratedTask: OrchestratedTask,\n loopResult: { loopId: string }\n ): Promise<void> {\n // Extract learnings from completed loop and share with other active loops\n // This would integrate with StackMemory's shared context layer\n logger.debug('Updating shared context', { orchestrationId: orchestratedTask.id, loopId: loopResult.loopId });\n }\n\n /**\n * Generate insights from orchestration\n */\n private generateOrchestrationInsights(\n task: OrchestratedTask,\n result: OrchestrationResult\n ): string[] {\n const insights: string[] = [];\n\n // Performance insights\n const avgLoopDuration = Array.from(task.loops.values())\n .filter(l => l.endTime && l.startTime)\n .map(l => l.endTime! - l.startTime)\n .reduce((sum, duration) => sum + duration, 0) / task.loops.size;\n\n if (avgLoopDuration > 0) {\n insights.push(`Average loop duration: ${Math.round(avgLoopDuration / 1000)}s`);\n }\n\n // Success rate insights\n const successRate = result.completedLoops.length / (result.completedLoops.length + result.failedLoops.length);\n insights.push(`Success rate: ${Math.round(successRate * 100)}%`);\n\n // Complexity insights\n if (task.breakdown.length > 3) {\n insights.push('Complex task benefited from breakdown into multiple loops');\n }\n\n return insights;\n }\n\n // Helper methods for task analysis\n private assessTaskComplexity(description: string): { score: number; factors: string[] } {\n const factors: string[] = [];\n let score = 1;\n\n if (description.length > 200) { score += 2; factors.push('long description'); }\n if (description.includes('and')) { score += 1; factors.push('multiple requirements'); }\n if (description.toLowerCase().includes('test')) { score += 2; factors.push('testing required'); }\n if (description.toLowerCase().includes('document')) { score += 1; factors.push('documentation needed'); }\n if (description.toLowerCase().includes('refactor')) { score += 3; factors.push('refactoring complexity'); }\n\n return { score, factors };\n }\n\n private needsSetup(description: string): boolean {\n const setupKeywords = ['project', 'initialize', 'setup', 'scaffold', 'create structure'];\n return setupKeywords.some(keyword => description.toLowerCase().includes(keyword));\n }\n\n private needsTesting(criteria: string[]): boolean {\n return criteria.some(c => c.toLowerCase().includes('test'));\n }\n\n private needsDocumentation(criteria: string[]): boolean {\n return criteria.some(c => c.toLowerCase().includes('doc'));\n }\n\n private extractCoreTask(description: string): string | null {\n // Extract the main implementation task from description\n const sentences = description.split('.');\n return sentences.find(s => s.toLowerCase().includes('implement') || s.toLowerCase().includes('create') || s.toLowerCase().includes('add')) || null;\n }\n\n private canExecuteInParallel(breakdown: TaskBreakdown[]): boolean {\n // Check if tasks can be executed in parallel based on dependencies\n return breakdown.some(task => task.dependencies.length === 0);\n }\n\n private groupTasksByDependencies(breakdown: TaskBreakdown[]): any[] {\n // Group tasks into phases based on dependencies\n const phases: any[] = [];\n const processed = new Set<string>();\n \n while (processed.size < breakdown.length) {\n const readyTasks = breakdown.filter(task => \n !processed.has(task.id) && \n task.dependencies.every(dep => processed.has(dep))\n );\n\n if (readyTasks.length === 0) break; // Circular dependency\n\n phases.push({\n id: `phase-${phases.length + 1}`,\n tasks: readyTasks,\n dependencies: phases.length > 0 ? [`phase-${phases.length}`] : [],\n parallelExecution: readyTasks.length > 1\n });\n\n readyTasks.forEach(task => processed.add(task.id));\n }\n\n return phases;\n }\n\n private validateDependencies(plan: ExecutionPlan): string[] {\n const errors: string[] = [];\n const allTaskIds = new Set(\n plan.phases.flatMap(phase => phase.tasks.map(task => task.id))\n );\n\n for (const phase of plan.phases) {\n for (const task of phase.tasks) {\n for (const dep of task.dependencies) {\n if (!allTaskIds.has(dep)) {\n errors.push(`Task ${task.id} depends on non-existent task ${dep}`);\n }\n }\n }\n }\n\n return errors;\n }\n\n /**\n * Monitor orchestration progress\n */\n getOrchestrationStatus(orchestrationId: string): OrchestratedTask | null {\n return this.activeTasks.get(orchestrationId) || null;\n }\n\n /**\n * Stop orchestration\n */\n async stopOrchestration(orchestrationId: string): Promise<void> {\n const task = this.activeTasks.get(orchestrationId);\n if (!task) return;\n\n // Stop all active loops\n for (const [loopId, loopInfo] of task.loops) {\n if (loopInfo.status === 'running') {\n try {\n // Signal stop to the loop\n loopInfo.status = 'stopped';\n this.activeLoops.delete(loopId);\n } catch (error: unknown) {\n logger.error(`Failed to stop loop ${loopId}`, error as Error);\n }\n }\n }\n\n task.status = 'stopped';\n this.activeTasks.delete(orchestrationId);\n\n logger.info('Orchestration stopped', { orchestrationId });\n }\n}\n\n// Export default instance\nexport const multiLoopOrchestrator = new MultiLoopOrchestrator();"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -6,7 +6,7 @@ import { v4 as uuidv4 } from "uuid";
6
6
  import * as fs from "fs/promises";
7
7
  import * as path from "path";
8
8
  import { logger } from "../../../core/monitoring/logger.js";
9
- import { FrameManager } from "../../../core/context/frame-manager.js";
9
+ import { FrameManager } from "../../../core/context/index.js";
10
10
  import { sessionManager } from "../../../core/session/index.js";
11
11
  import { sharedContextLayer } from "../../../core/context/shared-context-layer.js";
12
12
  import { RalphStackMemoryBridge } from "../bridge/ralph-stackmemory-bridge.js";
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/integrations/ralph/swarm/swarm-coordinator.ts"],
4
- "sourcesContent": ["/**\n * Swarm Coordination System for StackMemory\n * Orchestrates multiple specialized agents working together on the same codebase\n * Addresses multi-agent coordination challenges with role specialization and dynamic planning\n */\n\nimport { v4 as uuidv4 } from 'uuid';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { logger } from '../../../core/monitoring/logger.js';\nimport { FrameManager } from '../../../core/context/frame-manager.js';\nimport { sessionManager } from '../../../core/session/index.js';\nimport { sharedContextLayer } from '../../../core/context/shared-context-layer.js';\nimport { RalphStackMemoryBridge } from '../bridge/ralph-stackmemory-bridge.js';\nimport { GitWorkflowManager } from './git-workflow-manager.js';\nimport { SwarmRegistry } from '../monitoring/swarm-registry.js';\nimport {\n SwarmConfiguration,\n Agent,\n AgentRole,\n SwarmTask,\n CoordinationEvent,\n SwarmState,\n TaskAllocation,\n AgentSpecialization,\n} from '../types.js';\n\nexport class SwarmCoordinationError extends Error {\n constructor(message: string, public context?: Record<string, unknown>) {\n super(message);\n this.name = 'SwarmCoordinationError';\n }\n}\n\nexport class AgentExecutionError extends Error {\n constructor(message: string, public agentId: string, public taskId: string, public context?: Record<string, unknown>) {\n super(message);\n this.name = 'AgentExecutionError';\n }\n}\n\nexport class TaskAllocationError extends Error {\n constructor(message: string, public taskId: string, public context?: Record<string, unknown>) {\n super(message);\n this.name = 'TaskAllocationError';\n }\n}\n\nexport interface SwarmCoordinatorConfig {\n maxAgents: number;\n coordinationInterval: number;\n driftDetectionThreshold: number;\n freshStartInterval: number;\n conflictResolutionStrategy: 'democratic' | 'hierarchical' | 'expertise';\n enableDynamicPlanning: boolean;\n pathologicalBehaviorDetection: boolean;\n}\n\nexport class SwarmCoordinator {\n private frameManager?: FrameManager;\n private activeAgents: Map<string, Agent> = new Map();\n private swarmState: SwarmState;\n private config: SwarmCoordinatorConfig;\n private coordinationTimer?: NodeJS.Timeout;\n private plannerWakeupQueue: Map<string, () => void> = new Map();\n private gitWorkflowManager: GitWorkflowManager;\n private registeredSwarmId?: string;\n\n get swarmId(): string | undefined {\n return this.registeredSwarmId;\n }\n\n get agents(): Agent[] {\n return Array.from(this.activeAgents.values());\n }\n\n constructor(config?: Partial<SwarmCoordinatorConfig>) {\n this.config = {\n maxAgents: 10,\n coordinationInterval: 30000, // 30 seconds\n driftDetectionThreshold: 5, // 5 failed iterations before considering drift\n freshStartInterval: 3600000, // 1 hour\n conflictResolutionStrategy: 'expertise',\n enableDynamicPlanning: true,\n pathologicalBehaviorDetection: true,\n ...config,\n };\n\n this.swarmState = {\n id: uuidv4(),\n status: 'idle',\n startTime: Date.now(),\n activeTaskCount: 0,\n completedTaskCount: 0,\n coordination: {\n events: [],\n conflicts: [],\n resolutions: [],\n },\n performance: {\n throughput: 0,\n efficiency: 0,\n coordination_overhead: 0,\n },\n };\n\n // Initialize git workflow manager\n this.gitWorkflowManager = new GitWorkflowManager({\n enableGitWorkflow: true,\n branchStrategy: 'agent',\n autoCommit: true,\n commitFrequency: 5,\n mergStrategy: 'squash',\n });\n\n logger.info('Swarm coordinator initialized', this.config);\n }\n\n async initialize(): Promise<void> {\n try {\n await sessionManager.initialize();\n await sharedContextLayer.initialize();\n\n const session = await sessionManager.getOrCreateSession({});\n if (session.database) {\n this.frameManager = new FrameManager(\n session.database,\n session.projectId\n );\n }\n\n // Start coordination monitoring\n this.startCoordinationLoop();\n\n // Register with global swarm registry for TUI monitoring\n const registry = SwarmRegistry.getInstance();\n this.registeredSwarmId = registry.registerSwarm(\n this,\n `Swarm ${this.swarmState.id.substring(0, 8)}`\n );\n\n logger.info('Swarm coordinator initialized successfully');\n } catch (error: unknown) {\n logger.error('Failed to initialize swarm coordinator', error as Error);\n throw error;\n }\n }\n\n /**\n * Launch a swarm of agents to work on a complex project\n */\n async launchSwarm(\n projectDescription: string,\n agents: AgentSpecialization[],\n coordination?: SwarmConfiguration\n ): Promise<string> {\n logger.info('Launching swarm', {\n project: projectDescription.substring(0, 100),\n agentCount: agents.length,\n });\n\n const swarmId = uuidv4();\n\n try {\n // 1. Validate swarm configuration\n if (agents.length > this.config.maxAgents) {\n throw new Error(\n `Too many agents requested: ${agents.length} > ${this.config.maxAgents}`\n );\n }\n\n // 2. Break down project into swarm tasks\n const swarmTasks =\n await this.decomposeProjectIntoSwarmTasks(projectDescription);\n\n // 3. Initialize specialized agents\n const initializedAgents = await this.initializeSpecializedAgents(\n agents,\n swarmTasks\n );\n\n // 4. Create task allocation plan\n const allocation = await this.allocateTasksToAgents(\n swarmTasks,\n initializedAgents\n );\n\n // 5. Begin swarm execution\n this.swarmState = {\n ...this.swarmState,\n id: swarmId,\n status: 'active',\n activeTaskCount: swarmTasks.length,\n project: projectDescription,\n agents: initializedAgents,\n tasks: swarmTasks,\n allocation,\n };\n\n // 6. Start agent execution\n await this.executeSwarmTasks(allocation);\n\n logger.info('Swarm launched successfully', {\n swarmId,\n agentCount: initializedAgents.length,\n });\n return swarmId;\n } catch (error: unknown) {\n logger.error('Failed to launch swarm', error as Error);\n throw error;\n }\n }\n\n /**\n * Decompose project into tasks suitable for swarm execution\n */\n private async decomposeProjectIntoSwarmTasks(\n projectDescription: string\n ): Promise<SwarmTask[]> {\n const tasks: SwarmTask[] = [];\n\n // Analyze project complexity and decompose based on patterns\n const complexity = this.analyzeProjectComplexity(projectDescription);\n\n // Pattern 1: Architecture and Planning\n if (complexity.needsArchitecture) {\n tasks.push({\n id: uuidv4(),\n type: 'architecture',\n title: 'System Architecture Design',\n description:\n 'Design overall system architecture and component relationships',\n priority: 1,\n estimatedEffort: 'high',\n requiredRoles: ['architect', 'system_designer'],\n dependencies: [],\n acceptanceCriteria: [\n 'Architecture diagram created',\n 'Component interfaces defined',\n 'Data flow documented',\n ],\n });\n }\n\n // Pattern 2: Core Implementation Tasks\n const coreFeatures = this.extractCoreFeatures(projectDescription);\n for (const feature of coreFeatures) {\n tasks.push({\n id: uuidv4(),\n type: 'implementation',\n title: `Implement ${feature.name}`,\n description: feature.description,\n priority: 2,\n estimatedEffort: feature.complexity,\n requiredRoles: ['developer', feature.specialization || 'fullstack'],\n dependencies: complexity.needsArchitecture ? [tasks[0].id] : [],\n acceptanceCriteria: feature.criteria,\n });\n }\n\n // Pattern 3: Testing and Validation\n if (complexity.needsTesting) {\n tasks.push({\n id: uuidv4(),\n type: 'testing',\n title: 'Comprehensive Testing Suite',\n description: 'Create unit, integration, and end-to-end tests',\n priority: 3,\n estimatedEffort: 'medium',\n requiredRoles: ['qa_engineer', 'test_automation'],\n dependencies: tasks\n .filter((t) => t.type === 'implementation')\n .map((t) => t.id),\n acceptanceCriteria: [\n 'Unit tests achieve >90% coverage',\n 'Integration tests pass',\n 'Performance benchmarks met',\n ],\n });\n }\n\n // Pattern 4: Documentation and Polish\n if (complexity.needsDocumentation) {\n tasks.push({\n id: uuidv4(),\n type: 'documentation',\n title: 'Documentation and Examples',\n description: 'Create user documentation, API docs, and usage examples',\n priority: 4,\n estimatedEffort: 'low',\n requiredRoles: ['technical_writer', 'developer'],\n dependencies: [], // Can run in parallel\n acceptanceCriteria: [\n 'README with setup instructions',\n 'API documentation complete',\n 'Usage examples provided',\n ],\n });\n }\n\n return tasks;\n }\n\n /**\n * Initialize specialized agents with role-specific configurations\n */\n private async initializeSpecializedAgents(\n specifications: AgentSpecialization[],\n tasks: SwarmTask[]\n ): Promise<Agent[]> {\n const agents: Agent[] = [];\n\n for (const spec of specifications) {\n const agent: Agent = {\n id: uuidv4(),\n role: spec.role,\n specialization: spec,\n status: 'initializing',\n capabilities: this.defineCapabilities(spec.role),\n workingDirectory: `.swarm/${spec.role}-${Date.now()}`,\n currentTask: null,\n performance: {\n tasksCompleted: 0,\n successRate: 1.0,\n averageTaskTime: 0,\n driftDetected: false,\n lastFreshStart: Date.now(),\n },\n coordination: {\n communicationStyle: this.defineCommuncationStyle(spec.role),\n conflictResolution: spec.conflictResolution || 'defer_to_expertise',\n collaborationPreferences: spec.collaborationPreferences || [],\n },\n };\n\n // Initialize agent's working environment\n await this.setupAgentEnvironment(agent);\n\n // Configure role-specific prompting strategies\n await this.configureAgentPrompts(agent);\n\n agents.push(agent);\n this.activeAgents.set(agent.id, agent);\n }\n\n logger.info(`Initialized ${agents.length} specialized agents`);\n return agents;\n }\n\n /**\n * Allocate tasks to agents based on specialization and workload\n */\n private async allocateTasksToAgents(\n tasks: SwarmTask[],\n agents: Agent[]\n ): Promise<TaskAllocation> {\n const allocation: TaskAllocation = {\n assignments: new Map(),\n loadBalancing: 'capability_based',\n conflictResolution: this.config.conflictResolutionStrategy,\n };\n\n // Sort tasks by priority and dependencies\n const sortedTasks = this.topologicalSort(tasks);\n\n for (const task of sortedTasks) {\n // Find best-suited agents for this task\n const suitableAgents = agents.filter((agent) =>\n task.requiredRoles.some((role) => this.agentCanHandle(agent, role))\n );\n\n if (suitableAgents.length === 0) {\n logger.warn(`No suitable agents found for task: ${task.title}`);\n continue;\n }\n\n // Select agent based on workload and expertise\n const selectedAgent = this.selectOptimalAgent(suitableAgents, task);\n\n allocation.assignments.set(task.id, {\n agentId: selectedAgent.id,\n taskId: task.id,\n assignedAt: Date.now(),\n estimatedCompletion: Date.now() + this.estimateTaskDuration(task),\n coordination: {\n collaborators: this.findCollaborators(selectedAgent, task, agents),\n reviewers: this.findReviewers(selectedAgent, task, agents),\n },\n });\n\n // Update agent workload\n selectedAgent.currentTask = task.id;\n }\n\n return allocation;\n }\n\n /**\n * Execute swarm tasks with coordination\n */\n private async executeSwarmTasks(allocation: TaskAllocation): Promise<void> {\n const executionPromises: Promise<void>[] = [];\n\n for (const [taskId, assignment] of allocation.assignments) {\n const agent = this.activeAgents.get(assignment.agentId);\n const task = this.swarmState.tasks?.find((t) => t.id === taskId);\n\n if (!agent || !task) continue;\n\n // Create execution promise for each agent\n const executionPromise = this.executeAgentTask(agent, task, assignment);\n executionPromises.push(executionPromise);\n }\n\n // Monitor all executions\n await Promise.allSettled(executionPromises);\n }\n\n /**\n * Execute a single agent task with coordination\n */\n private async executeAgentTask(\n agent: Agent,\n task: SwarmTask,\n assignment: TaskAllocation['assignments'] extends Map<string, infer T> ? T : any\n ): Promise<void> {\n logger.info(`Agent ${agent.role} starting task: ${task.title}`);\n\n try {\n agent.status = 'active';\n\n // Initialize git workflow for this agent\n await this.gitWorkflowManager.initializeAgentWorkflow(agent, task);\n\n // Create Ralph loop for this agent/task\n const ralph = new RalphStackMemoryBridge({\n baseDir: path.join(agent.workingDirectory, task.id),\n maxIterations: this.calculateMaxIterations(task),\n useStackMemory: true,\n });\n\n // Initialize with context from other agents\n const contextualPrompt = await this.synthesizeContextualPrompt(\n agent,\n task\n );\n\n await ralph.initialize({\n task: contextualPrompt,\n criteria: task.acceptanceCriteria.join('\\n'),\n });\n\n // Set up coordination hooks\n this.setupAgentCoordination(agent, ralph, assignment);\n\n // Run the task using worker iterations\n let iteration = 1;\n const maxIterations = this.calculateMaxIterations(task);\n \n while (iteration <= maxIterations) {\n try {\n const result = await ralph.runWorkerIteration();\n if (result.isComplete) {\n logger.info(`Task completed in ${iteration} iterations`);\n break;\n }\n iteration++;\n } catch (error: unknown) {\n logger.error(`Iteration ${iteration} failed:`, error as Error);\n if (iteration >= maxIterations) {\n throw error;\n }\n iteration++;\n }\n }\n\n // Commit agent's work\n await this.gitWorkflowManager.commitAgentWork(agent, task);\n\n // Update performance metrics\n this.updateAgentPerformance(agent, true);\n\n // Merge agent's work back\n await this.gitWorkflowManager.mergeAgentWork(agent, task);\n\n // Notify planners and collaborators\n await this.notifyTaskCompletion(agent, task, true);\n\n agent.status = 'idle';\n logger.info(`Agent ${agent.role} completed task: ${task.title}`);\n } catch (error: unknown) {\n logger.error(\n `Agent ${agent.role} failed task: ${task.title}`,\n error as Error\n );\n\n // Update performance metrics\n this.updateAgentPerformance(agent, false);\n\n // Trigger conflict resolution or reassignment\n await this.handleTaskFailure(agent, task, error as Error);\n\n agent.status = 'error';\n }\n }\n\n /**\n * Synthesize contextual prompt incorporating swarm knowledge\n */\n private async synthesizeContextualPrompt(\n agent: Agent,\n task: SwarmTask\n ): Promise<string> {\n const basePrompt = task.description;\n const roleSpecificInstructions = this.getRoleSpecificInstructions(\n agent.role\n );\n const swarmContext = await this.getSwarmContext(task);\n const coordinationInstructions = this.getCoordinationInstructions(agent);\n\n return `\n${roleSpecificInstructions}\n\nTASK: ${basePrompt}\n\nSWARM CONTEXT:\n${swarmContext}\n\nCOORDINATION GUIDELINES:\n${coordinationInstructions}\n\nRemember:\n- You are part of a swarm working on: ${this.swarmState.project}\n- Other agents are working on related tasks\n- Communicate findings through StackMemory shared context\n- Focus on your specialization while being aware of the bigger picture\n- Detect and avoid pathological behaviors (infinite loops, tunnel vision)\n- Request fresh starts if you detect drift in your approach\n\nACCEPTANCE CRITERIA:\n${task.acceptanceCriteria.map((c) => `- ${c}`).join('\\n')}\n`;\n }\n\n /**\n * Start coordination monitoring loop\n */\n private startCoordinationLoop(): void {\n this.coordinationTimer = setInterval(() => {\n this.performCoordinationCycle().catch((error) => {\n logger.error('Coordination cycle failed', error as Error);\n });\n }, this.config.coordinationInterval);\n }\n\n /**\n * Perform coordination cycle\n */\n private async performCoordinationCycle(): Promise<void> {\n if (this.swarmState.status !== 'active') return;\n\n logger.debug('Performing coordination cycle');\n\n // 1. Detect pathological behaviors\n if (this.config.pathologicalBehaviorDetection) {\n await this.detectPathologicalBehaviors();\n }\n\n // 2. Check for task completion and wake planners\n if (this.config.enableDynamicPlanning) {\n await this.wakeUpPlanners();\n }\n\n // 3. Resolve conflicts\n await this.resolveActiveConflicts();\n\n // 4. Rebalance workload if needed\n await this.rebalanceWorkload();\n\n // 5. Trigger fresh starts if needed\n await this.triggerFreshStartsIfNeeded();\n\n // 6. Update swarm performance metrics\n this.updateSwarmMetrics();\n }\n\n /**\n * Detect pathological behaviors in agents\n */\n private async detectPathologicalBehaviors(): Promise<void> {\n for (const agent of this.activeAgents.values()) {\n if (agent.status !== 'active') continue;\n\n // Check for drift (repeated failures)\n if (agent.performance.driftDetected) {\n logger.warn(\n `Drift detected in agent ${agent.role}, triggering fresh start`\n );\n await this.triggerFreshStart(agent);\n continue;\n }\n\n // Check for tunnel vision (same approach repeated)\n if (await this.detectTunnelVision(agent)) {\n logger.warn(\n `Tunnel vision detected in agent ${agent.role}, providing alternative approach`\n );\n await this.provideAlternativeApproach(agent);\n }\n\n // Check for excessive runtime (running too long)\n if (await this.detectExcessiveRuntime(agent)) {\n logger.warn(\n `Excessive runtime detected in agent ${agent.role}, requesting checkpoint`\n );\n await this.requestCheckpoint(agent);\n }\n }\n }\n\n /**\n * Wake up planners when their tasks complete\n */\n private async wakeUpPlanners(): Promise<void> {\n for (const [agentId, wakeupCallback] of this.plannerWakeupQueue) {\n const agent = this.activeAgents.get(agentId);\n if (!agent || agent.status !== 'idle') continue;\n\n logger.info(`Waking up planner agent: ${agent.role}`);\n wakeupCallback();\n this.plannerWakeupQueue.delete(agentId);\n }\n }\n\n /**\n * Get status of a specific swarm\n */\n getSwarmStatus(swarmId: string): any {\n const registry = SwarmRegistry.getInstance();\n const swarm = registry.getSwarm(swarmId);\n\n if (!swarm) {\n return null;\n }\n\n return {\n id: swarmId,\n state: swarm.status || 'running',\n activeAgents: swarm.agents?.length || 0,\n startTime: swarm.startTime || Date.now(),\n agents: swarm.agents?.map((agent: any) => ({\n role: agent.role,\n status: agent.status || 'active',\n task: agent.task || 'Working',\n })),\n };\n }\n\n /**\n * Get all active swarms\n */\n getAllActiveSwarms(): any[] {\n const registry = SwarmRegistry.getInstance();\n const activeSwarms = registry.listActiveSwarms();\n\n return activeSwarms.map((swarm) => ({\n id: swarm.id,\n description: swarm.description,\n agentCount: swarm.agents?.length || 0,\n status: swarm.status || 'running',\n startTime: swarm.startTime || Date.now(),\n }));\n }\n\n /**\n * Stop a specific swarm gracefully\n */\n async stopSwarm(swarmId?: string): Promise<void> {\n const targetId = swarmId || this.swarmId;\n\n if (!targetId) {\n throw new Error('No swarm ID provided');\n }\n\n logger.info('Stopping swarm', { swarmId: targetId });\n\n // Stop all agents\n for (const agent of this.agents) {\n try {\n await this.stopAgent(agent);\n } catch (error: any) {\n logger.error('Failed to stop agent', {\n agent: agent.id,\n error: error.message,\n });\n }\n }\n\n // Cleanup git workflow if enabled\n if (this.gitWorkflowManager) {\n try {\n await this.gitWorkflowManager.cleanup();\n } catch (error: any) {\n logger.error('Git cleanup failed', { error: error.message });\n }\n }\n\n // Unregister from registry\n const registry = SwarmRegistry.getInstance();\n registry.unregisterSwarm(targetId);\n\n logger.info('Swarm stopped', { swarmId: targetId });\n }\n\n /**\n * Force stop a swarm without saving state\n */\n async forceStopSwarm(swarmId: string): Promise<void> {\n logger.info('Force stopping swarm', { swarmId });\n\n const registry = SwarmRegistry.getInstance();\n\n // Force unregister\n registry.unregisterSwarm(swarmId);\n\n // Kill all agent processes if any\n this.activeAgents.clear();\n\n logger.info('Swarm force stopped', { swarmId });\n }\n\n /**\n * Cleanup all resources\n */\n async cleanup(): Promise<void> {\n logger.info('Cleaning up SwarmCoordinator resources');\n\n // Stop all active swarms\n const activeSwarms = this.getAllActiveSwarms();\n for (const swarm of activeSwarms) {\n try {\n await this.stopSwarm(swarm.id);\n } catch (error: any) {\n logger.error('Failed to stop swarm during cleanup', {\n swarmId: swarm.id,\n error: error.message,\n });\n }\n }\n\n // Clear registries\n const registry = SwarmRegistry.getInstance();\n registry.cleanup();\n\n // Clear agent list\n this.activeAgents.clear();\n\n logger.info('SwarmCoordinator cleanup completed');\n }\n\n /**\n * Stop an individual agent\n */\n private async stopAgent(agent: any): Promise<void> {\n logger.debug('Stopping agent', { agentId: agent.id, role: agent.role });\n\n // Mark agent as stopped\n agent.status = 'stopped';\n\n // Clean up any agent-specific resources\n if (agent.ralphBridge) {\n try {\n await agent.ralphBridge.cleanup();\n } catch (error: any) {\n logger.error('Failed to cleanup agent bridge', {\n error: error.message,\n });\n }\n }\n }\n\n // Helper methods for role specialization and coordination\n private defineCapabilities(role: AgentRole): string[] {\n const capabilityMap: Record<AgentRole, string[]> = {\n architect: [\n 'system_design',\n 'component_modeling',\n 'architecture_validation',\n ],\n planner: [\n 'task_decomposition',\n 'dependency_analysis',\n 'resource_planning',\n ],\n developer: ['code_implementation', 'debugging', 'refactoring'],\n reviewer: [\n 'code_review',\n 'quality_assessment',\n 'best_practice_enforcement',\n ],\n tester: ['test_design', 'automation', 'validation'],\n optimizer: [\n 'performance_analysis',\n 'resource_optimization',\n 'bottleneck_identification',\n ],\n documenter: [\n 'technical_writing',\n 'api_documentation',\n 'example_creation',\n ],\n coordinator: [\n 'task_coordination',\n 'conflict_resolution',\n 'progress_tracking',\n ],\n };\n\n return capabilityMap[role] || [];\n }\n\n private defineCommuncationStyle(role: AgentRole): string {\n const styleMap: Record<AgentRole, string> = {\n architect: 'high_level_design_focused',\n planner: 'structured_and_methodical',\n developer: 'implementation_focused',\n reviewer: 'quality_focused_constructive',\n tester: 'validation_focused',\n optimizer: 'performance_metrics_focused',\n documenter: 'clarity_focused',\n coordinator: 'facilitative_and_diplomatic',\n };\n\n return styleMap[role] || 'collaborative';\n }\n\n private getRoleSpecificInstructions(role: AgentRole): string {\n const instructionMap: Record<AgentRole, string> = {\n architect: `\nYou are a SYSTEM ARCHITECT. Your role is to:\n- Design high-level system architecture\n- Define component interfaces and relationships\n- Ensure architectural consistency across the project\n- Think in terms of scalability, maintainability, and extensibility\n- Collaborate with developers to validate feasibility`,\n\n planner: `\nYou are a PROJECT PLANNER. Your role is to:\n- Break down complex tasks into manageable steps\n- Identify dependencies and critical path\n- Coordinate with other agents on sequencing\n- Wake up when tasks complete to plan next steps\n- Adapt plans based on actual progress`,\n\n developer: `\nYou are a SPECIALIZED DEVELOPER. Your role is to:\n- Implement features according to specifications\n- Write clean, maintainable code\n- Follow established patterns and conventions\n- Integrate with other components\n- Communicate implementation details clearly`,\n\n reviewer: `\nYou are a CODE REVIEWER. Your role is to:\n- Review code for quality, correctness, and best practices\n- Provide constructive feedback\n- Ensure consistency with project standards\n- Identify potential issues before they become problems\n- Approve or request changes`,\n\n tester: `\nYou are a QA ENGINEER. Your role is to:\n- Design comprehensive test strategies\n- Implement automated tests\n- Validate functionality and performance\n- Report bugs clearly and reproducibly\n- Ensure quality gates are met`,\n\n optimizer: `\nYou are a PERFORMANCE OPTIMIZER. Your role is to:\n- Analyze system performance and identify bottlenecks\n- Implement optimizations\n- Monitor resource usage\n- Establish performance benchmarks\n- Ensure scalability requirements are met`,\n\n documenter: `\nYou are a TECHNICAL WRITER. Your role is to:\n- Create clear, comprehensive documentation\n- Write API documentation and usage examples\n- Ensure documentation stays up-to-date\n- Focus on user experience and clarity\n- Collaborate with developers to understand features`,\n\n coordinator: `\nYou are a PROJECT COORDINATOR. Your role is to:\n- Facilitate communication between agents\n- Resolve conflicts and blockers\n- Track overall project progress\n- Ensure no tasks fall through cracks\n- Maintain project timeline and quality`,\n };\n\n return (\n instructionMap[role] ||\n 'You are a specialized agent contributing to a larger project.'\n );\n }\n\n // Additional helper methods would be implemented here...\n private analyzeProjectComplexity(description: string): any {\n // Analyze project description to determine decomposition strategy\n return {\n needsArchitecture:\n description.length > 500 ||\n description.includes('system') ||\n description.includes('platform'),\n needsTesting: true, // Almost all projects need testing\n needsDocumentation:\n description.includes('API') || description.includes('library'),\n complexity: 'medium',\n };\n }\n\n private extractCoreFeatures(description: string): any[] {\n // Extract core features from project description\n // This would use NLP in a real implementation\n return [\n {\n name: 'Core Feature',\n description: 'Main functionality implementation',\n complexity: 'medium',\n criteria: [\n 'Feature works correctly',\n 'Handles edge cases',\n 'Follows coding standards',\n ],\n },\n ];\n }\n\n // Implement remaining helper methods...\n private async setupAgentEnvironment(agent: Agent): Promise<void> {\n // Create working directory for agent\n try {\n await fs.mkdir(agent.workingDirectory, { recursive: true });\n logger.debug(\n `Created working directory for agent ${agent.id}: ${agent.workingDirectory}`\n );\n } catch (error: unknown) {\n logger.warn(\n `Could not create working directory for agent ${agent.id}`,\n error as Error\n );\n }\n }\n\n private async configureAgentPrompts(agent: Agent): Promise<void> {\n // Configure agent with role-specific prompts\n // This would be expanded with actual prompt templates\n logger.debug(`Configured prompts for agent ${agent.role}`);\n }\n\n private topologicalSort(tasks: SwarmTask[]): SwarmTask[] {\n // Simple topological sort for task dependencies\n const sorted: SwarmTask[] = [];\n const visited = new Set<string>();\n const visiting = new Set<string>();\n\n const visit = (task: SwarmTask) => {\n if (visited.has(task.id)) return;\n if (visiting.has(task.id)) {\n logger.warn(`Circular dependency detected for task: ${task.id}`);\n return;\n }\n\n visiting.add(task.id);\n\n for (const depId of task.dependencies) {\n const depTask = tasks.find((t) => t.id === depId);\n if (depTask) visit(depTask);\n }\n\n visiting.delete(task.id);\n visited.add(task.id);\n sorted.push(task);\n };\n\n tasks.forEach(visit);\n return sorted;\n }\n\n private agentCanHandle(agent: Agent, role: string): boolean {\n return agent.role === role || agent.capabilities.includes(role);\n }\n\n private selectOptimalAgent(agents: Agent[], task: SwarmTask): Agent {\n // Select agent with lowest workload\n return agents.reduce((best, current) => {\n const bestLoad = best.currentTask ? 1 : 0;\n const currentLoad = current.currentTask ? 1 : 0;\n return currentLoad < bestLoad ? current : best;\n });\n }\n\n private estimateTaskDuration(task: SwarmTask): number {\n // Estimate based on complexity\n const durations: Record<string, number> = {\n low: 60000, // 1 minute\n medium: 300000, // 5 minutes\n high: 900000, // 15 minutes\n };\n return durations[task.estimatedEffort] || 300000;\n }\n\n private findCollaborators(\n agent: Agent,\n task: SwarmTask,\n agents: Agent[]\n ): string[] {\n // Find other agents working on related tasks\n return agents\n .filter((a) => a.id !== agent.id && a.currentTask)\n .map((a) => a.id)\n .slice(0, 2); // Limit to 2 collaborators\n }\n\n private findReviewers(\n agent: Agent,\n task: SwarmTask,\n agents: Agent[]\n ): string[] {\n // Find agents with reviewer role\n return agents\n .filter((a) => a.role === 'reviewer' && a.id !== agent.id)\n .map((a) => a.id);\n }\n\n private calculateMaxIterations(task: SwarmTask): number {\n // Calculate based on task complexity\n const iterations: Record<string, number> = {\n low: 5,\n medium: 10,\n high: 20,\n };\n return iterations[task.estimatedEffort] || 10;\n }\n\n private async getSwarmContext(task: SwarmTask): Promise<string> {\n // Get relevant context from other swarm members\n const relatedTasks = Array.from(this.activeAgents.values())\n .filter((a) => a.currentTask)\n .map((a) => `- Agent ${a.role} is working on task ${a.currentTask}`)\n .join('\\n');\n\n return relatedTasks || 'No other agents currently active';\n }\n\n private getCoordinationInstructions(agent: Agent): string {\n return `\n- Save progress to shared context regularly\n- Check for updates from collaborators\n- Request help if blocked for more than 2 iterations\n- Report completion immediately`;\n }\n\n private setupAgentCoordination(\n agent: Agent,\n ralph: any,\n assignment: any\n ): void {\n // Setup coordination hooks\n logger.debug(`Setting up coordination for agent ${agent.id}`);\n }\n\n private updateAgentPerformance(agent: Agent, success: boolean): void {\n agent.performance.tasksCompleted++;\n if (!success) {\n agent.performance.successRate =\n (agent.performance.successRate *\n (agent.performance.tasksCompleted - 1)) /\n agent.performance.tasksCompleted;\n }\n }\n\n private async notifyTaskCompletion(\n agent: Agent,\n task: SwarmTask,\n success: boolean\n ): Promise<void> {\n const event: CoordinationEvent = {\n type: 'task_completion',\n agentId: agent.id,\n timestamp: Date.now(),\n data: {\n taskId: task.id,\n success,\n agent: agent.role,\n },\n };\n\n this.swarmState.coordination?.events.push(event);\n logger.info(\n `Task ${task.id} completed by agent ${agent.role}: ${success ? 'SUCCESS' : 'FAILED'}`\n );\n }\n\n private async handleTaskFailure(\n agent: Agent,\n task: SwarmTask,\n error: Error\n ): Promise<void> {\n logger.error(`Agent ${agent.role} failed task ${task.id}`, error);\n\n // Record conflict\n if (this.swarmState.coordination) {\n this.swarmState.coordination.conflicts.push({\n type: 'task_failure',\n agents: [agent.id],\n timestamp: Date.now(),\n description: error.message,\n });\n }\n }\n\n private async detectTunnelVision(agent: Agent): Promise<boolean> {\n // Check if agent is stuck in same approach\n // Simplified implementation\n return false;\n }\n\n private async provideAlternativeApproach(agent: Agent): Promise<void> {\n logger.info(`Providing alternative approach to agent ${agent.role}`);\n }\n\n private async detectExcessiveRuntime(agent: Agent): Promise<boolean> {\n // Check if agent has been running too long\n if (!agent.performance.lastFreshStart) return false;\n return Date.now() - agent.performance.lastFreshStart > 3600000; // 1 hour\n }\n\n private async requestCheckpoint(agent: Agent): Promise<void> {\n logger.info(`Requesting checkpoint from agent ${agent.role}`);\n }\n\n private async triggerFreshStart(agent: Agent): Promise<void> {\n logger.info(`Triggering fresh start for agent ${agent.role}`);\n agent.performance.lastFreshStart = Date.now();\n agent.performance.driftDetected = false;\n }\n\n private async resolveActiveConflicts(): Promise<void> {\n // Resolve any active conflicts\n if (this.swarmState.coordination?.conflicts.length) {\n logger.debug(\n `Resolving ${this.swarmState.coordination.conflicts.length} conflicts`\n );\n }\n }\n\n private async rebalanceWorkload(): Promise<void> {\n // Rebalance workload among agents\n const activeAgents = Array.from(this.activeAgents.values()).filter(\n (a) => a.status === 'active'\n );\n if (activeAgents.length > 0) {\n logger.debug(\n `Rebalancing workload among ${activeAgents.length} active agents`\n );\n }\n }\n\n private async triggerFreshStartsIfNeeded(): Promise<void> {\n for (const agent of this.activeAgents.values()) {\n if (agent.performance.driftDetected) {\n await this.triggerFreshStart(agent);\n }\n }\n }\n\n private updateSwarmMetrics(): void {\n if (!this.swarmState.performance) return;\n\n const activeCount = Array.from(this.activeAgents.values()).filter(\n (a) => a.status === 'active'\n ).length;\n\n this.swarmState.performance.throughput =\n this.swarmState.completedTaskCount /\n ((Date.now() - this.swarmState.startTime) / 1000);\n\n this.swarmState.performance.efficiency =\n activeCount > 0 ? this.swarmState.completedTaskCount / activeCount : 0;\n }\n\n /**\n * Cleanup completed swarms and their resources\n */\n async cleanupCompletedSwarms(): Promise<void> {\n if (this.swarmState.status !== 'completed') {\n return;\n }\n\n try {\n logger.info('Cleaning up completed swarm resources');\n\n // Clear coordination timer\n if (this.coordinationTimer) {\n clearInterval(this.coordinationTimer);\n this.coordinationTimer = undefined;\n }\n\n // Clean up agent working directories\n for (const agent of this.activeAgents.values()) {\n try {\n await fs.rmdir(agent.workingDirectory, { recursive: true });\n logger.debug(`Cleaned up working directory for agent ${agent.id}`);\n } catch (error: unknown) {\n logger.warn(`Could not clean up directory for agent ${agent.id}`, error as Error);\n }\n }\n\n // Clean up git branches\n await this.gitWorkflowManager.coordinateMerges(Array.from(this.activeAgents.values()));\n\n // Clear active agents\n this.activeAgents.clear();\n\n // Reset state\n this.swarmState = {\n id: uuidv4(),\n status: 'idle',\n startTime: Date.now(),\n activeTaskCount: 0,\n completedTaskCount: 0,\n coordination: {\n events: [],\n conflicts: [],\n resolutions: []\n },\n performance: {\n throughput: 0,\n efficiency: 0,\n coordination_overhead: 0\n }\n };\n\n logger.info('Swarm cleanup completed successfully');\n } catch (error: unknown) {\n logger.error('Failed to cleanup completed swarm', error as Error);\n throw new SwarmCoordinationError('Cleanup failed', { swarmId: this.swarmState.id, error });\n }\n }\n\n /**\n * Force cleanup of a swarm (for emergency situations)\n */\n async forceCleanup(): Promise<void> {\n logger.warn('Force cleanup initiated');\n \n try {\n if (this.coordinationTimer) {\n clearInterval(this.coordinationTimer);\n this.coordinationTimer = undefined;\n }\n\n // Force stop all agents\n for (const agent of this.activeAgents.values()) {\n agent.status = 'stopped';\n }\n\n this.swarmState.status = 'stopped';\n await this.cleanupCompletedSwarms();\n } catch (error: unknown) {\n logger.error('Force cleanup failed', error as Error);\n }\n }\n\n /**\n * Get swarm resource usage and cleanup recommendations\n */\n getResourceUsage(): {\n activeAgents: number;\n workingDirectories: string[];\n memoryEstimate: number;\n cleanupRecommended: boolean;\n recommendations: string[];\n } {\n const workingDirs = Array.from(this.activeAgents.values()).map(a => a.workingDirectory);\n const memoryEstimate = this.activeAgents.size * 50; // 50MB per agent estimate\n const isStale = (Date.now() - this.swarmState.startTime) > 3600000; // 1 hour\n const hasCompletedTasks = this.swarmState.completedTaskCount > 0 && this.swarmState.activeTaskCount === 0;\n \n const recommendations: string[] = [];\n let cleanupRecommended = false;\n\n if (isStale) {\n recommendations.push('Swarm has been running for over 1 hour - consider cleanup');\n cleanupRecommended = true;\n }\n\n if (hasCompletedTasks) {\n recommendations.push('All tasks completed - cleanup is recommended');\n cleanupRecommended = true;\n }\n\n if (this.activeAgents.size > 5) {\n recommendations.push('High agent count - monitor resource usage');\n }\n\n return {\n activeAgents: this.activeAgents.size,\n workingDirectories: workingDirs,\n memoryEstimate,\n cleanupRecommended,\n recommendations\n };\n }\n\n [Symbol.toStringTag] = 'SwarmCoordinator';\n}\n\n// Export default instance\nexport const swarmCoordinator = new SwarmCoordinator();\n"],
4
+ "sourcesContent": ["/**\n * Swarm Coordination System for StackMemory\n * Orchestrates multiple specialized agents working together on the same codebase\n * Addresses multi-agent coordination challenges with role specialization and dynamic planning\n */\n\nimport { v4 as uuidv4 } from 'uuid';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { logger } from '../../../core/monitoring/logger.js';\nimport { FrameManager } from '../../../core/context/index.js';\nimport { sessionManager } from '../../../core/session/index.js';\nimport { sharedContextLayer } from '../../../core/context/shared-context-layer.js';\nimport { RalphStackMemoryBridge } from '../bridge/ralph-stackmemory-bridge.js';\nimport { GitWorkflowManager } from './git-workflow-manager.js';\nimport { SwarmRegistry } from '../monitoring/swarm-registry.js';\nimport {\n SwarmConfiguration,\n Agent,\n AgentRole,\n SwarmTask,\n CoordinationEvent,\n SwarmState,\n TaskAllocation,\n AgentSpecialization,\n} from '../types.js';\n\nexport class SwarmCoordinationError extends Error {\n constructor(message: string, public context?: Record<string, unknown>) {\n super(message);\n this.name = 'SwarmCoordinationError';\n }\n}\n\nexport class AgentExecutionError extends Error {\n constructor(message: string, public agentId: string, public taskId: string, public context?: Record<string, unknown>) {\n super(message);\n this.name = 'AgentExecutionError';\n }\n}\n\nexport class TaskAllocationError extends Error {\n constructor(message: string, public taskId: string, public context?: Record<string, unknown>) {\n super(message);\n this.name = 'TaskAllocationError';\n }\n}\n\nexport interface SwarmCoordinatorConfig {\n maxAgents: number;\n coordinationInterval: number;\n driftDetectionThreshold: number;\n freshStartInterval: number;\n conflictResolutionStrategy: 'democratic' | 'hierarchical' | 'expertise';\n enableDynamicPlanning: boolean;\n pathologicalBehaviorDetection: boolean;\n}\n\nexport class SwarmCoordinator {\n private frameManager?: FrameManager;\n private activeAgents: Map<string, Agent> = new Map();\n private swarmState: SwarmState;\n private config: SwarmCoordinatorConfig;\n private coordinationTimer?: NodeJS.Timeout;\n private plannerWakeupQueue: Map<string, () => void> = new Map();\n private gitWorkflowManager: GitWorkflowManager;\n private registeredSwarmId?: string;\n\n get swarmId(): string | undefined {\n return this.registeredSwarmId;\n }\n\n get agents(): Agent[] {\n return Array.from(this.activeAgents.values());\n }\n\n constructor(config?: Partial<SwarmCoordinatorConfig>) {\n this.config = {\n maxAgents: 10,\n coordinationInterval: 30000, // 30 seconds\n driftDetectionThreshold: 5, // 5 failed iterations before considering drift\n freshStartInterval: 3600000, // 1 hour\n conflictResolutionStrategy: 'expertise',\n enableDynamicPlanning: true,\n pathologicalBehaviorDetection: true,\n ...config,\n };\n\n this.swarmState = {\n id: uuidv4(),\n status: 'idle',\n startTime: Date.now(),\n activeTaskCount: 0,\n completedTaskCount: 0,\n coordination: {\n events: [],\n conflicts: [],\n resolutions: [],\n },\n performance: {\n throughput: 0,\n efficiency: 0,\n coordination_overhead: 0,\n },\n };\n\n // Initialize git workflow manager\n this.gitWorkflowManager = new GitWorkflowManager({\n enableGitWorkflow: true,\n branchStrategy: 'agent',\n autoCommit: true,\n commitFrequency: 5,\n mergStrategy: 'squash',\n });\n\n logger.info('Swarm coordinator initialized', this.config);\n }\n\n async initialize(): Promise<void> {\n try {\n await sessionManager.initialize();\n await sharedContextLayer.initialize();\n\n const session = await sessionManager.getOrCreateSession({});\n if (session.database) {\n this.frameManager = new FrameManager(\n session.database,\n session.projectId\n );\n }\n\n // Start coordination monitoring\n this.startCoordinationLoop();\n\n // Register with global swarm registry for TUI monitoring\n const registry = SwarmRegistry.getInstance();\n this.registeredSwarmId = registry.registerSwarm(\n this,\n `Swarm ${this.swarmState.id.substring(0, 8)}`\n );\n\n logger.info('Swarm coordinator initialized successfully');\n } catch (error: unknown) {\n logger.error('Failed to initialize swarm coordinator', error as Error);\n throw error;\n }\n }\n\n /**\n * Launch a swarm of agents to work on a complex project\n */\n async launchSwarm(\n projectDescription: string,\n agents: AgentSpecialization[],\n coordination?: SwarmConfiguration\n ): Promise<string> {\n logger.info('Launching swarm', {\n project: projectDescription.substring(0, 100),\n agentCount: agents.length,\n });\n\n const swarmId = uuidv4();\n\n try {\n // 1. Validate swarm configuration\n if (agents.length > this.config.maxAgents) {\n throw new Error(\n `Too many agents requested: ${agents.length} > ${this.config.maxAgents}`\n );\n }\n\n // 2. Break down project into swarm tasks\n const swarmTasks =\n await this.decomposeProjectIntoSwarmTasks(projectDescription);\n\n // 3. Initialize specialized agents\n const initializedAgents = await this.initializeSpecializedAgents(\n agents,\n swarmTasks\n );\n\n // 4. Create task allocation plan\n const allocation = await this.allocateTasksToAgents(\n swarmTasks,\n initializedAgents\n );\n\n // 5. Begin swarm execution\n this.swarmState = {\n ...this.swarmState,\n id: swarmId,\n status: 'active',\n activeTaskCount: swarmTasks.length,\n project: projectDescription,\n agents: initializedAgents,\n tasks: swarmTasks,\n allocation,\n };\n\n // 6. Start agent execution\n await this.executeSwarmTasks(allocation);\n\n logger.info('Swarm launched successfully', {\n swarmId,\n agentCount: initializedAgents.length,\n });\n return swarmId;\n } catch (error: unknown) {\n logger.error('Failed to launch swarm', error as Error);\n throw error;\n }\n }\n\n /**\n * Decompose project into tasks suitable for swarm execution\n */\n private async decomposeProjectIntoSwarmTasks(\n projectDescription: string\n ): Promise<SwarmTask[]> {\n const tasks: SwarmTask[] = [];\n\n // Analyze project complexity and decompose based on patterns\n const complexity = this.analyzeProjectComplexity(projectDescription);\n\n // Pattern 1: Architecture and Planning\n if (complexity.needsArchitecture) {\n tasks.push({\n id: uuidv4(),\n type: 'architecture',\n title: 'System Architecture Design',\n description:\n 'Design overall system architecture and component relationships',\n priority: 1,\n estimatedEffort: 'high',\n requiredRoles: ['architect', 'system_designer'],\n dependencies: [],\n acceptanceCriteria: [\n 'Architecture diagram created',\n 'Component interfaces defined',\n 'Data flow documented',\n ],\n });\n }\n\n // Pattern 2: Core Implementation Tasks\n const coreFeatures = this.extractCoreFeatures(projectDescription);\n for (const feature of coreFeatures) {\n tasks.push({\n id: uuidv4(),\n type: 'implementation',\n title: `Implement ${feature.name}`,\n description: feature.description,\n priority: 2,\n estimatedEffort: feature.complexity,\n requiredRoles: ['developer', feature.specialization || 'fullstack'],\n dependencies: complexity.needsArchitecture ? [tasks[0].id] : [],\n acceptanceCriteria: feature.criteria,\n });\n }\n\n // Pattern 3: Testing and Validation\n if (complexity.needsTesting) {\n tasks.push({\n id: uuidv4(),\n type: 'testing',\n title: 'Comprehensive Testing Suite',\n description: 'Create unit, integration, and end-to-end tests',\n priority: 3,\n estimatedEffort: 'medium',\n requiredRoles: ['qa_engineer', 'test_automation'],\n dependencies: tasks\n .filter((t) => t.type === 'implementation')\n .map((t) => t.id),\n acceptanceCriteria: [\n 'Unit tests achieve >90% coverage',\n 'Integration tests pass',\n 'Performance benchmarks met',\n ],\n });\n }\n\n // Pattern 4: Documentation and Polish\n if (complexity.needsDocumentation) {\n tasks.push({\n id: uuidv4(),\n type: 'documentation',\n title: 'Documentation and Examples',\n description: 'Create user documentation, API docs, and usage examples',\n priority: 4,\n estimatedEffort: 'low',\n requiredRoles: ['technical_writer', 'developer'],\n dependencies: [], // Can run in parallel\n acceptanceCriteria: [\n 'README with setup instructions',\n 'API documentation complete',\n 'Usage examples provided',\n ],\n });\n }\n\n return tasks;\n }\n\n /**\n * Initialize specialized agents with role-specific configurations\n */\n private async initializeSpecializedAgents(\n specifications: AgentSpecialization[],\n tasks: SwarmTask[]\n ): Promise<Agent[]> {\n const agents: Agent[] = [];\n\n for (const spec of specifications) {\n const agent: Agent = {\n id: uuidv4(),\n role: spec.role,\n specialization: spec,\n status: 'initializing',\n capabilities: this.defineCapabilities(spec.role),\n workingDirectory: `.swarm/${spec.role}-${Date.now()}`,\n currentTask: null,\n performance: {\n tasksCompleted: 0,\n successRate: 1.0,\n averageTaskTime: 0,\n driftDetected: false,\n lastFreshStart: Date.now(),\n },\n coordination: {\n communicationStyle: this.defineCommuncationStyle(spec.role),\n conflictResolution: spec.conflictResolution || 'defer_to_expertise',\n collaborationPreferences: spec.collaborationPreferences || [],\n },\n };\n\n // Initialize agent's working environment\n await this.setupAgentEnvironment(agent);\n\n // Configure role-specific prompting strategies\n await this.configureAgentPrompts(agent);\n\n agents.push(agent);\n this.activeAgents.set(agent.id, agent);\n }\n\n logger.info(`Initialized ${agents.length} specialized agents`);\n return agents;\n }\n\n /**\n * Allocate tasks to agents based on specialization and workload\n */\n private async allocateTasksToAgents(\n tasks: SwarmTask[],\n agents: Agent[]\n ): Promise<TaskAllocation> {\n const allocation: TaskAllocation = {\n assignments: new Map(),\n loadBalancing: 'capability_based',\n conflictResolution: this.config.conflictResolutionStrategy,\n };\n\n // Sort tasks by priority and dependencies\n const sortedTasks = this.topologicalSort(tasks);\n\n for (const task of sortedTasks) {\n // Find best-suited agents for this task\n const suitableAgents = agents.filter((agent) =>\n task.requiredRoles.some((role) => this.agentCanHandle(agent, role))\n );\n\n if (suitableAgents.length === 0) {\n logger.warn(`No suitable agents found for task: ${task.title}`);\n continue;\n }\n\n // Select agent based on workload and expertise\n const selectedAgent = this.selectOptimalAgent(suitableAgents, task);\n\n allocation.assignments.set(task.id, {\n agentId: selectedAgent.id,\n taskId: task.id,\n assignedAt: Date.now(),\n estimatedCompletion: Date.now() + this.estimateTaskDuration(task),\n coordination: {\n collaborators: this.findCollaborators(selectedAgent, task, agents),\n reviewers: this.findReviewers(selectedAgent, task, agents),\n },\n });\n\n // Update agent workload\n selectedAgent.currentTask = task.id;\n }\n\n return allocation;\n }\n\n /**\n * Execute swarm tasks with coordination\n */\n private async executeSwarmTasks(allocation: TaskAllocation): Promise<void> {\n const executionPromises: Promise<void>[] = [];\n\n for (const [taskId, assignment] of allocation.assignments) {\n const agent = this.activeAgents.get(assignment.agentId);\n const task = this.swarmState.tasks?.find((t) => t.id === taskId);\n\n if (!agent || !task) continue;\n\n // Create execution promise for each agent\n const executionPromise = this.executeAgentTask(agent, task, assignment);\n executionPromises.push(executionPromise);\n }\n\n // Monitor all executions\n await Promise.allSettled(executionPromises);\n }\n\n /**\n * Execute a single agent task with coordination\n */\n private async executeAgentTask(\n agent: Agent,\n task: SwarmTask,\n assignment: TaskAllocation['assignments'] extends Map<string, infer T> ? T : any\n ): Promise<void> {\n logger.info(`Agent ${agent.role} starting task: ${task.title}`);\n\n try {\n agent.status = 'active';\n\n // Initialize git workflow for this agent\n await this.gitWorkflowManager.initializeAgentWorkflow(agent, task);\n\n // Create Ralph loop for this agent/task\n const ralph = new RalphStackMemoryBridge({\n baseDir: path.join(agent.workingDirectory, task.id),\n maxIterations: this.calculateMaxIterations(task),\n useStackMemory: true,\n });\n\n // Initialize with context from other agents\n const contextualPrompt = await this.synthesizeContextualPrompt(\n agent,\n task\n );\n\n await ralph.initialize({\n task: contextualPrompt,\n criteria: task.acceptanceCriteria.join('\\n'),\n });\n\n // Set up coordination hooks\n this.setupAgentCoordination(agent, ralph, assignment);\n\n // Run the task using worker iterations\n let iteration = 1;\n const maxIterations = this.calculateMaxIterations(task);\n \n while (iteration <= maxIterations) {\n try {\n const result = await ralph.runWorkerIteration();\n if (result.isComplete) {\n logger.info(`Task completed in ${iteration} iterations`);\n break;\n }\n iteration++;\n } catch (error: unknown) {\n logger.error(`Iteration ${iteration} failed:`, error as Error);\n if (iteration >= maxIterations) {\n throw error;\n }\n iteration++;\n }\n }\n\n // Commit agent's work\n await this.gitWorkflowManager.commitAgentWork(agent, task);\n\n // Update performance metrics\n this.updateAgentPerformance(agent, true);\n\n // Merge agent's work back\n await this.gitWorkflowManager.mergeAgentWork(agent, task);\n\n // Notify planners and collaborators\n await this.notifyTaskCompletion(agent, task, true);\n\n agent.status = 'idle';\n logger.info(`Agent ${agent.role} completed task: ${task.title}`);\n } catch (error: unknown) {\n logger.error(\n `Agent ${agent.role} failed task: ${task.title}`,\n error as Error\n );\n\n // Update performance metrics\n this.updateAgentPerformance(agent, false);\n\n // Trigger conflict resolution or reassignment\n await this.handleTaskFailure(agent, task, error as Error);\n\n agent.status = 'error';\n }\n }\n\n /**\n * Synthesize contextual prompt incorporating swarm knowledge\n */\n private async synthesizeContextualPrompt(\n agent: Agent,\n task: SwarmTask\n ): Promise<string> {\n const basePrompt = task.description;\n const roleSpecificInstructions = this.getRoleSpecificInstructions(\n agent.role\n );\n const swarmContext = await this.getSwarmContext(task);\n const coordinationInstructions = this.getCoordinationInstructions(agent);\n\n return `\n${roleSpecificInstructions}\n\nTASK: ${basePrompt}\n\nSWARM CONTEXT:\n${swarmContext}\n\nCOORDINATION GUIDELINES:\n${coordinationInstructions}\n\nRemember:\n- You are part of a swarm working on: ${this.swarmState.project}\n- Other agents are working on related tasks\n- Communicate findings through StackMemory shared context\n- Focus on your specialization while being aware of the bigger picture\n- Detect and avoid pathological behaviors (infinite loops, tunnel vision)\n- Request fresh starts if you detect drift in your approach\n\nACCEPTANCE CRITERIA:\n${task.acceptanceCriteria.map((c) => `- ${c}`).join('\\n')}\n`;\n }\n\n /**\n * Start coordination monitoring loop\n */\n private startCoordinationLoop(): void {\n this.coordinationTimer = setInterval(() => {\n this.performCoordinationCycle().catch((error) => {\n logger.error('Coordination cycle failed', error as Error);\n });\n }, this.config.coordinationInterval);\n }\n\n /**\n * Perform coordination cycle\n */\n private async performCoordinationCycle(): Promise<void> {\n if (this.swarmState.status !== 'active') return;\n\n logger.debug('Performing coordination cycle');\n\n // 1. Detect pathological behaviors\n if (this.config.pathologicalBehaviorDetection) {\n await this.detectPathologicalBehaviors();\n }\n\n // 2. Check for task completion and wake planners\n if (this.config.enableDynamicPlanning) {\n await this.wakeUpPlanners();\n }\n\n // 3. Resolve conflicts\n await this.resolveActiveConflicts();\n\n // 4. Rebalance workload if needed\n await this.rebalanceWorkload();\n\n // 5. Trigger fresh starts if needed\n await this.triggerFreshStartsIfNeeded();\n\n // 6. Update swarm performance metrics\n this.updateSwarmMetrics();\n }\n\n /**\n * Detect pathological behaviors in agents\n */\n private async detectPathologicalBehaviors(): Promise<void> {\n for (const agent of this.activeAgents.values()) {\n if (agent.status !== 'active') continue;\n\n // Check for drift (repeated failures)\n if (agent.performance.driftDetected) {\n logger.warn(\n `Drift detected in agent ${agent.role}, triggering fresh start`\n );\n await this.triggerFreshStart(agent);\n continue;\n }\n\n // Check for tunnel vision (same approach repeated)\n if (await this.detectTunnelVision(agent)) {\n logger.warn(\n `Tunnel vision detected in agent ${agent.role}, providing alternative approach`\n );\n await this.provideAlternativeApproach(agent);\n }\n\n // Check for excessive runtime (running too long)\n if (await this.detectExcessiveRuntime(agent)) {\n logger.warn(\n `Excessive runtime detected in agent ${agent.role}, requesting checkpoint`\n );\n await this.requestCheckpoint(agent);\n }\n }\n }\n\n /**\n * Wake up planners when their tasks complete\n */\n private async wakeUpPlanners(): Promise<void> {\n for (const [agentId, wakeupCallback] of this.plannerWakeupQueue) {\n const agent = this.activeAgents.get(agentId);\n if (!agent || agent.status !== 'idle') continue;\n\n logger.info(`Waking up planner agent: ${agent.role}`);\n wakeupCallback();\n this.plannerWakeupQueue.delete(agentId);\n }\n }\n\n /**\n * Get status of a specific swarm\n */\n getSwarmStatus(swarmId: string): any {\n const registry = SwarmRegistry.getInstance();\n const swarm = registry.getSwarm(swarmId);\n\n if (!swarm) {\n return null;\n }\n\n return {\n id: swarmId,\n state: swarm.status || 'running',\n activeAgents: swarm.agents?.length || 0,\n startTime: swarm.startTime || Date.now(),\n agents: swarm.agents?.map((agent: any) => ({\n role: agent.role,\n status: agent.status || 'active',\n task: agent.task || 'Working',\n })),\n };\n }\n\n /**\n * Get all active swarms\n */\n getAllActiveSwarms(): any[] {\n const registry = SwarmRegistry.getInstance();\n const activeSwarms = registry.listActiveSwarms();\n\n return activeSwarms.map((swarm) => ({\n id: swarm.id,\n description: swarm.description,\n agentCount: swarm.agents?.length || 0,\n status: swarm.status || 'running',\n startTime: swarm.startTime || Date.now(),\n }));\n }\n\n /**\n * Stop a specific swarm gracefully\n */\n async stopSwarm(swarmId?: string): Promise<void> {\n const targetId = swarmId || this.swarmId;\n\n if (!targetId) {\n throw new Error('No swarm ID provided');\n }\n\n logger.info('Stopping swarm', { swarmId: targetId });\n\n // Stop all agents\n for (const agent of this.agents) {\n try {\n await this.stopAgent(agent);\n } catch (error: any) {\n logger.error('Failed to stop agent', {\n agent: agent.id,\n error: error.message,\n });\n }\n }\n\n // Cleanup git workflow if enabled\n if (this.gitWorkflowManager) {\n try {\n await this.gitWorkflowManager.cleanup();\n } catch (error: any) {\n logger.error('Git cleanup failed', { error: error.message });\n }\n }\n\n // Unregister from registry\n const registry = SwarmRegistry.getInstance();\n registry.unregisterSwarm(targetId);\n\n logger.info('Swarm stopped', { swarmId: targetId });\n }\n\n /**\n * Force stop a swarm without saving state\n */\n async forceStopSwarm(swarmId: string): Promise<void> {\n logger.info('Force stopping swarm', { swarmId });\n\n const registry = SwarmRegistry.getInstance();\n\n // Force unregister\n registry.unregisterSwarm(swarmId);\n\n // Kill all agent processes if any\n this.activeAgents.clear();\n\n logger.info('Swarm force stopped', { swarmId });\n }\n\n /**\n * Cleanup all resources\n */\n async cleanup(): Promise<void> {\n logger.info('Cleaning up SwarmCoordinator resources');\n\n // Stop all active swarms\n const activeSwarms = this.getAllActiveSwarms();\n for (const swarm of activeSwarms) {\n try {\n await this.stopSwarm(swarm.id);\n } catch (error: any) {\n logger.error('Failed to stop swarm during cleanup', {\n swarmId: swarm.id,\n error: error.message,\n });\n }\n }\n\n // Clear registries\n const registry = SwarmRegistry.getInstance();\n registry.cleanup();\n\n // Clear agent list\n this.activeAgents.clear();\n\n logger.info('SwarmCoordinator cleanup completed');\n }\n\n /**\n * Stop an individual agent\n */\n private async stopAgent(agent: any): Promise<void> {\n logger.debug('Stopping agent', { agentId: agent.id, role: agent.role });\n\n // Mark agent as stopped\n agent.status = 'stopped';\n\n // Clean up any agent-specific resources\n if (agent.ralphBridge) {\n try {\n await agent.ralphBridge.cleanup();\n } catch (error: any) {\n logger.error('Failed to cleanup agent bridge', {\n error: error.message,\n });\n }\n }\n }\n\n // Helper methods for role specialization and coordination\n private defineCapabilities(role: AgentRole): string[] {\n const capabilityMap: Record<AgentRole, string[]> = {\n architect: [\n 'system_design',\n 'component_modeling',\n 'architecture_validation',\n ],\n planner: [\n 'task_decomposition',\n 'dependency_analysis',\n 'resource_planning',\n ],\n developer: ['code_implementation', 'debugging', 'refactoring'],\n reviewer: [\n 'code_review',\n 'quality_assessment',\n 'best_practice_enforcement',\n ],\n tester: ['test_design', 'automation', 'validation'],\n optimizer: [\n 'performance_analysis',\n 'resource_optimization',\n 'bottleneck_identification',\n ],\n documenter: [\n 'technical_writing',\n 'api_documentation',\n 'example_creation',\n ],\n coordinator: [\n 'task_coordination',\n 'conflict_resolution',\n 'progress_tracking',\n ],\n };\n\n return capabilityMap[role] || [];\n }\n\n private defineCommuncationStyle(role: AgentRole): string {\n const styleMap: Record<AgentRole, string> = {\n architect: 'high_level_design_focused',\n planner: 'structured_and_methodical',\n developer: 'implementation_focused',\n reviewer: 'quality_focused_constructive',\n tester: 'validation_focused',\n optimizer: 'performance_metrics_focused',\n documenter: 'clarity_focused',\n coordinator: 'facilitative_and_diplomatic',\n };\n\n return styleMap[role] || 'collaborative';\n }\n\n private getRoleSpecificInstructions(role: AgentRole): string {\n const instructionMap: Record<AgentRole, string> = {\n architect: `\nYou are a SYSTEM ARCHITECT. Your role is to:\n- Design high-level system architecture\n- Define component interfaces and relationships\n- Ensure architectural consistency across the project\n- Think in terms of scalability, maintainability, and extensibility\n- Collaborate with developers to validate feasibility`,\n\n planner: `\nYou are a PROJECT PLANNER. Your role is to:\n- Break down complex tasks into manageable steps\n- Identify dependencies and critical path\n- Coordinate with other agents on sequencing\n- Wake up when tasks complete to plan next steps\n- Adapt plans based on actual progress`,\n\n developer: `\nYou are a SPECIALIZED DEVELOPER. Your role is to:\n- Implement features according to specifications\n- Write clean, maintainable code\n- Follow established patterns and conventions\n- Integrate with other components\n- Communicate implementation details clearly`,\n\n reviewer: `\nYou are a CODE REVIEWER. Your role is to:\n- Review code for quality, correctness, and best practices\n- Provide constructive feedback\n- Ensure consistency with project standards\n- Identify potential issues before they become problems\n- Approve or request changes`,\n\n tester: `\nYou are a QA ENGINEER. Your role is to:\n- Design comprehensive test strategies\n- Implement automated tests\n- Validate functionality and performance\n- Report bugs clearly and reproducibly\n- Ensure quality gates are met`,\n\n optimizer: `\nYou are a PERFORMANCE OPTIMIZER. Your role is to:\n- Analyze system performance and identify bottlenecks\n- Implement optimizations\n- Monitor resource usage\n- Establish performance benchmarks\n- Ensure scalability requirements are met`,\n\n documenter: `\nYou are a TECHNICAL WRITER. Your role is to:\n- Create clear, comprehensive documentation\n- Write API documentation and usage examples\n- Ensure documentation stays up-to-date\n- Focus on user experience and clarity\n- Collaborate with developers to understand features`,\n\n coordinator: `\nYou are a PROJECT COORDINATOR. Your role is to:\n- Facilitate communication between agents\n- Resolve conflicts and blockers\n- Track overall project progress\n- Ensure no tasks fall through cracks\n- Maintain project timeline and quality`,\n };\n\n return (\n instructionMap[role] ||\n 'You are a specialized agent contributing to a larger project.'\n );\n }\n\n // Additional helper methods would be implemented here...\n private analyzeProjectComplexity(description: string): any {\n // Analyze project description to determine decomposition strategy\n return {\n needsArchitecture:\n description.length > 500 ||\n description.includes('system') ||\n description.includes('platform'),\n needsTesting: true, // Almost all projects need testing\n needsDocumentation:\n description.includes('API') || description.includes('library'),\n complexity: 'medium',\n };\n }\n\n private extractCoreFeatures(description: string): any[] {\n // Extract core features from project description\n // This would use NLP in a real implementation\n return [\n {\n name: 'Core Feature',\n description: 'Main functionality implementation',\n complexity: 'medium',\n criteria: [\n 'Feature works correctly',\n 'Handles edge cases',\n 'Follows coding standards',\n ],\n },\n ];\n }\n\n // Implement remaining helper methods...\n private async setupAgentEnvironment(agent: Agent): Promise<void> {\n // Create working directory for agent\n try {\n await fs.mkdir(agent.workingDirectory, { recursive: true });\n logger.debug(\n `Created working directory for agent ${agent.id}: ${agent.workingDirectory}`\n );\n } catch (error: unknown) {\n logger.warn(\n `Could not create working directory for agent ${agent.id}`,\n error as Error\n );\n }\n }\n\n private async configureAgentPrompts(agent: Agent): Promise<void> {\n // Configure agent with role-specific prompts\n // This would be expanded with actual prompt templates\n logger.debug(`Configured prompts for agent ${agent.role}`);\n }\n\n private topologicalSort(tasks: SwarmTask[]): SwarmTask[] {\n // Simple topological sort for task dependencies\n const sorted: SwarmTask[] = [];\n const visited = new Set<string>();\n const visiting = new Set<string>();\n\n const visit = (task: SwarmTask) => {\n if (visited.has(task.id)) return;\n if (visiting.has(task.id)) {\n logger.warn(`Circular dependency detected for task: ${task.id}`);\n return;\n }\n\n visiting.add(task.id);\n\n for (const depId of task.dependencies) {\n const depTask = tasks.find((t) => t.id === depId);\n if (depTask) visit(depTask);\n }\n\n visiting.delete(task.id);\n visited.add(task.id);\n sorted.push(task);\n };\n\n tasks.forEach(visit);\n return sorted;\n }\n\n private agentCanHandle(agent: Agent, role: string): boolean {\n return agent.role === role || agent.capabilities.includes(role);\n }\n\n private selectOptimalAgent(agents: Agent[], task: SwarmTask): Agent {\n // Select agent with lowest workload\n return agents.reduce((best, current) => {\n const bestLoad = best.currentTask ? 1 : 0;\n const currentLoad = current.currentTask ? 1 : 0;\n return currentLoad < bestLoad ? current : best;\n });\n }\n\n private estimateTaskDuration(task: SwarmTask): number {\n // Estimate based on complexity\n const durations: Record<string, number> = {\n low: 60000, // 1 minute\n medium: 300000, // 5 minutes\n high: 900000, // 15 minutes\n };\n return durations[task.estimatedEffort] || 300000;\n }\n\n private findCollaborators(\n agent: Agent,\n task: SwarmTask,\n agents: Agent[]\n ): string[] {\n // Find other agents working on related tasks\n return agents\n .filter((a) => a.id !== agent.id && a.currentTask)\n .map((a) => a.id)\n .slice(0, 2); // Limit to 2 collaborators\n }\n\n private findReviewers(\n agent: Agent,\n task: SwarmTask,\n agents: Agent[]\n ): string[] {\n // Find agents with reviewer role\n return agents\n .filter((a) => a.role === 'reviewer' && a.id !== agent.id)\n .map((a) => a.id);\n }\n\n private calculateMaxIterations(task: SwarmTask): number {\n // Calculate based on task complexity\n const iterations: Record<string, number> = {\n low: 5,\n medium: 10,\n high: 20,\n };\n return iterations[task.estimatedEffort] || 10;\n }\n\n private async getSwarmContext(task: SwarmTask): Promise<string> {\n // Get relevant context from other swarm members\n const relatedTasks = Array.from(this.activeAgents.values())\n .filter((a) => a.currentTask)\n .map((a) => `- Agent ${a.role} is working on task ${a.currentTask}`)\n .join('\\n');\n\n return relatedTasks || 'No other agents currently active';\n }\n\n private getCoordinationInstructions(agent: Agent): string {\n return `\n- Save progress to shared context regularly\n- Check for updates from collaborators\n- Request help if blocked for more than 2 iterations\n- Report completion immediately`;\n }\n\n private setupAgentCoordination(\n agent: Agent,\n ralph: any,\n assignment: any\n ): void {\n // Setup coordination hooks\n logger.debug(`Setting up coordination for agent ${agent.id}`);\n }\n\n private updateAgentPerformance(agent: Agent, success: boolean): void {\n agent.performance.tasksCompleted++;\n if (!success) {\n agent.performance.successRate =\n (agent.performance.successRate *\n (agent.performance.tasksCompleted - 1)) /\n agent.performance.tasksCompleted;\n }\n }\n\n private async notifyTaskCompletion(\n agent: Agent,\n task: SwarmTask,\n success: boolean\n ): Promise<void> {\n const event: CoordinationEvent = {\n type: 'task_completion',\n agentId: agent.id,\n timestamp: Date.now(),\n data: {\n taskId: task.id,\n success,\n agent: agent.role,\n },\n };\n\n this.swarmState.coordination?.events.push(event);\n logger.info(\n `Task ${task.id} completed by agent ${agent.role}: ${success ? 'SUCCESS' : 'FAILED'}`\n );\n }\n\n private async handleTaskFailure(\n agent: Agent,\n task: SwarmTask,\n error: Error\n ): Promise<void> {\n logger.error(`Agent ${agent.role} failed task ${task.id}`, error);\n\n // Record conflict\n if (this.swarmState.coordination) {\n this.swarmState.coordination.conflicts.push({\n type: 'task_failure',\n agents: [agent.id],\n timestamp: Date.now(),\n description: error.message,\n });\n }\n }\n\n private async detectTunnelVision(agent: Agent): Promise<boolean> {\n // Check if agent is stuck in same approach\n // Simplified implementation\n return false;\n }\n\n private async provideAlternativeApproach(agent: Agent): Promise<void> {\n logger.info(`Providing alternative approach to agent ${agent.role}`);\n }\n\n private async detectExcessiveRuntime(agent: Agent): Promise<boolean> {\n // Check if agent has been running too long\n if (!agent.performance.lastFreshStart) return false;\n return Date.now() - agent.performance.lastFreshStart > 3600000; // 1 hour\n }\n\n private async requestCheckpoint(agent: Agent): Promise<void> {\n logger.info(`Requesting checkpoint from agent ${agent.role}`);\n }\n\n private async triggerFreshStart(agent: Agent): Promise<void> {\n logger.info(`Triggering fresh start for agent ${agent.role}`);\n agent.performance.lastFreshStart = Date.now();\n agent.performance.driftDetected = false;\n }\n\n private async resolveActiveConflicts(): Promise<void> {\n // Resolve any active conflicts\n if (this.swarmState.coordination?.conflicts.length) {\n logger.debug(\n `Resolving ${this.swarmState.coordination.conflicts.length} conflicts`\n );\n }\n }\n\n private async rebalanceWorkload(): Promise<void> {\n // Rebalance workload among agents\n const activeAgents = Array.from(this.activeAgents.values()).filter(\n (a) => a.status === 'active'\n );\n if (activeAgents.length > 0) {\n logger.debug(\n `Rebalancing workload among ${activeAgents.length} active agents`\n );\n }\n }\n\n private async triggerFreshStartsIfNeeded(): Promise<void> {\n for (const agent of this.activeAgents.values()) {\n if (agent.performance.driftDetected) {\n await this.triggerFreshStart(agent);\n }\n }\n }\n\n private updateSwarmMetrics(): void {\n if (!this.swarmState.performance) return;\n\n const activeCount = Array.from(this.activeAgents.values()).filter(\n (a) => a.status === 'active'\n ).length;\n\n this.swarmState.performance.throughput =\n this.swarmState.completedTaskCount /\n ((Date.now() - this.swarmState.startTime) / 1000);\n\n this.swarmState.performance.efficiency =\n activeCount > 0 ? this.swarmState.completedTaskCount / activeCount : 0;\n }\n\n /**\n * Cleanup completed swarms and their resources\n */\n async cleanupCompletedSwarms(): Promise<void> {\n if (this.swarmState.status !== 'completed') {\n return;\n }\n\n try {\n logger.info('Cleaning up completed swarm resources');\n\n // Clear coordination timer\n if (this.coordinationTimer) {\n clearInterval(this.coordinationTimer);\n this.coordinationTimer = undefined;\n }\n\n // Clean up agent working directories\n for (const agent of this.activeAgents.values()) {\n try {\n await fs.rmdir(agent.workingDirectory, { recursive: true });\n logger.debug(`Cleaned up working directory for agent ${agent.id}`);\n } catch (error: unknown) {\n logger.warn(`Could not clean up directory for agent ${agent.id}`, error as Error);\n }\n }\n\n // Clean up git branches\n await this.gitWorkflowManager.coordinateMerges(Array.from(this.activeAgents.values()));\n\n // Clear active agents\n this.activeAgents.clear();\n\n // Reset state\n this.swarmState = {\n id: uuidv4(),\n status: 'idle',\n startTime: Date.now(),\n activeTaskCount: 0,\n completedTaskCount: 0,\n coordination: {\n events: [],\n conflicts: [],\n resolutions: []\n },\n performance: {\n throughput: 0,\n efficiency: 0,\n coordination_overhead: 0\n }\n };\n\n logger.info('Swarm cleanup completed successfully');\n } catch (error: unknown) {\n logger.error('Failed to cleanup completed swarm', error as Error);\n throw new SwarmCoordinationError('Cleanup failed', { swarmId: this.swarmState.id, error });\n }\n }\n\n /**\n * Force cleanup of a swarm (for emergency situations)\n */\n async forceCleanup(): Promise<void> {\n logger.warn('Force cleanup initiated');\n \n try {\n if (this.coordinationTimer) {\n clearInterval(this.coordinationTimer);\n this.coordinationTimer = undefined;\n }\n\n // Force stop all agents\n for (const agent of this.activeAgents.values()) {\n agent.status = 'stopped';\n }\n\n this.swarmState.status = 'stopped';\n await this.cleanupCompletedSwarms();\n } catch (error: unknown) {\n logger.error('Force cleanup failed', error as Error);\n }\n }\n\n /**\n * Get swarm resource usage and cleanup recommendations\n */\n getResourceUsage(): {\n activeAgents: number;\n workingDirectories: string[];\n memoryEstimate: number;\n cleanupRecommended: boolean;\n recommendations: string[];\n } {\n const workingDirs = Array.from(this.activeAgents.values()).map(a => a.workingDirectory);\n const memoryEstimate = this.activeAgents.size * 50; // 50MB per agent estimate\n const isStale = (Date.now() - this.swarmState.startTime) > 3600000; // 1 hour\n const hasCompletedTasks = this.swarmState.completedTaskCount > 0 && this.swarmState.activeTaskCount === 0;\n \n const recommendations: string[] = [];\n let cleanupRecommended = false;\n\n if (isStale) {\n recommendations.push('Swarm has been running for over 1 hour - consider cleanup');\n cleanupRecommended = true;\n }\n\n if (hasCompletedTasks) {\n recommendations.push('All tasks completed - cleanup is recommended');\n cleanupRecommended = true;\n }\n\n if (this.activeAgents.size > 5) {\n recommendations.push('High agent count - monitor resource usage');\n }\n\n return {\n activeAgents: this.activeAgents.size,\n workingDirectories: workingDirs,\n memoryEstimate,\n cleanupRecommended,\n recommendations\n };\n }\n\n [Symbol.toStringTag] = 'SwarmCoordinator';\n}\n\n// Export default instance\nexport const swarmCoordinator = new SwarmCoordinator();\n"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -5,7 +5,7 @@ const __dirname = __pathDirname(__filename);
5
5
  import * as fs from "fs/promises";
6
6
  import * as path from "path";
7
7
  import { logger } from "../../../core/monitoring/logger.js";
8
- import { FrameManager } from "../../../core/context/frame-manager.js";
8
+ import { FrameManager } from "../../../core/context/index.js";
9
9
  import { sessionManager } from "../../../core/session/index.js";
10
10
  class RalphDebugger {
11
11
  frameManager;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/integrations/ralph/visualization/ralph-debugger.ts"],
4
- "sourcesContent": ["/**\n * Advanced Ralph Loop Debugger and Visualizer\n * Provides detailed debugging, monitoring, and visualization for Ralph loops\n */\n\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { logger } from '../../../core/monitoring/logger.js';\nimport { FrameManager } from '../../../core/context/frame-manager.js';\nimport { sessionManager } from '../../../core/session/index.js';\nimport {\n DebugSession,\n LoopVisualization,\n IterationTrace,\n ContextFlowDiagram,\n PerformanceMetrics,\n DebugReport\n} from '../types.js';\n\nexport interface DebuggerConfig {\n enableRealTimeMonitoring: boolean;\n captureDetailedTrace: boolean;\n generateVisualization: boolean;\n exportFormat: 'json' | 'html' | 'markdown';\n maxTraceDepth: number;\n}\n\nexport class RalphDebugger {\n private frameManager?: FrameManager;\n private activeSessions: Map<string, DebugSession> = new Map();\n private config: DebuggerConfig;\n\n constructor(config?: Partial<DebuggerConfig>) {\n this.config = {\n enableRealTimeMonitoring: true,\n captureDetailedTrace: true,\n generateVisualization: true,\n exportFormat: 'html',\n maxTraceDepth: 50,\n ...config\n };\n\n logger.info('Ralph debugger initialized', this.config);\n }\n\n async initialize(): Promise<void> {\n try {\n await sessionManager.initialize();\n \n const session = await sessionManager.getOrCreateSession({});\n if (session.database) {\n this.frameManager = new FrameManager(session.database, session.projectId);\n }\n\n logger.info('Debugger initialized successfully');\n } catch (error: unknown) {\n logger.error('Failed to initialize debugger', error as Error);\n throw error;\n }\n }\n\n /**\n * Start debugging a Ralph loop\n */\n async startDebugSession(loopId: string, ralphDir: string): Promise<DebugSession> {\n logger.info('Starting debug session', { loopId, ralphDir });\n\n const session: DebugSession = {\n id: `debug-${Date.now()}`,\n loopId,\n ralphDir,\n startTime: Date.now(),\n iterations: [],\n contextFlow: [],\n performance: {\n iterationTimes: [],\n memoryUsage: [],\n contextSizes: [],\n averageIterationTime: 0,\n peakMemory: 0,\n contextEfficiency: 0\n },\n realTimeMonitoring: this.config.enableRealTimeMonitoring\n };\n\n this.activeSessions.set(loopId, session);\n\n if (this.config.enableRealTimeMonitoring) {\n await this.startRealTimeMonitoring(session);\n }\n\n return session;\n }\n\n /**\n * Generate comprehensive debug report\n */\n async generateDebugReport(loopId: string): Promise<DebugReport> {\n const session = this.activeSessions.get(loopId);\n if (!session) {\n throw new Error(`No debug session found for loop ${loopId}`);\n }\n\n logger.info('Generating debug report', { loopId });\n\n const report: DebugReport = {\n sessionId: session.id,\n loopId,\n generatedAt: Date.now(),\n summary: await this.generateSummary(session),\n iterationAnalysis: await this.analyzeIterations(session),\n contextAnalysis: await this.analyzeContextFlow(session),\n performanceAnalysis: await this.analyzePerformance(session),\n visualization: this.config.generateVisualization ? await this.generateVisualization(session) : undefined,\n recommendations: await this.generateRecommendations(session),\n exportPath: ''\n };\n\n // Export report\n const exportPath = await this.exportReport(report);\n report.exportPath = exportPath;\n\n logger.info('Debug report generated', { loopId, exportPath });\n return report;\n }\n\n /**\n * Create visual timeline of loop execution\n */\n async generateLoopTimeline(loopId: string): Promise<string> {\n const session = this.activeSessions.get(loopId);\n if (!session) {\n throw new Error(`No debug session found for loop ${loopId}`);\n }\n\n const timeline = {\n title: `Ralph Loop Timeline: ${loopId}`,\n startTime: session.startTime,\n iterations: session.iterations.map(iter => ({\n iteration: iter.iteration,\n startTime: iter.startTime,\n endTime: iter.endTime,\n duration: iter.endTime - iter.startTime,\n success: iter.success,\n changes: iter.changes?.length || 0,\n errors: iter.errors?.length || 0,\n contextSize: iter.contextSize,\n phase: iter.phase\n })),\n totalDuration: session.performance.iterationTimes.reduce((sum, time) => sum + time, 0)\n };\n\n // Generate HTML visualization\n const html = await this.generateTimelineHTML(timeline);\n \n const timelinePath = path.join('.ralph-debug', `timeline-${loopId}.html`);\n await fs.mkdir(path.dirname(timelinePath), { recursive: true });\n await fs.writeFile(timelinePath, html);\n\n return timelinePath;\n }\n\n /**\n * Create context flow diagram\n */\n async generateContextFlowDiagram(loopId: string): Promise<ContextFlowDiagram> {\n const session = this.activeSessions.get(loopId);\n if (!session) {\n throw new Error(`No debug session found for loop ${loopId}`);\n }\n\n const diagram: ContextFlowDiagram = {\n id: `context-flow-${loopId}`,\n nodes: [],\n edges: [],\n metrics: {\n totalNodes: 0,\n totalEdges: 0,\n avgContextSize: 0,\n maxContextSize: 0\n }\n };\n\n // Build context flow graph\n for (let i = 0; i < session.iterations.length; i++) {\n const iteration = session.iterations[i];\n \n // Add iteration node\n diagram.nodes.push({\n id: `iter-${iteration.iteration}`,\n type: 'iteration',\n label: `Iteration ${iteration.iteration}`,\n size: iteration.contextSize || 100,\n color: iteration.success ? '#4CAF50' : '#F44336',\n metadata: {\n duration: iteration.endTime - iteration.startTime,\n changes: iteration.changes?.length || 0,\n errors: iteration.errors?.length || 0\n }\n });\n\n // Add edge to next iteration\n if (i < session.iterations.length - 1) {\n diagram.edges.push({\n id: `edge-${i}-${i + 1}`,\n from: `iter-${iteration.iteration}`,\n to: `iter-${session.iterations[i + 1].iteration}`,\n type: 'sequence',\n weight: iteration.contextSize || 1\n });\n }\n }\n\n diagram.metrics = {\n totalNodes: diagram.nodes.length,\n totalEdges: diagram.edges.length,\n avgContextSize: session.performance.contextSizes.length > 0 ? \n session.performance.contextSizes.reduce((sum, size) => sum + size, 0) / session.performance.contextSizes.length : 0,\n maxContextSize: Math.max(...session.performance.contextSizes)\n };\n\n return diagram;\n }\n\n /**\n * Real-time monitoring of loop execution\n */\n private async startRealTimeMonitoring(session: DebugSession): Promise<void> {\n const monitoringInterval = setInterval(async () => {\n try {\n await this.captureIterationTrace(session);\n await this.updatePerformanceMetrics(session);\n } catch (error: unknown) {\n logger.error('Monitoring error', error as Error);\n }\n }, 1000); // Monitor every second\n\n // Store interval reference for cleanup\n (session as any).monitoringInterval = monitoringInterval;\n }\n\n /**\n * Capture detailed trace of current iteration\n */\n private async captureIterationTrace(session: DebugSession): Promise<void> {\n try {\n // Read current Ralph state\n const statePath = path.join(session.ralphDir, 'state.json');\n const iterationPath = path.join(session.ralphDir, 'iteration.txt');\n \n let currentState: any = {};\n let currentIteration = 0;\n\n try {\n const stateData = await fs.readFile(statePath, 'utf8');\n currentState = JSON.parse(stateData);\n \n const iterData = await fs.readFile(iterationPath, 'utf8');\n currentIteration = parseInt(iterData.trim()) || 0;\n } catch {\n // Files might not exist yet\n return;\n }\n\n // Check if this is a new iteration\n const lastTrace = session.iterations[session.iterations.length - 1];\n if (lastTrace?.iteration === currentIteration) {\n return; // Same iteration, update existing trace\n }\n\n // Create new iteration trace\n const trace: IterationTrace = {\n iteration: currentIteration,\n startTime: Date.now(),\n endTime: Date.now(), // Will be updated when iteration completes\n phase: this.determineIterationPhase(session.ralphDir),\n contextSize: await this.calculateContextSize(session.ralphDir),\n success: false, // Will be updated\n changes: [],\n errors: [],\n memoryUsage: process.memoryUsage().heapUsed,\n stackTrace: this.captureStackTrace()\n };\n\n session.iterations.push(trace);\n\n } catch (error: unknown) {\n logger.debug('Failed to capture iteration trace', error as Error);\n }\n }\n\n /**\n * Update performance metrics\n */\n private async updatePerformanceMetrics(session: DebugSession): Promise<void> {\n const currentMemory = process.memoryUsage().heapUsed;\n session.performance.memoryUsage.push(currentMemory);\n session.performance.peakMemory = Math.max(session.performance.peakMemory, currentMemory);\n\n // Update context sizes\n const contextSize = await this.calculateContextSize(session.ralphDir);\n session.performance.contextSizes.push(contextSize);\n\n // Calculate averages\n if (session.performance.iterationTimes.length > 0) {\n session.performance.averageIterationTime = \n session.performance.iterationTimes.reduce((sum, time) => sum + time, 0) / \n session.performance.iterationTimes.length;\n }\n\n // Calculate context efficiency\n if (session.performance.contextSizes.length > 0) {\n const avgContextSize = session.performance.contextSizes.reduce((sum, size) => sum + size, 0) / \n session.performance.contextSizes.length;\n session.performance.contextEfficiency = Math.max(0, 1 - (avgContextSize / 10000)); // Assume 10K is max context\n }\n }\n\n /**\n * Generate executive summary\n */\n private async generateSummary(session: DebugSession): Promise<any> {\n const totalIterations = session.iterations.length;\n const successfulIterations = session.iterations.filter(i => i.success).length;\n const totalDuration = session.performance.iterationTimes.reduce((sum, time) => sum + time, 0);\n\n return {\n loopId: session.loopId,\n totalIterations,\n successfulIterations,\n successRate: totalIterations > 0 ? successfulIterations / totalIterations : 0,\n totalDuration,\n averageIterationTime: session.performance.averageIterationTime,\n peakMemoryUsage: session.performance.peakMemory,\n contextEfficiency: session.performance.contextEfficiency,\n status: totalIterations > 0 && session.iterations[session.iterations.length - 1].success ? 'completed' : 'in_progress'\n };\n }\n\n /**\n * Analyze iteration patterns\n */\n private async analyzeIterations(session: DebugSession): Promise<any> {\n if (session.iterations.length === 0) return { patterns: [], insights: [] };\n\n const patterns: string[] = [];\n const insights: string[] = [];\n\n // Analyze iteration durations\n const durations = session.iterations.map(i => i.endTime - i.startTime);\n const avgDuration = durations.reduce((sum, d) => sum + d, 0) / durations.length;\n\n if (durations.some(d => d > avgDuration * 2)) {\n patterns.push('Variable iteration times detected');\n insights.push('Some iterations took significantly longer than average - investigate bottlenecks');\n }\n\n // Analyze success patterns\n const consecutiveFailures = this.findConsecutiveFailures(session.iterations);\n if (consecutiveFailures.length > 2) {\n patterns.push('Multiple consecutive failures detected');\n insights.push('Consider adjusting approach or criteria after consecutive failures');\n }\n\n // Analyze context growth\n if (session.performance.contextSizes.length > 1) {\n const contextGrowth = session.performance.contextSizes[session.performance.contextSizes.length - 1] - \n session.performance.contextSizes[0];\n \n if (contextGrowth > 1000) {\n patterns.push('Significant context growth');\n insights.push('Context is growing rapidly - consider context pruning strategies');\n }\n }\n\n return { patterns, insights };\n }\n\n /**\n * Analyze context flow\n */\n private async analyzeContextFlow(session: DebugSession): Promise<any> {\n return {\n avgContextSize: session.performance.contextSizes.length > 0 ? \n session.performance.contextSizes.reduce((sum, size) => sum + size, 0) / session.performance.contextSizes.length : 0,\n maxContextSize: Math.max(...session.performance.contextSizes),\n contextGrowthRate: this.calculateGrowthRate(session.performance.contextSizes),\n efficiency: session.performance.contextEfficiency\n };\n }\n\n /**\n * Analyze performance metrics\n */\n private async analyzePerformance(session: DebugSession): Promise<any> {\n return {\n memoryEfficiency: this.calculateMemoryEfficiency(session.performance.memoryUsage),\n iterationEfficiency: session.performance.averageIterationTime,\n resourceUtilization: {\n cpu: 'N/A', // Would need CPU monitoring\n memory: session.performance.peakMemory,\n context: session.performance.contextEfficiency\n }\n };\n }\n\n /**\n * Generate visualization HTML\n */\n private async generateVisualization(session: DebugSession): Promise<LoopVisualization> {\n const htmlContent = await this.generateVisualizationHTML(session);\n \n const vizPath = path.join('.ralph-debug', `visualization-${session.loopId}.html`);\n await fs.mkdir(path.dirname(vizPath), { recursive: true });\n await fs.writeFile(vizPath, htmlContent);\n\n return {\n id: `viz-${session.loopId}`,\n type: 'interactive_timeline',\n htmlPath: vizPath,\n data: {\n iterations: session.iterations,\n performance: session.performance,\n contextFlow: session.contextFlow\n },\n metadata: {\n generatedAt: Date.now(),\n format: 'html',\n interactive: true\n }\n };\n }\n\n /**\n * Generate recommendations\n */\n private async generateRecommendations(session: DebugSession): Promise<string[]> {\n const recommendations: string[] = [];\n\n // Performance recommendations\n if (session.performance.averageIterationTime > 30000) { // > 30 seconds\n recommendations.push('Consider breaking down complex tasks into smaller iterations');\n }\n\n if (session.performance.contextEfficiency < 0.7) {\n recommendations.push('Optimize context management - consider using context budgeting');\n }\n\n // Success rate recommendations\n const successRate = session.iterations.filter(i => i.success).length / Math.max(1, session.iterations.length);\n if (successRate < 0.5) {\n recommendations.push('Low success rate detected - review task criteria and approach');\n }\n\n // Memory recommendations\n if (session.performance.peakMemory > 500 * 1024 * 1024) { // > 500MB\n recommendations.push('High memory usage detected - investigate memory leaks');\n }\n\n return recommendations;\n }\n\n /**\n * Export report in specified format\n */\n private async exportReport(report: DebugReport): Promise<string> {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const filename = `ralph-debug-${report.loopId}-${timestamp}`;\n \n let content: string;\n let extension: string;\n\n switch (this.config.exportFormat) {\n case 'json':\n content = JSON.stringify(report, null, 2);\n extension = 'json';\n break;\n case 'markdown':\n content = this.generateMarkdownReport(report);\n extension = 'md';\n break;\n case 'html':\n default:\n content = this.generateHTMLReport(report);\n extension = 'html';\n break;\n }\n\n const exportPath = path.join('.ralph-debug', `${filename}.${extension}`);\n await fs.mkdir(path.dirname(exportPath), { recursive: true });\n await fs.writeFile(exportPath, content);\n\n return exportPath;\n }\n\n // Helper methods\n private determineIterationPhase(ralphDir: string): 'starting' | 'working' | 'reviewing' | 'completed' {\n // Determine current phase based on file states\n return 'working'; // Simplified implementation\n }\n\n private async calculateContextSize(ralphDir: string): Promise<number> {\n try {\n const feedbackPath = path.join(ralphDir, 'feedback.txt');\n const feedback = await fs.readFile(feedbackPath, 'utf8');\n return feedback.length;\n } catch {\n return 0;\n }\n }\n\n private captureStackTrace(): string {\n const stack = new Error().stack || '';\n return stack.split('\\n').slice(1, 6).join('\\n'); // First 5 stack frames\n }\n\n private findConsecutiveFailures(iterations: IterationTrace[]): number[] {\n const failures: number[] = [];\n let currentStreak = 0;\n\n for (const iteration of iterations) {\n if (!iteration.success) {\n currentStreak++;\n } else {\n if (currentStreak > 0) {\n failures.push(currentStreak);\n }\n currentStreak = 0;\n }\n }\n\n if (currentStreak > 0) {\n failures.push(currentStreak);\n }\n\n return failures;\n }\n\n private calculateGrowthRate(sizes: number[]): number {\n if (sizes.length < 2) return 0;\n \n const first = sizes[0];\n const last = sizes[sizes.length - 1];\n \n return first > 0 ? (last - first) / first : 0;\n }\n\n private calculateMemoryEfficiency(memoryUsage: number[]): number {\n if (memoryUsage.length < 2) return 1;\n \n const min = Math.min(...memoryUsage);\n const max = Math.max(...memoryUsage);\n \n return max > 0 ? min / max : 1;\n }\n\n private generateTimelineHTML(timeline: any): string {\n // Generate interactive HTML timeline\n return `\n<!DOCTYPE html>\n<html>\n<head>\n <title>${timeline.title}</title>\n <script src=\"https://d3js.org/d3.v7.min.js\"></script>\n <style>\n body { font-family: Arial, sans-serif; margin: 20px; }\n .timeline { margin: 20px 0; }\n .iteration { margin: 10px 0; padding: 10px; border-left: 4px solid #ccc; }\n .success { border-left-color: #4CAF50; }\n .failure { border-left-color: #F44336; }\n </style>\n</head>\n<body>\n <h1>${timeline.title}</h1>\n <div class=\"timeline\">\n ${timeline.iterations.map((iter: any) => `\n <div class=\"iteration ${iter.success ? 'success' : 'failure'}\">\n <h3>Iteration ${iter.iteration}</h3>\n <p>Duration: ${iter.duration}ms</p>\n <p>Changes: ${iter.changes} | Errors: ${iter.errors}</p>\n <p>Context Size: ${iter.contextSize}</p>\n </div>\n `).join('')}\n </div>\n</body>\n</html>\n `;\n }\n\n private generateVisualizationHTML(session: DebugSession): string {\n // Generate comprehensive visualization\n return `\n<!DOCTYPE html>\n<html>\n<head>\n <title>Ralph Loop Visualization - ${session.loopId}</title>\n <script src=\"https://d3js.org/d3.v7.min.js\"></script>\n <style>\n body { font-family: Arial, sans-serif; margin: 20px; }\n .chart { margin: 20px 0; }\n .metric { display: inline-block; margin: 10px; padding: 10px; border: 1px solid #ccc; }\n </style>\n</head>\n<body>\n <h1>Ralph Loop Debug Visualization</h1>\n <div id=\"metrics\">\n <div class=\"metric\">\n <h3>Iterations</h3>\n <p>${session.iterations.length}</p>\n </div>\n <div class=\"metric\">\n <h3>Avg Time</h3>\n <p>${Math.round(session.performance.averageIterationTime)}ms</p>\n </div>\n <div class=\"metric\">\n <h3>Context Efficiency</h3>\n <p>${Math.round(session.performance.contextEfficiency * 100)}%</p>\n </div>\n </div>\n <div id=\"timeline\" class=\"chart\"></div>\n <script>\n // D3.js visualization code would go here\n console.log('Visualization data:', ${JSON.stringify(session)});\n </script>\n</body>\n</html>\n `;\n }\n\n private generateMarkdownReport(report: DebugReport): string {\n return `\n# Ralph Loop Debug Report\n\n**Loop ID:** ${report.loopId}\n**Generated:** ${new Date(report.generatedAt).toLocaleString()}\n\n## Summary\n- **Total Iterations:** ${report.summary.totalIterations}\n- **Success Rate:** ${Math.round(report.summary.successRate * 100)}%\n- **Total Duration:** ${report.summary.totalDuration}ms\n- **Average Iteration Time:** ${Math.round(report.summary.averageIterationTime)}ms\n\n## Performance Analysis\n- **Peak Memory:** ${Math.round(report.performanceAnalysis.resourceUtilization.memory / 1024 / 1024)}MB\n- **Context Efficiency:** ${Math.round(report.performanceAnalysis.resourceUtilization.context * 100)}%\n\n## Recommendations\n${report.recommendations.map(r => `- ${r}`).join('\\n')}\n `;\n }\n\n private generateHTMLReport(report: DebugReport): string {\n return `\n<!DOCTYPE html>\n<html>\n<head>\n <title>Ralph Debug Report - ${report.loopId}</title>\n <style>\n body { font-family: Arial, sans-serif; max-width: 1200px; margin: 0 auto; padding: 20px; }\n .summary { background: #f5f5f5; padding: 20px; border-radius: 8px; margin: 20px 0; }\n .metric { display: inline-block; margin: 10px; padding: 15px; background: white; border-radius: 4px; }\n .recommendations { background: #e3f2fd; padding: 15px; border-radius: 4px; }\n </style>\n</head>\n<body>\n <h1>Ralph Loop Debug Report</h1>\n <div class=\"summary\">\n <h2>Executive Summary</h2>\n <div class=\"metric\">\n <h3>${report.summary.totalIterations}</h3>\n <p>Total Iterations</p>\n </div>\n <div class=\"metric\">\n <h3>${Math.round(report.summary.successRate * 100)}%</h3>\n <p>Success Rate</p>\n </div>\n <div class=\"metric\">\n <h3>${Math.round(report.summary.averageIterationTime)}ms</h3>\n <p>Avg Iteration Time</p>\n </div>\n </div>\n \n <div class=\"recommendations\">\n <h2>Recommendations</h2>\n <ul>\n ${report.recommendations.map(r => `<li>${r}</li>`).join('')}\n </ul>\n </div>\n</body>\n</html>\n `;\n }\n\n /**\n * Stop debug session and cleanup\n */\n async stopDebugSession(loopId: string): Promise<void> {\n const session = this.activeSessions.get(loopId);\n if (!session) return;\n\n // Stop real-time monitoring\n if ((session as any).monitoringInterval) {\n clearInterval((session as any).monitoringInterval);\n }\n\n // Generate final report\n await this.generateDebugReport(loopId);\n\n this.activeSessions.delete(loopId);\n logger.info('Debug session stopped', { loopId });\n }\n}\n\n// Export default instance\nexport const ralphDebugger = new RalphDebugger();"],
4
+ "sourcesContent": ["/**\n * Advanced Ralph Loop Debugger and Visualizer\n * Provides detailed debugging, monitoring, and visualization for Ralph loops\n */\n\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { logger } from '../../../core/monitoring/logger.js';\nimport { FrameManager } from '../../../core/context/index.js';\nimport { sessionManager } from '../../../core/session/index.js';\nimport {\n DebugSession,\n LoopVisualization,\n IterationTrace,\n ContextFlowDiagram,\n PerformanceMetrics,\n DebugReport\n} from '../types.js';\n\nexport interface DebuggerConfig {\n enableRealTimeMonitoring: boolean;\n captureDetailedTrace: boolean;\n generateVisualization: boolean;\n exportFormat: 'json' | 'html' | 'markdown';\n maxTraceDepth: number;\n}\n\nexport class RalphDebugger {\n private frameManager?: FrameManager;\n private activeSessions: Map<string, DebugSession> = new Map();\n private config: DebuggerConfig;\n\n constructor(config?: Partial<DebuggerConfig>) {\n this.config = {\n enableRealTimeMonitoring: true,\n captureDetailedTrace: true,\n generateVisualization: true,\n exportFormat: 'html',\n maxTraceDepth: 50,\n ...config\n };\n\n logger.info('Ralph debugger initialized', this.config);\n }\n\n async initialize(): Promise<void> {\n try {\n await sessionManager.initialize();\n \n const session = await sessionManager.getOrCreateSession({});\n if (session.database) {\n this.frameManager = new FrameManager(session.database, session.projectId);\n }\n\n logger.info('Debugger initialized successfully');\n } catch (error: unknown) {\n logger.error('Failed to initialize debugger', error as Error);\n throw error;\n }\n }\n\n /**\n * Start debugging a Ralph loop\n */\n async startDebugSession(loopId: string, ralphDir: string): Promise<DebugSession> {\n logger.info('Starting debug session', { loopId, ralphDir });\n\n const session: DebugSession = {\n id: `debug-${Date.now()}`,\n loopId,\n ralphDir,\n startTime: Date.now(),\n iterations: [],\n contextFlow: [],\n performance: {\n iterationTimes: [],\n memoryUsage: [],\n contextSizes: [],\n averageIterationTime: 0,\n peakMemory: 0,\n contextEfficiency: 0\n },\n realTimeMonitoring: this.config.enableRealTimeMonitoring\n };\n\n this.activeSessions.set(loopId, session);\n\n if (this.config.enableRealTimeMonitoring) {\n await this.startRealTimeMonitoring(session);\n }\n\n return session;\n }\n\n /**\n * Generate comprehensive debug report\n */\n async generateDebugReport(loopId: string): Promise<DebugReport> {\n const session = this.activeSessions.get(loopId);\n if (!session) {\n throw new Error(`No debug session found for loop ${loopId}`);\n }\n\n logger.info('Generating debug report', { loopId });\n\n const report: DebugReport = {\n sessionId: session.id,\n loopId,\n generatedAt: Date.now(),\n summary: await this.generateSummary(session),\n iterationAnalysis: await this.analyzeIterations(session),\n contextAnalysis: await this.analyzeContextFlow(session),\n performanceAnalysis: await this.analyzePerformance(session),\n visualization: this.config.generateVisualization ? await this.generateVisualization(session) : undefined,\n recommendations: await this.generateRecommendations(session),\n exportPath: ''\n };\n\n // Export report\n const exportPath = await this.exportReport(report);\n report.exportPath = exportPath;\n\n logger.info('Debug report generated', { loopId, exportPath });\n return report;\n }\n\n /**\n * Create visual timeline of loop execution\n */\n async generateLoopTimeline(loopId: string): Promise<string> {\n const session = this.activeSessions.get(loopId);\n if (!session) {\n throw new Error(`No debug session found for loop ${loopId}`);\n }\n\n const timeline = {\n title: `Ralph Loop Timeline: ${loopId}`,\n startTime: session.startTime,\n iterations: session.iterations.map(iter => ({\n iteration: iter.iteration,\n startTime: iter.startTime,\n endTime: iter.endTime,\n duration: iter.endTime - iter.startTime,\n success: iter.success,\n changes: iter.changes?.length || 0,\n errors: iter.errors?.length || 0,\n contextSize: iter.contextSize,\n phase: iter.phase\n })),\n totalDuration: session.performance.iterationTimes.reduce((sum, time) => sum + time, 0)\n };\n\n // Generate HTML visualization\n const html = await this.generateTimelineHTML(timeline);\n \n const timelinePath = path.join('.ralph-debug', `timeline-${loopId}.html`);\n await fs.mkdir(path.dirname(timelinePath), { recursive: true });\n await fs.writeFile(timelinePath, html);\n\n return timelinePath;\n }\n\n /**\n * Create context flow diagram\n */\n async generateContextFlowDiagram(loopId: string): Promise<ContextFlowDiagram> {\n const session = this.activeSessions.get(loopId);\n if (!session) {\n throw new Error(`No debug session found for loop ${loopId}`);\n }\n\n const diagram: ContextFlowDiagram = {\n id: `context-flow-${loopId}`,\n nodes: [],\n edges: [],\n metrics: {\n totalNodes: 0,\n totalEdges: 0,\n avgContextSize: 0,\n maxContextSize: 0\n }\n };\n\n // Build context flow graph\n for (let i = 0; i < session.iterations.length; i++) {\n const iteration = session.iterations[i];\n \n // Add iteration node\n diagram.nodes.push({\n id: `iter-${iteration.iteration}`,\n type: 'iteration',\n label: `Iteration ${iteration.iteration}`,\n size: iteration.contextSize || 100,\n color: iteration.success ? '#4CAF50' : '#F44336',\n metadata: {\n duration: iteration.endTime - iteration.startTime,\n changes: iteration.changes?.length || 0,\n errors: iteration.errors?.length || 0\n }\n });\n\n // Add edge to next iteration\n if (i < session.iterations.length - 1) {\n diagram.edges.push({\n id: `edge-${i}-${i + 1}`,\n from: `iter-${iteration.iteration}`,\n to: `iter-${session.iterations[i + 1].iteration}`,\n type: 'sequence',\n weight: iteration.contextSize || 1\n });\n }\n }\n\n diagram.metrics = {\n totalNodes: diagram.nodes.length,\n totalEdges: diagram.edges.length,\n avgContextSize: session.performance.contextSizes.length > 0 ? \n session.performance.contextSizes.reduce((sum, size) => sum + size, 0) / session.performance.contextSizes.length : 0,\n maxContextSize: Math.max(...session.performance.contextSizes)\n };\n\n return diagram;\n }\n\n /**\n * Real-time monitoring of loop execution\n */\n private async startRealTimeMonitoring(session: DebugSession): Promise<void> {\n const monitoringInterval = setInterval(async () => {\n try {\n await this.captureIterationTrace(session);\n await this.updatePerformanceMetrics(session);\n } catch (error: unknown) {\n logger.error('Monitoring error', error as Error);\n }\n }, 1000); // Monitor every second\n\n // Store interval reference for cleanup\n (session as any).monitoringInterval = monitoringInterval;\n }\n\n /**\n * Capture detailed trace of current iteration\n */\n private async captureIterationTrace(session: DebugSession): Promise<void> {\n try {\n // Read current Ralph state\n const statePath = path.join(session.ralphDir, 'state.json');\n const iterationPath = path.join(session.ralphDir, 'iteration.txt');\n \n let currentState: any = {};\n let currentIteration = 0;\n\n try {\n const stateData = await fs.readFile(statePath, 'utf8');\n currentState = JSON.parse(stateData);\n \n const iterData = await fs.readFile(iterationPath, 'utf8');\n currentIteration = parseInt(iterData.trim()) || 0;\n } catch {\n // Files might not exist yet\n return;\n }\n\n // Check if this is a new iteration\n const lastTrace = session.iterations[session.iterations.length - 1];\n if (lastTrace?.iteration === currentIteration) {\n return; // Same iteration, update existing trace\n }\n\n // Create new iteration trace\n const trace: IterationTrace = {\n iteration: currentIteration,\n startTime: Date.now(),\n endTime: Date.now(), // Will be updated when iteration completes\n phase: this.determineIterationPhase(session.ralphDir),\n contextSize: await this.calculateContextSize(session.ralphDir),\n success: false, // Will be updated\n changes: [],\n errors: [],\n memoryUsage: process.memoryUsage().heapUsed,\n stackTrace: this.captureStackTrace()\n };\n\n session.iterations.push(trace);\n\n } catch (error: unknown) {\n logger.debug('Failed to capture iteration trace', error as Error);\n }\n }\n\n /**\n * Update performance metrics\n */\n private async updatePerformanceMetrics(session: DebugSession): Promise<void> {\n const currentMemory = process.memoryUsage().heapUsed;\n session.performance.memoryUsage.push(currentMemory);\n session.performance.peakMemory = Math.max(session.performance.peakMemory, currentMemory);\n\n // Update context sizes\n const contextSize = await this.calculateContextSize(session.ralphDir);\n session.performance.contextSizes.push(contextSize);\n\n // Calculate averages\n if (session.performance.iterationTimes.length > 0) {\n session.performance.averageIterationTime = \n session.performance.iterationTimes.reduce((sum, time) => sum + time, 0) / \n session.performance.iterationTimes.length;\n }\n\n // Calculate context efficiency\n if (session.performance.contextSizes.length > 0) {\n const avgContextSize = session.performance.contextSizes.reduce((sum, size) => sum + size, 0) / \n session.performance.contextSizes.length;\n session.performance.contextEfficiency = Math.max(0, 1 - (avgContextSize / 10000)); // Assume 10K is max context\n }\n }\n\n /**\n * Generate executive summary\n */\n private async generateSummary(session: DebugSession): Promise<any> {\n const totalIterations = session.iterations.length;\n const successfulIterations = session.iterations.filter(i => i.success).length;\n const totalDuration = session.performance.iterationTimes.reduce((sum, time) => sum + time, 0);\n\n return {\n loopId: session.loopId,\n totalIterations,\n successfulIterations,\n successRate: totalIterations > 0 ? successfulIterations / totalIterations : 0,\n totalDuration,\n averageIterationTime: session.performance.averageIterationTime,\n peakMemoryUsage: session.performance.peakMemory,\n contextEfficiency: session.performance.contextEfficiency,\n status: totalIterations > 0 && session.iterations[session.iterations.length - 1].success ? 'completed' : 'in_progress'\n };\n }\n\n /**\n * Analyze iteration patterns\n */\n private async analyzeIterations(session: DebugSession): Promise<any> {\n if (session.iterations.length === 0) return { patterns: [], insights: [] };\n\n const patterns: string[] = [];\n const insights: string[] = [];\n\n // Analyze iteration durations\n const durations = session.iterations.map(i => i.endTime - i.startTime);\n const avgDuration = durations.reduce((sum, d) => sum + d, 0) / durations.length;\n\n if (durations.some(d => d > avgDuration * 2)) {\n patterns.push('Variable iteration times detected');\n insights.push('Some iterations took significantly longer than average - investigate bottlenecks');\n }\n\n // Analyze success patterns\n const consecutiveFailures = this.findConsecutiveFailures(session.iterations);\n if (consecutiveFailures.length > 2) {\n patterns.push('Multiple consecutive failures detected');\n insights.push('Consider adjusting approach or criteria after consecutive failures');\n }\n\n // Analyze context growth\n if (session.performance.contextSizes.length > 1) {\n const contextGrowth = session.performance.contextSizes[session.performance.contextSizes.length - 1] - \n session.performance.contextSizes[0];\n \n if (contextGrowth > 1000) {\n patterns.push('Significant context growth');\n insights.push('Context is growing rapidly - consider context pruning strategies');\n }\n }\n\n return { patterns, insights };\n }\n\n /**\n * Analyze context flow\n */\n private async analyzeContextFlow(session: DebugSession): Promise<any> {\n return {\n avgContextSize: session.performance.contextSizes.length > 0 ? \n session.performance.contextSizes.reduce((sum, size) => sum + size, 0) / session.performance.contextSizes.length : 0,\n maxContextSize: Math.max(...session.performance.contextSizes),\n contextGrowthRate: this.calculateGrowthRate(session.performance.contextSizes),\n efficiency: session.performance.contextEfficiency\n };\n }\n\n /**\n * Analyze performance metrics\n */\n private async analyzePerformance(session: DebugSession): Promise<any> {\n return {\n memoryEfficiency: this.calculateMemoryEfficiency(session.performance.memoryUsage),\n iterationEfficiency: session.performance.averageIterationTime,\n resourceUtilization: {\n cpu: 'N/A', // Would need CPU monitoring\n memory: session.performance.peakMemory,\n context: session.performance.contextEfficiency\n }\n };\n }\n\n /**\n * Generate visualization HTML\n */\n private async generateVisualization(session: DebugSession): Promise<LoopVisualization> {\n const htmlContent = await this.generateVisualizationHTML(session);\n \n const vizPath = path.join('.ralph-debug', `visualization-${session.loopId}.html`);\n await fs.mkdir(path.dirname(vizPath), { recursive: true });\n await fs.writeFile(vizPath, htmlContent);\n\n return {\n id: `viz-${session.loopId}`,\n type: 'interactive_timeline',\n htmlPath: vizPath,\n data: {\n iterations: session.iterations,\n performance: session.performance,\n contextFlow: session.contextFlow\n },\n metadata: {\n generatedAt: Date.now(),\n format: 'html',\n interactive: true\n }\n };\n }\n\n /**\n * Generate recommendations\n */\n private async generateRecommendations(session: DebugSession): Promise<string[]> {\n const recommendations: string[] = [];\n\n // Performance recommendations\n if (session.performance.averageIterationTime > 30000) { // > 30 seconds\n recommendations.push('Consider breaking down complex tasks into smaller iterations');\n }\n\n if (session.performance.contextEfficiency < 0.7) {\n recommendations.push('Optimize context management - consider using context budgeting');\n }\n\n // Success rate recommendations\n const successRate = session.iterations.filter(i => i.success).length / Math.max(1, session.iterations.length);\n if (successRate < 0.5) {\n recommendations.push('Low success rate detected - review task criteria and approach');\n }\n\n // Memory recommendations\n if (session.performance.peakMemory > 500 * 1024 * 1024) { // > 500MB\n recommendations.push('High memory usage detected - investigate memory leaks');\n }\n\n return recommendations;\n }\n\n /**\n * Export report in specified format\n */\n private async exportReport(report: DebugReport): Promise<string> {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const filename = `ralph-debug-${report.loopId}-${timestamp}`;\n \n let content: string;\n let extension: string;\n\n switch (this.config.exportFormat) {\n case 'json':\n content = JSON.stringify(report, null, 2);\n extension = 'json';\n break;\n case 'markdown':\n content = this.generateMarkdownReport(report);\n extension = 'md';\n break;\n case 'html':\n default:\n content = this.generateHTMLReport(report);\n extension = 'html';\n break;\n }\n\n const exportPath = path.join('.ralph-debug', `${filename}.${extension}`);\n await fs.mkdir(path.dirname(exportPath), { recursive: true });\n await fs.writeFile(exportPath, content);\n\n return exportPath;\n }\n\n // Helper methods\n private determineIterationPhase(ralphDir: string): 'starting' | 'working' | 'reviewing' | 'completed' {\n // Determine current phase based on file states\n return 'working'; // Simplified implementation\n }\n\n private async calculateContextSize(ralphDir: string): Promise<number> {\n try {\n const feedbackPath = path.join(ralphDir, 'feedback.txt');\n const feedback = await fs.readFile(feedbackPath, 'utf8');\n return feedback.length;\n } catch {\n return 0;\n }\n }\n\n private captureStackTrace(): string {\n const stack = new Error().stack || '';\n return stack.split('\\n').slice(1, 6).join('\\n'); // First 5 stack frames\n }\n\n private findConsecutiveFailures(iterations: IterationTrace[]): number[] {\n const failures: number[] = [];\n let currentStreak = 0;\n\n for (const iteration of iterations) {\n if (!iteration.success) {\n currentStreak++;\n } else {\n if (currentStreak > 0) {\n failures.push(currentStreak);\n }\n currentStreak = 0;\n }\n }\n\n if (currentStreak > 0) {\n failures.push(currentStreak);\n }\n\n return failures;\n }\n\n private calculateGrowthRate(sizes: number[]): number {\n if (sizes.length < 2) return 0;\n \n const first = sizes[0];\n const last = sizes[sizes.length - 1];\n \n return first > 0 ? (last - first) / first : 0;\n }\n\n private calculateMemoryEfficiency(memoryUsage: number[]): number {\n if (memoryUsage.length < 2) return 1;\n \n const min = Math.min(...memoryUsage);\n const max = Math.max(...memoryUsage);\n \n return max > 0 ? min / max : 1;\n }\n\n private generateTimelineHTML(timeline: any): string {\n // Generate interactive HTML timeline\n return `\n<!DOCTYPE html>\n<html>\n<head>\n <title>${timeline.title}</title>\n <script src=\"https://d3js.org/d3.v7.min.js\"></script>\n <style>\n body { font-family: Arial, sans-serif; margin: 20px; }\n .timeline { margin: 20px 0; }\n .iteration { margin: 10px 0; padding: 10px; border-left: 4px solid #ccc; }\n .success { border-left-color: #4CAF50; }\n .failure { border-left-color: #F44336; }\n </style>\n</head>\n<body>\n <h1>${timeline.title}</h1>\n <div class=\"timeline\">\n ${timeline.iterations.map((iter: any) => `\n <div class=\"iteration ${iter.success ? 'success' : 'failure'}\">\n <h3>Iteration ${iter.iteration}</h3>\n <p>Duration: ${iter.duration}ms</p>\n <p>Changes: ${iter.changes} | Errors: ${iter.errors}</p>\n <p>Context Size: ${iter.contextSize}</p>\n </div>\n `).join('')}\n </div>\n</body>\n</html>\n `;\n }\n\n private generateVisualizationHTML(session: DebugSession): string {\n // Generate comprehensive visualization\n return `\n<!DOCTYPE html>\n<html>\n<head>\n <title>Ralph Loop Visualization - ${session.loopId}</title>\n <script src=\"https://d3js.org/d3.v7.min.js\"></script>\n <style>\n body { font-family: Arial, sans-serif; margin: 20px; }\n .chart { margin: 20px 0; }\n .metric { display: inline-block; margin: 10px; padding: 10px; border: 1px solid #ccc; }\n </style>\n</head>\n<body>\n <h1>Ralph Loop Debug Visualization</h1>\n <div id=\"metrics\">\n <div class=\"metric\">\n <h3>Iterations</h3>\n <p>${session.iterations.length}</p>\n </div>\n <div class=\"metric\">\n <h3>Avg Time</h3>\n <p>${Math.round(session.performance.averageIterationTime)}ms</p>\n </div>\n <div class=\"metric\">\n <h3>Context Efficiency</h3>\n <p>${Math.round(session.performance.contextEfficiency * 100)}%</p>\n </div>\n </div>\n <div id=\"timeline\" class=\"chart\"></div>\n <script>\n // D3.js visualization code would go here\n console.log('Visualization data:', ${JSON.stringify(session)});\n </script>\n</body>\n</html>\n `;\n }\n\n private generateMarkdownReport(report: DebugReport): string {\n return `\n# Ralph Loop Debug Report\n\n**Loop ID:** ${report.loopId}\n**Generated:** ${new Date(report.generatedAt).toLocaleString()}\n\n## Summary\n- **Total Iterations:** ${report.summary.totalIterations}\n- **Success Rate:** ${Math.round(report.summary.successRate * 100)}%\n- **Total Duration:** ${report.summary.totalDuration}ms\n- **Average Iteration Time:** ${Math.round(report.summary.averageIterationTime)}ms\n\n## Performance Analysis\n- **Peak Memory:** ${Math.round(report.performanceAnalysis.resourceUtilization.memory / 1024 / 1024)}MB\n- **Context Efficiency:** ${Math.round(report.performanceAnalysis.resourceUtilization.context * 100)}%\n\n## Recommendations\n${report.recommendations.map(r => `- ${r}`).join('\\n')}\n `;\n }\n\n private generateHTMLReport(report: DebugReport): string {\n return `\n<!DOCTYPE html>\n<html>\n<head>\n <title>Ralph Debug Report - ${report.loopId}</title>\n <style>\n body { font-family: Arial, sans-serif; max-width: 1200px; margin: 0 auto; padding: 20px; }\n .summary { background: #f5f5f5; padding: 20px; border-radius: 8px; margin: 20px 0; }\n .metric { display: inline-block; margin: 10px; padding: 15px; background: white; border-radius: 4px; }\n .recommendations { background: #e3f2fd; padding: 15px; border-radius: 4px; }\n </style>\n</head>\n<body>\n <h1>Ralph Loop Debug Report</h1>\n <div class=\"summary\">\n <h2>Executive Summary</h2>\n <div class=\"metric\">\n <h3>${report.summary.totalIterations}</h3>\n <p>Total Iterations</p>\n </div>\n <div class=\"metric\">\n <h3>${Math.round(report.summary.successRate * 100)}%</h3>\n <p>Success Rate</p>\n </div>\n <div class=\"metric\">\n <h3>${Math.round(report.summary.averageIterationTime)}ms</h3>\n <p>Avg Iteration Time</p>\n </div>\n </div>\n \n <div class=\"recommendations\">\n <h2>Recommendations</h2>\n <ul>\n ${report.recommendations.map(r => `<li>${r}</li>`).join('')}\n </ul>\n </div>\n</body>\n</html>\n `;\n }\n\n /**\n * Stop debug session and cleanup\n */\n async stopDebugSession(loopId: string): Promise<void> {\n const session = this.activeSessions.get(loopId);\n if (!session) return;\n\n // Stop real-time monitoring\n if ((session as any).monitoringInterval) {\n clearInterval((session as any).monitoringInterval);\n }\n\n // Generate final report\n await this.generateDebugReport(loopId);\n\n this.activeSessions.delete(loopId);\n logger.info('Debug session stopped', { loopId });\n }\n}\n\n// Export default instance\nexport const ralphDebugger = new RalphDebugger();"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -15,7 +15,7 @@ import { existsSync, mkdirSync } from "fs";
15
15
  import {
16
16
  LinearTaskManager
17
17
  } from "../features/tasks/linear-task-manager.js";
18
- import { FrameManager } from "../core/context/frame-manager.js";
18
+ import { FrameManager } from "../core/context/index.js";
19
19
  import { AgentTaskManager } from "../agents/core/agent-task-manager.js";
20
20
  import { logger } from "../core/monitoring/logger.js";
21
21
  const PROJECT_ROOT = process.env["STACKMEMORY_PROJECT"] || process.cwd();