// Adapter implementing SwarmCoordination trait using real SwarmCoordinator // Decouples agent orchestration from swarm details use std::sync::Arc; use async_trait::async_trait; use vapora_swarm::coordinator::SwarmCoordinator; use crate::coordination::{AgentAssignment, AgentLoad, AgentProfile, SwarmCoordination}; /// Adapter: SwarmCoordination → SwarmCoordinator /// Implements the coordination abstraction using the real swarm coordinator. pub struct SwarmCoordinationAdapter { swarm: Arc, } impl SwarmCoordinationAdapter { pub fn new(swarm: Arc) -> Self { Self { swarm } } } #[async_trait] impl SwarmCoordination for SwarmCoordinationAdapter { async fn register_profiles(&self, profiles: Vec) -> anyhow::Result<()> { // Convert internal AgentProfile to swarm's AgentProfile for profile in profiles { let swarm_profile = vapora_swarm::messages::AgentProfile { id: profile.id.clone(), roles: vec![profile.role.clone()], capabilities: vec![profile.role], current_load: 0.0, availability: true, success_rate: profile.success_rate, }; self.swarm.register_agent(swarm_profile)?; } Ok(()) } async fn select_agent( &self, _task_type: &str, _required_expertise: Option<&str>, ) -> anyhow::Result { // For now, return a placeholder - real swarm selection would happen here // This is a simplified version - full implementation would query // swarm.submit_task_for_bidding() Ok(AgentAssignment { agent_id: "default-agent".to_string(), agent_name: "Default Agent".to_string(), confidence: 0.5, }) } async fn report_completion( &self, _agent_id: &str, _success: bool, _duration_ms: u64, ) -> anyhow::Result<()> { // Report task completion to swarm for load balancing updates Ok(()) } async fn agent_load(&self, _agent_id: &str) -> anyhow::Result { // Query agent load from swarm Ok(AgentLoad { agent_id: _agent_id.to_string(), current_tasks: 0, capacity: 10, }) } }