cli:
  app_help: "AI Shell - 内置大模型能力的交互式 Shell"
  help_option_help: "显示此帮助信息并退出。"
  run_command_help: "启动 AI Shell"
  info_command_help: "显示 AI Shell 信息"
  check_langfuse_command_help: "检查 Langfuse 配置"
  setup_command_help: "运行交互式配置并退出"
  check_tool_support_command_help: "调试 tool-call 在线验证"

  models_auth_title: "模型认证: {provider}"
  checking_existing_auth: "检查现有认证状态..."
  oauth_not_implemented: "OAuth 流程尚未在 Rust 版本中实现。"
  oauth_hint: "请手动输入您的认证令牌。"
  skipping_browser: "(--no-open-browser: 跳过浏览器)"
  token_read_failed: "读取令牌失败。"
  token_empty: "令牌不能为空。"
  auth_configured: "已配置 {provider} 的认证。"
  default_model_set_success: "默认模型已设置为: {model}"
  save_config_failed: "保存配置失败: {error}"
  resume_failed: "恢复会话失败: {error}"

  uninstall:
    title: "AI Shell 卸载"
    installation_method: "安装方式: {method}"
    purge_warning: "--purge: 所有配置、数据和缓存文件将被删除。"
    purge_file_list: "将被删除的文件："
    cancelled: "已取消。"
    uninstalling: "正在卸载..."
    unknown_method: "无法检测安装方式。"
    attempting_removal: "尝试移除当前二进制文件..."
    uninstall_failed: "卸载失败: {error}"
    package_removed: "软件包已移除。"
    file_removed: "已移除 {name}: {path}"
    file_remove_failed: "移除 {path} 失败: {error}"
    proceed_uninstall: "确认卸载? [y/N]"
    config_purged: "配置、数据和缓存已清除。"
    purge_failed: "清除失败: {error}"
    goodbye: "AI Shell 已卸载。再见！"
    some_files_failed: "部分文件无法移除"
    refusing_unsafe_delete: "拒绝删除 {path}: 路径不安全"
    detect_method_failed: "检测安装方式失败: {error}"
    cannot_remove_binary: "无法确定二进制文件路径: {error}"
    failed_remove_binary: "移除二进制文件失败: {error}"

  update:
    http_error: "HTTP 客户端错误: {error}"
    check_failed: "检查更新失败: {error}"
    parse_releases_failed: "解析 releases 失败: {error}"
    parse_release_failed: "解析 release 失败: {error}"
    download_failed: "下载失败: {error}"
    file_create_failed: "创建文件失败: {error}"
    download_read_error: "下载读取错误: {error}"
    write_error: "写入错误: {error}"
    open_error: "打开错误: {error}"
    read_error: "读取错误: {error}"
    temp_dir_failed: "创建临时目录失败: {error}"
    extract_dir_failed: "创建解压目录失败: {error}"
    tar_failed: "运行 tar 失败: {error}"
    install_script_failed: "运行安装脚本失败: {error}"
    unsupported_platform: "不支持的平台: {platform}"
    unsupported_arch: "不支持的架构: {arch}"
    github_api_error: "GitHub API 返回状态码 {status}"
    extraction_failed: "解压失败: {error}"
    installation_failed: "安装失败: {error}"
    checking: "正在检查更新..."
    update_available: "有更新可用: {current} → {latest}"
    already_latest: "已是最新版本 ({version})。"
    downloading_from_github: "正在从 GitHub 下载..."
    downloading_from_mirror: "GitHub 下载失败，尝试镜像..."
    downloaded: "已下载: {path}"
    extracting: "正在解压归档..."
    install_sh_hash: "install.sh SHA256: {hash}"
    running_install_script: "正在运行安装脚本..."
    installation_successful: "安装成功！"
    download_install_prompt: "下载并安装? [y/N]"
    update_cancelled: "更新已取消。"
    installation_error: "安装错误: {error}"
    download_error: "下载失败: {error}"
    update_check_failed: "更新检查失败: {error}"
    install_sh_not_found: "归档中未找到 install.sh"
    progress_mb: "{label}: {downloaded:.1}/{total:.1} MB ({pct}%)"
    progress_mb_no_total: "{label}: {downloaded:.1} MB"
    pip_managed: "当前安装由 pip 管理。"
    pip_update_command: "请使用以下命令更新: {command}"
    pip_update_index_hint: "如果你最初是从 TestPyPI 或自定义索引安装的，请在更新时重复相同的索引参数。"
    pip_update_prompt: "现在执行 pip 更新命令吗? [y/N]"
    pip_update_success: "pip 更新已完成。"
    pip_update_failed: "pip 更新失败: {error}"

  models:
    help: "管理模型与 Provider 认证"
    usage_command_help: "显示当前 Provider 状态与用量面板信息"
    auth:
      help: "对 Provider 执行认证"
      login_command_help: "已废弃的兼容别名，请改用 `aish models auth`。"
      option:
        provider: "要认证的 Provider id(例如：openai-codex)。"
        model: "认证成功后写入配置的默认 Provider 模型。"
        set_default: "认证成功后，将配置中的 model 更新为该 Provider 模型。"
        auth_flow: "要使用的认证流程：browser、device-code 或 codex-cli。"
        force: "即使本地已有认证状态，也强制重新登录。"
        open_browser: "在浏览器认证流程中自动打开浏览器。"
        callback_port: "浏览器认证使用的本地回调端口。设为 0 表示使用临时端口。"
      unsupported_provider: "不支持的 Provider `{provider}`。当前支持：{supported}。"
      no_supported_provider: "当前构建中没有可认证的 Provider。"
      provider_required: "请先通过 --provider 指定要认证的 Provider。当前可认证的 Provider 有：{providers}。"
      provider_required_example: "示例：{command}"
      unsupported_auth_flow: "{provider} 不支持认证流程 `{auth_flow}`。"
      deprecated_login_hint: "`aish models auth login` 已废弃，请改用 `aish models auth`。"
      auth_ready: "{provider} 已完成认证：{auth_path}"
      default_model_set: "默认模型已设置为 {model}"
      model_available: "{provider} 已可用模型：{model}"

  models_usage:
    current_model: "当前模型"
    provider: "Provider"
    api_base: "API Base"
    status: "状态"
    dashboard: "面板"
    dashboard_unavailable: "无可用面板地址"
    unknown_provider: "未知 Provider"
    authenticated: "已认证"
    not_authenticated: "未认证"
    auth_file: "认证文件：{path}"
    expires_at: "过期时间：{timestamp}"
    api_key_configured: "已配置 API Key"
    api_key_from_env: "已通过 {env_var} 配置"
    api_key_masked: "凭证：{masked}"
    not_configured: "未配置凭证"
    api_key_hint: "请设置 {env_var}，或在配置文件中填写 api_key。"

  openai_codex:
    auth_not_found: "未找到 OpenAI Codex 认证信息。请先运行 `aish models auth --provider openai-codex`。"
    auth_read_failed: "读取 Codex 认证文件失败：{path}"
    auth_missing_tokens: "Codex 认证文件中缺少 ChatGPT OAuth tokens。请重新运行 `aish models auth --provider openai-codex`。"
    auth_incomplete: "Codex 认证信息不完整。请重新运行 `aish models auth --provider openai-codex`。"

  option:
    model: "要使用的模型(也可通过 AISH_MODEL 或配置文件设置)。"
    api_key: "大模型服务的 API Key(也可通过 AISH_API_KEY 或各厂商环境变量设置)。"
    api_base: "大模型服务的 API Base(也可通过 AISH_API_BASE 或配置文件设置)。"
    config: "配置文件路径(默认：~/.config/aish/config.yaml)。"

  setup:
    entry_title: "初始化配置"
    entry_header: "请选择 API 接入方式。"
    step_free_key: "免费 Key 配置"
    step_provider: "步骤 1/3：选择 Provider"
    step_provider_endpoint: "步骤 1.5/3：选择端点"
    step_key: "步骤 2/3：填写 API Key"
    step_model: "步骤 3/3：选择模型"
    free_key_header: "通过本机设备指纹获取免费 API Key。"
    free_key_detecting_location: "正在检测服务区域..."
    free_key_location_detected: "检测到区域：{location}"
    free_key_location_cn: "国内节点"
    free_key_location_overseas: "国际节点"
    free_key_registering: "正在注册免费 API Key..."
    free_key_success: "已获取免费 API Key"
    free_key_already_registered: "该设备已注册过免费Key"
    free_key_failed_with_reason: "免费 API Key 注册失败：{reason}"
    free_key_provider_label: "免费 API"
    free_key_privacy_title: "隐私声明"
    free_key_privacy_notice: |
      为了提供免费 API Key 服务，我们需要收集以下设备信息：

      • 设备指纹(基于 MAC 地址、磁盘序列号、主板序列号等硬件信息生成的哈希值)
      • 服务区域(用于分配最近的服务节点)

      用途说明：
      • 设备指纹用于防止滥用，确保每个设备只能获取一次免费 Key
      • 服务区域用于为您分配最近的服务节点

      我们承诺：
      • 不会收集任何个人身份信息
      • 设备指纹为不可逆的哈希值，无法还原原始硬件信息
      • 数据仅用于本服务，不会与第三方共享
    free_key_quota_exhausted: "免费额度已用完"
    free_key_quota_exhausted_hint: "您的免费 API Key 额度已耗尽，请配置您自己的 API Key 继续使用。"
    free_key_service_unavailable: "服务暂时不可用"
    free_key_service_unavailable_hint: "服务器资源已达上限或服务暂时不可用，请联系管理员增加配额，或配置您自己的 API Key 继续使用。"
    provider_header: "选择 Provider"
    provider_filter_prompt: "过滤："
    provider_filter_hint: "输入关键词实时过滤，↑/↓ 选择，回车确认，Esc 取消"
    provider_selected_label: "Provider"
    provider_endpoint_selected_label: "端点"
    provider_endpoint_header: "选择 {provider} API 端点"
    model_selected_label: "Model"
    provider_custom_note: "OpenAI-compatible"
    provider_preset_base: "预设 API Base"
    custom_api_base_title: "API Base URL"
    custom_api_base_header: "请输入 API Base URL。"
    provider_custom_api_base: "API Base URL"
    provider_custom_api_base_required: "API Base 不能为空"
    provider_custom_api_base_invalid: "API Base 无效，请输入完整 URL"
    provider_custom_default: "Custom"
    invalid_choice: "选择无效，请重试"
    filter_no_results: "没有匹配项，请重新输入或回车显示全部"
    api_key_header: "请输入 API Key(将保存到配置文件)"
    api_key_env_found: "检测到 {env_key}：{masked}"
    api_key_env_hint: "直接回车使用检测到的 Key，或输入新的 Key"
    api_key_prompt: "API Key"
    api_key_required: "API Key 不能为空"
    model_header: "当前 Provider：{provider}"
    model_prompt: "模型名称(输入 back 返回选择 Provider)"
    model_hint_openrouter: "OpenRouter 需要 provider 前缀(如 openai/gpt-4o)。未带前缀将默认使用 openai/。"
    model_hint_custom: "自定义 Provider 按 OpenAI-Compatible 处理，未带前缀将保存为 openai/<model>。"
    model_hint_provider: "推荐模型：{default}"
    model_list_unavailable: "模型列表不可用，请手动输入"
    model_filtering: "正在过滤支持工具调用的模型"
    model_filter_result: "已过滤出 {count} 个支持工具调用的模型"
    model_filter_empty: "未找到支持工具调用的模型，显示完整列表"
    model_filter_prompt: "过滤："
    model_filter_hint: "输入关键词过滤，↑/↓ 选择，回车确认，Esc 返回。选择自定义模型可手动输入。"
    model_custom_option: "自定义模型..."
    model_custom_required: "模型名称不能为空"
    model_custom_saved_as: "将保存为：{model}"
    verify_title: "验证"
    verify_header: "正在验证模型的工具调用能力..."
    verify_connectivity_in_progress: "正在检查连通性..."
    verify_tool_in_progress: "正在检查工具调用能力..."
    verify_static_no_tool_support: "模型不支持工具调用(静态检测)"
    verify_simple_success: "验证成功"
    verify_simple_failed_with_reason: "验证失败：{reason}"
    verify_failed_unknown: "未知错误"
    verify_live_label: "在线验证"
    verify_live_detail: "详情"
    verify_timeout: "在线验证超时"
    verify_cancelled: "在线验证已终止"
    verify_model_prefix_required: "设置 API Base 时，模型名必须带 provider 前缀，例如 openai/{model}"
    verify_no_tool_call_required: "强制调用未返回工具调用"
    verify_no_tool_call_auto: "自动模式未触发工具调用"
    debug_request_title: "在线请求({mode})"
    debug_response_title: "在线响应({mode})"
    debug_error_title: "在线错误({mode})"
    support_yes: "支持"
    support_no: "不支持"
    support_unknown: "未知"
    litellm_missing: "未安装 litellm，无法验证"
    action_header: "下一步操作："
    action_prompt: "请选择操作序号"
    action_retry_model: "重新选择模型"
    action_retry_api_base: "重新输入 API Base"
    action_retry_api_key: "重新输入 API Key"
    action_retry_free_key: "重试免费 Key 注册"
    action_fallback_manual: "切换到手动配置"
    action_use_free_key: "使用免费 API Key"
    action_manual_setup: "手动配置 Provider"
    action_change_provider: "更换 Provider"
    action_continue: "继续保存(不推荐)"
    action_exit: "退出配置"
    action_agree: "同意并继续"
    action_disagree: "不同意"
    retry_api_base_prompt: "请输入 API Base(输入 back 返回)"
    retry_api_base_prompt_with_current: "请输入 API Base(当前：{current}，输入 back 返回)"
    retry_api_base_required: "API Base 不能为空"
    saved: "配置已保存"
    saved_with_warning: "配置已保存(未验证 tool call)"
    non_interactive: "当前环境不可交互，无法运行配置向导"
    cancelled: "配置已取消"
    required_cancelled: "缺少必要配置，已退出"
    connectivity_ok: "连通性正常({}ms)"
    config_path: "配置文件路径：{}"
    setup_complete_hint: "现在可以运行 \x1b[1maish\x1b[0m 启动 shell。"

  startup:
    label:
      skills: "技能"
    goodbye: "👋 再见！"
    config_file_error: "❌ 配置文件错误：{error}"
    config_file_hint: "💡 使用 --config 指定有效的配置文件路径"

  langfuse:
    incomplete: "⚠️  Langfuse 配置不完整"
    missing: "   缺少: {var}"
    complete: "✅ Langfuse 配置完整"
    script_failed: "检查脚本执行失败: {error}"
    script_not_found: "未找到 check_langfuse.py 脚本"
    run_from_root: "请确保在项目根目录运行此命令"

  parse_errors:
    title: "错误"
    missing_command: "缺少子命令。"
    missing_command_hint: "可用命令：{commands}。运行 {help_command} 查看用法。"
    try_help_hint: "运行 {help_command} 查看用法。"
    missing_option: "缺少必填选项：{option}。"
    option_requires_argument: "选项 {option} 需要一个参数。"
    no_such_option: "未知选项：{option}"
    missing_parameter: "缺少参数：{param}"
    invalid_value_for_option: "选项 {option} 的值无效：{reason}"
    generic: "参数错误：{message}"
    models_auth:
      provider_example: "示例：{command}"

