jay-code
Version:
Streamlined AI CLI orchestration engine with mathematical rigor and enterprise-grade reliability
543 lines (489 loc) • 13.9 kB
text/typescript
/**
* 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,
);
};