@stackmemoryai/stackmemory 0.3.25 → 0.4.0

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.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/features/tui/swarm-monitor.ts"],
4
+ "sourcesContent": ["/**\n * Real-time TUI for monitoring Ralph Swarm operations\n * Tracks commits, status, agents, and lines edited per agent\n */\n\nimport blessed from 'blessed';\nimport { logger } from '../../core/monitoring/logger.js';\nimport { SwarmCoordinator } from '../../integrations/ralph/swarm/swarm-coordinator.js';\nimport { SwarmDashboard } from '../../integrations/ralph/monitoring/swarm-dashboard.js';\nimport { SwarmRegistry } from '../../integrations/ralph/monitoring/swarm-registry.js';\nimport { execSync } from 'child_process';\n\nexport interface SwarmCommitMetrics {\n agentId: string;\n role: string;\n commits: Array<{\n hash: string;\n message: string;\n timestamp: number;\n linesAdded: number;\n linesDeleted: number;\n filesChanged: number;\n }>;\n totalCommits: number;\n totalLinesAdded: number;\n totalLinesDeleted: number;\n lastActivity: number;\n}\n\nexport interface SwarmStatus {\n swarmId: string;\n status: 'active' | 'idle' | 'completed' | 'error';\n startTime: number;\n uptime: number;\n agents: Array<{\n id: string;\n role: string;\n status: string;\n currentTask?: string;\n iteration: number;\n lastActivity: number;\n }>;\n performance: {\n throughput: number;\n efficiency: number;\n totalTasks: number;\n completedTasks: number;\n };\n}\n\nexport class SwarmTUI {\n private screen: blessed.Widgets.Screen;\n private commitsTable: blessed.Widgets.TableElement;\n private statusBox: blessed.Widgets.BoxElement;\n private agentsTable: blessed.Widgets.TableElement;\n private metricsBox: blessed.Widgets.BoxElement;\n private logBox: blessed.Widgets.LogElement;\n \n private swarmCoordinator: SwarmCoordinator | null = null;\n private swarmDashboard: SwarmDashboard | null = null;\n private refreshInterval: NodeJS.Timeout | null = null;\n private commitMetrics: Map<string, SwarmCommitMetrics> = new Map();\n \n constructor() {\n this.screen = blessed.screen({\n smartCSR: true,\n title: 'Ralph Swarm Monitor'\n });\n \n this.createUI();\n this.setupKeyHandlers();\n \n logger.info('SwarmTUI initialized');\n }\n\n private createUI(): void {\n // Main layout container\n const container = blessed.box({\n parent: this.screen,\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n style: {\n bg: 'black'\n }\n });\n\n // Title bar\n blessed.box({\n parent: container,\n top: 0,\n left: 0,\n width: '100%',\n height: 3,\n content: '\uD83E\uDDBE Ralph Swarm Monitor - Real-time Swarm Operations',\n style: {\n bg: 'blue',\n fg: 'white',\n bold: true\n },\n border: {\n type: 'line'\n }\n });\n\n // Status box (top right)\n this.statusBox = blessed.box({\n parent: container,\n top: 3,\n left: '50%',\n width: '50%',\n height: 8,\n label: ' Swarm Status ',\n content: 'No active swarm',\n style: {\n bg: 'black',\n fg: 'white'\n },\n border: {\n type: 'line',\n fg: 'cyan'\n }\n });\n\n // Metrics box (top left)\n this.metricsBox = blessed.box({\n parent: container,\n top: 3,\n left: 0,\n width: '50%',\n height: 8,\n label: ' Performance Metrics ',\n content: 'Waiting for data...',\n style: {\n bg: 'black',\n fg: 'white'\n },\n border: {\n type: 'line',\n fg: 'green'\n }\n });\n\n // Agents table (middle left)\n this.agentsTable = blessed.table({\n parent: container,\n top: 11,\n left: 0,\n width: '50%',\n height: 12,\n label: ' Active Agents ',\n style: {\n bg: 'black',\n fg: 'white',\n header: {\n bg: 'blue',\n fg: 'white',\n bold: true\n },\n cell: {\n selected: {\n bg: 'blue',\n fg: 'white'\n }\n }\n },\n border: {\n type: 'line',\n fg: 'yellow'\n },\n data: [\n ['Role', 'Status', 'Iteration', 'Task', 'Last Active']\n ]\n });\n\n // Commits table (middle right)\n this.commitsTable = blessed.table({\n parent: container,\n top: 11,\n left: '50%',\n width: '50%',\n height: 12,\n label: ' Recent Commits ',\n style: {\n bg: 'black',\n fg: 'white',\n header: {\n bg: 'blue',\n fg: 'white',\n bold: true\n },\n cell: {\n selected: {\n bg: 'blue',\n fg: 'white'\n }\n }\n },\n border: {\n type: 'line',\n fg: 'magenta'\n },\n data: [\n ['Agent', 'Message', 'Lines +/-', 'Time']\n ]\n });\n\n // Log output (bottom)\n this.logBox = blessed.log({\n parent: container,\n top: 23,\n left: 0,\n width: '100%',\n height: '100%-23',\n label: ' Swarm Logs ',\n style: {\n bg: 'black',\n fg: 'white'\n },\n border: {\n type: 'line',\n fg: 'white'\n },\n scrollable: true,\n alwaysScroll: true,\n mouse: true\n });\n\n // Help text\n blessed.box({\n parent: container,\n bottom: 0,\n left: 0,\n width: '100%',\n height: 1,\n content: 'Press q to quit, r to refresh, s to start swarm, t to stop swarm',\n style: {\n bg: 'white',\n fg: 'black'\n }\n });\n }\n\n private setupKeyHandlers(): void {\n this.screen.key(['escape', 'q', 'C-c'], () => {\n this.cleanup();\n process.exit(0);\n });\n\n this.screen.key(['r'], () => {\n this.refreshData();\n this.logBox.log('Manual refresh triggered');\n });\n\n this.screen.key(['s'], () => {\n this.logBox.log('Start swarm command - feature coming soon');\n });\n\n this.screen.key(['t'], () => {\n this.logBox.log('Stop swarm command - feature coming soon');\n });\n }\n\n /**\n * Initialize swarm monitoring\n */\n async initialize(swarmCoordinator?: SwarmCoordinator, swarmId?: string): Promise<void> {\n try {\n // Connect to existing swarm if ID provided\n if (swarmId) {\n const registry = SwarmRegistry.getInstance();\n const swarm = registry.getSwarm(swarmId);\n if (swarm) {\n this.swarmCoordinator = swarm.coordinator;\n this.logBox.log(`Connected to swarm: ${swarmId}`);\n } else {\n this.logBox.log(`Swarm not found: ${swarmId}`);\n }\n } else if (swarmCoordinator) {\n this.swarmCoordinator = swarmCoordinator;\n } else {\n // Auto-detect active swarms\n const registry = SwarmRegistry.getInstance();\n const activeSwarms = registry.listActiveSwarms();\n if (activeSwarms.length > 0) {\n this.swarmCoordinator = activeSwarms[0].coordinator;\n this.logBox.log(`Auto-connected to swarm: ${activeSwarms[0].id}`);\n }\n }\n\n if (this.swarmCoordinator) {\n this.swarmDashboard = new SwarmDashboard(this.swarmCoordinator);\n this.swarmDashboard.startMonitoring(2000); // 2 second refresh\n \n // Listen to swarm events\n this.swarmDashboard.on('metricsUpdated', (metrics) => {\n this.updateUI(metrics);\n });\n }\n\n // Start refresh interval\n this.refreshInterval = setInterval(() => {\n this.refreshData();\n }, 3000);\n\n this.logBox.log('SwarmTUI monitoring initialized');\n } catch (error: unknown) {\n logger.error('Failed to initialize SwarmTUI', error as Error);\n this.logBox.log(`Error: ${(error as Error).message}`);\n }\n }\n\n /**\n * Start the TUI display\n */\n start(): void {\n this.screen.render();\n this.logBox.log('Ralph Swarm Monitor started');\n this.logBox.log('Monitoring for active swarms...');\n }\n\n /**\n * Refresh all data\n */\n private async refreshData(): Promise<void> {\n try {\n // Update commit metrics\n await this.updateCommitMetrics();\n \n // Update swarm status if coordinator available\n if (this.swarmCoordinator) {\n const status = this.getSwarmStatus();\n this.updateStatusDisplay(status);\n } else {\n // Try to detect active swarms\n await this.detectActiveSwarms();\n }\n \n this.screen.render();\n } catch (error: unknown) {\n logger.error('Failed to refresh TUI data', error as Error);\n this.logBox.log(`Refresh error: ${(error as Error).message}`);\n }\n }\n\n /**\n * Update commit metrics for all agents\n */\n private async updateCommitMetrics(): Promise<void> {\n try {\n // Get recent commits from git log\n const gitLog = execSync(\n 'git log --oneline --since=\"1 hour ago\" --pretty=format:\"%H|%an|%s|%ct\" --numstat',\n { encoding: 'utf8', cwd: process.cwd() }\n );\n\n const commits = this.parseGitCommits(gitLog);\n this.updateCommitsTable(commits);\n \n } catch (error: unknown) {\n // Git might fail if no commits, that's okay\n this.logBox.log('No recent commits found');\n }\n }\n\n /**\n * Parse git log output into commit data\n */\n private parseGitCommits(gitLog: string): Array<{\n hash: string;\n agent: string;\n message: string;\n timestamp: number;\n linesAdded: number;\n linesDeleted: number;\n }> {\n const commits = [];\n const lines = gitLog.split('\\n').filter(Boolean);\n \n let currentCommit: any = null;\n \n for (const line of lines) {\n if (line.includes('|')) {\n // Commit info line\n const [hash, author, message, timestamp] = line.split('|');\n currentCommit = {\n hash: hash.substring(0, 8),\n agent: this.extractAgentFromAuthor(author),\n message: message.substring(0, 50),\n timestamp: parseInt(timestamp),\n linesAdded: 0,\n linesDeleted: 0\n };\n } else if (currentCommit && line.match(/^\\d+\\s+\\d+/)) {\n // Stat line (added/deleted)\n const [added, deleted] = line.split('\\t')[0].split(' ');\n currentCommit.linesAdded += parseInt(added) || 0;\n currentCommit.linesDeleted += parseInt(deleted) || 0;\n \n commits.push({ ...currentCommit });\n currentCommit = null;\n }\n }\n \n return commits.slice(0, 10); // Show last 10 commits\n }\n\n /**\n * Extract agent info from git author\n */\n private extractAgentFromAuthor(author: string): string {\n // Look for [agent_role] pattern in commit author or message\n const agentMatch = author.match(/\\[(\\w+)\\]/);\n if (agentMatch) {\n return agentMatch[1];\n }\n \n // Fallback to checking if author contains known agent roles\n const roles = ['developer', 'tester', 'optimizer', 'documenter', 'architect'];\n for (const role of roles) {\n if (author.toLowerCase().includes(role)) {\n return role;\n }\n }\n \n return 'user';\n }\n\n /**\n * Update commits table display\n */\n private updateCommitsTable(commits: any[]): void {\n const tableData = [\n ['Agent', 'Message', 'Lines +/-', 'Time']\n ];\n\n for (const commit of commits) {\n const timeAgo = this.formatTimeAgo(commit.timestamp * 1000);\n const linesChange = `+${commit.linesAdded}/-${commit.linesDeleted}`;\n \n tableData.push([\n commit.agent,\n commit.message,\n linesChange,\n timeAgo\n ]);\n }\n\n this.commitsTable.setData(tableData);\n }\n\n /**\n * Get current swarm status\n */\n private getSwarmStatus(): SwarmStatus | null {\n if (!this.swarmCoordinator) return null;\n\n const usage = this.swarmCoordinator.getResourceUsage();\n const swarmState = (this.swarmCoordinator as any).swarmState;\n \n if (!swarmState) return null;\n\n return {\n swarmId: swarmState.id,\n status: swarmState.status,\n startTime: swarmState.startTime,\n uptime: Date.now() - swarmState.startTime,\n agents: usage.activeAgents ? Array.from((this.swarmCoordinator as any).activeAgents?.values() || []).map((agent: any) => ({\n id: agent.id,\n role: agent.role,\n status: agent.status,\n currentTask: agent.currentTask,\n iteration: agent.performance?.tasksCompleted || 0,\n lastActivity: agent.performance?.lastFreshStart || Date.now()\n })) : [],\n performance: {\n throughput: swarmState.performance?.throughput || 0,\n efficiency: swarmState.performance?.efficiency || 0,\n totalTasks: swarmState.totalTaskCount || 0,\n completedTasks: swarmState.completedTaskCount || 0\n }\n };\n }\n\n /**\n * Update status display\n */\n private updateStatusDisplay(status: SwarmStatus | null): void {\n if (!status) {\n this.statusBox.setContent('No active swarm detected');\n this.agentsTable.setData([['Role', 'Status', 'Iteration', 'Task', 'Last Active']]);\n this.metricsBox.setContent('Waiting for swarm data...');\n return;\n }\n\n // Update status box\n const uptimeStr = this.formatDuration(status.uptime);\n const statusContent = `Swarm: ${status.swarmId.substring(0, 8)}\nStatus: ${status.status.toUpperCase()}\nUptime: ${uptimeStr}\nAgents: ${status.agents.length}`;\n \n this.statusBox.setContent(statusContent);\n\n // Update agents table\n const agentData = [['Role', 'Status', 'Iteration', 'Task', 'Last Active']];\n for (const agent of status.agents) {\n const lastActivity = this.formatTimeAgo(agent.lastActivity);\n const task = agent.currentTask ? agent.currentTask.substring(0, 20) : 'idle';\n \n agentData.push([\n agent.role,\n agent.status,\n agent.iteration.toString(),\n task,\n lastActivity\n ]);\n }\n this.agentsTable.setData(agentData);\n\n // Update metrics box\n const metricsContent = `Throughput: ${status.performance.throughput.toFixed(2)} tasks/min\nEfficiency: ${(status.performance.efficiency * 100).toFixed(1)}%\nTasks: ${status.performance.completedTasks}/${status.performance.totalTasks}\nSuccess Rate: ${status.performance.efficiency > 0 ? (status.performance.efficiency * 100).toFixed(1) : 'N/A'}%`;\n \n this.metricsBox.setContent(metricsContent);\n }\n\n /**\n * Update UI with metrics from dashboard\n */\n private updateUI(metrics: any): void {\n this.logBox.log(`Metrics updated: ${metrics.status} - ${metrics.activeAgents} agents`);\n }\n\n /**\n * Detect active swarms in the system\n */\n private async detectActiveSwarms(): Promise<void> {\n try {\n const registry = SwarmRegistry.getInstance();\n const activeSwarms = registry.listActiveSwarms();\n const stats = registry.getStatistics();\n \n if (activeSwarms.length > 0) {\n let statusContent = `Available Swarms (${activeSwarms.length}):\\n`;\n for (const swarm of activeSwarms.slice(0, 3)) {\n const uptime = this.formatDuration(Date.now() - swarm.startTime);\n statusContent += `\u2022 ${swarm.id.substring(0, 8)}: ${swarm.status} (${uptime})\\n`;\n }\n if (activeSwarms.length > 3) {\n statusContent += `... and ${activeSwarms.length - 3} more`;\n }\n this.statusBox.setContent(statusContent);\n this.logBox.log(`Found ${activeSwarms.length} active swarms in registry`);\n } else {\n // Check for Ralph processes as fallback\n const ralphProcesses = execSync('ps aux | grep \"ralph\" | grep -v grep', { encoding: 'utf8' });\n \n if (ralphProcesses.trim()) {\n this.logBox.log('Detected Ralph processes running');\n this.statusBox.setContent('External Ralph processes detected\\n(Use swarm coordinator for full monitoring)');\n } else {\n this.statusBox.setContent(`No active swarms detected\nTotal swarms: ${stats.totalSwarms}\nCompleted: ${stats.completedSwarms}\n\nRun: stackmemory ralph swarm <task>`);\n }\n }\n } catch {\n // No processes found, that's fine\n }\n }\n\n /**\n * Format time ago string\n */\n private formatTimeAgo(timestamp: number): string {\n const diff = Date.now() - timestamp;\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) return `${days}d ago`;\n if (hours > 0) return `${hours}h ago`;\n if (minutes > 0) return `${minutes}m ago`;\n return 'just now';\n }\n\n /**\n * Format duration string\n */\n private formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n\n if (hours > 0) return `${hours}h ${minutes % 60}m`;\n if (minutes > 0) return `${minutes}m ${seconds % 60}s`;\n return `${seconds}s`;\n }\n\n /**\n * Cleanup resources\n */\n private cleanup(): void {\n if (this.refreshInterval) {\n clearInterval(this.refreshInterval);\n }\n \n if (this.swarmDashboard) {\n this.swarmDashboard.stopMonitoring();\n }\n \n logger.info('SwarmTUI cleaned up');\n }\n}\n\nexport default SwarmTUI;"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,406 @@
1
+ import { EventEmitter } from "events";
2
+ import { logger } from "../../../core/monitoring/logger.js";
3
+ class EnhancedCoordinationSystem extends EventEmitter {
4
+ agents = /* @__PURE__ */ new Map();
5
+ messageQueue = [];
6
+ dependencies = /* @__PURE__ */ new Map();
7
+ conflicts = /* @__PURE__ */ new Map();
8
+ coordinationRules = [];
9
+ constructor() {
10
+ super();
11
+ this.setupDefaultRules();
12
+ }
13
+ /**
14
+ * Register an agent with the coordination system
15
+ */
16
+ registerAgent(agent) {
17
+ this.agents.set(agent.id, agent);
18
+ logger.info(`Agent ${agent.role} registered for coordination`);
19
+ this.broadcastMessage({
20
+ id: this.generateId(),
21
+ from: "system",
22
+ to: "broadcast",
23
+ type: "status_update",
24
+ content: { type: "agent_joined", agent: agent.role },
25
+ timestamp: Date.now(),
26
+ priority: "normal"
27
+ });
28
+ }
29
+ /**
30
+ * Send message between agents
31
+ */
32
+ sendMessage(message) {
33
+ const fullMessage = {
34
+ ...message,
35
+ id: this.generateId(),
36
+ timestamp: Date.now()
37
+ };
38
+ this.messageQueue.push(fullMessage);
39
+ this.routeMessage(fullMessage);
40
+ this.emit("messageReceived", fullMessage);
41
+ }
42
+ /**
43
+ * Broadcast message to all agents
44
+ */
45
+ broadcastMessage(message) {
46
+ this.sendMessage({
47
+ ...message,
48
+ to: "broadcast"
49
+ });
50
+ }
51
+ /**
52
+ * Request help from other agents
53
+ */
54
+ requestHelp(fromAgent, helpType, context) {
55
+ const suitableAgents = this.findSuitableHelpers(helpType);
56
+ this.sendMessage({
57
+ from: fromAgent,
58
+ to: suitableAgents,
59
+ type: "help_request",
60
+ content: {
61
+ helpType,
62
+ context,
63
+ requesterCapabilities: this.agents.get(fromAgent)?.capabilities || []
64
+ },
65
+ priority: "high"
66
+ });
67
+ }
68
+ /**
69
+ * Add task dependency
70
+ */
71
+ addDependency(dependency) {
72
+ this.dependencies.set(dependency.taskId, dependency);
73
+ this.updateCriticalPath();
74
+ logger.info(
75
+ `Added dependency: ${dependency.taskId} depends on ${dependency.dependsOn.join(", ")}`
76
+ );
77
+ }
78
+ /**
79
+ * Resolve conflicts automatically
80
+ */
81
+ async resolveConflict(conflictId) {
82
+ const conflict = this.conflicts.get(conflictId);
83
+ if (!conflict) return false;
84
+ try {
85
+ switch (conflict.resolutionStrategy) {
86
+ case "voting":
87
+ conflict.resolution = await this.resolveByVoting(conflict);
88
+ break;
89
+ case "expertise_based":
90
+ conflict.resolution = await this.resolveByExpertise(conflict);
91
+ break;
92
+ case "random":
93
+ conflict.resolution = await this.resolveRandomly(conflict);
94
+ break;
95
+ case "manager_override":
96
+ conflict.resolution = await this.resolveByManagerOverride(conflict);
97
+ break;
98
+ }
99
+ conflict.status = "resolved";
100
+ this.conflicts.set(conflictId, conflict);
101
+ this.broadcastMessage({
102
+ from: "system",
103
+ to: conflict.involvedAgents,
104
+ type: "status_update",
105
+ content: {
106
+ type: "conflict_resolved",
107
+ conflictId,
108
+ resolution: conflict.resolution
109
+ },
110
+ priority: "high"
111
+ });
112
+ return true;
113
+ } catch (error) {
114
+ conflict.status = "escalated";
115
+ logger.error(`Failed to resolve conflict ${conflictId}:`, error);
116
+ return false;
117
+ }
118
+ }
119
+ /**
120
+ * Get optimal task execution order considering dependencies
121
+ */
122
+ getOptimalExecutionOrder(tasks) {
123
+ const graph = this.buildDependencyGraph(tasks);
124
+ return this.topologicalSort(graph, tasks);
125
+ }
126
+ /**
127
+ * Detect and report coordination patterns
128
+ */
129
+ analyzeCoordinationPatterns() {
130
+ const patterns = {
131
+ communicationFrequency: /* @__PURE__ */ new Map(),
132
+ helpRequestPatterns: [],
133
+ conflictFrequency: /* @__PURE__ */ new Map(),
134
+ bottlenecks: this.identifyBottlenecks()
135
+ };
136
+ for (const message of this.messageQueue) {
137
+ const key = `${message.from}-${message.type}`;
138
+ patterns.communicationFrequency.set(
139
+ key,
140
+ (patterns.communicationFrequency.get(key) || 0) + 1
141
+ );
142
+ }
143
+ for (const conflict of this.conflicts.values()) {
144
+ patterns.conflictFrequency.set(
145
+ conflict.type,
146
+ (patterns.conflictFrequency.get(conflict.type) || 0) + 1
147
+ );
148
+ }
149
+ return patterns;
150
+ }
151
+ /**
152
+ * Load balancing recommendations
153
+ */
154
+ getLoadBalancingRecommendations() {
155
+ const recommendations = {
156
+ overloadedAgents: [],
157
+ underutilizedAgents: [],
158
+ suggestedReassignments: []
159
+ };
160
+ for (const agent of this.agents.values()) {
161
+ const workload = this.calculateAgentWorkload(agent);
162
+ if (workload > 0.8) {
163
+ recommendations.overloadedAgents.push(agent.id);
164
+ } else if (workload < 0.3) {
165
+ recommendations.underutilizedAgents.push(agent.id);
166
+ }
167
+ }
168
+ for (const overloaded of recommendations.overloadedAgents) {
169
+ for (const underutilized of recommendations.underutilizedAgents) {
170
+ const compatibility = this.checkAgentCompatibility(
171
+ overloaded,
172
+ underutilized
173
+ );
174
+ if (compatibility.score > 0.7) {
175
+ recommendations.suggestedReassignments.push({
176
+ fromAgent: overloaded,
177
+ toAgent: underutilized,
178
+ taskType: compatibility.bestTaskType,
179
+ reason: `Load balancing: ${compatibility.reason}`
180
+ });
181
+ }
182
+ }
183
+ }
184
+ return recommendations;
185
+ }
186
+ routeMessage(message) {
187
+ if (message.to === "broadcast") {
188
+ for (const agentId of this.agents.keys()) {
189
+ if (agentId !== message.from) {
190
+ this.deliverMessage(agentId, message);
191
+ }
192
+ }
193
+ } else {
194
+ for (const agentId of message.to) {
195
+ this.deliverMessage(agentId, message);
196
+ }
197
+ }
198
+ this.applyCoordinationRules(message);
199
+ }
200
+ deliverMessage(agentId, message) {
201
+ const agent = this.agents.get(agentId);
202
+ if (agent) {
203
+ logger.debug(`Message delivered to ${agent.role}: ${message.type}`);
204
+ }
205
+ }
206
+ findSuitableHelpers(helpType) {
207
+ const helpers = [];
208
+ for (const agent of this.agents.values()) {
209
+ if (this.canProvideHelp(agent, helpType)) {
210
+ helpers.push(agent.id);
211
+ }
212
+ }
213
+ return helpers;
214
+ }
215
+ canProvideHelp(agent, helpType) {
216
+ const capabilities = agent.capabilities || [];
217
+ switch (helpType) {
218
+ case "code_review":
219
+ return capabilities.includes("code_review") || agent.role === "reviewer";
220
+ case "debugging":
221
+ return capabilities.includes("debugging") || agent.role === "developer";
222
+ case "testing":
223
+ return capabilities.includes("testing") || agent.role === "tester";
224
+ case "optimization":
225
+ return capabilities.includes("optimization") || agent.role === "optimizer";
226
+ default:
227
+ return false;
228
+ }
229
+ }
230
+ async resolveByVoting(conflict) {
231
+ const votes = /* @__PURE__ */ new Map();
232
+ for (const agentId of conflict.involvedAgents) {
233
+ const agent = this.agents.get(agentId);
234
+ if (agent) {
235
+ votes.set(agentId, Math.random() > 0.5 ? "option_a" : "option_b");
236
+ }
237
+ }
238
+ const results = /* @__PURE__ */ new Map();
239
+ for (const vote of votes.values()) {
240
+ results.set(vote, (results.get(vote) || 0) + 1);
241
+ }
242
+ return Array.from(results.entries()).reduce(
243
+ (a, b) => a[1] > b[1] ? a : b
244
+ )[0];
245
+ }
246
+ async resolveByExpertise(conflict) {
247
+ let bestAgent = null;
248
+ let bestExpertise = 0;
249
+ for (const agentId of conflict.involvedAgents) {
250
+ const agent = this.agents.get(agentId);
251
+ if (agent) {
252
+ const expertise = this.calculateExpertise(agent, conflict.type);
253
+ if (expertise > bestExpertise) {
254
+ bestExpertise = expertise;
255
+ bestAgent = agent;
256
+ }
257
+ }
258
+ }
259
+ return {
260
+ resolutionSource: bestAgent?.id,
261
+ method: "expertise_based",
262
+ expertiseScore: bestExpertise
263
+ };
264
+ }
265
+ async resolveRandomly(conflict) {
266
+ const options = ["option_a", "option_b", "compromise"];
267
+ return options[Math.floor(Math.random() * options.length)];
268
+ }
269
+ async resolveByManagerOverride(conflict) {
270
+ const manager = Array.from(this.agents.values()).find(
271
+ (agent) => agent.role === "coordinator" || agent.role === "architect"
272
+ );
273
+ return {
274
+ resolutionSource: manager?.id || "system",
275
+ method: "manager_override"
276
+ };
277
+ }
278
+ calculateExpertise(agent, conflictType) {
279
+ const capabilities = agent.capabilities || [];
280
+ const performance = agent.performance;
281
+ let expertise = 0;
282
+ switch (conflictType) {
283
+ case "resource":
284
+ expertise += capabilities.includes("resource_optimization") ? 0.5 : 0;
285
+ break;
286
+ case "task_overlap":
287
+ expertise += capabilities.includes("coordination") ? 0.5 : 0;
288
+ break;
289
+ }
290
+ if (performance) {
291
+ expertise += performance.successRate * 0.3;
292
+ expertise += Math.min(performance.tasksCompleted / 10, 0.2);
293
+ }
294
+ return Math.min(expertise, 1);
295
+ }
296
+ buildDependencyGraph(tasks) {
297
+ const graph = /* @__PURE__ */ new Map();
298
+ for (const task of tasks) {
299
+ const deps = this.dependencies.get(task.id);
300
+ graph.set(task.id, deps?.dependsOn || []);
301
+ }
302
+ return graph;
303
+ }
304
+ topologicalSort(graph, tasks) {
305
+ const result = [];
306
+ const visited = /* @__PURE__ */ new Set();
307
+ const visiting = /* @__PURE__ */ new Set();
308
+ const visit = (taskId) => {
309
+ if (visited.has(taskId)) return;
310
+ if (visiting.has(taskId)) {
311
+ logger.warn(`Circular dependency detected involving task: ${taskId}`);
312
+ return;
313
+ }
314
+ visiting.add(taskId);
315
+ const deps = graph.get(taskId) || [];
316
+ for (const dep of deps) {
317
+ visit(dep);
318
+ }
319
+ visiting.delete(taskId);
320
+ visited.add(taskId);
321
+ const task = tasks.find((t) => t.id === taskId);
322
+ if (task) result.push(task);
323
+ };
324
+ for (const task of tasks) {
325
+ visit(task.id);
326
+ }
327
+ return result;
328
+ }
329
+ updateCriticalPath() {
330
+ logger.debug("Critical path updated");
331
+ }
332
+ identifyBottlenecks() {
333
+ const bottlenecks = [];
334
+ for (const [taskId, dep] of this.dependencies) {
335
+ if (dep.blockingFor.length > 2) {
336
+ bottlenecks.push(taskId);
337
+ }
338
+ }
339
+ return bottlenecks;
340
+ }
341
+ calculateAgentWorkload(agent) {
342
+ let workload = 0;
343
+ if (agent.status === "active") workload += 0.5;
344
+ if (agent.currentTask) workload += 0.3;
345
+ const recentMessages = this.messageQueue.filter(
346
+ (m) => (m.from === agent.id || Array.isArray(m.to) && m.to.includes(agent.id)) && Date.now() - m.timestamp < 3e5
347
+ // 5 minutes
348
+ );
349
+ workload += Math.min(recentMessages.length * 0.05, 0.2);
350
+ return Math.min(workload, 1);
351
+ }
352
+ checkAgentCompatibility(agent1Id, agent2Id) {
353
+ const agent1 = this.agents.get(agent1Id);
354
+ const agent2 = this.agents.get(agent2Id);
355
+ if (!agent1 || !agent2) {
356
+ return { score: 0, bestTaskType: "", reason: "Agent not found" };
357
+ }
358
+ const caps1 = new Set(agent1.capabilities || []);
359
+ const caps2 = new Set(agent2.capabilities || []);
360
+ const overlap = new Set([...caps1].filter((x) => caps2.has(x)));
361
+ const score = overlap.size / Math.max(caps1.size, caps2.size, 1);
362
+ return {
363
+ score,
364
+ bestTaskType: Array.from(overlap)[0] || "general",
365
+ reason: `Capability overlap: ${overlap.size} common skills`
366
+ };
367
+ }
368
+ applyCoordinationRules(message) {
369
+ for (const rule of this.coordinationRules) {
370
+ if (rule.condition(message)) {
371
+ rule.action(message, this);
372
+ }
373
+ }
374
+ }
375
+ setupDefaultRules() {
376
+ this.coordinationRules = [
377
+ {
378
+ id: "help_request_timeout",
379
+ condition: (msg) => msg.type === "help_request",
380
+ action: (msg, system) => {
381
+ setTimeout(() => {
382
+ system.broadcastMessage({
383
+ from: "system",
384
+ to: "broadcast",
385
+ type: "status_update",
386
+ content: {
387
+ type: "help_request_timeout",
388
+ originalRequest: msg.id
389
+ },
390
+ priority: "urgent"
391
+ });
392
+ }, 3e5);
393
+ }
394
+ }
395
+ ];
396
+ }
397
+ generateId() {
398
+ return `coord_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
399
+ }
400
+ }
401
+ var enhanced_coordination_default = EnhancedCoordinationSystem;
402
+ export {
403
+ EnhancedCoordinationSystem,
404
+ enhanced_coordination_default as default
405
+ };
406
+ //# sourceMappingURL=enhanced-coordination.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/integrations/ralph/coordination/enhanced-coordination.ts"],
4
+ "sourcesContent": ["/**\n * Enhanced Agent Coordination System\n * Provides advanced coordination patterns, conflict resolution, and inter-agent communication\n */\n\nimport { EventEmitter } from 'events';\nimport { logger } from '../../../core/monitoring/logger.js';\nimport { Agent, SwarmTask, CoordinationEvent } from '../types.js';\n\nexport interface CoordinationMessage {\n id: string;\n from: string; // agent ID\n to: string[] | 'broadcast'; // agent IDs or broadcast\n type:\n | 'status_update'\n | 'help_request'\n | 'resource_conflict'\n | 'task_handoff'\n | 'knowledge_share';\n content: any;\n timestamp: number;\n priority: 'low' | 'normal' | 'high' | 'urgent';\n}\n\nexport interface TaskDependency {\n taskId: string;\n dependsOn: string[];\n blockingFor: string[];\n estimatedCompletionTime: number;\n criticalPath: boolean;\n}\n\nexport interface ConflictResolution {\n id: string;\n type: 'resource' | 'task_overlap' | 'knowledge_conflict' | 'priority_dispute';\n involvedAgents: string[];\n description: string;\n resolutionStrategy:\n | 'voting'\n | 'expertise_based'\n | 'random'\n | 'manager_override';\n resolution: any;\n timestamp: number;\n status: 'pending' | 'resolved' | 'escalated';\n}\n\nexport class EnhancedCoordinationSystem extends EventEmitter {\n private agents: Map<string, Agent> = new Map();\n private messageQueue: CoordinationMessage[] = [];\n private dependencies: Map<string, TaskDependency> = new Map();\n private conflicts: Map<string, ConflictResolution> = new Map();\n private coordinationRules: CoordinationRule[] = [];\n\n constructor() {\n super();\n this.setupDefaultRules();\n }\n\n /**\n * Register an agent with the coordination system\n */\n registerAgent(agent: Agent): void {\n this.agents.set(agent.id, agent);\n logger.info(`Agent ${agent.role} registered for coordination`);\n\n // Notify other agents\n this.broadcastMessage({\n id: this.generateId(),\n from: 'system',\n to: 'broadcast',\n type: 'status_update',\n content: { type: 'agent_joined', agent: agent.role },\n timestamp: Date.now(),\n priority: 'normal',\n });\n }\n\n /**\n * Send message between agents\n */\n sendMessage(message: Omit<CoordinationMessage, 'id' | 'timestamp'>): void {\n const fullMessage: CoordinationMessage = {\n ...message,\n id: this.generateId(),\n timestamp: Date.now(),\n };\n\n this.messageQueue.push(fullMessage);\n this.routeMessage(fullMessage);\n this.emit('messageReceived', fullMessage);\n }\n\n /**\n * Broadcast message to all agents\n */\n broadcastMessage(\n message: Omit<CoordinationMessage, 'id' | 'timestamp'>\n ): void {\n this.sendMessage({\n ...message,\n to: 'broadcast',\n });\n }\n\n /**\n * Request help from other agents\n */\n requestHelp(fromAgent: string, helpType: string, context: any): void {\n const suitableAgents = this.findSuitableHelpers(helpType);\n\n this.sendMessage({\n from: fromAgent,\n to: suitableAgents,\n type: 'help_request',\n content: {\n helpType,\n context,\n requesterCapabilities: this.agents.get(fromAgent)?.capabilities || [],\n },\n priority: 'high',\n });\n }\n\n /**\n * Add task dependency\n */\n addDependency(dependency: TaskDependency): void {\n this.dependencies.set(dependency.taskId, dependency);\n this.updateCriticalPath();\n logger.info(\n `Added dependency: ${dependency.taskId} depends on ${dependency.dependsOn.join(', ')}`\n );\n }\n\n /**\n * Resolve conflicts automatically\n */\n async resolveConflict(conflictId: string): Promise<boolean> {\n const conflict = this.conflicts.get(conflictId);\n if (!conflict) return false;\n\n try {\n switch (conflict.resolutionStrategy) {\n case 'voting':\n conflict.resolution = await this.resolveByVoting(conflict);\n break;\n case 'expertise_based':\n conflict.resolution = await this.resolveByExpertise(conflict);\n break;\n case 'random':\n conflict.resolution = await this.resolveRandomly(conflict);\n break;\n case 'manager_override':\n conflict.resolution = await this.resolveByManagerOverride(conflict);\n break;\n }\n\n conflict.status = 'resolved';\n this.conflicts.set(conflictId, conflict);\n\n // Notify agents of resolution\n this.broadcastMessage({\n from: 'system',\n to: conflict.involvedAgents,\n type: 'status_update',\n content: {\n type: 'conflict_resolved',\n conflictId,\n resolution: conflict.resolution,\n },\n priority: 'high',\n });\n\n return true;\n } catch (error) {\n conflict.status = 'escalated';\n logger.error(`Failed to resolve conflict ${conflictId}:`, error as Error);\n return false;\n }\n }\n\n /**\n * Get optimal task execution order considering dependencies\n */\n getOptimalExecutionOrder(tasks: SwarmTask[]): SwarmTask[] {\n const graph = this.buildDependencyGraph(tasks);\n return this.topologicalSort(graph, tasks);\n }\n\n /**\n * Detect and report coordination patterns\n */\n analyzeCoordinationPatterns(): {\n communicationFrequency: Map<string, number>;\n helpRequestPatterns: any[];\n conflictFrequency: Map<string, number>;\n bottlenecks: string[];\n } {\n const patterns = {\n communicationFrequency: new Map<string, number>(),\n helpRequestPatterns: [],\n conflictFrequency: new Map<string, number>(),\n bottlenecks: this.identifyBottlenecks(),\n };\n\n // Analyze message patterns\n for (const message of this.messageQueue) {\n const key = `${message.from}-${message.type}`;\n patterns.communicationFrequency.set(\n key,\n (patterns.communicationFrequency.get(key) || 0) + 1\n );\n }\n\n // Analyze conflicts\n for (const conflict of this.conflicts.values()) {\n patterns.conflictFrequency.set(\n conflict.type,\n (patterns.conflictFrequency.get(conflict.type) || 0) + 1\n );\n }\n\n return patterns;\n }\n\n /**\n * Load balancing recommendations\n */\n getLoadBalancingRecommendations(): {\n overloadedAgents: string[];\n underutilizedAgents: string[];\n suggestedReassignments: Array<{\n fromAgent: string;\n toAgent: string;\n taskType: string;\n reason: string;\n }>;\n } {\n const recommendations = {\n overloadedAgents: [],\n underutilizedAgents: [],\n suggestedReassignments: [],\n };\n\n // Analyze agent workloads\n for (const agent of this.agents.values()) {\n const workload = this.calculateAgentWorkload(agent);\n\n if (workload > 0.8) {\n recommendations.overloadedAgents.push(agent.id);\n } else if (workload < 0.3) {\n recommendations.underutilizedAgents.push(agent.id);\n }\n }\n\n // Generate reassignment suggestions\n for (const overloaded of recommendations.overloadedAgents) {\n for (const underutilized of recommendations.underutilizedAgents) {\n const compatibility = this.checkAgentCompatibility(\n overloaded,\n underutilized\n );\n if (compatibility.score > 0.7) {\n recommendations.suggestedReassignments.push({\n fromAgent: overloaded,\n toAgent: underutilized,\n taskType: compatibility.bestTaskType,\n reason: `Load balancing: ${compatibility.reason}`,\n });\n }\n }\n }\n\n return recommendations;\n }\n\n private routeMessage(message: CoordinationMessage): void {\n if (message.to === 'broadcast') {\n // Route to all agents except sender\n for (const agentId of this.agents.keys()) {\n if (agentId !== message.from) {\n this.deliverMessage(agentId, message);\n }\n }\n } else {\n // Route to specific agents\n for (const agentId of message.to as string[]) {\n this.deliverMessage(agentId, message);\n }\n }\n\n // Apply coordination rules\n this.applyCoordinationRules(message);\n }\n\n private deliverMessage(agentId: string, message: CoordinationMessage): void {\n const agent = this.agents.get(agentId);\n if (agent) {\n // Store message for agent (in real implementation, would integrate with agent's message handler)\n logger.debug(`Message delivered to ${agent.role}: ${message.type}`);\n }\n }\n\n private findSuitableHelpers(helpType: string): string[] {\n const helpers: string[] = [];\n\n for (const agent of this.agents.values()) {\n if (this.canProvideHelp(agent, helpType)) {\n helpers.push(agent.id);\n }\n }\n\n return helpers;\n }\n\n private canProvideHelp(agent: Agent, helpType: string): boolean {\n // Check if agent has relevant capabilities\n const capabilities = agent.capabilities || [];\n\n switch (helpType) {\n case 'code_review':\n return (\n capabilities.includes('code_review') || agent.role === 'reviewer'\n );\n case 'debugging':\n return capabilities.includes('debugging') || agent.role === 'developer';\n case 'testing':\n return capabilities.includes('testing') || agent.role === 'tester';\n case 'optimization':\n return (\n capabilities.includes('optimization') || agent.role === 'optimizer'\n );\n default:\n return false;\n }\n }\n\n private async resolveByVoting(conflict: ConflictResolution): Promise<any> {\n // Simulate voting resolution\n const votes = new Map();\n for (const agentId of conflict.involvedAgents) {\n const agent = this.agents.get(agentId);\n if (agent) {\n // In real implementation, would request vote from agent\n votes.set(agentId, Math.random() > 0.5 ? 'option_a' : 'option_b');\n }\n }\n\n // Count votes\n const results = new Map();\n for (const vote of votes.values()) {\n results.set(vote, (results.get(vote) || 0) + 1);\n }\n\n // Return winning option\n return Array.from(results.entries()).reduce((a, b) =>\n a[1] > b[1] ? a : b\n )[0];\n }\n\n private async resolveByExpertise(conflict: ConflictResolution): Promise<any> {\n // Find most expert agent for the conflict type\n let bestAgent = null;\n let bestExpertise = 0;\n\n for (const agentId of conflict.involvedAgents) {\n const agent = this.agents.get(agentId);\n if (agent) {\n const expertise = this.calculateExpertise(agent, conflict.type);\n if (expertise > bestExpertise) {\n bestExpertise = expertise;\n bestAgent = agent;\n }\n }\n }\n\n return {\n resolutionSource: bestAgent?.id,\n method: 'expertise_based',\n expertiseScore: bestExpertise,\n };\n }\n\n private async resolveRandomly(conflict: ConflictResolution): Promise<any> {\n const options = ['option_a', 'option_b', 'compromise'];\n return options[Math.floor(Math.random() * options.length)];\n }\n\n private async resolveByManagerOverride(\n conflict: ConflictResolution\n ): Promise<any> {\n // Find coordinator or architect agent\n const manager = Array.from(this.agents.values()).find(\n (agent) => agent.role === 'coordinator' || agent.role === 'architect'\n );\n\n return {\n resolutionSource: manager?.id || 'system',\n method: 'manager_override',\n };\n }\n\n private calculateExpertise(agent: Agent, conflictType: string): number {\n // Calculate agent expertise for specific conflict type\n const capabilities = agent.capabilities || [];\n const performance = agent.performance;\n\n let expertise = 0;\n\n // Base expertise from capabilities\n switch (conflictType) {\n case 'resource':\n expertise += capabilities.includes('resource_optimization') ? 0.5 : 0;\n break;\n case 'task_overlap':\n expertise += capabilities.includes('coordination') ? 0.5 : 0;\n break;\n }\n\n // Add performance-based expertise\n if (performance) {\n expertise += performance.successRate * 0.3;\n expertise += Math.min(performance.tasksCompleted / 10, 0.2);\n }\n\n return Math.min(expertise, 1.0);\n }\n\n private buildDependencyGraph(tasks: SwarmTask[]): Map<string, string[]> {\n const graph = new Map<string, string[]>();\n\n for (const task of tasks) {\n const deps = this.dependencies.get(task.id);\n graph.set(task.id, deps?.dependsOn || []);\n }\n\n return graph;\n }\n\n private topologicalSort(\n graph: Map<string, string[]>,\n tasks: SwarmTask[]\n ): SwarmTask[] {\n const result: SwarmTask[] = [];\n const visited = new Set<string>();\n const visiting = new Set<string>();\n\n const visit = (taskId: string) => {\n if (visited.has(taskId)) return;\n if (visiting.has(taskId)) {\n logger.warn(`Circular dependency detected involving task: ${taskId}`);\n return;\n }\n\n visiting.add(taskId);\n const deps = graph.get(taskId) || [];\n\n for (const dep of deps) {\n visit(dep);\n }\n\n visiting.delete(taskId);\n visited.add(taskId);\n\n const task = tasks.find((t) => t.id === taskId);\n if (task) result.push(task);\n };\n\n for (const task of tasks) {\n visit(task.id);\n }\n\n return result;\n }\n\n private updateCriticalPath(): void {\n // Identify critical path through dependencies\n // Implementation would use network analysis algorithms\n logger.debug('Critical path updated');\n }\n\n private identifyBottlenecks(): string[] {\n const bottlenecks: string[] = [];\n\n // Find tasks with many dependencies\n for (const [taskId, dep] of this.dependencies) {\n if (dep.blockingFor.length > 2) {\n bottlenecks.push(taskId);\n }\n }\n\n return bottlenecks;\n }\n\n private calculateAgentWorkload(agent: Agent): number {\n // Calculate workload based on current tasks, message frequency, etc.\n let workload = 0;\n\n if (agent.status === 'active') workload += 0.5;\n if (agent.currentTask) workload += 0.3;\n\n // Add message handling workload\n const recentMessages = this.messageQueue.filter(\n (m) =>\n (m.from === agent.id ||\n (Array.isArray(m.to) && m.to.includes(agent.id))) &&\n Date.now() - m.timestamp < 300000 // 5 minutes\n );\n\n workload += Math.min(recentMessages.length * 0.05, 0.2);\n\n return Math.min(workload, 1.0);\n }\n\n private checkAgentCompatibility(\n agent1Id: string,\n agent2Id: string\n ): {\n score: number;\n bestTaskType: string;\n reason: string;\n } {\n const agent1 = this.agents.get(agent1Id);\n const agent2 = this.agents.get(agent2Id);\n\n if (!agent1 || !agent2) {\n return { score: 0, bestTaskType: '', reason: 'Agent not found' };\n }\n\n // Check capability overlap\n const caps1 = new Set(agent1.capabilities || []);\n const caps2 = new Set(agent2.capabilities || []);\n const overlap = new Set([...caps1].filter((x) => caps2.has(x)));\n\n const score = overlap.size / Math.max(caps1.size, caps2.size, 1);\n\n return {\n score,\n bestTaskType: Array.from(overlap)[0] || 'general',\n reason: `Capability overlap: ${overlap.size} common skills`,\n };\n }\n\n private applyCoordinationRules(message: CoordinationMessage): void {\n for (const rule of this.coordinationRules) {\n if (rule.condition(message)) {\n rule.action(message, this);\n }\n }\n }\n\n private setupDefaultRules(): void {\n this.coordinationRules = [\n {\n id: 'help_request_timeout',\n condition: (msg) => msg.type === 'help_request',\n action: (msg, system) => {\n // Auto-escalate help requests after timeout\n setTimeout(() => {\n system.broadcastMessage({\n from: 'system',\n to: 'broadcast',\n type: 'status_update',\n content: {\n type: 'help_request_timeout',\n originalRequest: msg.id,\n },\n priority: 'urgent',\n });\n }, 300000); // 5 minutes\n },\n },\n ];\n }\n\n private generateId(): string {\n return `coord_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n}\n\ninterface CoordinationRule {\n id: string;\n condition: (message: CoordinationMessage) => boolean;\n action: (\n message: CoordinationMessage,\n system: EnhancedCoordinationSystem\n ) => void;\n}\n\nexport default EnhancedCoordinationSystem;\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }