"backend/internal/vscode:/vscode.git/clone" did not exist on "8d252303fc4a6325956234079ce3fb676f680595"
  1. 07 Feb, 2026 11 commits
    • yangjianbo's avatar
      fix(audit): 第二批审计修复 — P0 生产 Bug、安全加固、性能优化、缓存一致性、代码质量 · 2588fa6a
      yangjianbo authored
      
      
      基于 backend-code-audit 审计报告,修复剩余 P0/P1/P2 共 34 项问题:
      
      P0 生产 Bug:
      - 修复 time.Since(time.Now()) 计时逻辑错误 (P0-03)
      - generateRandomID 改用 crypto/rand 替代固定索引 (P0-04)
      - IncrementQuotaUsed 重写为 Ent 原子操作消除 TOCTOU 竞态 (P0-05)
      
      安全加固:
      - gateway/openai handler 错误响应替换为泛化消息,防止内部信息泄露 (P1-14)
      - usage_log_repo dateFormat 参数改用白名单映射,防止 SQL 注入 (P1-16)
      - 默认配置安全加固:sslmode=prefer、response_headers=true、mode=release (P1-18/19, P2-15)
      
      性能优化:
      - gateway handler 循环内 defer 替换为显式 releaseWait 闭包 (P1-02)
      - group_repo/promo_code_repo Count 前 Clone 查询避免状态污染 (P1-03)
      - usage_log_repo 四个查询添加 LIMIT 10000 防止 OOM (P1-07)
      - GetBatchUsageStats 添加时间范围参数,默认最近 30 天 (P1-10)
      - ip.go CIDR 预编译为包级变量 (P1-11)
      - BatchUpdateCredentials 重构为先验证后更新 (P1-13)
      
      缓存一致性:
      - billing_cache 添加 jitteredTTL 防止缓存雪崩 (P2-10)
      - DeductUserBalance/UpdateSubscriptionUsage 错误传播修复 (P2-12)
      - UserService.UpdateBalance 成功后异步失效 billingCache (P2-13)
      
      代码质量:
      - search 截断改为按 rune 处理,支持多字节字符 (P2-01)
      - TLS Handshake 改为 HandshakeContext 支持 context 取消 (P2-07)
      - CORS 预检添加 Access-Control-Max-Age: 86400 (P2-16)
      
      测试覆盖:
      - 新增 user_service_test.go(UpdateBalance 缓存失效 6 个用例)
      - 新增 batch_update_credentials_test.go(fail-fast + 类型验证 7 个用例)
      - 新增 response_transformer_test.go、ip_test.go、usage_log_repo_unit_test.go、search_truncate_test.go
      - 集成测试:IncrementQuotaUsed 并发测试、billing_cache 错误传播测试
      - config_test.go 补充 server.mode/sslmode 默认值断言
      Co-Authored-By: default avatarClaude Opus 4.6 <noreply@anthropic.com>
      2588fa6a
    • yangjianbo's avatar
      fix(oauth): SessionStore.Stop() 添加 sync.Once 防重入保护 (P1-05) · f6ca7019
      yangjianbo authored
      
      
      oauth 和 openai 包的 SessionStore.Stop() 直接调用 close(stopCh),
      重复调用会导致 panic。使用 sync.Once 包裹确保幂等安全。
      
      新增单元测试覆盖连续调用和 50 goroutine 并发调用场景。
      Co-Authored-By: default avatarClaude Opus 4.6 <noreply@anthropic.com>
      f6ca7019
    • yangjianbo's avatar
    • yangjianbo's avatar
      fix(security): 修复密码重置链接 Host Header 注入漏洞 (P0-07) · e75d3e35
      yangjianbo authored
      
      
      ForgotPassword 原来从 c.Request.Host 构建重置链接基础 URL,攻击者
      可伪造 Host 头将重置链接指向恶意域名窃取 token。
      
      修复方案:
      - ServerConfig 新增 frontend_url 配置项
      - auth_handler 改为从配置读取前端 URL,未配置时拒绝请求
      - Validate() 校验 frontend_url 必须为绝对 HTTP(S) URL
      - 新增 TestValidateServerFrontendURL 单元测试
      - config.example.yaml 添加配置说明
      Co-Authored-By: default avatarClaude Opus 4.6 <noreply@anthropic.com>
      e75d3e35
    • yangjianbo's avatar
      perf(service): 优化 model 替换函数,用 gjson/sjson 替代全量 JSON 序列化 · 8226a4ce
      yangjianbo authored
      
      
      SSE 热路径中 replaceModelInSSELine 和 replaceModelInResponseBody 原来
      使用 json.Unmarshal/Marshal 对每个事件做全量反序列化再序列化,现改为
      gjson.Get/sjson.Set 精确字段操作,消除 O(n) 中间 map 分配,保持 JSON
      字段顺序不变。涉及 OpenAIGatewayService 和 GatewayService 两个服务。
      
      新增 23 个单元测试覆盖:顶层/嵌套 model 替换、不匹配跳过、空行/[DONE]/
      非法 JSON 等边界情况。
      
      Fixes: P1-08
      Co-Authored-By: default avatarClaude Opus 4.6 <noreply@anthropic.com>
      8226a4ce
    • yangjianbo's avatar
      fix(middleware): 管理员JWT增加TokenVersion校验 · 65c0d8b5
      yangjianbo authored
      管理员改密后旧JWT会被拒绝,并补充单元测试覆盖。
      65c0d8b5
    • yangjianbo's avatar
      a9e256ce
    • yangjianbo's avatar
      perf(middleware): 优化订阅模式认证中间件,5次串行调用降至2步同步+1步异步 · 0e514ed8
      yangjianbo authored
      
      
      - 为 GetActiveSubscription 添加 ristretto L1 缓存 + singleflight 防击穿
      - 合并 ValidateSubscription + CheckUsageLimits 为纯内存 ValidateAndCheckLimits
      - 窗口维护操作(激活/重置)异步化,不再阻塞首字节
      - 缓存返回浅拷贝,避免并发 data race 和缓存污染
      - 所有管理操作(分配/续期/撤销/扩展/窗口重置)同步失效 L1 缓存
      - 新增 SubscriptionCacheConfig 可配置 L1 缓存大小/TTL/抖动
      Co-Authored-By: default avatarClaude Opus 4.6 <noreply@anthropic.com>
      0e514ed8
    • yangjianbo's avatar
      test(codex): 清理无用的 opencode 缓存测试 · 4e01126f
      yangjianbo authored
      移除不再需要的 setupCodexCache 调用与辅助函数(已不再回源/读写缓存)
      4e01126f
    • yangjianbo's avatar
      feat(codex): 移除 opencode 指令回源与缓存 · 55b56328
      yangjianbo authored
      - 不再从 GitHub 拉取 opencode codex_header.txt\n- 删除 ~/.opencode 缓存与异步刷新逻辑\n- 所有 instructions 统一使用内置 codex_cli_instructions.md
      55b56328
    • yangjianbo's avatar
      feat(gateway): 支持强制 Codex CLI 模式并伪装 UA · ce764bf2
      yangjianbo authored
      - Codex CLI 请求仅使用内置 instructions,不再读取 opencode 缓存/回源\n- 新增 gateway.force_codex_cli(环境变量 GATEWAY_FORCE_CODEX_CLI)\n- ForceCodexCLI=true 时转发上游强制 User-Agent=codex_cli_rs/0.0.0\n- 更新 deploy 示例配置
      ce764bf2
  2. 06 Feb, 2026 10 commits
  3. 05 Feb, 2026 13 commits
    • yangjianbo's avatar
      a38bd413
    • yangjianbo's avatar
      9e1535e2
    • iBenzene's avatar
      037a4099
    • shaw's avatar
      fix: 修复管理页面活跃会话数始终显示为0的问题 · ae1934f7
      shaw authored
      问题原因:Redis Pipeline 执行 Lua 脚本时出现 NOSCRIPT 错误,
      因为 redis.NewScript 使用 EVALSHA 执行脚本,当 Redis 重启或
      脚本未被缓存时,Pipeline 模式无法自动回退到 EVAL。
      
      解决方案:在 NewSessionLimitCache 初始化时预加载所有 Lua 脚本
      到 Redis,确保后续 Pipeline 执行时脚本已被缓存。
      ae1934f7
    • shaw's avatar
      feat: 新增全局错误透传规则功能 · 39e05a2d
      shaw authored
      支持管理员配置上游错误如何返回给客户端:
      - 新增 ErrorPassthroughRule 数据模型和 Ent Schema
      - 实现规则的 CRUD API(/admin/error-passthrough-rules)
      - 支持按错误码、关键词匹配,支持 any/all 匹配模式
      - 支持按平台过滤(anthropic/openai/gemini/antigravity)
      - 支持透传或自定义响应状态码和错误消息
      - 实现两级缓存(Redis + 本地内存)和多实例同步
      - 集成到 gateway_handler 的错误处理流程
      - 新增前端管理界面组件
      - 新增单元测试覆盖核心匹配逻辑
      
      优化:
      - 移除 refreshLocalCache 中的冗余排序(数据库已排序)
      - 后端 Validate() 增加匹配条件非空校验
      39e05a2d
    • ianshaw's avatar
      7b46bbb6
    • ianshaw's avatar
      feat(gemini): 增强 API 授权错误处理,自动提取并显示激活 URL · d2527e36
      ianshaw authored
      当 Gemini for Google Cloud API 未启用时(SERVICE_DISABLED 错误),
      系统现在会:
      - 自动检测 403 PERMISSION_DENIED 错误
      - 从错误响应中提取 API 激活 URL
      - 向用户显示清晰的错误消息和可点击的激活链接
      - 提供操作指引(启用后等待几分钟)
      
      新增文件:
      - internal/pkg/googleapi/error.go: Google API 错误解析器
      - internal/pkg/googleapi/error_test.go: 完整的测试覆盖
      - GEMINI_API_ERROR_HANDLING.md: 实现文档
      
      修改文件:
      - internal/repository/geminicli_codeassist_client.go:
        在 LoadCodeAssist 和 OnboardUser 中增强错误处理
      
      这大大改善了用户体验,用户不再需要手动从错误日志中查找激活 URL。
      d2527e36
    • shaw's avatar
      feat: 支持用户专属分组倍率配置 · 2b192f7d
      shaw authored
      2b192f7d
    • IanShaw027's avatar
      fix(gemini): 修复已注册用户 OAuth 授权时错误调用 onboardUser 的问题 · 979114db
      IanShaw027 authored
      问题:Google One Ultra 等已注册用户在 OAuth 授权时,如果 LoadCodeAssist
      返回了 currentTier/paidTier 但没有返回 cloudaicompanionProject,之前的
      逻辑会继续调用 onboardUser,导致 INVALID_ARGUMENT 错误。
      
      修复:对齐 Gemini CLI 的处理逻辑:
      - 当检测到用户已注册(有 currentTier/paidTier)时,不再调用 onboardUser
      - 先尝试从 Cloud Resource Manager 获取可用项目
      - 如果仍无法获取,返回友好的错误提示,引导用户手动填写 Project ID
      
      这个修复解决了 Google One 订阅用户无法正常授权的问题。
      979114db
    • Lemon's avatar
      39a0359d
    • shaw's avatar
      feat(auth): 实现 Refresh Token 机制 · 49a3c437
      shaw authored
      - 新增 Access Token + Refresh Token 双令牌认证
      - 支持 Token 自动刷新和轮转
      - 添加登出和撤销所有会话接口
      - 前端实现无感刷新和主动刷新定时器
      49a3c437
    • JIA-ss's avatar
      feat(gateway): filter /v1/usage stats by API Key instead of UserID · fa3ea5ee
      JIA-ss authored
      
      
      Previously the /v1/usage endpoint aggregated usage stats (today/total
      tokens, cost, RPM/TPM) across all API Keys belonging to the user.
      This made it impossible to distinguish usage from different API Keys
      (e.g. balance vs subscription keys).
      
      Now the usage stats are filtered by the current request's API Key ID,
      so each key only sees its own usage data. The balance/remaining fields
      are unaffected and still reflect the user-level wallet balance.
      
      Changes:
      - Add GetAPIKeyDashboardStats to repository interface and implementation
      - Add getPerformanceStatsByAPIKey helper (also fixes TPM to include
        cache_creation_tokens and cache_read_tokens)
      - Add GetAPIKeyDashboardStats to UsageService
      - Update Usage handler to call GetAPIKeyDashboardStats(apiKey.ID)
      Co-Authored-By: default avatarClaude Opus 4.5 <noreply@anthropic.com>
      fa3ea5ee
    • shaw's avatar
      fix(gateway): 修复工具名转换破坏 Anthropic 特殊工具的问题 · 05af95da
      shaw authored
      未知工具名不再进行 PascalCase/snake_case 转换,保持原样透传。
      修复 text_editor_20250728 等 Anthropic 特殊工具被错误转换的问题。
      05af95da
  4. 04 Feb, 2026 4 commits
  5. 03 Feb, 2026 2 commits