shell:
  welcome2:
    header: ">_ AI Shell {version}"
    model_hint: "(输入 /model 切换模型)"
    label:
      model: "模型"
      config: "配置"
    quick_start:
      title: " 快速开始："
      item1_prefix: "原生支持 Shell 命令："
      cmd_ls: "ls"
      cmd_top: "top"
      cmd_vim: "vim"
      cmd_ssh: "ssh"
      item1_suffix: " 等"
      item2_prefix: "向 AI 提问："
      item2_example: "以 `;` 开头提问(如：; 如何查找大文件？)"
      item3_prefix: "获取帮助："
      item3_suffix_1: "输入 "
      item3_keyword: "help"
      item3_suffix_2: " 查看内置帮助与用法"
    risk: "AI 生成内容有风险，请仔细甄别！"
    skills_loaded_suffix: " 已加载"

  # 通用错误消息
  general_error: "错误: {error}"
  readline_init_failed: "初始化 readline 失败: {error}"
  readline_error: "Readline 错误: {error}"
  unknown_command: "未知特殊命令: {command}"
  config_save_warning: "警告：无法保存配置: {error}"

  # 模型切换
  model_usage: "用法: /model [模型名称]"
  switching: "正在验证模型: {model}"

  # 计划模式
  plan_mode_enabled: "=== 计划模式 ==="
  plan_mode_hint: "输入 ; 后跟你的规划请求。"
  plan_mode_disabled: "已退出计划模式。"
  plan_approved: "✓ 计划已批准。实现工具现已可用。"
  plan_approved_hint: "输入 ; 继续实施。"
  plan_changes_requested: "→ 需要更改。重新进入计划模式..."
  plan_feedback_sent: "  反馈已发送给 AI。输入 ; 继续规划。"
  plan_review_cancelled: "计划审查已取消。已退出计划模式。"
  plan_review_hint: "使用 /plan 开始新的规划会话。"

  # 思考动画
  thinking_time: "思考: {time}s"

  # 分析环境
  analyzing_environment: "正在分析环境..."

  # 状态消息
  check_status: "  {status} {name}"
  interrupted: "已中断"
  ctrl_c_again: "1 秒内再次按 Ctrl+C 退出"
  exiting: "正在退出..."
  exit_goodbye: "正在退出 Shell。再见！"

  # 确认对话框
  confirm_dialog_title: "工具执行"
  confirm_dialog_tool: "工具："
  confirm_dialog_question: "允许? [y/N]"

  # 提示符
  prompt_prefix: "执行"

  # 安全消息(上面已定义，此处保留作为参考)

  security:
    panel_title:
      blocked: "🛑 安全拦截"
      notice: "🔐 安全提示"
      confirm: "🔐 需要确认"
    title:
      blocked: "🛑 安全拦截：{tool}"
      notice: "🔐 安全提示：{tool}"
      confirm: "🔐 需要确认：{tool}"
    label:
      description: "说明"
      command: "命令"
      target: "目标"
      content_preview: "内容预览"
      fallback_hint: "提示"
      risk_level: "风险等级"
      reasons: "原因"
      alternatives: "替代方案"
      impact: "影响"
      no_additional_info: "未提供更多信息。"

    fallback:
      sandbox_execute_failed: "命令预执行失败，无法检测命令风险，请确认后执行。"
      sandbox_timeout: "命令预执行超时，无法检测命令风险，请确认后执行。"
      sandbox_ipc_timeout: "等待命令预评估超时，无法检测命令风险，请确认后执行。"
      generic: "未能完成命令风险评估，请确认后执行。"
    alternative:
      generic: "请人工复核该命令并在确认影响后再执行。"
      etc_manual: "如需修改 /etc 下文件，建议采用人工变更并配合变更管理或备份策略。"
    secret:
      title: "安全警告"
      detected: "检测到输入中包含敏感数据：\n  {reasons}\n\n请选择处理方式："
      redact: "替换为环境变量发送 (安全)"
      allow: "明文发送给 AI"
      abort: "取消"
      aborted: "已取消：检测到敏感数据。"
      redacted: "已将 {count} 个敏感数据替换为环境变量占位符（仅保存在内存中，未发送给 AI）"
      restored: "（已还原 {count} 个环境变量，仅保存在内存中，未发送给 AI）"
      option_esc: "[Enter 确认, ↑↓ 选择, Esc 取消]"
    options_header: "选项"
    option:
      approve: "允许"
      approve_remember: "允许，并不再对该命令询问"
      cancel: "取消"
    choice_prompt: "你的选择(默认：n)："

  command_cancelled: "命令已取消"

  session:
    tool_bash: "🔧 使用工具: bash ({command})"
    confirm_execute: "⚠ 是否执行? [Y/n]"
    running: "执行中..."
    ai_cancelled: "[AI 已取消]"
    ai_error: "[AI 处理出错，未返回结果]"
    probing: "正在检测远程环境..."
    ask_user:
      custom_input_label: "输入自定义答案"
      default_hint: "[default: {default}]"
      help_with_cancel: "Esc 取消，Enter 选择"
      help_no_cancel: "Enter 选择"
      min_length_error: "答案太短(最少 {min} 个字符)"
      tool_banner: "🔧 使用工具: ask_user ({preview})"
      choice_preview: "choice_or_text: {prompt} [{count} 个选项]"
      text_preview: "text_input: {prompt}"
    thinking: "思考中"
    thinking_elapsed: "思考中 {elapsed}s"
    iteration_limit_reached: "已执行 {count} 轮工具调用。"
    iteration_limit_title: "⏸ 工具调用次数达到上限"
    iteration_continue_prompt: "是否继续？[Y/n]"

  resume:
    exit_command: "恢复会话: aish resume {session_id}"
    usage: "用法: /resume [session_id]"
    session_store_unavailable: "会话存储不可用。"
    no_sessions: "未找到历史会话。"
    recent_header: "最近会话(最多 {limit} 条):"
    list_hint: "使用 /resume <session_id> 恢复会话"
    list_failed: "列出会话失败: {error}"
    not_found: "未找到会话: {session_id}"
    cwd_missing: "保存的工作目录已不存在，将停留在当前目录: {cwd}"
    resumed: "已恢复会话: {session_id}"
    selector_title: "恢复会话"
    search_placeholder: "搜索..."
    no_matches: "没有匹配的会话。"
    current_marker: "(当前)"
    selector_footer: "输入以搜索 · ↑/↓ 选择 · Enter 恢复 · Esc 取消"

  error_correction:
    press_semicolon_hint: "命令执行失败。输入 ; 后按 Enter 自动分析修复，或直接输入下一条命令。"
    corrected_command_label: "修复建议:"
    corrected_command_title: "💡 纠正后的命令:"
    confirm_execute_prefix: "执行: "
    confirm_execute_suffix: "? (Y/n): "
    no_valid_command: "无法确定正确的命令"
    retry_hint: "输入 ';' 告诉 AI 你想做什么，它会帮你找到正确的命令"

  nl_detection:
    confirm_ask_ai: "这看起来像自然语言问题，是否让 AI 解答？(Y/n)"

  error:
    execution_error: "❌ 执行过程中出错: {error}"
    pty_decode_error: "捕获 pty 输出解码错误: {error}"
    potential_error: "🚀 潜在错误: {reason}, 尝试解决....."
    llm_error_title: "❌ 大模型请求失败"
    llm_error_message: "错误: {error}"
    llm_error_details_title: "调试详情"
    tool_args_json_invalid_hint: "❌ 请求失败，请重试。"
    pty_error: "PTY 错误：{error}"
    restart_bash_failed: "重启 bash 失败：{error}"
    load_script_failed: "加载脚本 '{script}' 失败：{error}"

  hint:
    run_setup: "输入 /setup 重新配置 API Key"

  prompt:
    confirm_execute: "?是否执行此命令? [y/n]: "
    ai_hint: "';' Ask AI ..."

  model:
    current: "当前模型: {model}"
    unset: "未设置"
    invalid: "模型名称不能为空"
    switching: "正在验证模型: {model}"
    switch_same: "模型未变更，仍为: {model}"
    switch_success: "已切换模型: {model}"
    verify_failed: "模型验证失败: {reason}"

  token:
    title: "Token 统计 (近 7 天)"
    input_tokens: "输入 tokens"
    output_tokens: "输出 tokens"
    total: "总计"
    api_calls: "API 调用次数"

  setup:
    no_config_manager: "无法重新配置：配置管理器不可用"
    cancelled: "配置已取消，保持当前设置不变"
    applied: "配置已更新，当前模型: {model}"

  ask_user:
    title: "请选择"
    custom_label: "自定义："
    hint_select: "按 Enter 键确认 · 按 ↑/↓ 键导航 · 按 Esc 取消"
    hint_custom: "按 Enter 键确认 · 按 ↑/↓ 键导航 · 按 Tab 或直接输入进入自定义内容 · 按 Esc 取消"
    paused:
      title: "⏸ 需要你的选择(任务已暂停)"
      prompt: "问题：{prompt}"
      reason: "原因：{reason}"
      options_header: "可选项："
      custom_input: "你也可以直接回复任意自定义内容。"
      how_to: "你可以直接回复选项 value(或编号)，或输入 `; 使用默认继续` / `; continue with default`(默认：{default})。如有选项说明，会显示在选项下方。"

  diagnose_cancelled: "  └─ ❌ 系统诊断已取消"

  compaction:
    completed: "上下文已压缩"
    completed_with_tokens: "上下文已压缩，约释放 {tokens} tokens"

  status:
    thinking: "思考中"
    compacting_context: "正在压缩上下文"
    thinking_now: "正在思考"
    processing: "处理中"
    analyzing: "  分析中..."
    system_diagnosing: "  └─ 系统诊断中"
    system_analyzing: "  └─ 系统分析中"

  tool:
    prefix: "🔧 使用工具"
    prefix_diagnose: "  └─ 🔧 诊断工具"
    done_diagnose: "  └─ ✅ 诊断完成"

