start method
Starts the orchestrator with the specified number of workers.
Implementation
Future<void> start({int workerCount = 2}) async {
if (_isRunning) {
logger.warn('Orchestrator is already running.');
return;
}
// Use planning provider for Mayor and Witness (coordination, monitoring)
final planningProvider = await _llmService.getProviderForUsage(
LLMUsageType.planning,
);
if (planningProvider == null) {
logger.err('No planning provider configured. Cannot start orchestrator.');
return;
}
// Use coding provider for Workers (actual code generation)
final codingProvider = await _llmService.getProviderForUsage(
LLMUsageType.coding,
);
if (codingProvider == null) {
logger.err('No coding provider configured. Cannot start orchestrator.');
return;
}
_isRunning = true;
logger.info('Spectra Multi-Agent Orchestrator starting...');
logger.detail(
'Planning: ${planningProvider.name} | Coding: ${codingProvider.name}',
);
// Initialize Agents
_agents.add(
MayorAgent(
id: 'Mayor-1',
provider: planningProvider, // Strategic coordination
logger: logger,
orchestrator: this,
),
);
_agents.add(
WitnessAgent(
id: 'Witness-1',
provider: planningProvider, // Monitoring and analysis
logger: logger,
orchestrator: this,
),
);
for (var i = 1; i <= workerCount; i++) {
final worker = WorkerAgent(
id: 'Worker-$i',
provider: codingProvider, // Tactical code generation
logger: logger,
onTaskCompleted: markTaskCompleted,
);
_agents.add(worker);
}
logger.success('Initialized ${_agents.length} agents.');
// Start the execution loop (proper async loop, not Timer.periodic)
unawaited(_runLoop());
}