use async_trait::async_trait; use crate::bus::{MediaItem, MessageSource}; #[derive(Debug, Clone)] pub struct ToolResult { pub success: bool, pub output: String, pub error: Option, } #[async_trait] pub trait Tool: Send + Sync + 'static { fn name(&self) -> &str; fn description(&self) -> &str; fn parameters_schema(&self) -> serde_json::Value; async fn execute(&self, args: serde_json::Value) -> anyhow::Result; /// Whether this tool is side-effect free and safe to parallelize. fn read_only(&self) -> bool { false } /// Whether this tool can run alongside other concurrency-safe tools. fn concurrency_safe(&self) -> bool { self.read_only() && !self.exclusive() } /// Whether this tool should run alone even if concurrency is enabled. fn exclusive(&self) -> bool { false } } #[async_trait] pub trait OutboundMessenger: Send + Sync { async fn send_message( &self, channel: &str, chat_id: &str, dialog_id: Option<&str>, content: &str, source: MessageSource, media: Vec, ) -> Result<(), String>; }