security:
  sandbox_off_action:
    allow: "直接放行"
    confirm: "需要确认"
    block: "阻断"
  sandbox_unavailable:
    title: "⚠️ 沙箱不可用"
    line1: "检测到沙箱不可用，无法评估命令风险。"
    line2: "后续 AI 生成命令将按“{action}”处理。"
    policy_line1: "沙箱已按策略关闭，未执行沙箱预跑。"
    policy_line2: "后续 AI 命令将按“{action}”处理。"
    reason: "原因：{reason}"
    error: "错误：{error}"
    root_required: "沙箱需要 root 权限"
    ipc_unavailable: "无法连接沙箱服务（aish-sandbox.socket 未运行或未安装）"
    ipc_failed: "沙箱服务启动失败（aish-sandbox）"
    sandbox_execute_failed: "无法评估命令风险，请确认后执行"

  risk_reason:
    sandbox_disabled_by_policy: "策略配置已关闭沙箱，无法获取文件变更信息进行风险评估；将按“{action}”处理。"
    sandbox_disabled: "沙箱未启用或配置为关闭，无法获取文件变更信息进行风险评估；将按“{action}”处理。"
    cwd_outside_repo_root: "当前工作目录 {cwd} 不在沙箱根目录 {root} 下，无法可靠评估相对路径副作用；将按“{action}”处理。"
    sandbox_unavailable: "沙箱构建/执行失败，未能获取文件变更信息进行风险评估；将按“{action}”处理。"
    sandbox_exception: "沙箱执行异常，未能获取文件变更信息进行风险评估；将按“{action}”处理。"
    sandbox_failed: "沙箱执行失败，未能获取文件变更信息进行风险评估；将按“{action}”处理。"
    policy_fallback_rule_match: "沙箱按策略关闭时，命令 {command} 命中了 {count} 条兜底规则路径；按 {risk} 风险处理。"

  ai_risk:
    no_fs_changes: "沙箱执行未检测到任何文件写入或删除。"
    high_hits: "检测到命中高风险规则的路径写入/删除，共 {count} 处。"
    medium_hits: "检测到命中中风险规则的路径写入/删除，共 {count} 处。"
    low_or_unmatched_hits: "检测到低风险或未命中规则的路径写入/删除，共 {count} 处。"
    preview_paths: "示例路径(不完整，可能含目录/文件): {paths}"

  command_blocked: "错误：命令被安全系统拦截"
  command_blocked_with_reason: "错误：命令被安全系统拦截：{reason}"

