use std::sync::Arc;
use anyhow::Result;
use dashmap::DashMap;
use tokio::sync::RwLock;
use tracing::info;
use super::autonomous::AutonomousAgent;
use crate::core::capability::CapabilityRegistry;
use crate::core::config::CompanyConfig;
use crate::core::messaging::MessageBus;
use crate::core::skill::SkillManager;
use crate::core::store::Store;
use crate::core::tool::ToolRegistry;
use crate::domain::Organization;
use crate::infrastructure::capability::{McpProtocolHandler, McpServer};
use crate::infrastructure::tool::{FrameworkToolExecutor, ToolEnvironment};
pub struct OrganizationManager {
organization: Arc<RwLock<Organization>>,
config: CompanyConfig,
}
impl OrganizationManager {
pub fn new(config: CompanyConfig) -> Self {
let organization = Arc::new(RwLock::new(config.organization.clone()));
Self {
organization,
config,
}
}
pub async fn organization(&self) -> tokio::sync::RwLockReadGuard<'_, Organization> {
self.organization.read().await
}
pub fn organization_arc(&self) -> Arc<RwLock<Organization>> {
self.organization.clone()
}
pub fn config(&self) -> &CompanyConfig {
&self.config
}
}
pub struct AgentManager {
agents: DashMap<String, AutonomousAgent>,
message_bus: Arc<MessageBus>,
}
impl AgentManager {
pub fn new(message_bus: Arc<MessageBus>) -> Self {
Self {
agents: DashMap::new(),
message_bus,
}
}
pub async fn initialize_agents(
&self,
organization: &Organization,
watchdog_agent: Option<Arc<crate::core::watchdog_agent::WatchdogAgent>>,
) -> Result<()> {
for agent_data in &organization.agents {
let agent = AutonomousAgent::new(
agent_data.clone(),
self.message_bus.clone(),
watchdog_agent.clone(),
)
.await?;
let agent_id = agent.id().to_string();
self.agents.insert(agent_id.clone(), agent);
info!("Created agent: {}", agent_id);
}
Ok(())
}
pub async fn get_agents(&self) -> Result<Vec<crate::domain::Agent>> {
Ok(vec![])
}
}
pub struct ToolCapabilityManager {
tool_registry: Arc<ToolRegistry>,
capability_registry: Arc<CapabilityRegistry>,
skill_manager: Arc<SkillManager>,
}
impl Default for ToolCapabilityManager {
fn default() -> Self {
let tool_registry = Arc::new(ToolRegistry::new());
let capability_registry = Arc::new(CapabilityRegistry::new());
let skill_manager = Arc::new(SkillManager::new_with_tool_registry(tool_registry.clone()));
Self {
tool_registry,
capability_registry,
skill_manager,
}
}
}
impl ToolCapabilityManager {
pub fn new() -> Self {
let tool_registry = Arc::new(ToolRegistry::new());
let capability_registry = Arc::new(CapabilityRegistry::new());
let skill_manager = Arc::new(SkillManager::new_with_tool_registry(tool_registry.clone()));
Self {
tool_registry,
capability_registry,
skill_manager,
}
}
pub fn tool_registry(&self) -> Arc<ToolRegistry> {
self.tool_registry.clone()
}
pub async fn register_app_tool(&self, tool: crate::domain::tool::Tool) -> Result<()> {
let tool_id = tool.id.clone();
self.tool_registry.register(tool).await?;
info!("Registered app tool: {}", tool_id);
Ok(())
}
pub fn create_tool_environment(
&self,
message_bus: Arc<MessageBus>,
organization: Arc<RwLock<Organization>>,
store: Arc<dyn Store>,
) -> ToolEnvironment {
ToolEnvironment::new(
message_bus,
organization,
self.tool_registry.clone(),
store,
self.skill_manager.clone(),
)
}
pub fn get_framework_tool_executor(
&self,
message_bus: Arc<MessageBus>,
organization: Arc<RwLock<Organization>>,
store: Arc<dyn Store>,
) -> FrameworkToolExecutor {
let env = self.create_tool_environment(message_bus, organization, store);
FrameworkToolExecutor::new(env)
}
pub fn capability_registry(&self) -> Arc<CapabilityRegistry> {
self.capability_registry.clone()
}
pub async fn register_app_capability(
&self,
capability: crate::domain::capability::Capability,
) -> Result<()> {
let cap_id = capability.id.clone();
self.capability_registry.register(capability).await?;
info!("Registered app capability: {}", cap_id);
Ok(())
}
pub fn create_mcp_server(&self, bind_addr: String) -> McpServer {
McpServer::new(bind_addr, self.capability_registry.clone())
}
pub fn get_mcp_protocol_handler(&self) -> McpProtocolHandler {
McpProtocolHandler::new(self.capability_registry.clone())
}
pub fn register_skill(&self, skill: crate::domain::skill::Skill) -> Result<()> {
self.skill_manager.register_skill(skill)
}
pub fn bind_skill_tool(&self, binding: crate::domain::skill::SkillToolBinding) -> Result<()> {
self.skill_manager.bind_skill_tool(binding)
}
pub fn set_tool_access(
&self,
tool_id: &str,
access_type: crate::domain::skill::ToolAccessType,
) -> Result<()> {
self.skill_manager.set_tool_access(tool_id, access_type)
}
pub fn skill_manager(&self) -> Arc<SkillManager> {
self.skill_manager.clone()
}
}