refactor(quota): add monthly limits for team plans in quota windows

This commit is contained in:
LTbinglingfeng
2026-06-13 02:43:56 +08:00
Unverified
parent c63c43c3a4
commit 6513903ff5
5 changed files with 43 additions and 12 deletions
+31 -12
View File
@@ -246,12 +246,18 @@ const fetchAntigravityQuota = async (
throw createStatusError(lastError || t('common.unknown_error'), priorityStatus ?? lastStatus);
};
const buildCodexQuotaWindows = (payload: CodexUsagePayload, t: TFunction): CodexQuotaWindow[] => {
const buildCodexQuotaWindows = (
payload: CodexUsagePayload,
t: TFunction,
planType?: string | null
): CodexQuotaWindow[] => {
const FIVE_HOUR_SECONDS = 18000;
const WEEK_SECONDS = 604800;
const isTeamPlan = normalizePlanType(planType) === 'team';
const WINDOW_META = {
codeFiveHour: { id: 'five-hour', labelKey: 'codex_quota.primary_window' },
codeWeekly: { id: 'weekly', labelKey: 'codex_quota.secondary_window' },
codeMonthly: { id: 'monthly', labelKey: 'codex_quota.team_secondary_window' },
codeReviewFiveHour: {
id: 'code-review-five-hour',
labelKey: 'codex_quota.code_review_primary_window',
@@ -260,6 +266,10 @@ const buildCodexQuotaWindows = (payload: CodexUsagePayload, t: TFunction): Codex
id: 'code-review-weekly',
labelKey: 'codex_quota.code_review_secondary_window',
},
codeReviewMonthly: {
id: 'code-review-monthly',
labelKey: 'codex_quota.code_review_team_secondary_window',
},
} as const;
const rateLimit = payload.rate_limit ?? payload.rateLimit ?? undefined;
@@ -346,10 +356,11 @@ const buildCodexQuotaWindows = (payload: CodexUsagePayload, t: TFunction): Codex
rawLimitReached,
rawAllowed
);
const codeSecondaryWindowMeta = isTeamPlan ? WINDOW_META.codeMonthly : WINDOW_META.codeWeekly;
addWindow(
WINDOW_META.codeWeekly.id,
t(WINDOW_META.codeWeekly.labelKey),
WINDOW_META.codeWeekly.labelKey,
codeSecondaryWindowMeta.id,
t(codeSecondaryWindowMeta.labelKey),
codeSecondaryWindowMeta.labelKey,
undefined,
rateWindows.weeklyWindow,
rawLimitReached,
@@ -368,10 +379,13 @@ const buildCodexQuotaWindows = (payload: CodexUsagePayload, t: TFunction): Codex
codeReviewLimitReached,
codeReviewAllowed
);
const codeReviewSecondaryWindowMeta = isTeamPlan
? WINDOW_META.codeReviewMonthly
: WINDOW_META.codeReviewWeekly;
addWindow(
WINDOW_META.codeReviewWeekly.id,
t(WINDOW_META.codeReviewWeekly.labelKey),
WINDOW_META.codeReviewWeekly.labelKey,
codeReviewSecondaryWindowMeta.id,
t(codeReviewSecondaryWindowMeta.labelKey),
codeReviewSecondaryWindowMeta.labelKey,
undefined,
codeReviewWindows.weeklyWindow,
codeReviewLimitReached,
@@ -411,10 +425,14 @@ const buildCodexQuotaWindows = (payload: CodexUsagePayload, t: TFunction): Codex
additionalLimitReached,
additionalAllowed
);
const additionalSecondaryLabelKey = isTeamPlan
? 'codex_quota.additional_team_secondary_window'
: 'codex_quota.additional_secondary_window';
const additionalSecondaryId = isTeamPlan ? 'monthly' : 'weekly';
addWindow(
`${idPrefix}-weekly-${index}`,
t('codex_quota.additional_secondary_window', { name: limitName }),
'codex_quota.additional_secondary_window',
`${idPrefix}-${additionalSecondaryId}-${index}`,
t(additionalSecondaryLabelKey, { name: limitName }),
additionalSecondaryLabelKey,
{ name: limitName },
additionalSecondaryWindow,
additionalLimitReached,
@@ -473,9 +491,10 @@ const fetchCodexQuota = async (
const rateLimitResetCreditsAvailableCount = normalizeNumberValue(
resetCredits?.available_count ?? resetCredits?.availableCount
);
const windows = buildCodexQuotaWindows(payload, t);
const planType = planTypeFromUsage ?? planTypeFromFile;
const windows = buildCodexQuotaWindows(payload, t, planType);
return {
planType: planTypeFromUsage ?? planTypeFromFile,
planType,
subscriptionActiveUntil,
rateLimitResetCreditsAvailableCount,
windows,
+3
View File
@@ -433,10 +433,13 @@
"fetch_all": "Fetch All",
"primary_window": "5-hour limit",
"secondary_window": "Weekly limit",
"team_secondary_window": "Monthly limit",
"code_review_primary_window": "Code review 5-hour limit",
"code_review_secondary_window": "Code review weekly limit",
"code_review_team_secondary_window": "Code review monthly limit",
"additional_primary_window": "{{name}} 5-hour limit",
"additional_secondary_window": "{{name}} weekly limit",
"additional_team_secondary_window": "{{name}} monthly limit",
"plan_label": "Plan",
"expires_label": "Expires",
"reset_credits_label": "Manual resets",
+3
View File
@@ -427,10 +427,13 @@
"fetch_all": "Получить все",
"primary_window": "Лимит на 5 часов",
"secondary_window": "Недельный лимит",
"team_secondary_window": "Месячный лимит",
"code_review_primary_window": "Лимит code review на 5 часов",
"code_review_secondary_window": "Недельный лимит code review",
"code_review_team_secondary_window": "Месячный лимит code review",
"additional_primary_window": "{{name}}: лимит на 5 часов",
"additional_secondary_window": "{{name}}: недельный лимит",
"additional_team_secondary_window": "{{name}}: месячный лимит",
"plan_label": "Тариф",
"expires_label": "Истекает",
"plan_plus": "Plus",
+3
View File
@@ -433,10 +433,13 @@
"fetch_all": "获取全部",
"primary_window": "5 小时限额",
"secondary_window": "周限额",
"team_secondary_window": "月度限额",
"code_review_primary_window": "代码审查 5 小时限额",
"code_review_secondary_window": "代码审查周限额",
"code_review_team_secondary_window": "代码审查月度限额",
"additional_primary_window": "{{name}} 5 小时限额",
"additional_secondary_window": "{{name}} 周限额",
"additional_team_secondary_window": "{{name}} 月度限额",
"plan_label": "套餐",
"expires_label": "到期时间",
"reset_credits_label": "主动重置次数",
+3
View File
@@ -433,10 +433,13 @@
"fetch_all": "取得全部",
"primary_window": "5 小時限額",
"secondary_window": "週限額",
"team_secondary_window": "月度限額",
"code_review_primary_window": "程式碼審查 5 小時限額",
"code_review_secondary_window": "程式碼審查週限額",
"code_review_team_secondary_window": "程式碼審查月度限額",
"additional_primary_window": "{{name}} 5 小時限額",
"additional_secondary_window": "{{name}} 週限額",
"additional_team_secondary_window": "{{name}} 月度限額",
"plan_label": "方案",
"expires_label": "到期時間",
"reset_credits_label": "主動重置次數",