tools:
  smart_log:
    description: "自动判断日志来源，根据查询分析日志，并返回匹配摘要。"
    param:
      query: "你的诊断问题，例如\"nginx 配置是否正确\"或\"是否存在可疑登录\"。"
      path: "可选。日志路径(文件/目录)或 systemd 单元名。若为空，将根据查询自动推断。"
    summary:
      file: "[文件] {ident}：匹配 {matched}/{total} 行\n示例：\n{sample}"
      dir: "[目录] {path}：匹配 {matched}/{total} 行\n示例：\n{sample}"
      systemd: "[SYSTEMD] {ident}：匹配 {matched}/{total} 行\n示例：\n{sample}"
      call_failed: "[{stype}] {ident}：调用失败\n{output}"
    no_logs_found: "未找到任何日志或匹配信息。"

  bash:
    description: "执行 bash 命令并返回输出。使用此工具运行 shell 命令。重要：每条命令都需要用户确认。如果用户拒绝（N）或取消（Ctrl+C），你绝对不能重试相同或类似的命令——应确认取消并调整方案。"
    security_handling_required: "bash 命令需要 {level} 级安全处理"
    param:
      command: "要执行的 bash 命令"
      timeout: "超时时间(秒)(默认：120)"
    missing_command: "缺少 'command' 参数"
    execute_failed: "执行失败: {error}"
    output_truncated: "[...截断了 {bytes} 字节...]\n{tail}"
    truncated_notice: "[...截断了 {bytes} 字节...]"

  fs:
    read_file:
      description: "读取文件内容"
      param:
        path: "要读取的文件路径"
        offset: "开始读取的行偏移(从 0 开始)"
        limit: "要读取的最大行数"
      missing_path: "缺少 'path' 参数"
      read_failed: "读取 {path} 失败: {error}"
      file_too_large: "文件 {path} 为 {size} 字节，超过了 {limit} 字节(32KB)的限制"
      decode_failed: "无法将 {path} 解码为 UTF-8: {error}"
      empty_file: "(空文件)"
      offset_exceeds_length: "偏移量 {offset} 超过了文件长度({length})"
    write_file:
      description: "将内容写入文件(创建或覆盖)"
      param:
        path: "要写入的文件路径"
        content: "要写入的内容"
      missing_path: "缺少 'path' 参数"
      missing_content: "缺少 'content' 参数"
      create_dirs_failed: "创建父目录失败: {error}"
      write_success: "已写入 {bytes} 字节到 {path}"
      write_failed: "写入 {path} 失败: {error}"
    edit_file:
      description: "通过替换特定字符串来编辑文件"
      param:
        path: "文件路径"
        old_string: "要替换的文本"
        new_string: "替换后的文本"
        replace_all: "替换所有出现的位置(默认：false)"
      missing_path: "缺少 'path' 参数"
      missing_old_string: "缺少 'old_string' 参数"
      missing_new_string: "缺少 'new_string' 参数"
      edit_read_failed: "读取 {path} 失败: {error}"
      old_string_not_found: "在 {path} 中未找到 'old_string'"
      old_string_ambiguous: "'old_string' 在 {path} 中出现了 {count} 次 - 使用 replace_all=true 或提供更多上下文"
      edit_success: "已编辑 {path}"
      edit_write_failed: "写入 {path} 失败: {error}"

  ask_user:
    description: "向用户提问以明确其意图。使用 'text_input' 进行自由式提问，或使用 'choice_or_text' 进行多选并可自定义输入。"
    param:
      kind: "交互类型：text_input 用于自由输入，choice_or_text 用于选项加自定义输入"
      prompt: "要向用户提出的问题"
      options: "choice_or_text 的预定义选项"
      title: "问题的可选标题"
      default: "默认值"
      placeholder: "占位符文本"
      required: "用户是否必须提供答案(默认：true)"
      allow_cancel: "用户是否可以取消/跳过(默认：true)"
      min_length: "文本输入的最小长度(默认：0)"
    missing_prompt: "缺少 'prompt' 参数"
    unknown_kind: "未知类型: {kind}"
    custom_input_label: "(输入自定义答案)"
    help_select_with_cancel: "1-9 快选 · ↑/↓ 移动 · Enter 选择 · Esc 取消"
    help_select_no_cancel: "1-9 快选 · ↑/↓ 移动 · Enter 选择"
    custom_input_prompt: "输入你的答案："
    custom_input_help_cancel: "Esc 返回"
    custom_input_help_no_cancel: "Esc 返回选项"
    answer_required: "必须提供答案"
    answer_too_short: "答案太短(最少 {min_length} 个字符)"
    user_input_prefix: "用户输入: {input}"
    read_input_failed: "读取用户输入失败"
    cancelled: "(已取消)"
    options_not_empty: "choice_or_text 的 options 必须是非空列表"

  memory:
    description: "搜索、存储或管理长期记忆。使用 'search' 查找相关的过往知识，'store' 保存重要信息，'list' 查看最近的记忆，'forget' 删除过时信息。"
    param:
      action: "要执行的记忆操作"
      query: "搜索查询(用于 'search' 操作)"
      content: "要存储的内容(用于 'store' 操作)"
      category: "存储记忆的类别(默认：other)"
      memory_id: "要忘记的记忆 ID(用于 'forget' 操作)"
    missing_action: "缺少 'action' 参数"
    unknown_action: "未知操作: {action}。请使用 search/store/forget/list。"
    search_missing_query: "search 缺少 'query' 参数"
    store_missing_content: "store 缺少 'content' 参数"
    forget_missing_id: "forget 缺少 'memory_id' 参数"
    no_results: "未找到匹配的记忆。"
    stored: "已存储为记忆 #{id}。"
    forgot: "已忘记记忆 #{id}。"
    not_found: "未找到记忆 #{id}。"
    empty: "还没有记忆。"
    not_available: "记忆功能不可用"

  host_note:
    description: "保存、查看或删除当前远程主机的备注。当用户告诉你关于此服务器的重要信息（部署的服务、已知问题、关键路径等）时使用 'store' 保存。使用 'list' 查看已有备注。使用 'forget' 并提供关键词删除匹配的备注。"
    param:
      action: "备注操作: store、list 或 forget"
      content: "要保存的备注内容(用于 'store' 操作)"
      keyword: "用于匹配删除备注的关键词(用于 'forget' 操作)"
    missing_action: "缺少 'action' 参数"
    unknown_action: "未知操作: {action}。请使用 store/list/forget。"
    store_missing_content: "store 缺少 'content' 参数"
    forget_missing_keyword: "forget 缺少 'keyword' 参数"
    empty: "此主机暂无备注。"
    stored: "备注已保存。"
    forgot: "已删除 {count} 条备注。"
    forgot_none: "未找到匹配的备注。"

  python:
    description: "执行任意 Python 代码并返回结果。使用 print() 输出。"
    param:
      code: "要执行的 Python 代码。"
    missing_code: "缺少 'code' 参数"
    not_installed: "未安装 Python 3 或不在 PATH 中。"
    execute_failed: "执行 Python 失败: {error}"
    no_output: "Python 代码执行成功，无输出。"

  grep:
    description: "使用正则表达式在文件中搜索模式"
    param:
      pattern: "要搜索的正则表达式模式"
      path: "要搜索的文件或目录"
      recursive: "在目录中递归搜索"
      case_insensitive: "不区分大小写搜索"
      invert_match: "显示不匹配的行"
      line_numbers: "显示行号"
      count_only: "仅显示匹配行的计数"
    missing_pattern: "缺少 'pattern' 参数"
    invalid_regex: "错误：无效的正则表达式: {error}"

  glob:
    description: "查找匹配 glob 模式的文件"
    param:
      pattern: "匹配文件的 glob 模式"
      path: "搜索的基础目录(默认：当前目录)"
    missing_pattern: "缺少 'pattern' 参数"
    invalid_glob: "错误：无效的 glob 模式: {error}"

