antigravity-usage 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/version.ts","../src/core/logger.ts","../src/google/oauth.ts","../src/accounts/types.ts","../src/accounts/storage.ts","../src/core/env.ts","../src/accounts/config.ts","../src/accounts/cache.ts","../src/accounts/manager.ts","../src/google/storage.ts","../src/core/errors.ts","../src/google/token-manager.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/core/mask.ts","../src/commands/status.ts","../src/google/cloudcode.ts","../src/google/parser.ts","../src/local/process-detector.ts","../src/local/port-detective.ts","../src/local/port-prober.ts","../src/local/connect-client.ts","../src/local/local-parser.ts","../src/quota/service.ts","../src/quota/format.ts","../src/render/table.ts","../src/commands/quota.ts","../src/commands/doctor.ts","../src/commands/accounts.ts"],"sourcesContent":["/**\n * antigravity-usage CLI entry point\n */\n\nimport { Command } from 'commander'\nimport { version } from './version'\nimport { setDebugMode } from './core/logger.js'\n\n// Import commands\nimport { loginCommand } from './commands/login.js'\nimport { logoutCommand } from './commands/logout.js'\nimport { statusCommand } from './commands/status.js'\nimport { quotaCommand } from './commands/quota.js'\nimport { doctorCommand } from './commands/doctor.js'\nimport { accountsCommand } from './commands/accounts.js'\n\nconst program = new Command()\n\nprogram\n .name('antigravity-usage')\n .description('CLI tool to check Antigravity model quota via Google Cloud Code API')\n .version(version)\n .option('--debug', 'Enable debug mode')\n .hook('preAction', (thisCommand) => {\n const opts = thisCommand.opts()\n if (opts.debug) {\n setDebugMode(true)\n }\n })\n\n// Login command\nprogram\n .command('login')\n .description('Authenticate with Google (adds a new account)')\n .option('--no-browser', 'Do not open browser, print URL instead')\n .option('-p, --port <port>', 'Port for OAuth callback server', parseInt)\n .action(loginCommand)\n\n// Logout command\nprogram\n .command('logout [email]')\n .description('Remove stored credentials')\n .option('--all', 'Logout from all accounts')\n .action((email, options) => logoutCommand(options, email))\n\n// Status command\nprogram\n .command('status')\n .description('Show current authentication status')\n .option('--all', 'Show status for all accounts')\n .option('-a, --account <email>', 'Show status for specific account')\n .action(statusCommand)\n\n// Quota command (default)\nprogram\n .command('quota', { isDefault: true })\n .description('Fetch and display quota information')\n .option('--json', 'Output as JSON')\n .option('-m, --method <method>', 'Method to use: auto (default), local, or google', 'auto')\n .option('--all', 'Show quota for all accounts')\n .option('-a, --account <email>', 'Show quota for specific account')\n .option('--refresh', 'Force refresh (ignore cache)')\n .action(quotaCommand)\n\n// Accounts command with subcommands\nconst accountsCmd = program\n .command('accounts')\n .description('Manage multiple accounts')\n\naccountsCmd\n .command('list')\n .description('List all accounts')\n .option('--refresh', 'Show refresh tip')\n .action((options) => accountsCommand('list', [], options))\n\naccountsCmd\n .command('add')\n .description('Add a new account (triggers OAuth login)')\n .action(() => accountsCommand('add', [], {}))\n\naccountsCmd\n .command('switch <email>')\n .description('Switch to a different account')\n .action((email) => accountsCommand('switch', [email], {}))\n\naccountsCmd\n .command('remove <email>')\n .description('Remove an account')\n .option('--force', 'Skip confirmation')\n .action((email, options) => accountsCommand('remove', [email], options))\n\naccountsCmd\n .command('current')\n .description('Show current active account')\n .action(() => accountsCommand('current', [], {}))\n\naccountsCmd\n .command('refresh [email]')\n .description('Refresh account tokens')\n .option('--all', 'Refresh all accounts')\n .action((email, options) => accountsCommand('refresh', email ? [email] : [], options))\n\n// Default action for accounts command (show list)\naccountsCmd.action(() => accountsCommand('list', [], {}))\n\n// Doctor command\nprogram\n .command('doctor')\n .description('Run diagnostics and show configuration')\n .action(doctorCommand)\n\n// Parse and run\nprogram.parse()\n","/**\n * Version info\n */\nexport const version = '0.1.0'\n","/**\n * Logger utility with debug mode support\n */\n\nlet debugMode = false\n\nexport function setDebugMode(enabled: boolean): void {\n debugMode = enabled\n}\n\nexport function isDebugMode(): boolean {\n return debugMode\n}\n\nexport function debug(category: string, message: string, data?: unknown): void {\n if (!debugMode) return\n \n const timestamp = new Date().toISOString()\n const prefix = `[${timestamp}] [${category}]`\n \n if (data !== undefined) {\n console.error(`${prefix} ${message}`, data)\n } else {\n console.error(`${prefix} ${message}`)\n }\n}\n\nexport function info(message: string): void {\n console.log(message)\n}\n\nexport function warn(message: string): void {\n console.warn(`⚠️ ${message}`)\n}\n\nexport function error(message: string): void {\n console.error(`❌ ${message}`)\n}\n\nexport function success(message: string): void {\n console.log(`✅ ${message}`)\n}\n","/**\n * OAuth configuration and flow\n */\n\nimport { createServer, type IncomingMessage, type ServerResponse } from 'node:http'\nimport { URL, URLSearchParams } from 'node:url'\nimport open from 'open'\nimport { debug, info, error as logError } from '../core/logger.js'\nimport { getAccountManager } from '../accounts/index.js'\nimport type { OAuthTokenResponse, StoredTokens } from '../quota/types.js'\n\n// OAuth configuration\n// Default credentials provided - users can override with environment variables if needed\nconst OAUTH_CONFIG = {\n clientId: process.env.ANTIGRAVITY_OAUTH_CLIENT_ID || '1071006060591-tmhssin2h21lcre235vtolojh4g403ep.apps.googleusercontent.com',\n clientSecret: process.env.ANTIGRAVITY_OAUTH_CLIENT_SECRET || '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',\n authUrl: 'https://accounts.google.com/o/oauth2/v2/auth',\n tokenUrl: 'https://oauth2.googleapis.com/token',\n scopes: [\n 'https://www.googleapis.com/auth/cloud-platform',\n 'https://www.googleapis.com/auth/userinfo.email'\n ]\n}\n\ninterface OAuthOptions {\n noBrowser?: boolean\n port?: number\n}\n\ninterface OAuthResult {\n success: boolean\n email?: string\n error?: string\n}\n\n/**\n * Generate a random state parameter for CSRF protection\n */\nfunction generateState(): string {\n return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15)\n}\n\n/**\n * Get available port for callback server\n */\nasync function getAvailablePort(preferredPort?: number): Promise<number> {\n return new Promise((resolve, reject) => {\n const server = createServer()\n server.listen(preferredPort || 0, '127.0.0.1', () => {\n const address = server.address()\n if (address && typeof address === 'object') {\n const port = address.port\n server.close(() => resolve(port))\n } else {\n reject(new Error('Failed to get server address'))\n }\n })\n server.on('error', reject)\n })\n}\n\n/**\n * Exchange authorization code for tokens\n */\nasync function exchangeCodeForTokens(code: string, redirectUri: string): Promise<OAuthTokenResponse> {\n debug('oauth', 'Exchanging code for tokens')\n \n const params = new URLSearchParams({\n code,\n client_id: OAUTH_CONFIG.clientId,\n client_secret: OAUTH_CONFIG.clientSecret,\n redirect_uri: redirectUri,\n grant_type: 'authorization_code'\n })\n \n const response = await fetch(OAUTH_CONFIG.tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n },\n body: params.toString()\n })\n \n if (!response.ok) {\n const error = await response.text()\n debug('oauth', 'Token exchange failed', error)\n throw new Error(`Token exchange failed: ${response.status} ${error}`)\n }\n \n const data = await response.json() as OAuthTokenResponse\n debug('oauth', 'Token exchange successful')\n return data\n}\n\n/**\n * Get user email from access token\n */\nasync function getUserEmail(accessToken: string): Promise<string | undefined> {\n debug('oauth', 'Fetching user info')\n \n try {\n const response = await fetch('https://www.googleapis.com/oauth2/v2/userinfo', {\n headers: {\n Authorization: `Bearer ${accessToken}`\n }\n })\n \n if (response.ok) {\n const data = await response.json() as { email?: string }\n return data.email\n }\n } catch (err) {\n debug('oauth', 'Failed to get user info', err)\n }\n \n return undefined\n}\n\n/**\n * Fetch project ID from Cloud Code API during login\n * This is cached with tokens for efficiency during quota fetches\n */\nasync function fetchProjectId(accessToken: string): Promise<string | undefined> {\n debug('oauth', 'Fetching project ID from Cloud Code API')\n \n try {\n const response = await fetch('https://cloudcode-pa.googleapis.com/v1internal:loadCodeAssist', {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n 'User-Agent': 'antigravity/1.11.3 Darwin/arm64'\n },\n body: JSON.stringify({ metadata: { ideType: 'ANTIGRAVITY' } })\n })\n \n if (response.ok) {\n const data = await response.json() as { cloudaicompanionProject?: string }\n debug('oauth', `Got project ID: ${data.cloudaicompanionProject}`)\n return data.cloudaicompanionProject\n }\n \n debug('oauth', `Failed to get project ID: ${response.status}`)\n } catch (err) {\n debug('oauth', 'Error fetching project ID', err)\n }\n \n return undefined\n}\n\n/**\n * Start OAuth login flow\n */\nexport async function startOAuthFlow(options: OAuthOptions = {}): Promise<OAuthResult> {\n const port = await getAvailablePort(options.port)\n const redirectUri = `http://127.0.0.1:${port}/callback`\n const state = generateState()\n \n debug('oauth', `Starting OAuth flow on port ${port}`)\n \n // Build authorization URL\n const authParams = new URLSearchParams({\n client_id: OAUTH_CONFIG.clientId,\n redirect_uri: redirectUri,\n response_type: 'code',\n scope: OAUTH_CONFIG.scopes.join(' '),\n access_type: 'offline',\n prompt: 'consent',\n state\n })\n \n const authUrl = `${OAUTH_CONFIG.authUrl}?${authParams.toString()}`\n \n return new Promise((resolve) => {\n let resolved = false\n \n const server = createServer(async (req: IncomingMessage, res: ServerResponse) => {\n if (resolved) return\n \n const url = new URL(req.url || '/', `http://127.0.0.1:${port}`)\n \n if (url.pathname === '/callback') {\n const code = url.searchParams.get('code')\n const returnedState = url.searchParams.get('state')\n const errorParam = url.searchParams.get('error')\n \n if (errorParam) {\n res.writeHead(400, { 'Content-Type': 'text/html' })\n res.end('<html><body><h1>Login Failed</h1><p>You can close this window.</p></body></html>')\n resolved = true\n server.close()\n resolve({ success: false, error: errorParam })\n return\n }\n \n if (!code || returnedState !== state) {\n res.writeHead(400, { 'Content-Type': 'text/html' })\n res.end('<html><body><h1>Invalid Request</h1><p>State mismatch or missing code.</p></body></html>')\n resolved = true\n server.close()\n resolve({ success: false, error: 'Invalid callback' })\n return\n }\n \n try {\n // Exchange code for tokens\n const tokenResponse = await exchangeCodeForTokens(code, redirectUri)\n \n // Get user email\n const email = await getUserEmail(tokenResponse.access_token)\n \n // Get project ID from Cloud Code API (for efficiency during quota fetches)\n let projectId: string | undefined\n try {\n projectId = await fetchProjectId(tokenResponse.access_token)\n } catch (err) {\n debug('oauth', 'Failed to fetch project ID during login (will fetch on demand)', err)\n // Continue without project ID - it will be fetched on demand\n }\n \n // Save tokens using account manager\n const tokens: StoredTokens = {\n accessToken: tokenResponse.access_token,\n refreshToken: tokenResponse.refresh_token || '',\n expiresAt: Date.now() + tokenResponse.expires_in * 1000,\n email,\n projectId\n }\n \n // Add/update account via account manager\n if (email) {\n getAccountManager().addAccount(tokens, email)\n }\n \n res.writeHead(200, { 'Content-Type': 'text/html' })\n res.end(`\n <html>\n <body style=\"font-family: system-ui; padding: 40px; text-align: center;\">\n <h1>Login Successful!</h1>\n <p>You are now logged in${email ? ` as <strong>${email}</strong>` : ''}.</p>\n <p>You can close this window and return to the terminal.</p>\n </body>\n </html>\n `)\n \n resolved = true\n server.close()\n resolve({ success: true, email })\n } catch (err) {\n res.writeHead(500, { 'Content-Type': 'text/html' })\n res.end('<html><body><h1>Login Failed</h1><p>Token exchange failed.</p></body></html>')\n resolved = true\n server.close()\n resolve({ success: false, error: err instanceof Error ? err.message : 'Unknown error' })\n }\n }\n })\n \n server.listen(port, '127.0.0.1', async () => {\n info('')\n info('Opening browser for Google login...')\n info('')\n \n if (options.noBrowser) {\n info('Open this URL in your browser:')\n info(authUrl)\n } else {\n try {\n await open(authUrl)\n info('If the browser did not open, visit this URL:')\n info(authUrl)\n } catch (err) {\n debug('oauth', 'Failed to open browser', err)\n info('Could not open browser. Please visit this URL:')\n info(authUrl)\n }\n }\n \n info('')\n info('Waiting for authentication...')\n })\n \n // Timeout after 2 minutes\n setTimeout(() => {\n if (!resolved) {\n resolved = true\n server.close()\n resolve({ success: false, error: 'Login timed out' })\n }\n }, 2 * 60 * 1000)\n })\n}\n\n/**\n * Refresh access token using refresh token\n */\nexport async function refreshAccessToken(refreshToken: string): Promise<OAuthTokenResponse> {\n debug('oauth', 'Refreshing access token')\n \n const params = new URLSearchParams({\n refresh_token: refreshToken,\n client_id: OAUTH_CONFIG.clientId,\n client_secret: OAUTH_CONFIG.clientSecret,\n grant_type: 'refresh_token'\n })\n \n const response = await fetch(OAUTH_CONFIG.tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n },\n body: params.toString()\n })\n \n if (!response.ok) {\n const error = await response.text()\n debug('oauth', 'Token refresh failed', error)\n throw new Error(`Token refresh failed: ${response.status}`)\n }\n \n const data = await response.json() as OAuthTokenResponse\n debug('oauth', 'Token refresh successful')\n return data\n}\n","/**\n * Type definitions for multi-account support\n */\n\nimport type { StoredTokens, QuotaSnapshot } from '../quota/types.js'\n\n/**\n * Global configuration stored in config.json\n */\nexport interface GlobalConfig {\n version: string\n activeAccount: string | null\n preferences: ConfigPreferences\n}\n\n/**\n * User preferences\n */\nexport interface ConfigPreferences {\n cacheTTL: number // seconds, default 300 (5 minutes)\n}\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_CONFIG: GlobalConfig = {\n version: '2.0',\n activeAccount: null,\n preferences: {\n cacheTTL: 300\n }\n}\n\n/**\n * Per-account metadata stored in metadata.json\n */\nexport interface AccountMetadata {\n email: string\n addedAt: string // ISO date string\n lastUsed: string // ISO date string\n}\n\n/**\n * Cached quota data stored in cache.json\n */\nexport interface CachedQuota {\n cachedAt: string // ISO date string\n ttl: number // seconds\n data: QuotaSnapshot | null\n}\n\n/**\n * Account info returned by account manager\n */\nexport interface AccountInfo {\n email: string\n isActive: boolean\n metadata: AccountMetadata | null\n tokens: StoredTokens | null\n cache: CachedQuota | null\n status: AccountStatus\n}\n\n/**\n * Account status for display\n */\nexport type AccountStatus = 'valid' | 'expired' | 'invalid'\n\n/**\n * Account summary for list display\n */\nexport interface AccountSummary {\n email: string\n isActive: boolean\n status: AccountStatus\n lastUsed: string | null\n cachedCredits?: {\n used: number\n limit: number\n } | null\n}\n","/**\n * Account storage - file-based operations for multi-account\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, rmSync } from 'node:fs'\nimport { join, basename } from 'node:path'\nimport { getAccountsDir, getAccountDir } from '../core/env.js'\nimport { debug } from '../core/logger.js'\nimport type { StoredTokens } from '../quota/types.js'\nimport type { AccountMetadata, CachedQuota } from './types.js'\n\n/**\n * Ensure accounts directory exists\n */\nexport function ensureAccountsDir(): void {\n const dir = getAccountsDir()\n if (!existsSync(dir)) {\n debug('accounts-storage', `Creating accounts directory: ${dir}`)\n mkdirSync(dir, { recursive: true })\n }\n}\n\n/**\n * Ensure specific account directory exists\n */\nexport function ensureAccountDir(email: string): void {\n ensureAccountsDir()\n const dir = getAccountDir(email)\n if (!existsSync(dir)) {\n debug('accounts-storage', `Creating account directory: ${dir}`)\n mkdirSync(dir, { recursive: true })\n }\n}\n\n/**\n * Check if an account exists\n */\nexport function accountExists(email: string): boolean {\n const dir = getAccountDir(email)\n return existsSync(dir) && existsSync(join(dir, 'tokens.json'))\n}\n\n/**\n * List all account directories (by email)\n */\nexport function listAccountEmails(): string[] {\n const accountsDir = getAccountsDir()\n \n if (!existsSync(accountsDir)) {\n return []\n }\n \n try {\n const entries = readdirSync(accountsDir, { withFileTypes: true })\n const emails: string[] = []\n \n for (const entry of entries) {\n if (entry.isDirectory()) {\n // Check if it has a tokens.json file\n const tokensPath = join(accountsDir, entry.name, 'tokens.json')\n if (existsSync(tokensPath)) {\n emails.push(entry.name)\n }\n }\n }\n \n return emails\n } catch (err) {\n debug('accounts-storage', 'Failed to list accounts', err)\n return []\n }\n}\n\n// ============================================================\n// Token operations\n// ============================================================\n\n/**\n * Save tokens for an account\n */\nexport function saveAccountTokens(email: string, tokens: StoredTokens): void {\n ensureAccountDir(email)\n const path = join(getAccountDir(email), 'tokens.json')\n \n debug('accounts-storage', `Saving tokens for ${email}`)\n writeFileSync(path, JSON.stringify(tokens, null, 2), { mode: 0o600 })\n}\n\n/**\n * Load tokens for an account\n */\nexport function loadAccountTokens(email: string): StoredTokens | null {\n const path = join(getAccountDir(email), 'tokens.json')\n \n if (!existsSync(path)) {\n debug('accounts-storage', `No tokens file for ${email}`)\n return null\n }\n \n try {\n const content = readFileSync(path, 'utf-8')\n return JSON.parse(content) as StoredTokens\n } catch (err) {\n debug('accounts-storage', `Failed to parse tokens for ${email}`, err)\n return null\n }\n}\n\n// ============================================================\n// Metadata operations\n// ============================================================\n\n/**\n * Save metadata for an account\n */\nexport function saveAccountMetadata(email: string, metadata: AccountMetadata): void {\n ensureAccountDir(email)\n const path = join(getAccountDir(email), 'metadata.json')\n \n debug('accounts-storage', `Saving metadata for ${email}`)\n writeFileSync(path, JSON.stringify(metadata, null, 2), { mode: 0o600 })\n}\n\n/**\n * Load metadata for an account\n */\nexport function loadAccountMetadata(email: string): AccountMetadata | null {\n const path = join(getAccountDir(email), 'metadata.json')\n \n if (!existsSync(path)) {\n return null\n }\n \n try {\n const content = readFileSync(path, 'utf-8')\n return JSON.parse(content) as AccountMetadata\n } catch (err) {\n debug('accounts-storage', `Failed to parse metadata for ${email}`, err)\n return null\n }\n}\n\n/**\n * Update lastUsed timestamp for an account\n */\nexport function updateLastUsed(email: string): void {\n const metadata = loadAccountMetadata(email)\n if (metadata) {\n metadata.lastUsed = new Date().toISOString()\n saveAccountMetadata(email, metadata)\n }\n}\n\n// ============================================================\n// Cache operations\n// ============================================================\n\n/**\n * Save cached quota for an account\n */\nexport function saveAccountCache(email: string, cache: CachedQuota): void {\n ensureAccountDir(email)\n const path = join(getAccountDir(email), 'cache.json')\n \n debug('accounts-storage', `Saving cache for ${email}`)\n writeFileSync(path, JSON.stringify(cache, null, 2))\n}\n\n/**\n * Load cached quota for an account\n */\nexport function loadAccountCache(email: string): CachedQuota | null {\n const path = join(getAccountDir(email), 'cache.json')\n \n if (!existsSync(path)) {\n return null\n }\n \n try {\n const content = readFileSync(path, 'utf-8')\n return JSON.parse(content) as CachedQuota\n } catch (err) {\n debug('accounts-storage', `Failed to parse cache for ${email}`, err)\n return null\n }\n}\n\n/**\n * Delete cache for an account\n */\nexport function deleteAccountCache(email: string): void {\n const path = join(getAccountDir(email), 'cache.json')\n \n if (existsSync(path)) {\n try {\n rmSync(path)\n debug('accounts-storage', `Deleted cache for ${email}`)\n } catch (err) {\n debug('accounts-storage', `Failed to delete cache for ${email}`, err)\n }\n }\n}\n\n// ============================================================\n// Account deletion\n// ============================================================\n\n/**\n * Delete an account and all its data\n */\nexport function deleteAccount(email: string): boolean {\n const dir = getAccountDir(email)\n \n if (!existsSync(dir)) {\n debug('accounts-storage', `Account ${email} does not exist`)\n return false\n }\n \n try {\n rmSync(dir, { recursive: true, force: true })\n debug('accounts-storage', `Deleted account ${email}`)\n return true\n } catch (err) {\n debug('accounts-storage', `Failed to delete account ${email}`, err)\n return false\n }\n}\n","/**\n * Environment and platform utilities\n */\n\nimport { homedir, platform } from 'node:os'\nimport { join } from 'node:path'\n\nexport type Platform = 'windows' | 'macos' | 'linux'\n\n/**\n * Get the current platform\n */\nexport function getPlatform(): Platform {\n const p = platform()\n if (p === 'win32') return 'windows'\n if (p === 'darwin') return 'macos'\n return 'linux'\n}\n\n/**\n * Get the config directory for this application\n * - Windows: %APPDATA%/antigravity-usage\n * - macOS: ~/Library/Application Support/antigravity-usage\n * - Linux: ~/.config/antigravity-usage\n */\nexport function getConfigDir(): string {\n const p = getPlatform()\n const home = homedir()\n \n switch (p) {\n case 'windows':\n return join(process.env.APPDATA || join(home, 'AppData', 'Roaming'), 'antigravity-usage')\n case 'macos':\n return join(home, 'Library', 'Application Support', 'antigravity-usage')\n case 'linux':\n default:\n return join(process.env.XDG_CONFIG_HOME || join(home, '.config'), 'antigravity-usage')\n }\n}\n\n/**\n * Get the path to the tokens file (legacy - single account)\n */\nexport function getTokensPath(): string {\n return join(getConfigDir(), 'tokens.json')\n}\n\n/**\n * Get the accounts directory\n */\nexport function getAccountsDir(): string {\n return join(getConfigDir(), 'accounts')\n}\n\n/**\n * Get the directory for a specific account\n * @param email Account email address\n */\nexport function getAccountDir(email: string): string {\n // Sanitize email for filesystem (replace special chars)\n const safeName = email.replace(/[^a-zA-Z0-9@._-]/g, '_')\n return join(getAccountsDir(), safeName)\n}\n\n/**\n * Get the path to global config file\n */\nexport function getGlobalConfigPath(): string {\n return join(getConfigDir(), 'config.json')\n}\n","/**\n * Global configuration management\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs'\nimport { dirname } from 'node:path'\nimport { getGlobalConfigPath, getConfigDir } from '../core/env.js'\nimport { debug } from '../core/logger.js'\nimport { DEFAULT_CONFIG, type GlobalConfig } from './types.js'\n\n/**\n * Load global config from disk\n */\nexport function loadConfig(): GlobalConfig {\n const path = getGlobalConfigPath()\n \n if (!existsSync(path)) {\n debug('config', 'No config file found, using defaults')\n return { ...DEFAULT_CONFIG }\n }\n \n try {\n const content = readFileSync(path, 'utf-8')\n const config = JSON.parse(content) as Partial<GlobalConfig>\n \n // Merge with defaults to ensure all fields exist\n return {\n ...DEFAULT_CONFIG,\n ...config,\n preferences: {\n ...DEFAULT_CONFIG.preferences,\n ...config.preferences\n }\n }\n } catch (err) {\n debug('config', 'Failed to parse config, using defaults', err)\n return { ...DEFAULT_CONFIG }\n }\n}\n\n/**\n * Save global config to disk\n */\nexport function saveConfig(config: GlobalConfig): void {\n const path = getGlobalConfigPath()\n const dir = dirname(path)\n \n // Ensure directory exists\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true })\n }\n \n debug('config', `Saving config to ${path}`)\n writeFileSync(path, JSON.stringify(config, null, 2))\n}\n\n/**\n * Get the active account email\n */\nexport function getActiveAccountEmail(): string | null {\n const config = loadConfig()\n return config.activeAccount\n}\n\n/**\n * Set the active account email\n */\nexport function setActiveAccountEmail(email: string | null): void {\n const config = loadConfig()\n config.activeAccount = email\n saveConfig(config)\n}\n\n/**\n * Get cache TTL in seconds\n */\nexport function getCacheTTL(): number {\n const config = loadConfig()\n return config.preferences.cacheTTL\n}\n","/**\n * Cache management for quota data\n */\n\nimport { loadAccountCache, saveAccountCache, deleteAccountCache } from './storage.js'\nimport { getCacheTTL } from './config.js'\nimport { debug } from '../core/logger.js'\nimport type { QuotaSnapshot } from '../quota/types.js'\nimport type { CachedQuota } from './types.js'\n\n/**\n * Check if cache is valid for an account\n */\nexport function isCacheValid(email: string): boolean {\n const cache = loadAccountCache(email)\n \n if (!cache || !cache.data) {\n debug('cache', `No valid cache for ${email}`)\n return false\n }\n \n const cachedAt = new Date(cache.cachedAt).getTime()\n const ttlMs = cache.ttl * 1000\n const now = Date.now()\n \n const isValid = (now - cachedAt) < ttlMs\n debug('cache', `Cache for ${email} is ${isValid ? 'valid' : 'stale'}`)\n \n return isValid\n}\n\n/**\n * Get cache age in seconds\n */\nexport function getCacheAge(email: string): number | null {\n const cache = loadAccountCache(email)\n \n if (!cache) {\n return null\n }\n \n const cachedAt = new Date(cache.cachedAt).getTime()\n return Math.floor((Date.now() - cachedAt) / 1000)\n}\n\n/**\n * Save quota data to cache\n */\nexport function saveCache(email: string, data: QuotaSnapshot): void {\n const ttl = getCacheTTL()\n \n const cache: CachedQuota = {\n cachedAt: new Date().toISOString(),\n ttl,\n data\n }\n \n saveAccountCache(email, cache)\n debug('cache', `Cached quota for ${email}, TTL: ${ttl}s`)\n}\n\n/**\n * Load cached quota data\n */\nexport function loadCache(email: string): QuotaSnapshot | null {\n const cache = loadAccountCache(email)\n return cache?.data || null\n}\n\n/**\n * Load cache with metadata\n */\nexport function loadCacheWithMeta(email: string): CachedQuota | null {\n return loadAccountCache(email)\n}\n\n/**\n * Invalidate cache for an account\n */\nexport function invalidateCache(email: string): void {\n deleteAccountCache(email)\n debug('cache', `Invalidated cache for ${email}`)\n}\n","/**\n * Account manager - orchestrates multi-account operations\n */\n\nimport { debug } from '../core/logger.js'\nimport { \n listAccountEmails, \n loadAccountTokens, \n saveAccountTokens,\n loadAccountMetadata,\n saveAccountMetadata,\n accountExists,\n deleteAccount as deleteAccountDir,\n updateLastUsed\n} from './storage.js'\nimport { \n getActiveAccountEmail, \n setActiveAccountEmail \n} from './config.js'\nimport { \n isCacheValid, \n loadCacheWithMeta,\n getCacheAge\n} from './cache.js'\nimport type { StoredTokens } from '../quota/types.js'\nimport type { \n AccountInfo, \n AccountMetadata, \n AccountStatus, \n AccountSummary \n} from './types.js'\n\n// Refresh token 5 minutes before expiry\nconst EXPIRY_BUFFER_MS = 5 * 60 * 1000\n\n/**\n * Account Manager - singleton class for managing multiple accounts\n */\nexport class AccountManager {\n private static instance: AccountManager | null = null\n \n private constructor() {}\n \n static getInstance(): AccountManager {\n if (!AccountManager.instance) {\n AccountManager.instance = new AccountManager()\n }\n return AccountManager.instance\n }\n \n /**\n * Reset instance (for testing)\n */\n static resetInstance(): void {\n AccountManager.instance = null\n }\n \n /**\n * Get all account emails\n */\n getAccountEmails(): string[] {\n return listAccountEmails()\n }\n \n /**\n * Get active account email\n */\n getActiveEmail(): string | null {\n return getActiveAccountEmail()\n }\n \n /**\n * Set active account\n */\n setActiveAccount(email: string): boolean {\n if (!accountExists(email)) {\n debug('account-manager', `Account ${email} does not exist`)\n return false\n }\n \n setActiveAccountEmail(email)\n updateLastUsed(email)\n debug('account-manager', `Switched to account ${email}`)\n return true\n }\n \n /**\n * Check if an account exists\n */\n hasAccount(email: string): boolean {\n return accountExists(email)\n }\n \n /**\n * Get account status\n */\n getAccountStatus(email: string): AccountStatus {\n const tokens = loadAccountTokens(email)\n \n if (!tokens) {\n return 'invalid'\n }\n \n // Check if token is expired\n const now = Date.now()\n if (now >= tokens.expiresAt - EXPIRY_BUFFER_MS) {\n // Expired, but might have refresh token\n if (tokens.refreshToken) {\n return 'expired' // Can be refreshed\n }\n return 'invalid'\n }\n \n return 'valid'\n }\n \n /**\n * Get detailed account info\n */\n getAccountInfo(email: string): AccountInfo | null {\n if (!accountExists(email)) {\n return null\n }\n \n const activeEmail = getActiveAccountEmail()\n const tokens = loadAccountTokens(email)\n const metadata = loadAccountMetadata(email)\n const cache = loadCacheWithMeta(email)\n const status = this.getAccountStatus(email)\n \n return {\n email,\n isActive: email === activeEmail,\n tokens,\n metadata,\n cache,\n status\n }\n }\n \n /**\n * Get account summaries for list display\n */\n getAccountSummaries(): AccountSummary[] {\n const emails = this.getAccountEmails()\n const activeEmail = getActiveAccountEmail()\n \n return emails.map(email => {\n const metadata = loadAccountMetadata(email)\n const cache = loadCacheWithMeta(email)\n const status = this.getAccountStatus(email)\n \n // Extract credits from cache if available\n let cachedCredits: { used: number; limit: number } | null = null\n if (cache?.data?.promptCredits) {\n const pc = cache.data.promptCredits\n cachedCredits = {\n used: pc.monthly - pc.available,\n limit: pc.monthly\n }\n }\n \n return {\n email,\n isActive: email === activeEmail,\n status,\n lastUsed: metadata?.lastUsed || null,\n cachedCredits\n }\n })\n }\n \n /**\n * Add a new account after successful OAuth\n */\n addAccount(tokens: StoredTokens, email: string): void {\n debug('account-manager', `Adding account ${email}`)\n \n // Save tokens\n saveAccountTokens(email, tokens)\n \n // Create metadata\n const now = new Date().toISOString()\n const metadata: AccountMetadata = {\n email,\n addedAt: now,\n lastUsed: now\n }\n saveAccountMetadata(email, metadata)\n \n // Set as active account\n setActiveAccountEmail(email)\n \n debug('account-manager', `Account ${email} added and set as active`)\n }\n \n /**\n * Update tokens for existing account\n */\n updateTokens(email: string, tokens: StoredTokens): void {\n if (!accountExists(email)) {\n debug('account-manager', `Cannot update tokens: account ${email} does not exist`)\n return\n }\n \n saveAccountTokens(email, tokens)\n updateLastUsed(email)\n debug('account-manager', `Updated tokens for ${email}`)\n }\n \n /**\n * Remove an account\n */\n removeAccount(email: string): boolean {\n if (!accountExists(email)) {\n debug('account-manager', `Account ${email} does not exist`)\n return false\n }\n \n // If removing active account, clear active\n const activeEmail = getActiveAccountEmail()\n if (email === activeEmail) {\n setActiveAccountEmail(null)\n }\n \n const deleted = deleteAccountDir(email)\n \n // If we deleted the active and there are other accounts, set first as active\n if (deleted && email === activeEmail) {\n const remaining = this.getAccountEmails()\n if (remaining.length > 0) {\n setActiveAccountEmail(remaining[0])\n debug('account-manager', `Set ${remaining[0]} as new active account`)\n }\n }\n \n return deleted\n }\n \n /**\n * Remove all accounts\n */\n removeAllAccounts(): number {\n const emails = this.getAccountEmails()\n let count = 0\n \n for (const email of emails) {\n if (deleteAccountDir(email)) {\n count++\n }\n }\n \n setActiveAccountEmail(null)\n debug('account-manager', `Removed ${count} accounts`)\n \n return count\n }\n \n /**\n * Get tokens for an account\n */\n getTokens(email: string): StoredTokens | null {\n return loadAccountTokens(email)\n }\n \n /**\n * Get tokens for active account\n */\n getActiveTokens(): StoredTokens | null {\n const email = getActiveAccountEmail()\n if (!email) {\n return null\n }\n return loadAccountTokens(email)\n }\n \n /**\n * Check if cache is valid for an account\n */\n isCacheValid(email: string): boolean {\n return isCacheValid(email)\n }\n \n /**\n * Get cache age in seconds\n */\n getCacheAge(email: string): number | null {\n return getCacheAge(email)\n }\n}\n\n/**\n * Get account manager instance\n */\nexport function getAccountManager(): AccountManager {\n return AccountManager.getInstance()\n}\n","/**\n * Token storage - file-based implementation\n * \n * This module provides backward-compatible token storage.\n * It routes to the active account in the new multi-account structure.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync } from 'node:fs'\nimport { dirname } from 'node:path'\nimport { getTokensPath, getConfigDir, getAccountDir } from '../core/env.js'\nimport { debug } from '../core/logger.js'\nimport { \n getActiveAccountEmail,\n setActiveAccountEmail\n} from '../accounts/config.js'\nimport {\n saveAccountTokens,\n loadAccountTokens,\n deleteAccount,\n accountExists\n} from '../accounts/storage.js'\nimport type { StoredTokens } from '../quota/types.js'\n\n/**\n * Save tokens to disk\n * Routes to active account in multi-account structure\n */\nexport function saveTokens(tokens: StoredTokens): void {\n const email = tokens.email\n \n if (!email) {\n // Fallback to legacy storage if no email\n const path = getTokensPath()\n const dir = dirname(path)\n \n debug('storage', `Saving tokens to legacy path ${path}`)\n \n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true })\n }\n \n writeFileSync(path, JSON.stringify(tokens, null, 2), { mode: 0o600 })\n return\n }\n \n // Use multi-account storage\n debug('storage', `Saving tokens for account ${email}`)\n saveAccountTokens(email, tokens)\n \n // Set as active if no active account\n if (!getActiveAccountEmail()) {\n setActiveAccountEmail(email)\n }\n}\n\n/**\n * Load tokens from disk\n * First tries active account, then falls back to legacy path\n */\nexport function loadTokens(): StoredTokens | null {\n // Try active account first\n const activeEmail = getActiveAccountEmail()\n \n if (activeEmail) {\n const tokens = loadAccountTokens(activeEmail)\n if (tokens) {\n debug('storage', `Loaded tokens for active account ${activeEmail}`)\n return tokens\n }\n }\n \n // Fallback to legacy path\n const legacyPath = getTokensPath()\n \n debug('storage', `Loading tokens from legacy path ${legacyPath}`)\n \n if (!existsSync(legacyPath)) {\n debug('storage', 'No tokens file found')\n return null\n }\n \n try {\n const content = readFileSync(legacyPath, 'utf-8')\n const tokens = JSON.parse(content) as StoredTokens\n debug('storage', 'Tokens loaded successfully from legacy path')\n return tokens\n } catch (err) {\n debug('storage', 'Failed to parse tokens file', err)\n return null\n }\n}\n\n/**\n * Delete stored tokens\n * Removes active account in multi-account structure\n */\nexport function deleteTokens(): boolean {\n const activeEmail = getActiveAccountEmail()\n \n if (activeEmail && accountExists(activeEmail)) {\n debug('storage', `Deleting account ${activeEmail}`)\n return deleteAccount(activeEmail)\n }\n \n // Fallback to legacy path\n const path = getTokensPath()\n \n debug('storage', `Deleting tokens at legacy path ${path}`)\n \n if (!existsSync(path)) {\n debug('storage', 'No tokens file to delete')\n return false\n }\n \n try {\n unlinkSync(path)\n debug('storage', 'Tokens deleted successfully')\n return true\n } catch (err) {\n debug('storage', 'Failed to delete tokens', err)\n return false\n }\n}\n\n/**\n * Check if tokens exist\n */\nexport function hasTokens(): boolean {\n // Check active account\n const activeEmail = getActiveAccountEmail()\n if (activeEmail && accountExists(activeEmail)) {\n return true\n }\n \n // Fallback to legacy\n return existsSync(getTokensPath())\n}\n\n/**\n * Get config directory info for doctor command\n */\nexport function getStorageInfo(): { configDir: string; tokensPath: string; exists: boolean } {\n const configDir = getConfigDir()\n const activeEmail = getActiveAccountEmail()\n \n // Prefer active account path\n let tokensPath: string\n let exists: boolean\n \n if (activeEmail) {\n tokensPath = `${getAccountDir(activeEmail)}/tokens.json`\n exists = accountExists(activeEmail)\n } else {\n tokensPath = getTokensPath()\n exists = existsSync(tokensPath)\n }\n \n return {\n configDir,\n tokensPath,\n exists\n }\n}\n","/**\n * Custom error classes for antigravity-usage CLI\n */\n\nexport class NotLoggedInError extends Error {\n constructor(message = 'Not logged in. Run: antigravity-usage login') {\n super(message)\n this.name = 'NotLoggedInError'\n }\n}\n\nexport class AuthenticationError extends Error {\n constructor(message = 'Authentication failed. Please login again.') {\n super(message)\n this.name = 'AuthenticationError'\n }\n}\n\nexport class NetworkError extends Error {\n constructor(message = 'Network error. Please check your connection.') {\n super(message)\n this.name = 'NetworkError'\n }\n}\n\nexport class RateLimitError extends Error {\n retryAfterMs?: number\n\n constructor(message = 'Rate limited. Please try again later.', retryAfterMs?: number) {\n super(message)\n this.name = 'RateLimitError'\n this.retryAfterMs = retryAfterMs\n }\n}\n\nexport class APIError extends Error {\n statusCode?: number\n \n constructor(message: string, statusCode?: number) {\n super(message)\n this.name = 'APIError'\n this.statusCode = statusCode\n }\n}\n\nexport class TokenRefreshError extends Error {\n constructor(message = 'Failed to refresh token. Please login again.') {\n super(message)\n this.name = 'TokenRefreshError'\n }\n}\n\nexport class AntigravityNotRunningError extends Error {\n constructor(message = 'Antigravity language server is not running. Please start Antigravity in your IDE.') {\n super(message)\n this.name = 'AntigravityNotRunningError'\n }\n}\n\nexport class LocalConnectionError extends Error {\n constructor(message = 'Failed to connect to local Antigravity server.') {\n super(message)\n this.name = 'LocalConnectionError'\n }\n}\n\nexport class PortDetectionError extends Error {\n constructor(message = 'Could not detect Antigravity server port.') {\n super(message)\n this.name = 'PortDetectionError'\n }\n}\n\nexport class NoAuthMethodAvailableError extends Error {\n constructor(message = 'Unable to fetch quota: Antigravity is not running and you are not logged in.\\n\\nPlease do one of the following:\\n • Run Antigravity in your IDE (VSCode, etc.), or\\n • Login with: antigravity-usage login') {\n super(message)\n this.name = 'NoAuthMethodAvailableError'\n }\n}\n\n","/**\n * Token manager with automatic refresh\n * \n * Updated for multi-account support - can manage tokens for specific accounts\n * or default to the active account.\n */\n\nimport { loadTokens, saveTokens, hasTokens } from './storage.js'\nimport { refreshAccessToken } from './oauth.js'\nimport { debug } from '../core/logger.js'\nimport { NotLoggedInError, TokenRefreshError } from '../core/errors.js'\nimport { \n getActiveAccountEmail,\n loadAccountTokens,\n saveAccountTokens,\n accountExists,\n updateLastUsed\n} from '../accounts/index.js'\nimport type { StoredTokens } from '../quota/types.js'\n\n// Refresh token 5 minutes before expiry\nconst EXPIRY_BUFFER_MS = 5 * 60 * 1000\n\n/**\n * Token manager class for handling authentication\n * Can work with active account or a specific account email\n */\nexport class TokenManager {\n private tokens: StoredTokens | null = null\n private accountEmail: string | null = null\n \n constructor(email?: string) {\n if (email) {\n this.accountEmail = email\n this.tokens = loadAccountTokens(email)\n } else {\n // Use active account\n this.accountEmail = getActiveAccountEmail()\n this.tokens = loadTokens()\n }\n }\n \n /**\n * Get the email this manager is for\n */\n getAccountEmail(): string | null {\n return this.accountEmail || this.tokens?.email || null\n }\n \n /**\n * Check if user is logged in (has tokens)\n */\n isLoggedIn(): boolean {\n if (this.accountEmail) {\n return accountExists(this.accountEmail) && this.tokens !== null\n }\n return hasTokens() && this.tokens !== null\n }\n \n /**\n * Get the stored email\n */\n getEmail(): string | undefined {\n return this.tokens?.email\n }\n \n /**\n * Get token expiry time\n */\n getExpiresAt(): Date | undefined {\n if (!this.tokens) return undefined\n return new Date(this.tokens.expiresAt)\n }\n \n /**\n * Get stored project ID\n */\n getProjectId(): string | undefined {\n return this.tokens?.projectId\n }\n \n /**\n * Check if token is expired or about to expire\n */\n isTokenExpired(): boolean {\n if (!this.tokens) return true\n return Date.now() >= this.tokens.expiresAt - EXPIRY_BUFFER_MS\n }\n \n /**\n * Get a valid access token, refreshing if necessary\n */\n async getValidAccessToken(): Promise<string> {\n if (!this.tokens) {\n throw new NotLoggedInError()\n }\n \n debug('token-manager', 'Checking token validity')\n \n // Check if token needs refresh\n if (this.isTokenExpired()) {\n debug('token-manager', 'Token expired or expiring soon, refreshing...')\n await this.refreshToken()\n }\n \n return this.tokens.accessToken\n }\n \n /**\n * Refresh the access token\n */\n async refreshToken(): Promise<void> {\n if (!this.tokens?.refreshToken) {\n throw new NotLoggedInError('No refresh token available. Please login again.')\n }\n \n try {\n debug('token-manager', 'Refreshing token...')\n const response = await refreshAccessToken(this.tokens.refreshToken)\n \n // Update tokens\n this.tokens = {\n accessToken: response.access_token,\n refreshToken: response.refresh_token || this.tokens.refreshToken,\n expiresAt: Date.now() + response.expires_in * 1000,\n email: this.tokens.email,\n projectId: this.tokens.projectId\n }\n \n // Save to disk\n if (this.accountEmail) {\n saveAccountTokens(this.accountEmail, this.tokens)\n updateLastUsed(this.accountEmail)\n } else {\n saveTokens(this.tokens)\n }\n \n debug('token-manager', 'Token refreshed successfully')\n } catch (err) {\n debug('token-manager', 'Token refresh failed', err)\n throw new TokenRefreshError()\n }\n }\n \n /**\n * Reload tokens from disk\n */\n reload(): void {\n if (this.accountEmail) {\n this.tokens = loadAccountTokens(this.accountEmail)\n } else {\n this.tokens = loadTokens()\n }\n }\n}\n\n// Singleton instance for default (active account) manager\nlet tokenManagerInstance: TokenManager | null = null\n\n/**\n * Get the token manager instance for active account\n */\nexport function getTokenManager(): TokenManager {\n if (!tokenManagerInstance) {\n tokenManagerInstance = new TokenManager()\n }\n return tokenManagerInstance\n}\n\n/**\n * Get token manager for a specific account\n */\nexport function getTokenManagerForAccount(email: string): TokenManager {\n return new TokenManager(email)\n}\n\n/**\n * Reset the token manager (for testing or after account changes)\n */\nexport function resetTokenManager(): void {\n tokenManagerInstance = null\n}\n","/**\n * Login command - authenticate with Google\n * \n * This is kept for backward compatibility.\n * For multi-account management, use `antigravity-usage accounts add`\n */\n\nimport { startOAuthFlow } from '../google/oauth.js'\nimport { getAccountManager } from '../accounts/index.js'\nimport { success, error as logError, info } from '../core/logger.js'\nimport { resetTokenManager } from '../google/token-manager.js'\n\ninterface LoginOptions {\n noBrowser?: boolean\n port?: number\n}\n\nexport async function loginCommand(options: LoginOptions): Promise<void> {\n const manager = getAccountManager()\n const existingAccounts = manager.getAccountEmails()\n \n if (existingAccounts.length > 0) {\n info(`You have ${existingAccounts.length} account(s). Adding another account...`)\n }\n \n const result = await startOAuthFlow({\n noBrowser: options.noBrowser,\n port: options.port\n })\n \n if (result.success) {\n // Reset token manager to pick up new active account\n resetTokenManager()\n \n success(`Logged in successfully${result.email ? ` as ${result.email}` : ''}!`)\n \n const accounts = manager.getAccountEmails()\n if (accounts.length > 1) {\n info(`\\nYou now have ${accounts.length} accounts. Use \\`antigravity-usage accounts list\\` to see all.`)\n }\n \n process.exit(0)\n } else {\n logError(`Login failed: ${result.error}`)\n process.exit(1)\n }\n}\n","/**\n * Logout command - remove account(s)\n */\n\nimport { getAccountManager } from '../accounts/index.js'\nimport { resetTokenManager } from '../google/token-manager.js'\nimport { success, warn, info } from '../core/logger.js'\n\ninterface LogoutOptions {\n all?: boolean\n}\n\nexport function logoutCommand(options: LogoutOptions, email?: string): void {\n const manager = getAccountManager()\n \n // Logout all accounts\n if (options.all) {\n const count = manager.removeAllAccounts()\n resetTokenManager()\n \n if (count > 0) {\n success(`Logged out of ${count} account(s).`)\n } else {\n warn('No accounts to log out.')\n }\n return\n }\n \n // Logout specific account\n if (email) {\n if (!manager.hasAccount(email)) {\n warn(`Account '${email}' not found.`)\n return\n }\n \n const removed = manager.removeAccount(email)\n resetTokenManager()\n \n if (removed) {\n success(`Logged out of ${email}.`)\n \n const remaining = manager.getAccountEmails()\n if (remaining.length > 0) {\n info(`Active account: ${manager.getActiveEmail() || 'none'}`)\n }\n } else {\n warn(`Could not log out of ${email}.`)\n }\n return\n }\n \n // Logout active account (default behavior)\n const activeEmail = manager.getActiveEmail()\n \n if (!activeEmail) {\n warn('Not logged in.')\n return\n }\n \n const removed = manager.removeAccount(activeEmail)\n resetTokenManager()\n \n if (removed) {\n success(`Logged out of ${activeEmail}.`)\n \n const remaining = manager.getAccountEmails()\n if (remaining.length > 0) {\n const newActive = manager.getActiveEmail()\n info(`Switched to: ${newActive}`)\n }\n } else {\n warn('Could not delete account.')\n }\n}\n","/**\n * Token masking utility\n */\n\n/**\n * Mask a token for display, showing first 6 and last 4 characters\n * @example maskToken('abc123xyz789secret') => 'abc123...cret'\n */\nexport function maskToken(token: string): string {\n if (!token) return ''\n if (token.length <= 10) return '***'\n \n const first = token.slice(0, 6)\n const last = token.slice(-4)\n return `${first}...${last}`\n}\n\n/**\n * Mask an email for display\n * @example maskEmail('user@example.com') => 'us**@example.com'\n */\nexport function maskEmail(email: string): string {\n if (!email) return ''\n \n const [local, domain] = email.split('@')\n if (!domain) return email\n \n if (local.length <= 2) {\n return `${local[0] || ''}**@${domain}`\n }\n \n return `${local.slice(0, 2)}**@${domain}`\n}\n","/**\n * Status command - show current login status\n */\n\nimport { getTokenManager, getTokenManagerForAccount } from '../google/token-manager.js'\nimport { getAccountManager } from '../accounts/index.js'\nimport { maskEmail, maskToken } from '../core/mask.js'\nimport { info, warn } from '../core/logger.js'\nimport { isDebugMode } from '../core/logger.js'\nimport Table from 'cli-table3'\n\ninterface StatusOptions {\n all?: boolean\n account?: string\n}\n\n/**\n * Show status for a single account\n */\nfunction showSingleAccountStatus(email?: string): void {\n const tokenManager = email \n ? getTokenManagerForAccount(email)\n : getTokenManager()\n \n console.log()\n console.log('📍 Antigravity Usage Status')\n console.log('─'.repeat(40))\n \n if (!tokenManager.isLoggedIn()) {\n warn('Not logged in')\n console.log()\n info('Run `antigravity-usage login` to authenticate.')\n console.log()\n return\n }\n \n const accountEmail = tokenManager.getEmail()\n const expiresAt = tokenManager.getExpiresAt()\n const isExpired = tokenManager.isTokenExpired()\n \n console.log(`✅ Logged in: Yes`)\n \n if (accountEmail) {\n console.log(`📧 Email: ${maskEmail(accountEmail)}`)\n }\n \n if (expiresAt) {\n const expiryStr = expiresAt.toLocaleString()\n const status = isExpired ? ' (expired/expiring soon)' : ''\n console.log(`⏰ Token expires: ${expiryStr}${status}`)\n }\n \n // Debug mode shows more detail\n if (isDebugMode()) {\n const tokens = email \n ? getAccountManager().getTokens(email)\n : getAccountManager().getActiveTokens()\n if (tokens) {\n console.log()\n console.log('Debug info:')\n console.log(` Access token: ${maskToken(tokens.accessToken)}`)\n console.log(` Refresh token: ${maskToken(tokens.refreshToken)}`)\n }\n }\n \n console.log()\n}\n\n/**\n * Show status for all accounts\n */\nfunction showAllAccountsStatus(): void {\n const manager = getAccountManager()\n const emails = manager.getAccountEmails()\n const activeEmail = manager.getActiveEmail()\n \n console.log()\n console.log('📍 Antigravity Usage Status - All Accounts')\n console.log('═'.repeat(60))\n \n if (emails.length === 0) {\n warn('No accounts found.')\n console.log()\n info('Run `antigravity-usage login` to add an account.')\n console.log()\n return\n }\n \n const table = new Table({\n head: ['Account', 'Logged In', 'Token Expiry'],\n style: {\n head: ['cyan'],\n border: ['gray']\n },\n colWidths: [30, 12, 28]\n })\n \n for (const email of emails) {\n const tokenManager = getTokenManagerForAccount(email)\n const isActive = email === activeEmail\n const nameDisplay = isActive ? `${email} [*]` : email\n \n if (tokenManager.isLoggedIn()) {\n const expiresAt = tokenManager.getExpiresAt()\n const isExpired = tokenManager.isTokenExpired()\n \n let expiryDisplay = '-'\n if (expiresAt) {\n expiryDisplay = expiresAt.toLocaleString()\n if (isExpired) {\n expiryDisplay = `⚠️ ${expiryDisplay}`\n }\n }\n \n table.push([\n nameDisplay,\n '✅',\n expiryDisplay\n ])\n } else {\n table.push([\n nameDisplay,\n '❌',\n 'Invalid or missing'\n ])\n }\n }\n \n console.log(table.toString())\n console.log()\n console.log('[*] = active account')\n console.log()\n}\n\nexport function statusCommand(options: StatusOptions = {}): void {\n if (options.all) {\n showAllAccountsStatus()\n return\n }\n \n if (options.account) {\n const manager = getAccountManager()\n if (!manager.hasAccount(options.account)) {\n warn(`Account '${options.account}' not found.`)\n return\n }\n showSingleAccountStatus(options.account)\n return\n }\n \n showSingleAccountStatus()\n}\n","/**\n * Google Cloud Code API client\n */\n\nimport { debug } from '../core/logger.js'\nimport { APIError, AuthenticationError, NetworkError, RateLimitError } from '../core/errors.js'\nimport type { TokenManager } from './token-manager.js'\n\nconst BASE_URL = 'https://cloudcode-pa.googleapis.com'\nconst USER_AGENT = 'antigravity/1.11.3 Darwin/arm64'\n\n/**\n * Raw API response types (based on extension code patterns)\n */\nexport interface LoadCodeAssistResponse {\n codeAssistEnabled?: boolean\n planInfo?: {\n monthlyPromptCredits?: number\n planType?: string\n }\n availablePromptCredits?: number\n cloudaicompanionProject?: string\n currentTier?: {\n id?: string\n name?: string\n description?: string\n }\n}\n\n/**\n * Model info in the response - keyed by model ID\n */\nexport interface ModelInfo {\n displayName?: string\n model?: string\n label?: string\n quotaInfo?: {\n remainingFraction?: number\n resetTime?: string\n isExhausted?: boolean\n }\n maxTokens?: number\n recommended?: boolean\n supportsImages?: boolean\n supportsThinking?: boolean\n modelProvider?: string\n}\n\n/**\n * The actual response structure - models is an object, not an array\n */\nexport interface FetchAvailableModelsResponse {\n models?: Record<string, ModelInfo>\n defaultAgentModelId?: string\n}\n\n/**\n * Cloud Code API client\n */\nexport class CloudCodeClient {\n private projectId?: string\n \n constructor(private tokenManager: TokenManager) {}\n \n /**\n * Make an authenticated API request\n */\n private async request<T>(endpoint: string, body?: unknown): Promise<T> {\n const token = await this.tokenManager.getValidAccessToken()\n const url = `${BASE_URL}${endpoint}`\n \n debug('cloudcode', `Calling ${endpoint}`)\n \n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json',\n 'User-Agent': USER_AGENT\n },\n body: body ? JSON.stringify(body) : undefined\n })\n \n debug('cloudcode', `Response status: ${response.status}`)\n \n if (response.status === 401 || response.status === 403) {\n const errorBody = await response.text()\n debug('cloudcode', `Auth error body: ${errorBody}`)\n throw new AuthenticationError('Authentication failed. Please run: antigravity-usage login')\n }\n \n if (response.status === 429) {\n const retryAfter = response.headers.get('retry-after')\n const retryMs = retryAfter ? parseInt(retryAfter) * 1000 : undefined\n throw new RateLimitError('Rate limited by Google API', retryMs)\n }\n \n if (response.status >= 500) {\n throw new APIError(`Server error: ${response.status}`, response.status)\n }\n \n if (!response.ok) {\n const errorText = await response.text()\n debug('cloudcode', 'API error response', errorText)\n throw new APIError(`API request failed: ${response.status}`, response.status)\n }\n \n const data = await response.json() as T\n debug('cloudcode', 'API call successful')\n return data\n } catch (err) {\n if (err instanceof AuthenticationError || \n err instanceof RateLimitError || \n err instanceof APIError) {\n throw err\n }\n \n if (err instanceof TypeError && err.message.includes('fetch')) {\n throw new NetworkError('Network error. Please check your connection.')\n }\n \n throw err\n }\n }\n \n /**\n * Load code assist status and plan info\n * Also extracts project ID for subsequent calls\n */\n async loadCodeAssist(): Promise<LoadCodeAssistResponse> {\n const response = await this.request<LoadCodeAssistResponse>('/v1internal:loadCodeAssist', {\n metadata: { ideType: 'ANTIGRAVITY' }\n })\n \n // Store project ID for fetchAvailableModels\n if (response.cloudaicompanionProject) {\n this.projectId = response.cloudaicompanionProject\n debug('cloudcode', `Project ID: ${this.projectId}`)\n }\n \n return response\n }\n \n /**\n * Fetch available models with quota info\n * Requires project ID from loadCodeAssist\n */\n async fetchAvailableModels(): Promise<FetchAvailableModelsResponse> {\n const body = this.projectId ? { project: this.projectId } : {}\n return this.request<FetchAvailableModelsResponse>('/v1internal:fetchAvailableModels', body)\n }\n}\n","/**\n * Parser for Cloud Code API responses\n */\n\nimport { debug } from '../core/logger.js'\nimport type { QuotaSnapshot, ModelQuotaInfo, PromptCreditsInfo } from '../quota/types.js'\nimport type { LoadCodeAssistResponse, FetchAvailableModelsResponse, ModelInfo } from './cloudcode.js'\n\n/**\n * Parse reset time string to milliseconds until reset\n */\nfunction parseResetTime(resetTime?: string): number | undefined {\n if (!resetTime) return undefined\n \n try {\n const resetDate = new Date(resetTime)\n const now = Date.now()\n const diff = resetDate.getTime() - now\n return diff > 0 ? diff : undefined\n } catch {\n return undefined\n }\n}\n\n/**\n * Parse model info into ModelQuotaInfo\n */\nfunction parseModelInfo(modelId: string, model: ModelInfo): ModelQuotaInfo {\n const quotaInfo = model.quotaInfo\n \n return {\n label: model.displayName || model.label || modelId,\n modelId: modelId,\n remainingPercentage: quotaInfo?.remainingFraction,\n isExhausted: quotaInfo?.isExhausted ?? (quotaInfo?.remainingFraction === 0),\n resetTime: quotaInfo?.resetTime,\n timeUntilResetMs: parseResetTime(quotaInfo?.resetTime)\n }\n}\n\n/**\n * Parse prompt credits from loadCodeAssist response\n */\nfunction parsePromptCredits(response: LoadCodeAssistResponse): PromptCreditsInfo | undefined {\n const monthly = response.planInfo?.monthlyPromptCredits\n const available = response.availablePromptCredits\n \n if (monthly === undefined || available === undefined) {\n return undefined\n }\n \n const used = monthly - available\n const usedPercentage = monthly > 0 ? used / monthly : 0\n const remainingPercentage = monthly > 0 ? available / monthly : 0\n \n return {\n available,\n monthly,\n usedPercentage,\n remainingPercentage\n }\n}\n\n/**\n * Check if a model should be shown in quota display\n * Filter out internal models and only show recommended ones\n */\nfunction shouldShowModel(modelId: string, model: ModelInfo): boolean {\n // Skip internal models\n if (modelId.startsWith('chat_') || modelId.startsWith('tab_')) {\n return false\n }\n // Skip image generation models\n if (modelId.includes('image')) {\n return false\n }\n // Skip internal/experimental models\n if (modelId.startsWith('rev')) {\n return false\n }\n // Skip lite models that are just for specific features\n if (modelId.includes('mquery') || modelId.includes('lite')) {\n return false\n }\n // Only show models with quota info\n if (!model.quotaInfo) {\n return false\n }\n return true\n}\n\n/**\n * Parse API responses into a QuotaSnapshot\n */\nexport function parseQuotaSnapshot(\n codeAssistResponse: LoadCodeAssistResponse,\n modelsResponse: FetchAvailableModelsResponse,\n email?: string\n): QuotaSnapshot {\n debug('parser', 'Parsing quota snapshot')\n \n const promptCredits = parsePromptCredits(codeAssistResponse)\n const planType = codeAssistResponse.planInfo?.planType\n \n // Models is now an object keyed by model ID\n const modelsMap = modelsResponse.models || {}\n const models: ModelQuotaInfo[] = []\n \n for (const [modelId, modelInfo] of Object.entries(modelsMap)) {\n if (shouldShowModel(modelId, modelInfo)) {\n models.push(parseModelInfo(modelId, modelInfo))\n }\n }\n \n // Sort by displayName\n models.sort((a, b) => a.label.localeCompare(b.label))\n \n debug('parser', `Parsed ${models.length} models`)\n \n return {\n timestamp: new Date().toISOString(),\n method: 'google',\n email,\n planType,\n promptCredits,\n models\n }\n}\n","/**\n * Process detector - finds running Antigravity language server processes\n */\n\nimport { exec } from 'child_process'\nimport { promisify } from 'util'\nimport { debug } from '../core/logger.js'\n\nconst execAsync = promisify(exec)\n\nexport interface AntigravityProcessInfo {\n pid: number\n csrfToken?: string\n extensionServerPort?: number\n commandLine: string\n}\n\n/**\n * Detects running Antigravity language server processes\n * Returns process info including PID and extracted command-line arguments\n */\nexport async function detectAntigravityProcess(): Promise<AntigravityProcessInfo | null> {\n const platform = process.platform\n \n debug('process-detector', `Detecting Antigravity process on platform: ${platform}`)\n \n if (platform === 'win32') {\n return detectOnWindows()\n } else {\n // macOS and Linux use similar commands\n return detectOnUnix()\n }\n}\n\n/**\n * Detect Antigravity process on Unix-like systems (macOS, Linux)\n */\nasync function detectOnUnix(): Promise<AntigravityProcessInfo | null> {\n try {\n // Use ps to list all processes with full command line\n // Look for processes containing 'antigravity' in their command\n const { stdout } = await execAsync('ps aux')\n \n const lines = stdout.split('\\n')\n \n for (const line of lines) {\n // Look for language server process indicators\n // Common patterns: antigravity, language-server, lsp\n if (line.toLowerCase().includes('antigravity') && \n (line.includes('language-server') || line.includes('lsp') || line.includes('server'))) {\n \n debug('process-detector', `Found potential Antigravity process: ${line}`)\n \n const processInfo = parseUnixProcessLine(line)\n if (processInfo) {\n return processInfo\n }\n }\n }\n \n debug('process-detector', 'No Antigravity process found')\n return null\n } catch (err) {\n debug('process-detector', 'Error detecting process on Unix', err)\n return null\n }\n}\n\n/**\n * Parse a Unix ps output line to extract process info\n */\nfunction parseUnixProcessLine(line: string): AntigravityProcessInfo | null {\n // ps aux format: USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND...\n const parts = line.trim().split(/\\s+/)\n \n if (parts.length < 11) {\n return null\n }\n \n const pid = parseInt(parts[1], 10)\n if (isNaN(pid)) {\n return null\n }\n \n // Command is everything from index 10 onwards\n const commandLine = parts.slice(10).join(' ')\n \n // Extract arguments from command line\n const csrfToken = extractArgument(commandLine, '--csrf_token')\n const extensionServerPort = extractArgument(commandLine, '--extension_server_port')\n \n return {\n pid,\n csrfToken: csrfToken || undefined,\n extensionServerPort: extensionServerPort ? parseInt(extensionServerPort, 10) : undefined,\n commandLine\n }\n}\n\n/**\n * Detect Antigravity process on Windows\n */\nasync function detectOnWindows(): Promise<AntigravityProcessInfo | null> {\n try {\n // Use WMIC to get process details with command line\n const { stdout } = await execAsync(\n 'wmic process where \"name like \\'%antigravity%\\' or commandline like \\'%antigravity%\\'\" get processid,commandline /format:csv',\n { maxBuffer: 10 * 1024 * 1024 } // 10MB buffer for long command lines\n )\n \n const lines = stdout.split('\\n').filter(line => line.trim() && !line.includes('Node,CommandLine,ProcessId'))\n \n for (const line of lines) {\n // CSV format: Node,CommandLine,ProcessId\n const parts = line.split(',')\n if (parts.length >= 3) {\n const commandLine = parts.slice(1, -1).join(',') // Command line might contain commas\n const pid = parseInt(parts[parts.length - 1].trim(), 10)\n \n if (!isNaN(pid) && commandLine.toLowerCase().includes('antigravity')) {\n debug('process-detector', `Found Antigravity process on Windows: PID ${pid}`)\n \n const csrfToken = extractArgument(commandLine, '--csrf_token')\n const extensionServerPort = extractArgument(commandLine, '--extension_server_port')\n \n return {\n pid,\n csrfToken: csrfToken || undefined,\n extensionServerPort: extensionServerPort ? parseInt(extensionServerPort, 10) : undefined,\n commandLine\n }\n }\n }\n }\n \n // Fallback: try PowerShell if WMIC doesn't work\n return await detectOnWindowsPowerShell()\n } catch (err) {\n debug('process-detector', 'Error detecting process on Windows with WMIC, trying PowerShell', err)\n return await detectOnWindowsPowerShell()\n }\n}\n\n/**\n * Fallback Windows detection using PowerShell\n */\nasync function detectOnWindowsPowerShell(): Promise<AntigravityProcessInfo | null> {\n try {\n const { stdout } = await execAsync(\n 'powershell -Command \"Get-Process | Where-Object { $_.ProcessName -like \\'*antigravity*\\' } | Select-Object Id, ProcessName | ConvertTo-Json\"'\n )\n \n if (!stdout.trim()) {\n return null\n }\n \n const processes = JSON.parse(stdout)\n const processList = Array.isArray(processes) ? processes : [processes]\n \n for (const proc of processList) {\n if (proc.Id) {\n // Get command line for this process\n const { stdout: cmdLine } = await execAsync(\n `powershell -Command \"(Get-CimInstance Win32_Process -Filter 'ProcessId = ${proc.Id}').CommandLine\"`\n )\n \n const commandLine = cmdLine.trim()\n const csrfToken = extractArgument(commandLine, '--csrf_token')\n const extensionServerPort = extractArgument(commandLine, '--extension_server_port')\n \n return {\n pid: proc.Id,\n csrfToken: csrfToken || undefined,\n extensionServerPort: extensionServerPort ? parseInt(extensionServerPort, 10) : undefined,\n commandLine\n }\n }\n }\n \n return null\n } catch (err) {\n debug('process-detector', 'Error detecting process on Windows with PowerShell', err)\n return null\n }\n}\n\n/**\n * Extract argument value from command line\n * Supports formats: --arg=value and --arg value\n */\nfunction extractArgument(commandLine: string, argName: string): string | null {\n // Try --arg=value format\n const eqRegex = new RegExp(`${argName}=([^\\\\s\"']+|\"[^\"]*\"|'[^']*')`, 'i')\n const eqMatch = commandLine.match(eqRegex)\n if (eqMatch) {\n return eqMatch[1].replace(/^[\"']|[\"']$/g, '') // Remove quotes\n }\n \n // Try --arg value format\n const spaceRegex = new RegExp(`${argName}\\\\s+([^\\\\s\"']+|\"[^\"]*\"|'[^']*')`, 'i')\n const spaceMatch = commandLine.match(spaceRegex)\n if (spaceMatch) {\n return spaceMatch[1].replace(/^[\"']|[\"']$/g, '') // Remove quotes\n }\n \n return null\n}\n","/**\n * Port detective - discovers listening ports for a given process\n */\n\nimport { exec } from 'child_process'\nimport { promisify } from 'util'\nimport { debug } from '../core/logger.js'\n\nconst execAsync = promisify(exec)\n\n/**\n * Discovers which ports a process is listening on\n * @param pid Process ID to check\n * @returns Array of port numbers the process is listening on\n */\nexport async function discoverPorts(pid: number): Promise<number[]> {\n const platform = process.platform\n \n debug('port-detective', `Discovering ports for PID ${pid} on platform: ${platform}`)\n \n if (platform === 'win32') {\n return discoverPortsOnWindows(pid)\n } else if (platform === 'darwin') {\n return discoverPortsOnMacOS(pid)\n } else {\n return discoverPortsOnLinux(pid)\n }\n}\n\n/**\n * Discover listening ports on macOS using lsof\n */\nasync function discoverPortsOnMacOS(pid: number): Promise<number[]> {\n try {\n // lsof -nP -iTCP -sTCP:LISTEN -a -p <PID>\n const { stdout } = await execAsync(`lsof -nP -iTCP -sTCP:LISTEN -a -p ${pid}`)\n \n const ports: number[] = []\n const lines = stdout.split('\\n')\n \n for (const line of lines) {\n // Format: COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME\n // NAME column contains: *:PORT or IP:PORT (LISTEN)\n const match = line.match(/:(\\d+)\\s+\\(LISTEN\\)/)\n if (match) {\n const port = parseInt(match[1], 10)\n if (!isNaN(port) && !ports.includes(port)) {\n ports.push(port)\n }\n }\n }\n \n debug('port-detective', `Found ports on macOS: ${ports.join(', ')}`)\n return ports\n } catch (err) {\n debug('port-detective', 'Error discovering ports on macOS', err)\n return []\n }\n}\n\n/**\n * Discover listening ports on Linux using ss or netstat\n */\nasync function discoverPortsOnLinux(pid: number): Promise<number[]> {\n try {\n // Try ss first (modern)\n const { stdout } = await execAsync(`ss -tlnp | grep \"pid=${pid},\"`)\n \n const ports: number[] = []\n const lines = stdout.split('\\n')\n \n for (const line of lines) {\n // Format: State Recv-Q Send-Q Local Address:Port Peer Address:Port Process\n const match = line.match(/:(\\d+)\\s/)\n if (match) {\n const port = parseInt(match[1], 10)\n if (!isNaN(port) && !ports.includes(port)) {\n ports.push(port)\n }\n }\n }\n \n if (ports.length > 0) {\n debug('port-detective', `Found ports on Linux (ss): ${ports.join(', ')}`)\n return ports\n }\n \n // Fallback to netstat\n return await discoverPortsOnLinuxNetstat(pid)\n } catch {\n // ss might not find anything, try netstat\n return await discoverPortsOnLinuxNetstat(pid)\n }\n}\n\n/**\n * Fallback Linux port discovery using netstat\n */\nasync function discoverPortsOnLinuxNetstat(pid: number): Promise<number[]> {\n try {\n const { stdout } = await execAsync(`netstat -tlnp 2>/dev/null | grep \"${pid}/\"`)\n \n const ports: number[] = []\n const lines = stdout.split('\\n')\n \n for (const line of lines) {\n // Format: Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program\n const match = line.match(/:(\\d+)\\s/)\n if (match) {\n const port = parseInt(match[1], 10)\n if (!isNaN(port) && !ports.includes(port)) {\n ports.push(port)\n }\n }\n }\n \n debug('port-detective', `Found ports on Linux (netstat): ${ports.join(', ')}`)\n return ports\n } catch (err) {\n debug('port-detective', 'Error discovering ports on Linux', err)\n return []\n }\n}\n\n/**\n * Discover listening ports on Windows using netstat\n */\nasync function discoverPortsOnWindows(pid: number): Promise<number[]> {\n try {\n // netstat -ano shows all connections with PIDs\n const { stdout } = await execAsync('netstat -ano')\n \n const ports: number[] = []\n const lines = stdout.split('\\n')\n \n for (const line of lines) {\n // Format: Proto Local Address Foreign Address State PID\n // Look for LISTENING state and matching PID\n if (line.includes('LISTENING')) {\n const parts = line.trim().split(/\\s+/)\n const linePid = parseInt(parts[parts.length - 1], 10)\n \n if (linePid === pid) {\n // Extract port from local address (format: IP:PORT or [::]:PORT)\n const localAddr = parts[1]\n const portMatch = localAddr.match(/:(\\d+)$/)\n if (portMatch) {\n const port = parseInt(portMatch[1], 10)\n if (!isNaN(port) && !ports.includes(port)) {\n ports.push(port)\n }\n }\n }\n }\n }\n \n debug('port-detective', `Found ports on Windows: ${ports.join(', ')}`)\n return ports\n } catch (err) {\n debug('port-detective', 'Error discovering ports on Windows', err)\n return []\n }\n}\n","/**\n * Port prober - probes ports to find the Connect API endpoint\n */\n\nimport https from 'https'\nimport http from 'http'\nimport { debug } from '../core/logger.js'\n\nexport interface ProbeResult {\n baseUrl: string\n protocol: 'https' | 'http'\n port: number\n}\n\n/**\n * Probes ports to find a working Connect API endpoint\n * Tries HTTPS first (with self-signed cert handling), then HTTP\n * @param ports Array of port numbers to probe\n * @param csrfToken Optional CSRF token for authentication\n * @param timeout Timeout per probe in ms (default 500ms)\n * @returns ProbeResult with working endpoint, or null if none found\n */\nexport async function probeForConnectAPI(ports: number[], csrfToken?: string, timeout = 500): Promise<ProbeResult | null> {\n debug('port-prober', `Probing ${ports.length} ports: ${ports.join(', ')}`)\n \n // Probe all ports concurrently\n const probePromises = ports.map(port => probePort(port, csrfToken, timeout))\n const results = await Promise.allSettled(probePromises)\n \n // Find first successful probe\n for (let i = 0; i < results.length; i++) {\n const result = results[i]\n if (result.status === 'fulfilled' && result.value) {\n debug('port-prober', `Found working endpoint: ${result.value.baseUrl}`)\n return result.value\n }\n }\n \n debug('port-prober', 'No working Connect API endpoint found')\n return null\n}\n\n/**\n * Probe a single port for Connect API\n * Tries HTTPS first, then HTTP\n */\nasync function probePort(port: number, csrfToken?: string, timeout = 500): Promise<ProbeResult | null> {\n // Try HTTPS first (language server typically uses self-signed certs)\n const httpsResult = await probeHttps(port, timeout, csrfToken)\n if (httpsResult) {\n return httpsResult\n }\n \n // Fallback to HTTP\n const httpResult = await probeHttp(port, timeout)\n if (httpResult) {\n return httpResult\n }\n \n return null\n}\n\n/**\n * Probe a port with HTTPS (allowing self-signed certificates)\n * Uses Connect RPC GetUnleashData endpoint to verify it's the correct port\n */\nfunction probeHttps(port: number, timeout: number, csrfToken?: string): Promise<ProbeResult | null> {\n return new Promise((resolve) => {\n const options: https.RequestOptions = {\n hostname: '127.0.0.1',\n port,\n path: '/exa.language_server_pb.LanguageServerService/GetUnleashData',\n method: 'POST',\n timeout,\n rejectUnauthorized: false, // Allow self-signed certificates\n headers: {\n 'Content-Type': 'application/json',\n 'Connect-Protocol-Version': '1',\n ...(csrfToken ? { 'X-Codeium-Csrf-Token': csrfToken } : {})\n }\n }\n \n const req = https.request(options, (res) => {\n // Check for successful response\n if (res.statusCode === 200) {\n debug('port-prober', `HTTPS Connect RPC probe on port ${port}: status ${res.statusCode} - valid connect port`)\n resolve({\n baseUrl: `https://127.0.0.1:${port}`,\n protocol: 'https',\n port\n })\n } else {\n debug('port-prober', `HTTPS probe on port ${port}: status ${res.statusCode} - not connect port`)\n resolve(null)\n }\n \n // Consume response data to free up memory\n res.resume()\n })\n \n req.on('error', (err) => {\n debug('port-prober', `HTTPS probe on port ${port} failed: ${err.message}`)\n resolve(null)\n })\n \n req.on('timeout', () => {\n debug('port-prober', `HTTPS probe on port ${port} timed out`)\n req.destroy()\n resolve(null)\n })\n \n // Send the Connect RPC request body\n req.write(JSON.stringify({ wrapper_data: {} }))\n req.end()\n })\n}\n\n/**\n * Probe a port with HTTP\n */\nfunction probeHttp(port: number, timeout: number): Promise<ProbeResult | null> {\n return new Promise((resolve) => {\n const options: http.RequestOptions = {\n hostname: 'localhost',\n port,\n path: '/',\n method: 'GET',\n timeout,\n }\n \n const req = http.request(options, (res) => {\n // Any response (even 404) means server is there\n debug('port-prober', `HTTP probe on port ${port}: status ${res.statusCode}`)\n resolve({\n baseUrl: `http://localhost:${port}`,\n protocol: 'http',\n port\n })\n \n // Consume response data to free up memory\n res.resume()\n })\n \n req.on('error', (err) => {\n debug('port-prober', `HTTP probe on port ${port} failed: ${err.message}`)\n resolve(null)\n })\n \n req.on('timeout', () => {\n debug('port-prober', `HTTP probe on port ${port} timed out`)\n req.destroy()\n resolve(null)\n })\n \n req.end()\n })\n}\n","/**\n * Connect client - client for Antigravity Connect API\n */\n\nimport https from 'https'\nimport http from 'http'\nimport { debug } from '../core/logger.js'\n\nexport interface ConnectUserStatus {\n // Basic status fields\n isAuthenticated?: boolean\n email?: string\n \n // Quota information (structure may vary based on actual API)\n quota?: {\n promptCredits?: {\n used?: number\n limit?: number\n remaining?: number\n }\n models?: Array<{\n modelId: string\n displayName?: string\n label?: string\n quota?: {\n remaining?: number\n limit?: number\n usedPercentage?: number\n remainingPercentage?: number\n resetTime?: string\n timeUntilResetMs?: number\n }\n isExhausted?: boolean\n }>\n }\n \n // Raw response for debugging\n raw?: unknown\n}\n\nexport interface ConnectModelInfo {\n modelId: string\n displayName?: string\n label?: string\n quota?: {\n remaining?: number\n limit?: number\n usedPercentage?: number\n remainingPercentage?: number\n resetTime?: string\n timeUntilResetMs?: number\n }\n isExhausted?: boolean\n}\n\nexport class ConnectClient {\n private baseUrl: string\n private csrfToken: string | undefined\n private isHttps: boolean\n \n constructor(baseUrl: string, csrfToken?: string) {\n this.baseUrl = baseUrl\n this.csrfToken = csrfToken\n this.isHttps = baseUrl.startsWith('https://')\n \n debug('connect-client', `Initialized with baseUrl: ${baseUrl}, hasToken: ${!!csrfToken}`)\n }\n \n /**\n * Get user status including quota information\n * Uses Connect RPC protocol to communicate with Antigravity language server\n */\n async getUserStatus(): Promise<ConnectUserStatus> {\n debug('connect-client', 'Fetching user status via Connect RPC')\n \n // Use the correct Connect RPC endpoint\n const endpoint = '/exa.language_server_pb.LanguageServerService/GetUserStatus'\n \n try {\n const response = await this.request('POST', endpoint, {\n metadata: {\n ideName: 'antigravity',\n extensionName: 'antigravity',\n locale: 'en'\n }\n })\n \n if (response) {\n debug('connect-client', `Got response from ${endpoint}`)\n return this.parseUserStatus(response)\n }\n } catch (err) {\n debug('connect-client', `Connect RPC call failed: ${err}`)\n throw new Error(`Failed to fetch user status: ${err instanceof Error ? err.message : 'Unknown error'}`)\n }\n \n throw new Error('Could not fetch user status from Connect RPC endpoint')\n }\n \n /**\n * Make an HTTP(S) request to the Connect API\n */\n private request(method: string, path: string, body?: unknown): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const url = new URL(path, this.baseUrl)\n \n const headers: Record<string, string> = {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'Connect-Protocol-Version': '1',\n }\n \n if (this.csrfToken) {\n // Use the correct CSRF header name for Antigravity Connect RPC\n headers['X-Codeium-Csrf-Token'] = this.csrfToken\n }\n \n const options = {\n hostname: url.hostname,\n port: url.port,\n path: url.pathname,\n method,\n headers,\n timeout: 5000,\n rejectUnauthorized: false, // Allow self-signed certificates\n }\n \n const protocol = this.isHttps ? https : http\n \n const req = protocol.request(options, (res) => {\n let data = ''\n \n res.on('data', (chunk) => {\n data += chunk\n })\n \n res.on('end', () => {\n if (res.statusCode && res.statusCode >= 200 && res.statusCode < 300) {\n try {\n const parsed = JSON.parse(data)\n resolve(parsed)\n } catch {\n resolve(data)\n }\n } else if (res.statusCode === 404) {\n // Endpoint not found, try next\n reject(new Error(`Endpoint not found: ${path}`))\n } else {\n reject(new Error(`HTTP ${res.statusCode}: ${data}`))\n }\n })\n })\n \n req.on('error', (err) => {\n reject(err)\n })\n \n req.on('timeout', () => {\n req.destroy()\n reject(new Error('Request timed out'))\n })\n \n if (body) {\n req.write(JSON.stringify(body))\n }\n \n req.end()\n })\n }\n \n /**\n * Parse raw API response into ConnectUserStatus\n */\n private parseUserStatus(response: unknown): ConnectUserStatus {\n debug('connect-client', 'Raw response:', JSON.stringify(response, null, 2))\n \n const status: ConnectUserStatus = {\n raw: response\n }\n \n if (typeof response !== 'object' || response === null) {\n return status\n }\n \n const data = response as Record<string, unknown>\n \n // The actual response is nested under 'userStatus'\n const userStatus = (data.userStatus as Record<string, unknown>) || data\n \n // Extract email from userStatus\n if ('email' in userStatus && typeof userStatus.email === 'string') {\n status.email = userStatus.email\n }\n \n // Extract authentication status\n if ('isAuthenticated' in userStatus) {\n status.isAuthenticated = Boolean(userStatus.isAuthenticated)\n }\n \n // Extract quota from the nested structure\n status.quota = this.extractQuota(userStatus)\n \n return status\n }\n \n /**\n * Extract quota information from response\n */\n private extractQuota(data: Record<string, unknown>): ConnectUserStatus['quota'] {\n const quota: ConnectUserStatus['quota'] = {}\n \n // Extract prompt credits from planStatus structure\n const planStatus = data.planStatus as Record<string, unknown> | undefined\n if (planStatus) {\n const available = planStatus.availablePromptCredits\n const planInfo = planStatus.planInfo as Record<string, unknown> | undefined\n const monthly = planInfo?.monthlyPromptCredits\n \n if (typeof available === 'number' && typeof monthly === 'number') {\n const used = monthly - available\n quota.promptCredits = {\n used,\n limit: monthly,\n remaining: available\n }\n }\n }\n \n // Extract models from cascadeModelConfigData\n const cascadeData = data.cascadeModelConfigData as Record<string, unknown> | undefined\n const clientModelConfigs = cascadeData?.clientModelConfigs\n \n if (Array.isArray(clientModelConfigs)) {\n quota.models = clientModelConfigs.map(this.parseModel.bind(this))\n }\n \n return quota\n }\n \n /**\n * Parse a single model from the response\n */\n private parseModel(model: unknown): ConnectModelInfo {\n if (typeof model !== 'object' || model === null) {\n return {\n modelId: 'unknown',\n isExhausted: false\n }\n }\n \n const m = model as Record<string, unknown>\n \n // Extract model ID from modelOrAlias structure\n const modelOrAlias = m.modelOrAlias as Record<string, unknown> | undefined\n const modelId = typeof modelOrAlias?.model === 'string' ? modelOrAlias.model : 'unknown'\n \n // Extract quota info\n const quotaInfo = m.quotaInfo as Record<string, unknown> | undefined\n const remainingFraction = typeof quotaInfo?.remainingFraction === 'number' ? quotaInfo.remainingFraction : undefined\n const resetTime = typeof quotaInfo?.resetTime === 'string' ? quotaInfo.resetTime : undefined\n \n return {\n modelId,\n displayName: typeof m.label === 'string' ? m.label : undefined,\n label: typeof m.label === 'string' ? m.label : undefined,\n quota: {\n remaining: undefined,\n limit: undefined,\n usedPercentage: remainingFraction !== undefined ? (1 - remainingFraction) : undefined,\n remainingPercentage: remainingFraction,\n resetTime,\n timeUntilResetMs: resetTime ? this.parseResetTime(resetTime) : undefined,\n },\n isExhausted: remainingFraction === 0\n }\n }\n \n /**\n * Parse reset time to milliseconds until reset\n */\n private parseResetTime(resetTime: string): number | undefined {\n try {\n const resetDate = new Date(resetTime)\n const now = Date.now()\n const diff = resetDate.getTime() - now\n return diff > 0 ? diff : undefined\n } catch {\n return undefined\n }\n }\n}\n","/**\n * Local parser - converts Connect API response to QuotaSnapshot format\n */\n\nimport type { QuotaSnapshot, ModelQuotaInfo, PromptCreditsInfo } from '../quota/types.js'\nimport type { ConnectUserStatus } from './connect-client.js'\nimport { debug } from '../core/logger.js'\n\n/**\n * Parse Connect API user status into QuotaSnapshot format\n */\nexport function parseLocalQuotaSnapshot(userStatus: ConnectUserStatus): QuotaSnapshot {\n debug('local-parser', 'Parsing local user status into QuotaSnapshot')\n \n const snapshot: QuotaSnapshot = {\n timestamp: new Date().toISOString(),\n method: 'local',\n email: userStatus.email,\n models: []\n }\n \n // Parse prompt credits\n if (userStatus.quota?.promptCredits) {\n snapshot.promptCredits = parsePromptCredits(userStatus.quota.promptCredits)\n }\n \n // Parse models\n if (userStatus.quota?.models) {\n snapshot.models = userStatus.quota.models.map(parseModelQuota)\n }\n \n debug('local-parser', `Parsed ${snapshot.models.length} models`)\n return snapshot\n}\n\n/**\n * Parse prompt credits from Connect API format\n */\nfunction parsePromptCredits(credits: NonNullable<ConnectUserStatus['quota']>['promptCredits']): PromptCreditsInfo | undefined {\n if (!credits) {\n return undefined\n }\n \n const limit = credits.limit ?? 0\n const remaining = credits.remaining ?? limit\n const used = credits.used ?? (limit - remaining)\n \n if (limit === 0) {\n return undefined\n }\n \n const usedPercentage = limit > 0 ? used / limit : 0\n const remainingPercentage = limit > 0 ? remaining / limit : 1\n \n return {\n available: remaining,\n monthly: limit,\n usedPercentage,\n remainingPercentage\n }\n}\n\n/**\n * Parse a single model quota from Connect API format\n */\nfunction parseModelQuota(model: NonNullable<NonNullable<ConnectUserStatus['quota']>['models']>[number]): ModelQuotaInfo {\n const quota = model.quota\n \n return {\n label: model.label || model.displayName || model.modelId,\n modelId: model.modelId,\n remainingPercentage: quota?.remainingPercentage,\n isExhausted: model.isExhausted ?? (quota?.remainingPercentage === 0),\n resetTime: quota?.resetTime,\n timeUntilResetMs: quota?.timeUntilResetMs\n }\n}\n","/**\n * Quota service - orchestrates fetching quota data\n */\n\nimport { debug } from '../core/logger.js'\nimport { getTokenManager } from '../google/token-manager.js'\nimport { CloudCodeClient, type FetchAvailableModelsResponse } from '../google/cloudcode.js'\nimport { parseQuotaSnapshot } from '../google/parser.js'\nimport { \n detectAntigravityProcess, \n discoverPorts, \n probeForConnectAPI, \n ConnectClient, \n parseLocalQuotaSnapshot \n} from '../local/index.js'\nimport { \n AntigravityNotRunningError, \n LocalConnectionError, \n PortDetectionError,\n NoAuthMethodAvailableError\n} from '../core/errors.js'\nimport type { QuotaSnapshot } from './types.js'\n\nexport type QuotaMethod = 'google' | 'local' | 'auto'\n\n/**\n * Fetch quota using the specified method\n * @param method Method to use: 'auto' (default), 'google', or 'local'\n */\nexport async function fetchQuota(method: QuotaMethod = 'auto'): Promise<QuotaSnapshot> {\n if (method === 'auto') {\n try {\n debug('service', 'Auto mode: trying local method first')\n return await fetchQuotaLocal()\n } catch (err) {\n debug('service', 'Auto mode: local method failed', err)\n // Only fallback to Google if user is logged in\n const tokenManager = getTokenManager()\n if (tokenManager.isLoggedIn()) {\n debug('service', 'User is logged in, falling back to Google method')\n return fetchQuotaGoogle()\n }\n // User is not logged in and local failed - throw a helpful error\n throw new NoAuthMethodAvailableError()\n }\n }\n\n if (method === 'local') {\n return fetchQuotaLocal()\n }\n return fetchQuotaGoogle()\n}\n\n/**\n * Fetch quota from Google Cloud Code API\n */\nasync function fetchQuotaGoogle(): Promise<QuotaSnapshot> {\n debug('service', 'Fetching quota from Google')\n \n const tokenManager = getTokenManager()\n const email = tokenManager.getEmail()\n const client = new CloudCodeClient(tokenManager)\n \n // Fetch code assist (this one usually works)\n const codeAssistResponse = await client.loadCodeAssist()\n debug('service', 'Code assist response received', JSON.stringify(codeAssistResponse))\n \n // Try to fetch models, but it might fail with 403\n let modelsResponse: FetchAvailableModelsResponse = {}\n try {\n modelsResponse = await client.fetchAvailableModels()\n debug('service', 'Models response received', JSON.stringify(modelsResponse))\n } catch (err) {\n debug('service', 'Failed to fetch models (might need different permissions)', err)\n // Continue without models - we'll still show prompt credits\n }\n \n // Parse into snapshot with email\n const snapshot = parseQuotaSnapshot(codeAssistResponse, modelsResponse, email)\n \n debug('service', 'Quota snapshot created')\n return snapshot\n}\n\n/**\n * Fetch quota from local Antigravity language server\n */\nasync function fetchQuotaLocal(): Promise<QuotaSnapshot> {\n debug('service', 'Fetching quota from local Antigravity server')\n \n // Step 1: Detect Antigravity process\n const processInfo = await detectAntigravityProcess()\n if (!processInfo) {\n throw new AntigravityNotRunningError()\n }\n \n debug('service', `Found Antigravity process: PID ${processInfo.pid}`)\n \n // Step 2: Discover all listening ports (to find the connect port, not extension_server_port)\n const ports = await discoverPorts(processInfo.pid)\n \n if (ports.length === 0) {\n throw new PortDetectionError()\n }\n \n debug('service', `Discovered ${ports.length} listening ports: ${ports.join(', ')}`)\n \n // Step 3: Probe ports to find Connect API (pass CSRF token for authentication)\n const probeResult = await probeForConnectAPI(ports, processInfo.csrfToken)\n if (!probeResult) {\n throw new LocalConnectionError('Could not find Antigravity Connect API on any port')\n }\n \n debug('service', `Found Connect API at ${probeResult.baseUrl}`)\n \n // Step 4: Connect to API and get user status\n const client = new ConnectClient(probeResult.baseUrl, processInfo.csrfToken)\n const userStatus = await client.getUserStatus()\n \n debug('service', 'User status received from local server')\n \n // Step 5: Parse into QuotaSnapshot\n const snapshot = parseLocalQuotaSnapshot(userStatus)\n \n debug('service', 'Local quota snapshot created')\n return snapshot\n}\n","/**\n * Quota output formatting\n */\n\nimport Table from 'cli-table3'\nimport type { QuotaSnapshot, ModelQuotaInfo } from './types.js'\n\n/**\n * Format milliseconds to human readable time\n */\nfunction formatTimeUntilReset(ms?: number): string {\n if (ms === undefined || ms <= 0) return 'N/A'\n \n const hours = Math.floor(ms / (1000 * 60 * 60))\n const minutes = Math.floor((ms % (1000 * 60 * 60)) / (1000 * 60))\n \n if (hours > 0) {\n return `${hours}h ${minutes}m`\n }\n return `${minutes}m`\n}\n\n/**\n * Format remaining percentage for display\n */\nfunction formatRemaining(model: ModelQuotaInfo): string {\n if (model.isExhausted) {\n return '❌ EXHAUSTED'\n }\n if (model.remainingPercentage === undefined) {\n return 'N/A'\n }\n \n const pct = Math.round(model.remainingPercentage * 100)\n if (pct >= 75) return `🟢 ${pct}%`\n if (pct >= 50) return `🟡 ${pct}%`\n if (pct >= 25) return `🟠 ${pct}%`\n return `🔴 ${pct}%`\n}\n\n/**\n * Print quota as a formatted table\n */\nexport function printQuotaTable(snapshot: QuotaSnapshot): void {\n const timestamp = new Date(snapshot.timestamp).toLocaleString()\n \n console.log()\n console.log(`📊 Antigravity Quota Status (via ${snapshot.method.toUpperCase()})`)\n console.log(` Retrieved: ${timestamp}`)\n \n // Display user info\n if (snapshot.email || snapshot.planType) {\n const userParts: string[] = []\n if (snapshot.email) {\n userParts.push(`👤 ${snapshot.email}`)\n }\n if (snapshot.planType) {\n userParts.push(`📋 Plan: ${snapshot.planType}`)\n }\n console.log(` ${userParts.join(' | ')}`)\n }\n console.log()\n \n // Models table\n if (snapshot.models.length > 0) {\n const table = new Table({\n head: ['Model', 'Remaining', 'Resets In'],\n style: {\n head: ['cyan'],\n border: ['gray']\n }\n })\n \n for (const model of snapshot.models) {\n table.push([\n model.label,\n formatRemaining(model),\n formatTimeUntilReset(model.timeUntilResetMs)\n ])\n }\n \n console.log(table.toString())\n } else {\n console.log('No model quota information available.')\n }\n \n console.log()\n}\n\n/**\n * Print quota as JSON\n */\nexport function printQuotaJson(snapshot: QuotaSnapshot): void {\n console.log(JSON.stringify(snapshot, null, 2))\n}\n","/**\n * Table rendering utilities for multi-account displays\n */\n\nimport Table from 'cli-table3'\nimport type { AccountSummary } from '../accounts/types.js'\nimport type { QuotaSnapshot } from '../quota/types.js'\n\n/**\n * Format relative time (e.g., \"2 hours ago\")\n */\nfunction formatRelativeTime(isoDate: string | null): string {\n if (!isoDate) return 'Never'\n \n const date = new Date(isoDate)\n const now = Date.now()\n const diffMs = now - date.getTime()\n \n const minutes = Math.floor(diffMs / (1000 * 60))\n const hours = Math.floor(diffMs / (1000 * 60 * 60))\n const days = Math.floor(diffMs / (1000 * 60 * 60 * 24))\n \n if (minutes < 1) return 'Just now'\n if (minutes < 60) return `${minutes}m ago`\n if (hours < 24) return `${hours}h ago`\n if (days === 1) return 'Yesterday'\n return `${days} days ago`\n}\n\n/**\n * Format status icon\n */\nfunction formatStatus(status: string): string {\n switch (status) {\n case 'valid': return '✅'\n case 'expired': return '⚠️'\n case 'invalid': return '❌'\n default: return '❓'\n }\n}\n\n/**\n * Format credits display\n */\nfunction formatCredits(credits: { used: number; limit: number } | null | undefined): string {\n if (!credits) return '-'\n return `${credits.limit - credits.used} / ${credits.limit}`\n}\n\n/**\n * Render accounts list as a table\n */\nexport function renderAccountsTable(accounts: AccountSummary[]): void {\n if (accounts.length === 0) {\n console.log('\\n📭 No accounts found.')\n console.log('\\n💡 Run `antigravity-usage login` to add an account.\\n')\n return\n }\n \n console.log('\\n📊 Antigravity Accounts')\n console.log('═'.repeat(60))\n \n const totalWidth = process.stdout.columns || 80\n const isSmallTerminal = totalWidth < 90\n \n // Dynamic column widths\n // If small terminal, use tighter packing\n const colWidths = isSmallTerminal \n ? [25, 8, 12, 12] // Tighter widths for < 90 cols\n : [30, 10, 15, 15] // Standard widths\n \n // Ensure we don't exceed total width with borders (approx 10 chars)\n // If extremely small, let cli-table handle auto-sizing (pass undefined)\n const finalColWidths = totalWidth < 60 ? undefined : colWidths\n\n const tableOptions: any = {\n head: ['Account', 'Status', 'Credits', 'Last Used'],\n style: {\n head: ['cyan'],\n border: ['gray']\n }\n }\n \n if (finalColWidths) {\n tableOptions.colWidths = finalColWidths\n }\n\n const table = new Table(tableOptions)\n \n for (const account of accounts) {\n const nameDisplay = account.isActive \n ? `${account.email} [*]` \n : account.email\n \n table.push([\n nameDisplay,\n formatStatus(account.status),\n formatCredits(account.cachedCredits),\n formatRelativeTime(account.lastUsed)\n ])\n }\n \n console.log(table.toString())\n console.log('\\n[*] = active account\\n')\n}\n\n/**\n * Quota result for all accounts display\n */\nexport interface AllAccountsQuotaResult {\n email: string\n isActive: boolean\n status: 'success' | 'error' | 'cached'\n error?: string\n snapshot?: QuotaSnapshot\n cacheAge?: number\n}\n\n/**\n * Format quota remaining bar\n */\nfunction formatQuotaRemainingBar(remainingPercentage: number): string {\n const width = 10\n const filled = Math.round((remainingPercentage / 100) * width)\n const empty = width - filled\n \n const filledChar = '█'\n const emptyChar = '░'\n \n return `${filledChar.repeat(filled)}${emptyChar.repeat(empty)} ${Math.round(remainingPercentage)}%`\n}\n\n/**\n * Render quota for all accounts as a table\n */\nexport function renderAllQuotaTable(results: AllAccountsQuotaResult[]): void {\n if (results.length === 0) {\n console.log('\\n📭 No accounts found.')\n console.log('\\n💡 Run `antigravity-usage login` to add an account.\\n')\n return\n }\n \n // Sort by quota remaining (highest to lowest)\n const sortedResults = [...results].sort((a, b) => {\n // Errors go last\n if (a.status === 'error' && b.status !== 'error') return 1\n if (a.status !== 'error' && b.status === 'error') return -1\n if (a.status === 'error' && b.status === 'error') return 0\n \n // Get remaining percentage for comparison\n const getRemaining = (result: AllAccountsQuotaResult): number => {\n const firstModel = result.snapshot?.models?.[0]\n if (!firstModel) return -1\n if (firstModel.isExhausted) return 0\n return firstModel.remainingPercentage ?? -1\n }\n \n const aRemaining = getRemaining(a)\n const bRemaining = getRemaining(b)\n \n // Sort descending (highest first)\n return bRemaining - aRemaining\n })\n \n console.log('\\n📊 Quota Overview - All Accounts')\n console.log('═'.repeat(70))\n \n const totalWidth = process.stdout.columns || 80\n \n // Calculate responsive widths\n // Standard: [30, 10, 15, 20] = ~75 content + 13 border = 88 chars\n \n let colWidths: number[] | undefined\n \n if (totalWidth < 80) {\n // Very small: auto-size or strict truncation\n colWidths = undefined\n } else if (totalWidth < 100) {\n // Compact mode\n colWidths = [25, 8, 12, 18]\n } else {\n // Spacious mode (fill remaining space with email column?)\n // For now keep standard spacious defaults\n colWidths = [30, 10, 15, 20]\n }\n\n const tableOptions: any = {\n head: ['Account', 'Source', 'Credits', 'Quota Remaining'],\n style: {\n head: ['cyan'],\n border: ['gray']\n }\n }\n \n if (colWidths) {\n tableOptions.colWidths = colWidths\n }\n\n const table = new Table(tableOptions)\n \n const errors: string[] = []\n \n for (const result of sortedResults) {\n const nameDisplay = result.isActive \n ? `${result.email} [*]` \n : result.email\n \n if (result.status === 'error') {\n table.push([\n nameDisplay,\n '-',\n '-',\n result.error || 'Error'\n ])\n errors.push(`${result.email}: ${result.error}`)\n } else {\n const snapshot = result.snapshot\n const source = result.status === 'cached' \n ? `Cached (${formatCacheAge(result.cacheAge)})` \n : (snapshot?.method.toUpperCase() || '-')\n \n // Get credits\n let credits = '-'\n if (snapshot?.promptCredits) {\n const pc = snapshot.promptCredits\n credits = `${pc.available} / ${pc.monthly}`\n }\n \n // Get quota remaining from models\n // Show the MINIMUM remaining percentage across all models\n // (This is the most constrained/concerning value for the user)\n let quotaRemaining = '-'\n if (snapshot?.models && snapshot.models.length > 0) {\n // Find minimum remaining percentage\n const minRemaining = Math.min(\n ...snapshot.models\n .filter(m => m.remainingPercentage !== undefined)\n .map(m => m.remainingPercentage!)\n )\n \n if (isFinite(minRemaining)) {\n const remainingPct = minRemaining * 100\n quotaRemaining = formatQuotaRemainingBar(remainingPct)\n } else if (snapshot.models.some(m => m.isExhausted)) {\n quotaRemaining = '❌ EXHAUSTED'\n }\n }\n \n table.push([\n nameDisplay,\n source,\n credits,\n quotaRemaining\n ])\n }\n }\n \n console.log(table.toString())\n \n // Show errors if any\n if (errors.length > 0) {\n console.log(`\\n⚠️ ${errors.length} account(s) had errors:`)\n for (const err of errors) {\n console.log(` - ${err}`)\n }\n }\n \n console.log('\\n[*] = active account')\n console.log('💡 Use --refresh to fetch latest data\\n')\n}\n\nfunction formatCacheAge(seconds: number | undefined): string {\n if (seconds === undefined) return '?'\n if (seconds < 60) return `${seconds}s`\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m`\n return `${Math.floor(seconds / 3600)}h`\n}\n","/**\n * Quota command - fetch and display quota information\n */\n\nimport { fetchQuota, type QuotaMethod } from '../quota/service.js'\nimport { printQuotaTable, printQuotaJson } from '../quota/format.js'\nimport { getTokenManager, getTokenManagerForAccount, resetTokenManager } from '../google/token-manager.js'\nimport { getAccountManager, saveCache, isCacheValid, loadCache, getCacheAge } from '../accounts/index.js'\nimport { renderAllQuotaTable, type AllAccountsQuotaResult } from '../render/index.js'\nimport { error as logError, debug, info } from '../core/logger.js'\nimport { \n NotLoggedInError, \n AuthenticationError, \n NetworkError, \n RateLimitError, \n APIError,\n AntigravityNotRunningError,\n LocalConnectionError,\n PortDetectionError,\n NoAuthMethodAvailableError\n} from '../core/errors.js'\n\ninterface QuotaOptions {\n json?: boolean\n method?: QuotaMethod\n all?: boolean\n account?: string\n refresh?: boolean\n}\n\n/**\n * Fetch quota for a single account\n */\nasync function fetchSingleAccountQuota(options: QuotaOptions): Promise<void> {\n // Determine which account to use\n const manager = getAccountManager()\n const accountEmail = options.account || manager.getActiveEmail()\n const originalActiveEmail = manager.getActiveEmail()\n \n // Force google method when --account is specified\n // (local method always uses IDE's logged-in account)\n let method = options.method || 'auto'\n if (options.account && method !== 'google') {\n debug('quota', `Account specified, forcing google method (local uses IDE account)`)\n method = 'google'\n }\n \n // Only check login for google method\n if (method === 'google') {\n const tokenManager = options.account \n ? getTokenManagerForAccount(options.account)\n : getTokenManager()\n \n if (!tokenManager.isLoggedIn()) {\n logError('Not logged in. Run: antigravity-usage login')\n process.exit(1)\n }\n }\n \n try {\n // Temporarily switch to the target account if needed\n let accountSwitched = false\n \n if (options.account && options.account !== originalActiveEmail) {\n debug('quota', `Temporarily switching to account ${options.account} for fetch`)\n manager.setActiveAccount(options.account)\n accountSwitched = true\n }\n \n try {\n debug('quota', `Fetching quota via ${method} method...`)\n const snapshot = await fetchQuota(method)\n \n // Cache the result if we have an account email\n if (accountEmail) {\n saveCache(accountEmail, snapshot)\n }\n \n if (options.json) {\n printQuotaJson(snapshot)\n } else {\n printQuotaTable(snapshot)\n }\n } finally {\n // Always restore original active account\n if (accountSwitched && originalActiveEmail) {\n debug('quota', `Restoring active account to ${originalActiveEmail}`)\n manager.setActiveAccount(originalActiveEmail)\n }\n }\n } catch (err) {\n handleQuotaError(err)\n }\n}\n\n/**\n * Fetch quota for all accounts\n */\nasync function fetchAllAccountsQuota(options: QuotaOptions): Promise<void> {\n const manager = getAccountManager()\n const emails = manager.getAccountEmails()\n const activeEmail = manager.getActiveEmail()\n \n if (emails.length === 0) {\n logError('No accounts found. Run: antigravity-usage login')\n process.exit(1)\n }\n \n if (options.refresh) {\n info('🔄 Refreshing quota data for all accounts...\\n')\n }\n \n \n // IMPORTANT: Fetch sequentially, NOT in parallel\n // Parallel fetching causes race conditions with account switching\n const results: AllAccountsQuotaResult[] = []\n \n for (const email of emails) {\n const isActive = email === activeEmail\n \n try {\n // Check cache first (unless refresh requested)\n if (!options.refresh && isCacheValid(email)) {\n const cached = loadCache(email)\n if (cached) {\n debug('quota', `Using cached data for ${email}`)\n results.push({\n email,\n isActive,\n status: 'cached',\n snapshot: cached,\n cacheAge: getCacheAge(email) || 0\n })\n continue\n }\n }\n \n // Fetch fresh data\n debug('quota', `Fetching fresh data for ${email}`)\n \n const snapshot = await fetchQuotaForAccount(email, options.method || 'auto')\n \n // Cache the result\n saveCache(email, snapshot)\n \n results.push({\n email,\n isActive,\n status: 'success',\n snapshot\n })\n } catch (err) {\n debug('quota', `Error fetching quota for ${email}:`, err)\n \n // Try to use cached data on error\n const cached = loadCache(email)\n if (cached) {\n results.push({\n email,\n isActive,\n status: 'cached',\n snapshot: cached,\n cacheAge: getCacheAge(email) || 0\n })\n } else {\n results.push({\n email,\n isActive,\n status: 'error',\n error: err instanceof Error ? err.message : 'Unknown error'\n })\n }\n }\n }\n\n \n if (options.json) {\n console.log(JSON.stringify(results, null, 2))\n } else {\n renderAllQuotaTable(results)\n }\n}\n\n/**\n * Fetch quota for a specific account\n */\nasync function fetchQuotaForAccount(email: string, method: QuotaMethod): Promise<any> {\n const manager = getAccountManager()\n const originalActiveEmail = manager.getActiveEmail()\n \n // CRITICAL: Local method always returns IDE's logged-in account data\n // We CANNOT use local method for non-IDE accounts in multi-account mode\n // Force Google API method to ensure we get the correct account's data\n let effectiveMethod = method\n \n if (method === 'auto' || method === 'local') {\n // Always use Google API for multi-account to avoid cache pollution\n effectiveMethod = 'google'\n debug('quota', `Forcing Google API for multi-account fetch (email: ${email})`)\n }\n \n // Temporarily switch to target account\n let accountSwitched = false\n if (email !== originalActiveEmail) {\n debug('quota', `Switching to ${email} for fetch`)\n manager.setActiveAccount(email)\n // CRITICAL: Reset TokenManager singleton so it loads the new account's tokens\n resetTokenManager()\n accountSwitched = true\n }\n \n try {\n const snapshot = await fetchQuota(effectiveMethod)\n return snapshot\n } finally {\n // Always restore original active account\n if (accountSwitched && originalActiveEmail) {\n debug('quota', `Restoring active account to ${originalActiveEmail}`)\n manager.setActiveAccount(originalActiveEmail)\n // Reset TokenManager again to pick up original account's tokens\n resetTokenManager()\n }\n }\n}\n\n/**\n * Handle quota errors\n */\nfunction handleQuotaError(err: unknown): never {\n // Auto mode: both methods unavailable\n if (err instanceof NoAuthMethodAvailableError) {\n logError(err.message)\n process.exit(1)\n }\n \n // Local method specific errors\n if (err instanceof AntigravityNotRunningError) {\n logError(err.message)\n console.log('\\nTip: Make sure Antigravity is running in your IDE (VSCode, etc.)')\n process.exit(1)\n }\n \n if (err instanceof LocalConnectionError) {\n logError(err.message)\n console.log('\\nTip: Try restarting your IDE or the Antigravity extension.')\n process.exit(1)\n }\n \n if (err instanceof PortDetectionError) {\n logError(err.message)\n console.log('\\nTip: This may happen if the Antigravity language server is still starting up.')\n process.exit(1)\n }\n \n // Google method specific errors\n if (err instanceof NotLoggedInError) {\n logError(err.message)\n process.exit(1)\n }\n \n if (err instanceof AuthenticationError) {\n logError(err.message)\n process.exit(1)\n }\n \n if (err instanceof NetworkError) {\n logError(err.message)\n process.exit(1)\n }\n \n if (err instanceof RateLimitError) {\n logError(err.message)\n if (err.retryAfterMs) {\n const seconds = Math.ceil(err.retryAfterMs / 1000)\n console.log(`Retry after ${seconds} seconds.`)\n }\n process.exit(1)\n }\n \n if (err instanceof APIError) {\n logError(err.message)\n process.exit(1)\n }\n \n // Unknown error\n logError(`Failed to fetch quota: ${err instanceof Error ? err.message : 'Unknown error'}`)\n debug('quota', 'Error details', err)\n process.exit(1)\n}\n\nexport async function quotaCommand(options: QuotaOptions): Promise<void> {\n if (options.all) {\n await fetchAllAccountsQuota(options)\n } else {\n await fetchSingleAccountQuota(options)\n }\n}\n","/**\n * Doctor command - diagnostics and troubleshooting\n */\n\nimport { getTokenManager } from '../google/token-manager.js'\nimport { getStorageInfo } from '../google/storage.js'\nimport { getConfigDir, getPlatform } from '../core/env.js'\nimport { maskEmail } from '../core/mask.js'\nimport { version } from '../version'\n\nexport function doctorCommand(): void {\n console.log()\n console.log('🩺 Antigravity Usage - Diagnostics')\n console.log('═'.repeat(50))\n console.log()\n \n // Version info\n console.log('📦 Version')\n console.log('─'.repeat(40))\n console.log(` CLI version: ${version}`)\n console.log(` Node.js: ${process.version}`)\n console.log(` Platform: ${getPlatform()}`)\n console.log()\n \n // Config paths\n const storage = getStorageInfo()\n console.log('📁 Configuration')\n console.log('─'.repeat(40))\n console.log(` Config dir: ${storage.configDir}`)\n console.log(` Tokens file: ${storage.tokensPath}`)\n console.log(` Tokens exist: ${storage.exists ? 'Yes' : 'No'}`)\n console.log()\n \n // Auth status\n const tokenManager = getTokenManager()\n console.log('🔐 Authentication')\n console.log('─'.repeat(40))\n \n if (!tokenManager.isLoggedIn()) {\n console.log(' Status: Not logged in')\n console.log()\n console.log(' 💡 Run `antigravity-usage login` to authenticate.')\n } else {\n console.log(' Status: Logged in')\n \n const email = tokenManager.getEmail()\n if (email) {\n console.log(` Email: ${maskEmail(email)}`)\n }\n \n const expiresAt = tokenManager.getExpiresAt()\n if (expiresAt) {\n const isExpired = tokenManager.isTokenExpired()\n console.log(` Token expires: ${expiresAt.toLocaleString()}`)\n console.log(` Token valid: ${isExpired ? 'No (needs refresh)' : 'Yes'}`)\n }\n }\n \n console.log()\n \n // Environment variables\n console.log('🔧 OAuth Configuration')\n console.log('─'.repeat(40))\n const hasClientId = !!process.env.ANTIGRAVITY_OAUTH_CLIENT_ID\n const hasClientSecret = !!process.env.ANTIGRAVITY_OAUTH_CLIENT_SECRET\n \n if (hasClientId || hasClientSecret) {\n console.log(' Using custom OAuth credentials:')\n console.log(` ANTIGRAVITY_OAUTH_CLIENT_ID: ${hasClientId ? 'Set' : 'Not set'}`)\n console.log(` ANTIGRAVITY_OAUTH_CLIENT_SECRET: ${hasClientSecret ? 'Set' : 'Not set'}`)\n } else {\n console.log(' ✅ Using built-in OAuth credentials')\n console.log(' 💡 Set ANTIGRAVITY_OAUTH_CLIENT_ID and ANTIGRAVITY_OAUTH_CLIENT_SECRET')\n console.log(' environment variables to use custom credentials.')\n }\n \n console.log()\n}\n","/**\n * Accounts command - manage multiple accounts\n */\n\nimport { getAccountManager } from '../accounts/index.js'\nimport { startOAuthFlow } from '../google/oauth.js'\nimport { getTokenManagerForAccount, resetTokenManager } from '../google/token-manager.js'\nimport { renderAccountsTable } from '../render/table.js'\nimport { success, warn, error as logError, info } from '../core/logger.js'\n\ninterface ListOptions {\n refresh?: boolean\n}\n\ninterface RemoveOptions {\n force?: boolean\n}\n\ninterface RefreshOptions {\n all?: boolean\n}\n\n/**\n * List all accounts\n */\nexport function listAccountsCommand(options: ListOptions): void {\n const manager = getAccountManager()\n const summaries = manager.getAccountSummaries()\n \n renderAccountsTable(summaries)\n \n if (options.refresh) {\n info('Use `antigravity-usage quota --all --refresh` to fetch fresh quota data.')\n }\n}\n\n/**\n * Add a new account (triggers OAuth flow)\n */\nexport async function addAccountCommand(): Promise<void> {\n info('Adding a new account...')\n \n const result = await startOAuthFlow()\n \n if (result.success) {\n success(`Account added successfully${result.email ? `: ${result.email}` : ''}!`)\n \n // Show updated account list\n const manager = getAccountManager()\n const summaries = manager.getAccountSummaries()\n console.log('\\nYour accounts:')\n renderAccountsTable(summaries)\n } else {\n logError(`Failed to add account: ${result.error}`)\n process.exit(1)\n }\n}\n\n/**\n * Switch active account\n */\nexport function switchAccountCommand(email: string): void {\n const manager = getAccountManager()\n \n // Check if account exists\n if (!manager.hasAccount(email)) {\n logError(`Account '${email}' not found.`)\n \n const emails = manager.getAccountEmails()\n if (emails.length > 0) {\n console.log('\\nAvailable accounts:')\n for (const e of emails) {\n console.log(` - ${e}`)\n }\n } else {\n info('\\nNo accounts found. Run `antigravity-usage login` to add one.')\n }\n \n process.exit(1)\n }\n \n // Switch account\n const switched = manager.setActiveAccount(email)\n \n if (switched) {\n success(`Switched to account: ${email}`)\n } else {\n logError(`Failed to switch to account: ${email}`)\n process.exit(1)\n }\n}\n\n/**\n * Remove an account\n */\nexport function removeAccountCommand(email: string, options: RemoveOptions): void {\n const manager = getAccountManager()\n \n // Check if account exists\n if (!manager.hasAccount(email)) {\n logError(`Account '${email}' not found.`)\n process.exit(1)\n }\n \n // Confirmation warning (unless --force)\n if (!options.force) {\n warn(`This will remove account '${email}' and all its data.`)\n info('Use --force to skip this warning.')\n // In a real CLI, we'd prompt for confirmation here\n // For now, just proceed\n }\n \n const removed = manager.removeAccount(email)\n \n if (removed) {\n success(`Account '${email}' removed.`)\n \n // Show remaining accounts\n const remaining = manager.getAccountEmails()\n if (remaining.length > 0) {\n const active = manager.getActiveEmail()\n console.log(`\\nActive account: ${active || 'none'}`)\n console.log(`Remaining accounts: ${remaining.length}`)\n } else {\n info('\\nNo accounts remaining. Run `antigravity-usage login` to add one.')\n }\n } else {\n logError(`Failed to remove account: ${email}`)\n process.exit(1)\n }\n}\n\n/**\n * Show current active account\n */\nexport function currentAccountCommand(): void {\n const manager = getAccountManager()\n const active = manager.getActiveEmail()\n \n if (active) {\n console.log()\n console.log(`📍 Active account: ${active}`)\n \n // Get account info\n const info = manager.getAccountInfo(active)\n if (info) {\n const statusIcon = info.status === 'valid' ? '✅' : \n info.status === 'expired' ? '⚠️' : '❌'\n console.log(` Status: ${statusIcon} ${info.status}`)\n \n if (info.tokens?.expiresAt) {\n const expiresAt = new Date(info.tokens.expiresAt).toLocaleString()\n console.log(` Token expires: ${expiresAt}`)\n }\n }\n console.log()\n } else {\n warn('No active account set.')\n \n const emails = manager.getAccountEmails()\n if (emails.length > 0) {\n console.log('\\nAvailable accounts:')\n for (const e of emails) {\n console.log(` - ${e}`)\n }\n info('\\nRun `antigravity-usage accounts switch <email>` to set an active account.')\n } else {\n info('\\nRun `antigravity-usage login` to add an account.')\n }\n }\n}\n\n/**\n * Refresh account tokens\n */\nexport async function refreshAccountCommand(email: string | undefined, options: RefreshOptions): Promise<void> {\n const manager = getAccountManager()\n \n // Refresh all accounts\n if (options.all) {\n const emails = manager.getAccountEmails()\n \n if (emails.length === 0) {\n warn('No accounts to refresh.')\n return\n }\n \n console.log(`\\n🔄 Refreshing ${emails.length} account(s)...\\n`)\n \n let successCount = 0\n let failCount = 0\n \n for (const e of emails) {\n try {\n const tokenManager = getTokenManagerForAccount(e)\n if (tokenManager.isTokenExpired()) {\n await tokenManager.refreshToken()\n success(` ✅ ${e}`)\n successCount++\n } else {\n info(` ⏭️ ${e} (token still valid)`)\n successCount++\n }\n } catch (err) {\n logError(` ❌ ${e}: ${err instanceof Error ? err.message : 'Failed'}`)\n failCount++\n }\n }\n \n resetTokenManager()\n \n console.log()\n if (failCount > 0) {\n warn(`${failCount} account(s) need re-authentication. Run: antigravity-usage login`)\n } else {\n success(`All ${successCount} account(s) refreshed successfully!`)\n }\n return\n }\n \n // Refresh specific or active account\n const targetEmail = email || manager.getActiveEmail()\n \n if (!targetEmail) {\n logError('No account specified and no active account.')\n info('Usage: antigravity-usage accounts refresh <email>')\n info(' or: antigravity-usage accounts refresh --all')\n process.exit(1)\n }\n \n if (!manager.hasAccount(targetEmail)) {\n logError(`Account '${targetEmail}' not found.`)\n process.exit(1)\n }\n \n console.log(`\\n🔄 Refreshing ${targetEmail}...`)\n \n try {\n const tokenManager = getTokenManagerForAccount(targetEmail)\n \n if (!tokenManager.isTokenExpired()) {\n info(`Token for ${targetEmail} is still valid.`)\n return\n }\n \n await tokenManager.refreshToken()\n resetTokenManager()\n success(`\\n✅ Token refreshed for ${targetEmail}`)\n } catch (err) {\n logError(`\\n❌ Failed to refresh token: ${err instanceof Error ? err.message : 'Unknown error'}`)\n info('\\nThe refresh token may be expired. Please re-authenticate:')\n info(` antigravity-usage accounts switch ${targetEmail}`)\n info(' antigravity-usage login')\n process.exit(1)\n }\n}\n\n/**\n * Main accounts command handler - dispatches to subcommands\n */\nexport async function accountsCommand(\n subcommand: string,\n args: string[],\n options: { refresh?: boolean; force?: boolean; all?: boolean }\n): Promise<void> {\n switch (subcommand) {\n case 'list':\n listAccountsCommand({ refresh: options.refresh })\n break\n \n case 'add':\n await addAccountCommand()\n break\n \n case 'switch':\n if (!args[0]) {\n logError('Please specify an account email to switch to.')\n console.log('Usage: antigravity-usage accounts switch <email>')\n process.exit(1)\n }\n switchAccountCommand(args[0])\n break\n \n case 'remove':\n if (!args[0]) {\n logError('Please specify an account email to remove.')\n console.log('Usage: antigravity-usage accounts remove <email>')\n process.exit(1)\n }\n removeAccountCommand(args[0], { force: options.force })\n break\n \n case 'current':\n currentAccountCommand()\n break\n \n case 'refresh':\n await refreshAccountCommand(args[0], { all: options.all })\n break\n \n default:\n // Default to list if no subcommand\n listAccountsCommand({ refresh: options.refresh })\n }\n}\n"],"mappings":"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","names":["URL","join","join","existsSync","readFileSync","writeFileSync","mkdirSync","existsSync","readFileSync","mkdirSync","writeFileSync","error","URL","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","dirname","existsSync","mkdirSync","writeFileSync","readFileSync","existsSync","EXPIRY_BUFFER_MS","removed","platform","exec","promisify","execAsync","promisify","exec","platform","https","http","https","http","parsePromptCredits","Table","Table","info"]}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "antigravity-usage",
3
+ "version": "0.1.0",
4
+ "description": "CLI tool to check Antigravity model quota via Google Cloud Code API",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "antigravity-usage": "dist/index.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsup",
12
+ "dev": "tsx src/index.ts",
13
+ "test": "vitest run",
14
+ "test:watch": "vitest",
15
+ "lint": "eslint src",
16
+ "typecheck": "tsc --noEmit",
17
+ "prepublishOnly": "npm run build"
18
+ },
19
+ "keywords": [
20
+ "antigravity",
21
+ "quota",
22
+ "cli",
23
+ "google-cloud-code"
24
+ ],
25
+ "author": "",
26
+ "license": "MIT",
27
+ "engines": {
28
+ "node": ">=20"
29
+ },
30
+ "files": [
31
+ "dist",
32
+ "README.md",
33
+ "LICENSE"
34
+ ],
35
+ "dependencies": {
36
+ "@types/inquirer": "^9.0.9",
37
+ "cli-table3": "^0.6.5",
38
+ "commander": "^12.1.0",
39
+ "inquirer": "^9.3.8",
40
+ "open": "^10.1.0"
41
+ },
42
+ "devDependencies": {
43
+ "@types/node": "^22.10.5",
44
+ "tsup": "^8.3.5",
45
+ "tsx": "^4.19.2",
46
+ "typescript": "^5.7.3",
47
+ "vitest": "^2.1.8"
48
+ }
49
+ }