From c43df080fb4d9e0e8f004a2437d387caa4e974bc Mon Sep 17 00:00:00 2001 From: yousiki Date: Mon, 20 Apr 2026 14:35:32 +0900 Subject: [PATCH] fix(quota): detect Claude Team organizations instead of marking Free Claude Team accounts report has_claude_pro=false and has_claude_max=false, so the plan detection fell through to plan_free even though the OAuth profile clearly identifies an active Claude Team organization. Inspect organization.organization_type and subscription_status before falling back to Free, and add a plan_team label across locales. Fixes router-for-me/Cli-Proxy-API-Management-Center#222 --- src/components/quota/quotaConfigs.ts | 7 +++++++ src/i18n/locales/en.json | 3 ++- src/i18n/locales/ru.json | 3 ++- src/i18n/locales/zh-CN.json | 3 ++- src/i18n/locales/zh-TW.json | 3 ++- 5 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/components/quota/quotaConfigs.ts b/src/components/quota/quotaConfigs.ts index c57f9af..a0f5578 100644 --- a/src/components/quota/quotaConfigs.ts +++ b/src/components/quota/quotaConfigs.ts @@ -974,6 +974,13 @@ const resolveClaudePlanType = (profile: ClaudeProfileResponse | null): string | const hasClaudePro = normalizeFlagValue(profile.account?.has_claude_pro); if (hasClaudePro) return 'plan_pro'; + const organizationType = normalizeStringValue(profile.organization?.organization_type)?.toLowerCase(); + const subscriptionStatus = normalizeStringValue(profile.organization?.subscription_status)?.toLowerCase(); + + if (organizationType === 'claude_team' && subscriptionStatus === 'active') { + return 'plan_team'; + } + if (hasClaudeMax === false && hasClaudePro === false) return 'plan_free'; return null; diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index e529e9a..f2ce195 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -645,7 +645,8 @@ "plan_pro": "Pro", "plan_max": "Max", "plan_max5": "Max 5x", - "plan_max20": "Max 20x" + "plan_max20": "Max 20x", + "plan_team": "Team" }, "codex_quota": { "title": "Codex Quota", diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json index 176353b..562e71d 100644 --- a/src/i18n/locales/ru.json +++ b/src/i18n/locales/ru.json @@ -642,7 +642,8 @@ "plan_pro": "Pro", "plan_max": "Max", "plan_max5": "Max 5x", - "plan_max20": "Max 20x" + "plan_max20": "Max 20x", + "plan_team": "Team" }, "codex_quota": { "title": "Квота Codex", diff --git a/src/i18n/locales/zh-CN.json b/src/i18n/locales/zh-CN.json index 5d09f7e..f112317 100644 --- a/src/i18n/locales/zh-CN.json +++ b/src/i18n/locales/zh-CN.json @@ -645,7 +645,8 @@ "plan_pro": "专业版", "plan_max": "Max", "plan_max5": "Max 5x", - "plan_max20": "Max 20x" + "plan_max20": "Max 20x", + "plan_team": "团队版" }, "codex_quota": { "title": "Codex 额度", diff --git a/src/i18n/locales/zh-TW.json b/src/i18n/locales/zh-TW.json index 7db6685..010aa62 100644 --- a/src/i18n/locales/zh-TW.json +++ b/src/i18n/locales/zh-TW.json @@ -645,7 +645,8 @@ "plan_pro": "專業版", "plan_max": "Max", "plan_max5": "Max 5x", - "plan_max20": "Max 20x" + "plan_max20": "Max 20x", + "plan_team": "團隊版" }, "codex_quota": { "title": "Codex 配額",