use serde_json::{json, Value};
use crate::Result;
use super::{Tool, ToolContext};
pub struct SendChannelTool;
#[async_trait::async_trait]
impl Tool for SendChannelTool {
fn name(&self) -> &str { "send_channel" }
fn description(&self) -> &str {
"Send a message to a specific channel (discord, slack, system, etc). Use this to proactively notify through a specific channel rather than replying to an event."
}
fn parameters(&self) -> Value {
json!({
"type": "object",
"properties": {
"channel_type": {
"type": "string",
"description": "Channel type: discord, slack, telegram, system, desktop"
},
"channel_id": {
"type": "string",
"description": "Channel identifier (e.g. Discord channel ID, Slack channel)"
},
"text": { "type": "string", "description": "Message to send" }
},
"required": ["channel_type", "channel_id", "text"]
})
}
async fn execute(&self, params: Value, _ctx: ToolContext) -> Result<String> {
let channel_type = params["channel_type"].as_str()
.ok_or_else(|| crate::RuntimeError::Tool("Missing 'channel_type' parameter".to_string()))?
.to_string();
let channel_id = params["channel_id"].as_str()
.ok_or_else(|| crate::RuntimeError::Tool("Missing 'channel_id' parameter".to_string()))?
.to_string();
let text = params["text"].as_str()
.ok_or_else(|| crate::RuntimeError::Tool("Missing 'text' parameter".to_string()))?
.to_string();
tracing::info!(
channel_type = %channel_type,
channel_id = %channel_id,
"send_channel tool invoked: {}",
text
);
Ok(json!({
"sent": false,
"error": "send_channel is not yet implemented — no channel dispatch wired",
"channel_type": channel_type,
"channel_id": channel_id,
}).to_string())
}
}