feat: show (sub) indicator in footer when using OAuth subscription

This commit is contained in:
Mario Zechner 2025-12-02 09:32:25 +01:00
parent 8cd3151c2a
commit bc838b021d
4 changed files with 69 additions and 4 deletions

View file

@ -4,7 +4,8 @@ import AjvModule from "ajv";
import { existsSync, readFileSync } from "fs";
import { homedir } from "os";
import { join } from "path";
import { getOAuthToken } from "./oauth/index.js";
import { getOAuthToken, type SupportedOAuthProvider } from "./oauth/index.js";
import { loadOAuthCredentials } from "./oauth/storage.js";
// Handle both default and named exports
const Ajv = (AjvModule as any).default || AjvModule;
@ -292,3 +293,56 @@ export function findModel(provider: string, modelId: string): { model: Model<Api
const model = allModels.find((m) => m.provider === provider && m.id === modelId) || null;
return { model, error: null };
}
/**
* Mapping from model provider to OAuth provider ID.
* Only providers that support OAuth are listed here.
*/
const providerToOAuthProvider: Record<string, SupportedOAuthProvider> = {
anthropic: "anthropic",
// Add more mappings as OAuth support is added for other providers
};
// Cache for OAuth status per provider (avoids file reads on every render)
const oauthStatusCache: Map<string, boolean> = new Map();
/**
* Invalidate the OAuth status cache.
* Call this after login/logout operations.
*/
export function invalidateOAuthCache(): void {
oauthStatusCache.clear();
}
/**
* Check if a model is using OAuth credentials (subscription).
* This checks if OAuth credentials exist and would be used for the model,
* without actually fetching or refreshing the token.
* Results are cached until invalidateOAuthCache() is called.
*/
export function isModelUsingOAuth(model: Model<Api>): boolean {
const oauthProvider = providerToOAuthProvider[model.provider];
if (!oauthProvider) {
return false;
}
// Check cache first
if (oauthStatusCache.has(oauthProvider)) {
return oauthStatusCache.get(oauthProvider)!;
}
// Check if OAuth credentials exist for this provider
let usingOAuth = false;
const credentials = loadOAuthCredentials(oauthProvider);
if (credentials) {
usingOAuth = true;
}
// Also check for manual OAuth token env var (for Anthropic)
if (!usingOAuth && model.provider === "anthropic" && process.env.ANTHROPIC_OAUTH_TOKEN) {
usingOAuth = true;
}
oauthStatusCache.set(oauthProvider, usingOAuth);
return usingOAuth;
}