use anyhow::Result;
use super::{Tool, ToolContext, ToolOutcome};
use crate::entities::profile::ToolId;
pub const SEND_FOLLOWUP_ID: &str = "send_followup_message";
pub const REWRITE_CURRENT_ID: &str = "rewrite_current_message";
pub fn is_control_tool(name: &str) -> bool {
name == SEND_FOLLOWUP_ID || name == REWRITE_CURRENT_ID
}
pub fn control_permission_text(name: &str, loc: &crate::shared::i18n::Locale) -> String {
match name {
SEND_FOLLOWUP_ID => loc.t("control.permission.followup").to_string(),
REWRITE_CURRENT_ID => loc.t("control.permission.rewrite").to_string(),
_ => String::new(),
}
}
pub struct SendFollowupMessage;
#[async_trait::async_trait]
impl Tool for SendFollowupMessage {
fn id(&self) -> ToolId {
SEND_FOLLOWUP_ID.into()
}
fn group(&self) -> crate::features::tools::meta::ToolGroup {
crate::features::tools::meta::ToolGroup::Conversation
}
fn ui_label(&self) -> &'static str {
"continue message"
}
fn enabled_by_default(&self) -> bool {
false
}
fn description(&self, loc: &crate::shared::i18n::Locale) -> String {
loc.t("tool.send_followup_message.desc").into()
}
fn parameters(&self, _loc: &crate::shared::i18n::Locale) -> serde_json::Value {
serde_json::json!({ "type": "object", "properties": {} })
}
async fn invoke(&self, ctx: &ToolContext, _args: serde_json::Value) -> Result<ToolOutcome> {
Ok(ToolOutcome::text(control_permission_text(
SEND_FOLLOWUP_ID,
ctx.loc,
)))
}
}
pub struct RewriteCurrentMessage;
#[async_trait::async_trait]
impl Tool for RewriteCurrentMessage {
fn id(&self) -> ToolId {
REWRITE_CURRENT_ID.into()
}
fn group(&self) -> crate::features::tools::meta::ToolGroup {
crate::features::tools::meta::ToolGroup::Conversation
}
fn ui_label(&self) -> &'static str {
"rewrite reply"
}
fn enabled_by_default(&self) -> bool {
false
}
fn description(&self, loc: &crate::shared::i18n::Locale) -> String {
loc.t("tool.rewrite_current_message.desc").into()
}
fn parameters(&self, _loc: &crate::shared::i18n::Locale) -> serde_json::Value {
serde_json::json!({ "type": "object", "properties": {} })
}
async fn invoke(&self, ctx: &ToolContext, _args: serde_json::Value) -> Result<ToolOutcome> {
Ok(ToolOutcome::text(control_permission_text(
REWRITE_CURRENT_ID,
ctx.loc,
)))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn control_tool_names_recognized() {
assert!(is_control_tool(SEND_FOLLOWUP_ID));
assert!(is_control_tool(REWRITE_CURRENT_ID));
assert!(!is_control_tool("note_save"));
}
#[test]
fn permission_text_per_tool() {
let ru = crate::shared::i18n::locale(crate::shared::i18n::Lang::Ru);
assert!(!control_permission_text(SEND_FOLLOWUP_ID, ru).is_empty());
assert!(!control_permission_text(REWRITE_CURRENT_ID, ru).is_empty());
assert!(control_permission_text("note_save", ru).is_empty());
}
}