UNPKG

jay-code

Version:

Streamlined AI CLI orchestration engine with mathematical rigor and enterprise-grade reliability

543 lines (489 loc) 13.9 kB
/** * Coordinator Agent - Specialized in task orchestration and management */ import { BaseAgent } from './base-agent.js'; import type { AgentCapabilities, AgentConfig, AgentEnvironment, TaskDefinition, } from '../../swarm/types.js'; import type { ILogger } from '../../core/logger.js'; import type { IEventBus } from '../../core/event-bus.js'; import type { DistributedMemorySystem } from '../../memory/distributed-memory.js'; // Type definitions for coordinator activities interface ResourceAssignment { resource: string; task: string; utilization: number; duration: string; } interface TaskProgressItem { name: string; status: string; duration: string; } export class CoordinatorAgent extends BaseAgent { constructor( id: string, config: AgentConfig, environment: AgentEnvironment, logger: ILogger, eventBus: IEventBus, memory: DistributedMemorySystem, ) { super(id, 'coordinator', config, environment, logger, eventBus, memory); } protected getDefaultCapabilities(): AgentCapabilities { return { codeGeneration: false, codeReview: false, testing: false, documentation: true, research: true, analysis: true, webSearch: false, apiIntegration: true, fileSystem: true, terminalAccess: false, languages: [], frameworks: [], domains: [ 'project-management', 'task-coordination', 'workflow-orchestration', 'team-management', 'planning', 'communication', 'resource-allocation', 'progress-tracking', ], tools: [ 'task-manager', 'workflow-orchestrator', 'communication-hub', 'progress-tracker', 'resource-allocator', 'deadline-manager', 'status-reporter', ], maxConcurrentTasks: 8, maxMemoryUsage: 512 * 1024 * 1024, // 512MB maxExecutionTime: 600000, // 10 minutes reliability: 0.95, speed: 0.9, quality: 0.88, }; } protected getDefaultConfig(): Partial<AgentConfig> { return { autonomyLevel: 0.9, learningEnabled: true, adaptationEnabled: true, maxTasksPerHour: 30, maxConcurrentTasks: 8, timeoutThreshold: 600000, reportingInterval: 15000, heartbeatInterval: 8000, permissions: ['file-read', 'file-write', 'api-access', 'agent-management', 'task-management'], trustedAgents: [], expertise: { 'task-orchestration': 0.95, 'resource-management': 0.9, 'progress-tracking': 0.92, communication: 0.88, planning: 0.85, }, preferences: { communicationStyle: 'clear', reportingFrequency: 'regular', prioritization: 'impact-based', escalationThreshold: 'medium', }, }; } override async executeTask(task: TaskDefinition): Promise<any> { this.logger.info('Coordinator executing task', { agentId: this.id, taskType: task.type, taskId: task.id, }); try { switch (task.type) { case 'task-orchestration': return await this.orchestrateTasks(task); case 'progress-tracking': return await this.trackProgress(task); case 'resource-allocation': return await this.allocateResources(task); case 'workflow-management': return await this.manageWorkflow(task); case 'team-coordination': return await this.coordinateTeam(task); case 'status-reporting': return await this.generateStatusReport(task); default: return await this.performGeneralCoordination(task); } } catch (error) { this.logger.error('Coordination task failed', { agentId: this.id, taskId: task.id, error: error instanceof Error ? error.message : String(error), }); throw error; } } private async orchestrateTasks(task: TaskDefinition): Promise<any> { const tasks = task.parameters?.tasks || []; const strategy = task.parameters?.strategy || 'sequential'; const priority = task.parameters?.priority || 'balanced'; this.logger.info('Orchestrating tasks', { taskCount: tasks.length, strategy, priority, }); const orchestration = { strategy, priority, tasks: [], dependencies: [], timeline: { estimated: 0, critical_path: [], milestones: [], }, resource_allocation: {}, monitoring: { checkpoints: [], alerts: [], metrics: [], }, risk_assessment: { risks: [], mitigation: [], }, timestamp: new Date(), }; // Simulate task orchestration await this.delay(2000); orchestration.tasks = tasks.map((t: any, index: number) => ({ id: t.id || `task-${index + 1}`, name: t.name || `Task ${index + 1}`, status: 'pending', assignee: null, estimated_duration: t.duration || 30, dependencies: t.dependencies || [], })); return orchestration; } private async trackProgress(task: TaskDefinition): Promise<any> { const project = task.parameters?.project; const timeframe = task.parameters?.timeframe || 'weekly'; const metrics = task.parameters?.metrics || ['completion', 'velocity', 'quality']; this.logger.info('Tracking progress', { project, timeframe, metrics, }); const progress = { project, timeframe, metrics, summary: { overall_progress: 0, tasks_completed: 0, tasks_in_progress: 0, tasks_pending: 0, blockers: 0, }, velocity: { current: 0, average: 0, trend: 'stable', }, quality_metrics: { defect_rate: 0, review_coverage: 0, test_coverage: 0, }, timeline: { on_track: true, estimated_completion: new Date(), delays: [], }, recommendations: [], timestamp: new Date(), }; // Simulate progress tracking await this.delay(1500); progress.summary = { overall_progress: 68, tasks_completed: 15, tasks_in_progress: 6, tasks_pending: 4, blockers: 1, }; return progress; } private async allocateResources(task: TaskDefinition): Promise<any> { const resources = task.input?.resources || []; const requirements = task.input?.requirements || []; const constraints = task.input?.constraints || []; this.logger.info('Allocating resources', { resources: resources.length, requirements: requirements.length, constraints: constraints.length, }); const allocation = { resources, requirements, constraints, assignments: [] as ResourceAssignment[], utilization: {}, conflicts: [] as any[], optimizations: [] as any[], recommendations: [] as any[], efficiency: 0, timestamp: new Date(), }; // Simulate resource allocation await this.delay(2500); allocation.assignments = [ { resource: 'Agent-001', task: 'API Development', utilization: 0.8, duration: '2 days', }, { resource: 'Agent-002', task: 'Testing', utilization: 0.6, duration: '1 day', }, ]; allocation.efficiency = 0.85; return allocation; } private async manageWorkflow(task: TaskDefinition): Promise<any> { const workflow = task.input?.workflow; const stage = task.input?.stage || 'planning'; const automation = task.input?.automation || false; this.logger.info('Managing workflow', { workflow, stage, automation, }); const management = { workflow, stage, automation, stages: [] as TaskProgressItem[], transitions: [] as any[], approvals: [] as any[], bottlenecks: [] as any[], optimizations: [] as any[], sla_compliance: { on_time: 0, quality: 0, budget: 0, }, timestamp: new Date(), }; // Simulate workflow management await this.delay(2000); management.stages = [ { name: 'Planning', status: 'completed', duration: '2 days' }, { name: 'Development', status: 'in_progress', duration: '5 days' }, { name: 'Testing', status: 'pending', duration: '2 days' }, { name: 'Deployment', status: 'pending', duration: '1 day' }, ]; return management; } private async coordinateTeam(task: TaskDefinition): Promise<any> { const team = task.parameters?.team || []; const objectives = task.parameters?.objectives || []; const communication = task.parameters?.communication || 'daily'; this.logger.info('Coordinating team', { teamSize: team.length, objectives: objectives.length, communication, }); const coordination = { team, objectives, communication, meetings: [], assignments: [], collaboration: { tools: [], channels: [], frequency: communication, }, performance: { individual: {}, team: { productivity: 0, satisfaction: 0, collaboration_score: 0, }, }, issues: [], improvements: [], timestamp: new Date(), }; // Simulate team coordination await this.delay(1800); coordination.performance.team = { productivity: 0.82, satisfaction: 0.88, collaboration_score: 0.85, }; return coordination; } private async generateStatusReport(task: TaskDefinition): Promise<any> { const scope = task.input?.scope || 'project'; const period = task.input?.period || 'weekly'; const audience = task.input?.audience || 'stakeholders'; const format = task.input?.format || 'summary'; this.logger.info('Generating status report', { scope, period, audience, format, }); const report = { scope, period, audience, format, executive_summary: '', key_metrics: {}, achievements: [] as string[], challenges: [] as any[], next_steps: [] as any[], risks: [] as any[], recommendations: [] as any[], appendix: { detailed_metrics: {}, charts: [] as any[], raw_data: {}, }, timestamp: new Date(), }; // Simulate report generation await this.delay(3000); report.executive_summary = 'Project is 68% complete and on track for delivery. Team productivity is high with minor blockers identified.'; report.key_metrics = { completion: '68%', velocity: '12 points/sprint', quality: '4.2/5.0', budget: '72% utilized', }; report.achievements = [ 'Completed API development milestone', 'Achieved 85% test coverage', 'Resolved 3 critical bugs', ]; return report; } private async performGeneralCoordination(task: TaskDefinition): Promise<any> { this.logger.info('Performing general coordination', { description: task.description, }); // Default to task orchestration return await this.orchestrateTasks(task); } private async delay(ms: number): Promise<void> { return new Promise((resolve) => setTimeout(resolve, ms)); } override getAgentStatus(): any { return { ...super.getAgentStatus(), specialization: 'Task Orchestration & Project Management', coordinationCapabilities: [ 'Task Orchestration', 'Resource Allocation', 'Progress Tracking', 'Team Coordination', 'Workflow Management', 'Status Reporting', ], managementStyles: ['Agile', 'Waterfall', 'Hybrid'], currentCoordinations: this.getCurrentTasks().length, averageCoordinationTime: '5-15 minutes', lastCoordinationCompleted: this.getLastTaskCompletedTime(), teamSize: this.collaborators.length, }; } } export const createCoordinatorAgent = ( id: string, config: Partial<AgentConfig>, environment: Partial<AgentEnvironment>, logger: ILogger, eventBus: IEventBus, memory: DistributedMemorySystem, ): CoordinatorAgent => { const defaultConfig = { autonomyLevel: 0.9, learningEnabled: true, adaptationEnabled: true, maxTasksPerHour: 20, maxConcurrentTasks: 5, timeoutThreshold: 180000, reportingInterval: 30000, heartbeatInterval: 15000, permissions: [ 'task-orchestration', 'resource-allocation', 'progress-tracking', 'team-coordination', 'reporting', 'workflow-management', ], trustedAgents: [], expertise: { 'task-orchestration': 0.98, 'resource-allocation': 0.95, 'progress-tracking': 0.92, 'team-coordination': 0.9, 'workflow-management': 0.94, }, preferences: { coordinationStyle: 'collaborative', reportingFrequency: 'regular', escalationThreshold: 'medium', teamSize: 'medium', }, }; const defaultEnv = { runtime: 'deno' as const, version: '1.40.0', workingDirectory: './agents/coordinator', tempDirectory: './tmp/coordinator', logDirectory: './logs/coordinator', apiEndpoints: {}, credentials: {}, availableTools: [ 'task-manager', 'workflow-orchestrator', 'communication-hub', 'progress-tracker', ], toolConfigs: { taskManager: { autoAssign: true, prioritization: 'impact' }, communication: { frequency: 'regular', style: 'clear' }, }, }; return new CoordinatorAgent( id, { ...defaultConfig, ...config } as AgentConfig, { ...defaultEnv, ...environment } as AgentEnvironment, logger, eventBus, memory, ); };