help:
  labels:
    usage: "用法"
    options: "选项"
    examples: "示例"
    notes: "说明"
    brief_usage: "用法：{usage}"

  general:
    title: "📖 AI Shell 帮助"
    markdown: |-
      ## 可用命令：

      ### 目录导航
      - `cd [-L|[-P [-e]]] [directory]` - 切换目录(完整参数支持)
      - `pushd [directory]` - 将目录压入栈并切换
      - `popd` - 弹出目录栈并切换
      - `dirs [-c]` - 显示目录栈

      ### 历史管理
      - `history [options] [n]` - 查看命令历史
      - `history -c` - 清空历史
      - `history -d offset` - 删除指定位置的历史条目

      ### 环境变量
      - `export [-fn] [name[=value] ...]` - 设置/导出环境变量
      - `export -p` - 显示所有已导出的变量
      - `unset [-fv] [name ...]` - 取消设置环境变量
      - `pwd [-L|-P]` - 显示当前工作目录

      ### 通用命令
      - `help` - 显示本帮助
      - `clear` - 清屏
      - `exit` - 退出 shell
      - `/model [模型名称]` - 查看或切换模型
      - `/setup` - 重新配置 API 设置

      ### AI 命令
      - `； <question>` - 向 AI 助手提问

      ### 功能特性
      - ✅ 所有命令完整 PTY 支持
      - ✅ 命令历史与 AI 上下文融合
      - ✅ AI 输出 Rich 美化
      - ✅ 信号处理与优雅退出

      ### 获取更多帮助
      对任意命令使用 `<command> --help` 或 `<command> -h` 查看详细帮助。

      ### 示例
      ```bash
      history --help       # 查看 history 的详细帮助
      cd --help            # 查看 cd 的详细帮助
      export JAVA_HOME="/usr/lib/jvm/java-11"  # 设置环境变量
      unset TEMP_VAR       # 删除环境变量
      ； explain ls -la     # 让 AI 解释命令
      ```

  command:
    history:
      title: "📚 history 命令"
      description: "显示或管理命令历史"
      usage: "history [options] [n]"
      options:
        - ["--help, -h", "显示本帮助信息"]
        - ["-c", "删除所有条目并清空历史列表"]
        - ["-d offset", "删除指定位置 offset 的历史条目"]
        - ["n", "仅显示最近 n 条命令"]
      examples:
        - "history              # 显示全部命令历史"
        - "history 10           # 显示最近 10 条命令"
        - "history -c           # 清空历史"
        - "history -d 5         # 删除第 5 条历史"
        - "history --help       # 显示本帮助信息"
      notes: "所有已执行命令与 AI 交互都会自动记录到历史中。"

    cd:
      title: "📁 cd 切换目录"
      description: "切换当前工作目录(完整参数支持)"
      usage: "cd [-L|[-P [-e]]] [directory]"
      options:
        - ["-L", "强制跟随符号链接：在处理 '..' 后再解析符号链接(默认)"]
        - ["-P", "使用物理目录结构：在处理 '..' 前解析符号链接"]
        - ["-e", "当指定 -P 且无法确定当前目录时，以非 0 状态退出"]
        # - ["-@", "在支持的系统上，将带扩展属性的文件视为包含属性的目录"]
        - ["directory", "目标目录路径(可选，默认回到 home 目录)"]
        - ["-", "返回上一个目录"]
      examples:
        - "cd ~                 # 切换到 home 目录"
        - "cd /tmp              # 切换到 /tmp"
        - "cd -                 # 返回上一个目录"
        - "cd \"path with spaces\" # 路径含空格时使用引号"
        - "cd -P /tmp           # 使用物理路径解析"
        - "cd -P -e /tmp        # 使用物理路径解析，出错则退出"
        - "cd -L /tmp           # 强制跟随符号链接(默认行为)"
        # - "cd -@ /tmp           # 显示扩展属性(若支持)"
      notes: "支持 tab 补全与特殊字符路径处理；默认行为为 -L(跟随符号链接)。"

    pushd:
      title: "📤 pushd 目录入栈"
      description: "将目录压入栈并切换到该目录"
      usage: "pushd [directory]"
      options:
        - ["directory", "目标目录路径"]
        - ["(no args)", "交换目录栈顶的两个目录"]
      examples:
        - "pushd /tmp           # 将当前目录入栈并切换到 /tmp"
        - "pushd                # 在当前目录与上一个目录间切换"
      notes: "维护目录栈，便于在多个目录间快速切换。"

    popd:
      title: "📥 popd 目录出栈"
      description: "弹出目录栈并切换到该目录"
      usage: "popd"
      options: []
      examples:
        - "popd                 # 从目录栈返回上一个目录"
      notes: "移除目录栈顶目录并切换到新的栈顶目录。"

    dirs:
      title: "📋 dirs 显示目录栈"
      description: "显示当前目录栈"
      usage: "dirs [-c]"
      options:
        - ["-c", "清空目录栈"]
      examples:
        - "dirs                 # 显示当前目录栈"
        - "dirs -c              # 清空目录栈"
      notes: "显示当前导航目录栈中的所有目录。"

    help:
      title: "❓ help 帮助"
      description: "显示可用命令与功能概览"
      usage: "help"
      options: []
      examples:
        - "help                 # 显示通用帮助信息"
      notes: "提供所有可用命令与 shell 功能的概览。"

    clear:
      title: "🧹 clear 清屏"
      description: "清空终端屏幕"
      usage: "clear"
      options: []
      examples:
        - "clear                # 清空终端屏幕"
      notes: "等同于标准 Unix 的 clear 命令。"

    exit:
      title: "🚪 exit 退出"
      description: "退出 AI Shell"
      usage: "exit"
      options: []
      examples:
        - "exit                 # 退出 shell"
        - "quit                 # 也可以用 quit 退出"
      notes: "将会干净地退出 shell，并保留会话数据。"

    export:
      title: "🔧 export 导出环境变量"
      description: "设置或显示带 export 属性的环境变量"
      usage: "export [-fn] [name[=value] ...]\nexport -p"
      options:
        - ["-f", "名称指向 shell 函数(不支持)"]
        - ["-n", "移除每个名称的 export 属性"]
        - ["-p", "显示所有已导出的变量"]
        - ["--", "停止进一步的选项处理"]
      examples:
        - "export PATH=/usr/local/bin:$PATH"
        - "export EDITOR=vim"
        - "export -n VAR  # 移除 VAR 的 export 属性"
        - "export -p      # 显示所有已导出的变量"
        - "export JAVA_HOME=\"/usr/lib/jvm/java-11-openjdk\""
        - "export -- -VAR  # 设置名为 -VAR 的变量"
      notes: "通过 export 设置的环境变量会传递给子进程。"

    unset:
      title: "🗑️ unset 取消变量"
      description: "取消设置 shell 变量与函数"
      usage: "unset [-f] [-v] [-n] [name ...]"
      options:
        - ["-f", "名称指向 shell 函数(不支持)"]
        - ["-v", "名称指向 shell 变量(默认)"]
        - ["-n", "名称指向 name reference(不支持)"]
        - ["--", "停止进一步的选项处理"]
      examples:
        - "unset TEMP_VAR"
        - "unset -v VAR1 VAR2"
        - "unset JAVA_HOME"
        - "unset -- -VAR  # 取消名为 -VAR 的变量"
      notes: "从 shell 环境中移除变量；不存在的变量会被忽略。"

    pwd:
      title: "📍 pwd 显示当前目录"
      description: "显示当前工作目录(支持符号链接处理)"
      usage: "pwd [-L|-P]"
      options:
        - ["-L", "显示逻辑路径(跟随符号链接，默认)"]
        - ["-P", "显示物理路径(解析符号链接)"]
      examples:
        - "pwd                  # 显示逻辑当前目录"
        - "pwd -L               # 显示逻辑路径(遵循符号链接)"
        - "pwd -P               # 显示物理路径(解析符号链接)"
      notes: "默认行为显示逻辑路径，并尊重符号链接。"

    ";":
      title: "🤖 AI 助手"
      description: "向 AI 助手提问"
      usage: "; <question>"
      options:
        - ["question", "你要问 AI 的问题"]
      examples:
        - "; 如何查找大文件？"
        - "; 解释这个命令：ls -la"
        - "; 有什么更好的方式压缩文件？"
      notes: "AI 助手可用于命令解释、建议以及一般的 shell 使用帮助。"

    "；":
      title: "🤖 AI 助手"
      description: "向 AI 助手提问"
      usage: "； <question>"
      options:
        - ["question", "你要问 AI 的问题"]
      examples:
        - "； 如何查找大文件？"
        - "； 解释这个命令：ls -la"
        - "； 有什么更好的方式压缩文件？"
      notes: "AI 助手可用于命令解释、建议以及一般的 shell 使用帮助。"

    "/model":
      title: "🧠 model 切换模型"
      description: "显示当前模型或切换到指定模型"
      usage: "/model [模型名称]"
      options:
        - ["模型名称", "要切换到的模型标识(会进行 tool-call 能力验证)"]
        - ["--help, -h", "显示本帮助信息"]
      examples:
        - "/model               # 显示当前模型"
        - "/model gpt-4         # 切换到指定模型"
        - "/model --help        # 显示帮助"
      notes: "切换会进行连通性与工具调用能力验证；失败则不会切换。"

    "/setup":
      title: "⚙️ setup 重新配置"
      description: "重新运行交互式配置向导，更改 API 设置(Provider、API Key、模型)"
      usage: "/setup"
      options:
        - ["--help, -h", "显示本帮助信息"]
      examples:
        - "/setup               # 启动配置向导"
        - "/setup --help        # 显示帮助"
      notes: "配置完成后会自动应用新设置，无需重启。取消则保持当前配置不变。"

