diff --git a/src/main.rs b/src/main.rs index ca6b3bf..9305f0c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,7 +15,7 @@ use db::Database; use llm::{Conversation, ConversationConfig, DEFAULT_SYSTEM_PROMPT, ToolExecutor, Usage}; use std::sync::Arc; use tools::approval::{ApprovalDecision, ApprovalManager}; -use tools::skill::ExecutionContext; +use tools::types::ExecutionContext; use tracing::{error, info}; use wechat::client::WeChatClient; @@ -293,7 +293,7 @@ async fn cmd_listen( let session = conv.session(); let approval = approval_manager.clone(); let memory_store = memory_store.clone(); - let send_wechat: tools::skill::WechatSender = { + let send_wechat: tools::types::WechatSender = { let client = client.clone(); Arc::new(move |user_id: &str, text: &str| { let client = client.clone(); @@ -816,7 +816,7 @@ async fn cmd_send( } -use tools::skill::SkillResult; +use tools::types::SkillResult; async fn builtin_approve(ctx: &ExecutionContext, name: &str) -> Result { let manager = match ctx.approval_manager.as_ref() { @@ -841,10 +841,10 @@ async fn builtin_approve(ctx: &ExecutionContext, name: &str) -> Result String { +fn build_capability_list(specs: &[tools::types::SkillSpec]) -> String { let mut lines = vec!["📋 可用工具:".to_string()]; for spec in specs { - let risk = if spec.risk_level == tools::skill::RiskLevel::High { + let risk = if spec.risk_level == tools::types::RiskLevel::High { " ⚠️需确认" } else { "" diff --git a/src/tools/builtin.rs b/src/tools/builtin.rs index 3d89a7d..04ff1ef 100644 --- a/src/tools/builtin.rs +++ b/src/tools/builtin.rs @@ -1,4 +1,4 @@ -use crate::tools::skill::{RiskLevel, SkillResult}; +use crate::tools::types::{RiskLevel, SkillResult}; use chrono::Local; /// 内置工具执行器:统一处理参数校验、执行、错误返回 @@ -18,16 +18,16 @@ impl BuiltinRegistry { } /// 返回所有内置工具的 spec 列表 - pub fn specs() -> Vec { + pub fn specs() -> Vec { vec![ - super::skill::SkillSpec { + super::types::SkillSpec { name: "get_current_datetime".into(), description: "获取当前日期时间(北京时间 UTC+8)".into(), risk_level: RiskLevel::Low, parameters: serde_json::json!({"type":"object","properties":{"format":{"type":"string"}}}), timeout_secs: 5, }, - super::skill::SkillSpec { + super::types::SkillSpec { name: "manage_memos".into(), description: "管理备忘录:添加/列出/删除。高风险操作(add/delete)需确认".into(), risk_level: RiskLevel::Low, diff --git a/src/tools/mod.rs b/src/tools/mod.rs index 0c2f5a9..a950927 100644 --- a/src/tools/mod.rs +++ b/src/tools/mod.rs @@ -1,4 +1,4 @@ pub mod approval; pub mod builtin; -pub mod skill; +pub mod types; pub mod weather; diff --git a/src/tools/skill.rs b/src/tools/types.rs similarity index 65% rename from src/tools/skill.rs rename to src/tools/types.rs index 2564dcd..b6de0f9 100644 --- a/src/tools/skill.rs +++ b/src/tools/types.rs @@ -32,8 +32,12 @@ pub struct SkillSpec { pub timeout_secs: u64, } -fn default_risk_level() -> RiskLevel { RiskLevel::Low } -fn default_timeout() -> u64 { 30 } +fn default_risk_level() -> RiskLevel { + RiskLevel::Low +} +fn default_timeout() -> u64 { + 30 +} // ─── 工具执行结果 ─── @@ -47,29 +51,51 @@ pub struct SkillResult { impl SkillResult { pub fn ok(output: impl Into) -> Self { - Self { success: true, output: output.into(), data: None } + Self { + success: true, + output: output.into(), + data: None, + } } pub fn ok_with_data(output: impl Into, data: serde_json::Value) -> Self { - Self { success: true, output: output.into(), data: Some(data) } + Self { + success: true, + output: output.into(), + data: Some(data), + } } pub fn rejected(skill_name: &str) -> Self { - Self { success: false, output: format!("用户拒绝了你的调用:{}", skill_name), data: None } + Self { + success: false, + output: format!("用户拒绝了你的调用:{}", skill_name), + data: None, + } } pub fn expired(skill_name: &str) -> Self { - Self { success: false, output: format!("用户没有确认操作:{}", skill_name), data: None } + Self { + success: false, + output: format!("用户没有确认操作:{}", skill_name), + data: None, + } } pub fn error(msg: impl Into) -> Self { - Self { success: false, output: msg.into(), data: None } + Self { + success: false, + output: msg.into(), + data: None, + } } } // ─── 执行上下文 ─── -pub type WechatSender = Arc Pin> + Send>> + Send + Sync>; +pub type WechatSender = Arc< + dyn Fn(&str, &str) -> Pin> + Send>> + Send + Sync, +>; pub struct ExecutionContext { pub user_id: String, @@ -79,7 +105,11 @@ pub struct ExecutionContext { impl ExecutionContext { pub fn new(user_id: impl Into) -> Self { - Self { user_id: user_id.into(), approval_manager: None, send_wechat: None } + Self { + user_id: user_id.into(), + approval_manager: None, + send_wechat: None, + } } pub fn with_approval(mut self, mgr: Arc) -> Self { diff --git a/src/tools/weather.rs b/src/tools/weather.rs index 73a5e37..d291941 100644 --- a/src/tools/weather.rs +++ b/src/tools/weather.rs @@ -19,7 +19,7 @@ use std::collections::HashMap; use std::sync::Mutex; use std::time::{Duration, Instant}; -use crate::tools::skill::{RiskLevel, SkillResult, SkillSpec}; +use crate::tools::types::{RiskLevel, SkillResult, SkillSpec}; // ═══════════════════════════════════════════════ // JWT 认证