@narumitw/pi-usage 0.60.10 → 0.60.11

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.ts.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/codex-fast.ts", "../src/codex-resets.ts", "../src/core.ts", "../src/oauth-credential-source.ts", "../src/query.ts", "../src/providers/baseten.ts", "../src/providers/codex.ts", "../src/providers/deepseek.ts", "../src/providers/fireworks.ts", "../src/providers/github-copilot.ts", "../src/providers/kimi-coding.ts", "../src/providers/minimax.ts", "../src/providers/moonshot.ts", "../src/providers/opencode-zen.ts", "../src/providers/openrouter.ts", "../src/providers/vercel-ai-gateway.ts", "../src/providers/xai.ts", "../src/providers/zai-errors.ts", "../src/providers/zai.ts", "../src/usage-targets.ts", "../src/format.ts", "../src/settings.ts", "../src/usage.ts", "../src/codex-fast-runtime.ts", "../src/usage-helpers.ts", "../src/usage-settings-ui.ts"],
4
- "sourcesContent": ["import { calculateCost, hasApi } from \"@earendil-works/pi-ai\";\nimport type { PiModel } from \"./types.js\";\n\nexport const CODEX_FAST_SERVICE_TIER = \"priority\";\nexport const CODEX_STANDARD_SERVICE_TIER = \"default\";\n\nexport const CODEX_FAST_MODEL_IDS: ReadonlySet<string> = new Set([\n \"gpt-5.5\",\n \"gpt-5.6-luna\",\n \"gpt-5.6-sol\",\n \"gpt-5.6-terra\",\n]);\n\nexport type CodexFastAvailability =\n | { kind: \"available\"; enabled: boolean }\n | { kind: \"not-codex\" }\n | { kind: \"unavailable\"; reason: string };\n\nexport function codexFastAvailability(model: PiModel | undefined, enabled: boolean): CodexFastAvailability {\n if (model?.provider !== \"openai-codex\") return { kind: \"not-codex\" };\n if (!isOfficialCodexModel(model)) {\n return {\n kind: \"unavailable\",\n reason: \"Fast mode requires the official OpenAI Codex Responses endpoint.\",\n };\n }\n if (!CODEX_FAST_MODEL_IDS.has(model.id)) {\n return {\n kind: \"unavailable\",\n reason: `${model.id} does not advertise Codex Fast support.`,\n };\n }\n return { kind: \"available\", enabled };\n}\n\nexport function codexFastIsEffective(model: PiModel | undefined, enabled: boolean): boolean {\n return codexFastAvailability(model, enabled).kind === \"available\" && enabled;\n}\n\nexport function codexFastRequestTier(\n model: PiModel | undefined,\n enabled: boolean,\n): typeof CODEX_FAST_SERVICE_TIER | typeof CODEX_STANDARD_SERVICE_TIER | undefined {\n if (!isOfficialCodexModel(model)) return undefined;\n return enabled && CODEX_FAST_MODEL_IDS.has(model.id) ? CODEX_FAST_SERVICE_TIER : CODEX_STANDARD_SERVICE_TIER;\n}\n\nexport function rewriteCodexFastPayload(\n payload: unknown,\n model: PiModel | undefined,\n enabled: boolean,\n): unknown | undefined {\n const serviceTier = codexFastRequestTier(model, enabled);\n if (!serviceTier || !isRecord(payload)) return undefined;\n return { ...payload, service_tier: serviceTier };\n}\n\nexport function correctCodexFastMessageCost(\n message: unknown,\n model: PiModel | undefined,\n fastRequested: boolean,\n): unknown | undefined {\n if (\n !codexFastIsEffective(model, fastRequested) ||\n !isRecord(message) ||\n message.role !== \"assistant\" ||\n message.provider !== model?.provider ||\n message.model !== model?.id\n ) {\n return undefined;\n }\n const usage = isRecord(message.usage) ? message.usage : undefined;\n const cost = usage && isRecord(usage.cost) ? usage.cost : undefined;\n if (!usage || !cost || !hasCompleteUsage(usage) || !isOfficialCodexModel(model)) return undefined;\n const correctedUsage = structuredClone(usage) as typeof usage;\n calculateCost(model, correctedUsage as never);\n const multiplier = model.id === \"gpt-5.5\" ? 2.5 : 2;\n const correctedCost = correctedUsage.cost as Record<string, number>;\n for (const key of [\"input\", \"output\", \"cacheRead\", \"cacheWrite\", \"total\"] as const) {\n correctedCost[key] *= multiplier;\n }\n if (costsEqual(cost, correctedCost)) return undefined;\n return { ...message, usage: correctedUsage };\n}\n\nexport function codexFastStatusLabel(status: string, enabled: boolean): string {\n if (!enabled || !/^codex(?:\\s|$)/u.test(status)) return status;\n return status === \"codex\" ? \"codex fast\" : `codex fast${status.slice(\"codex\".length)}`;\n}\n\nfunction isOfficialCodexModel(model: PiModel | undefined): model is PiModel & { api: \"openai-codex-responses\" } {\n if (model?.provider !== \"openai-codex\" || !hasApi(model, \"openai-codex-responses\")) {\n return false;\n }\n try {\n return new URL(model.baseUrl).origin === \"https://chatgpt.com\";\n } catch {\n return false;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasCompleteUsage(value: Record<string, unknown>): boolean {\n return [\"input\", \"output\", \"cacheRead\", \"cacheWrite\"].every(\n (key) => typeof value[key] === \"number\" && Number.isFinite(value[key]),\n );\n}\n\nfunction costsEqual(left: Record<string, unknown>, right: Record<string, number>): boolean {\n return [\"input\", \"output\", \"cacheRead\", \"cacheWrite\", \"total\"].every((key) => left[key] === right[key]);\n}\n", "import type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { readStoredCredential } from \"@earendil-works/pi-coding-agent\";\nimport { fingerprintResolvedAuth, sanitizeDisplayText } from \"./core.js\";\nimport { fallbackOAuthCredentialCandidates, type OAuthCredentialCandidateReader } from \"./oauth-credential-source.js\";\nimport { AUTH_FINGERPRINT_SALT, adapterForProvider, fetchProviderJson, resolveUsageAuth } from \"./query.js\";\nimport type { ResolvedUsageAuth, UsageReport } from \"./types.js\";\n\nconst CODEX_RESET_CREDITS_URL = \"https://chatgpt.com/backend-api/wham/rate-limit-reset-credits\";\nconst CODEX_RESET_CONSUME_URL = `${CODEX_RESET_CREDITS_URL}/consume`;\nconst MAX_RESET_OPTIONS = 32;\nconst MAX_CREDIT_ID_CHARS = 1_024;\n\ntype StoredCredentialReader = (providerId: string) => unknown;\n\nexport type CodexResetOutcomeCode = \"reset\" | \"nothing_to_reset\" | \"no_credit\" | \"already_redeemed\";\n\nexport interface CodexResetOption {\n creditId?: string;\n title: string;\n description: string;\n expiresAt?: number;\n}\n\nexport interface CodexResetAvailability {\n availableCount: number;\n options: CodexResetOption[];\n}\n\nexport interface CodexResetOutcome {\n code: CodexResetOutcomeCode;\n windowsReset: number;\n}\n\nexport function codexResetCount(report: UsageReport): number | undefined {\n const value = report.metrics.find((metric) => metric.id === \"reset-credits\")?.value;\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0 ? value : undefined;\n}\n\nexport function codexResetActionDescription(report: UsageReport): string {\n const count = codexResetCount(report);\n if (count === undefined) return \"Check reset availability.\";\n if (count === 0) return \"No usage limit resets available.\";\n return `You have ${count} ${resetLabel(count)} available.`;\n}\n\nexport function genericCodexResetOption(): CodexResetOption {\n return {\n title: \"Full reset\",\n description: \"Reset your current usage limits.\",\n };\n}\n\nexport function resetOptionExpiration(option: CodexResetOption): string {\n if (option.expiresAt === undefined) return \"Does not expire.\";\n const expiration = new Date(option.expiresAt * 1_000);\n if (Number.isNaN(expiration.getTime())) return \"Expiration unavailable.\";\n return `Expires ${expiration.toLocaleString()}.`;\n}\n\nexport function resetConfirmationLines(option: CodexResetOption | undefined): string[] {\n if (!option) return [\"The selected reset is unavailable.\"];\n return [\n option.title,\n resetOptionExpiration(option),\n option.description,\n \"This consumes one earned reset for the current OpenAI Codex account.\",\n ];\n}\n\nexport function formatCodexResetOutcome(\n outcome: CodexResetOutcome | undefined,\n remainingCount: number | undefined,\n): string {\n const remaining =\n remainingCount === undefined ? \"\" : ` You have ${remainingCount} ${resetLabel(remainingCount)} left.`;\n if (!outcome) return \"You don't have any usage limit resets available.\";\n if (outcome.code === \"reset\") return `Usage reset.${remaining}`.trim();\n if (outcome.code === \"already_redeemed\") {\n return `Usage reset was already completed.${remaining}`.trim();\n }\n if (outcome.code === \"nothing_to_reset\") {\n return \"Your usage does not need a reset right now.\";\n }\n return \"No usage limit resets are available.\";\n}\n\nexport function resetLabel(count: number): string {\n return count === 1 ? \"usage limit reset\" : \"usage limit resets\";\n}\n\nexport async function resolveCodexResetAuth(\n ctx: ExtensionContext,\n salt: Uint8Array = AUTH_FINGERPRINT_SALT,\n credentialReader: StoredCredentialReader = readStoredCredential,\n candidateReader?: OAuthCredentialCandidateReader,\n): Promise<ResolvedUsageAuth> {\n const model = ctx.model;\n if (model?.provider !== \"openai-codex\") {\n throw new Error(\"Usage limit resets require the current model to use OpenAI Codex.\");\n }\n const expectedModel = `${model.provider}/${model.id}`;\n const adapter = adapterForProvider(\"openai-codex\");\n if (!adapter) throw new Error(\"OpenAI Codex usage support is unavailable.\");\n const auth = await resolveUsageAuth(ctx, adapter, salt, credentialReader);\n if (`${ctx.model?.provider}/${ctx.model?.id}` !== expectedModel) {\n throw new Error(\"The current model changed while resolving Codex reset authentication.\");\n }\n if (!auth) throw new Error(\"No runtime credential is configured for OpenAI Codex.\");\n\n const resolvedAccess = bearerToken(headerValue(auth.headers, \"Authorization\")) ?? auth.apiKey;\n if (!resolvedAccess) throw new Error(\"OpenAI Codex OAuth credentials were incomplete.\");\n const resolvedAccountId = codexAccountIdFromAccessToken(resolvedAccess);\n if (!resolvedAccountId) {\n throw new Error(\"The active OpenAI Codex access token did not contain a valid account ID.\");\n }\n const offered = candidateReader\n ? candidateReader(ctx, \"openai-codex\")\n : fallbackOAuthCredentialCandidates(\"openai-codex\", credentialReader);\n if (!offered.ok) throw new Error(\"OpenAI Codex OAuth credential discovery failed closed.\");\n const { accountId, storedAccess } = selectCodexResetCredential(\n offered.candidates,\n resolvedAccess,\n resolvedAccountId,\n offered.offeredCount === 0,\n );\n const authorization = `Bearer ${resolvedAccess}`;\n const headers = {\n Authorization: authorization,\n \"chatgpt-account-id\": accountId,\n };\n return {\n apiKey: resolvedAccess,\n headers,\n fingerprint: fingerprintResolvedAuth({ headers }, salt),\n secrets: [...new Set([...auth.secrets, storedAccess, resolvedAccess, authorization, accountId])],\n model: auth.model,\n };\n}\n\nexport async function listCodexResetCredits(\n auth: ResolvedUsageAuth,\n signal: AbortSignal,\n timeoutMs: number,\n): Promise<CodexResetAvailability> {\n const payload = await fetchProviderJson(\n CODEX_RESET_CREDITS_URL,\n auth,\n signal,\n timeoutMs,\n \"Codex usage-limit reset endpoint\",\n );\n return normalizeCodexResetCreditsPayload(payload);\n}\n\nexport async function consumeCodexResetCredit(\n auth: ResolvedUsageAuth,\n option: CodexResetOption,\n redeemRequestId: string,\n signal: AbortSignal,\n timeoutMs: number,\n): Promise<CodexResetOutcome> {\n if (!redeemRequestId) throw new Error(\"Codex reset redemption request ID must not be empty.\");\n const payload = await fetchProviderJson(\n CODEX_RESET_CONSUME_URL,\n auth,\n signal,\n timeoutMs,\n \"Codex usage-limit reset consume endpoint\",\n {\n method: \"POST\",\n body: {\n redeem_request_id: redeemRequestId,\n ...(option.creditId ? { credit_id: option.creditId } : {}),\n },\n },\n );\n const code = payload.code;\n if (!isCodexResetOutcomeCode(code)) {\n throw new Error(\"Codex reset consume endpoint returned an unknown outcome code.\");\n }\n const windowsReset = payload.windows_reset === undefined ? 0 : nonnegativeInteger(payload.windows_reset);\n if (windowsReset === undefined) {\n throw new Error(\"Codex reset consume endpoint returned an invalid windows_reset value.\");\n }\n return { code, windowsReset };\n}\n\nexport function normalizeCodexResetCreditsPayload(payload: Record<string, unknown>): CodexResetAvailability {\n const availableCount = nonnegativeInteger(payload.available_count);\n if (availableCount === undefined) {\n throw new Error(\"Codex reset credits response returned an invalid available_count.\");\n }\n const rawCredits = payload.credits;\n if (rawCredits !== undefined && !Array.isArray(rawCredits)) {\n throw new Error(\"Codex reset credits response returned invalid credits.\");\n }\n\n const options = (rawCredits ?? [])\n .map(asObject)\n .filter((credit): credit is Record<string, unknown> => Boolean(credit))\n .filter((credit) => credit.status === \"available\" && credit.reset_type === \"codex_rate_limits\")\n .map(normalizeResetOption)\n .sort((left, right) => (left.expiresAt ?? Number.MAX_SAFE_INTEGER) - (right.expiresAt ?? Number.MAX_SAFE_INTEGER))\n .slice(0, Math.min(availableCount, MAX_RESET_OPTIONS));\n\n if (availableCount > 0 && options.length === 0) {\n options.push(genericCodexResetOption());\n }\n return { availableCount, options };\n}\n\nfunction selectCodexResetCredential(\n candidates: readonly unknown[],\n resolvedAccess: string,\n resolvedAccountId: string,\n standaloneFallback: boolean,\n): { accountId: string; storedAccess: string } {\n let sawOAuth = false;\n let sawMatchingAccess = false;\n let sawInvalidAccountId = false;\n const matches = new Map<string, { accountId: string; storedAccess: string }>();\n for (const candidate of candidates) {\n try {\n const credential = asObject(candidate);\n if (credential?.type !== \"oauth\") continue;\n sawOAuth = true;\n const storedAccess = asNonemptyString(credential.access);\n if (storedAccess !== resolvedAccess) continue;\n sawMatchingAccess = true;\n const accountId = validHeaderValue(credential.accountId);\n const refresh = asNonemptyString(credential.refresh);\n if (!accountId || accountId !== resolvedAccountId || !refresh) {\n sawInvalidAccountId = true;\n continue;\n }\n matches.set(refresh, { accountId, storedAccess });\n } catch {\n // Malformed candidates never authorize a reset request.\n }\n }\n if (sawInvalidAccountId) {\n throw new Error(\"The OpenAI Codex OAuth credential did not include a valid account ID.\");\n }\n if (matches.size > 1) {\n throw new Error(\"Conflicting OAuth credentials match the active OpenAI Codex runtime account.\");\n }\n const match = matches.values().next().value;\n if (match) return match;\n if (!sawOAuth) {\n throw new Error(\n standaloneFallback\n ? \"Usage limit resets require the OpenAI Codex OAuth account configured through Pi /login.\"\n : \"Usage limit resets require an OpenAI Codex OAuth account configured through Pi /login or a compatible credential source.\",\n );\n }\n if (sawMatchingAccess) throw new Error(\"OpenAI Codex OAuth credentials were incomplete.\");\n throw new Error(\n standaloneFallback\n ? \"The active OpenAI Codex runtime account does not match Pi's stored OAuth account.\"\n : \"The active OpenAI Codex runtime account does not match any available OAuth account.\",\n );\n}\n\nfunction codexAccountIdFromAccessToken(access: string): string | undefined {\n try {\n const parts = access.split(\".\");\n if (parts.length !== 3 || !parts[1]) return undefined;\n const payload = JSON.parse(Buffer.from(parts[1], \"base64url\").toString(\"utf8\")) as unknown;\n const claims = asObject(asObject(payload)?.[\"https://api.openai.com/auth\"]);\n return validHeaderValue(claims?.chatgpt_account_id);\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeResetOption(credit: Record<string, unknown>): CodexResetOption {\n const creditId = asOpaqueId(credit.id);\n if (!creditId) throw new Error(\"Codex reset credits response returned an invalid credit ID.\");\n let expiresAt: number | undefined;\n if (credit.expires_at !== undefined && credit.expires_at !== null) {\n if (typeof credit.expires_at !== \"string\") {\n throw new Error(\"Codex reset credits response returned an invalid expiration time.\");\n }\n const parsed = Date.parse(credit.expires_at);\n if (!Number.isFinite(parsed)) {\n throw new Error(\"Codex reset credits response returned an invalid expiration time.\");\n }\n expiresAt = Math.floor(parsed / 1_000);\n }\n const title = displayString(credit.title) ?? \"Full reset\";\n const description = displayString(credit.description) ?? \"Reset your current usage limits.\";\n return {\n creditId,\n title,\n description,\n ...(expiresAt === undefined ? {} : { expiresAt }),\n };\n}\n\nfunction isCodexResetOutcomeCode(value: unknown): value is CodexResetOutcomeCode {\n return value === \"reset\" || value === \"nothing_to_reset\" || value === \"no_credit\" || value === \"already_redeemed\";\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n return value as Record<string, unknown>;\n}\n\nfunction asNonemptyString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction asOpaqueId(value: unknown): string | undefined {\n if (typeof value !== \"string\" || value.length === 0 || value.length > MAX_CREDIT_ID_CHARS) {\n return undefined;\n }\n return value;\n}\n\nfunction displayString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n return sanitizeDisplayText(value, 160) || undefined;\n}\n\nfunction validHeaderValue(value: unknown): string | undefined {\n if (typeof value !== \"string\" || !value || value.length > 512) return undefined;\n if (/[^\\x20-\\x7e]/u.test(value)) return undefined;\n return value;\n}\n\nfunction nonnegativeInteger(value: unknown): number | undefined {\n const parsed =\n typeof value === \"number\" ? value : typeof value === \"string\" && value.trim() ? Number(value) : Number.NaN;\n if (!Number.isSafeInteger(parsed) || parsed < 0) return undefined;\n return parsed;\n}\n\nfunction bearerToken(authorization: string | undefined): string | undefined {\n return /^Bearer\\s+(.+)$/iu.exec(authorization ?? \"\")?.[1];\n}\n\nfunction headerValue(headers: Record<string, string>, name: string): string | undefined {\n return Object.entries(headers).find(([candidate]) => candidate.toLowerCase() === name.toLowerCase())?.[1];\n}\n", "import { createHmac } from \"node:crypto\";\nimport type { UsageReport } from \"./types.js\";\n\nexport class UsageCache {\n private readonly entries = new Map<string, { createdAt: number; report: UsageReport }>();\n private readonly ttlMs: number;\n private readonly maxEntries: number;\n\n constructor(ttlMs: number, maxEntries = 32) {\n if (!Number.isFinite(ttlMs) || ttlMs <= 0) throw new Error(\"Cache TTL must be positive.\");\n if (!Number.isSafeInteger(maxEntries) || maxEntries < 1) {\n throw new Error(\"Cache entry limit must be a positive integer.\");\n }\n this.ttlMs = ttlMs;\n this.maxEntries = maxEntries;\n }\n\n get size(): number {\n return this.entries.size;\n }\n\n get(providerId: string, fingerprint: string, now = Date.now()): UsageReport | undefined {\n this.sweepExpired(now);\n return this.entries.get(cacheKey(providerId, fingerprint))?.report;\n }\n\n set(providerId: string, fingerprint: string, report: UsageReport, now = Date.now()): void {\n this.sweepExpired(now);\n const key = cacheKey(providerId, fingerprint);\n this.entries.delete(key);\n while (this.entries.size >= this.maxEntries) {\n const oldest = this.entries.keys().next().value;\n if (oldest === undefined) break;\n this.entries.delete(oldest);\n }\n this.entries.set(key, { createdAt: now, report });\n }\n\n delete(providerId: string, fingerprint: string): void {\n this.entries.delete(cacheKey(providerId, fingerprint));\n }\n\n clearProvider(providerId: string): void {\n for (const key of this.entries.keys()) {\n if (key.startsWith(`${providerId}:`)) this.entries.delete(key);\n }\n }\n\n clear(): void {\n this.entries.clear();\n }\n\n private sweepExpired(now: number): void {\n for (const [key, entry] of this.entries) {\n if (now - entry.createdAt >= this.ttlMs) this.entries.delete(key);\n }\n }\n}\n\nexport function fingerprintResolvedAuth(\n auth: {\n apiKey?: string;\n headers?: Record<string, string | null>;\n baseUrl?: string;\n env?: Record<string, string>;\n source?: string;\n providerAuth?: {\n apiKey?: string;\n headers?: Record<string, string | null>;\n baseUrl?: string;\n };\n },\n salt: Uint8Array,\n): string {\n const headers = Object.entries(auth.headers ?? {})\n .map(([name, value]) => [name.toLowerCase(), value] as const)\n .sort(([left], [right]) => left.localeCompare(right));\n const env = Object.entries(auth.env ?? {}).sort(([left], [right]) => left.localeCompare(right));\n const providerHeaders = Object.entries(auth.providerAuth?.headers ?? {})\n .map(([name, value]) => [name.toLowerCase(), value] as const)\n .sort(([left], [right]) => left.localeCompare(right));\n const canonical = JSON.stringify({\n apiKey: auth.apiKey ?? \"\",\n headers,\n baseUrl: auth.baseUrl ?? \"\",\n env,\n source: auth.source ?? \"\",\n providerAuth: {\n apiKey: auth.providerAuth?.apiKey ?? \"\",\n headers: providerHeaders,\n baseUrl: auth.providerAuth?.baseUrl ?? \"\",\n },\n });\n return createHmac(\"sha256\", salt).update(canonical).digest(\"hex\");\n}\n\nexport async function runWithConcurrency<T, R>(\n items: readonly T[],\n limit: number,\n worker: (item: T, index: number, signal: AbortSignal) => Promise<R>,\n signal: AbortSignal,\n): Promise<PromiseSettledResult<R>[]> {\n if (signal.aborted) throw abortError();\n if (!Number.isSafeInteger(limit) || limit < 1) throw new Error(\"Concurrency limit must be positive.\");\n\n const results = new Array<PromiseSettledResult<R>>(items.length);\n let nextIndex = 0;\n const runners = Array.from({ length: Math.min(limit, items.length) }, async () => {\n while (nextIndex < items.length) {\n if (signal.aborted) throw abortError();\n const index = nextIndex;\n nextIndex += 1;\n try {\n results[index] = {\n status: \"fulfilled\",\n value: await worker(items[index] as T, index, signal),\n };\n } catch (reason) {\n results[index] = { status: \"rejected\", reason };\n }\n }\n });\n\n await Promise.all(runners);\n if (signal.aborted) throw abortError();\n return results;\n}\n\nexport async function awaitWithDeadline<T>(\n operation: Promise<T>,\n signal: AbortSignal,\n timeoutMs: number,\n description: string,\n): Promise<T> {\n if (signal.aborted) throw abortError();\n const controller = new AbortController();\n const abortFromCaller = () => controller.abort();\n signal.addEventListener(\"abort\", abortFromCaller, { once: true });\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await Promise.race([\n operation,\n new Promise<never>((_resolve, reject) => {\n controller.signal.addEventListener(\n \"abort\",\n () => {\n reject(\n signal.aborted\n ? abortError()\n : Object.assign(new Error(`Timed out after ${Math.round(timeoutMs / 1000)}s ${description}.`), {\n name: \"TimeoutError\",\n }),\n );\n },\n { once: true },\n );\n }),\n ]);\n } finally {\n clearTimeout(timeout);\n signal.removeEventListener(\"abort\", abortFromCaller);\n }\n}\n\nexport function sanitizeDisplayText(value: string, maxChars = 160): string {\n let result = \"\";\n for (let index = 0; index < value.length; ) {\n const codePoint = value.codePointAt(index) ?? 0;\n const character = String.fromCodePoint(codePoint);\n if (codePoint === 0x1b || codePoint === 0x9b || codePoint === 0x9d) {\n index = skipTerminalEscape(value, index, codePoint);\n continue;\n }\n if (codePoint <= 0x1f || (codePoint >= 0x7f && codePoint <= 0x9f)) {\n if (codePoint === 0x09 || codePoint === 0x0a || codePoint === 0x0d) result += \" \";\n index += character.length;\n continue;\n }\n result += character;\n index += character.length;\n }\n return truncate(result.replace(/\\s+/gu, \" \").trim(), maxChars);\n}\n\nexport function redactUsageError(value: string, secrets: readonly string[] = []): string {\n let redacted = value;\n for (const secret of [...new Set(secrets)].filter(Boolean).sort((a, b) => b.length - a.length)) {\n redacted = redacted.replace(new RegExp(escapeRegExp(secret), \"g\"), \"<redacted>\");\n }\n redacted = redacted\n .replace(/Bearer\\s+[A-Za-z0-9._~+/=-]+/gi, \"Bearer <redacted>\")\n .replace(/\"(?:access_token|refresh_token|api_key)\"\\s*:\\s*\"[^\"]+\"/gi, (match) => {\n const separator = match.indexOf(\":\");\n return `${match.slice(0, separator + 1)}\"<redacted>\"`;\n });\n return sanitizeDisplayText(redacted, 600);\n}\n\nexport function errorMessage(error: unknown): string {\n return sanitizeDisplayText(error instanceof Error ? error.message : String(error), 600);\n}\n\nexport function abortError(): Error {\n return Object.assign(new Error(\"Usage query aborted.\"), { name: \"AbortError\" });\n}\n\nfunction skipTerminalEscape(value: string, start: number, codePoint: number): number {\n let index = start + 1;\n const next = value.charCodeAt(index);\n const isOsc = codePoint === 0x9d || (codePoint === 0x1b && next === 0x5d);\n if (isOsc) {\n if (codePoint === 0x1b) index += 1;\n while (index < value.length) {\n const current = value.charCodeAt(index);\n if (current === 0x07) return index + 1;\n if (current === 0x1b && value.charCodeAt(index + 1) === 0x5c) return index + 2;\n index += 1;\n }\n return index;\n }\n const isCsi = codePoint === 0x9b || (codePoint === 0x1b && next === 0x5b);\n if (isCsi) {\n if (codePoint === 0x1b) index += 1;\n while (index < value.length) {\n const current = value.charCodeAt(index);\n index += 1;\n if (current >= 0x40 && current <= 0x7e) break;\n }\n return index;\n }\n return Math.min(value.length, start + (codePoint === 0x1b ? 2 : 1));\n}\n\nfunction cacheKey(providerId: string, fingerprint: string): string {\n return `${providerId}:${fingerprint}`;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction truncate(value: string, maxChars: number): string {\n if (value.length <= maxChars) return value;\n return `${value.slice(0, maxChars - 1)}\u2026`;\n}\n", "import type { OAuthCredential } from \"@earendil-works/pi-ai\";\nimport { type ExtensionAPI, type ExtensionContext, readStoredCredential } from \"@earendil-works/pi-coding-agent\";\n\nexport const OAUTH_CREDENTIAL_SOURCE_CHANNEL = \"oauth:credential-source:v1\";\n\nexport type StoredCredentialReader = (providerId: string) => unknown;\n\nexport type OAuthCredentialCandidates =\n | { ok: true; candidates: readonly OAuthCredential[]; offeredCount?: number }\n | { ok: false };\n\nexport type OAuthCredentialCandidateReader = (ctx: ExtensionContext, providerId: string) => OAuthCredentialCandidates;\n\nexport function createOAuthCredentialCandidateReader(\n pi: ExtensionAPI,\n credentialReader: StoredCredentialReader = readStoredCredential,\n): OAuthCredentialCandidateReader {\n return (ctx, providerId) => collectOAuthCredentialCandidates(pi, ctx, providerId, credentialReader);\n}\n\nexport function collectOAuthCredentialCandidates(\n pi: Pick<ExtensionAPI, \"events\">,\n ctx: ExtensionContext,\n providerId: string,\n credentialReader: StoredCredentialReader = readStoredCredential,\n): OAuthCredentialCandidates {\n const candidates: OAuthCredential[] = [];\n let collecting = true;\n const request = Object.freeze({\n session: ctx.sessionManager,\n provider: providerId,\n offer(candidate: unknown) {\n if (!collecting) return;\n const clone = cloneOAuthCredential(candidate);\n if (clone) candidates.push(clone);\n },\n });\n try {\n pi.events.emit(OAUTH_CREDENTIAL_SOURCE_CHANNEL, request);\n } catch {\n return { ok: false };\n } finally {\n collecting = false;\n }\n const offeredCount = candidates.length;\n try {\n const fallback = cloneOAuthCredential(credentialReader(providerId));\n if (fallback) candidates.push(fallback);\n } catch {\n // A malformed or unavailable standalone credential is equivalent to no fallback.\n }\n return { ok: true, candidates, offeredCount };\n}\n\nexport function fallbackOAuthCredentialCandidates(\n providerId: string,\n credentialReader: StoredCredentialReader,\n): OAuthCredentialCandidates {\n try {\n const credential = cloneOAuthCredential(credentialReader(providerId));\n return { ok: true, candidates: credential ? [credential] : [], offeredCount: 0 };\n } catch {\n return { ok: true, candidates: [], offeredCount: 0 };\n }\n}\n\nfunction cloneOAuthCredential(value: unknown): OAuthCredential | undefined {\n try {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n const clone = structuredClone(value) as OAuthCredential;\n if (!clone || typeof clone !== \"object\" || Array.isArray(clone)) return undefined;\n if (clone.type !== \"oauth\") return undefined;\n if (typeof clone.access !== \"string\" || !clone.access) return undefined;\n if (typeof clone.refresh !== \"string\" || !clone.refresh) return undefined;\n if (typeof clone.expires !== \"number\" || !Number.isFinite(clone.expires)) return undefined;\n return clone;\n } catch {\n return undefined;\n }\n}\n", "// This module intentionally keeps adapter transport beside resolved-auth and origin validation;\n// separating that security boundary would duplicate request and redaction policy across providers.\nimport { randomBytes } from \"node:crypto\";\nimport { type ExtensionContext, readStoredCredential } from \"@earendil-works/pi-coding-agent\";\nimport { errorMessage, fingerprintResolvedAuth, redactUsageError } from \"./core.js\";\nimport { fallbackOAuthCredentialCandidates, type OAuthCredentialCandidateReader } from \"./oauth-credential-source.js\";\nimport { normalizeBasetenBillingUsagePayload } from \"./providers/baseten.js\";\nimport { normalizeCodexBackendPayload } from \"./providers/codex.js\";\nimport { normalizeDeepSeekBalancePayload } from \"./providers/deepseek.js\";\nimport { createFireworksAdapter } from \"./providers/fireworks.js\";\nimport { normalizeGitHubCopilotUsagePayload } from \"./providers/github-copilot.js\";\nimport { normalizeKimiCodingUsagePayload } from \"./providers/kimi-coding.js\";\nimport { type MiniMaxProviderId, miniMaxUsageKind, normalizeMiniMaxUsagePayload } from \"./providers/minimax.js\";\nimport { normalizeMoonshotBalancePayload } from \"./providers/moonshot.js\";\nimport { normalizeOpenCodeZenPayload } from \"./providers/opencode-zen.js\";\nimport { normalizeOpenRouterKeyPayload } from \"./providers/openrouter.js\";\nimport { normalizeVercelAIGatewayCreditsPayload } from \"./providers/vercel-ai-gateway.js\";\nimport { normalizeXaiBillingPayload } from \"./providers/xai.js\";\nimport { normalizeZaiQuotaPayload, normalizeZaiSubscriptionPayload } from \"./providers/zai.js\";\nimport { zaiResponseError } from \"./providers/zai-errors.js\";\nimport type {\n BasetenBillingUsagePayload,\n CodexBackendPayload,\n DeepSeekBalancePayload,\n GitHubCopilotUsagePayload,\n KimiCodingUsagePayload,\n MiniMaxUsagePayload,\n MoonshotBalancePayload,\n OpenCodeZenPayload,\n OpenRouterKeyPayload,\n PiModel,\n ResolvedUsageAuth,\n UsageProviderAdapter,\n UsageQuerySettings,\n UsageReport,\n UsageRequestGuard,\n VercelAIGatewayCreditsPayload,\n XaiBillingPayload,\n XaiUserPayload,\n ZaiPlanInfo,\n ZaiQuotaPayload,\n ZaiSubscriptionPayload,\n} from \"./types.js\";\nimport { resolveUsageTarget } from \"./usage-targets.js\";\n\nconst BASETEN_BILLING_USAGE_URL = \"https://api.baseten.co/v1/billing/usage_summary\";\nconst BASETEN_USAGE_WINDOW_DAYS = 30;\nconst CODEX_USAGE_URL = \"https://chatgpt.com/backend-api/wham/usage\";\nconst DEEPSEEK_BALANCE_URL = \"https://api.deepseek.com/user/balance\";\nconst GITHUB_COPILOT_USAGE_URL = \"https://api.github.com/copilot_internal/user\";\nconst OPENROUTER_KEY_URL = \"https://openrouter.ai/api/v1/key\";\nconst VERCEL_AI_GATEWAY_CREDITS_URL = \"https://ai-gateway.vercel.sh/v1/credits\";\nconst OPENCODE_GO_USAGE_URL = \"https://opencode.ai/zen/go/v1/usage\";\nconst KIMI_CODING_USAGE_URL = \"https://api.kimi.com/coding/v1/usages\";\nconst MINIMAX_API_ROOTS = Object.freeze({\n minimax: \"https://api.minimax.io\",\n \"minimax-cn\": \"https://api.minimaxi.com\",\n});\nconst MOONSHOT_BALANCE_URLS = Object.freeze({\n moonshotai: \"https://api.moonshot.ai/v1/users/me/balance\",\n \"moonshotai-cn\": \"https://api.moonshot.cn/v1/users/me/balance\",\n});\nconst SHARED_MOONSHOT_ENV_VAR = \"MOONSHOT_API_KEY\";\nconst XAI_USER_URL = \"https://cli-chat-proxy.grok.com/v1/user?include=subscription\";\nconst XAI_BILLING_URL = \"https://cli-chat-proxy.grok.com/v1/billing?format=credits\";\nconst XAI_CLIENT_HEADERS = Object.freeze({\n \"X-XAI-Token-Auth\": \"xai-grok-cli\",\n \"x-grok-client-version\": \"1.0.10\",\n \"x-grok-client-mode\": \"interactive\",\n});\nconst MAX_SUCCESS_BODY_BYTES = 64 * 1024;\nconst MAX_ERROR_BODY_BYTES = 4 * 1024;\n\nexport const AUTH_FINGERPRINT_SALT = randomBytes(32);\n\nexport const SUPPORTED_ADAPTERS: readonly UsageProviderAdapter[] = [\n {\n id: \"baseten\",\n displayName: \"Baseten\",\n semantics: { kind: \"api-key\", label: \"Organization Model APIs spend\" },\n async query(auth, signal, timeoutMs, guard) {\n if (!guard) throw new Error(\"Baseten billing usage requires request-boundary revalidation.\");\n const startedAt = Date.now();\n await guard();\n const windowAt = Date.now();\n const payload = (await fetchProviderJson(\n basetenBillingUsageUrl(windowAt),\n auth,\n signal,\n remainingTimeout(timeoutMs, startedAt, \"fetching Baseten billing usage\"),\n \"Baseten billing usage endpoint\",\n { redirect: \"error\" },\n )) as BasetenBillingUsagePayload;\n await guard();\n return normalizeBasetenBillingUsagePayload(payload, Date.now());\n },\n },\n {\n id: \"openai-codex\",\n displayName: \"OpenAI Codex\",\n semantics: {\n kind: \"consumer-subscription\",\n label: \"ChatGPT subscription limits\",\n },\n async query(auth, signal, timeoutMs) {\n const payload = await fetchProviderJson(CODEX_USAGE_URL, auth, signal, timeoutMs, \"Codex usage endpoint\");\n return normalizeCodexBackendPayload(payload as CodexBackendPayload, Date.now());\n },\n },\n {\n id: \"deepseek\",\n displayName: \"DeepSeek\",\n semantics: { kind: \"api-key\", label: \"DeepSeek API balance\" },\n async query(auth, signal, timeoutMs, guard) {\n if (!guard) throw new Error(\"DeepSeek API balance requires request-boundary revalidation.\");\n const startedAt = Date.now();\n await guard();\n const remainingMs = timeoutMs - (Date.now() - startedAt);\n if (remainingMs <= 0) throw new Error(\"Timed out while revalidating DeepSeek runtime auth.\");\n const payload = await fetchProviderJson(\n DEEPSEEK_BALANCE_URL,\n auth,\n signal,\n remainingMs,\n \"DeepSeek API balance endpoint\",\n { redirect: \"error\" },\n );\n return normalizeDeepSeekBalancePayload(payload as DeepSeekBalancePayload, Date.now());\n },\n },\n {\n id: \"github-copilot\",\n displayName: \"GitHub Copilot\",\n semantics: {\n kind: \"consumer-subscription\",\n label: \"GitHub Copilot account allowance\",\n },\n async query(auth, signal, timeoutMs) {\n const payload = await fetchProviderJson(\n GITHUB_COPILOT_USAGE_URL,\n auth,\n signal,\n timeoutMs,\n \"GitHub Copilot usage endpoint\",\n );\n return normalizeGitHubCopilotUsagePayload(payload as GitHubCopilotUsagePayload, Date.now());\n },\n },\n {\n id: \"openrouter\",\n displayName: \"OpenRouter\",\n semantics: { kind: \"api-key\", label: \"API-key spend limits\" },\n async query(auth, signal, timeoutMs) {\n const payload = await fetchProviderJson(OPENROUTER_KEY_URL, auth, signal, timeoutMs, \"OpenRouter key endpoint\");\n return normalizeOpenRouterKeyPayload(payload as OpenRouterKeyPayload, Date.now());\n },\n },\n {\n id: \"vercel-ai-gateway\",\n displayName: \"Vercel AI Gateway\",\n semantics: { kind: \"api-key\", label: \"AI Gateway credits and lifetime spend\" },\n async query(auth, signal, timeoutMs, guard) {\n if (!guard) throw new Error(\"Vercel AI Gateway usage requires request-boundary revalidation.\");\n const startedAt = Date.now();\n await guard();\n const payload = (await fetchProviderJson(\n VERCEL_AI_GATEWAY_CREDITS_URL,\n auth,\n signal,\n remainingTimeout(timeoutMs, startedAt, \"fetching Vercel AI Gateway credits\"),\n \"Vercel AI Gateway credits endpoint\",\n { redirect: \"error\" },\n )) as VercelAIGatewayCreditsPayload;\n await guard();\n return normalizeVercelAIGatewayCreditsPayload(payload, Date.now());\n },\n },\n createFireworksAdapter(fetchProviderJson),\n {\n id: \"opencode-go\",\n displayName: \"OpenCode Go\",\n semantics: { kind: \"consumer-subscription\", label: \"OpenCode Zen plan usage\" },\n async query(auth, signal, timeoutMs) {\n const payload = await fetchProviderJson(\n OPENCODE_GO_USAGE_URL,\n auth,\n signal,\n timeoutMs,\n \"OpenCode Zen usage endpoint\",\n );\n return normalizeOpenCodeZenPayload(payload as OpenCodeZenPayload, Date.now());\n },\n },\n {\n id: \"kimi-coding\",\n displayName: \"Kimi For Coding\",\n semantics: { kind: \"consumer-subscription\", label: \"Kimi Coding Plan usage\" },\n async query(auth, signal, timeoutMs) {\n const payload = await fetchProviderJson(\n KIMI_CODING_USAGE_URL,\n auth,\n signal,\n timeoutMs,\n \"Kimi Coding usage endpoint\",\n { redirect: \"error\" },\n );\n return normalizeKimiCodingUsagePayload(payload as KimiCodingUsagePayload, Date.now());\n },\n },\n {\n id: \"minimax\",\n displayName: \"MiniMax\",\n semantics: { kind: \"consumer-subscription\", label: \"MiniMax usage\" },\n async query(auth, signal, timeoutMs, guard) {\n return queryMiniMaxUsage(\"minimax\", auth, signal, timeoutMs, guard);\n },\n },\n {\n id: \"minimax-cn\",\n displayName: \"MiniMax CN\",\n semantics: { kind: \"consumer-subscription\", label: \"MiniMax usage\" },\n async query(auth, signal, timeoutMs, guard) {\n return queryMiniMaxUsage(\"minimax-cn\", auth, signal, timeoutMs, guard);\n },\n },\n {\n id: \"moonshotai\",\n displayName: \"Moonshot AI\",\n semantics: { kind: \"api-key\", label: \"Moonshot API account balance\" },\n async query(auth, signal, timeoutMs, guard) {\n return queryMoonshotBalance(\"moonshotai\", auth, signal, timeoutMs, guard);\n },\n },\n {\n id: \"moonshotai-cn\",\n displayName: \"Moonshot AI CN\",\n semantics: { kind: \"api-key\", label: \"Moonshot API account balance\" },\n async query(auth, signal, timeoutMs, guard) {\n return queryMoonshotBalance(\"moonshotai-cn\", auth, signal, timeoutMs, guard);\n },\n },\n {\n id: \"zai\",\n displayName: \"Z.AI\",\n invalidateCacheOnFailure: true,\n semantics: { kind: \"consumer-subscription\", label: \"GLM Coding Plan usage\" },\n async query(auth, signal, timeoutMs, guard) {\n return queryZaiUsage(\"zai\", \"Z.AI\", auth, signal, timeoutMs, guard);\n },\n },\n {\n id: \"zai-coding-cn\",\n displayName: \"Z.AI Coding CN\",\n invalidateCacheOnFailure: true,\n semantics: { kind: \"consumer-subscription\", label: \"GLM Coding Plan usage\" },\n async query(auth, signal, timeoutMs, guard) {\n return queryZaiUsage(\"zai-coding-cn\", \"Z.AI Coding CN\", auth, signal, timeoutMs, guard);\n },\n },\n];\n\n// Reviewed contract pins:\n// - Pi xAI provider at https://api.x.ai and OAuth scope\n// \"openid profile email offline_access grok-cli:access api:access\" at\n// e86823096c5bad39e1ca282ec24bc5eb9bec745b, unchanged at\n// ccfe79ed238674f760c986e3a61493aab794000a.\n// - Grok Build identity, credits routes/structs, required token-auth and version headers, and\n// client-mode telemetry at 9684fa3cdbf2995e30ea8b9b637f1db008f144fc (client version 1.0.10).\n// - xAI Management API's separate team billing boundary at\n// 723dd2aa22d17be35617463837dc47cda008d90e.\n// x-userid remains attached only to billing to bind the proxy-canonical identity as Grok Build does.\nexport const XAI_ADAPTER: UsageProviderAdapter = {\n id: \"xai\",\n displayName: \"xAI\",\n semantics: {\n kind: \"consumer-subscription\",\n label: \"xAI consumer subscription usage\",\n },\n publishesStatusline: false,\n async query(auth, signal, timeoutMs, guard) {\n if (!guard) throw new Error(\"xAI usage requires request-boundary revalidation.\");\n const startedAt = Date.now();\n const clientAuth = {\n ...auth,\n headers: { ...auth.headers, ...XAI_CLIENT_HEADERS },\n };\n await guard();\n const userPayload = (await fetchProviderJson(\n XAI_USER_URL,\n clientAuth,\n signal,\n remainingTimeout(timeoutMs, startedAt),\n \"xAI consumer identity endpoint\",\n { redirect: \"error\", userAgent: false },\n )) as XaiUserPayload;\n await guard();\n const userId = validatedXaiUserId(userPayload.userId);\n const billingAuth = {\n ...clientAuth,\n headers: { ...clientAuth.headers, \"x-userid\": userId },\n secrets: [...clientAuth.secrets, userId],\n };\n await guard();\n const billingPayload = (await fetchProviderJson(\n XAI_BILLING_URL,\n billingAuth,\n signal,\n remainingTimeout(timeoutMs, startedAt),\n \"xAI consumer billing endpoint\",\n { redirect: \"error\", userAgent: false },\n )) as XaiBillingPayload;\n await guard();\n return normalizeXaiBillingPayload(billingPayload, userPayload.subscriptionTier, Date.now());\n },\n};\n\nexport function usageAdapters(): readonly UsageProviderAdapter[] {\n return [...SUPPORTED_ADAPTERS, XAI_ADAPTER];\n}\n\nexport function adapterForProvider(providerId: string | undefined): UsageProviderAdapter | undefined {\n return usageAdapters().find((adapter) => adapter.id === providerId);\n}\n\nexport function isStaleExtensionContextError(error: unknown): boolean {\n return (\n error instanceof Error && error.message.includes(\"This extension ctx is stale after session replacement or reload\")\n );\n}\n\nexport async function resolveUsageAuth(\n ctx: ExtensionContext,\n adapter: UsageProviderAdapter,\n salt: Uint8Array = AUTH_FINGERPRINT_SALT,\n credentialReader: StoredCredentialReader = readStoredCredential,\n candidateReader?: OAuthCredentialCandidateReader,\n): Promise<ResolvedUsageAuth | undefined> {\n if (ctx.model?.provider === adapter.id && !hasOfficialOrigin(ctx.model, adapter.id)) {\n throw new Error(\n `${adapter.displayName} usage cannot send a custom provider base URL credential to the official usage endpoint.`,\n );\n }\n\n const model = candidateModels(ctx, adapter.id).find((candidate) => hasOfficialOrigin(candidate, adapter.id));\n if (!model) return undefined;\n // SAFETY: Pi exposes the required auth methods at runtime, and checks below narrow them before use.\n const registry = ctx.modelRegistry as unknown as UsageAuthRegistry;\n const provider = registry.getProvider?.(adapter.id);\n if (provider?.baseUrl && !hasOfficialUrlOrigin(provider.baseUrl, adapter.id)) {\n throw new Error(\n `${adapter.displayName} usage cannot send an overridden provider credential to the official usage endpoint.`,\n );\n }\n let modelAuth: RequestAuth | undefined;\n const currentModel = ctx.model?.provider === adapter.id ? ctx.model : undefined;\n const resolveCurrentModelAuth = async (): Promise<RequestAuth | undefined> => {\n if (!currentModel || typeof registry.getApiKeyAndHeaders !== \"function\") return undefined;\n const result = await registry.getApiKeyAndHeaders(currentModel);\n if (!result.ok) throw new Error(redactUsageError(result.error));\n return authorizationFrom(result) ? result : undefined;\n };\n const resolveSelectedAuthLast = [\"deepseek\", \"minimax\", \"minimax-cn\"].includes(adapter.id);\n if (!resolveSelectedAuthLast) modelAuth = await resolveCurrentModelAuth();\n if (typeof registry.getProviderAuth !== \"function\") {\n throw new Error(\"pi-usage requires Pi 0.81.0 or newer to validate resolved provider auth.\");\n }\n if (!moonshotProviderAuthIsAllowed(ctx, adapter.id)) return undefined;\n const providerResult = await registry.getProviderAuth(adapter.id);\n if (!moonshotProviderAuthIsAllowed(ctx, adapter.id)) return undefined;\n if (providerResult?.auth.baseUrl && !hasOfficialUrlOrigin(providerResult.auth.baseUrl, adapter.id)) {\n throw new Error(\n `${adapter.displayName} usage cannot send a proxy-resolved credential to the official usage endpoint.`,\n );\n }\n // Providers with credential-change retries read selected-model auth last so a rotation during\n // provider-origin validation cannot leave the earlier credential queued for the usage request.\n if (resolveSelectedAuthLast) modelAuth = await resolveCurrentModelAuth();\n if (modelAuth?.baseUrl && !hasOfficialUrlOrigin(modelAuth.baseUrl, adapter.id)) {\n throw new Error(\n `${adapter.displayName} usage cannot send model-resolved proxy credentials to the official usage endpoint.`,\n );\n }\n const auth = modelAuth ?? providerResult?.auth;\n if (!auth) return undefined;\n const finalize = (resolved: ResolvedUsageAuth): ResolvedUsageAuth => {\n const preservedAuth = { ...(providerResult?.auth ?? auth) };\n const env = providerResult?.env ?? modelAuth?.env;\n const source = providerResult?.source;\n const effectiveBaseUrl = modelAuth?.baseUrl ?? providerResult?.auth.baseUrl ?? provider?.baseUrl ?? model.baseUrl;\n const redactionInputs = [\n preservedAuth.apiKey,\n ...Object.values(preservedAuth.headers ?? {}),\n ...Object.values(env ?? {}),\n modelAuth?.apiKey,\n ...Object.values(modelAuth?.headers ?? {}),\n ].filter((value): value is string => typeof value === \"string\" && value.length > 0);\n return {\n ...resolved,\n auth: preservedAuth,\n ...(env ? { env: { ...env } } : {}),\n ...(source ? { source } : {}),\n effectiveBaseUrl,\n secrets: [...new Set([...resolved.secrets, ...redactionInputs])],\n fingerprint: fingerprintResolvedAuth(\n {\n apiKey: resolved.apiKey,\n headers: resolved.headers,\n baseUrl: effectiveBaseUrl,\n env,\n source,\n providerAuth: preservedAuth,\n },\n salt,\n ),\n };\n };\n if (adapter.id === \"github-copilot\") {\n const offered = candidateReader\n ? candidateReader(ctx, adapter.id)\n : fallbackOAuthCredentialCandidates(adapter.id, credentialReader);\n if (!offered.ok) {\n throw new Error(\"GitHub Copilot OAuth credential discovery failed closed.\");\n }\n return finalize(resolveGitHubCopilotUsageAuth(auth, model, salt, offered.candidates, offered.offeredCount === 0));\n }\n if (adapter.id === \"xai\") {\n const offered = candidateReader\n ? candidateReader(ctx, adapter.id)\n : fallbackOAuthCredentialCandidates(adapter.id, credentialReader);\n if (!offered.ok) throw new Error(\"xAI OAuth credential discovery failed closed.\");\n return finalize(resolveXaiUsageAuth(auth, model, salt, offered.candidates));\n }\n if (adapter.id === \"deepseek\") {\n const resolvedAuthorization = authorizationFrom(auth);\n const access = bearerToken(resolvedAuthorization);\n if (!access) throw new Error(\"DeepSeek API balance requires Bearer authentication.\");\n const authorization = `Bearer ${access}`;\n const headers = { Authorization: authorization };\n return finalize({\n apiKey: access,\n headers,\n fingerprint: \"\",\n secrets: [\n access,\n auth.apiKey,\n headerValue(auth.headers, \"Authorization\"),\n resolvedAuthorization,\n authorization,\n ].filter((value): value is string => Boolean(value)),\n model,\n });\n }\n const authorization = authorizationFrom(auth);\n if (!authorization) return undefined;\n const headers = { Authorization: authorization };\n const secrets = [auth.apiKey, headerValue(auth.headers, \"Authorization\"), authorization].filter(\n (value): value is string => Boolean(value),\n );\n return finalize({\n apiKey: auth.apiKey,\n headers,\n fingerprint: \"\",\n secrets,\n model,\n });\n}\n\nexport async function queryProviderUsage(\n adapter: UsageProviderAdapter,\n auth: ResolvedUsageAuth,\n signal: AbortSignal,\n timeoutMs: number,\n guard?: UsageRequestGuard,\n targetOrSettings?: string | Readonly<UsageQuerySettings>,\n): Promise<UsageReport> {\n const startedAt = Date.now();\n let targetId =\n typeof targetOrSettings === \"string\"\n ? targetOrSettings\n : adapter.id === \"fireworks\"\n ? targetOrSettings?.fireworksAccountId\n : undefined;\n let resolvedLegacyFireworksTarget = false;\n try {\n if (adapter.id === \"fireworks\" && typeof targetOrSettings !== \"string\" && adapter.targets && guard) {\n const target = await resolveUsageTarget(\n adapter,\n auth,\n targetId,\n signal,\n remainingTimeout(timeoutMs, startedAt, \"resolving the Fireworks account\"),\n guard,\n );\n if (target.kind === \"selection-required\") {\n throw new Error(\"Fireworks account selection is required.\");\n }\n targetId = target.targetId;\n resolvedLegacyFireworksTarget = true;\n }\n return await adapter.query(\n auth,\n signal,\n resolvedLegacyFireworksTarget\n ? remainingTimeout(timeoutMs, startedAt, `querying ${adapter.displayName} usage`)\n : timeoutMs,\n guard,\n targetId,\n );\n } catch (error) {\n if (isStaleExtensionContextError(error) || isAbortError(error)) throw error;\n throw new Error(redactUsageError(errorMessage(error), auth.secrets));\n }\n}\n\nexport function providerIsConfigured(ctx: ExtensionContext, providerId: string): boolean {\n try {\n const status = ctx.modelRegistry.getProviderAuthStatus(providerId);\n return status.configured && moonshotProviderAuthSourceIsAllowed(ctx, providerId, status.source, status.label);\n } catch {\n return !isMoonshotSiblingProvider(ctx, providerId) && candidateModels(ctx, providerId).length > 0;\n }\n}\n\nfunction moonshotProviderAuthIsAllowed(ctx: ExtensionContext, providerId: string): boolean {\n if (!isMoonshotSiblingProvider(ctx, providerId)) return true;\n try {\n const status = ctx.modelRegistry.getProviderAuthStatus(providerId);\n return moonshotProviderAuthSourceIsAllowed(ctx, providerId, status.source, status.label);\n } catch {\n return false;\n }\n}\n\nfunction moonshotProviderAuthSourceIsAllowed(\n ctx: ExtensionContext,\n providerId: string,\n source: string | undefined,\n label: string | undefined,\n): boolean {\n if (!isMoonshotSiblingProvider(ctx, providerId)) return true;\n if (source === undefined) return false;\n if (source !== \"environment\") return true;\n return (\n label !== undefined &&\n !label\n .split(\",\")\n .map((name) => name.trim())\n .includes(SHARED_MOONSHOT_ENV_VAR)\n );\n}\n\nfunction isMoonshotSiblingProvider(ctx: ExtensionContext, providerId: string): boolean {\n return (providerId === \"moonshotai\" || providerId === \"moonshotai-cn\") && ctx.model?.provider !== providerId;\n}\n\nfunction candidateModels(ctx: ExtensionContext, providerId: string): PiModel[] {\n const candidates: PiModel[] = [];\n const seen = new Set<string>();\n const add = (model: PiModel | undefined) => {\n if (!model || model.provider !== providerId) return;\n const key = `${model.provider}/${model.id}`;\n if (seen.has(key)) return;\n seen.add(key);\n candidates.push(model);\n };\n add(ctx.model);\n for (const model of ctx.modelRegistry.getAvailable()) add(model);\n for (const model of ctx.modelRegistry.getAll()) add(model);\n return candidates;\n}\n\nexport async function fetchProviderJson(\n url: string,\n auth: ResolvedUsageAuth,\n signal: AbortSignal,\n timeoutMs: number,\n description: string,\n request: {\n method?: \"GET\" | \"POST\";\n body?: Record<string, unknown>;\n redirect?: RequestRedirect;\n userAgent?: boolean;\n responseError?: (status: number, text: string) => string | undefined;\n } = {},\n): Promise<Record<string, unknown>> {\n const controller = new AbortController();\n let timedOut = false;\n const abortFromCaller = () => controller.abort();\n if (signal.aborted) controller.abort();\n else signal.addEventListener(\"abort\", abortFromCaller, { once: true });\n const timeout = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, timeoutMs);\n try {\n const headers = { ...auth.headers };\n if (request.userAgent !== false && !hasHeader(headers, \"User-Agent\")) {\n headers[\"User-Agent\"] = \"pi-usage\";\n }\n if (request.body && !hasHeader(headers, \"Content-Type\")) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n const response = await fetch(url, {\n method: request.method ?? \"GET\",\n headers,\n ...(request.body ? { body: JSON.stringify(request.body) } : {}),\n ...(request.redirect ? { redirect: request.redirect } : {}),\n signal: controller.signal,\n });\n if (response.redirected) throw new Error(`${description} refused a redirected response.`);\n if (controller.signal.aborted) throw Object.assign(new Error(\"Usage query aborted.\"), { name: \"AbortError\" });\n const text = await readBoundedResponse(\n response,\n response.ok ? MAX_SUCCESS_BODY_BYTES : MAX_ERROR_BODY_BYTES,\n !response.ok,\n description,\n controller.signal,\n );\n if (controller.signal.aborted) throw Object.assign(new Error(\"Usage query aborted.\"), { name: \"AbortError\" });\n const responseError = request.responseError?.(response.status, text);\n if (responseError) throw new Error(responseError);\n if (!response.ok) {\n throw new Error(\n `${description} returned ${response.status} ${response.statusText}: ${redactUsageError(text, auth.secrets)}`,\n );\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(text) as unknown;\n } catch (error) {\n throw new Error(`${description} returned invalid JSON: ${errorMessage(error)}`);\n }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(`${description} response was not an object.`);\n }\n return parsed as Record<string, unknown>;\n } catch (error) {\n if (timedOut) {\n throw new Error(`Timed out after ${Math.round(timeoutMs / 1000)}s while fetching usage.`);\n }\n if (signal.aborted) throw Object.assign(new Error(\"Usage query aborted.\"), { name: \"AbortError\" });\n throw error;\n } finally {\n clearTimeout(timeout);\n signal.removeEventListener(\"abort\", abortFromCaller);\n }\n}\n\nasync function readBoundedResponse(\n response: Response,\n maxBytes: number,\n truncateOverflow: boolean,\n description: string,\n signal: AbortSignal,\n): Promise<string> {\n if (!response.body) return \"\";\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n let truncated = false;\n const abort = () => void reader.cancel().catch(() => undefined);\n if (signal.aborted) abort();\n else signal.addEventListener(\"abort\", abort, { once: true });\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n const remaining = maxBytes - total;\n if (value.byteLength > remaining) {\n if (remaining > 0) chunks.push(value.subarray(0, remaining));\n total = maxBytes;\n truncated = true;\n await reader.cancel();\n break;\n }\n chunks.push(value);\n total += value.byteLength;\n }\n } finally {\n signal.removeEventListener(\"abort\", abort);\n reader.releaseLock();\n }\n if (truncated && !truncateOverflow) {\n throw new Error(`${description} response exceeded ${maxBytes} bytes.`);\n }\n const body = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n body.set(chunk, offset);\n offset += chunk.byteLength;\n }\n const text = new TextDecoder().decode(body);\n return truncated ? `${text}\u2026` : text;\n}\n\ntype RequestAuth = {\n apiKey?: string;\n headers?: Record<string, string | null>;\n baseUrl?: string;\n env?: Record<string, string>;\n};\n\ntype StoredCredentialReader = (providerId: string) => unknown;\n\ntype UsageAuthRegistry = {\n getProvider?(providerId: string): { baseUrl?: string } | undefined;\n getApiKeyAndHeaders?(model: PiModel): Promise<({ ok: true } & RequestAuth) | { ok: false; error: string }>;\n getProviderAuth?(providerId: string): Promise<\n | {\n auth: RequestAuth;\n env?: Record<string, string>;\n source?: string;\n }\n | undefined\n >;\n};\n\nfunction resolveXaiUsageAuth(\n auth: RequestAuth,\n model: PiModel,\n salt: Uint8Array,\n candidates: readonly unknown[],\n): ResolvedUsageAuth {\n const resolvedAccess = bearerToken(headerValue(auth.headers, \"Authorization\")) ?? auth.apiKey;\n if (!resolvedAccess) throw new Error(\"xAI runtime authentication was incomplete.\");\n let sawOAuth = false;\n let sawMatchingAccess = false;\n let sawIncompleteMatch = false;\n const matches: Array<{ access: string; refresh: string }> = [];\n for (const candidate of candidates) {\n try {\n const credential = asObject(candidate);\n if (credential?.type !== \"oauth\") continue;\n sawOAuth = true;\n if (credential.access !== resolvedAccess) continue;\n sawMatchingAccess = true;\n if (\n typeof credential.access !== \"string\" ||\n !credential.access ||\n typeof credential.refresh !== \"string\" ||\n !credential.refresh ||\n typeof credential.expires !== \"number\" ||\n !Number.isFinite(credential.expires)\n ) {\n sawIncompleteMatch = true;\n continue;\n }\n matches.push({ access: credential.access, refresh: credential.refresh });\n } catch {\n // Malformed candidates never authorize a consumer-proxy request.\n }\n }\n if (sawIncompleteMatch) throw new Error(\"The matching xAI OAuth credential was incomplete.\");\n if (matches.length > 1) {\n throw new Error(\"Multiple OAuth credentials match the active xAI runtime account.\");\n }\n const match = matches[0];\n if (!match) {\n if (!sawOAuth) {\n throw new Error(\n \"xAI consumer usage requires the OAuth subscription account configured through Pi /login; XAI_API_KEY users can review API spend at console.x.ai.\",\n );\n }\n if (sawMatchingAccess) throw new Error(\"The matching xAI OAuth credential was incomplete.\");\n throw new Error(\"The active xAI runtime account does not match Pi's stored OAuth account.\");\n }\n const authorization = `Bearer ${match.access}`;\n const headers = { Authorization: authorization };\n return {\n apiKey: match.access,\n headers,\n fingerprint: fingerprintResolvedAuth({ headers }, salt),\n secrets: [\n match.access,\n match.refresh,\n resolvedAccess,\n auth.apiKey,\n headerValue(auth.headers, \"Authorization\"),\n authorization,\n ].filter((value): value is string => Boolean(value)),\n model,\n };\n}\n\nfunction resolveGitHubCopilotUsageAuth(\n auth: RequestAuth,\n model: PiModel,\n salt: Uint8Array,\n candidates: readonly unknown[],\n standaloneFallback: boolean,\n): ResolvedUsageAuth {\n const resolvedAccess = bearerToken(headerValue(auth.headers, \"Authorization\")) ?? auth.apiKey;\n if (!resolvedAccess) throw new Error(\"GitHub Copilot OAuth credentials were incomplete.\");\n let sawOAuth = false;\n let sawMatchingAccess = false;\n let sawIncompleteMatch = false;\n let sawEnterpriseMatch = false;\n const matches = new Map<string, { refresh: string; storedAccess: string }>();\n for (const candidate of candidates) {\n try {\n const credential = asObject(candidate);\n if (credential?.type !== \"oauth\") continue;\n sawOAuth = true;\n const storedAccess = typeof credential.access === \"string\" && credential.access ? credential.access : undefined;\n if (storedAccess !== resolvedAccess) continue;\n sawMatchingAccess = true;\n const enterpriseUrl = credential.enterpriseUrl;\n if (typeof enterpriseUrl === \"string\" && enterpriseUrl && !isPublicGitHubDomain(enterpriseUrl)) {\n sawEnterpriseMatch = true;\n continue;\n }\n const refresh = typeof credential.refresh === \"string\" && credential.refresh ? credential.refresh : undefined;\n if (!refresh) {\n sawIncompleteMatch = true;\n continue;\n }\n matches.set(`${storedAccess.length}:${storedAccess}${refresh}`, { refresh, storedAccess });\n } catch {\n // Malformed candidates never authorize a provider request.\n }\n }\n if (sawEnterpriseMatch) {\n throw new Error(\"GitHub Copilot usage does not yet support GitHub Enterprise accounts.\");\n }\n if (sawIncompleteMatch) throw new Error(\"GitHub Copilot OAuth credentials were incomplete.\");\n if (matches.size > 1) {\n throw new Error(\"Conflicting OAuth credentials match the active GitHub Copilot runtime account.\");\n }\n const match = matches.values().next().value;\n if (!match) {\n if (!sawOAuth) {\n throw new Error(\n standaloneFallback\n ? \"GitHub Copilot usage requires the OAuth account configured through Pi /login.\"\n : \"GitHub Copilot usage requires an OAuth account configured through Pi /login or a compatible credential source.\",\n );\n }\n if (sawMatchingAccess) throw new Error(\"GitHub Copilot OAuth credentials were incomplete.\");\n throw new Error(\n standaloneFallback\n ? \"The active GitHub Copilot runtime account does not match Pi's stored OAuth account.\"\n : \"The active GitHub Copilot runtime account does not match any available OAuth account.\",\n );\n }\n const { refresh, storedAccess } = match;\n const authorization = `Bearer ${refresh}`;\n const headers = {\n Authorization: authorization,\n \"X-GitHub-Api-Version\": \"2025-05-01\",\n };\n return {\n apiKey: refresh,\n headers,\n fingerprint: fingerprintResolvedAuth({ headers }, salt),\n secrets: [refresh, storedAccess, resolvedAccess, authorization],\n model,\n };\n}\n\nfunction authorizationFrom(auth: RequestAuth): string | undefined {\n return headerValue(auth.headers, \"Authorization\") ?? (auth.apiKey ? `Bearer ${auth.apiKey}` : undefined);\n}\n\nfunction bearerToken(authorization: string | undefined): string | undefined {\n const match = /^Bearer\\s+(.+)$/iu.exec(authorization ?? \"\");\n return match?.[1];\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n return value as Record<string, unknown>;\n}\n\nfunction isPublicGitHubDomain(value: string): boolean {\n try {\n const url = new URL(value.includes(\"://\") ? value : `https://${value}`);\n return url.hostname.toLowerCase() === \"github.com\";\n } catch {\n return false;\n }\n}\n\nfunction hasOfficialOrigin(model: PiModel, providerId: string): boolean {\n return hasOfficialUrlOrigin(model.baseUrl, providerId);\n}\n\nfunction hasOfficialUrlOrigin(value: string, providerId: string): boolean {\n try {\n const url = new URL(value);\n if (providerId === \"baseten\") {\n return [\"https://inference.baseten.co\", \"https://api.baseten.co\"].includes(url.origin);\n }\n if (providerId === \"openai-codex\") return url.origin === \"https://chatgpt.com\";\n if (providerId === \"deepseek\") return url.origin === \"https://api.deepseek.com\";\n if (providerId === \"fireworks\") return url.origin === \"https://api.fireworks.ai\";\n if (providerId === \"openrouter\") return url.origin === \"https://openrouter.ai\";\n if (providerId === \"vercel-ai-gateway\") return url.origin === \"https://ai-gateway.vercel.sh\";\n if (providerId === \"opencode-go\") return url.origin === \"https://opencode.ai\";\n if (providerId === \"kimi-coding\") return url.origin === \"https://api.kimi.com\";\n if (providerId === \"minimax\") return url.origin === \"https://api.minimax.io\";\n if (providerId === \"minimax-cn\") return url.origin === \"https://api.minimaxi.com\";\n if (providerId === \"moonshotai\") return url.origin === \"https://api.moonshot.ai\";\n if (providerId === \"moonshotai-cn\") return url.origin === \"https://api.moonshot.cn\";\n if (providerId === \"xai\") return url.origin === \"https://api.x.ai\";\n if (providerId === \"zai\") return url.origin === \"https://api.z.ai\";\n if (providerId === \"zai-coding-cn\") return url.origin === \"https://open.bigmodel.cn\";\n if (providerId === \"github-copilot\") {\n return url.protocol === \"https:\" && /^api\\.[a-z0-9-]+\\.githubcopilot\\.com$/u.test(url.hostname);\n }\n return false;\n } catch {\n return false;\n }\n}\n\nfunction headerValue(headers: Record<string, string | null> | undefined, name: string): string | undefined {\n const entry = Object.entries(headers ?? {}).find(([candidate]) => candidate.toLowerCase() === name.toLowerCase());\n return entry?.[1] ?? undefined;\n}\n\nfunction hasHeader(headers: Record<string, string>, name: string): boolean {\n return Object.keys(headers).some((key) => key.toLowerCase() === name.toLowerCase());\n}\n\nfunction validatedXaiUserId(value: unknown): string {\n if (typeof value !== \"string\" || !/^[A-Za-z0-9._~-]{1,128}$/u.test(value)) {\n throw new Error(\"xAI consumer identity returned an unsafe canonical user ID.\");\n }\n return value;\n}\n\nfunction basetenBillingUsageUrl(windowAt: number): string {\n const url = new URL(BASETEN_BILLING_USAGE_URL);\n url.searchParams.set(\n \"start_date\",\n new Date(windowAt - BASETEN_USAGE_WINDOW_DAYS * 24 * 60 * 60 * 1_000).toISOString(),\n );\n url.searchParams.set(\"end_date\", new Date(windowAt).toISOString());\n return url.toString();\n}\n\nasync function queryMiniMaxUsage(\n providerId: MiniMaxProviderId,\n auth: ResolvedUsageAuth,\n signal: AbortSignal,\n timeoutMs: number,\n guard: UsageRequestGuard | undefined,\n): Promise<UsageReport> {\n if (!guard) throw new Error(\"MiniMax usage requires request-boundary revalidation.\");\n const apiKey = bearerToken(headerValue(auth.headers, \"Authorization\")) ?? auth.apiKey;\n if (!apiKey) throw new Error(\"MiniMax runtime API key was unavailable.\");\n const kind = miniMaxUsageKind(apiKey);\n const path = kind === \"account-balance\" ? \"/account/query_balance\" : \"/v1/token_plan/remains\";\n const startedAt = Date.now();\n await guard();\n const payload = (await fetchProviderJson(\n `${MINIMAX_API_ROOTS[providerId]}${path}`,\n auth,\n signal,\n remainingTimeout(timeoutMs, startedAt, \"fetching MiniMax usage\"),\n \"MiniMax usage endpoint\",\n { redirect: \"error\" },\n )) as MiniMaxUsagePayload;\n await guard();\n return normalizeMiniMaxUsagePayload(providerId, kind, payload, Date.now());\n}\n\nasync function queryMoonshotBalance(\n providerId: \"moonshotai\" | \"moonshotai-cn\",\n auth: ResolvedUsageAuth,\n signal: AbortSignal,\n timeoutMs: number,\n guard: UsageRequestGuard | undefined,\n): Promise<UsageReport> {\n if (!guard) throw new Error(\"Moonshot AI balance requires request-boundary revalidation.\");\n const startedAt = Date.now();\n await guard();\n const payload = (await fetchProviderJson(\n MOONSHOT_BALANCE_URLS[providerId],\n auth,\n signal,\n remainingTimeout(timeoutMs, startedAt, \"fetching Moonshot AI balance\"),\n \"Moonshot AI balance endpoint\",\n { redirect: \"error\" },\n )) as MoonshotBalancePayload;\n await guard();\n return normalizeMoonshotBalancePayload(providerId, payload, Date.now());\n}\n\nfunction remainingTimeout(timeoutMs: number, startedAt: number, description = \"fetching xAI consumer usage\"): number {\n const remaining = timeoutMs - (Date.now() - startedAt);\n if (remaining <= 0) throw new Error(`Timed out while ${description}.`);\n return remaining;\n}\n\nfunction zaiOrigin(baseUrl: string | undefined): string {\n const base = baseUrl?.trim();\n if (!base) throw new Error(\"Z.AI model base URL is unavailable.\");\n return new URL(base).origin;\n}\n\nfunction zaiMonitorUrl(baseUrl: string | undefined): string {\n return `${zaiOrigin(baseUrl)}/api/monitor/usage/quota/limit`;\n}\n\nfunction zaiMonitorAuth(auth: ResolvedUsageAuth): ResolvedUsageAuth {\n const authorization = headerValue(auth.headers, \"Authorization\");\n const token = authorization === undefined ? undefined : (bearerToken(authorization) ?? authorization);\n if (token === undefined || token === authorization) return auth;\n return { ...auth, headers: { ...auth.headers, Authorization: token } };\n}\n\nasync function queryZaiUsage(\n providerId: \"zai\" | \"zai-coding-cn\",\n providerName: string,\n auth: ResolvedUsageAuth,\n signal: AbortSignal,\n timeoutMs: number,\n guard: UsageRequestGuard | undefined,\n): Promise<UsageReport> {\n if (!guard) throw new Error(\"Z.AI usage requires request-boundary revalidation.\");\n const startedAt = Date.now();\n await guard();\n const payload = (await fetchProviderJson(\n zaiMonitorUrl(auth.model.baseUrl),\n zaiMonitorAuth(auth),\n signal,\n remainingTimeout(timeoutMs, startedAt, `fetching ${providerName} quota`),\n `${providerName} quota endpoint`,\n { responseError: zaiResponseError },\n )) as ZaiQuotaPayload;\n await guard();\n const planTimeoutMs = timeoutMs - (Date.now() - startedAt);\n const plan = await fetchZaiPlan(providerName, auth, signal, planTimeoutMs);\n return normalizeZaiQuotaPayload(providerId, providerName, payload, Date.now(), plan);\n}\n\n// The subscription endpoint is undocumented and may not exist on every official origin. It only\n// contributes the plan name and renewal date, so any non-abort failure is swallowed instead of\n// blanking the required quota report.\nasync function fetchZaiPlan(\n providerName: string,\n auth: ResolvedUsageAuth,\n signal: AbortSignal,\n timeoutMs: number,\n): Promise<ZaiPlanInfo | undefined> {\n if (timeoutMs <= 0 || signal.aborted) return undefined;\n try {\n const payload = (await fetchProviderJson(\n `${zaiOrigin(auth.model.baseUrl)}/api/biz/subscription/list`,\n zaiMonitorAuth(auth),\n signal,\n timeoutMs,\n `${providerName} plan endpoint`,\n { responseError: zaiResponseError },\n )) as ZaiSubscriptionPayload;\n return normalizeZaiSubscriptionPayload(payload);\n } catch (error) {\n if (isAbortError(error)) throw error;\n return undefined;\n }\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === \"AbortError\";\n}\n", "import type { BasetenBillingUsagePayload, UsageMetric, UsageReport } from \"../types.js\";\n\nconst DECIMAL_AMOUNT = /^(?:0|[1-9]\\d*)(?:\\.\\d+)?$/u;\n\nexport function normalizeBasetenBillingUsagePayload(\n payload: BasetenBillingUsagePayload,\n capturedAt: number,\n): UsageReport {\n if (payload.model_apis_usage === undefined || payload.model_apis_usage === null) {\n return report(capturedAt, [], [\"Baseten returned no Model APIs usage for the last 30 days.\"]);\n }\n const usage = asObject(payload.model_apis_usage);\n if (!usage) throw new Error(\"Baseten Model APIs usage was not an object.\");\n const metrics: UsageMetric[] = [\n metric(\"gross-usage\", \"Gross usage\", usage.total),\n metric(\"credits-used\", \"Credits used\", usage.credits_used),\n metric(\"net-subtotal\", \"Net subtotal\", usage.subtotal),\n ];\n return report(capturedAt, metrics);\n}\n\nfunction report(capturedAt: number, metrics: UsageMetric[], notes?: string[]): UsageReport {\n return {\n providerId: \"baseten\",\n providerName: \"Baseten\",\n capturedAt,\n source: \"baseten-billing-usage-summary\",\n semantics: { kind: \"api-key\", label: \"Organization Model APIs spend\" },\n buckets: [],\n metrics,\n ...(notes ? { notes } : {}),\n };\n}\n\nfunction metric(id: string, label: string, value: unknown): UsageMetric {\n const amount = decimalAmount(value, label);\n return { id, label, value: amount, unit: \"currency\", currency: \"USD\" };\n}\n\nfunction decimalAmount(value: unknown, label: string): string {\n const normalized = typeof value === \"number\" && Number.isFinite(value) ? String(value) : value;\n if (typeof normalized !== \"string\" || normalized.length > 64 || !DECIMAL_AMOUNT.test(normalized)) {\n throw new Error(`Baseten ${label.toLowerCase()} was not a valid nonnegative amount.`);\n }\n return normalized;\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n return value as Record<string, unknown>;\n}\n", "import { sanitizeDisplayText } from \"../core.js\";\nimport type { CodexBackendPayload, UsageBucket, UsageMetric, UsageReport } from \"../types.js\";\n\nexport function normalizeCodexBackendPayload(payload: CodexBackendPayload, capturedAt: number): UsageReport {\n const buckets: UsageBucket[] = [];\n normalizeRateLimitGroup(buckets, \"codex\", \"Codex\", payload.rate_limit, false);\n\n const additional = Array.isArray(payload.additional_rate_limits) ? payload.additional_rate_limits : [];\n for (const item of additional) {\n const value = asObject(item);\n const id = asString(value?.metered_feature) ?? asString(value?.limit_name);\n if (!value || !id) continue;\n try {\n normalizeRateLimitGroup(buckets, id, asString(value.limit_name) ?? id, value.rate_limit, true);\n } catch {\n // Optional provider-specific buckets must not hide otherwise useful primary data.\n }\n }\n\n const metrics: UsageMetric[] = [];\n const credits = asObject(payload.credits);\n if (credits?.has_credits === true) {\n if (credits.unlimited === true) {\n metrics.push({ id: \"credits\", label: \"Credits\", value: \"unlimited\" });\n } else {\n const balance = asNumber(credits.balance);\n if (balance !== undefined) {\n metrics.push({ id: \"credits\", label: \"Credits\", value: balance, unit: \"count\" });\n } else {\n metrics.push({ id: \"credits\", label: \"Credits\", value: \"available\" });\n }\n }\n } else if (credits?.has_credits === false) {\n metrics.push({ id: \"credits\", label: \"Credits\", value: \"none\" });\n }\n const resetCredits = asObject(payload.rate_limit_reset_credits);\n const resetCount = asNonnegativeInteger(resetCredits?.available_count);\n if (resetCount !== undefined) {\n metrics.push({\n id: \"reset-credits\",\n label: \"Usage limit resets\",\n value: resetCount,\n unit: \"count\",\n });\n }\n if (buckets.length === 0 && metrics.length === 0) {\n throw new Error(\"Codex usage endpoint returned no displayable usage data.\");\n }\n\n const planType = asString(payload.plan_type);\n return {\n providerId: \"openai-codex\",\n providerName: \"OpenAI Codex\",\n capturedAt,\n source: \"codex-pi-auth\",\n semantics: {\n kind: \"consumer-subscription\",\n label: \"ChatGPT subscription limits\",\n },\n buckets,\n metrics,\n ...(planType ? { notes: [`Plan: ${planType}`] } : {}),\n };\n}\n\nfunction normalizeRateLimitGroup(\n buckets: UsageBucket[],\n groupId: string,\n groupLabel: string,\n raw: unknown,\n optional: boolean,\n): void {\n if (raw === undefined || raw === null) return;\n const details = asObject(raw);\n if (!details) {\n if (optional) return;\n throw new Error(\"Codex rate limit was not an object.\");\n }\n addWindow(buckets, groupId, groupLabel, \"primary\", details.primary_window);\n addWindow(buckets, groupId, groupLabel, \"secondary\", details.secondary_window);\n}\n\nfunction addWindow(\n buckets: UsageBucket[],\n groupId: string,\n groupLabel: string,\n position: \"primary\" | \"secondary\",\n raw: unknown,\n): void {\n if (raw === undefined || raw === null) return;\n const value = asObject(raw);\n if (!value) throw new Error(\"Codex rate-limit window was not an object.\");\n const used = asNumber(value.used_percent);\n if (used === undefined) return;\n const seconds = asNumber(value.limit_window_seconds);\n const resetsAt = asNumber(value.reset_at);\n buckets.push({\n id: `${groupId}:${position}`,\n label: position === \"primary\" ? \"Primary limit\" : \"Secondary limit\",\n groupId,\n groupLabel,\n modelKeys: [groupId, groupLabel],\n used,\n remaining: 100 - clampPercent(used),\n limit: 100,\n unit: \"percent\",\n ...(seconds !== undefined && seconds > 0 ? { windowMinutes: Math.ceil(seconds / 60) } : {}),\n ...(resetsAt !== undefined ? { resetsAt } : {}),\n });\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n return value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n return sanitizeDisplayText(value, 160) || undefined;\n}\n\nfunction asNumber(value: unknown): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n return undefined;\n}\n\nfunction asNonnegativeInteger(value: unknown): number | undefined {\n const parsed = asNumber(value);\n if (parsed === undefined || !Number.isSafeInteger(parsed)) return undefined;\n return Math.max(0, parsed);\n}\n\nfunction clampPercent(value: number): number {\n return Math.min(100, Math.max(0, value));\n}\n", "import type { DeepSeekBalancePayload, UsageMetric, UsageReport } from \"../types.js\";\n\nconst CURRENCIES = [\"CNY\", \"USD\"] as const;\ntype DeepSeekCurrency = (typeof CURRENCIES)[number];\n\nconst BALANCE_FIELDS = [\n [\"total\", \"Total balance\", \"total_balance\"],\n [\"granted\", \"Granted balance\", \"granted_balance\"],\n [\"topped-up\", \"Topped-up balance\", \"topped_up_balance\"],\n] as const;\n\nexport function normalizeDeepSeekBalancePayload(payload: DeepSeekBalancePayload, capturedAt: number): UsageReport {\n if (typeof payload.is_available !== \"boolean\") {\n throw new Error(\"DeepSeek API balance response availability was not a boolean.\");\n }\n if (!Array.isArray(payload.balance_infos) || payload.balance_infos.length === 0) {\n throw new Error(\"DeepSeek API balance response returned no balance information.\");\n }\n\n const balances = new Map<DeepSeekCurrency, Record<string, unknown>>();\n for (const raw of payload.balance_infos) {\n const balance = asObject(raw);\n if (!balance) throw new Error(\"DeepSeek API balance row was not an object.\");\n const currency = deepSeekCurrency(balance.currency);\n if (!currency) throw new Error(\"DeepSeek API balance row returned an unsupported currency.\");\n if (balances.has(currency)) {\n throw new Error(`DeepSeek API balance response repeated ${currency}.`);\n }\n for (const [, label, field] of BALANCE_FIELDS) {\n if (!decimalAmount(balance[field])) {\n throw new Error(`DeepSeek API balance ${label.toLowerCase()} was not a valid amount.`);\n }\n }\n balances.set(currency, balance);\n }\n\n const metrics: UsageMetric[] = [\n {\n id: \"api-availability\",\n label: \"API calls\",\n value: payload.is_available ? \"available\" : \"unavailable\",\n },\n ];\n for (const currency of CURRENCIES) {\n const balance = balances.get(currency);\n if (!balance) continue;\n for (const [id, label, field] of BALANCE_FIELDS) {\n metrics.push({\n id: `${currency.toLowerCase()}-${id}`,\n label,\n value: balance[field] as string,\n unit: \"currency\",\n currency,\n });\n }\n }\n\n return {\n providerId: \"deepseek\",\n providerName: \"DeepSeek\",\n capturedAt,\n source: \"deepseek-balance\",\n semantics: { kind: \"api-key\", label: \"DeepSeek API balance\" },\n buckets: [],\n metrics,\n };\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n return value as Record<string, unknown>;\n}\n\nfunction deepSeekCurrency(value: unknown): DeepSeekCurrency | undefined {\n return CURRENCIES.find((currency) => currency === value);\n}\n\nfunction decimalAmount(value: unknown): value is string {\n return typeof value === \"string\" && value.length <= 64 && /^(?:0|[1-9]\\d*)(?:\\.\\d+)?$/u.test(value);\n}\n", "import { sanitizeDisplayText } from \"../core.js\";\nimport type {\n FireworksAccountsPayload,\n FireworksBillingSummaryPayload,\n ResolvedUsageAuth,\n UsageMetric,\n UsageProviderAdapter,\n UsageReport,\n} from \"../types.js\";\n\nconst NANOS_PER_UNIT = 1_000_000_000n;\nconst CURRENCY_PATTERN = /^[A-Z]{3}$/u;\nconst ACCOUNT_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._~-]{0,127}$/u;\nconst INTEGER_PATTERN = /^-?\\d+$/u;\nconst INT64_MIN = -(2n ** 63n);\nconst INT64_MAX = 2n ** 63n - 1n;\nconst MAX_UNITS_CHARS = 20;\nconst MAX_NANOS_CHARS = 11;\nconst FIREWORKS_BILLING_SUMMARY_ORIGIN = \"https://api.fireworks.ai\";\nconst FIREWORKS_SPEND_WINDOW_DAYS = 30;\nconst FIREWORKS_MAX_ACCOUNT_PAGES = 5;\n\nconst SERIES_KEYS = [\"serverless\", \"dedicated\", \"training\", \"other\"] as const;\ntype SeriesKey = (typeof SERIES_KEYS)[number];\n\nconst SERIES_LABELS: Readonly<Record<SeriesKey, string>> = {\n serverless: \"Serverless\",\n dedicated: \"Dedicated deployments\",\n training: \"Training\",\n other: \"Other\",\n};\n\nexport function isFireworksAccountId(value: unknown): value is string {\n return typeof value === \"string\" && ACCOUNT_ID_PATTERN.test(value);\n}\n\nexport function normalizeFireworksAccountsPayload(payload: FireworksAccountsPayload): string[] {\n if (!Array.isArray(payload.accounts)) {\n throw new Error(\"Fireworks accounts response did not contain an accounts array.\");\n }\n const accounts: string[] = [];\n for (const raw of payload.accounts) {\n const account = asObject(raw);\n if (!account) throw new Error(\"Fireworks accounts response row was not an object.\");\n if (typeof account.name !== \"string\") {\n throw new Error(\"Fireworks accounts response omitted the account resource name.\");\n }\n const match = /^accounts\\/([^/]+)$/u.exec(account.name);\n if (!match || !isFireworksAccountId(match[1])) {\n throw new Error(\"Fireworks accounts response returned an unsafe account resource name.\");\n }\n const accountId = match[1];\n if (accounts.includes(accountId)) {\n throw new Error(`Fireworks accounts response repeated ${accountId}.`);\n }\n accounts.push(accountId);\n }\n return accounts;\n}\n\ntype FetchProviderJson = (\n url: string,\n auth: ResolvedUsageAuth,\n signal: AbortSignal,\n timeoutMs: number,\n description: string,\n request?: { redirect?: RequestRedirect },\n) => Promise<Record<string, unknown>>;\n\nexport function createFireworksAdapter(fetchProviderJson: FetchProviderJson): UsageProviderAdapter {\n return {\n id: \"fireworks\",\n displayName: \"Fireworks\",\n semantics: { kind: \"api-key\", label: \"Fireworks API spend\" },\n targets: {\n singularLabel: \"account\",\n pluralLabel: \"accounts\",\n async list(auth, signal, timeoutMs, guard) {\n const startedAt = Date.now();\n const accounts: string[] = [];\n let pageToken: string | undefined;\n for (let page = 0; page < FIREWORKS_MAX_ACCOUNT_PAGES; page += 1) {\n await guard();\n const payload = (await fetchProviderJson(\n fireworksAccountsUrl(pageToken),\n auth,\n signal,\n remainingTimeout(timeoutMs, startedAt, \"fetching Fireworks accounts\"),\n \"Fireworks accounts endpoint\",\n { redirect: \"error\" },\n )) as FireworksAccountsPayload;\n await guard();\n for (const accountId of normalizeFireworksAccountsPayload(payload)) {\n if (accounts.includes(accountId)) {\n throw new Error(`Fireworks accounts listing repeated ${accountId}.`);\n }\n accounts.push(accountId);\n }\n pageToken = fireworksNextPageToken(payload.nextPageToken);\n if (!pageToken) break;\n }\n if (pageToken) {\n throw new Error(`Fireworks account listing exceeded ${FIREWORKS_MAX_ACCOUNT_PAGES} pages.`);\n }\n return accounts.map((id) => ({ id, label: id }));\n },\n },\n async query(auth, signal, timeoutMs, guard, targetId) {\n if (!guard) throw new Error(\"Fireworks API spend requires request-boundary revalidation.\");\n if (!isFireworksAccountId(targetId)) {\n throw new Error(\"Fireworks billing requires a safe selected account slug.\");\n }\n const startedAt = Date.now();\n await guard();\n const billingWindowAt = Date.now();\n const payload = (await fetchProviderJson(\n fireworksBillingSummaryUrl(targetId, billingWindowAt),\n auth,\n signal,\n remainingTimeout(timeoutMs, startedAt, \"fetching Fireworks rated spend\"),\n \"Fireworks billing summary endpoint\",\n { redirect: \"error\" },\n )) as FireworksBillingSummaryPayload;\n await guard();\n return normalizeFireworksBillingSummaryPayload(payload, targetId, Date.now());\n },\n };\n}\n\nexport function normalizeFireworksBillingSummaryPayload(\n payload: FireworksBillingSummaryPayload,\n accountId: string,\n capturedAt: number,\n): UsageReport {\n if (!isFireworksAccountId(accountId)) {\n throw new Error(\"Fireworks billing summary received an unsafe account identifier.\");\n }\n if (payload.lineItems !== undefined && !Array.isArray(payload.lineItems)) {\n throw new Error(\"Fireworks billing summary lineItems was not an array.\");\n }\n\n const totals = new Map<string, Map<SeriesKey, bigint>>();\n for (const raw of payload.lineItems ?? []) {\n const lineItem = asObject(raw);\n if (!lineItem) throw new Error(\"Fireworks billing line item was not an object.\");\n const cost = moneyAmount(lineItem.totalCost, \"line item total cost\");\n const series = seriesKey(lineItem.series);\n let amounts = totals.get(cost.currency);\n if (!amounts) {\n amounts = new Map<SeriesKey, bigint>();\n totals.set(cost.currency, amounts);\n }\n amounts.set(series, (amounts.get(series) ?? 0n) + cost.amount);\n }\n\n const metrics: UsageMetric[] = [];\n for (const [currency, amounts] of totals) {\n metrics.push({\n id: `${currency.toLowerCase()}-total`,\n label: \"Total spend\",\n value: formatMoneyAmount(sumSeries(amounts)),\n unit: \"currency\",\n currency,\n });\n for (const series of SERIES_KEYS) {\n const amount = amounts.get(series);\n if (amount === undefined) continue;\n metrics.push({\n id: `${currency.toLowerCase()}-${series}`,\n label: SERIES_LABELS[series],\n value: formatMoneyAmount(amount),\n unit: \"currency\",\n currency,\n });\n }\n }\n\n const notes = [\"Rated line items may differ from the final invoice once credits or adjustments are applied.\"];\n if (metrics.length === 0) {\n notes.push(\"Fireworks returned no rated line items for the last 30 days.\");\n }\n\n return {\n providerId: \"fireworks\",\n providerName: \"Fireworks\",\n capturedAt,\n source: \"fireworks-billing-summary\",\n semantics: { kind: \"api-key\", label: \"Fireworks API spend\" },\n accountLabel: sanitizeDisplayText(accountId, 80),\n buckets: [],\n metrics,\n notes,\n };\n}\n\ntype RatedMoney = { currency: string; amount: bigint };\n\nfunction moneyAmount(value: unknown, description: string): RatedMoney {\n const money = asObject(value);\n if (!money) throw new Error(`Fireworks billing ${description} was not a money object.`);\n const currency = typeof money.currencyCode === \"string\" ? money.currencyCode : undefined;\n if (!currency || !CURRENCY_PATTERN.test(currency)) {\n throw new Error(`Fireworks billing ${description} currency was not an ISO 4217 code.`);\n }\n // proto3 JSON omits zero-valued money fields, so absent components default to zero.\n const units =\n money.units === undefined ? 0n : integerComponent(money.units, description, \"whole units\", MAX_UNITS_CHARS);\n if (units < INT64_MIN || units > INT64_MAX) {\n throw new Error(`Fireworks billing ${description} whole units exceeded the int64 range.`);\n }\n const nanos =\n money.nanos === undefined ? 0n : integerComponent(money.nanos, description, \"nano units\", MAX_NANOS_CHARS);\n if (nanos <= -NANOS_PER_UNIT || nanos >= NANOS_PER_UNIT) {\n throw new Error(`Fireworks billing ${description} nano units exceeded the Money range.`);\n }\n if ((units > 0n && nanos < 0n) || (units < 0n && nanos > 0n)) {\n throw new Error(`Fireworks billing ${description} mixed unit and nano signs.`);\n }\n return { currency, amount: units * NANOS_PER_UNIT + nanos };\n}\n\nfunction integerComponent(value: unknown, description: string, component: string, maxChars: number): bigint {\n const text =\n typeof value === \"number\" && Number.isSafeInteger(value)\n ? String(value)\n : typeof value === \"string\" && INTEGER_PATTERN.test(value)\n ? value\n : undefined;\n if (text === undefined || text.length > maxChars) {\n throw new Error(`Fireworks billing ${description} ${component} was not a bounded integer.`);\n }\n return BigInt(text);\n}\n\nfunction seriesKey(value: unknown): SeriesKey {\n if (value === undefined || value === null) return \"other\";\n if (typeof value !== \"string\") throw new Error(\"Fireworks billing line item series was invalid.\");\n if (value === \"SERVERLESS\") return \"serverless\";\n if (value === \"DEDICATED_DEPLOYMENT\") return \"dedicated\";\n if (value === \"TRAINING\") return \"training\";\n return \"other\";\n}\n\nfunction sumSeries(amounts: ReadonlyMap<SeriesKey, bigint>): bigint {\n let total = 0n;\n for (const amount of amounts.values()) total += amount;\n return total;\n}\n\nfunction formatMoneyAmount(amount: bigint): string {\n const negative = amount < 0n;\n const magnitude = negative ? -amount : amount;\n const units = magnitude / NANOS_PER_UNIT;\n const nanos = (magnitude % NANOS_PER_UNIT).toString().padStart(9, \"0\").replace(/0+$/u, \"\");\n return `${negative ? \"-\" : \"\"}${units.toString()}${nanos ? `.${nanos}` : \"\"}`;\n}\n\nfunction fireworksAccountsUrl(pageToken: string | undefined): string {\n const url = new URL(\"/v1/accounts\", FIREWORKS_BILLING_SUMMARY_ORIGIN);\n url.searchParams.set(\"pageSize\", \"200\");\n if (pageToken !== undefined) url.searchParams.set(\"pageToken\", pageToken);\n return url.toString();\n}\n\nfunction fireworksNextPageToken(value: unknown): string | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value !== \"string\" || !value || value.length > 512) {\n throw new Error(\"Fireworks accounts listing returned an invalid page token.\");\n }\n return value;\n}\n\nfunction fireworksBillingSummaryUrl(accountId: string, startedAt: number): string {\n const dayMs = 24 * 60 * 60 * 1000;\n const dayFloor = (time: number) => `${new Date(time).toISOString().slice(0, 10)}T00:00:00Z`;\n const url = new URL(`/v1/accounts/${accountId}/billing/summary`, FIREWORKS_BILLING_SUMMARY_ORIGIN);\n url.searchParams.set(\"startTime\", dayFloor(startedAt - (FIREWORKS_SPEND_WINDOW_DAYS - 1) * dayMs));\n url.searchParams.set(\"endTime\", dayFloor(startedAt + dayMs));\n return url.toString();\n}\n\nfunction remainingTimeout(timeoutMs: number, startedAt: number, description: string): number {\n const remaining = timeoutMs - (Date.now() - startedAt);\n if (remaining <= 0) throw new Error(`Timed out while ${description}.`);\n return remaining;\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n return value as Record<string, unknown>;\n}\n", "import { sanitizeDisplayText } from \"../core.js\";\nimport type { GitHubCopilotUsagePayload, UsageBucket, UsageReport } from \"../types.js\";\n\nexport function normalizeGitHubCopilotUsagePayload(\n payload: GitHubCopilotUsagePayload,\n capturedAt: number,\n): UsageReport {\n const snapshots = asObject(payload.quota_snapshots);\n const premium = asObject(snapshots?.premium_interactions);\n const metrics: UsageReport[\"metrics\"] = [];\n let semanticsLabel: string;\n let bucket: UsageBucket;\n\n if (premium) {\n const tokenBasedBilling = premium.token_based_billing === true;\n const id = tokenBasedBilling ? \"ai-credits\" : \"premium-requests\";\n const label = tokenBasedBilling ? \"AI credits\" : \"Premium requests\";\n semanticsLabel = tokenBasedBilling ? \"GitHub Copilot AI Credits allowance\" : \"GitHub Copilot premium request quota\";\n\n if (premium.unlimited === true) {\n bucket = { id, label, unit: \"count\" };\n } else {\n const entitlement = asNonnegativeNumber(premium.entitlement);\n const rawRemaining = asFiniteNumber(premium.remaining) ?? asFiniteNumber(premium.quota_remaining);\n if (entitlement === undefined || rawRemaining === undefined) {\n throw new Error(`GitHub Copilot ${label.toLowerCase()} quota was incomplete.`);\n }\n const overageUsed = Math.max(asNonnegativeNumber(premium.overage_count) ?? 0, Math.max(0, -rawRemaining));\n if (overageUsed > 0) {\n metrics.push({\n id: \"overage-used\",\n label: \"Additional usage\",\n value: overageUsed,\n unit: \"count\",\n });\n }\n bucket = {\n id,\n label,\n used: asNonnegativeNumber(premium.credits_used) ?? Math.max(0, entitlement - rawRemaining),\n remaining: Math.max(0, rawRemaining),\n limit: entitlement,\n unit: \"count\",\n period: \"monthly\",\n ...resetTimestamp(payload),\n };\n }\n } else {\n const limited = asObject(payload.limited_user_quotas);\n const monthly = asObject(payload.monthly_quotas);\n const remaining = asNonnegativeNumber(limited?.chat);\n const entitlement = asNonnegativeNumber(monthly?.chat);\n if (remaining === undefined || entitlement === undefined) {\n throw new Error(\"GitHub Copilot usage response contained no supported quota.\");\n }\n semanticsLabel = \"GitHub Copilot Free chat quota\";\n bucket = {\n id: \"chat-requests\",\n label: \"Chat requests\",\n used: Math.max(0, entitlement - remaining),\n remaining,\n limit: entitlement,\n unit: \"count\",\n period: \"monthly\",\n ...resetTimestamp(payload),\n };\n }\n\n const notes: string[] = [];\n const plan = asString(payload.copilot_plan) ?? asString(payload.access_type_sku);\n if (plan) notes.push(`Plan: ${plan}`);\n\n return {\n providerId: \"github-copilot\",\n providerName: \"GitHub Copilot\",\n capturedAt,\n source: \"github-copilot-user\",\n semantics: { kind: \"consumer-subscription\", label: semanticsLabel },\n accountLabel: asString(payload.login),\n buckets: [bucket],\n metrics,\n ...(notes.length > 0 ? { notes } : {}),\n };\n}\n\nfunction resetTimestamp(payload: GitHubCopilotUsagePayload): { resetsAt?: number } {\n const raw =\n asString(payload.quota_reset_date_utc) ??\n asString(payload.quota_reset_date) ??\n asString(payload.limited_user_reset_date);\n if (!raw) return {};\n const milliseconds = Date.parse(raw);\n return Number.isNaN(milliseconds) ? {} : { resetsAt: Math.floor(milliseconds / 1000) };\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n return value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n return sanitizeDisplayText(value, 80) || undefined;\n}\n\nfunction asFiniteNumber(value: unknown): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return undefined;\n return value;\n}\n\nfunction asNonnegativeNumber(value: unknown): number | undefined {\n const number = asFiniteNumber(value);\n return number === undefined || number < 0 ? undefined : number;\n}\n", "import { sanitizeDisplayText } from \"../core.js\";\nimport type { KimiCodingUsagePayload, UsageBucket, UsageMetric, UsageReport } from \"../types.js\";\n\nconst FIVE_HOUR_WINDOW_MINUTES = 300;\nconst DAILY_WINDOW_MINUTES = 1_440;\nconst WEEKLY_WINDOW_MINUTES = 10_080;\nconst FIXED_POINT_UNITS_PER_CENT = 1_000_000;\n\n/**\n * Source contract revalidated on 2026-08-27.\n * Pi c49906ec77788625aacbdc53ebca6fbe65bd20f5 defines provider `kimi-coding`,\n * `https://api.kimi.com/coding`, API-key auth, and OAuth Bearer auth:\n * https://github.com/earendil-works/pi/blob/c49906ec77788625aacbdc53ebca6fbe65bd20f5/packages/ai/src/providers/kimi-coding.ts\n * https://github.com/earendil-works/pi/blob/c49906ec77788625aacbdc53ebca6fbe65bd20f5/packages/ai/src/auth/oauth/kimi-coding.ts\n * Kimi Code 676e4d82240855044fe809fea89ce1dbe8e512cf defines `GET /coding/v1/usages`,\n * numeric-string plan rows, proto-style windows, and 1,000,000 fixed-point units per cent:\n * https://github.com/MoonshotAI/kimi-code/blob/676e4d82240855044fe809fea89ce1dbe8e512cf/packages/oauth/src/managed-usage.ts\n * Live responses observed on 2026-09-12 omit both `used` and `remaining` on untouched rows and may report only\n * `remaining` once usage starts, so a row with a positive `limit` and no counters means zero usage, and when only\n * one counter is present the other is derived from `limit`. Counters that are present but malformed stay rejected.\n */\nexport function normalizeKimiCodingUsagePayload(payload: KimiCodingUsagePayload, capturedAt: number): UsageReport {\n const root = asObject(payload);\n if (!root) throw new Error(\"Kimi Coding usage response was not an object.\");\n\n const candidates: UsageBucket[] = [];\n let omittedWindow = false;\n const summary = parseUsageRow(root.usage, WEEKLY_WINDOW_MINUTES, \"Weekly window\");\n if (summary) candidates.push(summary);\n else if (root.usage !== undefined) omittedWindow = true;\n\n if (Array.isArray(root.limits)) {\n for (const raw of root.limits) {\n const item = asObject(raw);\n const windowMinutes = parseWindowMinutes(item?.window);\n const label = sanitizedLabel(item?.name);\n const bucket =\n windowMinutes === undefined\n ? undefined\n : parseUsageRow(item?.detail, windowMinutes, label ?? defaultWindowLabel(windowMinutes));\n if (bucket) candidates.push(bucket);\n else omittedWindow = true;\n }\n } else if (root.limits !== undefined) {\n omittedWindow = true;\n }\n\n const buckets: UsageBucket[] = [];\n const byWindow = new Map<number, UsageBucket[]>();\n for (const bucket of candidates) {\n const windowMinutes = bucket.windowMinutes as number;\n byWindow.set(windowMinutes, [...(byWindow.get(windowMinutes) ?? []), bucket]);\n }\n for (const rows of byWindow.values()) {\n if (rows.length === 1) buckets.push(rows[0] as UsageBucket);\n else omittedWindow = true;\n }\n buckets.sort((left, right) => (left.windowMinutes ?? 0) - (right.windowMinutes ?? 0));\n\n const metrics = parseBoosterWallet(root.boosterWallet);\n if (buckets.length === 0 && metrics.length === 0) {\n throw new Error(\"Kimi Coding usage endpoint returned no displayable usage data.\");\n }\n\n return {\n providerId: \"kimi-coding\",\n providerName: \"Kimi For Coding\",\n capturedAt,\n source: \"kimi-managed-usage\",\n semantics: { kind: \"consumer-subscription\", label: \"Kimi Coding Plan usage\" },\n buckets,\n metrics,\n ...(omittedWindow ? { notes: [\"Unsupported, malformed, or duplicate plan windows were unavailable.\"] } : {}),\n };\n}\n\nfunction parseUsageRow(value: unknown, windowMinutes: number, label: string): UsageBucket | undefined {\n const row = asObject(value);\n if (!row) return undefined;\n const limit = asNonnegativeInteger(row.limit);\n if (limit === undefined || limit === 0) return undefined;\n const usedRaw = asNonnegativeInteger(row.used);\n const remainingRaw = asNonnegativeInteger(row.remaining);\n // Counters that are present but malformed reject the row instead of silently inventing a count.\n if (\n (row.used !== undefined && usedRaw === undefined) ||\n (row.remaining !== undefined && remainingRaw === undefined)\n ) {\n return undefined;\n }\n // Live responses omit both counters on untouched rows, so a bare `limit` means zero usage.\n const used = usedRaw ?? (remainingRaw === undefined ? 0 : Math.max(0, limit - remainingRaw));\n const remaining = remainingRaw ?? Math.max(0, limit - used);\n const resetsAt = asIsoEpochSeconds(row.resetTime);\n return {\n id: windowId(windowMinutes),\n label,\n used,\n remaining,\n limit,\n unit: \"count\",\n windowMinutes,\n ...(resetsAt !== undefined ? { resetsAt } : {}),\n };\n}\n\nfunction parseWindowMinutes(value: unknown): number | undefined {\n const window = asObject(value);\n if (!window) return undefined;\n const duration = asPositiveInteger(window.duration);\n if (duration === undefined) return undefined;\n const multiplier =\n window.timeUnit === \"TIME_UNIT_MINUTE\"\n ? 1\n : window.timeUnit === \"TIME_UNIT_HOUR\"\n ? 60\n : window.timeUnit === \"TIME_UNIT_DAY\"\n ? 1_440\n : window.timeUnit === \"TIME_UNIT_WEEK\"\n ? 10_080\n : undefined;\n if (multiplier === undefined) return undefined;\n const minutes = duration * multiplier;\n return Number.isSafeInteger(minutes) ? minutes : undefined;\n}\n\nfunction parseBoosterWallet(value: unknown): UsageMetric[] {\n const wallet = asObject(value);\n const balance = asObject(wallet?.balance);\n if (!wallet || !balance || balance.type !== \"BOOSTER\") return [];\n const totalRaw = asPositiveInteger(balance.amount);\n if (totalRaw === undefined) return [];\n const leftRaw = asNonnegativeInteger(balance.amountLeft) ?? 0;\n const monthlyLimit = parseMoney(wallet.monthlyChargeLimit);\n const monthlyUsed = parseMoney(wallet.monthlyUsed);\n const currencies = new Set(\n [monthlyLimit?.currency, monthlyUsed?.currency].filter((currency): currency is string => currency !== undefined),\n );\n if (currencies.size !== 1) return [];\n const currency = currencies.values().next().value;\n if (!currency) return [];\n const total = fixedPointToMajor(totalRaw);\n const left = fixedPointToMajor(leftRaw);\n if (total === undefined || left === undefined) return [];\n\n const metrics: UsageMetric[] = [\n { id: \"booster-balance\", label: \"Balance\", value: left, unit: \"currency\", currency },\n { id: \"booster-total\", label: \"Total balance\", value: total, unit: \"currency\", currency },\n ];\n if (monthlyUsed) {\n metrics.push({\n id: \"booster-monthly-used\",\n label: \"Used this month\",\n value: monthlyUsed.cents / 100,\n unit: \"currency\",\n currency,\n });\n }\n if (wallet.monthlyChargeLimitEnabled === false) {\n metrics.push({\n id: \"booster-monthly-limit\",\n label: \"Monthly limit\",\n value: \"unlimited\",\n unit: \"currency\",\n currency,\n });\n } else if (wallet.monthlyChargeLimitEnabled === true && monthlyLimit) {\n metrics.push({\n id: \"booster-monthly-limit\",\n label: \"Monthly limit\",\n value: monthlyLimit.cents / 100,\n unit: \"currency\",\n currency,\n });\n }\n return metrics;\n}\n\nfunction parseMoney(value: unknown): { cents: number; currency: string } | undefined {\n const money = asObject(value);\n if (!money) return undefined;\n const cents = asNonnegativeInteger(money.priceInCents);\n if (cents === undefined) return undefined;\n const currency = asCurrency(money.currency);\n if (!currency) return undefined;\n return { cents, currency };\n}\n\nfunction fixedPointToMajor(value: number): number | undefined {\n const cents = value / FIXED_POINT_UNITS_PER_CENT;\n const roundedCents = cents > 0 && cents < 1 ? 1 : Math.round(cents);\n const major = roundedCents / 100;\n return Number.isSafeInteger(roundedCents) && Number.isFinite(major) ? major : undefined;\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n return value as Record<string, unknown>;\n}\n\nfunction asNonnegativeInteger(value: unknown): number | undefined {\n if (typeof value === \"string\" && !/^\\d+$/u.test(value)) return undefined;\n const number = typeof value === \"string\" ? Number(value) : value;\n if (typeof number !== \"number\" || !Number.isSafeInteger(number) || number < 0) return undefined;\n return number;\n}\n\nfunction asPositiveInteger(value: unknown): number | undefined {\n const number = asNonnegativeInteger(value);\n return number !== undefined && number > 0 ? number : undefined;\n}\n\nfunction asIsoEpochSeconds(value: unknown): number | undefined {\n if (typeof value !== \"string\") return undefined;\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(?:\\.\\d+)?(?:Z|([+-])(\\d{2}):(\\d{2}))$/u.exec(value);\n if (!match) return undefined;\n const [, yearText, monthText, dayText, hourText, minuteText, secondText, , offsetHour, offsetMinute] = match;\n const year = Number(yearText);\n const month = Number(monthText);\n const day = Number(dayText);\n const hour = Number(hourText);\n const minute = Number(minuteText);\n const second = Number(secondText);\n if (\n month < 1 ||\n month > 12 ||\n day < 1 ||\n day > new Date(Date.UTC(year, month, 0)).getUTCDate() ||\n hour > 23 ||\n minute > 59 ||\n second > 59 ||\n (offsetHour !== undefined && Number(offsetHour) > 23) ||\n (offsetMinute !== undefined && Number(offsetMinute) > 59)\n ) {\n return undefined;\n }\n const millis = Date.parse(value);\n return Number.isFinite(millis) && millis >= 0 ? Math.floor(millis / 1000) : undefined;\n}\n\nfunction sanitizedLabel(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n return sanitizeDisplayText(value, 80) || undefined;\n}\n\nfunction asCurrency(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const currency = sanitizeDisplayText(value, 3).toUpperCase();\n return /^[A-Z]{3}$/u.test(currency) ? currency : undefined;\n}\n\nfunction windowId(minutes: number): string {\n if (minutes === FIVE_HOUR_WINDOW_MINUTES) return \"five-hour\";\n if (minutes === DAILY_WINDOW_MINUTES) return \"daily\";\n if (minutes === WEEKLY_WINDOW_MINUTES) return \"weekly\";\n return `window-${minutes}-minutes`;\n}\n\nfunction defaultWindowLabel(minutes: number): string {\n if (minutes === WEEKLY_WINDOW_MINUTES) return \"Weekly window\";\n if (minutes % 10_080 === 0) return `${minutes / 10_080}w window`;\n if (minutes % 1_440 === 0) return `${minutes / 1_440}d window`;\n if (minutes % 60 === 0) return `${minutes / 60}h window`;\n return `${minutes}m window`;\n}\n", "import { sanitizeDisplayText } from \"../core.js\";\nimport type { MiniMaxUsagePayload, UsageBucket, UsageMetric, UsageReport } from \"../types.js\";\n\nexport type MiniMaxProviderId = \"minimax\" | \"minimax-cn\";\nexport type MiniMaxUsageKind = \"token-plan\" | \"account-balance\";\n\nconst PROVIDERS = {\n minimax: { name: \"MiniMax\", currency: \"USD\" },\n \"minimax-cn\": { name: \"MiniMax CN\", currency: \"CNY\" },\n} as const;\nconst DECIMAL_AMOUNT = /^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$/u;\nconst PERCENT_TOLERANCE = 1;\n\nexport function miniMaxUsageKind(apiKey: string): MiniMaxUsageKind {\n return apiKey.startsWith(\"sk-api-\") ? \"account-balance\" : \"token-plan\";\n}\n\nexport function normalizeMiniMaxUsagePayload(\n providerId: MiniMaxProviderId,\n kind: MiniMaxUsageKind,\n payload: MiniMaxUsagePayload,\n capturedAt: number,\n): UsageReport {\n return kind === \"account-balance\"\n ? normalizeBalance(providerId, payload, capturedAt)\n : normalizeTokenPlan(providerId, payload, capturedAt);\n}\n\nfunction normalizeBalance(\n providerId: MiniMaxProviderId,\n payload: MiniMaxUsagePayload,\n capturedAt: number,\n): UsageReport {\n assertSuccess(payload);\n const provider = PROVIDERS[providerId];\n const metrics: UsageMetric[] = [\n balanceMetric(\"available-balance\", \"Available balance\", payload.available_amount, provider.currency),\n balanceMetric(\"cash-balance\", \"Cash balance\", payload.cash_balance, provider.currency, true),\n balanceMetric(\"voucher-balance\", \"Voucher balance\", payload.voucher_balance, provider.currency),\n balanceMetric(\"credit-balance\", \"Credit balance\", payload.credit_balance, provider.currency),\n balanceMetric(\"owed-amount\", \"Owed amount\", payload.owed_amount, provider.currency),\n ];\n return {\n providerId,\n providerName: provider.name,\n capturedAt,\n source: \"minimax-account-balance\",\n semantics: { kind: \"api-key\", label: \"MiniMax pay-as-you-go account balance\" },\n buckets: [],\n metrics,\n };\n}\n\nfunction normalizeTokenPlan(\n providerId: MiniMaxProviderId,\n payload: MiniMaxUsagePayload,\n capturedAt: number,\n): UsageReport {\n assertSuccess(payload);\n if (!Array.isArray(payload.model_remains) || payload.model_remains.length === 0) {\n throw new Error(\"MiniMax Token Plan returned no quota rows.\");\n }\n const provider = PROVIDERS[providerId];\n const buckets: UsageBucket[] = [];\n const groups = new Set<string>();\n for (const [index, raw] of payload.model_remains.entries()) {\n const row = asObject(raw);\n if (!row) throw new Error(\"MiniMax Token Plan quota row was not an object.\");\n const groupLabel = safeLabel(row.model_name, `Quota ${index + 1}`);\n const groupId = uniqueGroupId(groupLabel, index, groups);\n buckets.push(\n normalizeWindow(row, {\n id: `${groupId}:interval`,\n label: \"Rolling window\",\n groupId,\n groupLabel,\n countField: \"current_interval_usage_count\",\n totalField: \"current_interval_total_count\",\n percentField: \"current_interval_remaining_percent\",\n statusField: \"current_interval_status\",\n startField: \"start_time\",\n endField: \"end_time\",\n }),\n normalizeWindow(row, {\n id: `${groupId}:weekly`,\n label: \"Weekly window\",\n groupId,\n groupLabel,\n countField: \"current_weekly_usage_count\",\n totalField: \"current_weekly_total_count\",\n percentField: \"current_weekly_remaining_percent\",\n statusField: \"current_weekly_status\",\n startField: \"weekly_start_time\",\n endField: \"weekly_end_time\",\n boostPermille: row.weekly_boost_permille,\n }),\n );\n }\n return {\n providerId,\n providerName: provider.name,\n capturedAt,\n source: \"minimax-token-plan\",\n semantics: { kind: \"consumer-subscription\", label: \"MiniMax Token Plan quota\" },\n buckets,\n metrics: [],\n };\n}\n\ntype WindowFields = {\n id: string;\n label: string;\n groupId: string;\n groupLabel: string;\n countField: string;\n totalField: string;\n percentField: string;\n statusField: string;\n startField: string;\n endField: string;\n boostPermille?: unknown;\n};\n\nfunction normalizeWindow(row: Record<string, unknown>, fields: WindowFields): UsageBucket {\n const status = optionalInteger(row[fields.statusField], fields.statusField);\n if (status !== undefined && ![1, 2, 3].includes(status)) {\n throw new Error(`MiniMax Token Plan ${fields.label} status was unsupported.`);\n }\n const percent = optionalPercent(row[fields.percentField], fields.percentField);\n validateBoost(fields.boostPermille);\n const start = timestamp(row[fields.startField], fields.startField);\n const end = timestamp(row[fields.endField], fields.endField);\n if (end < start) throw new Error(`MiniMax Token Plan ${fields.label} timestamps were reversed.`);\n const resetsAt = Math.floor(end / 1_000);\n const windowMinutes = Math.max(1, Math.round((end - start) / 60_000));\n if (status === 3) {\n return {\n id: fields.id,\n label: fields.label,\n groupId: fields.groupId,\n groupLabel: fields.groupLabel,\n remaining: 100,\n unit: \"percent\",\n period: \"unlimited\",\n windowMinutes,\n };\n }\n const total = nonnegativeInteger(row[fields.totalField], fields.totalField);\n const count = nonnegativeInteger(row[fields.countField], fields.countField);\n if (total === 0) {\n if (count !== 0) {\n throw new Error(`MiniMax Token Plan ${fields.label} counts were inconsistent.`);\n }\n if (percent === undefined) {\n throw new Error(`MiniMax Token Plan ${fields.label} returned no quota and no percent.`);\n }\n // Token Plan reports remaining_percent as the quota when both counts are 0.\n return {\n id: fields.id,\n label: fields.label,\n groupId: fields.groupId,\n groupLabel: fields.groupLabel,\n remaining: percent,\n used: 100 - percent,\n limit: 0,\n unit: \"percent\",\n windowMinutes,\n resetsAt,\n };\n }\n const resolved = resolveQuotaCounts(count, total, percent);\n if (!resolved) throw new Error(`MiniMax Token Plan ${fields.label} counts were inconsistent.`);\n return {\n id: fields.id,\n label: fields.label,\n groupId: fields.groupId,\n groupLabel: fields.groupLabel,\n ...resolved,\n unit: \"count\",\n windowMinutes,\n resetsAt,\n };\n}\n\nfunction resolveQuotaCounts(\n reportedCount: number,\n total: number,\n remainingPercent: number | undefined,\n): Pick<UsageBucket, \"used\" | \"remaining\" | \"limit\"> | undefined {\n if (total <= 0 || reportedCount > total) return undefined;\n let remaining = reportedCount;\n if (remainingPercent !== undefined) {\n const asRemaining = (reportedCount / total) * 100;\n const asUsed = ((total - reportedCount) / total) * 100;\n const remainingDistance = Math.abs(asRemaining - remainingPercent);\n const usedDistance = Math.abs(asUsed - remainingPercent);\n if (Math.min(remainingDistance, usedDistance) > PERCENT_TOLERANCE) return undefined;\n if (usedDistance < remainingDistance) remaining = total - reportedCount;\n }\n return { used: total - remaining, remaining, limit: total };\n}\n\nfunction assertSuccess(payload: MiniMaxUsagePayload): void {\n const base = asObject(payload.base_resp);\n if (base?.status_code !== 0) {\n throw new Error(\"MiniMax usage response did not report success.\");\n }\n}\n\nfunction balanceMetric(\n id: string,\n label: string,\n value: unknown,\n currency: \"CNY\" | \"USD\",\n allowNegative = false,\n): UsageMetric {\n if (\n typeof value !== \"string\" ||\n value.length > 64 ||\n !DECIMAL_AMOUNT.test(value) ||\n (!allowNegative && value.startsWith(\"-\"))\n ) {\n throw new Error(`MiniMax ${label.toLowerCase()} was not a valid amount.`);\n }\n return { id, label, value, unit: \"currency\", currency };\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n return value as Record<string, unknown>;\n}\n\nfunction safeLabel(value: unknown, fallback: string): string {\n if (typeof value !== \"string\") throw new Error(\"MiniMax Token Plan model name was not a string.\");\n return sanitizeDisplayText(value, 80) || fallback;\n}\n\nfunction uniqueGroupId(label: string, index: number, groups: Set<string>): string {\n const base =\n label\n .toLowerCase()\n .replace(/[^a-z0-9]+/gu, \"-\")\n .replace(/^-|-$/gu, \"\") || \"quota\";\n const id = groups.has(base) ? `${base}-${index + 1}` : base;\n groups.add(id);\n return id;\n}\n\nfunction nonnegativeInteger(value: unknown, field: string): number {\n if (!Number.isSafeInteger(value) || (value as number) < 0) {\n throw new Error(`MiniMax Token Plan ${field} was not a nonnegative safe integer.`);\n }\n return value as number;\n}\n\nfunction optionalInteger(value: unknown, field: string): number | undefined {\n if (value === undefined || value === null) return undefined;\n return nonnegativeInteger(value, field);\n}\n\nfunction optionalPercent(value: unknown, field: string): number | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0 || value > 100) {\n throw new Error(`MiniMax Token Plan ${field} was not a percentage.`);\n }\n return value;\n}\n\nfunction validateBoost(boost: unknown): void {\n if (boost === undefined || boost === null) return;\n const permille = nonnegativeInteger(boost, \"weekly_boost_permille\");\n if (permille > 10_000) throw new Error(\"MiniMax Token Plan weekly boost was unreasonable.\");\n}\n\nfunction timestamp(value: unknown, field: string): number {\n if (!Number.isSafeInteger(value) || (value as number) <= 0) {\n throw new Error(`MiniMax Token Plan ${field} was not a valid timestamp.`);\n }\n return value as number;\n}\n", "import type { MoonshotBalancePayload, UsageMetric, UsageReport } from \"../types.js\";\n\nexport type MoonshotProviderId = \"moonshotai\" | \"moonshotai-cn\";\n\nconst PROVIDERS = {\n moonshotai: { name: \"Moonshot AI\", currency: \"USD\" },\n \"moonshotai-cn\": { name: \"Moonshot AI CN\", currency: \"CNY\" },\n} as const;\n\nexport function normalizeMoonshotBalancePayload(\n providerId: MoonshotProviderId,\n payload: MoonshotBalancePayload,\n capturedAt: number,\n): UsageReport {\n if (payload.code !== 0 || payload.status !== true) {\n throw new Error(\"Moonshot AI balance response did not report success.\");\n }\n const data = asObject(payload.data);\n if (!data) throw new Error(\"Moonshot AI balance response data was not an object.\");\n const provider = PROVIDERS[providerId];\n const available = amount(data.available_balance, \"available balance\", false);\n const voucher = amount(data.voucher_balance, \"voucher balance\", false);\n const cash = amount(data.cash_balance, \"cash balance\", true);\n const metrics: UsageMetric[] = [\n currencyMetric(\"available-balance\", \"Available balance\", available, provider.currency),\n currencyMetric(\"voucher-balance\", \"Voucher balance\", voucher, provider.currency),\n currencyMetric(\"cash-balance\", \"Cash balance\", cash, provider.currency),\n ];\n return {\n providerId,\n providerName: provider.name,\n capturedAt,\n source: \"moonshot-balance\",\n semantics: { kind: \"api-key\", label: \"Moonshot API account balance\" },\n buckets: [],\n metrics,\n };\n}\n\nfunction currencyMetric(id: string, label: string, value: string, currency: \"CNY\" | \"USD\"): UsageMetric {\n return { id, label, value, unit: \"currency\", currency };\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n return value as Record<string, unknown>;\n}\n\nfunction amount(value: unknown, label: string, allowNegative: boolean): string {\n if (\n typeof value !== \"number\" ||\n !Number.isFinite(value) ||\n (!allowNegative && value < 0) ||\n Math.abs(value) > Number.MAX_SAFE_INTEGER\n ) {\n throw new Error(`Moonshot AI ${label} was not a valid amount.`);\n }\n return String(value);\n}\n", "import { sanitizeDisplayText } from \"../core.js\";\nimport type { OpenCodeZenPayload, UsageBucket, UsageReport } from \"../types.js\";\n\nconst ZEN_WINDOWS = [\n { key: \"rolling\", label: \"Rolling\" },\n { key: \"weekly\", label: \"Weekly\" },\n { key: \"monthly\", label: \"Monthly\" },\n] as const;\n\nexport function normalizeOpenCodeZenPayload(payload: OpenCodeZenPayload, capturedAt: number): UsageReport {\n const usage = asObject(payload.usage);\n if (!usage) throw new Error(\"OpenCode Zen usage response was not an object.\");\n\n const buckets: UsageBucket[] = [];\n const notes: string[] = [];\n for (const window of ZEN_WINDOWS) {\n const raw = asObject(usage[window.key]);\n if (!raw) continue;\n const status = asString(raw.status);\n if (status !== \"ok\" && status !== \"rate-limited\") {\n notes.push(`${window.label} window unavailable (${status ?? \"unknown status\"}).`);\n continue;\n }\n const used = asNonnegativeNumber(raw.percent);\n if (used === undefined) continue;\n const resetsAt = asEpochSeconds(raw.resetsAt);\n buckets.push({\n id: window.key,\n label: `${window.label} window`,\n used,\n remaining: 100 - clampPercent(used),\n limit: 100,\n unit: \"percent\",\n ...(resetsAt !== undefined ? { resetsAt } : {}),\n });\n }\n if (buckets.length === 0) {\n throw new Error(\"OpenCode Zen usage endpoint returned no displayable usage data.\");\n }\n\n return {\n providerId: \"opencode-go\",\n providerName: \"OpenCode Go\",\n capturedAt,\n source: \"opencode-zen-usage\",\n semantics: {\n kind: \"consumer-subscription\",\n label: \"OpenCode Zen plan usage\",\n },\n buckets,\n metrics: [],\n ...(notes.length > 0 ? { notes } : {}),\n };\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n return value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n return sanitizeDisplayText(value, 80) || undefined;\n}\n\nfunction asNonnegativeNumber(value: unknown): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) return undefined;\n return value;\n}\n\nfunction asEpochSeconds(value: unknown): number | undefined {\n if (typeof value !== \"string\" || !value.trim()) return undefined;\n const parsed = Date.parse(value);\n if (Number.isNaN(parsed)) return undefined;\n return Math.floor(parsed / 1000);\n}\n\nfunction clampPercent(value: number): number {\n return Math.min(100, Math.max(0, value));\n}\n", "import { sanitizeDisplayText } from \"../core.js\";\nimport type { OpenRouterKeyPayload, UsageBucket, UsageMetric, UsageReport } from \"../types.js\";\n\nexport function normalizeOpenRouterKeyPayload(payload: OpenRouterKeyPayload, capturedAt: number): UsageReport {\n const data = asObject(payload.data);\n if (!data) throw new Error(\"OpenRouter key response data was not an object.\");\n\n const limit = asNonnegativeNumber(data.limit);\n const remaining = asNonnegativeNumber(data.limit_remaining);\n const period = asString(data.limit_reset);\n const totalUsage = asNonnegativeNumber(data.usage);\n const buckets: UsageBucket[] = [];\n if (limit !== undefined) {\n buckets.push({\n id: \"key-limit\",\n label: \"Key limit\",\n ...(remaining !== undefined ? { used: Math.max(0, limit - remaining), remaining } : {}),\n limit,\n unit: \"usd\",\n ...(period ? { period } : {}),\n });\n }\n\n const metrics: UsageMetric[] = [];\n addUsageMetric(metrics, \"usage-daily\", \"Usage today\", data.usage_daily);\n addUsageMetric(metrics, \"usage-weekly\", \"Usage this week\", data.usage_weekly);\n addUsageMetric(metrics, \"usage-monthly\", \"Usage this month\", data.usage_monthly);\n addUsageMetric(metrics, \"usage-total\", \"All-time usage\", totalUsage);\n if (buckets.length === 0 && metrics.length === 0) {\n throw new Error(\"OpenRouter key response returned no displayable usage data.\");\n }\n\n const notes: string[] = [];\n if (data.limit === null) notes.push(\"No per-key spend cap\");\n else if (limit === undefined) notes.push(\"Per-key spend cap unavailable\");\n if (data.is_free_tier === true) notes.push(\"Free-tier API key\");\n\n return {\n providerId: \"openrouter\",\n providerName: \"OpenRouter\",\n capturedAt,\n source: \"openrouter-key\",\n semantics: { kind: \"api-key\", label: \"API-key spend limits\" },\n accountLabel: asString(data.label),\n buckets,\n metrics,\n ...(notes.length > 0 ? { notes } : {}),\n };\n}\n\nfunction addUsageMetric(metrics: UsageMetric[], id: string, label: string, value: unknown): void {\n const amount = typeof value === \"number\" ? asNonnegativeNumber(value) : undefined;\n if (amount === undefined) return;\n metrics.push({ id, label, value: amount, unit: \"usd\" });\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n return value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n return sanitizeDisplayText(value, 80) || undefined;\n}\n\nfunction asNonnegativeNumber(value: unknown): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) return undefined;\n return value;\n}\n", "import type { UsageMetric, UsageReport, VercelAIGatewayCreditsPayload } from \"../types.js\";\n\nconst DECIMAL_AMOUNT = /^(?:0|[1-9]\\d*)(?:\\.\\d+)?$/u;\n\nexport function normalizeVercelAIGatewayCreditsPayload(\n payload: VercelAIGatewayCreditsPayload,\n capturedAt: number,\n): UsageReport {\n const balance = decimalAmount(payload.balance, \"balance\");\n const totalUsed = decimalAmount(payload.total_used, \"total used\");\n const metrics: UsageMetric[] = [\n {\n id: \"credit-balance\",\n label: \"Credit balance\",\n value: balance,\n unit: \"currency\",\n currency: \"USD\",\n },\n {\n id: \"lifetime-spend\",\n label: \"Lifetime spend\",\n value: totalUsed,\n unit: \"currency\",\n currency: \"USD\",\n },\n ];\n return {\n providerId: \"vercel-ai-gateway\",\n providerName: \"Vercel AI Gateway\",\n capturedAt,\n source: \"vercel-ai-gateway-credits\",\n semantics: { kind: \"api-key\", label: \"AI Gateway credits and lifetime spend\" },\n buckets: [],\n metrics,\n };\n}\n\nfunction decimalAmount(value: unknown, label: string): string {\n if (typeof value !== \"string\" || value.length > 64 || !DECIMAL_AMOUNT.test(value)) {\n throw new Error(`Vercel AI Gateway ${label} was not a valid nonnegative amount.`);\n }\n return value;\n}\n", "import { sanitizeDisplayText } from \"../core.js\";\nimport type { UsageBucket, UsageMetric, UsageReport, XaiBillingPayload } from \"../types.js\";\n\nconst MAX_SAFE_CENTS = Number.MAX_SAFE_INTEGER;\n\nexport function normalizeXaiBillingPayload(\n payload: XaiBillingPayload,\n subscriptionTier: unknown,\n capturedAt: number,\n): UsageReport {\n const configValue = payload.config;\n if (configValue !== null && configValue !== undefined && !isRecord(configValue)) {\n throw new Error(\"xAI billing response config was not an object or null.\");\n }\n const config = isRecord(configValue) ? configValue : undefined;\n const buckets: UsageBucket[] = [];\n const metrics: UsageMetric[] = [];\n const notes: string[] = [];\n\n if (config) {\n const period = normalizePeriod(config.currentPeriod, config.billingPeriodStart, config.billingPeriodEnd);\n const preferredPercent = optionalPercent(config.creditUsagePercent, \"creditUsagePercent\");\n if (preferredPercent !== undefined) {\n buckets.push({\n id: \"included-allowance\",\n label: \"Included allowance\",\n used: preferredPercent,\n remaining: 100 - preferredPercent,\n unit: \"percent\",\n ...period,\n });\n } else {\n const limit = optionalUsd(config.monthlyLimit, \"monthlyLimit\");\n const used = optionalUsd(config.used, \"used\");\n if (limit !== undefined || used !== undefined) {\n buckets.push({\n id: \"included-allowance\",\n label: \"Included allowance\",\n ...(limit !== undefined ? { limit } : {}),\n ...(used !== undefined ? { used } : {}),\n ...(limit !== undefined && used !== undefined ? { remaining: limit - used } : {}),\n unit: \"usd\",\n ...period,\n });\n } else if (period.period || period.resetsAt !== undefined) {\n buckets.push({\n id: \"included-allowance\",\n label: \"Included allowance\",\n unit: \"percent\",\n ...period,\n });\n }\n }\n\n const onDemandCap = optionalUsd(config.onDemandCap, \"onDemandCap\");\n const onDemandUsed = optionalUsd(config.onDemandUsed, \"onDemandUsed\");\n if (onDemandCap !== undefined || onDemandUsed !== undefined) {\n buckets.push({\n id: \"on-demand\",\n label: \"On-demand usage\",\n ...(onDemandCap !== undefined ? { limit: onDemandCap } : {}),\n ...(onDemandUsed !== undefined ? { used: onDemandUsed } : {}),\n ...(onDemandCap !== undefined && onDemandUsed !== undefined ? { remaining: onDemandCap - onDemandUsed } : {}),\n unit: \"usd\",\n });\n }\n\n const prepaidBalance = optionalUsd(config.prepaidBalance, \"prepaidBalance\");\n if (prepaidBalance !== undefined) {\n metrics.push({\n id: \"prepaid-balance\",\n label: \"Prepaid balance\",\n value: prepaidBalance,\n unit: \"usd\",\n });\n }\n }\n\n const tier = optionalTier(subscriptionTier);\n if (tier) metrics.push({ id: \"subscription-tier\", label: \"Plan tier\", value: tier });\n if (!config) notes.push(\"No xAI consumer billing configuration is available for this account.\");\n else if (buckets.length === 0 && metrics.length === 0) {\n notes.push(\"The xAI consumer billing response contained no displayable usage fields.\");\n }\n\n return {\n providerId: \"xai\",\n providerName: \"xAI\",\n capturedAt,\n source: \"cli-chat-proxy.grok.com consumer billing\",\n semantics: {\n kind: \"consumer-subscription\",\n label: \"xAI consumer subscription usage\",\n },\n buckets,\n metrics,\n ...(notes.length > 0 ? { notes } : {}),\n };\n}\n\nfunction normalizePeriod(\n currentPeriod: unknown,\n legacyStart: unknown,\n legacyEnd: unknown,\n): Pick<UsageBucket, \"period\" | \"resetsAt\"> {\n if (currentPeriod !== undefined && currentPeriod !== null && !isRecord(currentPeriod)) {\n throw new Error(\"xAI billing currentPeriod was not an object or null.\");\n }\n if (isRecord(currentPeriod)) {\n const type = optionalString(currentPeriod.type, \"currentPeriod.type\");\n const start = optionalTimestamp(currentPeriod.start, \"currentPeriod.start\");\n const end = optionalTimestamp(currentPeriod.end, \"currentPeriod.end\");\n return {\n ...(periodLabel(type, start) ? { period: periodLabel(type, start) } : {}),\n ...(end !== undefined ? { resetsAt: end } : {}),\n };\n }\n const start = optionalTimestamp(legacyStart, \"billingPeriodStart\");\n const end = optionalTimestamp(legacyEnd, \"billingPeriodEnd\");\n return {\n ...(start !== undefined ? { period: \"Monthly\" } : {}),\n ...(end !== undefined ? { resetsAt: end } : {}),\n };\n}\n\nfunction periodLabel(type: string | undefined, start: number | undefined): string | undefined {\n if (type === \"USAGE_PERIOD_TYPE_WEEKLY\") return \"Weekly\";\n if (type === \"USAGE_PERIOD_TYPE_MONTHLY\") return \"Monthly\";\n if (type) return sanitizeDisplayText(type.replace(/^USAGE_PERIOD_TYPE_/u, \"\").replaceAll(\"_\", \" \"), 40);\n return start === undefined ? undefined : \"Current period\";\n}\n\nfunction optionalUsd(value: unknown, field: string): number | undefined {\n if (value === undefined || value === null) return undefined;\n if (!isRecord(value)) throw new Error(`xAI billing ${field} was not a cent wrapper.`);\n const cents = value.val === undefined ? 0 : value.val;\n if (!Number.isSafeInteger(cents) || Math.abs(cents as number) > MAX_SAFE_CENTS) {\n throw new Error(`xAI billing ${field}.val was not a safe signed integer.`);\n }\n return (cents as number) / 100;\n}\n\nfunction optionalPercent(value: unknown, field: string): number | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0 || value > 100) {\n throw new Error(`xAI billing ${field} was outside 0\u2013100.`);\n }\n return value;\n}\n\nfunction optionalTimestamp(value: unknown, field: string): number | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value !== \"string\" || value.length > 80) {\n throw new Error(`xAI billing ${field} was not a bounded timestamp.`);\n }\n const milliseconds = Date.parse(value);\n if (!Number.isFinite(milliseconds)) throw new Error(`xAI billing ${field} was invalid.`);\n return Math.floor(milliseconds / 1000);\n}\n\nfunction optionalString(value: unknown, field: string): string | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value !== \"string\" || value.length > 80) {\n throw new Error(`xAI billing ${field} was not a bounded string.`);\n }\n return value;\n}\n\nfunction optionalTier(value: unknown): string | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value !== \"string\" || value.length > 160) {\n throw new Error(\"xAI subscription tier was not a bounded string or null.\");\n }\n return sanitizeDisplayText(value, 80) || undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n", "// Fixed messages from https://docs.z.ai/api-reference/api-code. Never interpolate provider text:\n// error messages and their template parameters can contain credentials or terminal controls.\nconst ERROR_MESSAGES: Readonly<Record<string, string>> = {\n \"1000\": \"Authentication failed. Check your API key.\",\n \"1001\": \"Authentication header missing. Check your API key.\",\n \"1003\": \"Authentication token expired. Obtain a new token.\",\n \"1005\": \"Two-factor authentication required.\",\n \"1113\": \"Insufficient balance or no resource package. Recharge your account.\",\n \"1200\": \"API call error. Try again later.\",\n \"1210\": \"Invalid API parameter. Check the API documentation.\",\n \"1211\": \"Unknown model. Check the model ID.\",\n \"1212\": \"This model does not support the requested method.\",\n \"1213\": \"A required parameter is missing.\",\n \"1214\": \"Invalid parameter. Check the API documentation.\",\n \"1215\": \"Conflicting parameters. Check the API documentation.\",\n \"1220\": \"Access denied. Check your permissions.\",\n \"1221\": \"This API has been taken offline.\",\n \"1222\": \"This API does not exist.\",\n \"1230\": \"API processing error. Try again later.\",\n \"1234\": \"Network error. Try again later.\",\n \"1261\": \"Prompt too long. Reduce the input length.\",\n \"1301\": \"Content rejected by the safety policy.\",\n \"1302\": \"Request rate limit reached. Try again later.\",\n \"1305\": \"Service overloaded. Try again later.\",\n \"1308\": \"Usage limit reached. Wait for the quota reset.\",\n \"1309\": \"GLM Coding Plan expired. Renew your subscription.\",\n \"1310\": \"Weekly or monthly limit exhausted. Wait for the quota reset.\",\n \"1311\": \"Your subscription does not include this model.\",\n \"1313\": \"Request frequency restricted by the Fair Usage Policy. Contact support.\",\n \"1314\": \"Enterprise package expired. Contact your administrator.\",\n \"1315\": \"This API key requires an enterprise coding package scenario. Replace the key.\",\n \"1316\": \"5-hour limit reached; insufficient balance for extra usage. Wait for reset.\",\n \"1317\": \"7-day limit reached; insufficient balance for extra usage. Wait for reset.\",\n \"1318\": \"5-hour limit reached; extra usage blocked by monthly spend limit.\",\n \"1319\": \"7-day limit reached; extra usage blocked by monthly spend limit.\",\n \"1320\": \"5-hour limit reached; extra usage blocked by monthly spend limit.\",\n \"1321\": \"7-day limit reached; extra usage blocked by monthly spend limit.\",\n};\n\nconst HTTP_MESSAGES: Readonly<Record<number, string>> = {\n 400: \"Invalid request. Check the API documentation.\",\n 401: \"Authentication failed. Check your API key.\",\n 403: \"Access denied. Check your permissions.\",\n 429: \"Request or usage limit reached. Try again later.\",\n 500: \"Internal error. Try again later.\",\n};\n\nexport function zaiPayloadError(payload: unknown): string | undefined {\n const object = asObject(payload);\n if (!object) return undefined;\n const nested = asObject(object.error);\n // Missing nested metadata must not hide a top-level code; explicit nested values retain priority.\n const rawCode = nested?.code === undefined ? object.code : nested.code;\n const code = errorCode(rawCode);\n if (\n object.error === undefined &&\n object.success !== false &&\n (rawCode === undefined || code === \"0\" || code === \"200\")\n ) {\n return undefined;\n }\n return code && code !== \"0\" && code !== \"200\"\n ? `Z.AI ${code}: ${ERROR_MESSAGES[code] ?? \"API request failed.\"}`\n : \"Z.AI: API request failed.\";\n}\n\nexport function zaiResponseError(status: number, text: string): string | undefined {\n let payload: unknown;\n try {\n payload = JSON.parse(text) as unknown;\n } catch {\n // Do not expose JSON parser excerpts, response bodies, or statusText.\n if (status >= 200 && status < 300) return \"Z.AI: Invalid JSON response.\";\n }\n const error = zaiPayloadError(payload);\n if (error) return error;\n if (status < 200 || status >= 300) {\n return `Z.AI HTTP ${status}: ${HTTP_MESSAGES[status] ?? \"API request failed.\"}`;\n }\n return undefined;\n}\n\nfunction errorCode(value: unknown): string | undefined {\n if (typeof value === \"number\" && Number.isInteger(value) && value >= 0 && value <= 9999) {\n return String(value);\n }\n return typeof value === \"string\" && /^(?:0|[1-9]\\d{0,3})$/u.test(value) ? value : undefined;\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n", "import { sanitizeDisplayText } from \"../core.js\";\nimport type {\n UsageBucket,\n UsageMetric,\n UsageReport,\n ZaiPlanInfo,\n ZaiQuotaPayload,\n ZaiSubscriptionPayload,\n} from \"../types.js\";\n\nimport { zaiPayloadError } from \"./zai-errors.js\";\n\nconst FIVE_HOUR_WINDOW_MINUTES = 300;\nconst WEEKLY_WINDOW_MINUTES = 10_080;\n\nexport function normalizeZaiQuotaPayload(\n providerId: string,\n providerName: string,\n payload: ZaiQuotaPayload,\n capturedAt: number,\n plan?: ZaiPlanInfo,\n): UsageReport {\n const error = zaiPayloadError(payload);\n if (error) throw new Error(error);\n const data = asObject(payload.data);\n if (!data) throw new Error(\"Z.AI quota response data was not an object.\");\n const limits = Array.isArray(data.limits) ? (data.limits as unknown[]) : [];\n\n const buckets: UsageBucket[] = [];\n const metrics: UsageMetric[] = [];\n for (const raw of limits) {\n const limit = asObject(raw);\n if (!limit) continue;\n const type = asString(limit.type);\n const unit = asNonnegativeNumber(limit.unit);\n const isPlanUsage = type === \"TOKENS_LIMIT\" || type === \"CREDIT_LIMIT\";\n if (type === \"TIME_LIMIT\") {\n addCountBucket(buckets, limit, \"mcp-monthly\", \"MCP monthly allowance\");\n addUsageDetailMetrics(metrics, limit.usageDetails);\n } else if (isPlanUsage && unit === 3) {\n addPercentBucket(buckets, limit, \"five-hour\", sessionWindowLabel(limit), sessionWindowMinutes(limit));\n } else if (isPlanUsage && unit === 6) {\n const used = asNonnegativeNumber(limit.currentValue);\n const quota = asNonnegativeNumber(limit.usage);\n if (used !== undefined && quota !== undefined) {\n addCountBucket(buckets, limit, \"weekly\", \"Weekly window\", weeklyWindowMinutes(limit));\n } else {\n addPercentBucket(buckets, limit, \"weekly\", \"Weekly window\", weeklyWindowMinutes(limit));\n }\n }\n }\n if (buckets.length === 0) {\n throw new Error(\"Z.AI quota endpoint returned no displayable usage data.\");\n }\n\n const notes: string[] = [];\n const level = asString(data.level);\n const planLabel = plan?.name ?? level;\n if (planLabel) {\n notes.push(plan?.renewsAt ? `Plan: ${planLabel} \u00B7 renews ${plan.renewsAt}` : `Plan: ${planLabel}`);\n }\n\n return {\n providerId,\n providerName,\n capturedAt,\n source: \"zai-quota\",\n semantics: { kind: \"consumer-subscription\", label: \"GLM Coding Plan usage\" },\n buckets,\n metrics,\n ...(notes.length > 0 ? { notes } : {}),\n };\n}\n\n// The undocumented subscription endpoint can include historical products. Prefer the current,\n// valid product and fail closed to the quota plan level when only explicitly inactive products exist.\nexport function normalizeZaiSubscriptionPayload(payload: ZaiSubscriptionPayload): ZaiPlanInfo | undefined {\n if (zaiPayloadError(payload)) return undefined;\n if (!Array.isArray(payload.data)) return undefined;\n\n const candidates: Array<{\n plan: ZaiPlanInfo;\n status?: string;\n inCurrentPeriod?: boolean;\n }> = [];\n for (const raw of payload.data) {\n const entry = asObject(raw);\n if (!entry) continue;\n const name = asString(entry.productName);\n if (!name) continue;\n const renewsAt = planRenewalDate(entry.nextRenewTime);\n const status = asString(entry.status)?.toUpperCase();\n const inCurrentPeriod = asBoolean(entry.inCurrentPeriod);\n candidates.push({\n plan: { name, ...(renewsAt !== undefined ? { renewsAt } : {}) },\n ...(status !== undefined ? { status } : {}),\n ...(inCurrentPeriod !== undefined ? { inCurrentPeriod } : {}),\n });\n }\n\n const hasStateMetadata = candidates.some(\n (candidate) => candidate.status !== undefined || candidate.inCurrentPeriod !== undefined,\n );\n if (!hasStateMetadata) return candidates[0]?.plan;\n return (\n candidates.find((candidate) => candidate.inCurrentPeriod === true && candidate.status === \"VALID\")?.plan ??\n candidates.find((candidate) => candidate.inCurrentPeriod === true && candidate.status === undefined)?.plan ??\n candidates.find((candidate) => candidate.status === \"VALID\" && candidate.inCurrentPeriod === undefined)?.plan\n );\n}\n\nfunction planRenewalDate(value: unknown): string | undefined {\n if (typeof value === \"string\" && /^\\d{4}-\\d{2}-\\d{2}/u.test(value)) return value.slice(0, 10);\n const millis = asNonnegativeNumber(value);\n if (millis === undefined || millis === 0) return undefined;\n return new Date(millis).toISOString().slice(0, 10);\n}\n\n// Z.AI encodes each window as a (unit, number) pair \u2014 unit 3 counts hours and unit 6 counts\n// weeks \u2014 so the payload's number drives the window length and session label; the established\n// 5-hour and weekly constants remain the fallback when the payload omits it.\nfunction sessionWindowMinutes(limit: Record<string, unknown>): number {\n const hours = asPositiveNumber(limit.number);\n return hours === undefined ? FIVE_HOUR_WINDOW_MINUTES : Math.round(hours * 60);\n}\n\nfunction sessionWindowLabel(limit: Record<string, unknown>): string {\n const minutes = sessionWindowMinutes(limit);\n return minutes === FIVE_HOUR_WINDOW_MINUTES ? \"5h window\" : `${Math.round(minutes / 60)}h window`;\n}\n\nfunction weeklyWindowMinutes(limit: Record<string, unknown>): number {\n const weeks = asPositiveNumber(limit.number);\n return weeks === undefined ? WEEKLY_WINDOW_MINUTES : Math.round(weeks * WEEKLY_WINDOW_MINUTES);\n}\n\nfunction addPercentBucket(\n buckets: UsageBucket[],\n limit: Record<string, unknown>,\n id: string,\n label: string,\n windowMinutes: number,\n): void {\n const used = asNonnegativeNumber(limit.percentage);\n if (used === undefined) return;\n const percent = clampPercent(used);\n const resetsAt = asEpochSeconds(limit.nextResetTime);\n buckets.push({\n id,\n label,\n used: percent,\n remaining: 100 - percent,\n limit: 100,\n unit: \"percent\",\n windowMinutes,\n ...(resetsAt !== undefined ? { resetsAt } : {}),\n });\n}\n\nfunction addCountBucket(\n buckets: UsageBucket[],\n limit: Record<string, unknown>,\n id: string,\n label: string,\n windowMinutes?: number,\n): void {\n const used = asNonnegativeNumber(limit.currentValue);\n const quota = asNonnegativeNumber(limit.usage);\n if (used === undefined || quota === undefined) return;\n const resetsAt = asEpochSeconds(limit.nextResetTime);\n buckets.push({\n id,\n label,\n used,\n remaining: Math.max(0, quota - used),\n limit: quota,\n unit: \"count\",\n ...(windowMinutes !== undefined ? { windowMinutes } : {}),\n ...(resetsAt !== undefined ? { resetsAt } : {}),\n });\n}\n\nfunction addUsageDetailMetrics(metrics: UsageMetric[], value: unknown): void {\n if (!Array.isArray(value)) return;\n for (const raw of value) {\n const detail = asObject(raw);\n if (!detail) continue;\n const label = asString(detail.modelCode);\n const usage = asNonnegativeNumber(detail.usage);\n if (!label || usage === undefined) continue;\n metrics.push({ id: `mcp-${kebabCase(label)}`, label, value: usage, unit: \"count\" });\n }\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n return value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n return sanitizeDisplayText(value, 80) || undefined;\n}\n\nfunction asNonnegativeNumber(value: unknown): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) return undefined;\n return value;\n}\n\nfunction asPositiveNumber(value: unknown): number | undefined {\n const number = asNonnegativeNumber(value);\n return number !== undefined && number > 0 ? number : undefined;\n}\n\nfunction asBoolean(value: unknown): boolean | undefined {\n if (typeof value === \"boolean\") return value;\n if (value === 1) return true;\n if (value === 0) return false;\n return undefined;\n}\n\nfunction asEpochSeconds(value: unknown): number | undefined {\n const millis = asNonnegativeNumber(value);\n if (millis === undefined) return undefined;\n return Math.floor(millis / 1000);\n}\n\nfunction kebabCase(label: string): string {\n return (\n label\n .toLowerCase()\n .replace(/[^a-z0-9]+/gu, \"-\")\n .replace(/^-+|-+$/gu, \"\") || \"tool\"\n );\n}\n\nfunction clampPercent(value: number): number {\n return Math.min(100, Math.max(0, value));\n}\n", "import { sanitizeDisplayText } from \"./core.js\";\nimport type { ResolvedUsageAuth, UsageProviderAdapter, UsageProviderTarget, UsageRequestGuard } from \"./types.js\";\n\nconst MAX_TARGETS = 1_000;\nconst MAX_TARGET_ID_CHARS = 256;\nconst MAX_TARGET_LABEL_CHARS = 120;\nconst MAX_TARGET_DESCRIPTION_CHARS = 180;\n\nexport type UsageTargetResolution =\n | { kind: \"selected\"; targetId?: string }\n | {\n kind: \"selection-required\";\n choices: readonly UsageProviderTarget[];\n };\n\nexport interface UsageTargetSelectOptions {\n options: readonly string[];\n targetIdFor(option: string): string | undefined;\n}\n\nexport async function resolveUsageTarget(\n adapter: UsageProviderAdapter,\n auth: ResolvedUsageAuth,\n rememberedTargetId: string | undefined,\n signal: AbortSignal,\n timeoutMs: number,\n guard: UsageRequestGuard,\n): Promise<UsageTargetResolution> {\n if (!adapter.targets) return { kind: \"selected\" };\n if (rememberedTargetId !== undefined && !isBoundedTargetId(rememberedTargetId)) {\n throw new Error(`The remembered ${adapter.targets.singularLabel} identifier was invalid.`);\n }\n const choices = await listUsageTargets(adapter, auth, signal, timeoutMs, guard);\n if (rememberedTargetId) {\n return choices.some((choice) => choice.id === rememberedTargetId)\n ? { kind: \"selected\", targetId: rememberedTargetId }\n : { kind: \"selection-required\", choices };\n }\n if (choices.length === 1) return { kind: \"selected\", targetId: choices[0]?.id };\n return { kind: \"selection-required\", choices };\n}\n\nexport async function listUsageTargets(\n adapter: UsageProviderAdapter,\n auth: ResolvedUsageAuth,\n signal: AbortSignal,\n timeoutMs: number,\n guard: UsageRequestGuard,\n): Promise<readonly UsageProviderTarget[]> {\n if (!adapter.targets) return [];\n const startedAt = Date.now();\n await guard();\n const listed = await adapter.targets.list(auth, signal, remainingTargetTimeout(timeoutMs, startedAt), guard);\n await guard();\n remainingTargetTimeout(timeoutMs, startedAt);\n const choices = normalizeUsageTargets(listed);\n if (choices.length === 0) {\n throw new Error(`${adapter.targets.pluralLabel} discovery returned no choices.`);\n }\n return choices;\n}\n\nexport function normalizeUsageTargets(targets: readonly UsageProviderTarget[]): readonly UsageProviderTarget[] {\n if (!Array.isArray(targets)) throw new Error(\"Target discovery did not return a choices array.\");\n if (targets.length > MAX_TARGETS) {\n throw new Error(`Target discovery exceeded ${MAX_TARGETS} choices.`);\n }\n const seen = new Set<string>();\n return targets.map((target) => {\n if (!target || typeof target !== \"object\" || Array.isArray(target)) {\n throw new Error(\"Target discovery returned an invalid choice.\");\n }\n const { id, label, description } = target as Partial<UsageProviderTarget>;\n if (!isBoundedTargetId(id)) throw new Error(\"Target discovery returned an invalid ID.\");\n if (seen.has(id)) throw new Error(`Target discovery repeated ${id}.`);\n seen.add(id);\n if (typeof label !== \"string\") {\n throw new Error(\"Target discovery returned an invalid display label.\");\n }\n if (description !== undefined && typeof description !== \"string\") {\n throw new Error(\"Target discovery returned an invalid description.\");\n }\n const safeLabel = sanitizeDisplayText(label, MAX_TARGET_LABEL_CHARS);\n if (!safeLabel) throw new Error(\"Target discovery returned an empty display label.\");\n const safeDescription = description ? sanitizeDisplayText(description, MAX_TARGET_DESCRIPTION_CHARS) : undefined;\n return { id, label: safeLabel, ...(safeDescription ? { description: safeDescription } : {}) };\n });\n}\n\nexport function createUsageTargetSelectOptions(targets: readonly UsageProviderTarget[]): UsageTargetSelectOptions {\n const normalized = normalizeUsageTargets(targets);\n const ids = new Map<string, string>();\n const options = normalized.map((target) => {\n const base = target.description ? `${target.label} \u2014 ${target.description}` : target.label;\n let option = base;\n if (ids.has(option)) {\n const safeId = sanitizeDisplayText(target.id, 80) || \"target\";\n option = `${base} \u00B7 ${safeId}`;\n let duplicate = 2;\n while (ids.has(option)) {\n option = `${base} \u00B7 ${safeId} (${duplicate})`;\n duplicate += 1;\n }\n }\n ids.set(option, target.id);\n return option;\n });\n return { options, targetIdFor: (option) => ids.get(option) };\n}\n\nfunction remainingTargetTimeout(timeoutMs: number, startedAt: number): number {\n const remaining = timeoutMs - (Date.now() - startedAt);\n if (remaining <= 0) throw new Error(\"Timed out while discovering provider targets.\");\n return remaining;\n}\n\nexport function isBoundedTargetId(value: unknown): value is string {\n return (\n typeof value === \"string\" &&\n value.length > 0 &&\n value.length <= MAX_TARGET_ID_CHARS &&\n ![...value].some((character) => {\n const codePoint = character.codePointAt(0) ?? 0;\n return codePoint <= 0x1f || (codePoint >= 0x7f && codePoint <= 0x9f);\n })\n );\n}\n", "import type { ProviderUsageState, UsageBucket, UsageDisplayState, UsageModel, UsageReport } from \"./types.js\";\n\nconst BAR_SEGMENTS = 20;\nconst VALUE_COLUMN = 29;\n\nexport function formatUsageReport(report: UsageReport, displayState: UsageDisplayState): string {\n const stateLabel = displayState === \"current\" ? \"Current\" : \"Configured\";\n const title =\n report.providerId === \"baseten\"\n ? \"Baseten Model APIs Spend\"\n : report.providerId === \"deepseek\"\n ? \"DeepSeek API Balance\"\n : report.providerId === \"fireworks\"\n ? \"Fireworks API Spend\"\n : report.providerId === \"vercel-ai-gateway\"\n ? \"Vercel AI Gateway Credits\"\n : report.providerId === \"moonshotai\" || report.providerId === \"moonshotai-cn\"\n ? `${report.providerName} Balance`\n : report.providerId === \"minimax\" || report.providerId === \"minimax-cn\"\n ? report.source === \"minimax-account-balance\"\n ? `${report.providerName} API Balance`\n : `${report.providerName} Token Plan`\n : `${report.providerName} Usage`;\n const lines = [`${title} \u00B7 ${stateLabel}`];\n if (report.accountLabel) lines.push(`Account: ${report.accountLabel}`);\n lines.push(`Semantics: ${report.semantics.label}`, \"\");\n\n if (report.providerId === \"baseten\") formatBasetenReport(lines, report);\n else if (report.providerId === \"openai-codex\") formatCodexReport(lines, report);\n else if (report.providerId === \"deepseek\") formatDeepSeekReport(lines, report);\n else if (report.providerId === \"fireworks\") formatFireworksReport(lines, report);\n else if (report.providerId === \"vercel-ai-gateway\") formatVercelAIGatewayReport(lines, report);\n else if (report.providerId === \"github-copilot\") formatGitHubCopilotReport(lines, report);\n else if (report.providerId === \"openrouter\") formatOpenRouterReport(lines, report);\n else if (report.providerId === \"opencode-go\") formatOpenCodeZenReport(lines, report);\n else if (report.providerId === \"kimi-coding\") formatKimiCodingReport(lines, report);\n else if (report.providerId === \"moonshotai\" || report.providerId === \"moonshotai-cn\") {\n formatMoonshotReport(lines, report);\n } else if (report.providerId === \"minimax\" || report.providerId === \"minimax-cn\") {\n formatMiniMaxReport(lines, report);\n } else if (report.providerId === \"xai\") formatXaiReport(lines, report);\n else if (report.providerId === \"zai\" || report.providerId === \"zai-coding-cn\") {\n formatZaiReport(lines, report);\n } else formatGenericReport(lines, report);\n\n if (report.notes) {\n for (const note of report.notes) lines.push(note);\n }\n return lines.join(\"\\n\").trimEnd();\n}\n\nexport function formatUsageStatusline(\n report: UsageReport,\n model?: UsageModel,\n now = Date.now(),\n showCodexResetCountdown = true,\n): string | undefined {\n if (report.providerId === \"baseten\") return formatBasetenStatusline(report);\n if (report.providerId === \"openai-codex\") {\n return formatCodexStatusline(report, model, now, showCodexResetCountdown);\n }\n if (report.providerId === \"deepseek\") return formatDeepSeekStatusline(report);\n if (report.providerId === \"fireworks\") return formatFireworksStatusline(report);\n if (report.providerId === \"vercel-ai-gateway\") return formatVercelAIGatewayStatusline(report);\n if (report.providerId === \"github-copilot\") return formatGitHubCopilotStatusline(report);\n if (report.providerId === \"openrouter\") {\n const limit = report.buckets.find((bucket) => bucket.id === \"key-limit\");\n if (limit?.remaining !== undefined) return `openrouter ${formatUsd(limit.remaining)} left`;\n const total = report.metrics.find((metric) => metric.id === \"usage-total\");\n if (typeof total?.value === \"number\") return `openrouter ${formatUsd(total.value)} used`;\n }\n if (report.providerId === \"opencode-go\") return formatOpenCodeZenStatusline(report);\n if (report.providerId === \"kimi-coding\") return formatKimiCodingStatusline(report);\n if (report.providerId === \"moonshotai\" || report.providerId === \"moonshotai-cn\") {\n return formatMoonshotStatusline(report);\n }\n if (report.providerId === \"minimax\" || report.providerId === \"minimax-cn\") {\n return formatMiniMaxStatusline(report, model);\n }\n if (report.providerId === \"zai\" || report.providerId === \"zai-coding-cn\") {\n return formatZaiStatusline(report);\n }\n return undefined;\n}\n\nexport function formatProviderStates(states: readonly ProviderUsageState[]): string {\n return states\n .map((state) => {\n if (state.status === \"ready\") return formatUsageReport(state.report, state.displayState);\n const label = state.displayState === \"current\" ? \"Current\" : \"Configured\";\n if (state.status === \"selection-required\") {\n return `${state.providerName} \u00B7 ${label}\\nSelection required: choose this provider's ${state.singularLabel} by viewing it individually.`;\n }\n const status =\n state.status === \"auth-unavailable\"\n ? \"Authentication unavailable\"\n : state.status === \"unsupported\"\n ? \"Unsupported\"\n : \"Query failed\";\n return `${state.providerName} \u00B7 ${label}\\n${status}: ${state.message}`;\n })\n .join(\"\\n\\n\");\n}\n\nfunction formatBasetenReport(lines: string[], report: UsageReport): void {\n lines.push(`${\"Spend window:\".padEnd(VALUE_COLUMN)}Last 30 days`);\n for (const metric of report.metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}USD ${metric.value}`);\n }\n}\n\nfunction formatBasetenStatusline(report: UsageReport): string {\n const subtotal = report.metrics.find((metric) => metric.id === \"net-subtotal\");\n return subtotal ? `baseten USD ${subtotal.value} net` : \"baseten no Model APIs usage\";\n}\n\nfunction formatCodexReport(lines: string[], report: UsageReport): void {\n let previousGroup: string | undefined;\n for (const bucket of report.buckets) {\n const group = bucket.groupId ?? bucket.id;\n if (group !== previousGroup && group !== \"codex\") {\n lines.push(`${bucket.groupLabel ?? group} limit:`);\n }\n previousGroup = group;\n const fallback = bucket.id.endsWith(\":secondary\") ? \"weekly\" : \"5h\";\n const label = `${formatWindowLabel(bucket.windowMinutes, fallback, false)} limit:`;\n lines.push(`${label.padEnd(VALUE_COLUMN)}${formatPercentBucket(bucket)}`);\n }\n for (const metric of report.metrics) {\n if (metric.id === \"reset-credits\") {\n lines.push(`${\"Usage limit resets:\".padEnd(VALUE_COLUMN)}${metric.value} available`);\n } else if (metric.id === \"credits\") {\n lines.push(`${\"Credits:\".padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`);\n }\n }\n}\n\nfunction formatDeepSeekReport(lines: string[], report: UsageReport): void {\n const availability = report.metrics.find((metric) => metric.id === \"api-availability\");\n lines.push(\n `${\"API calls:\".padEnd(VALUE_COLUMN)}${availability?.value === \"available\" ? \"Available\" : \"Unavailable\"}`,\n );\n for (const currency of [\"CNY\", \"USD\"]) {\n const metrics = report.metrics.filter((metric) => metric.currency === currency);\n if (metrics.length === 0) continue;\n lines.push(\"\", `${currency} balance:`);\n for (const metric of metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${currency} ${metric.value}`);\n }\n }\n}\n\nfunction formatDeepSeekStatusline(report: UsageReport): string {\n const availability = report.metrics.find((metric) => metric.id === \"api-availability\");\n if (availability?.value !== \"available\") return \"deepseek API unavailable\";\n const totals = [\"CNY\", \"USD\"].flatMap((currency) => {\n const metric = report.metrics.find((candidate) => candidate.id === `${currency.toLowerCase()}-total`);\n return metric ? [`${currency} ${metric.value}`] : [];\n });\n return totals.length > 0 ? `deepseek ${totals.join(\" \u00B7 \")}` : \"deepseek balance unavailable\";\n}\n\nfunction formatFireworksReport(lines: string[], report: UsageReport): void {\n lines.push(`${\"Spend window:\".padEnd(VALUE_COLUMN)}Last 30 days (rated)`);\n for (const currency of fireworksCurrencies(report)) {\n lines.push(\"\", `${currency} rated spend:`);\n for (const metric of report.metrics) {\n if (metric.currency !== currency) continue;\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${currency} ${metric.value}`);\n }\n }\n}\n\nfunction formatFireworksStatusline(report: UsageReport): string {\n const totals = report.metrics.filter((metric) => metric.id.endsWith(\"-total\"));\n if (totals.length === 0) return \"fireworks no rated usage\";\n return `fireworks ${totals.map((metric) => `${metric.currency} ${metric.value}`).join(\" \u00B7 \")}`;\n}\n\nfunction fireworksCurrencies(report: UsageReport): string[] {\n const currencies: string[] = [];\n for (const metric of report.metrics) {\n if (!metric.currency || currencies.includes(metric.currency)) continue;\n currencies.push(metric.currency);\n }\n return currencies;\n}\n\nfunction formatVercelAIGatewayReport(lines: string[], report: UsageReport): void {\n for (const metric of report.metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}USD ${metric.value}`);\n }\n}\n\nfunction formatVercelAIGatewayStatusline(report: UsageReport): string {\n const balance = report.metrics.find((metric) => metric.id === \"credit-balance\");\n return balance ? `vercel USD ${balance.value} left` : \"vercel credits unavailable\";\n}\n\nfunction formatGitHubCopilotReport(lines: string[], report: UsageReport): void {\n const quota = findGitHubCopilotQuota(report);\n if (!quota || quota.limit === undefined || quota.remaining === undefined) {\n lines.push(`${`${quota?.label ?? \"Copilot quota\"}:`.padEnd(VALUE_COLUMN)}unlimited`);\n return;\n }\n const percent = percentRemaining(quota);\n const reset = quota.resetsAt ? ` (resets ${formatReset(quota.resetsAt)})` : \"\";\n lines.push(\n `${`${quota.label}:`.padEnd(VALUE_COLUMN)}${quota.remaining} of ${quota.limit} left \u00B7 ${percent}%${reset}`,\n );\n const overage = report.metrics.find((metric) => metric.id === \"overage-used\");\n if (typeof overage?.value === \"number\" && overage.value > 0) {\n lines.push(`${\"Additional usage:\".padEnd(VALUE_COLUMN)}${overage.value} ${quota.label}`);\n }\n}\n\nfunction formatGitHubCopilotStatusline(report: UsageReport): string {\n const quota = findGitHubCopilotQuota(report);\n const kind = compactGitHubCopilotQuotaKind(quota);\n if (!quota || quota.limit === undefined || quota.remaining === undefined) {\n return `copilot ${kind} unlimited`;\n }\n const overage = report.metrics.find((metric) => metric.id === \"overage-used\");\n const overageSuffix = typeof overage?.value === \"number\" && overage.value > 0 ? ` +${overage.value} over` : \"\";\n return `copilot ${kind === \"premium\" ? \"\" : `${kind} `}${quota.remaining}/${quota.limit} ${percentRemaining(quota)}%${overageSuffix}`;\n}\n\nfunction findGitHubCopilotQuota(report: UsageReport): UsageBucket | undefined {\n return report.buckets.find((bucket) => [\"ai-credits\", \"premium-requests\", \"chat-requests\"].includes(bucket.id));\n}\n\nfunction compactGitHubCopilotQuotaKind(bucket: UsageBucket | undefined): string {\n if (bucket?.id === \"ai-credits\") return \"credits\";\n if (bucket?.id === \"chat-requests\") return \"chat\";\n return \"premium\";\n}\n\nfunction percentRemaining(bucket: UsageBucket): number {\n if (!bucket.limit || bucket.remaining === undefined) return 0;\n return Math.round(clampPercent((bucket.remaining / bucket.limit) * 100));\n}\n\nfunction formatOpenRouterReport(lines: string[], report: UsageReport): void {\n const limit = report.buckets.find((bucket) => bucket.id === \"key-limit\");\n if (limit) {\n const period = limit.period ? ` (${limit.period})` : \"\";\n const value =\n limit.remaining === undefined\n ? `${formatUsd(limit.limit ?? 0)} cap; remaining unavailable`\n : `${formatUsd(limit.remaining)} of ${formatUsd(limit.limit ?? 0)} left`;\n lines.push(`${`Key limit${period}:`.padEnd(VALUE_COLUMN)}${value}`);\n }\n for (const metric of report.metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`);\n }\n}\n\nfunction formatOpenCodeZenReport(lines: string[], report: UsageReport): void {\n for (const bucket of report.buckets) {\n if (bucket.unit === \"percent\" && bucket.used !== undefined) {\n lines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${formatPercentBucket(bucket)}`);\n continue;\n }\n const reset = bucket.resetsAt ? ` (resets ${formatReset(bucket.resetsAt)})` : \"\";\n const used = bucket.used ?? \"unavailable\";\n lines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${used}% used${reset}`);\n }\n}\n\nfunction formatOpenCodeZenStatusline(report: UsageReport): string | undefined {\n const parts = [\"zen\"];\n for (const bucket of report.buckets) {\n if (bucket.used === undefined) continue;\n const compact = bucket.id === \"rolling\" ? \"r\" : bucket.id === \"weekly\" ? \"w\" : \"m\";\n parts.push(`${clampPercent(bucket.used).toFixed(0)}% ${compact}`);\n }\n return parts.length > 1 ? parts.join(\" \") : undefined;\n}\n\nfunction formatKimiCodingReport(lines: string[], report: UsageReport): void {\n for (const bucket of report.buckets) {\n const reset = bucket.resetsAt ? ` (resets ${formatReset(bucket.resetsAt)})` : \"\";\n if (bucket.used === undefined || bucket.limit === undefined) {\n lines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}unavailable${reset}`);\n continue;\n }\n lines.push(\n `${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${bucket.used} of ${bucket.limit} used \u00B7 ${percentRemaining(bucket)}% left${reset}`,\n );\n }\n const balance = report.metrics.find((metric) => metric.id === \"booster-balance\");\n const total = report.metrics.find((metric) => metric.id === \"booster-total\");\n const monthlyUsed = report.metrics.find((metric) => metric.id === \"booster-monthly-used\");\n const monthlyLimit = report.metrics.find((metric) => metric.id === \"booster-monthly-limit\");\n if (!balance && !monthlyUsed && !monthlyLimit) return;\n lines.push(\"\", \"Extra usage wallet:\");\n if (balance) {\n const totalSuffix = total ? ` of ${formatCurrencyMetric(total)}` : \"\";\n lines.push(`${\"Balance:\".padEnd(VALUE_COLUMN)}${formatCurrencyMetric(balance)}${totalSuffix}`);\n }\n if (monthlyUsed) {\n lines.push(`${\"Used this month:\".padEnd(VALUE_COLUMN)}${formatCurrencyMetric(monthlyUsed)}`);\n }\n if (monthlyLimit) {\n lines.push(`${\"Monthly limit:\".padEnd(VALUE_COLUMN)}${formatCurrencyMetric(monthlyLimit)}`);\n }\n}\n\nfunction formatKimiCodingStatusline(report: UsageReport): string | undefined {\n const fiveHour = report.buckets.find((bucket) => bucket.id === \"five-hour\");\n const weekly = report.buckets.find((bucket) => bucket.id === \"weekly\");\n const subWindow = fiveHour ?? report.buckets.find((bucket) => bucket.id !== \"weekly\");\n const selected = [subWindow, weekly].filter(\n (bucket, index, buckets): bucket is UsageBucket => bucket !== undefined && buckets.indexOf(bucket) === index,\n );\n const parts = [\"kimi\"];\n for (const bucket of selected) {\n if (!bucket.limit || bucket.remaining === undefined) continue;\n const fallback = bucket.id === \"weekly\" ? \"weekly\" : \"5h\";\n parts.push(`${percentRemaining(bucket)}% ${formatWindowLabel(bucket.windowMinutes, fallback, true)}`);\n }\n return parts.length > 1 ? parts.join(\" \") : undefined;\n}\n\nfunction formatMoonshotReport(lines: string[], report: UsageReport): void {\n for (const metric of report.metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${metric.currency} ${metric.value}`);\n }\n}\n\nfunction formatMoonshotStatusline(report: UsageReport): string {\n const available = report.metrics.find((metric) => metric.id === \"available-balance\");\n if (!available) return \"moonshot balance unavailable\";\n return `moonshot ${available.currency ?? \"\"} ${available.value}`.replace(/\\s+/gu, \" \");\n}\n\nfunction formatMiniMaxReport(lines: string[], report: UsageReport): void {\n if (report.source === \"minimax-account-balance\") {\n for (const metric of report.metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${metric.currency} ${metric.value}`);\n }\n return;\n }\n let previousGroup: string | undefined;\n for (const bucket of report.buckets) {\n if (bucket.groupId !== previousGroup) lines.push(`${bucket.groupLabel ?? \"Token Plan\"}:`);\n previousGroup = bucket.groupId;\n const reset = bucket.resetsAt ? ` (resets ${formatReset(bucket.resetsAt)})` : \"\";\n const value =\n bucket.period === \"unlimited\"\n ? \"unlimited\"\n : bucket.unit === \"percent\" && bucket.remaining !== undefined\n ? `${bucket.remaining}% remaining${reset}`\n : bucket.limit !== undefined && bucket.remaining !== undefined\n ? `${bucket.remaining} of ${bucket.limit} left \u00B7 ${percentRemaining(bucket)}%${reset}`\n : \"unavailable\";\n lines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${value}`);\n }\n}\n\nfunction formatMiniMaxStatusline(report: UsageReport, model?: UsageModel): string | undefined {\n const prefix = report.providerId === \"minimax-cn\" ? \"minimax cn\" : \"minimax\";\n if (report.source === \"minimax-account-balance\") {\n const available = report.metrics.find((metric) => metric.id === \"available-balance\");\n return available ? `${prefix} ${available.currency} ${available.value}` : undefined;\n }\n const selectedGroup = selectMiniMaxGroup(report, model);\n if (!selectedGroup) return undefined;\n const selected = report.buckets.filter((bucket) => bucket.groupId === selectedGroup);\n const parts = [prefix];\n for (const bucket of selected) {\n const fallback = bucket.id.endsWith(\":weekly\") ? \"weekly\" : \"5h\";\n const window = formatWindowLabel(bucket.windowMinutes, fallback, true);\n if (bucket.period === \"unlimited\") {\n parts.push(`unlimited ${window}`);\n continue;\n }\n if (bucket.unit === \"percent\" && bucket.remaining !== undefined) {\n parts.push(`${bucket.remaining}% ${window}`);\n continue;\n }\n if (bucket.limit === undefined || bucket.remaining === undefined) continue;\n parts.push(`${percentRemaining(bucket)}% ${window}`);\n }\n return parts.length > 1 ? parts.join(\" \") : undefined;\n}\n\nfunction selectMiniMaxGroup(report: UsageReport, model?: UsageModel): string | undefined {\n const groups = [\n ...new Set(report.buckets.map((bucket) => bucket.groupId).filter((group): group is string => group !== undefined)),\n ];\n if (groups.length <= 1) return groups[0];\n if (model && model.provider !== report.providerId) return undefined;\n if (model) {\n const modelKeys = [model.id, model.name]\n .map(normalizeMiniMaxModelKey)\n .filter((key): key is string => key !== undefined);\n const candidates = groups.map((group) => {\n const bucket = report.buckets.find((candidate) => candidate.groupId === group);\n const patterns = [bucket?.groupLabel, ...(bucket?.modelKeys ?? []), group]\n .map(normalizeMiniMaxModelKey)\n .filter((key): key is string => key !== undefined);\n return { group, patterns };\n });\n const exact = candidates.find(({ patterns }) =>\n patterns.some((pattern) => !pattern.includes(\"*\") && modelKeys.includes(pattern)),\n );\n if (exact) return exact.group;\n const wildcard = candidates.find(({ patterns }) =>\n patterns.some((pattern) => pattern.includes(\"*\") && modelKeys.some((key) => wildcardKeyMatches(pattern, key))),\n );\n if (wildcard) return wildcard.group;\n }\n // Prefer the Coding Plan catch-all over hiding the chip.\n return groups.find((group) => group === \"general\");\n}\n\nfunction normalizeMiniMaxModelKey(value: string | undefined): string | undefined {\n const key = value?.toLowerCase().replace(/[^a-z0-9*]+/gu, \"\");\n return key && /[a-z0-9]/u.test(key) ? key : undefined;\n}\n\nfunction wildcardKeyMatches(pattern: string, value: string): boolean {\n if (!pattern.includes(\"*\")) return pattern === value;\n const segments = pattern.split(\"*\").filter(Boolean);\n let offset = 0;\n for (const [index, segment] of segments.entries()) {\n const found = value.indexOf(segment, offset);\n if (found < 0 || (index === 0 && !pattern.startsWith(\"*\") && found !== 0)) return false;\n offset = found + segment.length;\n }\n const last = segments.at(-1);\n return pattern.endsWith(\"*\") || (last !== undefined && value.endsWith(last));\n}\n\nfunction formatZaiStatusline(report: UsageReport): string | undefined {\n const selected = [\n report.buckets.find((bucket) => bucket.id === \"five-hour\"),\n report.buckets.find((bucket) => bucket.id === \"weekly\"),\n ];\n const parts = [\"zai\"];\n for (const bucket of selected) {\n if (!bucket?.limit || bucket.remaining === undefined) continue;\n const fallback = bucket.id === \"weekly\" ? \"weekly\" : \"5h\";\n parts.push(`${percentRemaining(bucket)}% ${formatWindowLabel(bucket.windowMinutes, fallback, true)}`);\n }\n return parts.length > 1 ? parts.join(\" \") : undefined;\n}\n\nfunction formatCurrencyMetric(metric: UsageReport[\"metrics\"][number]): string {\n if (typeof metric.value !== \"number\") return String(metric.value);\n if (!metric.currency) return \"unavailable\";\n if (metric.currency === \"USD\") return `$${metric.value.toFixed(2)}`;\n if (metric.currency === \"CNY\") return `\u00A5${metric.value.toFixed(2)}`;\n return `${metric.value.toFixed(2)} ${metric.currency}`;\n}\n\nfunction formatXaiReport(lines: string[], report: UsageReport): void {\n const included = report.buckets.find((bucket) => bucket.id === \"included-allowance\");\n if (included) {\n let value = \"unavailable\";\n if (included.unit === \"percent\" && included.used !== undefined) {\n value = formatPercentBar(included);\n } else if (included.used !== undefined) {\n value = `${formatUsd(included.used)} used`;\n if (included.limit !== undefined) value += ` of ${formatUsd(included.limit)}`;\n } else if (included.limit !== undefined) {\n value = `usage unavailable \u00B7 ${formatUsd(included.limit)} limit`;\n }\n const period = included.period ? ` \u00B7 ${included.period}` : \"\";\n const reset = included.resetsAt ? ` (resets ${formatReset(included.resetsAt)})` : \"\";\n lines.push(`${\"Included allowance:\".padEnd(VALUE_COLUMN)}${value}${period}${reset}`);\n }\n const onDemand = report.buckets.find((bucket) => bucket.id === \"on-demand\");\n if (onDemand) {\n let value = onDemand.used === undefined ? \"usage unavailable\" : `${formatUsd(onDemand.used)} used`;\n if (onDemand.limit !== undefined) value += ` of ${formatUsd(onDemand.limit)} cap`;\n lines.push(`${\"On-demand usage:\".padEnd(VALUE_COLUMN)}${value}`);\n }\n for (const metric of report.metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`);\n }\n}\n\nfunction formatZaiReport(lines: string[], report: UsageReport): void {\n for (const bucket of report.buckets) {\n if (bucket.unit === \"percent\" && bucket.used !== undefined) {\n lines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${formatPercentBucket(bucket)}`);\n continue;\n }\n const reset = bucket.resetsAt ? ` (resets ${formatReset(bucket.resetsAt)})` : \"\";\n let value = \"unavailable\";\n if (bucket.used !== undefined && bucket.limit !== undefined) {\n value = `${bucket.used} of ${bucket.limit} used`;\n if (bucket.remaining !== undefined) value += ` \u00B7 ${bucket.remaining} left`;\n } else if (bucket.used !== undefined) {\n value = `${bucket.used} used`;\n } else if (bucket.remaining !== undefined) {\n value = `${bucket.remaining} left`;\n }\n lines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${value}${reset}`);\n }\n for (const metric of report.metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`);\n }\n}\n\nfunction formatGenericReport(lines: string[], report: UsageReport): void {\n for (const bucket of report.buckets) {\n lines.push(\n `${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(bucket.remaining ?? bucket.used ?? \"unavailable\", bucket.unit)}`,\n );\n }\n for (const metric of report.metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`);\n }\n}\n\nfunction formatCodexStatusline(\n report: UsageReport,\n model?: UsageModel,\n now = Date.now(),\n showResetCountdown = true,\n): string | undefined {\n const group = selectCodexGroup(report, model);\n if (!group) return formatCodexCreditsStatus(report);\n const buckets = report.buckets.filter((bucket) => (bucket.groupId ?? bucket.id) === group);\n const labelBucket = buckets[0];\n const parts = [group === \"codex\" ? \"codex\" : `codex ${compactLimitLabel(labelBucket?.groupLabel ?? group)}`];\n for (const bucket of buckets) {\n if (bucket.remaining === undefined) continue;\n const percent = `${clampPercent(bucket.remaining).toFixed(0)}%`;\n const fallback = bucket.id.endsWith(\":secondary\") ? \"weekly\" : \"5h\";\n const window = formatWindowLabel(bucket.windowMinutes, fallback, true);\n if (!showResetCountdown) {\n parts.push(`${percent} ${window}`);\n continue;\n }\n const reset = formatResetCountdown(bucket.resetsAt, now);\n parts.push(`${percent} ${reset ? `\u21BB ${reset}` : window}`);\n }\n return parts.length > 1 ? parts.join(\" \") : formatCodexCreditsStatus(report);\n}\n\nfunction formatCodexCreditsStatus(report: UsageReport): string {\n const credits = report.metrics.find((metric) => metric.id === \"credits\");\n if (!credits) return \"codex usage unavailable\";\n if (credits.value === \"none\") return \"codex no credits\";\n if (credits.value === \"available\") return \"codex credits available\";\n if (credits.value === \"unlimited\") return \"codex credits unlimited\";\n return `codex ${formatMetricValue(credits.value, \"count\")} credits`;\n}\n\nfunction selectCodexGroup(report: UsageReport, model?: UsageModel): string | undefined {\n const groups = [...new Set(report.buckets.map((bucket) => bucket.groupId ?? bucket.id))];\n if (model?.provider !== \"openai-codex\") {\n return groups.includes(\"codex\") ? \"codex\" : groups[0];\n }\n const modelKeys = normalizedModelKeys(model);\n for (const group of groups) {\n const bucket = report.buckets.find((candidate) => (candidate.groupId ?? candidate.id) === group);\n const keys = [group, bucket?.groupLabel, ...(bucket?.modelKeys ?? [])]\n .map(normalizeKey)\n .filter((key): key is string => key !== undefined);\n if (keys.some((key) => modelKeys.has(key))) return group;\n }\n const variants = [...modelKeys]\n .map((key) => key.match(/(?:^|-)codex-(.+)$/)?.[1])\n .filter((value): value is string => Boolean(value));\n for (const variant of variants) {\n const matches = groups.filter((group) => {\n if (group === \"codex\") return false;\n const key = normalizeKey(group);\n return key ? normalizedKeyHasToken(key, variant) : false;\n });\n if (matches.length === 1) return matches[0];\n }\n return groups.includes(\"codex\") ? \"codex\" : groups[0];\n}\n\nfunction normalizedModelKeys(model: UsageModel): Set<string> {\n const keys = new Set<string>();\n for (const value of [model.id, model.name]) {\n const key = normalizeKey(value);\n if (!key) continue;\n keys.add(key);\n const index = key.indexOf(\"codex\");\n if (index >= 0) keys.add(key.slice(index));\n }\n return keys;\n}\n\nfunction normalizeKey(value: string | undefined): string | undefined {\n const separated = value?.toLowerCase().replace(/[^a-z0-9]+/g, \"-\");\n if (!separated) return undefined;\n let start = 0;\n let end = separated.length;\n while (separated[start] === \"-\") start += 1;\n while (end > start && separated[end - 1] === \"-\") end -= 1;\n return separated.slice(start, end) || undefined;\n}\n\nfunction normalizedKeyHasToken(key: string, token: string): boolean {\n return key === token || key.startsWith(`${token}-`) || key.endsWith(`-${token}`) || key.includes(`-${token}-`);\n}\n\nfunction compactLimitLabel(label: string): string {\n const normalized = label.replace(/[_-]+/g, \" \").trim();\n const codex = /\\bcodex\\s/iu.exec(normalized);\n const suffix = codex ? normalized.slice(codex.index + codex[0].length).trim() : \"\";\n return (suffix || normalized).toLowerCase().replace(/\\s+/g, \" \");\n}\n\nfunction formatPercentBucket(bucket: UsageBucket): string {\n return `${formatPercentBar(bucket)}${bucket.resetsAt ? ` (resets ${formatReset(bucket.resetsAt)})` : \"\"}`;\n}\n\nfunction formatPercentBar(bucket: UsageBucket): string {\n const remaining = clampPercent(bucket.remaining ?? 0);\n const filled = Math.round((remaining / 100) * BAR_SEGMENTS);\n return `[${\"\u2588\".repeat(filled)}${\"\u2591\".repeat(BAR_SEGMENTS - filled)}] ${remaining.toFixed(0)}% left`;\n}\n\nfunction formatWindowLabel(minutes: number | undefined, fallback: \"5h\" | \"weekly\", compact: boolean): string {\n if (!minutes || !Number.isFinite(minutes) || minutes <= 0) {\n return compact && fallback === \"weekly\" ? \"wk\" : capitalize(fallback);\n }\n if (minutes === 10_080) return compact ? \"wk\" : \"Weekly\";\n if (minutes % 10_080 === 0) return `${minutes / 10_080}w`;\n if (minutes % 1_440 === 0) return `${minutes / 1_440}d`;\n if (minutes % 60 === 0) return `${minutes / 60}h`;\n return `${minutes}m`;\n}\n\nfunction formatResetCountdown(resetsAt: number | undefined, now: number): string | undefined {\n if (resetsAt === undefined || !Number.isFinite(resetsAt) || !Number.isFinite(now)) return undefined;\n const totalMinutes = Math.max(0, Math.ceil((resetsAt * 1_000 - now) / 60_000));\n const days = Math.floor(totalMinutes / 1_440);\n const hours = Math.floor((totalMinutes % 1_440) / 60);\n const minutes = totalMinutes % 60;\n if (days > 0) {\n return [`${String(days)}d`, hours > 0 ? `${String(hours)}h` : minutes > 0 ? `${String(minutes)}m` : \"\"]\n .filter(Boolean)\n .join(\"\");\n }\n if (hours > 0) return [`${String(hours)}h`, minutes > 0 ? `${String(minutes)}m` : \"\"].filter(Boolean).join(\"\");\n return `${String(minutes)}m`;\n}\n\nfunction formatMetricValue(value: number | string, unit: UsageBucket[\"unit\"] | undefined): string {\n if (unit === \"usd\" && typeof value === \"number\") return formatUsd(value);\n return String(value);\n}\n\nfunction formatUsd(value: number): string {\n return `$${value.toFixed(2)}`;\n}\n\nfunction formatReset(epochSeconds: number): string {\n const reset = new Date(epochSeconds * 1000);\n if (Number.isNaN(reset.getTime())) return \"at an unknown time\";\n const time = `${reset.getHours().toString().padStart(2, \"0\")}:${reset.getMinutes().toString().padStart(2, \"0\")}`;\n const now = new Date();\n if (reset.toDateString() === now.toDateString()) return time;\n return `${time} on ${reset.getDate()} ${reset.toLocaleDateString(undefined, { month: \"short\" })}`;\n}\n\nfunction capitalize(value: string): string {\n return `${value[0]?.toUpperCase() ?? \"\"}${value.slice(1)}`;\n}\n\nfunction clampPercent(value: number): number {\n return Math.min(100, Math.max(0, value));\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { constants } from \"node:fs\";\nimport { chmod, mkdir, open, rename, rm, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, join } from \"node:path\";\nimport { getAgentDir } from \"@earendil-works/pi-coding-agent\";\nimport { isFireworksAccountId } from \"./providers/fireworks.js\";\nimport { isBoundedTargetId } from \"./usage-targets.js\";\n\nexport const USAGE_SETTINGS_FILE = \"pi-usage.json\";\nexport const MAX_USAGE_SETTINGS_BYTES = 64 * 1024;\n\nexport interface UsageSettings {\n codexFastMode: boolean;\n codexStatusResetCountdown: boolean;\n selectedTargets: Record<string, string>;\n}\n\nexport const DEFAULT_USAGE_SETTINGS: Readonly<UsageSettings> = Object.freeze({\n codexFastMode: false,\n codexStatusResetCountdown: true,\n selectedTargets: Object.freeze({}),\n});\n\nexport interface UsageSettingsState {\n kind: \"missing\" | \"loaded\" | \"invalid\";\n path: string;\n settings: UsageSettings;\n document?: Record<string, unknown>;\n issue?: string;\n}\n\nexport type UsageTargetPublicationCheck = () => Promise<void>;\n\nexport interface UsageSettingsRuntime {\n get(): Readonly<UsageSettingsState>;\n reload(signal?: AbortSignal): Promise<Readonly<UsageSettingsState>>;\n update(patch: Partial<UsageSettings>, signal?: AbortSignal): Promise<Readonly<UsageSettingsState>>;\n updateSelectedTarget(\n providerId: string,\n targetId: string,\n signal?: AbortSignal,\n checkPublishedSelection?: UsageTargetPublicationCheck,\n ): Promise<Readonly<UsageSettingsState>>;\n flush(): Promise<void>;\n}\n\ninterface UsageSettingsFileOperations {\n rename: typeof rename;\n writeFile: typeof writeFile;\n}\n\ninterface UsageSettingsRuntimeOptions {\n operations?: Partial<UsageSettingsFileOperations>;\n path?: string;\n}\n\nexport function usageSettingsPath(): string {\n return join(getAgentDir(), USAGE_SETTINGS_FILE);\n}\n\nexport function normalizeUsageSettings(value: unknown): UsageSettings | undefined {\n if (!isRecord(value)) return undefined;\n if (Object.hasOwn(value, \"codexFastMode\") && typeof value.codexFastMode !== \"boolean\") {\n return undefined;\n }\n if (Object.hasOwn(value, \"codexStatusResetCountdown\") && typeof value.codexStatusResetCountdown !== \"boolean\") {\n return undefined;\n }\n if (Object.hasOwn(value, \"fireworksAccountId\") && !isFireworksAccountId(value.fireworksAccountId)) {\n return undefined;\n }\n const selectedTargets = normalizeSelectedTargets(value.selectedTargets);\n if (Object.hasOwn(value, \"selectedTargets\") && !selectedTargets) return undefined;\n const effectiveTargets = { ...(selectedTargets ?? {}) };\n if (!effectiveTargets.fireworks && isFireworksAccountId(value.fireworksAccountId)) {\n effectiveTargets.fireworks = value.fireworksAccountId;\n }\n return {\n codexFastMode:\n typeof value.codexFastMode === \"boolean\" ? value.codexFastMode : DEFAULT_USAGE_SETTINGS.codexFastMode,\n codexStatusResetCountdown:\n typeof value.codexStatusResetCountdown === \"boolean\"\n ? value.codexStatusResetCountdown\n : DEFAULT_USAGE_SETTINGS.codexStatusResetCountdown,\n selectedTargets: effectiveTargets,\n };\n}\n\nexport async function loadUsageSettings(path = usageSettingsPath(), signal?: AbortSignal): Promise<UsageSettingsState> {\n throwIfAborted(signal);\n try {\n const handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);\n let text: string;\n try {\n const stats = await handle.stat();\n throwIfAborted(signal);\n if (!stats.isFile()) throw new Error(\"settings path is not a regular file\");\n if (stats.size > MAX_USAGE_SETTINGS_BYTES) {\n throw new Error(\"settings file exceeds 64 KiB\");\n }\n text = await handle.readFile(\"utf8\");\n } finally {\n await handle.close();\n }\n throwIfAborted(signal);\n const document = JSON.parse(text) as unknown;\n const settings = normalizeUsageSettings(document);\n if (!settings || !isRecord(document)) throw new Error(\"invalid settings shape\");\n return { kind: \"loaded\", path, settings, document };\n } catch (error) {\n if (signal?.aborted) throw error;\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return {\n kind: \"missing\",\n path,\n settings: { ...DEFAULT_USAGE_SETTINGS },\n document: {},\n };\n }\n return {\n kind: \"invalid\",\n path,\n settings: { ...DEFAULT_USAGE_SETTINGS },\n issue:\n isNodeError(error) && error.code === \"ELOOP\"\n ? \"symbolic links are not accepted\"\n : error instanceof Error\n ? error.message\n : String(error),\n };\n }\n}\n\nexport function createUsageSettingsRuntime(options: UsageSettingsRuntimeOptions | string = {}): UsageSettingsRuntime {\n const path = typeof options === \"string\" ? options : (options.path ?? usageSettingsPath());\n const operations: UsageSettingsFileOperations = {\n rename,\n writeFile,\n ...(typeof options === \"string\" ? undefined : options.operations),\n };\n let state: UsageSettingsState = {\n kind: \"missing\",\n path,\n settings: { ...DEFAULT_USAGE_SETTINGS },\n document: {},\n };\n let queue = Promise.resolve();\n const enqueue = <T>(operation: () => Promise<T>): Promise<T> => {\n const result = queue.then(operation, operation);\n queue = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n };\n return {\n get: () => structuredClone(state),\n reload: (signal) =>\n enqueue(async () => {\n const loaded = await loadUsageSettings(path, signal);\n state = loaded;\n return structuredClone(state);\n }),\n update: (patch, signal) =>\n enqueue(async () => {\n const saved = await saveUsageSettingsPatch(path, patch, operations, signal);\n state = saved;\n return structuredClone(state);\n }),\n updateSelectedTarget: (providerId, targetId, signal, checkPublishedSelection) =>\n enqueue(async () => {\n const transaction = await saveUsageTargetSelection(path, providerId, targetId, operations, signal);\n try {\n await checkPublishedSelection?.();\n throwIfAborted(signal);\n } catch (error) {\n try {\n await restoreUsageSettingsState(path, transaction.saved, transaction.previous, operations);\n state = transaction.previous;\n } catch (rollbackError) {\n state = await loadUsageSettings(path);\n throw new AggregateError(\n [error, rollbackError],\n \"Target selection changed after publication and pi-usage.json rollback failed\",\n );\n }\n throw error;\n }\n state = transaction.saved;\n return structuredClone(state);\n }),\n flush: () => queue,\n };\n}\n\nasync function saveUsageSettingsPatch(\n path: string,\n patch: Partial<UsageSettings>,\n operations: UsageSettingsFileOperations,\n signal?: AbortSignal,\n): Promise<UsageSettingsState> {\n return saveUsageSettingsDocument(\n path,\n (document) => {\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) delete document[key];\n else document[key] = value;\n }\n },\n operations,\n signal,\n );\n}\n\nasync function saveUsageTargetSelection(\n path: string,\n providerId: string,\n targetId: string,\n operations: UsageSettingsFileOperations,\n signal?: AbortSignal,\n): Promise<{ saved: UsageSettingsState; previous: UsageSettingsState }> {\n if (!isProviderId(providerId) || !isBoundedTargetId(targetId)) {\n throw new Error(\"Refusing to save an invalid usage target selection\");\n }\n const previous = await loadUsageSettings(path, signal);\n const saved = await saveUsageSettingsDocument(\n path,\n (document) => {\n document.selectedTargets = {\n ...(normalizeSelectedTargets(document.selectedTargets) ?? {}),\n [providerId]: targetId,\n };\n if (providerId === \"fireworks\") delete document.fireworksAccountId;\n },\n operations,\n signal,\n previous,\n );\n return { saved, previous };\n}\n\nasync function saveUsageSettingsDocument(\n path: string,\n mutate: (document: Record<string, unknown>) => void,\n operations: UsageSettingsFileOperations,\n signal?: AbortSignal,\n expected?: UsageSettingsState,\n): Promise<UsageSettingsState> {\n const latest = await loadUsageSettings(path, signal);\n if (latest.kind === \"invalid\") {\n throw new Error(\"Cannot overwrite an invalid pi-usage.json; repair it and reload first\");\n }\n if (expected && !sameUsageSettingsDocument(latest, expected)) {\n throw new Error(\"pi-usage.json changed while saving; retry the action\");\n }\n const document = { ...latest.document };\n mutate(document);\n const settings = normalizeUsageSettings(document);\n if (!settings) throw new Error(\"Refusing to save invalid pi-usage settings\");\n const directory = dirname(path);\n const temporaryPath = join(directory, `.${basename(path)}.${randomUUID()}.tmp`);\n await mkdir(directory, { recursive: true, mode: 0o700 });\n throwIfAborted(signal);\n try {\n await operations.writeFile(temporaryPath, `${JSON.stringify(document, null, 2)}\\n`, {\n encoding: \"utf8\",\n flag: \"wx\",\n mode: 0o600,\n });\n if (process.platform !== \"win32\") await chmodPrivate(temporaryPath);\n throwIfAborted(signal);\n const current = await loadUsageSettings(path, signal);\n if (\n current.kind === \"invalid\" ||\n current.kind !== latest.kind ||\n JSON.stringify(current.document) !== JSON.stringify(latest.document)\n ) {\n throw new Error(\"pi-usage.json changed while saving; retry the action\");\n }\n throwIfAborted(signal);\n await operations.rename(temporaryPath, path);\n } finally {\n await rm(temporaryPath, { force: true }).catch(() => undefined);\n }\n return { kind: \"loaded\", path, settings, document };\n}\n\nasync function restoreUsageSettingsState(\n path: string,\n published: UsageSettingsState,\n previous: UsageSettingsState,\n operations: UsageSettingsFileOperations,\n): Promise<void> {\n if (previous.kind === \"missing\") {\n const current = await loadUsageSettings(path);\n if (!sameUsageSettingsDocument(current, published)) {\n throw new Error(\"pi-usage.json changed before target selection rollback\");\n }\n await rm(path);\n return;\n }\n if (previous.kind !== \"loaded\" || !previous.document) {\n throw new Error(\"Cannot restore invalid prior pi-usage.json settings\");\n }\n await saveUsageSettingsDocument(\n path,\n (document) => {\n for (const key of Object.keys(document)) delete document[key];\n Object.assign(document, previous.document);\n },\n operations,\n undefined,\n published,\n );\n}\n\nfunction sameUsageSettingsDocument(\n left: Pick<UsageSettingsState, \"kind\" | \"document\">,\n right: Pick<UsageSettingsState, \"kind\" | \"document\">,\n): boolean {\n return left.kind === right.kind && JSON.stringify(left.document) === JSON.stringify(right.document);\n}\n\nasync function chmodPrivate(path: string): Promise<void> {\n await chmod(path, 0o600);\n}\n\nfunction throwIfAborted(signal?: AbortSignal): void {\n if (signal?.aborted) throw new DOMException(\"Settings operation aborted\", \"AbortError\");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error;\n}\n\nfunction normalizeSelectedTargets(value: unknown): Record<string, string> | undefined {\n if (value === undefined) return {};\n if (!isRecord(value)) return undefined;\n const targets: Record<string, string> = {};\n for (const [providerId, targetId] of Object.entries(value)) {\n if (!isProviderId(providerId) || !isBoundedTargetId(targetId)) return undefined;\n targets[providerId] = targetId;\n }\n return targets;\n}\n\nfunction isProviderId(value: string): boolean {\n return /^[A-Za-z0-9][A-Za-z0-9._~-]{0,127}$/u.test(value);\n}\n", "// This orchestrator intentionally remains over 1,000 lines because its menu, query generations,\n// account cache, cancellation, and session lifecycle share one consistency boundary.\nimport { randomUUID } from \"node:crypto\";\nimport type { ExtensionAPI, ExtensionCommandContext, ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { FAST_USAGE_WARNING, registerCodexFastMode } from \"./codex-fast-runtime.js\";\nimport {\n type CodexResetAvailability,\n type CodexResetOption,\n type CodexResetOutcome,\n codexResetActionDescription,\n codexResetCount,\n consumeCodexResetCredit,\n formatCodexResetOutcome,\n genericCodexResetOption,\n listCodexResetCredits,\n resetConfirmationLines,\n resetLabel,\n resetOptionExpiration,\n resolveCodexResetAuth,\n} from \"./codex-resets.js\";\nimport { abortError, awaitWithDeadline, errorMessage, runWithConcurrency, UsageCache } from \"./core.js\";\nimport { formatProviderStates, formatUsageStatusline } from \"./format.js\";\nimport { createOAuthCredentialCandidateReader } from \"./oauth-credential-source.js\";\nimport { adapterForProvider, isStaleExtensionContextError, queryProviderUsage, resolveUsageAuth } from \"./query.js\";\nimport { createUsageSettingsRuntime, type UsageSettingsRuntime, type UsageSettingsState } from \"./settings.js\";\nimport type {\n PiModel,\n ProviderUsageState,\n ResolvedUsageAuth,\n UsageDisplayState,\n UsageProviderAdapter,\n} from \"./types.js\";\nimport {\n configuredAdapters,\n isAbortError,\n isTimeoutError,\n modelIdentity,\n providerDisplayName,\n setBoundedMap,\n} from \"./usage-helpers.js\";\nimport { showUsageSettings } from \"./usage-settings-ui.js\";\nimport { createUsageTargetSelectOptions, listUsageTargets, resolveUsageTarget } from \"./usage-targets.js\";\n\nconst CACHE_TTL_MS = 5 * 60 * 1000;\nconst STATUS_COUNTDOWN_REFRESH_MS = 60 * 1000;\nconst DEFAULT_TIMEOUT_MS = 15_000;\nconst ALL_PROVIDER_CONCURRENCY = 2;\nconst FAILURE_BACKOFF_MS = 30_000;\nconst MAX_ACCOUNT_STATES = 32;\nconst STATUS_KEY = \"usage\";\n\nconst REFRESH_CURRENT = \"Refresh current usage\";\nconst VIEW_ANOTHER = \"View another configured provider\u2026\";\nconst VIEW_ALL = \"View all configured providers\u2026\";\nconst CLOSE = \"Close\";\nconst SETTINGS = \"Settings\";\nconst REDEEM_CODEX_RESET = \"Redeem usage limit reset\u2026\";\n\ntype UsageExtensionDependencies = {\n credentialReader?: (providerId: string) => unknown;\n createRedemptionId?: () => string;\n settingsRuntime?: UsageSettingsRuntime;\n};\n\ntype QueryOutcome = {\n state: ProviderUsageState;\n fingerprint?: string;\n authState?: \"unavailable\";\n rememberedTargetId?: string;\n};\n\nclass UsageTargetSelectionChangedError extends Error {\n override readonly name = \"UsageTargetSelectionChangedError\";\n}\n\ntype StableCurrent = {\n outcome: QueryOutcome;\n model: PiModel | undefined;\n};\n\nexport default function usageExtension(pi: ExtensionAPI, dependencies: UsageExtensionDependencies = {}) {\n const credentialReader = dependencies.credentialReader;\n const credentialCandidates = createOAuthCredentialCandidateReader(pi, credentialReader);\n const createRedemptionId = dependencies.createRedemptionId ?? randomUUID;\n const settingsRuntime = dependencies.settingsRuntime ?? createUsageSettingsRuntime();\n const cache = new UsageCache(CACHE_TTL_MS);\n const failureBackoff = new Map<string, { until: number; message: string }>();\n const latestQueries = new Map<string, number>();\n const activeControllers = new Set<AbortController>();\n let querySequence = 0;\n let activeCurrentIdentity: string | undefined;\n let sessionActive = false;\n let statusGeneration = 0;\n let sessionGeneration = 0;\n let statusRefreshTimer: ReturnType<typeof setTimeout> | undefined;\n let statusCountdownTimer: ReturnType<typeof setTimeout> | undefined;\n let statusController: AbortController | undefined;\n let fastRuntime: ReturnType<typeof registerCodexFastMode>;\n\n const clearStatusRefreshTimer = () => {\n if (statusRefreshTimer) clearTimeout(statusRefreshTimer);\n statusRefreshTimer = undefined;\n };\n\n const clearStatusCountdownTimer = () => {\n if (statusCountdownTimer) clearTimeout(statusCountdownTimer);\n statusCountdownTimer = undefined;\n };\n\n const clearStatusTimers = () => {\n clearStatusRefreshTimer();\n clearStatusCountdownTimer();\n };\n\n const safeSetStatus = (ctx: ExtensionContext, value: string | undefined): boolean => {\n try {\n ctx.ui.setStatus(STATUS_KEY, value);\n return true;\n } catch (error) {\n if (isStaleExtensionContextError(error)) return false;\n throw error;\n }\n };\n\n const clearStatus = (ctx: ExtensionContext) => {\n statusGeneration += 1;\n statusController?.abort();\n statusController = undefined;\n clearStatusTimers();\n safeSetStatus(ctx, undefined);\n };\n\n const scheduleStatusRefresh = (ctx: ExtensionContext, model: PiModel) => {\n clearStatusRefreshTimer();\n const generation = statusGeneration;\n statusRefreshTimer = setTimeout(() => {\n statusRefreshTimer = undefined;\n if (!sessionActive || generation !== statusGeneration) return;\n startStatusRefresh(ctx, model, true);\n }, CACHE_TTL_MS);\n statusRefreshTimer.unref?.();\n };\n\n const publishStatus = (ctx: ExtensionContext, outcome: QueryOutcome, model: PiModel, shouldSchedule: boolean) => {\n clearStatusCountdownTimer();\n if (adapterForProvider(model.provider)?.publishesStatusline === false) {\n clearStatusRefreshTimer();\n safeSetStatus(ctx, undefined);\n return;\n }\n if (outcome.state.status === \"unsupported\") {\n clearStatusRefreshTimer();\n safeSetStatus(ctx, undefined);\n return;\n }\n if (outcome.state.status !== \"ready\") {\n const chip =\n outcome.state.status === \"auth-unavailable\"\n ? \"auth unavailable\"\n : outcome.state.status === \"selection-required\"\n ? \"selection required\"\n : `usage err: ${outcome.state.message.slice(0, 50)}`;\n\n if (safeSetStatus(ctx, chip)) {\n if (shouldSchedule && sessionActive) scheduleStatusRefresh(ctx, model);\n }\n return;\n }\n const showCodexResetCountdown =\n outcome.state.report.providerId === \"openai-codex\" && settingsRuntime.get().settings.codexStatusResetCountdown;\n const now = Date.now();\n const rawValue = formatUsageStatusline(outcome.state.report, model, now, showCodexResetCountdown);\n const value = rawValue ? fastRuntime.decorateStatus(model, rawValue) : undefined;\n if (!safeSetStatus(ctx, value)) return;\n if (shouldSchedule && sessionActive) scheduleStatusRefresh(ctx, model);\n if (\n sessionActive &&\n showCodexResetCountdown &&\n outcome.state.report.buckets.some(\n (bucket) => bucket.resetsAt !== undefined && Number.isFinite(bucket.resetsAt) && bucket.resetsAt * 1_000 > now,\n )\n ) {\n const generation = statusGeneration;\n statusCountdownTimer = setTimeout(() => {\n statusCountdownTimer = undefined;\n if (!sessionActive || generation !== statusGeneration) return;\n publishStatus(ctx, outcome, model, false);\n }, STATUS_COUNTDOWN_REFRESH_MS);\n statusCountdownTimer.unref?.();\n }\n };\n\n const invalidateProviderState = (providerId: string) => {\n cache.clearProvider(providerId);\n for (const key of failureBackoff.keys()) {\n if (key.startsWith(`${providerId}:`)) failureBackoff.delete(key);\n }\n for (const key of latestQueries.keys()) {\n if (key.startsWith(`${providerId}:`)) latestQueries.delete(key);\n }\n };\n\n const transitionCurrentIdentity = (nextIdentity: string, providerId: string) => {\n if (!activeCurrentIdentity || activeCurrentIdentity === nextIdentity) {\n activeCurrentIdentity = nextIdentity;\n return;\n }\n const previousProviderId = activeCurrentIdentity.split(\":\", 1)[0] ?? \"\";\n for (const id of new Set([previousProviderId, providerId])) {\n if (id) invalidateProviderState(id);\n }\n activeCurrentIdentity = nextIdentity;\n };\n\n const queryAdapterState = async (\n ctx: ExtensionContext,\n adapter: UsageProviderAdapter,\n displayState: UsageDisplayState,\n force: boolean,\n signal: AbortSignal,\n authRetry = 0,\n deadlineAt = Date.now() + DEFAULT_TIMEOUT_MS,\n ): Promise<QueryOutcome> => {\n const expectedSessionGeneration = sessionGeneration;\n const expectedSessionId = ctx.sessionManager.getSessionId();\n const expectedModelIdentity = modelIdentity(ctx.model);\n const expectedTargetId = adapter.targets ? settingsRuntime.get().settings.selectedTargets[adapter.id] : undefined;\n const providerName = providerDisplayName(ctx, adapter.id);\n let auth: ResolvedUsageAuth | undefined;\n try {\n auth = await awaitWithDeadline(\n resolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n signal,\n Math.max(1, deadlineAt - Date.now()),\n `resolving ${adapter.displayName} runtime auth`,\n );\n } catch (error) {\n if (isStaleExtensionContextError(error) || isAbortError(error)) throw error;\n if (displayState === \"current\") {\n transitionCurrentIdentity(`${adapter.id}:auth-error`, adapter.id);\n }\n return {\n state: {\n providerId: adapter.id,\n providerName,\n displayState,\n status: isTimeoutError(error) ? \"query-failed\" : \"auth-unavailable\",\n message: errorMessage(error),\n },\n };\n }\n const requiresRequestBoundaryGuard =\n adapter.targets !== undefined ||\n [\n \"baseten\",\n \"deepseek\",\n \"minimax\",\n \"minimax-cn\",\n \"moonshotai\",\n \"moonshotai-cn\",\n \"vercel-ai-gateway\",\n \"xai\",\n \"zai\",\n \"zai-coding-cn\",\n ].includes(adapter.id);\n const requestContextChanged = () =>\n expectedSessionGeneration !== sessionGeneration ||\n ctx.sessionManager.getSessionId() !== expectedSessionId ||\n modelIdentity(ctx.model) !== expectedModelIdentity ||\n (adapter.targets !== undefined &&\n settingsRuntime.get().settings.selectedTargets[adapter.id] !== expectedTargetId);\n if (requiresRequestBoundaryGuard && requestContextChanged()) throw abortError();\n if (!auth) {\n if (displayState === \"current\") {\n transitionCurrentIdentity(`${adapter.id}:unavailable`, adapter.id);\n }\n return {\n state: {\n providerId: adapter.id,\n providerName,\n displayState,\n status: \"auth-unavailable\",\n message: `No runtime credential is configured for ${providerName}.`,\n },\n authState: \"unavailable\",\n };\n }\n let retryableAuthChanged = false;\n const guard = async () => {\n if (signal.aborted || requestContextChanged()) throw abortError();\n if (!requiresRequestBoundaryGuard) return;\n const revalidated = await awaitWithDeadline(\n resolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n signal,\n Math.max(1, deadlineAt - Date.now()),\n `revalidating ${providerName} runtime auth`,\n );\n if (signal.aborted || requestContextChanged()) throw abortError();\n if (revalidated?.fingerprint !== auth.fingerprint) {\n if ([\"deepseek\", \"minimax\", \"minimax-cn\"].includes(adapter.id)) {\n retryableAuthChanged = true;\n throw new Error(`${providerName} runtime credential changed during the usage query.`);\n }\n throw abortError();\n }\n };\n let queryFingerprint = adapter.targets\n ? `${auth.fingerprint}:target:${expectedTargetId ?? \"unresolved\"}`\n : auth.fingerprint;\n let failureKey = `${adapter.id}:${queryFingerprint}`;\n let queryId: number | undefined;\n try {\n const previousDiscoveryFailure = failureBackoff.get(failureKey);\n if (!force && previousDiscoveryFailure && previousDiscoveryFailure.until > Date.now()) {\n return {\n state: {\n providerId: adapter.id,\n providerName,\n displayState,\n status: \"query-failed\",\n message: previousDiscoveryFailure.message,\n },\n fingerprint: auth.fingerprint,\n rememberedTargetId: expectedTargetId,\n };\n }\n const target = await resolveUsageTarget(\n adapter,\n auth,\n expectedTargetId,\n signal,\n Math.max(1, deadlineAt - Date.now()),\n guard,\n );\n if (target.kind === \"selection-required\") {\n if (displayState === \"current\") {\n transitionCurrentIdentity(`${adapter.id}:${queryFingerprint}`, adapter.id);\n }\n return {\n state: {\n providerId: adapter.id,\n providerName,\n displayState,\n status: \"selection-required\",\n singularLabel: adapter.targets?.singularLabel ?? \"target\",\n pluralLabel: adapter.targets?.pluralLabel ?? \"targets\",\n choices: target.choices,\n },\n fingerprint: auth.fingerprint,\n rememberedTargetId: expectedTargetId,\n };\n }\n queryFingerprint = adapter.targets ? `${auth.fingerprint}:target:${target.targetId ?? \"none\"}` : auth.fingerprint;\n failureKey = `${adapter.id}:${queryFingerprint}`;\n if (displayState === \"current\") {\n transitionCurrentIdentity(`${adapter.id}:${queryFingerprint}`, adapter.id);\n }\n const cached = !force ? cache.get(adapter.id, queryFingerprint) : undefined;\n if (cached) {\n return {\n state: {\n providerId: adapter.id,\n providerName,\n displayState,\n status: \"ready\",\n report: cached,\n },\n fingerprint: auth.fingerprint,\n rememberedTargetId: expectedTargetId,\n };\n }\n const previousFailure = failureBackoff.get(failureKey);\n if (!force && previousFailure && previousFailure.until > Date.now()) {\n return {\n state: {\n providerId: adapter.id,\n providerName,\n displayState,\n status: \"query-failed\",\n message: previousFailure.message,\n },\n fingerprint: auth.fingerprint,\n rememberedTargetId: expectedTargetId,\n };\n }\n failureBackoff.delete(failureKey);\n querySequence += 1;\n queryId = querySequence;\n setBoundedMap(latestQueries, failureKey, queryId, MAX_ACCOUNT_STATES);\n const report = await queryProviderUsage(\n adapter,\n auth,\n signal,\n Math.max(1, deadlineAt - Date.now()),\n requiresRequestBoundaryGuard ? guard : undefined,\n target.targetId,\n );\n if (requiresRequestBoundaryGuard) await guard();\n const effectiveReport = { ...report, providerName };\n if (latestQueries.get(failureKey) === queryId) {\n cache.set(adapter.id, queryFingerprint, effectiveReport);\n failureBackoff.delete(failureKey);\n }\n return {\n state: {\n providerId: adapter.id,\n providerName,\n displayState,\n status: \"ready\",\n report: effectiveReport,\n },\n fingerprint: auth.fingerprint,\n rememberedTargetId: expectedTargetId,\n };\n } catch (error) {\n if (isStaleExtensionContextError(error) || isAbortError(error)) throw error;\n if (\n retryableAuthChanged &&\n authRetry === 0 &&\n !signal.aborted &&\n !requestContextChanged() &&\n Date.now() < deadlineAt\n ) {\n if (queryId !== undefined && latestQueries.get(failureKey) === queryId) {\n latestQueries.delete(failureKey);\n }\n return queryAdapterState(ctx, adapter, displayState, true, signal, authRetry + 1, deadlineAt);\n }\n const message = errorMessage(error);\n const now = Date.now();\n for (const [key, failure] of failureBackoff) {\n if (failure.until <= now) failureBackoff.delete(key);\n }\n if (queryId === undefined || latestQueries.get(failureKey) === queryId) {\n if (adapter.invalidateCacheOnFailure) cache.delete(adapter.id, queryFingerprint);\n setBoundedMap(failureBackoff, failureKey, { until: now + FAILURE_BACKOFF_MS, message }, MAX_ACCOUNT_STATES);\n }\n return {\n state: {\n providerId: adapter.id,\n providerName,\n displayState,\n status: \"query-failed\",\n message,\n },\n fingerprint: auth.fingerprint,\n rememberedTargetId: expectedTargetId,\n };\n }\n };\n\n const loadTargetChoices = async (ctx: ExtensionContext, adapter: UsageProviderAdapter, signal: AbortSignal) => {\n if (!adapter.targets) throw new Error(\"Provider does not support usage targets.\");\n const expectedSessionGeneration = sessionGeneration;\n const expectedSessionId = ctx.sessionManager.getSessionId();\n const expectedModel = modelIdentity(ctx.model);\n const expectedTargetId = settingsRuntime.get().settings.selectedTargets[adapter.id];\n const deadlineAt = Date.now() + DEFAULT_TIMEOUT_MS;\n const changed = () =>\n expectedSessionGeneration !== sessionGeneration ||\n ctx.sessionManager.getSessionId() !== expectedSessionId ||\n modelIdentity(ctx.model) !== expectedModel ||\n settingsRuntime.get().settings.selectedTargets[adapter.id] !== expectedTargetId;\n const auth = await awaitWithDeadline(\n resolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n signal,\n Math.max(1, deadlineAt - Date.now()),\n `resolving ${providerDisplayName(ctx, adapter.id)} runtime auth`,\n );\n if (!auth || signal.aborted || changed()) throw abortError();\n const guard = async () => {\n if (signal.aborted || changed()) throw abortError();\n const revalidated = await awaitWithDeadline(\n resolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n signal,\n Math.max(1, deadlineAt - Date.now()),\n `revalidating ${providerDisplayName(ctx, adapter.id)} runtime auth`,\n );\n if (signal.aborted || changed() || revalidated?.fingerprint !== auth.fingerprint) {\n throw abortError();\n }\n };\n const choices = await listUsageTargets(adapter, auth, signal, Math.max(1, deadlineAt - Date.now()), guard);\n return { choices, fingerprint: auth.fingerprint };\n };\n\n const queryCurrentState = async (\n ctx: ExtensionContext,\n model: PiModel | undefined,\n force: boolean,\n signal: AbortSignal,\n ): Promise<QueryOutcome> => {\n const adapter = adapterForProvider(model?.provider);\n if (!adapter) {\n const providerId = model?.provider ?? \"none\";\n transitionCurrentIdentity(`unsupported:${providerId}`, providerId);\n return {\n state: {\n providerId,\n providerName: providerDisplayName(ctx, providerId),\n displayState: \"current\",\n status: \"unsupported\",\n message: model\n ? `Usage reporting is not supported for ${providerDisplayName(ctx, providerId)}.`\n : \"No model is selected.\",\n },\n };\n }\n return queryAdapterState(ctx, adapter, \"current\", force, signal);\n };\n\n const refreshCurrentStatus = async (ctx: ExtensionContext, model: PiModel | undefined, force: boolean) => {\n const adapter = adapterForProvider(model?.provider);\n if (!adapter || !model) {\n const providerId = model?.provider ?? \"none\";\n transitionCurrentIdentity(`unsupported:${providerId}`, providerId);\n clearStatus(ctx);\n return;\n }\n if (adapter.publishesStatusline === false) {\n clearStatus(ctx);\n return;\n }\n statusGeneration += 1;\n const generation = statusGeneration;\n clearStatusCountdownTimer();\n statusController?.abort();\n const controller = new AbortController();\n statusController = controller;\n activeControllers.add(controller);\n try {\n if (!safeSetStatus(ctx, \"checking\")) return;\n const outcome = await queryCurrentState(ctx, model, force, controller.signal);\n if (!sessionActive || generation !== statusGeneration || controller.signal.aborted) return;\n if (!(await outcomeStillCurrent(ctx, model, generation, outcome, controller.signal))) {\n if (sessionActive && generation === statusGeneration) {\n queueMicrotask(() => startStatusRefresh(ctx, ctx.model, false));\n }\n return;\n }\n publishStatus(ctx, outcome, model, true);\n } finally {\n activeControllers.delete(controller);\n if (statusController === controller) statusController = undefined;\n }\n };\n\n const startStatusRefresh = (ctx: ExtensionContext, model: PiModel | undefined, force: boolean) => {\n void refreshCurrentStatus(ctx, model, force).catch((error) => {\n if (isStaleExtensionContextError(error) || isAbortError(error)) return;\n const message = errorMessage(error);\n console.error(\"[pi-usage] refresh failed:\", message);\n safeSetStatus(ctx, `usage err: ${message.slice(0, 50)}`);\n });\n };\n\n const runMenuOperation = async <T>(\n ctx: ExtensionCommandContext,\n label: string,\n parentSignal: AbortSignal,\n operation: (signal: AbortSignal) => Promise<T>,\n cancellable = true,\n ): Promise<T | undefined> => {\n const { runTask } = await import(\"@narumitw/pi-tui-kit\");\n if (parentSignal.aborted) return undefined;\n const result = await runTask(ctx, {\n label,\n signal: parentSignal,\n cancellable,\n onError: () => undefined,\n task: ({ signal }) => operation(signal),\n });\n switch (result.kind) {\n case \"completed\":\n return result.value;\n case \"cancelled\":\n case \"stale\":\n return undefined;\n case \"error\":\n throw result.error;\n }\n };\n\n const outcomeStillCurrent = async (\n ctx: ExtensionContext,\n model: PiModel | undefined,\n generation: number,\n outcome: QueryOutcome,\n signal: AbortSignal,\n ): Promise<boolean> => {\n if (generation !== statusGeneration || modelIdentity(ctx.model) !== modelIdentity(model)) {\n return false;\n }\n const adapter = adapterForProvider(model?.provider);\n const selectionStillCurrent =\n !adapter?.targets || settingsRuntime.get().settings.selectedTargets[adapter.id] === outcome.rememberedTargetId;\n if (!selectionStillCurrent) return false;\n if (outcome.authState === \"unavailable\") {\n if (!adapter) return false;\n try {\n const auth = await awaitWithDeadline(\n resolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n signal,\n DEFAULT_TIMEOUT_MS,\n `revalidating ${adapter.displayName} runtime auth`,\n );\n return (\n generation === statusGeneration &&\n modelIdentity(ctx.model) === modelIdentity(model) &&\n (!adapter.targets ||\n settingsRuntime.get().settings.selectedTargets[adapter.id] === outcome.rememberedTargetId) &&\n auth === undefined\n );\n } catch (error) {\n if (isAbortError(error) || isStaleExtensionContextError(error)) throw error;\n return false;\n }\n }\n if (!outcome.fingerprint) return true;\n if (!adapter) return false;\n try {\n const auth = await awaitWithDeadline(\n resolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n signal,\n DEFAULT_TIMEOUT_MS,\n `revalidating ${adapter.displayName} runtime auth`,\n );\n return (\n generation === statusGeneration &&\n modelIdentity(ctx.model) === modelIdentity(model) &&\n (!adapter.targets ||\n settingsRuntime.get().settings.selectedTargets[adapter.id] === outcome.rememberedTargetId) &&\n auth?.fingerprint === outcome.fingerprint\n );\n } catch (error) {\n if (isAbortError(error) || isStaleExtensionContextError(error)) throw error;\n return false;\n }\n };\n\n const queryStableCurrent = async (\n ctx: ExtensionCommandContext,\n force: boolean,\n controller: AbortController,\n label: string,\n ): Promise<StableCurrent | undefined> => {\n for (let attempt = 0; attempt < 3; attempt += 1) {\n const model = ctx.model;\n const generation = statusGeneration;\n const result = await runMenuOperation(ctx, label, controller.signal, async (signal) => {\n const outcome = await queryCurrentState(ctx, model, force, signal);\n return {\n outcome,\n stable: await outcomeStillCurrent(ctx, model, generation, outcome, signal),\n };\n });\n if (!result) return undefined;\n if (result.stable) return { outcome: result.outcome, model };\n force = false;\n }\n ctx.ui.notify(\"The active model or account kept changing; reopen /usage to retry.\", \"warning\");\n return undefined;\n };\n\n const publishStableCurrent = (ctx: ExtensionCommandContext, current: StableCurrent) => {\n if (current.model) publishStatus(ctx, current.outcome, current.model, sessionActive);\n else safeSetStatus(ctx, undefined);\n };\n\n const showMenu = async (ctx: ExtensionCommandContext): Promise<void> => {\n if (!ctx.hasUI) throw new Error(\"/usage requires TUI or RPC mode.\");\n statusGeneration += 1;\n const menuGeneration = statusGeneration;\n statusController?.abort();\n statusController = undefined;\n clearStatusTimers();\n const controller = new AbortController();\n activeControllers.add(controller);\n try {\n let stableCurrent = await queryStableCurrent(ctx, false, controller, \"Checking current usage\u2026\");\n if (!stableCurrent) return;\n publishStableCurrent(ctx, stableCurrent);\n let current = stableCurrent.outcome;\n let visibleStates: ProviderUsageState[] = [current.state];\n let fastState = settingsRuntime.get();\n let resetAvailability: CodexResetAvailability | undefined;\n let selectedReset: CodexResetOption | undefined;\n let resetAuthFingerprint: string | undefined;\n let resetModelIdentity: string | undefined;\n let redemptionId: string | undefined;\n let resetOutcome: CodexResetOutcome | undefined;\n let resetFailure: string | undefined;\n const actionableTargetState = (): ProviderUsageState | undefined => {\n if (visibleStates.length !== 1) return undefined;\n const state = visibleStates[0];\n return state &&\n (state.status === \"ready\" || state.status === \"selection-required\") &&\n adapterForProvider(state.providerId)?.targets\n ? state\n : undefined;\n };\n const promptForTarget = async (state: ProviderUsageState, stateFingerprint?: string): Promise<boolean> => {\n const adapter = adapterForProvider(state.providerId);\n if (!adapter?.targets) return false;\n const expectedRememberedTargetId = settingsRuntime.get().settings.selectedTargets[adapter.id];\n const snapshot =\n state.status === \"selection-required\" && stateFingerprint\n ? { choices: state.choices, fingerprint: stateFingerprint }\n : await runMenuOperation(ctx, `Loading ${adapter.targets.pluralLabel}\u2026`, controller.signal, (signal) =>\n loadTargetChoices(ctx, adapter, signal),\n );\n if (!snapshot || controller.signal.aborted || statusGeneration !== menuGeneration) {\n return false;\n }\n const selectOptions = createUsageTargetSelectOptions(snapshot.choices);\n const selected = await ctx.ui.select(\n `Select ${adapter.targets.singularLabel} for ${providerDisplayName(ctx, adapter.id)}`,\n [...selectOptions.options],\n { signal: controller.signal },\n );\n if (\n selected === undefined ||\n controller.signal.aborted ||\n statusGeneration !== menuGeneration ||\n settingsRuntime.get().settings.selectedTargets[adapter.id] !== expectedRememberedTargetId\n ) {\n return false;\n }\n const targetId = selectOptions.targetIdFor(selected);\n if (!targetId) return false;\n const revalidated = await runMenuOperation(\n ctx,\n `Revalidating ${adapter.targets.singularLabel}\u2026`,\n controller.signal,\n (signal) => loadTargetChoices(ctx, adapter, signal),\n );\n if (\n !revalidated ||\n controller.signal.aborted ||\n statusGeneration !== menuGeneration ||\n settingsRuntime.get().settings.selectedTargets[adapter.id] !== expectedRememberedTargetId\n ) {\n return false;\n }\n if (\n revalidated.fingerprint !== snapshot.fingerprint ||\n !revalidated.choices.some((choice) => choice.id === targetId)\n ) {\n ctx.ui.notify(\n `${providerDisplayName(ctx, adapter.id)} ${adapter.targets.pluralLabel} changed; choose again.`,\n \"warning\",\n );\n return false;\n }\n let saved: Readonly<UsageSettingsState> | undefined;\n try {\n saved = await runMenuOperation(ctx, `Saving ${adapter.targets.singularLabel}\u2026`, controller.signal, (signal) =>\n settingsRuntime.updateSelectedTarget(adapter.id, targetId, signal, async () => {\n let published: Awaited<ReturnType<typeof loadTargetChoices>>;\n try {\n published = await loadTargetChoices(ctx, adapter, signal);\n } catch (error) {\n if (\n signal.aborted ||\n controller.signal.aborted ||\n statusGeneration !== menuGeneration ||\n isStaleExtensionContextError(error)\n ) {\n throw error;\n }\n throw new UsageTargetSelectionChangedError();\n }\n if (\n published.fingerprint !== snapshot.fingerprint ||\n !published.choices.some((choice) => choice.id === targetId)\n ) {\n throw new UsageTargetSelectionChangedError();\n }\n }),\n );\n } catch (error) {\n if (error instanceof UsageTargetSelectionChangedError) {\n ctx.ui.notify(\n `${providerDisplayName(ctx, adapter.id)} ${adapter.targets.pluralLabel} changed; choose again.`,\n \"warning\",\n );\n return false;\n }\n throw error;\n }\n if (!saved || controller.signal.aborted || statusGeneration !== menuGeneration) {\n return false;\n }\n invalidateProviderState(adapter.id);\n return true;\n };\n const { defineMenu, runMenu } = await import(\"@narumitw/pi-tui-kit\");\n if (controller.signal.aborted || statusGeneration !== menuGeneration) return;\n type Screen = \"main\" | \"providers\" | \"reset-picker\" | \"reset-confirm\" | \"reset-result\" | \"reset-error\";\n type Action =\n | \"refresh\"\n | \"settings\"\n | \"target\"\n | \"toggle-fast\"\n | \"another\"\n | \"all\"\n | \"provider\"\n | \"open-resets\"\n | \"select-reset\"\n | \"cancel-reset\"\n | \"consume-reset\"\n | \"back-to-usage\"\n | \"back-to-resets\";\n const menu = defineMenu<undefined, Screen, Action, ExtensionCommandContext>({\n start: \"main\",\n screens: {\n main: () => {\n const fastAvailability = fastRuntime.availability(ctx.model);\n const targetState = actionableTargetState();\n const targetAdapter = adapterForProvider(targetState?.providerId);\n const fastLines =\n fastAvailability.kind === \"available\"\n ? [`Fast mode: ${fastAvailability.enabled ? \"On\" : \"Off\"}`, FAST_USAGE_WARNING]\n : fastAvailability.kind === \"unavailable\"\n ? [`Fast mode: Unavailable \u00B7 ${fastAvailability.reason}`]\n : [];\n return {\n kind: \"actions\",\n title: \"Provider usage\",\n lines: [...formatProviderStates(visibleStates).split(\"\\n\"), ...fastLines],\n items: [\n { id: \"refresh\", label: REFRESH_CURRENT, action: \"refresh\" },\n { id: \"settings\", label: SETTINGS, action: \"settings\" },\n ...(targetState && targetAdapter?.targets\n ? [\n {\n id: \"target\",\n label: `${targetState.status === \"selection-required\" ? \"Select\" : \"Change\"} ${targetAdapter.targets.singularLabel}\u2026`,\n action: \"target\" as const,\n },\n ]\n : []),\n ...(fastAvailability.kind === \"available\"\n ? [\n {\n id: \"toggle-fast\",\n label: fastAvailability.enabled ? \"Turn Fast mode off\" : \"Turn Fast mode on\",\n description:\n fastState.kind === \"invalid\"\n ? \"Repair pi-usage.json and reload before changing Fast mode.\"\n : FAST_USAGE_WARNING,\n disabled: fastState.kind === \"invalid\",\n action: \"toggle-fast\" as const,\n },\n ]\n : []),\n ...(current.state.status === \"ready\" && current.state.providerId === \"openai-codex\"\n ? [\n {\n id: \"open-resets\",\n label: REDEEM_CODEX_RESET,\n description: codexResetActionDescription(current.state.report),\n disabled: codexResetCount(current.state.report) === 0,\n action: \"open-resets\" as const,\n },\n ]\n : []),\n { id: \"another\", label: VIEW_ANOTHER, action: \"another\" },\n { id: \"all\", label: VIEW_ALL, action: \"all\" },\n { id: \"close\", label: CLOSE, close: true },\n ],\n hint: \"close\",\n };\n },\n providers: () => ({\n kind: \"actions\",\n title: \"Select a configured provider\",\n items: configuredAdapters(ctx)\n .filter((adapter) => adapter.id !== ctx.model?.provider)\n .map((adapter) => ({\n id: adapter.id,\n label: providerDisplayName(ctx, adapter.id),\n action: \"provider\" as const,\n })),\n hint: \"back\",\n }),\n \"reset-picker\": () => ({\n kind: \"choice\",\n title: \"Usage limit resets\",\n lines: [\n `${resetAvailability?.availableCount ?? 0} ${resetLabel(resetAvailability?.availableCount ?? 0)} available.`,\n ],\n items: (resetAvailability?.options ?? []).map((option, index) => ({\n id: `reset-${index}`,\n label: option.title,\n description: resetOptionExpiration(option),\n details: [option.description],\n })),\n action: \"select-reset\",\n initialItemId: \"reset-0\",\n hint: \"back\",\n }),\n \"reset-confirm\": () => ({\n kind: \"actions\",\n title: \"Use this reset?\",\n lines: resetConfirmationLines(selectedReset),\n items: [\n { id: \"cancel-reset\", label: \"No, go back\", action: \"cancel-reset\" },\n { id: \"consume-reset\", label: \"Yes, use reset\", action: \"consume-reset\" },\n ],\n hint: \"back\",\n }),\n \"reset-result\": () => ({\n kind: \"actions\",\n title: \"Usage limit resets\",\n lines: [\n formatCodexResetOutcome(\n resetOutcome,\n current.state.status === \"ready\" ? codexResetCount(current.state.report) : undefined,\n ),\n ],\n items: [\n {\n id: \"back-to-usage\",\n label: \"Back to usage\",\n action: \"back-to-usage\",\n },\n { id: \"close\", label: CLOSE, close: true },\n ],\n hint: \"back\",\n }),\n \"reset-error\": () => ({\n kind: \"actions\",\n title: \"Usage limit resets\",\n lines: [resetFailure ?? \"Couldn't reset usage. Please try again.\"],\n items: [\n { id: \"consume-reset\", label: \"Try again\", action: \"consume-reset\" },\n { id: \"back-to-resets\", label: \"Back\", action: \"back-to-resets\" },\n ],\n hint: \"back\",\n }),\n },\n actions: {\n target: async () => {\n const targetState = actionableTargetState();\n if (!targetState) return { kind: \"rejected\" };\n try {\n const stateFingerprint = targetState === current.state ? current.fingerprint : undefined;\n if (!(await promptForTarget(targetState, stateFingerprint))) {\n return { kind: \"stay\" };\n }\n const adapter = adapterForProvider(targetState.providerId);\n if (!adapter) return { kind: \"rejected\" };\n if (targetState.providerId === ctx.model?.provider) {\n const refreshed = await queryStableCurrent(\n ctx,\n true,\n controller,\n `Checking ${providerDisplayName(ctx, adapter.id)} usage\u2026`,\n );\n if (!refreshed) return { kind: \"stay\" };\n stableCurrent = refreshed;\n current = refreshed.outcome;\n visibleStates = [current.state];\n publishStableCurrent(ctx, refreshed);\n return { kind: \"stay\" };\n }\n const outcome = await runMenuOperation(\n ctx,\n `Checking ${providerDisplayName(ctx, adapter.id)} usage\u2026`,\n controller.signal,\n (signal) => queryAdapterState(ctx, adapter, \"configured\", true, signal),\n );\n if (!outcome) return { kind: \"stay\" };\n const revalidated = await queryStableCurrent(ctx, false, controller, \"Revalidating current usage\u2026\");\n if (!revalidated) return { kind: \"stay\" };\n stableCurrent = revalidated;\n current = revalidated.outcome;\n visibleStates = [\n outcome.state.providerId === current.state.providerId\n ? current.state\n : { ...outcome.state, displayState: \"configured\" },\n ];\n return { kind: \"stay\" };\n } catch (error) {\n if (isAbortError(error) || isStaleExtensionContextError(error)) {\n return { kind: \"stay\" };\n }\n ctx.ui.notify(`Could not select target: ${errorMessage(error)}`, \"error\");\n return { kind: \"stay\" };\n }\n },\n settings: async () => {\n await showUsageSettings(\n ctx,\n settingsRuntime,\n controller.signal,\n () => statusGeneration === menuGeneration && !controller.signal.aborted,\n (id) => {\n if (\n id === \"codexStatusResetCountdown\" &&\n stableCurrent &&\n statusGeneration === menuGeneration &&\n !controller.signal.aborted\n ) {\n publishStableCurrent(ctx, stableCurrent);\n }\n },\n );\n fastState = settingsRuntime.get();\n const revalidated = await queryStableCurrent(ctx, false, controller, \"Applying usage settings\u2026\");\n if (!revalidated) return { kind: \"stay\" };\n stableCurrent = revalidated;\n current = revalidated.outcome;\n visibleStates = [current.state];\n publishStableCurrent(ctx, revalidated);\n return { kind: \"stay\" };\n },\n \"toggle-fast\": async () => {\n const availability = fastRuntime.availability(ctx.model);\n if (availability.kind !== \"available\" || fastState.kind === \"invalid\") {\n return { kind: \"rejected\" };\n }\n const changed = await fastRuntime.toggle(ctx, !availability.enabled, controller.signal);\n if (!changed) return { kind: \"rejected\" };\n fastState = settingsRuntime.get();\n return { kind: \"stay\" };\n },\n \"open-resets\": async () => {\n const summaryCount =\n current.state.status === \"ready\" && current.state.providerId === \"openai-codex\"\n ? codexResetCount(current.state.report)\n : undefined;\n try {\n const loaded = await runMenuOperation(\n ctx,\n \"Checking usage limit resets\u2026\",\n controller.signal,\n async (signal) => {\n const expectedModel = modelIdentity(ctx.model);\n const auth = await awaitWithDeadline(\n resolveCodexResetAuth(ctx, undefined, credentialReader, credentialCandidates),\n signal,\n DEFAULT_TIMEOUT_MS,\n \"resolving current Codex reset authentication\",\n );\n let availability: CodexResetAvailability;\n try {\n availability = await listCodexResetCredits(auth, signal, DEFAULT_TIMEOUT_MS);\n } catch (error) {\n if (isAbortError(error) || summaryCount === undefined || summaryCount <= 0) {\n throw error;\n }\n availability = {\n availableCount: summaryCount,\n options: [genericCodexResetOption()],\n };\n }\n const revalidated = await awaitWithDeadline(\n resolveCodexResetAuth(ctx, undefined, credentialReader, credentialCandidates),\n signal,\n DEFAULT_TIMEOUT_MS,\n \"revalidating current Codex reset authentication\",\n );\n if (modelIdentity(ctx.model) !== expectedModel || revalidated.fingerprint !== auth.fingerprint) {\n throw new Error(\"The active Codex model or account changed while loading usage limit resets.\");\n }\n return { availability, auth, expectedModel };\n },\n );\n if (!loaded) return { kind: \"stay\" };\n resetAvailability = loaded.availability;\n resetAuthFingerprint = loaded.auth.fingerprint;\n resetModelIdentity = loaded.expectedModel;\n selectedReset = undefined;\n redemptionId = undefined;\n resetOutcome = undefined;\n resetFailure = undefined;\n return {\n kind: \"to\",\n screen: loaded.availability.availableCount > 0 ? \"reset-picker\" : \"reset-result\",\n };\n } catch (error) {\n if (isAbortError(error) || isStaleExtensionContextError(error)) {\n return { kind: \"stay\" };\n }\n ctx.ui.notify(`Couldn't load usage limit resets: ${errorMessage(error)}`, \"error\");\n return { kind: \"stay\" };\n }\n },\n \"select-reset\": ({ itemId }) => {\n const index = Number(itemId.replace(/^reset-/u, \"\"));\n const option = Number.isSafeInteger(index) ? resetAvailability?.options[index] : undefined;\n if (!option) return { kind: \"rejected\" };\n selectedReset = option;\n redemptionId = undefined;\n resetFailure = undefined;\n return { kind: \"to\", screen: \"reset-confirm\" };\n },\n \"cancel-reset\": () => ({ kind: \"back\" }),\n \"consume-reset\": async () => {\n if (!selectedReset || !resetAuthFingerprint || !resetModelIdentity) {\n return { kind: \"rejected\" };\n }\n try {\n redemptionId ??= createRedemptionId();\n const attemptId = redemptionId;\n const option = selectedReset;\n const expectedFingerprint = resetAuthFingerprint;\n const expectedModel = resetModelIdentity;\n const result = await runMenuOperation(\n ctx,\n \"Resetting your usage\u2026\",\n controller.signal,\n async (signal) => {\n const auth = await awaitWithDeadline(\n resolveCodexResetAuth(ctx, undefined, credentialReader, credentialCandidates),\n signal,\n DEFAULT_TIMEOUT_MS,\n \"revalidating current Codex reset authentication\",\n );\n if (modelIdentity(ctx.model) !== expectedModel || auth.fingerprint !== expectedFingerprint) {\n throw new Error(\"The active Codex model or account changed; the reset was not used.\");\n }\n const outcome = await consumeCodexResetCredit(auth, option, attemptId, signal, DEFAULT_TIMEOUT_MS);\n invalidateProviderState(\"openai-codex\");\n const model = ctx.model;\n if (modelIdentity(model) !== expectedModel) return { outcome };\n const refreshed = await queryCurrentState(ctx, model, true, signal);\n const stable = await outcomeStillCurrent(ctx, model, menuGeneration, refreshed, signal);\n return stable ? { outcome, refreshed, model } : { outcome };\n },\n false,\n );\n if (!result) return { kind: \"close\" };\n resetOutcome = result.outcome;\n resetFailure = undefined;\n if (result.refreshed && result.model) {\n stableCurrent = { outcome: result.refreshed, model: result.model };\n current = result.refreshed;\n visibleStates = [current.state];\n publishStableCurrent(ctx, stableCurrent);\n }\n return { kind: \"to\", screen: \"reset-result\" };\n } catch (error) {\n if (isAbortError(error) || isStaleExtensionContextError(error)) {\n return { kind: \"close\" };\n }\n resetFailure = `Couldn't reset usage: ${errorMessage(error)}. Try again with the same request.`;\n return { kind: \"to\", screen: \"reset-error\" };\n }\n },\n \"back-to-usage\": () => ({ kind: \"to\", screen: \"main\" }),\n \"back-to-resets\": () => {\n redemptionId = undefined;\n resetFailure = undefined;\n return { kind: \"to\", screen: \"reset-picker\" };\n },\n refresh: async () => {\n const refreshed = await queryStableCurrent(ctx, true, controller, \"Refreshing current usage\u2026\");\n if (!refreshed) return { kind: \"stay\" };\n stableCurrent = refreshed;\n publishStableCurrent(ctx, refreshed);\n current = refreshed.outcome;\n visibleStates = [current.state];\n return { kind: \"stay\" };\n },\n another: async () => {\n const others = configuredAdapters(ctx).filter((adapter) => adapter.id !== ctx.model?.provider);\n if (others.length === 0) {\n ctx.ui.notify(\"No other supported provider has configured runtime auth.\", \"info\");\n return { kind: \"stay\" };\n }\n return { kind: \"to\", screen: \"providers\" };\n },\n provider: async ({ itemId }) => {\n const adapter = configuredAdapters(ctx).find(\n (candidate) => candidate.id === itemId && candidate.id !== ctx.model?.provider,\n );\n if (!adapter) return { kind: \"back\" };\n let outcome = await runMenuOperation(\n ctx,\n `Checking ${providerDisplayName(ctx, adapter.id)} usage\u2026`,\n controller.signal,\n (signal) => queryAdapterState(ctx, adapter, \"configured\", false, signal),\n );\n if (!outcome) return { kind: \"back\" };\n if (outcome.state.status === \"selection-required\") {\n if (!(await promptForTarget(outcome.state, outcome.fingerprint))) {\n return { kind: \"back\" };\n }\n outcome = await runMenuOperation(\n ctx,\n `Checking ${providerDisplayName(ctx, adapter.id)} usage\u2026`,\n controller.signal,\n (signal) => queryAdapterState(ctx, adapter, \"configured\", true, signal),\n );\n if (!outcome) return { kind: \"back\" };\n }\n const revalidated = await queryStableCurrent(ctx, false, controller, \"Revalidating current usage\u2026\");\n if (!revalidated) return { kind: \"back\" };\n stableCurrent = revalidated;\n current = revalidated.outcome;\n visibleStates = [\n outcome.state.providerId === current.state.providerId\n ? current.state\n : { ...outcome.state, displayState: \"configured\" },\n ];\n return { kind: \"back\" };\n },\n all: async () => {\n const adapters = configuredAdapters(ctx);\n const currentProviderId = ctx.model?.provider;\n const settled = await runMenuOperation(\n ctx,\n \"Checking configured provider usage\u2026\",\n controller.signal,\n (signal) =>\n runWithConcurrency(\n adapters,\n ALL_PROVIDER_CONCURRENCY,\n (adapter, _index, workerSignal) =>\n queryAdapterState(\n ctx,\n adapter,\n adapter.id === currentProviderId ? \"current\" : \"configured\",\n true,\n workerSignal,\n ),\n signal,\n ),\n );\n if (!settled) return { kind: \"stay\" };\n const queriedStates: ProviderUsageState[] = settled.map((result, index) => {\n if (result.status === \"fulfilled\") {\n return { ...result.value.state, displayState: \"configured\" };\n }\n const adapter = adapters[index] as UsageProviderAdapter;\n return {\n providerId: adapter.id,\n providerName: providerDisplayName(ctx, adapter.id),\n displayState: \"configured\",\n status: \"query-failed\",\n message: errorMessage(result.reason),\n };\n });\n const revalidated = await queryStableCurrent(ctx, false, controller, \"Revalidating current usage\u2026\");\n if (!revalidated) return { kind: \"stay\" };\n stableCurrent = revalidated;\n current = revalidated.outcome;\n visibleStates = [\n current.state,\n ...queriedStates.filter((state) => state.providerId !== current.state.providerId),\n ];\n return { kind: \"stay\" };\n },\n },\n });\n await runMenu(ctx, menu, {\n getState: () => undefined,\n signal: controller.signal,\n isCurrent: () => statusGeneration === menuGeneration && !controller.signal.aborted,\n });\n } finally {\n controller.abort(new DOMException(\"Usage menu closed\", \"AbortError\"));\n activeControllers.delete(controller);\n }\n };\n\n pi.registerCommand(\"usage\", {\n description: \"Show usage for the current runtime account\",\n handler: async (args, ctx) => {\n if (args.trim()) {\n ctx.ui.notify(\"/usage does not accept arguments; choose an action from its menu.\", \"warning\");\n return;\n }\n try {\n await showMenu(ctx);\n } catch (error) {\n if (isStaleExtensionContextError(error) || isAbortError(error)) return;\n throw error;\n }\n },\n });\n pi.on(\"session_start\", async (_event, ctx) => {\n sessionGeneration += 1;\n statusGeneration += 1;\n clearStatusTimers();\n for (const controller of activeControllers) controller.abort();\n activeControllers.clear();\n statusController = undefined;\n sessionActive = true;\n const ownerGeneration = sessionGeneration;\n try {\n await fastRuntime.prepareSession(ctx);\n } catch (error) {\n if (isStaleExtensionContextError(error) || ownerGeneration !== sessionGeneration) return;\n throw error;\n }\n });\n pi.on(\"session_tree\", (_event, ctx) => {\n startStatusRefresh(ctx, ctx.model, false);\n });\n pi.on(\"model_select\", (event, ctx) => {\n startStatusRefresh(ctx, event.model, false);\n });\n pi.on(\"turn_start\", (_event, ctx) => {\n startStatusRefresh(ctx, ctx.model, false);\n });\n pi.on(\"session_shutdown\", (_event, ctx) => {\n sessionActive = false;\n sessionGeneration += 1;\n statusGeneration += 1;\n clearStatusTimers();\n for (const controller of activeControllers) controller.abort();\n activeControllers.clear();\n statusController = undefined;\n cache.clear();\n failureBackoff.clear();\n latestQueries.clear();\n activeCurrentIdentity = undefined;\n safeSetStatus(ctx, undefined);\n });\n\n fastRuntime = registerCodexFastMode(pi, settingsRuntime, (ctx) => startStatusRefresh(ctx, ctx.model, false), {\n registerSessionStart: false,\n });\n}\n", "import type { ExtensionAPI, ExtensionCommandContext, ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport {\n codexFastAvailability,\n codexFastIsEffective,\n codexFastStatusLabel,\n correctCodexFastMessageCost,\n rewriteCodexFastPayload,\n} from \"./codex-fast.js\";\nimport { errorMessage } from \"./core.js\";\nimport { isStaleExtensionContextError } from \"./query.js\";\nimport type { UsageSettingsRuntime, UsageSettingsState } from \"./settings.js\";\nimport type { PiModel } from \"./types.js\";\n\nconst NO_FAST_REQUEST = Symbol(\"no-fast-request\");\ntype PendingFastRequest = { fastRequested: boolean; model: PiModel };\n\nexport const FAST_USAGE_WARNING = \"Fast is about 1.5\u00D7 faster and uses more of your plan allowance.\";\n\nexport function registerCodexFastMode(\n pi: ExtensionAPI,\n settingsRuntime: UsageSettingsRuntime,\n refreshStatus: (ctx: ExtensionContext) => void,\n options: { registerSessionStart?: boolean } = {},\n) {\n let sessionController = new AbortController();\n let generation = 0;\n const pendingFastRequests = new Map<string, PendingFastRequest>();\n\n const toggle = async (\n ctx: ExtensionCommandContext,\n enabled: boolean,\n callerSignal?: AbortSignal,\n ): Promise<boolean> => {\n const ownerGeneration = generation;\n const sessionId = ctx.sessionManager.getSessionId();\n const signal = callerSignal ? AbortSignal.any([callerSignal, sessionController.signal]) : sessionController.signal;\n try {\n await settingsRuntime.update({ codexFastMode: enabled }, signal);\n } catch (error) {\n if (isAbortError(error) || isStaleExtensionContextError(error)) return false;\n ctx.ui.notify(`Could not save pi-usage.json: ${errorMessage(error)}`, \"error\");\n return false;\n }\n if (signal.aborted || ownerGeneration !== generation || ctx.sessionManager.getSessionId() !== sessionId) {\n return false;\n }\n refreshStatus(ctx);\n ctx.ui.notify(\n enabled\n ? `Codex Fast mode enabled. ${FAST_USAGE_WARNING}`\n : \"Codex Fast mode disabled; standard routing will be used.\",\n \"info\",\n );\n return true;\n };\n\n pi.registerCommand(\"fast\", {\n description: \"Toggle Codex Fast mode\",\n handler: async (args, ctx) => {\n if (args.trim()) {\n if (!ctx.hasUI) throw new Error(\"/fast does not accept arguments.\");\n ctx.ui.notify(\"/fast does not accept arguments.\", \"warning\");\n return;\n }\n if (!ctx.hasUI) throw new Error(\"/fast requires TUI or RPC mode.\");\n const availability = codexFastAvailability(ctx.model, settingsRuntime.get().settings.codexFastMode);\n if (availability.kind === \"not-codex\") {\n ctx.ui.notify(\"/fast is available only for the active OpenAI Codex model.\", \"warning\");\n return;\n }\n if (availability.kind === \"unavailable\") {\n ctx.ui.notify(availability.reason, \"warning\");\n return;\n }\n if (settingsRuntime.get().kind === \"invalid\") {\n ctx.ui.notify(\"pi-usage.json is invalid; repair it and run /reload before changing Fast mode.\", \"error\");\n return;\n }\n await toggle(ctx, !availability.enabled);\n },\n });\n\n const prepareSession = (ctx: ExtensionContext): Promise<void> => {\n const sessionId = ctx.sessionManager.getSessionId();\n generation += 1;\n sessionController.abort();\n pendingFastRequests.clear();\n sessionController = new AbortController();\n const ownerGeneration = generation;\n return (async () => {\n let state: Readonly<UsageSettingsState>;\n try {\n state = await settingsRuntime.reload(sessionController.signal);\n } catch (error) {\n if (sessionController.signal.aborted || ownerGeneration !== generation) return;\n if (ctx.hasUI) {\n ctx.ui.notify(`Could not load pi-usage.json; using defaults. ${errorMessage(error)}`, \"warning\");\n }\n return;\n }\n if (\n sessionController.signal.aborted ||\n ownerGeneration !== generation ||\n ctx.sessionManager.getSessionId() !== sessionId\n ) {\n return;\n }\n if (ctx.hasUI && state.kind === \"invalid\") {\n ctx.ui.notify(`Invalid pi-usage.json; using defaults without overwriting it. ${state.issue}`, \"warning\");\n }\n refreshStatus(ctx);\n })();\n };\n\n if (options.registerSessionStart !== false) {\n pi.on(\"session_start\", async (_event, ctx) => prepareSession(ctx));\n }\n\n pi.on(\"before_provider_request\", (event, ctx) => {\n const rewritten = rewriteCodexFastPayload(event.payload, ctx.model, settingsRuntime.get().settings.codexFastMode);\n const key = activeRequestKey(ctx);\n if (key && ctx.model) {\n pendingFastRequests.set(key, {\n fastRequested: isRecord(rewritten) && rewritten.service_tier === \"priority\",\n model: ctx.model,\n });\n }\n return rewritten;\n });\n pi.on(\"message_end\", (event, ctx) => {\n const request = consumeFastRequest(ctx, event.message, pendingFastRequests);\n if (request === NO_FAST_REQUEST) return undefined;\n const message = correctCodexFastMessageCost(event.message, request.model, request.fastRequested);\n return message ? { message: message as never } : undefined;\n });\n pi.on(\"session_shutdown\", async () => {\n generation += 1;\n sessionController.abort();\n pendingFastRequests.clear();\n await settingsRuntime.flush();\n });\n\n return {\n prepareSession,\n availability(model: PiModel | undefined) {\n return codexFastAvailability(model, settingsRuntime.get().settings.codexFastMode);\n },\n decorateStatus(model: PiModel | undefined, status: string) {\n return codexFastStatusLabel(status, codexFastIsEffective(model, settingsRuntime.get().settings.codexFastMode));\n },\n toggle,\n };\n}\n\nfunction activeRequestKey(ctx: ExtensionContext): string | undefined {\n const model = ctx.model;\n return model ? `${ctx.sessionManager.getSessionId()}:${model.provider}/${model.id}` : undefined;\n}\n\nfunction consumeFastRequest(\n ctx: ExtensionContext,\n message: unknown,\n pending: Map<string, PendingFastRequest>,\n): PendingFastRequest | typeof NO_FAST_REQUEST {\n if (!isRecord(message) || message.role !== \"assistant\") return NO_FAST_REQUEST;\n const key = messageRequestKey(ctx, message);\n if (!key) return NO_FAST_REQUEST;\n const request = pending.get(key);\n pending.delete(key);\n return request ?? NO_FAST_REQUEST;\n}\n\nfunction messageRequestKey(ctx: ExtensionContext, message: Record<string, unknown>): string | undefined {\n if (typeof message.provider !== \"string\" || typeof message.model !== \"string\") return undefined;\n return `${ctx.sessionManager.getSessionId()}:${message.provider}/${message.model}`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === \"AbortError\";\n}\n", "import type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { sanitizeDisplayText } from \"./core.js\";\nimport { providerIsConfigured, usageAdapters } from \"./query.js\";\nimport type { PiModel, UsageProviderAdapter } from \"./types.js\";\n\nexport function configuredAdapters(ctx: ExtensionContext): UsageProviderAdapter[] {\n return usageAdapters().filter(\n (adapter) => adapter.id === ctx.model?.provider || providerIsConfigured(ctx, adapter.id),\n );\n}\n\nexport function providerDisplayName(ctx: ExtensionContext, providerId: string): string {\n try {\n return sanitizeDisplayText(ctx.modelRegistry.getProviderDisplayName(providerId), 80);\n } catch {\n return sanitizeDisplayText(providerId, 80);\n }\n}\n\nexport function setBoundedMap<T>(map: Map<string, T>, key: string, value: T, limit: number): void {\n map.delete(key);\n while (map.size >= limit) {\n const oldest = map.keys().next().value;\n if (oldest === undefined) break;\n map.delete(oldest);\n }\n map.set(key, value);\n}\n\nexport function modelIdentity(model: PiModel | undefined): string | undefined {\n return model ? `${model.provider}/${model.id}` : undefined;\n}\n\nexport function isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === \"AbortError\";\n}\n\nexport function isTimeoutError(error: unknown): boolean {\n return error instanceof Error && error.name === \"TimeoutError\";\n}\n", "import { stripVTControlCharacters } from \"node:util\";\nimport { type ExtensionCommandContext, getSettingsListTheme } from \"@earendil-works/pi-coding-agent\";\nimport { Key, matchesKey, type SettingItem, SettingsList, Text } from \"@earendil-works/pi-tui\";\nimport { errorMessage } from \"./core.js\";\nimport type { UsageSettingsRuntime } from \"./settings.js\";\n\nconst OFF = \"Off\";\nconst ON = \"On\";\n\ntype UsageSettingId = \"codexFastMode\" | \"codexStatusResetCountdown\";\n\nexport async function showUsageSettings(\n ctx: ExtensionCommandContext,\n settingsRuntime: UsageSettingsRuntime,\n parentSignal: AbortSignal,\n isCurrent: () => boolean,\n onApplied: (id: UsageSettingId) => void,\n): Promise<boolean> {\n if (ctx.mode !== \"tui\") {\n if (ctx.hasUI) ctx.ui.notify(`Edit settings manually: ${settingsRuntime.get().path}`, \"info\");\n return false;\n }\n const { HorizontalRule, renderBoundedFrame } = await import(\"@narumitw/pi-tui-kit\");\n if (parentSignal.aborted || !isCurrent()) return false;\n return (\n (await ctx.ui.custom<boolean>((tui, theme, _keybindings, done) => {\n const localController = new AbortController();\n const signal = AbortSignal.any([parentSignal, localController.signal]);\n let changed = false;\n let closing = false;\n let saveQueue = Promise.resolve();\n const state = settingsRuntime.get();\n const items: SettingItem[] = [\n {\n id: \"codexFastMode\",\n label: \"Codex Fast mode\",\n description: \"Use faster Codex routing at increased plan allowance consumption.\",\n currentValue: state.settings.codexFastMode ? ON : OFF,\n values: [OFF, ON],\n },\n {\n id: \"codexStatusResetCountdown\",\n label: \"Codex reset countdown\",\n description: \"Show time remaining until each Codex usage limit resets.\",\n currentValue: state.settings.codexStatusResetCountdown ? ON : OFF,\n values: [OFF, ON],\n },\n ];\n const rule = new HorizontalRule({ ruleStyle: (text) => theme.fg(\"border\", text) });\n\n let settingsList: SettingsList;\n const cancel = () => {\n if (closing) return;\n closing = true;\n localController.abort();\n done(changed);\n };\n const queueUpdate = (id: UsageSettingId, requested: boolean, display: string) => {\n saveQueue = saveQueue.then(async () => {\n const previous = settingsRuntime.get().settings[id];\n if (settingsRuntime.get().kind === \"invalid\") {\n settingsList.updateValue(id, previous ? ON : OFF);\n if (!signal.aborted && isCurrent()) {\n ctx.ui.notify(\"Repair pi-usage.json and reload before changing settings.\", \"error\");\n tui.requestRender();\n }\n return;\n }\n try {\n await settingsRuntime.update({ [id]: requested }, signal);\n } catch (error) {\n if (signal.aborted || !isCurrent()) return;\n settingsList.updateValue(id, previous ? ON : OFF);\n ctx.ui.notify(`Could not save pi-usage.json: ${errorMessage(error)}`, \"error\");\n tui.requestRender();\n return;\n }\n if (previous !== requested) {\n changed = true;\n onApplied(id);\n }\n if (signal.aborted || !isCurrent()) return;\n settingsList.updateValue(id, display);\n tui.requestRender();\n });\n };\n settingsList = new SettingsList(\n items,\n items.length + 2,\n getSettingsListTheme(),\n (id, value) => {\n if (closing || signal.aborted || !isCurrent()) return;\n queueUpdate(id as UsageSettingId, value !== OFF, value);\n },\n cancel,\n );\n\n parentSignal.addEventListener(\"abort\", cancel, { once: true });\n return {\n render(width: number) {\n // Compatibility: Kit puts the title directly below the top rule and keeps compact\n // rules when at least five rows fit; both replace the legacy wrapper layout.\n const title = new Text(theme.fg(\"accent\", theme.bold(\"pi-usage Settings\")), 1, 0).render(width);\n const content = settingsList.render(width);\n const focusedRow = content.findIndex((line) => /^[\u2192\u203A]\\s/u.test(stripVTControlCharacters(line)));\n const terminalRows = Number.isFinite(tui.terminal?.rows) ? Math.floor(tui.terminal.rows) : 24;\n const [ruleLine = \"\"] = rule.render(width);\n return renderBoundedFrame({\n width,\n maxRows: Math.max(1, terminalRows - 3),\n rule: ruleLine,\n title,\n content,\n priorityRows: focusedRow < 0 ? [] : [focusedRow],\n focusedRow,\n });\n },\n invalidate: () => settingsList.invalidate(),\n handleInput(data: string) {\n if (closing) return;\n if (matchesKey(data, Key.ctrl(\"c\"))) cancel();\n else settingsList.handleInput(data);\n tui.requestRender();\n },\n dispose() {\n localController.abort();\n parentSignal.removeEventListener(\"abort\", cancel);\n },\n };\n })) ?? false\n );\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { calculateCost, hasApi } from \"@earendil-works/pi-ai\";\nimport type { PiModel } from \"./types.js\";\n\nexport const CODEX_FAST_SERVICE_TIER = \"priority\";\nexport const CODEX_STANDARD_SERVICE_TIER = \"default\";\n\nexport const CODEX_FAST_MODEL_IDS: ReadonlySet<string> = new Set([\n \"gpt-5.5\",\n \"gpt-5.6-luna\",\n \"gpt-5.6-sol\",\n \"gpt-5.6-terra\",\n]);\n\nexport type CodexFastAvailability =\n | { kind: \"available\"; enabled: boolean }\n | { kind: \"not-codex\" }\n | { kind: \"unavailable\"; reason: string };\n\nexport function codexFastAvailability(model: PiModel | undefined, enabled: boolean): CodexFastAvailability {\n if (model?.provider !== \"openai-codex\") return { kind: \"not-codex\" };\n if (!isOfficialCodexModel(model)) {\n return {\n kind: \"unavailable\",\n reason: \"Fast mode requires the official OpenAI Codex Responses endpoint.\",\n };\n }\n if (!CODEX_FAST_MODEL_IDS.has(model.id)) {\n return {\n kind: \"unavailable\",\n reason: `${model.id} does not advertise Codex Fast support.`,\n };\n }\n return { kind: \"available\", enabled };\n}\n\nexport function codexFastIsEffective(model: PiModel | undefined, enabled: boolean): boolean {\n return codexFastAvailability(model, enabled).kind === \"available\" && enabled;\n}\n\nexport function codexFastRequestTier(\n model: PiModel | undefined,\n enabled: boolean,\n): typeof CODEX_FAST_SERVICE_TIER | typeof CODEX_STANDARD_SERVICE_TIER | undefined {\n if (!isOfficialCodexModel(model)) return undefined;\n return enabled && CODEX_FAST_MODEL_IDS.has(model.id) ? CODEX_FAST_SERVICE_TIER : CODEX_STANDARD_SERVICE_TIER;\n}\n\nexport function rewriteCodexFastPayload(\n payload: unknown,\n model: PiModel | undefined,\n enabled: boolean,\n): unknown | undefined {\n const serviceTier = codexFastRequestTier(model, enabled);\n if (!serviceTier || !isRecord(payload)) return undefined;\n return { ...payload, service_tier: serviceTier };\n}\n\nexport function correctCodexFastMessageCost(\n message: unknown,\n model: PiModel | undefined,\n fastRequested: boolean,\n): unknown | undefined {\n if (\n !codexFastIsEffective(model, fastRequested) ||\n !isRecord(message) ||\n message.role !== \"assistant\" ||\n message.provider !== model?.provider ||\n message.model !== model?.id\n ) {\n return undefined;\n }\n const usage = isRecord(message.usage) ? message.usage : undefined;\n const cost = usage && isRecord(usage.cost) ? usage.cost : undefined;\n if (!usage || !cost || !hasCompleteUsage(usage) || !isOfficialCodexModel(model)) return undefined;\n const correctedUsage = structuredClone(usage) as typeof usage;\n calculateCost(model, correctedUsage as never);\n const multiplier = model.id === \"gpt-5.5\" ? 2.5 : 2;\n const correctedCost = correctedUsage.cost as Record<string, number>;\n for (const key of [\"input\", \"output\", \"cacheRead\", \"cacheWrite\", \"total\"] as const) {\n correctedCost[key] *= multiplier;\n }\n if (costsEqual(cost, correctedCost)) return undefined;\n return { ...message, usage: correctedUsage };\n}\n\nexport function codexFastStatusLabel(status: string, enabled: boolean): string {\n if (!enabled || !/^codex(?:\\s|$)/u.test(status)) return status;\n return status === \"codex\" ? \"codex fast\" : `codex fast${status.slice(\"codex\".length)}`;\n}\n\nfunction isOfficialCodexModel(model: PiModel | undefined): model is PiModel & { api: \"openai-codex-responses\" } {\n if (model?.provider !== \"openai-codex\" || !hasApi(model, \"openai-codex-responses\")) {\n return false;\n }\n try {\n return new URL(model.baseUrl).origin === \"https://chatgpt.com\";\n } catch {\n return false;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasCompleteUsage(value: Record<string, unknown>): boolean {\n return [\"input\", \"output\", \"cacheRead\", \"cacheWrite\"].every(\n (key) => typeof value[key] === \"number\" && Number.isFinite(value[key]),\n );\n}\n\nfunction costsEqual(left: Record<string, unknown>, right: Record<string, number>): boolean {\n return [\"input\", \"output\", \"cacheRead\", \"cacheWrite\", \"total\"].every((key) => left[key] === right[key]);\n}\n", "import type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { readStoredCredential } from \"@earendil-works/pi-coding-agent\";\nimport { fingerprintResolvedAuth, sanitizeDisplayText } from \"./core.js\";\nimport { fallbackOAuthCredentialCandidates, type OAuthCredentialCandidateReader } from \"./oauth-credential-source.js\";\nimport { AUTH_FINGERPRINT_SALT, adapterForProvider, fetchProviderJson, resolveUsageAuth } from \"./query.js\";\nimport type { ResolvedUsageAuth, UsageReport } from \"./types.js\";\n\nconst CODEX_RESET_CREDITS_URL = \"https://chatgpt.com/backend-api/wham/rate-limit-reset-credits\";\nconst CODEX_RESET_CONSUME_URL = `${CODEX_RESET_CREDITS_URL}/consume`;\nconst MAX_RESET_OPTIONS = 32;\nconst MAX_CREDIT_ID_CHARS = 1_024;\n\ntype StoredCredentialReader = (providerId: string) => unknown;\n\nexport type CodexResetOutcomeCode = \"reset\" | \"nothing_to_reset\" | \"no_credit\" | \"already_redeemed\";\n\nexport interface CodexResetOption {\n creditId?: string;\n title: string;\n description: string;\n expiresAt?: number;\n}\n\nexport interface CodexResetAvailability {\n availableCount: number;\n options: CodexResetOption[];\n}\n\nexport interface CodexResetOutcome {\n code: CodexResetOutcomeCode;\n windowsReset: number;\n}\n\nexport function codexResetCount(report: UsageReport): number | undefined {\n const value = report.metrics.find((metric) => metric.id === \"reset-credits\")?.value;\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0 ? value : undefined;\n}\n\nexport function codexResetActionDescription(report: UsageReport): string {\n const count = codexResetCount(report);\n if (count === undefined) return \"Check reset availability.\";\n if (count === 0) return \"No usage limit resets available.\";\n return `You have ${count} ${resetLabel(count)} available.`;\n}\n\nexport function genericCodexResetOption(): CodexResetOption {\n return {\n title: \"Full reset\",\n description: \"Reset your current usage limits.\",\n };\n}\n\nexport function resetOptionExpiration(option: CodexResetOption): string {\n if (option.expiresAt === undefined) return \"Does not expire.\";\n const expiration = new Date(option.expiresAt * 1_000);\n if (Number.isNaN(expiration.getTime())) return \"Expiration unavailable.\";\n return `Expires ${expiration.toLocaleString()}.`;\n}\n\nexport function resetConfirmationLines(option: CodexResetOption | undefined): string[] {\n if (!option) return [\"The selected reset is unavailable.\"];\n return [\n option.title,\n resetOptionExpiration(option),\n option.description,\n \"This consumes one earned reset for the current OpenAI Codex account.\",\n ];\n}\n\nexport function formatCodexResetOutcome(\n outcome: CodexResetOutcome | undefined,\n remainingCount: number | undefined,\n): string {\n const remaining =\n remainingCount === undefined ? \"\" : ` You have ${remainingCount} ${resetLabel(remainingCount)} left.`;\n if (!outcome) return \"You don't have any usage limit resets available.\";\n if (outcome.code === \"reset\") return `Usage reset.${remaining}`.trim();\n if (outcome.code === \"already_redeemed\") {\n return `Usage reset was already completed.${remaining}`.trim();\n }\n if (outcome.code === \"nothing_to_reset\") {\n return \"Your usage does not need a reset right now.\";\n }\n return \"No usage limit resets are available.\";\n}\n\nexport function resetLabel(count: number): string {\n return count === 1 ? \"usage limit reset\" : \"usage limit resets\";\n}\n\nexport async function resolveCodexResetAuth(\n ctx: ExtensionContext,\n salt: Uint8Array = AUTH_FINGERPRINT_SALT,\n credentialReader: StoredCredentialReader = readStoredCredential,\n candidateReader?: OAuthCredentialCandidateReader,\n): Promise<ResolvedUsageAuth> {\n const model = ctx.model;\n if (model?.provider !== \"openai-codex\") {\n throw new Error(\"Usage limit resets require the current model to use OpenAI Codex.\");\n }\n const expectedModel = `${model.provider}/${model.id}`;\n const adapter = adapterForProvider(\"openai-codex\");\n if (!adapter) throw new Error(\"OpenAI Codex usage support is unavailable.\");\n if (candidateReader?.waitUntilReady && !(await candidateReader.waitUntilReady(ctx, \"openai-codex\"))) {\n throw new Error(\"OpenAI Codex OAuth credential readiness failed closed.\");\n }\n const auth = await resolveUsageAuth(ctx, adapter, salt, credentialReader);\n if (`${ctx.model?.provider}/${ctx.model?.id}` !== expectedModel) {\n throw new Error(\"The current model changed while resolving Codex reset authentication.\");\n }\n if (!auth) throw new Error(\"No runtime credential is configured for OpenAI Codex.\");\n const offered = candidateReader\n ? await candidateReader(ctx, \"openai-codex\")\n : fallbackOAuthCredentialCandidates(\"openai-codex\", credentialReader);\n if (!offered.ok) throw new Error(\"OpenAI Codex OAuth credential discovery failed closed.\");\n\n const resolvedAccess = bearerToken(headerValue(auth.headers, \"Authorization\")) ?? auth.apiKey;\n if (!resolvedAccess) throw new Error(\"OpenAI Codex OAuth credentials were incomplete.\");\n const resolvedAccountId = codexAccountIdFromAccessToken(resolvedAccess);\n if (!resolvedAccountId) {\n throw new Error(\"The active OpenAI Codex access token did not contain a valid account ID.\");\n }\n const { accountId, storedAccess } = selectCodexResetCredential(\n offered.candidates,\n resolvedAccess,\n resolvedAccountId,\n offered.offeredCount === 0,\n );\n const authorization = `Bearer ${resolvedAccess}`;\n const headers = {\n Authorization: authorization,\n \"chatgpt-account-id\": accountId,\n };\n return {\n apiKey: resolvedAccess,\n headers,\n fingerprint: fingerprintResolvedAuth({ headers }, salt),\n secrets: [...new Set([...auth.secrets, storedAccess, resolvedAccess, authorization, accountId])],\n model: auth.model,\n };\n}\n\nexport async function listCodexResetCredits(\n auth: ResolvedUsageAuth,\n signal: AbortSignal,\n timeoutMs: number,\n): Promise<CodexResetAvailability> {\n const payload = await fetchProviderJson(\n CODEX_RESET_CREDITS_URL,\n auth,\n signal,\n timeoutMs,\n \"Codex usage-limit reset endpoint\",\n );\n return normalizeCodexResetCreditsPayload(payload);\n}\n\nexport async function consumeCodexResetCredit(\n auth: ResolvedUsageAuth,\n option: CodexResetOption,\n redeemRequestId: string,\n signal: AbortSignal,\n timeoutMs: number,\n): Promise<CodexResetOutcome> {\n if (!redeemRequestId) throw new Error(\"Codex reset redemption request ID must not be empty.\");\n const payload = await fetchProviderJson(\n CODEX_RESET_CONSUME_URL,\n auth,\n signal,\n timeoutMs,\n \"Codex usage-limit reset consume endpoint\",\n {\n method: \"POST\",\n body: {\n redeem_request_id: redeemRequestId,\n ...(option.creditId ? { credit_id: option.creditId } : {}),\n },\n },\n );\n const code = payload.code;\n if (!isCodexResetOutcomeCode(code)) {\n throw new Error(\"Codex reset consume endpoint returned an unknown outcome code.\");\n }\n const windowsReset = payload.windows_reset === undefined ? 0 : nonnegativeInteger(payload.windows_reset);\n if (windowsReset === undefined) {\n throw new Error(\"Codex reset consume endpoint returned an invalid windows_reset value.\");\n }\n return { code, windowsReset };\n}\n\nexport function normalizeCodexResetCreditsPayload(payload: Record<string, unknown>): CodexResetAvailability {\n const availableCount = nonnegativeInteger(payload.available_count);\n if (availableCount === undefined) {\n throw new Error(\"Codex reset credits response returned an invalid available_count.\");\n }\n const rawCredits = payload.credits;\n if (rawCredits !== undefined && !Array.isArray(rawCredits)) {\n throw new Error(\"Codex reset credits response returned invalid credits.\");\n }\n\n const options = (rawCredits ?? [])\n .map(asObject)\n .filter((credit): credit is Record<string, unknown> => Boolean(credit))\n .filter((credit) => credit.status === \"available\" && credit.reset_type === \"codex_rate_limits\")\n .map(normalizeResetOption)\n .sort((left, right) => (left.expiresAt ?? Number.MAX_SAFE_INTEGER) - (right.expiresAt ?? Number.MAX_SAFE_INTEGER))\n .slice(0, Math.min(availableCount, MAX_RESET_OPTIONS));\n\n if (availableCount > 0 && options.length === 0) {\n options.push(genericCodexResetOption());\n }\n return { availableCount, options };\n}\n\nfunction selectCodexResetCredential(\n candidates: readonly unknown[],\n resolvedAccess: string,\n resolvedAccountId: string,\n standaloneFallback: boolean,\n): { accountId: string; storedAccess: string } {\n let sawOAuth = false;\n let sawMatchingAccess = false;\n let sawInvalidAccountId = false;\n const matches = new Map<string, { accountId: string; storedAccess: string }>();\n for (const candidate of candidates) {\n try {\n const credential = asObject(candidate);\n if (credential?.type !== \"oauth\") continue;\n sawOAuth = true;\n const storedAccess = asNonemptyString(credential.access);\n if (storedAccess !== resolvedAccess) continue;\n sawMatchingAccess = true;\n const accountId = validHeaderValue(credential.accountId);\n const refresh = asNonemptyString(credential.refresh);\n if (!accountId || accountId !== resolvedAccountId || !refresh) {\n sawInvalidAccountId = true;\n continue;\n }\n matches.set(refresh, { accountId, storedAccess });\n } catch {\n // Malformed candidates never authorize a reset request.\n }\n }\n if (sawInvalidAccountId) {\n throw new Error(\"The OpenAI Codex OAuth credential did not include a valid account ID.\");\n }\n if (matches.size > 1) {\n throw new Error(\"Conflicting OAuth credentials match the active OpenAI Codex runtime account.\");\n }\n const match = matches.values().next().value;\n if (match) return match;\n if (!sawOAuth) {\n throw new Error(\n standaloneFallback\n ? \"Usage limit resets require the OpenAI Codex OAuth account configured through Pi /login.\"\n : \"Usage limit resets require an OpenAI Codex OAuth account configured through Pi /login or a compatible credential source.\",\n );\n }\n if (sawMatchingAccess) throw new Error(\"OpenAI Codex OAuth credentials were incomplete.\");\n throw new Error(\n standaloneFallback\n ? \"The active OpenAI Codex runtime account does not match Pi's stored OAuth account.\"\n : \"The active OpenAI Codex runtime account does not match any available OAuth account.\",\n );\n}\n\nfunction codexAccountIdFromAccessToken(access: string): string | undefined {\n try {\n const parts = access.split(\".\");\n if (parts.length !== 3 || !parts[1]) return undefined;\n const payload = JSON.parse(Buffer.from(parts[1], \"base64url\").toString(\"utf8\")) as unknown;\n const claims = asObject(asObject(payload)?.[\"https://api.openai.com/auth\"]);\n return validHeaderValue(claims?.chatgpt_account_id);\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeResetOption(credit: Record<string, unknown>): CodexResetOption {\n const creditId = asOpaqueId(credit.id);\n if (!creditId) throw new Error(\"Codex reset credits response returned an invalid credit ID.\");\n let expiresAt: number | undefined;\n if (credit.expires_at !== undefined && credit.expires_at !== null) {\n if (typeof credit.expires_at !== \"string\") {\n throw new Error(\"Codex reset credits response returned an invalid expiration time.\");\n }\n const parsed = Date.parse(credit.expires_at);\n if (!Number.isFinite(parsed)) {\n throw new Error(\"Codex reset credits response returned an invalid expiration time.\");\n }\n expiresAt = Math.floor(parsed / 1_000);\n }\n const title = displayString(credit.title) ?? \"Full reset\";\n const description = displayString(credit.description) ?? \"Reset your current usage limits.\";\n return {\n creditId,\n title,\n description,\n ...(expiresAt === undefined ? {} : { expiresAt }),\n };\n}\n\nfunction isCodexResetOutcomeCode(value: unknown): value is CodexResetOutcomeCode {\n return value === \"reset\" || value === \"nothing_to_reset\" || value === \"no_credit\" || value === \"already_redeemed\";\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n return value as Record<string, unknown>;\n}\n\nfunction asNonemptyString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction asOpaqueId(value: unknown): string | undefined {\n if (typeof value !== \"string\" || value.length === 0 || value.length > MAX_CREDIT_ID_CHARS) {\n return undefined;\n }\n return value;\n}\n\nfunction displayString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n return sanitizeDisplayText(value, 160) || undefined;\n}\n\nfunction validHeaderValue(value: unknown): string | undefined {\n if (typeof value !== \"string\" || !value || value.length > 512) return undefined;\n if (/[^\\x20-\\x7e]/u.test(value)) return undefined;\n return value;\n}\n\nfunction nonnegativeInteger(value: unknown): number | undefined {\n const parsed =\n typeof value === \"number\" ? value : typeof value === \"string\" && value.trim() ? Number(value) : Number.NaN;\n if (!Number.isSafeInteger(parsed) || parsed < 0) return undefined;\n return parsed;\n}\n\nfunction bearerToken(authorization: string | undefined): string | undefined {\n return /^Bearer\\s+(.+)$/iu.exec(authorization ?? \"\")?.[1];\n}\n\nfunction headerValue(headers: Record<string, string>, name: string): string | undefined {\n return Object.entries(headers).find(([candidate]) => candidate.toLowerCase() === name.toLowerCase())?.[1];\n}\n", "import { createHmac } from \"node:crypto\";\nimport type { UsageReport } from \"./types.js\";\n\nexport class UsageCache {\n private readonly entries = new Map<string, { createdAt: number; report: UsageReport }>();\n private readonly ttlMs: number;\n private readonly maxEntries: number;\n\n constructor(ttlMs: number, maxEntries = 32) {\n if (!Number.isFinite(ttlMs) || ttlMs <= 0) throw new Error(\"Cache TTL must be positive.\");\n if (!Number.isSafeInteger(maxEntries) || maxEntries < 1) {\n throw new Error(\"Cache entry limit must be a positive integer.\");\n }\n this.ttlMs = ttlMs;\n this.maxEntries = maxEntries;\n }\n\n get size(): number {\n return this.entries.size;\n }\n\n get(providerId: string, fingerprint: string, now = Date.now()): UsageReport | undefined {\n this.sweepExpired(now);\n return this.entries.get(cacheKey(providerId, fingerprint))?.report;\n }\n\n set(providerId: string, fingerprint: string, report: UsageReport, now = Date.now()): void {\n this.sweepExpired(now);\n const key = cacheKey(providerId, fingerprint);\n this.entries.delete(key);\n while (this.entries.size >= this.maxEntries) {\n const oldest = this.entries.keys().next().value;\n if (oldest === undefined) break;\n this.entries.delete(oldest);\n }\n this.entries.set(key, { createdAt: now, report });\n }\n\n delete(providerId: string, fingerprint: string): void {\n this.entries.delete(cacheKey(providerId, fingerprint));\n }\n\n clearProvider(providerId: string): void {\n for (const key of this.entries.keys()) {\n if (key.startsWith(`${providerId}:`)) this.entries.delete(key);\n }\n }\n\n clear(): void {\n this.entries.clear();\n }\n\n private sweepExpired(now: number): void {\n for (const [key, entry] of this.entries) {\n if (now - entry.createdAt >= this.ttlMs) this.entries.delete(key);\n }\n }\n}\n\nexport function fingerprintResolvedAuth(\n auth: {\n apiKey?: string;\n headers?: Record<string, string | null>;\n baseUrl?: string;\n env?: Record<string, string>;\n source?: string;\n providerAuth?: {\n apiKey?: string;\n headers?: Record<string, string | null>;\n baseUrl?: string;\n };\n },\n salt: Uint8Array,\n): string {\n const headers = Object.entries(auth.headers ?? {})\n .map(([name, value]) => [name.toLowerCase(), value] as const)\n .sort(([left], [right]) => left.localeCompare(right));\n const env = Object.entries(auth.env ?? {}).sort(([left], [right]) => left.localeCompare(right));\n const providerHeaders = Object.entries(auth.providerAuth?.headers ?? {})\n .map(([name, value]) => [name.toLowerCase(), value] as const)\n .sort(([left], [right]) => left.localeCompare(right));\n const canonical = JSON.stringify({\n apiKey: auth.apiKey ?? \"\",\n headers,\n baseUrl: auth.baseUrl ?? \"\",\n env,\n source: auth.source ?? \"\",\n providerAuth: {\n apiKey: auth.providerAuth?.apiKey ?? \"\",\n headers: providerHeaders,\n baseUrl: auth.providerAuth?.baseUrl ?? \"\",\n },\n });\n return createHmac(\"sha256\", salt).update(canonical).digest(\"hex\");\n}\n\nexport async function runWithConcurrency<T, R>(\n items: readonly T[],\n limit: number,\n worker: (item: T, index: number, signal: AbortSignal) => Promise<R>,\n signal: AbortSignal,\n): Promise<PromiseSettledResult<R>[]> {\n if (signal.aborted) throw abortError();\n if (!Number.isSafeInteger(limit) || limit < 1) throw new Error(\"Concurrency limit must be positive.\");\n\n const results = new Array<PromiseSettledResult<R>>(items.length);\n let nextIndex = 0;\n const runners = Array.from({ length: Math.min(limit, items.length) }, async () => {\n while (nextIndex < items.length) {\n if (signal.aborted) throw abortError();\n const index = nextIndex;\n nextIndex += 1;\n try {\n results[index] = {\n status: \"fulfilled\",\n value: await worker(items[index] as T, index, signal),\n };\n } catch (reason) {\n results[index] = { status: \"rejected\", reason };\n }\n }\n });\n\n await Promise.all(runners);\n if (signal.aborted) throw abortError();\n return results;\n}\n\nexport async function awaitWithDeadline<T>(\n operation: Promise<T>,\n signal: AbortSignal,\n timeoutMs: number,\n description: string,\n): Promise<T> {\n if (signal.aborted) throw abortError();\n const controller = new AbortController();\n const abortFromCaller = () => controller.abort();\n signal.addEventListener(\"abort\", abortFromCaller, { once: true });\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await Promise.race([\n operation,\n new Promise<never>((_resolve, reject) => {\n controller.signal.addEventListener(\n \"abort\",\n () => {\n reject(\n signal.aborted\n ? abortError()\n : Object.assign(new Error(`Timed out after ${Math.round(timeoutMs / 1000)}s ${description}.`), {\n name: \"TimeoutError\",\n }),\n );\n },\n { once: true },\n );\n }),\n ]);\n } finally {\n clearTimeout(timeout);\n signal.removeEventListener(\"abort\", abortFromCaller);\n }\n}\n\nexport function sanitizeDisplayText(value: string, maxChars = 160): string {\n let result = \"\";\n for (let index = 0; index < value.length; ) {\n const codePoint = value.codePointAt(index) ?? 0;\n const character = String.fromCodePoint(codePoint);\n if (codePoint === 0x1b || codePoint === 0x9b || codePoint === 0x9d) {\n index = skipTerminalEscape(value, index, codePoint);\n continue;\n }\n if (codePoint <= 0x1f || (codePoint >= 0x7f && codePoint <= 0x9f)) {\n if (codePoint === 0x09 || codePoint === 0x0a || codePoint === 0x0d) result += \" \";\n index += character.length;\n continue;\n }\n result += character;\n index += character.length;\n }\n return truncate(result.replace(/\\s+/gu, \" \").trim(), maxChars);\n}\n\nexport function redactUsageError(value: string, secrets: readonly string[] = []): string {\n let redacted = value;\n for (const secret of [...new Set(secrets)].filter(Boolean).sort((a, b) => b.length - a.length)) {\n redacted = redacted.replace(new RegExp(escapeRegExp(secret), \"g\"), \"<redacted>\");\n }\n redacted = redacted\n .replace(/Bearer\\s+[A-Za-z0-9._~+/=-]+/gi, \"Bearer <redacted>\")\n .replace(/\"(?:access_token|refresh_token|api_key)\"\\s*:\\s*\"[^\"]+\"/gi, (match) => {\n const separator = match.indexOf(\":\");\n return `${match.slice(0, separator + 1)}\"<redacted>\"`;\n });\n return sanitizeDisplayText(redacted, 600);\n}\n\nexport function errorMessage(error: unknown): string {\n return sanitizeDisplayText(error instanceof Error ? error.message : String(error), 600);\n}\n\nexport function abortError(): Error {\n return Object.assign(new Error(\"Usage query aborted.\"), { name: \"AbortError\" });\n}\n\nfunction skipTerminalEscape(value: string, start: number, codePoint: number): number {\n let index = start + 1;\n const next = value.charCodeAt(index);\n const isOsc = codePoint === 0x9d || (codePoint === 0x1b && next === 0x5d);\n if (isOsc) {\n if (codePoint === 0x1b) index += 1;\n while (index < value.length) {\n const current = value.charCodeAt(index);\n if (current === 0x07) return index + 1;\n if (current === 0x1b && value.charCodeAt(index + 1) === 0x5c) return index + 2;\n index += 1;\n }\n return index;\n }\n const isCsi = codePoint === 0x9b || (codePoint === 0x1b && next === 0x5b);\n if (isCsi) {\n if (codePoint === 0x1b) index += 1;\n while (index < value.length) {\n const current = value.charCodeAt(index);\n index += 1;\n if (current >= 0x40 && current <= 0x7e) break;\n }\n return index;\n }\n return Math.min(value.length, start + (codePoint === 0x1b ? 2 : 1));\n}\n\nfunction cacheKey(providerId: string, fingerprint: string): string {\n return `${providerId}:${fingerprint}`;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction truncate(value: string, maxChars: number): string {\n if (value.length <= maxChars) return value;\n return `${value.slice(0, maxChars - 1)}\u2026`;\n}\n", "import type { OAuthCredential } from \"@earendil-works/pi-ai\";\nimport { type ExtensionAPI, type ExtensionContext, readStoredCredential } from \"@earendil-works/pi-coding-agent\";\n\nexport const OAUTH_CREDENTIAL_SOURCE_CHANNEL = \"oauth:credential-source:v1\";\nexport const OAUTH_CREDENTIAL_READINESS_CHANNEL = \"oauth:credential-readiness:v1\";\n\nexport type StoredCredentialReader = (providerId: string) => unknown;\n\nexport type OAuthCredentialCandidates =\n | { ok: true; candidates: readonly OAuthCredential[]; offeredCount?: number }\n | { ok: false };\n\nexport type OAuthCredentialCandidateReader = {\n (ctx: ExtensionContext, providerId: string): OAuthCredentialCandidates | Promise<OAuthCredentialCandidates>;\n waitUntilReady?(ctx: ExtensionContext, providerId: string): Promise<boolean>;\n};\n\nexport function createOAuthCredentialCandidateReader(\n pi: ExtensionAPI,\n credentialReader: StoredCredentialReader = readStoredCredential,\n): OAuthCredentialCandidateReader {\n const reader: OAuthCredentialCandidateReader = (ctx, providerId) =>\n collectOAuthCredentialCandidates(pi, ctx, providerId, credentialReader);\n reader.waitUntilReady = (ctx, providerId) => waitForOAuthCredentialSources(pi, ctx, providerId);\n return reader;\n}\n\nexport function collectOAuthCredentialCandidates(\n pi: Pick<ExtensionAPI, \"events\">,\n ctx: ExtensionContext,\n providerId: string,\n credentialReader: StoredCredentialReader = readStoredCredential,\n): OAuthCredentialCandidates {\n const candidates: OAuthCredential[] = [];\n let collecting = true;\n const request = Object.freeze({\n session: ctx.sessionManager,\n provider: providerId,\n offer(candidate: unknown) {\n if (!collecting) return;\n const clone = cloneOAuthCredential(candidate);\n if (clone) candidates.push(clone);\n },\n });\n try {\n pi.events.emit(OAUTH_CREDENTIAL_SOURCE_CHANNEL, request);\n } catch {\n return { ok: false };\n } finally {\n collecting = false;\n }\n const offeredCount = candidates.length;\n try {\n const fallback = cloneOAuthCredential(credentialReader(providerId));\n if (fallback) candidates.push(fallback);\n } catch {\n // A malformed or unavailable standalone credential is equivalent to no fallback.\n }\n return { ok: true, candidates, offeredCount };\n}\n\nasync function waitForOAuthCredentialSources(\n pi: Pick<ExtensionAPI, \"events\">,\n ctx: ExtensionContext,\n providerId: string,\n): Promise<boolean> {\n const pending: Promise<unknown>[] = [];\n let collecting = true;\n const request = Object.freeze({\n session: ctx.sessionManager,\n provider: providerId,\n waitUntil(value: unknown) {\n if (!collecting || !(value instanceof Promise)) return;\n pending.push(value);\n },\n });\n try {\n pi.events.emit(OAUTH_CREDENTIAL_READINESS_CHANNEL, request);\n } catch {\n return false;\n } finally {\n collecting = false;\n }\n try {\n await Promise.all(pending);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function fallbackOAuthCredentialCandidates(\n providerId: string,\n credentialReader: StoredCredentialReader,\n): OAuthCredentialCandidates {\n try {\n const credential = cloneOAuthCredential(credentialReader(providerId));\n return { ok: true, candidates: credential ? [credential] : [], offeredCount: 0 };\n } catch {\n return { ok: true, candidates: [], offeredCount: 0 };\n }\n}\n\nfunction cloneOAuthCredential(value: unknown): OAuthCredential | undefined {\n try {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n const clone = structuredClone(value) as OAuthCredential;\n if (!clone || typeof clone !== \"object\" || Array.isArray(clone)) return undefined;\n if (clone.type !== \"oauth\") return undefined;\n if (typeof clone.access !== \"string\" || !clone.access) return undefined;\n if (typeof clone.refresh !== \"string\" || !clone.refresh) return undefined;\n if (typeof clone.expires !== \"number\" || !Number.isFinite(clone.expires)) return undefined;\n return clone;\n } catch {\n return undefined;\n }\n}\n", "// This module intentionally keeps adapter transport beside resolved-auth and origin validation;\n// separating that security boundary would duplicate request and redaction policy across providers.\nimport { randomBytes } from \"node:crypto\";\nimport { type ExtensionContext, readStoredCredential } from \"@earendil-works/pi-coding-agent\";\nimport { errorMessage, fingerprintResolvedAuth, redactUsageError } from \"./core.js\";\nimport { fallbackOAuthCredentialCandidates, type OAuthCredentialCandidateReader } from \"./oauth-credential-source.js\";\nimport { normalizeBasetenBillingUsagePayload } from \"./providers/baseten.js\";\nimport { normalizeCodexBackendPayload } from \"./providers/codex.js\";\nimport { normalizeDeepSeekBalancePayload } from \"./providers/deepseek.js\";\nimport { createFireworksAdapter } from \"./providers/fireworks.js\";\nimport { normalizeGitHubCopilotUsagePayload } from \"./providers/github-copilot.js\";\nimport { normalizeKimiCodingUsagePayload } from \"./providers/kimi-coding.js\";\nimport { type MiniMaxProviderId, miniMaxUsageKind, normalizeMiniMaxUsagePayload } from \"./providers/minimax.js\";\nimport { normalizeMoonshotBalancePayload } from \"./providers/moonshot.js\";\nimport { normalizeOpenCodeZenPayload } from \"./providers/opencode-zen.js\";\nimport { normalizeOpenRouterKeyPayload } from \"./providers/openrouter.js\";\nimport { normalizeVercelAIGatewayCreditsPayload } from \"./providers/vercel-ai-gateway.js\";\nimport { normalizeXaiBillingPayload } from \"./providers/xai.js\";\nimport { normalizeZaiQuotaPayload, normalizeZaiSubscriptionPayload } from \"./providers/zai.js\";\nimport { zaiResponseError } from \"./providers/zai-errors.js\";\nimport type {\n BasetenBillingUsagePayload,\n CodexBackendPayload,\n DeepSeekBalancePayload,\n GitHubCopilotUsagePayload,\n KimiCodingUsagePayload,\n MiniMaxUsagePayload,\n MoonshotBalancePayload,\n OpenCodeZenPayload,\n OpenRouterKeyPayload,\n PiModel,\n ResolvedUsageAuth,\n UsageProviderAdapter,\n UsageQuerySettings,\n UsageReport,\n UsageRequestGuard,\n VercelAIGatewayCreditsPayload,\n XaiBillingPayload,\n XaiUserPayload,\n ZaiPlanInfo,\n ZaiQuotaPayload,\n ZaiSubscriptionPayload,\n} from \"./types.js\";\nimport { resolveUsageTarget } from \"./usage-targets.js\";\n\nconst BASETEN_BILLING_USAGE_URL = \"https://api.baseten.co/v1/billing/usage_summary\";\nconst BASETEN_USAGE_WINDOW_DAYS = 30;\nconst CODEX_USAGE_URL = \"https://chatgpt.com/backend-api/wham/usage\";\nconst DEEPSEEK_BALANCE_URL = \"https://api.deepseek.com/user/balance\";\nconst GITHUB_COPILOT_USAGE_URL = \"https://api.github.com/copilot_internal/user\";\nconst OPENROUTER_KEY_URL = \"https://openrouter.ai/api/v1/key\";\nconst VERCEL_AI_GATEWAY_CREDITS_URL = \"https://ai-gateway.vercel.sh/v1/credits\";\nconst OPENCODE_GO_USAGE_URL = \"https://opencode.ai/zen/go/v1/usage\";\nconst KIMI_CODING_USAGE_URL = \"https://api.kimi.com/coding/v1/usages\";\nconst MINIMAX_API_ROOTS = Object.freeze({\n minimax: \"https://api.minimax.io\",\n \"minimax-cn\": \"https://api.minimaxi.com\",\n});\nconst MOONSHOT_BALANCE_URLS = Object.freeze({\n moonshotai: \"https://api.moonshot.ai/v1/users/me/balance\",\n \"moonshotai-cn\": \"https://api.moonshot.cn/v1/users/me/balance\",\n});\nconst SHARED_MOONSHOT_ENV_VAR = \"MOONSHOT_API_KEY\";\nconst XAI_USER_URL = \"https://cli-chat-proxy.grok.com/v1/user?include=subscription\";\nconst XAI_BILLING_URL = \"https://cli-chat-proxy.grok.com/v1/billing?format=credits\";\nconst XAI_CLIENT_HEADERS = Object.freeze({\n \"X-XAI-Token-Auth\": \"xai-grok-cli\",\n \"x-grok-client-version\": \"1.0.10\",\n \"x-grok-client-mode\": \"interactive\",\n});\nconst MAX_SUCCESS_BODY_BYTES = 64 * 1024;\nconst MAX_ERROR_BODY_BYTES = 4 * 1024;\n\nexport const AUTH_FINGERPRINT_SALT = randomBytes(32);\n\nexport const SUPPORTED_ADAPTERS: readonly UsageProviderAdapter[] = [\n {\n id: \"baseten\",\n displayName: \"Baseten\",\n semantics: { kind: \"api-key\", label: \"Organization Model APIs spend\" },\n async query(auth, signal, timeoutMs, guard) {\n if (!guard) throw new Error(\"Baseten billing usage requires request-boundary revalidation.\");\n const startedAt = Date.now();\n await guard();\n const windowAt = Date.now();\n const payload = (await fetchProviderJson(\n basetenBillingUsageUrl(windowAt),\n auth,\n signal,\n remainingTimeout(timeoutMs, startedAt, \"fetching Baseten billing usage\"),\n \"Baseten billing usage endpoint\",\n { redirect: \"error\" },\n )) as BasetenBillingUsagePayload;\n await guard();\n return normalizeBasetenBillingUsagePayload(payload, Date.now());\n },\n },\n {\n id: \"openai-codex\",\n displayName: \"OpenAI Codex\",\n semantics: {\n kind: \"consumer-subscription\",\n label: \"ChatGPT subscription limits\",\n },\n async query(auth, signal, timeoutMs) {\n const payload = await fetchProviderJson(CODEX_USAGE_URL, auth, signal, timeoutMs, \"Codex usage endpoint\");\n return normalizeCodexBackendPayload(payload as CodexBackendPayload, Date.now());\n },\n },\n {\n id: \"deepseek\",\n displayName: \"DeepSeek\",\n semantics: { kind: \"api-key\", label: \"DeepSeek API balance\" },\n async query(auth, signal, timeoutMs, guard) {\n if (!guard) throw new Error(\"DeepSeek API balance requires request-boundary revalidation.\");\n const startedAt = Date.now();\n await guard();\n const remainingMs = timeoutMs - (Date.now() - startedAt);\n if (remainingMs <= 0) throw new Error(\"Timed out while revalidating DeepSeek runtime auth.\");\n const payload = await fetchProviderJson(\n DEEPSEEK_BALANCE_URL,\n auth,\n signal,\n remainingMs,\n \"DeepSeek API balance endpoint\",\n { redirect: \"error\" },\n );\n return normalizeDeepSeekBalancePayload(payload as DeepSeekBalancePayload, Date.now());\n },\n },\n {\n id: \"github-copilot\",\n displayName: \"GitHub Copilot\",\n semantics: {\n kind: \"consumer-subscription\",\n label: \"GitHub Copilot account allowance\",\n },\n async query(auth, signal, timeoutMs) {\n const payload = await fetchProviderJson(\n GITHUB_COPILOT_USAGE_URL,\n auth,\n signal,\n timeoutMs,\n \"GitHub Copilot usage endpoint\",\n );\n return normalizeGitHubCopilotUsagePayload(payload as GitHubCopilotUsagePayload, Date.now());\n },\n },\n {\n id: \"openrouter\",\n displayName: \"OpenRouter\",\n semantics: { kind: \"api-key\", label: \"API-key spend limits\" },\n async query(auth, signal, timeoutMs) {\n const payload = await fetchProviderJson(OPENROUTER_KEY_URL, auth, signal, timeoutMs, \"OpenRouter key endpoint\");\n return normalizeOpenRouterKeyPayload(payload as OpenRouterKeyPayload, Date.now());\n },\n },\n {\n id: \"vercel-ai-gateway\",\n displayName: \"Vercel AI Gateway\",\n semantics: { kind: \"api-key\", label: \"AI Gateway credits and lifetime spend\" },\n async query(auth, signal, timeoutMs, guard) {\n if (!guard) throw new Error(\"Vercel AI Gateway usage requires request-boundary revalidation.\");\n const startedAt = Date.now();\n await guard();\n const payload = (await fetchProviderJson(\n VERCEL_AI_GATEWAY_CREDITS_URL,\n auth,\n signal,\n remainingTimeout(timeoutMs, startedAt, \"fetching Vercel AI Gateway credits\"),\n \"Vercel AI Gateway credits endpoint\",\n { redirect: \"error\" },\n )) as VercelAIGatewayCreditsPayload;\n await guard();\n return normalizeVercelAIGatewayCreditsPayload(payload, Date.now());\n },\n },\n createFireworksAdapter(fetchProviderJson),\n {\n id: \"opencode-go\",\n displayName: \"OpenCode Go\",\n semantics: { kind: \"consumer-subscription\", label: \"OpenCode Zen plan usage\" },\n async query(auth, signal, timeoutMs) {\n const payload = await fetchProviderJson(\n OPENCODE_GO_USAGE_URL,\n auth,\n signal,\n timeoutMs,\n \"OpenCode Zen usage endpoint\",\n );\n return normalizeOpenCodeZenPayload(payload as OpenCodeZenPayload, Date.now());\n },\n },\n {\n id: \"kimi-coding\",\n displayName: \"Kimi For Coding\",\n semantics: { kind: \"consumer-subscription\", label: \"Kimi Coding Plan usage\" },\n async query(auth, signal, timeoutMs) {\n const payload = await fetchProviderJson(\n KIMI_CODING_USAGE_URL,\n auth,\n signal,\n timeoutMs,\n \"Kimi Coding usage endpoint\",\n { redirect: \"error\" },\n );\n return normalizeKimiCodingUsagePayload(payload as KimiCodingUsagePayload, Date.now());\n },\n },\n {\n id: \"minimax\",\n displayName: \"MiniMax\",\n semantics: { kind: \"consumer-subscription\", label: \"MiniMax usage\" },\n async query(auth, signal, timeoutMs, guard) {\n return queryMiniMaxUsage(\"minimax\", auth, signal, timeoutMs, guard);\n },\n },\n {\n id: \"minimax-cn\",\n displayName: \"MiniMax CN\",\n semantics: { kind: \"consumer-subscription\", label: \"MiniMax usage\" },\n async query(auth, signal, timeoutMs, guard) {\n return queryMiniMaxUsage(\"minimax-cn\", auth, signal, timeoutMs, guard);\n },\n },\n {\n id: \"moonshotai\",\n displayName: \"Moonshot AI\",\n semantics: { kind: \"api-key\", label: \"Moonshot API account balance\" },\n async query(auth, signal, timeoutMs, guard) {\n return queryMoonshotBalance(\"moonshotai\", auth, signal, timeoutMs, guard);\n },\n },\n {\n id: \"moonshotai-cn\",\n displayName: \"Moonshot AI CN\",\n semantics: { kind: \"api-key\", label: \"Moonshot API account balance\" },\n async query(auth, signal, timeoutMs, guard) {\n return queryMoonshotBalance(\"moonshotai-cn\", auth, signal, timeoutMs, guard);\n },\n },\n {\n id: \"zai\",\n displayName: \"Z.AI\",\n invalidateCacheOnFailure: true,\n semantics: { kind: \"consumer-subscription\", label: \"GLM Coding Plan usage\" },\n async query(auth, signal, timeoutMs, guard) {\n return queryZaiUsage(\"zai\", \"Z.AI\", auth, signal, timeoutMs, guard);\n },\n },\n {\n id: \"zai-coding-cn\",\n displayName: \"Z.AI Coding CN\",\n invalidateCacheOnFailure: true,\n semantics: { kind: \"consumer-subscription\", label: \"GLM Coding Plan usage\" },\n async query(auth, signal, timeoutMs, guard) {\n return queryZaiUsage(\"zai-coding-cn\", \"Z.AI Coding CN\", auth, signal, timeoutMs, guard);\n },\n },\n];\n\n// Reviewed contract pins:\n// - Pi xAI provider at https://api.x.ai and OAuth scope\n// \"openid profile email offline_access grok-cli:access api:access\" at\n// e86823096c5bad39e1ca282ec24bc5eb9bec745b, unchanged at\n// ccfe79ed238674f760c986e3a61493aab794000a.\n// - Grok Build identity, credits routes/structs, required token-auth and version headers, and\n// client-mode telemetry at 9684fa3cdbf2995e30ea8b9b637f1db008f144fc (client version 1.0.10).\n// - xAI Management API's separate team billing boundary at\n// 723dd2aa22d17be35617463837dc47cda008d90e.\n// x-userid remains attached only to billing to bind the proxy-canonical identity as Grok Build does.\nexport const XAI_ADAPTER: UsageProviderAdapter = {\n id: \"xai\",\n displayName: \"xAI\",\n semantics: {\n kind: \"consumer-subscription\",\n label: \"xAI consumer subscription usage\",\n },\n publishesStatusline: false,\n async query(auth, signal, timeoutMs, guard) {\n if (!guard) throw new Error(\"xAI usage requires request-boundary revalidation.\");\n const startedAt = Date.now();\n const clientAuth = {\n ...auth,\n headers: { ...auth.headers, ...XAI_CLIENT_HEADERS },\n };\n await guard();\n const userPayload = (await fetchProviderJson(\n XAI_USER_URL,\n clientAuth,\n signal,\n remainingTimeout(timeoutMs, startedAt),\n \"xAI consumer identity endpoint\",\n { redirect: \"error\", userAgent: false },\n )) as XaiUserPayload;\n await guard();\n const userId = validatedXaiUserId(userPayload.userId);\n const billingAuth = {\n ...clientAuth,\n headers: { ...clientAuth.headers, \"x-userid\": userId },\n secrets: [...clientAuth.secrets, userId],\n };\n await guard();\n const billingPayload = (await fetchProviderJson(\n XAI_BILLING_URL,\n billingAuth,\n signal,\n remainingTimeout(timeoutMs, startedAt),\n \"xAI consumer billing endpoint\",\n { redirect: \"error\", userAgent: false },\n )) as XaiBillingPayload;\n await guard();\n return normalizeXaiBillingPayload(billingPayload, userPayload.subscriptionTier, Date.now());\n },\n};\n\nexport function usageAdapters(): readonly UsageProviderAdapter[] {\n return [...SUPPORTED_ADAPTERS, XAI_ADAPTER];\n}\n\nexport function adapterForProvider(providerId: string | undefined): UsageProviderAdapter | undefined {\n return usageAdapters().find((adapter) => adapter.id === providerId);\n}\n\nexport function isStaleExtensionContextError(error: unknown): boolean {\n return (\n error instanceof Error && error.message.includes(\"This extension ctx is stale after session replacement or reload\")\n );\n}\n\nexport async function resolveUsageAuth(\n ctx: ExtensionContext,\n adapter: UsageProviderAdapter,\n salt: Uint8Array = AUTH_FINGERPRINT_SALT,\n credentialReader: StoredCredentialReader = readStoredCredential,\n candidateReader?: OAuthCredentialCandidateReader,\n): Promise<ResolvedUsageAuth | undefined> {\n if (ctx.model?.provider === adapter.id && !hasOfficialOrigin(ctx.model, adapter.id)) {\n throw new Error(\n `${adapter.displayName} usage cannot send a custom provider base URL credential to the official usage endpoint.`,\n );\n }\n\n const model = candidateModels(ctx, adapter.id).find((candidate) => hasOfficialOrigin(candidate, adapter.id));\n if (!model) return undefined;\n if (\n [\"github-copilot\", \"xai\"].includes(adapter.id) &&\n candidateReader?.waitUntilReady &&\n !(await candidateReader.waitUntilReady(ctx, adapter.id))\n ) {\n throw new Error(`${adapter.displayName} OAuth credential readiness failed closed.`);\n }\n // SAFETY: Pi exposes the required auth methods at runtime, and checks below narrow them before use.\n const registry = ctx.modelRegistry as unknown as UsageAuthRegistry;\n const provider = registry.getProvider?.(adapter.id);\n if (provider?.baseUrl && !hasOfficialUrlOrigin(provider.baseUrl, adapter.id)) {\n throw new Error(\n `${adapter.displayName} usage cannot send an overridden provider credential to the official usage endpoint.`,\n );\n }\n let modelAuth: RequestAuth | undefined;\n const currentModel = ctx.model?.provider === adapter.id ? ctx.model : undefined;\n const resolveCurrentModelAuth = async (): Promise<RequestAuth | undefined> => {\n if (!currentModel || typeof registry.getApiKeyAndHeaders !== \"function\") return undefined;\n const result = await registry.getApiKeyAndHeaders(currentModel);\n if (!result.ok) throw new Error(redactUsageError(result.error));\n return authorizationFrom(result) ? result : undefined;\n };\n const resolveSelectedAuthLast = [\"deepseek\", \"minimax\", \"minimax-cn\"].includes(adapter.id);\n if (!resolveSelectedAuthLast) modelAuth = await resolveCurrentModelAuth();\n if (typeof registry.getProviderAuth !== \"function\") {\n throw new Error(\"pi-usage requires Pi 0.81.0 or newer to validate resolved provider auth.\");\n }\n if (!moonshotProviderAuthIsAllowed(ctx, adapter.id)) return undefined;\n const providerResult = await registry.getProviderAuth(adapter.id);\n if (!moonshotProviderAuthIsAllowed(ctx, adapter.id)) return undefined;\n if (providerResult?.auth.baseUrl && !hasOfficialUrlOrigin(providerResult.auth.baseUrl, adapter.id)) {\n throw new Error(\n `${adapter.displayName} usage cannot send a proxy-resolved credential to the official usage endpoint.`,\n );\n }\n // Providers with credential-change retries read selected-model auth last so a rotation during\n // provider-origin validation cannot leave the earlier credential queued for the usage request.\n if (resolveSelectedAuthLast) modelAuth = await resolveCurrentModelAuth();\n if (modelAuth?.baseUrl && !hasOfficialUrlOrigin(modelAuth.baseUrl, adapter.id)) {\n throw new Error(\n `${adapter.displayName} usage cannot send model-resolved proxy credentials to the official usage endpoint.`,\n );\n }\n const auth = modelAuth ?? providerResult?.auth;\n if (!auth) return undefined;\n const finalize = (resolved: ResolvedUsageAuth): ResolvedUsageAuth => {\n const preservedAuth = { ...(providerResult?.auth ?? auth) };\n const env = providerResult?.env ?? modelAuth?.env;\n const source = providerResult?.source;\n const effectiveBaseUrl = modelAuth?.baseUrl ?? providerResult?.auth.baseUrl ?? provider?.baseUrl ?? model.baseUrl;\n const redactionInputs = [\n preservedAuth.apiKey,\n ...Object.values(preservedAuth.headers ?? {}),\n ...Object.values(env ?? {}),\n modelAuth?.apiKey,\n ...Object.values(modelAuth?.headers ?? {}),\n ].filter((value): value is string => typeof value === \"string\" && value.length > 0);\n return {\n ...resolved,\n auth: preservedAuth,\n ...(env ? { env: { ...env } } : {}),\n ...(source ? { source } : {}),\n effectiveBaseUrl,\n secrets: [...new Set([...resolved.secrets, ...redactionInputs])],\n fingerprint: fingerprintResolvedAuth(\n {\n apiKey: resolved.apiKey,\n headers: resolved.headers,\n baseUrl: effectiveBaseUrl,\n env,\n source,\n providerAuth: preservedAuth,\n },\n salt,\n ),\n };\n };\n if (adapter.id === \"github-copilot\") {\n const offered = candidateReader\n ? await candidateReader(ctx, adapter.id)\n : fallbackOAuthCredentialCandidates(adapter.id, credentialReader);\n if (!offered.ok) {\n throw new Error(\"GitHub Copilot OAuth credential discovery failed closed.\");\n }\n return finalize(resolveGitHubCopilotUsageAuth(auth, model, salt, offered.candidates, offered.offeredCount === 0));\n }\n if (adapter.id === \"xai\") {\n const offered = candidateReader\n ? await candidateReader(ctx, adapter.id)\n : fallbackOAuthCredentialCandidates(adapter.id, credentialReader);\n if (!offered.ok) throw new Error(\"xAI OAuth credential discovery failed closed.\");\n return finalize(resolveXaiUsageAuth(auth, model, salt, offered.candidates));\n }\n if (adapter.id === \"deepseek\") {\n const resolvedAuthorization = authorizationFrom(auth);\n const access = bearerToken(resolvedAuthorization);\n if (!access) throw new Error(\"DeepSeek API balance requires Bearer authentication.\");\n const authorization = `Bearer ${access}`;\n const headers = { Authorization: authorization };\n return finalize({\n apiKey: access,\n headers,\n fingerprint: \"\",\n secrets: [\n access,\n auth.apiKey,\n headerValue(auth.headers, \"Authorization\"),\n resolvedAuthorization,\n authorization,\n ].filter((value): value is string => Boolean(value)),\n model,\n });\n }\n const authorization = authorizationFrom(auth);\n if (!authorization) return undefined;\n const headers = { Authorization: authorization };\n const secrets = [auth.apiKey, headerValue(auth.headers, \"Authorization\"), authorization].filter(\n (value): value is string => Boolean(value),\n );\n return finalize({\n apiKey: auth.apiKey,\n headers,\n fingerprint: \"\",\n secrets,\n model,\n });\n}\n\nexport async function queryProviderUsage(\n adapter: UsageProviderAdapter,\n auth: ResolvedUsageAuth,\n signal: AbortSignal,\n timeoutMs: number,\n guard?: UsageRequestGuard,\n targetOrSettings?: string | Readonly<UsageQuerySettings>,\n): Promise<UsageReport> {\n const startedAt = Date.now();\n let targetId =\n typeof targetOrSettings === \"string\"\n ? targetOrSettings\n : adapter.id === \"fireworks\"\n ? targetOrSettings?.fireworksAccountId\n : undefined;\n let resolvedLegacyFireworksTarget = false;\n try {\n if (adapter.id === \"fireworks\" && typeof targetOrSettings !== \"string\" && adapter.targets && guard) {\n const target = await resolveUsageTarget(\n adapter,\n auth,\n targetId,\n signal,\n remainingTimeout(timeoutMs, startedAt, \"resolving the Fireworks account\"),\n guard,\n );\n if (target.kind === \"selection-required\") {\n throw new Error(\"Fireworks account selection is required.\");\n }\n targetId = target.targetId;\n resolvedLegacyFireworksTarget = true;\n }\n return await adapter.query(\n auth,\n signal,\n resolvedLegacyFireworksTarget\n ? remainingTimeout(timeoutMs, startedAt, `querying ${adapter.displayName} usage`)\n : timeoutMs,\n guard,\n targetId,\n );\n } catch (error) {\n if (isStaleExtensionContextError(error) || isAbortError(error)) throw error;\n throw new Error(redactUsageError(errorMessage(error), auth.secrets));\n }\n}\n\nexport function providerIsConfigured(ctx: ExtensionContext, providerId: string): boolean {\n try {\n const status = ctx.modelRegistry.getProviderAuthStatus(providerId);\n return status.configured && moonshotProviderAuthSourceIsAllowed(ctx, providerId, status.source, status.label);\n } catch {\n return !isMoonshotSiblingProvider(ctx, providerId) && candidateModels(ctx, providerId).length > 0;\n }\n}\n\nfunction moonshotProviderAuthIsAllowed(ctx: ExtensionContext, providerId: string): boolean {\n if (!isMoonshotSiblingProvider(ctx, providerId)) return true;\n try {\n const status = ctx.modelRegistry.getProviderAuthStatus(providerId);\n return moonshotProviderAuthSourceIsAllowed(ctx, providerId, status.source, status.label);\n } catch {\n return false;\n }\n}\n\nfunction moonshotProviderAuthSourceIsAllowed(\n ctx: ExtensionContext,\n providerId: string,\n source: string | undefined,\n label: string | undefined,\n): boolean {\n if (!isMoonshotSiblingProvider(ctx, providerId)) return true;\n if (source === undefined) return false;\n if (source !== \"environment\") return true;\n return (\n label !== undefined &&\n !label\n .split(\",\")\n .map((name) => name.trim())\n .includes(SHARED_MOONSHOT_ENV_VAR)\n );\n}\n\nfunction isMoonshotSiblingProvider(ctx: ExtensionContext, providerId: string): boolean {\n return (providerId === \"moonshotai\" || providerId === \"moonshotai-cn\") && ctx.model?.provider !== providerId;\n}\n\nfunction candidateModels(ctx: ExtensionContext, providerId: string): PiModel[] {\n const candidates: PiModel[] = [];\n const seen = new Set<string>();\n const add = (model: PiModel | undefined) => {\n if (!model || model.provider !== providerId) return;\n const key = `${model.provider}/${model.id}`;\n if (seen.has(key)) return;\n seen.add(key);\n candidates.push(model);\n };\n add(ctx.model);\n for (const model of ctx.modelRegistry.getAvailable()) add(model);\n for (const model of ctx.modelRegistry.getAll()) add(model);\n return candidates;\n}\n\nexport async function fetchProviderJson(\n url: string,\n auth: ResolvedUsageAuth,\n signal: AbortSignal,\n timeoutMs: number,\n description: string,\n request: {\n method?: \"GET\" | \"POST\";\n body?: Record<string, unknown>;\n redirect?: RequestRedirect;\n userAgent?: boolean;\n responseError?: (status: number, text: string) => string | undefined;\n } = {},\n): Promise<Record<string, unknown>> {\n const controller = new AbortController();\n let timedOut = false;\n const abortFromCaller = () => controller.abort();\n if (signal.aborted) controller.abort();\n else signal.addEventListener(\"abort\", abortFromCaller, { once: true });\n const timeout = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, timeoutMs);\n try {\n const headers = { ...auth.headers };\n if (request.userAgent !== false && !hasHeader(headers, \"User-Agent\")) {\n headers[\"User-Agent\"] = \"pi-usage\";\n }\n if (request.body && !hasHeader(headers, \"Content-Type\")) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n const response = await fetch(url, {\n method: request.method ?? \"GET\",\n headers,\n ...(request.body ? { body: JSON.stringify(request.body) } : {}),\n ...(request.redirect ? { redirect: request.redirect } : {}),\n signal: controller.signal,\n });\n if (response.redirected) throw new Error(`${description} refused a redirected response.`);\n if (controller.signal.aborted) throw Object.assign(new Error(\"Usage query aborted.\"), { name: \"AbortError\" });\n const text = await readBoundedResponse(\n response,\n response.ok ? MAX_SUCCESS_BODY_BYTES : MAX_ERROR_BODY_BYTES,\n !response.ok,\n description,\n controller.signal,\n );\n if (controller.signal.aborted) throw Object.assign(new Error(\"Usage query aborted.\"), { name: \"AbortError\" });\n const responseError = request.responseError?.(response.status, text);\n if (responseError) throw new Error(responseError);\n if (!response.ok) {\n throw new Error(\n `${description} returned ${response.status} ${response.statusText}: ${redactUsageError(text, auth.secrets)}`,\n );\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(text) as unknown;\n } catch (error) {\n throw new Error(`${description} returned invalid JSON: ${errorMessage(error)}`);\n }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(`${description} response was not an object.`);\n }\n return parsed as Record<string, unknown>;\n } catch (error) {\n if (timedOut) {\n throw new Error(`Timed out after ${Math.round(timeoutMs / 1000)}s while fetching usage.`);\n }\n if (signal.aborted) throw Object.assign(new Error(\"Usage query aborted.\"), { name: \"AbortError\" });\n throw error;\n } finally {\n clearTimeout(timeout);\n signal.removeEventListener(\"abort\", abortFromCaller);\n }\n}\n\nasync function readBoundedResponse(\n response: Response,\n maxBytes: number,\n truncateOverflow: boolean,\n description: string,\n signal: AbortSignal,\n): Promise<string> {\n if (!response.body) return \"\";\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n let truncated = false;\n const abort = () => void reader.cancel().catch(() => undefined);\n if (signal.aborted) abort();\n else signal.addEventListener(\"abort\", abort, { once: true });\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n const remaining = maxBytes - total;\n if (value.byteLength > remaining) {\n if (remaining > 0) chunks.push(value.subarray(0, remaining));\n total = maxBytes;\n truncated = true;\n await reader.cancel();\n break;\n }\n chunks.push(value);\n total += value.byteLength;\n }\n } finally {\n signal.removeEventListener(\"abort\", abort);\n reader.releaseLock();\n }\n if (truncated && !truncateOverflow) {\n throw new Error(`${description} response exceeded ${maxBytes} bytes.`);\n }\n const body = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n body.set(chunk, offset);\n offset += chunk.byteLength;\n }\n const text = new TextDecoder().decode(body);\n return truncated ? `${text}\u2026` : text;\n}\n\ntype RequestAuth = {\n apiKey?: string;\n headers?: Record<string, string | null>;\n baseUrl?: string;\n env?: Record<string, string>;\n};\n\ntype StoredCredentialReader = (providerId: string) => unknown;\n\ntype UsageAuthRegistry = {\n getProvider?(providerId: string): { baseUrl?: string } | undefined;\n getApiKeyAndHeaders?(model: PiModel): Promise<({ ok: true } & RequestAuth) | { ok: false; error: string }>;\n getProviderAuth?(providerId: string): Promise<\n | {\n auth: RequestAuth;\n env?: Record<string, string>;\n source?: string;\n }\n | undefined\n >;\n};\n\nfunction resolveXaiUsageAuth(\n auth: RequestAuth,\n model: PiModel,\n salt: Uint8Array,\n candidates: readonly unknown[],\n): ResolvedUsageAuth {\n const resolvedAccess = bearerToken(headerValue(auth.headers, \"Authorization\")) ?? auth.apiKey;\n if (!resolvedAccess) throw new Error(\"xAI runtime authentication was incomplete.\");\n let sawOAuth = false;\n let sawMatchingAccess = false;\n let sawIncompleteMatch = false;\n const matches: Array<{ access: string; refresh: string }> = [];\n for (const candidate of candidates) {\n try {\n const credential = asObject(candidate);\n if (credential?.type !== \"oauth\") continue;\n sawOAuth = true;\n if (credential.access !== resolvedAccess) continue;\n sawMatchingAccess = true;\n if (\n typeof credential.access !== \"string\" ||\n !credential.access ||\n typeof credential.refresh !== \"string\" ||\n !credential.refresh ||\n typeof credential.expires !== \"number\" ||\n !Number.isFinite(credential.expires)\n ) {\n sawIncompleteMatch = true;\n continue;\n }\n matches.push({ access: credential.access, refresh: credential.refresh });\n } catch {\n // Malformed candidates never authorize a consumer-proxy request.\n }\n }\n if (sawIncompleteMatch) throw new Error(\"The matching xAI OAuth credential was incomplete.\");\n if (matches.length > 1) {\n throw new Error(\"Multiple OAuth credentials match the active xAI runtime account.\");\n }\n const match = matches[0];\n if (!match) {\n if (!sawOAuth) {\n throw new Error(\n \"xAI consumer usage requires the OAuth subscription account configured through Pi /login; XAI_API_KEY users can review API spend at console.x.ai.\",\n );\n }\n if (sawMatchingAccess) throw new Error(\"The matching xAI OAuth credential was incomplete.\");\n throw new Error(\"The active xAI runtime account does not match Pi's stored OAuth account.\");\n }\n const authorization = `Bearer ${match.access}`;\n const headers = { Authorization: authorization };\n return {\n apiKey: match.access,\n headers,\n fingerprint: fingerprintResolvedAuth({ headers }, salt),\n secrets: [\n match.access,\n match.refresh,\n resolvedAccess,\n auth.apiKey,\n headerValue(auth.headers, \"Authorization\"),\n authorization,\n ].filter((value): value is string => Boolean(value)),\n model,\n };\n}\n\nfunction resolveGitHubCopilotUsageAuth(\n auth: RequestAuth,\n model: PiModel,\n salt: Uint8Array,\n candidates: readonly unknown[],\n standaloneFallback: boolean,\n): ResolvedUsageAuth {\n const resolvedAccess = bearerToken(headerValue(auth.headers, \"Authorization\")) ?? auth.apiKey;\n if (!resolvedAccess) throw new Error(\"GitHub Copilot OAuth credentials were incomplete.\");\n let sawOAuth = false;\n let sawMatchingAccess = false;\n let sawIncompleteMatch = false;\n let sawEnterpriseMatch = false;\n const matches = new Map<string, { refresh: string; storedAccess: string }>();\n for (const candidate of candidates) {\n try {\n const credential = asObject(candidate);\n if (credential?.type !== \"oauth\") continue;\n sawOAuth = true;\n const storedAccess = typeof credential.access === \"string\" && credential.access ? credential.access : undefined;\n if (storedAccess !== resolvedAccess) continue;\n sawMatchingAccess = true;\n const enterpriseUrl = credential.enterpriseUrl;\n if (typeof enterpriseUrl === \"string\" && enterpriseUrl && !isPublicGitHubDomain(enterpriseUrl)) {\n sawEnterpriseMatch = true;\n continue;\n }\n const refresh = typeof credential.refresh === \"string\" && credential.refresh ? credential.refresh : undefined;\n if (!refresh) {\n sawIncompleteMatch = true;\n continue;\n }\n matches.set(`${storedAccess.length}:${storedAccess}${refresh}`, { refresh, storedAccess });\n } catch {\n // Malformed candidates never authorize a provider request.\n }\n }\n if (sawEnterpriseMatch) {\n throw new Error(\"GitHub Copilot usage does not yet support GitHub Enterprise accounts.\");\n }\n if (sawIncompleteMatch) throw new Error(\"GitHub Copilot OAuth credentials were incomplete.\");\n if (matches.size > 1) {\n throw new Error(\"Conflicting OAuth credentials match the active GitHub Copilot runtime account.\");\n }\n const match = matches.values().next().value;\n if (!match) {\n if (!sawOAuth) {\n throw new Error(\n standaloneFallback\n ? \"GitHub Copilot usage requires the OAuth account configured through Pi /login.\"\n : \"GitHub Copilot usage requires an OAuth account configured through Pi /login or a compatible credential source.\",\n );\n }\n if (sawMatchingAccess) throw new Error(\"GitHub Copilot OAuth credentials were incomplete.\");\n throw new Error(\n standaloneFallback\n ? \"The active GitHub Copilot runtime account does not match Pi's stored OAuth account.\"\n : \"The active GitHub Copilot runtime account does not match any available OAuth account.\",\n );\n }\n const { refresh, storedAccess } = match;\n const authorization = `Bearer ${refresh}`;\n const headers = {\n Authorization: authorization,\n \"X-GitHub-Api-Version\": \"2025-05-01\",\n };\n return {\n apiKey: refresh,\n headers,\n fingerprint: fingerprintResolvedAuth({ headers }, salt),\n secrets: [refresh, storedAccess, resolvedAccess, authorization],\n model,\n };\n}\n\nfunction authorizationFrom(auth: RequestAuth): string | undefined {\n return headerValue(auth.headers, \"Authorization\") ?? (auth.apiKey ? `Bearer ${auth.apiKey}` : undefined);\n}\n\nfunction bearerToken(authorization: string | undefined): string | undefined {\n const match = /^Bearer\\s+(.+)$/iu.exec(authorization ?? \"\");\n return match?.[1];\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n return value as Record<string, unknown>;\n}\n\nfunction isPublicGitHubDomain(value: string): boolean {\n try {\n const url = new URL(value.includes(\"://\") ? value : `https://${value}`);\n return url.hostname.toLowerCase() === \"github.com\";\n } catch {\n return false;\n }\n}\n\nfunction hasOfficialOrigin(model: PiModel, providerId: string): boolean {\n return hasOfficialUrlOrigin(model.baseUrl, providerId);\n}\n\nfunction hasOfficialUrlOrigin(value: string, providerId: string): boolean {\n try {\n const url = new URL(value);\n if (providerId === \"baseten\") {\n return [\"https://inference.baseten.co\", \"https://api.baseten.co\"].includes(url.origin);\n }\n if (providerId === \"openai-codex\") return url.origin === \"https://chatgpt.com\";\n if (providerId === \"deepseek\") return url.origin === \"https://api.deepseek.com\";\n if (providerId === \"fireworks\") return url.origin === \"https://api.fireworks.ai\";\n if (providerId === \"openrouter\") return url.origin === \"https://openrouter.ai\";\n if (providerId === \"vercel-ai-gateway\") return url.origin === \"https://ai-gateway.vercel.sh\";\n if (providerId === \"opencode-go\") return url.origin === \"https://opencode.ai\";\n if (providerId === \"kimi-coding\") return url.origin === \"https://api.kimi.com\";\n if (providerId === \"minimax\") return url.origin === \"https://api.minimax.io\";\n if (providerId === \"minimax-cn\") return url.origin === \"https://api.minimaxi.com\";\n if (providerId === \"moonshotai\") return url.origin === \"https://api.moonshot.ai\";\n if (providerId === \"moonshotai-cn\") return url.origin === \"https://api.moonshot.cn\";\n if (providerId === \"xai\") return url.origin === \"https://api.x.ai\";\n if (providerId === \"zai\") return url.origin === \"https://api.z.ai\";\n if (providerId === \"zai-coding-cn\") return url.origin === \"https://open.bigmodel.cn\";\n if (providerId === \"github-copilot\") {\n return url.protocol === \"https:\" && /^api\\.[a-z0-9-]+\\.githubcopilot\\.com$/u.test(url.hostname);\n }\n return false;\n } catch {\n return false;\n }\n}\n\nfunction headerValue(headers: Record<string, string | null> | undefined, name: string): string | undefined {\n const entry = Object.entries(headers ?? {}).find(([candidate]) => candidate.toLowerCase() === name.toLowerCase());\n return entry?.[1] ?? undefined;\n}\n\nfunction hasHeader(headers: Record<string, string>, name: string): boolean {\n return Object.keys(headers).some((key) => key.toLowerCase() === name.toLowerCase());\n}\n\nfunction validatedXaiUserId(value: unknown): string {\n if (typeof value !== \"string\" || !/^[A-Za-z0-9._~-]{1,128}$/u.test(value)) {\n throw new Error(\"xAI consumer identity returned an unsafe canonical user ID.\");\n }\n return value;\n}\n\nfunction basetenBillingUsageUrl(windowAt: number): string {\n const url = new URL(BASETEN_BILLING_USAGE_URL);\n url.searchParams.set(\n \"start_date\",\n new Date(windowAt - BASETEN_USAGE_WINDOW_DAYS * 24 * 60 * 60 * 1_000).toISOString(),\n );\n url.searchParams.set(\"end_date\", new Date(windowAt).toISOString());\n return url.toString();\n}\n\nasync function queryMiniMaxUsage(\n providerId: MiniMaxProviderId,\n auth: ResolvedUsageAuth,\n signal: AbortSignal,\n timeoutMs: number,\n guard: UsageRequestGuard | undefined,\n): Promise<UsageReport> {\n if (!guard) throw new Error(\"MiniMax usage requires request-boundary revalidation.\");\n const apiKey = bearerToken(headerValue(auth.headers, \"Authorization\")) ?? auth.apiKey;\n if (!apiKey) throw new Error(\"MiniMax runtime API key was unavailable.\");\n const kind = miniMaxUsageKind(apiKey);\n const path = kind === \"account-balance\" ? \"/account/query_balance\" : \"/v1/token_plan/remains\";\n const startedAt = Date.now();\n await guard();\n const payload = (await fetchProviderJson(\n `${MINIMAX_API_ROOTS[providerId]}${path}`,\n auth,\n signal,\n remainingTimeout(timeoutMs, startedAt, \"fetching MiniMax usage\"),\n \"MiniMax usage endpoint\",\n { redirect: \"error\" },\n )) as MiniMaxUsagePayload;\n await guard();\n return normalizeMiniMaxUsagePayload(providerId, kind, payload, Date.now());\n}\n\nasync function queryMoonshotBalance(\n providerId: \"moonshotai\" | \"moonshotai-cn\",\n auth: ResolvedUsageAuth,\n signal: AbortSignal,\n timeoutMs: number,\n guard: UsageRequestGuard | undefined,\n): Promise<UsageReport> {\n if (!guard) throw new Error(\"Moonshot AI balance requires request-boundary revalidation.\");\n const startedAt = Date.now();\n await guard();\n const payload = (await fetchProviderJson(\n MOONSHOT_BALANCE_URLS[providerId],\n auth,\n signal,\n remainingTimeout(timeoutMs, startedAt, \"fetching Moonshot AI balance\"),\n \"Moonshot AI balance endpoint\",\n { redirect: \"error\" },\n )) as MoonshotBalancePayload;\n await guard();\n return normalizeMoonshotBalancePayload(providerId, payload, Date.now());\n}\n\nfunction remainingTimeout(timeoutMs: number, startedAt: number, description = \"fetching xAI consumer usage\"): number {\n const remaining = timeoutMs - (Date.now() - startedAt);\n if (remaining <= 0) throw new Error(`Timed out while ${description}.`);\n return remaining;\n}\n\nfunction zaiOrigin(baseUrl: string | undefined): string {\n const base = baseUrl?.trim();\n if (!base) throw new Error(\"Z.AI model base URL is unavailable.\");\n return new URL(base).origin;\n}\n\nfunction zaiMonitorUrl(baseUrl: string | undefined): string {\n return `${zaiOrigin(baseUrl)}/api/monitor/usage/quota/limit`;\n}\n\nfunction zaiMonitorAuth(auth: ResolvedUsageAuth): ResolvedUsageAuth {\n const authorization = headerValue(auth.headers, \"Authorization\");\n const token = authorization === undefined ? undefined : (bearerToken(authorization) ?? authorization);\n if (token === undefined || token === authorization) return auth;\n return { ...auth, headers: { ...auth.headers, Authorization: token } };\n}\n\nasync function queryZaiUsage(\n providerId: \"zai\" | \"zai-coding-cn\",\n providerName: string,\n auth: ResolvedUsageAuth,\n signal: AbortSignal,\n timeoutMs: number,\n guard: UsageRequestGuard | undefined,\n): Promise<UsageReport> {\n if (!guard) throw new Error(\"Z.AI usage requires request-boundary revalidation.\");\n const startedAt = Date.now();\n await guard();\n const payload = (await fetchProviderJson(\n zaiMonitorUrl(auth.model.baseUrl),\n zaiMonitorAuth(auth),\n signal,\n remainingTimeout(timeoutMs, startedAt, `fetching ${providerName} quota`),\n `${providerName} quota endpoint`,\n { responseError: zaiResponseError },\n )) as ZaiQuotaPayload;\n await guard();\n const planTimeoutMs = timeoutMs - (Date.now() - startedAt);\n const plan = await fetchZaiPlan(providerName, auth, signal, planTimeoutMs);\n return normalizeZaiQuotaPayload(providerId, providerName, payload, Date.now(), plan);\n}\n\n// The subscription endpoint is undocumented and may not exist on every official origin. It only\n// contributes the plan name and renewal date, so any non-abort failure is swallowed instead of\n// blanking the required quota report.\nasync function fetchZaiPlan(\n providerName: string,\n auth: ResolvedUsageAuth,\n signal: AbortSignal,\n timeoutMs: number,\n): Promise<ZaiPlanInfo | undefined> {\n if (timeoutMs <= 0 || signal.aborted) return undefined;\n try {\n const payload = (await fetchProviderJson(\n `${zaiOrigin(auth.model.baseUrl)}/api/biz/subscription/list`,\n zaiMonitorAuth(auth),\n signal,\n timeoutMs,\n `${providerName} plan endpoint`,\n { responseError: zaiResponseError },\n )) as ZaiSubscriptionPayload;\n return normalizeZaiSubscriptionPayload(payload);\n } catch (error) {\n if (isAbortError(error)) throw error;\n return undefined;\n }\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === \"AbortError\";\n}\n", "import type { BasetenBillingUsagePayload, UsageMetric, UsageReport } from \"../types.js\";\n\nconst DECIMAL_AMOUNT = /^(?:0|[1-9]\\d*)(?:\\.\\d+)?$/u;\n\nexport function normalizeBasetenBillingUsagePayload(\n payload: BasetenBillingUsagePayload,\n capturedAt: number,\n): UsageReport {\n if (payload.model_apis_usage === undefined || payload.model_apis_usage === null) {\n return report(capturedAt, [], [\"Baseten returned no Model APIs usage for the last 30 days.\"]);\n }\n const usage = asObject(payload.model_apis_usage);\n if (!usage) throw new Error(\"Baseten Model APIs usage was not an object.\");\n const metrics: UsageMetric[] = [\n metric(\"gross-usage\", \"Gross usage\", usage.total),\n metric(\"credits-used\", \"Credits used\", usage.credits_used),\n metric(\"net-subtotal\", \"Net subtotal\", usage.subtotal),\n ];\n return report(capturedAt, metrics);\n}\n\nfunction report(capturedAt: number, metrics: UsageMetric[], notes?: string[]): UsageReport {\n return {\n providerId: \"baseten\",\n providerName: \"Baseten\",\n capturedAt,\n source: \"baseten-billing-usage-summary\",\n semantics: { kind: \"api-key\", label: \"Organization Model APIs spend\" },\n buckets: [],\n metrics,\n ...(notes ? { notes } : {}),\n };\n}\n\nfunction metric(id: string, label: string, value: unknown): UsageMetric {\n const amount = decimalAmount(value, label);\n return { id, label, value: amount, unit: \"currency\", currency: \"USD\" };\n}\n\nfunction decimalAmount(value: unknown, label: string): string {\n const normalized = typeof value === \"number\" && Number.isFinite(value) ? String(value) : value;\n if (typeof normalized !== \"string\" || normalized.length > 64 || !DECIMAL_AMOUNT.test(normalized)) {\n throw new Error(`Baseten ${label.toLowerCase()} was not a valid nonnegative amount.`);\n }\n return normalized;\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n return value as Record<string, unknown>;\n}\n", "import { sanitizeDisplayText } from \"../core.js\";\nimport type { CodexBackendPayload, UsageBucket, UsageMetric, UsageReport } from \"../types.js\";\n\nexport function normalizeCodexBackendPayload(payload: CodexBackendPayload, capturedAt: number): UsageReport {\n const buckets: UsageBucket[] = [];\n normalizeRateLimitGroup(buckets, \"codex\", \"Codex\", payload.rate_limit, false);\n\n const additional = Array.isArray(payload.additional_rate_limits) ? payload.additional_rate_limits : [];\n for (const item of additional) {\n const value = asObject(item);\n const id = asString(value?.metered_feature) ?? asString(value?.limit_name);\n if (!value || !id) continue;\n try {\n normalizeRateLimitGroup(buckets, id, asString(value.limit_name) ?? id, value.rate_limit, true);\n } catch {\n // Optional provider-specific buckets must not hide otherwise useful primary data.\n }\n }\n\n const metrics: UsageMetric[] = [];\n const credits = asObject(payload.credits);\n if (credits?.has_credits === true) {\n if (credits.unlimited === true) {\n metrics.push({ id: \"credits\", label: \"Credits\", value: \"unlimited\" });\n } else {\n const balance = asNumber(credits.balance);\n if (balance !== undefined) {\n metrics.push({ id: \"credits\", label: \"Credits\", value: balance, unit: \"count\" });\n } else {\n metrics.push({ id: \"credits\", label: \"Credits\", value: \"available\" });\n }\n }\n } else if (credits?.has_credits === false) {\n metrics.push({ id: \"credits\", label: \"Credits\", value: \"none\" });\n }\n const resetCredits = asObject(payload.rate_limit_reset_credits);\n const resetCount = asNonnegativeInteger(resetCredits?.available_count);\n if (resetCount !== undefined) {\n metrics.push({\n id: \"reset-credits\",\n label: \"Usage limit resets\",\n value: resetCount,\n unit: \"count\",\n });\n }\n if (buckets.length === 0 && metrics.length === 0) {\n throw new Error(\"Codex usage endpoint returned no displayable usage data.\");\n }\n\n const planType = asString(payload.plan_type);\n return {\n providerId: \"openai-codex\",\n providerName: \"OpenAI Codex\",\n capturedAt,\n source: \"codex-pi-auth\",\n semantics: {\n kind: \"consumer-subscription\",\n label: \"ChatGPT subscription limits\",\n },\n buckets,\n metrics,\n ...(planType ? { notes: [`Plan: ${planType}`] } : {}),\n };\n}\n\nfunction normalizeRateLimitGroup(\n buckets: UsageBucket[],\n groupId: string,\n groupLabel: string,\n raw: unknown,\n optional: boolean,\n): void {\n if (raw === undefined || raw === null) return;\n const details = asObject(raw);\n if (!details) {\n if (optional) return;\n throw new Error(\"Codex rate limit was not an object.\");\n }\n addWindow(buckets, groupId, groupLabel, \"primary\", details.primary_window);\n addWindow(buckets, groupId, groupLabel, \"secondary\", details.secondary_window);\n}\n\nfunction addWindow(\n buckets: UsageBucket[],\n groupId: string,\n groupLabel: string,\n position: \"primary\" | \"secondary\",\n raw: unknown,\n): void {\n if (raw === undefined || raw === null) return;\n const value = asObject(raw);\n if (!value) throw new Error(\"Codex rate-limit window was not an object.\");\n const used = asNumber(value.used_percent);\n if (used === undefined) return;\n const seconds = asNumber(value.limit_window_seconds);\n const resetsAt = asNumber(value.reset_at);\n buckets.push({\n id: `${groupId}:${position}`,\n label: position === \"primary\" ? \"Primary limit\" : \"Secondary limit\",\n groupId,\n groupLabel,\n modelKeys: [groupId, groupLabel],\n used,\n remaining: 100 - clampPercent(used),\n limit: 100,\n unit: \"percent\",\n ...(seconds !== undefined && seconds > 0 ? { windowMinutes: Math.ceil(seconds / 60) } : {}),\n ...(resetsAt !== undefined ? { resetsAt } : {}),\n });\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n return value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n return sanitizeDisplayText(value, 160) || undefined;\n}\n\nfunction asNumber(value: unknown): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n return undefined;\n}\n\nfunction asNonnegativeInteger(value: unknown): number | undefined {\n const parsed = asNumber(value);\n if (parsed === undefined || !Number.isSafeInteger(parsed)) return undefined;\n return Math.max(0, parsed);\n}\n\nfunction clampPercent(value: number): number {\n return Math.min(100, Math.max(0, value));\n}\n", "import type { DeepSeekBalancePayload, UsageMetric, UsageReport } from \"../types.js\";\n\nconst CURRENCIES = [\"CNY\", \"USD\"] as const;\ntype DeepSeekCurrency = (typeof CURRENCIES)[number];\n\nconst BALANCE_FIELDS = [\n [\"total\", \"Total balance\", \"total_balance\"],\n [\"granted\", \"Granted balance\", \"granted_balance\"],\n [\"topped-up\", \"Topped-up balance\", \"topped_up_balance\"],\n] as const;\n\nexport function normalizeDeepSeekBalancePayload(payload: DeepSeekBalancePayload, capturedAt: number): UsageReport {\n if (typeof payload.is_available !== \"boolean\") {\n throw new Error(\"DeepSeek API balance response availability was not a boolean.\");\n }\n if (!Array.isArray(payload.balance_infos) || payload.balance_infos.length === 0) {\n throw new Error(\"DeepSeek API balance response returned no balance information.\");\n }\n\n const balances = new Map<DeepSeekCurrency, Record<string, unknown>>();\n for (const raw of payload.balance_infos) {\n const balance = asObject(raw);\n if (!balance) throw new Error(\"DeepSeek API balance row was not an object.\");\n const currency = deepSeekCurrency(balance.currency);\n if (!currency) throw new Error(\"DeepSeek API balance row returned an unsupported currency.\");\n if (balances.has(currency)) {\n throw new Error(`DeepSeek API balance response repeated ${currency}.`);\n }\n for (const [, label, field] of BALANCE_FIELDS) {\n if (!decimalAmount(balance[field])) {\n throw new Error(`DeepSeek API balance ${label.toLowerCase()} was not a valid amount.`);\n }\n }\n balances.set(currency, balance);\n }\n\n const metrics: UsageMetric[] = [\n {\n id: \"api-availability\",\n label: \"API calls\",\n value: payload.is_available ? \"available\" : \"unavailable\",\n },\n ];\n for (const currency of CURRENCIES) {\n const balance = balances.get(currency);\n if (!balance) continue;\n for (const [id, label, field] of BALANCE_FIELDS) {\n metrics.push({\n id: `${currency.toLowerCase()}-${id}`,\n label,\n value: balance[field] as string,\n unit: \"currency\",\n currency,\n });\n }\n }\n\n return {\n providerId: \"deepseek\",\n providerName: \"DeepSeek\",\n capturedAt,\n source: \"deepseek-balance\",\n semantics: { kind: \"api-key\", label: \"DeepSeek API balance\" },\n buckets: [],\n metrics,\n };\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n return value as Record<string, unknown>;\n}\n\nfunction deepSeekCurrency(value: unknown): DeepSeekCurrency | undefined {\n return CURRENCIES.find((currency) => currency === value);\n}\n\nfunction decimalAmount(value: unknown): value is string {\n return typeof value === \"string\" && value.length <= 64 && /^(?:0|[1-9]\\d*)(?:\\.\\d+)?$/u.test(value);\n}\n", "import { sanitizeDisplayText } from \"../core.js\";\nimport type {\n FireworksAccountsPayload,\n FireworksBillingSummaryPayload,\n ResolvedUsageAuth,\n UsageMetric,\n UsageProviderAdapter,\n UsageReport,\n} from \"../types.js\";\n\nconst NANOS_PER_UNIT = 1_000_000_000n;\nconst CURRENCY_PATTERN = /^[A-Z]{3}$/u;\nconst ACCOUNT_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._~-]{0,127}$/u;\nconst INTEGER_PATTERN = /^-?\\d+$/u;\nconst INT64_MIN = -(2n ** 63n);\nconst INT64_MAX = 2n ** 63n - 1n;\nconst MAX_UNITS_CHARS = 20;\nconst MAX_NANOS_CHARS = 11;\nconst FIREWORKS_BILLING_SUMMARY_ORIGIN = \"https://api.fireworks.ai\";\nconst FIREWORKS_SPEND_WINDOW_DAYS = 30;\nconst FIREWORKS_MAX_ACCOUNT_PAGES = 5;\n\nconst SERIES_KEYS = [\"serverless\", \"dedicated\", \"training\", \"other\"] as const;\ntype SeriesKey = (typeof SERIES_KEYS)[number];\n\nconst SERIES_LABELS: Readonly<Record<SeriesKey, string>> = {\n serverless: \"Serverless\",\n dedicated: \"Dedicated deployments\",\n training: \"Training\",\n other: \"Other\",\n};\n\nexport function isFireworksAccountId(value: unknown): value is string {\n return typeof value === \"string\" && ACCOUNT_ID_PATTERN.test(value);\n}\n\nexport function normalizeFireworksAccountsPayload(payload: FireworksAccountsPayload): string[] {\n if (!Array.isArray(payload.accounts)) {\n throw new Error(\"Fireworks accounts response did not contain an accounts array.\");\n }\n const accounts: string[] = [];\n for (const raw of payload.accounts) {\n const account = asObject(raw);\n if (!account) throw new Error(\"Fireworks accounts response row was not an object.\");\n if (typeof account.name !== \"string\") {\n throw new Error(\"Fireworks accounts response omitted the account resource name.\");\n }\n const match = /^accounts\\/([^/]+)$/u.exec(account.name);\n if (!match || !isFireworksAccountId(match[1])) {\n throw new Error(\"Fireworks accounts response returned an unsafe account resource name.\");\n }\n const accountId = match[1];\n if (accounts.includes(accountId)) {\n throw new Error(`Fireworks accounts response repeated ${accountId}.`);\n }\n accounts.push(accountId);\n }\n return accounts;\n}\n\ntype FetchProviderJson = (\n url: string,\n auth: ResolvedUsageAuth,\n signal: AbortSignal,\n timeoutMs: number,\n description: string,\n request?: { redirect?: RequestRedirect },\n) => Promise<Record<string, unknown>>;\n\nexport function createFireworksAdapter(fetchProviderJson: FetchProviderJson): UsageProviderAdapter {\n return {\n id: \"fireworks\",\n displayName: \"Fireworks\",\n semantics: { kind: \"api-key\", label: \"Fireworks API spend\" },\n targets: {\n singularLabel: \"account\",\n pluralLabel: \"accounts\",\n async list(auth, signal, timeoutMs, guard) {\n const startedAt = Date.now();\n const accounts: string[] = [];\n let pageToken: string | undefined;\n for (let page = 0; page < FIREWORKS_MAX_ACCOUNT_PAGES; page += 1) {\n await guard();\n const payload = (await fetchProviderJson(\n fireworksAccountsUrl(pageToken),\n auth,\n signal,\n remainingTimeout(timeoutMs, startedAt, \"fetching Fireworks accounts\"),\n \"Fireworks accounts endpoint\",\n { redirect: \"error\" },\n )) as FireworksAccountsPayload;\n await guard();\n for (const accountId of normalizeFireworksAccountsPayload(payload)) {\n if (accounts.includes(accountId)) {\n throw new Error(`Fireworks accounts listing repeated ${accountId}.`);\n }\n accounts.push(accountId);\n }\n pageToken = fireworksNextPageToken(payload.nextPageToken);\n if (!pageToken) break;\n }\n if (pageToken) {\n throw new Error(`Fireworks account listing exceeded ${FIREWORKS_MAX_ACCOUNT_PAGES} pages.`);\n }\n return accounts.map((id) => ({ id, label: id }));\n },\n },\n async query(auth, signal, timeoutMs, guard, targetId) {\n if (!guard) throw new Error(\"Fireworks API spend requires request-boundary revalidation.\");\n if (!isFireworksAccountId(targetId)) {\n throw new Error(\"Fireworks billing requires a safe selected account slug.\");\n }\n const startedAt = Date.now();\n await guard();\n const billingWindowAt = Date.now();\n const payload = (await fetchProviderJson(\n fireworksBillingSummaryUrl(targetId, billingWindowAt),\n auth,\n signal,\n remainingTimeout(timeoutMs, startedAt, \"fetching Fireworks rated spend\"),\n \"Fireworks billing summary endpoint\",\n { redirect: \"error\" },\n )) as FireworksBillingSummaryPayload;\n await guard();\n return normalizeFireworksBillingSummaryPayload(payload, targetId, Date.now());\n },\n };\n}\n\nexport function normalizeFireworksBillingSummaryPayload(\n payload: FireworksBillingSummaryPayload,\n accountId: string,\n capturedAt: number,\n): UsageReport {\n if (!isFireworksAccountId(accountId)) {\n throw new Error(\"Fireworks billing summary received an unsafe account identifier.\");\n }\n if (payload.lineItems !== undefined && !Array.isArray(payload.lineItems)) {\n throw new Error(\"Fireworks billing summary lineItems was not an array.\");\n }\n\n const totals = new Map<string, Map<SeriesKey, bigint>>();\n for (const raw of payload.lineItems ?? []) {\n const lineItem = asObject(raw);\n if (!lineItem) throw new Error(\"Fireworks billing line item was not an object.\");\n const cost = moneyAmount(lineItem.totalCost, \"line item total cost\");\n const series = seriesKey(lineItem.series);\n let amounts = totals.get(cost.currency);\n if (!amounts) {\n amounts = new Map<SeriesKey, bigint>();\n totals.set(cost.currency, amounts);\n }\n amounts.set(series, (amounts.get(series) ?? 0n) + cost.amount);\n }\n\n const metrics: UsageMetric[] = [];\n for (const [currency, amounts] of totals) {\n metrics.push({\n id: `${currency.toLowerCase()}-total`,\n label: \"Total spend\",\n value: formatMoneyAmount(sumSeries(amounts)),\n unit: \"currency\",\n currency,\n });\n for (const series of SERIES_KEYS) {\n const amount = amounts.get(series);\n if (amount === undefined) continue;\n metrics.push({\n id: `${currency.toLowerCase()}-${series}`,\n label: SERIES_LABELS[series],\n value: formatMoneyAmount(amount),\n unit: \"currency\",\n currency,\n });\n }\n }\n\n const notes = [\"Rated line items may differ from the final invoice once credits or adjustments are applied.\"];\n if (metrics.length === 0) {\n notes.push(\"Fireworks returned no rated line items for the last 30 days.\");\n }\n\n return {\n providerId: \"fireworks\",\n providerName: \"Fireworks\",\n capturedAt,\n source: \"fireworks-billing-summary\",\n semantics: { kind: \"api-key\", label: \"Fireworks API spend\" },\n accountLabel: sanitizeDisplayText(accountId, 80),\n buckets: [],\n metrics,\n notes,\n };\n}\n\ntype RatedMoney = { currency: string; amount: bigint };\n\nfunction moneyAmount(value: unknown, description: string): RatedMoney {\n const money = asObject(value);\n if (!money) throw new Error(`Fireworks billing ${description} was not a money object.`);\n const currency = typeof money.currencyCode === \"string\" ? money.currencyCode : undefined;\n if (!currency || !CURRENCY_PATTERN.test(currency)) {\n throw new Error(`Fireworks billing ${description} currency was not an ISO 4217 code.`);\n }\n // proto3 JSON omits zero-valued money fields, so absent components default to zero.\n const units =\n money.units === undefined ? 0n : integerComponent(money.units, description, \"whole units\", MAX_UNITS_CHARS);\n if (units < INT64_MIN || units > INT64_MAX) {\n throw new Error(`Fireworks billing ${description} whole units exceeded the int64 range.`);\n }\n const nanos =\n money.nanos === undefined ? 0n : integerComponent(money.nanos, description, \"nano units\", MAX_NANOS_CHARS);\n if (nanos <= -NANOS_PER_UNIT || nanos >= NANOS_PER_UNIT) {\n throw new Error(`Fireworks billing ${description} nano units exceeded the Money range.`);\n }\n if ((units > 0n && nanos < 0n) || (units < 0n && nanos > 0n)) {\n throw new Error(`Fireworks billing ${description} mixed unit and nano signs.`);\n }\n return { currency, amount: units * NANOS_PER_UNIT + nanos };\n}\n\nfunction integerComponent(value: unknown, description: string, component: string, maxChars: number): bigint {\n const text =\n typeof value === \"number\" && Number.isSafeInteger(value)\n ? String(value)\n : typeof value === \"string\" && INTEGER_PATTERN.test(value)\n ? value\n : undefined;\n if (text === undefined || text.length > maxChars) {\n throw new Error(`Fireworks billing ${description} ${component} was not a bounded integer.`);\n }\n return BigInt(text);\n}\n\nfunction seriesKey(value: unknown): SeriesKey {\n if (value === undefined || value === null) return \"other\";\n if (typeof value !== \"string\") throw new Error(\"Fireworks billing line item series was invalid.\");\n if (value === \"SERVERLESS\") return \"serverless\";\n if (value === \"DEDICATED_DEPLOYMENT\") return \"dedicated\";\n if (value === \"TRAINING\") return \"training\";\n return \"other\";\n}\n\nfunction sumSeries(amounts: ReadonlyMap<SeriesKey, bigint>): bigint {\n let total = 0n;\n for (const amount of amounts.values()) total += amount;\n return total;\n}\n\nfunction formatMoneyAmount(amount: bigint): string {\n const negative = amount < 0n;\n const magnitude = negative ? -amount : amount;\n const units = magnitude / NANOS_PER_UNIT;\n const nanos = (magnitude % NANOS_PER_UNIT).toString().padStart(9, \"0\").replace(/0+$/u, \"\");\n return `${negative ? \"-\" : \"\"}${units.toString()}${nanos ? `.${nanos}` : \"\"}`;\n}\n\nfunction fireworksAccountsUrl(pageToken: string | undefined): string {\n const url = new URL(\"/v1/accounts\", FIREWORKS_BILLING_SUMMARY_ORIGIN);\n url.searchParams.set(\"pageSize\", \"200\");\n if (pageToken !== undefined) url.searchParams.set(\"pageToken\", pageToken);\n return url.toString();\n}\n\nfunction fireworksNextPageToken(value: unknown): string | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value !== \"string\" || !value || value.length > 512) {\n throw new Error(\"Fireworks accounts listing returned an invalid page token.\");\n }\n return value;\n}\n\nfunction fireworksBillingSummaryUrl(accountId: string, startedAt: number): string {\n const dayMs = 24 * 60 * 60 * 1000;\n const dayFloor = (time: number) => `${new Date(time).toISOString().slice(0, 10)}T00:00:00Z`;\n const url = new URL(`/v1/accounts/${accountId}/billing/summary`, FIREWORKS_BILLING_SUMMARY_ORIGIN);\n url.searchParams.set(\"startTime\", dayFloor(startedAt - (FIREWORKS_SPEND_WINDOW_DAYS - 1) * dayMs));\n url.searchParams.set(\"endTime\", dayFloor(startedAt + dayMs));\n return url.toString();\n}\n\nfunction remainingTimeout(timeoutMs: number, startedAt: number, description: string): number {\n const remaining = timeoutMs - (Date.now() - startedAt);\n if (remaining <= 0) throw new Error(`Timed out while ${description}.`);\n return remaining;\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n return value as Record<string, unknown>;\n}\n", "import { sanitizeDisplayText } from \"../core.js\";\nimport type { GitHubCopilotUsagePayload, UsageBucket, UsageReport } from \"../types.js\";\n\nexport function normalizeGitHubCopilotUsagePayload(\n payload: GitHubCopilotUsagePayload,\n capturedAt: number,\n): UsageReport {\n const snapshots = asObject(payload.quota_snapshots);\n const premium = asObject(snapshots?.premium_interactions);\n const metrics: UsageReport[\"metrics\"] = [];\n let semanticsLabel: string;\n let bucket: UsageBucket;\n\n if (premium) {\n const tokenBasedBilling = premium.token_based_billing === true;\n const id = tokenBasedBilling ? \"ai-credits\" : \"premium-requests\";\n const label = tokenBasedBilling ? \"AI credits\" : \"Premium requests\";\n semanticsLabel = tokenBasedBilling ? \"GitHub Copilot AI Credits allowance\" : \"GitHub Copilot premium request quota\";\n\n if (premium.unlimited === true) {\n bucket = { id, label, unit: \"count\" };\n } else {\n const entitlement = asNonnegativeNumber(premium.entitlement);\n const rawRemaining = asFiniteNumber(premium.remaining) ?? asFiniteNumber(premium.quota_remaining);\n if (entitlement === undefined || rawRemaining === undefined) {\n throw new Error(`GitHub Copilot ${label.toLowerCase()} quota was incomplete.`);\n }\n const overageUsed = Math.max(asNonnegativeNumber(premium.overage_count) ?? 0, Math.max(0, -rawRemaining));\n if (overageUsed > 0) {\n metrics.push({\n id: \"overage-used\",\n label: \"Additional usage\",\n value: overageUsed,\n unit: \"count\",\n });\n }\n bucket = {\n id,\n label,\n used: asNonnegativeNumber(premium.credits_used) ?? Math.max(0, entitlement - rawRemaining),\n remaining: Math.max(0, rawRemaining),\n limit: entitlement,\n unit: \"count\",\n period: \"monthly\",\n ...resetTimestamp(payload),\n };\n }\n } else {\n const limited = asObject(payload.limited_user_quotas);\n const monthly = asObject(payload.monthly_quotas);\n const remaining = asNonnegativeNumber(limited?.chat);\n const entitlement = asNonnegativeNumber(monthly?.chat);\n if (remaining === undefined || entitlement === undefined) {\n throw new Error(\"GitHub Copilot usage response contained no supported quota.\");\n }\n semanticsLabel = \"GitHub Copilot Free chat quota\";\n bucket = {\n id: \"chat-requests\",\n label: \"Chat requests\",\n used: Math.max(0, entitlement - remaining),\n remaining,\n limit: entitlement,\n unit: \"count\",\n period: \"monthly\",\n ...resetTimestamp(payload),\n };\n }\n\n const notes: string[] = [];\n const plan = asString(payload.copilot_plan) ?? asString(payload.access_type_sku);\n if (plan) notes.push(`Plan: ${plan}`);\n\n return {\n providerId: \"github-copilot\",\n providerName: \"GitHub Copilot\",\n capturedAt,\n source: \"github-copilot-user\",\n semantics: { kind: \"consumer-subscription\", label: semanticsLabel },\n accountLabel: asString(payload.login),\n buckets: [bucket],\n metrics,\n ...(notes.length > 0 ? { notes } : {}),\n };\n}\n\nfunction resetTimestamp(payload: GitHubCopilotUsagePayload): { resetsAt?: number } {\n const raw =\n asString(payload.quota_reset_date_utc) ??\n asString(payload.quota_reset_date) ??\n asString(payload.limited_user_reset_date);\n if (!raw) return {};\n const milliseconds = Date.parse(raw);\n return Number.isNaN(milliseconds) ? {} : { resetsAt: Math.floor(milliseconds / 1000) };\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n return value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n return sanitizeDisplayText(value, 80) || undefined;\n}\n\nfunction asFiniteNumber(value: unknown): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return undefined;\n return value;\n}\n\nfunction asNonnegativeNumber(value: unknown): number | undefined {\n const number = asFiniteNumber(value);\n return number === undefined || number < 0 ? undefined : number;\n}\n", "import { sanitizeDisplayText } from \"../core.js\";\nimport type { KimiCodingUsagePayload, UsageBucket, UsageMetric, UsageReport } from \"../types.js\";\n\nconst FIVE_HOUR_WINDOW_MINUTES = 300;\nconst DAILY_WINDOW_MINUTES = 1_440;\nconst WEEKLY_WINDOW_MINUTES = 10_080;\nconst FIXED_POINT_UNITS_PER_CENT = 1_000_000;\n\n/**\n * Source contract revalidated on 2026-08-27.\n * Pi c49906ec77788625aacbdc53ebca6fbe65bd20f5 defines provider `kimi-coding`,\n * `https://api.kimi.com/coding`, API-key auth, and OAuth Bearer auth:\n * https://github.com/earendil-works/pi/blob/c49906ec77788625aacbdc53ebca6fbe65bd20f5/packages/ai/src/providers/kimi-coding.ts\n * https://github.com/earendil-works/pi/blob/c49906ec77788625aacbdc53ebca6fbe65bd20f5/packages/ai/src/auth/oauth/kimi-coding.ts\n * Kimi Code 676e4d82240855044fe809fea89ce1dbe8e512cf defines `GET /coding/v1/usages`,\n * numeric-string plan rows, proto-style windows, and 1,000,000 fixed-point units per cent:\n * https://github.com/MoonshotAI/kimi-code/blob/676e4d82240855044fe809fea89ce1dbe8e512cf/packages/oauth/src/managed-usage.ts\n * Live responses observed on 2026-09-12 omit both `used` and `remaining` on untouched rows and may report only\n * `remaining` once usage starts, so a row with a positive `limit` and no counters means zero usage, and when only\n * one counter is present the other is derived from `limit`. Counters that are present but malformed stay rejected.\n */\nexport function normalizeKimiCodingUsagePayload(payload: KimiCodingUsagePayload, capturedAt: number): UsageReport {\n const root = asObject(payload);\n if (!root) throw new Error(\"Kimi Coding usage response was not an object.\");\n\n const candidates: UsageBucket[] = [];\n let omittedWindow = false;\n const summary = parseUsageRow(root.usage, WEEKLY_WINDOW_MINUTES, \"Weekly window\");\n if (summary) candidates.push(summary);\n else if (root.usage !== undefined) omittedWindow = true;\n\n if (Array.isArray(root.limits)) {\n for (const raw of root.limits) {\n const item = asObject(raw);\n const windowMinutes = parseWindowMinutes(item?.window);\n const label = sanitizedLabel(item?.name);\n const bucket =\n windowMinutes === undefined\n ? undefined\n : parseUsageRow(item?.detail, windowMinutes, label ?? defaultWindowLabel(windowMinutes));\n if (bucket) candidates.push(bucket);\n else omittedWindow = true;\n }\n } else if (root.limits !== undefined) {\n omittedWindow = true;\n }\n\n const buckets: UsageBucket[] = [];\n const byWindow = new Map<number, UsageBucket[]>();\n for (const bucket of candidates) {\n const windowMinutes = bucket.windowMinutes as number;\n byWindow.set(windowMinutes, [...(byWindow.get(windowMinutes) ?? []), bucket]);\n }\n for (const rows of byWindow.values()) {\n if (rows.length === 1) buckets.push(rows[0] as UsageBucket);\n else omittedWindow = true;\n }\n buckets.sort((left, right) => (left.windowMinutes ?? 0) - (right.windowMinutes ?? 0));\n\n const metrics = parseBoosterWallet(root.boosterWallet);\n if (buckets.length === 0 && metrics.length === 0) {\n throw new Error(\"Kimi Coding usage endpoint returned no displayable usage data.\");\n }\n\n return {\n providerId: \"kimi-coding\",\n providerName: \"Kimi For Coding\",\n capturedAt,\n source: \"kimi-managed-usage\",\n semantics: { kind: \"consumer-subscription\", label: \"Kimi Coding Plan usage\" },\n buckets,\n metrics,\n ...(omittedWindow ? { notes: [\"Unsupported, malformed, or duplicate plan windows were unavailable.\"] } : {}),\n };\n}\n\nfunction parseUsageRow(value: unknown, windowMinutes: number, label: string): UsageBucket | undefined {\n const row = asObject(value);\n if (!row) return undefined;\n const limit = asNonnegativeInteger(row.limit);\n if (limit === undefined || limit === 0) return undefined;\n const usedRaw = asNonnegativeInteger(row.used);\n const remainingRaw = asNonnegativeInteger(row.remaining);\n // Counters that are present but malformed reject the row instead of silently inventing a count.\n if (\n (row.used !== undefined && usedRaw === undefined) ||\n (row.remaining !== undefined && remainingRaw === undefined)\n ) {\n return undefined;\n }\n // Live responses omit both counters on untouched rows, so a bare `limit` means zero usage.\n const used = usedRaw ?? (remainingRaw === undefined ? 0 : Math.max(0, limit - remainingRaw));\n const remaining = remainingRaw ?? Math.max(0, limit - used);\n const resetsAt = asIsoEpochSeconds(row.resetTime);\n return {\n id: windowId(windowMinutes),\n label,\n used,\n remaining,\n limit,\n unit: \"count\",\n windowMinutes,\n ...(resetsAt !== undefined ? { resetsAt } : {}),\n };\n}\n\nfunction parseWindowMinutes(value: unknown): number | undefined {\n const window = asObject(value);\n if (!window) return undefined;\n const duration = asPositiveInteger(window.duration);\n if (duration === undefined) return undefined;\n const multiplier =\n window.timeUnit === \"TIME_UNIT_MINUTE\"\n ? 1\n : window.timeUnit === \"TIME_UNIT_HOUR\"\n ? 60\n : window.timeUnit === \"TIME_UNIT_DAY\"\n ? 1_440\n : window.timeUnit === \"TIME_UNIT_WEEK\"\n ? 10_080\n : undefined;\n if (multiplier === undefined) return undefined;\n const minutes = duration * multiplier;\n return Number.isSafeInteger(minutes) ? minutes : undefined;\n}\n\nfunction parseBoosterWallet(value: unknown): UsageMetric[] {\n const wallet = asObject(value);\n const balance = asObject(wallet?.balance);\n if (!wallet || !balance || balance.type !== \"BOOSTER\") return [];\n const totalRaw = asPositiveInteger(balance.amount);\n if (totalRaw === undefined) return [];\n const leftRaw = asNonnegativeInteger(balance.amountLeft) ?? 0;\n const monthlyLimit = parseMoney(wallet.monthlyChargeLimit);\n const monthlyUsed = parseMoney(wallet.monthlyUsed);\n const currencies = new Set(\n [monthlyLimit?.currency, monthlyUsed?.currency].filter((currency): currency is string => currency !== undefined),\n );\n if (currencies.size !== 1) return [];\n const currency = currencies.values().next().value;\n if (!currency) return [];\n const total = fixedPointToMajor(totalRaw);\n const left = fixedPointToMajor(leftRaw);\n if (total === undefined || left === undefined) return [];\n\n const metrics: UsageMetric[] = [\n { id: \"booster-balance\", label: \"Balance\", value: left, unit: \"currency\", currency },\n { id: \"booster-total\", label: \"Total balance\", value: total, unit: \"currency\", currency },\n ];\n if (monthlyUsed) {\n metrics.push({\n id: \"booster-monthly-used\",\n label: \"Used this month\",\n value: monthlyUsed.cents / 100,\n unit: \"currency\",\n currency,\n });\n }\n if (wallet.monthlyChargeLimitEnabled === false) {\n metrics.push({\n id: \"booster-monthly-limit\",\n label: \"Monthly limit\",\n value: \"unlimited\",\n unit: \"currency\",\n currency,\n });\n } else if (wallet.monthlyChargeLimitEnabled === true && monthlyLimit) {\n metrics.push({\n id: \"booster-monthly-limit\",\n label: \"Monthly limit\",\n value: monthlyLimit.cents / 100,\n unit: \"currency\",\n currency,\n });\n }\n return metrics;\n}\n\nfunction parseMoney(value: unknown): { cents: number; currency: string } | undefined {\n const money = asObject(value);\n if (!money) return undefined;\n const cents = asNonnegativeInteger(money.priceInCents);\n if (cents === undefined) return undefined;\n const currency = asCurrency(money.currency);\n if (!currency) return undefined;\n return { cents, currency };\n}\n\nfunction fixedPointToMajor(value: number): number | undefined {\n const cents = value / FIXED_POINT_UNITS_PER_CENT;\n const roundedCents = cents > 0 && cents < 1 ? 1 : Math.round(cents);\n const major = roundedCents / 100;\n return Number.isSafeInteger(roundedCents) && Number.isFinite(major) ? major : undefined;\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n return value as Record<string, unknown>;\n}\n\nfunction asNonnegativeInteger(value: unknown): number | undefined {\n if (typeof value === \"string\" && !/^\\d+$/u.test(value)) return undefined;\n const number = typeof value === \"string\" ? Number(value) : value;\n if (typeof number !== \"number\" || !Number.isSafeInteger(number) || number < 0) return undefined;\n return number;\n}\n\nfunction asPositiveInteger(value: unknown): number | undefined {\n const number = asNonnegativeInteger(value);\n return number !== undefined && number > 0 ? number : undefined;\n}\n\nfunction asIsoEpochSeconds(value: unknown): number | undefined {\n if (typeof value !== \"string\") return undefined;\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(?:\\.\\d+)?(?:Z|([+-])(\\d{2}):(\\d{2}))$/u.exec(value);\n if (!match) return undefined;\n const [, yearText, monthText, dayText, hourText, minuteText, secondText, , offsetHour, offsetMinute] = match;\n const year = Number(yearText);\n const month = Number(monthText);\n const day = Number(dayText);\n const hour = Number(hourText);\n const minute = Number(minuteText);\n const second = Number(secondText);\n if (\n month < 1 ||\n month > 12 ||\n day < 1 ||\n day > new Date(Date.UTC(year, month, 0)).getUTCDate() ||\n hour > 23 ||\n minute > 59 ||\n second > 59 ||\n (offsetHour !== undefined && Number(offsetHour) > 23) ||\n (offsetMinute !== undefined && Number(offsetMinute) > 59)\n ) {\n return undefined;\n }\n const millis = Date.parse(value);\n return Number.isFinite(millis) && millis >= 0 ? Math.floor(millis / 1000) : undefined;\n}\n\nfunction sanitizedLabel(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n return sanitizeDisplayText(value, 80) || undefined;\n}\n\nfunction asCurrency(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const currency = sanitizeDisplayText(value, 3).toUpperCase();\n return /^[A-Z]{3}$/u.test(currency) ? currency : undefined;\n}\n\nfunction windowId(minutes: number): string {\n if (minutes === FIVE_HOUR_WINDOW_MINUTES) return \"five-hour\";\n if (minutes === DAILY_WINDOW_MINUTES) return \"daily\";\n if (minutes === WEEKLY_WINDOW_MINUTES) return \"weekly\";\n return `window-${minutes}-minutes`;\n}\n\nfunction defaultWindowLabel(minutes: number): string {\n if (minutes === WEEKLY_WINDOW_MINUTES) return \"Weekly window\";\n if (minutes % 10_080 === 0) return `${minutes / 10_080}w window`;\n if (minutes % 1_440 === 0) return `${minutes / 1_440}d window`;\n if (minutes % 60 === 0) return `${minutes / 60}h window`;\n return `${minutes}m window`;\n}\n", "import { sanitizeDisplayText } from \"../core.js\";\nimport type { MiniMaxUsagePayload, UsageBucket, UsageMetric, UsageReport } from \"../types.js\";\n\nexport type MiniMaxProviderId = \"minimax\" | \"minimax-cn\";\nexport type MiniMaxUsageKind = \"token-plan\" | \"account-balance\";\n\nconst PROVIDERS = {\n minimax: { name: \"MiniMax\", currency: \"USD\" },\n \"minimax-cn\": { name: \"MiniMax CN\", currency: \"CNY\" },\n} as const;\nconst DECIMAL_AMOUNT = /^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$/u;\nconst PERCENT_TOLERANCE = 1;\n\nexport function miniMaxUsageKind(apiKey: string): MiniMaxUsageKind {\n return apiKey.startsWith(\"sk-api-\") ? \"account-balance\" : \"token-plan\";\n}\n\nexport function normalizeMiniMaxUsagePayload(\n providerId: MiniMaxProviderId,\n kind: MiniMaxUsageKind,\n payload: MiniMaxUsagePayload,\n capturedAt: number,\n): UsageReport {\n return kind === \"account-balance\"\n ? normalizeBalance(providerId, payload, capturedAt)\n : normalizeTokenPlan(providerId, payload, capturedAt);\n}\n\nfunction normalizeBalance(\n providerId: MiniMaxProviderId,\n payload: MiniMaxUsagePayload,\n capturedAt: number,\n): UsageReport {\n assertSuccess(payload);\n const provider = PROVIDERS[providerId];\n const metrics: UsageMetric[] = [\n balanceMetric(\"available-balance\", \"Available balance\", payload.available_amount, provider.currency),\n balanceMetric(\"cash-balance\", \"Cash balance\", payload.cash_balance, provider.currency, true),\n balanceMetric(\"voucher-balance\", \"Voucher balance\", payload.voucher_balance, provider.currency),\n balanceMetric(\"credit-balance\", \"Credit balance\", payload.credit_balance, provider.currency),\n balanceMetric(\"owed-amount\", \"Owed amount\", payload.owed_amount, provider.currency),\n ];\n return {\n providerId,\n providerName: provider.name,\n capturedAt,\n source: \"minimax-account-balance\",\n semantics: { kind: \"api-key\", label: \"MiniMax pay-as-you-go account balance\" },\n buckets: [],\n metrics,\n };\n}\n\nfunction normalizeTokenPlan(\n providerId: MiniMaxProviderId,\n payload: MiniMaxUsagePayload,\n capturedAt: number,\n): UsageReport {\n assertSuccess(payload);\n if (!Array.isArray(payload.model_remains) || payload.model_remains.length === 0) {\n throw new Error(\"MiniMax Token Plan returned no quota rows.\");\n }\n const provider = PROVIDERS[providerId];\n const buckets: UsageBucket[] = [];\n const groups = new Set<string>();\n for (const [index, raw] of payload.model_remains.entries()) {\n const row = asObject(raw);\n if (!row) throw new Error(\"MiniMax Token Plan quota row was not an object.\");\n const groupLabel = safeLabel(row.model_name, `Quota ${index + 1}`);\n const groupId = uniqueGroupId(groupLabel, index, groups);\n buckets.push(\n normalizeWindow(row, {\n id: `${groupId}:interval`,\n label: \"Rolling window\",\n groupId,\n groupLabel,\n countField: \"current_interval_usage_count\",\n totalField: \"current_interval_total_count\",\n percentField: \"current_interval_remaining_percent\",\n statusField: \"current_interval_status\",\n startField: \"start_time\",\n endField: \"end_time\",\n }),\n normalizeWindow(row, {\n id: `${groupId}:weekly`,\n label: \"Weekly window\",\n groupId,\n groupLabel,\n countField: \"current_weekly_usage_count\",\n totalField: \"current_weekly_total_count\",\n percentField: \"current_weekly_remaining_percent\",\n statusField: \"current_weekly_status\",\n startField: \"weekly_start_time\",\n endField: \"weekly_end_time\",\n boostPermille: row.weekly_boost_permille,\n }),\n );\n }\n return {\n providerId,\n providerName: provider.name,\n capturedAt,\n source: \"minimax-token-plan\",\n semantics: { kind: \"consumer-subscription\", label: \"MiniMax Token Plan quota\" },\n buckets,\n metrics: [],\n };\n}\n\ntype WindowFields = {\n id: string;\n label: string;\n groupId: string;\n groupLabel: string;\n countField: string;\n totalField: string;\n percentField: string;\n statusField: string;\n startField: string;\n endField: string;\n boostPermille?: unknown;\n};\n\nfunction normalizeWindow(row: Record<string, unknown>, fields: WindowFields): UsageBucket {\n const status = optionalInteger(row[fields.statusField], fields.statusField);\n if (status !== undefined && ![1, 2, 3].includes(status)) {\n throw new Error(`MiniMax Token Plan ${fields.label} status was unsupported.`);\n }\n const percent = optionalPercent(row[fields.percentField], fields.percentField);\n validateBoost(fields.boostPermille);\n const start = timestamp(row[fields.startField], fields.startField);\n const end = timestamp(row[fields.endField], fields.endField);\n if (end < start) throw new Error(`MiniMax Token Plan ${fields.label} timestamps were reversed.`);\n const resetsAt = Math.floor(end / 1_000);\n const windowMinutes = Math.max(1, Math.round((end - start) / 60_000));\n if (status === 3) {\n return {\n id: fields.id,\n label: fields.label,\n groupId: fields.groupId,\n groupLabel: fields.groupLabel,\n remaining: 100,\n unit: \"percent\",\n period: \"unlimited\",\n windowMinutes,\n };\n }\n const total = nonnegativeInteger(row[fields.totalField], fields.totalField);\n const count = nonnegativeInteger(row[fields.countField], fields.countField);\n if (total === 0) {\n if (count !== 0) {\n throw new Error(`MiniMax Token Plan ${fields.label} counts were inconsistent.`);\n }\n if (percent === undefined) {\n throw new Error(`MiniMax Token Plan ${fields.label} returned no quota and no percent.`);\n }\n // Token Plan reports remaining_percent as the quota when both counts are 0.\n return {\n id: fields.id,\n label: fields.label,\n groupId: fields.groupId,\n groupLabel: fields.groupLabel,\n remaining: percent,\n used: 100 - percent,\n limit: 0,\n unit: \"percent\",\n windowMinutes,\n resetsAt,\n };\n }\n const resolved = resolveQuotaCounts(count, total, percent);\n if (!resolved) throw new Error(`MiniMax Token Plan ${fields.label} counts were inconsistent.`);\n return {\n id: fields.id,\n label: fields.label,\n groupId: fields.groupId,\n groupLabel: fields.groupLabel,\n ...resolved,\n unit: \"count\",\n windowMinutes,\n resetsAt,\n };\n}\n\nfunction resolveQuotaCounts(\n reportedCount: number,\n total: number,\n remainingPercent: number | undefined,\n): Pick<UsageBucket, \"used\" | \"remaining\" | \"limit\"> | undefined {\n if (total <= 0 || reportedCount > total) return undefined;\n let remaining = reportedCount;\n if (remainingPercent !== undefined) {\n const asRemaining = (reportedCount / total) * 100;\n const asUsed = ((total - reportedCount) / total) * 100;\n const remainingDistance = Math.abs(asRemaining - remainingPercent);\n const usedDistance = Math.abs(asUsed - remainingPercent);\n if (Math.min(remainingDistance, usedDistance) > PERCENT_TOLERANCE) return undefined;\n if (usedDistance < remainingDistance) remaining = total - reportedCount;\n }\n return { used: total - remaining, remaining, limit: total };\n}\n\nfunction assertSuccess(payload: MiniMaxUsagePayload): void {\n const base = asObject(payload.base_resp);\n if (base?.status_code !== 0) {\n throw new Error(\"MiniMax usage response did not report success.\");\n }\n}\n\nfunction balanceMetric(\n id: string,\n label: string,\n value: unknown,\n currency: \"CNY\" | \"USD\",\n allowNegative = false,\n): UsageMetric {\n if (\n typeof value !== \"string\" ||\n value.length > 64 ||\n !DECIMAL_AMOUNT.test(value) ||\n (!allowNegative && value.startsWith(\"-\"))\n ) {\n throw new Error(`MiniMax ${label.toLowerCase()} was not a valid amount.`);\n }\n return { id, label, value, unit: \"currency\", currency };\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n return value as Record<string, unknown>;\n}\n\nfunction safeLabel(value: unknown, fallback: string): string {\n if (typeof value !== \"string\") throw new Error(\"MiniMax Token Plan model name was not a string.\");\n return sanitizeDisplayText(value, 80) || fallback;\n}\n\nfunction uniqueGroupId(label: string, index: number, groups: Set<string>): string {\n const base =\n label\n .toLowerCase()\n .replace(/[^a-z0-9]+/gu, \"-\")\n .replace(/^-|-$/gu, \"\") || \"quota\";\n const id = groups.has(base) ? `${base}-${index + 1}` : base;\n groups.add(id);\n return id;\n}\n\nfunction nonnegativeInteger(value: unknown, field: string): number {\n if (!Number.isSafeInteger(value) || (value as number) < 0) {\n throw new Error(`MiniMax Token Plan ${field} was not a nonnegative safe integer.`);\n }\n return value as number;\n}\n\nfunction optionalInteger(value: unknown, field: string): number | undefined {\n if (value === undefined || value === null) return undefined;\n return nonnegativeInteger(value, field);\n}\n\nfunction optionalPercent(value: unknown, field: string): number | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0 || value > 100) {\n throw new Error(`MiniMax Token Plan ${field} was not a percentage.`);\n }\n return value;\n}\n\nfunction validateBoost(boost: unknown): void {\n if (boost === undefined || boost === null) return;\n const permille = nonnegativeInteger(boost, \"weekly_boost_permille\");\n if (permille > 10_000) throw new Error(\"MiniMax Token Plan weekly boost was unreasonable.\");\n}\n\nfunction timestamp(value: unknown, field: string): number {\n if (!Number.isSafeInteger(value) || (value as number) <= 0) {\n throw new Error(`MiniMax Token Plan ${field} was not a valid timestamp.`);\n }\n return value as number;\n}\n", "import type { MoonshotBalancePayload, UsageMetric, UsageReport } from \"../types.js\";\n\nexport type MoonshotProviderId = \"moonshotai\" | \"moonshotai-cn\";\n\nconst PROVIDERS = {\n moonshotai: { name: \"Moonshot AI\", currency: \"USD\" },\n \"moonshotai-cn\": { name: \"Moonshot AI CN\", currency: \"CNY\" },\n} as const;\n\nexport function normalizeMoonshotBalancePayload(\n providerId: MoonshotProviderId,\n payload: MoonshotBalancePayload,\n capturedAt: number,\n): UsageReport {\n if (payload.code !== 0 || payload.status !== true) {\n throw new Error(\"Moonshot AI balance response did not report success.\");\n }\n const data = asObject(payload.data);\n if (!data) throw new Error(\"Moonshot AI balance response data was not an object.\");\n const provider = PROVIDERS[providerId];\n const available = amount(data.available_balance, \"available balance\", false);\n const voucher = amount(data.voucher_balance, \"voucher balance\", false);\n const cash = amount(data.cash_balance, \"cash balance\", true);\n const metrics: UsageMetric[] = [\n currencyMetric(\"available-balance\", \"Available balance\", available, provider.currency),\n currencyMetric(\"voucher-balance\", \"Voucher balance\", voucher, provider.currency),\n currencyMetric(\"cash-balance\", \"Cash balance\", cash, provider.currency),\n ];\n return {\n providerId,\n providerName: provider.name,\n capturedAt,\n source: \"moonshot-balance\",\n semantics: { kind: \"api-key\", label: \"Moonshot API account balance\" },\n buckets: [],\n metrics,\n };\n}\n\nfunction currencyMetric(id: string, label: string, value: string, currency: \"CNY\" | \"USD\"): UsageMetric {\n return { id, label, value, unit: \"currency\", currency };\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n return value as Record<string, unknown>;\n}\n\nfunction amount(value: unknown, label: string, allowNegative: boolean): string {\n if (\n typeof value !== \"number\" ||\n !Number.isFinite(value) ||\n (!allowNegative && value < 0) ||\n Math.abs(value) > Number.MAX_SAFE_INTEGER\n ) {\n throw new Error(`Moonshot AI ${label} was not a valid amount.`);\n }\n return String(value);\n}\n", "import { sanitizeDisplayText } from \"../core.js\";\nimport type { OpenCodeZenPayload, UsageBucket, UsageReport } from \"../types.js\";\n\nconst ZEN_WINDOWS = [\n { key: \"rolling\", label: \"Rolling\" },\n { key: \"weekly\", label: \"Weekly\" },\n { key: \"monthly\", label: \"Monthly\" },\n] as const;\n\nexport function normalizeOpenCodeZenPayload(payload: OpenCodeZenPayload, capturedAt: number): UsageReport {\n const usage = asObject(payload.usage);\n if (!usage) throw new Error(\"OpenCode Zen usage response was not an object.\");\n\n const buckets: UsageBucket[] = [];\n const notes: string[] = [];\n for (const window of ZEN_WINDOWS) {\n const raw = asObject(usage[window.key]);\n if (!raw) continue;\n const status = asString(raw.status);\n if (status !== \"ok\" && status !== \"rate-limited\") {\n notes.push(`${window.label} window unavailable (${status ?? \"unknown status\"}).`);\n continue;\n }\n const used = asNonnegativeNumber(raw.percent);\n if (used === undefined) continue;\n const resetsAt = asEpochSeconds(raw.resetsAt);\n buckets.push({\n id: window.key,\n label: `${window.label} window`,\n used,\n remaining: 100 - clampPercent(used),\n limit: 100,\n unit: \"percent\",\n ...(resetsAt !== undefined ? { resetsAt } : {}),\n });\n }\n if (buckets.length === 0) {\n throw new Error(\"OpenCode Zen usage endpoint returned no displayable usage data.\");\n }\n\n return {\n providerId: \"opencode-go\",\n providerName: \"OpenCode Go\",\n capturedAt,\n source: \"opencode-zen-usage\",\n semantics: {\n kind: \"consumer-subscription\",\n label: \"OpenCode Zen plan usage\",\n },\n buckets,\n metrics: [],\n ...(notes.length > 0 ? { notes } : {}),\n };\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n return value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n return sanitizeDisplayText(value, 80) || undefined;\n}\n\nfunction asNonnegativeNumber(value: unknown): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) return undefined;\n return value;\n}\n\nfunction asEpochSeconds(value: unknown): number | undefined {\n if (typeof value !== \"string\" || !value.trim()) return undefined;\n const parsed = Date.parse(value);\n if (Number.isNaN(parsed)) return undefined;\n return Math.floor(parsed / 1000);\n}\n\nfunction clampPercent(value: number): number {\n return Math.min(100, Math.max(0, value));\n}\n", "import { sanitizeDisplayText } from \"../core.js\";\nimport type { OpenRouterKeyPayload, UsageBucket, UsageMetric, UsageReport } from \"../types.js\";\n\nexport function normalizeOpenRouterKeyPayload(payload: OpenRouterKeyPayload, capturedAt: number): UsageReport {\n const data = asObject(payload.data);\n if (!data) throw new Error(\"OpenRouter key response data was not an object.\");\n\n const limit = asNonnegativeNumber(data.limit);\n const remaining = asNonnegativeNumber(data.limit_remaining);\n const period = asString(data.limit_reset);\n const totalUsage = asNonnegativeNumber(data.usage);\n const buckets: UsageBucket[] = [];\n if (limit !== undefined) {\n buckets.push({\n id: \"key-limit\",\n label: \"Key limit\",\n ...(remaining !== undefined ? { used: Math.max(0, limit - remaining), remaining } : {}),\n limit,\n unit: \"usd\",\n ...(period ? { period } : {}),\n });\n }\n\n const metrics: UsageMetric[] = [];\n addUsageMetric(metrics, \"usage-daily\", \"Usage today\", data.usage_daily);\n addUsageMetric(metrics, \"usage-weekly\", \"Usage this week\", data.usage_weekly);\n addUsageMetric(metrics, \"usage-monthly\", \"Usage this month\", data.usage_monthly);\n addUsageMetric(metrics, \"usage-total\", \"All-time usage\", totalUsage);\n if (buckets.length === 0 && metrics.length === 0) {\n throw new Error(\"OpenRouter key response returned no displayable usage data.\");\n }\n\n const notes: string[] = [];\n if (data.limit === null) notes.push(\"No per-key spend cap\");\n else if (limit === undefined) notes.push(\"Per-key spend cap unavailable\");\n if (data.is_free_tier === true) notes.push(\"Free-tier API key\");\n\n return {\n providerId: \"openrouter\",\n providerName: \"OpenRouter\",\n capturedAt,\n source: \"openrouter-key\",\n semantics: { kind: \"api-key\", label: \"API-key spend limits\" },\n accountLabel: asString(data.label),\n buckets,\n metrics,\n ...(notes.length > 0 ? { notes } : {}),\n };\n}\n\nfunction addUsageMetric(metrics: UsageMetric[], id: string, label: string, value: unknown): void {\n const amount = typeof value === \"number\" ? asNonnegativeNumber(value) : undefined;\n if (amount === undefined) return;\n metrics.push({ id, label, value: amount, unit: \"usd\" });\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n return value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n return sanitizeDisplayText(value, 80) || undefined;\n}\n\nfunction asNonnegativeNumber(value: unknown): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) return undefined;\n return value;\n}\n", "import type { UsageMetric, UsageReport, VercelAIGatewayCreditsPayload } from \"../types.js\";\n\nconst DECIMAL_AMOUNT = /^(?:0|[1-9]\\d*)(?:\\.\\d+)?$/u;\n\nexport function normalizeVercelAIGatewayCreditsPayload(\n payload: VercelAIGatewayCreditsPayload,\n capturedAt: number,\n): UsageReport {\n const balance = decimalAmount(payload.balance, \"balance\");\n const totalUsed = decimalAmount(payload.total_used, \"total used\");\n const metrics: UsageMetric[] = [\n {\n id: \"credit-balance\",\n label: \"Credit balance\",\n value: balance,\n unit: \"currency\",\n currency: \"USD\",\n },\n {\n id: \"lifetime-spend\",\n label: \"Lifetime spend\",\n value: totalUsed,\n unit: \"currency\",\n currency: \"USD\",\n },\n ];\n return {\n providerId: \"vercel-ai-gateway\",\n providerName: \"Vercel AI Gateway\",\n capturedAt,\n source: \"vercel-ai-gateway-credits\",\n semantics: { kind: \"api-key\", label: \"AI Gateway credits and lifetime spend\" },\n buckets: [],\n metrics,\n };\n}\n\nfunction decimalAmount(value: unknown, label: string): string {\n if (typeof value !== \"string\" || value.length > 64 || !DECIMAL_AMOUNT.test(value)) {\n throw new Error(`Vercel AI Gateway ${label} was not a valid nonnegative amount.`);\n }\n return value;\n}\n", "import { sanitizeDisplayText } from \"../core.js\";\nimport type { UsageBucket, UsageMetric, UsageReport, XaiBillingPayload } from \"../types.js\";\n\nconst MAX_SAFE_CENTS = Number.MAX_SAFE_INTEGER;\n\nexport function normalizeXaiBillingPayload(\n payload: XaiBillingPayload,\n subscriptionTier: unknown,\n capturedAt: number,\n): UsageReport {\n const configValue = payload.config;\n if (configValue !== null && configValue !== undefined && !isRecord(configValue)) {\n throw new Error(\"xAI billing response config was not an object or null.\");\n }\n const config = isRecord(configValue) ? configValue : undefined;\n const buckets: UsageBucket[] = [];\n const metrics: UsageMetric[] = [];\n const notes: string[] = [];\n\n if (config) {\n const period = normalizePeriod(config.currentPeriod, config.billingPeriodStart, config.billingPeriodEnd);\n const preferredPercent = optionalPercent(config.creditUsagePercent, \"creditUsagePercent\");\n if (preferredPercent !== undefined) {\n buckets.push({\n id: \"included-allowance\",\n label: \"Included allowance\",\n used: preferredPercent,\n remaining: 100 - preferredPercent,\n unit: \"percent\",\n ...period,\n });\n } else {\n const limit = optionalUsd(config.monthlyLimit, \"monthlyLimit\");\n const used = optionalUsd(config.used, \"used\");\n if (limit !== undefined || used !== undefined) {\n buckets.push({\n id: \"included-allowance\",\n label: \"Included allowance\",\n ...(limit !== undefined ? { limit } : {}),\n ...(used !== undefined ? { used } : {}),\n ...(limit !== undefined && used !== undefined ? { remaining: limit - used } : {}),\n unit: \"usd\",\n ...period,\n });\n } else if (period.period || period.resetsAt !== undefined) {\n buckets.push({\n id: \"included-allowance\",\n label: \"Included allowance\",\n unit: \"percent\",\n ...period,\n });\n }\n }\n\n const onDemandCap = optionalUsd(config.onDemandCap, \"onDemandCap\");\n const onDemandUsed = optionalUsd(config.onDemandUsed, \"onDemandUsed\");\n if (onDemandCap !== undefined || onDemandUsed !== undefined) {\n buckets.push({\n id: \"on-demand\",\n label: \"On-demand usage\",\n ...(onDemandCap !== undefined ? { limit: onDemandCap } : {}),\n ...(onDemandUsed !== undefined ? { used: onDemandUsed } : {}),\n ...(onDemandCap !== undefined && onDemandUsed !== undefined ? { remaining: onDemandCap - onDemandUsed } : {}),\n unit: \"usd\",\n });\n }\n\n const prepaidBalance = optionalUsd(config.prepaidBalance, \"prepaidBalance\");\n if (prepaidBalance !== undefined) {\n metrics.push({\n id: \"prepaid-balance\",\n label: \"Prepaid balance\",\n value: prepaidBalance,\n unit: \"usd\",\n });\n }\n }\n\n const tier = optionalTier(subscriptionTier);\n if (tier) metrics.push({ id: \"subscription-tier\", label: \"Plan tier\", value: tier });\n if (!config) notes.push(\"No xAI consumer billing configuration is available for this account.\");\n else if (buckets.length === 0 && metrics.length === 0) {\n notes.push(\"The xAI consumer billing response contained no displayable usage fields.\");\n }\n\n return {\n providerId: \"xai\",\n providerName: \"xAI\",\n capturedAt,\n source: \"cli-chat-proxy.grok.com consumer billing\",\n semantics: {\n kind: \"consumer-subscription\",\n label: \"xAI consumer subscription usage\",\n },\n buckets,\n metrics,\n ...(notes.length > 0 ? { notes } : {}),\n };\n}\n\nfunction normalizePeriod(\n currentPeriod: unknown,\n legacyStart: unknown,\n legacyEnd: unknown,\n): Pick<UsageBucket, \"period\" | \"resetsAt\"> {\n if (currentPeriod !== undefined && currentPeriod !== null && !isRecord(currentPeriod)) {\n throw new Error(\"xAI billing currentPeriod was not an object or null.\");\n }\n if (isRecord(currentPeriod)) {\n const type = optionalString(currentPeriod.type, \"currentPeriod.type\");\n const start = optionalTimestamp(currentPeriod.start, \"currentPeriod.start\");\n const end = optionalTimestamp(currentPeriod.end, \"currentPeriod.end\");\n return {\n ...(periodLabel(type, start) ? { period: periodLabel(type, start) } : {}),\n ...(end !== undefined ? { resetsAt: end } : {}),\n };\n }\n const start = optionalTimestamp(legacyStart, \"billingPeriodStart\");\n const end = optionalTimestamp(legacyEnd, \"billingPeriodEnd\");\n return {\n ...(start !== undefined ? { period: \"Monthly\" } : {}),\n ...(end !== undefined ? { resetsAt: end } : {}),\n };\n}\n\nfunction periodLabel(type: string | undefined, start: number | undefined): string | undefined {\n if (type === \"USAGE_PERIOD_TYPE_WEEKLY\") return \"Weekly\";\n if (type === \"USAGE_PERIOD_TYPE_MONTHLY\") return \"Monthly\";\n if (type) return sanitizeDisplayText(type.replace(/^USAGE_PERIOD_TYPE_/u, \"\").replaceAll(\"_\", \" \"), 40);\n return start === undefined ? undefined : \"Current period\";\n}\n\nfunction optionalUsd(value: unknown, field: string): number | undefined {\n if (value === undefined || value === null) return undefined;\n if (!isRecord(value)) throw new Error(`xAI billing ${field} was not a cent wrapper.`);\n const cents = value.val === undefined ? 0 : value.val;\n if (!Number.isSafeInteger(cents) || Math.abs(cents as number) > MAX_SAFE_CENTS) {\n throw new Error(`xAI billing ${field}.val was not a safe signed integer.`);\n }\n return (cents as number) / 100;\n}\n\nfunction optionalPercent(value: unknown, field: string): number | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0 || value > 100) {\n throw new Error(`xAI billing ${field} was outside 0\u2013100.`);\n }\n return value;\n}\n\nfunction optionalTimestamp(value: unknown, field: string): number | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value !== \"string\" || value.length > 80) {\n throw new Error(`xAI billing ${field} was not a bounded timestamp.`);\n }\n const milliseconds = Date.parse(value);\n if (!Number.isFinite(milliseconds)) throw new Error(`xAI billing ${field} was invalid.`);\n return Math.floor(milliseconds / 1000);\n}\n\nfunction optionalString(value: unknown, field: string): string | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value !== \"string\" || value.length > 80) {\n throw new Error(`xAI billing ${field} was not a bounded string.`);\n }\n return value;\n}\n\nfunction optionalTier(value: unknown): string | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value !== \"string\" || value.length > 160) {\n throw new Error(\"xAI subscription tier was not a bounded string or null.\");\n }\n return sanitizeDisplayText(value, 80) || undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n", "// Fixed messages from https://docs.z.ai/api-reference/api-code. Never interpolate provider text:\n// error messages and their template parameters can contain credentials or terminal controls.\nconst ERROR_MESSAGES: Readonly<Record<string, string>> = {\n \"1000\": \"Authentication failed. Check your API key.\",\n \"1001\": \"Authentication header missing. Check your API key.\",\n \"1003\": \"Authentication token expired. Obtain a new token.\",\n \"1005\": \"Two-factor authentication required.\",\n \"1113\": \"Insufficient balance or no resource package. Recharge your account.\",\n \"1200\": \"API call error. Try again later.\",\n \"1210\": \"Invalid API parameter. Check the API documentation.\",\n \"1211\": \"Unknown model. Check the model ID.\",\n \"1212\": \"This model does not support the requested method.\",\n \"1213\": \"A required parameter is missing.\",\n \"1214\": \"Invalid parameter. Check the API documentation.\",\n \"1215\": \"Conflicting parameters. Check the API documentation.\",\n \"1220\": \"Access denied. Check your permissions.\",\n \"1221\": \"This API has been taken offline.\",\n \"1222\": \"This API does not exist.\",\n \"1230\": \"API processing error. Try again later.\",\n \"1234\": \"Network error. Try again later.\",\n \"1261\": \"Prompt too long. Reduce the input length.\",\n \"1301\": \"Content rejected by the safety policy.\",\n \"1302\": \"Request rate limit reached. Try again later.\",\n \"1305\": \"Service overloaded. Try again later.\",\n \"1308\": \"Usage limit reached. Wait for the quota reset.\",\n \"1309\": \"GLM Coding Plan expired. Renew your subscription.\",\n \"1310\": \"Weekly or monthly limit exhausted. Wait for the quota reset.\",\n \"1311\": \"Your subscription does not include this model.\",\n \"1313\": \"Request frequency restricted by the Fair Usage Policy. Contact support.\",\n \"1314\": \"Enterprise package expired. Contact your administrator.\",\n \"1315\": \"This API key requires an enterprise coding package scenario. Replace the key.\",\n \"1316\": \"5-hour limit reached; insufficient balance for extra usage. Wait for reset.\",\n \"1317\": \"7-day limit reached; insufficient balance for extra usage. Wait for reset.\",\n \"1318\": \"5-hour limit reached; extra usage blocked by monthly spend limit.\",\n \"1319\": \"7-day limit reached; extra usage blocked by monthly spend limit.\",\n \"1320\": \"5-hour limit reached; extra usage blocked by monthly spend limit.\",\n \"1321\": \"7-day limit reached; extra usage blocked by monthly spend limit.\",\n};\n\nconst HTTP_MESSAGES: Readonly<Record<number, string>> = {\n 400: \"Invalid request. Check the API documentation.\",\n 401: \"Authentication failed. Check your API key.\",\n 403: \"Access denied. Check your permissions.\",\n 429: \"Request or usage limit reached. Try again later.\",\n 500: \"Internal error. Try again later.\",\n};\n\nexport function zaiPayloadError(payload: unknown): string | undefined {\n const object = asObject(payload);\n if (!object) return undefined;\n const nested = asObject(object.error);\n // Missing nested metadata must not hide a top-level code; explicit nested values retain priority.\n const rawCode = nested?.code === undefined ? object.code : nested.code;\n const code = errorCode(rawCode);\n if (\n object.error === undefined &&\n object.success !== false &&\n (rawCode === undefined || code === \"0\" || code === \"200\")\n ) {\n return undefined;\n }\n return code && code !== \"0\" && code !== \"200\"\n ? `Z.AI ${code}: ${ERROR_MESSAGES[code] ?? \"API request failed.\"}`\n : \"Z.AI: API request failed.\";\n}\n\nexport function zaiResponseError(status: number, text: string): string | undefined {\n let payload: unknown;\n try {\n payload = JSON.parse(text) as unknown;\n } catch {\n // Do not expose JSON parser excerpts, response bodies, or statusText.\n if (status >= 200 && status < 300) return \"Z.AI: Invalid JSON response.\";\n }\n const error = zaiPayloadError(payload);\n if (error) return error;\n if (status < 200 || status >= 300) {\n return `Z.AI HTTP ${status}: ${HTTP_MESSAGES[status] ?? \"API request failed.\"}`;\n }\n return undefined;\n}\n\nfunction errorCode(value: unknown): string | undefined {\n if (typeof value === \"number\" && Number.isInteger(value) && value >= 0 && value <= 9999) {\n return String(value);\n }\n return typeof value === \"string\" && /^(?:0|[1-9]\\d{0,3})$/u.test(value) ? value : undefined;\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n", "import { sanitizeDisplayText } from \"../core.js\";\nimport type {\n UsageBucket,\n UsageMetric,\n UsageReport,\n ZaiPlanInfo,\n ZaiQuotaPayload,\n ZaiSubscriptionPayload,\n} from \"../types.js\";\n\nimport { zaiPayloadError } from \"./zai-errors.js\";\n\nconst FIVE_HOUR_WINDOW_MINUTES = 300;\nconst WEEKLY_WINDOW_MINUTES = 10_080;\n\nexport function normalizeZaiQuotaPayload(\n providerId: string,\n providerName: string,\n payload: ZaiQuotaPayload,\n capturedAt: number,\n plan?: ZaiPlanInfo,\n): UsageReport {\n const error = zaiPayloadError(payload);\n if (error) throw new Error(error);\n const data = asObject(payload.data);\n if (!data) throw new Error(\"Z.AI quota response data was not an object.\");\n const limits = Array.isArray(data.limits) ? (data.limits as unknown[]) : [];\n\n const buckets: UsageBucket[] = [];\n const metrics: UsageMetric[] = [];\n for (const raw of limits) {\n const limit = asObject(raw);\n if (!limit) continue;\n const type = asString(limit.type);\n const unit = asNonnegativeNumber(limit.unit);\n const isPlanUsage = type === \"TOKENS_LIMIT\" || type === \"CREDIT_LIMIT\";\n if (type === \"TIME_LIMIT\") {\n addCountBucket(buckets, limit, \"mcp-monthly\", \"MCP monthly allowance\");\n addUsageDetailMetrics(metrics, limit.usageDetails);\n } else if (isPlanUsage && unit === 3) {\n addPercentBucket(buckets, limit, \"five-hour\", sessionWindowLabel(limit), sessionWindowMinutes(limit));\n } else if (isPlanUsage && unit === 6) {\n const used = asNonnegativeNumber(limit.currentValue);\n const quota = asNonnegativeNumber(limit.usage);\n if (used !== undefined && quota !== undefined) {\n addCountBucket(buckets, limit, \"weekly\", \"Weekly window\", weeklyWindowMinutes(limit));\n } else {\n addPercentBucket(buckets, limit, \"weekly\", \"Weekly window\", weeklyWindowMinutes(limit));\n }\n }\n }\n if (buckets.length === 0) {\n throw new Error(\"Z.AI quota endpoint returned no displayable usage data.\");\n }\n\n const notes: string[] = [];\n const level = asString(data.level);\n const planLabel = plan?.name ?? level;\n if (planLabel) {\n notes.push(plan?.renewsAt ? `Plan: ${planLabel} \u00B7 renews ${plan.renewsAt}` : `Plan: ${planLabel}`);\n }\n\n return {\n providerId,\n providerName,\n capturedAt,\n source: \"zai-quota\",\n semantics: { kind: \"consumer-subscription\", label: \"GLM Coding Plan usage\" },\n buckets,\n metrics,\n ...(notes.length > 0 ? { notes } : {}),\n };\n}\n\n// The undocumented subscription endpoint can include historical products. Prefer the current,\n// valid product and fail closed to the quota plan level when only explicitly inactive products exist.\nexport function normalizeZaiSubscriptionPayload(payload: ZaiSubscriptionPayload): ZaiPlanInfo | undefined {\n if (zaiPayloadError(payload)) return undefined;\n if (!Array.isArray(payload.data)) return undefined;\n\n const candidates: Array<{\n plan: ZaiPlanInfo;\n status?: string;\n inCurrentPeriod?: boolean;\n }> = [];\n for (const raw of payload.data) {\n const entry = asObject(raw);\n if (!entry) continue;\n const name = asString(entry.productName);\n if (!name) continue;\n const renewsAt = planRenewalDate(entry.nextRenewTime);\n const status = asString(entry.status)?.toUpperCase();\n const inCurrentPeriod = asBoolean(entry.inCurrentPeriod);\n candidates.push({\n plan: { name, ...(renewsAt !== undefined ? { renewsAt } : {}) },\n ...(status !== undefined ? { status } : {}),\n ...(inCurrentPeriod !== undefined ? { inCurrentPeriod } : {}),\n });\n }\n\n const hasStateMetadata = candidates.some(\n (candidate) => candidate.status !== undefined || candidate.inCurrentPeriod !== undefined,\n );\n if (!hasStateMetadata) return candidates[0]?.plan;\n return (\n candidates.find((candidate) => candidate.inCurrentPeriod === true && candidate.status === \"VALID\")?.plan ??\n candidates.find((candidate) => candidate.inCurrentPeriod === true && candidate.status === undefined)?.plan ??\n candidates.find((candidate) => candidate.status === \"VALID\" && candidate.inCurrentPeriod === undefined)?.plan\n );\n}\n\nfunction planRenewalDate(value: unknown): string | undefined {\n if (typeof value === \"string\" && /^\\d{4}-\\d{2}-\\d{2}/u.test(value)) return value.slice(0, 10);\n const millis = asNonnegativeNumber(value);\n if (millis === undefined || millis === 0) return undefined;\n return new Date(millis).toISOString().slice(0, 10);\n}\n\n// Z.AI encodes each window as a (unit, number) pair \u2014 unit 3 counts hours and unit 6 counts\n// weeks \u2014 so the payload's number drives the window length and session label; the established\n// 5-hour and weekly constants remain the fallback when the payload omits it.\nfunction sessionWindowMinutes(limit: Record<string, unknown>): number {\n const hours = asPositiveNumber(limit.number);\n return hours === undefined ? FIVE_HOUR_WINDOW_MINUTES : Math.round(hours * 60);\n}\n\nfunction sessionWindowLabel(limit: Record<string, unknown>): string {\n const minutes = sessionWindowMinutes(limit);\n return minutes === FIVE_HOUR_WINDOW_MINUTES ? \"5h window\" : `${Math.round(minutes / 60)}h window`;\n}\n\nfunction weeklyWindowMinutes(limit: Record<string, unknown>): number {\n const weeks = asPositiveNumber(limit.number);\n return weeks === undefined ? WEEKLY_WINDOW_MINUTES : Math.round(weeks * WEEKLY_WINDOW_MINUTES);\n}\n\nfunction addPercentBucket(\n buckets: UsageBucket[],\n limit: Record<string, unknown>,\n id: string,\n label: string,\n windowMinutes: number,\n): void {\n const used = asNonnegativeNumber(limit.percentage);\n if (used === undefined) return;\n const percent = clampPercent(used);\n const resetsAt = asEpochSeconds(limit.nextResetTime);\n buckets.push({\n id,\n label,\n used: percent,\n remaining: 100 - percent,\n limit: 100,\n unit: \"percent\",\n windowMinutes,\n ...(resetsAt !== undefined ? { resetsAt } : {}),\n });\n}\n\nfunction addCountBucket(\n buckets: UsageBucket[],\n limit: Record<string, unknown>,\n id: string,\n label: string,\n windowMinutes?: number,\n): void {\n const used = asNonnegativeNumber(limit.currentValue);\n const quota = asNonnegativeNumber(limit.usage);\n if (used === undefined || quota === undefined) return;\n const resetsAt = asEpochSeconds(limit.nextResetTime);\n buckets.push({\n id,\n label,\n used,\n remaining: Math.max(0, quota - used),\n limit: quota,\n unit: \"count\",\n ...(windowMinutes !== undefined ? { windowMinutes } : {}),\n ...(resetsAt !== undefined ? { resetsAt } : {}),\n });\n}\n\nfunction addUsageDetailMetrics(metrics: UsageMetric[], value: unknown): void {\n if (!Array.isArray(value)) return;\n for (const raw of value) {\n const detail = asObject(raw);\n if (!detail) continue;\n const label = asString(detail.modelCode);\n const usage = asNonnegativeNumber(detail.usage);\n if (!label || usage === undefined) continue;\n metrics.push({ id: `mcp-${kebabCase(label)}`, label, value: usage, unit: \"count\" });\n }\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n return value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n return sanitizeDisplayText(value, 80) || undefined;\n}\n\nfunction asNonnegativeNumber(value: unknown): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) return undefined;\n return value;\n}\n\nfunction asPositiveNumber(value: unknown): number | undefined {\n const number = asNonnegativeNumber(value);\n return number !== undefined && number > 0 ? number : undefined;\n}\n\nfunction asBoolean(value: unknown): boolean | undefined {\n if (typeof value === \"boolean\") return value;\n if (value === 1) return true;\n if (value === 0) return false;\n return undefined;\n}\n\nfunction asEpochSeconds(value: unknown): number | undefined {\n const millis = asNonnegativeNumber(value);\n if (millis === undefined) return undefined;\n return Math.floor(millis / 1000);\n}\n\nfunction kebabCase(label: string): string {\n return (\n label\n .toLowerCase()\n .replace(/[^a-z0-9]+/gu, \"-\")\n .replace(/^-+|-+$/gu, \"\") || \"tool\"\n );\n}\n\nfunction clampPercent(value: number): number {\n return Math.min(100, Math.max(0, value));\n}\n", "import { sanitizeDisplayText } from \"./core.js\";\nimport type { ResolvedUsageAuth, UsageProviderAdapter, UsageProviderTarget, UsageRequestGuard } from \"./types.js\";\n\nconst MAX_TARGETS = 1_000;\nconst MAX_TARGET_ID_CHARS = 256;\nconst MAX_TARGET_LABEL_CHARS = 120;\nconst MAX_TARGET_DESCRIPTION_CHARS = 180;\n\nexport type UsageTargetResolution =\n | { kind: \"selected\"; targetId?: string }\n | {\n kind: \"selection-required\";\n choices: readonly UsageProviderTarget[];\n };\n\nexport interface UsageTargetSelectOptions {\n options: readonly string[];\n targetIdFor(option: string): string | undefined;\n}\n\nexport async function resolveUsageTarget(\n adapter: UsageProviderAdapter,\n auth: ResolvedUsageAuth,\n rememberedTargetId: string | undefined,\n signal: AbortSignal,\n timeoutMs: number,\n guard: UsageRequestGuard,\n): Promise<UsageTargetResolution> {\n if (!adapter.targets) return { kind: \"selected\" };\n if (rememberedTargetId !== undefined && !isBoundedTargetId(rememberedTargetId)) {\n throw new Error(`The remembered ${adapter.targets.singularLabel} identifier was invalid.`);\n }\n const choices = await listUsageTargets(adapter, auth, signal, timeoutMs, guard);\n if (rememberedTargetId) {\n return choices.some((choice) => choice.id === rememberedTargetId)\n ? { kind: \"selected\", targetId: rememberedTargetId }\n : { kind: \"selection-required\", choices };\n }\n if (choices.length === 1) return { kind: \"selected\", targetId: choices[0]?.id };\n return { kind: \"selection-required\", choices };\n}\n\nexport async function listUsageTargets(\n adapter: UsageProviderAdapter,\n auth: ResolvedUsageAuth,\n signal: AbortSignal,\n timeoutMs: number,\n guard: UsageRequestGuard,\n): Promise<readonly UsageProviderTarget[]> {\n if (!adapter.targets) return [];\n const startedAt = Date.now();\n await guard();\n const listed = await adapter.targets.list(auth, signal, remainingTargetTimeout(timeoutMs, startedAt), guard);\n await guard();\n remainingTargetTimeout(timeoutMs, startedAt);\n const choices = normalizeUsageTargets(listed);\n if (choices.length === 0) {\n throw new Error(`${adapter.targets.pluralLabel} discovery returned no choices.`);\n }\n return choices;\n}\n\nexport function normalizeUsageTargets(targets: readonly UsageProviderTarget[]): readonly UsageProviderTarget[] {\n if (!Array.isArray(targets)) throw new Error(\"Target discovery did not return a choices array.\");\n if (targets.length > MAX_TARGETS) {\n throw new Error(`Target discovery exceeded ${MAX_TARGETS} choices.`);\n }\n const seen = new Set<string>();\n return targets.map((target) => {\n if (!target || typeof target !== \"object\" || Array.isArray(target)) {\n throw new Error(\"Target discovery returned an invalid choice.\");\n }\n const { id, label, description } = target as Partial<UsageProviderTarget>;\n if (!isBoundedTargetId(id)) throw new Error(\"Target discovery returned an invalid ID.\");\n if (seen.has(id)) throw new Error(`Target discovery repeated ${id}.`);\n seen.add(id);\n if (typeof label !== \"string\") {\n throw new Error(\"Target discovery returned an invalid display label.\");\n }\n if (description !== undefined && typeof description !== \"string\") {\n throw new Error(\"Target discovery returned an invalid description.\");\n }\n const safeLabel = sanitizeDisplayText(label, MAX_TARGET_LABEL_CHARS);\n if (!safeLabel) throw new Error(\"Target discovery returned an empty display label.\");\n const safeDescription = description ? sanitizeDisplayText(description, MAX_TARGET_DESCRIPTION_CHARS) : undefined;\n return { id, label: safeLabel, ...(safeDescription ? { description: safeDescription } : {}) };\n });\n}\n\nexport function createUsageTargetSelectOptions(targets: readonly UsageProviderTarget[]): UsageTargetSelectOptions {\n const normalized = normalizeUsageTargets(targets);\n const ids = new Map<string, string>();\n const options = normalized.map((target) => {\n const base = target.description ? `${target.label} \u2014 ${target.description}` : target.label;\n let option = base;\n if (ids.has(option)) {\n const safeId = sanitizeDisplayText(target.id, 80) || \"target\";\n option = `${base} \u00B7 ${safeId}`;\n let duplicate = 2;\n while (ids.has(option)) {\n option = `${base} \u00B7 ${safeId} (${duplicate})`;\n duplicate += 1;\n }\n }\n ids.set(option, target.id);\n return option;\n });\n return { options, targetIdFor: (option) => ids.get(option) };\n}\n\nfunction remainingTargetTimeout(timeoutMs: number, startedAt: number): number {\n const remaining = timeoutMs - (Date.now() - startedAt);\n if (remaining <= 0) throw new Error(\"Timed out while discovering provider targets.\");\n return remaining;\n}\n\nexport function isBoundedTargetId(value: unknown): value is string {\n return (\n typeof value === \"string\" &&\n value.length > 0 &&\n value.length <= MAX_TARGET_ID_CHARS &&\n ![...value].some((character) => {\n const codePoint = character.codePointAt(0) ?? 0;\n return codePoint <= 0x1f || (codePoint >= 0x7f && codePoint <= 0x9f);\n })\n );\n}\n", "import type { ProviderUsageState, UsageBucket, UsageDisplayState, UsageModel, UsageReport } from \"./types.js\";\n\nconst BAR_SEGMENTS = 20;\nconst VALUE_COLUMN = 29;\n\nexport function formatUsageReport(report: UsageReport, displayState: UsageDisplayState): string {\n const stateLabel = displayState === \"current\" ? \"Current\" : \"Configured\";\n const title =\n report.providerId === \"baseten\"\n ? \"Baseten Model APIs Spend\"\n : report.providerId === \"deepseek\"\n ? \"DeepSeek API Balance\"\n : report.providerId === \"fireworks\"\n ? \"Fireworks API Spend\"\n : report.providerId === \"vercel-ai-gateway\"\n ? \"Vercel AI Gateway Credits\"\n : report.providerId === \"moonshotai\" || report.providerId === \"moonshotai-cn\"\n ? `${report.providerName} Balance`\n : report.providerId === \"minimax\" || report.providerId === \"minimax-cn\"\n ? report.source === \"minimax-account-balance\"\n ? `${report.providerName} API Balance`\n : `${report.providerName} Token Plan`\n : `${report.providerName} Usage`;\n const lines = [`${title} \u00B7 ${stateLabel}`];\n if (report.accountLabel) lines.push(`Account: ${report.accountLabel}`);\n lines.push(`Semantics: ${report.semantics.label}`, \"\");\n\n if (report.providerId === \"baseten\") formatBasetenReport(lines, report);\n else if (report.providerId === \"openai-codex\") formatCodexReport(lines, report);\n else if (report.providerId === \"deepseek\") formatDeepSeekReport(lines, report);\n else if (report.providerId === \"fireworks\") formatFireworksReport(lines, report);\n else if (report.providerId === \"vercel-ai-gateway\") formatVercelAIGatewayReport(lines, report);\n else if (report.providerId === \"github-copilot\") formatGitHubCopilotReport(lines, report);\n else if (report.providerId === \"openrouter\") formatOpenRouterReport(lines, report);\n else if (report.providerId === \"opencode-go\") formatOpenCodeZenReport(lines, report);\n else if (report.providerId === \"kimi-coding\") formatKimiCodingReport(lines, report);\n else if (report.providerId === \"moonshotai\" || report.providerId === \"moonshotai-cn\") {\n formatMoonshotReport(lines, report);\n } else if (report.providerId === \"minimax\" || report.providerId === \"minimax-cn\") {\n formatMiniMaxReport(lines, report);\n } else if (report.providerId === \"xai\") formatXaiReport(lines, report);\n else if (report.providerId === \"zai\" || report.providerId === \"zai-coding-cn\") {\n formatZaiReport(lines, report);\n } else formatGenericReport(lines, report);\n\n if (report.notes) {\n for (const note of report.notes) lines.push(note);\n }\n return lines.join(\"\\n\").trimEnd();\n}\n\nexport function formatUsageStatusline(\n report: UsageReport,\n model?: UsageModel,\n now = Date.now(),\n showCodexResetCountdown = true,\n): string | undefined {\n if (report.providerId === \"baseten\") return formatBasetenStatusline(report);\n if (report.providerId === \"openai-codex\") {\n return formatCodexStatusline(report, model, now, showCodexResetCountdown);\n }\n if (report.providerId === \"deepseek\") return formatDeepSeekStatusline(report);\n if (report.providerId === \"fireworks\") return formatFireworksStatusline(report);\n if (report.providerId === \"vercel-ai-gateway\") return formatVercelAIGatewayStatusline(report);\n if (report.providerId === \"github-copilot\") return formatGitHubCopilotStatusline(report);\n if (report.providerId === \"openrouter\") {\n const limit = report.buckets.find((bucket) => bucket.id === \"key-limit\");\n if (limit?.remaining !== undefined) return `openrouter ${formatUsd(limit.remaining)} left`;\n const total = report.metrics.find((metric) => metric.id === \"usage-total\");\n if (typeof total?.value === \"number\") return `openrouter ${formatUsd(total.value)} used`;\n }\n if (report.providerId === \"opencode-go\") return formatOpenCodeZenStatusline(report);\n if (report.providerId === \"kimi-coding\") return formatKimiCodingStatusline(report);\n if (report.providerId === \"moonshotai\" || report.providerId === \"moonshotai-cn\") {\n return formatMoonshotStatusline(report);\n }\n if (report.providerId === \"minimax\" || report.providerId === \"minimax-cn\") {\n return formatMiniMaxStatusline(report, model);\n }\n if (report.providerId === \"zai\" || report.providerId === \"zai-coding-cn\") {\n return formatZaiStatusline(report);\n }\n return undefined;\n}\n\nexport function formatProviderStates(states: readonly ProviderUsageState[]): string {\n return states\n .map((state) => {\n if (state.status === \"ready\") return formatUsageReport(state.report, state.displayState);\n const label = state.displayState === \"current\" ? \"Current\" : \"Configured\";\n if (state.status === \"selection-required\") {\n return `${state.providerName} \u00B7 ${label}\\nSelection required: choose this provider's ${state.singularLabel} by viewing it individually.`;\n }\n const status =\n state.status === \"auth-unavailable\"\n ? \"Authentication unavailable\"\n : state.status === \"unsupported\"\n ? \"Unsupported\"\n : \"Query failed\";\n return `${state.providerName} \u00B7 ${label}\\n${status}: ${state.message}`;\n })\n .join(\"\\n\\n\");\n}\n\nfunction formatBasetenReport(lines: string[], report: UsageReport): void {\n lines.push(`${\"Spend window:\".padEnd(VALUE_COLUMN)}Last 30 days`);\n for (const metric of report.metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}USD ${metric.value}`);\n }\n}\n\nfunction formatBasetenStatusline(report: UsageReport): string {\n const subtotal = report.metrics.find((metric) => metric.id === \"net-subtotal\");\n return subtotal ? `baseten USD ${subtotal.value} net` : \"baseten no Model APIs usage\";\n}\n\nfunction formatCodexReport(lines: string[], report: UsageReport): void {\n let previousGroup: string | undefined;\n for (const bucket of report.buckets) {\n const group = bucket.groupId ?? bucket.id;\n if (group !== previousGroup && group !== \"codex\") {\n lines.push(`${bucket.groupLabel ?? group} limit:`);\n }\n previousGroup = group;\n const fallback = bucket.id.endsWith(\":secondary\") ? \"weekly\" : \"5h\";\n const label = `${formatWindowLabel(bucket.windowMinutes, fallback, false)} limit:`;\n lines.push(`${label.padEnd(VALUE_COLUMN)}${formatPercentBucket(bucket)}`);\n }\n for (const metric of report.metrics) {\n if (metric.id === \"reset-credits\") {\n lines.push(`${\"Usage limit resets:\".padEnd(VALUE_COLUMN)}${metric.value} available`);\n } else if (metric.id === \"credits\") {\n lines.push(`${\"Credits:\".padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`);\n }\n }\n}\n\nfunction formatDeepSeekReport(lines: string[], report: UsageReport): void {\n const availability = report.metrics.find((metric) => metric.id === \"api-availability\");\n lines.push(\n `${\"API calls:\".padEnd(VALUE_COLUMN)}${availability?.value === \"available\" ? \"Available\" : \"Unavailable\"}`,\n );\n for (const currency of [\"CNY\", \"USD\"]) {\n const metrics = report.metrics.filter((metric) => metric.currency === currency);\n if (metrics.length === 0) continue;\n lines.push(\"\", `${currency} balance:`);\n for (const metric of metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${currency} ${metric.value}`);\n }\n }\n}\n\nfunction formatDeepSeekStatusline(report: UsageReport): string {\n const availability = report.metrics.find((metric) => metric.id === \"api-availability\");\n if (availability?.value !== \"available\") return \"deepseek API unavailable\";\n const totals = [\"CNY\", \"USD\"].flatMap((currency) => {\n const metric = report.metrics.find((candidate) => candidate.id === `${currency.toLowerCase()}-total`);\n return metric ? [`${currency} ${metric.value}`] : [];\n });\n return totals.length > 0 ? `deepseek ${totals.join(\" \u00B7 \")}` : \"deepseek balance unavailable\";\n}\n\nfunction formatFireworksReport(lines: string[], report: UsageReport): void {\n lines.push(`${\"Spend window:\".padEnd(VALUE_COLUMN)}Last 30 days (rated)`);\n for (const currency of fireworksCurrencies(report)) {\n lines.push(\"\", `${currency} rated spend:`);\n for (const metric of report.metrics) {\n if (metric.currency !== currency) continue;\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${currency} ${metric.value}`);\n }\n }\n}\n\nfunction formatFireworksStatusline(report: UsageReport): string {\n const totals = report.metrics.filter((metric) => metric.id.endsWith(\"-total\"));\n if (totals.length === 0) return \"fireworks no rated usage\";\n return `fireworks ${totals.map((metric) => `${metric.currency} ${metric.value}`).join(\" \u00B7 \")}`;\n}\n\nfunction fireworksCurrencies(report: UsageReport): string[] {\n const currencies: string[] = [];\n for (const metric of report.metrics) {\n if (!metric.currency || currencies.includes(metric.currency)) continue;\n currencies.push(metric.currency);\n }\n return currencies;\n}\n\nfunction formatVercelAIGatewayReport(lines: string[], report: UsageReport): void {\n for (const metric of report.metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}USD ${metric.value}`);\n }\n}\n\nfunction formatVercelAIGatewayStatusline(report: UsageReport): string {\n const balance = report.metrics.find((metric) => metric.id === \"credit-balance\");\n return balance ? `vercel USD ${balance.value} left` : \"vercel credits unavailable\";\n}\n\nfunction formatGitHubCopilotReport(lines: string[], report: UsageReport): void {\n const quota = findGitHubCopilotQuota(report);\n if (!quota || quota.limit === undefined || quota.remaining === undefined) {\n lines.push(`${`${quota?.label ?? \"Copilot quota\"}:`.padEnd(VALUE_COLUMN)}unlimited`);\n return;\n }\n const percent = percentRemaining(quota);\n const reset = quota.resetsAt ? ` (resets ${formatReset(quota.resetsAt)})` : \"\";\n lines.push(\n `${`${quota.label}:`.padEnd(VALUE_COLUMN)}${quota.remaining} of ${quota.limit} left \u00B7 ${percent}%${reset}`,\n );\n const overage = report.metrics.find((metric) => metric.id === \"overage-used\");\n if (typeof overage?.value === \"number\" && overage.value > 0) {\n lines.push(`${\"Additional usage:\".padEnd(VALUE_COLUMN)}${overage.value} ${quota.label}`);\n }\n}\n\nfunction formatGitHubCopilotStatusline(report: UsageReport): string {\n const quota = findGitHubCopilotQuota(report);\n const kind = compactGitHubCopilotQuotaKind(quota);\n if (!quota || quota.limit === undefined || quota.remaining === undefined) {\n return `copilot ${kind} unlimited`;\n }\n const overage = report.metrics.find((metric) => metric.id === \"overage-used\");\n const overageSuffix = typeof overage?.value === \"number\" && overage.value > 0 ? ` +${overage.value} over` : \"\";\n return `copilot ${kind === \"premium\" ? \"\" : `${kind} `}${quota.remaining}/${quota.limit} ${percentRemaining(quota)}%${overageSuffix}`;\n}\n\nfunction findGitHubCopilotQuota(report: UsageReport): UsageBucket | undefined {\n return report.buckets.find((bucket) => [\"ai-credits\", \"premium-requests\", \"chat-requests\"].includes(bucket.id));\n}\n\nfunction compactGitHubCopilotQuotaKind(bucket: UsageBucket | undefined): string {\n if (bucket?.id === \"ai-credits\") return \"credits\";\n if (bucket?.id === \"chat-requests\") return \"chat\";\n return \"premium\";\n}\n\nfunction percentRemaining(bucket: UsageBucket): number {\n if (!bucket.limit || bucket.remaining === undefined) return 0;\n return Math.round(clampPercent((bucket.remaining / bucket.limit) * 100));\n}\n\nfunction formatOpenRouterReport(lines: string[], report: UsageReport): void {\n const limit = report.buckets.find((bucket) => bucket.id === \"key-limit\");\n if (limit) {\n const period = limit.period ? ` (${limit.period})` : \"\";\n const value =\n limit.remaining === undefined\n ? `${formatUsd(limit.limit ?? 0)} cap; remaining unavailable`\n : `${formatUsd(limit.remaining)} of ${formatUsd(limit.limit ?? 0)} left`;\n lines.push(`${`Key limit${period}:`.padEnd(VALUE_COLUMN)}${value}`);\n }\n for (const metric of report.metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`);\n }\n}\n\nfunction formatOpenCodeZenReport(lines: string[], report: UsageReport): void {\n for (const bucket of report.buckets) {\n if (bucket.unit === \"percent\" && bucket.used !== undefined) {\n lines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${formatPercentBucket(bucket)}`);\n continue;\n }\n const reset = bucket.resetsAt ? ` (resets ${formatReset(bucket.resetsAt)})` : \"\";\n const used = bucket.used ?? \"unavailable\";\n lines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${used}% used${reset}`);\n }\n}\n\nfunction formatOpenCodeZenStatusline(report: UsageReport): string | undefined {\n const parts = [\"zen\"];\n for (const bucket of report.buckets) {\n if (bucket.used === undefined) continue;\n const compact = bucket.id === \"rolling\" ? \"r\" : bucket.id === \"weekly\" ? \"w\" : \"m\";\n parts.push(`${clampPercent(bucket.used).toFixed(0)}% ${compact}`);\n }\n return parts.length > 1 ? parts.join(\" \") : undefined;\n}\n\nfunction formatKimiCodingReport(lines: string[], report: UsageReport): void {\n for (const bucket of report.buckets) {\n const reset = bucket.resetsAt ? ` (resets ${formatReset(bucket.resetsAt)})` : \"\";\n if (bucket.used === undefined || bucket.limit === undefined) {\n lines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}unavailable${reset}`);\n continue;\n }\n lines.push(\n `${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${bucket.used} of ${bucket.limit} used \u00B7 ${percentRemaining(bucket)}% left${reset}`,\n );\n }\n const balance = report.metrics.find((metric) => metric.id === \"booster-balance\");\n const total = report.metrics.find((metric) => metric.id === \"booster-total\");\n const monthlyUsed = report.metrics.find((metric) => metric.id === \"booster-monthly-used\");\n const monthlyLimit = report.metrics.find((metric) => metric.id === \"booster-monthly-limit\");\n if (!balance && !monthlyUsed && !monthlyLimit) return;\n lines.push(\"\", \"Extra usage wallet:\");\n if (balance) {\n const totalSuffix = total ? ` of ${formatCurrencyMetric(total)}` : \"\";\n lines.push(`${\"Balance:\".padEnd(VALUE_COLUMN)}${formatCurrencyMetric(balance)}${totalSuffix}`);\n }\n if (monthlyUsed) {\n lines.push(`${\"Used this month:\".padEnd(VALUE_COLUMN)}${formatCurrencyMetric(monthlyUsed)}`);\n }\n if (monthlyLimit) {\n lines.push(`${\"Monthly limit:\".padEnd(VALUE_COLUMN)}${formatCurrencyMetric(monthlyLimit)}`);\n }\n}\n\nfunction formatKimiCodingStatusline(report: UsageReport): string | undefined {\n const fiveHour = report.buckets.find((bucket) => bucket.id === \"five-hour\");\n const weekly = report.buckets.find((bucket) => bucket.id === \"weekly\");\n const subWindow = fiveHour ?? report.buckets.find((bucket) => bucket.id !== \"weekly\");\n const selected = [subWindow, weekly].filter(\n (bucket, index, buckets): bucket is UsageBucket => bucket !== undefined && buckets.indexOf(bucket) === index,\n );\n const parts = [\"kimi\"];\n for (const bucket of selected) {\n if (!bucket.limit || bucket.remaining === undefined) continue;\n const fallback = bucket.id === \"weekly\" ? \"weekly\" : \"5h\";\n parts.push(`${percentRemaining(bucket)}% ${formatWindowLabel(bucket.windowMinutes, fallback, true)}`);\n }\n return parts.length > 1 ? parts.join(\" \") : undefined;\n}\n\nfunction formatMoonshotReport(lines: string[], report: UsageReport): void {\n for (const metric of report.metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${metric.currency} ${metric.value}`);\n }\n}\n\nfunction formatMoonshotStatusline(report: UsageReport): string {\n const available = report.metrics.find((metric) => metric.id === \"available-balance\");\n if (!available) return \"moonshot balance unavailable\";\n return `moonshot ${available.currency ?? \"\"} ${available.value}`.replace(/\\s+/gu, \" \");\n}\n\nfunction formatMiniMaxReport(lines: string[], report: UsageReport): void {\n if (report.source === \"minimax-account-balance\") {\n for (const metric of report.metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${metric.currency} ${metric.value}`);\n }\n return;\n }\n let previousGroup: string | undefined;\n for (const bucket of report.buckets) {\n if (bucket.groupId !== previousGroup) lines.push(`${bucket.groupLabel ?? \"Token Plan\"}:`);\n previousGroup = bucket.groupId;\n const reset = bucket.resetsAt ? ` (resets ${formatReset(bucket.resetsAt)})` : \"\";\n const value =\n bucket.period === \"unlimited\"\n ? \"unlimited\"\n : bucket.unit === \"percent\" && bucket.remaining !== undefined\n ? `${bucket.remaining}% remaining${reset}`\n : bucket.limit !== undefined && bucket.remaining !== undefined\n ? `${bucket.remaining} of ${bucket.limit} left \u00B7 ${percentRemaining(bucket)}%${reset}`\n : \"unavailable\";\n lines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${value}`);\n }\n}\n\nfunction formatMiniMaxStatusline(report: UsageReport, model?: UsageModel): string | undefined {\n const prefix = report.providerId === \"minimax-cn\" ? \"minimax cn\" : \"minimax\";\n if (report.source === \"minimax-account-balance\") {\n const available = report.metrics.find((metric) => metric.id === \"available-balance\");\n return available ? `${prefix} ${available.currency} ${available.value}` : undefined;\n }\n const selectedGroup = selectMiniMaxGroup(report, model);\n if (!selectedGroup) return undefined;\n const selected = report.buckets.filter((bucket) => bucket.groupId === selectedGroup);\n const parts = [prefix];\n for (const bucket of selected) {\n const fallback = bucket.id.endsWith(\":weekly\") ? \"weekly\" : \"5h\";\n const window = formatWindowLabel(bucket.windowMinutes, fallback, true);\n if (bucket.period === \"unlimited\") {\n parts.push(`unlimited ${window}`);\n continue;\n }\n if (bucket.unit === \"percent\" && bucket.remaining !== undefined) {\n parts.push(`${bucket.remaining}% ${window}`);\n continue;\n }\n if (bucket.limit === undefined || bucket.remaining === undefined) continue;\n parts.push(`${percentRemaining(bucket)}% ${window}`);\n }\n return parts.length > 1 ? parts.join(\" \") : undefined;\n}\n\nfunction selectMiniMaxGroup(report: UsageReport, model?: UsageModel): string | undefined {\n const groups = [\n ...new Set(report.buckets.map((bucket) => bucket.groupId).filter((group): group is string => group !== undefined)),\n ];\n if (groups.length <= 1) return groups[0];\n if (model && model.provider !== report.providerId) return undefined;\n if (model) {\n const modelKeys = [model.id, model.name]\n .map(normalizeMiniMaxModelKey)\n .filter((key): key is string => key !== undefined);\n const candidates = groups.map((group) => {\n const bucket = report.buckets.find((candidate) => candidate.groupId === group);\n const patterns = [bucket?.groupLabel, ...(bucket?.modelKeys ?? []), group]\n .map(normalizeMiniMaxModelKey)\n .filter((key): key is string => key !== undefined);\n return { group, patterns };\n });\n const exact = candidates.find(({ patterns }) =>\n patterns.some((pattern) => !pattern.includes(\"*\") && modelKeys.includes(pattern)),\n );\n if (exact) return exact.group;\n const wildcard = candidates.find(({ patterns }) =>\n patterns.some((pattern) => pattern.includes(\"*\") && modelKeys.some((key) => wildcardKeyMatches(pattern, key))),\n );\n if (wildcard) return wildcard.group;\n }\n // Prefer the Coding Plan catch-all over hiding the chip.\n return groups.find((group) => group === \"general\");\n}\n\nfunction normalizeMiniMaxModelKey(value: string | undefined): string | undefined {\n const key = value?.toLowerCase().replace(/[^a-z0-9*]+/gu, \"\");\n return key && /[a-z0-9]/u.test(key) ? key : undefined;\n}\n\nfunction wildcardKeyMatches(pattern: string, value: string): boolean {\n if (!pattern.includes(\"*\")) return pattern === value;\n const segments = pattern.split(\"*\").filter(Boolean);\n let offset = 0;\n for (const [index, segment] of segments.entries()) {\n const found = value.indexOf(segment, offset);\n if (found < 0 || (index === 0 && !pattern.startsWith(\"*\") && found !== 0)) return false;\n offset = found + segment.length;\n }\n const last = segments.at(-1);\n return pattern.endsWith(\"*\") || (last !== undefined && value.endsWith(last));\n}\n\nfunction formatZaiStatusline(report: UsageReport): string | undefined {\n const selected = [\n report.buckets.find((bucket) => bucket.id === \"five-hour\"),\n report.buckets.find((bucket) => bucket.id === \"weekly\"),\n ];\n const parts = [\"zai\"];\n for (const bucket of selected) {\n if (!bucket?.limit || bucket.remaining === undefined) continue;\n const fallback = bucket.id === \"weekly\" ? \"weekly\" : \"5h\";\n parts.push(`${percentRemaining(bucket)}% ${formatWindowLabel(bucket.windowMinutes, fallback, true)}`);\n }\n return parts.length > 1 ? parts.join(\" \") : undefined;\n}\n\nfunction formatCurrencyMetric(metric: UsageReport[\"metrics\"][number]): string {\n if (typeof metric.value !== \"number\") return String(metric.value);\n if (!metric.currency) return \"unavailable\";\n if (metric.currency === \"USD\") return `$${metric.value.toFixed(2)}`;\n if (metric.currency === \"CNY\") return `\u00A5${metric.value.toFixed(2)}`;\n return `${metric.value.toFixed(2)} ${metric.currency}`;\n}\n\nfunction formatXaiReport(lines: string[], report: UsageReport): void {\n const included = report.buckets.find((bucket) => bucket.id === \"included-allowance\");\n if (included) {\n let value = \"unavailable\";\n if (included.unit === \"percent\" && included.used !== undefined) {\n value = formatPercentBar(included);\n } else if (included.used !== undefined) {\n value = `${formatUsd(included.used)} used`;\n if (included.limit !== undefined) value += ` of ${formatUsd(included.limit)}`;\n } else if (included.limit !== undefined) {\n value = `usage unavailable \u00B7 ${formatUsd(included.limit)} limit`;\n }\n const period = included.period ? ` \u00B7 ${included.period}` : \"\";\n const reset = included.resetsAt ? ` (resets ${formatReset(included.resetsAt)})` : \"\";\n lines.push(`${\"Included allowance:\".padEnd(VALUE_COLUMN)}${value}${period}${reset}`);\n }\n const onDemand = report.buckets.find((bucket) => bucket.id === \"on-demand\");\n if (onDemand) {\n let value = onDemand.used === undefined ? \"usage unavailable\" : `${formatUsd(onDemand.used)} used`;\n if (onDemand.limit !== undefined) value += ` of ${formatUsd(onDemand.limit)} cap`;\n lines.push(`${\"On-demand usage:\".padEnd(VALUE_COLUMN)}${value}`);\n }\n for (const metric of report.metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`);\n }\n}\n\nfunction formatZaiReport(lines: string[], report: UsageReport): void {\n for (const bucket of report.buckets) {\n if (bucket.unit === \"percent\" && bucket.used !== undefined) {\n lines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${formatPercentBucket(bucket)}`);\n continue;\n }\n const reset = bucket.resetsAt ? ` (resets ${formatReset(bucket.resetsAt)})` : \"\";\n let value = \"unavailable\";\n if (bucket.used !== undefined && bucket.limit !== undefined) {\n value = `${bucket.used} of ${bucket.limit} used`;\n if (bucket.remaining !== undefined) value += ` \u00B7 ${bucket.remaining} left`;\n } else if (bucket.used !== undefined) {\n value = `${bucket.used} used`;\n } else if (bucket.remaining !== undefined) {\n value = `${bucket.remaining} left`;\n }\n lines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${value}${reset}`);\n }\n for (const metric of report.metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`);\n }\n}\n\nfunction formatGenericReport(lines: string[], report: UsageReport): void {\n for (const bucket of report.buckets) {\n lines.push(\n `${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(bucket.remaining ?? bucket.used ?? \"unavailable\", bucket.unit)}`,\n );\n }\n for (const metric of report.metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`);\n }\n}\n\nfunction formatCodexStatusline(\n report: UsageReport,\n model?: UsageModel,\n now = Date.now(),\n showResetCountdown = true,\n): string | undefined {\n const group = selectCodexGroup(report, model);\n if (!group) return formatCodexCreditsStatus(report);\n const buckets = report.buckets.filter((bucket) => (bucket.groupId ?? bucket.id) === group);\n const labelBucket = buckets[0];\n const parts = [group === \"codex\" ? \"codex\" : `codex ${compactLimitLabel(labelBucket?.groupLabel ?? group)}`];\n for (const bucket of buckets) {\n if (bucket.remaining === undefined) continue;\n const percent = `${clampPercent(bucket.remaining).toFixed(0)}%`;\n const fallback = bucket.id.endsWith(\":secondary\") ? \"weekly\" : \"5h\";\n const window = formatWindowLabel(bucket.windowMinutes, fallback, true);\n if (!showResetCountdown) {\n parts.push(`${percent} ${window}`);\n continue;\n }\n const reset = formatResetCountdown(bucket.resetsAt, now);\n parts.push(`${percent} ${reset ? `\u21BB ${reset}` : window}`);\n }\n return parts.length > 1 ? parts.join(\" \") : formatCodexCreditsStatus(report);\n}\n\nfunction formatCodexCreditsStatus(report: UsageReport): string {\n const credits = report.metrics.find((metric) => metric.id === \"credits\");\n if (!credits) return \"codex usage unavailable\";\n if (credits.value === \"none\") return \"codex no credits\";\n if (credits.value === \"available\") return \"codex credits available\";\n if (credits.value === \"unlimited\") return \"codex credits unlimited\";\n return `codex ${formatMetricValue(credits.value, \"count\")} credits`;\n}\n\nfunction selectCodexGroup(report: UsageReport, model?: UsageModel): string | undefined {\n const groups = [...new Set(report.buckets.map((bucket) => bucket.groupId ?? bucket.id))];\n if (model?.provider !== \"openai-codex\") {\n return groups.includes(\"codex\") ? \"codex\" : groups[0];\n }\n const modelKeys = normalizedModelKeys(model);\n for (const group of groups) {\n const bucket = report.buckets.find((candidate) => (candidate.groupId ?? candidate.id) === group);\n const keys = [group, bucket?.groupLabel, ...(bucket?.modelKeys ?? [])]\n .map(normalizeKey)\n .filter((key): key is string => key !== undefined);\n if (keys.some((key) => modelKeys.has(key))) return group;\n }\n const variants = [...modelKeys]\n .map((key) => key.match(/(?:^|-)codex-(.+)$/)?.[1])\n .filter((value): value is string => Boolean(value));\n for (const variant of variants) {\n const matches = groups.filter((group) => {\n if (group === \"codex\") return false;\n const key = normalizeKey(group);\n return key ? normalizedKeyHasToken(key, variant) : false;\n });\n if (matches.length === 1) return matches[0];\n }\n return groups.includes(\"codex\") ? \"codex\" : groups[0];\n}\n\nfunction normalizedModelKeys(model: UsageModel): Set<string> {\n const keys = new Set<string>();\n for (const value of [model.id, model.name]) {\n const key = normalizeKey(value);\n if (!key) continue;\n keys.add(key);\n const index = key.indexOf(\"codex\");\n if (index >= 0) keys.add(key.slice(index));\n }\n return keys;\n}\n\nfunction normalizeKey(value: string | undefined): string | undefined {\n const separated = value?.toLowerCase().replace(/[^a-z0-9]+/g, \"-\");\n if (!separated) return undefined;\n let start = 0;\n let end = separated.length;\n while (separated[start] === \"-\") start += 1;\n while (end > start && separated[end - 1] === \"-\") end -= 1;\n return separated.slice(start, end) || undefined;\n}\n\nfunction normalizedKeyHasToken(key: string, token: string): boolean {\n return key === token || key.startsWith(`${token}-`) || key.endsWith(`-${token}`) || key.includes(`-${token}-`);\n}\n\nfunction compactLimitLabel(label: string): string {\n const normalized = label.replace(/[_-]+/g, \" \").trim();\n const codex = /\\bcodex\\s/iu.exec(normalized);\n const suffix = codex ? normalized.slice(codex.index + codex[0].length).trim() : \"\";\n return (suffix || normalized).toLowerCase().replace(/\\s+/g, \" \");\n}\n\nfunction formatPercentBucket(bucket: UsageBucket): string {\n return `${formatPercentBar(bucket)}${bucket.resetsAt ? ` (resets ${formatReset(bucket.resetsAt)})` : \"\"}`;\n}\n\nfunction formatPercentBar(bucket: UsageBucket): string {\n const remaining = clampPercent(bucket.remaining ?? 0);\n const filled = Math.round((remaining / 100) * BAR_SEGMENTS);\n return `[${\"\u2588\".repeat(filled)}${\"\u2591\".repeat(BAR_SEGMENTS - filled)}] ${remaining.toFixed(0)}% left`;\n}\n\nfunction formatWindowLabel(minutes: number | undefined, fallback: \"5h\" | \"weekly\", compact: boolean): string {\n if (!minutes || !Number.isFinite(minutes) || minutes <= 0) {\n return compact && fallback === \"weekly\" ? \"wk\" : capitalize(fallback);\n }\n if (minutes === 10_080) return compact ? \"wk\" : \"Weekly\";\n if (minutes % 10_080 === 0) return `${minutes / 10_080}w`;\n if (minutes % 1_440 === 0) return `${minutes / 1_440}d`;\n if (minutes % 60 === 0) return `${minutes / 60}h`;\n return `${minutes}m`;\n}\n\nfunction formatResetCountdown(resetsAt: number | undefined, now: number): string | undefined {\n if (resetsAt === undefined || !Number.isFinite(resetsAt) || !Number.isFinite(now)) return undefined;\n const totalMinutes = Math.max(0, Math.ceil((resetsAt * 1_000 - now) / 60_000));\n const days = Math.floor(totalMinutes / 1_440);\n const hours = Math.floor((totalMinutes % 1_440) / 60);\n const minutes = totalMinutes % 60;\n if (days > 0) {\n return [`${String(days)}d`, hours > 0 ? `${String(hours)}h` : minutes > 0 ? `${String(minutes)}m` : \"\"]\n .filter(Boolean)\n .join(\"\");\n }\n if (hours > 0) return [`${String(hours)}h`, minutes > 0 ? `${String(minutes)}m` : \"\"].filter(Boolean).join(\"\");\n return `${String(minutes)}m`;\n}\n\nfunction formatMetricValue(value: number | string, unit: UsageBucket[\"unit\"] | undefined): string {\n if (unit === \"usd\" && typeof value === \"number\") return formatUsd(value);\n return String(value);\n}\n\nfunction formatUsd(value: number): string {\n return `$${value.toFixed(2)}`;\n}\n\nfunction formatReset(epochSeconds: number): string {\n const reset = new Date(epochSeconds * 1000);\n if (Number.isNaN(reset.getTime())) return \"at an unknown time\";\n const time = `${reset.getHours().toString().padStart(2, \"0\")}:${reset.getMinutes().toString().padStart(2, \"0\")}`;\n const now = new Date();\n if (reset.toDateString() === now.toDateString()) return time;\n return `${time} on ${reset.getDate()} ${reset.toLocaleDateString(undefined, { month: \"short\" })}`;\n}\n\nfunction capitalize(value: string): string {\n return `${value[0]?.toUpperCase() ?? \"\"}${value.slice(1)}`;\n}\n\nfunction clampPercent(value: number): number {\n return Math.min(100, Math.max(0, value));\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { constants } from \"node:fs\";\nimport { chmod, mkdir, open, rename, rm, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, join } from \"node:path\";\nimport { getAgentDir } from \"@earendil-works/pi-coding-agent\";\nimport { isFireworksAccountId } from \"./providers/fireworks.js\";\nimport { isBoundedTargetId } from \"./usage-targets.js\";\n\nexport const USAGE_SETTINGS_FILE = \"pi-usage.json\";\nexport const MAX_USAGE_SETTINGS_BYTES = 64 * 1024;\n\nexport interface UsageSettings {\n codexFastMode: boolean;\n codexStatusResetCountdown: boolean;\n selectedTargets: Record<string, string>;\n}\n\nexport const DEFAULT_USAGE_SETTINGS: Readonly<UsageSettings> = Object.freeze({\n codexFastMode: false,\n codexStatusResetCountdown: true,\n selectedTargets: Object.freeze({}),\n});\n\nexport interface UsageSettingsState {\n kind: \"missing\" | \"loaded\" | \"invalid\";\n path: string;\n settings: UsageSettings;\n document?: Record<string, unknown>;\n issue?: string;\n}\n\nexport type UsageTargetPublicationCheck = () => Promise<void>;\n\nexport interface UsageSettingsRuntime {\n get(): Readonly<UsageSettingsState>;\n reload(signal?: AbortSignal): Promise<Readonly<UsageSettingsState>>;\n update(patch: Partial<UsageSettings>, signal?: AbortSignal): Promise<Readonly<UsageSettingsState>>;\n updateSelectedTarget(\n providerId: string,\n targetId: string,\n signal?: AbortSignal,\n checkPublishedSelection?: UsageTargetPublicationCheck,\n ): Promise<Readonly<UsageSettingsState>>;\n flush(): Promise<void>;\n}\n\ninterface UsageSettingsFileOperations {\n rename: typeof rename;\n writeFile: typeof writeFile;\n}\n\ninterface UsageSettingsRuntimeOptions {\n operations?: Partial<UsageSettingsFileOperations>;\n path?: string;\n}\n\nexport function usageSettingsPath(): string {\n return join(getAgentDir(), USAGE_SETTINGS_FILE);\n}\n\nexport function normalizeUsageSettings(value: unknown): UsageSettings | undefined {\n if (!isRecord(value)) return undefined;\n if (Object.hasOwn(value, \"codexFastMode\") && typeof value.codexFastMode !== \"boolean\") {\n return undefined;\n }\n if (Object.hasOwn(value, \"codexStatusResetCountdown\") && typeof value.codexStatusResetCountdown !== \"boolean\") {\n return undefined;\n }\n if (Object.hasOwn(value, \"fireworksAccountId\") && !isFireworksAccountId(value.fireworksAccountId)) {\n return undefined;\n }\n const selectedTargets = normalizeSelectedTargets(value.selectedTargets);\n if (Object.hasOwn(value, \"selectedTargets\") && !selectedTargets) return undefined;\n const effectiveTargets = { ...(selectedTargets ?? {}) };\n if (!effectiveTargets.fireworks && isFireworksAccountId(value.fireworksAccountId)) {\n effectiveTargets.fireworks = value.fireworksAccountId;\n }\n return {\n codexFastMode:\n typeof value.codexFastMode === \"boolean\" ? value.codexFastMode : DEFAULT_USAGE_SETTINGS.codexFastMode,\n codexStatusResetCountdown:\n typeof value.codexStatusResetCountdown === \"boolean\"\n ? value.codexStatusResetCountdown\n : DEFAULT_USAGE_SETTINGS.codexStatusResetCountdown,\n selectedTargets: effectiveTargets,\n };\n}\n\nexport async function loadUsageSettings(path = usageSettingsPath(), signal?: AbortSignal): Promise<UsageSettingsState> {\n throwIfAborted(signal);\n try {\n const handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);\n let text: string;\n try {\n const stats = await handle.stat();\n throwIfAborted(signal);\n if (!stats.isFile()) throw new Error(\"settings path is not a regular file\");\n if (stats.size > MAX_USAGE_SETTINGS_BYTES) {\n throw new Error(\"settings file exceeds 64 KiB\");\n }\n text = await handle.readFile(\"utf8\");\n } finally {\n await handle.close();\n }\n throwIfAborted(signal);\n const document = JSON.parse(text) as unknown;\n const settings = normalizeUsageSettings(document);\n if (!settings || !isRecord(document)) throw new Error(\"invalid settings shape\");\n return { kind: \"loaded\", path, settings, document };\n } catch (error) {\n if (signal?.aborted) throw error;\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return {\n kind: \"missing\",\n path,\n settings: { ...DEFAULT_USAGE_SETTINGS },\n document: {},\n };\n }\n return {\n kind: \"invalid\",\n path,\n settings: { ...DEFAULT_USAGE_SETTINGS },\n issue:\n isNodeError(error) && error.code === \"ELOOP\"\n ? \"symbolic links are not accepted\"\n : error instanceof Error\n ? error.message\n : String(error),\n };\n }\n}\n\nexport function createUsageSettingsRuntime(options: UsageSettingsRuntimeOptions | string = {}): UsageSettingsRuntime {\n const path = typeof options === \"string\" ? options : (options.path ?? usageSettingsPath());\n const operations: UsageSettingsFileOperations = {\n rename,\n writeFile,\n ...(typeof options === \"string\" ? undefined : options.operations),\n };\n let state: UsageSettingsState = {\n kind: \"missing\",\n path,\n settings: { ...DEFAULT_USAGE_SETTINGS },\n document: {},\n };\n let queue = Promise.resolve();\n const enqueue = <T>(operation: () => Promise<T>): Promise<T> => {\n const result = queue.then(operation, operation);\n queue = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n };\n return {\n get: () => structuredClone(state),\n reload: (signal) =>\n enqueue(async () => {\n const loaded = await loadUsageSettings(path, signal);\n state = loaded;\n return structuredClone(state);\n }),\n update: (patch, signal) =>\n enqueue(async () => {\n const saved = await saveUsageSettingsPatch(path, patch, operations, signal);\n state = saved;\n return structuredClone(state);\n }),\n updateSelectedTarget: (providerId, targetId, signal, checkPublishedSelection) =>\n enqueue(async () => {\n const transaction = await saveUsageTargetSelection(path, providerId, targetId, operations, signal);\n try {\n await checkPublishedSelection?.();\n throwIfAborted(signal);\n } catch (error) {\n try {\n await restoreUsageSettingsState(path, transaction.saved, transaction.previous, operations);\n state = transaction.previous;\n } catch (rollbackError) {\n state = await loadUsageSettings(path);\n throw new AggregateError(\n [error, rollbackError],\n \"Target selection changed after publication and pi-usage.json rollback failed\",\n );\n }\n throw error;\n }\n state = transaction.saved;\n return structuredClone(state);\n }),\n flush: () => queue,\n };\n}\n\nasync function saveUsageSettingsPatch(\n path: string,\n patch: Partial<UsageSettings>,\n operations: UsageSettingsFileOperations,\n signal?: AbortSignal,\n): Promise<UsageSettingsState> {\n return saveUsageSettingsDocument(\n path,\n (document) => {\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) delete document[key];\n else document[key] = value;\n }\n },\n operations,\n signal,\n );\n}\n\nasync function saveUsageTargetSelection(\n path: string,\n providerId: string,\n targetId: string,\n operations: UsageSettingsFileOperations,\n signal?: AbortSignal,\n): Promise<{ saved: UsageSettingsState; previous: UsageSettingsState }> {\n if (!isProviderId(providerId) || !isBoundedTargetId(targetId)) {\n throw new Error(\"Refusing to save an invalid usage target selection\");\n }\n const previous = await loadUsageSettings(path, signal);\n const saved = await saveUsageSettingsDocument(\n path,\n (document) => {\n document.selectedTargets = {\n ...(normalizeSelectedTargets(document.selectedTargets) ?? {}),\n [providerId]: targetId,\n };\n if (providerId === \"fireworks\") delete document.fireworksAccountId;\n },\n operations,\n signal,\n previous,\n );\n return { saved, previous };\n}\n\nasync function saveUsageSettingsDocument(\n path: string,\n mutate: (document: Record<string, unknown>) => void,\n operations: UsageSettingsFileOperations,\n signal?: AbortSignal,\n expected?: UsageSettingsState,\n): Promise<UsageSettingsState> {\n const latest = await loadUsageSettings(path, signal);\n if (latest.kind === \"invalid\") {\n throw new Error(\"Cannot overwrite an invalid pi-usage.json; repair it and reload first\");\n }\n if (expected && !sameUsageSettingsDocument(latest, expected)) {\n throw new Error(\"pi-usage.json changed while saving; retry the action\");\n }\n const document = { ...latest.document };\n mutate(document);\n const settings = normalizeUsageSettings(document);\n if (!settings) throw new Error(\"Refusing to save invalid pi-usage settings\");\n const directory = dirname(path);\n const temporaryPath = join(directory, `.${basename(path)}.${randomUUID()}.tmp`);\n await mkdir(directory, { recursive: true, mode: 0o700 });\n throwIfAborted(signal);\n try {\n await operations.writeFile(temporaryPath, `${JSON.stringify(document, null, 2)}\\n`, {\n encoding: \"utf8\",\n flag: \"wx\",\n mode: 0o600,\n });\n if (process.platform !== \"win32\") await chmodPrivate(temporaryPath);\n throwIfAborted(signal);\n const current = await loadUsageSettings(path, signal);\n if (\n current.kind === \"invalid\" ||\n current.kind !== latest.kind ||\n JSON.stringify(current.document) !== JSON.stringify(latest.document)\n ) {\n throw new Error(\"pi-usage.json changed while saving; retry the action\");\n }\n throwIfAborted(signal);\n await operations.rename(temporaryPath, path);\n } finally {\n await rm(temporaryPath, { force: true }).catch(() => undefined);\n }\n return { kind: \"loaded\", path, settings, document };\n}\n\nasync function restoreUsageSettingsState(\n path: string,\n published: UsageSettingsState,\n previous: UsageSettingsState,\n operations: UsageSettingsFileOperations,\n): Promise<void> {\n if (previous.kind === \"missing\") {\n const current = await loadUsageSettings(path);\n if (!sameUsageSettingsDocument(current, published)) {\n throw new Error(\"pi-usage.json changed before target selection rollback\");\n }\n await rm(path);\n return;\n }\n if (previous.kind !== \"loaded\" || !previous.document) {\n throw new Error(\"Cannot restore invalid prior pi-usage.json settings\");\n }\n await saveUsageSettingsDocument(\n path,\n (document) => {\n for (const key of Object.keys(document)) delete document[key];\n Object.assign(document, previous.document);\n },\n operations,\n undefined,\n published,\n );\n}\n\nfunction sameUsageSettingsDocument(\n left: Pick<UsageSettingsState, \"kind\" | \"document\">,\n right: Pick<UsageSettingsState, \"kind\" | \"document\">,\n): boolean {\n return left.kind === right.kind && JSON.stringify(left.document) === JSON.stringify(right.document);\n}\n\nasync function chmodPrivate(path: string): Promise<void> {\n await chmod(path, 0o600);\n}\n\nfunction throwIfAborted(signal?: AbortSignal): void {\n if (signal?.aborted) throw new DOMException(\"Settings operation aborted\", \"AbortError\");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error;\n}\n\nfunction normalizeSelectedTargets(value: unknown): Record<string, string> | undefined {\n if (value === undefined) return {};\n if (!isRecord(value)) return undefined;\n const targets: Record<string, string> = {};\n for (const [providerId, targetId] of Object.entries(value)) {\n if (!isProviderId(providerId) || !isBoundedTargetId(targetId)) return undefined;\n targets[providerId] = targetId;\n }\n return targets;\n}\n\nfunction isProviderId(value: string): boolean {\n return /^[A-Za-z0-9][A-Za-z0-9._~-]{0,127}$/u.test(value);\n}\n", "// This orchestrator intentionally remains over 1,000 lines because its menu, query generations,\n// account cache, cancellation, and session lifecycle share one consistency boundary.\nimport { randomUUID } from \"node:crypto\";\nimport type { ExtensionAPI, ExtensionCommandContext, ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { FAST_USAGE_WARNING, registerCodexFastMode } from \"./codex-fast-runtime.js\";\nimport {\n type CodexResetAvailability,\n type CodexResetOption,\n type CodexResetOutcome,\n codexResetActionDescription,\n codexResetCount,\n consumeCodexResetCredit,\n formatCodexResetOutcome,\n genericCodexResetOption,\n listCodexResetCredits,\n resetConfirmationLines,\n resetLabel,\n resetOptionExpiration,\n resolveCodexResetAuth,\n} from \"./codex-resets.js\";\nimport { abortError, awaitWithDeadline, errorMessage, runWithConcurrency, UsageCache } from \"./core.js\";\nimport { formatProviderStates, formatUsageStatusline } from \"./format.js\";\nimport { createOAuthCredentialCandidateReader } from \"./oauth-credential-source.js\";\nimport { adapterForProvider, isStaleExtensionContextError, queryProviderUsage, resolveUsageAuth } from \"./query.js\";\nimport { createUsageSettingsRuntime, type UsageSettingsRuntime, type UsageSettingsState } from \"./settings.js\";\nimport type {\n PiModel,\n ProviderUsageState,\n ResolvedUsageAuth,\n UsageDisplayState,\n UsageProviderAdapter,\n} from \"./types.js\";\nimport {\n configuredAdapters,\n isAbortError,\n isTimeoutError,\n modelIdentity,\n providerDisplayName,\n setBoundedMap,\n} from \"./usage-helpers.js\";\nimport { showUsageSettings } from \"./usage-settings-ui.js\";\nimport { createUsageTargetSelectOptions, listUsageTargets, resolveUsageTarget } from \"./usage-targets.js\";\n\nconst CACHE_TTL_MS = 5 * 60 * 1000;\nconst STATUS_COUNTDOWN_REFRESH_MS = 60 * 1000;\nconst DEFAULT_TIMEOUT_MS = 15_000;\nconst ALL_PROVIDER_CONCURRENCY = 2;\nconst FAILURE_BACKOFF_MS = 30_000;\nconst MAX_ACCOUNT_STATES = 32;\nconst STATUS_KEY = \"usage\";\n\nconst REFRESH_CURRENT = \"Refresh current usage\";\nconst VIEW_ANOTHER = \"View another configured provider\u2026\";\nconst VIEW_ALL = \"View all configured providers\u2026\";\nconst CLOSE = \"Close\";\nconst SETTINGS = \"Settings\";\nconst REDEEM_CODEX_RESET = \"Redeem usage limit reset\u2026\";\n\ntype UsageExtensionDependencies = {\n credentialReader?: (providerId: string) => unknown;\n createRedemptionId?: () => string;\n settingsRuntime?: UsageSettingsRuntime;\n};\n\ntype QueryOutcome = {\n state: ProviderUsageState;\n fingerprint?: string;\n authState?: \"unavailable\";\n rememberedTargetId?: string;\n};\n\nclass UsageTargetSelectionChangedError extends Error {\n override readonly name = \"UsageTargetSelectionChangedError\";\n}\n\ntype StableCurrent = {\n outcome: QueryOutcome;\n model: PiModel | undefined;\n};\n\nexport default function usageExtension(pi: ExtensionAPI, dependencies: UsageExtensionDependencies = {}) {\n const credentialReader = dependencies.credentialReader;\n const credentialCandidates = createOAuthCredentialCandidateReader(pi, credentialReader);\n const createRedemptionId = dependencies.createRedemptionId ?? randomUUID;\n const settingsRuntime = dependencies.settingsRuntime ?? createUsageSettingsRuntime();\n const cache = new UsageCache(CACHE_TTL_MS);\n const failureBackoff = new Map<string, { until: number; message: string }>();\n const latestQueries = new Map<string, number>();\n const activeControllers = new Set<AbortController>();\n let querySequence = 0;\n let activeCurrentIdentity: string | undefined;\n let sessionActive = false;\n let statusGeneration = 0;\n let sessionGeneration = 0;\n let statusRefreshTimer: ReturnType<typeof setTimeout> | undefined;\n let statusCountdownTimer: ReturnType<typeof setTimeout> | undefined;\n let statusController: AbortController | undefined;\n let fastRuntime: ReturnType<typeof registerCodexFastMode>;\n\n const clearStatusRefreshTimer = () => {\n if (statusRefreshTimer) clearTimeout(statusRefreshTimer);\n statusRefreshTimer = undefined;\n };\n\n const clearStatusCountdownTimer = () => {\n if (statusCountdownTimer) clearTimeout(statusCountdownTimer);\n statusCountdownTimer = undefined;\n };\n\n const clearStatusTimers = () => {\n clearStatusRefreshTimer();\n clearStatusCountdownTimer();\n };\n\n const safeSetStatus = (ctx: ExtensionContext, value: string | undefined): boolean => {\n try {\n ctx.ui.setStatus(STATUS_KEY, value);\n return true;\n } catch (error) {\n if (isStaleExtensionContextError(error)) return false;\n throw error;\n }\n };\n\n const clearStatus = (ctx: ExtensionContext) => {\n statusGeneration += 1;\n statusController?.abort();\n statusController = undefined;\n clearStatusTimers();\n safeSetStatus(ctx, undefined);\n };\n\n const scheduleStatusRefresh = (ctx: ExtensionContext, model: PiModel) => {\n clearStatusRefreshTimer();\n const generation = statusGeneration;\n statusRefreshTimer = setTimeout(() => {\n statusRefreshTimer = undefined;\n if (!sessionActive || generation !== statusGeneration) return;\n startStatusRefresh(ctx, model, true);\n }, CACHE_TTL_MS);\n statusRefreshTimer.unref?.();\n };\n\n const publishStatus = (ctx: ExtensionContext, outcome: QueryOutcome, model: PiModel, shouldSchedule: boolean) => {\n clearStatusCountdownTimer();\n if (adapterForProvider(model.provider)?.publishesStatusline === false) {\n clearStatusRefreshTimer();\n safeSetStatus(ctx, undefined);\n return;\n }\n if (outcome.state.status === \"unsupported\") {\n clearStatusRefreshTimer();\n safeSetStatus(ctx, undefined);\n return;\n }\n if (outcome.state.status !== \"ready\") {\n const chip =\n outcome.state.status === \"auth-unavailable\"\n ? \"auth unavailable\"\n : outcome.state.status === \"selection-required\"\n ? \"selection required\"\n : `usage err: ${outcome.state.message.slice(0, 50)}`;\n\n if (safeSetStatus(ctx, chip)) {\n if (shouldSchedule && sessionActive) scheduleStatusRefresh(ctx, model);\n }\n return;\n }\n const showCodexResetCountdown =\n outcome.state.report.providerId === \"openai-codex\" && settingsRuntime.get().settings.codexStatusResetCountdown;\n const now = Date.now();\n const rawValue = formatUsageStatusline(outcome.state.report, model, now, showCodexResetCountdown);\n const value = rawValue ? fastRuntime.decorateStatus(model, rawValue) : undefined;\n if (!safeSetStatus(ctx, value)) return;\n if (shouldSchedule && sessionActive) scheduleStatusRefresh(ctx, model);\n if (\n sessionActive &&\n showCodexResetCountdown &&\n outcome.state.report.buckets.some(\n (bucket) => bucket.resetsAt !== undefined && Number.isFinite(bucket.resetsAt) && bucket.resetsAt * 1_000 > now,\n )\n ) {\n const generation = statusGeneration;\n statusCountdownTimer = setTimeout(() => {\n statusCountdownTimer = undefined;\n if (!sessionActive || generation !== statusGeneration) return;\n publishStatus(ctx, outcome, model, false);\n }, STATUS_COUNTDOWN_REFRESH_MS);\n statusCountdownTimer.unref?.();\n }\n };\n\n const invalidateProviderState = (providerId: string) => {\n cache.clearProvider(providerId);\n for (const key of failureBackoff.keys()) {\n if (key.startsWith(`${providerId}:`)) failureBackoff.delete(key);\n }\n for (const key of latestQueries.keys()) {\n if (key.startsWith(`${providerId}:`)) latestQueries.delete(key);\n }\n };\n\n const transitionCurrentIdentity = (nextIdentity: string, providerId: string) => {\n if (!activeCurrentIdentity || activeCurrentIdentity === nextIdentity) {\n activeCurrentIdentity = nextIdentity;\n return;\n }\n const previousProviderId = activeCurrentIdentity.split(\":\", 1)[0] ?? \"\";\n for (const id of new Set([previousProviderId, providerId])) {\n if (id) invalidateProviderState(id);\n }\n activeCurrentIdentity = nextIdentity;\n };\n\n const queryAdapterState = async (\n ctx: ExtensionContext,\n adapter: UsageProviderAdapter,\n displayState: UsageDisplayState,\n force: boolean,\n signal: AbortSignal,\n authRetry = 0,\n deadlineAt = Date.now() + DEFAULT_TIMEOUT_MS,\n ): Promise<QueryOutcome> => {\n const expectedSessionGeneration = sessionGeneration;\n const expectedSessionId = ctx.sessionManager.getSessionId();\n const expectedModelIdentity = modelIdentity(ctx.model);\n const expectedTargetId = adapter.targets ? settingsRuntime.get().settings.selectedTargets[adapter.id] : undefined;\n const providerName = providerDisplayName(ctx, adapter.id);\n let auth: ResolvedUsageAuth | undefined;\n try {\n auth = await awaitWithDeadline(\n resolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n signal,\n Math.max(1, deadlineAt - Date.now()),\n `resolving ${adapter.displayName} runtime auth`,\n );\n } catch (error) {\n if (isStaleExtensionContextError(error) || isAbortError(error)) throw error;\n if (displayState === \"current\") {\n transitionCurrentIdentity(`${adapter.id}:auth-error`, adapter.id);\n }\n return {\n state: {\n providerId: adapter.id,\n providerName,\n displayState,\n status: isTimeoutError(error) ? \"query-failed\" : \"auth-unavailable\",\n message: errorMessage(error),\n },\n };\n }\n const requiresRequestBoundaryGuard =\n adapter.targets !== undefined ||\n [\n \"baseten\",\n \"deepseek\",\n \"minimax\",\n \"minimax-cn\",\n \"moonshotai\",\n \"moonshotai-cn\",\n \"vercel-ai-gateway\",\n \"xai\",\n \"zai\",\n \"zai-coding-cn\",\n ].includes(adapter.id);\n const requestContextChanged = () =>\n expectedSessionGeneration !== sessionGeneration ||\n ctx.sessionManager.getSessionId() !== expectedSessionId ||\n modelIdentity(ctx.model) !== expectedModelIdentity ||\n (adapter.targets !== undefined &&\n settingsRuntime.get().settings.selectedTargets[adapter.id] !== expectedTargetId);\n if (requiresRequestBoundaryGuard && requestContextChanged()) throw abortError();\n if (!auth) {\n if (displayState === \"current\") {\n transitionCurrentIdentity(`${adapter.id}:unavailable`, adapter.id);\n }\n return {\n state: {\n providerId: adapter.id,\n providerName,\n displayState,\n status: \"auth-unavailable\",\n message: `No runtime credential is configured for ${providerName}.`,\n },\n authState: \"unavailable\",\n };\n }\n let retryableAuthChanged = false;\n const guard = async () => {\n if (signal.aborted || requestContextChanged()) throw abortError();\n if (!requiresRequestBoundaryGuard) return;\n const revalidated = await awaitWithDeadline(\n resolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n signal,\n Math.max(1, deadlineAt - Date.now()),\n `revalidating ${providerName} runtime auth`,\n );\n if (signal.aborted || requestContextChanged()) throw abortError();\n if (revalidated?.fingerprint !== auth.fingerprint) {\n if ([\"deepseek\", \"minimax\", \"minimax-cn\"].includes(adapter.id)) {\n retryableAuthChanged = true;\n throw new Error(`${providerName} runtime credential changed during the usage query.`);\n }\n throw abortError();\n }\n };\n let queryFingerprint = adapter.targets\n ? `${auth.fingerprint}:target:${expectedTargetId ?? \"unresolved\"}`\n : auth.fingerprint;\n let failureKey = `${adapter.id}:${queryFingerprint}`;\n let queryId: number | undefined;\n try {\n const previousDiscoveryFailure = failureBackoff.get(failureKey);\n if (!force && previousDiscoveryFailure && previousDiscoveryFailure.until > Date.now()) {\n return {\n state: {\n providerId: adapter.id,\n providerName,\n displayState,\n status: \"query-failed\",\n message: previousDiscoveryFailure.message,\n },\n fingerprint: auth.fingerprint,\n rememberedTargetId: expectedTargetId,\n };\n }\n const target = await resolveUsageTarget(\n adapter,\n auth,\n expectedTargetId,\n signal,\n Math.max(1, deadlineAt - Date.now()),\n guard,\n );\n if (target.kind === \"selection-required\") {\n if (displayState === \"current\") {\n transitionCurrentIdentity(`${adapter.id}:${queryFingerprint}`, adapter.id);\n }\n return {\n state: {\n providerId: adapter.id,\n providerName,\n displayState,\n status: \"selection-required\",\n singularLabel: adapter.targets?.singularLabel ?? \"target\",\n pluralLabel: adapter.targets?.pluralLabel ?? \"targets\",\n choices: target.choices,\n },\n fingerprint: auth.fingerprint,\n rememberedTargetId: expectedTargetId,\n };\n }\n queryFingerprint = adapter.targets ? `${auth.fingerprint}:target:${target.targetId ?? \"none\"}` : auth.fingerprint;\n failureKey = `${adapter.id}:${queryFingerprint}`;\n if (displayState === \"current\") {\n transitionCurrentIdentity(`${adapter.id}:${queryFingerprint}`, adapter.id);\n }\n const cached = !force ? cache.get(adapter.id, queryFingerprint) : undefined;\n if (cached) {\n return {\n state: {\n providerId: adapter.id,\n providerName,\n displayState,\n status: \"ready\",\n report: cached,\n },\n fingerprint: auth.fingerprint,\n rememberedTargetId: expectedTargetId,\n };\n }\n const previousFailure = failureBackoff.get(failureKey);\n if (!force && previousFailure && previousFailure.until > Date.now()) {\n return {\n state: {\n providerId: adapter.id,\n providerName,\n displayState,\n status: \"query-failed\",\n message: previousFailure.message,\n },\n fingerprint: auth.fingerprint,\n rememberedTargetId: expectedTargetId,\n };\n }\n failureBackoff.delete(failureKey);\n querySequence += 1;\n queryId = querySequence;\n setBoundedMap(latestQueries, failureKey, queryId, MAX_ACCOUNT_STATES);\n const report = await queryProviderUsage(\n adapter,\n auth,\n signal,\n Math.max(1, deadlineAt - Date.now()),\n requiresRequestBoundaryGuard ? guard : undefined,\n target.targetId,\n );\n if (requiresRequestBoundaryGuard) await guard();\n const effectiveReport = { ...report, providerName };\n if (latestQueries.get(failureKey) === queryId) {\n cache.set(adapter.id, queryFingerprint, effectiveReport);\n failureBackoff.delete(failureKey);\n }\n return {\n state: {\n providerId: adapter.id,\n providerName,\n displayState,\n status: \"ready\",\n report: effectiveReport,\n },\n fingerprint: auth.fingerprint,\n rememberedTargetId: expectedTargetId,\n };\n } catch (error) {\n if (isStaleExtensionContextError(error) || isAbortError(error)) throw error;\n if (\n retryableAuthChanged &&\n authRetry === 0 &&\n !signal.aborted &&\n !requestContextChanged() &&\n Date.now() < deadlineAt\n ) {\n if (queryId !== undefined && latestQueries.get(failureKey) === queryId) {\n latestQueries.delete(failureKey);\n }\n return queryAdapterState(ctx, adapter, displayState, true, signal, authRetry + 1, deadlineAt);\n }\n const message = errorMessage(error);\n const now = Date.now();\n for (const [key, failure] of failureBackoff) {\n if (failure.until <= now) failureBackoff.delete(key);\n }\n if (queryId === undefined || latestQueries.get(failureKey) === queryId) {\n if (adapter.invalidateCacheOnFailure) cache.delete(adapter.id, queryFingerprint);\n setBoundedMap(failureBackoff, failureKey, { until: now + FAILURE_BACKOFF_MS, message }, MAX_ACCOUNT_STATES);\n }\n return {\n state: {\n providerId: adapter.id,\n providerName,\n displayState,\n status: \"query-failed\",\n message,\n },\n fingerprint: auth.fingerprint,\n rememberedTargetId: expectedTargetId,\n };\n }\n };\n\n const loadTargetChoices = async (ctx: ExtensionContext, adapter: UsageProviderAdapter, signal: AbortSignal) => {\n if (!adapter.targets) throw new Error(\"Provider does not support usage targets.\");\n const expectedSessionGeneration = sessionGeneration;\n const expectedSessionId = ctx.sessionManager.getSessionId();\n const expectedModel = modelIdentity(ctx.model);\n const expectedTargetId = settingsRuntime.get().settings.selectedTargets[adapter.id];\n const deadlineAt = Date.now() + DEFAULT_TIMEOUT_MS;\n const changed = () =>\n expectedSessionGeneration !== sessionGeneration ||\n ctx.sessionManager.getSessionId() !== expectedSessionId ||\n modelIdentity(ctx.model) !== expectedModel ||\n settingsRuntime.get().settings.selectedTargets[adapter.id] !== expectedTargetId;\n const auth = await awaitWithDeadline(\n resolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n signal,\n Math.max(1, deadlineAt - Date.now()),\n `resolving ${providerDisplayName(ctx, adapter.id)} runtime auth`,\n );\n if (!auth || signal.aborted || changed()) throw abortError();\n const guard = async () => {\n if (signal.aborted || changed()) throw abortError();\n const revalidated = await awaitWithDeadline(\n resolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n signal,\n Math.max(1, deadlineAt - Date.now()),\n `revalidating ${providerDisplayName(ctx, adapter.id)} runtime auth`,\n );\n if (signal.aborted || changed() || revalidated?.fingerprint !== auth.fingerprint) {\n throw abortError();\n }\n };\n const choices = await listUsageTargets(adapter, auth, signal, Math.max(1, deadlineAt - Date.now()), guard);\n return { choices, fingerprint: auth.fingerprint };\n };\n\n const queryCurrentState = async (\n ctx: ExtensionContext,\n model: PiModel | undefined,\n force: boolean,\n signal: AbortSignal,\n ): Promise<QueryOutcome> => {\n const adapter = adapterForProvider(model?.provider);\n if (!adapter) {\n const providerId = model?.provider ?? \"none\";\n transitionCurrentIdentity(`unsupported:${providerId}`, providerId);\n return {\n state: {\n providerId,\n providerName: providerDisplayName(ctx, providerId),\n displayState: \"current\",\n status: \"unsupported\",\n message: model\n ? `Usage reporting is not supported for ${providerDisplayName(ctx, providerId)}.`\n : \"No model is selected.\",\n },\n };\n }\n return queryAdapterState(ctx, adapter, \"current\", force, signal);\n };\n\n const refreshCurrentStatus = async (ctx: ExtensionContext, model: PiModel | undefined, force: boolean) => {\n const adapter = adapterForProvider(model?.provider);\n if (!adapter || !model) {\n const providerId = model?.provider ?? \"none\";\n transitionCurrentIdentity(`unsupported:${providerId}`, providerId);\n clearStatus(ctx);\n return;\n }\n if (adapter.publishesStatusline === false) {\n clearStatus(ctx);\n return;\n }\n statusGeneration += 1;\n const generation = statusGeneration;\n clearStatusCountdownTimer();\n statusController?.abort();\n const controller = new AbortController();\n statusController = controller;\n activeControllers.add(controller);\n try {\n if (!safeSetStatus(ctx, \"checking\")) return;\n const outcome = await queryCurrentState(ctx, model, force, controller.signal);\n if (!sessionActive || generation !== statusGeneration || controller.signal.aborted) return;\n if (!(await outcomeStillCurrent(ctx, model, generation, outcome, controller.signal))) {\n if (sessionActive && generation === statusGeneration) {\n queueMicrotask(() => startStatusRefresh(ctx, ctx.model, false));\n }\n return;\n }\n publishStatus(ctx, outcome, model, true);\n } finally {\n activeControllers.delete(controller);\n if (statusController === controller) statusController = undefined;\n }\n };\n\n const startStatusRefresh = (ctx: ExtensionContext, model: PiModel | undefined, force: boolean) => {\n void refreshCurrentStatus(ctx, model, force).catch((error) => {\n if (isStaleExtensionContextError(error) || isAbortError(error)) return;\n const message = errorMessage(error);\n console.error(\"[pi-usage] refresh failed:\", message);\n safeSetStatus(ctx, `usage err: ${message.slice(0, 50)}`);\n });\n };\n\n const runMenuOperation = async <T>(\n ctx: ExtensionCommandContext,\n label: string,\n parentSignal: AbortSignal,\n operation: (signal: AbortSignal) => Promise<T>,\n cancellable = true,\n ): Promise<T | undefined> => {\n const { runTask } = await import(\"@narumitw/pi-tui-kit\");\n if (parentSignal.aborted) return undefined;\n const result = await runTask(ctx, {\n label,\n signal: parentSignal,\n cancellable,\n onError: () => undefined,\n task: ({ signal }) => operation(signal),\n });\n switch (result.kind) {\n case \"completed\":\n return result.value;\n case \"cancelled\":\n case \"stale\":\n return undefined;\n case \"error\":\n throw result.error;\n }\n };\n\n const outcomeStillCurrent = async (\n ctx: ExtensionContext,\n model: PiModel | undefined,\n generation: number,\n outcome: QueryOutcome,\n signal: AbortSignal,\n ): Promise<boolean> => {\n if (generation !== statusGeneration || modelIdentity(ctx.model) !== modelIdentity(model)) {\n return false;\n }\n const adapter = adapterForProvider(model?.provider);\n const selectionStillCurrent =\n !adapter?.targets || settingsRuntime.get().settings.selectedTargets[adapter.id] === outcome.rememberedTargetId;\n if (!selectionStillCurrent) return false;\n if (outcome.authState === \"unavailable\") {\n if (!adapter) return false;\n try {\n const auth = await awaitWithDeadline(\n resolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n signal,\n DEFAULT_TIMEOUT_MS,\n `revalidating ${adapter.displayName} runtime auth`,\n );\n return (\n generation === statusGeneration &&\n modelIdentity(ctx.model) === modelIdentity(model) &&\n (!adapter.targets ||\n settingsRuntime.get().settings.selectedTargets[adapter.id] === outcome.rememberedTargetId) &&\n auth === undefined\n );\n } catch (error) {\n if (isAbortError(error) || isStaleExtensionContextError(error)) throw error;\n return false;\n }\n }\n if (!outcome.fingerprint) return true;\n if (!adapter) return false;\n try {\n const auth = await awaitWithDeadline(\n resolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n signal,\n DEFAULT_TIMEOUT_MS,\n `revalidating ${adapter.displayName} runtime auth`,\n );\n return (\n generation === statusGeneration &&\n modelIdentity(ctx.model) === modelIdentity(model) &&\n (!adapter.targets ||\n settingsRuntime.get().settings.selectedTargets[adapter.id] === outcome.rememberedTargetId) &&\n auth?.fingerprint === outcome.fingerprint\n );\n } catch (error) {\n if (isAbortError(error) || isStaleExtensionContextError(error)) throw error;\n return false;\n }\n };\n\n const queryStableCurrent = async (\n ctx: ExtensionCommandContext,\n force: boolean,\n controller: AbortController,\n label: string,\n ): Promise<StableCurrent | undefined> => {\n for (let attempt = 0; attempt < 3; attempt += 1) {\n const model = ctx.model;\n const generation = statusGeneration;\n const result = await runMenuOperation(ctx, label, controller.signal, async (signal) => {\n const outcome = await queryCurrentState(ctx, model, force, signal);\n return {\n outcome,\n stable: await outcomeStillCurrent(ctx, model, generation, outcome, signal),\n };\n });\n if (!result) return undefined;\n if (result.stable) return { outcome: result.outcome, model };\n force = false;\n }\n ctx.ui.notify(\"The active model or account kept changing; reopen /usage to retry.\", \"warning\");\n return undefined;\n };\n\n const publishStableCurrent = (ctx: ExtensionCommandContext, current: StableCurrent) => {\n if (current.model) publishStatus(ctx, current.outcome, current.model, sessionActive);\n else safeSetStatus(ctx, undefined);\n };\n\n const showMenu = async (ctx: ExtensionCommandContext): Promise<void> => {\n if (!ctx.hasUI) throw new Error(\"/usage requires TUI or RPC mode.\");\n statusGeneration += 1;\n const menuGeneration = statusGeneration;\n statusController?.abort();\n statusController = undefined;\n clearStatusTimers();\n const controller = new AbortController();\n activeControllers.add(controller);\n try {\n let stableCurrent = await queryStableCurrent(ctx, false, controller, \"Checking current usage\u2026\");\n if (!stableCurrent) return;\n publishStableCurrent(ctx, stableCurrent);\n let current = stableCurrent.outcome;\n let visibleStates: ProviderUsageState[] = [current.state];\n let fastState = settingsRuntime.get();\n let resetAvailability: CodexResetAvailability | undefined;\n let selectedReset: CodexResetOption | undefined;\n let resetAuthFingerprint: string | undefined;\n let resetModelIdentity: string | undefined;\n let redemptionId: string | undefined;\n let resetOutcome: CodexResetOutcome | undefined;\n let resetFailure: string | undefined;\n const actionableTargetState = (): ProviderUsageState | undefined => {\n if (visibleStates.length !== 1) return undefined;\n const state = visibleStates[0];\n return state &&\n (state.status === \"ready\" || state.status === \"selection-required\") &&\n adapterForProvider(state.providerId)?.targets\n ? state\n : undefined;\n };\n const promptForTarget = async (state: ProviderUsageState, stateFingerprint?: string): Promise<boolean> => {\n const adapter = adapterForProvider(state.providerId);\n if (!adapter?.targets) return false;\n const expectedRememberedTargetId = settingsRuntime.get().settings.selectedTargets[adapter.id];\n const snapshot =\n state.status === \"selection-required\" && stateFingerprint\n ? { choices: state.choices, fingerprint: stateFingerprint }\n : await runMenuOperation(ctx, `Loading ${adapter.targets.pluralLabel}\u2026`, controller.signal, (signal) =>\n loadTargetChoices(ctx, adapter, signal),\n );\n if (!snapshot || controller.signal.aborted || statusGeneration !== menuGeneration) {\n return false;\n }\n const selectOptions = createUsageTargetSelectOptions(snapshot.choices);\n const selected = await ctx.ui.select(\n `Select ${adapter.targets.singularLabel} for ${providerDisplayName(ctx, adapter.id)}`,\n [...selectOptions.options],\n { signal: controller.signal },\n );\n if (\n selected === undefined ||\n controller.signal.aborted ||\n statusGeneration !== menuGeneration ||\n settingsRuntime.get().settings.selectedTargets[adapter.id] !== expectedRememberedTargetId\n ) {\n return false;\n }\n const targetId = selectOptions.targetIdFor(selected);\n if (!targetId) return false;\n const revalidated = await runMenuOperation(\n ctx,\n `Revalidating ${adapter.targets.singularLabel}\u2026`,\n controller.signal,\n (signal) => loadTargetChoices(ctx, adapter, signal),\n );\n if (\n !revalidated ||\n controller.signal.aborted ||\n statusGeneration !== menuGeneration ||\n settingsRuntime.get().settings.selectedTargets[adapter.id] !== expectedRememberedTargetId\n ) {\n return false;\n }\n if (\n revalidated.fingerprint !== snapshot.fingerprint ||\n !revalidated.choices.some((choice) => choice.id === targetId)\n ) {\n ctx.ui.notify(\n `${providerDisplayName(ctx, adapter.id)} ${adapter.targets.pluralLabel} changed; choose again.`,\n \"warning\",\n );\n return false;\n }\n let saved: Readonly<UsageSettingsState> | undefined;\n try {\n saved = await runMenuOperation(ctx, `Saving ${adapter.targets.singularLabel}\u2026`, controller.signal, (signal) =>\n settingsRuntime.updateSelectedTarget(adapter.id, targetId, signal, async () => {\n let published: Awaited<ReturnType<typeof loadTargetChoices>>;\n try {\n published = await loadTargetChoices(ctx, adapter, signal);\n } catch (error) {\n if (\n signal.aborted ||\n controller.signal.aborted ||\n statusGeneration !== menuGeneration ||\n isStaleExtensionContextError(error)\n ) {\n throw error;\n }\n throw new UsageTargetSelectionChangedError();\n }\n if (\n published.fingerprint !== snapshot.fingerprint ||\n !published.choices.some((choice) => choice.id === targetId)\n ) {\n throw new UsageTargetSelectionChangedError();\n }\n }),\n );\n } catch (error) {\n if (error instanceof UsageTargetSelectionChangedError) {\n ctx.ui.notify(\n `${providerDisplayName(ctx, adapter.id)} ${adapter.targets.pluralLabel} changed; choose again.`,\n \"warning\",\n );\n return false;\n }\n throw error;\n }\n if (!saved || controller.signal.aborted || statusGeneration !== menuGeneration) {\n return false;\n }\n invalidateProviderState(adapter.id);\n return true;\n };\n const { defineMenu, runMenu } = await import(\"@narumitw/pi-tui-kit\");\n if (controller.signal.aborted || statusGeneration !== menuGeneration) return;\n type Screen = \"main\" | \"providers\" | \"reset-picker\" | \"reset-confirm\" | \"reset-result\" | \"reset-error\";\n type Action =\n | \"refresh\"\n | \"settings\"\n | \"target\"\n | \"toggle-fast\"\n | \"another\"\n | \"all\"\n | \"provider\"\n | \"open-resets\"\n | \"select-reset\"\n | \"cancel-reset\"\n | \"consume-reset\"\n | \"back-to-usage\"\n | \"back-to-resets\";\n const menu = defineMenu<undefined, Screen, Action, ExtensionCommandContext>({\n start: \"main\",\n screens: {\n main: () => {\n const fastAvailability = fastRuntime.availability(ctx.model);\n const targetState = actionableTargetState();\n const targetAdapter = adapterForProvider(targetState?.providerId);\n const fastLines =\n fastAvailability.kind === \"available\"\n ? [`Fast mode: ${fastAvailability.enabled ? \"On\" : \"Off\"}`, FAST_USAGE_WARNING]\n : fastAvailability.kind === \"unavailable\"\n ? [`Fast mode: Unavailable \u00B7 ${fastAvailability.reason}`]\n : [];\n return {\n kind: \"actions\",\n title: \"Provider usage\",\n lines: [...formatProviderStates(visibleStates).split(\"\\n\"), ...fastLines],\n items: [\n { id: \"refresh\", label: REFRESH_CURRENT, action: \"refresh\" },\n { id: \"settings\", label: SETTINGS, action: \"settings\" },\n ...(targetState && targetAdapter?.targets\n ? [\n {\n id: \"target\",\n label: `${targetState.status === \"selection-required\" ? \"Select\" : \"Change\"} ${targetAdapter.targets.singularLabel}\u2026`,\n action: \"target\" as const,\n },\n ]\n : []),\n ...(fastAvailability.kind === \"available\"\n ? [\n {\n id: \"toggle-fast\",\n label: fastAvailability.enabled ? \"Turn Fast mode off\" : \"Turn Fast mode on\",\n description:\n fastState.kind === \"invalid\"\n ? \"Repair pi-usage.json and reload before changing Fast mode.\"\n : FAST_USAGE_WARNING,\n disabled: fastState.kind === \"invalid\",\n action: \"toggle-fast\" as const,\n },\n ]\n : []),\n ...(current.state.status === \"ready\" && current.state.providerId === \"openai-codex\"\n ? [\n {\n id: \"open-resets\",\n label: REDEEM_CODEX_RESET,\n description: codexResetActionDescription(current.state.report),\n disabled: codexResetCount(current.state.report) === 0,\n action: \"open-resets\" as const,\n },\n ]\n : []),\n { id: \"another\", label: VIEW_ANOTHER, action: \"another\" },\n { id: \"all\", label: VIEW_ALL, action: \"all\" },\n { id: \"close\", label: CLOSE, close: true },\n ],\n hint: \"close\",\n };\n },\n providers: () => ({\n kind: \"actions\",\n title: \"Select a configured provider\",\n items: configuredAdapters(ctx)\n .filter((adapter) => adapter.id !== ctx.model?.provider)\n .map((adapter) => ({\n id: adapter.id,\n label: providerDisplayName(ctx, adapter.id),\n action: \"provider\" as const,\n })),\n hint: \"back\",\n }),\n \"reset-picker\": () => ({\n kind: \"choice\",\n title: \"Usage limit resets\",\n lines: [\n `${resetAvailability?.availableCount ?? 0} ${resetLabel(resetAvailability?.availableCount ?? 0)} available.`,\n ],\n items: (resetAvailability?.options ?? []).map((option, index) => ({\n id: `reset-${index}`,\n label: option.title,\n description: resetOptionExpiration(option),\n details: [option.description],\n })),\n action: \"select-reset\",\n initialItemId: \"reset-0\",\n hint: \"back\",\n }),\n \"reset-confirm\": () => ({\n kind: \"actions\",\n title: \"Use this reset?\",\n lines: resetConfirmationLines(selectedReset),\n items: [\n { id: \"cancel-reset\", label: \"No, go back\", action: \"cancel-reset\" },\n { id: \"consume-reset\", label: \"Yes, use reset\", action: \"consume-reset\" },\n ],\n hint: \"back\",\n }),\n \"reset-result\": () => ({\n kind: \"actions\",\n title: \"Usage limit resets\",\n lines: [\n formatCodexResetOutcome(\n resetOutcome,\n current.state.status === \"ready\" ? codexResetCount(current.state.report) : undefined,\n ),\n ],\n items: [\n {\n id: \"back-to-usage\",\n label: \"Back to usage\",\n action: \"back-to-usage\",\n },\n { id: \"close\", label: CLOSE, close: true },\n ],\n hint: \"back\",\n }),\n \"reset-error\": () => ({\n kind: \"actions\",\n title: \"Usage limit resets\",\n lines: [resetFailure ?? \"Couldn't reset usage. Please try again.\"],\n items: [\n { id: \"consume-reset\", label: \"Try again\", action: \"consume-reset\" },\n { id: \"back-to-resets\", label: \"Back\", action: \"back-to-resets\" },\n ],\n hint: \"back\",\n }),\n },\n actions: {\n target: async () => {\n const targetState = actionableTargetState();\n if (!targetState) return { kind: \"rejected\" };\n try {\n const stateFingerprint = targetState === current.state ? current.fingerprint : undefined;\n if (!(await promptForTarget(targetState, stateFingerprint))) {\n return { kind: \"stay\" };\n }\n const adapter = adapterForProvider(targetState.providerId);\n if (!adapter) return { kind: \"rejected\" };\n if (targetState.providerId === ctx.model?.provider) {\n const refreshed = await queryStableCurrent(\n ctx,\n true,\n controller,\n `Checking ${providerDisplayName(ctx, adapter.id)} usage\u2026`,\n );\n if (!refreshed) return { kind: \"stay\" };\n stableCurrent = refreshed;\n current = refreshed.outcome;\n visibleStates = [current.state];\n publishStableCurrent(ctx, refreshed);\n return { kind: \"stay\" };\n }\n const outcome = await runMenuOperation(\n ctx,\n `Checking ${providerDisplayName(ctx, adapter.id)} usage\u2026`,\n controller.signal,\n (signal) => queryAdapterState(ctx, adapter, \"configured\", true, signal),\n );\n if (!outcome) return { kind: \"stay\" };\n const revalidated = await queryStableCurrent(ctx, false, controller, \"Revalidating current usage\u2026\");\n if (!revalidated) return { kind: \"stay\" };\n stableCurrent = revalidated;\n current = revalidated.outcome;\n visibleStates = [\n outcome.state.providerId === current.state.providerId\n ? current.state\n : { ...outcome.state, displayState: \"configured\" },\n ];\n return { kind: \"stay\" };\n } catch (error) {\n if (isAbortError(error) || isStaleExtensionContextError(error)) {\n return { kind: \"stay\" };\n }\n ctx.ui.notify(`Could not select target: ${errorMessage(error)}`, \"error\");\n return { kind: \"stay\" };\n }\n },\n settings: async () => {\n await showUsageSettings(\n ctx,\n settingsRuntime,\n controller.signal,\n () => statusGeneration === menuGeneration && !controller.signal.aborted,\n (id) => {\n if (\n id === \"codexStatusResetCountdown\" &&\n stableCurrent &&\n statusGeneration === menuGeneration &&\n !controller.signal.aborted\n ) {\n publishStableCurrent(ctx, stableCurrent);\n }\n },\n );\n fastState = settingsRuntime.get();\n const revalidated = await queryStableCurrent(ctx, false, controller, \"Applying usage settings\u2026\");\n if (!revalidated) return { kind: \"stay\" };\n stableCurrent = revalidated;\n current = revalidated.outcome;\n visibleStates = [current.state];\n publishStableCurrent(ctx, revalidated);\n return { kind: \"stay\" };\n },\n \"toggle-fast\": async () => {\n const availability = fastRuntime.availability(ctx.model);\n if (availability.kind !== \"available\" || fastState.kind === \"invalid\") {\n return { kind: \"rejected\" };\n }\n const changed = await fastRuntime.toggle(ctx, !availability.enabled, controller.signal);\n if (!changed) return { kind: \"rejected\" };\n fastState = settingsRuntime.get();\n return { kind: \"stay\" };\n },\n \"open-resets\": async () => {\n const summaryCount =\n current.state.status === \"ready\" && current.state.providerId === \"openai-codex\"\n ? codexResetCount(current.state.report)\n : undefined;\n try {\n const loaded = await runMenuOperation(\n ctx,\n \"Checking usage limit resets\u2026\",\n controller.signal,\n async (signal) => {\n const expectedModel = modelIdentity(ctx.model);\n const auth = await awaitWithDeadline(\n resolveCodexResetAuth(ctx, undefined, credentialReader, credentialCandidates),\n signal,\n DEFAULT_TIMEOUT_MS,\n \"resolving current Codex reset authentication\",\n );\n let availability: CodexResetAvailability;\n try {\n availability = await listCodexResetCredits(auth, signal, DEFAULT_TIMEOUT_MS);\n } catch (error) {\n if (isAbortError(error) || summaryCount === undefined || summaryCount <= 0) {\n throw error;\n }\n availability = {\n availableCount: summaryCount,\n options: [genericCodexResetOption()],\n };\n }\n const revalidated = await awaitWithDeadline(\n resolveCodexResetAuth(ctx, undefined, credentialReader, credentialCandidates),\n signal,\n DEFAULT_TIMEOUT_MS,\n \"revalidating current Codex reset authentication\",\n );\n if (modelIdentity(ctx.model) !== expectedModel || revalidated.fingerprint !== auth.fingerprint) {\n throw new Error(\"The active Codex model or account changed while loading usage limit resets.\");\n }\n return { availability, auth, expectedModel };\n },\n );\n if (!loaded) return { kind: \"stay\" };\n resetAvailability = loaded.availability;\n resetAuthFingerprint = loaded.auth.fingerprint;\n resetModelIdentity = loaded.expectedModel;\n selectedReset = undefined;\n redemptionId = undefined;\n resetOutcome = undefined;\n resetFailure = undefined;\n return {\n kind: \"to\",\n screen: loaded.availability.availableCount > 0 ? \"reset-picker\" : \"reset-result\",\n };\n } catch (error) {\n if (isAbortError(error) || isStaleExtensionContextError(error)) {\n return { kind: \"stay\" };\n }\n ctx.ui.notify(`Couldn't load usage limit resets: ${errorMessage(error)}`, \"error\");\n return { kind: \"stay\" };\n }\n },\n \"select-reset\": ({ itemId }) => {\n const index = Number(itemId.replace(/^reset-/u, \"\"));\n const option = Number.isSafeInteger(index) ? resetAvailability?.options[index] : undefined;\n if (!option) return { kind: \"rejected\" };\n selectedReset = option;\n redemptionId = undefined;\n resetFailure = undefined;\n return { kind: \"to\", screen: \"reset-confirm\" };\n },\n \"cancel-reset\": () => ({ kind: \"back\" }),\n \"consume-reset\": async () => {\n if (!selectedReset || !resetAuthFingerprint || !resetModelIdentity) {\n return { kind: \"rejected\" };\n }\n try {\n redemptionId ??= createRedemptionId();\n const attemptId = redemptionId;\n const option = selectedReset;\n const expectedFingerprint = resetAuthFingerprint;\n const expectedModel = resetModelIdentity;\n const result = await runMenuOperation(\n ctx,\n \"Resetting your usage\u2026\",\n controller.signal,\n async (signal) => {\n const auth = await awaitWithDeadline(\n resolveCodexResetAuth(ctx, undefined, credentialReader, credentialCandidates),\n signal,\n DEFAULT_TIMEOUT_MS,\n \"revalidating current Codex reset authentication\",\n );\n if (modelIdentity(ctx.model) !== expectedModel || auth.fingerprint !== expectedFingerprint) {\n throw new Error(\"The active Codex model or account changed; the reset was not used.\");\n }\n const outcome = await consumeCodexResetCredit(auth, option, attemptId, signal, DEFAULT_TIMEOUT_MS);\n invalidateProviderState(\"openai-codex\");\n const model = ctx.model;\n if (modelIdentity(model) !== expectedModel) return { outcome };\n const refreshed = await queryCurrentState(ctx, model, true, signal);\n const stable = await outcomeStillCurrent(ctx, model, menuGeneration, refreshed, signal);\n return stable ? { outcome, refreshed, model } : { outcome };\n },\n false,\n );\n if (!result) return { kind: \"close\" };\n resetOutcome = result.outcome;\n resetFailure = undefined;\n if (result.refreshed && result.model) {\n stableCurrent = { outcome: result.refreshed, model: result.model };\n current = result.refreshed;\n visibleStates = [current.state];\n publishStableCurrent(ctx, stableCurrent);\n }\n return { kind: \"to\", screen: \"reset-result\" };\n } catch (error) {\n if (isAbortError(error) || isStaleExtensionContextError(error)) {\n return { kind: \"close\" };\n }\n resetFailure = `Couldn't reset usage: ${errorMessage(error)}. Try again with the same request.`;\n return { kind: \"to\", screen: \"reset-error\" };\n }\n },\n \"back-to-usage\": () => ({ kind: \"to\", screen: \"main\" }),\n \"back-to-resets\": () => {\n redemptionId = undefined;\n resetFailure = undefined;\n return { kind: \"to\", screen: \"reset-picker\" };\n },\n refresh: async () => {\n const refreshed = await queryStableCurrent(ctx, true, controller, \"Refreshing current usage\u2026\");\n if (!refreshed) return { kind: \"stay\" };\n stableCurrent = refreshed;\n publishStableCurrent(ctx, refreshed);\n current = refreshed.outcome;\n visibleStates = [current.state];\n return { kind: \"stay\" };\n },\n another: async () => {\n const others = configuredAdapters(ctx).filter((adapter) => adapter.id !== ctx.model?.provider);\n if (others.length === 0) {\n ctx.ui.notify(\"No other supported provider has configured runtime auth.\", \"info\");\n return { kind: \"stay\" };\n }\n return { kind: \"to\", screen: \"providers\" };\n },\n provider: async ({ itemId }) => {\n const adapter = configuredAdapters(ctx).find(\n (candidate) => candidate.id === itemId && candidate.id !== ctx.model?.provider,\n );\n if (!adapter) return { kind: \"back\" };\n let outcome = await runMenuOperation(\n ctx,\n `Checking ${providerDisplayName(ctx, adapter.id)} usage\u2026`,\n controller.signal,\n (signal) => queryAdapterState(ctx, adapter, \"configured\", false, signal),\n );\n if (!outcome) return { kind: \"back\" };\n if (outcome.state.status === \"selection-required\") {\n if (!(await promptForTarget(outcome.state, outcome.fingerprint))) {\n return { kind: \"back\" };\n }\n outcome = await runMenuOperation(\n ctx,\n `Checking ${providerDisplayName(ctx, adapter.id)} usage\u2026`,\n controller.signal,\n (signal) => queryAdapterState(ctx, adapter, \"configured\", true, signal),\n );\n if (!outcome) return { kind: \"back\" };\n }\n const revalidated = await queryStableCurrent(ctx, false, controller, \"Revalidating current usage\u2026\");\n if (!revalidated) return { kind: \"back\" };\n stableCurrent = revalidated;\n current = revalidated.outcome;\n visibleStates = [\n outcome.state.providerId === current.state.providerId\n ? current.state\n : { ...outcome.state, displayState: \"configured\" },\n ];\n return { kind: \"back\" };\n },\n all: async () => {\n const adapters = configuredAdapters(ctx);\n const currentProviderId = ctx.model?.provider;\n const settled = await runMenuOperation(\n ctx,\n \"Checking configured provider usage\u2026\",\n controller.signal,\n (signal) =>\n runWithConcurrency(\n adapters,\n ALL_PROVIDER_CONCURRENCY,\n (adapter, _index, workerSignal) =>\n queryAdapterState(\n ctx,\n adapter,\n adapter.id === currentProviderId ? \"current\" : \"configured\",\n true,\n workerSignal,\n ),\n signal,\n ),\n );\n if (!settled) return { kind: \"stay\" };\n const queriedStates: ProviderUsageState[] = settled.map((result, index) => {\n if (result.status === \"fulfilled\") {\n return { ...result.value.state, displayState: \"configured\" };\n }\n const adapter = adapters[index] as UsageProviderAdapter;\n return {\n providerId: adapter.id,\n providerName: providerDisplayName(ctx, adapter.id),\n displayState: \"configured\",\n status: \"query-failed\",\n message: errorMessage(result.reason),\n };\n });\n const revalidated = await queryStableCurrent(ctx, false, controller, \"Revalidating current usage\u2026\");\n if (!revalidated) return { kind: \"stay\" };\n stableCurrent = revalidated;\n current = revalidated.outcome;\n visibleStates = [\n current.state,\n ...queriedStates.filter((state) => state.providerId !== current.state.providerId),\n ];\n return { kind: \"stay\" };\n },\n },\n });\n await runMenu(ctx, menu, {\n getState: () => undefined,\n signal: controller.signal,\n isCurrent: () => statusGeneration === menuGeneration && !controller.signal.aborted,\n });\n } finally {\n controller.abort(new DOMException(\"Usage menu closed\", \"AbortError\"));\n activeControllers.delete(controller);\n }\n };\n\n pi.registerCommand(\"usage\", {\n description: \"Show usage for the current runtime account\",\n handler: async (args, ctx) => {\n if (args.trim()) {\n ctx.ui.notify(\"/usage does not accept arguments; choose an action from its menu.\", \"warning\");\n return;\n }\n try {\n await showMenu(ctx);\n } catch (error) {\n if (isStaleExtensionContextError(error) || isAbortError(error)) return;\n throw error;\n }\n },\n });\n pi.on(\"session_start\", async (_event, ctx) => {\n sessionGeneration += 1;\n statusGeneration += 1;\n clearStatusTimers();\n for (const controller of activeControllers) controller.abort();\n activeControllers.clear();\n statusController = undefined;\n sessionActive = true;\n const ownerGeneration = sessionGeneration;\n try {\n await fastRuntime.prepareSession(ctx);\n } catch (error) {\n if (isStaleExtensionContextError(error) || ownerGeneration !== sessionGeneration) return;\n throw error;\n }\n });\n pi.on(\"session_tree\", (_event, ctx) => {\n startStatusRefresh(ctx, ctx.model, false);\n });\n pi.on(\"model_select\", (event, ctx) => {\n startStatusRefresh(ctx, event.model, false);\n });\n pi.on(\"turn_start\", (_event, ctx) => {\n startStatusRefresh(ctx, ctx.model, false);\n });\n pi.on(\"session_shutdown\", (_event, ctx) => {\n sessionActive = false;\n sessionGeneration += 1;\n statusGeneration += 1;\n clearStatusTimers();\n for (const controller of activeControllers) controller.abort();\n activeControllers.clear();\n statusController = undefined;\n cache.clear();\n failureBackoff.clear();\n latestQueries.clear();\n activeCurrentIdentity = undefined;\n safeSetStatus(ctx, undefined);\n });\n\n fastRuntime = registerCodexFastMode(pi, settingsRuntime, (ctx) => startStatusRefresh(ctx, ctx.model, false), {\n registerSessionStart: false,\n });\n}\n", "import type { ExtensionAPI, ExtensionCommandContext, ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport {\n codexFastAvailability,\n codexFastIsEffective,\n codexFastStatusLabel,\n correctCodexFastMessageCost,\n rewriteCodexFastPayload,\n} from \"./codex-fast.js\";\nimport { errorMessage } from \"./core.js\";\nimport { isStaleExtensionContextError } from \"./query.js\";\nimport type { UsageSettingsRuntime, UsageSettingsState } from \"./settings.js\";\nimport type { PiModel } from \"./types.js\";\n\nconst NO_FAST_REQUEST = Symbol(\"no-fast-request\");\ntype PendingFastRequest = { fastRequested: boolean; model: PiModel };\n\nexport const FAST_USAGE_WARNING = \"Fast is about 1.5\u00D7 faster and uses more of your plan allowance.\";\n\nexport function registerCodexFastMode(\n pi: ExtensionAPI,\n settingsRuntime: UsageSettingsRuntime,\n refreshStatus: (ctx: ExtensionContext) => void,\n options: { registerSessionStart?: boolean } = {},\n) {\n let sessionController = new AbortController();\n let generation = 0;\n const pendingFastRequests = new Map<string, PendingFastRequest>();\n\n const toggle = async (\n ctx: ExtensionCommandContext,\n enabled: boolean,\n callerSignal?: AbortSignal,\n ): Promise<boolean> => {\n const ownerGeneration = generation;\n const sessionId = ctx.sessionManager.getSessionId();\n const signal = callerSignal ? AbortSignal.any([callerSignal, sessionController.signal]) : sessionController.signal;\n try {\n await settingsRuntime.update({ codexFastMode: enabled }, signal);\n } catch (error) {\n if (isAbortError(error) || isStaleExtensionContextError(error)) return false;\n ctx.ui.notify(`Could not save pi-usage.json: ${errorMessage(error)}`, \"error\");\n return false;\n }\n if (signal.aborted || ownerGeneration !== generation || ctx.sessionManager.getSessionId() !== sessionId) {\n return false;\n }\n refreshStatus(ctx);\n ctx.ui.notify(\n enabled\n ? `Codex Fast mode enabled. ${FAST_USAGE_WARNING}`\n : \"Codex Fast mode disabled; standard routing will be used.\",\n \"info\",\n );\n return true;\n };\n\n pi.registerCommand(\"fast\", {\n description: \"Toggle Codex Fast mode\",\n handler: async (args, ctx) => {\n if (args.trim()) {\n if (!ctx.hasUI) throw new Error(\"/fast does not accept arguments.\");\n ctx.ui.notify(\"/fast does not accept arguments.\", \"warning\");\n return;\n }\n if (!ctx.hasUI) throw new Error(\"/fast requires TUI or RPC mode.\");\n const availability = codexFastAvailability(ctx.model, settingsRuntime.get().settings.codexFastMode);\n if (availability.kind === \"not-codex\") {\n ctx.ui.notify(\"/fast is available only for the active OpenAI Codex model.\", \"warning\");\n return;\n }\n if (availability.kind === \"unavailable\") {\n ctx.ui.notify(availability.reason, \"warning\");\n return;\n }\n if (settingsRuntime.get().kind === \"invalid\") {\n ctx.ui.notify(\"pi-usage.json is invalid; repair it and run /reload before changing Fast mode.\", \"error\");\n return;\n }\n await toggle(ctx, !availability.enabled);\n },\n });\n\n const prepareSession = (ctx: ExtensionContext): Promise<void> => {\n const sessionId = ctx.sessionManager.getSessionId();\n generation += 1;\n sessionController.abort();\n pendingFastRequests.clear();\n sessionController = new AbortController();\n const ownerGeneration = generation;\n return (async () => {\n let state: Readonly<UsageSettingsState>;\n try {\n state = await settingsRuntime.reload(sessionController.signal);\n } catch (error) {\n if (sessionController.signal.aborted || ownerGeneration !== generation) return;\n if (ctx.hasUI) {\n ctx.ui.notify(`Could not load pi-usage.json; using defaults. ${errorMessage(error)}`, \"warning\");\n }\n return;\n }\n if (\n sessionController.signal.aborted ||\n ownerGeneration !== generation ||\n ctx.sessionManager.getSessionId() !== sessionId\n ) {\n return;\n }\n if (ctx.hasUI && state.kind === \"invalid\") {\n ctx.ui.notify(`Invalid pi-usage.json; using defaults without overwriting it. ${state.issue}`, \"warning\");\n }\n refreshStatus(ctx);\n })();\n };\n\n if (options.registerSessionStart !== false) {\n pi.on(\"session_start\", async (_event, ctx) => prepareSession(ctx));\n }\n\n pi.on(\"before_provider_request\", (event, ctx) => {\n const rewritten = rewriteCodexFastPayload(event.payload, ctx.model, settingsRuntime.get().settings.codexFastMode);\n const key = activeRequestKey(ctx);\n if (key && ctx.model) {\n pendingFastRequests.set(key, {\n fastRequested: isRecord(rewritten) && rewritten.service_tier === \"priority\",\n model: ctx.model,\n });\n }\n return rewritten;\n });\n pi.on(\"message_end\", (event, ctx) => {\n const request = consumeFastRequest(ctx, event.message, pendingFastRequests);\n if (request === NO_FAST_REQUEST) return undefined;\n const message = correctCodexFastMessageCost(event.message, request.model, request.fastRequested);\n return message ? { message: message as never } : undefined;\n });\n pi.on(\"session_shutdown\", async () => {\n generation += 1;\n sessionController.abort();\n pendingFastRequests.clear();\n await settingsRuntime.flush();\n });\n\n return {\n prepareSession,\n availability(model: PiModel | undefined) {\n return codexFastAvailability(model, settingsRuntime.get().settings.codexFastMode);\n },\n decorateStatus(model: PiModel | undefined, status: string) {\n return codexFastStatusLabel(status, codexFastIsEffective(model, settingsRuntime.get().settings.codexFastMode));\n },\n toggle,\n };\n}\n\nfunction activeRequestKey(ctx: ExtensionContext): string | undefined {\n const model = ctx.model;\n return model ? `${ctx.sessionManager.getSessionId()}:${model.provider}/${model.id}` : undefined;\n}\n\nfunction consumeFastRequest(\n ctx: ExtensionContext,\n message: unknown,\n pending: Map<string, PendingFastRequest>,\n): PendingFastRequest | typeof NO_FAST_REQUEST {\n if (!isRecord(message) || message.role !== \"assistant\") return NO_FAST_REQUEST;\n const key = messageRequestKey(ctx, message);\n if (!key) return NO_FAST_REQUEST;\n const request = pending.get(key);\n pending.delete(key);\n return request ?? NO_FAST_REQUEST;\n}\n\nfunction messageRequestKey(ctx: ExtensionContext, message: Record<string, unknown>): string | undefined {\n if (typeof message.provider !== \"string\" || typeof message.model !== \"string\") return undefined;\n return `${ctx.sessionManager.getSessionId()}:${message.provider}/${message.model}`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === \"AbortError\";\n}\n", "import type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { sanitizeDisplayText } from \"./core.js\";\nimport { providerIsConfigured, usageAdapters } from \"./query.js\";\nimport type { PiModel, UsageProviderAdapter } from \"./types.js\";\n\nexport function configuredAdapters(ctx: ExtensionContext): UsageProviderAdapter[] {\n return usageAdapters().filter(\n (adapter) => adapter.id === ctx.model?.provider || providerIsConfigured(ctx, adapter.id),\n );\n}\n\nexport function providerDisplayName(ctx: ExtensionContext, providerId: string): string {\n try {\n return sanitizeDisplayText(ctx.modelRegistry.getProviderDisplayName(providerId), 80);\n } catch {\n return sanitizeDisplayText(providerId, 80);\n }\n}\n\nexport function setBoundedMap<T>(map: Map<string, T>, key: string, value: T, limit: number): void {\n map.delete(key);\n while (map.size >= limit) {\n const oldest = map.keys().next().value;\n if (oldest === undefined) break;\n map.delete(oldest);\n }\n map.set(key, value);\n}\n\nexport function modelIdentity(model: PiModel | undefined): string | undefined {\n return model ? `${model.provider}/${model.id}` : undefined;\n}\n\nexport function isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === \"AbortError\";\n}\n\nexport function isTimeoutError(error: unknown): boolean {\n return error instanceof Error && error.name === \"TimeoutError\";\n}\n", "import { stripVTControlCharacters } from \"node:util\";\nimport { type ExtensionCommandContext, getSettingsListTheme } from \"@earendil-works/pi-coding-agent\";\nimport { Key, matchesKey, type SettingItem, SettingsList, Text } from \"@earendil-works/pi-tui\";\nimport { errorMessage } from \"./core.js\";\nimport type { UsageSettingsRuntime } from \"./settings.js\";\n\nconst OFF = \"Off\";\nconst ON = \"On\";\n\ntype UsageSettingId = \"codexFastMode\" | \"codexStatusResetCountdown\";\n\nexport async function showUsageSettings(\n ctx: ExtensionCommandContext,\n settingsRuntime: UsageSettingsRuntime,\n parentSignal: AbortSignal,\n isCurrent: () => boolean,\n onApplied: (id: UsageSettingId) => void,\n): Promise<boolean> {\n if (ctx.mode !== \"tui\") {\n if (ctx.hasUI) ctx.ui.notify(`Edit settings manually: ${settingsRuntime.get().path}`, \"info\");\n return false;\n }\n const { HorizontalRule, renderBoundedFrame } = await import(\"@narumitw/pi-tui-kit\");\n if (parentSignal.aborted || !isCurrent()) return false;\n return (\n (await ctx.ui.custom<boolean>((tui, theme, _keybindings, done) => {\n const localController = new AbortController();\n const signal = AbortSignal.any([parentSignal, localController.signal]);\n let changed = false;\n let closing = false;\n let saveQueue = Promise.resolve();\n const state = settingsRuntime.get();\n const items: SettingItem[] = [\n {\n id: \"codexFastMode\",\n label: \"Codex Fast mode\",\n description: \"Use faster Codex routing at increased plan allowance consumption.\",\n currentValue: state.settings.codexFastMode ? ON : OFF,\n values: [OFF, ON],\n },\n {\n id: \"codexStatusResetCountdown\",\n label: \"Codex reset countdown\",\n description: \"Show time remaining until each Codex usage limit resets.\",\n currentValue: state.settings.codexStatusResetCountdown ? ON : OFF,\n values: [OFF, ON],\n },\n ];\n const rule = new HorizontalRule({ ruleStyle: (text) => theme.fg(\"border\", text) });\n\n let settingsList: SettingsList;\n const cancel = () => {\n if (closing) return;\n closing = true;\n localController.abort();\n done(changed);\n };\n const queueUpdate = (id: UsageSettingId, requested: boolean, display: string) => {\n saveQueue = saveQueue.then(async () => {\n const previous = settingsRuntime.get().settings[id];\n if (settingsRuntime.get().kind === \"invalid\") {\n settingsList.updateValue(id, previous ? ON : OFF);\n if (!signal.aborted && isCurrent()) {\n ctx.ui.notify(\"Repair pi-usage.json and reload before changing settings.\", \"error\");\n tui.requestRender();\n }\n return;\n }\n try {\n await settingsRuntime.update({ [id]: requested }, signal);\n } catch (error) {\n if (signal.aborted || !isCurrent()) return;\n settingsList.updateValue(id, previous ? ON : OFF);\n ctx.ui.notify(`Could not save pi-usage.json: ${errorMessage(error)}`, \"error\");\n tui.requestRender();\n return;\n }\n if (previous !== requested) {\n changed = true;\n onApplied(id);\n }\n if (signal.aborted || !isCurrent()) return;\n settingsList.updateValue(id, display);\n tui.requestRender();\n });\n };\n settingsList = new SettingsList(\n items,\n items.length + 2,\n getSettingsListTheme(),\n (id, value) => {\n if (closing || signal.aborted || !isCurrent()) return;\n queueUpdate(id as UsageSettingId, value !== OFF, value);\n },\n cancel,\n );\n\n parentSignal.addEventListener(\"abort\", cancel, { once: true });\n return {\n render(width: number) {\n // Compatibility: Kit puts the title directly below the top rule and keeps compact\n // rules when at least five rows fit; both replace the legacy wrapper layout.\n const title = new Text(theme.fg(\"accent\", theme.bold(\"pi-usage Settings\")), 1, 0).render(width);\n const content = settingsList.render(width);\n const focusedRow = content.findIndex((line) => /^[\u2192\u203A]\\s/u.test(stripVTControlCharacters(line)));\n const terminalRows = Number.isFinite(tui.terminal?.rows) ? Math.floor(tui.terminal.rows) : 24;\n const [ruleLine = \"\"] = rule.render(width);\n return renderBoundedFrame({\n width,\n maxRows: Math.max(1, terminalRows - 3),\n rule: ruleLine,\n title,\n content,\n priorityRows: focusedRow < 0 ? [] : [focusedRow],\n focusedRow,\n });\n },\n invalidate: () => settingsList.invalidate(),\n handleInput(data: string) {\n if (closing) return;\n if (matchesKey(data, Key.ctrl(\"c\"))) cancel();\n else settingsList.handleInput(data);\n tui.requestRender();\n },\n dispose() {\n localController.abort();\n parentSignal.removeEventListener(\"abort\", cancel);\n },\n };\n })) ?? false\n );\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["readStoredCredential", "report", "readStoredCredential", "amount", "asObject", "asObject", "decimalAmount", "asObject", "fetchProviderJson", "amount", "asObject", "asString", "asObject", "asNonnegativeInteger", "currency", "DECIMAL_AMOUNT", "asObject", "PROVIDERS", "asObject", "asObject", "asString", "asNonnegativeNumber", "clampPercent", "asObject", "asNonnegativeNumber", "asString", "amount", "DECIMAL_AMOUNT", "decimalAmount", "isRecord", "optionalPercent", "start", "end", "asObject", "FIVE_HOUR_WINDOW_MINUTES", "WEEKLY_WINDOW_MINUTES", "asObject", "asString", "asNonnegativeNumber", "clampPercent", "asEpochSeconds", "safeLabel", "remainingTimeout", "readStoredCredential", "authorization", "headers", "asObject", "storedAccess", "refresh", "report", "metric", "readStoredCredential", "bearerToken", "headerValue", "nonnegativeInteger", "asObject", "report", "metric", "clampPercent", "isRecord", "randomUUID", "isAbortError", "isRecord", "isAbortError", "randomUUID", "isAbortError", "report"]
7
7
  }