From 7330fdbf2830911bcac09826cabf5929cc741be8 Mon Sep 17 00:00:00 2001 From: Tam Nhu Tran Date: Fri, 10 Apr 2026 13:24:00 -0400 Subject: [PATCH] fix(cliproxy): prefer live entitlement tier in account badges --- .../account/shared/account-surface-card.tsx | 28 ++++++++--- .../shared/account-surface-card.test.tsx | 49 +++++++++++++++++++ 2 files changed, 70 insertions(+), 7 deletions(-) create mode 100644 ui/tests/unit/ui/components/account/shared/account-surface-card.test.tsx diff --git a/ui/src/components/account/shared/account-surface-card.tsx b/ui/src/components/account/shared/account-surface-card.tsx index 3d91d71f..783f3054 100644 --- a/ui/src/components/account/shared/account-surface-card.tsx +++ b/ui/src/components/account/shared/account-surface-card.tsx @@ -59,6 +59,19 @@ function getCompactAudienceBadgeLabel(audience: 'business' | 'personal' | 'unkno return '?'; } +function resolveEffectiveTier( + tier: AccountTier | undefined, + quota: UnifiedQuotaResult | undefined +): AccountTier | undefined { + if (quota && 'entitlement' in quota) { + const entitlementTier = quota.entitlement?.normalizedTier; + if (entitlementTier && entitlementTier !== 'unknown') { + return entitlementTier; + } + } + return tier; +} + export function AccountSurfaceCard({ mode, provider, @@ -85,13 +98,14 @@ export function AccountSurfaceCard({ const identity = getAccountIdentityPresentation(accountId, email, tokenFile); const title = displayEmail || identity.email || accountId; const normalizedProvider = provider.toLowerCase(); + const effectiveTier = resolveEffectiveTier(tier, quota); const showTierBadge = (normalizedProvider === 'agy' || normalizedProvider === 'antigravity' || normalizedProvider === 'gemini') && - tier && - tier !== 'unknown' && - tier !== 'free'; + effectiveTier && + effectiveTier !== 'unknown' && + effectiveTier !== 'free'; const isCompact = mode === 'compact'; const defaultCompactMetaBadges = ( <> @@ -99,10 +113,10 @@ export function AccountSurfaceCard({ - {tier} + {effectiveTier} )} {identity.audienceLabel && ( @@ -145,12 +159,12 @@ export function AccountSurfaceCard({ - {tier === 'ultra' ? 'U' : 'P'} + {effectiveTier === 'ultra' ? 'U' : 'P'} )} diff --git a/ui/tests/unit/ui/components/account/shared/account-surface-card.test.tsx b/ui/tests/unit/ui/components/account/shared/account-surface-card.test.tsx new file mode 100644 index 00000000..6a0a823e --- /dev/null +++ b/ui/tests/unit/ui/components/account/shared/account-surface-card.test.tsx @@ -0,0 +1,49 @@ +import { render, screen } from '@tests/setup/test-utils'; +import { describe, expect, it } from 'vitest'; +import { AccountSurfaceCard } from '@/components/account/shared/account-surface-card'; +import type { GeminiCliQuotaResult } from '@/lib/api-client'; + +function createGeminiQuotaResult( + overrides: Partial = {} +): GeminiCliQuotaResult { + return { + success: true, + buckets: [], + projectId: 'project-123', + tierLabel: 'Pro', + tierId: 'g1-pro-tier', + creditBalance: 12, + entitlement: { + normalizedTier: 'pro', + rawTierId: 'g1-pro-tier', + rawTierLabel: 'Pro', + source: 'runtime_api', + confidence: 'high', + accessState: 'entitled', + capacityState: 'available', + lastVerifiedAt: Date.now(), + notes: null, + }, + lastUpdated: Date.now(), + ...overrides, + }; +} + +describe('AccountSurfaceCard', () => { + it('prefers live quota entitlement tier over a stale account tier for Gemini badges', () => { + render( + + ); + + expect(screen.getByText('pro')).toBeInTheDocument(); + }); +});