1. 14 Mar, 2026 5 commits
  2. 13 Mar, 2026 6 commits
    • erio's avatar
      fix: restore OAuth 401 temp-unschedulable for Gemini, update Antigravity tests · 45456fa2
      erio authored
      The 403 detection PR changed the 401 handler condition from
      `account.Type == AccountTypeOAuth` to
      `account.Type == AccountTypeOAuth && account.Platform == PlatformOpenAI`,
      which accidentally excluded Gemini OAuth from the temp-unschedulable path.
      
      Fix: use `!= PlatformAntigravity` instead, preserving Gemini behavior
      while correctly excluding Antigravity (whose 401 is handled by
      applyErrorPolicy's temp_unschedulable_rules).
      
      Update tests to reflect Antigravity's new 401 semantics:
      - HandleUpstreamError: Antigravity OAuth 401 now uses SetError
      - CheckErrorPolicy: Antigravity 401 second hit stays TempUnscheduled
      - DB fallback: split into Gemini (escalates) and Antigravity (stays temp)
      45456fa2
    • Ylarod's avatar
      fix lint · e90ec847
      Ylarod authored
      e90ec847
    • erio's avatar
      feat(antigravity): add 403 forbidden status detection, classification and display · 6344fa2a
      erio authored
      Backend:
      - Detect and classify 403 responses into three types:
        validation (account needs Google verification),
        violation (terms of service / banned),
        forbidden (generic 403)
      - Extract verification/appeal URLs from 403 response body
        (structured JSON parsing with regex fallback)
      - Add needs_verify, is_banned, needs_reauth, error_code fields
        to UsageInfo (omitempty for zero impact on other platforms)
      - Handle 403 in request path: classify and permanently set account error
      - Save validation_url in error_message for degraded path recovery
      - Enrich usage with account error on both success and degraded paths
      - Add singleflight dedup for usage requests with independent context
      - Differentiate cache TTL: success/403 → 3min, errors → 1min
      - Return degraded UsageInfo instead of HTTP 500 on quota fetch errors
      
      Frontend:
      - Display forbidden status badges with color coding (red for banned,
        amber for needs verification, gray for generic)
      - Show clickable verification/appeal URL links
      - Display needs_reauth and degraded error states in usage cell
      - Add Antigravity tier label badge next to platform type
      
      Tests:
      - Comprehensive unit tests for classifyForbiddenType (7 cases)
      - Unit tests for extractValidationURL (8 cases including unicode escapes)
      - Integration test for FetchQuota forbidden path
      6344fa2a
    • Peter's avatar
      feat(ops): allow hiding alert events · 29b0e4a8
      Peter authored
      29b0e4a8
    • Ylarod's avatar
      sub2api: add bedrock support · 11f7b835
      Ylarod authored
      11f7b835
    • haruka's avatar
      fix: 管理员重置配额补全 monthly 字段并修复 ristretto 缓存异步问题 · e73531ce
      haruka authored
      
      
      - 后端 handler:ResetSubscriptionQuotaRequest 新增 Monthly 字段,
        验证逻辑扩展为 daily/weekly/monthly 至少一项为 true
      - 后端 service:AdminResetQuota 新增 resetMonthly 参数,
        调用 ResetMonthlyUsage;重置后追加 subCacheL1.Wait(),
        保证 ristretto Del() 的异步删除立即生效,消除重置后
        /v1/usage 返回旧用量数据的竞态窗口
      - 后端测试:更新存量测试用例匹配新签名,补充
        TestAdminResetQuota_ResetMonthlyOnly /
        TestAdminResetQuota_ResetMonthlyUsageError 两个新用例
      - 前端 API:resetQuota options 类型新增 monthly: boolean
      - 前端视图:confirmResetQuota 改为同时重置 daily/weekly/monthly
      - i18n:中英文确认提示文案更新,提及每月配额
      Co-Authored-By: default avatarClaude Sonnet 4.6 <noreply@anthropic.com>
      e73531ce
  3. 12 Mar, 2026 13 commits
  4. 11 Mar, 2026 10 commits
  5. 10 Mar, 2026 6 commits
    • Elysia's avatar
      fix copilot review issue · 36cda57c
      Elysia authored
      36cda57c
    • rickylin047's avatar
      fix(openai): convert string input to array for Codex OAuth responses endpoint · 9f1f203b
      rickylin047 authored
      The ChatGPT backend-api codex/responses endpoint requires `input` to be
      an array, but the OpenAI Responses API spec allows it to be a plain string.
      When a client sends a string input, sub2api now converts it to the expected
      message array format. Empty/whitespace-only strings become an empty array
      to avoid triggering a 400 "Input must be a list" error.
      9f1f203b
    • haruka's avatar
      add test · b41a8ca9
      haruka authored
      b41a8ca9
    • wucm667's avatar
      fix: 补充缺失的组级和账户级运维告警指标 · e3cf0c0e
      wucm667 authored
      新增以下运维告警指标类型:
      - group_available_accounts: 组内可用账户数
      - group_available_ratio: 组内可用账户比例
      - group_rate_limit_ratio: 组内限速账户比例
      - account_rate_limited_count: 限速账户数
      - account_error_count: 错误账户数
      - account_error_ratio: 错误账户比例
      - overload_account_count: 过载账户数
      
      包含比例和计数类指标的评估逻辑,并注册新的百分比类指标用于阈值校验。
      e3cf0c0e
    • haruka's avatar
      feat: add admin reset subscription quota endpoint and UI · de18bce9
      haruka authored
      
      
      - Add AdminResetQuota service method to reset daily/weekly usage windows
      - Add POST /api/v1/admin/subscriptions/:id/reset-quota handler and route
      - Add resetQuota API function in frontend subscriptions client
      - Add reset quota button, confirmation dialog, and handlers in SubscriptionsView
      - Add i18n keys for reset quota feature in zh and en locales
      Co-Authored-By: default avatarClaude Sonnet 4.6 <noreply@anthropic.com>
      de18bce9
    • shaw's avatar
      00a0a121