//! get_app_config AI 工具声明式注册(查 DevFlow 自身当前 AI 配置,只读 + 脱敏)。 //! //! 工具职责:返当前生效的 provider/default_provider/agent 配置/app_settings 概要 JSON, //! 让 LLM 一调即得「现在用什么 provider/model/迭代上限」,根治 run_command PowerShell //! 内联 node/python 脚本查 db(引号三重嵌套必失败)的绕行。 //! //! 风险:Low(纯只读 list/load,无写副作用)。安全:api_key 经 mask_api_key 脱敏 //! (前 4 + `••••` + 后 4),绝不返明文;app_settings 走白名单不返敏感 KV。 //! //! handler body 在 commands/ai/get_app_config.rs::execute_get_app_config, //! 声明式注册收敛样板(对齐 fetch_url/generate_image 模式)。 //! //! ## 捕获变量说明 //! //! declare_tool! 宏单捕获限制:本工具需 db + 3 个 agent 配置 Arc + LlmConcurrency 共 5 项, //! 包进 [`GetAppConfigCtx`] struct(各字段 Arc/Clone-廉价),闭包内不解构直接 //! `&ctx` 转调 handler。ctx 字段与 AppState 同名字段共享同一底层原子量(热改即反映)。 use df_ai::ai_tools::{AiToolRegistry, RiskLevel}; use df_ai::declare_tool; use crate::commands::ai::get_app_config::GetAppConfigCtx; /// 注册 get_app_config 工具到 `$registry`。 /// /// - name/desc/schema 面向 LLM 的工具说明(无参数,返全部当前配置) /// - risk=Low(纯只读) /// - handler 捕获 GetAppConfigCtx(共享 AppState 同名 Arc 字段),转调 get_app_config.rs pub fn register(registry: &mut AiToolRegistry, ctx: GetAppConfigCtx) { // schema:无参数(object_schema 空参返仅 type:object 无 required)。 // 不加可选 section 参数(provider/agent/settings 选返):返全部配置最简,LLM 自行读所需字段; // 加 section 反增参数解析分支 + schema 复杂度,违背「简洁」约束。 let schema = df_ai::ai_tools::object_schema(vec![]); declare_tool!( registry, ctx: GetAppConfigCtx, "get_app_config", "获取 DevFlow 自身当前生效的 AI 配置(只读,无参数)。返回 {default_provider, providers, agent, app_settings}:default_provider 含 name/provider_type/base_url/default_model/is_default/enabled/api_key_masked(api_key 脱敏,空串=未配置 key);providers 是全部 provider 概要列表(无 api_key);agent 含 max_iterations/max_retries/approval_timeout_minutes/concurrency.per_conv(当前热改生效值);app_settings 含知识库/审批超时等 AI 相关 KV(custom_prompt 只返长度不返原文)。查「现在用什么 provider/model」「agent 迭代上限多少」「key 是否配置」用本工具,不要 run_command 执行 PowerShell 内联脚本查 db(引号嵌套易失败)。", RiskLevel::Low, schema: schema, _args => { // 转调 get_app_config.rs handler(providers/settings/agent 配置读取 + 脱敏全在那) crate::commands::ai::get_app_config::execute_get_app_config(&ctx).await } ); }