opencode-usage-plugin 0.0.2-dev5 → 0.0.2-dev6
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.
- package/dist/index.js +12 -2
- package/dist/index.js.map +2 -2
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1343,6 +1343,7 @@ var formatUsageToast = async (input, logger) => {
|
|
|
1343
1343
|
// src/index.ts
|
|
1344
1344
|
var UsagePlugin = async ({ client }) => {
|
|
1345
1345
|
const logger = createLogger(client);
|
|
1346
|
+
await logger.info("UsagePlugin initialized");
|
|
1346
1347
|
const usageToastTool = tool({
|
|
1347
1348
|
description: "Show subscription usage as toast for OpenAI, Google, and z.ai providers",
|
|
1348
1349
|
args: {},
|
|
@@ -1381,9 +1382,18 @@ var UsagePlugin = async ({ client }) => {
|
|
|
1381
1382
|
usage_table: usageTableTool
|
|
1382
1383
|
},
|
|
1383
1384
|
async event({ event }) {
|
|
1385
|
+
await logger.debug("Event received", { type: event.type });
|
|
1384
1386
|
if (event.type === "server.connected") {
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
+
try {
|
|
1388
|
+
await logger.info("server.connected event received, starting worker");
|
|
1389
|
+
const { startWorker: startWorker2 } = await Promise.resolve().then(() => (init_worker(), worker_exports));
|
|
1390
|
+
startWorker2(logger);
|
|
1391
|
+
await logger.info("Worker started successfully");
|
|
1392
|
+
} catch (error) {
|
|
1393
|
+
await logger.error("Failed to start worker", {
|
|
1394
|
+
error: error instanceof Error ? error.message : String(error)
|
|
1395
|
+
});
|
|
1396
|
+
}
|
|
1387
1397
|
}
|
|
1388
1398
|
},
|
|
1389
1399
|
async config(config) {
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/providers/common/logger.ts", "../src/providers/common/files.ts", "../src/cache/file.ts", "../src/cache/types.ts", "../src/cache/reader.ts", "../src/providers/common/time.ts", "../src/providers/common/registry.ts", "../src/providers/google/auth.ts", "../src/providers/google/fetch.ts", "../src/providers/openai/auth.ts", "../src/providers/openai/fetch.ts", "../src/providers/zai-coding-plan/auth.ts", "../src/providers/zai-coding-plan/fetch.ts", "../src/types/provider.ts", "../src/types/dashboard.ts", "../src/types/index.ts", "../src/cache/fetcher.ts", "../src/cache/worker.ts", "../src/index.ts", "../src/toast/filter.ts", "../src/dashboard/format.ts", "../src/toast/format.ts"],
|
|
4
|
-
"sourcesContent": ["export type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nexport interface Logger {\n debug: (message: string, extra?: Record<string, unknown>) => Promise<void>;\n info: (message: string, extra?: Record<string, unknown>) => Promise<void>;\n warn: (message: string, extra?: Record<string, unknown>) => Promise<void>;\n error: (message: string, extra?: Record<string, unknown>) => Promise<void>;\n}\n\nexport const maskSecret = (secret: string): string => {\n if (!secret || typeof secret !== 'string' || secret.length <= 8) {\n return '***';\n }\n return `${secret.slice(0, 4)}...${secret.slice(-4)}`;\n};\n\nconst noOpLogger = {\n debug: async () => {},\n info: async () => {},\n warn: async () => {},\n error: async () => {},\n};\n\ninterface LogOptions {\n service: string;\n level: LogLevel;\n message: string;\n}\n\ninterface OpenCodeClient {\n app: {\n log: (options: LogOptions) => Promise<boolean> | { ok: boolean };\n };\n}\n\nexport const createLogger = (client: unknown): Logger => {\n const service = 'opencode-usage';\n\n return {\n debug: async (message, extra) => {\n await (client as OpenCodeClient).app.log({\n service,\n level: 'debug',\n message,\n ...(extra ?? {}),\n });\n },\n info: async (message, extra) => {\n await (client as OpenCodeClient).app.log({\n service,\n level: 'info',\n message,\n ...(extra ?? {}),\n });\n },\n warn: async (message, extra) => {\n await (client as OpenCodeClient).app.log({\n service,\n level: 'warn',\n message,\n ...(extra ?? {}),\n });\n },\n error: async (message, extra) => {\n await (client as OpenCodeClient).app.log({\n service,\n level: 'error',\n message,\n ...(extra ?? {}),\n });\n },\n };\n};\n\nexport const noopLogger = noOpLogger as unknown as Logger;\n", "import { readFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nimport type { Logger } from './logger.ts';\nimport type { OpenCodeAuth } from '../../types/index.ts';\n\nexport const xdgDataHome = (): string =>\n process.env.XDG_DATA_HOME ?? join(homedir(), '.local', 'share');\n\nexport const xdgConfigHome = (): string =>\n process.env.XDG_CONFIG_HOME ?? join(homedir(), '.config');\n\nexport const xdgCacheHome = (): string => process.env.XDG_CACHE_HOME ?? join(homedir(), '.cache');\n\nexport const AUTH_PATHS = {\n opencode: (): string => join(xdgDataHome(), 'opencode', 'auth.json'),\n openaiPlugin: (): string => join(homedir(), '.opencode', 'auth', 'openai.json'),\n antigravityConfig: (): string => join(xdgConfigHome(), 'opencode', 'antigravity-accounts.json'),\n antigravityData: (): string => join(xdgDataHome(), 'opencode', 'antigravity-accounts.json'),\n} as const;\n\nexport const readJson = async <T>(filePath: string, logger?: Logger): Promise<T | null> => {\n try {\n const content = await readFile(filePath, 'utf-8');\n return JSON.parse(content) as T;\n } catch (error) {\n if (logger) {\n const message = error instanceof Error ? error.message : String(error);\n await logger.debug(`Auth file not found or invalid: ${filePath}`, { error: message });\n }\n return null;\n }\n};\n\nexport const loadOpenCodeAuth = async (logger?: Logger): Promise<OpenCodeAuth | null> => {\n return readJson<OpenCodeAuth>(AUTH_PATHS.opencode(), logger);\n};\n", "import { mkdir, readFile, rename, unlink, writeFile } from 'node:fs/promises';\n\nimport { xdgCacheHome } from '../providers/common/files.ts';\nimport type { Logger } from '../providers/common/logger.ts';\nimport type { CacheSchema } from './types.ts';\n\nconst CACHE_DIR = (): string => `${xdgCacheHome()}/opencode/opencode-usage-plugin`;\n\nexport const CACHE_PATH = (): string => `${CACHE_DIR()}/usage.json`;\n\nconst TMP_PATH = (): string => `${CACHE_PATH()}.tmp`;\n\nconst ensureCacheDir = async (): Promise<void> => {\n try {\n await mkdir(CACHE_DIR(), { recursive: true });\n } catch (error) {\n if (\n error instanceof Error &&\n 'code' in error &&\n (error as { code: string }).code !== 'EEXIST'\n ) {\n throw error;\n }\n }\n};\n\nexport const readCache = async (logger?: Logger): Promise<CacheSchema | null> => {\n try {\n const content = await readFile(CACHE_PATH(), 'utf-8');\n const parsed = JSON.parse(content) as unknown;\n\n if (\n typeof parsed === 'object' &&\n parsed !== null &&\n 'schema_version' in parsed &&\n 'updated_at' in parsed &&\n 'refresh_interval_seconds' in parsed &&\n 'providers' in parsed\n ) {\n return parsed as CacheSchema;\n }\n\n await logger?.warn('Invalid cache schema, returning null');\n return null;\n } catch (error) {\n if (logger) {\n const message = error instanceof Error ? error.message : String(error);\n await logger.debug('Cache file not found or invalid', { error: message });\n }\n return null;\n }\n};\n\nexport const writeCache = async (cache: CacheSchema, logger?: Logger): Promise<void> => {\n try {\n await ensureCacheDir();\n const content = JSON.stringify(cache, null, 2);\n await writeFile(TMP_PATH(), content, 'utf-8');\n await rename(TMP_PATH(), CACHE_PATH());\n await logger?.debug('Cache written successfully', { path: CACHE_PATH() });\n } catch (error) {\n await logger?.error('Failed to write cache', {\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n};\n\nexport const clearCache = async (logger?: Logger): Promise<void> => {\n try {\n await unlink(CACHE_PATH());\n await logger?.debug('Cache cleared', { path: CACHE_PATH() });\n } catch (error) {\n if (logger) {\n const code =\n error instanceof Error && 'code' in error ? (error as { code: string }).code : 'UNKNOWN';\n if (code === 'ENOENT') {\n await logger.debug('Cache file does not exist, nothing to clear');\n } else {\n await logger?.error('Failed to clear cache', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n }\n};\n", "import type { ProviderId, ProviderUsage } from '../types/index.ts';\n\nexport const SCHEMA_VERSION = 1;\nexport const REFRESH_INTERVAL_SECONDS = 300;\nexport const STALE_THRESHOLD_MULTIPLIER = 2;\n\nexport interface ProviderCacheEntry {\n supported: boolean;\n configured: boolean;\n last_attempt_at: string;\n last_success_at: string | null;\n data: ProviderUsage | null;\n error: string | null;\n}\n\nexport interface CacheSchema {\n schema_version: number;\n updated_at: string;\n refresh_interval_seconds: number;\n providers: Record<ProviderId, ProviderCacheEntry>;\n}\n", "import type { Logger } from '../providers/common/logger.ts';\nimport { readCache } from './file.ts';\nimport { REFRESH_INTERVAL_SECONDS, STALE_THRESHOLD_MULTIPLIER, type CacheSchema } from './types.ts';\n\nexport interface DisplayCache {\n providers: CacheSchema['providers'];\n updatedAt: string;\n isStale: boolean;\n}\n\nexport const loadCacheForDisplay = async (logger: Logger): Promise<DisplayCache | null> => {\n const cache = await readCache(logger);\n if (!cache) {\n await logger.warn('No cache available');\n return null;\n }\n\n const updatedAt = new Date(cache.updated_at);\n const now = new Date();\n const staleThresholdMs = REFRESH_INTERVAL_SECONDS * 1000 * STALE_THRESHOLD_MULTIPLIER;\n const isStale = now.getTime() - updatedAt.getTime() > staleThresholdMs;\n\n if (isStale) {\n await logger.debug('Cache is stale', {\n updatedAt: cache.updated_at,\n staleThresholdSeconds: REFRESH_INTERVAL_SECONDS * STALE_THRESHOLD_MULTIPLIER,\n });\n }\n\n const configuredProviders: CacheSchema['providers'] = {} as CacheSchema['providers'];\n\n for (const [providerId, entry] of Object.entries(cache.providers)) {\n if (entry.configured) {\n configuredProviders[providerId as keyof typeof configuredProviders] = entry;\n }\n }\n\n return {\n providers: configuredProviders,\n updatedAt: cache.updated_at,\n isStale,\n };\n};\n", "export const calculateResetAfterSeconds = (\n resetAt: number | null,\n now: number = Date.now()\n): number | null => {\n if (!resetAt) {\n return null;\n }\n\n const diffMs = resetAt - now;\n if (diffMs <= 0) {\n return 0;\n }\n\n return Math.floor(diffMs / 1000);\n};\n\nexport const calculateResetAt = (\n resetAfterSeconds: number | null,\n now: number = Date.now()\n): number | null => {\n if (resetAfterSeconds === null || resetAfterSeconds === undefined) {\n return null;\n }\n\n return now + resetAfterSeconds * 1000;\n};\n\nexport const formatDuration = (seconds: number): string => {\n if (seconds <= 0) {\n return '0s';\n }\n\n const weeks = Math.floor(seconds / 604800);\n const days = Math.floor((seconds % 604800) / 86400);\n const hours = Math.floor((seconds % 86400) / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const secs = seconds % 60;\n\n const parts: string[] = [];\n if (weeks > 0) parts.push(`${weeks}w`);\n if (days > 0) parts.push(`${days}d`);\n if (hours > 0) parts.push(`${hours}h`);\n if (minutes > 0) parts.push(`${minutes}m`);\n if (secs > 0 || parts.length === 0) parts.push(`${secs}s`);\n\n return parts.join(' ');\n};\n\nexport const formatResetAt = (resetAtMs: number): string => {\n return new Date(resetAtMs).toLocaleString(undefined, {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric',\n timeZoneName: 'short',\n });\n};\n", "import type { ProviderAlias, ProviderId } from '../../types/index.ts';\n\nexport const PROVIDER_ALIASES: Record<ProviderId, ProviderAlias[]> = {\n openai: ['openai', 'codex', 'chatgpt'],\n google: ['google', 'antigravity'],\n 'zai-coding-plan': ['zai-coding-plan', 'zai', 'z.ai'],\n};\n\nexport const parseProvider = (input?: string): ProviderId | null => {\n if (!input) {\n return null;\n }\n\n const normalized = input.trim().toLowerCase();\n for (const [providerId, aliases] of Object.entries(PROVIDER_ALIASES)) {\n if (aliases.includes(normalized as ProviderAlias)) {\n return providerId as ProviderId;\n }\n }\n\n return null;\n};\n\nexport const getProviderAliases = (provider: ProviderId): ProviderAlias[] => {\n return PROVIDER_ALIASES[provider];\n};\n", "import type {\n AntigravityAccount,\n AntigravityAccountsFile,\n OpenCodeAuth,\n ProviderAuthData,\n} from '../../types/index.ts';\nimport type { Logger } from '../common/logger.ts';\nimport { AUTH_PATHS, loadOpenCodeAuth, readJson } from '../common/files.ts';\nimport { getProviderAliases } from '../common/registry.ts';\n\nexport interface GoogleAuthContext {\n refreshToken?: string;\n accessToken?: string;\n expires?: number;\n projectId?: string;\n email?: string;\n}\n\nconst toAuthData = (entry: OpenCodeAuth[string]): ProviderAuthData | null => {\n if (!entry) {\n return null;\n }\n\n if (typeof entry === 'string') {\n return { token: entry };\n }\n\n if (typeof entry === 'object') {\n return entry as ProviderAuthData;\n }\n\n return null;\n};\n\nconst loadOpenCodeAuthEntry = async (logger?: Logger): Promise<ProviderAuthData | null> => {\n const auth = await loadOpenCodeAuth(logger);\n if (!auth) {\n return null;\n }\n\n for (const alias of getProviderAliases('google')) {\n const entry = toAuthData(auth[alias]);\n if (entry) {\n return entry;\n }\n }\n\n return null;\n};\n\nconst toAuthContext = (entry: ProviderAuthData | null): GoogleAuthContext | null => {\n if (!entry) {\n return null;\n }\n\n const accessToken = entry.access ?? entry.token;\n let refreshToken = entry.refresh;\n let projectId: string | undefined = undefined;\n\n if (refreshToken && refreshToken.includes('|')) {\n const parts = refreshToken.split('|');\n refreshToken = parts[0];\n projectId = parts[1];\n }\n\n if (!accessToken && !refreshToken) {\n return null;\n }\n\n return {\n accessToken,\n refreshToken,\n expires: entry.expires,\n projectId,\n };\n};\n\nconst selectAccount = (accounts: AntigravityAccountsFile | null): AntigravityAccount | null => {\n if (!accounts?.accounts?.length) {\n return null;\n }\n\n const candidateIndex = accounts.activeIndex ?? 0;\n const account = accounts.accounts[candidateIndex] ?? accounts.accounts[0];\n return account ?? null;\n};\n\nconst loadAuthFromAccounts = async (logger?: Logger): Promise<GoogleAuthContext | null> => {\n const configAccounts = await readJson<AntigravityAccountsFile>(\n AUTH_PATHS.antigravityConfig(),\n logger\n );\n const account = selectAccount(configAccounts);\n if (account) {\n return {\n refreshToken: account.refreshToken,\n projectId: account.projectId ?? account.managedProjectId,\n email: account.email,\n };\n }\n\n const dataAccounts = await readJson<AntigravityAccountsFile>(\n AUTH_PATHS.antigravityData(),\n logger\n );\n const fallbackAccount = selectAccount(dataAccounts);\n if (!fallbackAccount) {\n return null;\n }\n\n return {\n refreshToken: fallbackAccount.refreshToken,\n projectId: fallbackAccount.projectId ?? fallbackAccount.managedProjectId,\n email: fallbackAccount.email,\n };\n};\n\nexport const getGoogleAuth = async (logger?: Logger): Promise<GoogleAuthContext | null> => {\n const openCodeAuth = await loadOpenCodeAuthEntry(logger);\n const authContext = toAuthContext(openCodeAuth);\n if (authContext) {\n return authContext;\n }\n\n return loadAuthFromAccounts(logger);\n};\n", "import type { ProviderResult, ProviderUsage, UsageWindow } from '../../types/index.ts';\nimport { maskSecret, type Logger, noopLogger } from '../common/logger.ts';\nimport { calculateResetAfterSeconds, formatDuration, formatResetAt } from '../common/time.ts';\nimport { getGoogleAuth } from './auth.ts';\n\nconst GOOGLE_CLIENT_ID =\n '1071006060591-tmhssin2h21lcre235vtolojh4g403ep.apps.googleusercontent.com';\nconst GOOGLE_CLIENT_SECRET = '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';\nconst DEFAULT_PROJECT_ID = 'rising-fact-p41fc';\nconst WINDOW_SECONDS = 5 * 60 * 60;\n\nconst ENDPOINTS: readonly string[] = [\n 'https://daily-cloudcode-pa.sandbox.googleapis.com',\n 'https://autopush-cloudcode-pa.sandbox.googleapis.com',\n 'https://cloudcode-pa.googleapis.com',\n];\n\nconst HEADERS = {\n 'User-Agent': 'antigravity/1.11.5 windows/amd64',\n 'X-Goog-Api-Client': 'google-cloud-sdk vscode_cloudshelleditor/0.1',\n 'Client-Metadata':\n '{\"ideType\":\"IDE_UNSPECIFIED\",\"platform\":\"PLATFORM_UNSPECIFIED\",\"pluginType\":\"GEMINI\"}',\n} as const;\n\ninterface TokenResponse {\n access_token: string;\n expires_in?: number;\n}\n\ninterface ModelUsageInfoResponse {\n displayName?: string;\n quotaInfo?: {\n remainingFraction?: number;\n resetTime?: string;\n };\n}\n\ninterface ModelsResponse {\n models?: Record<string, ModelUsageInfoResponse>;\n}\n\nconst refreshAccessToken = async (\n refreshToken: string,\n logger: Logger\n): Promise<TokenResponse | null> => {\n try {\n const response = await fetch('https://oauth2.googleapis.com/token', {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({\n client_id: GOOGLE_CLIENT_ID,\n client_secret: GOOGLE_CLIENT_SECRET,\n refresh_token: refreshToken,\n grant_type: 'refresh_token',\n }),\n });\n\n if (!response.ok) {\n await logger.warn('Failed to refresh OAuth token for google', {\n status: response.status,\n token: maskSecret(refreshToken),\n });\n return null;\n }\n\n return (await response.json()) as TokenResponse;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n await logger.warn(`Token refresh failed for google: ${message}`);\n return null;\n }\n};\n\nconst fetchModels = async (\n accessToken: string,\n projectId: string | undefined,\n logger: Logger\n): Promise<ModelsResponse | null> => {\n const body = projectId ? { project: projectId } : {};\n\n for (const endpoint of ENDPOINTS) {\n try {\n const response = await fetch(`${endpoint}/v1internal:fetchAvailableModels`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n ...HEADERS,\n },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(15000),\n });\n\n if (response.ok) {\n await logger.debug(`Fetched models from ${endpoint}`, { projectId });\n return (await response.json()) as ModelsResponse;\n }\n } catch {\n continue;\n }\n }\n\n await logger.error('Failed to fetch models from all google endpoints', { projectId });\n return null;\n};\n\nconst toWindow = (remainingFraction?: number, resetTime?: string): UsageWindow => {\n const remainingPercent =\n remainingFraction !== undefined ? Math.round(remainingFraction * 100) : null;\n const usedPercent = remainingPercent !== null ? Math.max(0, 100 - remainingPercent) : null;\n const resetAt = resetTime ? new Date(resetTime).getTime() : null;\n const resetAfterSeconds = calculateResetAfterSeconds(resetAt);\n\n return {\n usedPercent,\n remainingPercent,\n windowSeconds: WINDOW_SECONDS,\n resetAfterSeconds,\n resetAt,\n resetAtFormatted: resetAt ? formatResetAt(resetAt) : null,\n resetAfterFormatted: resetAfterSeconds !== null ? formatDuration(resetAfterSeconds) : null,\n };\n};\n\nconst buildUsage = (data: ModelsResponse): ProviderUsage => {\n const models: Record<string, { windows: Record<string, UsageWindow> }> = {};\n\n for (const [modelName, modelData] of Object.entries(data.models ?? {})) {\n const window = toWindow(modelData.quotaInfo?.remainingFraction, modelData.quotaInfo?.resetTime);\n models[modelName] = {\n windows: {\n '5h': window,\n },\n };\n }\n\n return {\n windows: {},\n models: Object.keys(models).length ? models : undefined,\n };\n};\n\nconst resolveAccessToken = async (\n refreshToken: string | undefined,\n accessToken: string | undefined,\n expires: number | undefined,\n logger: Logger\n): Promise<string | null> => {\n const now = Date.now();\n\n if (accessToken && (!expires || expires > now)) {\n return accessToken;\n }\n\n if (!refreshToken) {\n return null;\n }\n\n const refreshed = await refreshAccessToken(refreshToken, logger);\n return refreshed?.access_token ?? null;\n};\n\nexport const fetchGoogleUsage = async (logger: Logger = noopLogger): Promise<ProviderResult> => {\n const auth = await getGoogleAuth(logger);\n\n if (!auth) {\n await logger.warn('No auth configured for google');\n return {\n provider: 'google',\n ok: false,\n configured: false,\n error: 'Not configured - no accounts found',\n usage: null,\n };\n }\n\n const accessToken = await resolveAccessToken(\n auth.refreshToken,\n auth.accessToken,\n auth.expires,\n logger\n );\n\n if (!accessToken) {\n await logger.warn('Failed to refresh OAuth token for google', { email: auth.email });\n return {\n provider: 'google',\n ok: false,\n configured: true,\n error: 'Failed to refresh OAuth token',\n usage: null,\n };\n }\n\n const projectId = auth.projectId ?? DEFAULT_PROJECT_ID;\n const modelsData = await fetchModels(accessToken, projectId, logger);\n\n if (!modelsData) {\n await logger.error('Failed to fetch models from google API', { projectId });\n return {\n provider: 'google',\n ok: false,\n configured: true,\n error: 'Failed to fetch models from API',\n usage: null,\n };\n }\n\n await logger.info('google usage fetched successfully');\n\n return {\n provider: 'google',\n ok: true,\n configured: true,\n usage: buildUsage(modelsData),\n };\n};\n", "import type { Logger } from '../common/logger.ts';\nimport type { OpenCodeAuth, ProviderAuthData } from '../../types/index.ts';\nimport { AUTH_PATHS, loadOpenCodeAuth, readJson } from '../common/files.ts';\nimport { getProviderAliases } from '../common/registry.ts';\n\nconst toAuthData = (entry: OpenCodeAuth[string]): ProviderAuthData | null => {\n if (!entry) {\n return null;\n }\n\n if (typeof entry === 'string') {\n return { token: entry };\n }\n\n if (typeof entry === 'object') {\n return entry as ProviderAuthData;\n }\n\n return null;\n};\n\nconst hasAccessToken = (auth: ProviderAuthData | null): auth is ProviderAuthData => {\n return Boolean(auth?.access || auth?.token);\n};\n\nconst loadOpenCodeAuthEntry = async (logger?: Logger): Promise<ProviderAuthData | null> => {\n const auth = await loadOpenCodeAuth(logger);\n if (!auth) {\n return null;\n }\n\n for (const alias of getProviderAliases('openai')) {\n const entry = toAuthData(auth[alias]);\n if (entry && hasAccessToken(entry)) {\n return entry;\n }\n }\n\n return null;\n};\n\nexport const getOpenaiAuth = async (logger?: Logger): Promise<ProviderAuthData | null> => {\n const openCodeAuth = await loadOpenCodeAuthEntry(logger);\n if (openCodeAuth && hasAccessToken(openCodeAuth)) {\n return openCodeAuth;\n }\n\n const pluginAuth = await readJson<ProviderAuthData>(AUTH_PATHS.openaiPlugin(), logger);\n if (pluginAuth && hasAccessToken(pluginAuth)) {\n return pluginAuth;\n }\n\n return null;\n};\n", "import type { ProviderResult, ProviderUsage, UsageWindow } from '../../types/index.ts';\nimport { maskSecret, type Logger, noopLogger } from '../common/logger.ts';\nimport { calculateResetAfterSeconds, formatDuration, formatResetAt } from '../common/time.ts';\nimport { getOpenaiAuth } from './auth.ts';\n\ninterface OpenaiBackendWindow {\n used_percent: number;\n limit_window_seconds: number;\n reset_after_seconds: number;\n reset_at: number;\n}\n\ninterface OpenaiBackendResponse {\n plan_type: string;\n rate_limit: {\n allowed: boolean;\n limit_reached: boolean;\n primary_window?: OpenaiBackendWindow;\n secondary_window?: OpenaiBackendWindow;\n };\n}\n\nconst toWindow = (window?: OpenaiBackendWindow): UsageWindow | null => {\n if (!window) {\n return null;\n }\n\n const usedPercent = window.used_percent;\n const resetAt = window.reset_at ? window.reset_at * 1000 : null;\n const resetAfterSeconds = window.reset_after_seconds ?? calculateResetAfterSeconds(resetAt);\n\n return {\n usedPercent,\n remainingPercent: Math.max(0, 100 - usedPercent),\n windowSeconds: window.limit_window_seconds ?? null,\n resetAfterSeconds,\n resetAt,\n resetAtFormatted: resetAt ? formatResetAt(resetAt) : null,\n resetAfterFormatted: resetAfterSeconds !== null ? formatDuration(resetAfterSeconds) : null,\n };\n};\n\nexport const fetchOpenaiUsage = async (logger: Logger = noopLogger): Promise<ProviderResult> => {\n const auth = await getOpenaiAuth(logger);\n\n if (!auth) {\n await logger.warn('No auth configured for openai');\n return {\n provider: 'openai',\n ok: false,\n configured: false,\n error: 'Not configured - no OAuth token found',\n usage: null,\n };\n }\n\n const accessToken = auth.access ?? auth.token;\n if (!accessToken) {\n await logger.warn('Auth configured but access token missing for openai');\n return {\n provider: 'openai',\n ok: false,\n configured: false,\n error: 'Not configured - access token missing',\n usage: null,\n };\n }\n\n try {\n const response = await fetch('https://chatgpt.com/backend-api/wham/usage', {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n await logger.error(`API error ${response.status} for openai`, {\n token: maskSecret(accessToken),\n });\n return {\n provider: 'openai',\n ok: false,\n configured: true,\n error: `API error: ${response.status}`,\n usage: null,\n };\n }\n\n const payload = (await response.json()) as OpenaiBackendResponse;\n const primary = toWindow(payload.rate_limit.primary_window);\n const secondary = toWindow(payload.rate_limit.secondary_window);\n\n const windows: Record<string, UsageWindow> = {};\n if (primary) {\n windows['5h'] = primary;\n }\n if (secondary) {\n windows['weekly'] = secondary;\n }\n\n const usage: ProviderUsage = {\n windows,\n };\n\n await logger.info('openai usage fetched successfully');\n\n return {\n provider: 'openai',\n ok: true,\n configured: true,\n usage,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n await logger.error(`Request failed for openai: ${message}`);\n return {\n provider: 'openai',\n ok: false,\n configured: true,\n error: `Request failed: ${message}`,\n usage: null,\n };\n }\n};\n", "import type { Logger } from '../common/logger.ts';\nimport type { OpenCodeAuth } from '../../types/index.ts';\nimport { loadOpenCodeAuth } from '../common/files.ts';\nimport { getProviderAliases } from '../common/registry.ts';\n\nconst resolveAuthValue = (entry: OpenCodeAuth[string]): string | null => {\n if (!entry) {\n return null;\n }\n\n if (typeof entry === 'string') {\n return entry;\n }\n\n if (typeof entry === 'object') {\n return entry.api_key ?? entry.token ?? entry.key ?? null;\n }\n\n return null;\n};\n\nexport const getZaiApiKey = async (logger?: Logger): Promise<string | null> => {\n if (process.env.ZAI_API_KEY) {\n return process.env.ZAI_API_KEY;\n }\n\n const auth = await loadOpenCodeAuth(logger);\n if (!auth) {\n return null;\n }\n\n for (const alias of getProviderAliases('zai-coding-plan')) {\n const value = resolveAuthValue(auth[alias]);\n if (value) {\n return value;\n }\n }\n\n return null;\n};\n", "import type { ProviderResult, ProviderUsage, UsageWindow } from '../../types/index.ts';\nimport { maskSecret, type Logger, noopLogger } from '../common/logger.ts';\nimport { calculateResetAfterSeconds, formatDuration, formatResetAt } from '../common/time.ts';\nimport { getZaiApiKey } from './auth.ts';\n\ninterface ZaiLimit {\n type: 'TIME_LIMIT' | 'TOKENS_LIMIT';\n unit: number;\n number: number;\n usage: number;\n currentValue: number;\n remaining: number;\n percentage: number;\n nextResetTime?: number;\n}\n\ninterface ZaiUsageResponse {\n code: number;\n msg: string;\n data?: {\n limits?: ZaiLimit[];\n };\n success: boolean;\n}\n\nconst normalizeTimestamp = (value: number): number => {\n return value < 1_000_000_000_000 ? value * 1000 : value;\n};\n\nconst TOKEN_WINDOW_SECONDS: Record<number, number> = {\n 3: 3600,\n};\n\nconst resolveWindowSeconds = (limit?: ZaiLimit): number | null => {\n if (!limit) {\n return null;\n }\n\n if (!limit.number) {\n return null;\n }\n\n const unitSeconds = TOKEN_WINDOW_SECONDS[limit.unit];\n if (!unitSeconds) {\n return null;\n }\n\n return unitSeconds * limit.number;\n};\n\nconst resolveWindowLabel = (windowSeconds: number | null): string => {\n if (!windowSeconds) {\n return 'tokens';\n }\n\n if (windowSeconds % 86400 === 0) {\n const days = windowSeconds / 86400;\n return days === 7 ? 'weekly' : `${days}d`;\n }\n\n if (windowSeconds % 3600 === 0) {\n return `${windowSeconds / 3600}h`;\n }\n\n return `${windowSeconds}s`;\n};\n\nconst toWindow = (limit?: ZaiLimit): UsageWindow | null => {\n if (!limit) {\n return null;\n }\n\n const usedPercent = limit.percentage ?? null;\n const remainingPercent = usedPercent !== null ? Math.max(0, 100 - usedPercent) : null;\n const resetAt = limit.nextResetTime ? normalizeTimestamp(limit.nextResetTime) : null;\n const resetAfterSeconds = calculateResetAfterSeconds(resetAt);\n\n return {\n usedPercent,\n remainingPercent,\n windowSeconds: resolveWindowSeconds(limit),\n resetAfterSeconds,\n resetAt,\n resetAtFormatted: resetAt ? formatResetAt(resetAt) : null,\n resetAfterFormatted: resetAfterSeconds !== null ? formatDuration(resetAfterSeconds) : null,\n };\n};\n\nexport const fetchZaiUsage = async (logger: Logger = noopLogger): Promise<ProviderResult> => {\n const apiKey = await getZaiApiKey(logger);\n\n if (!apiKey) {\n await logger.warn('No auth configured for zai-coding-plan');\n return {\n provider: 'zai-coding-plan',\n ok: false,\n configured: false,\n error: 'Not configured - no API key found',\n usage: null,\n };\n }\n\n try {\n const response = await fetch('https://api.z.ai/api/monitor/usage/quota/limit', {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n await logger.error(`API error ${response.status} for zai-coding-plan`, {\n token: maskSecret(apiKey),\n });\n return {\n provider: 'zai-coding-plan',\n ok: false,\n configured: true,\n error: `API error: ${response.status}`,\n usage: null,\n };\n }\n\n const payload = (await response.json()) as ZaiUsageResponse;\n const limits = payload.data?.limits ?? [];\n const tokensLimit = limits.find((limit) => limit.type === 'TOKENS_LIMIT');\n\n const windows: Record<string, UsageWindow> = {};\n const window = toWindow(tokensLimit);\n if (window) {\n const label = resolveWindowLabel(window.windowSeconds);\n windows[label] = window;\n }\n\n const usage: ProviderUsage = {\n windows,\n };\n\n await logger.info('zai-coding-plan usage fetched successfully');\n\n return {\n provider: 'zai-coding-plan',\n ok: true,\n configured: true,\n usage,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n await logger.error(`Request failed for zai-coding-plan: ${message}`);\n return {\n provider: 'zai-coding-plan',\n ok: false,\n configured: true,\n error: `Request failed: ${message}`,\n usage: null,\n };\n }\n};\n", "export type ProviderId = 'openai' | 'google' | 'zai-coding-plan';\n\nexport type ProviderAlias = ProviderId | 'codex' | 'antigravity' | 'zai' | 'z.ai' | 'chatgpt';\n\nexport type ProviderIdValues = 'openai' | 'google' | 'zai-coding-plan';\n\nexport const PROVIDERS: ProviderIdValues[] = ['openai', 'google', 'zai-coding-plan'];\n\nexport type OpenCodeAuth = Record<string, string | ProviderAuthData>;\n\nexport interface ProviderAuthData {\n type?: 'oauth' | 'api' | string;\n access?: string;\n refresh?: string;\n expires?: number;\n api_key?: string;\n token?: string;\n key?: string;\n accountId?: string;\n}\n", "export type StatusEmoji = '\uD83D\uDD34' | '\uD83D\uDFE1' | '\uD83D\uDFE2' | '\u26AA';\n\nexport type StatusText = 'Critical' | 'Warning' | 'OK' | 'N/A';\n\nexport interface DashboardWindow {\n label: string;\n usedPercent: number | null;\n remainingPercent: number | null;\n status: StatusEmoji;\n statusText: StatusText;\n resetsIn: string;\n}\n\nexport interface DashboardSection {\n title: string;\n windows: DashboardWindow[];\n sections?: DashboardSection[];\n}\n\nexport interface DashboardProvider {\n name: string;\n sections: DashboardSection[];\n}\n\nexport interface DashboardData {\n providers: DashboardProvider[];\n}\n", "export type { ProviderId, ProviderAlias, OpenCodeAuth, ProviderAuthData } from './provider.ts';\nexport { PROVIDERS } from './provider.ts';\nexport type { UsageWindow, UsageWindows, ProviderUsage, ProviderResult } from './usage.ts';\nexport type { AntigravityAccount, AntigravityAccountsFile } from './google.ts';\nexport type { ToastUsageResult } from './toast.ts';\nexport * from './dashboard.js';\n", "import { fetchGoogleUsage } from '../providers/google/fetch.ts';\nimport { fetchOpenaiUsage } from '../providers/openai/fetch.ts';\nimport { fetchZaiUsage } from '../providers/zai-coding-plan/fetch.ts';\nimport type { Logger } from '../providers/common/logger.ts';\nimport { PROVIDERS, type ProviderId, type ProviderResult } from '../types/index.ts';\nimport { readCache, writeCache } from './file.ts';\nimport { REFRESH_INTERVAL_SECONDS, SCHEMA_VERSION, type CacheSchema } from './types.ts';\n\nconst fetchUsage = async (provider: ProviderId, logger: Logger): Promise<ProviderResult> => {\n switch (provider) {\n case 'openai':\n return fetchOpenaiUsage(logger);\n case 'google':\n return fetchGoogleUsage(logger);\n case 'zai-coding-plan':\n return fetchZaiUsage(logger);\n }\n};\n\nexport const fetchAllProviders = async (logger: Logger): Promise<CacheSchema> => {\n await logger.info('Fetching usage for all providers');\n\n const existingCache = await readCache(logger);\n\n const results = await Promise.all(PROVIDERS.map((provider) => fetchUsage(provider, logger)));\n\n const providers: Record<ProviderId, CacheSchema['providers'][ProviderId]> = {} as Record<\n ProviderId,\n CacheSchema['providers'][ProviderId]\n >;\n\n const now = new Date().toISOString();\n\n for (const result of results) {\n const providerId = result.provider;\n const wasConfigured = existingCache?.providers[providerId]?.configured ?? false;\n\n providers[providerId] = {\n supported: true,\n configured: result.configured,\n last_attempt_at: now,\n last_success_at: result.ok ? now : null,\n data: result.ok ? result.usage : null,\n error: result.ok ? null : (result.error ?? null),\n };\n\n if (!result.configured && wasConfigured) {\n providers[providerId].data = null;\n await logger.debug(`Wiped data for ${providerId} (no longer configured)`);\n }\n }\n\n const cache: CacheSchema = {\n schema_version: SCHEMA_VERSION,\n updated_at: now,\n refresh_interval_seconds: REFRESH_INTERVAL_SECONDS,\n providers,\n };\n\n await writeCache(cache, logger);\n return cache;\n};\n", "import type { Logger } from '../providers/common/logger.ts';\nimport { fetchAllProviders } from './fetcher.ts';\nimport { REFRESH_INTERVAL_SECONDS } from './types.ts';\n\nlet intervalId: ReturnType<typeof globalThis.setInterval> | null = null;\n\nexport const startWorker = (logger: Logger): void => {\n if (intervalId !== null) {\n logger.warn('Worker already started');\n return;\n }\n\n const refreshLoop = async (): Promise<void> => {\n try {\n await fetchAllProviders(logger);\n } catch (error) {\n await logger.error('Worker refresh failed', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n };\n\n void refreshLoop();\n\n intervalId = globalThis.setInterval(refreshLoop, REFRESH_INTERVAL_SECONDS * 1000);\n\n void logger.info(`Worker started, refreshing every ${REFRESH_INTERVAL_SECONDS}s`);\n};\n\nexport const stopWorker = (logger: Logger): void => {\n if (intervalId === null) {\n return;\n }\n\n globalThis.clearInterval(intervalId);\n intervalId = null;\n\n void logger.info('Worker stopped');\n};\n\nexport const isWorkerRunning = (): boolean => intervalId !== null;\n", "import type { Plugin } from '@opencode-ai/plugin';\nimport { tool } from '@opencode-ai/plugin';\nimport { createLogger } from './providers/common/logger.ts';\nimport { formatDashboardData, formatDashboardString } from './dashboard/format.ts';\nimport { formatUsageToast } from './toast/format.ts';\n\nexport const UsagePlugin: Plugin = async ({ client }) => {\n const logger = createLogger(client);\n\n const usageToastTool = tool({\n description: 'Show subscription usage as toast for OpenAI, Google, and z.ai providers',\n args: {},\n async execute() {\n const { loadCacheForDisplay } = await import('./cache/reader.ts');\n\n await logger.info('Loading usage from cache');\n\n const displayCache = await loadCacheForDisplay(logger);\n\n const toast = await formatUsageToast(displayCache, logger);\n\n await client.tui.showToast({\n body: {\n title: toast.title,\n message: toast.message,\n variant: toast.variant,\n },\n });\n\n return 'Usage displayed';\n },\n });\n\n const usageTableTool = tool({\n description:\n 'Get subscription usage data for OpenAI, Google, and z.ai providers as a formatted table',\n args: {},\n async execute() {\n const { loadCacheForDisplay } = await import('./cache/reader.ts');\n\n await logger.info('Loading usage from cache');\n\n const displayCache = await loadCacheForDisplay(logger);\n\n if (!displayCache) {\n return 'No cache available';\n }\n\n const dashboardData = formatDashboardData(displayCache);\n\n return formatDashboardString(dashboardData, displayCache.updatedAt, displayCache.isStale);\n },\n });\n\n return {\n tool: {\n usage_toast: usageToastTool,\n usage_table: usageTableTool,\n },\n async event({ event }) {\n if (event.type === 'server.connected') {\n const { startWorker } = await import('./cache/worker.ts');\n startWorker(logger);\n }\n },\n async config(config) {\n config.command = config.command ?? {};\n\n config.command['usage-toast'] = {\n template: 'Call the usage_toast tool.',\n description: 'Show subscription usage as toast notification',\n };\n\n config.command.usage = {\n template: 'Call the usage_table tool and display the formatted table.',\n description: 'Show subscription usage as formatted table',\n };\n },\n };\n};\n\nconst setupShutdownHandlers = async (): Promise<void> => {\n const { isWorkerRunning, stopWorker } = await import('./cache/worker.ts');\n const { createLogger } = await import('./providers/common/logger.ts');\n const logger = createLogger({\n app: { log: () => Promise.resolve(true) },\n } as unknown as Parameters<typeof createLogger>[0]);\n\n const onShutdown = async (): Promise<void> => {\n if (await isWorkerRunning()) {\n stopWorker(logger);\n }\n };\n\n process.on('SIGINT', onShutdown);\n process.on('SIGTERM', onShutdown);\n process.on('exit', onShutdown);\n};\n\nvoid setupShutdownHandlers();\n\nexport default UsagePlugin;\n", "import type { UsageWindows } from '../types/index.js';\n\nconst FLAGSHIP_PATTERNS: RegExp[] = [\n /claude[-\\s]*opus[-\\s]*4[-\\s.]?5/i,\n /gemini[-\\s]*3[-\\s.]?pro/i,\n /gemini[-\\s]*3[-\\s.]?flash/i,\n];\n\nexport const isFlagshipModel = (modelName: string): boolean => {\n return FLAGSHIP_PATTERNS.some((pattern) => pattern.test(modelName));\n};\n\nexport const filterFlagshipModels = (\n models?: Record<string, UsageWindows>\n): Record<string, UsageWindows> => {\n if (!models) {\n return {};\n }\n\n const filtered: Record<string, UsageWindows> = {};\n\n for (const [modelName, modelData] of Object.entries(models)) {\n if (isFlagshipModel(modelName)) {\n filtered[modelName] = modelData;\n }\n }\n\n return filtered;\n};\n", "import type { ProviderResult, UsageWindow } from '../types/index.ts';\nimport type { DisplayCache } from '../cache/reader.ts';\nimport type {\n DashboardData,\n DashboardProvider,\n DashboardSection,\n DashboardWindow,\n StatusEmoji,\n StatusText,\n} from '../types/dashboard.ts';\nimport { filterFlagshipModels } from '../toast/filter.ts';\n\nconst getStatus = (remainingPercent: number | null): { emoji: StatusEmoji; text: StatusText } => {\n if (remainingPercent === null) {\n return { emoji: '\u26AA', text: 'N/A' };\n }\n\n if (remainingPercent < 10) {\n return { emoji: '\uD83D\uDD34', text: 'Critical' };\n }\n\n if (remainingPercent < 30) {\n return { emoji: '\uD83D\uDFE1', text: 'Warning' };\n }\n\n return { emoji: '\uD83D\uDFE2', text: 'OK' };\n};\n\nexport const formatWindowLabel = (key: string): string => {\n switch (key) {\n case '5h':\n return '5h Window';\n case 'weekly':\n return 'Weekly Window';\n default:\n return `${key} Window`;\n }\n};\n\nexport const renderBar = (percent: number | null, width: number = 20): string => {\n if (percent === null) {\n return `[${'\u2591'.repeat(width)}]`;\n }\n\n // Clamp percent between 0 and 100\n const validPercent = Math.max(0, Math.min(100, percent));\n const filledLength = Math.round((validPercent / 100) * width);\n const emptyLength = width - filledLength;\n\n return `[${'\u2588'.repeat(filledLength)}${'\u2591'.repeat(emptyLength)}]`;\n};\n\nconst formatWindow = (key: string, window: UsageWindow): DashboardWindow => {\n const remainingPercent = window.remainingPercent ?? null;\n const { emoji, text } = getStatus(remainingPercent);\n\n return {\n label: formatWindowLabel(key),\n usedPercent: window.usedPercent ?? null,\n remainingPercent,\n status: emoji,\n statusText: text,\n resetsIn: window.resetAfterFormatted ?? 'N/A',\n };\n};\n\nexport const formatDashboardData = (\n input: ProviderResult[] | DisplayCache | null\n): DashboardData => {\n if (input === null) {\n return { providers: [] };\n }\n\n if (!('providers' in input)) {\n return formatDashboardDataFromResults(input);\n }\n\n return formatDashboardDataFromCache(input);\n};\n\nconst formatDashboardDataFromResults = (results: ProviderResult[]): DashboardData => {\n const providers: DashboardProvider[] = [];\n\n for (const result of results) {\n if (!result.usage) {\n continue;\n }\n\n const sections: DashboardSection[] = [];\n let usage = result.usage;\n\n if (result.provider === 'google' && usage.models) {\n usage = {\n ...usage,\n models: filterFlagshipModels(usage.models),\n };\n }\n\n const globalWindows = Object.entries(usage.windows);\n if (globalWindows.length > 0) {\n sections.push({\n title: 'Overall Usage',\n windows: globalWindows.map(([key, win]) => formatWindow(key, win)),\n });\n }\n\n if (usage.models) {\n const modelSections: DashboardSection[] = [];\n for (const [modelName, modelUsage] of Object.entries(usage.models)) {\n const modelWindowEntries = Object.entries(modelUsage.windows);\n if (modelWindowEntries.length > 0) {\n modelSections.push({\n title: modelName,\n windows: modelWindowEntries.map(([key, win]) => formatWindow(key, win)),\n });\n }\n }\n\n if (modelSections.length > 0) {\n sections.push({\n title: 'Model Usage',\n windows: [],\n sections: modelSections,\n });\n }\n }\n\n if (sections.length > 0) {\n providers.push({\n name: result.provider.toUpperCase().replace(/-/g, ' '),\n sections,\n });\n }\n }\n\n return { providers };\n};\n\nconst formatDashboardDataFromCache = (displayCache: DisplayCache): DashboardData => {\n const providers: DashboardProvider[] = [];\n\n for (const [providerId, entry] of Object.entries(displayCache.providers)) {\n if (!entry.data) {\n continue;\n }\n\n const sections: DashboardSection[] = [];\n let usage = entry.data;\n\n if (providerId === 'google' && usage.models) {\n usage = {\n ...usage,\n models: filterFlagshipModels(usage.models),\n };\n }\n\n const globalWindows = Object.entries(usage.windows);\n if (globalWindows.length > 0) {\n sections.push({\n title: 'Overall Usage',\n windows: globalWindows.map(([key, win]) => formatWindow(key, win)),\n });\n }\n\n if (usage.models) {\n const modelSections: DashboardSection[] = [];\n for (const [modelName, modelUsage] of Object.entries(usage.models)) {\n const modelWindowEntries = Object.entries(modelUsage.windows);\n if (modelWindowEntries.length > 0) {\n modelSections.push({\n title: modelName,\n windows: modelWindowEntries.map(([key, win]) => formatWindow(key, win)),\n });\n }\n }\n\n if (modelSections.length > 0) {\n sections.push({\n title: 'Model Usage',\n windows: [],\n sections: modelSections,\n });\n }\n }\n\n if (sections.length > 0) {\n providers.push({\n name: providerId.toUpperCase().replace(/-/g, ' '),\n sections,\n });\n }\n }\n\n return { providers };\n};\n\nexport const formatDashboardString = (\n data: DashboardData,\n updatedAt?: string,\n isStale?: boolean\n): string => {\n if (data.providers.length === 0) {\n let result = 'No usage data available';\n if (updatedAt) {\n result += `\\n\\nUpdated at: ${updatedAt}`;\n }\n return result;\n }\n\n const lines: string[] = [];\n const HEADER_WIDTH = 65; // Adjust as needed to match 70 chars total roughly\n\n for (const provider of data.providers) {\n // Header: PROVIDER \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Calculate padding for dash line\n const providerName = provider.name;\n const dashCount = Math.max(0, HEADER_WIDTH - providerName.length - 1);\n lines.push(`${providerName} ${'\u2500'.repeat(dashCount)}`);\n\n for (let i = 0; i < provider.sections.length; i++) {\n const section = provider.sections[i];\n // Section title (e.g., Overall Usage or Model Usage)\n lines.push(section.title);\n\n // Render direct windows (e.g. Overall Usage)\n for (let j = 0; j < section.windows.length; j++) {\n const window = section.windows[j];\n const isLastWindow = j === section.windows.length - 1;\n\n const branch = isLastWindow ? '\u2514\u2500' : '\u251C\u2500';\n const pipe = isLastWindow ? ' ' : '\u2502 ';\n\n // Line 1: Label\n lines.push(` ${branch} ${window.label}`);\n\n // Line 2: Progress Bar + Percent + Reset\n const percentStr =\n window.usedPercent !== null ? `${Math.round(window.usedPercent)}%` : 'N/A';\n lines.push(\n ` ${pipe} ${renderBar(window.usedPercent)} ${percentStr} \u2022 Resets in ${window.resetsIn}`\n );\n\n // Spacer line unless it's the very last window of the section\n if (!isLastWindow) {\n lines.push(` ${pipe}`);\n }\n }\n\n // Render nested sections (e.g. Models)\n if (section.sections) {\n for (let k = 0; k < section.sections.length; k++) {\n const subsection = section.sections[k];\n const isLastSubsection = k === section.sections.length - 1;\n const branch = isLastSubsection ? '\u2514\u2500' : '\u251C\u2500';\n const pipe = isLastSubsection ? ' ' : '\u2502 ';\n\n lines.push(` ${branch} ${subsection.title}`);\n\n for (let m = 0; m < subsection.windows.length; m++) {\n const window = subsection.windows[m];\n const isLastWindow = m === subsection.windows.length - 1;\n\n // Indent deeper for windows under a model\n const subBranch = isLastWindow ? '\u2514\u2500' : '\u251C\u2500';\n // If we are in the last subsection, the parent pipe is space\n // If we are NOT in the last subsection, the parent pipe is \u2502\n // Wait, we need to pass down the \"continuation\" context\n\n // Line 1: Label\n lines.push(` ${pipe} ${subBranch} ${window.label}`);\n\n // Line 2\n const percentStr =\n window.usedPercent !== null ? `${Math.round(window.usedPercent)}%` : 'N/A';\n const subPipe = isLastWindow ? ' ' : '\u2502 ';\n\n lines.push(\n ` ${pipe} ${subPipe} ${renderBar(window.usedPercent)} ${percentStr} \u2022 Resets in ${window.resetsIn}`\n );\n\n if (!isLastWindow) {\n lines.push(` ${pipe} ${subPipe}`);\n }\n }\n\n if (!isLastSubsection) {\n lines.push(` ${pipe}`);\n }\n }\n }\n\n // Add empty line after section\n lines.push('');\n }\n }\n\n let result = lines.join('\\n').trim();\n\n if (updatedAt) {\n result += `\\n\\nUpdated at: ${updatedAt}`;\n }\n\n if (isStale) {\n result += ' (STALE)';\n }\n\n return result;\n};\n", "import type { ProviderResult, ProviderUsage, UsageWindow } from '../types/index.js';\nimport type { ToastUsageResult } from '../types/toast.js';\nimport type { Logger } from '../providers/common/logger.js';\nimport type { DisplayCache } from '../cache/reader.js';\nimport { filterFlagshipModels } from './filter.js';\n\ntype StatusEmoji = '\uD83D\uDD34' | '\uD83D\uDFE1' | '\uD83D\uDFE2' | '\u26AA';\n\nconst getStatus = (remainingPercent: number | null): StatusEmoji => {\n if (remainingPercent === null) return '\u26AA';\n if (remainingPercent < 10) return '\uD83D\uDD34';\n if (remainingPercent < 30) return '\uD83D\uDFE1';\n return '\uD83D\uDFE2';\n};\n\nconst formatWindowLine = (name: string, window: UsageWindow, isModel: boolean = false): string => {\n const used = window.usedPercent !== null ? Math.round(window.usedPercent) : 0;\n const reset = window.resetAfterFormatted ?? 'N/A';\n const remaining = window.remainingPercent ?? null;\n const emoji = isModel ? '' : `${getStatus(remaining)} `;\n const indent = isModel ? ' ' : '';\n\n // Format: \"\uD83D\uDFE2 openai 75% \u2022 2h\" or \" gemini-3-pro 48% \u2022 4h\"\n return `${indent}${emoji}${name.padEnd(isModel ? 13 : 10)} ${used}% \u2022 ${reset}`;\n};\n\nconst formatProviderSection = (provider: string, usage: ProviderUsage | null): string[] => {\n if (!usage) {\n return [`\u26AA ${provider}: Not configured`];\n }\n\n const lines: string[] = [];\n const globalWindows = Object.values(usage.windows);\n\n // Provider Line\n if (globalWindows.length > 0) {\n lines.push(formatWindowLine(provider, globalWindows[0]));\n } else {\n lines.push(`\u26AA ${provider}: No usage data`);\n }\n\n // Model Lines\n if (usage.models) {\n for (const [modelName, modelData] of Object.entries(usage.models)) {\n const modelWindow = Object.values(modelData.windows)[0];\n if (modelWindow) {\n lines.push(formatWindowLine(modelName, modelWindow, true));\n }\n }\n }\n\n return lines;\n};\n\nexport const formatUsageToast = async (\n input: ProviderResult[] | DisplayCache | null,\n logger?: Logger\n): Promise<ToastUsageResult> => {\n if (!input) {\n return {\n title: '\uD83D\uDCCA Usage',\n message: 'No providers configured',\n variant: 'info',\n };\n }\n\n const displayCache = 'providers' in input ? input : null;\n const results = 'providers' in input ? null : input;\n\n const lines: string[] = [];\n const contentLines: string[] = [];\n const DIVIDER = '\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500';\n\n let updatedAt = '';\n let isStale = false;\n\n if (displayCache) {\n updatedAt = displayCache.updatedAt;\n isStale = displayCache.isStale;\n\n for (const [providerId, entry] of Object.entries(displayCache.providers)) {\n if (!entry.data) continue;\n\n let usage = entry.data;\n if (providerId === 'google' && usage?.models) {\n usage = {\n ...usage,\n models: filterFlagshipModels(usage.models),\n };\n }\n\n contentLines.push(...formatProviderSection(providerId, usage));\n }\n\n if (Object.values(displayCache.providers).some((e) => e.error !== null)) {\n contentLines.push('\u26A0\uFE0F Some providers failed');\n }\n } else if (results) {\n const now = new Date();\n updatedAt = `${now.getHours().toString().padStart(2, '0')}:${now.getMinutes().toString().padStart(2, '0')}`;\n\n for (const result of results) {\n if (!result.usage) {\n await logger?.debug(`Provider ${result.provider} not configured, skipping`);\n continue;\n }\n\n let usage = result.usage;\n if (result.provider === 'google' && usage?.models) {\n usage = {\n ...usage,\n models: filterFlagshipModels(usage.models),\n };\n }\n\n contentLines.push(...formatProviderSection(result.provider, usage));\n }\n }\n\n if (contentLines.length === 0) {\n return {\n title: '\uD83D\uDCCA Usage',\n message: 'No providers configured',\n variant: 'info',\n };\n }\n\n lines.push(DIVIDER);\n lines.push(...contentLines);\n lines.push(DIVIDER);\n\n let footer = `Updated: ${updatedAt}`;\n if (isStale) footer += ' (stale)';\n lines.push(footer);\n\n return {\n title: '\uD83D\uDCCA Usage',\n message: lines.join('\\n'),\n variant: 'info',\n };\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["export type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nexport interface Logger {\n debug: (message: string, extra?: Record<string, unknown>) => Promise<void>;\n info: (message: string, extra?: Record<string, unknown>) => Promise<void>;\n warn: (message: string, extra?: Record<string, unknown>) => Promise<void>;\n error: (message: string, extra?: Record<string, unknown>) => Promise<void>;\n}\n\nexport const maskSecret = (secret: string): string => {\n if (!secret || typeof secret !== 'string' || secret.length <= 8) {\n return '***';\n }\n return `${secret.slice(0, 4)}...${secret.slice(-4)}`;\n};\n\nconst noOpLogger = {\n debug: async () => {},\n info: async () => {},\n warn: async () => {},\n error: async () => {},\n};\n\ninterface LogOptions {\n service: string;\n level: LogLevel;\n message: string;\n}\n\ninterface OpenCodeClient {\n app: {\n log: (options: LogOptions) => Promise<boolean> | { ok: boolean };\n };\n}\n\nexport const createLogger = (client: unknown): Logger => {\n const service = 'opencode-usage';\n\n return {\n debug: async (message, extra) => {\n await (client as OpenCodeClient).app.log({\n service,\n level: 'debug',\n message,\n ...(extra ?? {}),\n });\n },\n info: async (message, extra) => {\n await (client as OpenCodeClient).app.log({\n service,\n level: 'info',\n message,\n ...(extra ?? {}),\n });\n },\n warn: async (message, extra) => {\n await (client as OpenCodeClient).app.log({\n service,\n level: 'warn',\n message,\n ...(extra ?? {}),\n });\n },\n error: async (message, extra) => {\n await (client as OpenCodeClient).app.log({\n service,\n level: 'error',\n message,\n ...(extra ?? {}),\n });\n },\n };\n};\n\nexport const noopLogger = noOpLogger as unknown as Logger;\n", "import { readFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nimport type { Logger } from './logger.ts';\nimport type { OpenCodeAuth } from '../../types/index.ts';\n\nexport const xdgDataHome = (): string =>\n process.env.XDG_DATA_HOME ?? join(homedir(), '.local', 'share');\n\nexport const xdgConfigHome = (): string =>\n process.env.XDG_CONFIG_HOME ?? join(homedir(), '.config');\n\nexport const xdgCacheHome = (): string => process.env.XDG_CACHE_HOME ?? join(homedir(), '.cache');\n\nexport const AUTH_PATHS = {\n opencode: (): string => join(xdgDataHome(), 'opencode', 'auth.json'),\n openaiPlugin: (): string => join(homedir(), '.opencode', 'auth', 'openai.json'),\n antigravityConfig: (): string => join(xdgConfigHome(), 'opencode', 'antigravity-accounts.json'),\n antigravityData: (): string => join(xdgDataHome(), 'opencode', 'antigravity-accounts.json'),\n} as const;\n\nexport const readJson = async <T>(filePath: string, logger?: Logger): Promise<T | null> => {\n try {\n const content = await readFile(filePath, 'utf-8');\n return JSON.parse(content) as T;\n } catch (error) {\n if (logger) {\n const message = error instanceof Error ? error.message : String(error);\n await logger.debug(`Auth file not found or invalid: ${filePath}`, { error: message });\n }\n return null;\n }\n};\n\nexport const loadOpenCodeAuth = async (logger?: Logger): Promise<OpenCodeAuth | null> => {\n return readJson<OpenCodeAuth>(AUTH_PATHS.opencode(), logger);\n};\n", "import { mkdir, readFile, rename, unlink, writeFile } from 'node:fs/promises';\n\nimport { xdgCacheHome } from '../providers/common/files.ts';\nimport type { Logger } from '../providers/common/logger.ts';\nimport type { CacheSchema } from './types.ts';\n\nconst CACHE_DIR = (): string => `${xdgCacheHome()}/opencode/opencode-usage-plugin`;\n\nexport const CACHE_PATH = (): string => `${CACHE_DIR()}/usage.json`;\n\nconst TMP_PATH = (): string => `${CACHE_PATH()}.tmp`;\n\nconst ensureCacheDir = async (): Promise<void> => {\n try {\n await mkdir(CACHE_DIR(), { recursive: true });\n } catch (error) {\n if (\n error instanceof Error &&\n 'code' in error &&\n (error as { code: string }).code !== 'EEXIST'\n ) {\n throw error;\n }\n }\n};\n\nexport const readCache = async (logger?: Logger): Promise<CacheSchema | null> => {\n try {\n const content = await readFile(CACHE_PATH(), 'utf-8');\n const parsed = JSON.parse(content) as unknown;\n\n if (\n typeof parsed === 'object' &&\n parsed !== null &&\n 'schema_version' in parsed &&\n 'updated_at' in parsed &&\n 'refresh_interval_seconds' in parsed &&\n 'providers' in parsed\n ) {\n return parsed as CacheSchema;\n }\n\n await logger?.warn('Invalid cache schema, returning null');\n return null;\n } catch (error) {\n if (logger) {\n const message = error instanceof Error ? error.message : String(error);\n await logger.debug('Cache file not found or invalid', { error: message });\n }\n return null;\n }\n};\n\nexport const writeCache = async (cache: CacheSchema, logger?: Logger): Promise<void> => {\n try {\n await ensureCacheDir();\n const content = JSON.stringify(cache, null, 2);\n await writeFile(TMP_PATH(), content, 'utf-8');\n await rename(TMP_PATH(), CACHE_PATH());\n await logger?.debug('Cache written successfully', { path: CACHE_PATH() });\n } catch (error) {\n await logger?.error('Failed to write cache', {\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n};\n\nexport const clearCache = async (logger?: Logger): Promise<void> => {\n try {\n await unlink(CACHE_PATH());\n await logger?.debug('Cache cleared', { path: CACHE_PATH() });\n } catch (error) {\n if (logger) {\n const code =\n error instanceof Error && 'code' in error ? (error as { code: string }).code : 'UNKNOWN';\n if (code === 'ENOENT') {\n await logger.debug('Cache file does not exist, nothing to clear');\n } else {\n await logger?.error('Failed to clear cache', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n }\n};\n", "import type { ProviderId, ProviderUsage } from '../types/index.ts';\n\nexport const SCHEMA_VERSION = 1;\nexport const REFRESH_INTERVAL_SECONDS = 300;\nexport const STALE_THRESHOLD_MULTIPLIER = 2;\n\nexport interface ProviderCacheEntry {\n supported: boolean;\n configured: boolean;\n last_attempt_at: string;\n last_success_at: string | null;\n data: ProviderUsage | null;\n error: string | null;\n}\n\nexport interface CacheSchema {\n schema_version: number;\n updated_at: string;\n refresh_interval_seconds: number;\n providers: Record<ProviderId, ProviderCacheEntry>;\n}\n", "import type { Logger } from '../providers/common/logger.ts';\nimport { readCache } from './file.ts';\nimport { REFRESH_INTERVAL_SECONDS, STALE_THRESHOLD_MULTIPLIER, type CacheSchema } from './types.ts';\n\nexport interface DisplayCache {\n providers: CacheSchema['providers'];\n updatedAt: string;\n isStale: boolean;\n}\n\nexport const loadCacheForDisplay = async (logger: Logger): Promise<DisplayCache | null> => {\n const cache = await readCache(logger);\n if (!cache) {\n await logger.warn('No cache available');\n return null;\n }\n\n const updatedAt = new Date(cache.updated_at);\n const now = new Date();\n const staleThresholdMs = REFRESH_INTERVAL_SECONDS * 1000 * STALE_THRESHOLD_MULTIPLIER;\n const isStale = now.getTime() - updatedAt.getTime() > staleThresholdMs;\n\n if (isStale) {\n await logger.debug('Cache is stale', {\n updatedAt: cache.updated_at,\n staleThresholdSeconds: REFRESH_INTERVAL_SECONDS * STALE_THRESHOLD_MULTIPLIER,\n });\n }\n\n const configuredProviders: CacheSchema['providers'] = {} as CacheSchema['providers'];\n\n for (const [providerId, entry] of Object.entries(cache.providers)) {\n if (entry.configured) {\n configuredProviders[providerId as keyof typeof configuredProviders] = entry;\n }\n }\n\n return {\n providers: configuredProviders,\n updatedAt: cache.updated_at,\n isStale,\n };\n};\n", "export const calculateResetAfterSeconds = (\n resetAt: number | null,\n now: number = Date.now()\n): number | null => {\n if (!resetAt) {\n return null;\n }\n\n const diffMs = resetAt - now;\n if (diffMs <= 0) {\n return 0;\n }\n\n return Math.floor(diffMs / 1000);\n};\n\nexport const calculateResetAt = (\n resetAfterSeconds: number | null,\n now: number = Date.now()\n): number | null => {\n if (resetAfterSeconds === null || resetAfterSeconds === undefined) {\n return null;\n }\n\n return now + resetAfterSeconds * 1000;\n};\n\nexport const formatDuration = (seconds: number): string => {\n if (seconds <= 0) {\n return '0s';\n }\n\n const weeks = Math.floor(seconds / 604800);\n const days = Math.floor((seconds % 604800) / 86400);\n const hours = Math.floor((seconds % 86400) / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const secs = seconds % 60;\n\n const parts: string[] = [];\n if (weeks > 0) parts.push(`${weeks}w`);\n if (days > 0) parts.push(`${days}d`);\n if (hours > 0) parts.push(`${hours}h`);\n if (minutes > 0) parts.push(`${minutes}m`);\n if (secs > 0 || parts.length === 0) parts.push(`${secs}s`);\n\n return parts.join(' ');\n};\n\nexport const formatResetAt = (resetAtMs: number): string => {\n return new Date(resetAtMs).toLocaleString(undefined, {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric',\n timeZoneName: 'short',\n });\n};\n", "import type { ProviderAlias, ProviderId } from '../../types/index.ts';\n\nexport const PROVIDER_ALIASES: Record<ProviderId, ProviderAlias[]> = {\n openai: ['openai', 'codex', 'chatgpt'],\n google: ['google', 'antigravity'],\n 'zai-coding-plan': ['zai-coding-plan', 'zai', 'z.ai'],\n};\n\nexport const parseProvider = (input?: string): ProviderId | null => {\n if (!input) {\n return null;\n }\n\n const normalized = input.trim().toLowerCase();\n for (const [providerId, aliases] of Object.entries(PROVIDER_ALIASES)) {\n if (aliases.includes(normalized as ProviderAlias)) {\n return providerId as ProviderId;\n }\n }\n\n return null;\n};\n\nexport const getProviderAliases = (provider: ProviderId): ProviderAlias[] => {\n return PROVIDER_ALIASES[provider];\n};\n", "import type {\n AntigravityAccount,\n AntigravityAccountsFile,\n OpenCodeAuth,\n ProviderAuthData,\n} from '../../types/index.ts';\nimport type { Logger } from '../common/logger.ts';\nimport { AUTH_PATHS, loadOpenCodeAuth, readJson } from '../common/files.ts';\nimport { getProviderAliases } from '../common/registry.ts';\n\nexport interface GoogleAuthContext {\n refreshToken?: string;\n accessToken?: string;\n expires?: number;\n projectId?: string;\n email?: string;\n}\n\nconst toAuthData = (entry: OpenCodeAuth[string]): ProviderAuthData | null => {\n if (!entry) {\n return null;\n }\n\n if (typeof entry === 'string') {\n return { token: entry };\n }\n\n if (typeof entry === 'object') {\n return entry as ProviderAuthData;\n }\n\n return null;\n};\n\nconst loadOpenCodeAuthEntry = async (logger?: Logger): Promise<ProviderAuthData | null> => {\n const auth = await loadOpenCodeAuth(logger);\n if (!auth) {\n return null;\n }\n\n for (const alias of getProviderAliases('google')) {\n const entry = toAuthData(auth[alias]);\n if (entry) {\n return entry;\n }\n }\n\n return null;\n};\n\nconst toAuthContext = (entry: ProviderAuthData | null): GoogleAuthContext | null => {\n if (!entry) {\n return null;\n }\n\n const accessToken = entry.access ?? entry.token;\n let refreshToken = entry.refresh;\n let projectId: string | undefined = undefined;\n\n if (refreshToken && refreshToken.includes('|')) {\n const parts = refreshToken.split('|');\n refreshToken = parts[0];\n projectId = parts[1];\n }\n\n if (!accessToken && !refreshToken) {\n return null;\n }\n\n return {\n accessToken,\n refreshToken,\n expires: entry.expires,\n projectId,\n };\n};\n\nconst selectAccount = (accounts: AntigravityAccountsFile | null): AntigravityAccount | null => {\n if (!accounts?.accounts?.length) {\n return null;\n }\n\n const candidateIndex = accounts.activeIndex ?? 0;\n const account = accounts.accounts[candidateIndex] ?? accounts.accounts[0];\n return account ?? null;\n};\n\nconst loadAuthFromAccounts = async (logger?: Logger): Promise<GoogleAuthContext | null> => {\n const configAccounts = await readJson<AntigravityAccountsFile>(\n AUTH_PATHS.antigravityConfig(),\n logger\n );\n const account = selectAccount(configAccounts);\n if (account) {\n return {\n refreshToken: account.refreshToken,\n projectId: account.projectId ?? account.managedProjectId,\n email: account.email,\n };\n }\n\n const dataAccounts = await readJson<AntigravityAccountsFile>(\n AUTH_PATHS.antigravityData(),\n logger\n );\n const fallbackAccount = selectAccount(dataAccounts);\n if (!fallbackAccount) {\n return null;\n }\n\n return {\n refreshToken: fallbackAccount.refreshToken,\n projectId: fallbackAccount.projectId ?? fallbackAccount.managedProjectId,\n email: fallbackAccount.email,\n };\n};\n\nexport const getGoogleAuth = async (logger?: Logger): Promise<GoogleAuthContext | null> => {\n const openCodeAuth = await loadOpenCodeAuthEntry(logger);\n const authContext = toAuthContext(openCodeAuth);\n if (authContext) {\n return authContext;\n }\n\n return loadAuthFromAccounts(logger);\n};\n", "import type { ProviderResult, ProviderUsage, UsageWindow } from '../../types/index.ts';\nimport { maskSecret, type Logger, noopLogger } from '../common/logger.ts';\nimport { calculateResetAfterSeconds, formatDuration, formatResetAt } from '../common/time.ts';\nimport { getGoogleAuth } from './auth.ts';\n\nconst GOOGLE_CLIENT_ID =\n '1071006060591-tmhssin2h21lcre235vtolojh4g403ep.apps.googleusercontent.com';\nconst GOOGLE_CLIENT_SECRET = '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';\nconst DEFAULT_PROJECT_ID = 'rising-fact-p41fc';\nconst WINDOW_SECONDS = 5 * 60 * 60;\n\nconst ENDPOINTS: readonly string[] = [\n 'https://daily-cloudcode-pa.sandbox.googleapis.com',\n 'https://autopush-cloudcode-pa.sandbox.googleapis.com',\n 'https://cloudcode-pa.googleapis.com',\n];\n\nconst HEADERS = {\n 'User-Agent': 'antigravity/1.11.5 windows/amd64',\n 'X-Goog-Api-Client': 'google-cloud-sdk vscode_cloudshelleditor/0.1',\n 'Client-Metadata':\n '{\"ideType\":\"IDE_UNSPECIFIED\",\"platform\":\"PLATFORM_UNSPECIFIED\",\"pluginType\":\"GEMINI\"}',\n} as const;\n\ninterface TokenResponse {\n access_token: string;\n expires_in?: number;\n}\n\ninterface ModelUsageInfoResponse {\n displayName?: string;\n quotaInfo?: {\n remainingFraction?: number;\n resetTime?: string;\n };\n}\n\ninterface ModelsResponse {\n models?: Record<string, ModelUsageInfoResponse>;\n}\n\nconst refreshAccessToken = async (\n refreshToken: string,\n logger: Logger\n): Promise<TokenResponse | null> => {\n try {\n const response = await fetch('https://oauth2.googleapis.com/token', {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({\n client_id: GOOGLE_CLIENT_ID,\n client_secret: GOOGLE_CLIENT_SECRET,\n refresh_token: refreshToken,\n grant_type: 'refresh_token',\n }),\n });\n\n if (!response.ok) {\n await logger.warn('Failed to refresh OAuth token for google', {\n status: response.status,\n token: maskSecret(refreshToken),\n });\n return null;\n }\n\n return (await response.json()) as TokenResponse;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n await logger.warn(`Token refresh failed for google: ${message}`);\n return null;\n }\n};\n\nconst fetchModels = async (\n accessToken: string,\n projectId: string | undefined,\n logger: Logger\n): Promise<ModelsResponse | null> => {\n const body = projectId ? { project: projectId } : {};\n\n for (const endpoint of ENDPOINTS) {\n try {\n const response = await fetch(`${endpoint}/v1internal:fetchAvailableModels`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n ...HEADERS,\n },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(15000),\n });\n\n if (response.ok) {\n await logger.debug(`Fetched models from ${endpoint}`, { projectId });\n return (await response.json()) as ModelsResponse;\n }\n } catch {\n continue;\n }\n }\n\n await logger.error('Failed to fetch models from all google endpoints', { projectId });\n return null;\n};\n\nconst toWindow = (remainingFraction?: number, resetTime?: string): UsageWindow => {\n const remainingPercent =\n remainingFraction !== undefined ? Math.round(remainingFraction * 100) : null;\n const usedPercent = remainingPercent !== null ? Math.max(0, 100 - remainingPercent) : null;\n const resetAt = resetTime ? new Date(resetTime).getTime() : null;\n const resetAfterSeconds = calculateResetAfterSeconds(resetAt);\n\n return {\n usedPercent,\n remainingPercent,\n windowSeconds: WINDOW_SECONDS,\n resetAfterSeconds,\n resetAt,\n resetAtFormatted: resetAt ? formatResetAt(resetAt) : null,\n resetAfterFormatted: resetAfterSeconds !== null ? formatDuration(resetAfterSeconds) : null,\n };\n};\n\nconst buildUsage = (data: ModelsResponse): ProviderUsage => {\n const models: Record<string, { windows: Record<string, UsageWindow> }> = {};\n\n for (const [modelName, modelData] of Object.entries(data.models ?? {})) {\n const window = toWindow(modelData.quotaInfo?.remainingFraction, modelData.quotaInfo?.resetTime);\n models[modelName] = {\n windows: {\n '5h': window,\n },\n };\n }\n\n return {\n windows: {},\n models: Object.keys(models).length ? models : undefined,\n };\n};\n\nconst resolveAccessToken = async (\n refreshToken: string | undefined,\n accessToken: string | undefined,\n expires: number | undefined,\n logger: Logger\n): Promise<string | null> => {\n const now = Date.now();\n\n if (accessToken && (!expires || expires > now)) {\n return accessToken;\n }\n\n if (!refreshToken) {\n return null;\n }\n\n const refreshed = await refreshAccessToken(refreshToken, logger);\n return refreshed?.access_token ?? null;\n};\n\nexport const fetchGoogleUsage = async (logger: Logger = noopLogger): Promise<ProviderResult> => {\n const auth = await getGoogleAuth(logger);\n\n if (!auth) {\n await logger.warn('No auth configured for google');\n return {\n provider: 'google',\n ok: false,\n configured: false,\n error: 'Not configured - no accounts found',\n usage: null,\n };\n }\n\n const accessToken = await resolveAccessToken(\n auth.refreshToken,\n auth.accessToken,\n auth.expires,\n logger\n );\n\n if (!accessToken) {\n await logger.warn('Failed to refresh OAuth token for google', { email: auth.email });\n return {\n provider: 'google',\n ok: false,\n configured: true,\n error: 'Failed to refresh OAuth token',\n usage: null,\n };\n }\n\n const projectId = auth.projectId ?? DEFAULT_PROJECT_ID;\n const modelsData = await fetchModels(accessToken, projectId, logger);\n\n if (!modelsData) {\n await logger.error('Failed to fetch models from google API', { projectId });\n return {\n provider: 'google',\n ok: false,\n configured: true,\n error: 'Failed to fetch models from API',\n usage: null,\n };\n }\n\n await logger.info('google usage fetched successfully');\n\n return {\n provider: 'google',\n ok: true,\n configured: true,\n usage: buildUsage(modelsData),\n };\n};\n", "import type { Logger } from '../common/logger.ts';\nimport type { OpenCodeAuth, ProviderAuthData } from '../../types/index.ts';\nimport { AUTH_PATHS, loadOpenCodeAuth, readJson } from '../common/files.ts';\nimport { getProviderAliases } from '../common/registry.ts';\n\nconst toAuthData = (entry: OpenCodeAuth[string]): ProviderAuthData | null => {\n if (!entry) {\n return null;\n }\n\n if (typeof entry === 'string') {\n return { token: entry };\n }\n\n if (typeof entry === 'object') {\n return entry as ProviderAuthData;\n }\n\n return null;\n};\n\nconst hasAccessToken = (auth: ProviderAuthData | null): auth is ProviderAuthData => {\n return Boolean(auth?.access || auth?.token);\n};\n\nconst loadOpenCodeAuthEntry = async (logger?: Logger): Promise<ProviderAuthData | null> => {\n const auth = await loadOpenCodeAuth(logger);\n if (!auth) {\n return null;\n }\n\n for (const alias of getProviderAliases('openai')) {\n const entry = toAuthData(auth[alias]);\n if (entry && hasAccessToken(entry)) {\n return entry;\n }\n }\n\n return null;\n};\n\nexport const getOpenaiAuth = async (logger?: Logger): Promise<ProviderAuthData | null> => {\n const openCodeAuth = await loadOpenCodeAuthEntry(logger);\n if (openCodeAuth && hasAccessToken(openCodeAuth)) {\n return openCodeAuth;\n }\n\n const pluginAuth = await readJson<ProviderAuthData>(AUTH_PATHS.openaiPlugin(), logger);\n if (pluginAuth && hasAccessToken(pluginAuth)) {\n return pluginAuth;\n }\n\n return null;\n};\n", "import type { ProviderResult, ProviderUsage, UsageWindow } from '../../types/index.ts';\nimport { maskSecret, type Logger, noopLogger } from '../common/logger.ts';\nimport { calculateResetAfterSeconds, formatDuration, formatResetAt } from '../common/time.ts';\nimport { getOpenaiAuth } from './auth.ts';\n\ninterface OpenaiBackendWindow {\n used_percent: number;\n limit_window_seconds: number;\n reset_after_seconds: number;\n reset_at: number;\n}\n\ninterface OpenaiBackendResponse {\n plan_type: string;\n rate_limit: {\n allowed: boolean;\n limit_reached: boolean;\n primary_window?: OpenaiBackendWindow;\n secondary_window?: OpenaiBackendWindow;\n };\n}\n\nconst toWindow = (window?: OpenaiBackendWindow): UsageWindow | null => {\n if (!window) {\n return null;\n }\n\n const usedPercent = window.used_percent;\n const resetAt = window.reset_at ? window.reset_at * 1000 : null;\n const resetAfterSeconds = window.reset_after_seconds ?? calculateResetAfterSeconds(resetAt);\n\n return {\n usedPercent,\n remainingPercent: Math.max(0, 100 - usedPercent),\n windowSeconds: window.limit_window_seconds ?? null,\n resetAfterSeconds,\n resetAt,\n resetAtFormatted: resetAt ? formatResetAt(resetAt) : null,\n resetAfterFormatted: resetAfterSeconds !== null ? formatDuration(resetAfterSeconds) : null,\n };\n};\n\nexport const fetchOpenaiUsage = async (logger: Logger = noopLogger): Promise<ProviderResult> => {\n const auth = await getOpenaiAuth(logger);\n\n if (!auth) {\n await logger.warn('No auth configured for openai');\n return {\n provider: 'openai',\n ok: false,\n configured: false,\n error: 'Not configured - no OAuth token found',\n usage: null,\n };\n }\n\n const accessToken = auth.access ?? auth.token;\n if (!accessToken) {\n await logger.warn('Auth configured but access token missing for openai');\n return {\n provider: 'openai',\n ok: false,\n configured: false,\n error: 'Not configured - access token missing',\n usage: null,\n };\n }\n\n try {\n const response = await fetch('https://chatgpt.com/backend-api/wham/usage', {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n await logger.error(`API error ${response.status} for openai`, {\n token: maskSecret(accessToken),\n });\n return {\n provider: 'openai',\n ok: false,\n configured: true,\n error: `API error: ${response.status}`,\n usage: null,\n };\n }\n\n const payload = (await response.json()) as OpenaiBackendResponse;\n const primary = toWindow(payload.rate_limit.primary_window);\n const secondary = toWindow(payload.rate_limit.secondary_window);\n\n const windows: Record<string, UsageWindow> = {};\n if (primary) {\n windows['5h'] = primary;\n }\n if (secondary) {\n windows['weekly'] = secondary;\n }\n\n const usage: ProviderUsage = {\n windows,\n };\n\n await logger.info('openai usage fetched successfully');\n\n return {\n provider: 'openai',\n ok: true,\n configured: true,\n usage,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n await logger.error(`Request failed for openai: ${message}`);\n return {\n provider: 'openai',\n ok: false,\n configured: true,\n error: `Request failed: ${message}`,\n usage: null,\n };\n }\n};\n", "import type { Logger } from '../common/logger.ts';\nimport type { OpenCodeAuth } from '../../types/index.ts';\nimport { loadOpenCodeAuth } from '../common/files.ts';\nimport { getProviderAliases } from '../common/registry.ts';\n\nconst resolveAuthValue = (entry: OpenCodeAuth[string]): string | null => {\n if (!entry) {\n return null;\n }\n\n if (typeof entry === 'string') {\n return entry;\n }\n\n if (typeof entry === 'object') {\n return entry.api_key ?? entry.token ?? entry.key ?? null;\n }\n\n return null;\n};\n\nexport const getZaiApiKey = async (logger?: Logger): Promise<string | null> => {\n if (process.env.ZAI_API_KEY) {\n return process.env.ZAI_API_KEY;\n }\n\n const auth = await loadOpenCodeAuth(logger);\n if (!auth) {\n return null;\n }\n\n for (const alias of getProviderAliases('zai-coding-plan')) {\n const value = resolveAuthValue(auth[alias]);\n if (value) {\n return value;\n }\n }\n\n return null;\n};\n", "import type { ProviderResult, ProviderUsage, UsageWindow } from '../../types/index.ts';\nimport { maskSecret, type Logger, noopLogger } from '../common/logger.ts';\nimport { calculateResetAfterSeconds, formatDuration, formatResetAt } from '../common/time.ts';\nimport { getZaiApiKey } from './auth.ts';\n\ninterface ZaiLimit {\n type: 'TIME_LIMIT' | 'TOKENS_LIMIT';\n unit: number;\n number: number;\n usage: number;\n currentValue: number;\n remaining: number;\n percentage: number;\n nextResetTime?: number;\n}\n\ninterface ZaiUsageResponse {\n code: number;\n msg: string;\n data?: {\n limits?: ZaiLimit[];\n };\n success: boolean;\n}\n\nconst normalizeTimestamp = (value: number): number => {\n return value < 1_000_000_000_000 ? value * 1000 : value;\n};\n\nconst TOKEN_WINDOW_SECONDS: Record<number, number> = {\n 3: 3600,\n};\n\nconst resolveWindowSeconds = (limit?: ZaiLimit): number | null => {\n if (!limit) {\n return null;\n }\n\n if (!limit.number) {\n return null;\n }\n\n const unitSeconds = TOKEN_WINDOW_SECONDS[limit.unit];\n if (!unitSeconds) {\n return null;\n }\n\n return unitSeconds * limit.number;\n};\n\nconst resolveWindowLabel = (windowSeconds: number | null): string => {\n if (!windowSeconds) {\n return 'tokens';\n }\n\n if (windowSeconds % 86400 === 0) {\n const days = windowSeconds / 86400;\n return days === 7 ? 'weekly' : `${days}d`;\n }\n\n if (windowSeconds % 3600 === 0) {\n return `${windowSeconds / 3600}h`;\n }\n\n return `${windowSeconds}s`;\n};\n\nconst toWindow = (limit?: ZaiLimit): UsageWindow | null => {\n if (!limit) {\n return null;\n }\n\n const usedPercent = limit.percentage ?? null;\n const remainingPercent = usedPercent !== null ? Math.max(0, 100 - usedPercent) : null;\n const resetAt = limit.nextResetTime ? normalizeTimestamp(limit.nextResetTime) : null;\n const resetAfterSeconds = calculateResetAfterSeconds(resetAt);\n\n return {\n usedPercent,\n remainingPercent,\n windowSeconds: resolveWindowSeconds(limit),\n resetAfterSeconds,\n resetAt,\n resetAtFormatted: resetAt ? formatResetAt(resetAt) : null,\n resetAfterFormatted: resetAfterSeconds !== null ? formatDuration(resetAfterSeconds) : null,\n };\n};\n\nexport const fetchZaiUsage = async (logger: Logger = noopLogger): Promise<ProviderResult> => {\n const apiKey = await getZaiApiKey(logger);\n\n if (!apiKey) {\n await logger.warn('No auth configured for zai-coding-plan');\n return {\n provider: 'zai-coding-plan',\n ok: false,\n configured: false,\n error: 'Not configured - no API key found',\n usage: null,\n };\n }\n\n try {\n const response = await fetch('https://api.z.ai/api/monitor/usage/quota/limit', {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n await logger.error(`API error ${response.status} for zai-coding-plan`, {\n token: maskSecret(apiKey),\n });\n return {\n provider: 'zai-coding-plan',\n ok: false,\n configured: true,\n error: `API error: ${response.status}`,\n usage: null,\n };\n }\n\n const payload = (await response.json()) as ZaiUsageResponse;\n const limits = payload.data?.limits ?? [];\n const tokensLimit = limits.find((limit) => limit.type === 'TOKENS_LIMIT');\n\n const windows: Record<string, UsageWindow> = {};\n const window = toWindow(tokensLimit);\n if (window) {\n const label = resolveWindowLabel(window.windowSeconds);\n windows[label] = window;\n }\n\n const usage: ProviderUsage = {\n windows,\n };\n\n await logger.info('zai-coding-plan usage fetched successfully');\n\n return {\n provider: 'zai-coding-plan',\n ok: true,\n configured: true,\n usage,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n await logger.error(`Request failed for zai-coding-plan: ${message}`);\n return {\n provider: 'zai-coding-plan',\n ok: false,\n configured: true,\n error: `Request failed: ${message}`,\n usage: null,\n };\n }\n};\n", "export type ProviderId = 'openai' | 'google' | 'zai-coding-plan';\n\nexport type ProviderAlias = ProviderId | 'codex' | 'antigravity' | 'zai' | 'z.ai' | 'chatgpt';\n\nexport type ProviderIdValues = 'openai' | 'google' | 'zai-coding-plan';\n\nexport const PROVIDERS: ProviderIdValues[] = ['openai', 'google', 'zai-coding-plan'];\n\nexport type OpenCodeAuth = Record<string, string | ProviderAuthData>;\n\nexport interface ProviderAuthData {\n type?: 'oauth' | 'api' | string;\n access?: string;\n refresh?: string;\n expires?: number;\n api_key?: string;\n token?: string;\n key?: string;\n accountId?: string;\n}\n", "export type StatusEmoji = '\uD83D\uDD34' | '\uD83D\uDFE1' | '\uD83D\uDFE2' | '\u26AA';\n\nexport type StatusText = 'Critical' | 'Warning' | 'OK' | 'N/A';\n\nexport interface DashboardWindow {\n label: string;\n usedPercent: number | null;\n remainingPercent: number | null;\n status: StatusEmoji;\n statusText: StatusText;\n resetsIn: string;\n}\n\nexport interface DashboardSection {\n title: string;\n windows: DashboardWindow[];\n sections?: DashboardSection[];\n}\n\nexport interface DashboardProvider {\n name: string;\n sections: DashboardSection[];\n}\n\nexport interface DashboardData {\n providers: DashboardProvider[];\n}\n", "export type { ProviderId, ProviderAlias, OpenCodeAuth, ProviderAuthData } from './provider.ts';\nexport { PROVIDERS } from './provider.ts';\nexport type { UsageWindow, UsageWindows, ProviderUsage, ProviderResult } from './usage.ts';\nexport type { AntigravityAccount, AntigravityAccountsFile } from './google.ts';\nexport type { ToastUsageResult } from './toast.ts';\nexport * from './dashboard.js';\n", "import { fetchGoogleUsage } from '../providers/google/fetch.ts';\nimport { fetchOpenaiUsage } from '../providers/openai/fetch.ts';\nimport { fetchZaiUsage } from '../providers/zai-coding-plan/fetch.ts';\nimport type { Logger } from '../providers/common/logger.ts';\nimport { PROVIDERS, type ProviderId, type ProviderResult } from '../types/index.ts';\nimport { readCache, writeCache } from './file.ts';\nimport { REFRESH_INTERVAL_SECONDS, SCHEMA_VERSION, type CacheSchema } from './types.ts';\n\nconst fetchUsage = async (provider: ProviderId, logger: Logger): Promise<ProviderResult> => {\n switch (provider) {\n case 'openai':\n return fetchOpenaiUsage(logger);\n case 'google':\n return fetchGoogleUsage(logger);\n case 'zai-coding-plan':\n return fetchZaiUsage(logger);\n }\n};\n\nexport const fetchAllProviders = async (logger: Logger): Promise<CacheSchema> => {\n await logger.info('Fetching usage for all providers');\n\n const existingCache = await readCache(logger);\n\n const results = await Promise.all(PROVIDERS.map((provider) => fetchUsage(provider, logger)));\n\n const providers: Record<ProviderId, CacheSchema['providers'][ProviderId]> = {} as Record<\n ProviderId,\n CacheSchema['providers'][ProviderId]\n >;\n\n const now = new Date().toISOString();\n\n for (const result of results) {\n const providerId = result.provider;\n const wasConfigured = existingCache?.providers[providerId]?.configured ?? false;\n\n providers[providerId] = {\n supported: true,\n configured: result.configured,\n last_attempt_at: now,\n last_success_at: result.ok ? now : null,\n data: result.ok ? result.usage : null,\n error: result.ok ? null : (result.error ?? null),\n };\n\n if (!result.configured && wasConfigured) {\n providers[providerId].data = null;\n await logger.debug(`Wiped data for ${providerId} (no longer configured)`);\n }\n }\n\n const cache: CacheSchema = {\n schema_version: SCHEMA_VERSION,\n updated_at: now,\n refresh_interval_seconds: REFRESH_INTERVAL_SECONDS,\n providers,\n };\n\n await writeCache(cache, logger);\n return cache;\n};\n", "import type { Logger } from '../providers/common/logger.ts';\nimport { fetchAllProviders } from './fetcher.ts';\nimport { REFRESH_INTERVAL_SECONDS } from './types.ts';\n\nlet intervalId: ReturnType<typeof globalThis.setInterval> | null = null;\n\nexport const startWorker = (logger: Logger): void => {\n if (intervalId !== null) {\n logger.warn('Worker already started');\n return;\n }\n\n const refreshLoop = async (): Promise<void> => {\n try {\n await fetchAllProviders(logger);\n } catch (error) {\n await logger.error('Worker refresh failed', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n };\n\n void refreshLoop();\n\n intervalId = globalThis.setInterval(refreshLoop, REFRESH_INTERVAL_SECONDS * 1000);\n\n void logger.info(`Worker started, refreshing every ${REFRESH_INTERVAL_SECONDS}s`);\n};\n\nexport const stopWorker = (logger: Logger): void => {\n if (intervalId === null) {\n return;\n }\n\n globalThis.clearInterval(intervalId);\n intervalId = null;\n\n void logger.info('Worker stopped');\n};\n\nexport const isWorkerRunning = (): boolean => intervalId !== null;\n", "import type { Plugin } from '@opencode-ai/plugin';\nimport { tool } from '@opencode-ai/plugin';\nimport { createLogger } from './providers/common/logger.ts';\nimport { formatDashboardData, formatDashboardString } from './dashboard/format.ts';\nimport { formatUsageToast } from './toast/format.ts';\n\nexport const UsagePlugin: Plugin = async ({ client }) => {\n const logger = createLogger(client);\n\n await logger.info('UsagePlugin initialized');\n\n const usageToastTool = tool({\n description: 'Show subscription usage as toast for OpenAI, Google, and z.ai providers',\n args: {},\n async execute() {\n const { loadCacheForDisplay } = await import('./cache/reader.ts');\n\n await logger.info('Loading usage from cache');\n\n const displayCache = await loadCacheForDisplay(logger);\n\n const toast = await formatUsageToast(displayCache, logger);\n\n await client.tui.showToast({\n body: {\n title: toast.title,\n message: toast.message,\n variant: toast.variant,\n },\n });\n\n return 'Usage displayed';\n },\n });\n\n const usageTableTool = tool({\n description:\n 'Get subscription usage data for OpenAI, Google, and z.ai providers as a formatted table',\n args: {},\n async execute() {\n const { loadCacheForDisplay } = await import('./cache/reader.ts');\n\n await logger.info('Loading usage from cache');\n\n const displayCache = await loadCacheForDisplay(logger);\n\n if (!displayCache) {\n return 'No cache available';\n }\n\n const dashboardData = formatDashboardData(displayCache);\n\n return formatDashboardString(dashboardData, displayCache.updatedAt, displayCache.isStale);\n },\n });\n\n return {\n tool: {\n usage_toast: usageToastTool,\n usage_table: usageTableTool,\n },\n async event({ event }) {\n await logger.debug('Event received', { type: event.type });\n\n if (event.type === 'server.connected') {\n try {\n await logger.info('server.connected event received, starting worker');\n const { startWorker } = await import('./cache/worker.ts');\n startWorker(logger);\n await logger.info('Worker started successfully');\n } catch (error) {\n await logger.error('Failed to start worker', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n },\n async config(config) {\n config.command = config.command ?? {};\n\n config.command['usage-toast'] = {\n template: 'Call the usage_toast tool.',\n description: 'Show subscription usage as toast notification',\n };\n\n config.command.usage = {\n template: 'Call the usage_table tool and display the formatted table.',\n description: 'Show subscription usage as formatted table',\n };\n },\n };\n};\n\nconst setupShutdownHandlers = async (): Promise<void> => {\n const { isWorkerRunning, stopWorker } = await import('./cache/worker.ts');\n const { createLogger } = await import('./providers/common/logger.ts');\n const logger = createLogger({\n app: { log: () => Promise.resolve(true) },\n } as unknown as Parameters<typeof createLogger>[0]);\n\n const onShutdown = async (): Promise<void> => {\n if (await isWorkerRunning()) {\n stopWorker(logger);\n }\n };\n\n process.on('SIGINT', onShutdown);\n process.on('SIGTERM', onShutdown);\n process.on('exit', onShutdown);\n};\n\nvoid setupShutdownHandlers();\n\nexport default UsagePlugin;\n", "import type { UsageWindows } from '../types/index.js';\n\nconst FLAGSHIP_PATTERNS: RegExp[] = [\n /claude[-\\s]*opus[-\\s]*4[-\\s.]?5/i,\n /gemini[-\\s]*3[-\\s.]?pro/i,\n /gemini[-\\s]*3[-\\s.]?flash/i,\n];\n\nexport const isFlagshipModel = (modelName: string): boolean => {\n return FLAGSHIP_PATTERNS.some((pattern) => pattern.test(modelName));\n};\n\nexport const filterFlagshipModels = (\n models?: Record<string, UsageWindows>\n): Record<string, UsageWindows> => {\n if (!models) {\n return {};\n }\n\n const filtered: Record<string, UsageWindows> = {};\n\n for (const [modelName, modelData] of Object.entries(models)) {\n if (isFlagshipModel(modelName)) {\n filtered[modelName] = modelData;\n }\n }\n\n return filtered;\n};\n", "import type { ProviderResult, UsageWindow } from '../types/index.ts';\nimport type { DisplayCache } from '../cache/reader.ts';\nimport type {\n DashboardData,\n DashboardProvider,\n DashboardSection,\n DashboardWindow,\n StatusEmoji,\n StatusText,\n} from '../types/dashboard.ts';\nimport { filterFlagshipModels } from '../toast/filter.ts';\n\nconst getStatus = (remainingPercent: number | null): { emoji: StatusEmoji; text: StatusText } => {\n if (remainingPercent === null) {\n return { emoji: '\u26AA', text: 'N/A' };\n }\n\n if (remainingPercent < 10) {\n return { emoji: '\uD83D\uDD34', text: 'Critical' };\n }\n\n if (remainingPercent < 30) {\n return { emoji: '\uD83D\uDFE1', text: 'Warning' };\n }\n\n return { emoji: '\uD83D\uDFE2', text: 'OK' };\n};\n\nexport const formatWindowLabel = (key: string): string => {\n switch (key) {\n case '5h':\n return '5h Window';\n case 'weekly':\n return 'Weekly Window';\n default:\n return `${key} Window`;\n }\n};\n\nexport const renderBar = (percent: number | null, width: number = 20): string => {\n if (percent === null) {\n return `[${'\u2591'.repeat(width)}]`;\n }\n\n // Clamp percent between 0 and 100\n const validPercent = Math.max(0, Math.min(100, percent));\n const filledLength = Math.round((validPercent / 100) * width);\n const emptyLength = width - filledLength;\n\n return `[${'\u2588'.repeat(filledLength)}${'\u2591'.repeat(emptyLength)}]`;\n};\n\nconst formatWindow = (key: string, window: UsageWindow): DashboardWindow => {\n const remainingPercent = window.remainingPercent ?? null;\n const { emoji, text } = getStatus(remainingPercent);\n\n return {\n label: formatWindowLabel(key),\n usedPercent: window.usedPercent ?? null,\n remainingPercent,\n status: emoji,\n statusText: text,\n resetsIn: window.resetAfterFormatted ?? 'N/A',\n };\n};\n\nexport const formatDashboardData = (\n input: ProviderResult[] | DisplayCache | null\n): DashboardData => {\n if (input === null) {\n return { providers: [] };\n }\n\n if (!('providers' in input)) {\n return formatDashboardDataFromResults(input);\n }\n\n return formatDashboardDataFromCache(input);\n};\n\nconst formatDashboardDataFromResults = (results: ProviderResult[]): DashboardData => {\n const providers: DashboardProvider[] = [];\n\n for (const result of results) {\n if (!result.usage) {\n continue;\n }\n\n const sections: DashboardSection[] = [];\n let usage = result.usage;\n\n if (result.provider === 'google' && usage.models) {\n usage = {\n ...usage,\n models: filterFlagshipModels(usage.models),\n };\n }\n\n const globalWindows = Object.entries(usage.windows);\n if (globalWindows.length > 0) {\n sections.push({\n title: 'Overall Usage',\n windows: globalWindows.map(([key, win]) => formatWindow(key, win)),\n });\n }\n\n if (usage.models) {\n const modelSections: DashboardSection[] = [];\n for (const [modelName, modelUsage] of Object.entries(usage.models)) {\n const modelWindowEntries = Object.entries(modelUsage.windows);\n if (modelWindowEntries.length > 0) {\n modelSections.push({\n title: modelName,\n windows: modelWindowEntries.map(([key, win]) => formatWindow(key, win)),\n });\n }\n }\n\n if (modelSections.length > 0) {\n sections.push({\n title: 'Model Usage',\n windows: [],\n sections: modelSections,\n });\n }\n }\n\n if (sections.length > 0) {\n providers.push({\n name: result.provider.toUpperCase().replace(/-/g, ' '),\n sections,\n });\n }\n }\n\n return { providers };\n};\n\nconst formatDashboardDataFromCache = (displayCache: DisplayCache): DashboardData => {\n const providers: DashboardProvider[] = [];\n\n for (const [providerId, entry] of Object.entries(displayCache.providers)) {\n if (!entry.data) {\n continue;\n }\n\n const sections: DashboardSection[] = [];\n let usage = entry.data;\n\n if (providerId === 'google' && usage.models) {\n usage = {\n ...usage,\n models: filterFlagshipModels(usage.models),\n };\n }\n\n const globalWindows = Object.entries(usage.windows);\n if (globalWindows.length > 0) {\n sections.push({\n title: 'Overall Usage',\n windows: globalWindows.map(([key, win]) => formatWindow(key, win)),\n });\n }\n\n if (usage.models) {\n const modelSections: DashboardSection[] = [];\n for (const [modelName, modelUsage] of Object.entries(usage.models)) {\n const modelWindowEntries = Object.entries(modelUsage.windows);\n if (modelWindowEntries.length > 0) {\n modelSections.push({\n title: modelName,\n windows: modelWindowEntries.map(([key, win]) => formatWindow(key, win)),\n });\n }\n }\n\n if (modelSections.length > 0) {\n sections.push({\n title: 'Model Usage',\n windows: [],\n sections: modelSections,\n });\n }\n }\n\n if (sections.length > 0) {\n providers.push({\n name: providerId.toUpperCase().replace(/-/g, ' '),\n sections,\n });\n }\n }\n\n return { providers };\n};\n\nexport const formatDashboardString = (\n data: DashboardData,\n updatedAt?: string,\n isStale?: boolean\n): string => {\n if (data.providers.length === 0) {\n let result = 'No usage data available';\n if (updatedAt) {\n result += `\\n\\nUpdated at: ${updatedAt}`;\n }\n return result;\n }\n\n const lines: string[] = [];\n const HEADER_WIDTH = 65; // Adjust as needed to match 70 chars total roughly\n\n for (const provider of data.providers) {\n // Header: PROVIDER \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Calculate padding for dash line\n const providerName = provider.name;\n const dashCount = Math.max(0, HEADER_WIDTH - providerName.length - 1);\n lines.push(`${providerName} ${'\u2500'.repeat(dashCount)}`);\n\n for (let i = 0; i < provider.sections.length; i++) {\n const section = provider.sections[i];\n // Section title (e.g., Overall Usage or Model Usage)\n lines.push(section.title);\n\n // Render direct windows (e.g. Overall Usage)\n for (let j = 0; j < section.windows.length; j++) {\n const window = section.windows[j];\n const isLastWindow = j === section.windows.length - 1;\n\n const branch = isLastWindow ? '\u2514\u2500' : '\u251C\u2500';\n const pipe = isLastWindow ? ' ' : '\u2502 ';\n\n // Line 1: Label\n lines.push(` ${branch} ${window.label}`);\n\n // Line 2: Progress Bar + Percent + Reset\n const percentStr =\n window.usedPercent !== null ? `${Math.round(window.usedPercent)}%` : 'N/A';\n lines.push(\n ` ${pipe} ${renderBar(window.usedPercent)} ${percentStr} \u2022 Resets in ${window.resetsIn}`\n );\n\n // Spacer line unless it's the very last window of the section\n if (!isLastWindow) {\n lines.push(` ${pipe}`);\n }\n }\n\n // Render nested sections (e.g. Models)\n if (section.sections) {\n for (let k = 0; k < section.sections.length; k++) {\n const subsection = section.sections[k];\n const isLastSubsection = k === section.sections.length - 1;\n const branch = isLastSubsection ? '\u2514\u2500' : '\u251C\u2500';\n const pipe = isLastSubsection ? ' ' : '\u2502 ';\n\n lines.push(` ${branch} ${subsection.title}`);\n\n for (let m = 0; m < subsection.windows.length; m++) {\n const window = subsection.windows[m];\n const isLastWindow = m === subsection.windows.length - 1;\n\n // Indent deeper for windows under a model\n const subBranch = isLastWindow ? '\u2514\u2500' : '\u251C\u2500';\n // If we are in the last subsection, the parent pipe is space\n // If we are NOT in the last subsection, the parent pipe is \u2502\n // Wait, we need to pass down the \"continuation\" context\n\n // Line 1: Label\n lines.push(` ${pipe} ${subBranch} ${window.label}`);\n\n // Line 2\n const percentStr =\n window.usedPercent !== null ? `${Math.round(window.usedPercent)}%` : 'N/A';\n const subPipe = isLastWindow ? ' ' : '\u2502 ';\n\n lines.push(\n ` ${pipe} ${subPipe} ${renderBar(window.usedPercent)} ${percentStr} \u2022 Resets in ${window.resetsIn}`\n );\n\n if (!isLastWindow) {\n lines.push(` ${pipe} ${subPipe}`);\n }\n }\n\n if (!isLastSubsection) {\n lines.push(` ${pipe}`);\n }\n }\n }\n\n // Add empty line after section\n lines.push('');\n }\n }\n\n let result = lines.join('\\n').trim();\n\n if (updatedAt) {\n result += `\\n\\nUpdated at: ${updatedAt}`;\n }\n\n if (isStale) {\n result += ' (STALE)';\n }\n\n return result;\n};\n", "import type { ProviderResult, ProviderUsage, UsageWindow } from '../types/index.js';\nimport type { ToastUsageResult } from '../types/toast.js';\nimport type { Logger } from '../providers/common/logger.js';\nimport type { DisplayCache } from '../cache/reader.js';\nimport { filterFlagshipModels } from './filter.js';\n\ntype StatusEmoji = '\uD83D\uDD34' | '\uD83D\uDFE1' | '\uD83D\uDFE2' | '\u26AA';\n\nconst getStatus = (remainingPercent: number | null): StatusEmoji => {\n if (remainingPercent === null) return '\u26AA';\n if (remainingPercent < 10) return '\uD83D\uDD34';\n if (remainingPercent < 30) return '\uD83D\uDFE1';\n return '\uD83D\uDFE2';\n};\n\nconst formatWindowLine = (name: string, window: UsageWindow, isModel: boolean = false): string => {\n const used = window.usedPercent !== null ? Math.round(window.usedPercent) : 0;\n const reset = window.resetAfterFormatted ?? 'N/A';\n const remaining = window.remainingPercent ?? null;\n const emoji = isModel ? '' : `${getStatus(remaining)} `;\n const indent = isModel ? ' ' : '';\n\n // Format: \"\uD83D\uDFE2 openai 75% \u2022 2h\" or \" gemini-3-pro 48% \u2022 4h\"\n return `${indent}${emoji}${name.padEnd(isModel ? 13 : 10)} ${used}% \u2022 ${reset}`;\n};\n\nconst formatProviderSection = (provider: string, usage: ProviderUsage | null): string[] => {\n if (!usage) {\n return [`\u26AA ${provider}: Not configured`];\n }\n\n const lines: string[] = [];\n const globalWindows = Object.values(usage.windows);\n\n // Provider Line\n if (globalWindows.length > 0) {\n lines.push(formatWindowLine(provider, globalWindows[0]));\n } else {\n lines.push(`\u26AA ${provider}: No usage data`);\n }\n\n // Model Lines\n if (usage.models) {\n for (const [modelName, modelData] of Object.entries(usage.models)) {\n const modelWindow = Object.values(modelData.windows)[0];\n if (modelWindow) {\n lines.push(formatWindowLine(modelName, modelWindow, true));\n }\n }\n }\n\n return lines;\n};\n\nexport const formatUsageToast = async (\n input: ProviderResult[] | DisplayCache | null,\n logger?: Logger\n): Promise<ToastUsageResult> => {\n if (!input) {\n return {\n title: '\uD83D\uDCCA Usage',\n message: 'No providers configured',\n variant: 'info',\n };\n }\n\n const displayCache = 'providers' in input ? input : null;\n const results = 'providers' in input ? null : input;\n\n const lines: string[] = [];\n const contentLines: string[] = [];\n const DIVIDER = '\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500';\n\n let updatedAt = '';\n let isStale = false;\n\n if (displayCache) {\n updatedAt = displayCache.updatedAt;\n isStale = displayCache.isStale;\n\n for (const [providerId, entry] of Object.entries(displayCache.providers)) {\n if (!entry.data) continue;\n\n let usage = entry.data;\n if (providerId === 'google' && usage?.models) {\n usage = {\n ...usage,\n models: filterFlagshipModels(usage.models),\n };\n }\n\n contentLines.push(...formatProviderSection(providerId, usage));\n }\n\n if (Object.values(displayCache.providers).some((e) => e.error !== null)) {\n contentLines.push('\u26A0\uFE0F Some providers failed');\n }\n } else if (results) {\n const now = new Date();\n updatedAt = `${now.getHours().toString().padStart(2, '0')}:${now.getMinutes().toString().padStart(2, '0')}`;\n\n for (const result of results) {\n if (!result.usage) {\n await logger?.debug(`Provider ${result.provider} not configured, skipping`);\n continue;\n }\n\n let usage = result.usage;\n if (result.provider === 'google' && usage?.models) {\n usage = {\n ...usage,\n models: filterFlagshipModels(usage.models),\n };\n }\n\n contentLines.push(...formatProviderSection(result.provider, usage));\n }\n }\n\n if (contentLines.length === 0) {\n return {\n title: '\uD83D\uDCCA Usage',\n message: 'No providers configured',\n variant: 'info',\n };\n }\n\n lines.push(DIVIDER);\n lines.push(...contentLines);\n lines.push(DIVIDER);\n\n let footer = `Updated: ${updatedAt}`;\n if (isStale) footer += ' (stale)';\n lines.push(footer);\n\n return {\n title: '\uD83D\uDCCA Usage',\n message: lines.join('\\n'),\n variant: 'info',\n };\n};\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASa,YAOP,YAmBO,cAuCA;AA1Eb;AAAA;AAAA;AASO,IAAM,aAAa,CAAC,WAA2B;AACpD,UAAI,CAAC,UAAU,OAAO,WAAW,YAAY,OAAO,UAAU,GAAG;AAC/D,eAAO;AAAA,MACT;AACA,aAAO,GAAG,OAAO,MAAM,GAAG,CAAC,CAAC,MAAM,OAAO,MAAM,EAAE,CAAC;AAAA,IACpD;AAEA,IAAM,aAAa;AAAA,MACjB,OAAO,YAAY;AAAA,MAAC;AAAA,MACpB,MAAM,YAAY;AAAA,MAAC;AAAA,MACnB,MAAM,YAAY;AAAA,MAAC;AAAA,MACnB,OAAO,YAAY;AAAA,MAAC;AAAA,IACtB;AAcO,IAAM,eAAe,CAAC,WAA4B;AACvD,YAAM,UAAU;AAEhB,aAAO;AAAA,QACL,OAAO,OAAO,SAAS,UAAU;AAC/B,gBAAO,OAA0B,IAAI,IAAI;AAAA,YACvC;AAAA,YACA,OAAO;AAAA,YACP;AAAA,YACA,GAAI,SAAS,CAAC;AAAA,UAChB,CAAC;AAAA,QACH;AAAA,QACA,MAAM,OAAO,SAAS,UAAU;AAC9B,gBAAO,OAA0B,IAAI,IAAI;AAAA,YACvC;AAAA,YACA,OAAO;AAAA,YACP;AAAA,YACA,GAAI,SAAS,CAAC;AAAA,UAChB,CAAC;AAAA,QACH;AAAA,QACA,MAAM,OAAO,SAAS,UAAU;AAC9B,gBAAO,OAA0B,IAAI,IAAI;AAAA,YACvC;AAAA,YACA,OAAO;AAAA,YACP;AAAA,YACA,GAAI,SAAS,CAAC;AAAA,UAChB,CAAC;AAAA,QACH;AAAA,QACA,OAAO,OAAO,SAAS,UAAU;AAC/B,gBAAO,OAA0B,IAAI,IAAI;AAAA,YACvC;AAAA,YACA,OAAO;AAAA,YACP;AAAA,YACA,GAAI,SAAS,CAAC;AAAA,UAChB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEO,IAAM,aAAa;AAAA;AAAA;;;AC1E1B,SAAS,gBAAgB;AACzB,SAAS,eAAe;AACxB,SAAS,YAAY;AAFrB,IAOa,aAGA,eAGA,cAEA,YAOA,UAaA;AAnCb;AAAA;AAAA;AAOO,IAAM,cAAc,MACzB,QAAQ,IAAI,iBAAiB,KAAK,QAAQ,GAAG,UAAU,OAAO;AAEzD,IAAM,gBAAgB,MAC3B,QAAQ,IAAI,mBAAmB,KAAK,QAAQ,GAAG,SAAS;AAEnD,IAAM,eAAe,MAAc,QAAQ,IAAI,kBAAkB,KAAK,QAAQ,GAAG,QAAQ;AAEzF,IAAM,aAAa;AAAA,MACxB,UAAU,MAAc,KAAK,YAAY,GAAG,YAAY,WAAW;AAAA,MACnE,cAAc,MAAc,KAAK,QAAQ,GAAG,aAAa,QAAQ,aAAa;AAAA,MAC9E,mBAAmB,MAAc,KAAK,cAAc,GAAG,YAAY,2BAA2B;AAAA,MAC9F,iBAAiB,MAAc,KAAK,YAAY,GAAG,YAAY,2BAA2B;AAAA,IAC5F;AAEO,IAAM,WAAW,OAAU,UAAkB,WAAuC;AACzF,UAAI;AACF,cAAM,UAAU,MAAM,SAAS,UAAU,OAAO;AAChD,eAAO,KAAK,MAAM,OAAO;AAAA,MAC3B,SAAS,OAAO;AACd,YAAI,QAAQ;AACV,gBAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,gBAAM,OAAO,MAAM,mCAAmC,QAAQ,IAAI,EAAE,OAAO,QAAQ,CAAC;AAAA,QACtF;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAEO,IAAM,mBAAmB,OAAO,WAAkD;AACvF,aAAO,SAAuB,WAAW,SAAS,GAAG,MAAM;AAAA,IAC7D;AAAA;AAAA;;;ACrCA,SAAS,OAAO,YAAAA,WAAU,QAAQ,QAAQ,iBAAiB;AAA3D,IAMM,WAEO,YAEP,UAEA,gBAcO,WA2BA;AArDb;AAAA;AAAA;AAEA;AAIA,IAAM,YAAY,MAAc,GAAG,aAAa,CAAC;AAE1C,IAAM,aAAa,MAAc,GAAG,UAAU,CAAC;AAEtD,IAAM,WAAW,MAAc,GAAG,WAAW,CAAC;AAE9C,IAAM,iBAAiB,YAA2B;AAChD,UAAI;AACF,cAAM,MAAM,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,MAC9C,SAAS,OAAO;AACd,YACE,iBAAiB,SACjB,UAAU,SACT,MAA2B,SAAS,UACrC;AACA,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEO,IAAM,YAAY,OAAO,WAAiD;AAC/E,UAAI;AACF,cAAM,UAAU,MAAMA,UAAS,WAAW,GAAG,OAAO;AACpD,cAAM,SAAS,KAAK,MAAM,OAAO;AAEjC,YACE,OAAO,WAAW,YAClB,WAAW,QACX,oBAAoB,UACpB,gBAAgB,UAChB,8BAA8B,UAC9B,eAAe,QACf;AACA,iBAAO;AAAA,QACT;AAEA,cAAM,QAAQ,KAAK,sCAAsC;AACzD,eAAO;AAAA,MACT,SAAS,OAAO;AACd,YAAI,QAAQ;AACV,gBAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,gBAAM,OAAO,MAAM,mCAAmC,EAAE,OAAO,QAAQ,CAAC;AAAA,QAC1E;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAEO,IAAM,aAAa,OAAO,OAAoB,WAAmC;AACtF,UAAI;AACF,cAAM,eAAe;AACrB,cAAM,UAAU,KAAK,UAAU,OAAO,MAAM,CAAC;AAC7C,cAAM,UAAU,SAAS,GAAG,SAAS,OAAO;AAC5C,cAAM,OAAO,SAAS,GAAG,WAAW,CAAC;AACrC,cAAM,QAAQ,MAAM,8BAA8B,EAAE,MAAM,WAAW,EAAE,CAAC;AAAA,MAC1E,SAAS,OAAO;AACd,cAAM,QAAQ,MAAM,yBAAyB;AAAA,UAC3C,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC9D,CAAC;AACD,cAAM;AAAA,MACR;AAAA,IACF;AAAA;AAAA;;;AClEA,IAEa,gBACA,0BACA;AAJb;AAAA;AAAA;AAEO,IAAM,iBAAiB;AACvB,IAAM,2BAA2B;AACjC,IAAM,6BAA6B;AAAA;AAAA;;;ACJ1C;AAAA;AAAA;AAAA;AAAA,IAUa;AAVb;AAAA;AAAA;AACA;AACA;AAQO,IAAM,sBAAsB,OAAO,WAAiD;AACzF,YAAM,QAAQ,MAAM,UAAU,MAAM;AACpC,UAAI,CAAC,OAAO;AACV,cAAM,OAAO,KAAK,oBAAoB;AACtC,eAAO;AAAA,MACT;AAEA,YAAM,YAAY,IAAI,KAAK,MAAM,UAAU;AAC3C,YAAM,MAAM,oBAAI,KAAK;AACrB,YAAM,mBAAmB,2BAA2B,MAAO;AAC3D,YAAM,UAAU,IAAI,QAAQ,IAAI,UAAU,QAAQ,IAAI;AAEtD,UAAI,SAAS;AACX,cAAM,OAAO,MAAM,kBAAkB;AAAA,UACnC,WAAW,MAAM;AAAA,UACjB,uBAAuB,2BAA2B;AAAA,QACpD,CAAC;AAAA,MACH;AAEA,YAAM,sBAAgD,CAAC;AAEvD,iBAAW,CAAC,YAAY,KAAK,KAAK,OAAO,QAAQ,MAAM,SAAS,GAAG;AACjE,YAAI,MAAM,YAAY;AACpB,8BAAoB,UAA8C,IAAI;AAAA,QACxE;AAAA,MACF;AAEA,aAAO;AAAA,QACL,WAAW;AAAA,QACX,WAAW,MAAM;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AC1CA,IAAa,4BA2BA,gBAqBA;AAhDb;AAAA;AAAA;AAAO,IAAM,6BAA6B,CACxC,SACA,MAAc,KAAK,IAAI,MACL;AAClB,UAAI,CAAC,SAAS;AACZ,eAAO;AAAA,MACT;AAEA,YAAM,SAAS,UAAU;AACzB,UAAI,UAAU,GAAG;AACf,eAAO;AAAA,MACT;AAEA,aAAO,KAAK,MAAM,SAAS,GAAI;AAAA,IACjC;AAaO,IAAM,iBAAiB,CAAC,YAA4B;AACzD,UAAI,WAAW,GAAG;AAChB,eAAO;AAAA,MACT;AAEA,YAAM,QAAQ,KAAK,MAAM,UAAU,MAAM;AACzC,YAAM,OAAO,KAAK,MAAO,UAAU,SAAU,KAAK;AAClD,YAAM,QAAQ,KAAK,MAAO,UAAU,QAAS,IAAI;AACjD,YAAM,UAAU,KAAK,MAAO,UAAU,OAAQ,EAAE;AAChD,YAAM,OAAO,UAAU;AAEvB,YAAM,QAAkB,CAAC;AACzB,UAAI,QAAQ,EAAG,OAAM,KAAK,GAAG,KAAK,GAAG;AACrC,UAAI,OAAO,EAAG,OAAM,KAAK,GAAG,IAAI,GAAG;AACnC,UAAI,QAAQ,EAAG,OAAM,KAAK,GAAG,KAAK,GAAG;AACrC,UAAI,UAAU,EAAG,OAAM,KAAK,GAAG,OAAO,GAAG;AACzC,UAAI,OAAO,KAAK,MAAM,WAAW,EAAG,OAAM,KAAK,GAAG,IAAI,GAAG;AAEzD,aAAO,MAAM,KAAK,GAAG;AAAA,IACvB;AAEO,IAAM,gBAAgB,CAAC,cAA8B;AAC1D,aAAO,IAAI,KAAK,SAAS,EAAE,eAAe,QAAW;AAAA,QACnD,SAAS;AAAA,QACT,MAAM;AAAA,QACN,OAAO;AAAA,QACP,KAAK;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,cAAc;AAAA,MAChB,CAAC;AAAA,IACH;AAAA;AAAA;;;AC3DA,IAEa,kBAqBA;AAvBb;AAAA;AAAA;AAEO,IAAM,mBAAwD;AAAA,MACnE,QAAQ,CAAC,UAAU,SAAS,SAAS;AAAA,MACrC,QAAQ,CAAC,UAAU,aAAa;AAAA,MAChC,mBAAmB,CAAC,mBAAmB,OAAO,MAAM;AAAA,IACtD;AAiBO,IAAM,qBAAqB,CAAC,aAA0C;AAC3E,aAAO,iBAAiB,QAAQ;AAAA,IAClC;AAAA;AAAA;;;ACzBA,IAkBM,YAgBA,uBAgBA,eA2BA,eAUA,sBA8BO;AArHb;AAAA;AAAA;AAOA;AACA;AAUA,IAAM,aAAa,CAAC,UAAyD;AAC3E,UAAI,CAAC,OAAO;AACV,eAAO;AAAA,MACT;AAEA,UAAI,OAAO,UAAU,UAAU;AAC7B,eAAO,EAAE,OAAO,MAAM;AAAA,MACxB;AAEA,UAAI,OAAO,UAAU,UAAU;AAC7B,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT;AAEA,IAAM,wBAAwB,OAAO,WAAsD;AACzF,YAAM,OAAO,MAAM,iBAAiB,MAAM;AAC1C,UAAI,CAAC,MAAM;AACT,eAAO;AAAA,MACT;AAEA,iBAAW,SAAS,mBAAmB,QAAQ,GAAG;AAChD,cAAM,QAAQ,WAAW,KAAK,KAAK,CAAC;AACpC,YAAI,OAAO;AACT,iBAAO;AAAA,QACT;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAEA,IAAM,gBAAgB,CAAC,UAA6D;AAClF,UAAI,CAAC,OAAO;AACV,eAAO;AAAA,MACT;AAEA,YAAM,cAAc,MAAM,UAAU,MAAM;AAC1C,UAAI,eAAe,MAAM;AACzB,UAAI,YAAgC;AAEpC,UAAI,gBAAgB,aAAa,SAAS,GAAG,GAAG;AAC9C,cAAM,QAAQ,aAAa,MAAM,GAAG;AACpC,uBAAe,MAAM,CAAC;AACtB,oBAAY,MAAM,CAAC;AAAA,MACrB;AAEA,UAAI,CAAC,eAAe,CAAC,cAAc;AACjC,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,SAAS,MAAM;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAEA,IAAM,gBAAgB,CAAC,aAAwE;AAC7F,UAAI,CAAC,UAAU,UAAU,QAAQ;AAC/B,eAAO;AAAA,MACT;AAEA,YAAM,iBAAiB,SAAS,eAAe;AAC/C,YAAM,UAAU,SAAS,SAAS,cAAc,KAAK,SAAS,SAAS,CAAC;AACxE,aAAO,WAAW;AAAA,IACpB;AAEA,IAAM,uBAAuB,OAAO,WAAuD;AACzF,YAAM,iBAAiB,MAAM;AAAA,QAC3B,WAAW,kBAAkB;AAAA,QAC7B;AAAA,MACF;AACA,YAAM,UAAU,cAAc,cAAc;AAC5C,UAAI,SAAS;AACX,eAAO;AAAA,UACL,cAAc,QAAQ;AAAA,UACtB,WAAW,QAAQ,aAAa,QAAQ;AAAA,UACxC,OAAO,QAAQ;AAAA,QACjB;AAAA,MACF;AAEA,YAAM,eAAe,MAAM;AAAA,QACzB,WAAW,gBAAgB;AAAA,QAC3B;AAAA,MACF;AACA,YAAM,kBAAkB,cAAc,YAAY;AAClD,UAAI,CAAC,iBAAiB;AACpB,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,QACL,cAAc,gBAAgB;AAAA,QAC9B,WAAW,gBAAgB,aAAa,gBAAgB;AAAA,QACxD,OAAO,gBAAgB;AAAA,MACzB;AAAA,IACF;AAEO,IAAM,gBAAgB,OAAO,WAAuD;AACzF,YAAM,eAAe,MAAM,sBAAsB,MAAM;AACvD,YAAM,cAAc,cAAc,YAAY;AAC9C,UAAI,aAAa;AACf,eAAO;AAAA,MACT;AAEA,aAAO,qBAAqB,MAAM;AAAA,IACpC;AAAA;AAAA;;;AC7HA,IAKM,kBAEA,sBACA,oBACA,gBAEA,WAMA,SAwBA,oBAgCA,aAiCA,UAkBA,YAkBA,oBAoBO;AAlKb;AAAA;AAAA;AACA;AACA;AACA;AAEA,IAAM,mBACJ;AACF,IAAM,uBAAuB;AAC7B,IAAM,qBAAqB;AAC3B,IAAM,iBAAiB,IAAI,KAAK;AAEhC,IAAM,YAA+B;AAAA,MACnC;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,IAAM,UAAU;AAAA,MACd,cAAc;AAAA,MACd,qBAAqB;AAAA,MACrB,mBACE;AAAA,IACJ;AAmBA,IAAM,qBAAqB,OACzB,cACA,WACkC;AAClC,UAAI;AACF,cAAM,WAAW,MAAM,MAAM,uCAAuC;AAAA,UAClE,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,oCAAoC;AAAA,UAC/D,MAAM,IAAI,gBAAgB;AAAA,YACxB,WAAW;AAAA,YACX,eAAe;AAAA,YACf,eAAe;AAAA,YACf,YAAY;AAAA,UACd,CAAC;AAAA,QACH,CAAC;AAED,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,OAAO,KAAK,4CAA4C;AAAA,YAC5D,QAAQ,SAAS;AAAA,YACjB,OAAO,WAAW,YAAY;AAAA,UAChC,CAAC;AACD,iBAAO;AAAA,QACT;AAEA,eAAQ,MAAM,SAAS,KAAK;AAAA,MAC9B,SAAS,OAAO;AACd,cAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,cAAM,OAAO,KAAK,oCAAoC,OAAO,EAAE;AAC/D,eAAO;AAAA,MACT;AAAA,IACF;AAEA,IAAM,cAAc,OAClB,aACA,WACA,WACmC;AACnC,YAAM,OAAO,YAAY,EAAE,SAAS,UAAU,IAAI,CAAC;AAEnD,iBAAW,YAAY,WAAW;AAChC,YAAI;AACF,gBAAM,WAAW,MAAM,MAAM,GAAG,QAAQ,oCAAoC;AAAA,YAC1E,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,eAAe,UAAU,WAAW;AAAA,cACpC,gBAAgB;AAAA,cAChB,GAAG;AAAA,YACL;AAAA,YACA,MAAM,KAAK,UAAU,IAAI;AAAA,YACzB,QAAQ,YAAY,QAAQ,IAAK;AAAA,UACnC,CAAC;AAED,cAAI,SAAS,IAAI;AACf,kBAAM,OAAO,MAAM,uBAAuB,QAAQ,IAAI,EAAE,UAAU,CAAC;AACnE,mBAAQ,MAAM,SAAS,KAAK;AAAA,UAC9B;AAAA,QACF,QAAQ;AACN;AAAA,QACF;AAAA,MACF;AAEA,YAAM,OAAO,MAAM,oDAAoD,EAAE,UAAU,CAAC;AACpF,aAAO;AAAA,IACT;AAEA,IAAM,WAAW,CAAC,mBAA4B,cAAoC;AAChF,YAAM,mBACJ,sBAAsB,SAAY,KAAK,MAAM,oBAAoB,GAAG,IAAI;AAC1E,YAAM,cAAc,qBAAqB,OAAO,KAAK,IAAI,GAAG,MAAM,gBAAgB,IAAI;AACtF,YAAM,UAAU,YAAY,IAAI,KAAK,SAAS,EAAE,QAAQ,IAAI;AAC5D,YAAM,oBAAoB,2BAA2B,OAAO;AAE5D,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,eAAe;AAAA,QACf;AAAA,QACA;AAAA,QACA,kBAAkB,UAAU,cAAc,OAAO,IAAI;AAAA,QACrD,qBAAqB,sBAAsB,OAAO,eAAe,iBAAiB,IAAI;AAAA,MACxF;AAAA,IACF;AAEA,IAAM,aAAa,CAAC,SAAwC;AAC1D,YAAM,SAAmE,CAAC;AAE1E,iBAAW,CAAC,WAAW,SAAS,KAAK,OAAO,QAAQ,KAAK,UAAU,CAAC,CAAC,GAAG;AACtE,cAAM,SAAS,SAAS,UAAU,WAAW,mBAAmB,UAAU,WAAW,SAAS;AAC9F,eAAO,SAAS,IAAI;AAAA,UAClB,SAAS;AAAA,YACP,MAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS,CAAC;AAAA,QACV,QAAQ,OAAO,KAAK,MAAM,EAAE,SAAS,SAAS;AAAA,MAChD;AAAA,IACF;AAEA,IAAM,qBAAqB,OACzB,cACA,aACA,SACA,WAC2B;AAC3B,YAAM,MAAM,KAAK,IAAI;AAErB,UAAI,gBAAgB,CAAC,WAAW,UAAU,MAAM;AAC9C,eAAO;AAAA,MACT;AAEA,UAAI,CAAC,cAAc;AACjB,eAAO;AAAA,MACT;AAEA,YAAM,YAAY,MAAM,mBAAmB,cAAc,MAAM;AAC/D,aAAO,WAAW,gBAAgB;AAAA,IACpC;AAEO,IAAM,mBAAmB,OAAO,SAAiB,eAAwC;AAC9F,YAAM,OAAO,MAAM,cAAc,MAAM;AAEvC,UAAI,CAAC,MAAM;AACT,cAAM,OAAO,KAAK,+BAA+B;AACjD,eAAO;AAAA,UACL,UAAU;AAAA,UACV,IAAI;AAAA,UACJ,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,MACF;AAEA,YAAM,cAAc,MAAM;AAAA,QACxB,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL;AAAA,MACF;AAEA,UAAI,CAAC,aAAa;AAChB,cAAM,OAAO,KAAK,4CAA4C,EAAE,OAAO,KAAK,MAAM,CAAC;AACnF,eAAO;AAAA,UACL,UAAU;AAAA,UACV,IAAI;AAAA,UACJ,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,MACF;AAEA,YAAM,YAAY,KAAK,aAAa;AACpC,YAAM,aAAa,MAAM,YAAY,aAAa,WAAW,MAAM;AAEnE,UAAI,CAAC,YAAY;AACf,cAAM,OAAO,MAAM,0CAA0C,EAAE,UAAU,CAAC;AAC1E,eAAO;AAAA,UACL,UAAU;AAAA,UACV,IAAI;AAAA,UACJ,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,MACF;AAEA,YAAM,OAAO,KAAK,mCAAmC;AAErD,aAAO;AAAA,QACL,UAAU;AAAA,QACV,IAAI;AAAA,QACJ,YAAY;AAAA,QACZ,OAAO,WAAW,UAAU;AAAA,MAC9B;AAAA,IACF;AAAA;AAAA;;;ACxNA,IAKMC,aAgBA,gBAIAC,wBAgBO;AAzCb,IAAAC,aAAA;AAAA;AAAA;AAEA;AACA;AAEA,IAAMF,cAAa,CAAC,UAAyD;AAC3E,UAAI,CAAC,OAAO;AACV,eAAO;AAAA,MACT;AAEA,UAAI,OAAO,UAAU,UAAU;AAC7B,eAAO,EAAE,OAAO,MAAM;AAAA,MACxB;AAEA,UAAI,OAAO,UAAU,UAAU;AAC7B,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT;AAEA,IAAM,iBAAiB,CAAC,SAA4D;AAClF,aAAO,QAAQ,MAAM,UAAU,MAAM,KAAK;AAAA,IAC5C;AAEA,IAAMC,yBAAwB,OAAO,WAAsD;AACzF,YAAM,OAAO,MAAM,iBAAiB,MAAM;AAC1C,UAAI,CAAC,MAAM;AACT,eAAO;AAAA,MACT;AAEA,iBAAW,SAAS,mBAAmB,QAAQ,GAAG;AAChD,cAAM,QAAQD,YAAW,KAAK,KAAK,CAAC;AACpC,YAAI,SAAS,eAAe,KAAK,GAAG;AAClC,iBAAO;AAAA,QACT;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAEO,IAAM,gBAAgB,OAAO,WAAsD;AACxF,YAAM,eAAe,MAAMC,uBAAsB,MAAM;AACvD,UAAI,gBAAgB,eAAe,YAAY,GAAG;AAChD,eAAO;AAAA,MACT;AAEA,YAAM,aAAa,MAAM,SAA2B,WAAW,aAAa,GAAG,MAAM;AACrF,UAAI,cAAc,eAAe,UAAU,GAAG;AAC5C,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT;AAAA;AAAA;;;ACrDA,IAsBME,WAoBO;AA1Cb,IAAAC,cAAA;AAAA;AAAA;AACA;AACA;AACA,IAAAC;AAmBA,IAAMF,YAAW,CAAC,WAAqD;AACrE,UAAI,CAAC,QAAQ;AACX,eAAO;AAAA,MACT;AAEA,YAAM,cAAc,OAAO;AAC3B,YAAM,UAAU,OAAO,WAAW,OAAO,WAAW,MAAO;AAC3D,YAAM,oBAAoB,OAAO,uBAAuB,2BAA2B,OAAO;AAE1F,aAAO;AAAA,QACL;AAAA,QACA,kBAAkB,KAAK,IAAI,GAAG,MAAM,WAAW;AAAA,QAC/C,eAAe,OAAO,wBAAwB;AAAA,QAC9C;AAAA,QACA;AAAA,QACA,kBAAkB,UAAU,cAAc,OAAO,IAAI;AAAA,QACrD,qBAAqB,sBAAsB,OAAO,eAAe,iBAAiB,IAAI;AAAA,MACxF;AAAA,IACF;AAEO,IAAM,mBAAmB,OAAO,SAAiB,eAAwC;AAC9F,YAAM,OAAO,MAAM,cAAc,MAAM;AAEvC,UAAI,CAAC,MAAM;AACT,cAAM,OAAO,KAAK,+BAA+B;AACjD,eAAO;AAAA,UACL,UAAU;AAAA,UACV,IAAI;AAAA,UACJ,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,MACF;AAEA,YAAM,cAAc,KAAK,UAAU,KAAK;AACxC,UAAI,CAAC,aAAa;AAChB,cAAM,OAAO,KAAK,qDAAqD;AACvE,eAAO;AAAA,UACL,UAAU;AAAA,UACV,IAAI;AAAA,UACJ,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,MACF;AAEA,UAAI;AACF,cAAM,WAAW,MAAM,MAAM,8CAA8C;AAAA,UACzE,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,eAAe,UAAU,WAAW;AAAA,YACpC,gBAAgB;AAAA,UAClB;AAAA,QACF,CAAC;AAED,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,OAAO,MAAM,aAAa,SAAS,MAAM,eAAe;AAAA,YAC5D,OAAO,WAAW,WAAW;AAAA,UAC/B,CAAC;AACD,iBAAO;AAAA,YACL,UAAU;AAAA,YACV,IAAI;AAAA,YACJ,YAAY;AAAA,YACZ,OAAO,cAAc,SAAS,MAAM;AAAA,YACpC,OAAO;AAAA,UACT;AAAA,QACF;AAEA,cAAM,UAAW,MAAM,SAAS,KAAK;AACrC,cAAM,UAAUA,UAAS,QAAQ,WAAW,cAAc;AAC1D,cAAM,YAAYA,UAAS,QAAQ,WAAW,gBAAgB;AAE9D,cAAM,UAAuC,CAAC;AAC9C,YAAI,SAAS;AACX,kBAAQ,IAAI,IAAI;AAAA,QAClB;AACA,YAAI,WAAW;AACb,kBAAQ,QAAQ,IAAI;AAAA,QACtB;AAEA,cAAM,QAAuB;AAAA,UAC3B;AAAA,QACF;AAEA,cAAM,OAAO,KAAK,mCAAmC;AAErD,eAAO;AAAA,UACL,UAAU;AAAA,UACV,IAAI;AAAA,UACJ,YAAY;AAAA,UACZ;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,cAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,cAAM,OAAO,MAAM,8BAA8B,OAAO,EAAE;AAC1D,eAAO;AAAA,UACL,UAAU;AAAA,UACV,IAAI;AAAA,UACJ,YAAY;AAAA,UACZ,OAAO,mBAAmB,OAAO;AAAA,UACjC,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AC7HA,IAKM,kBAgBO;AArBb,IAAAG,aAAA;AAAA;AAAA;AAEA;AACA;AAEA,IAAM,mBAAmB,CAAC,UAA+C;AACvE,UAAI,CAAC,OAAO;AACV,eAAO;AAAA,MACT;AAEA,UAAI,OAAO,UAAU,UAAU;AAC7B,eAAO;AAAA,MACT;AAEA,UAAI,OAAO,UAAU,UAAU;AAC7B,eAAO,MAAM,WAAW,MAAM,SAAS,MAAM,OAAO;AAAA,MACtD;AAEA,aAAO;AAAA,IACT;AAEO,IAAM,eAAe,OAAO,WAA4C;AAC7E,UAAI,QAAQ,IAAI,aAAa;AAC3B,eAAO,QAAQ,IAAI;AAAA,MACrB;AAEA,YAAM,OAAO,MAAM,iBAAiB,MAAM;AAC1C,UAAI,CAAC,MAAM;AACT,eAAO;AAAA,MACT;AAEA,iBAAW,SAAS,mBAAmB,iBAAiB,GAAG;AACzD,cAAM,QAAQ,iBAAiB,KAAK,KAAK,CAAC;AAC1C,YAAI,OAAO;AACT,iBAAO;AAAA,QACT;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA;AAAA;;;ACvCA,IAyBM,oBAIA,sBAIA,sBAiBA,oBAiBAC,WAqBO;AAxFb,IAAAC,cAAA;AAAA;AAAA;AACA;AACA;AACA,IAAAC;AAsBA,IAAM,qBAAqB,CAAC,UAA0B;AACpD,aAAO,QAAQ,OAAoB,QAAQ,MAAO;AAAA,IACpD;AAEA,IAAM,uBAA+C;AAAA,MACnD,GAAG;AAAA,IACL;AAEA,IAAM,uBAAuB,CAAC,UAAoC;AAChE,UAAI,CAAC,OAAO;AACV,eAAO;AAAA,MACT;AAEA,UAAI,CAAC,MAAM,QAAQ;AACjB,eAAO;AAAA,MACT;AAEA,YAAM,cAAc,qBAAqB,MAAM,IAAI;AACnD,UAAI,CAAC,aAAa;AAChB,eAAO;AAAA,MACT;AAEA,aAAO,cAAc,MAAM;AAAA,IAC7B;AAEA,IAAM,qBAAqB,CAAC,kBAAyC;AACnE,UAAI,CAAC,eAAe;AAClB,eAAO;AAAA,MACT;AAEA,UAAI,gBAAgB,UAAU,GAAG;AAC/B,cAAM,OAAO,gBAAgB;AAC7B,eAAO,SAAS,IAAI,WAAW,GAAG,IAAI;AAAA,MACxC;AAEA,UAAI,gBAAgB,SAAS,GAAG;AAC9B,eAAO,GAAG,gBAAgB,IAAI;AAAA,MAChC;AAEA,aAAO,GAAG,aAAa;AAAA,IACzB;AAEA,IAAMF,YAAW,CAAC,UAAyC;AACzD,UAAI,CAAC,OAAO;AACV,eAAO;AAAA,MACT;AAEA,YAAM,cAAc,MAAM,cAAc;AACxC,YAAM,mBAAmB,gBAAgB,OAAO,KAAK,IAAI,GAAG,MAAM,WAAW,IAAI;AACjF,YAAM,UAAU,MAAM,gBAAgB,mBAAmB,MAAM,aAAa,IAAI;AAChF,YAAM,oBAAoB,2BAA2B,OAAO;AAE5D,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,eAAe,qBAAqB,KAAK;AAAA,QACzC;AAAA,QACA;AAAA,QACA,kBAAkB,UAAU,cAAc,OAAO,IAAI;AAAA,QACrD,qBAAqB,sBAAsB,OAAO,eAAe,iBAAiB,IAAI;AAAA,MACxF;AAAA,IACF;AAEO,IAAM,gBAAgB,OAAO,SAAiB,eAAwC;AAC3F,YAAM,SAAS,MAAM,aAAa,MAAM;AAExC,UAAI,CAAC,QAAQ;AACX,cAAM,OAAO,KAAK,wCAAwC;AAC1D,eAAO;AAAA,UACL,UAAU;AAAA,UACV,IAAI;AAAA,UACJ,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,MACF;AAEA,UAAI;AACF,cAAM,WAAW,MAAM,MAAM,kDAAkD;AAAA,UAC7E,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,eAAe,UAAU,MAAM;AAAA,YAC/B,gBAAgB;AAAA,UAClB;AAAA,QACF,CAAC;AAED,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,OAAO,MAAM,aAAa,SAAS,MAAM,wBAAwB;AAAA,YACrE,OAAO,WAAW,MAAM;AAAA,UAC1B,CAAC;AACD,iBAAO;AAAA,YACL,UAAU;AAAA,YACV,IAAI;AAAA,YACJ,YAAY;AAAA,YACZ,OAAO,cAAc,SAAS,MAAM;AAAA,YACpC,OAAO;AAAA,UACT;AAAA,QACF;AAEA,cAAM,UAAW,MAAM,SAAS,KAAK;AACrC,cAAM,SAAS,QAAQ,MAAM,UAAU,CAAC;AACxC,cAAM,cAAc,OAAO,KAAK,CAAC,UAAU,MAAM,SAAS,cAAc;AAExE,cAAM,UAAuC,CAAC;AAC9C,cAAM,SAASA,UAAS,WAAW;AACnC,YAAI,QAAQ;AACV,gBAAM,QAAQ,mBAAmB,OAAO,aAAa;AACrD,kBAAQ,KAAK,IAAI;AAAA,QACnB;AAEA,cAAM,QAAuB;AAAA,UAC3B;AAAA,QACF;AAEA,cAAM,OAAO,KAAK,4CAA4C;AAE9D,eAAO;AAAA,UACL,UAAU;AAAA,UACV,IAAI;AAAA,UACJ,YAAY;AAAA,UACZ;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,cAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,cAAM,OAAO,MAAM,uCAAuC,OAAO,EAAE;AACnE,eAAO;AAAA,UACL,UAAU;AAAA,UACV,IAAI;AAAA,UACJ,YAAY;AAAA,UACZ,OAAO,mBAAmB,OAAO;AAAA,UACjC,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AC9JA,IAMa;AANb;AAAA;AAAA;AAMO,IAAM,YAAgC,CAAC,UAAU,UAAU,iBAAiB;AAAA;AAAA;;;ACNnF;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAG,cAAA;AAAA;AAAA;AACA;AAIA;AAAA;AAAA;;;ACLA,IAQM,YAWO;AAnBb;AAAA;AAAA;AAAA;AACA,IAAAC;AACA,IAAAA;AAEA,IAAAC;AACA;AACA;AAEA,IAAM,aAAa,OAAO,UAAsB,WAA4C;AAC1F,cAAQ,UAAU;AAAA,QAChB,KAAK;AACH,iBAAO,iBAAiB,MAAM;AAAA,QAChC,KAAK;AACH,iBAAO,iBAAiB,MAAM;AAAA,QAChC,KAAK;AACH,iBAAO,cAAc,MAAM;AAAA,MAC/B;AAAA,IACF;AAEO,IAAM,oBAAoB,OAAO,WAAyC;AAC/E,YAAM,OAAO,KAAK,kCAAkC;AAEpD,YAAM,gBAAgB,MAAM,UAAU,MAAM;AAE5C,YAAM,UAAU,MAAM,QAAQ,IAAI,UAAU,IAAI,CAAC,aAAa,WAAW,UAAU,MAAM,CAAC,CAAC;AAE3F,YAAM,YAAsE,CAAC;AAK7E,YAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAEnC,iBAAW,UAAU,SAAS;AAC5B,cAAM,aAAa,OAAO;AAC1B,cAAM,gBAAgB,eAAe,UAAU,UAAU,GAAG,cAAc;AAE1E,kBAAU,UAAU,IAAI;AAAA,UACtB,WAAW;AAAA,UACX,YAAY,OAAO;AAAA,UACnB,iBAAiB;AAAA,UACjB,iBAAiB,OAAO,KAAK,MAAM;AAAA,UACnC,MAAM,OAAO,KAAK,OAAO,QAAQ;AAAA,UACjC,OAAO,OAAO,KAAK,OAAQ,OAAO,SAAS;AAAA,QAC7C;AAEA,YAAI,CAAC,OAAO,cAAc,eAAe;AACvC,oBAAU,UAAU,EAAE,OAAO;AAC7B,gBAAM,OAAO,MAAM,kBAAkB,UAAU,yBAAyB;AAAA,QAC1E;AAAA,MACF;AAEA,YAAM,QAAqB;AAAA,QACzB,gBAAgB;AAAA,QAChB,YAAY;AAAA,QACZ,0BAA0B;AAAA,QAC1B;AAAA,MACF;AAEA,YAAM,WAAW,OAAO,MAAM;AAC9B,aAAO;AAAA,IACT;AAAA;AAAA;;;AC7DA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAII,YAES,aAuBA,YAWA;AAxCb;AAAA;AAAA;AACA;AACA;AAEA,IAAI,aAA+D;AAE5D,IAAM,cAAc,CAAC,WAAyB;AACnD,UAAI,eAAe,MAAM;AACvB,eAAO,KAAK,wBAAwB;AACpC;AAAA,MACF;AAEA,YAAM,cAAc,YAA2B;AAC7C,YAAI;AACF,gBAAM,kBAAkB,MAAM;AAAA,QAChC,SAAS,OAAO;AACd,gBAAM,OAAO,MAAM,yBAAyB;AAAA,YAC1C,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UAC9D,CAAC;AAAA,QACH;AAAA,MACF;AAEA,WAAK,YAAY;AAEjB,mBAAa,WAAW,YAAY,aAAa,2BAA2B,GAAI;AAEhF,WAAK,OAAO,KAAK,oCAAoC,wBAAwB,GAAG;AAAA,IAClF;AAEO,IAAM,aAAa,CAAC,WAAyB;AAClD,UAAI,eAAe,MAAM;AACvB;AAAA,MACF;AAEA,iBAAW,cAAc,UAAU;AACnC,mBAAa;AAEb,WAAK,OAAO,KAAK,gBAAgB;AAAA,IACnC;AAEO,IAAM,kBAAkB,MAAe,eAAe;AAAA;AAAA;;;ACtC7D;AADA,SAAS,YAAY;;;ACCrB,IAAM,oBAA8B;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,kBAAkB,CAAC,cAA+B;AAC7D,SAAO,kBAAkB,KAAK,CAAC,YAAY,QAAQ,KAAK,SAAS,CAAC;AACpE;AAEO,IAAM,uBAAuB,CAClC,WACiC;AACjC,MAAI,CAAC,QAAQ;AACX,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,WAAyC,CAAC;AAEhD,aAAW,CAAC,WAAW,SAAS,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC3D,QAAI,gBAAgB,SAAS,GAAG;AAC9B,eAAS,SAAS,IAAI;AAAA,IACxB;AAAA,EACF;AAEA,SAAO;AACT;;;AChBA,IAAM,YAAY,CAAC,qBAA8E;AAC/F,MAAI,qBAAqB,MAAM;AAC7B,WAAO,EAAE,OAAO,UAAK,MAAM,MAAM;AAAA,EACnC;AAEA,MAAI,mBAAmB,IAAI;AACzB,WAAO,EAAE,OAAO,aAAM,MAAM,WAAW;AAAA,EACzC;AAEA,MAAI,mBAAmB,IAAI;AACzB,WAAO,EAAE,OAAO,aAAM,MAAM,UAAU;AAAA,EACxC;AAEA,SAAO,EAAE,OAAO,aAAM,MAAM,KAAK;AACnC;AAEO,IAAM,oBAAoB,CAAC,QAAwB;AACxD,UAAQ,KAAK;AAAA,IACX,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO,GAAG,GAAG;AAAA,EACjB;AACF;AAEO,IAAM,YAAY,CAAC,SAAwB,QAAgB,OAAe;AAC/E,MAAI,YAAY,MAAM;AACpB,WAAO,IAAI,SAAI,OAAO,KAAK,CAAC;AAAA,EAC9B;AAGA,QAAM,eAAe,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,OAAO,CAAC;AACvD,QAAM,eAAe,KAAK,MAAO,eAAe,MAAO,KAAK;AAC5D,QAAM,cAAc,QAAQ;AAE5B,SAAO,IAAI,SAAI,OAAO,YAAY,CAAC,GAAG,SAAI,OAAO,WAAW,CAAC;AAC/D;AAEA,IAAM,eAAe,CAAC,KAAa,WAAyC;AAC1E,QAAM,mBAAmB,OAAO,oBAAoB;AACpD,QAAM,EAAE,OAAO,KAAK,IAAI,UAAU,gBAAgB;AAElD,SAAO;AAAA,IACL,OAAO,kBAAkB,GAAG;AAAA,IAC5B,aAAa,OAAO,eAAe;AAAA,IACnC;AAAA,IACA,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,UAAU,OAAO,uBAAuB;AAAA,EAC1C;AACF;AAEO,IAAM,sBAAsB,CACjC,UACkB;AAClB,MAAI,UAAU,MAAM;AAClB,WAAO,EAAE,WAAW,CAAC,EAAE;AAAA,EACzB;AAEA,MAAI,EAAE,eAAe,QAAQ;AAC3B,WAAO,+BAA+B,KAAK;AAAA,EAC7C;AAEA,SAAO,6BAA6B,KAAK;AAC3C;AAEA,IAAM,iCAAiC,CAAC,YAA6C;AACnF,QAAM,YAAiC,CAAC;AAExC,aAAW,UAAU,SAAS;AAC5B,QAAI,CAAC,OAAO,OAAO;AACjB;AAAA,IACF;AAEA,UAAM,WAA+B,CAAC;AACtC,QAAI,QAAQ,OAAO;AAEnB,QAAI,OAAO,aAAa,YAAY,MAAM,QAAQ;AAChD,cAAQ;AAAA,QACN,GAAG;AAAA,QACH,QAAQ,qBAAqB,MAAM,MAAM;AAAA,MAC3C;AAAA,IACF;AAEA,UAAM,gBAAgB,OAAO,QAAQ,MAAM,OAAO;AAClD,QAAI,cAAc,SAAS,GAAG;AAC5B,eAAS,KAAK;AAAA,QACZ,OAAO;AAAA,QACP,SAAS,cAAc,IAAI,CAAC,CAAC,KAAK,GAAG,MAAM,aAAa,KAAK,GAAG,CAAC;AAAA,MACnE,CAAC;AAAA,IACH;AAEA,QAAI,MAAM,QAAQ;AAChB,YAAM,gBAAoC,CAAC;AAC3C,iBAAW,CAAC,WAAW,UAAU,KAAK,OAAO,QAAQ,MAAM,MAAM,GAAG;AAClE,cAAM,qBAAqB,OAAO,QAAQ,WAAW,OAAO;AAC5D,YAAI,mBAAmB,SAAS,GAAG;AACjC,wBAAc,KAAK;AAAA,YACjB,OAAO;AAAA,YACP,SAAS,mBAAmB,IAAI,CAAC,CAAC,KAAK,GAAG,MAAM,aAAa,KAAK,GAAG,CAAC;AAAA,UACxE,CAAC;AAAA,QACH;AAAA,MACF;AAEA,UAAI,cAAc,SAAS,GAAG;AAC5B,iBAAS,KAAK;AAAA,UACZ,OAAO;AAAA,UACP,SAAS,CAAC;AAAA,UACV,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,SAAS,SAAS,GAAG;AACvB,gBAAU,KAAK;AAAA,QACb,MAAM,OAAO,SAAS,YAAY,EAAE,QAAQ,MAAM,GAAG;AAAA,QACrD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,UAAU;AACrB;AAEA,IAAM,+BAA+B,CAAC,iBAA8C;AAClF,QAAM,YAAiC,CAAC;AAExC,aAAW,CAAC,YAAY,KAAK,KAAK,OAAO,QAAQ,aAAa,SAAS,GAAG;AACxE,QAAI,CAAC,MAAM,MAAM;AACf;AAAA,IACF;AAEA,UAAM,WAA+B,CAAC;AACtC,QAAI,QAAQ,MAAM;AAElB,QAAI,eAAe,YAAY,MAAM,QAAQ;AAC3C,cAAQ;AAAA,QACN,GAAG;AAAA,QACH,QAAQ,qBAAqB,MAAM,MAAM;AAAA,MAC3C;AAAA,IACF;AAEA,UAAM,gBAAgB,OAAO,QAAQ,MAAM,OAAO;AAClD,QAAI,cAAc,SAAS,GAAG;AAC5B,eAAS,KAAK;AAAA,QACZ,OAAO;AAAA,QACP,SAAS,cAAc,IAAI,CAAC,CAAC,KAAK,GAAG,MAAM,aAAa,KAAK,GAAG,CAAC;AAAA,MACnE,CAAC;AAAA,IACH;AAEA,QAAI,MAAM,QAAQ;AAChB,YAAM,gBAAoC,CAAC;AAC3C,iBAAW,CAAC,WAAW,UAAU,KAAK,OAAO,QAAQ,MAAM,MAAM,GAAG;AAClE,cAAM,qBAAqB,OAAO,QAAQ,WAAW,OAAO;AAC5D,YAAI,mBAAmB,SAAS,GAAG;AACjC,wBAAc,KAAK;AAAA,YACjB,OAAO;AAAA,YACP,SAAS,mBAAmB,IAAI,CAAC,CAAC,KAAK,GAAG,MAAM,aAAa,KAAK,GAAG,CAAC;AAAA,UACxE,CAAC;AAAA,QACH;AAAA,MACF;AAEA,UAAI,cAAc,SAAS,GAAG;AAC5B,iBAAS,KAAK;AAAA,UACZ,OAAO;AAAA,UACP,SAAS,CAAC;AAAA,UACV,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,SAAS,SAAS,GAAG;AACvB,gBAAU,KAAK;AAAA,QACb,MAAM,WAAW,YAAY,EAAE,QAAQ,MAAM,GAAG;AAAA,QAChD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,UAAU;AACrB;AAEO,IAAM,wBAAwB,CACnC,MACA,WACA,YACW;AACX,MAAI,KAAK,UAAU,WAAW,GAAG;AAC/B,QAAIC,UAAS;AACb,QAAI,WAAW;AACb,MAAAA,WAAU;AAAA;AAAA,cAAmB,SAAS;AAAA,IACxC;AACA,WAAOA;AAAA,EACT;AAEA,QAAM,QAAkB,CAAC;AACzB,QAAM,eAAe;AAErB,aAAW,YAAY,KAAK,WAAW;AAGrC,UAAM,eAAe,SAAS;AAC9B,UAAM,YAAY,KAAK,IAAI,GAAG,eAAe,aAAa,SAAS,CAAC;AACpE,UAAM,KAAK,GAAG,YAAY,IAAI,SAAI,OAAO,SAAS,CAAC,EAAE;AAErD,aAAS,IAAI,GAAG,IAAI,SAAS,SAAS,QAAQ,KAAK;AACjD,YAAM,UAAU,SAAS,SAAS,CAAC;AAEnC,YAAM,KAAK,QAAQ,KAAK;AAGxB,eAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,QAAQ,KAAK;AAC/C,cAAM,SAAS,QAAQ,QAAQ,CAAC;AAChC,cAAM,eAAe,MAAM,QAAQ,QAAQ,SAAS;AAEpD,cAAM,SAAS,eAAe,iBAAO;AACrC,cAAM,OAAO,eAAe,OAAO;AAGnC,cAAM,KAAK,KAAK,MAAM,IAAI,OAAO,KAAK,EAAE;AAGxC,cAAM,aACJ,OAAO,gBAAgB,OAAO,GAAG,KAAK,MAAM,OAAO,WAAW,CAAC,MAAM;AACvE,cAAM;AAAA,UACJ,KAAK,IAAI,IAAI,UAAU,OAAO,WAAW,CAAC,KAAK,UAAU,qBAAgB,OAAO,QAAQ;AAAA,QAC1F;AAGA,YAAI,CAAC,cAAc;AACjB,gBAAM,KAAK,KAAK,IAAI,EAAE;AAAA,QACxB;AAAA,MACF;AAGA,UAAI,QAAQ,UAAU;AACpB,iBAAS,IAAI,GAAG,IAAI,QAAQ,SAAS,QAAQ,KAAK;AAChD,gBAAM,aAAa,QAAQ,SAAS,CAAC;AACrC,gBAAM,mBAAmB,MAAM,QAAQ,SAAS,SAAS;AACzD,gBAAM,SAAS,mBAAmB,iBAAO;AACzC,gBAAM,OAAO,mBAAmB,OAAO;AAEvC,gBAAM,KAAK,KAAK,MAAM,IAAI,WAAW,KAAK,EAAE;AAE5C,mBAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,QAAQ,KAAK;AAClD,kBAAM,SAAS,WAAW,QAAQ,CAAC;AACnC,kBAAM,eAAe,MAAM,WAAW,QAAQ,SAAS;AAGvD,kBAAM,YAAY,eAAe,iBAAO;AAMxC,kBAAM,KAAK,KAAK,IAAI,KAAK,SAAS,IAAI,OAAO,KAAK,EAAE;AAGpD,kBAAM,aACJ,OAAO,gBAAgB,OAAO,GAAG,KAAK,MAAM,OAAO,WAAW,CAAC,MAAM;AACvE,kBAAM,UAAU,eAAe,OAAO;AAEtC,kBAAM;AAAA,cACJ,KAAK,IAAI,KAAK,OAAO,IAAI,UAAU,OAAO,WAAW,CAAC,KAAK,UAAU,qBAAgB,OAAO,QAAQ;AAAA,YACtG;AAEA,gBAAI,CAAC,cAAc;AACjB,oBAAM,KAAK,KAAK,IAAI,KAAK,OAAO,EAAE;AAAA,YACpC;AAAA,UACF;AAEA,cAAI,CAAC,kBAAkB;AACrB,kBAAM,KAAK,KAAK,IAAI,EAAE;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAGA,YAAM,KAAK,EAAE;AAAA,IACf;AAAA,EACF;AAEA,MAAI,SAAS,MAAM,KAAK,IAAI,EAAE,KAAK;AAEnC,MAAI,WAAW;AACb,cAAU;AAAA;AAAA,cAAmB,SAAS;AAAA,EACxC;AAEA,MAAI,SAAS;AACX,cAAU;AAAA,EACZ;AAEA,SAAO;AACT;;;AC3SA,IAAMC,aAAY,CAAC,qBAAiD;AAClE,MAAI,qBAAqB,KAAM,QAAO;AACtC,MAAI,mBAAmB,GAAI,QAAO;AAClC,MAAI,mBAAmB,GAAI,QAAO;AAClC,SAAO;AACT;AAEA,IAAM,mBAAmB,CAAC,MAAc,QAAqB,UAAmB,UAAkB;AAChG,QAAM,OAAO,OAAO,gBAAgB,OAAO,KAAK,MAAM,OAAO,WAAW,IAAI;AAC5E,QAAM,QAAQ,OAAO,uBAAuB;AAC5C,QAAM,YAAY,OAAO,oBAAoB;AAC7C,QAAM,QAAQ,UAAU,KAAK,GAAGA,WAAU,SAAS,CAAC;AACpD,QAAM,SAAS,UAAU,OAAO;AAGhC,SAAO,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,OAAO,UAAU,KAAK,EAAE,CAAC,IAAI,IAAI,YAAO,KAAK;AAC/E;AAEA,IAAM,wBAAwB,CAAC,UAAkB,UAA0C;AACzF,MAAI,CAAC,OAAO;AACV,WAAO,CAAC,UAAK,QAAQ,kBAAkB;AAAA,EACzC;AAEA,QAAM,QAAkB,CAAC;AACzB,QAAM,gBAAgB,OAAO,OAAO,MAAM,OAAO;AAGjD,MAAI,cAAc,SAAS,GAAG;AAC5B,UAAM,KAAK,iBAAiB,UAAU,cAAc,CAAC,CAAC,CAAC;AAAA,EACzD,OAAO;AACL,UAAM,KAAK,UAAK,QAAQ,iBAAiB;AAAA,EAC3C;AAGA,MAAI,MAAM,QAAQ;AAChB,eAAW,CAAC,WAAW,SAAS,KAAK,OAAO,QAAQ,MAAM,MAAM,GAAG;AACjE,YAAM,cAAc,OAAO,OAAO,UAAU,OAAO,EAAE,CAAC;AACtD,UAAI,aAAa;AACf,cAAM,KAAK,iBAAiB,WAAW,aAAa,IAAI,CAAC;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,mBAAmB,OAC9B,OACA,WAC8B;AAC9B,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,MACL,OAAO;AAAA,MACP,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,eAAe,eAAe,QAAQ,QAAQ;AACpD,QAAM,UAAU,eAAe,QAAQ,OAAO;AAE9C,QAAM,QAAkB,CAAC;AACzB,QAAM,eAAyB,CAAC;AAChC,QAAM,UAAU;AAEhB,MAAI,YAAY;AAChB,MAAI,UAAU;AAEd,MAAI,cAAc;AAChB,gBAAY,aAAa;AACzB,cAAU,aAAa;AAEvB,eAAW,CAAC,YAAY,KAAK,KAAK,OAAO,QAAQ,aAAa,SAAS,GAAG;AACxE,UAAI,CAAC,MAAM,KAAM;AAEjB,UAAI,QAAQ,MAAM;AAClB,UAAI,eAAe,YAAY,OAAO,QAAQ;AAC5C,gBAAQ;AAAA,UACN,GAAG;AAAA,UACH,QAAQ,qBAAqB,MAAM,MAAM;AAAA,QAC3C;AAAA,MACF;AAEA,mBAAa,KAAK,GAAG,sBAAsB,YAAY,KAAK,CAAC;AAAA,IAC/D;AAEA,QAAI,OAAO,OAAO,aAAa,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,UAAU,IAAI,GAAG;AACvE,mBAAa,KAAK,oCAA0B;AAAA,IAC9C;AAAA,EACF,WAAW,SAAS;AAClB,UAAM,MAAM,oBAAI,KAAK;AACrB,gBAAY,GAAG,IAAI,SAAS,EAAE,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,IAAI,WAAW,EAAE,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC;AAEzG,eAAW,UAAU,SAAS;AAC5B,UAAI,CAAC,OAAO,OAAO;AACjB,cAAM,QAAQ,MAAM,YAAY,OAAO,QAAQ,2BAA2B;AAC1E;AAAA,MACF;AAEA,UAAI,QAAQ,OAAO;AACnB,UAAI,OAAO,aAAa,YAAY,OAAO,QAAQ;AACjD,gBAAQ;AAAA,UACN,GAAG;AAAA,UACH,QAAQ,qBAAqB,MAAM,MAAM;AAAA,QAC3C;AAAA,MACF;AAEA,mBAAa,KAAK,GAAG,sBAAsB,OAAO,UAAU,KAAK,CAAC;AAAA,IACpE;AAAA,EACF;AAEA,MAAI,aAAa,WAAW,GAAG;AAC7B,WAAO;AAAA,MACL,OAAO;AAAA,MACP,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,KAAK,OAAO;AAClB,QAAM,KAAK,GAAG,YAAY;AAC1B,QAAM,KAAK,OAAO;AAElB,MAAI,SAAS,YAAY,SAAS;AAClC,MAAI,QAAS,WAAU;AACvB,QAAM,KAAK,MAAM;AAEjB,SAAO;AAAA,IACL,OAAO;AAAA,IACP,SAAS,MAAM,KAAK,IAAI;AAAA,IACxB,SAAS;AAAA,EACX;AACF;;;AHtIO,IAAM,cAAsB,OAAO,EAAE,OAAO,MAAM;AACvD,QAAM,SAAS,aAAa,MAAM;AAElC,QAAM,OAAO,KAAK,yBAAyB;AAE3C,QAAM,iBAAiB,KAAK;AAAA,IAC1B,aAAa;AAAA,IACb,MAAM,CAAC;AAAA,IACP,MAAM,UAAU;AACd,YAAM,EAAE,qBAAAC,qBAAoB,IAAI,MAAM;AAEtC,YAAM,OAAO,KAAK,0BAA0B;AAE5C,YAAM,eAAe,MAAMA,qBAAoB,MAAM;AAErD,YAAM,QAAQ,MAAM,iBAAiB,cAAc,MAAM;AAEzD,YAAM,OAAO,IAAI,UAAU;AAAA,QACzB,MAAM;AAAA,UACJ,OAAO,MAAM;AAAA,UACb,SAAS,MAAM;AAAA,UACf,SAAS,MAAM;AAAA,QACjB;AAAA,MACF,CAAC;AAED,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,QAAM,iBAAiB,KAAK;AAAA,IAC1B,aACE;AAAA,IACF,MAAM,CAAC;AAAA,IACP,MAAM,UAAU;AACd,YAAM,EAAE,qBAAAA,qBAAoB,IAAI,MAAM;AAEtC,YAAM,OAAO,KAAK,0BAA0B;AAE5C,YAAM,eAAe,MAAMA,qBAAoB,MAAM;AAErD,UAAI,CAAC,cAAc;AACjB,eAAO;AAAA,MACT;AAEA,YAAM,gBAAgB,oBAAoB,YAAY;AAEtD,aAAO,sBAAsB,eAAe,aAAa,WAAW,aAAa,OAAO;AAAA,IAC1F;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,MAAM;AAAA,MACJ,aAAa;AAAA,MACb,aAAa;AAAA,IACf;AAAA,IACA,MAAM,MAAM,EAAE,MAAM,GAAG;AACrB,YAAM,OAAO,MAAM,kBAAkB,EAAE,MAAM,MAAM,KAAK,CAAC;AAEzD,UAAI,MAAM,SAAS,oBAAoB;AACrC,YAAI;AACF,gBAAM,OAAO,KAAK,kDAAkD;AACpE,gBAAM,EAAE,aAAAC,aAAY,IAAI,MAAM;AAC9B,UAAAA,aAAY,MAAM;AAClB,gBAAM,OAAO,KAAK,6BAA6B;AAAA,QACjD,SAAS,OAAO;AACd,gBAAM,OAAO,MAAM,0BAA0B;AAAA,YAC3C,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UAC9D,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,IACA,MAAM,OAAO,QAAQ;AACnB,aAAO,UAAU,OAAO,WAAW,CAAC;AAEpC,aAAO,QAAQ,aAAa,IAAI;AAAA,QAC9B,UAAU;AAAA,QACV,aAAa;AAAA,MACf;AAEA,aAAO,QAAQ,QAAQ;AAAA,QACrB,UAAU;AAAA,QACV,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,wBAAwB,YAA2B;AACvD,QAAM,EAAE,iBAAAC,kBAAiB,YAAAC,YAAW,IAAI,MAAM;AAC9C,QAAM,EAAE,cAAAC,cAAa,IAAI,MAAM;AAC/B,QAAM,SAASA,cAAa;AAAA,IAC1B,KAAK,EAAE,KAAK,MAAM,QAAQ,QAAQ,IAAI,EAAE;AAAA,EAC1C,CAAkD;AAElD,QAAM,aAAa,YAA2B;AAC5C,QAAI,MAAMF,iBAAgB,GAAG;AAC3B,MAAAC,YAAW,MAAM;AAAA,IACnB;AAAA,EACF;AAEA,UAAQ,GAAG,UAAU,UAAU;AAC/B,UAAQ,GAAG,WAAW,UAAU;AAChC,UAAQ,GAAG,QAAQ,UAAU;AAC/B;AAEA,KAAK,sBAAsB;AAE3B,IAAO,gBAAQ;",
|
|
6
6
|
"names": ["readFile", "toAuthData", "loadOpenCodeAuthEntry", "init_auth", "toWindow", "init_fetch", "init_auth", "init_auth", "toWindow", "init_fetch", "init_auth", "init_types", "init_fetch", "init_types", "result", "getStatus", "loadCacheForDisplay", "startWorker", "isWorkerRunning", "stopWorker", "createLogger"]
|
|
7
7
|
}
|