feat(usage): add xAI quota reporting
packages/ui/src/components/sections/usage/UsagePage.tsx\n - What: Show selected configured-provider errors in Usage settings.\n - Why: Preserve provider-specific failures when another provider succeeds.\n\npackages/ui/src/lib/quota/providers/index.ts\n - What: Register xAI in shared quota metadata.\n - Why: Expose xAI across shared usage surfaces.\n\npackages/ui/src/types/quota.ts\n - What: Add xAI to the quota provider contract.\n - Why: Allow typed xAI results across runtimes.\n\npackages/vscode/src/opencodeAuth.ts\n - What: Preserve secure auth-file persistence for refreshed xAI credentials.\n - Why: Reuse the VS Code auth boundary safely.\n\npackages/vscode/src/quotaProviders.ts\n - What: Add xAI SuperGrok quota fetching, refresh, parsing, and failure isolation.\n - Why: Provide VS Code usage parity.\n\npackages/web/server/lib/opencode/auth.js\n - What: Enforce secure auth directory, auth file, and backup permissions.\n - Why: Protect refreshed OAuth credentials.\n\npackages/web/server/lib/quota/DOCUMENTATION.md\n - What: Document the xAI quota provider.\n - Why: Keep provider ownership documentation current.\n\npackages/web/server/lib/quota/providers/index.js\n - What: Register the xAI web quota adapter.\n - Why: Expose xAI through the existing quota route.\n\npackages/web/server/lib/quota/providers/xai.js\n - What: Add SuperGrok usage fetching, inherited OAuth refresh, strict parsing, and zero/error semantics.\n - Why: Report xAI billing-period usage without new auth architecture or credentials.
This commit is contained in:
@@ -76,6 +76,9 @@ export const UsagePage: React.FC = () => {
|
||||
const providerMeta = QUOTA_PROVIDERS.find((provider) => provider.id === selectedProviderId);
|
||||
const providerName = providerMeta?.name ?? selectedProviderId ?? t('settings.usage.sidebar.title');
|
||||
const usage = selectedResult?.usage;
|
||||
const selectedProviderError = selectedResult?.configured && !selectedResult.ok
|
||||
? selectedResult.error
|
||||
: null;
|
||||
const showInDropdown = selectedProviderId ? dropdownProviderIds.includes(selectedProviderId) : false;
|
||||
const hasCredentialsForm = selectedProviderId === 'opencode-go' || selectedProviderId === 'ollama-cloud' || selectedProviderId === 'cursor';
|
||||
const handleDropdownToggle = React.useCallback((enabled: boolean) => {
|
||||
@@ -179,10 +182,10 @@ export const UsagePage: React.FC = () => {
|
||||
<p className="typography-ui-label text-foreground pb-8">{t('settings.usage.page.state.noData')}</p>
|
||||
)}
|
||||
|
||||
{error && (
|
||||
{(error || selectedProviderError) && (
|
||||
<div className="mb-8 rounded-lg border border-[var(--status-error-border)] bg-[var(--status-error-background)] px-4 py-3">
|
||||
<p className="typography-ui-label font-medium text-[var(--status-error)]">{t('settings.usage.page.state.refreshFailedTitle')}</p>
|
||||
<p className="typography-meta text-[var(--status-error)]/80 mt-1">{error}</p>
|
||||
<p className="typography-meta text-[var(--status-error)]/80 mt-1">{error ?? selectedProviderError}</p>
|
||||
</div>
|
||||
)}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user