use alloc::{vec::Vec, string::String};
#[cfg(feature = "serde")]
use serde::{Serialize, Deserialize};
use crate::{
Result, SwarmError, SwarmConfig, SwarmTopology, SchedulerConfig, MemoryConfig,
Agent, Task, AgentId, TaskId, Message, MessageType, MessagePayload, AgentState
};
use crate::coordinator::SwarmCoordinator;
use crate::scheduler::TaskScheduler;
use crate::memory::SwarmMemoryPool;
use crate::channel::SwarmChannelManager;
#[derive(Debug, Clone, Default)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct ProcessingStats {
pub tasks_scheduled: usize,
pub tasks_completed: usize,
pub failed_agents: usize,
pub cycle_duration: u64,
}
pub struct SwarmBuilder {
config: SwarmConfig,
}
impl SwarmBuilder {
pub fn new() -> Self {
Self {
config: SwarmConfig::default(),
}
}
pub fn name(mut self, name: String) -> Self {
self.config.name = name;
self
}
pub fn max_agents(mut self, max_agents: usize) -> Self {
self.config.max_agents = max_agents;
self
}
pub fn topology(mut self, topology: SwarmTopology) -> Self {
self.config.topology = topology;
self.config.coordination_config.topology = topology;
self
}
pub fn monitoring(mut self, enabled: bool) -> Self {
self.config.monitoring_enabled = enabled;
self
}
pub fn fault_tolerance(mut self, enabled: bool) -> Self {
self.config.fault_tolerance = enabled;
self.config.coordination_config.fault_tolerance = enabled;
self
}
pub fn scheduler_config(mut self, config: SchedulerConfig) -> Self {
self.config.scheduler_config = config;
self
}
pub fn memory_config(mut self, config: MemoryConfig) -> Self {
self.config.memory_config = config;
self
}
pub fn build(self) -> Result<SwarmOrchestrator> {
SwarmOrchestrator::new(self.config)
}
}
pub struct SwarmOrchestrator {
config: SwarmConfig,
coordinator: SwarmCoordinator,
scheduler: TaskScheduler,
memory_pool: SwarmMemoryPool,
channel_manager: SwarmChannelManager,
cycle_count: u64,
}
impl SwarmOrchestrator {
pub fn new(config: SwarmConfig) -> Result<Self> {
let coordinator = SwarmCoordinator::new(crate::coordinator::CoordinationConfig {
topology: config.topology,
max_groups: 16,
fault_tolerance: config.fault_tolerance,
heartbeat_interval: config.heartbeat_interval,
consensus_timeout: 5000,
leader_election: true,
});
let scheduler = TaskScheduler::new(SchedulerConfig::default());
let memory_pool = SwarmMemoryPool::new(MemoryConfig::default());
let channel_manager = SwarmChannelManager::new();
Ok(Self {
config,
coordinator,
scheduler,
memory_pool,
channel_manager,
cycle_count: 0,
})
}
pub fn builder() -> SwarmBuilder {
SwarmBuilder::new()
}
pub fn spawn_agent(&mut self, agent: Agent) -> Result<AgentId> {
let agent_id = agent.id();
self.coordinator.register_agent(agent)?;
self.channel_manager.create_agent_channels(agent_id)?;
Ok(agent_id)
}
pub fn submit_task(&mut self, task: Task) -> Result<TaskId> {
let task_id = task.id();
self.scheduler.add_task(task)?;
Ok(task_id)
}
pub fn process_cycle(&mut self) -> Result<ProcessingStats> {
let start_time = self.get_time();
let mut stats = ProcessingStats::default();
self.coordinator.check_agent_health()?;
let scheduled = self.scheduler.schedule_tasks(&mut self.coordinator)?;
stats.tasks_scheduled = scheduled.len();
self.channel_manager.process_pending_messages()?;
self.cycle_count += 1;
stats.cycle_duration = self.get_time() - start_time;
Ok(stats)
}
fn get_time(&self) -> u64 {
self.cycle_count * 1000
}
}
impl Default for SwarmBuilder {
fn default() -> Self {
Self::new()
}
}
impl Default for ResourceUtilization {
fn default() -> Self {
Self {
cpu_usage: 0.0,
memory_usage: 0.0,
network_usage: 0.0,
storage_usage: 0.0,
}
}
}
impl Default for SwarmMetrics {
fn default() -> Self {
Self {
active_agents: 0,
memory_utilization: 0.0,
total_tasks_processed: 0,
tasks_in_queue: 0,
tasks_running: 0,
avg_task_completion_time: 0.0,
throughput: 0.0,
error_rate: 0.0,
message_rate: 0.0,
resource_usage: ResourceUtilization::default(),
}
}
}