start method

Future<void> start({
  1. int workerCount = 2,
})

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());
}