## ADDED Requirements ### Requirement: 敏感字段通过系统 keyring 或环境变量存储 ConfigManager SHALL 提供 `get_secure(key: str) -> str` 和 `set_secure(key: str, value: str)` 接口,用于读写需要保护的配置项(API Key 等)。读取优先级:环境变量 `AUTOBOT_` > 系统 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 不显示原始值