1. 14 Mar, 2026 1 commit
    • Rose Ding's avatar
      fix: 按 review 意见重构数据库备份服务(安全性 + 架构 + 健壮性) · 1047f973
      Rose Ding authored
      
      
      1. S3 凭证加密存储:使用 SecretEncryptor (AES-256-GCM) 加密 SecretAccessKey,
         防止备份文件中泄露 S3 凭证,兼容旧的未加密数据
      2. 修复 saveRecord 竞态条件:添加 recordsMu 互斥锁保护 records 的 load/save
      3. 恢复操作增加服务端验证:handler 层要求重新输入管理员密码,通过 bcrypt
         校验,前端弹出密码输入框
      4. pg_dump/psql/S3 操作抽象为接口:定义 DBDumper 和 BackupObjectStore 接口,
         实现放入 repository 层,遵循项目依赖注入架构规范
      5. 改为流式处理避免大数据库 OOM:备份时 pg_dump stdout -> gzip -> io.Pipe ->
         S3 upload;恢复时 S3 download -> gzip reader -> psql stdin,不再全量加载
      6. loadRecords 区分"无数据"和"数据损坏"场景:JSON 解析失败返回明确错误
      7. 添加 18 个核心逻辑单元测试:覆盖加密、并发、流式备份/恢复、错误处理等
      Co-Authored-By: default avatarClaude Opus 4.6 <noreply@anthropic.com>
      1047f973
  2. 13 Mar, 2026 2 commits
  3. 12 Mar, 2026 5 commits
  4. 11 Mar, 2026 15 commits
  5. 10 Mar, 2026 7 commits
  6. 09 Mar, 2026 10 commits
    • kyx236's avatar
      fix: OpenAI临时性400错误支持池模式同账号重试 & HelpTooltip层级修复 · 5fa22fdf
      kyx236 authored
      1. 识别OpenAI "An error occurred while processing your request" 临时性400错误
         并触发failover,同时在池模式下标记RetryableOnSameAccount,允许同账号重试
      2. ForwardAsAnthropic路径同步支持临时性400错误的识别和同账号重试
      3. HelpTooltip组件使用Teleport渲染到body,修复在dialog内被裁切的问题
      5fa22fdf
    • erio's avatar
      fix: use shared max_line_size config for OpenAI Responses SSE scanner · bcaae2eb
      erio authored
      Two SSE scanners in openai_gateway_messages.go were hardcoded to 1MB
      while all other scanners use defaultMaxLineSize (500MB) with config
      override. This caused Responses API streams to fail on large payloads.
      bcaae2eb
    • ischanx's avatar
      feat: 允许管理员为持有有效订阅的用户绑定订阅类型分组 · 767a41e2
      ischanx authored
      
      
      之前管理员无法通过 API 密钥管理将用户绑定到订阅类型分组(直接返回错误)。
      现在改为检查用户是否持有该分组的有效订阅,有则允许绑定,无则拒绝。
      
      - admin_service: 新增 userSubRepo 依赖,替换硬拒绝为订阅校验
      - admin_service: 区分 ErrSubscriptionNotFound 和内部错误,避免 DB 故障被误报
      - wire_gen/api_contract_test: 同步新增参数
      - UserApiKeysModal: 管理员分组下拉不再过滤订阅类型分组
      Co-Authored-By: default avatarClaude Opus 4.6 <noreply@anthropic.com>
      767a41e2
    • QTom's avatar
      feat: 支持批量重置状态和批量刷新令牌 · 252d6c53
      QTom authored
      - 提取 refreshSingleAccount 私有方法复用单账号刷新逻辑
      - 新增 BatchClearError handler (POST /admin/accounts/batch-clear-error)
      - 新增 BatchRefresh handler (POST /admin/accounts/batch-refresh)
      - 前端 AccountBulkActionsBar 添加批量重置状态/刷新令牌按钮
      - AccountsView 添加 handler 支持 partial success 反馈
      - i18n 中英文补充批量操作相关翻译
      252d6c53
    • QTom's avatar
      feat: 导入账号时 best-effort 从 id_token 提取用户信息 · 7a4e65ad
      QTom authored
      提取 DecodeIDToken(跳过过期校验)供导入场景使用,
      ParseIDToken 复用它并保留原有过期检查行为。
      导入 OpenAI/Sora OAuth 账号时自动补充缺失的 email、
      plan_type、chatgpt_account_id 等字段,不覆盖已有值。
      7a4e65ad
    • QTom's avatar
      feat: 从 OpenAI JWT 提取 chatgpt_plan_type 并在前端展示 · a582aa89
      QTom authored
      OAuth 授权和 token 刷新时从 id_token 的 OpenAI auth claim 中
      提取 chatgpt_plan_type(plus/team/pro/free),存入 credentials,
      账号管理页面 PlatformTypeBadge 显示订阅类型。
      a582aa89
    • erio's avatar
      feat: cleanup stale concurrency slots on startup · a88698f3
      erio authored
      
      
      When the service restarts, concurrency slots from the old process
      remain in Redis, causing phantom occupancy. On startup, scan all
      concurrency sorted sets and remove members with non-current process
      prefix, then clear orphaned wait queue counters.
      
      Uses Go-side SCAN to discover keys (compatible with Redis client
      prefix hooks in tests), then passes them to a Lua script for
      atomic member-level cleanup.
      Co-Authored-By: default avatarClaude Opus 4.6 <noreply@anthropic.com>
      a88698f3
    • shaw's avatar
      fix: 修复gpt->claude同步请求返回sse的bug · 25178cdb
      shaw authored
      25178cdb
    • shaw's avatar
      a461538d
    • Elysia's avatar
      fix CI/CD Error · b43ee629
      Elysia authored
      b43ee629