//! 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
        }
    );
}
