## MODIFIED Requirements ### Requirement: 系统托盘 系统 SHALL 提供跨平台系统托盘功能,支持托盘图标和菜单。图标格式 SHALL 根据平台自动选择。 #### Scenario: 托盘图标显示 - **WHEN** 桌面应用启动成功 - **THEN** 系统根据平台加载正确的图标格式 - **AND** 在 Windows 上加载 ICO 格式图标(`assets/icon.ico`) - **AND** 在 macOS 和 Linux 上加载 PNG 格式图标(`assets/icon.png`) - **AND** 托盘图标 tooltip 显示 `Nex` #### Scenario: 托盘菜单显示 - **WHEN** 用户点击托盘图标(左键或右键) - **THEN** 显示托盘菜单 - **AND** 菜单包含"打开管理界面"选项 - **AND** 菜单包含"状态: 运行中"选项(禁用状态) - **AND** 菜单包含"端口: 9826"选项(禁用状态) - **AND** 菜单包含"退出"选项 #### Scenario: 打开管理界面 - **WHEN** 用户点击托盘菜单"打开管理界面" - **THEN** 系统在浏览器中打开 `http://localhost:9826` #### Scenario: 浏览器打开失败 - **WHEN** 系统无法打开浏览器(浏览器未安装等) - **THEN** 托盘菜单仍可正常使用 - **AND** 用户可手动访问 `http://localhost:9826` #### Scenario: 退出应用 - **WHEN** 用户点击托盘菜单"退出" - **THEN** 系统优雅关闭后端服务 - **AND** 托盘图标消失 - **AND** 应用进程退出 ### Requirement: 静态文件服务 系统 SHALL 通过 Gin 同时服务 API、协议代理和前端静态资源。 #### Scenario: API 请求路由 - **WHEN** 请求路径以 `/api/` 或 `/health` 开头 - **THEN** 请求由现有业务 handler 处理或返回 API 风格 404 #### Scenario: 版本接口路由 - **WHEN** desktop 模式收到 `GET /api/version` 请求 - **THEN** 请求 SHALL 由版本信息 handler 处理 - **THEN** 响应 SHALL 为 API JSON 响应 - **THEN** 请求 SHALL NOT 返回前端 `index.html` #### Scenario: 协议代理请求路由 - **WHEN** 请求路径以 `/openai/` 或 `/anthropic/` 开头 - **THEN** 请求 SHALL 被视为协议代理请求或返回 API 风格 404 - **THEN** 请求 SHALL NOT 返回前端 `index.html` #### Scenario: OpenAI 代理路由 - **WHEN** desktop 模式收到 `/openai/v1/chat/completions` 请求 - **THEN** 请求 SHALL 进入 ProxyHandler - **THEN** ProxyHandler SHALL 获取 clientProtocol 为 `openai` #### Scenario: Anthropic 代理路由 - **WHEN** desktop 模式收到 `/anthropic/v1/messages` 请求 - **THEN** 请求 SHALL 进入 ProxyHandler - **THEN** ProxyHandler SHALL 获取 clientProtocol 为 `anthropic` #### Scenario: 静态资源路由 - **WHEN** 请求路径为 `/assets/*` - **THEN** 返回嵌入的前端静态资源文件 - **THEN** 请求 SHALL NOT 被协议代理路由处理 #### Scenario: PNG Favicon 路由 - **WHEN** 请求路径为 `/icon.png` - **THEN** 返回来源于统一应用图标的 PNG favicon 资源 - **THEN** 请求 SHALL NOT 被协议代理路由处理 #### Scenario: SPA 路由回退 - **WHEN** 请求路径不匹配任何 API、协议代理或静态资源路由 - **THEN** 返回 `index.html`(支持前端 SPA 路由)