## ADDED Requirements

### Requirement: 敏感字段通过系统 keyring 或环境变量存储
ConfigManager SHALL 提供 `get_secure(key: str) -> str` 和 `set_secure(key: str, value: str)` 接口，用于读写需要保护的配置项（API Key 等）。读取优先级：环境变量 `AUTOBOT_<KEY>` > 系统 keyring > `config.json` 明文（兼容旧版，读取后自动迁移）。`config.json` 中已迁移的字段值替换为占位符字符串 `"[keyring]"`。

#### Scenario: 首次读取明文 API Key 时自动迁移
- **WHEN** 调用 `get_secure("api_key")` 且 `config.json` 中该字段为普通字符串（非占位符）
- **THEN** 系统将该值写入 keyring，将 `config.json` 中该字段更新为 `"[keyring]"`，并返回原始值

#### Scenario: keyring 不可用时降级为明文
- **WHEN** 系统 keyring 后端不可用（抛出 `NoKeyringError`）且无对应环境变量
- **THEN** `get_secure()` 直接读取 `config.json` 中的明文值，并打印 WARNING 日志，不抛出异常

#### Scenario: 环境变量优先于 keyring
- **WHEN** 环境变量 `AUTOBOT_API_KEY` 已设置且 keyring 中也有相同 key 的值
- **THEN** `get_secure("api_key")` 返回环境变量的值

#### Scenario: 通过 UI 设置新的 API Key
- **WHEN** 用户在 Gradio UI 中输入新的 API Key 并保存
- **THEN** 调用 `set_secure("api_key", value)` 将值存入 keyring（或在降级模式下写入 `config.json`），UI 不显示原始值
