use std::collections::HashSet; use std::sync::Arc; use crate::skills::SkillRuntime; use crate::storage::{MemoryRepository, SchedulerJobRepository, SkillEventRepository}; use crate::tools::{ BashTool, CalculatorTool, FileEditTool, FileReadTool, FileWriteTool, HttpRequestTool, MemoryManageTool, MemorySearchTool, SchedulerManageTool, SessionMessageSender, SessionSendTool, SkillActivateTool, SkillListTool, SkillManageTool, TimeTool, ToolRegistry, WebFetchTool, }; pub(crate) struct ToolRegistryFactory { skills: Arc, memories: Arc, scheduler_jobs: Arc, skill_events: Arc, session_message_sender: Arc, known_agents: HashSet, default_timezone: String, disabled_tools: HashSet, } impl ToolRegistryFactory { pub(crate) fn new( skills: Arc, memories: Arc, scheduler_jobs: Arc, skill_events: Arc, session_message_sender: Arc, known_agents: HashSet, default_timezone: String, disabled_tools: HashSet, ) -> Self { Self { skills, memories, scheduler_jobs, skill_events, session_message_sender, known_agents, default_timezone, disabled_tools, } } fn is_enabled(&self, tool_name: &str) -> bool { !self.disabled_tools.contains(tool_name) } pub(crate) fn build(&self) -> ToolRegistry { let mut registry = ToolRegistry::new(); if self.is_enabled("calculator") { registry.register(CalculatorTool::new()); } if self.is_enabled("get_time") { registry.register(TimeTool::new(self.default_timezone.clone())); } if self.is_enabled("file_read") { registry.register(FileReadTool::new()); } if self.is_enabled("file_write") { registry.register(FileWriteTool::new()); } if self.is_enabled("file_edit") { registry.register(FileEditTool::new()); } if self.is_enabled("memory_search") { registry.register(MemorySearchTool::new(self.memories.clone())); } if self.is_enabled("memory_manage") { registry.register(MemoryManageTool::new(self.memories.clone())); } if self.is_enabled("session_send") { registry.register(SessionSendTool::new(self.session_message_sender.clone())); } if self.is_enabled("scheduler_manage") { registry.register(SchedulerManageTool::new( self.scheduler_jobs.clone(), self.known_agents.clone(), )); } if self.is_enabled("skill_activate") { registry.register(SkillActivateTool::new( self.skills.clone(), self.skill_events.clone(), )); } if self.is_enabled("skill_list") { registry.register(SkillListTool::new(self.skills.clone())); } if self.is_enabled("skill_manage") { registry.register(SkillManageTool::new(self.skills.clone())); } if self.is_enabled("bash") { registry.register(BashTool::new()); } if self.is_enabled("http_request") { registry.register(HttpRequestTool::new( vec!["*".to_string()], 1_000_000, 30, false, )); } if self.is_enabled("web_fetch") { registry.register(WebFetchTool::new(50_000, 30)); } registry } }