opencode-usage-plugin 0.0.2-dev2 → 0.0.2-dev3
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 +79 -42
- package/dist/index.js.map +2 -2
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -702,16 +702,40 @@ var getStatus = (remainingPercent) => {
|
|
|
702
702
|
}
|
|
703
703
|
return { emoji: "\u{1F7E2}", text: "OK" };
|
|
704
704
|
};
|
|
705
|
-
var
|
|
705
|
+
var formatProviderWindow = (provider, model, usage) => {
|
|
706
|
+
let window = null;
|
|
707
|
+
const globalWindows = Object.values(usage.windows);
|
|
708
|
+
if (globalWindows.length > 0) {
|
|
709
|
+
window = globalWindows[0];
|
|
710
|
+
} else if (usage.models && model) {
|
|
711
|
+
const modelWindows = usage.models[model];
|
|
712
|
+
if (modelWindows) {
|
|
713
|
+
const modelWindowEntries = Object.values(modelWindows.windows);
|
|
714
|
+
if (modelWindowEntries.length > 0) {
|
|
715
|
+
window = modelWindowEntries[0];
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
if (!window) {
|
|
720
|
+
return null;
|
|
721
|
+
}
|
|
722
|
+
const usedPercent = window.usedPercent ?? null;
|
|
723
|
+
const remainingPercent = window.remainingPercent ?? null;
|
|
724
|
+
const resetsIn = window.resetAfterFormatted ?? "N/A";
|
|
725
|
+
const { emoji, text } = getStatus(remainingPercent);
|
|
726
|
+
return {
|
|
727
|
+
provider,
|
|
728
|
+
model: model ?? "-",
|
|
729
|
+
usedPercent,
|
|
730
|
+
remainingPercent,
|
|
731
|
+
status: emoji,
|
|
732
|
+
statusText: text,
|
|
733
|
+
resetsIn
|
|
734
|
+
};
|
|
735
|
+
};
|
|
736
|
+
var formatProviderRows = (result) => {
|
|
706
737
|
if (!result.usage) {
|
|
707
|
-
return
|
|
708
|
-
provider: result.provider,
|
|
709
|
-
usedPercent: null,
|
|
710
|
-
remainingPercent: null,
|
|
711
|
-
status: "\u26AA",
|
|
712
|
-
statusText: "N/A",
|
|
713
|
-
resetsIn: "N/A"
|
|
714
|
-
};
|
|
738
|
+
return [];
|
|
715
739
|
}
|
|
716
740
|
let usage = result.usage;
|
|
717
741
|
if (result.provider === "google" && usage?.models) {
|
|
@@ -721,36 +745,58 @@ var formatProviderRow = (result) => {
|
|
|
721
745
|
};
|
|
722
746
|
}
|
|
723
747
|
const globalWindows = Object.values(usage.windows);
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
748
|
+
const hasGlobalWindow = globalWindows.length > 0;
|
|
749
|
+
const models = usage.models ? Object.keys(usage.models) : [];
|
|
750
|
+
if (hasGlobalWindow) {
|
|
751
|
+
const row = formatProviderWindow(result.provider, null, usage);
|
|
752
|
+
return row ? [row] : [];
|
|
753
|
+
}
|
|
754
|
+
if (models.length > 0) {
|
|
755
|
+
const rows = [];
|
|
756
|
+
for (const modelName of models) {
|
|
757
|
+
const row = formatProviderWindow(result.provider, modelName, usage);
|
|
758
|
+
if (row) {
|
|
759
|
+
rows.push(row);
|
|
760
|
+
}
|
|
729
761
|
}
|
|
762
|
+
return rows;
|
|
730
763
|
}
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
const
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
status: emoji,
|
|
740
|
-
statusText: text,
|
|
741
|
-
resetsIn
|
|
742
|
-
};
|
|
764
|
+
return [];
|
|
765
|
+
};
|
|
766
|
+
var formatTableCell = (text, width, align = "left") => {
|
|
767
|
+
const str = String(text ?? "N/A");
|
|
768
|
+
if (align === "right") {
|
|
769
|
+
return str.padStart(width, " ");
|
|
770
|
+
}
|
|
771
|
+
return str.padEnd(width, " ");
|
|
743
772
|
};
|
|
744
773
|
var formatUsageTable = (results) => {
|
|
745
774
|
const rows = [];
|
|
746
775
|
for (const result of results) {
|
|
747
|
-
const
|
|
748
|
-
|
|
749
|
-
rows.push(row);
|
|
750
|
-
}
|
|
776
|
+
const providerRows = formatProviderRows(result);
|
|
777
|
+
rows.push(...providerRows);
|
|
751
778
|
}
|
|
752
779
|
return { rows };
|
|
753
780
|
};
|
|
781
|
+
var formatTableString = (tableData) => {
|
|
782
|
+
if (tableData.rows.length === 0) {
|
|
783
|
+
return "No usage data available";
|
|
784
|
+
}
|
|
785
|
+
const colWidths = {
|
|
786
|
+
provider: 16,
|
|
787
|
+
model: 18,
|
|
788
|
+
used: 6,
|
|
789
|
+
remaining: 11,
|
|
790
|
+
status: 8,
|
|
791
|
+
resets: 12
|
|
792
|
+
};
|
|
793
|
+
const header = `| ${formatTableCell("Provider", colWidths.provider)} | ${formatTableCell("Model", colWidths.model)} | ${formatTableCell("Used", colWidths.used, "right")} | ${formatTableCell("Remaining", colWidths.remaining, "right")} | ${formatTableCell("Status", colWidths.status)} | ${formatTableCell("Resets In", colWidths.resets)} |`;
|
|
794
|
+
const separator = `|${"-".repeat(colWidths.provider + 2)}|${"-".repeat(colWidths.model + 2)}|${"-".repeat(colWidths.used + 2)}|${"-".repeat(colWidths.remaining + 2)}|${"-".repeat(colWidths.status + 2)}|${"-".repeat(colWidths.resets + 2)}|`;
|
|
795
|
+
const rows = tableData.rows.map((row) => {
|
|
796
|
+
return `| ${formatTableCell(row.provider, colWidths.provider)} | ${formatTableCell(row.model, colWidths.model)} | ${formatTableCell(row.usedPercent !== null ? `${row.usedPercent}%` : null, colWidths.used, "right")} | ${formatTableCell(row.remainingPercent !== null ? `${row.remainingPercent}%` : null, colWidths.remaining, "right")} | ${formatTableCell(row.status, colWidths.status)} | ${formatTableCell(row.resetsIn, colWidths.resets)} |`;
|
|
797
|
+
});
|
|
798
|
+
return [header, separator, ...rows].join("\n");
|
|
799
|
+
};
|
|
754
800
|
|
|
755
801
|
// src/toast/format.ts
|
|
756
802
|
var formatProviderLine = (provider, usage) => {
|
|
@@ -847,13 +893,13 @@ var UsagePlugin = async ({ client }) => {
|
|
|
847
893
|
}
|
|
848
894
|
});
|
|
849
895
|
const usageTableTool = tool({
|
|
850
|
-
description: "Get subscription usage data for OpenAI, Google, and z.ai providers as
|
|
896
|
+
description: "Get subscription usage data for OpenAI, Google, and z.ai providers as a formatted table",
|
|
851
897
|
args: {},
|
|
852
898
|
async execute() {
|
|
853
899
|
await logger.info("Fetching usage for all providers");
|
|
854
900
|
const results = await Promise.all(PROVIDERS.map((provider) => fetchUsage(provider, logger)));
|
|
855
901
|
const tableData = formatUsageTable(results);
|
|
856
|
-
return
|
|
902
|
+
return formatTableString(tableData);
|
|
857
903
|
}
|
|
858
904
|
});
|
|
859
905
|
return {
|
|
@@ -868,16 +914,7 @@ var UsagePlugin = async ({ client }) => {
|
|
|
868
914
|
description: "Show subscription usage as toast notification"
|
|
869
915
|
};
|
|
870
916
|
config.command.usage = {
|
|
871
|
-
template:
|
|
872
|
-
|
|
873
|
-
| Provider | Used | Remaining | Status | Resets In |
|
|
874
|
-
|----------|------|-----------|--------|-----------|
|
|
875
|
-
|
|
876
|
-
Status indicators:
|
|
877
|
-
- \u{1F534} Critical (remaining < 10%)
|
|
878
|
-
- \u{1F7E1} Warning (remaining < 30%)
|
|
879
|
-
- \u{1F7E2} OK (remaining >= 30%)
|
|
880
|
-
- \u26AA N/A (not configured)`,
|
|
917
|
+
template: "Call the usage_table tool and display the formatted table.",
|
|
881
918
|
description: "Show subscription usage as formatted table"
|
|
882
919
|
};
|
|
883
920
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts", "../src/providers/common/logger.ts", "../src/providers/common/time.ts", "../src/providers/common/files.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/toast/filter.ts", "../src/table/format.ts", "../src/toast/format.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Plugin } from '@opencode-ai/plugin';\nimport { tool } from '@opencode-ai/plugin';\nimport { createLogger, type Logger } from './providers/common/logger.ts';\nimport { fetchGoogleUsage } from './providers/google/fetch.ts';\nimport { fetchOpenaiUsage } from './providers/openai/fetch.ts';\nimport { fetchZaiUsage } from './providers/zai-coding-plan/fetch.ts';\nimport { PROVIDERS, type ProviderId, type ProviderResult } from './types/index.ts';\nimport { formatUsageTable } from './table/format.js';\nimport { formatUsageToast } from './toast/format.js';\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 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 await logger.info('Fetching usage for all providers');\n\n const results = await Promise.all(PROVIDERS.map((provider) => fetchUsage(provider, logger)));\n\n const toast = await formatUsageToast(results, 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 JSON for table formatting',\n args: {},\n async execute() {\n await logger.info('Fetching usage for all providers');\n\n const results = await Promise.all(PROVIDERS.map((provider) => fetchUsage(provider, logger)));\n\n const tableData = formatUsageTable(results);\n\n return JSON.stringify(tableData);\n },\n });\n\n return {\n tool: {\n usage_toast: usageToastTool,\n usage_table: usageTableTool,\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 results as a markdown table:\n\n| Provider | Used | Remaining | Status | Resets In |\n|----------|------|-----------|--------|-----------|\n\nStatus indicators:\n- \uD83D\uDD34 Critical (remaining < 10%)\n- \uD83D\uDFE1 Warning (remaining < 30%)\n- \uD83D\uDFE2 OK (remaining >= 30%)\n- \u26AA N/A (not configured)`,\n description: 'Show subscription usage as formatted table',\n };\n },\n };\n};\n\nexport default UsagePlugin;\n", "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", "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 { 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 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 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", "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 } from '../types/index.js';\nimport type { TableData, TableRow, StatusEmoji, StatusText } from '../types/table.js';\nimport { filterFlagshipModels } from '../toast/filter.js';\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\nconst formatProviderRow = (result: ProviderResult): TableRow | null => {\n if (!result.usage) {\n return {\n provider: result.provider,\n usedPercent: null,\n remainingPercent: null,\n status: '\u26AA',\n statusText: 'N/A',\n resetsIn: 'N/A',\n };\n }\n\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.values(usage.windows);\n let window = globalWindows.length > 0 ? globalWindows[0] : null;\n\n if (!window && usage?.models) {\n const modelEntries = Object.entries(usage.models);\n if (modelEntries.length > 0) {\n window = Object.values(modelEntries[0][1].windows)[0];\n }\n }\n\n const usedPercent = window?.usedPercent ?? null;\n const remainingPercent = window?.remainingPercent ?? null;\n const resetsIn = window?.resetAfterFormatted ?? 'N/A';\n const { emoji, text } = getStatus(remainingPercent);\n\n return {\n provider: result.provider,\n usedPercent,\n remainingPercent,\n status: emoji,\n statusText: text,\n resetsIn,\n };\n};\n\nexport const formatUsageTable = (results: ProviderResult[]): TableData => {\n const rows: TableRow[] = [];\n\n for (const result of results) {\n const row = formatProviderRow(result);\n if (row) {\n rows.push(row);\n }\n }\n\n return { rows };\n};\n", "import type { ProviderResult, ProviderUsage } from '../types/index.js';\nimport type { ToastUsageResult } from '../types/toast.js';\nimport type { Logger } from '../providers/common/logger.js';\nimport { filterFlagshipModels } from './filter.js';\n\nconst formatProviderLine = (provider: string, usage: ProviderUsage | null): string => {\n if (!usage) {\n return `${provider}: Not configured`;\n }\n\n const globalWindows = Object.values(usage.windows);\n if (globalWindows.length > 0) {\n const window = globalWindows[0];\n const used = window.usedPercent ?? 0;\n const reset = window.resetAfterFormatted ?? 'N/A';\n return `${provider}: ${used}% used \u2022 resets in ${reset}`;\n }\n\n if (usage.models) {\n const models = Object.entries(usage.models);\n if (models.length === 1) {\n const [modelName, modelData] = models[0];\n const window = Object.values(modelData.windows)[0];\n const used = window.usedPercent ?? 0;\n const reset = window.resetAfterFormatted ?? 'N/A';\n return `${provider}: ${modelName} ${used}% \u2022 resets in ${reset}`;\n }\n\n if (models.length > 1) {\n const parts: string[] = [];\n for (const [modelName, modelData] of models) {\n const window = Object.values(modelData.windows)[0];\n const used = window.usedPercent ?? 0;\n parts.push(`${modelName} ${used}%`);\n }\n return `${provider}: ${parts.join(', ')}`;\n }\n }\n\n return `${provider}: No usage data`;\n};\n\nexport const formatUsageToast = async (\n results: ProviderResult[],\n logger?: Logger\n): Promise<ToastUsageResult> => {\n const lines: string[] = [];\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\n if (result.provider === 'google' && usage?.models) {\n usage = {\n ...usage,\n models: filterFlagshipModels(usage.models),\n };\n }\n\n const line = formatProviderLine(result.provider, usage);\n lines.push(line);\n }\n\n if (lines.length === 0) {\n return {\n title: 'Usage',\n message: 'No providers configured',\n variant: 'info',\n };\n }\n\n return {\n title: 'Usage',\n message: lines.join('\\n'),\n variant: 'info',\n };\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import type { Plugin } from '@opencode-ai/plugin';\nimport { tool } from '@opencode-ai/plugin';\nimport { createLogger, type Logger } from './providers/common/logger.ts';\nimport { fetchGoogleUsage } from './providers/google/fetch.ts';\nimport { fetchOpenaiUsage } from './providers/openai/fetch.ts';\nimport { fetchZaiUsage } from './providers/zai-coding-plan/fetch.ts';\nimport { PROVIDERS, type ProviderId, type ProviderResult } from './types/index.ts';\nimport { formatUsageTable, formatTableString } from './table/format.js';\nimport { formatUsageToast } from './toast/format.js';\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 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 await logger.info('Fetching usage for all providers');\n\n const results = await Promise.all(PROVIDERS.map((provider) => fetchUsage(provider, logger)));\n\n const toast = await formatUsageToast(results, 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 await logger.info('Fetching usage for all providers');\n\n const results = await Promise.all(PROVIDERS.map((provider) => fetchUsage(provider, logger)));\n\n const tableData = formatUsageTable(results);\n\n return formatTableString(tableData);\n },\n });\n\n return {\n tool: {\n usage_toast: usageToastTool,\n usage_table: usageTableTool,\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\nexport default UsagePlugin;\n", "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", "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 { 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 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 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", "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, ProviderUsage } from '../types/index.js';\nimport type { TableRow, TableData, StatusEmoji, StatusText } from '../types/table.js';\nimport { filterFlagshipModels } from '../toast/filter.js';\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\nconst formatProviderWindow = (\n provider: string,\n model: string | null,\n usage: ProviderUsage\n): TableRow | null => {\n let window = null;\n\n const globalWindows = Object.values(usage.windows);\n if (globalWindows.length > 0) {\n window = globalWindows[0];\n } else if (usage.models && model) {\n const modelWindows = usage.models[model];\n if (modelWindows) {\n const modelWindowEntries = Object.values(modelWindows.windows);\n if (modelWindowEntries.length > 0) {\n window = modelWindowEntries[0];\n }\n }\n }\n\n if (!window) {\n return null;\n }\n\n const usedPercent = window.usedPercent ?? null;\n const remainingPercent = window.remainingPercent ?? null;\n const resetsIn = window.resetAfterFormatted ?? 'N/A';\n const { emoji, text } = getStatus(remainingPercent);\n\n return {\n provider,\n model: model ?? '-',\n usedPercent,\n remainingPercent,\n status: emoji,\n statusText: text,\n resetsIn,\n };\n};\n\nconst formatProviderRows = (result: ProviderResult): TableRow[] => {\n if (!result.usage) {\n return [];\n }\n\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.values(usage.windows);\n const hasGlobalWindow = globalWindows.length > 0;\n const models = usage.models ? Object.keys(usage.models) : [];\n\n if (hasGlobalWindow) {\n const row = formatProviderWindow(result.provider, null, usage);\n return row ? [row] : [];\n }\n\n if (models.length > 0) {\n const rows: TableRow[] = [];\n for (const modelName of models) {\n const row = formatProviderWindow(result.provider, modelName, usage);\n if (row) {\n rows.push(row);\n }\n }\n return rows;\n }\n\n return [];\n};\n\nconst formatTableCell = (\n text: string | number | null,\n width: number,\n align: 'left' | 'right' = 'left'\n): string => {\n const str = String(text ?? 'N/A');\n if (align === 'right') {\n return str.padStart(width, ' ');\n }\n return str.padEnd(width, ' ');\n};\n\nexport const formatUsageTable = (results: ProviderResult[]): TableData => {\n const rows: TableRow[] = [];\n\n for (const result of results) {\n const providerRows = formatProviderRows(result);\n rows.push(...providerRows);\n }\n\n return { rows };\n};\n\nexport const formatTableString = (tableData: TableData): string => {\n if (tableData.rows.length === 0) {\n return 'No usage data available';\n }\n\n const colWidths = {\n provider: 16,\n model: 18,\n used: 6,\n remaining: 11,\n status: 8,\n resets: 12,\n };\n\n const header = `| ${formatTableCell('Provider', colWidths.provider)} | ${formatTableCell('Model', colWidths.model)} | ${formatTableCell('Used', colWidths.used, 'right')} | ${formatTableCell('Remaining', colWidths.remaining, 'right')} | ${formatTableCell('Status', colWidths.status)} | ${formatTableCell('Resets In', colWidths.resets)} |`;\n\n const separator = `|${'-'.repeat(colWidths.provider + 2)}|${'-'.repeat(colWidths.model + 2)}|${'-'.repeat(colWidths.used + 2)}|${'-'.repeat(colWidths.remaining + 2)}|${'-'.repeat(colWidths.status + 2)}|${'-'.repeat(colWidths.resets + 2)}|`;\n\n const rows = tableData.rows.map((row) => {\n return `| ${formatTableCell(row.provider, colWidths.provider)} | ${formatTableCell(row.model, colWidths.model)} | ${formatTableCell(row.usedPercent !== null ? `${row.usedPercent}%` : null, colWidths.used, 'right')} | ${formatTableCell(row.remainingPercent !== null ? `${row.remainingPercent}%` : null, colWidths.remaining, 'right')} | ${formatTableCell(row.status, colWidths.status)} | ${formatTableCell(row.resetsIn, colWidths.resets)} |`;\n });\n\n return [header, separator, ...rows].join('\\n');\n};\n", "import type { ProviderResult, ProviderUsage } from '../types/index.js';\nimport type { ToastUsageResult } from '../types/toast.js';\nimport type { Logger } from '../providers/common/logger.js';\nimport { filterFlagshipModels } from './filter.js';\n\nconst formatProviderLine = (provider: string, usage: ProviderUsage | null): string => {\n if (!usage) {\n return `${provider}: Not configured`;\n }\n\n const globalWindows = Object.values(usage.windows);\n if (globalWindows.length > 0) {\n const window = globalWindows[0];\n const used = window.usedPercent ?? 0;\n const reset = window.resetAfterFormatted ?? 'N/A';\n return `${provider}: ${used}% used \u2022 resets in ${reset}`;\n }\n\n if (usage.models) {\n const models = Object.entries(usage.models);\n if (models.length === 1) {\n const [modelName, modelData] = models[0];\n const window = Object.values(modelData.windows)[0];\n const used = window.usedPercent ?? 0;\n const reset = window.resetAfterFormatted ?? 'N/A';\n return `${provider}: ${modelName} ${used}% \u2022 resets in ${reset}`;\n }\n\n if (models.length > 1) {\n const parts: string[] = [];\n for (const [modelName, modelData] of models) {\n const window = Object.values(modelData.windows)[0];\n const used = window.usedPercent ?? 0;\n parts.push(`${modelName} ${used}%`);\n }\n return `${provider}: ${parts.join(', ')}`;\n }\n }\n\n return `${provider}: No usage data`;\n};\n\nexport const formatUsageToast = async (\n results: ProviderResult[],\n logger?: Logger\n): Promise<ToastUsageResult> => {\n const lines: string[] = [];\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\n if (result.provider === 'google' && usage?.models) {\n usage = {\n ...usage,\n models: filterFlagshipModels(usage.models),\n };\n }\n\n const line = formatProviderLine(result.provider, usage);\n lines.push(line);\n }\n\n if (lines.length === 0) {\n return {\n title: 'Usage',\n message: 'No providers configured',\n variant: 'info',\n };\n }\n\n return {\n title: 'Usage',\n message: lines.join('\\n'),\n variant: 'info',\n };\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["toAuthData", "loadOpenCodeAuthEntry", "toWindow", "toWindow"]
|
|
7
7
|
}
|