errors:
  litellm_not_installed: "litellm 模块未安装"

llm:
  oauth:
    browser_login_opening: "正在打开浏览器进行 {display_name} 登录。如果未自动打开，请访问：\n{url}"
    browser_login_manual: "请在浏览器中打开以下链接以完成 {display_name} 认证：\n{url}"
    device_code_visit: "\n要完成认证，请访问：\n  {verification_uri}"
    device_code_enter: "并输入代码：{user_code}\n"
    failed_bind_port: "绑定端口 {port} 失败：{error}"
    failed_accept_callback: "接受回调连接失败：{error}"
    failed_read_callback: "读取回调请求失败：{error}"
    oauth_error: "OAuth 错误：{error}"
    no_auth_code: "未收到授权码"
    state_mismatch: "状态不匹配 - 可能是 CSRF 攻击"
    device_code_not_supported: "提供者不支持设备代码流程"
    device_code_request_failed: "设备代码请求失败：{error}"
    device_code_parse_failed: "解析设备代码响应失败：{error}"
    missing_user_code: "设备代码响应中缺少 user_code"
    missing_verification_uri: "设备代码响应中缺少 verification_uri"
    missing_device_code: "设备代码响应中缺少 device_code"
    token_polling_failed: "令牌轮询请求失败：{error}"
    token_polling_parse_failed: "解析令牌轮询响应失败：{error}"
    device_code_auth_failed: "设备代码认证失败：{error}"
    token_exchange_failed: "令牌交换请求失败：{error}"
    token_exchange_parse_failed: "解析令牌响应失败：{error}"
    token_exchange_error: "令牌交换错误：{error}"
    failed_open_url: "打开 URL 失败：{error}"
    auth_successful: "认证成功！"
    auth_successful_close: "您可以关闭此标签页并返回终端。"
