1. 10 Jan, 2026 2 commits
    • IanShaw027's avatar
      refactor(migration): 重命名 ops 迁移文件避免编号冲突 · 13ae0ce7
      IanShaw027 authored
      将 030_ops_monitoring_vnext.sql 重命名为 033_ops_monitoring_vnext.sql
      以避免与主分支的 030_add_account_expires_at.sql 冲突。
      13ae0ce7
    • IanShaw027's avatar
      merge: 合并主分支改动并保留 ops 监控实现 · 3a67002c
      IanShaw027 authored
      合并 main 分支的最新改动到 ops 监控分支。
      冲突解决策略:保留当前分支的 ops 相关改动,接受主分支的其他改动。
      
      保留的 ops 改动:
      - 运维监控配置和依赖注入
      - 运维监控 API 处理器和中间件
      - 运维监控服务层和数据访问层
      - 运维监控前端界面和状态管理
      
      接受的主分支改动:
      - Linux DO OAuth 集成
      - 账号过期功能
      - IP 地址限制功能
      - 用量统计优化
      - 其他 bug 修复和功能改进
      3a67002c
  2. 09 Jan, 2026 35 commits
    • IanShaw027's avatar
      feat(运维监控): 重构仪表板布局和增强数据展示 · c48dc097
      IanShaw027 authored
      主要改动:
      - 重构仪表板为左右布局(5:7比例)
      - 左侧:健康评分 + 实时信息(当前/峰值/平均 QPS/TPS)
      - 右侧:6个卡片展示详细指标(3列x2行)
        - 总请求:请求数、Token数、平均QPS/TPS、平均延迟/TTFT
        - SLA:百分比、异常数、进度条
        - 延迟:P99/P95/P90/P50/Avg/Max(带颜色编码)
        - TTFT:P99/P95/P90/P50/Avg/Max(带颜色编码)
        - 请求错误:错误率、错误数、业务限制数
        - 上游错误:错误率、错误数(排除429/529)、429/529数
      - 添加延迟/TTFT颜色编码(<500ms绿色,<1s黄色,<2s橙色,≥2s红色)
      - 添加实时窗口选择器(1min/5min/30min/1h)
      - 优化时间段选择器标签("近5分钟"等)
      - 完善中英文i18n翻译
      - 数据库:添加Redis连接池字段(redis_conn_total, redis_conn_idle)
      c48dc097
    • IanShaw027's avatar
      feat(运维监控): 增强监控功能和健康评分系统 · 585257d3
      IanShaw027 authored
      后端改进:
      - 新增健康评分计算服务(ops_health_score.go)
      - 添加分布式锁支持(ops_advisory_lock.go)
      - 优化指标采集和聚合逻辑
      - 新增运维指标采集间隔配置(60-3600秒)
      - 移除未使用的WebSocket查询token认证中间件
      - 改进清理服务和告警评估逻辑
      
      前端改进:
      - 简化OpsDashboard组件结构
      - 完善国际化文本(中英文)
      - 新增运维监控相关API类型定义
      - 添加运维指标采集间隔设置界面
      - 优化错误详情模态框
      
      测试:
      - 添加健康评分单元测试
      - 更新API契约测试
      585257d3
    • Song Siyu's avatar
      feat: antigravity 配额域限流 + SSE 上限 (#222) · 7d1fe818
      Song Siyu authored
      * fix: 添加 gemini-3-flash 前缀映射支持 gemini-3-flash-preview
      
      * feat(antigravity): 增强请求参数和注入 Antigravity 身份 system prompt
      
      * feat: antigravity 配额域限流
      
      * chore: 调整 SSE 单行上限到 25MB
      
      * chore: 提升 SSE 单行上限到 40MB
      7d1fe818
    • Edric.Li's avatar
      feat(api-key): 添加 IP 白名单/黑名单限制功能 (#221) · 0a4641c2
      Edric.Li authored
      * feat(api-key): add IP whitelist/blacklist restriction and usage log IP tracking
      
      - Add IP restriction feature for API keys (whitelist/blacklist with CIDR support)
      - Add IP address logging to usage logs (admin-only visibility)
      - Remove billing_type column from usage logs UI (redundant)
      - Use generic "Access denied" error message for security
      
      Backend:
      - New ip package with IP/CIDR validation and matching utilities
      - Database migrations for ip_whitelist, ip_blacklist (api_keys) and ip_address (usage_logs)
      - Middleware IP restriction check after API key validation
      - Input validation for IP/CIDR patterns on create/update
      
      Frontend:
      - API key form with enable toggle for IP restriction
      - Shield icon indicator in table for keys with IP restriction
      - Removed billing_type filter and column from usage views
      
      * fix: update API contract tests for ip_whitelist/ip_blacklist fields
      
      Add ip_whitelist and ip_blacklist fields to expected JSON responses
      in API contract tests to match the new API key schema.
      0a4641c2
    • IanShaw027's avatar
      feat(前端UI): 实现运维监控前端界面 · 8ae75e7f
      IanShaw027 authored
      - 新增帮助提示组件(HelpTooltip.vue)
      - 更新侧边栏添加 ops 监控菜单项
      - 扩展设置视图集成 ops 配置面板
      - 新增 ops 监控视图目录(dashboard, alerts, realtime, settings 等)
      8ae75e7f
    • IanShaw027's avatar
      feat(国际化): 添加运维监控多语言支持 · fc32b577
      IanShaw027 authored
      - 添加英文翻译(en.ts)包含 ops 监控所有文案
      - 添加中文翻译(zh.ts)包含 ops 监控所有文案
      fc32b577
    • IanShaw027's avatar
      feat(前端状态): 添加运维监控状态管理和路由 · 337a1886
      IanShaw027 authored
      - 新增 adminSettings store 管理 ops 配置状态
      - 注册 adminSettings store 到全局 store
      - 添加 ops 监控相关路由(dashboard, alerts, realtime, settings)
      337a1886
    • IanShaw027's avatar
      feat(前端API): 实现运维监控 API 客户端 · 11d063e3
      IanShaw027 authored
      - 新增 ops API 客户端(ops.ts)
      - 扩展 settings API 支持 ops 配置
      - 更新 admin API 索引导出 ops 模块
      - 扩展 API 客户端支持 WebSocket 连接
      11d063e3
    • IanShaw027's avatar
      test(后端): 更新 API 契约测试支持 ops 监控端点 · e8464580
      IanShaw027 authored
      - 更新 api_contract_test.go 包含 ops 相关端点测试
      e8464580
    • IanShaw027's avatar
      feat(设置): 集成运维监控配置到系统设置 · 2d123a11
      IanShaw027 authored
      - 扩展 setting_handler 支持 ops 配置管理
      - 扩展 setting_service 支持 ops 配置持久化
      - 更新 settings_view 包含 ops 配置视图
      2d123a11
    • IanShaw027's avatar
      feat(网关): 集成运维监控到 API 网关处理器 · fcdf839b
      IanShaw027 authored
      - 在 gateway_handler 中添加请求监控和错误追踪
      - 在 openai_gateway_handler 中集成 ops 指标采集
      - 在 gemini_v1beta_handler 中集成 ops 指标采集
      - 更新 handler 基类支持 ops 错误日志记录
      fcdf839b
    • IanShaw027's avatar
      feat(依赖注入): 集成运维监控依赖注入配置 · d55dd56f
      IanShaw027 authored
      - 更新 wire.go 添加 ops 服务依赖注入提供者
      - 重新生成 wire_gen.go 包含完整的依赖注入图
      d55dd56f
    • IanShaw027's avatar
      feat(路由): 集成运维监控路由到服务器 · e0d12b46
      IanShaw027 authored
      - 更新路由器注册 ops 监控路由
      - 添加 ops 管理路由(dashboard, alerts, realtime, settings, ws)
      - 更新 gateway 路由支持请求追踪
      - 集成 ops 服务到 HTTP 服务器
      e0d12b46
    • IanShaw027's avatar
      feat(handler): 实现运维监控 API 处理器和中间件 · f3ed95d4
      IanShaw027 authored
      - 新增 ops 错误日志记录器(ops_error_logger.go)
      - 新增 ops 主处理器(ops_handler.go)
      - 新增告警管理处理器(ops_alerts_handler.go)
      - 新增仪表板处理器(ops_dashboard_handler.go)
      - 新增实时监控处理器(ops_realtime_handler.go)
      - 新增配置管理处理器(ops_settings_handler.go)
      - 新增 WebSocket 处理器(ops_ws_handler.go)
      - 扩展设置 DTO 支持 ops 配置
      - 新增客户端请求 ID 中间件(client_request_id.go)
      - 新增 WebSocket 查询令牌认证中间件(ws_query_token_auth.go)
      - 更新管理员认证中间件支持 ops 路由
      - 注册 handler 依赖注入
      f3ed95d4
    • IanShaw027's avatar
      feat(service): 实现运维监控业务逻辑层 · 5baa8b56
      IanShaw027 authored
      - 新增 ops 主服务(ops_service.go)和端口定义(ops_port.go)
      - 实现账号可用性检查服务(ops_account_availability.go)
      - 实现数据聚合服务(ops_aggregation_service.go)
      - 实现告警评估服务(ops_alert_evaluator_service.go)
      - 实现告警管理服务(ops_alerts.go)
      - 实现数据清理服务(ops_cleanup_service.go)
      - 实现并发控制服务(ops_concurrency.go)
      - 实现仪表板服务(ops_dashboard.go)
      - 实现错误处理服务(ops_errors.go)
      - 实现直方图服务(ops_histograms.go)
      - 实现指标采集服务(ops_metrics_collector.go)
      - 实现查询模式服务(ops_query_mode.go)
      - 实现实时监控服务(ops_realtime.go)
      - 实现请求详情服务(ops_request_details.go)
      - 实现重试机制服务(ops_retry.go)
      - 实现配置管理服务(ops_settings.go)
      - 实现趋势分析服务(ops_trends.go)
      - 实现窗口统计服务(ops_window_stats.go)
      - 添加 ops 相关领域常量
      - 注册 service 依赖注入
      5baa8b56
    • IanShaw027's avatar
      feat(repository): 实现运维监控数据访问层 · bb530327
      IanShaw027 authored
      - 新增 ops 主仓库(ops_repo.go)
      - 实现告警数据访问(ops_repo_alerts.go)
      - 实现仪表板数据访问(ops_repo_dashboard.go)
      - 实现直方图数据访问(ops_repo_histograms.go)
      - 实现延迟直方图桶逻辑(ops_repo_latency_histogram_buckets.go)
      - 新增延迟直方图桶测试(ops_repo_latency_histogram_buckets_test.go)
      - 实现指标数据访问(ops_repo_metrics.go)
      - 实现预聚合数据访问(ops_repo_preagg.go)
      - 实现请求详情数据访问(ops_repo_request_details.go)
      - 实现趋势数据访问(ops_repo_trends.go)
      - 实现窗口统计数据访问(ops_repo_window_stats.go)
      - 更新并发缓存支持 ops 场景
      - 注册 repository 依赖注入
      bb530327
    • IanShaw027's avatar
      feat(数据库): 添加运维监控数据模型和数据库迁移脚本 · d55866d3
      IanShaw027 authored
      - 新增 ops 监控数据库迁移脚本(表结构定义)
      - 定义核心数据模型(ops_models.go)
      - 定义告警相关模型(ops_alert_models.go)
      - 定义仪表板数据模型(ops_dashboard_models.go)
      - 定义实时监控数据模型(ops_realtime_models.go)
      - 定义配置相关模型(ops_settings_models.go)
      - 定义趋势分析数据模型(ops_trend_models.go)
      d55866d3
    • IanShaw027's avatar
      feat(基础设施): 添加运维监控功能的基础配置和依赖 · 4b9e47ce
      IanShaw027 authored
      - 更新 .gitignore 排除临时文件
      - 添加 ops 监控相关配置项到 config.yaml
      - 更新 Go 依赖包(go.mod/go.sum)
      - 扩展 config.go 支持 ops 监控配置
      - 新增上下文键定义(ClientRequestID)
      4b9e47ce
    • shaw's avatar
      Merge branch 'fix/table-pagination-and-features' · 62dc0b95
      shaw authored
      62dc0b95
    • IanShaw027's avatar
      fix(admin): 代码审查修复 - 输入验证和测试完善 · 7c3d5cad
      IanShaw027 authored
      根据 Codex 代码审查报告,修复所有 P0 和 P1 优先级问题。
      
      ## P0 紧急修复
      
      ### 1. 修复集成测试编译错误
      - 更新 group_repo_integration_test.go 中所有 ListWithFilters 调用
      - 添加缺失的 search 参数(传入空字符串)
      - 修复 4 处旧签名调用,避免 CI 编译失败
      
      ### 2. 添加统一的 search 参数输入验证
      为所有 admin handler 添加一致的输入验证逻辑:
      - group_handler.go: 添加 TrimSpace + 长度限制
      - proxy_handler.go: 添加 TrimSpace + 长度限制
      - redeem_handler.go: 添加 TrimSpace + 长度限制
      - user_handler.go: 添加 TrimSpace + 长度限制
      
      验证规则:
      - TrimSpace() 去除首尾空格
      - 最大长度 100 字符(防止 DoS 攻击)
      - 超长输入自动截断
      
      ## P1 改进
      
      ### 3. 补充 search 功能的单元测试
      新增 admin_service_group_test.go 中的测试:
      - TestAdminService_ListGroups_WithSearch
        - search 参数正常传递到 repository 层
        - search 为空字符串时的行为
        - search 与其他过滤条件组合使用
      
      新增 admin_service_search_test.go 文件:
      - 为其他 admin API 添加 search 测试覆盖
      - 统一的测试模式和断言
      
      ### 4. 补充 search 功能的集成测试
      新增 group_repo_integration_test.go 测试场景:
      - TestListWithFilters_Search
        - 搜索 name 字段匹配
        - 搜索 description 字段匹配
        - 搜索不存在内容(返回空)
        - 大小写不敏感测试
        - 特殊字符转义测试(%、_)
        - 与其他过滤条件组合
      
      ## 测试结果
      
      -  编译检查通过
      -  单元测试全部通过 (3/3)
      -  集成测试编译通过
      -  所有 service 测试通过
      
      ## 影响范围
      
      修改文件: 8 个
      代码变更: +234 行 / -8 行
      
      ## 相关 Issue
      
      解决代码审查中的安全性和稳定性问题:
      - 防止 DoS 攻击(超长搜索字符串)
      - 修复测试编译错误(CI 阻塞问题)
      - 提升测试覆盖率
      7c3d5cad
    • shaw's avatar
      f060db0b
    • IanShaw027's avatar
      feat(admin): 添加账号批量调度开关功能 · 5e936fbf
      IanShaw027 authored
      - 后端:支持批量更新账号的 schedulable 字段
        - 在 BulkUpdateAccountsRequest 中添加 schedulable 参数
        - 在 AccountBulkUpdate 中添加 schedulable 字段支持
        - 更新 repository 层批量更新 SQL 逻辑
      - 前端:在账号管理页面添加批量调度控制
        - 新增"批量启用调度"和"批量停止调度"按钮
        - 添加 handleBulkToggleSchedulable 处理函数
        - 显示具体的成功提示信息(包含操作账号数量)
      - 国际化:添加批量调度相关中英文翻译
      - 优化:添加 search 参数标准化和验证(account_handler)
      5e936fbf
    • IanShaw027's avatar
      fix(admin): 修复表格批量操作和搜索功能问题 · 38202322
      IanShaw027 authored
      1. 恢复账号管理批量操作栏缺失的功能按钮
         - 添加"本页全选"按钮支持批量选择当前页所有账号
         - 添加"清除已选"按钮快速清空已选账号列表
         - 在重构拆分组件时遗漏,现已恢复
      
      2. 修复分组管理搜索功能仅搜索当前页的问题
         - 前端:移除本地过滤逻辑,改用后端搜索
         - 后端:添加 search 参数支持,搜索名称和描述字段
         - 支持不区分大小写的模糊匹配
         - 统一所有管理页面的搜索体验
      38202322
    • admin's avatar
      feat(admin): 添加 LinuxDO OAuth 回调地址快速设置按钮 · 707061ef
      admin authored
      - 在设置页面添加"使用当前站点生成并复制"按钮
      - 自动填充回调地址并复制到剪贴板
      - 添加中英文国际化支持
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code
      
      )
      Co-Authored-By: default avatarClaude Opus 4.5 <noreply@anthropic.com>
      707061ef
    • shaw's avatar
      1a1e23fc
    • admin's avatar
      refactor(auth): 将 Linux DO OAuth 配置迁移到系统设置 · d1c2a61d
      admin authored
      - 将 LinuxDo Connect 配置从环境变量迁移到数据库持久化
      - 在管理后台系统设置中添加 LinuxDo OAuth 配置项
      - 简化部署流程,无需修改 docker-compose.override.yml
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code
      
      )
      Co-Authored-By: default avatarClaude Opus 4.5 <noreply@anthropic.com>
      d1c2a61d
    • admin's avatar
      feat(auth): 添加 Linux DO Connect OAuth 登录支持 · 152d0cde
      admin authored
      - 新增 Linux DO OAuth 配置项和环境变量支持
      - 实现 OAuth 授权流程和回调处理
      - 前端添加 Linux DO 登录按钮和回调页面
      - 支持通过 Linux DO 账号注册/登录
      - 添加相关国际化文本
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code
      
      )
      Co-Authored-By: default avatarClaude Opus 4.5 <noreply@anthropic.com>
      152d0cde
    • IanShaw027's avatar
      fix(fe): 修复中优先级表格功能问题 · 514f5802
      IanShaw027 authored
      修复的问题:
      
      1. **搜索和筛选防抖不同步**(AccountsView.vue)
         - 问题:筛选器使用 reload(立即),搜索使用 debouncedReload(300ms延迟)
         - 修复:统一使用 debouncedReload,避免多余的API调用
      
      2. **useTableLoader 竞态条件**(useTableLoader.ts)
         - 问题:finally 块检查 signal.aborted 而不是 controller 实例
         - 修复:检查 abortController === currentController
      
      3. **改进错误处理**(UsersView.vue)
         - 添加详细错误消息:error.response?.data?.detail || error.message
         - 用户可以看到具体的错误原因而不是通用消息
      
      4. **分页边界检查**(useTableLoader.ts, UsersView.vue)
         - 添加页码有效性检查:Math.max(1, Math.min(page, pagination.pages || 1))
         - 防止分页越界导致显示空表
      
      影响范围:
      - frontend/src/composables/useTableLoader.ts
      - frontend/src/views/admin/AccountsView.vue
      - frontend/src/views/admin/UsersView.vue
      
      测试:✓ 前端构建测试通过
      514f5802
    • IanShaw027's avatar
      fix(fe): 修复表格分页和基础功能问题 · ee9b9b39
      IanShaw027 authored
      修复的主要问题:
      
      1. **分页切换失效**(AccountsView.vue)
         - 修复 useTableLoader 未解构 handlePageSizeChange 函数
         - 添加 @update:pageSize 事件绑定到 Pagination 组件
      
      2. **内存泄漏修复**(多个文件)
         - UsersView.vue: 添加 searchTimeout 清理和 abortController.abort()
         - ProxiesView.vue: 添加 onUnmounted 钩子清理定时器
         - RedeemView.vue: 添加 onUnmounted 钩子清理定时器
      
      3. **分页重置问题**(UsersView.vue)
         - toggleBuiltInFilter: 切换筛选器时重置 pagination.page = 1
         - toggleAttributeFilter: 切换属性筛选时重置 pagination.page = 1
      
      影响范围:
      - frontend/src/views/admin/AccountsView.vue
      - frontend/src/views/admin/ProxiesView.vue
      - frontend/src/views/admin/RedeemView.vue
      - frontend/src/views/admin/UsersView.vue
      
      测试:✓ 前端构建测试通过
      ee9b9b39
    • shaw's avatar
      27291f2e
    • Xu Kang's avatar
      5d1badfe
    • shaw's avatar
      43f104bd
    • shaw's avatar
    • 程序猿MT's avatar
      fix(auth): 修复 RefreshToken 使用过期 token 时的 nil pointer panic (#214) · 799b0106
      程序猿MT authored
      
      
      * fix(auth): 修复 RefreshToken 使用过期 token 时的 nil pointer panic
      
      问题分析:
      - RefreshToken 允许过期 token 继续流程(用于无感刷新)
      - 但 ValidateToken 在 token 过期时返回 nil claims
      - 导致后续访问 claims.UserID 时触发 panic
      
      修复方案:
      - 修改 ValidateToken,在检测到 ErrTokenExpired 时仍然返回 claims
      - jwt-go 在解析时即使遇到过期错误,token.Claims 仍会被填充
      - 这样 RefreshToken 可以正常获取用户信息并生成新 token
      
      新增测试:
      - TestAuthService_ValidateToken_ExpiredReturnsClaimsWithError
      - TestAuthService_RefreshToken_ExpiredTokenNoPanic
      Co-Authored-By: default avatarClaude Opus 4.5 <noreply@anthropic.com>
      
      * fix(auth): 修复邮件验证服务未配置时可绕过验证的安全漏洞
      
      当邮件验证开启但 emailService 未配置时,原逻辑允许用户绕过验证直接注册。
      现在会返回 ErrServiceUnavailable 拒绝注册,确保配置错误不会导致安全问题。
      
      - 在验证码检查前先检查 emailService 是否配置
      - 添加日志记录帮助发现配置问题
      - 新增单元测试覆盖该场景
      Co-Authored-By: default avatarClaude Opus 4.5 <noreply@anthropic.com>
      
      ---------
      Co-authored-by: default avataryangjianbo <yangjianbo@leagsoft.com>
      Co-authored-by: default avatarClaude Opus 4.5 <noreply@anthropic.com>
      799b0106
    • shaw's avatar
  3. 08 Jan, 2026 3 commits
    • Call White's avatar
      Merge pull request #1 from cyhhao/feat/ai-sdk-compatibility · f6a9a0a4
      Call White authored
      feat(openai): add AI SDK content format compatibility for OAuth accounts
      f6a9a0a4
    • cyhhao's avatar
      feat(openai): add AI SDK content format compatibility for OAuth accounts · 5b8d4fb0
      cyhhao authored
      - Add normalizeInputForCodexAPI function to convert AI SDK multi-part
        content format to simplified format expected by ChatGPT Codex API
      - AI SDK sends: {"content": [{"type": "input_text", "text": "..."}]}
      - Codex API expects: {"content": "..."}
      - Only applies to OAuth accounts (ChatGPT internal API)
      - API Key accounts remain unchanged (OpenAI Platform API supports both)
      5b8d4fb0
    • IanShaw's avatar
      fix(gemini): Google One 强制使用内置 OAuth client + 自动获取 project_id + UI 优化 (#212) · afcfbb45
      IanShaw authored
      * fix(gemini): Google One 强制使用内置 OAuth client + 自动获取 project_id + UI 优化
      
      ## 后端改动
      
      ### 1. Google One 强制使用内置 Gemini CLI OAuth Client
      **问题**:
      - Google One 之前允许使用自定义 OAuth client,导致认证流程不稳定
      - 与 Code Assist 的行为不一致
      
      **解决方案**:
      - 修改 `gemini_oauth_service.go`: Google One 现在与 Code Assist 一样强制使用内置 client (L122-135)
      - 更新 `gemini_oauth_client.go`: ExchangeCode 和 RefreshToken 方法支持强制内置 client (L31-44, L77-86)
      - 简化 `geminicli/oauth.go`: Google One scope 选择逻辑 (L187-190)
      - 标记 `geminicli/constants.go`: DefaultGoogleOneScopes 为 DEPRECATED (L30-33)
      - 更新测试用例以反映新行为
      
      **OAuth 类型对比**:
      | OAuth类型 | Client来源 | Scopes | Redirect URI |
      |-----------|-----------|--------|-----------------|
      | code_assist | 内置 Gemini CLI | DefaultCodeAssistScopes | https://codeassist.google.com/authcode |
      | google_one | 内置 Gemini CLI (新) | DefaultCodeAssistScopes | https://codeassist.google.com/authcode |
      | ai_studio | 必须自定义 | DefaultAIStudioScopes | http://localhost:1455/auth/callback |
      
      ### 2. Google One 自动获取 project_id
      **问题**:
      - Google One 个人账号测试模型时返回 403/404 错误
      - 原因:cloudaicompanion API 需要 project_id,但个人账号无需手动创建 GCP 项目
      
      **解决方案**:
      - 修改 `gemini_oauth_service.go`: OAuth 流程中自动调用 fetchProjectID
      - Google 通过 LoadCodeAssist API 自动分配 project_id
      - 与 Gemini CLI 行为保持一致
      - 后端根据 project_id 自动选择正确的 API 端点
      
      **影响**:
      - Google One 账号现在可以正常使用(需要重新授权)
      - Code Assist 和 AI Studio 账号不受影响
      
      ### 3. 修复 Gemini 测试账号无内容输出问题
      **问题**:
      - 测试 Gemini 账号时只显示"测试成功",没有显示 AI 响应内容
      - 原因:processGeminiStream 在检查到 finishReason 时立即返回,跳过了内容提取
      
      **解决方案**:
      - 修改 `account_test_service.go`: 调整逻辑顺序,先提取内容再检查是否完成
      - 确保最后一个 chunk 的内容也能被正确显示
      
      **影响**:
      - 所有 Gemini 账号类型(API Key、OAuth)的测试现在都会显示完整响应内容
      - 用户可以看到流式输出效果
      
      ## 前端改动
      
      ### 1. 修复图标宽度压缩问题
      **问题**:
      - 账户类型选择按钮中的图标在某些情况下会被压缩变形
      
      **解决方案**:
      - 修改 `CreateAccountModal.vue`: 为所有平台图标容器添加 `shrink-0` 类
      - 确保 Anthropic、OpenAI、Gemini、Antigravity 图标保持固定 8×8 尺寸 (32px × 32px)
      
      ### 2. 优化重新授权界面
      **问题**:
      - 重新授权时显示三个可点击的授权类型选择按钮,可能导致用户误切换到不兼容的授权方式
      
      **解决方案**:
      - 修改 `ReAuthAccountModal.vue` (admin 和普通用户版本):
        - 将可点击的授权类型选择按钮改为只读信息展示框
        - 根据账号的 `credentials.oauth_type` 动态显示对应图标和文本
        - 删除 `geminiAIStudioOAuthEnabled` 状态和 `handleSelectGeminiOAuthType` 方法
        - 防止用户误操作
      
      ## 测试验证
      -  所有后端单元测试通过
      -  OAuth client 选择逻辑正确
      -  Google One 和 Code Assist 行为一致
      -  测试账号显示完整响应内容
      -  UI 图标显示正常
      -  重新授权界面只读展示正确
      
      * fix(lint): 修复 golangci-lint 错误信息格式问题
      
      - 将错误信息改为小写开头以符合 Go 代码规范
      - 修复 ST1005: error strings should not be capitalized
      afcfbb45