fix(cliproxy): address PR review feedback

- Pass verbose flag through fetchQuotaWithDedup to fetchAccountQuota
- Change verbose logging from console.log to console.error (stderr)
- Keep quotaPercent optional (semantically correct for cases without quota)
This commit is contained in:
kaitranntt committed 2026-01-14 10:49:47 -05:00
1 parent 1ac19415ce
commit 04c9b087ca
2 files changed
+16 -15

No files matched your search

+13 -13
View File
@@ -182,7 +182,7 @@ async function refreshAccessToken(
refreshToken: string, refreshToken: string,
verbose = false verbose = false
): Promise<{ accessToken: string | null; error?: string }> { ): Promise<{ accessToken: string | null; error?: string }> {
if (verbose) console.log('[i] Refreshing access token...'); if (verbose) console.error('[i] Refreshing access token...');
const controller = new AbortController(); const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 10000); const timeoutId = setTimeout(() => controller.abort(), 10000);
@@ -204,13 +204,13 @@ async function refreshAccessToken(
clearTimeout(timeoutId); clearTimeout(timeoutId);
if (verbose) console.log(`[i] Token refresh status: ${response.status}`); if (verbose) console.error(`[i] Token refresh status: ${response.status}`);
const data = (await response.json()) as TokenRefreshResponse; const data = (await response.json()) as TokenRefreshResponse;
if (!response.ok || data.error) { if (!response.ok || data.error) {
const error = data.error_description || data.error || `OAuth error: ${response.status}`; const error = data.error_description || data.error || `OAuth error: ${response.status}`;
if (verbose) console.log(`[!] Token refresh failed: ${error}`); if (verbose) console.error(`[!] Token refresh failed: ${error}`);
return { return {
accessToken: null, accessToken: null,
error, error,
@@ -218,11 +218,11 @@ async function refreshAccessToken(
} }
if (!data.access_token) { if (!data.access_token) {
if (verbose) console.log('[!] Token refresh failed: No access_token in response'); if (verbose) console.error('[!] Token refresh failed: No access_token in response');
return { accessToken: null, error: 'No access_token in response' }; return { accessToken: null, error: 'No access_token in response' };
} }
if (verbose) console.log('[i] Token refresh: success'); if (verbose) console.error('[i] Token refresh: success');
return { accessToken: data.access_token }; return { accessToken: data.access_token };
} catch (err) { } catch (err) {
clearTimeout(timeoutId); clearTimeout(timeoutId);
@@ -232,7 +232,7 @@ async function refreshAccessToken(
: err instanceof Error : err instanceof Error
? err.message ? err.message
: 'Unknown error'; : 'Unknown error';
if (verbose) console.log(`[!] Token refresh failed: ${errorMsg}`); if (verbose) console.error(`[!] Token refresh failed: ${errorMsg}`);
return { accessToken: null, error: errorMsg }; return { accessToken: null, error: errorMsg };
} }
} }
@@ -539,12 +539,12 @@ export async function fetchAccountQuota(
accountId: string, accountId: string,
verbose = false verbose = false
): Promise<QuotaResult> { ): Promise<QuotaResult> {
if (verbose) console.log(`[i] Fetching quota for ${accountId}...`); if (verbose) console.error(`[i] Fetching quota for ${accountId}...`);
// Only Antigravity supports quota fetching // Only Antigravity supports quota fetching
if (provider !== 'agy') { if (provider !== 'agy') {
const error = `Quota not supported for provider: ${provider}`; const error = `Quota not supported for provider: ${provider}`;
if (verbose) console.log(`[!] Error: ${error}`); if (verbose) console.error(`[!] Error: ${error}`);
return { return {
success: false, success: false,
models: [], models: [],
@@ -557,7 +557,7 @@ export async function fetchAccountQuota(
const authData = readAuthData(provider, accountId); const authData = readAuthData(provider, accountId);
if (!authData) { if (!authData) {
const error = 'Auth file not found for account'; const error = 'Auth file not found for account';
if (verbose) console.log(`[!] Error: ${error}`); if (verbose) console.error(`[!] Error: ${error}`);
return { return {
success: false, success: false,
models: [], models: [],
@@ -590,7 +590,7 @@ export async function fetchAccountQuota(
} }
if (verbose && !tokenRefreshed) { if (verbose && !tokenRefreshed) {
console.log('[i] Token refresh: skipped'); console.error('[i] Token refresh: skipped');
} }
// Get project ID and tier - prefer stored project ID, but always call API for tier // Get project ID and tier - prefer stored project ID, but always call API for tier
@@ -611,7 +611,7 @@ export async function fetchAccountQuota(
} }
if (!lastProjectResult.projectId) { if (!lastProjectResult.projectId) {
const error = lastProjectResult.error || 'Failed to retrieve project ID'; const error = lastProjectResult.error || 'Failed to retrieve project ID';
if (verbose) console.log(`[!] Error: ${error}`); if (verbose) console.error(`[!] Error: ${error}`);
return { return {
success: false, success: false,
models: [], models: [],
@@ -626,12 +626,12 @@ export async function fetchAccountQuota(
projectId = lastProjectResult.projectId || projectId; projectId = lastProjectResult.projectId || projectId;
apiTier = lastProjectResult.tier || 'unknown'; apiTier = lastProjectResult.tier || 'unknown';
if (verbose) console.log(`[i] Project ID: ${projectId || 'not found'}`); if (verbose) console.error(`[i] Project ID: ${projectId || 'not found'}`);
// Fetch models with quota // Fetch models with quota
const result = await fetchAvailableModels(accessToken, projectId as string); const result = await fetchAvailableModels(accessToken, projectId as string);
if (verbose) console.log(`[i] Models found: ${result.models.length}`); if (verbose) console.error(`[i] Models found: ${result.models.length}`);
// If quota fetch fails with auth error and we haven't refreshed yet, try refresh // If quota fetch fails with auth error and we haven't refreshed yet, try refresh
if (!result.success && result.error?.includes('expired') && authData.refreshToken) { if (!result.success && result.error?.includes('expired') && authData.refreshToken) {
+3 -2
View File
@@ -85,7 +85,8 @@ export function clearQuotaCache(): void {
*/ */
async function fetchQuotaWithDedup( async function fetchQuotaWithDedup(
provider: CLIProxyProvider, provider: CLIProxyProvider,
accountId: string accountId: string,
verbose = false
): Promise<QuotaResult> { ): Promise<QuotaResult> {
const key = getCacheKey(provider, accountId); const key = getCacheKey(provider, accountId);
@@ -96,7 +97,7 @@ async function fetchQuotaWithDedup(
} }
// Start new fetch and track it // Start new fetch and track it
const fetchPromise = fetchAccountQuota(provider, accountId) const fetchPromise = fetchAccountQuota(provider, accountId, verbose)
.then((result) => { .then((result) => {
setCachedQuota(provider, accountId, result); setCachedQuota(provider, accountId, result);
return result; return result;