工具系统重构与定时任务管理

1. 工具抽象体系
   - 新增 Tool trait + ToolRegistry 注册表
   - 三种工具类型:ApiTool / StdioTool / ShellTool
   - 全局 REGISTRY (LazyLock) 作为主入口
   - BuiltinRegistry 简化为兼容层

2. 定时任务管理工具
   - 新增 manage_scheduled_tasks 工具(ApiTool)
   - 支持 list/add/update/delete/toggle 五种操作
   - 通过 LazyLock 延迟初始化数据库连接池

3. 定时任务分流
   - 新增 task_type 字段(model / system)
   - 模型可自由管理 model 任务
   - system 任务只读,修改操作被拒绝

4. CLI 支持
   - 新增 ias task 子命令(list/add/update/delete/toggle)

5. 清理
   - 删除废弃的 ias-auth 独立二进制
   - SkillResult 增加 Deserialize derive
   - 所有调用点更新为 crate::tools::xxx 新入口
This commit is contained in:
2026-06-10 16:00:47 +08:00
parent f7d0781090
commit 5a54368437
17 changed files with 1271 additions and 257 deletions
+6 -6
View File
@@ -549,7 +549,7 @@ async fn tool_consumer_loop(
info!("Tool Consumer: user={} tool={}", user_id, tool_name);
// 高风险工具 → 审批(除非已被用户批准)
if !approved && crate::tools::builtin::BuiltinRegistry::is_high_risk(&tool_name) {
if !approved && crate::tools::is_high_risk(&tool_name) {
info!("高风险工具 {} 需要审批", tool_name);
ctx.approval_ctx.lock().await.insert(
user_id.clone(),
@@ -620,7 +620,7 @@ async fn execute_tool(name: &str, arguments: &str, ctx: &DaemonCtx, user_id: &st
.collect::<Vec<_>>().join("\n---\n");
}
"query_capabilities" => {
let specs = crate::tools::builtin::BuiltinRegistry::specs();
let specs = crate::tools::specs();
return crate::tools::build_capability_guide(&specs);
}
"call_capability" => {
@@ -656,13 +656,13 @@ async fn execute_tool(name: &str, arguments: &str, ctx: &DaemonCtx, user_id: &st
.collect::<Vec<_>>().join("\n---\n");
}
"query_capabilities" => {
let specs = crate::tools::builtin::BuiltinRegistry::specs();
let specs = crate::tools::specs();
return crate::tools::build_capability_guide(&specs);
}
_ => {}
}
// 内置工具注册表
match crate::tools::builtin::BuiltinRegistry::execute(&target_name, &target_args).await {
match crate::tools::execute(&target_name, &target_args).await {
Some(r) => return r.output,
None => return format!("未知工具: {}", target_name),
}
@@ -671,7 +671,7 @@ async fn execute_tool(name: &str, arguments: &str, ctx: &DaemonCtx, user_id: &st
}
// 内置工具注册表
match crate::tools::builtin::BuiltinRegistry::execute(name, arguments).await {
match crate::tools::execute(name, arguments).await {
Some(r) => r.output,
None => format!("未知工具: {}", name),
}
@@ -795,7 +795,7 @@ fn build_tools_list() -> Vec<serde_json::Value> {
}
}));
let specs = crate::tools::builtin::BuiltinRegistry::specs();
let specs = crate::tools::specs();
for spec in &specs {
list.push(serde_json::json!({
"type": "function",