@narumitw/pi-usage 0.54.0 → 0.58.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +137 -64
- package/dist/index.ts +783 -173
- package/dist/index.ts.map +4 -4
- package/package.json +10 -10
- package/src/codex-fast-runtime.ts +34 -26
- package/src/format.ts +126 -7
- package/src/index.ts +9 -0
- package/src/providers/deepseek.ts +85 -0
- package/src/providers/fireworks.ts +198 -0
- package/src/query.ts +199 -13
- package/src/settings.ts +26 -6
- package/src/types.ts +19 -0
- package/src/usage-helpers.ts +2 -2
- package/src/usage-settings-ui.ts +130 -39
- package/src/usage.ts +156 -94
package/dist/index.ts.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/codex-fast.ts", "../src/codex-resets.ts", "../src/core.ts", "../src/oauth-credential-source.ts", "../src/query.ts", "../src/providers/codex.ts", "../src/providers/github-copilot.ts", "../src/providers/kimi-coding.ts", "../src/providers/opencode-zen.ts", "../src/providers/openrouter.ts", "../src/providers/xai.ts", "../src/providers/zai.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\t\"gpt-5.4\",\n\t\"gpt-5.5\",\n\t\"gpt-5.6-luna\",\n\t\"gpt-5.6-sol\",\n\t\"gpt-5.6-terra\",\n]);\n\nexport type CodexFastAvailability =\n\t| { kind: \"available\"; enabled: boolean }\n\t| { kind: \"not-codex\" }\n\t| { kind: \"unavailable\"; reason: string };\n\nexport function codexFastAvailability(\n\tmodel: PiModel | undefined,\n\tenabled: boolean,\n): CodexFastAvailability {\n\tif (model?.provider !== \"openai-codex\") return { kind: \"not-codex\" };\n\tif (!isOfficialCodexModel(model)) {\n\t\treturn {\n\t\t\tkind: \"unavailable\",\n\t\t\treason: \"Fast mode requires the official OpenAI Codex Responses endpoint.\",\n\t\t};\n\t}\n\tif (!CODEX_FAST_MODEL_IDS.has(model.id)) {\n\t\treturn {\n\t\t\tkind: \"unavailable\",\n\t\t\treason: `${model.id} does not advertise Codex Fast support.`,\n\t\t};\n\t}\n\treturn { kind: \"available\", enabled };\n}\n\nexport function codexFastIsEffective(model: PiModel | undefined, enabled: boolean): boolean {\n\treturn codexFastAvailability(model, enabled).kind === \"available\" && enabled;\n}\n\nexport function codexFastRequestTier(\n\tmodel: PiModel | undefined,\n\tenabled: boolean,\n): typeof CODEX_FAST_SERVICE_TIER | typeof CODEX_STANDARD_SERVICE_TIER | undefined {\n\tif (!isOfficialCodexModel(model)) return undefined;\n\treturn enabled && CODEX_FAST_MODEL_IDS.has(model.id)\n\t\t? CODEX_FAST_SERVICE_TIER\n\t\t: CODEX_STANDARD_SERVICE_TIER;\n}\n\nexport function rewriteCodexFastPayload(\n\tpayload: unknown,\n\tmodel: PiModel | undefined,\n\tenabled: boolean,\n): unknown | undefined {\n\tconst serviceTier = codexFastRequestTier(model, enabled);\n\tif (!serviceTier || !isRecord(payload)) return undefined;\n\treturn { ...payload, service_tier: serviceTier };\n}\n\nexport function correctCodexFastMessageCost(\n\tmessage: unknown,\n\tmodel: PiModel | undefined,\n\tfastRequested: boolean,\n): unknown | undefined {\n\tif (\n\t\t!codexFastIsEffective(model, fastRequested) ||\n\t\t!isRecord(message) ||\n\t\tmessage.role !== \"assistant\" ||\n\t\tmessage.provider !== model?.provider ||\n\t\tmessage.model !== model?.id\n\t) {\n\t\treturn undefined;\n\t}\n\tconst usage = isRecord(message.usage) ? message.usage : undefined;\n\tconst cost = usage && isRecord(usage.cost) ? usage.cost : undefined;\n\tif (!usage || !cost || !hasCompleteUsage(usage) || !isOfficialCodexModel(model)) return undefined;\n\tconst correctedUsage = structuredClone(usage) as typeof usage;\n\tcalculateCost(model, correctedUsage as never);\n\tconst multiplier = model.id === \"gpt-5.5\" ? 2.5 : 2;\n\tconst correctedCost = correctedUsage.cost as Record<string, number>;\n\tfor (const key of [\"input\", \"output\", \"cacheRead\", \"cacheWrite\", \"total\"] as const) {\n\t\tcorrectedCost[key] *= multiplier;\n\t}\n\tif (costsEqual(cost, correctedCost)) return undefined;\n\treturn { ...message, usage: correctedUsage };\n}\n\nexport function codexFastStatusLabel(status: string, enabled: boolean): string {\n\tif (!enabled || !/^codex(?:\\s|$)/u.test(status)) return status;\n\treturn status === \"codex\" ? \"codex fast\" : `codex fast${status.slice(\"codex\".length)}`;\n}\n\nfunction isOfficialCodexModel(\n\tmodel: PiModel | undefined,\n): model is PiModel & { api: \"openai-codex-responses\" } {\n\tif (model?.provider !== \"openai-codex\" || !hasApi(model, \"openai-codex-responses\")) {\n\t\treturn false;\n\t}\n\ttry {\n\t\treturn new URL(model.baseUrl).origin === \"https://chatgpt.com\";\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasCompleteUsage(value: Record<string, unknown>): boolean {\n\treturn [\"input\", \"output\", \"cacheRead\", \"cacheWrite\"].every(\n\t\t(key) => typeof value[key] === \"number\" && Number.isFinite(value[key]),\n\t);\n}\n\nfunction costsEqual(left: Record<string, unknown>, right: Record<string, number>): boolean {\n\treturn [\"input\", \"output\", \"cacheRead\", \"cacheWrite\", \"total\"].every(\n\t\t(key) => left[key] === right[key],\n\t);\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 {\n\tfallbackOAuthCredentialCandidates,\n\ttype OAuthCredentialCandidateReader,\n} from \"./oauth-credential-source.js\";\nimport {\n\tAUTH_FINGERPRINT_SALT,\n\tadapterForProvider,\n\tfetchProviderJson,\n\tresolveUsageAuth,\n} 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\tcreditId?: string;\n\ttitle: string;\n\tdescription: string;\n\texpiresAt?: number;\n}\n\nexport interface CodexResetAvailability {\n\tavailableCount: number;\n\toptions: CodexResetOption[];\n}\n\nexport interface CodexResetOutcome {\n\tcode: CodexResetOutcomeCode;\n\twindowsReset: number;\n}\n\nexport function codexResetCount(report: UsageReport): number | undefined {\n\tconst value = report.metrics.find((metric) => metric.id === \"reset-credits\")?.value;\n\treturn typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0 ? value : undefined;\n}\n\nexport function codexResetActionDescription(report: UsageReport): string {\n\tconst count = codexResetCount(report);\n\tif (count === undefined) return \"Check reset availability.\";\n\tif (count === 0) return \"No usage limit resets available.\";\n\treturn `You have ${count} ${resetLabel(count)} available.`;\n}\n\nexport function genericCodexResetOption(): CodexResetOption {\n\treturn {\n\t\ttitle: \"Full reset\",\n\t\tdescription: \"Reset your current usage limits.\",\n\t};\n}\n\nexport function resetOptionExpiration(option: CodexResetOption): string {\n\tif (option.expiresAt === undefined) return \"Does not expire.\";\n\tconst expiration = new Date(option.expiresAt * 1_000);\n\tif (Number.isNaN(expiration.getTime())) return \"Expiration unavailable.\";\n\treturn `Expires ${expiration.toLocaleString()}.`;\n}\n\nexport function resetConfirmationLines(option: CodexResetOption | undefined): string[] {\n\tif (!option) return [\"The selected reset is unavailable.\"];\n\treturn [\n\t\toption.title,\n\t\tresetOptionExpiration(option),\n\t\toption.description,\n\t\t\"This consumes one earned reset for the current OpenAI Codex account.\",\n\t];\n}\n\nexport function formatCodexResetOutcome(\n\toutcome: CodexResetOutcome | undefined,\n\tremainingCount: number | undefined,\n): string {\n\tconst remaining =\n\t\tremainingCount === undefined\n\t\t\t? \"\"\n\t\t\t: ` You have ${remainingCount} ${resetLabel(remainingCount)} left.`;\n\tif (!outcome) return \"You don't have any usage limit resets available.\";\n\tif (outcome.code === \"reset\") return `Usage reset.${remaining}`.trim();\n\tif (outcome.code === \"already_redeemed\") {\n\t\treturn `Usage reset was already completed.${remaining}`.trim();\n\t}\n\tif (outcome.code === \"nothing_to_reset\") {\n\t\treturn \"Your usage does not need a reset right now.\";\n\t}\n\treturn \"No usage limit resets are available.\";\n}\n\nexport function resetLabel(count: number): string {\n\treturn count === 1 ? \"usage limit reset\" : \"usage limit resets\";\n}\n\nexport async function resolveCodexResetAuth(\n\tctx: ExtensionContext,\n\tsalt: Uint8Array = AUTH_FINGERPRINT_SALT,\n\tcredentialReader: StoredCredentialReader = readStoredCredential,\n\tcandidateReader?: OAuthCredentialCandidateReader,\n): Promise<ResolvedUsageAuth> {\n\tconst model = ctx.model;\n\tif (model?.provider !== \"openai-codex\") {\n\t\tthrow new Error(\"Usage limit resets require the current model to use OpenAI Codex.\");\n\t}\n\tconst expectedModel = `${model.provider}/${model.id}`;\n\tconst adapter = adapterForProvider(\"openai-codex\");\n\tif (!adapter) throw new Error(\"OpenAI Codex usage support is unavailable.\");\n\tconst auth = await resolveUsageAuth(ctx, adapter, salt, credentialReader);\n\tif (`${ctx.model?.provider}/${ctx.model?.id}` !== expectedModel) {\n\t\tthrow new Error(\"The current model changed while resolving Codex reset authentication.\");\n\t}\n\tif (!auth) throw new Error(\"No runtime credential is configured for OpenAI Codex.\");\n\n\tconst resolvedAccess = bearerToken(headerValue(auth.headers, \"Authorization\")) ?? auth.apiKey;\n\tif (!resolvedAccess) throw new Error(\"OpenAI Codex OAuth credentials were incomplete.\");\n\tconst resolvedAccountId = codexAccountIdFromAccessToken(resolvedAccess);\n\tif (!resolvedAccountId) {\n\t\tthrow new Error(\"The active OpenAI Codex access token did not contain a valid account ID.\");\n\t}\n\tconst offered = candidateReader\n\t\t? candidateReader(ctx, \"openai-codex\")\n\t\t: fallbackOAuthCredentialCandidates(\"openai-codex\", credentialReader);\n\tif (!offered.ok) throw new Error(\"OpenAI Codex OAuth credential discovery failed closed.\");\n\tconst { accountId, storedAccess } = selectCodexResetCredential(\n\t\toffered.candidates,\n\t\tresolvedAccess,\n\t\tresolvedAccountId,\n\t\toffered.offeredCount === 0,\n\t);\n\tconst authorization = `Bearer ${resolvedAccess}`;\n\tconst headers = {\n\t\tAuthorization: authorization,\n\t\t\"chatgpt-account-id\": accountId,\n\t};\n\treturn {\n\t\tapiKey: resolvedAccess,\n\t\theaders,\n\t\tfingerprint: fingerprintResolvedAuth({ headers }, salt),\n\t\tsecrets: [\n\t\t\t...new Set([...auth.secrets, storedAccess, resolvedAccess, authorization, accountId]),\n\t\t],\n\t\tmodel: auth.model,\n\t};\n}\n\nexport async function listCodexResetCredits(\n\tauth: ResolvedUsageAuth,\n\tsignal: AbortSignal,\n\ttimeoutMs: number,\n): Promise<CodexResetAvailability> {\n\tconst payload = await fetchProviderJson(\n\t\tCODEX_RESET_CREDITS_URL,\n\t\tauth,\n\t\tsignal,\n\t\ttimeoutMs,\n\t\t\"Codex usage-limit reset endpoint\",\n\t);\n\treturn normalizeCodexResetCreditsPayload(payload);\n}\n\nexport async function consumeCodexResetCredit(\n\tauth: ResolvedUsageAuth,\n\toption: CodexResetOption,\n\tredeemRequestId: string,\n\tsignal: AbortSignal,\n\ttimeoutMs: number,\n): Promise<CodexResetOutcome> {\n\tif (!redeemRequestId) throw new Error(\"Codex reset redemption request ID must not be empty.\");\n\tconst payload = await fetchProviderJson(\n\t\tCODEX_RESET_CONSUME_URL,\n\t\tauth,\n\t\tsignal,\n\t\ttimeoutMs,\n\t\t\"Codex usage-limit reset consume endpoint\",\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\tbody: {\n\t\t\t\tredeem_request_id: redeemRequestId,\n\t\t\t\t...(option.creditId ? { credit_id: option.creditId } : {}),\n\t\t\t},\n\t\t},\n\t);\n\tconst code = payload.code;\n\tif (!isCodexResetOutcomeCode(code)) {\n\t\tthrow new Error(\"Codex reset consume endpoint returned an unknown outcome code.\");\n\t}\n\tconst windowsReset =\n\t\tpayload.windows_reset === undefined ? 0 : nonnegativeInteger(payload.windows_reset);\n\tif (windowsReset === undefined) {\n\t\tthrow new Error(\"Codex reset consume endpoint returned an invalid windows_reset value.\");\n\t}\n\treturn { code, windowsReset };\n}\n\nexport function normalizeCodexResetCreditsPayload(\n\tpayload: Record<string, unknown>,\n): CodexResetAvailability {\n\tconst availableCount = nonnegativeInteger(payload.available_count);\n\tif (availableCount === undefined) {\n\t\tthrow new Error(\"Codex reset credits response returned an invalid available_count.\");\n\t}\n\tconst rawCredits = payload.credits;\n\tif (rawCredits !== undefined && !Array.isArray(rawCredits)) {\n\t\tthrow new Error(\"Codex reset credits response returned invalid credits.\");\n\t}\n\n\tconst options = (rawCredits ?? [])\n\t\t.map(asObject)\n\t\t.filter((credit): credit is Record<string, unknown> => Boolean(credit))\n\t\t.filter((credit) => credit.status === \"available\" && credit.reset_type === \"codex_rate_limits\")\n\t\t.map(normalizeResetOption)\n\t\t.sort(\n\t\t\t(left, right) =>\n\t\t\t\t(left.expiresAt ?? Number.MAX_SAFE_INTEGER) - (right.expiresAt ?? Number.MAX_SAFE_INTEGER),\n\t\t)\n\t\t.slice(0, Math.min(availableCount, MAX_RESET_OPTIONS));\n\n\tif (availableCount > 0 && options.length === 0) {\n\t\toptions.push(genericCodexResetOption());\n\t}\n\treturn { availableCount, options };\n}\n\nfunction selectCodexResetCredential(\n\tcandidates: readonly unknown[],\n\tresolvedAccess: string,\n\tresolvedAccountId: string,\n\tstandaloneFallback: boolean,\n): { accountId: string; storedAccess: string } {\n\tlet sawOAuth = false;\n\tlet sawMatchingAccess = false;\n\tlet sawInvalidAccountId = false;\n\tconst matches = new Map<string, { accountId: string; storedAccess: string }>();\n\tfor (const candidate of candidates) {\n\t\ttry {\n\t\t\tconst credential = asObject(candidate);\n\t\t\tif (credential?.type !== \"oauth\") continue;\n\t\t\tsawOAuth = true;\n\t\t\tconst storedAccess = asNonemptyString(credential.access);\n\t\t\tif (storedAccess !== resolvedAccess) continue;\n\t\t\tsawMatchingAccess = true;\n\t\t\tconst accountId = validHeaderValue(credential.accountId);\n\t\t\tconst refresh = asNonemptyString(credential.refresh);\n\t\t\tif (!accountId || accountId !== resolvedAccountId || !refresh) {\n\t\t\t\tsawInvalidAccountId = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tmatches.set(refresh, { accountId, storedAccess });\n\t\t} catch {\n\t\t\t// Malformed candidates never authorize a reset request.\n\t\t}\n\t}\n\tif (sawInvalidAccountId) {\n\t\tthrow new Error(\"The OpenAI Codex OAuth credential did not include a valid account ID.\");\n\t}\n\tif (matches.size > 1) {\n\t\tthrow new Error(\"Conflicting OAuth credentials match the active OpenAI Codex runtime account.\");\n\t}\n\tconst match = matches.values().next().value;\n\tif (match) return match;\n\tif (!sawOAuth) {\n\t\tthrow new Error(\n\t\t\tstandaloneFallback\n\t\t\t\t? \"Usage limit resets require the OpenAI Codex OAuth account configured through Pi /login.\"\n\t\t\t\t: \"Usage limit resets require an OpenAI Codex OAuth account configured through Pi /login or a compatible credential source.\",\n\t\t);\n\t}\n\tif (sawMatchingAccess) throw new Error(\"OpenAI Codex OAuth credentials were incomplete.\");\n\tthrow new Error(\n\t\tstandaloneFallback\n\t\t\t? \"The active OpenAI Codex runtime account does not match Pi's stored OAuth account.\"\n\t\t\t: \"The active OpenAI Codex runtime account does not match any available OAuth account.\",\n\t);\n}\n\nfunction codexAccountIdFromAccessToken(access: string): string | undefined {\n\ttry {\n\t\tconst parts = access.split(\".\");\n\t\tif (parts.length !== 3 || !parts[1]) return undefined;\n\t\tconst payload = JSON.parse(Buffer.from(parts[1], \"base64url\").toString(\"utf8\")) as unknown;\n\t\tconst claims = asObject(asObject(payload)?.[\"https://api.openai.com/auth\"]);\n\t\treturn validHeaderValue(claims?.chatgpt_account_id);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction normalizeResetOption(credit: Record<string, unknown>): CodexResetOption {\n\tconst creditId = asOpaqueId(credit.id);\n\tif (!creditId) throw new Error(\"Codex reset credits response returned an invalid credit ID.\");\n\tlet expiresAt: number | undefined;\n\tif (credit.expires_at !== undefined && credit.expires_at !== null) {\n\t\tif (typeof credit.expires_at !== \"string\") {\n\t\t\tthrow new Error(\"Codex reset credits response returned an invalid expiration time.\");\n\t\t}\n\t\tconst parsed = Date.parse(credit.expires_at);\n\t\tif (!Number.isFinite(parsed)) {\n\t\t\tthrow new Error(\"Codex reset credits response returned an invalid expiration time.\");\n\t\t}\n\t\texpiresAt = Math.floor(parsed / 1_000);\n\t}\n\tconst title = displayString(credit.title) ?? \"Full reset\";\n\tconst description = displayString(credit.description) ?? \"Reset your current usage limits.\";\n\treturn {\n\t\tcreditId,\n\t\ttitle,\n\t\tdescription,\n\t\t...(expiresAt === undefined ? {} : { expiresAt }),\n\t};\n}\n\nfunction isCodexResetOutcomeCode(value: unknown): value is CodexResetOutcomeCode {\n\treturn (\n\t\tvalue === \"reset\" ||\n\t\tvalue === \"nothing_to_reset\" ||\n\t\tvalue === \"no_credit\" ||\n\t\tvalue === \"already_redeemed\"\n\t);\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\treturn value as Record<string, unknown>;\n}\n\nfunction asNonemptyString(value: unknown): string | undefined {\n\treturn typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction asOpaqueId(value: unknown): string | undefined {\n\tif (typeof value !== \"string\" || value.length === 0 || value.length > MAX_CREDIT_ID_CHARS) {\n\t\treturn undefined;\n\t}\n\treturn value;\n}\n\nfunction displayString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\treturn sanitizeDisplayText(value, 160) || undefined;\n}\n\nfunction validHeaderValue(value: unknown): string | undefined {\n\tif (typeof value !== \"string\" || !value || value.length > 512) return undefined;\n\tif (/[^\\x20-\\x7e]/u.test(value)) return undefined;\n\treturn value;\n}\n\nfunction nonnegativeInteger(value: unknown): number | undefined {\n\tconst parsed =\n\t\ttypeof value === \"number\"\n\t\t\t? value\n\t\t\t: typeof value === \"string\" && value.trim()\n\t\t\t\t? Number(value)\n\t\t\t\t: Number.NaN;\n\tif (!Number.isSafeInteger(parsed) || parsed < 0) return undefined;\n\treturn parsed;\n}\n\nfunction bearerToken(authorization: string | undefined): string | undefined {\n\treturn /^Bearer\\s+(.+)$/iu.exec(authorization ?? \"\")?.[1];\n}\n\nfunction headerValue(headers: Record<string, string>, name: string): string | undefined {\n\treturn Object.entries(headers).find(\n\t\t([candidate]) => candidate.toLowerCase() === name.toLowerCase(),\n\t)?.[1];\n}\n", "import { createHmac } from \"node:crypto\";\nimport type { UsageReport } from \"./types.js\";\n\nexport class UsageCache {\n\tprivate readonly entries = new Map<string, { createdAt: number; report: UsageReport }>();\n\tprivate readonly ttlMs: number;\n\tprivate readonly maxEntries: number;\n\n\tconstructor(ttlMs: number, maxEntries = 32) {\n\t\tif (!Number.isFinite(ttlMs) || ttlMs <= 0) throw new Error(\"Cache TTL must be positive.\");\n\t\tif (!Number.isSafeInteger(maxEntries) || maxEntries < 1) {\n\t\t\tthrow new Error(\"Cache entry limit must be a positive integer.\");\n\t\t}\n\t\tthis.ttlMs = ttlMs;\n\t\tthis.maxEntries = maxEntries;\n\t}\n\n\tget size(): number {\n\t\treturn this.entries.size;\n\t}\n\n\tget(providerId: string, fingerprint: string, now = Date.now()): UsageReport | undefined {\n\t\tthis.sweepExpired(now);\n\t\treturn this.entries.get(cacheKey(providerId, fingerprint))?.report;\n\t}\n\n\tset(providerId: string, fingerprint: string, report: UsageReport, now = Date.now()): void {\n\t\tthis.sweepExpired(now);\n\t\tconst key = cacheKey(providerId, fingerprint);\n\t\tthis.entries.delete(key);\n\t\twhile (this.entries.size >= this.maxEntries) {\n\t\t\tconst oldest = this.entries.keys().next().value;\n\t\t\tif (oldest === undefined) break;\n\t\t\tthis.entries.delete(oldest);\n\t\t}\n\t\tthis.entries.set(key, { createdAt: now, report });\n\t}\n\n\tclearProvider(providerId: string): void {\n\t\tfor (const key of this.entries.keys()) {\n\t\t\tif (key.startsWith(`${providerId}:`)) this.entries.delete(key);\n\t\t}\n\t}\n\n\tclear(): void {\n\t\tthis.entries.clear();\n\t}\n\n\tprivate sweepExpired(now: number): void {\n\t\tfor (const [key, entry] of this.entries) {\n\t\t\tif (now - entry.createdAt >= this.ttlMs) this.entries.delete(key);\n\t\t}\n\t}\n}\n\nexport function fingerprintResolvedAuth(\n\tauth: { apiKey?: string; headers?: Record<string, string> },\n\tsalt: Uint8Array,\n): string {\n\tconst headers = Object.entries(auth.headers ?? {})\n\t\t.map(([name, value]) => [name.toLowerCase(), value] as const)\n\t\t.sort(([left], [right]) => left.localeCompare(right));\n\tconst canonical = JSON.stringify({ apiKey: auth.apiKey ?? \"\", headers });\n\treturn createHmac(\"sha256\", salt).update(canonical).digest(\"hex\");\n}\n\nexport async function runWithConcurrency<T, R>(\n\titems: readonly T[],\n\tlimit: number,\n\tworker: (item: T, index: number, signal: AbortSignal) => Promise<R>,\n\tsignal: AbortSignal,\n): Promise<PromiseSettledResult<R>[]> {\n\tif (signal.aborted) throw abortError();\n\tif (!Number.isSafeInteger(limit) || limit < 1)\n\t\tthrow new Error(\"Concurrency limit must be positive.\");\n\n\tconst results = new Array<PromiseSettledResult<R>>(items.length);\n\tlet nextIndex = 0;\n\tconst runners = Array.from({ length: Math.min(limit, items.length) }, async () => {\n\t\twhile (nextIndex < items.length) {\n\t\t\tif (signal.aborted) throw abortError();\n\t\t\tconst index = nextIndex;\n\t\t\tnextIndex += 1;\n\t\t\ttry {\n\t\t\t\tresults[index] = {\n\t\t\t\t\tstatus: \"fulfilled\",\n\t\t\t\t\tvalue: await worker(items[index] as T, index, signal),\n\t\t\t\t};\n\t\t\t} catch (reason) {\n\t\t\t\tresults[index] = { status: \"rejected\", reason };\n\t\t\t}\n\t\t}\n\t});\n\n\tawait Promise.all(runners);\n\tif (signal.aborted) throw abortError();\n\treturn results;\n}\n\nexport async function awaitWithDeadline<T>(\n\toperation: Promise<T>,\n\tsignal: AbortSignal,\n\ttimeoutMs: number,\n\tdescription: string,\n): Promise<T> {\n\tif (signal.aborted) throw abortError();\n\tconst controller = new AbortController();\n\tconst abortFromCaller = () => controller.abort();\n\tsignal.addEventListener(\"abort\", abortFromCaller, { once: true });\n\tconst timeout = setTimeout(() => controller.abort(), timeoutMs);\n\ttry {\n\t\treturn await Promise.race([\n\t\t\toperation,\n\t\t\tnew Promise<never>((_resolve, reject) => {\n\t\t\t\tcontroller.signal.addEventListener(\n\t\t\t\t\t\"abort\",\n\t\t\t\t\t() => {\n\t\t\t\t\t\treject(\n\t\t\t\t\t\t\tsignal.aborted\n\t\t\t\t\t\t\t\t? abortError()\n\t\t\t\t\t\t\t\t: Object.assign(\n\t\t\t\t\t\t\t\t\t\tnew Error(`Timed out after ${Math.round(timeoutMs / 1000)}s ${description}.`),\n\t\t\t\t\t\t\t\t\t\t{ name: \"TimeoutError\" },\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\t{ once: true },\n\t\t\t\t);\n\t\t\t}),\n\t\t]);\n\t} finally {\n\t\tclearTimeout(timeout);\n\t\tsignal.removeEventListener(\"abort\", abortFromCaller);\n\t}\n}\n\nexport function sanitizeDisplayText(value: string, maxChars = 160): string {\n\tlet result = \"\";\n\tfor (let index = 0; index < value.length; ) {\n\t\tconst codePoint = value.codePointAt(index) ?? 0;\n\t\tconst character = String.fromCodePoint(codePoint);\n\t\tif (codePoint === 0x1b || codePoint === 0x9b || codePoint === 0x9d) {\n\t\t\tindex = skipTerminalEscape(value, index, codePoint);\n\t\t\tcontinue;\n\t\t}\n\t\tif (codePoint <= 0x1f || (codePoint >= 0x7f && codePoint <= 0x9f)) {\n\t\t\tif (codePoint === 0x09 || codePoint === 0x0a || codePoint === 0x0d) result += \" \";\n\t\t\tindex += character.length;\n\t\t\tcontinue;\n\t\t}\n\t\tresult += character;\n\t\tindex += character.length;\n\t}\n\treturn truncate(result.replace(/\\s+/gu, \" \").trim(), maxChars);\n}\n\nexport function redactUsageError(value: string, secrets: readonly string[] = []): string {\n\tlet redacted = value;\n\tfor (const secret of [...new Set(secrets)].filter(Boolean).sort((a, b) => b.length - a.length)) {\n\t\tredacted = redacted.replace(new RegExp(escapeRegExp(secret), \"g\"), \"<redacted>\");\n\t}\n\tredacted = redacted\n\t\t.replace(/Bearer\\s+[A-Za-z0-9._~+/=-]+/gi, \"Bearer <redacted>\")\n\t\t.replace(/\"(?:access_token|refresh_token|api_key)\"\\s*:\\s*\"[^\"]+\"/gi, (match) => {\n\t\t\tconst separator = match.indexOf(\":\");\n\t\t\treturn `${match.slice(0, separator + 1)}\"<redacted>\"`;\n\t\t});\n\treturn sanitizeDisplayText(redacted, 600);\n}\n\nexport function errorMessage(error: unknown): string {\n\treturn sanitizeDisplayText(error instanceof Error ? error.message : String(error), 600);\n}\n\nexport function abortError(): Error {\n\treturn Object.assign(new Error(\"Usage query aborted.\"), { name: \"AbortError\" });\n}\n\nfunction skipTerminalEscape(value: string, start: number, codePoint: number): number {\n\tlet index = start + 1;\n\tconst next = value.charCodeAt(index);\n\tconst isOsc = codePoint === 0x9d || (codePoint === 0x1b && next === 0x5d);\n\tif (isOsc) {\n\t\tif (codePoint === 0x1b) index += 1;\n\t\twhile (index < value.length) {\n\t\t\tconst current = value.charCodeAt(index);\n\t\t\tif (current === 0x07) return index + 1;\n\t\t\tif (current === 0x1b && value.charCodeAt(index + 1) === 0x5c) return index + 2;\n\t\t\tindex += 1;\n\t\t}\n\t\treturn index;\n\t}\n\tconst isCsi = codePoint === 0x9b || (codePoint === 0x1b && next === 0x5b);\n\tif (isCsi) {\n\t\tif (codePoint === 0x1b) index += 1;\n\t\twhile (index < value.length) {\n\t\t\tconst current = value.charCodeAt(index);\n\t\t\tindex += 1;\n\t\t\tif (current >= 0x40 && current <= 0x7e) break;\n\t\t}\n\t\treturn index;\n\t}\n\treturn Math.min(value.length, start + (codePoint === 0x1b ? 2 : 1));\n}\n\nfunction cacheKey(providerId: string, fingerprint: string): string {\n\treturn `${providerId}:${fingerprint}`;\n}\n\nfunction escapeRegExp(value: string): string {\n\treturn value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction truncate(value: string, maxChars: number): string {\n\tif (value.length <= maxChars) return value;\n\treturn `${value.slice(0, maxChars - 1)}\u2026`;\n}\n", "import type { OAuthCredential } from \"@earendil-works/pi-ai\";\nimport {\n\ttype ExtensionAPI,\n\ttype ExtensionContext,\n\treadStoredCredential,\n} 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\t| { ok: true; candidates: readonly OAuthCredential[]; offeredCount?: number }\n\t| { ok: false };\n\nexport type OAuthCredentialCandidateReader = (\n\tctx: ExtensionContext,\n\tproviderId: string,\n) => OAuthCredentialCandidates;\n\nexport function createOAuthCredentialCandidateReader(\n\tpi: ExtensionAPI,\n\tcredentialReader: StoredCredentialReader = readStoredCredential,\n): OAuthCredentialCandidateReader {\n\treturn (ctx, providerId) =>\n\t\tcollectOAuthCredentialCandidates(pi, ctx, providerId, credentialReader);\n}\n\nexport function collectOAuthCredentialCandidates(\n\tpi: Pick<ExtensionAPI, \"events\">,\n\tctx: ExtensionContext,\n\tproviderId: string,\n\tcredentialReader: StoredCredentialReader = readStoredCredential,\n): OAuthCredentialCandidates {\n\tconst candidates: OAuthCredential[] = [];\n\tlet collecting = true;\n\tconst request = Object.freeze({\n\t\tsession: ctx.sessionManager,\n\t\tprovider: providerId,\n\t\toffer(candidate: unknown) {\n\t\t\tif (!collecting) return;\n\t\t\tconst clone = cloneOAuthCredential(candidate);\n\t\t\tif (clone) candidates.push(clone);\n\t\t},\n\t});\n\ttry {\n\t\tpi.events.emit(OAUTH_CREDENTIAL_SOURCE_CHANNEL, request);\n\t} catch {\n\t\treturn { ok: false };\n\t} finally {\n\t\tcollecting = false;\n\t}\n\tconst offeredCount = candidates.length;\n\ttry {\n\t\tconst fallback = cloneOAuthCredential(credentialReader(providerId));\n\t\tif (fallback) candidates.push(fallback);\n\t} catch {\n\t\t// A malformed or unavailable standalone credential is equivalent to no fallback.\n\t}\n\treturn { ok: true, candidates, offeredCount };\n}\n\nexport function fallbackOAuthCredentialCandidates(\n\tproviderId: string,\n\tcredentialReader: StoredCredentialReader,\n): OAuthCredentialCandidates {\n\ttry {\n\t\tconst credential = cloneOAuthCredential(credentialReader(providerId));\n\t\treturn { ok: true, candidates: credential ? [credential] : [], offeredCount: 0 };\n\t} catch {\n\t\treturn { ok: true, candidates: [], offeredCount: 0 };\n\t}\n}\n\nfunction cloneOAuthCredential(value: unknown): OAuthCredential | undefined {\n\ttry {\n\t\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\t\tconst clone = structuredClone(value) as OAuthCredential;\n\t\tif (!clone || typeof clone !== \"object\" || Array.isArray(clone)) return undefined;\n\t\tif (clone.type !== \"oauth\") return undefined;\n\t\tif (typeof clone.access !== \"string\" || !clone.access) return undefined;\n\t\tif (typeof clone.refresh !== \"string\" || !clone.refresh) return undefined;\n\t\tif (typeof clone.expires !== \"number\" || !Number.isFinite(clone.expires)) return undefined;\n\t\treturn clone;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n", "import { randomBytes } from \"node:crypto\";\nimport { type ExtensionContext, readStoredCredential } from \"@earendil-works/pi-coding-agent\";\nimport { errorMessage, fingerprintResolvedAuth, redactUsageError } from \"./core.js\";\nimport {\n\tfallbackOAuthCredentialCandidates,\n\ttype OAuthCredentialCandidateReader,\n} from \"./oauth-credential-source.js\";\nimport { normalizeCodexBackendPayload } from \"./providers/codex.js\";\nimport { normalizeGitHubCopilotUsagePayload } from \"./providers/github-copilot.js\";\nimport { normalizeKimiCodingUsagePayload } from \"./providers/kimi-coding.js\";\nimport { normalizeOpenCodeZenPayload } from \"./providers/opencode-zen.js\";\nimport { normalizeOpenRouterKeyPayload } from \"./providers/openrouter.js\";\nimport { normalizeXaiBillingPayload } from \"./providers/xai.js\";\nimport { normalizeZaiQuotaPayload } from \"./providers/zai.js\";\nimport type {\n\tCodexBackendPayload,\n\tGitHubCopilotUsagePayload,\n\tKimiCodingUsagePayload,\n\tOpenCodeZenPayload,\n\tOpenRouterKeyPayload,\n\tPiModel,\n\tResolvedUsageAuth,\n\tUsageProviderAdapter,\n\tUsageReport,\n\tXaiBillingPayload,\n\tXaiUserPayload,\n\tZaiQuotaPayload,\n} from \"./types.js\";\n\nconst CODEX_USAGE_URL = \"https://chatgpt.com/backend-api/wham/usage\";\nconst GITHUB_COPILOT_USAGE_URL = \"https://api.github.com/copilot_internal/user\";\nconst OPENROUTER_KEY_URL = \"https://openrouter.ai/api/v1/key\";\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 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\t\"X-XAI-Token-Auth\": \"xai-grok-cli\",\n\t\"x-grok-client-version\": \"1.0.10\",\n\t\"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 type UsageRequestGuard = () => Promise<void>;\n\nexport const SUPPORTED_ADAPTERS: readonly UsageProviderAdapter[] = [\n\t{\n\t\tid: \"openai-codex\",\n\t\tdisplayName: \"OpenAI Codex\",\n\t\tsemantics: {\n\t\t\tkind: \"consumer-subscription\",\n\t\t\tlabel: \"ChatGPT subscription limits\",\n\t\t},\n\t\tasync query(auth, signal, timeoutMs) {\n\t\t\tconst payload = await fetchProviderJson(\n\t\t\t\tCODEX_USAGE_URL,\n\t\t\t\tauth,\n\t\t\t\tsignal,\n\t\t\t\ttimeoutMs,\n\t\t\t\t\"Codex usage endpoint\",\n\t\t\t);\n\t\t\treturn normalizeCodexBackendPayload(payload as CodexBackendPayload, Date.now());\n\t\t},\n\t},\n\t{\n\t\tid: \"github-copilot\",\n\t\tdisplayName: \"GitHub Copilot\",\n\t\tsemantics: {\n\t\t\tkind: \"consumer-subscription\",\n\t\t\tlabel: \"GitHub Copilot account allowance\",\n\t\t},\n\t\tasync query(auth, signal, timeoutMs) {\n\t\t\tconst payload = await fetchProviderJson(\n\t\t\t\tGITHUB_COPILOT_USAGE_URL,\n\t\t\t\tauth,\n\t\t\t\tsignal,\n\t\t\t\ttimeoutMs,\n\t\t\t\t\"GitHub Copilot usage endpoint\",\n\t\t\t);\n\t\t\treturn normalizeGitHubCopilotUsagePayload(payload as GitHubCopilotUsagePayload, Date.now());\n\t\t},\n\t},\n\t{\n\t\tid: \"openrouter\",\n\t\tdisplayName: \"OpenRouter\",\n\t\tsemantics: { kind: \"api-key\", label: \"API-key spend limits\" },\n\t\tasync query(auth, signal, timeoutMs) {\n\t\t\tconst payload = await fetchProviderJson(\n\t\t\t\tOPENROUTER_KEY_URL,\n\t\t\t\tauth,\n\t\t\t\tsignal,\n\t\t\t\ttimeoutMs,\n\t\t\t\t\"OpenRouter key endpoint\",\n\t\t\t);\n\t\t\treturn normalizeOpenRouterKeyPayload(payload as OpenRouterKeyPayload, Date.now());\n\t\t},\n\t},\n\t{\n\t\tid: \"opencode-go\",\n\t\tdisplayName: \"OpenCode Go\",\n\t\tsemantics: { kind: \"consumer-subscription\", label: \"OpenCode Zen plan usage\" },\n\t\tasync query(auth, signal, timeoutMs) {\n\t\t\tconst payload = await fetchProviderJson(\n\t\t\t\tOPENCODE_GO_USAGE_URL,\n\t\t\t\tauth,\n\t\t\t\tsignal,\n\t\t\t\ttimeoutMs,\n\t\t\t\t\"OpenCode Zen usage endpoint\",\n\t\t\t);\n\t\t\treturn normalizeOpenCodeZenPayload(payload as OpenCodeZenPayload, Date.now());\n\t\t},\n\t},\n\t{\n\t\tid: \"kimi-coding\",\n\t\tdisplayName: \"Kimi For Coding\",\n\t\tsemantics: { kind: \"consumer-subscription\", label: \"Kimi Coding Plan usage\" },\n\t\tasync query(auth, signal, timeoutMs) {\n\t\t\tconst payload = await fetchProviderJson(\n\t\t\t\tKIMI_CODING_USAGE_URL,\n\t\t\t\tauth,\n\t\t\t\tsignal,\n\t\t\t\ttimeoutMs,\n\t\t\t\t\"Kimi Coding usage endpoint\",\n\t\t\t\t{ redirect: \"error\" },\n\t\t\t);\n\t\t\treturn normalizeKimiCodingUsagePayload(payload as KimiCodingUsagePayload, Date.now());\n\t\t},\n\t},\n\t{\n\t\tid: \"zai\",\n\t\tdisplayName: \"Z.AI\",\n\t\tsemantics: { kind: \"consumer-subscription\", label: \"GLM Coding Plan usage\" },\n\t\tpublishesStatusline: false,\n\t\tasync query(auth, signal, timeoutMs) {\n\t\t\tconst payload = await fetchProviderJson(\n\t\t\t\tzaiMonitorUrl(auth.model.baseUrl),\n\t\t\t\tzaiMonitorAuth(auth),\n\t\t\t\tsignal,\n\t\t\t\ttimeoutMs,\n\t\t\t\t\"Z.AI quota endpoint\",\n\t\t\t);\n\t\t\treturn normalizeZaiQuotaPayload(\"zai\", \"Z.AI\", payload as ZaiQuotaPayload, Date.now());\n\t\t},\n\t},\n\t{\n\t\tid: \"zai-coding-cn\",\n\t\tdisplayName: \"Z.AI Coding CN\",\n\t\tsemantics: { kind: \"consumer-subscription\", label: \"GLM Coding Plan usage\" },\n\t\tpublishesStatusline: false,\n\t\tasync query(auth, signal, timeoutMs) {\n\t\t\tconst payload = await fetchProviderJson(\n\t\t\t\tzaiMonitorUrl(auth.model.baseUrl),\n\t\t\t\tzaiMonitorAuth(auth),\n\t\t\t\tsignal,\n\t\t\t\ttimeoutMs,\n\t\t\t\t\"Z.AI Coding CN quota endpoint\",\n\t\t\t);\n\t\t\treturn normalizeZaiQuotaPayload(\n\t\t\t\t\"zai-coding-cn\",\n\t\t\t\t\"Z.AI Coding CN\",\n\t\t\t\tpayload as ZaiQuotaPayload,\n\t\t\t\tDate.now(),\n\t\t\t);\n\t\t},\n\t},\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\tid: \"xai\",\n\tdisplayName: \"xAI\",\n\tsemantics: {\n\t\tkind: \"consumer-subscription\",\n\t\tlabel: \"xAI consumer subscription usage\",\n\t},\n\tpublishesStatusline: false,\n\tasync query(auth, signal, timeoutMs, guard) {\n\t\tif (!guard) throw new Error(\"xAI usage requires request-boundary revalidation.\");\n\t\tconst startedAt = Date.now();\n\t\tconst clientAuth = {\n\t\t\t...auth,\n\t\t\theaders: { ...auth.headers, ...XAI_CLIENT_HEADERS },\n\t\t};\n\t\tawait guard();\n\t\tconst userPayload = (await fetchProviderJson(\n\t\t\tXAI_USER_URL,\n\t\t\tclientAuth,\n\t\t\tsignal,\n\t\t\tremainingTimeout(timeoutMs, startedAt),\n\t\t\t\"xAI consumer identity endpoint\",\n\t\t\t{ redirect: \"error\", userAgent: false },\n\t\t)) as XaiUserPayload;\n\t\tawait guard();\n\t\tconst userId = validatedXaiUserId(userPayload.userId);\n\t\tconst billingAuth = {\n\t\t\t...clientAuth,\n\t\t\theaders: { ...clientAuth.headers, \"x-userid\": userId },\n\t\t\tsecrets: [...clientAuth.secrets, userId],\n\t\t};\n\t\tawait guard();\n\t\tconst billingPayload = (await fetchProviderJson(\n\t\t\tXAI_BILLING_URL,\n\t\t\tbillingAuth,\n\t\t\tsignal,\n\t\t\tremainingTimeout(timeoutMs, startedAt),\n\t\t\t\"xAI consumer billing endpoint\",\n\t\t\t{ redirect: \"error\", userAgent: false },\n\t\t)) as XaiBillingPayload;\n\t\tawait guard();\n\t\treturn normalizeXaiBillingPayload(billingPayload, userPayload.subscriptionTier, Date.now());\n\t},\n};\n\nexport function usageAdapters(xaiUsage = true): readonly UsageProviderAdapter[] {\n\treturn xaiUsage ? [...SUPPORTED_ADAPTERS, XAI_ADAPTER] : SUPPORTED_ADAPTERS;\n}\n\nexport function adapterForProvider(\n\tproviderId: string | undefined,\n\txaiUsage = true,\n): UsageProviderAdapter | undefined {\n\treturn usageAdapters(xaiUsage).find((adapter) => adapter.id === providerId);\n}\n\nexport function isStaleExtensionContextError(error: unknown): boolean {\n\treturn (\n\t\terror instanceof Error &&\n\t\terror.message.includes(\"This extension ctx is stale after session replacement or reload\")\n\t);\n}\n\nexport async function resolveUsageAuth(\n\tctx: ExtensionContext,\n\tadapter: UsageProviderAdapter,\n\tsalt: Uint8Array = AUTH_FINGERPRINT_SALT,\n\tcredentialReader: StoredCredentialReader = readStoredCredential,\n\tcandidateReader?: OAuthCredentialCandidateReader,\n): Promise<ResolvedUsageAuth | undefined> {\n\tif (ctx.model?.provider === adapter.id && !hasOfficialOrigin(ctx.model, adapter.id)) {\n\t\tthrow new Error(\n\t\t\t`${adapter.displayName} usage cannot send a custom provider base URL credential to the official usage endpoint.`,\n\t\t);\n\t}\n\n\tconst model = candidateModels(ctx, adapter.id).find((candidate) =>\n\t\thasOfficialOrigin(candidate, adapter.id),\n\t);\n\tif (!model) return undefined;\n\t// SAFETY: Pi exposes the required auth methods at runtime, and checks below narrow them before use.\n\tconst registry = ctx.modelRegistry as unknown as UsageAuthRegistry;\n\tlet modelAuth: RequestAuth | undefined;\n\tif (ctx.model?.provider === adapter.id && typeof registry.getApiKeyAndHeaders === \"function\") {\n\t\tconst result = await registry.getApiKeyAndHeaders(ctx.model);\n\t\tif (!result.ok) throw new Error(redactUsageError(result.error));\n\t\tif (authorizationFrom(result)) modelAuth = result;\n\t}\n\tif (typeof registry.getProviderAuth !== \"function\") {\n\t\tthrow new Error(\"pi-usage requires Pi 0.81.0 or newer to validate resolved provider auth.\");\n\t}\n\tconst providerResult = await registry.getProviderAuth(adapter.id);\n\tif (\n\t\tproviderResult?.auth.baseUrl &&\n\t\t!hasOfficialUrlOrigin(providerResult.auth.baseUrl, adapter.id)\n\t) {\n\t\tthrow new Error(\n\t\t\t`${adapter.displayName} usage cannot send a proxy-resolved credential to the official usage endpoint.`,\n\t\t);\n\t}\n\tconst auth = modelAuth ?? providerResult?.auth;\n\tif (!auth) return undefined;\n\tif (adapter.id === \"github-copilot\") {\n\t\tconst offered = candidateReader\n\t\t\t? candidateReader(ctx, adapter.id)\n\t\t\t: fallbackOAuthCredentialCandidates(adapter.id, credentialReader);\n\t\tif (!offered.ok) {\n\t\t\tthrow new Error(\"GitHub Copilot OAuth credential discovery failed closed.\");\n\t\t}\n\t\treturn resolveGitHubCopilotUsageAuth(\n\t\t\tauth,\n\t\t\tmodel,\n\t\t\tsalt,\n\t\t\toffered.candidates,\n\t\t\toffered.offeredCount === 0,\n\t\t);\n\t}\n\tif (adapter.id === \"xai\") {\n\t\tconst offered = candidateReader\n\t\t\t? candidateReader(ctx, adapter.id)\n\t\t\t: fallbackOAuthCredentialCandidates(adapter.id, credentialReader);\n\t\tif (!offered.ok) throw new Error(\"xAI OAuth credential discovery failed closed.\");\n\t\treturn resolveXaiUsageAuth(auth, model, salt, offered.candidates);\n\t}\n\tconst authorization = authorizationFrom(auth);\n\tif (!authorization) return undefined;\n\tconst headers = { Authorization: authorization };\n\tconst secrets = [auth.apiKey, headerValue(auth.headers, \"Authorization\"), authorization].filter(\n\t\t(value): value is string => Boolean(value),\n\t);\n\treturn {\n\t\tapiKey: auth.apiKey,\n\t\theaders,\n\t\tfingerprint: fingerprintResolvedAuth({ headers }, salt),\n\t\tsecrets,\n\t\tmodel,\n\t};\n}\n\nexport async function queryProviderUsage(\n\tadapter: UsageProviderAdapter,\n\tauth: ResolvedUsageAuth,\n\tsignal: AbortSignal,\n\ttimeoutMs: number,\n\tguard?: UsageRequestGuard,\n): Promise<UsageReport> {\n\ttry {\n\t\treturn await adapter.query(auth, signal, timeoutMs, guard);\n\t} catch (error) {\n\t\tif (isStaleExtensionContextError(error) || isAbortError(error)) throw error;\n\t\tthrow new Error(redactUsageError(errorMessage(error), auth.secrets));\n\t}\n}\n\nexport function providerIsConfigured(ctx: ExtensionContext, providerId: string): boolean {\n\ttry {\n\t\treturn ctx.modelRegistry.getProviderAuthStatus(providerId).configured;\n\t} catch {\n\t\treturn candidateModels(ctx, providerId).length > 0;\n\t}\n}\n\nfunction candidateModels(ctx: ExtensionContext, providerId: string): PiModel[] {\n\tconst candidates: PiModel[] = [];\n\tconst seen = new Set<string>();\n\tconst add = (model: PiModel | undefined) => {\n\t\tif (!model || model.provider !== providerId) return;\n\t\tconst key = `${model.provider}/${model.id}`;\n\t\tif (seen.has(key)) return;\n\t\tseen.add(key);\n\t\tcandidates.push(model);\n\t};\n\tadd(ctx.model);\n\tfor (const model of ctx.modelRegistry.getAvailable()) add(model);\n\tfor (const model of ctx.modelRegistry.getAll()) add(model);\n\treturn candidates;\n}\n\nexport async function fetchProviderJson(\n\turl: string,\n\tauth: ResolvedUsageAuth,\n\tsignal: AbortSignal,\n\ttimeoutMs: number,\n\tdescription: string,\n\trequest: {\n\t\tmethod?: \"GET\" | \"POST\";\n\t\tbody?: Record<string, unknown>;\n\t\tredirect?: RequestRedirect;\n\t\tuserAgent?: boolean;\n\t} = {},\n): Promise<Record<string, unknown>> {\n\tconst controller = new AbortController();\n\tlet timedOut = false;\n\tconst abortFromCaller = () => controller.abort();\n\tif (signal.aborted) controller.abort();\n\telse signal.addEventListener(\"abort\", abortFromCaller, { once: true });\n\tconst timeout = setTimeout(() => {\n\t\ttimedOut = true;\n\t\tcontroller.abort();\n\t}, timeoutMs);\n\ttry {\n\t\tconst headers = { ...auth.headers };\n\t\tif (request.userAgent !== false && !hasHeader(headers, \"User-Agent\")) {\n\t\t\theaders[\"User-Agent\"] = \"pi-usage\";\n\t\t}\n\t\tif (request.body && !hasHeader(headers, \"Content-Type\")) {\n\t\t\theaders[\"Content-Type\"] = \"application/json\";\n\t\t}\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: request.method ?? \"GET\",\n\t\t\theaders,\n\t\t\t...(request.body ? { body: JSON.stringify(request.body) } : {}),\n\t\t\t...(request.redirect ? { redirect: request.redirect } : {}),\n\t\t\tsignal: controller.signal,\n\t\t});\n\t\tif (response.redirected) throw new Error(`${description} refused a redirected response.`);\n\t\tif (controller.signal.aborted)\n\t\t\tthrow Object.assign(new Error(\"Usage query aborted.\"), { name: \"AbortError\" });\n\t\tconst text = await readBoundedResponse(\n\t\t\tresponse,\n\t\t\tresponse.ok ? MAX_SUCCESS_BODY_BYTES : MAX_ERROR_BODY_BYTES,\n\t\t\t!response.ok,\n\t\t\tdescription,\n\t\t\tcontroller.signal,\n\t\t);\n\t\tif (controller.signal.aborted)\n\t\t\tthrow Object.assign(new Error(\"Usage query aborted.\"), { name: \"AbortError\" });\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(\n\t\t\t\t`${description} returned ${response.status} ${response.statusText}: ${redactUsageError(text, auth.secrets)}`,\n\t\t\t);\n\t\t}\n\t\tlet parsed: unknown;\n\t\ttry {\n\t\t\tparsed = JSON.parse(text) as unknown;\n\t\t} catch (error) {\n\t\t\tthrow new Error(`${description} returned invalid JSON: ${errorMessage(error)}`);\n\t\t}\n\t\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\t\tthrow new Error(`${description} response was not an object.`);\n\t\t}\n\t\treturn parsed as Record<string, unknown>;\n\t} catch (error) {\n\t\tif (timedOut) {\n\t\t\tthrow new Error(`Timed out after ${Math.round(timeoutMs / 1000)}s while fetching usage.`);\n\t\t}\n\t\tif (signal.aborted)\n\t\t\tthrow Object.assign(new Error(\"Usage query aborted.\"), { name: \"AbortError\" });\n\t\tthrow error;\n\t} finally {\n\t\tclearTimeout(timeout);\n\t\tsignal.removeEventListener(\"abort\", abortFromCaller);\n\t}\n}\n\nasync function readBoundedResponse(\n\tresponse: Response,\n\tmaxBytes: number,\n\ttruncateOverflow: boolean,\n\tdescription: string,\n\tsignal: AbortSignal,\n): Promise<string> {\n\tif (!response.body) return \"\";\n\tconst reader = response.body.getReader();\n\tconst chunks: Uint8Array[] = [];\n\tlet total = 0;\n\tlet truncated = false;\n\tconst abort = () => void reader.cancel().catch(() => undefined);\n\tif (signal.aborted) abort();\n\telse signal.addEventListener(\"abort\", abort, { once: true });\n\ttry {\n\t\twhile (true) {\n\t\t\tconst { done, value } = await reader.read();\n\t\t\tif (done) break;\n\t\t\tconst remaining = maxBytes - total;\n\t\t\tif (value.byteLength > remaining) {\n\t\t\t\tif (remaining > 0) chunks.push(value.subarray(0, remaining));\n\t\t\t\ttotal = maxBytes;\n\t\t\t\ttruncated = true;\n\t\t\t\tawait reader.cancel();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tchunks.push(value);\n\t\t\ttotal += value.byteLength;\n\t\t}\n\t} finally {\n\t\tsignal.removeEventListener(\"abort\", abort);\n\t\treader.releaseLock();\n\t}\n\tif (truncated && !truncateOverflow) {\n\t\tthrow new Error(`${description} response exceeded ${maxBytes} bytes.`);\n\t}\n\tconst body = new Uint8Array(total);\n\tlet offset = 0;\n\tfor (const chunk of chunks) {\n\t\tbody.set(chunk, offset);\n\t\toffset += chunk.byteLength;\n\t}\n\tconst text = new TextDecoder().decode(body);\n\treturn truncated ? `${text}\u2026` : text;\n}\n\ntype RequestAuth = {\n\tapiKey?: string;\n\theaders?: Record<string, string | null>;\n};\n\ntype StoredCredentialReader = (providerId: string) => unknown;\n\ntype UsageAuthRegistry = {\n\tgetApiKeyAndHeaders?(\n\t\tmodel: PiModel,\n\t): Promise<({ ok: true } & RequestAuth) | { ok: false; error: string }>;\n\tgetProviderAuth?(providerId: string): Promise<\n\t\t| {\n\t\t\t\tauth: RequestAuth & { baseUrl?: string };\n\t\t }\n\t\t| undefined\n\t>;\n};\n\nfunction resolveXaiUsageAuth(\n\tauth: RequestAuth,\n\tmodel: PiModel,\n\tsalt: Uint8Array,\n\tcandidates: readonly unknown[],\n): ResolvedUsageAuth {\n\tconst resolvedAccess = bearerToken(headerValue(auth.headers, \"Authorization\")) ?? auth.apiKey;\n\tif (!resolvedAccess) throw new Error(\"xAI runtime authentication was incomplete.\");\n\tlet sawOAuth = false;\n\tlet sawMatchingAccess = false;\n\tlet sawIncompleteMatch = false;\n\tconst matches: Array<{ access: string; refresh: string }> = [];\n\tfor (const candidate of candidates) {\n\t\ttry {\n\t\t\tconst credential = asObject(candidate);\n\t\t\tif (credential?.type !== \"oauth\") continue;\n\t\t\tsawOAuth = true;\n\t\t\tif (credential.access !== resolvedAccess) continue;\n\t\t\tsawMatchingAccess = true;\n\t\t\tif (\n\t\t\t\ttypeof credential.access !== \"string\" ||\n\t\t\t\t!credential.access ||\n\t\t\t\ttypeof credential.refresh !== \"string\" ||\n\t\t\t\t!credential.refresh ||\n\t\t\t\ttypeof credential.expires !== \"number\" ||\n\t\t\t\t!Number.isFinite(credential.expires)\n\t\t\t) {\n\t\t\t\tsawIncompleteMatch = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tmatches.push({ access: credential.access, refresh: credential.refresh });\n\t\t} catch {\n\t\t\t// Malformed candidates never authorize a consumer-proxy request.\n\t\t}\n\t}\n\tif (sawIncompleteMatch) throw new Error(\"The matching xAI OAuth credential was incomplete.\");\n\tif (matches.length > 1) {\n\t\tthrow new Error(\"Multiple OAuth credentials match the active xAI runtime account.\");\n\t}\n\tconst match = matches[0];\n\tif (!match) {\n\t\tif (!sawOAuth) {\n\t\t\tthrow new Error(\n\t\t\t\t\"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\t\t\t);\n\t\t}\n\t\tif (sawMatchingAccess) throw new Error(\"The matching xAI OAuth credential was incomplete.\");\n\t\tthrow new Error(\"The active xAI runtime account does not match Pi's stored OAuth account.\");\n\t}\n\tconst authorization = `Bearer ${match.access}`;\n\tconst headers = { Authorization: authorization };\n\treturn {\n\t\tapiKey: match.access,\n\t\theaders,\n\t\tfingerprint: fingerprintResolvedAuth({ headers }, salt),\n\t\tsecrets: [\n\t\t\tmatch.access,\n\t\t\tmatch.refresh,\n\t\t\tresolvedAccess,\n\t\t\tauth.apiKey,\n\t\t\theaderValue(auth.headers, \"Authorization\"),\n\t\t\tauthorization,\n\t\t].filter((value): value is string => Boolean(value)),\n\t\tmodel,\n\t};\n}\n\nfunction resolveGitHubCopilotUsageAuth(\n\tauth: RequestAuth,\n\tmodel: PiModel,\n\tsalt: Uint8Array,\n\tcandidates: readonly unknown[],\n\tstandaloneFallback: boolean,\n): ResolvedUsageAuth {\n\tconst resolvedAccess = bearerToken(headerValue(auth.headers, \"Authorization\")) ?? auth.apiKey;\n\tif (!resolvedAccess) throw new Error(\"GitHub Copilot OAuth credentials were incomplete.\");\n\tlet sawOAuth = false;\n\tlet sawMatchingAccess = false;\n\tlet sawIncompleteMatch = false;\n\tlet sawEnterpriseMatch = false;\n\tconst matches = new Map<string, { refresh: string; storedAccess: string }>();\n\tfor (const candidate of candidates) {\n\t\ttry {\n\t\t\tconst credential = asObject(candidate);\n\t\t\tif (credential?.type !== \"oauth\") continue;\n\t\t\tsawOAuth = true;\n\t\t\tconst storedAccess =\n\t\t\t\ttypeof credential.access === \"string\" && credential.access ? credential.access : undefined;\n\t\t\tif (storedAccess !== resolvedAccess) continue;\n\t\t\tsawMatchingAccess = true;\n\t\t\tconst enterpriseUrl = credential.enterpriseUrl;\n\t\t\tif (\n\t\t\t\ttypeof enterpriseUrl === \"string\" &&\n\t\t\t\tenterpriseUrl &&\n\t\t\t\t!isPublicGitHubDomain(enterpriseUrl)\n\t\t\t) {\n\t\t\t\tsawEnterpriseMatch = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst refresh =\n\t\t\t\ttypeof credential.refresh === \"string\" && credential.refresh\n\t\t\t\t\t? credential.refresh\n\t\t\t\t\t: undefined;\n\t\t\tif (!refresh) {\n\t\t\t\tsawIncompleteMatch = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tmatches.set(`${storedAccess.length}:${storedAccess}${refresh}`, { refresh, storedAccess });\n\t\t} catch {\n\t\t\t// Malformed candidates never authorize a provider request.\n\t\t}\n\t}\n\tif (sawEnterpriseMatch) {\n\t\tthrow new Error(\"GitHub Copilot usage does not yet support GitHub Enterprise accounts.\");\n\t}\n\tif (sawIncompleteMatch) throw new Error(\"GitHub Copilot OAuth credentials were incomplete.\");\n\tif (matches.size > 1) {\n\t\tthrow new Error(\n\t\t\t\"Conflicting OAuth credentials match the active GitHub Copilot runtime account.\",\n\t\t);\n\t}\n\tconst match = matches.values().next().value;\n\tif (!match) {\n\t\tif (!sawOAuth) {\n\t\t\tthrow new Error(\n\t\t\t\tstandaloneFallback\n\t\t\t\t\t? \"GitHub Copilot usage requires the OAuth account configured through Pi /login.\"\n\t\t\t\t\t: \"GitHub Copilot usage requires an OAuth account configured through Pi /login or a compatible credential source.\",\n\t\t\t);\n\t\t}\n\t\tif (sawMatchingAccess) throw new Error(\"GitHub Copilot OAuth credentials were incomplete.\");\n\t\tthrow new Error(\n\t\t\tstandaloneFallback\n\t\t\t\t? \"The active GitHub Copilot runtime account does not match Pi's stored OAuth account.\"\n\t\t\t\t: \"The active GitHub Copilot runtime account does not match any available OAuth account.\",\n\t\t);\n\t}\n\tconst { refresh, storedAccess } = match;\n\tconst authorization = `Bearer ${refresh}`;\n\tconst headers = {\n\t\tAuthorization: authorization,\n\t\t\"X-GitHub-Api-Version\": \"2025-05-01\",\n\t};\n\treturn {\n\t\tapiKey: refresh,\n\t\theaders,\n\t\tfingerprint: fingerprintResolvedAuth({ headers }, salt),\n\t\tsecrets: [refresh, storedAccess, resolvedAccess, authorization],\n\t\tmodel,\n\t};\n}\n\nfunction authorizationFrom(auth: RequestAuth): string | undefined {\n\treturn (\n\t\theaderValue(auth.headers, \"Authorization\") ??\n\t\t(auth.apiKey ? `Bearer ${auth.apiKey}` : undefined)\n\t);\n}\n\nfunction bearerToken(authorization: string | undefined): string | undefined {\n\tconst match = /^Bearer\\s+(.+)$/iu.exec(authorization ?? \"\");\n\treturn match?.[1];\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\treturn value as Record<string, unknown>;\n}\n\nfunction isPublicGitHubDomain(value: string): boolean {\n\ttry {\n\t\tconst url = new URL(value.includes(\"://\") ? value : `https://${value}`);\n\t\treturn url.hostname.toLowerCase() === \"github.com\";\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction hasOfficialOrigin(model: PiModel, providerId: string): boolean {\n\treturn hasOfficialUrlOrigin(model.baseUrl, providerId);\n}\n\nfunction hasOfficialUrlOrigin(value: string, providerId: string): boolean {\n\ttry {\n\t\tconst url = new URL(value);\n\t\tif (providerId === \"openai-codex\") return url.origin === \"https://chatgpt.com\";\n\t\tif (providerId === \"openrouter\") return url.origin === \"https://openrouter.ai\";\n\t\tif (providerId === \"opencode-go\") return url.origin === \"https://opencode.ai\";\n\t\tif (providerId === \"kimi-coding\") return url.origin === \"https://api.kimi.com\";\n\t\tif (providerId === \"xai\") return url.origin === \"https://api.x.ai\";\n\t\tif (providerId === \"zai\") return url.origin === \"https://api.z.ai\";\n\t\tif (providerId === \"zai-coding-cn\") return url.origin === \"https://open.bigmodel.cn\";\n\t\tif (providerId === \"github-copilot\") {\n\t\t\treturn (\n\t\t\t\turl.protocol === \"https:\" && /^api\\.[a-z0-9-]+\\.githubcopilot\\.com$/u.test(url.hostname)\n\t\t\t);\n\t\t}\n\t\treturn false;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction headerValue(\n\theaders: Record<string, string | null> | undefined,\n\tname: string,\n): string | undefined {\n\tconst entry = Object.entries(headers ?? {}).find(\n\t\t([candidate]) => candidate.toLowerCase() === name.toLowerCase(),\n\t);\n\treturn entry?.[1] ?? undefined;\n}\n\nfunction hasHeader(headers: Record<string, string>, name: string): boolean {\n\treturn Object.keys(headers).some((key) => key.toLowerCase() === name.toLowerCase());\n}\n\nfunction validatedXaiUserId(value: unknown): string {\n\tif (typeof value !== \"string\" || !/^[A-Za-z0-9._~-]{1,128}$/u.test(value)) {\n\t\tthrow new Error(\"xAI consumer identity returned an unsafe canonical user ID.\");\n\t}\n\treturn value;\n}\n\nfunction remainingTimeout(timeoutMs: number, startedAt: number): number {\n\tconst remaining = timeoutMs - (Date.now() - startedAt);\n\tif (remaining <= 0) throw new Error(\"Timed out while fetching xAI consumer usage.\");\n\treturn remaining;\n}\n\nfunction zaiMonitorUrl(baseUrl: string | undefined): string {\n\tconst base = baseUrl?.trim();\n\tif (!base) throw new Error(\"Z.AI model base URL is unavailable.\");\n\treturn `${new URL(base).origin}/api/monitor/usage/quota/limit`;\n}\n\nfunction zaiMonitorAuth(auth: ResolvedUsageAuth): ResolvedUsageAuth {\n\tconst authorization = headerValue(auth.headers, \"Authorization\");\n\tconst token =\n\t\tauthorization === undefined ? undefined : (bearerToken(authorization) ?? authorization);\n\tif (token === undefined || token === authorization) return auth;\n\treturn { ...auth, headers: { ...auth.headers, Authorization: token } };\n}\n\nfunction isAbortError(error: unknown): boolean {\n\treturn error instanceof Error && error.name === \"AbortError\";\n}\n", "import { sanitizeDisplayText } from \"../core.js\";\nimport type { CodexBackendPayload, UsageBucket, UsageMetric, UsageReport } from \"../types.js\";\n\nexport function normalizeCodexBackendPayload(\n\tpayload: CodexBackendPayload,\n\tcapturedAt: number,\n): UsageReport {\n\tconst buckets: UsageBucket[] = [];\n\tnormalizeRateLimitGroup(buckets, \"codex\", \"Codex\", payload.rate_limit, false);\n\n\tconst additional = Array.isArray(payload.additional_rate_limits)\n\t\t? payload.additional_rate_limits\n\t\t: [];\n\tfor (const item of additional) {\n\t\tconst value = asObject(item);\n\t\tconst id = asString(value?.metered_feature) ?? asString(value?.limit_name);\n\t\tif (!value || !id) continue;\n\t\ttry {\n\t\t\tnormalizeRateLimitGroup(\n\t\t\t\tbuckets,\n\t\t\t\tid,\n\t\t\t\tasString(value.limit_name) ?? id,\n\t\t\t\tvalue.rate_limit,\n\t\t\t\ttrue,\n\t\t\t);\n\t\t} catch {\n\t\t\t// Optional provider-specific buckets must not hide otherwise useful primary data.\n\t\t}\n\t}\n\n\tconst metrics: UsageMetric[] = [];\n\tconst credits = asObject(payload.credits);\n\tif (credits?.has_credits === true) {\n\t\tif (credits.unlimited === true) {\n\t\t\tmetrics.push({ id: \"credits\", label: \"Credits\", value: \"unlimited\" });\n\t\t} else {\n\t\t\tconst balance = asNumber(credits.balance);\n\t\t\tif (balance !== undefined) {\n\t\t\t\tmetrics.push({ id: \"credits\", label: \"Credits\", value: balance, unit: \"count\" });\n\t\t\t} else {\n\t\t\t\tmetrics.push({ id: \"credits\", label: \"Credits\", value: \"available\" });\n\t\t\t}\n\t\t}\n\t} else if (credits?.has_credits === false) {\n\t\tmetrics.push({ id: \"credits\", label: \"Credits\", value: \"none\" });\n\t}\n\tconst resetCredits = asObject(payload.rate_limit_reset_credits);\n\tconst resetCount = asNonnegativeInteger(resetCredits?.available_count);\n\tif (resetCount !== undefined) {\n\t\tmetrics.push({\n\t\t\tid: \"reset-credits\",\n\t\t\tlabel: \"Usage limit resets\",\n\t\t\tvalue: resetCount,\n\t\t\tunit: \"count\",\n\t\t});\n\t}\n\tif (buckets.length === 0 && metrics.length === 0) {\n\t\tthrow new Error(\"Codex usage endpoint returned no displayable usage data.\");\n\t}\n\n\tconst planType = asString(payload.plan_type);\n\treturn {\n\t\tproviderId: \"openai-codex\",\n\t\tproviderName: \"OpenAI Codex\",\n\t\tcapturedAt,\n\t\tsource: \"codex-pi-auth\",\n\t\tsemantics: {\n\t\t\tkind: \"consumer-subscription\",\n\t\t\tlabel: \"ChatGPT subscription limits\",\n\t\t},\n\t\tbuckets,\n\t\tmetrics,\n\t\t...(planType ? { notes: [`Plan: ${planType}`] } : {}),\n\t};\n}\n\nfunction normalizeRateLimitGroup(\n\tbuckets: UsageBucket[],\n\tgroupId: string,\n\tgroupLabel: string,\n\traw: unknown,\n\toptional: boolean,\n): void {\n\tif (raw === undefined || raw === null) return;\n\tconst details = asObject(raw);\n\tif (!details) {\n\t\tif (optional) return;\n\t\tthrow new Error(\"Codex rate limit was not an object.\");\n\t}\n\taddWindow(buckets, groupId, groupLabel, \"primary\", details.primary_window);\n\taddWindow(buckets, groupId, groupLabel, \"secondary\", details.secondary_window);\n}\n\nfunction addWindow(\n\tbuckets: UsageBucket[],\n\tgroupId: string,\n\tgroupLabel: string,\n\tposition: \"primary\" | \"secondary\",\n\traw: unknown,\n): void {\n\tif (raw === undefined || raw === null) return;\n\tconst value = asObject(raw);\n\tif (!value) throw new Error(\"Codex rate-limit window was not an object.\");\n\tconst used = asNumber(value.used_percent);\n\tif (used === undefined) return;\n\tconst seconds = asNumber(value.limit_window_seconds);\n\tconst resetsAt = asNumber(value.reset_at);\n\tbuckets.push({\n\t\tid: `${groupId}:${position}`,\n\t\tlabel: position === \"primary\" ? \"Primary limit\" : \"Secondary limit\",\n\t\tgroupId,\n\t\tgroupLabel,\n\t\tmodelKeys: [groupId, groupLabel],\n\t\tused,\n\t\tremaining: 100 - clampPercent(used),\n\t\tlimit: 100,\n\t\tunit: \"percent\",\n\t\t...(seconds !== undefined && seconds > 0 ? { windowMinutes: Math.ceil(seconds / 60) } : {}),\n\t\t...(resetsAt !== undefined ? { resetsAt } : {}),\n\t});\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\treturn value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\treturn sanitizeDisplayText(value, 160) || undefined;\n}\n\nfunction asNumber(value: unknown): number | undefined {\n\tif (typeof value === \"number\" && Number.isFinite(value)) return value;\n\tif (typeof value === \"string\" && value.trim()) {\n\t\tconst parsed = Number(value);\n\t\treturn Number.isFinite(parsed) ? parsed : undefined;\n\t}\n\treturn undefined;\n}\n\nfunction asNonnegativeInteger(value: unknown): number | undefined {\n\tconst parsed = asNumber(value);\n\tif (parsed === undefined || !Number.isSafeInteger(parsed)) return undefined;\n\treturn Math.max(0, parsed);\n}\n\nfunction clampPercent(value: number): number {\n\treturn Math.min(100, Math.max(0, value));\n}\n", "import { sanitizeDisplayText } from \"../core.js\";\nimport type { GitHubCopilotUsagePayload, UsageBucket, UsageReport } from \"../types.js\";\n\nexport function normalizeGitHubCopilotUsagePayload(\n\tpayload: GitHubCopilotUsagePayload,\n\tcapturedAt: number,\n): UsageReport {\n\tconst snapshots = asObject(payload.quota_snapshots);\n\tconst premium = asObject(snapshots?.premium_interactions);\n\tconst metrics: UsageReport[\"metrics\"] = [];\n\tlet semanticsLabel: string;\n\tlet bucket: UsageBucket;\n\n\tif (premium) {\n\t\tconst tokenBasedBilling = premium.token_based_billing === true;\n\t\tconst id = tokenBasedBilling ? \"ai-credits\" : \"premium-requests\";\n\t\tconst label = tokenBasedBilling ? \"AI credits\" : \"Premium requests\";\n\t\tsemanticsLabel = tokenBasedBilling\n\t\t\t? \"GitHub Copilot AI Credits allowance\"\n\t\t\t: \"GitHub Copilot premium request quota\";\n\n\t\tif (premium.unlimited === true) {\n\t\t\tbucket = { id, label, unit: \"count\" };\n\t\t} else {\n\t\t\tconst entitlement = asNonnegativeNumber(premium.entitlement);\n\t\t\tconst rawRemaining =\n\t\t\t\tasFiniteNumber(premium.remaining) ?? asFiniteNumber(premium.quota_remaining);\n\t\t\tif (entitlement === undefined || rawRemaining === undefined) {\n\t\t\t\tthrow new Error(`GitHub Copilot ${label.toLowerCase()} quota was incomplete.`);\n\t\t\t}\n\t\t\tconst overageUsed = Math.max(\n\t\t\t\tasNonnegativeNumber(premium.overage_count) ?? 0,\n\t\t\t\tMath.max(0, -rawRemaining),\n\t\t\t);\n\t\t\tif (overageUsed > 0) {\n\t\t\t\tmetrics.push({\n\t\t\t\t\tid: \"overage-used\",\n\t\t\t\t\tlabel: \"Additional usage\",\n\t\t\t\t\tvalue: overageUsed,\n\t\t\t\t\tunit: \"count\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tbucket = {\n\t\t\t\tid,\n\t\t\t\tlabel,\n\t\t\t\tused: asNonnegativeNumber(premium.credits_used) ?? Math.max(0, entitlement - rawRemaining),\n\t\t\t\tremaining: Math.max(0, rawRemaining),\n\t\t\t\tlimit: entitlement,\n\t\t\t\tunit: \"count\",\n\t\t\t\tperiod: \"monthly\",\n\t\t\t\t...resetTimestamp(payload),\n\t\t\t};\n\t\t}\n\t} else {\n\t\tconst limited = asObject(payload.limited_user_quotas);\n\t\tconst monthly = asObject(payload.monthly_quotas);\n\t\tconst remaining = asNonnegativeNumber(limited?.chat);\n\t\tconst entitlement = asNonnegativeNumber(monthly?.chat);\n\t\tif (remaining === undefined || entitlement === undefined) {\n\t\t\tthrow new Error(\"GitHub Copilot usage response contained no supported quota.\");\n\t\t}\n\t\tsemanticsLabel = \"GitHub Copilot Free chat quota\";\n\t\tbucket = {\n\t\t\tid: \"chat-requests\",\n\t\t\tlabel: \"Chat requests\",\n\t\t\tused: Math.max(0, entitlement - remaining),\n\t\t\tremaining,\n\t\t\tlimit: entitlement,\n\t\t\tunit: \"count\",\n\t\t\tperiod: \"monthly\",\n\t\t\t...resetTimestamp(payload),\n\t\t};\n\t}\n\n\tconst notes: string[] = [];\n\tconst plan = asString(payload.copilot_plan) ?? asString(payload.access_type_sku);\n\tif (plan) notes.push(`Plan: ${plan}`);\n\n\treturn {\n\t\tproviderId: \"github-copilot\",\n\t\tproviderName: \"GitHub Copilot\",\n\t\tcapturedAt,\n\t\tsource: \"github-copilot-user\",\n\t\tsemantics: { kind: \"consumer-subscription\", label: semanticsLabel },\n\t\taccountLabel: asString(payload.login),\n\t\tbuckets: [bucket],\n\t\tmetrics,\n\t\t...(notes.length > 0 ? { notes } : {}),\n\t};\n}\n\nfunction resetTimestamp(payload: GitHubCopilotUsagePayload): { resetsAt?: number } {\n\tconst raw =\n\t\tasString(payload.quota_reset_date_utc) ??\n\t\tasString(payload.quota_reset_date) ??\n\t\tasString(payload.limited_user_reset_date);\n\tif (!raw) return {};\n\tconst milliseconds = Date.parse(raw);\n\treturn Number.isNaN(milliseconds) ? {} : { resetsAt: Math.floor(milliseconds / 1000) };\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\treturn value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\treturn sanitizeDisplayText(value, 80) || undefined;\n}\n\nfunction asFiniteNumber(value: unknown): number | undefined {\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) return undefined;\n\treturn value;\n}\n\nfunction asNonnegativeNumber(value: unknown): number | undefined {\n\tconst number = asFiniteNumber(value);\n\treturn 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 */\nexport function normalizeKimiCodingUsagePayload(\n\tpayload: KimiCodingUsagePayload,\n\tcapturedAt: number,\n): UsageReport {\n\tconst root = asObject(payload);\n\tif (!root) throw new Error(\"Kimi Coding usage response was not an object.\");\n\n\tconst candidates: UsageBucket[] = [];\n\tlet omittedWindow = false;\n\tconst summary = parseUsageRow(root.usage, WEEKLY_WINDOW_MINUTES, \"Weekly window\");\n\tif (summary) candidates.push(summary);\n\telse if (root.usage !== undefined) omittedWindow = true;\n\n\tif (Array.isArray(root.limits)) {\n\t\tfor (const raw of root.limits) {\n\t\t\tconst item = asObject(raw);\n\t\t\tconst windowMinutes = parseWindowMinutes(item?.window);\n\t\t\tconst label = sanitizedLabel(item?.name);\n\t\t\tconst bucket =\n\t\t\t\twindowMinutes === undefined\n\t\t\t\t\t? undefined\n\t\t\t\t\t: parseUsageRow(item?.detail, windowMinutes, label ?? defaultWindowLabel(windowMinutes));\n\t\t\tif (bucket) candidates.push(bucket);\n\t\t\telse omittedWindow = true;\n\t\t}\n\t} else if (root.limits !== undefined) {\n\t\tomittedWindow = true;\n\t}\n\n\tconst buckets: UsageBucket[] = [];\n\tconst byWindow = new Map<number, UsageBucket[]>();\n\tfor (const bucket of candidates) {\n\t\tconst windowMinutes = bucket.windowMinutes as number;\n\t\tbyWindow.set(windowMinutes, [...(byWindow.get(windowMinutes) ?? []), bucket]);\n\t}\n\tfor (const rows of byWindow.values()) {\n\t\tif (rows.length === 1) buckets.push(rows[0] as UsageBucket);\n\t\telse omittedWindow = true;\n\t}\n\tbuckets.sort((left, right) => (left.windowMinutes ?? 0) - (right.windowMinutes ?? 0));\n\n\tconst metrics = parseBoosterWallet(root.boosterWallet);\n\tif (buckets.length === 0 && metrics.length === 0) {\n\t\tthrow new Error(\"Kimi Coding usage endpoint returned no displayable usage data.\");\n\t}\n\n\treturn {\n\t\tproviderId: \"kimi-coding\",\n\t\tproviderName: \"Kimi For Coding\",\n\t\tcapturedAt,\n\t\tsource: \"kimi-managed-usage\",\n\t\tsemantics: { kind: \"consumer-subscription\", label: \"Kimi Coding Plan usage\" },\n\t\tbuckets,\n\t\tmetrics,\n\t\t...(omittedWindow\n\t\t\t? { notes: [\"Unsupported, malformed, or duplicate plan windows were unavailable.\"] }\n\t\t\t: {}),\n\t};\n}\n\nfunction parseUsageRow(\n\tvalue: unknown,\n\twindowMinutes: number,\n\tlabel: string,\n): UsageBucket | undefined {\n\tconst row = asObject(value);\n\tif (!row) return undefined;\n\tconst used = asNonnegativeInteger(row.used);\n\tconst limit = asNonnegativeInteger(row.limit);\n\tif (used === undefined || limit === undefined || limit === 0) return undefined;\n\tconst resetsAt = asIsoEpochSeconds(row.resetTime);\n\treturn {\n\t\tid: windowId(windowMinutes),\n\t\tlabel,\n\t\tused,\n\t\tremaining: Math.max(0, limit - used),\n\t\tlimit,\n\t\tunit: \"count\",\n\t\twindowMinutes,\n\t\t...(resetsAt !== undefined ? { resetsAt } : {}),\n\t};\n}\n\nfunction parseWindowMinutes(value: unknown): number | undefined {\n\tconst window = asObject(value);\n\tif (!window) return undefined;\n\tconst duration = asPositiveInteger(window.duration);\n\tif (duration === undefined) return undefined;\n\tconst multiplier =\n\t\twindow.timeUnit === \"TIME_UNIT_MINUTE\"\n\t\t\t? 1\n\t\t\t: window.timeUnit === \"TIME_UNIT_HOUR\"\n\t\t\t\t? 60\n\t\t\t\t: window.timeUnit === \"TIME_UNIT_DAY\"\n\t\t\t\t\t? 1_440\n\t\t\t\t\t: window.timeUnit === \"TIME_UNIT_WEEK\"\n\t\t\t\t\t\t? 10_080\n\t\t\t\t\t\t: undefined;\n\tif (multiplier === undefined) return undefined;\n\tconst minutes = duration * multiplier;\n\treturn Number.isSafeInteger(minutes) ? minutes : undefined;\n}\n\nfunction parseBoosterWallet(value: unknown): UsageMetric[] {\n\tconst wallet = asObject(value);\n\tconst balance = asObject(wallet?.balance);\n\tif (!wallet || !balance || balance.type !== \"BOOSTER\") return [];\n\tconst totalRaw = asPositiveInteger(balance.amount);\n\tif (totalRaw === undefined) return [];\n\tconst leftRaw = asNonnegativeInteger(balance.amountLeft) ?? 0;\n\tconst monthlyLimit = parseMoney(wallet.monthlyChargeLimit);\n\tconst monthlyUsed = parseMoney(wallet.monthlyUsed);\n\tconst currencies = new Set(\n\t\t[monthlyLimit?.currency, monthlyUsed?.currency].filter(\n\t\t\t(currency): currency is string => currency !== undefined,\n\t\t),\n\t);\n\tif (currencies.size !== 1) return [];\n\tconst currency = currencies.values().next().value;\n\tif (!currency) return [];\n\tconst total = fixedPointToMajor(totalRaw);\n\tconst left = fixedPointToMajor(leftRaw);\n\tif (total === undefined || left === undefined) return [];\n\n\tconst metrics: UsageMetric[] = [\n\t\t{ id: \"booster-balance\", label: \"Balance\", value: left, unit: \"currency\", currency },\n\t\t{ id: \"booster-total\", label: \"Total balance\", value: total, unit: \"currency\", currency },\n\t];\n\tif (monthlyUsed) {\n\t\tmetrics.push({\n\t\t\tid: \"booster-monthly-used\",\n\t\t\tlabel: \"Used this month\",\n\t\t\tvalue: monthlyUsed.cents / 100,\n\t\t\tunit: \"currency\",\n\t\t\tcurrency,\n\t\t});\n\t}\n\tif (wallet.monthlyChargeLimitEnabled === false) {\n\t\tmetrics.push({\n\t\t\tid: \"booster-monthly-limit\",\n\t\t\tlabel: \"Monthly limit\",\n\t\t\tvalue: \"unlimited\",\n\t\t\tunit: \"currency\",\n\t\t\tcurrency,\n\t\t});\n\t} else if (wallet.monthlyChargeLimitEnabled === true && monthlyLimit) {\n\t\tmetrics.push({\n\t\t\tid: \"booster-monthly-limit\",\n\t\t\tlabel: \"Monthly limit\",\n\t\t\tvalue: monthlyLimit.cents / 100,\n\t\t\tunit: \"currency\",\n\t\t\tcurrency,\n\t\t});\n\t}\n\treturn metrics;\n}\n\nfunction parseMoney(value: unknown): { cents: number; currency: string } | undefined {\n\tconst money = asObject(value);\n\tif (!money) return undefined;\n\tconst cents = asNonnegativeInteger(money.priceInCents);\n\tif (cents === undefined) return undefined;\n\tconst currency = asCurrency(money.currency);\n\tif (!currency) return undefined;\n\treturn { cents, currency };\n}\n\nfunction fixedPointToMajor(value: number): number | undefined {\n\tconst cents = value / FIXED_POINT_UNITS_PER_CENT;\n\tconst roundedCents = cents > 0 && cents < 1 ? 1 : Math.round(cents);\n\tconst major = roundedCents / 100;\n\treturn Number.isSafeInteger(roundedCents) && Number.isFinite(major) ? major : undefined;\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\treturn value as Record<string, unknown>;\n}\n\nfunction asNonnegativeInteger(value: unknown): number | undefined {\n\tif (typeof value === \"string\" && !/^\\d+$/u.test(value)) return undefined;\n\tconst number = typeof value === \"string\" ? Number(value) : value;\n\tif (typeof number !== \"number\" || !Number.isSafeInteger(number) || number < 0) return undefined;\n\treturn number;\n}\n\nfunction asPositiveInteger(value: unknown): number | undefined {\n\tconst number = asNonnegativeInteger(value);\n\treturn number !== undefined && number > 0 ? number : undefined;\n}\n\nfunction asIsoEpochSeconds(value: unknown): number | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\tconst match =\n\t\t/^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(?:\\.\\d+)?(?:Z|([+-])(\\d{2}):(\\d{2}))$/u.exec(\n\t\t\tvalue,\n\t\t);\n\tif (!match) return undefined;\n\tconst [\n\t\t,\n\t\tyearText,\n\t\tmonthText,\n\t\tdayText,\n\t\thourText,\n\t\tminuteText,\n\t\tsecondText,\n\t\t,\n\t\toffsetHour,\n\t\toffsetMinute,\n\t] = match;\n\tconst year = Number(yearText);\n\tconst month = Number(monthText);\n\tconst day = Number(dayText);\n\tconst hour = Number(hourText);\n\tconst minute = Number(minuteText);\n\tconst second = Number(secondText);\n\tif (\n\t\tmonth < 1 ||\n\t\tmonth > 12 ||\n\t\tday < 1 ||\n\t\tday > new Date(Date.UTC(year, month, 0)).getUTCDate() ||\n\t\thour > 23 ||\n\t\tminute > 59 ||\n\t\tsecond > 59 ||\n\t\t(offsetHour !== undefined && Number(offsetHour) > 23) ||\n\t\t(offsetMinute !== undefined && Number(offsetMinute) > 59)\n\t) {\n\t\treturn undefined;\n\t}\n\tconst millis = Date.parse(value);\n\treturn Number.isFinite(millis) && millis >= 0 ? Math.floor(millis / 1000) : undefined;\n}\n\nfunction sanitizedLabel(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\treturn sanitizeDisplayText(value, 80) || undefined;\n}\n\nfunction asCurrency(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\tconst currency = sanitizeDisplayText(value, 3).toUpperCase();\n\treturn /^[A-Z]{3}$/u.test(currency) ? currency : undefined;\n}\n\nfunction windowId(minutes: number): string {\n\tif (minutes === FIVE_HOUR_WINDOW_MINUTES) return \"five-hour\";\n\tif (minutes === DAILY_WINDOW_MINUTES) return \"daily\";\n\tif (minutes === WEEKLY_WINDOW_MINUTES) return \"weekly\";\n\treturn `window-${minutes}-minutes`;\n}\n\nfunction defaultWindowLabel(minutes: number): string {\n\tif (minutes === WEEKLY_WINDOW_MINUTES) return \"Weekly window\";\n\tif (minutes % 10_080 === 0) return `${minutes / 10_080}w window`;\n\tif (minutes % 1_440 === 0) return `${minutes / 1_440}d window`;\n\tif (minutes % 60 === 0) return `${minutes / 60}h window`;\n\treturn `${minutes}m window`;\n}\n", "import { sanitizeDisplayText } from \"../core.js\";\nimport type { OpenCodeZenPayload, UsageBucket, UsageReport } from \"../types.js\";\n\nconst ZEN_WINDOWS = [\n\t{ key: \"rolling\", label: \"Rolling\" },\n\t{ key: \"weekly\", label: \"Weekly\" },\n\t{ key: \"monthly\", label: \"Monthly\" },\n] as const;\n\nexport function normalizeOpenCodeZenPayload(\n\tpayload: OpenCodeZenPayload,\n\tcapturedAt: number,\n): UsageReport {\n\tconst usage = asObject(payload.usage);\n\tif (!usage) throw new Error(\"OpenCode Zen usage response was not an object.\");\n\n\tconst buckets: UsageBucket[] = [];\n\tconst notes: string[] = [];\n\tfor (const window of ZEN_WINDOWS) {\n\t\tconst raw = asObject(usage[window.key]);\n\t\tif (!raw) continue;\n\t\tconst status = asString(raw.status);\n\t\tif (status !== \"ok\" && status !== \"rate-limited\") {\n\t\t\tnotes.push(`${window.label} window unavailable (${status ?? \"unknown status\"}).`);\n\t\t\tcontinue;\n\t\t}\n\t\tconst used = asNonnegativeNumber(raw.percent);\n\t\tif (used === undefined) continue;\n\t\tconst resetsAt = asEpochSeconds(raw.resetsAt);\n\t\tbuckets.push({\n\t\t\tid: window.key,\n\t\t\tlabel: `${window.label} window`,\n\t\t\tused,\n\t\t\tremaining: 100 - clampPercent(used),\n\t\t\tlimit: 100,\n\t\t\tunit: \"percent\",\n\t\t\t...(resetsAt !== undefined ? { resetsAt } : {}),\n\t\t});\n\t}\n\tif (buckets.length === 0) {\n\t\tthrow new Error(\"OpenCode Zen usage endpoint returned no displayable usage data.\");\n\t}\n\n\treturn {\n\t\tproviderId: \"opencode-go\",\n\t\tproviderName: \"OpenCode Go\",\n\t\tcapturedAt,\n\t\tsource: \"opencode-zen-usage\",\n\t\tsemantics: {\n\t\t\tkind: \"consumer-subscription\",\n\t\t\tlabel: \"OpenCode Zen plan usage\",\n\t\t},\n\t\tbuckets,\n\t\tmetrics: [],\n\t\t...(notes.length > 0 ? { notes } : {}),\n\t};\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\treturn value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\treturn sanitizeDisplayText(value, 80) || undefined;\n}\n\nfunction asNonnegativeNumber(value: unknown): number | undefined {\n\tif (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) return undefined;\n\treturn value;\n}\n\nfunction asEpochSeconds(value: unknown): number | undefined {\n\tif (typeof value !== \"string\" || !value.trim()) return undefined;\n\tconst parsed = Date.parse(value);\n\tif (Number.isNaN(parsed)) return undefined;\n\treturn Math.floor(parsed / 1000);\n}\n\nfunction clampPercent(value: number): number {\n\treturn 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(\n\tpayload: OpenRouterKeyPayload,\n\tcapturedAt: number,\n): UsageReport {\n\tconst data = asObject(payload.data);\n\tif (!data) throw new Error(\"OpenRouter key response data was not an object.\");\n\n\tconst limit = asNonnegativeNumber(data.limit);\n\tconst remaining = asNonnegativeNumber(data.limit_remaining);\n\tconst period = asString(data.limit_reset);\n\tconst totalUsage = asNonnegativeNumber(data.usage);\n\tconst buckets: UsageBucket[] = [];\n\tif (limit !== undefined) {\n\t\tbuckets.push({\n\t\t\tid: \"key-limit\",\n\t\t\tlabel: \"Key limit\",\n\t\t\t...(remaining !== undefined ? { used: Math.max(0, limit - remaining), remaining } : {}),\n\t\t\tlimit,\n\t\t\tunit: \"usd\",\n\t\t\t...(period ? { period } : {}),\n\t\t});\n\t}\n\n\tconst metrics: UsageMetric[] = [];\n\taddUsageMetric(metrics, \"usage-daily\", \"Usage today\", data.usage_daily);\n\taddUsageMetric(metrics, \"usage-weekly\", \"Usage this week\", data.usage_weekly);\n\taddUsageMetric(metrics, \"usage-monthly\", \"Usage this month\", data.usage_monthly);\n\taddUsageMetric(metrics, \"usage-total\", \"All-time usage\", totalUsage);\n\tif (buckets.length === 0 && metrics.length === 0) {\n\t\tthrow new Error(\"OpenRouter key response returned no displayable usage data.\");\n\t}\n\n\tconst notes: string[] = [];\n\tif (data.limit === null) notes.push(\"No per-key spend cap\");\n\telse if (limit === undefined) notes.push(\"Per-key spend cap unavailable\");\n\tif (data.is_free_tier === true) notes.push(\"Free-tier API key\");\n\n\treturn {\n\t\tproviderId: \"openrouter\",\n\t\tproviderName: \"OpenRouter\",\n\t\tcapturedAt,\n\t\tsource: \"openrouter-key\",\n\t\tsemantics: { kind: \"api-key\", label: \"API-key spend limits\" },\n\t\taccountLabel: asString(data.label),\n\t\tbuckets,\n\t\tmetrics,\n\t\t...(notes.length > 0 ? { notes } : {}),\n\t};\n}\n\nfunction addUsageMetric(metrics: UsageMetric[], id: string, label: string, value: unknown): void {\n\tconst amount = typeof value === \"number\" ? asNonnegativeNumber(value) : undefined;\n\tif (amount === undefined) return;\n\tmetrics.push({ id, label, value: amount, unit: \"usd\" });\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\treturn value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\treturn sanitizeDisplayText(value, 80) || undefined;\n}\n\nfunction asNonnegativeNumber(value: unknown): number | undefined {\n\tif (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) return undefined;\n\treturn 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\tpayload: XaiBillingPayload,\n\tsubscriptionTier: unknown,\n\tcapturedAt: number,\n): UsageReport {\n\tconst configValue = payload.config;\n\tif (configValue !== null && configValue !== undefined && !isRecord(configValue)) {\n\t\tthrow new Error(\"xAI billing response config was not an object or null.\");\n\t}\n\tconst config = isRecord(configValue) ? configValue : undefined;\n\tconst buckets: UsageBucket[] = [];\n\tconst metrics: UsageMetric[] = [];\n\tconst notes: string[] = [];\n\n\tif (config) {\n\t\tconst period = normalizePeriod(\n\t\t\tconfig.currentPeriod,\n\t\t\tconfig.billingPeriodStart,\n\t\t\tconfig.billingPeriodEnd,\n\t\t);\n\t\tconst preferredPercent = optionalPercent(config.creditUsagePercent, \"creditUsagePercent\");\n\t\tif (preferredPercent !== undefined) {\n\t\t\tbuckets.push({\n\t\t\t\tid: \"included-allowance\",\n\t\t\t\tlabel: \"Included allowance\",\n\t\t\t\tused: preferredPercent,\n\t\t\t\tremaining: 100 - preferredPercent,\n\t\t\t\tunit: \"percent\",\n\t\t\t\t...period,\n\t\t\t});\n\t\t} else {\n\t\t\tconst limit = optionalUsd(config.monthlyLimit, \"monthlyLimit\");\n\t\t\tconst used = optionalUsd(config.used, \"used\");\n\t\t\tif (limit !== undefined || used !== undefined) {\n\t\t\t\tbuckets.push({\n\t\t\t\t\tid: \"included-allowance\",\n\t\t\t\t\tlabel: \"Included allowance\",\n\t\t\t\t\t...(limit !== undefined ? { limit } : {}),\n\t\t\t\t\t...(used !== undefined ? { used } : {}),\n\t\t\t\t\t...(limit !== undefined && used !== undefined ? { remaining: limit - used } : {}),\n\t\t\t\t\tunit: \"usd\",\n\t\t\t\t\t...period,\n\t\t\t\t});\n\t\t\t} else if (period.period || period.resetsAt !== undefined) {\n\t\t\t\tbuckets.push({\n\t\t\t\t\tid: \"included-allowance\",\n\t\t\t\t\tlabel: \"Included allowance\",\n\t\t\t\t\tunit: \"percent\",\n\t\t\t\t\t...period,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst onDemandCap = optionalUsd(config.onDemandCap, \"onDemandCap\");\n\t\tconst onDemandUsed = optionalUsd(config.onDemandUsed, \"onDemandUsed\");\n\t\tif (onDemandCap !== undefined || onDemandUsed !== undefined) {\n\t\t\tbuckets.push({\n\t\t\t\tid: \"on-demand\",\n\t\t\t\tlabel: \"On-demand usage\",\n\t\t\t\t...(onDemandCap !== undefined ? { limit: onDemandCap } : {}),\n\t\t\t\t...(onDemandUsed !== undefined ? { used: onDemandUsed } : {}),\n\t\t\t\t...(onDemandCap !== undefined && onDemandUsed !== undefined\n\t\t\t\t\t? { remaining: onDemandCap - onDemandUsed }\n\t\t\t\t\t: {}),\n\t\t\t\tunit: \"usd\",\n\t\t\t});\n\t\t}\n\n\t\tconst prepaidBalance = optionalUsd(config.prepaidBalance, \"prepaidBalance\");\n\t\tif (prepaidBalance !== undefined) {\n\t\t\tmetrics.push({\n\t\t\t\tid: \"prepaid-balance\",\n\t\t\t\tlabel: \"Prepaid balance\",\n\t\t\t\tvalue: prepaidBalance,\n\t\t\t\tunit: \"usd\",\n\t\t\t});\n\t\t}\n\t}\n\n\tconst tier = optionalTier(subscriptionTier);\n\tif (tier) metrics.push({ id: \"subscription-tier\", label: \"Plan tier\", value: tier });\n\tif (!config) notes.push(\"No xAI consumer billing configuration is available for this account.\");\n\telse if (buckets.length === 0 && metrics.length === 0) {\n\t\tnotes.push(\"The xAI consumer billing response contained no displayable usage fields.\");\n\t}\n\n\treturn {\n\t\tproviderId: \"xai\",\n\t\tproviderName: \"xAI\",\n\t\tcapturedAt,\n\t\tsource: \"cli-chat-proxy.grok.com consumer billing\",\n\t\tsemantics: {\n\t\t\tkind: \"consumer-subscription\",\n\t\t\tlabel: \"xAI consumer subscription usage\",\n\t\t},\n\t\tbuckets,\n\t\tmetrics,\n\t\t...(notes.length > 0 ? { notes } : {}),\n\t};\n}\n\nfunction normalizePeriod(\n\tcurrentPeriod: unknown,\n\tlegacyStart: unknown,\n\tlegacyEnd: unknown,\n): Pick<UsageBucket, \"period\" | \"resetsAt\"> {\n\tif (currentPeriod !== undefined && currentPeriod !== null && !isRecord(currentPeriod)) {\n\t\tthrow new Error(\"xAI billing currentPeriod was not an object or null.\");\n\t}\n\tif (isRecord(currentPeriod)) {\n\t\tconst type = optionalString(currentPeriod.type, \"currentPeriod.type\");\n\t\tconst start = optionalTimestamp(currentPeriod.start, \"currentPeriod.start\");\n\t\tconst end = optionalTimestamp(currentPeriod.end, \"currentPeriod.end\");\n\t\treturn {\n\t\t\t...(periodLabel(type, start) ? { period: periodLabel(type, start) } : {}),\n\t\t\t...(end !== undefined ? { resetsAt: end } : {}),\n\t\t};\n\t}\n\tconst start = optionalTimestamp(legacyStart, \"billingPeriodStart\");\n\tconst end = optionalTimestamp(legacyEnd, \"billingPeriodEnd\");\n\treturn {\n\t\t...(start !== undefined ? { period: \"Monthly\" } : {}),\n\t\t...(end !== undefined ? { resetsAt: end } : {}),\n\t};\n}\n\nfunction periodLabel(type: string | undefined, start: number | undefined): string | undefined {\n\tif (type === \"USAGE_PERIOD_TYPE_WEEKLY\") return \"Weekly\";\n\tif (type === \"USAGE_PERIOD_TYPE_MONTHLY\") return \"Monthly\";\n\tif (type)\n\t\treturn sanitizeDisplayText(type.replace(/^USAGE_PERIOD_TYPE_/u, \"\").replaceAll(\"_\", \" \"), 40);\n\treturn start === undefined ? undefined : \"Current period\";\n}\n\nfunction optionalUsd(value: unknown, field: string): number | undefined {\n\tif (value === undefined || value === null) return undefined;\n\tif (!isRecord(value)) throw new Error(`xAI billing ${field} was not a cent wrapper.`);\n\tconst cents = value.val === undefined ? 0 : value.val;\n\tif (!Number.isSafeInteger(cents) || Math.abs(cents as number) > MAX_SAFE_CENTS) {\n\t\tthrow new Error(`xAI billing ${field}.val was not a safe signed integer.`);\n\t}\n\treturn (cents as number) / 100;\n}\n\nfunction optionalPercent(value: unknown, field: string): number | undefined {\n\tif (value === undefined || value === null) return undefined;\n\tif (typeof value !== \"number\" || !Number.isFinite(value) || value < 0 || value > 100) {\n\t\tthrow new Error(`xAI billing ${field} was outside 0\u2013100.`);\n\t}\n\treturn value;\n}\n\nfunction optionalTimestamp(value: unknown, field: string): number | undefined {\n\tif (value === undefined || value === null) return undefined;\n\tif (typeof value !== \"string\" || value.length > 80) {\n\t\tthrow new Error(`xAI billing ${field} was not a bounded timestamp.`);\n\t}\n\tconst milliseconds = Date.parse(value);\n\tif (!Number.isFinite(milliseconds)) throw new Error(`xAI billing ${field} was invalid.`);\n\treturn Math.floor(milliseconds / 1000);\n}\n\nfunction optionalString(value: unknown, field: string): string | undefined {\n\tif (value === undefined || value === null) return undefined;\n\tif (typeof value !== \"string\" || value.length > 80) {\n\t\tthrow new Error(`xAI billing ${field} was not a bounded string.`);\n\t}\n\treturn value;\n}\n\nfunction optionalTier(value: unknown): string | undefined {\n\tif (value === undefined || value === null) return undefined;\n\tif (typeof value !== \"string\" || value.length > 160) {\n\t\tthrow new Error(\"xAI subscription tier was not a bounded string or null.\");\n\t}\n\treturn sanitizeDisplayText(value, 80) || undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n", "import { sanitizeDisplayText } from \"../core.js\";\nimport type { UsageBucket, UsageMetric, UsageReport, ZaiQuotaPayload } from \"../types.js\";\n\nconst FIVE_HOUR_WINDOW_MINUTES = 300;\nconst WEEKLY_WINDOW_MINUTES = 10_080;\n\nexport function normalizeZaiQuotaPayload(\n\tproviderId: string,\n\tproviderName: string,\n\tpayload: ZaiQuotaPayload,\n\tcapturedAt: number,\n): UsageReport {\n\tconst data = asObject(payload.data);\n\tif (!data) throw new Error(\"Z.AI quota response data was not an object.\");\n\tconst limits = Array.isArray(data.limits) ? (data.limits as unknown[]) : [];\n\n\tconst buckets: UsageBucket[] = [];\n\tconst metrics: UsageMetric[] = [];\n\tfor (const raw of limits) {\n\t\tconst limit = asObject(raw);\n\t\tif (!limit) continue;\n\t\tconst type = asString(limit.type);\n\t\tconst unit = asNonnegativeNumber(limit.unit);\n\t\tconst isPlanUsage = type === \"TOKENS_LIMIT\" || type === \"CREDIT_LIMIT\";\n\t\tif (type === \"TIME_LIMIT\") {\n\t\t\taddCountBucket(buckets, limit, \"mcp-monthly\", \"MCP monthly allowance\");\n\t\t\taddUsageDetailMetrics(metrics, limit.usageDetails);\n\t\t} else if (isPlanUsage && unit === 3) {\n\t\t\taddPercentBucket(buckets, limit, \"five-hour\", \"5h window\", FIVE_HOUR_WINDOW_MINUTES);\n\t\t} else if (isPlanUsage && unit === 6) {\n\t\t\tconst used = asNonnegativeNumber(limit.currentValue);\n\t\t\tconst quota = asNonnegativeNumber(limit.usage);\n\t\t\tif (used !== undefined && quota !== undefined) {\n\t\t\t\taddCountBucket(buckets, limit, \"weekly\", \"Weekly window\", WEEKLY_WINDOW_MINUTES);\n\t\t\t} else {\n\t\t\t\taddPercentBucket(buckets, limit, \"weekly\", \"Weekly window\", WEEKLY_WINDOW_MINUTES);\n\t\t\t}\n\t\t}\n\t}\n\tif (buckets.length === 0) {\n\t\tthrow new Error(\"Z.AI quota endpoint returned no displayable usage data.\");\n\t}\n\n\tconst notes: string[] = [];\n\tconst level = asString(data.level);\n\tif (level) notes.push(`Plan: ${level}`);\n\n\treturn {\n\t\tproviderId,\n\t\tproviderName,\n\t\tcapturedAt,\n\t\tsource: \"zai-quota\",\n\t\tsemantics: { kind: \"consumer-subscription\", label: \"GLM Coding Plan usage\" },\n\t\tbuckets,\n\t\tmetrics,\n\t\t...(notes.length > 0 ? { notes } : {}),\n\t};\n}\n\nfunction addPercentBucket(\n\tbuckets: UsageBucket[],\n\tlimit: Record<string, unknown>,\n\tid: string,\n\tlabel: string,\n\twindowMinutes: number,\n): void {\n\tconst used = asNonnegativeNumber(limit.percentage);\n\tif (used === undefined) return;\n\tconst percent = clampPercent(used);\n\tconst resetsAt = asEpochSeconds(limit.nextResetTime);\n\tbuckets.push({\n\t\tid,\n\t\tlabel,\n\t\tused: percent,\n\t\tremaining: 100 - percent,\n\t\tlimit: 100,\n\t\tunit: \"percent\",\n\t\twindowMinutes,\n\t\t...(resetsAt !== undefined ? { resetsAt } : {}),\n\t});\n}\n\nfunction addCountBucket(\n\tbuckets: UsageBucket[],\n\tlimit: Record<string, unknown>,\n\tid: string,\n\tlabel: string,\n\twindowMinutes?: number,\n): void {\n\tconst used = asNonnegativeNumber(limit.currentValue);\n\tconst quota = asNonnegativeNumber(limit.usage);\n\tif (used === undefined || quota === undefined) return;\n\tconst resetsAt = asEpochSeconds(limit.nextResetTime);\n\tbuckets.push({\n\t\tid,\n\t\tlabel,\n\t\tused,\n\t\tremaining: Math.max(0, quota - used),\n\t\tlimit: quota,\n\t\tunit: \"count\",\n\t\t...(windowMinutes !== undefined ? { windowMinutes } : {}),\n\t\t...(resetsAt !== undefined ? { resetsAt } : {}),\n\t});\n}\n\nfunction addUsageDetailMetrics(metrics: UsageMetric[], value: unknown): void {\n\tif (!Array.isArray(value)) return;\n\tfor (const raw of value) {\n\t\tconst detail = asObject(raw);\n\t\tif (!detail) continue;\n\t\tconst label = asString(detail.modelCode);\n\t\tconst usage = asNonnegativeNumber(detail.usage);\n\t\tif (!label || usage === undefined) continue;\n\t\tmetrics.push({ id: `mcp-${kebabCase(label)}`, label, value: usage, unit: \"count\" });\n\t}\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\treturn value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\treturn sanitizeDisplayText(value, 80) || undefined;\n}\n\nfunction asNonnegativeNumber(value: unknown): number | undefined {\n\tif (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) return undefined;\n\treturn value;\n}\n\nfunction asEpochSeconds(value: unknown): number | undefined {\n\tconst millis = asNonnegativeNumber(value);\n\tif (millis === undefined) return undefined;\n\treturn Math.floor(millis / 1000);\n}\n\nfunction kebabCase(label: string): string {\n\treturn (\n\t\tlabel\n\t\t\t.toLowerCase()\n\t\t\t.replace(/[^a-z0-9]+/gu, \"-\")\n\t\t\t.replace(/^-+|-+$/gu, \"\") || \"tool\"\n\t);\n}\n\nfunction clampPercent(value: number): number {\n\treturn Math.min(100, Math.max(0, value));\n}\n", "import type {\n\tProviderUsageState,\n\tUsageBucket,\n\tUsageDisplayState,\n\tUsageModel,\n\tUsageReport,\n} from \"./types.js\";\n\nconst BAR_SEGMENTS = 20;\nconst VALUE_COLUMN = 29;\n\nexport function formatUsageReport(report: UsageReport, displayState: UsageDisplayState): string {\n\tconst stateLabel = displayState === \"current\" ? \"Current\" : \"Configured\";\n\tconst lines = [`${report.providerName} Usage \u00B7 ${stateLabel}`];\n\tif (report.accountLabel) lines.push(`Account: ${report.accountLabel}`);\n\tlines.push(`Semantics: ${report.semantics.label}`, \"\");\n\n\tif (report.providerId === \"openai-codex\") formatCodexReport(lines, report);\n\telse if (report.providerId === \"github-copilot\") formatGitHubCopilotReport(lines, report);\n\telse if (report.providerId === \"openrouter\") formatOpenRouterReport(lines, report);\n\telse if (report.providerId === \"opencode-go\") formatOpenCodeZenReport(lines, report);\n\telse if (report.providerId === \"kimi-coding\") formatKimiCodingReport(lines, report);\n\telse if (report.providerId === \"xai\") formatXaiReport(lines, report);\n\telse if (report.providerId === \"zai\" || report.providerId === \"zai-coding-cn\") {\n\t\tformatZaiReport(lines, report);\n\t} else formatGenericReport(lines, report);\n\n\tif (report.notes) {\n\t\tfor (const note of report.notes) lines.push(note);\n\t}\n\treturn lines.join(\"\\n\").trimEnd();\n}\n\nexport function formatUsageStatusline(report: UsageReport, model?: UsageModel): string | undefined {\n\tif (report.providerId === \"openai-codex\") return formatCodexStatusline(report, model);\n\tif (report.providerId === \"github-copilot\") return formatGitHubCopilotStatusline(report);\n\tif (report.providerId === \"openrouter\") {\n\t\tconst limit = report.buckets.find((bucket) => bucket.id === \"key-limit\");\n\t\tif (limit?.remaining !== undefined) return `openrouter ${formatUsd(limit.remaining)} left`;\n\t\tconst total = report.metrics.find((metric) => metric.id === \"usage-total\");\n\t\tif (typeof total?.value === \"number\") return `openrouter ${formatUsd(total.value)} used`;\n\t}\n\tif (report.providerId === \"opencode-go\") return formatOpenCodeZenStatusline(report);\n\tif (report.providerId === \"kimi-coding\") return formatKimiCodingStatusline(report);\n\treturn undefined;\n}\n\nexport function formatProviderStates(states: readonly ProviderUsageState[]): string {\n\treturn states\n\t\t.map((state) => {\n\t\t\tif (state.status === \"ready\") return formatUsageReport(state.report, state.displayState);\n\t\t\tconst label = state.displayState === \"current\" ? \"Current\" : \"Configured\";\n\t\t\tconst status =\n\t\t\t\tstate.status === \"auth-unavailable\"\n\t\t\t\t\t? \"Authentication unavailable\"\n\t\t\t\t\t: state.status === \"unsupported\"\n\t\t\t\t\t\t? \"Unsupported\"\n\t\t\t\t\t\t: \"Query failed\";\n\t\t\treturn `${state.providerName} \u00B7 ${label}\\n${status}: ${state.message}`;\n\t\t})\n\t\t.join(\"\\n\\n\");\n}\n\nfunction formatCodexReport(lines: string[], report: UsageReport): void {\n\tlet previousGroup: string | undefined;\n\tfor (const bucket of report.buckets) {\n\t\tconst group = bucket.groupId ?? bucket.id;\n\t\tif (group !== previousGroup && group !== \"codex\") {\n\t\t\tlines.push(`${bucket.groupLabel ?? group} limit:`);\n\t\t}\n\t\tpreviousGroup = group;\n\t\tconst fallback = bucket.id.endsWith(\":secondary\") ? \"weekly\" : \"5h\";\n\t\tconst label = `${formatWindowLabel(bucket.windowMinutes, fallback, false)} limit:`;\n\t\tlines.push(`${label.padEnd(VALUE_COLUMN)}${formatPercentBucket(bucket)}`);\n\t}\n\tfor (const metric of report.metrics) {\n\t\tif (metric.id === \"reset-credits\") {\n\t\t\tlines.push(`${\"Usage limit resets:\".padEnd(VALUE_COLUMN)}${metric.value} available`);\n\t\t} else if (metric.id === \"credits\") {\n\t\t\tlines.push(\n\t\t\t\t`${\"Credits:\".padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\nfunction formatGitHubCopilotReport(lines: string[], report: UsageReport): void {\n\tconst quota = findGitHubCopilotQuota(report);\n\tif (!quota || quota.limit === undefined || quota.remaining === undefined) {\n\t\tlines.push(`${`${quota?.label ?? \"Copilot quota\"}:`.padEnd(VALUE_COLUMN)}unlimited`);\n\t\treturn;\n\t}\n\tconst percent = percentRemaining(quota);\n\tconst reset = quota.resetsAt ? ` (resets ${formatReset(quota.resetsAt)})` : \"\";\n\tlines.push(\n\t\t`${`${quota.label}:`.padEnd(VALUE_COLUMN)}${quota.remaining} of ${quota.limit} left \u00B7 ${percent}%${reset}`,\n\t);\n\tconst overage = report.metrics.find((metric) => metric.id === \"overage-used\");\n\tif (typeof overage?.value === \"number\" && overage.value > 0) {\n\t\tlines.push(`${\"Additional usage:\".padEnd(VALUE_COLUMN)}${overage.value} ${quota.label}`);\n\t}\n}\n\nfunction formatGitHubCopilotStatusline(report: UsageReport): string {\n\tconst quota = findGitHubCopilotQuota(report);\n\tconst kind = compactGitHubCopilotQuotaKind(quota);\n\tif (!quota || quota.limit === undefined || quota.remaining === undefined) {\n\t\treturn `copilot ${kind} unlimited`;\n\t}\n\tconst overage = report.metrics.find((metric) => metric.id === \"overage-used\");\n\tconst overageSuffix =\n\t\ttypeof overage?.value === \"number\" && overage.value > 0 ? ` +${overage.value} over` : \"\";\n\treturn `copilot ${kind === \"premium\" ? \"\" : `${kind} `}${quota.remaining}/${quota.limit} ${percentRemaining(quota)}%${overageSuffix}`;\n}\n\nfunction findGitHubCopilotQuota(report: UsageReport): UsageBucket | undefined {\n\treturn report.buckets.find((bucket) =>\n\t\t[\"ai-credits\", \"premium-requests\", \"chat-requests\"].includes(bucket.id),\n\t);\n}\n\nfunction compactGitHubCopilotQuotaKind(bucket: UsageBucket | undefined): string {\n\tif (bucket?.id === \"ai-credits\") return \"credits\";\n\tif (bucket?.id === \"chat-requests\") return \"chat\";\n\treturn \"premium\";\n}\n\nfunction percentRemaining(bucket: UsageBucket): number {\n\tif (!bucket.limit || bucket.remaining === undefined) return 0;\n\treturn Math.round(clampPercent((bucket.remaining / bucket.limit) * 100));\n}\n\nfunction formatOpenRouterReport(lines: string[], report: UsageReport): void {\n\tconst limit = report.buckets.find((bucket) => bucket.id === \"key-limit\");\n\tif (limit) {\n\t\tconst period = limit.period ? ` (${limit.period})` : \"\";\n\t\tconst value =\n\t\t\tlimit.remaining === undefined\n\t\t\t\t? `${formatUsd(limit.limit ?? 0)} cap; remaining unavailable`\n\t\t\t\t: `${formatUsd(limit.remaining)} of ${formatUsd(limit.limit ?? 0)} left`;\n\t\tlines.push(`${`Key limit${period}:`.padEnd(VALUE_COLUMN)}${value}`);\n\t}\n\tfor (const metric of report.metrics) {\n\t\tlines.push(\n\t\t\t`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`,\n\t\t);\n\t}\n}\n\nfunction formatOpenCodeZenReport(lines: string[], report: UsageReport): void {\n\tfor (const bucket of report.buckets) {\n\t\tconst reset = bucket.resetsAt ? ` (resets ${formatReset(bucket.resetsAt)})` : \"\";\n\t\tconst used = bucket.used ?? \"unavailable\";\n\t\tlines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${used}% used${reset}`);\n\t}\n}\n\nfunction formatOpenCodeZenStatusline(report: UsageReport): string | undefined {\n\tconst parts = [\"zen\"];\n\tfor (const bucket of report.buckets) {\n\t\tif (bucket.used === undefined) continue;\n\t\tconst compact = bucket.id === \"rolling\" ? \"r\" : bucket.id === \"weekly\" ? \"w\" : \"m\";\n\t\tparts.push(`${clampPercent(bucket.used).toFixed(0)}% ${compact}`);\n\t}\n\treturn parts.length > 1 ? parts.join(\" \") : undefined;\n}\n\nfunction formatKimiCodingReport(lines: string[], report: UsageReport): void {\n\tfor (const bucket of report.buckets) {\n\t\tconst reset = bucket.resetsAt ? ` (resets ${formatReset(bucket.resetsAt)})` : \"\";\n\t\tif (bucket.used === undefined || bucket.limit === undefined) {\n\t\t\tlines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}unavailable${reset}`);\n\t\t\tcontinue;\n\t\t}\n\t\tlines.push(\n\t\t\t`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${bucket.used} of ${bucket.limit} used \u00B7 ${percentRemaining(bucket)}% left${reset}`,\n\t\t);\n\t}\n\tconst balance = report.metrics.find((metric) => metric.id === \"booster-balance\");\n\tconst total = report.metrics.find((metric) => metric.id === \"booster-total\");\n\tconst monthlyUsed = report.metrics.find((metric) => metric.id === \"booster-monthly-used\");\n\tconst monthlyLimit = report.metrics.find((metric) => metric.id === \"booster-monthly-limit\");\n\tif (!balance && !monthlyUsed && !monthlyLimit) return;\n\tlines.push(\"\", \"Extra usage wallet:\");\n\tif (balance) {\n\t\tconst totalSuffix = total ? ` of ${formatCurrencyMetric(total)}` : \"\";\n\t\tlines.push(`${\"Balance:\".padEnd(VALUE_COLUMN)}${formatCurrencyMetric(balance)}${totalSuffix}`);\n\t}\n\tif (monthlyUsed) {\n\t\tlines.push(`${\"Used this month:\".padEnd(VALUE_COLUMN)}${formatCurrencyMetric(monthlyUsed)}`);\n\t}\n\tif (monthlyLimit) {\n\t\tlines.push(`${\"Monthly limit:\".padEnd(VALUE_COLUMN)}${formatCurrencyMetric(monthlyLimit)}`);\n\t}\n}\n\nfunction formatKimiCodingStatusline(report: UsageReport): string | undefined {\n\tconst fiveHour = report.buckets.find((bucket) => bucket.id === \"five-hour\");\n\tconst weekly = report.buckets.find((bucket) => bucket.id === \"weekly\");\n\tconst subWindow = fiveHour ?? report.buckets.find((bucket) => bucket.id !== \"weekly\");\n\tconst selected = [subWindow, weekly].filter(\n\t\t(bucket, index, buckets): bucket is UsageBucket =>\n\t\t\tbucket !== undefined && buckets.indexOf(bucket) === index,\n\t);\n\tconst parts = [\"kimi\"];\n\tfor (const bucket of selected) {\n\t\tif (!bucket.limit || bucket.remaining === undefined) continue;\n\t\tconst fallback = bucket.id === \"weekly\" ? \"weekly\" : \"5h\";\n\t\tparts.push(\n\t\t\t`${percentRemaining(bucket)}% ${formatWindowLabel(bucket.windowMinutes, fallback, true)}`,\n\t\t);\n\t}\n\treturn parts.length > 1 ? parts.join(\" \") : undefined;\n}\n\nfunction formatCurrencyMetric(metric: UsageReport[\"metrics\"][number]): string {\n\tif (typeof metric.value !== \"number\") return String(metric.value);\n\tif (!metric.currency) return \"unavailable\";\n\tif (metric.currency === \"USD\") return `$${metric.value.toFixed(2)}`;\n\tif (metric.currency === \"CNY\") return `\u00A5${metric.value.toFixed(2)}`;\n\treturn `${metric.value.toFixed(2)} ${metric.currency}`;\n}\n\nfunction formatXaiReport(lines: string[], report: UsageReport): void {\n\tconst included = report.buckets.find((bucket) => bucket.id === \"included-allowance\");\n\tif (included) {\n\t\tlet value = \"unavailable\";\n\t\tif (included.unit === \"percent\" && included.used !== undefined) {\n\t\t\tvalue = `${included.used}% used`;\n\t\t\tif (included.remaining !== undefined) value += ` \u00B7 ${included.remaining}% left`;\n\t\t} else if (included.used !== undefined) {\n\t\t\tvalue = `${formatUsd(included.used)} used`;\n\t\t\tif (included.limit !== undefined) value += ` of ${formatUsd(included.limit)}`;\n\t\t} else if (included.limit !== undefined) {\n\t\t\tvalue = `usage unavailable \u00B7 ${formatUsd(included.limit)} limit`;\n\t\t}\n\t\tconst period = included.period ? ` \u00B7 ${included.period}` : \"\";\n\t\tconst reset = included.resetsAt ? ` (resets ${formatReset(included.resetsAt)})` : \"\";\n\t\tlines.push(`${\"Included allowance:\".padEnd(VALUE_COLUMN)}${value}${period}${reset}`);\n\t}\n\tconst onDemand = report.buckets.find((bucket) => bucket.id === \"on-demand\");\n\tif (onDemand) {\n\t\tlet value =\n\t\t\tonDemand.used === undefined ? \"usage unavailable\" : `${formatUsd(onDemand.used)} used`;\n\t\tif (onDemand.limit !== undefined) value += ` of ${formatUsd(onDemand.limit)} cap`;\n\t\tlines.push(`${\"On-demand usage:\".padEnd(VALUE_COLUMN)}${value}`);\n\t}\n\tfor (const metric of report.metrics) {\n\t\tlines.push(\n\t\t\t`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`,\n\t\t);\n\t}\n}\n\nfunction formatZaiReport(lines: string[], report: UsageReport): void {\n\tfor (const bucket of report.buckets) {\n\t\tconst reset = bucket.resetsAt ? ` (resets ${formatReset(bucket.resetsAt)})` : \"\";\n\t\tlet value = \"unavailable\";\n\t\tif (bucket.unit === \"percent\" && bucket.used !== undefined) {\n\t\t\tvalue = `${bucket.used}% used`;\n\t\t\tif (bucket.remaining !== undefined) value += ` \u00B7 ${bucket.remaining}% left`;\n\t\t} else if (bucket.used !== undefined && bucket.limit !== undefined) {\n\t\t\tvalue = `${bucket.used} of ${bucket.limit} used`;\n\t\t\tif (bucket.remaining !== undefined) value += ` \u00B7 ${bucket.remaining} left`;\n\t\t} else if (bucket.used !== undefined) {\n\t\t\tvalue = `${bucket.used} used`;\n\t\t} else if (bucket.remaining !== undefined) {\n\t\t\tvalue = `${bucket.remaining} left`;\n\t\t}\n\t\tlines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${value}${reset}`);\n\t}\n\tfor (const metric of report.metrics) {\n\t\tlines.push(\n\t\t\t`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`,\n\t\t);\n\t}\n}\n\nfunction formatGenericReport(lines: string[], report: UsageReport): void {\n\tfor (const bucket of report.buckets) {\n\t\tlines.push(\n\t\t\t`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(bucket.remaining ?? bucket.used ?? \"unavailable\", bucket.unit)}`,\n\t\t);\n\t}\n\tfor (const metric of report.metrics) {\n\t\tlines.push(\n\t\t\t`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`,\n\t\t);\n\t}\n}\n\nfunction formatCodexStatusline(report: UsageReport, model?: UsageModel): string | undefined {\n\tconst group = selectCodexGroup(report, model);\n\tif (!group) return formatCodexCreditsStatus(report);\n\tconst buckets = report.buckets.filter((bucket) => (bucket.groupId ?? bucket.id) === group);\n\tconst labelBucket = buckets[0];\n\tconst parts = [\n\t\tgroup === \"codex\" ? \"codex\" : `codex ${compactLimitLabel(labelBucket?.groupLabel ?? group)}`,\n\t];\n\tfor (const bucket of buckets) {\n\t\tif (bucket.remaining === undefined) continue;\n\t\tconst fallback = bucket.id.endsWith(\":secondary\") ? \"weekly\" : \"5h\";\n\t\tparts.push(\n\t\t\t`${clampPercent(bucket.remaining).toFixed(0)}% ${formatWindowLabel(bucket.windowMinutes, fallback, true)}`,\n\t\t);\n\t}\n\treturn parts.length > 1 ? parts.join(\" \") : formatCodexCreditsStatus(report);\n}\n\nfunction formatCodexCreditsStatus(report: UsageReport): string {\n\tconst credits = report.metrics.find((metric) => metric.id === \"credits\");\n\tif (!credits) return \"codex usage unavailable\";\n\tif (credits.value === \"none\") return \"codex no credits\";\n\tif (credits.value === \"available\") return \"codex credits available\";\n\tif (credits.value === \"unlimited\") return \"codex credits unlimited\";\n\treturn `codex ${formatMetricValue(credits.value, \"count\")} credits`;\n}\n\nfunction selectCodexGroup(report: UsageReport, model?: UsageModel): string | undefined {\n\tconst groups = [...new Set(report.buckets.map((bucket) => bucket.groupId ?? bucket.id))];\n\tif (model?.provider !== \"openai-codex\") {\n\t\treturn groups.includes(\"codex\") ? \"codex\" : groups[0];\n\t}\n\tconst modelKeys = normalizedModelKeys(model);\n\tfor (const group of groups) {\n\t\tconst bucket = report.buckets.find(\n\t\t\t(candidate) => (candidate.groupId ?? candidate.id) === group,\n\t\t);\n\t\tconst keys = [group, bucket?.groupLabel, ...(bucket?.modelKeys ?? [])]\n\t\t\t.map(normalizeKey)\n\t\t\t.filter((key): key is string => key !== undefined);\n\t\tif (keys.some((key) => modelKeys.has(key))) return group;\n\t}\n\tconst variants = [...modelKeys]\n\t\t.map((key) => key.match(/(?:^|-)codex-(.+)$/)?.[1])\n\t\t.filter((value): value is string => Boolean(value));\n\tfor (const variant of variants) {\n\t\tconst matches = groups.filter((group) => {\n\t\t\tif (group === \"codex\") return false;\n\t\t\tconst key = normalizeKey(group);\n\t\t\treturn key ? normalizedKeyHasToken(key, variant) : false;\n\t\t});\n\t\tif (matches.length === 1) return matches[0];\n\t}\n\treturn groups.includes(\"codex\") ? \"codex\" : groups[0];\n}\n\nfunction normalizedModelKeys(model: UsageModel): Set<string> {\n\tconst keys = new Set<string>();\n\tfor (const value of [model.id, model.name]) {\n\t\tconst key = normalizeKey(value);\n\t\tif (!key) continue;\n\t\tkeys.add(key);\n\t\tconst index = key.indexOf(\"codex\");\n\t\tif (index >= 0) keys.add(key.slice(index));\n\t}\n\treturn keys;\n}\n\nfunction normalizeKey(value: string | undefined): string | undefined {\n\tconst separated = value?.toLowerCase().replace(/[^a-z0-9]+/g, \"-\");\n\tif (!separated) return undefined;\n\tlet start = 0;\n\tlet end = separated.length;\n\twhile (separated[start] === \"-\") start += 1;\n\twhile (end > start && separated[end - 1] === \"-\") end -= 1;\n\treturn separated.slice(start, end) || undefined;\n}\n\nfunction normalizedKeyHasToken(key: string, token: string): boolean {\n\treturn (\n\t\tkey === token ||\n\t\tkey.startsWith(`${token}-`) ||\n\t\tkey.endsWith(`-${token}`) ||\n\t\tkey.includes(`-${token}-`)\n\t);\n}\n\nfunction compactLimitLabel(label: string): string {\n\tconst normalized = label.replace(/[_-]+/g, \" \").trim();\n\tconst codex = /\\bcodex\\s/iu.exec(normalized);\n\tconst suffix = codex ? normalized.slice(codex.index + codex[0].length).trim() : \"\";\n\treturn (suffix || normalized).toLowerCase().replace(/\\s+/g, \" \");\n}\n\nfunction formatPercentBucket(bucket: UsageBucket): string {\n\tconst remaining = clampPercent(bucket.remaining ?? 0);\n\tconst filled = Math.round((remaining / 100) * BAR_SEGMENTS);\n\tconst reset = bucket.resetsAt ? ` (resets ${formatReset(bucket.resetsAt)})` : \"\";\n\treturn `[${\"\u2588\".repeat(filled)}${\"\u2591\".repeat(BAR_SEGMENTS - filled)}] ${remaining.toFixed(0)}% left${reset}`;\n}\n\nfunction formatWindowLabel(\n\tminutes: number | undefined,\n\tfallback: \"5h\" | \"weekly\",\n\tcompact: boolean,\n): string {\n\tif (!minutes || !Number.isFinite(minutes) || minutes <= 0) {\n\t\treturn compact && fallback === \"weekly\" ? \"wk\" : capitalize(fallback);\n\t}\n\tif (minutes === 10_080) return compact ? \"wk\" : \"Weekly\";\n\tif (minutes % 10_080 === 0) return `${minutes / 10_080}w`;\n\tif (minutes % 1_440 === 0) return `${minutes / 1_440}d`;\n\tif (minutes % 60 === 0) return `${minutes / 60}h`;\n\treturn `${minutes}m`;\n}\n\nfunction formatMetricValue(value: number | string, unit: UsageBucket[\"unit\"] | undefined): string {\n\tif (unit === \"usd\" && typeof value === \"number\") return formatUsd(value);\n\treturn String(value);\n}\n\nfunction formatUsd(value: number): string {\n\treturn `$${value.toFixed(2)}`;\n}\n\nfunction formatReset(epochSeconds: number): string {\n\tconst reset = new Date(epochSeconds * 1000);\n\tif (Number.isNaN(reset.getTime())) return \"at an unknown time\";\n\tconst time = `${reset.getHours().toString().padStart(2, \"0\")}:${reset\n\t\t.getMinutes()\n\t\t.toString()\n\t\t.padStart(2, \"0\")}`;\n\tconst now = new Date();\n\tif (reset.toDateString() === now.toDateString()) return time;\n\treturn `${time} on ${reset.getDate()} ${reset.toLocaleDateString(undefined, { month: \"short\" })}`;\n}\n\nfunction capitalize(value: string): string {\n\treturn `${value[0]?.toUpperCase() ?? \"\"}${value.slice(1)}`;\n}\n\nfunction clampPercent(value: number): number {\n\treturn 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\";\n\nexport const USAGE_SETTINGS_FILE = \"pi-usage.json\";\nexport const MAX_USAGE_SETTINGS_BYTES = 64 * 1024;\n\nexport interface UsageSettings {\n\tcodexFastMode: boolean;\n\txaiUsage: boolean;\n}\n\nexport const DEFAULT_USAGE_SETTINGS: Readonly<UsageSettings> = Object.freeze({\n\tcodexFastMode: false,\n\txaiUsage: true,\n});\n\nexport interface UsageSettingsState {\n\tkind: \"missing\" | \"loaded\" | \"invalid\";\n\tpath: string;\n\tsettings: UsageSettings;\n\tdocument?: Record<string, unknown>;\n\tissue?: string;\n}\n\nexport interface UsageSettingsRuntime {\n\tget(): Readonly<UsageSettingsState>;\n\treload(signal?: AbortSignal): Promise<Readonly<UsageSettingsState>>;\n\tupdate(\n\t\tpatch: Partial<UsageSettings>,\n\t\tsignal?: AbortSignal,\n\t): Promise<Readonly<UsageSettingsState>>;\n\tflush(): Promise<void>;\n}\n\ninterface UsageSettingsFileOperations {\n\trename: typeof rename;\n\twriteFile: typeof writeFile;\n}\n\ninterface UsageSettingsRuntimeOptions {\n\toperations?: Partial<UsageSettingsFileOperations>;\n\tpath?: string;\n}\n\nexport function usageSettingsPath(): string {\n\treturn join(getAgentDir(), USAGE_SETTINGS_FILE);\n}\n\nexport function normalizeUsageSettings(value: unknown): UsageSettings | undefined {\n\tif (!isRecord(value)) return undefined;\n\tif (Object.hasOwn(value, \"codexFastMode\") && typeof value.codexFastMode !== \"boolean\") {\n\t\treturn undefined;\n\t}\n\tif (Object.hasOwn(value, \"xaiUsage\") && typeof value.xaiUsage !== \"boolean\") {\n\t\treturn undefined;\n\t}\n\treturn {\n\t\tcodexFastMode:\n\t\t\ttypeof value.codexFastMode === \"boolean\"\n\t\t\t\t? value.codexFastMode\n\t\t\t\t: DEFAULT_USAGE_SETTINGS.codexFastMode,\n\t\txaiUsage:\n\t\t\ttypeof value.xaiUsage === \"boolean\" ? value.xaiUsage : DEFAULT_USAGE_SETTINGS.xaiUsage,\n\t};\n}\n\nexport async function loadUsageSettings(\n\tpath = usageSettingsPath(),\n\tsignal?: AbortSignal,\n): Promise<UsageSettingsState> {\n\tthrowIfAborted(signal);\n\ttry {\n\t\tconst handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);\n\t\tlet text: string;\n\t\ttry {\n\t\t\tconst stats = await handle.stat();\n\t\t\tthrowIfAborted(signal);\n\t\t\tif (!stats.isFile()) throw new Error(\"settings path is not a regular file\");\n\t\t\tif (stats.size > MAX_USAGE_SETTINGS_BYTES) {\n\t\t\t\tthrow new Error(\"settings file exceeds 64 KiB\");\n\t\t\t}\n\t\t\ttext = await handle.readFile(\"utf8\");\n\t\t} finally {\n\t\t\tawait handle.close();\n\t\t}\n\t\tthrowIfAborted(signal);\n\t\tconst document = JSON.parse(text) as unknown;\n\t\tconst settings = normalizeUsageSettings(document);\n\t\tif (!settings || !isRecord(document)) throw new Error(\"invalid settings shape\");\n\t\treturn { kind: \"loaded\", path, settings, document };\n\t} catch (error) {\n\t\tif (signal?.aborted) throw error;\n\t\tif (isNodeError(error) && error.code === \"ENOENT\") {\n\t\t\treturn {\n\t\t\t\tkind: \"missing\",\n\t\t\t\tpath,\n\t\t\t\tsettings: { ...DEFAULT_USAGE_SETTINGS },\n\t\t\t\tdocument: {},\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tkind: \"invalid\",\n\t\t\tpath,\n\t\t\tsettings: { ...DEFAULT_USAGE_SETTINGS },\n\t\t\tissue:\n\t\t\t\tisNodeError(error) && error.code === \"ELOOP\"\n\t\t\t\t\t? \"symbolic links are not accepted\"\n\t\t\t\t\t: error instanceof Error\n\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t: String(error),\n\t\t};\n\t}\n}\n\nexport function createUsageSettingsRuntime(\n\toptions: UsageSettingsRuntimeOptions | string = {},\n): UsageSettingsRuntime {\n\tconst path = typeof options === \"string\" ? options : (options.path ?? usageSettingsPath());\n\tconst operations: UsageSettingsFileOperations = {\n\t\trename,\n\t\twriteFile,\n\t\t...(typeof options === \"string\" ? undefined : options.operations),\n\t};\n\tlet state: UsageSettingsState = {\n\t\tkind: \"missing\",\n\t\tpath,\n\t\tsettings: { ...DEFAULT_USAGE_SETTINGS },\n\t\tdocument: {},\n\t};\n\tlet queue = Promise.resolve();\n\tconst enqueue = <T>(operation: () => Promise<T>): Promise<T> => {\n\t\tconst result = queue.then(operation, operation);\n\t\tqueue = result.then(\n\t\t\t() => undefined,\n\t\t\t() => undefined,\n\t\t);\n\t\treturn result;\n\t};\n\treturn {\n\t\tget: () => structuredClone(state),\n\t\treload: (signal) =>\n\t\t\tenqueue(async () => {\n\t\t\t\tconst loaded = await loadUsageSettings(path, signal);\n\t\t\t\tstate = loaded;\n\t\t\t\treturn structuredClone(state);\n\t\t\t}),\n\t\tupdate: (patch, signal) =>\n\t\t\tenqueue(async () => {\n\t\t\t\tconst saved = await saveUsageSettingsPatch(path, patch, operations, signal);\n\t\t\t\tstate = saved;\n\t\t\t\treturn structuredClone(state);\n\t\t\t}),\n\t\tflush: () => queue,\n\t};\n}\n\nasync function saveUsageSettingsPatch(\n\tpath: string,\n\tpatch: Partial<UsageSettings>,\n\toperations: UsageSettingsFileOperations,\n\tsignal?: AbortSignal,\n): Promise<UsageSettingsState> {\n\tconst latest = await loadUsageSettings(path, signal);\n\tif (latest.kind === \"invalid\") {\n\t\tthrow new Error(\"Cannot overwrite an invalid pi-usage.json; repair it and reload first\");\n\t}\n\tconst document = { ...latest.document, ...patch };\n\tconst settings = normalizeUsageSettings(document);\n\tif (!settings) throw new Error(\"Refusing to save invalid pi-usage settings\");\n\tconst directory = dirname(path);\n\tconst temporaryPath = join(directory, `.${basename(path)}.${randomUUID()}.tmp`);\n\tawait mkdir(directory, { recursive: true, mode: 0o700 });\n\tthrowIfAborted(signal);\n\ttry {\n\t\tawait operations.writeFile(temporaryPath, `${JSON.stringify(document, null, 2)}\\n`, {\n\t\t\tencoding: \"utf8\",\n\t\t\tflag: \"wx\",\n\t\t\tmode: 0o600,\n\t\t});\n\t\tif (process.platform !== \"win32\") await chmodPrivate(temporaryPath);\n\t\tthrowIfAborted(signal);\n\t\tconst current = await loadUsageSettings(path, signal);\n\t\tif (\n\t\t\tcurrent.kind === \"invalid\" ||\n\t\t\tcurrent.kind !== latest.kind ||\n\t\t\tJSON.stringify(current.document) !== JSON.stringify(latest.document)\n\t\t) {\n\t\t\tthrow new Error(\"pi-usage.json changed while saving; retry the action\");\n\t\t}\n\t\tthrowIfAborted(signal);\n\t\tawait operations.rename(temporaryPath, path);\n\t} finally {\n\t\tawait rm(temporaryPath, { force: true }).catch(() => undefined);\n\t}\n\treturn { kind: \"loaded\", path, settings, document };\n}\n\nasync function chmodPrivate(path: string): Promise<void> {\n\tawait chmod(path, 0o600);\n}\n\nfunction throwIfAborted(signal?: AbortSignal): void {\n\tif (signal?.aborted) throw new DOMException(\"Settings operation aborted\", \"AbortError\");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n\treturn error instanceof Error && \"code\" in error;\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 {\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionContext,\n} from \"@earendil-works/pi-coding-agent\";\nimport { FAST_USAGE_WARNING, registerCodexFastMode } from \"./codex-fast-runtime.js\";\nimport {\n\ttype CodexResetAvailability,\n\ttype CodexResetOption,\n\ttype CodexResetOutcome,\n\tcodexResetActionDescription,\n\tcodexResetCount,\n\tconsumeCodexResetCredit,\n\tformatCodexResetOutcome,\n\tgenericCodexResetOption,\n\tlistCodexResetCredits,\n\tresetConfirmationLines,\n\tresetLabel,\n\tresetOptionExpiration,\n\tresolveCodexResetAuth,\n} from \"./codex-resets.js\";\nimport {\n\tabortError,\n\tawaitWithDeadline,\n\terrorMessage,\n\trunWithConcurrency,\n\tUsageCache,\n} from \"./core.js\";\nimport { formatProviderStates, formatUsageStatusline } from \"./format.js\";\nimport { createOAuthCredentialCandidateReader } from \"./oauth-credential-source.js\";\nimport {\n\tadapterForProvider,\n\tisStaleExtensionContextError,\n\tqueryProviderUsage,\n\tresolveUsageAuth,\n} from \"./query.js\";\nimport { createUsageSettingsRuntime, type UsageSettingsRuntime } from \"./settings.js\";\nimport type {\n\tPiModel,\n\tProviderUsageState,\n\tResolvedUsageAuth,\n\tUsageDisplayState,\n\tUsageProviderAdapter,\n} from \"./types.js\";\nimport {\n\tconfiguredAdapters,\n\tisAbortError,\n\tisTimeoutError,\n\tmodelIdentity,\n\tproviderDisplayName,\n\tsetBoundedMap,\n} from \"./usage-helpers.js\";\nimport { showUsageSettings } from \"./usage-settings-ui.js\";\n\nconst CACHE_TTL_MS = 5 * 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\tcredentialReader?: (providerId: string) => unknown;\n\tcreateRedemptionId?: () => string;\n\tsettingsRuntime?: UsageSettingsRuntime;\n};\n\ntype QueryOutcome = {\n\tstate: ProviderUsageState;\n\tfingerprint?: string;\n\tauthState?: \"unavailable\";\n};\n\ntype StableCurrent = {\n\toutcome: QueryOutcome;\n\tmodel: PiModel | undefined;\n};\n\nexport default function usageExtension(\n\tpi: ExtensionAPI,\n\tdependencies: UsageExtensionDependencies = {},\n) {\n\tconst credentialReader = dependencies.credentialReader;\n\tconst credentialCandidates = createOAuthCredentialCandidateReader(pi, credentialReader);\n\tconst createRedemptionId = dependencies.createRedemptionId ?? randomUUID;\n\tconst settingsRuntime = dependencies.settingsRuntime ?? createUsageSettingsRuntime();\n\tconst cache = new UsageCache(CACHE_TTL_MS);\n\tconst failureBackoff = new Map<string, { until: number; message: string }>();\n\tconst latestQueries = new Map<string, number>();\n\tconst activeControllers = new Set<AbortController>();\n\tlet querySequence = 0;\n\tlet activeCurrentIdentity: string | undefined;\n\tlet sessionActive = false;\n\tlet statusGeneration = 0;\n\tlet sessionGeneration = 0;\n\tlet xaiSettingsGeneration = 0;\n\tlet statusRefreshTimer: ReturnType<typeof setTimeout> | undefined;\n\tlet statusController: AbortController | undefined;\n\tlet fastRuntime: ReturnType<typeof registerCodexFastMode>;\n\n\tconst xaiUsageEnabled = () => {\n\t\tconst state = settingsRuntime.get();\n\t\treturn state.kind !== \"invalid\" && state.settings.xaiUsage;\n\t};\n\tconst activeAdapterForProvider = (providerId: string | undefined) =>\n\t\tadapterForProvider(providerId, xaiUsageEnabled());\n\n\tconst clearStatusTimer = () => {\n\t\tif (statusRefreshTimer) clearTimeout(statusRefreshTimer);\n\t\tstatusRefreshTimer = undefined;\n\t};\n\n\tconst safeSetStatus = (ctx: ExtensionContext, value: string | undefined): boolean => {\n\t\ttry {\n\t\t\tctx.ui.setStatus(STATUS_KEY, value);\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\tif (isStaleExtensionContextError(error)) return false;\n\t\t\tthrow error;\n\t\t}\n\t};\n\n\tconst clearStatus = (ctx: ExtensionContext) => {\n\t\tstatusGeneration += 1;\n\t\tstatusController?.abort();\n\t\tstatusController = undefined;\n\t\tclearStatusTimer();\n\t\tsafeSetStatus(ctx, undefined);\n\t};\n\n\tconst scheduleStatusRefresh = (ctx: ExtensionContext, model: PiModel) => {\n\t\tclearStatusTimer();\n\t\tconst generation = statusGeneration;\n\t\tstatusRefreshTimer = setTimeout(() => {\n\t\t\tstatusRefreshTimer = undefined;\n\t\t\tif (!sessionActive || generation !== statusGeneration) return;\n\t\t\tstartStatusRefresh(ctx, model, true);\n\t\t}, CACHE_TTL_MS);\n\t\tstatusRefreshTimer.unref?.();\n\t};\n\n\tconst publishStatus = (\n\t\tctx: ExtensionContext,\n\t\toutcome: QueryOutcome,\n\t\tmodel: PiModel,\n\t\tshouldSchedule: boolean,\n\t) => {\n\t\tif (activeAdapterForProvider(model.provider)?.publishesStatusline === false) {\n\t\t\tclearStatusTimer();\n\t\t\tsafeSetStatus(ctx, undefined);\n\t\t\treturn;\n\t\t}\n\t\tif (outcome.state.status === \"unsupported\") {\n\t\t\tclearStatusTimer();\n\t\t\tsafeSetStatus(ctx, undefined);\n\t\t\treturn;\n\t\t}\n\t\tif (outcome.state.status !== \"ready\") {\n\t\t\tif (\n\t\t\t\tsafeSetStatus(\n\t\t\t\t\tctx,\n\t\t\t\t\toutcome.state.status === \"auth-unavailable\" ? \"auth unavailable\" : \"usage error\",\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tif (shouldSchedule && sessionActive) scheduleStatusRefresh(ctx, model);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tconst rawValue = formatUsageStatusline(outcome.state.report, model);\n\t\tconst value = rawValue ? fastRuntime.decorateStatus(model, rawValue) : undefined;\n\t\tif (!safeSetStatus(ctx, value)) return;\n\t\tif (shouldSchedule && sessionActive) scheduleStatusRefresh(ctx, model);\n\t};\n\n\tconst invalidateProviderState = (providerId: string) => {\n\t\tcache.clearProvider(providerId);\n\t\tfor (const key of failureBackoff.keys()) {\n\t\t\tif (key.startsWith(`${providerId}:`)) failureBackoff.delete(key);\n\t\t}\n\t\tfor (const key of latestQueries.keys()) {\n\t\t\tif (key.startsWith(`${providerId}:`)) latestQueries.delete(key);\n\t\t}\n\t};\n\n\tconst transitionCurrentIdentity = (nextIdentity: string, providerId: string) => {\n\t\tif (!activeCurrentIdentity || activeCurrentIdentity === nextIdentity) {\n\t\t\tactiveCurrentIdentity = nextIdentity;\n\t\t\treturn;\n\t\t}\n\t\tconst previousProviderId = activeCurrentIdentity.split(\":\", 1)[0] ?? \"\";\n\t\tfor (const id of new Set([previousProviderId, providerId])) {\n\t\t\tif (id) invalidateProviderState(id);\n\t\t}\n\t\tactiveCurrentIdentity = nextIdentity;\n\t};\n\n\tconst queryAdapterState = async (\n\t\tctx: ExtensionContext,\n\t\tadapter: UsageProviderAdapter,\n\t\tdisplayState: UsageDisplayState,\n\t\tforce: boolean,\n\t\tsignal: AbortSignal,\n\t): Promise<QueryOutcome> => {\n\t\tconst startedAt = Date.now();\n\t\tconst expectedSessionGeneration = sessionGeneration;\n\t\tconst expectedXaiSettingsGeneration = xaiSettingsGeneration;\n\t\tconst expectedSessionId = ctx.sessionManager.getSessionId();\n\t\tconst expectedModelIdentity = modelIdentity(ctx.model);\n\t\tlet auth: ResolvedUsageAuth | undefined;\n\t\ttry {\n\t\t\tauth = await awaitWithDeadline(\n\t\t\t\tresolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n\t\t\t\tsignal,\n\t\t\t\tDEFAULT_TIMEOUT_MS,\n\t\t\t\t`resolving ${adapter.displayName} runtime auth`,\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tif (isStaleExtensionContextError(error) || isAbortError(error)) throw error;\n\t\t\tif (displayState === \"current\") {\n\t\t\t\ttransitionCurrentIdentity(`${adapter.id}:auth-error`, adapter.id);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\tproviderId: adapter.id,\n\t\t\t\t\tproviderName: adapter.displayName,\n\t\t\t\t\tdisplayState,\n\t\t\t\t\tstatus: isTimeoutError(error) ? \"query-failed\" : \"auth-unavailable\",\n\t\t\t\t\tmessage: errorMessage(error),\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tif (\n\t\t\tadapter.id === \"xai\" &&\n\t\t\t(expectedSessionGeneration !== sessionGeneration ||\n\t\t\t\texpectedXaiSettingsGeneration !== xaiSettingsGeneration ||\n\t\t\t\t!xaiUsageEnabled() ||\n\t\t\t\tctx.sessionManager.getSessionId() !== expectedSessionId ||\n\t\t\t\tmodelIdentity(ctx.model) !== expectedModelIdentity)\n\t\t) {\n\t\t\tthrow abortError();\n\t\t}\n\t\tif (!auth) {\n\t\t\tif (displayState === \"current\") {\n\t\t\t\ttransitionCurrentIdentity(`${adapter.id}:unavailable`, adapter.id);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\tproviderId: adapter.id,\n\t\t\t\t\tproviderName: adapter.displayName,\n\t\t\t\t\tdisplayState,\n\t\t\t\t\tstatus: \"auth-unavailable\",\n\t\t\t\t\tmessage: `No runtime credential is configured for ${adapter.displayName}.`,\n\t\t\t\t},\n\t\t\t\tauthState: \"unavailable\",\n\t\t\t};\n\t\t}\n\t\tif (displayState === \"current\") {\n\t\t\ttransitionCurrentIdentity(`${adapter.id}:${auth.fingerprint}`, adapter.id);\n\t\t}\n\n\t\tconst cached = !force ? cache.get(adapter.id, auth.fingerprint) : undefined;\n\t\tif (cached) {\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\tproviderId: adapter.id,\n\t\t\t\t\tproviderName: adapter.displayName,\n\t\t\t\t\tdisplayState,\n\t\t\t\t\tstatus: \"ready\",\n\t\t\t\t\treport: cached,\n\t\t\t\t},\n\t\t\t\tfingerprint: auth.fingerprint,\n\t\t\t};\n\t\t}\n\n\t\tconst failureKey = `${adapter.id}:${auth.fingerprint}`;\n\t\tconst previousFailure = failureBackoff.get(failureKey);\n\t\tif (!force && previousFailure && previousFailure.until > Date.now()) {\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\tproviderId: adapter.id,\n\t\t\t\t\tproviderName: adapter.displayName,\n\t\t\t\t\tdisplayState,\n\t\t\t\t\tstatus: \"query-failed\",\n\t\t\t\t\tmessage: previousFailure.message,\n\t\t\t\t},\n\t\t\t\tfingerprint: auth.fingerprint,\n\t\t\t};\n\t\t}\n\t\tfailureBackoff.delete(failureKey);\n\t\tquerySequence += 1;\n\t\tconst queryId = querySequence;\n\t\tsetBoundedMap(latestQueries, failureKey, queryId, MAX_ACCOUNT_STATES);\n\n\t\ttry {\n\t\t\tconst remainingMs = Math.max(1, DEFAULT_TIMEOUT_MS - (Date.now() - startedAt));\n\t\t\tconst guard =\n\t\t\t\tadapter.id === \"xai\"\n\t\t\t\t\t? async () => {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tsignal.aborted ||\n\t\t\t\t\t\t\t\texpectedSessionGeneration !== sessionGeneration ||\n\t\t\t\t\t\t\t\texpectedXaiSettingsGeneration !== xaiSettingsGeneration ||\n\t\t\t\t\t\t\t\t!xaiUsageEnabled() ||\n\t\t\t\t\t\t\t\tctx.sessionManager.getSessionId() !== expectedSessionId ||\n\t\t\t\t\t\t\t\tmodelIdentity(ctx.model) !== expectedModelIdentity\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tthrow abortError();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst revalidated = await awaitWithDeadline(\n\t\t\t\t\t\t\t\tresolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\tMath.max(1, DEFAULT_TIMEOUT_MS - (Date.now() - startedAt)),\n\t\t\t\t\t\t\t\t\"revalidating xAI runtime auth\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tsignal.aborted ||\n\t\t\t\t\t\t\t\texpectedSessionGeneration !== sessionGeneration ||\n\t\t\t\t\t\t\t\texpectedXaiSettingsGeneration !== xaiSettingsGeneration ||\n\t\t\t\t\t\t\t\t!xaiUsageEnabled() ||\n\t\t\t\t\t\t\t\tctx.sessionManager.getSessionId() !== expectedSessionId ||\n\t\t\t\t\t\t\t\tmodelIdentity(ctx.model) !== expectedModelIdentity ||\n\t\t\t\t\t\t\t\trevalidated?.fingerprint !== auth.fingerprint\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tthrow abortError();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined;\n\t\t\tconst report = await queryProviderUsage(adapter, auth, signal, remainingMs, guard);\n\t\t\tif (guard) await guard();\n\t\t\tif (latestQueries.get(failureKey) === queryId) {\n\t\t\t\tcache.set(adapter.id, auth.fingerprint, report);\n\t\t\t\tfailureBackoff.delete(failureKey);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\tproviderId: adapter.id,\n\t\t\t\t\tproviderName: adapter.displayName,\n\t\t\t\t\tdisplayState,\n\t\t\t\t\tstatus: \"ready\",\n\t\t\t\t\treport,\n\t\t\t\t},\n\t\t\t\tfingerprint: auth.fingerprint,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tif (isStaleExtensionContextError(error) || isAbortError(error)) throw error;\n\t\t\tconst message = errorMessage(error);\n\t\t\tconst now = Date.now();\n\t\t\tfor (const [key, failure] of failureBackoff) {\n\t\t\t\tif (failure.until <= now) failureBackoff.delete(key);\n\t\t\t}\n\t\t\tif (latestQueries.get(failureKey) === queryId) {\n\t\t\t\tsetBoundedMap(\n\t\t\t\t\tfailureBackoff,\n\t\t\t\t\tfailureKey,\n\t\t\t\t\t{ until: now + FAILURE_BACKOFF_MS, message },\n\t\t\t\t\tMAX_ACCOUNT_STATES,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\tproviderId: adapter.id,\n\t\t\t\t\tproviderName: adapter.displayName,\n\t\t\t\t\tdisplayState,\n\t\t\t\t\tstatus: \"query-failed\",\n\t\t\t\t\tmessage,\n\t\t\t\t},\n\t\t\t\tfingerprint: auth.fingerprint,\n\t\t\t};\n\t\t}\n\t};\n\n\tconst queryCurrentState = async (\n\t\tctx: ExtensionContext,\n\t\tmodel: PiModel | undefined,\n\t\tforce: boolean,\n\t\tsignal: AbortSignal,\n\t): Promise<QueryOutcome> => {\n\t\tconst adapter = activeAdapterForProvider(model?.provider);\n\t\tif (!adapter) {\n\t\t\tconst providerId = model?.provider ?? \"none\";\n\t\t\ttransitionCurrentIdentity(`unsupported:${providerId}`, providerId);\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\tproviderId,\n\t\t\t\t\tproviderName: providerDisplayName(ctx, providerId),\n\t\t\t\t\tdisplayState: \"current\",\n\t\t\t\t\tstatus: \"unsupported\",\n\t\t\t\t\tmessage:\n\t\t\t\t\t\tproviderId === \"xai\" && !xaiUsageEnabled()\n\t\t\t\t\t\t\t? \"xAI usage is disabled. Open Settings to enable it.\"\n\t\t\t\t\t\t\t: model\n\t\t\t\t\t\t\t\t? `Usage reporting is not supported for ${providerDisplayName(ctx, providerId)}.`\n\t\t\t\t\t\t\t\t: \"No model is selected.\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\treturn queryAdapterState(ctx, adapter, \"current\", force, signal);\n\t};\n\n\tconst refreshCurrentStatus = async (\n\t\tctx: ExtensionContext,\n\t\tmodel: PiModel | undefined,\n\t\tforce: boolean,\n\t) => {\n\t\tconst adapter = activeAdapterForProvider(model?.provider);\n\t\tif (!adapter || !model) {\n\t\t\tconst providerId = model?.provider ?? \"none\";\n\t\t\ttransitionCurrentIdentity(`unsupported:${providerId}`, providerId);\n\t\t\tclearStatus(ctx);\n\t\t\treturn;\n\t\t}\n\t\tif (adapter.publishesStatusline === false) {\n\t\t\tclearStatus(ctx);\n\t\t\treturn;\n\t\t}\n\t\tstatusGeneration += 1;\n\t\tconst generation = statusGeneration;\n\t\tstatusController?.abort();\n\t\tconst controller = new AbortController();\n\t\tstatusController = controller;\n\t\tactiveControllers.add(controller);\n\t\ttry {\n\t\t\tif (!safeSetStatus(ctx, \"checking\")) return;\n\t\t\tconst outcome = await queryCurrentState(ctx, model, force, controller.signal);\n\t\t\tif (!sessionActive || generation !== statusGeneration || controller.signal.aborted) return;\n\t\t\tif (!(await outcomeStillCurrent(ctx, model, generation, outcome, controller.signal))) {\n\t\t\t\tif (sessionActive && generation === statusGeneration) {\n\t\t\t\t\tqueueMicrotask(() => startStatusRefresh(ctx, ctx.model, false));\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpublishStatus(ctx, outcome, model, true);\n\t\t} finally {\n\t\t\tactiveControllers.delete(controller);\n\t\t\tif (statusController === controller) statusController = undefined;\n\t\t}\n\t};\n\n\tconst startStatusRefresh = (\n\t\tctx: ExtensionContext,\n\t\tmodel: PiModel | undefined,\n\t\tforce: boolean,\n\t) => {\n\t\tvoid refreshCurrentStatus(ctx, model, force).catch((error) => {\n\t\t\tif (isStaleExtensionContextError(error) || isAbortError(error)) return;\n\t\t\tsafeSetStatus(ctx, \"usage error\");\n\t\t});\n\t};\n\n\tconst runMenuOperation = async <T>(\n\t\tctx: ExtensionCommandContext,\n\t\tlabel: string,\n\t\tparentSignal: AbortSignal,\n\t\toperation: (signal: AbortSignal) => Promise<T>,\n\t\tcancellable = true,\n\t): Promise<T | undefined> => {\n\t\tconst { runTask } = await import(\"@narumitw/pi-tui-kit\");\n\t\tif (parentSignal.aborted) return undefined;\n\t\tconst result = await runTask(ctx, {\n\t\t\tlabel,\n\t\t\tsignal: parentSignal,\n\t\t\tcancellable,\n\t\t\tonError: () => undefined,\n\t\t\ttask: ({ signal }) => operation(signal),\n\t\t});\n\t\tswitch (result.kind) {\n\t\t\tcase \"completed\":\n\t\t\t\treturn result.value;\n\t\t\tcase \"cancelled\":\n\t\t\tcase \"stale\":\n\t\t\t\treturn undefined;\n\t\t\tcase \"error\":\n\t\t\t\tthrow result.error;\n\t\t}\n\t};\n\n\tconst outcomeStillCurrent = async (\n\t\tctx: ExtensionContext,\n\t\tmodel: PiModel | undefined,\n\t\tgeneration: number,\n\t\toutcome: QueryOutcome,\n\t\tsignal: AbortSignal,\n\t): Promise<boolean> => {\n\t\tif (generation !== statusGeneration || modelIdentity(ctx.model) !== modelIdentity(model)) {\n\t\t\treturn false;\n\t\t}\n\t\tconst adapter = activeAdapterForProvider(model?.provider);\n\t\tif (outcome.authState === \"unavailable\") {\n\t\t\tif (!adapter) return false;\n\t\t\ttry {\n\t\t\t\tconst auth = await awaitWithDeadline(\n\t\t\t\t\tresolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n\t\t\t\t\tsignal,\n\t\t\t\t\tDEFAULT_TIMEOUT_MS,\n\t\t\t\t\t`revalidating ${adapter.displayName} runtime auth`,\n\t\t\t\t);\n\t\t\t\treturn (\n\t\t\t\t\tgeneration === statusGeneration &&\n\t\t\t\t\tmodelIdentity(ctx.model) === modelIdentity(model) &&\n\t\t\t\t\tauth === undefined\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\tif (isAbortError(error) || isStaleExtensionContextError(error)) throw error;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\tif (!outcome.fingerprint) return true;\n\t\tif (!adapter) return false;\n\t\ttry {\n\t\t\tconst auth = await awaitWithDeadline(\n\t\t\t\tresolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n\t\t\t\tsignal,\n\t\t\t\tDEFAULT_TIMEOUT_MS,\n\t\t\t\t`revalidating ${adapter.displayName} runtime auth`,\n\t\t\t);\n\t\t\treturn (\n\t\t\t\tgeneration === statusGeneration &&\n\t\t\t\tmodelIdentity(ctx.model) === modelIdentity(model) &&\n\t\t\t\tauth?.fingerprint === outcome.fingerprint\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tif (isAbortError(error) || isStaleExtensionContextError(error)) throw error;\n\t\t\treturn false;\n\t\t}\n\t};\n\n\tconst queryStableCurrent = async (\n\t\tctx: ExtensionCommandContext,\n\t\tforce: boolean,\n\t\tcontroller: AbortController,\n\t\tlabel: string,\n\t): Promise<StableCurrent | undefined> => {\n\t\tfor (let attempt = 0; attempt < 3; attempt += 1) {\n\t\t\tconst model = ctx.model;\n\t\t\tconst generation = statusGeneration;\n\t\t\tconst result = await runMenuOperation(ctx, label, controller.signal, async (signal) => {\n\t\t\t\tconst outcome = await queryCurrentState(ctx, model, force, signal);\n\t\t\t\treturn {\n\t\t\t\t\toutcome,\n\t\t\t\t\tstable: await outcomeStillCurrent(ctx, model, generation, outcome, signal),\n\t\t\t\t};\n\t\t\t});\n\t\t\tif (!result) return undefined;\n\t\t\tif (result.stable) return { outcome: result.outcome, model };\n\t\t\tforce = false;\n\t\t}\n\t\tctx.ui.notify(\"The active model or account kept changing; reopen /usage to retry.\", \"warning\");\n\t\treturn undefined;\n\t};\n\n\tconst publishStableCurrent = (ctx: ExtensionCommandContext, current: StableCurrent) => {\n\t\tif (current.model) publishStatus(ctx, current.outcome, current.model, sessionActive);\n\t\telse safeSetStatus(ctx, undefined);\n\t};\n\n\tconst showMenu = async (ctx: ExtensionCommandContext): Promise<void> => {\n\t\tif (!ctx.hasUI) throw new Error(\"/usage requires TUI or RPC mode.\");\n\t\tstatusGeneration += 1;\n\t\tconst menuGeneration = statusGeneration;\n\t\tstatusController?.abort();\n\t\tstatusController = undefined;\n\t\tclearStatusTimer();\n\t\tconst controller = new AbortController();\n\t\tactiveControllers.add(controller);\n\t\ttry {\n\t\t\tlet stableCurrent = await queryStableCurrent(\n\t\t\t\tctx,\n\t\t\t\tfalse,\n\t\t\t\tcontroller,\n\t\t\t\t\"Checking current usage\u2026\",\n\t\t\t);\n\t\t\tif (!stableCurrent) return;\n\t\t\tpublishStableCurrent(ctx, stableCurrent);\n\t\t\tlet current = stableCurrent.outcome;\n\t\t\tlet visibleStates: ProviderUsageState[] = [current.state];\n\t\t\tlet fastState = settingsRuntime.get();\n\t\t\tlet resetAvailability: CodexResetAvailability | undefined;\n\t\t\tlet selectedReset: CodexResetOption | undefined;\n\t\t\tlet resetAuthFingerprint: string | undefined;\n\t\t\tlet resetModelIdentity: string | undefined;\n\t\t\tlet redemptionId: string | undefined;\n\t\t\tlet resetOutcome: CodexResetOutcome | undefined;\n\t\t\tlet resetFailure: string | undefined;\n\t\t\tconst { defineMenu, runMenu } = await import(\"@narumitw/pi-tui-kit\");\n\t\t\tif (controller.signal.aborted || statusGeneration !== menuGeneration) return;\n\t\t\ttype Screen =\n\t\t\t\t| \"main\"\n\t\t\t\t| \"providers\"\n\t\t\t\t| \"reset-picker\"\n\t\t\t\t| \"reset-confirm\"\n\t\t\t\t| \"reset-result\"\n\t\t\t\t| \"reset-error\";\n\t\t\ttype Action =\n\t\t\t\t| \"refresh\"\n\t\t\t\t| \"settings\"\n\t\t\t\t| \"toggle-fast\"\n\t\t\t\t| \"another\"\n\t\t\t\t| \"all\"\n\t\t\t\t| \"provider\"\n\t\t\t\t| \"open-resets\"\n\t\t\t\t| \"select-reset\"\n\t\t\t\t| \"cancel-reset\"\n\t\t\t\t| \"consume-reset\"\n\t\t\t\t| \"back-to-usage\"\n\t\t\t\t| \"back-to-resets\";\n\t\t\tconst menu = defineMenu<undefined, Screen, Action, ExtensionCommandContext>({\n\t\t\t\tstart: \"main\",\n\t\t\t\tscreens: {\n\t\t\t\t\tmain: () => {\n\t\t\t\t\t\tconst fastAvailability = fastRuntime.availability(ctx.model);\n\t\t\t\t\t\tconst fastLines =\n\t\t\t\t\t\t\tfastAvailability.kind === \"available\"\n\t\t\t\t\t\t\t\t? [`Fast mode: ${fastAvailability.enabled ? \"On\" : \"Off\"}`, FAST_USAGE_WARNING]\n\t\t\t\t\t\t\t\t: fastAvailability.kind === \"unavailable\"\n\t\t\t\t\t\t\t\t\t? [`Fast mode: Unavailable \u00B7 ${fastAvailability.reason}`]\n\t\t\t\t\t\t\t\t\t: [];\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tkind: \"actions\",\n\t\t\t\t\t\t\ttitle: \"Provider usage\",\n\t\t\t\t\t\t\tlines: [...formatProviderStates(visibleStates).split(\"\\n\"), ...fastLines],\n\t\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t\t{ id: \"refresh\", label: REFRESH_CURRENT, action: \"refresh\" },\n\t\t\t\t\t\t\t\t{ id: \"settings\", label: SETTINGS, action: \"settings\" },\n\t\t\t\t\t\t\t\t...(fastAvailability.kind === \"available\"\n\t\t\t\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tid: \"toggle-fast\",\n\t\t\t\t\t\t\t\t\t\t\t\tlabel: fastAvailability.enabled\n\t\t\t\t\t\t\t\t\t\t\t\t\t? \"Turn Fast mode off\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t: \"Turn Fast mode on\",\n\t\t\t\t\t\t\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\t\t\t\t\t\tfastState.kind === \"invalid\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? \"Repair pi-usage.json and reload before changing Fast mode.\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: FAST_USAGE_WARNING,\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled: fastState.kind === \"invalid\",\n\t\t\t\t\t\t\t\t\t\t\t\taction: \"toggle-fast\" as const,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t: []),\n\t\t\t\t\t\t\t\t...(current.state.status === \"ready\" && current.state.providerId === \"openai-codex\"\n\t\t\t\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tid: \"open-resets\",\n\t\t\t\t\t\t\t\t\t\t\t\tlabel: REDEEM_CODEX_RESET,\n\t\t\t\t\t\t\t\t\t\t\t\tdescription: codexResetActionDescription(current.state.report),\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled: codexResetCount(current.state.report) === 0,\n\t\t\t\t\t\t\t\t\t\t\t\taction: \"open-resets\" as const,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t: []),\n\t\t\t\t\t\t\t\t{ id: \"another\", label: VIEW_ANOTHER, action: \"another\" },\n\t\t\t\t\t\t\t\t{ id: \"all\", label: VIEW_ALL, action: \"all\" },\n\t\t\t\t\t\t\t\t{ id: \"close\", label: CLOSE, close: true },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\thint: \"close\",\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\t\t\t\t\tproviders: () => ({\n\t\t\t\t\t\tkind: \"actions\",\n\t\t\t\t\t\ttitle: \"Select a configured provider\",\n\t\t\t\t\t\titems: configuredAdapters(ctx, xaiUsageEnabled())\n\t\t\t\t\t\t\t.filter((adapter) => adapter.id !== ctx.model?.provider)\n\t\t\t\t\t\t\t.map((adapter) => ({\n\t\t\t\t\t\t\t\tid: adapter.id,\n\t\t\t\t\t\t\t\tlabel: adapter.displayName,\n\t\t\t\t\t\t\t\taction: \"provider\" as const,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\thint: \"back\",\n\t\t\t\t\t}),\n\t\t\t\t\t\"reset-picker\": () => ({\n\t\t\t\t\t\tkind: \"choice\",\n\t\t\t\t\t\ttitle: \"Usage limit resets\",\n\t\t\t\t\t\tlines: [\n\t\t\t\t\t\t\t`${resetAvailability?.availableCount ?? 0} ${resetLabel(resetAvailability?.availableCount ?? 0)} available.`,\n\t\t\t\t\t\t],\n\t\t\t\t\t\titems: (resetAvailability?.options ?? []).map((option, index) => ({\n\t\t\t\t\t\t\tid: `reset-${index}`,\n\t\t\t\t\t\t\tlabel: option.title,\n\t\t\t\t\t\t\tdescription: resetOptionExpiration(option),\n\t\t\t\t\t\t\tdetails: [option.description],\n\t\t\t\t\t\t})),\n\t\t\t\t\t\taction: \"select-reset\",\n\t\t\t\t\t\tinitialItemId: \"reset-0\",\n\t\t\t\t\t\thint: \"back\",\n\t\t\t\t\t}),\n\t\t\t\t\t\"reset-confirm\": () => ({\n\t\t\t\t\t\tkind: \"actions\",\n\t\t\t\t\t\ttitle: \"Use this reset?\",\n\t\t\t\t\t\tlines: resetConfirmationLines(selectedReset),\n\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t{ id: \"cancel-reset\", label: \"No, go back\", action: \"cancel-reset\" },\n\t\t\t\t\t\t\t{ id: \"consume-reset\", label: \"Yes, use reset\", action: \"consume-reset\" },\n\t\t\t\t\t\t],\n\t\t\t\t\t\thint: \"back\",\n\t\t\t\t\t}),\n\t\t\t\t\t\"reset-result\": () => ({\n\t\t\t\t\t\tkind: \"actions\",\n\t\t\t\t\t\ttitle: \"Usage limit resets\",\n\t\t\t\t\t\tlines: [\n\t\t\t\t\t\t\tformatCodexResetOutcome(\n\t\t\t\t\t\t\t\tresetOutcome,\n\t\t\t\t\t\t\t\tcurrent.state.status === \"ready\"\n\t\t\t\t\t\t\t\t\t? codexResetCount(current.state.report)\n\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t],\n\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: \"back-to-usage\",\n\t\t\t\t\t\t\t\tlabel: \"Back to usage\",\n\t\t\t\t\t\t\t\taction: \"back-to-usage\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{ id: \"close\", label: CLOSE, close: true },\n\t\t\t\t\t\t],\n\t\t\t\t\t\thint: \"back\",\n\t\t\t\t\t}),\n\t\t\t\t\t\"reset-error\": () => ({\n\t\t\t\t\t\tkind: \"actions\",\n\t\t\t\t\t\ttitle: \"Usage limit resets\",\n\t\t\t\t\t\tlines: [resetFailure ?? \"Couldn't reset usage. Please try again.\"],\n\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t{ id: \"consume-reset\", label: \"Try again\", action: \"consume-reset\" },\n\t\t\t\t\t\t\t{ id: \"back-to-resets\", label: \"Back\", action: \"back-to-resets\" },\n\t\t\t\t\t\t],\n\t\t\t\t\t\thint: \"back\",\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\tactions: {\n\t\t\t\t\tsettings: async () => {\n\t\t\t\t\t\tawait showUsageSettings(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\tsettingsRuntime,\n\t\t\t\t\t\t\tcontroller.signal,\n\t\t\t\t\t\t\t() => statusGeneration === menuGeneration && !controller.signal.aborted,\n\t\t\t\t\t\t\t(id, _previous, next) => {\n\t\t\t\t\t\t\t\tif (id !== \"xaiUsage\") return;\n\t\t\t\t\t\t\t\txaiSettingsGeneration += 1;\n\t\t\t\t\t\t\t\tinvalidateProviderState(\"xai\");\n\t\t\t\t\t\t\t\tif (!next) {\n\t\t\t\t\t\t\t\t\tfor (const active of activeControllers) {\n\t\t\t\t\t\t\t\t\t\tif (active !== controller) active.abort();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\tfastState = settingsRuntime.get();\n\t\t\t\t\t\tconst revalidated = await queryStableCurrent(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\tcontroller,\n\t\t\t\t\t\t\t\"Applying usage settings\u2026\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!revalidated) return { kind: \"stay\" };\n\t\t\t\t\t\tstableCurrent = revalidated;\n\t\t\t\t\t\tcurrent = revalidated.outcome;\n\t\t\t\t\t\tvisibleStates = [current.state];\n\t\t\t\t\t\tpublishStableCurrent(ctx, revalidated);\n\t\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t\t},\n\t\t\t\t\t\"toggle-fast\": async () => {\n\t\t\t\t\t\tconst availability = fastRuntime.availability(ctx.model);\n\t\t\t\t\t\tif (availability.kind !== \"available\" || fastState.kind === \"invalid\") {\n\t\t\t\t\t\t\treturn { kind: \"rejected\" };\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst changed = await fastRuntime.toggle(ctx, !availability.enabled, controller.signal);\n\t\t\t\t\t\tif (!changed) return { kind: \"rejected\" };\n\t\t\t\t\t\tfastState = settingsRuntime.get();\n\t\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t\t},\n\t\t\t\t\t\"open-resets\": async () => {\n\t\t\t\t\t\tconst summaryCount =\n\t\t\t\t\t\t\tcurrent.state.status === \"ready\" && current.state.providerId === \"openai-codex\"\n\t\t\t\t\t\t\t\t? codexResetCount(current.state.report)\n\t\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst loaded = await runMenuOperation(\n\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\"Checking usage limit resets\u2026\",\n\t\t\t\t\t\t\t\tcontroller.signal,\n\t\t\t\t\t\t\t\tasync (signal) => {\n\t\t\t\t\t\t\t\t\tconst expectedModel = modelIdentity(ctx.model);\n\t\t\t\t\t\t\t\t\tconst auth = await awaitWithDeadline(\n\t\t\t\t\t\t\t\t\t\tresolveCodexResetAuth(ctx, undefined, credentialReader, credentialCandidates),\n\t\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t\t\tDEFAULT_TIMEOUT_MS,\n\t\t\t\t\t\t\t\t\t\t\"resolving current Codex reset authentication\",\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tlet availability: CodexResetAvailability;\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tavailability = await listCodexResetCredits(auth, signal, DEFAULT_TIMEOUT_MS);\n\t\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\t\tif (isAbortError(error) || summaryCount === undefined || summaryCount <= 0) {\n\t\t\t\t\t\t\t\t\t\t\tthrow error;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tavailability = {\n\t\t\t\t\t\t\t\t\t\t\tavailableCount: summaryCount,\n\t\t\t\t\t\t\t\t\t\t\toptions: [genericCodexResetOption()],\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tconst revalidated = await awaitWithDeadline(\n\t\t\t\t\t\t\t\t\t\tresolveCodexResetAuth(ctx, undefined, credentialReader, credentialCandidates),\n\t\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t\t\tDEFAULT_TIMEOUT_MS,\n\t\t\t\t\t\t\t\t\t\t\"revalidating current Codex reset authentication\",\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\tmodelIdentity(ctx.model) !== expectedModel ||\n\t\t\t\t\t\t\t\t\t\trevalidated.fingerprint !== auth.fingerprint\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\t\t\"The active Codex model or account changed while loading usage limit resets.\",\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn { availability, auth, expectedModel };\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (!loaded) return { kind: \"stay\" };\n\t\t\t\t\t\t\tresetAvailability = loaded.availability;\n\t\t\t\t\t\t\tresetAuthFingerprint = loaded.auth.fingerprint;\n\t\t\t\t\t\t\tresetModelIdentity = loaded.expectedModel;\n\t\t\t\t\t\t\tselectedReset = undefined;\n\t\t\t\t\t\t\tredemptionId = undefined;\n\t\t\t\t\t\t\tresetOutcome = undefined;\n\t\t\t\t\t\t\tresetFailure = undefined;\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tkind: \"to\",\n\t\t\t\t\t\t\t\tscreen: loaded.availability.availableCount > 0 ? \"reset-picker\" : \"reset-result\",\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tif (isAbortError(error) || isStaleExtensionContextError(error)) {\n\t\t\t\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tctx.ui.notify(`Couldn't load usage limit resets: ${errorMessage(error)}`, \"error\");\n\t\t\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t\"select-reset\": ({ itemId }) => {\n\t\t\t\t\t\tconst index = Number(itemId.replace(/^reset-/u, \"\"));\n\t\t\t\t\t\tconst option = Number.isSafeInteger(index)\n\t\t\t\t\t\t\t? resetAvailability?.options[index]\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\tif (!option) return { kind: \"rejected\" };\n\t\t\t\t\t\tselectedReset = option;\n\t\t\t\t\t\tredemptionId = undefined;\n\t\t\t\t\t\tresetFailure = undefined;\n\t\t\t\t\t\treturn { kind: \"to\", screen: \"reset-confirm\" };\n\t\t\t\t\t},\n\t\t\t\t\t\"cancel-reset\": () => ({ kind: \"back\" }),\n\t\t\t\t\t\"consume-reset\": async () => {\n\t\t\t\t\t\tif (!selectedReset || !resetAuthFingerprint || !resetModelIdentity) {\n\t\t\t\t\t\t\treturn { kind: \"rejected\" };\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tredemptionId ??= createRedemptionId();\n\t\t\t\t\t\t\tconst attemptId = redemptionId;\n\t\t\t\t\t\t\tconst option = selectedReset;\n\t\t\t\t\t\t\tconst expectedFingerprint = resetAuthFingerprint;\n\t\t\t\t\t\t\tconst expectedModel = resetModelIdentity;\n\t\t\t\t\t\t\tconst result = await runMenuOperation(\n\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\"Resetting your usage\u2026\",\n\t\t\t\t\t\t\t\tcontroller.signal,\n\t\t\t\t\t\t\t\tasync (signal) => {\n\t\t\t\t\t\t\t\t\tconst auth = await awaitWithDeadline(\n\t\t\t\t\t\t\t\t\t\tresolveCodexResetAuth(ctx, undefined, credentialReader, credentialCandidates),\n\t\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t\t\tDEFAULT_TIMEOUT_MS,\n\t\t\t\t\t\t\t\t\t\t\"revalidating current Codex reset authentication\",\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\tmodelIdentity(ctx.model) !== expectedModel ||\n\t\t\t\t\t\t\t\t\t\tauth.fingerprint !== expectedFingerprint\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\t\t\"The active Codex model or account changed; the reset was not used.\",\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tconst outcome = await consumeCodexResetCredit(\n\t\t\t\t\t\t\t\t\t\tauth,\n\t\t\t\t\t\t\t\t\t\toption,\n\t\t\t\t\t\t\t\t\t\tattemptId,\n\t\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t\t\tDEFAULT_TIMEOUT_MS,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tinvalidateProviderState(\"openai-codex\");\n\t\t\t\t\t\t\t\t\tconst model = ctx.model;\n\t\t\t\t\t\t\t\t\tif (modelIdentity(model) !== expectedModel) return { outcome };\n\t\t\t\t\t\t\t\t\tconst refreshed = await queryCurrentState(ctx, model, true, signal);\n\t\t\t\t\t\t\t\t\tconst stable = await outcomeStillCurrent(\n\t\t\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t\t\t\t\tmenuGeneration,\n\t\t\t\t\t\t\t\t\t\trefreshed,\n\t\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\treturn stable ? { outcome, refreshed, model } : { outcome };\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (!result) return { kind: \"close\" };\n\t\t\t\t\t\t\tresetOutcome = result.outcome;\n\t\t\t\t\t\t\tresetFailure = undefined;\n\t\t\t\t\t\t\tif (result.refreshed && result.model) {\n\t\t\t\t\t\t\t\tstableCurrent = { outcome: result.refreshed, model: result.model };\n\t\t\t\t\t\t\t\tcurrent = result.refreshed;\n\t\t\t\t\t\t\t\tvisibleStates = [current.state];\n\t\t\t\t\t\t\t\tpublishStableCurrent(ctx, stableCurrent);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn { kind: \"to\", screen: \"reset-result\" };\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tif (isAbortError(error) || isStaleExtensionContextError(error)) {\n\t\t\t\t\t\t\t\treturn { kind: \"close\" };\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tresetFailure = `Couldn't reset usage: ${errorMessage(error)}. Try again with the same request.`;\n\t\t\t\t\t\t\treturn { kind: \"to\", screen: \"reset-error\" };\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t\"back-to-usage\": () => ({ kind: \"to\", screen: \"main\" }),\n\t\t\t\t\t\"back-to-resets\": () => {\n\t\t\t\t\t\tredemptionId = undefined;\n\t\t\t\t\t\tresetFailure = undefined;\n\t\t\t\t\t\treturn { kind: \"to\", screen: \"reset-picker\" };\n\t\t\t\t\t},\n\t\t\t\t\trefresh: async () => {\n\t\t\t\t\t\tconst refreshed = await queryStableCurrent(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\tcontroller,\n\t\t\t\t\t\t\t\"Refreshing current usage\u2026\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!refreshed) return { kind: \"stay\" };\n\t\t\t\t\t\tstableCurrent = refreshed;\n\t\t\t\t\t\tpublishStableCurrent(ctx, refreshed);\n\t\t\t\t\t\tcurrent = refreshed.outcome;\n\t\t\t\t\t\tvisibleStates = [current.state];\n\t\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t\t},\n\t\t\t\t\tanother: async () => {\n\t\t\t\t\t\tconst others = configuredAdapters(ctx, xaiUsageEnabled()).filter(\n\t\t\t\t\t\t\t(adapter) => adapter.id !== ctx.model?.provider,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (others.length === 0) {\n\t\t\t\t\t\t\tctx.ui.notify(\"No other supported provider has configured runtime auth.\", \"info\");\n\t\t\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn { kind: \"to\", screen: \"providers\" };\n\t\t\t\t\t},\n\t\t\t\t\tprovider: async ({ itemId }) => {\n\t\t\t\t\t\tconst adapter = configuredAdapters(ctx, xaiUsageEnabled()).find(\n\t\t\t\t\t\t\t(candidate) => candidate.id === itemId && candidate.id !== ctx.model?.provider,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!adapter) return { kind: \"back\" };\n\t\t\t\t\t\tconst outcome = await runMenuOperation(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t`Checking ${adapter.displayName} usage\u2026`,\n\t\t\t\t\t\t\tcontroller.signal,\n\t\t\t\t\t\t\t(signal) => queryAdapterState(ctx, adapter, \"configured\", false, signal),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!outcome) return { kind: \"back\" };\n\t\t\t\t\t\tconst revalidated = await queryStableCurrent(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\tcontroller,\n\t\t\t\t\t\t\t\"Revalidating current usage\u2026\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!revalidated) return { kind: \"back\" };\n\t\t\t\t\t\tstableCurrent = revalidated;\n\t\t\t\t\t\tcurrent = revalidated.outcome;\n\t\t\t\t\t\tvisibleStates = [\n\t\t\t\t\t\t\toutcome.state.providerId === current.state.providerId\n\t\t\t\t\t\t\t\t? current.state\n\t\t\t\t\t\t\t\t: { ...outcome.state, displayState: \"configured\" },\n\t\t\t\t\t\t];\n\t\t\t\t\t\treturn { kind: \"back\" };\n\t\t\t\t\t},\n\t\t\t\t\tall: async () => {\n\t\t\t\t\t\tconst adapters = configuredAdapters(ctx, xaiUsageEnabled());\n\t\t\t\t\t\tconst currentProviderId = ctx.model?.provider;\n\t\t\t\t\t\tconst settled = await runMenuOperation(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\"Checking configured provider usage\u2026\",\n\t\t\t\t\t\t\tcontroller.signal,\n\t\t\t\t\t\t\t(signal) =>\n\t\t\t\t\t\t\t\trunWithConcurrency(\n\t\t\t\t\t\t\t\t\tadapters,\n\t\t\t\t\t\t\t\t\tALL_PROVIDER_CONCURRENCY,\n\t\t\t\t\t\t\t\t\t(adapter, _index, workerSignal) =>\n\t\t\t\t\t\t\t\t\t\tqueryAdapterState(\n\t\t\t\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\t\t\tadapter,\n\t\t\t\t\t\t\t\t\t\t\tadapter.id === currentProviderId ? \"current\" : \"configured\",\n\t\t\t\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\t\t\t\tworkerSignal,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!settled) return { kind: \"stay\" };\n\t\t\t\t\t\tconst queriedStates: ProviderUsageState[] = settled.map((result, index) => {\n\t\t\t\t\t\t\tif (result.status === \"fulfilled\") {\n\t\t\t\t\t\t\t\treturn { ...result.value.state, displayState: \"configured\" };\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst adapter = adapters[index] as UsageProviderAdapter;\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tproviderId: adapter.id,\n\t\t\t\t\t\t\t\tproviderName: adapter.displayName,\n\t\t\t\t\t\t\t\tdisplayState: \"configured\",\n\t\t\t\t\t\t\t\tstatus: \"query-failed\",\n\t\t\t\t\t\t\t\tmessage: errorMessage(result.reason),\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconst revalidated = await queryStableCurrent(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\tcontroller,\n\t\t\t\t\t\t\t\"Revalidating current usage\u2026\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!revalidated) return { kind: \"stay\" };\n\t\t\t\t\t\tstableCurrent = revalidated;\n\t\t\t\t\t\tcurrent = revalidated.outcome;\n\t\t\t\t\t\tvisibleStates = [\n\t\t\t\t\t\t\tcurrent.state,\n\t\t\t\t\t\t\t...queriedStates.filter((state) => state.providerId !== current.state.providerId),\n\t\t\t\t\t\t];\n\t\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t\tawait runMenu(ctx, menu, {\n\t\t\t\tgetState: () => undefined,\n\t\t\t\tsignal: controller.signal,\n\t\t\t\tisCurrent: () => statusGeneration === menuGeneration && !controller.signal.aborted,\n\t\t\t});\n\t\t} finally {\n\t\t\tcontroller.abort(new DOMException(\"Usage menu closed\", \"AbortError\"));\n\t\t\tactiveControllers.delete(controller);\n\t\t}\n\t};\n\n\tpi.registerCommand(\"usage\", {\n\t\tdescription: \"Show usage for the current runtime account\",\n\t\thandler: async (args, ctx) => {\n\t\t\tif (args.trim()) {\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\"/usage does not accept arguments; choose an action from its menu.\",\n\t\t\t\t\t\"warning\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait showMenu(ctx);\n\t\t\t} catch (error) {\n\t\t\t\tif (isStaleExtensionContextError(error) || isAbortError(error)) return;\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t},\n\t});\n\tpi.on(\"session_start\", (_event, ctx) => {\n\t\tsessionGeneration += 1;\n\t\txaiSettingsGeneration += 1;\n\t\tstatusGeneration += 1;\n\t\tclearStatusTimer();\n\t\tfor (const controller of activeControllers) controller.abort();\n\t\tactiveControllers.clear();\n\t\tstatusController = undefined;\n\t\tsessionActive = true;\n\t\tstartStatusRefresh(ctx, ctx.model, false);\n\t});\n\tpi.on(\"session_tree\", (_event, ctx) => {\n\t\tstartStatusRefresh(ctx, ctx.model, false);\n\t});\n\tpi.on(\"model_select\", (event, ctx) => {\n\t\tstartStatusRefresh(ctx, event.model, false);\n\t});\n\tpi.on(\"turn_start\", (_event, ctx) => {\n\t\tstartStatusRefresh(ctx, ctx.model, false);\n\t});\n\tpi.on(\"session_shutdown\", (_event, ctx) => {\n\t\tsessionActive = false;\n\t\tsessionGeneration += 1;\n\t\txaiSettingsGeneration += 1;\n\t\tstatusGeneration += 1;\n\t\tclearStatusTimer();\n\t\tfor (const controller of activeControllers) controller.abort();\n\t\tactiveControllers.clear();\n\t\tstatusController = undefined;\n\t\tcache.clear();\n\t\tfailureBackoff.clear();\n\t\tlatestQueries.clear();\n\t\tactiveCurrentIdentity = undefined;\n\t\tsafeSetStatus(ctx, undefined);\n\t});\n\n\tfastRuntime = registerCodexFastMode(pi, settingsRuntime, (ctx) =>\n\t\tstartStatusRefresh(ctx, ctx.model, false),\n\t);\n}\n", "import type {\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionContext,\n} from \"@earendil-works/pi-coding-agent\";\nimport {\n\tcodexFastAvailability,\n\tcodexFastIsEffective,\n\tcodexFastStatusLabel,\n\tcorrectCodexFastMessageCost,\n\trewriteCodexFastPayload,\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\tpi: ExtensionAPI,\n\tsettingsRuntime: UsageSettingsRuntime,\n\trefreshStatus: (ctx: ExtensionContext) => void,\n) {\n\tlet sessionController = new AbortController();\n\tlet generation = 0;\n\tconst pendingFastRequests = new Map<string, PendingFastRequest>();\n\n\tconst toggle = async (\n\t\tctx: ExtensionCommandContext,\n\t\tenabled: boolean,\n\t\tcallerSignal?: AbortSignal,\n\t): Promise<boolean> => {\n\t\tconst ownerGeneration = generation;\n\t\tconst sessionId = ctx.sessionManager.getSessionId();\n\t\tconst signal = callerSignal\n\t\t\t? AbortSignal.any([callerSignal, sessionController.signal])\n\t\t\t: sessionController.signal;\n\t\ttry {\n\t\t\tawait settingsRuntime.update({ codexFastMode: enabled }, signal);\n\t\t} catch (error) {\n\t\t\tif (isAbortError(error) || isStaleExtensionContextError(error)) return false;\n\t\t\tctx.ui.notify(`Could not save pi-usage.json: ${errorMessage(error)}`, \"error\");\n\t\t\treturn false;\n\t\t}\n\t\tif (\n\t\t\tsignal.aborted ||\n\t\t\townerGeneration !== generation ||\n\t\t\tctx.sessionManager.getSessionId() !== sessionId\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t\trefreshStatus(ctx);\n\t\tctx.ui.notify(\n\t\t\tenabled\n\t\t\t\t? `Codex Fast mode enabled. ${FAST_USAGE_WARNING}`\n\t\t\t\t: \"Codex Fast mode disabled; standard routing will be used.\",\n\t\t\t\"info\",\n\t\t);\n\t\treturn true;\n\t};\n\n\tpi.registerCommand(\"fast\", {\n\t\tdescription: \"Toggle Codex Fast mode\",\n\t\thandler: async (args, ctx) => {\n\t\t\tif (args.trim()) {\n\t\t\t\tif (!ctx.hasUI) throw new Error(\"/fast does not accept arguments.\");\n\t\t\t\tctx.ui.notify(\"/fast does not accept arguments.\", \"warning\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!ctx.hasUI) throw new Error(\"/fast requires TUI or RPC mode.\");\n\t\t\tconst availability = codexFastAvailability(\n\t\t\t\tctx.model,\n\t\t\t\tsettingsRuntime.get().settings.codexFastMode,\n\t\t\t);\n\t\t\tif (availability.kind === \"not-codex\") {\n\t\t\t\tctx.ui.notify(\"/fast is available only for the active OpenAI Codex model.\", \"warning\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (availability.kind === \"unavailable\") {\n\t\t\t\tctx.ui.notify(availability.reason, \"warning\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (settingsRuntime.get().kind === \"invalid\") {\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\"pi-usage.json is invalid; repair it and run /reload before changing Fast mode.\",\n\t\t\t\t\t\"error\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait toggle(ctx, !availability.enabled);\n\t\t},\n\t});\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tgeneration += 1;\n\t\tsessionController.abort();\n\t\tpendingFastRequests.clear();\n\t\tsessionController = new AbortController();\n\t\tconst ownerGeneration = generation;\n\t\tconst sessionId = ctx.sessionManager.getSessionId();\n\t\tlet state: Readonly<UsageSettingsState>;\n\t\ttry {\n\t\t\tstate = await settingsRuntime.reload(sessionController.signal);\n\t\t} catch (error) {\n\t\t\tif (sessionController.signal.aborted || ownerGeneration !== generation) return;\n\t\t\tif (ctx.hasUI) {\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t`Could not load pi-usage.json; using defaults. ${errorMessage(error)}`,\n\t\t\t\t\t\"warning\",\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (\n\t\t\tsessionController.signal.aborted ||\n\t\t\townerGeneration !== generation ||\n\t\t\tctx.sessionManager.getSessionId() !== sessionId\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tif (ctx.hasUI && state.kind === \"invalid\") {\n\t\t\tctx.ui.notify(\n\t\t\t\t`Invalid pi-usage.json; using defaults without overwriting it. ${state.issue}`,\n\t\t\t\t\"warning\",\n\t\t\t);\n\t\t}\n\t\trefreshStatus(ctx);\n\t});\n\n\tpi.on(\"before_provider_request\", (event, ctx) => {\n\t\tconst rewritten = rewriteCodexFastPayload(\n\t\t\tevent.payload,\n\t\t\tctx.model,\n\t\t\tsettingsRuntime.get().settings.codexFastMode,\n\t\t);\n\t\tconst key = activeRequestKey(ctx);\n\t\tif (key && ctx.model) {\n\t\t\tpendingFastRequests.set(key, {\n\t\t\t\tfastRequested: isRecord(rewritten) && rewritten.service_tier === \"priority\",\n\t\t\t\tmodel: ctx.model,\n\t\t\t});\n\t\t}\n\t\treturn rewritten;\n\t});\n\tpi.on(\"message_end\", (event, ctx) => {\n\t\tconst request = consumeFastRequest(ctx, event.message, pendingFastRequests);\n\t\tif (request === NO_FAST_REQUEST) return undefined;\n\t\tconst message = correctCodexFastMessageCost(\n\t\t\tevent.message,\n\t\t\trequest.model,\n\t\t\trequest.fastRequested,\n\t\t);\n\t\treturn message ? { message: message as never } : undefined;\n\t});\n\tpi.on(\"session_shutdown\", async () => {\n\t\tgeneration += 1;\n\t\tsessionController.abort();\n\t\tpendingFastRequests.clear();\n\t\tawait settingsRuntime.flush();\n\t});\n\n\treturn {\n\t\tavailability(model: PiModel | undefined) {\n\t\t\treturn codexFastAvailability(model, settingsRuntime.get().settings.codexFastMode);\n\t\t},\n\t\tdecorateStatus(model: PiModel | undefined, status: string) {\n\t\t\treturn codexFastStatusLabel(\n\t\t\t\tstatus,\n\t\t\t\tcodexFastIsEffective(model, settingsRuntime.get().settings.codexFastMode),\n\t\t\t);\n\t\t},\n\t\ttoggle,\n\t};\n}\n\nfunction activeRequestKey(ctx: ExtensionContext): string | undefined {\n\tconst model = ctx.model;\n\treturn model ? `${ctx.sessionManager.getSessionId()}:${model.provider}/${model.id}` : undefined;\n}\n\nfunction consumeFastRequest(\n\tctx: ExtensionContext,\n\tmessage: unknown,\n\tpending: Map<string, PendingFastRequest>,\n): PendingFastRequest | typeof NO_FAST_REQUEST {\n\tif (!isRecord(message) || message.role !== \"assistant\") return NO_FAST_REQUEST;\n\tconst key = messageRequestKey(ctx, message);\n\tif (!key) return NO_FAST_REQUEST;\n\tconst request = pending.get(key);\n\tpending.delete(key);\n\treturn request ?? NO_FAST_REQUEST;\n}\n\nfunction messageRequestKey(\n\tctx: ExtensionContext,\n\tmessage: Record<string, unknown>,\n): string | undefined {\n\tif (typeof message.provider !== \"string\" || typeof message.model !== \"string\") return undefined;\n\treturn `${ctx.sessionManager.getSessionId()}:${message.provider}/${message.model}`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isAbortError(error: unknown): boolean {\n\treturn 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, xaiUsage = true): UsageProviderAdapter[] {\n\treturn usageAdapters(xaiUsage).filter(\n\t\t(adapter) => adapter.id === ctx.model?.provider || providerIsConfigured(ctx, adapter.id),\n\t);\n}\n\nexport function providerDisplayName(ctx: ExtensionContext, providerId: string): string {\n\ttry {\n\t\treturn sanitizeDisplayText(ctx.modelRegistry.getProviderDisplayName(providerId), 80);\n\t} catch {\n\t\treturn sanitizeDisplayText(providerId, 80);\n\t}\n}\n\nexport function setBoundedMap<T>(map: Map<string, T>, key: string, value: T, limit: number): void {\n\tmap.delete(key);\n\twhile (map.size >= limit) {\n\t\tconst oldest = map.keys().next().value;\n\t\tif (oldest === undefined) break;\n\t\tmap.delete(oldest);\n\t}\n\tmap.set(key, value);\n}\n\nexport function modelIdentity(model: PiModel | undefined): string | undefined {\n\treturn model ? `${model.provider}/${model.id}` : undefined;\n}\n\nexport function isAbortError(error: unknown): boolean {\n\treturn error instanceof Error && error.name === \"AbortError\";\n}\n\nexport function isTimeoutError(error: unknown): boolean {\n\treturn error instanceof Error && error.name === \"TimeoutError\";\n}\n", "import {\n\ttype ExtensionCommandContext,\n\tgetSettingsListTheme,\n} from \"@earendil-works/pi-coding-agent\";\nimport {\n\tContainer,\n\tKey,\n\tmatchesKey,\n\ttype SettingItem,\n\tSettingsList,\n\tText,\n} from \"@earendil-works/pi-tui\";\nimport { errorMessage } from \"./core.js\";\nimport type { UsageSettings, UsageSettingsRuntime } from \"./settings.js\";\n\nconst OFF = \"Off\";\nconst ON = \"On\";\n\ntype UsageSettingId = keyof UsageSettings;\n\nexport async function showUsageSettings(\n\tctx: ExtensionCommandContext,\n\tsettingsRuntime: UsageSettingsRuntime,\n\tparentSignal: AbortSignal,\n\tisCurrent: () => boolean,\n\tonApplied: (id: UsageSettingId, previous: boolean, next: boolean) => void,\n): Promise<boolean> {\n\tif (ctx.mode !== \"tui\") {\n\t\tif (ctx.hasUI) ctx.ui.notify(`Edit settings manually: ${settingsRuntime.get().path}`, \"info\");\n\t\treturn false;\n\t}\n\tif (parentSignal.aborted || !isCurrent()) return false;\n\n\treturn ctx.ui.custom<boolean>((tui, theme, _keybindings, done) => {\n\t\tconst localController = new AbortController();\n\t\tconst signal = AbortSignal.any([parentSignal, localController.signal]);\n\t\tlet changed = false;\n\t\tlet closing = false;\n\t\tlet saveQueue = Promise.resolve();\n\t\tconst state = settingsRuntime.get();\n\t\tconst items: SettingItem[] = [\n\t\t\t{\n\t\t\t\tid: \"codexFastMode\",\n\t\t\t\tlabel: \"Codex Fast mode\",\n\t\t\t\tdescription: \"Use faster Codex routing at increased plan allowance consumption.\",\n\t\t\t\tcurrentValue: state.settings.codexFastMode ? ON : OFF,\n\t\t\t\tvalues: [OFF, ON],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"xaiUsage\",\n\t\t\t\tlabel: \"xAI usage\",\n\t\t\t\tdescription: \"Report OAuth subscription allowance and credits.\",\n\t\t\t\tcurrentValue: state.kind !== \"invalid\" && state.settings.xaiUsage ? ON : OFF,\n\t\t\t\tvalues: [OFF, ON],\n\t\t\t},\n\t\t];\n\t\tconst container = new Container();\n\t\tcontainer.addChild(new Text(theme.fg(\"accent\", theme.bold(\"pi-usage Settings\")), 1, 1));\n\n\t\tlet settingsList: SettingsList;\n\t\tconst cancel = () => {\n\t\t\tif (closing) return;\n\t\t\tclosing = true;\n\t\t\tlocalController.abort();\n\t\t\tdone(changed);\n\t\t};\n\t\tsettingsList = new SettingsList(\n\t\t\titems,\n\t\t\titems.length + 2,\n\t\t\tgetSettingsListTheme(),\n\t\t\t(id, value) => {\n\t\t\t\tif (closing || signal.aborted || !isCurrent()) return;\n\t\t\t\tconst settingId = id as UsageSettingId;\n\t\t\t\tconst requested = value !== OFF;\n\t\t\t\tsaveQueue = saveQueue.then(async () => {\n\t\t\t\t\tconst previous = settingsRuntime.get().settings[settingId];\n\t\t\t\t\tif (settingsRuntime.get().kind === \"invalid\") {\n\t\t\t\t\t\tconst effectivePrevious = settingId === \"xaiUsage\" ? false : previous;\n\t\t\t\t\t\tsettingsList.updateValue(id, displayValue(settingId, effectivePrevious));\n\t\t\t\t\t\tif (!signal.aborted && isCurrent()) {\n\t\t\t\t\t\t\tctx.ui.notify(\"Repair pi-usage.json and reload before changing settings.\", \"error\");\n\t\t\t\t\t\t\ttui.requestRender();\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait settingsRuntime.update({ [settingId]: requested }, signal);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tif (signal.aborted || !isCurrent()) return;\n\t\t\t\t\t\tsettingsList.updateValue(id, displayValue(settingId, previous));\n\t\t\t\t\t\tctx.ui.notify(`Could not save pi-usage.json: ${errorMessage(error)}`, \"error\");\n\t\t\t\t\t\ttui.requestRender();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (previous !== requested) {\n\t\t\t\t\t\tchanged = true;\n\t\t\t\t\t\tonApplied(settingId, previous, requested);\n\t\t\t\t\t}\n\t\t\t\t\tif (signal.aborted || !isCurrent()) return;\n\t\t\t\t\tsettingsList.updateValue(id, displayValue(settingId, requested));\n\t\t\t\t\ttui.requestRender();\n\t\t\t\t});\n\t\t\t},\n\t\t\tcancel,\n\t\t);\n\t\tcontainer.addChild(settingsList);\n\n\t\tparentSignal.addEventListener(\"abort\", cancel, { once: true });\n\t\treturn {\n\t\t\trender: (width: number) => container.render(width),\n\t\t\tinvalidate: () => container.invalidate(),\n\t\t\thandleInput(data: string) {\n\t\t\t\tif (closing) return;\n\t\t\t\tif (matchesKey(data, Key.ctrl(\"c\"))) cancel();\n\t\t\t\telse settingsList.handleInput(data);\n\t\t\t\ttui.requestRender();\n\t\t\t},\n\t\t\tdispose() {\n\t\t\t\tlocalController.abort();\n\t\t\t\tparentSignal.removeEventListener(\"abort\", cancel);\n\t\t\t},\n\t\t};\n\t});\n}\n\nfunction displayValue(_id: UsageSettingId, enabled: boolean): string {\n\treturn enabled ? ON : OFF;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["readStoredCredential", "readStoredCredential", "asObject", "asString", "asObject", "asNonnegativeInteger", "currency", "asObject", "asString", "asNonnegativeNumber", "clampPercent", "asObject", "asNonnegativeNumber", "asString", "isRecord", "start", "end", "FIVE_HOUR_WINDOW_MINUTES", "WEEKLY_WINDOW_MINUTES", "asObject", "asString", "asNonnegativeNumber", "clampPercent", "asEpochSeconds", "readStoredCredential", "asObject", "storedAccess", "refresh", "readStoredCredential", "bearerToken", "headerValue", "asObject", "clampPercent", "isRecord", "randomUUID", "isAbortError", "isRecord", "isAbortError", "randomUUID", "isAbortError"]
|
|
3
|
+
"sources": ["../src/codex-fast.ts", "../src/codex-resets.ts", "../src/core.ts", "../src/oauth-credential-source.ts", "../src/query.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/opencode-zen.ts", "../src/providers/openrouter.ts", "../src/providers/xai.ts", "../src/providers/zai.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\t\"gpt-5.4\",\n\t\"gpt-5.5\",\n\t\"gpt-5.6-luna\",\n\t\"gpt-5.6-sol\",\n\t\"gpt-5.6-terra\",\n]);\n\nexport type CodexFastAvailability =\n\t| { kind: \"available\"; enabled: boolean }\n\t| { kind: \"not-codex\" }\n\t| { kind: \"unavailable\"; reason: string };\n\nexport function codexFastAvailability(\n\tmodel: PiModel | undefined,\n\tenabled: boolean,\n): CodexFastAvailability {\n\tif (model?.provider !== \"openai-codex\") return { kind: \"not-codex\" };\n\tif (!isOfficialCodexModel(model)) {\n\t\treturn {\n\t\t\tkind: \"unavailable\",\n\t\t\treason: \"Fast mode requires the official OpenAI Codex Responses endpoint.\",\n\t\t};\n\t}\n\tif (!CODEX_FAST_MODEL_IDS.has(model.id)) {\n\t\treturn {\n\t\t\tkind: \"unavailable\",\n\t\t\treason: `${model.id} does not advertise Codex Fast support.`,\n\t\t};\n\t}\n\treturn { kind: \"available\", enabled };\n}\n\nexport function codexFastIsEffective(model: PiModel | undefined, enabled: boolean): boolean {\n\treturn codexFastAvailability(model, enabled).kind === \"available\" && enabled;\n}\n\nexport function codexFastRequestTier(\n\tmodel: PiModel | undefined,\n\tenabled: boolean,\n): typeof CODEX_FAST_SERVICE_TIER | typeof CODEX_STANDARD_SERVICE_TIER | undefined {\n\tif (!isOfficialCodexModel(model)) return undefined;\n\treturn enabled && CODEX_FAST_MODEL_IDS.has(model.id)\n\t\t? CODEX_FAST_SERVICE_TIER\n\t\t: CODEX_STANDARD_SERVICE_TIER;\n}\n\nexport function rewriteCodexFastPayload(\n\tpayload: unknown,\n\tmodel: PiModel | undefined,\n\tenabled: boolean,\n): unknown | undefined {\n\tconst serviceTier = codexFastRequestTier(model, enabled);\n\tif (!serviceTier || !isRecord(payload)) return undefined;\n\treturn { ...payload, service_tier: serviceTier };\n}\n\nexport function correctCodexFastMessageCost(\n\tmessage: unknown,\n\tmodel: PiModel | undefined,\n\tfastRequested: boolean,\n): unknown | undefined {\n\tif (\n\t\t!codexFastIsEffective(model, fastRequested) ||\n\t\t!isRecord(message) ||\n\t\tmessage.role !== \"assistant\" ||\n\t\tmessage.provider !== model?.provider ||\n\t\tmessage.model !== model?.id\n\t) {\n\t\treturn undefined;\n\t}\n\tconst usage = isRecord(message.usage) ? message.usage : undefined;\n\tconst cost = usage && isRecord(usage.cost) ? usage.cost : undefined;\n\tif (!usage || !cost || !hasCompleteUsage(usage) || !isOfficialCodexModel(model)) return undefined;\n\tconst correctedUsage = structuredClone(usage) as typeof usage;\n\tcalculateCost(model, correctedUsage as never);\n\tconst multiplier = model.id === \"gpt-5.5\" ? 2.5 : 2;\n\tconst correctedCost = correctedUsage.cost as Record<string, number>;\n\tfor (const key of [\"input\", \"output\", \"cacheRead\", \"cacheWrite\", \"total\"] as const) {\n\t\tcorrectedCost[key] *= multiplier;\n\t}\n\tif (costsEqual(cost, correctedCost)) return undefined;\n\treturn { ...message, usage: correctedUsage };\n}\n\nexport function codexFastStatusLabel(status: string, enabled: boolean): string {\n\tif (!enabled || !/^codex(?:\\s|$)/u.test(status)) return status;\n\treturn status === \"codex\" ? \"codex fast\" : `codex fast${status.slice(\"codex\".length)}`;\n}\n\nfunction isOfficialCodexModel(\n\tmodel: PiModel | undefined,\n): model is PiModel & { api: \"openai-codex-responses\" } {\n\tif (model?.provider !== \"openai-codex\" || !hasApi(model, \"openai-codex-responses\")) {\n\t\treturn false;\n\t}\n\ttry {\n\t\treturn new URL(model.baseUrl).origin === \"https://chatgpt.com\";\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasCompleteUsage(value: Record<string, unknown>): boolean {\n\treturn [\"input\", \"output\", \"cacheRead\", \"cacheWrite\"].every(\n\t\t(key) => typeof value[key] === \"number\" && Number.isFinite(value[key]),\n\t);\n}\n\nfunction costsEqual(left: Record<string, unknown>, right: Record<string, number>): boolean {\n\treturn [\"input\", \"output\", \"cacheRead\", \"cacheWrite\", \"total\"].every(\n\t\t(key) => left[key] === right[key],\n\t);\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 {\n\tfallbackOAuthCredentialCandidates,\n\ttype OAuthCredentialCandidateReader,\n} from \"./oauth-credential-source.js\";\nimport {\n\tAUTH_FINGERPRINT_SALT,\n\tadapterForProvider,\n\tfetchProviderJson,\n\tresolveUsageAuth,\n} 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\tcreditId?: string;\n\ttitle: string;\n\tdescription: string;\n\texpiresAt?: number;\n}\n\nexport interface CodexResetAvailability {\n\tavailableCount: number;\n\toptions: CodexResetOption[];\n}\n\nexport interface CodexResetOutcome {\n\tcode: CodexResetOutcomeCode;\n\twindowsReset: number;\n}\n\nexport function codexResetCount(report: UsageReport): number | undefined {\n\tconst value = report.metrics.find((metric) => metric.id === \"reset-credits\")?.value;\n\treturn typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0 ? value : undefined;\n}\n\nexport function codexResetActionDescription(report: UsageReport): string {\n\tconst count = codexResetCount(report);\n\tif (count === undefined) return \"Check reset availability.\";\n\tif (count === 0) return \"No usage limit resets available.\";\n\treturn `You have ${count} ${resetLabel(count)} available.`;\n}\n\nexport function genericCodexResetOption(): CodexResetOption {\n\treturn {\n\t\ttitle: \"Full reset\",\n\t\tdescription: \"Reset your current usage limits.\",\n\t};\n}\n\nexport function resetOptionExpiration(option: CodexResetOption): string {\n\tif (option.expiresAt === undefined) return \"Does not expire.\";\n\tconst expiration = new Date(option.expiresAt * 1_000);\n\tif (Number.isNaN(expiration.getTime())) return \"Expiration unavailable.\";\n\treturn `Expires ${expiration.toLocaleString()}.`;\n}\n\nexport function resetConfirmationLines(option: CodexResetOption | undefined): string[] {\n\tif (!option) return [\"The selected reset is unavailable.\"];\n\treturn [\n\t\toption.title,\n\t\tresetOptionExpiration(option),\n\t\toption.description,\n\t\t\"This consumes one earned reset for the current OpenAI Codex account.\",\n\t];\n}\n\nexport function formatCodexResetOutcome(\n\toutcome: CodexResetOutcome | undefined,\n\tremainingCount: number | undefined,\n): string {\n\tconst remaining =\n\t\tremainingCount === undefined\n\t\t\t? \"\"\n\t\t\t: ` You have ${remainingCount} ${resetLabel(remainingCount)} left.`;\n\tif (!outcome) return \"You don't have any usage limit resets available.\";\n\tif (outcome.code === \"reset\") return `Usage reset.${remaining}`.trim();\n\tif (outcome.code === \"already_redeemed\") {\n\t\treturn `Usage reset was already completed.${remaining}`.trim();\n\t}\n\tif (outcome.code === \"nothing_to_reset\") {\n\t\treturn \"Your usage does not need a reset right now.\";\n\t}\n\treturn \"No usage limit resets are available.\";\n}\n\nexport function resetLabel(count: number): string {\n\treturn count === 1 ? \"usage limit reset\" : \"usage limit resets\";\n}\n\nexport async function resolveCodexResetAuth(\n\tctx: ExtensionContext,\n\tsalt: Uint8Array = AUTH_FINGERPRINT_SALT,\n\tcredentialReader: StoredCredentialReader = readStoredCredential,\n\tcandidateReader?: OAuthCredentialCandidateReader,\n): Promise<ResolvedUsageAuth> {\n\tconst model = ctx.model;\n\tif (model?.provider !== \"openai-codex\") {\n\t\tthrow new Error(\"Usage limit resets require the current model to use OpenAI Codex.\");\n\t}\n\tconst expectedModel = `${model.provider}/${model.id}`;\n\tconst adapter = adapterForProvider(\"openai-codex\");\n\tif (!adapter) throw new Error(\"OpenAI Codex usage support is unavailable.\");\n\tconst auth = await resolveUsageAuth(ctx, adapter, salt, credentialReader);\n\tif (`${ctx.model?.provider}/${ctx.model?.id}` !== expectedModel) {\n\t\tthrow new Error(\"The current model changed while resolving Codex reset authentication.\");\n\t}\n\tif (!auth) throw new Error(\"No runtime credential is configured for OpenAI Codex.\");\n\n\tconst resolvedAccess = bearerToken(headerValue(auth.headers, \"Authorization\")) ?? auth.apiKey;\n\tif (!resolvedAccess) throw new Error(\"OpenAI Codex OAuth credentials were incomplete.\");\n\tconst resolvedAccountId = codexAccountIdFromAccessToken(resolvedAccess);\n\tif (!resolvedAccountId) {\n\t\tthrow new Error(\"The active OpenAI Codex access token did not contain a valid account ID.\");\n\t}\n\tconst offered = candidateReader\n\t\t? candidateReader(ctx, \"openai-codex\")\n\t\t: fallbackOAuthCredentialCandidates(\"openai-codex\", credentialReader);\n\tif (!offered.ok) throw new Error(\"OpenAI Codex OAuth credential discovery failed closed.\");\n\tconst { accountId, storedAccess } = selectCodexResetCredential(\n\t\toffered.candidates,\n\t\tresolvedAccess,\n\t\tresolvedAccountId,\n\t\toffered.offeredCount === 0,\n\t);\n\tconst authorization = `Bearer ${resolvedAccess}`;\n\tconst headers = {\n\t\tAuthorization: authorization,\n\t\t\"chatgpt-account-id\": accountId,\n\t};\n\treturn {\n\t\tapiKey: resolvedAccess,\n\t\theaders,\n\t\tfingerprint: fingerprintResolvedAuth({ headers }, salt),\n\t\tsecrets: [\n\t\t\t...new Set([...auth.secrets, storedAccess, resolvedAccess, authorization, accountId]),\n\t\t],\n\t\tmodel: auth.model,\n\t};\n}\n\nexport async function listCodexResetCredits(\n\tauth: ResolvedUsageAuth,\n\tsignal: AbortSignal,\n\ttimeoutMs: number,\n): Promise<CodexResetAvailability> {\n\tconst payload = await fetchProviderJson(\n\t\tCODEX_RESET_CREDITS_URL,\n\t\tauth,\n\t\tsignal,\n\t\ttimeoutMs,\n\t\t\"Codex usage-limit reset endpoint\",\n\t);\n\treturn normalizeCodexResetCreditsPayload(payload);\n}\n\nexport async function consumeCodexResetCredit(\n\tauth: ResolvedUsageAuth,\n\toption: CodexResetOption,\n\tredeemRequestId: string,\n\tsignal: AbortSignal,\n\ttimeoutMs: number,\n): Promise<CodexResetOutcome> {\n\tif (!redeemRequestId) throw new Error(\"Codex reset redemption request ID must not be empty.\");\n\tconst payload = await fetchProviderJson(\n\t\tCODEX_RESET_CONSUME_URL,\n\t\tauth,\n\t\tsignal,\n\t\ttimeoutMs,\n\t\t\"Codex usage-limit reset consume endpoint\",\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\tbody: {\n\t\t\t\tredeem_request_id: redeemRequestId,\n\t\t\t\t...(option.creditId ? { credit_id: option.creditId } : {}),\n\t\t\t},\n\t\t},\n\t);\n\tconst code = payload.code;\n\tif (!isCodexResetOutcomeCode(code)) {\n\t\tthrow new Error(\"Codex reset consume endpoint returned an unknown outcome code.\");\n\t}\n\tconst windowsReset =\n\t\tpayload.windows_reset === undefined ? 0 : nonnegativeInteger(payload.windows_reset);\n\tif (windowsReset === undefined) {\n\t\tthrow new Error(\"Codex reset consume endpoint returned an invalid windows_reset value.\");\n\t}\n\treturn { code, windowsReset };\n}\n\nexport function normalizeCodexResetCreditsPayload(\n\tpayload: Record<string, unknown>,\n): CodexResetAvailability {\n\tconst availableCount = nonnegativeInteger(payload.available_count);\n\tif (availableCount === undefined) {\n\t\tthrow new Error(\"Codex reset credits response returned an invalid available_count.\");\n\t}\n\tconst rawCredits = payload.credits;\n\tif (rawCredits !== undefined && !Array.isArray(rawCredits)) {\n\t\tthrow new Error(\"Codex reset credits response returned invalid credits.\");\n\t}\n\n\tconst options = (rawCredits ?? [])\n\t\t.map(asObject)\n\t\t.filter((credit): credit is Record<string, unknown> => Boolean(credit))\n\t\t.filter((credit) => credit.status === \"available\" && credit.reset_type === \"codex_rate_limits\")\n\t\t.map(normalizeResetOption)\n\t\t.sort(\n\t\t\t(left, right) =>\n\t\t\t\t(left.expiresAt ?? Number.MAX_SAFE_INTEGER) - (right.expiresAt ?? Number.MAX_SAFE_INTEGER),\n\t\t)\n\t\t.slice(0, Math.min(availableCount, MAX_RESET_OPTIONS));\n\n\tif (availableCount > 0 && options.length === 0) {\n\t\toptions.push(genericCodexResetOption());\n\t}\n\treturn { availableCount, options };\n}\n\nfunction selectCodexResetCredential(\n\tcandidates: readonly unknown[],\n\tresolvedAccess: string,\n\tresolvedAccountId: string,\n\tstandaloneFallback: boolean,\n): { accountId: string; storedAccess: string } {\n\tlet sawOAuth = false;\n\tlet sawMatchingAccess = false;\n\tlet sawInvalidAccountId = false;\n\tconst matches = new Map<string, { accountId: string; storedAccess: string }>();\n\tfor (const candidate of candidates) {\n\t\ttry {\n\t\t\tconst credential = asObject(candidate);\n\t\t\tif (credential?.type !== \"oauth\") continue;\n\t\t\tsawOAuth = true;\n\t\t\tconst storedAccess = asNonemptyString(credential.access);\n\t\t\tif (storedAccess !== resolvedAccess) continue;\n\t\t\tsawMatchingAccess = true;\n\t\t\tconst accountId = validHeaderValue(credential.accountId);\n\t\t\tconst refresh = asNonemptyString(credential.refresh);\n\t\t\tif (!accountId || accountId !== resolvedAccountId || !refresh) {\n\t\t\t\tsawInvalidAccountId = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tmatches.set(refresh, { accountId, storedAccess });\n\t\t} catch {\n\t\t\t// Malformed candidates never authorize a reset request.\n\t\t}\n\t}\n\tif (sawInvalidAccountId) {\n\t\tthrow new Error(\"The OpenAI Codex OAuth credential did not include a valid account ID.\");\n\t}\n\tif (matches.size > 1) {\n\t\tthrow new Error(\"Conflicting OAuth credentials match the active OpenAI Codex runtime account.\");\n\t}\n\tconst match = matches.values().next().value;\n\tif (match) return match;\n\tif (!sawOAuth) {\n\t\tthrow new Error(\n\t\t\tstandaloneFallback\n\t\t\t\t? \"Usage limit resets require the OpenAI Codex OAuth account configured through Pi /login.\"\n\t\t\t\t: \"Usage limit resets require an OpenAI Codex OAuth account configured through Pi /login or a compatible credential source.\",\n\t\t);\n\t}\n\tif (sawMatchingAccess) throw new Error(\"OpenAI Codex OAuth credentials were incomplete.\");\n\tthrow new Error(\n\t\tstandaloneFallback\n\t\t\t? \"The active OpenAI Codex runtime account does not match Pi's stored OAuth account.\"\n\t\t\t: \"The active OpenAI Codex runtime account does not match any available OAuth account.\",\n\t);\n}\n\nfunction codexAccountIdFromAccessToken(access: string): string | undefined {\n\ttry {\n\t\tconst parts = access.split(\".\");\n\t\tif (parts.length !== 3 || !parts[1]) return undefined;\n\t\tconst payload = JSON.parse(Buffer.from(parts[1], \"base64url\").toString(\"utf8\")) as unknown;\n\t\tconst claims = asObject(asObject(payload)?.[\"https://api.openai.com/auth\"]);\n\t\treturn validHeaderValue(claims?.chatgpt_account_id);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction normalizeResetOption(credit: Record<string, unknown>): CodexResetOption {\n\tconst creditId = asOpaqueId(credit.id);\n\tif (!creditId) throw new Error(\"Codex reset credits response returned an invalid credit ID.\");\n\tlet expiresAt: number | undefined;\n\tif (credit.expires_at !== undefined && credit.expires_at !== null) {\n\t\tif (typeof credit.expires_at !== \"string\") {\n\t\t\tthrow new Error(\"Codex reset credits response returned an invalid expiration time.\");\n\t\t}\n\t\tconst parsed = Date.parse(credit.expires_at);\n\t\tif (!Number.isFinite(parsed)) {\n\t\t\tthrow new Error(\"Codex reset credits response returned an invalid expiration time.\");\n\t\t}\n\t\texpiresAt = Math.floor(parsed / 1_000);\n\t}\n\tconst title = displayString(credit.title) ?? \"Full reset\";\n\tconst description = displayString(credit.description) ?? \"Reset your current usage limits.\";\n\treturn {\n\t\tcreditId,\n\t\ttitle,\n\t\tdescription,\n\t\t...(expiresAt === undefined ? {} : { expiresAt }),\n\t};\n}\n\nfunction isCodexResetOutcomeCode(value: unknown): value is CodexResetOutcomeCode {\n\treturn (\n\t\tvalue === \"reset\" ||\n\t\tvalue === \"nothing_to_reset\" ||\n\t\tvalue === \"no_credit\" ||\n\t\tvalue === \"already_redeemed\"\n\t);\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\treturn value as Record<string, unknown>;\n}\n\nfunction asNonemptyString(value: unknown): string | undefined {\n\treturn typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction asOpaqueId(value: unknown): string | undefined {\n\tif (typeof value !== \"string\" || value.length === 0 || value.length > MAX_CREDIT_ID_CHARS) {\n\t\treturn undefined;\n\t}\n\treturn value;\n}\n\nfunction displayString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\treturn sanitizeDisplayText(value, 160) || undefined;\n}\n\nfunction validHeaderValue(value: unknown): string | undefined {\n\tif (typeof value !== \"string\" || !value || value.length > 512) return undefined;\n\tif (/[^\\x20-\\x7e]/u.test(value)) return undefined;\n\treturn value;\n}\n\nfunction nonnegativeInteger(value: unknown): number | undefined {\n\tconst parsed =\n\t\ttypeof value === \"number\"\n\t\t\t? value\n\t\t\t: typeof value === \"string\" && value.trim()\n\t\t\t\t? Number(value)\n\t\t\t\t: Number.NaN;\n\tif (!Number.isSafeInteger(parsed) || parsed < 0) return undefined;\n\treturn parsed;\n}\n\nfunction bearerToken(authorization: string | undefined): string | undefined {\n\treturn /^Bearer\\s+(.+)$/iu.exec(authorization ?? \"\")?.[1];\n}\n\nfunction headerValue(headers: Record<string, string>, name: string): string | undefined {\n\treturn Object.entries(headers).find(\n\t\t([candidate]) => candidate.toLowerCase() === name.toLowerCase(),\n\t)?.[1];\n}\n", "import { createHmac } from \"node:crypto\";\nimport type { UsageReport } from \"./types.js\";\n\nexport class UsageCache {\n\tprivate readonly entries = new Map<string, { createdAt: number; report: UsageReport }>();\n\tprivate readonly ttlMs: number;\n\tprivate readonly maxEntries: number;\n\n\tconstructor(ttlMs: number, maxEntries = 32) {\n\t\tif (!Number.isFinite(ttlMs) || ttlMs <= 0) throw new Error(\"Cache TTL must be positive.\");\n\t\tif (!Number.isSafeInteger(maxEntries) || maxEntries < 1) {\n\t\t\tthrow new Error(\"Cache entry limit must be a positive integer.\");\n\t\t}\n\t\tthis.ttlMs = ttlMs;\n\t\tthis.maxEntries = maxEntries;\n\t}\n\n\tget size(): number {\n\t\treturn this.entries.size;\n\t}\n\n\tget(providerId: string, fingerprint: string, now = Date.now()): UsageReport | undefined {\n\t\tthis.sweepExpired(now);\n\t\treturn this.entries.get(cacheKey(providerId, fingerprint))?.report;\n\t}\n\n\tset(providerId: string, fingerprint: string, report: UsageReport, now = Date.now()): void {\n\t\tthis.sweepExpired(now);\n\t\tconst key = cacheKey(providerId, fingerprint);\n\t\tthis.entries.delete(key);\n\t\twhile (this.entries.size >= this.maxEntries) {\n\t\t\tconst oldest = this.entries.keys().next().value;\n\t\t\tif (oldest === undefined) break;\n\t\t\tthis.entries.delete(oldest);\n\t\t}\n\t\tthis.entries.set(key, { createdAt: now, report });\n\t}\n\n\tclearProvider(providerId: string): void {\n\t\tfor (const key of this.entries.keys()) {\n\t\t\tif (key.startsWith(`${providerId}:`)) this.entries.delete(key);\n\t\t}\n\t}\n\n\tclear(): void {\n\t\tthis.entries.clear();\n\t}\n\n\tprivate sweepExpired(now: number): void {\n\t\tfor (const [key, entry] of this.entries) {\n\t\t\tif (now - entry.createdAt >= this.ttlMs) this.entries.delete(key);\n\t\t}\n\t}\n}\n\nexport function fingerprintResolvedAuth(\n\tauth: { apiKey?: string; headers?: Record<string, string> },\n\tsalt: Uint8Array,\n): string {\n\tconst headers = Object.entries(auth.headers ?? {})\n\t\t.map(([name, value]) => [name.toLowerCase(), value] as const)\n\t\t.sort(([left], [right]) => left.localeCompare(right));\n\tconst canonical = JSON.stringify({ apiKey: auth.apiKey ?? \"\", headers });\n\treturn createHmac(\"sha256\", salt).update(canonical).digest(\"hex\");\n}\n\nexport async function runWithConcurrency<T, R>(\n\titems: readonly T[],\n\tlimit: number,\n\tworker: (item: T, index: number, signal: AbortSignal) => Promise<R>,\n\tsignal: AbortSignal,\n): Promise<PromiseSettledResult<R>[]> {\n\tif (signal.aborted) throw abortError();\n\tif (!Number.isSafeInteger(limit) || limit < 1)\n\t\tthrow new Error(\"Concurrency limit must be positive.\");\n\n\tconst results = new Array<PromiseSettledResult<R>>(items.length);\n\tlet nextIndex = 0;\n\tconst runners = Array.from({ length: Math.min(limit, items.length) }, async () => {\n\t\twhile (nextIndex < items.length) {\n\t\t\tif (signal.aborted) throw abortError();\n\t\t\tconst index = nextIndex;\n\t\t\tnextIndex += 1;\n\t\t\ttry {\n\t\t\t\tresults[index] = {\n\t\t\t\t\tstatus: \"fulfilled\",\n\t\t\t\t\tvalue: await worker(items[index] as T, index, signal),\n\t\t\t\t};\n\t\t\t} catch (reason) {\n\t\t\t\tresults[index] = { status: \"rejected\", reason };\n\t\t\t}\n\t\t}\n\t});\n\n\tawait Promise.all(runners);\n\tif (signal.aborted) throw abortError();\n\treturn results;\n}\n\nexport async function awaitWithDeadline<T>(\n\toperation: Promise<T>,\n\tsignal: AbortSignal,\n\ttimeoutMs: number,\n\tdescription: string,\n): Promise<T> {\n\tif (signal.aborted) throw abortError();\n\tconst controller = new AbortController();\n\tconst abortFromCaller = () => controller.abort();\n\tsignal.addEventListener(\"abort\", abortFromCaller, { once: true });\n\tconst timeout = setTimeout(() => controller.abort(), timeoutMs);\n\ttry {\n\t\treturn await Promise.race([\n\t\t\toperation,\n\t\t\tnew Promise<never>((_resolve, reject) => {\n\t\t\t\tcontroller.signal.addEventListener(\n\t\t\t\t\t\"abort\",\n\t\t\t\t\t() => {\n\t\t\t\t\t\treject(\n\t\t\t\t\t\t\tsignal.aborted\n\t\t\t\t\t\t\t\t? abortError()\n\t\t\t\t\t\t\t\t: Object.assign(\n\t\t\t\t\t\t\t\t\t\tnew Error(`Timed out after ${Math.round(timeoutMs / 1000)}s ${description}.`),\n\t\t\t\t\t\t\t\t\t\t{ name: \"TimeoutError\" },\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\t{ once: true },\n\t\t\t\t);\n\t\t\t}),\n\t\t]);\n\t} finally {\n\t\tclearTimeout(timeout);\n\t\tsignal.removeEventListener(\"abort\", abortFromCaller);\n\t}\n}\n\nexport function sanitizeDisplayText(value: string, maxChars = 160): string {\n\tlet result = \"\";\n\tfor (let index = 0; index < value.length; ) {\n\t\tconst codePoint = value.codePointAt(index) ?? 0;\n\t\tconst character = String.fromCodePoint(codePoint);\n\t\tif (codePoint === 0x1b || codePoint === 0x9b || codePoint === 0x9d) {\n\t\t\tindex = skipTerminalEscape(value, index, codePoint);\n\t\t\tcontinue;\n\t\t}\n\t\tif (codePoint <= 0x1f || (codePoint >= 0x7f && codePoint <= 0x9f)) {\n\t\t\tif (codePoint === 0x09 || codePoint === 0x0a || codePoint === 0x0d) result += \" \";\n\t\t\tindex += character.length;\n\t\t\tcontinue;\n\t\t}\n\t\tresult += character;\n\t\tindex += character.length;\n\t}\n\treturn truncate(result.replace(/\\s+/gu, \" \").trim(), maxChars);\n}\n\nexport function redactUsageError(value: string, secrets: readonly string[] = []): string {\n\tlet redacted = value;\n\tfor (const secret of [...new Set(secrets)].filter(Boolean).sort((a, b) => b.length - a.length)) {\n\t\tredacted = redacted.replace(new RegExp(escapeRegExp(secret), \"g\"), \"<redacted>\");\n\t}\n\tredacted = redacted\n\t\t.replace(/Bearer\\s+[A-Za-z0-9._~+/=-]+/gi, \"Bearer <redacted>\")\n\t\t.replace(/\"(?:access_token|refresh_token|api_key)\"\\s*:\\s*\"[^\"]+\"/gi, (match) => {\n\t\t\tconst separator = match.indexOf(\":\");\n\t\t\treturn `${match.slice(0, separator + 1)}\"<redacted>\"`;\n\t\t});\n\treturn sanitizeDisplayText(redacted, 600);\n}\n\nexport function errorMessage(error: unknown): string {\n\treturn sanitizeDisplayText(error instanceof Error ? error.message : String(error), 600);\n}\n\nexport function abortError(): Error {\n\treturn Object.assign(new Error(\"Usage query aborted.\"), { name: \"AbortError\" });\n}\n\nfunction skipTerminalEscape(value: string, start: number, codePoint: number): number {\n\tlet index = start + 1;\n\tconst next = value.charCodeAt(index);\n\tconst isOsc = codePoint === 0x9d || (codePoint === 0x1b && next === 0x5d);\n\tif (isOsc) {\n\t\tif (codePoint === 0x1b) index += 1;\n\t\twhile (index < value.length) {\n\t\t\tconst current = value.charCodeAt(index);\n\t\t\tif (current === 0x07) return index + 1;\n\t\t\tif (current === 0x1b && value.charCodeAt(index + 1) === 0x5c) return index + 2;\n\t\t\tindex += 1;\n\t\t}\n\t\treturn index;\n\t}\n\tconst isCsi = codePoint === 0x9b || (codePoint === 0x1b && next === 0x5b);\n\tif (isCsi) {\n\t\tif (codePoint === 0x1b) index += 1;\n\t\twhile (index < value.length) {\n\t\t\tconst current = value.charCodeAt(index);\n\t\t\tindex += 1;\n\t\t\tif (current >= 0x40 && current <= 0x7e) break;\n\t\t}\n\t\treturn index;\n\t}\n\treturn Math.min(value.length, start + (codePoint === 0x1b ? 2 : 1));\n}\n\nfunction cacheKey(providerId: string, fingerprint: string): string {\n\treturn `${providerId}:${fingerprint}`;\n}\n\nfunction escapeRegExp(value: string): string {\n\treturn value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction truncate(value: string, maxChars: number): string {\n\tif (value.length <= maxChars) return value;\n\treturn `${value.slice(0, maxChars - 1)}\u2026`;\n}\n", "import type { OAuthCredential } from \"@earendil-works/pi-ai\";\nimport {\n\ttype ExtensionAPI,\n\ttype ExtensionContext,\n\treadStoredCredential,\n} 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\t| { ok: true; candidates: readonly OAuthCredential[]; offeredCount?: number }\n\t| { ok: false };\n\nexport type OAuthCredentialCandidateReader = (\n\tctx: ExtensionContext,\n\tproviderId: string,\n) => OAuthCredentialCandidates;\n\nexport function createOAuthCredentialCandidateReader(\n\tpi: ExtensionAPI,\n\tcredentialReader: StoredCredentialReader = readStoredCredential,\n): OAuthCredentialCandidateReader {\n\treturn (ctx, providerId) =>\n\t\tcollectOAuthCredentialCandidates(pi, ctx, providerId, credentialReader);\n}\n\nexport function collectOAuthCredentialCandidates(\n\tpi: Pick<ExtensionAPI, \"events\">,\n\tctx: ExtensionContext,\n\tproviderId: string,\n\tcredentialReader: StoredCredentialReader = readStoredCredential,\n): OAuthCredentialCandidates {\n\tconst candidates: OAuthCredential[] = [];\n\tlet collecting = true;\n\tconst request = Object.freeze({\n\t\tsession: ctx.sessionManager,\n\t\tprovider: providerId,\n\t\toffer(candidate: unknown) {\n\t\t\tif (!collecting) return;\n\t\t\tconst clone = cloneOAuthCredential(candidate);\n\t\t\tif (clone) candidates.push(clone);\n\t\t},\n\t});\n\ttry {\n\t\tpi.events.emit(OAUTH_CREDENTIAL_SOURCE_CHANNEL, request);\n\t} catch {\n\t\treturn { ok: false };\n\t} finally {\n\t\tcollecting = false;\n\t}\n\tconst offeredCount = candidates.length;\n\ttry {\n\t\tconst fallback = cloneOAuthCredential(credentialReader(providerId));\n\t\tif (fallback) candidates.push(fallback);\n\t} catch {\n\t\t// A malformed or unavailable standalone credential is equivalent to no fallback.\n\t}\n\treturn { ok: true, candidates, offeredCount };\n}\n\nexport function fallbackOAuthCredentialCandidates(\n\tproviderId: string,\n\tcredentialReader: StoredCredentialReader,\n): OAuthCredentialCandidates {\n\ttry {\n\t\tconst credential = cloneOAuthCredential(credentialReader(providerId));\n\t\treturn { ok: true, candidates: credential ? [credential] : [], offeredCount: 0 };\n\t} catch {\n\t\treturn { ok: true, candidates: [], offeredCount: 0 };\n\t}\n}\n\nfunction cloneOAuthCredential(value: unknown): OAuthCredential | undefined {\n\ttry {\n\t\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\t\tconst clone = structuredClone(value) as OAuthCredential;\n\t\tif (!clone || typeof clone !== \"object\" || Array.isArray(clone)) return undefined;\n\t\tif (clone.type !== \"oauth\") return undefined;\n\t\tif (typeof clone.access !== \"string\" || !clone.access) return undefined;\n\t\tif (typeof clone.refresh !== \"string\" || !clone.refresh) return undefined;\n\t\tif (typeof clone.expires !== \"number\" || !Number.isFinite(clone.expires)) return undefined;\n\t\treturn clone;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n", "import { randomBytes } from \"node:crypto\";\nimport { type ExtensionContext, readStoredCredential } from \"@earendil-works/pi-coding-agent\";\nimport { errorMessage, fingerprintResolvedAuth, redactUsageError } from \"./core.js\";\nimport {\n\tfallbackOAuthCredentialCandidates,\n\ttype OAuthCredentialCandidateReader,\n} from \"./oauth-credential-source.js\";\nimport { normalizeCodexBackendPayload } from \"./providers/codex.js\";\nimport { normalizeDeepSeekBalancePayload } from \"./providers/deepseek.js\";\nimport {\n\tisFireworksAccountId,\n\tnormalizeFireworksAccountsPayload,\n\tnormalizeFireworksBillingSummaryPayload,\n} from \"./providers/fireworks.js\";\nimport { normalizeGitHubCopilotUsagePayload } from \"./providers/github-copilot.js\";\nimport { normalizeKimiCodingUsagePayload } from \"./providers/kimi-coding.js\";\nimport { normalizeOpenCodeZenPayload } from \"./providers/opencode-zen.js\";\nimport { normalizeOpenRouterKeyPayload } from \"./providers/openrouter.js\";\nimport { normalizeXaiBillingPayload } from \"./providers/xai.js\";\nimport { normalizeZaiQuotaPayload } from \"./providers/zai.js\";\nimport type {\n\tCodexBackendPayload,\n\tDeepSeekBalancePayload,\n\tFireworksAccountsPayload,\n\tFireworksBillingSummaryPayload,\n\tGitHubCopilotUsagePayload,\n\tKimiCodingUsagePayload,\n\tOpenCodeZenPayload,\n\tOpenRouterKeyPayload,\n\tPiModel,\n\tResolvedUsageAuth,\n\tUsageProviderAdapter,\n\tUsageQuerySettings,\n\tUsageReport,\n\tXaiBillingPayload,\n\tXaiUserPayload,\n\tZaiQuotaPayload,\n} from \"./types.js\";\n\nconst CODEX_USAGE_URL = \"https://chatgpt.com/backend-api/wham/usage\";\nconst DEEPSEEK_BALANCE_URL = \"https://api.deepseek.com/user/balance\";\nconst FIREWORKS_BILLING_SUMMARY_ORIGIN = \"https://api.fireworks.ai\";\nconst FIREWORKS_SPEND_WINDOW_DAYS = 30;\nconst FIREWORKS_MAX_ACCOUNT_PAGES = 5;\nconst GITHUB_COPILOT_USAGE_URL = \"https://api.github.com/copilot_internal/user\";\nconst OPENROUTER_KEY_URL = \"https://openrouter.ai/api/v1/key\";\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 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\t\"X-XAI-Token-Auth\": \"xai-grok-cli\",\n\t\"x-grok-client-version\": \"1.0.10\",\n\t\"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 type UsageRequestGuard = () => Promise<void>;\n\nexport const SUPPORTED_ADAPTERS: readonly UsageProviderAdapter[] = [\n\t{\n\t\tid: \"openai-codex\",\n\t\tdisplayName: \"OpenAI Codex\",\n\t\tsemantics: {\n\t\t\tkind: \"consumer-subscription\",\n\t\t\tlabel: \"ChatGPT subscription limits\",\n\t\t},\n\t\tasync query(auth, signal, timeoutMs) {\n\t\t\tconst payload = await fetchProviderJson(\n\t\t\t\tCODEX_USAGE_URL,\n\t\t\t\tauth,\n\t\t\t\tsignal,\n\t\t\t\ttimeoutMs,\n\t\t\t\t\"Codex usage endpoint\",\n\t\t\t);\n\t\t\treturn normalizeCodexBackendPayload(payload as CodexBackendPayload, Date.now());\n\t\t},\n\t},\n\t{\n\t\tid: \"deepseek\",\n\t\tdisplayName: \"DeepSeek\",\n\t\tsemantics: { kind: \"api-key\", label: \"DeepSeek API balance\" },\n\t\tasync query(auth, signal, timeoutMs, guard) {\n\t\t\tif (!guard) throw new Error(\"DeepSeek API balance requires request-boundary revalidation.\");\n\t\t\tconst startedAt = Date.now();\n\t\t\tawait guard();\n\t\t\tconst remainingMs = timeoutMs - (Date.now() - startedAt);\n\t\t\tif (remainingMs <= 0) throw new Error(\"Timed out while revalidating DeepSeek runtime auth.\");\n\t\t\tconst payload = await fetchProviderJson(\n\t\t\t\tDEEPSEEK_BALANCE_URL,\n\t\t\t\tauth,\n\t\t\t\tsignal,\n\t\t\t\tremainingMs,\n\t\t\t\t\"DeepSeek API balance endpoint\",\n\t\t\t\t{ redirect: \"error\" },\n\t\t\t);\n\t\t\treturn normalizeDeepSeekBalancePayload(payload as DeepSeekBalancePayload, Date.now());\n\t\t},\n\t},\n\t{\n\t\tid: \"github-copilot\",\n\t\tdisplayName: \"GitHub Copilot\",\n\t\tsemantics: {\n\t\t\tkind: \"consumer-subscription\",\n\t\t\tlabel: \"GitHub Copilot account allowance\",\n\t\t},\n\t\tasync query(auth, signal, timeoutMs) {\n\t\t\tconst payload = await fetchProviderJson(\n\t\t\t\tGITHUB_COPILOT_USAGE_URL,\n\t\t\t\tauth,\n\t\t\t\tsignal,\n\t\t\t\ttimeoutMs,\n\t\t\t\t\"GitHub Copilot usage endpoint\",\n\t\t\t);\n\t\t\treturn normalizeGitHubCopilotUsagePayload(payload as GitHubCopilotUsagePayload, Date.now());\n\t\t},\n\t},\n\t{\n\t\tid: \"openrouter\",\n\t\tdisplayName: \"OpenRouter\",\n\t\tsemantics: { kind: \"api-key\", label: \"API-key spend limits\" },\n\t\tasync query(auth, signal, timeoutMs) {\n\t\t\tconst payload = await fetchProviderJson(\n\t\t\t\tOPENROUTER_KEY_URL,\n\t\t\t\tauth,\n\t\t\t\tsignal,\n\t\t\t\ttimeoutMs,\n\t\t\t\t\"OpenRouter key endpoint\",\n\t\t\t);\n\t\t\treturn normalizeOpenRouterKeyPayload(payload as OpenRouterKeyPayload, Date.now());\n\t\t},\n\t},\n\t{\n\t\tid: \"fireworks\",\n\t\tdisplayName: \"Fireworks\",\n\t\tsemantics: { kind: \"api-key\", label: \"Fireworks API spend\" },\n\t\tasync query(auth, signal, timeoutMs, guard, settings) {\n\t\t\tif (!guard) throw new Error(\"Fireworks API spend requires request-boundary revalidation.\");\n\t\t\tconst startedAt = Date.now();\n\t\t\tawait guard();\n\t\t\tconst accountId = await resolveFireworksAccountId(\n\t\t\t\tauth,\n\t\t\t\tsignal,\n\t\t\t\tremainingTimeout(timeoutMs, startedAt, \"resolving the Fireworks account\"),\n\t\t\t\tguard,\n\t\t\t\tsettings?.fireworksAccountId,\n\t\t\t);\n\t\t\tawait guard();\n\t\t\tconst billingWindowAt = Date.now();\n\t\t\tconst payload = (await fetchProviderJson(\n\t\t\t\tfireworksBillingSummaryUrl(accountId, billingWindowAt),\n\t\t\t\tauth,\n\t\t\t\tsignal,\n\t\t\t\tremainingTimeout(timeoutMs, startedAt, \"fetching Fireworks rated spend\"),\n\t\t\t\t\"Fireworks billing summary endpoint\",\n\t\t\t\t{ redirect: \"error\" },\n\t\t\t)) as FireworksBillingSummaryPayload;\n\t\t\tawait guard();\n\t\t\treturn normalizeFireworksBillingSummaryPayload(payload, accountId, Date.now());\n\t\t},\n\t},\n\t{\n\t\tid: \"opencode-go\",\n\t\tdisplayName: \"OpenCode Go\",\n\t\tsemantics: { kind: \"consumer-subscription\", label: \"OpenCode Zen plan usage\" },\n\t\tasync query(auth, signal, timeoutMs) {\n\t\t\tconst payload = await fetchProviderJson(\n\t\t\t\tOPENCODE_GO_USAGE_URL,\n\t\t\t\tauth,\n\t\t\t\tsignal,\n\t\t\t\ttimeoutMs,\n\t\t\t\t\"OpenCode Zen usage endpoint\",\n\t\t\t);\n\t\t\treturn normalizeOpenCodeZenPayload(payload as OpenCodeZenPayload, Date.now());\n\t\t},\n\t},\n\t{\n\t\tid: \"kimi-coding\",\n\t\tdisplayName: \"Kimi For Coding\",\n\t\tsemantics: { kind: \"consumer-subscription\", label: \"Kimi Coding Plan usage\" },\n\t\tasync query(auth, signal, timeoutMs) {\n\t\t\tconst payload = await fetchProviderJson(\n\t\t\t\tKIMI_CODING_USAGE_URL,\n\t\t\t\tauth,\n\t\t\t\tsignal,\n\t\t\t\ttimeoutMs,\n\t\t\t\t\"Kimi Coding usage endpoint\",\n\t\t\t\t{ redirect: \"error\" },\n\t\t\t);\n\t\t\treturn normalizeKimiCodingUsagePayload(payload as KimiCodingUsagePayload, Date.now());\n\t\t},\n\t},\n\t{\n\t\tid: \"zai\",\n\t\tdisplayName: \"Z.AI\",\n\t\tsemantics: { kind: \"consumer-subscription\", label: \"GLM Coding Plan usage\" },\n\t\tasync query(auth, signal, timeoutMs) {\n\t\t\tconst payload = await fetchProviderJson(\n\t\t\t\tzaiMonitorUrl(auth.model.baseUrl),\n\t\t\t\tzaiMonitorAuth(auth),\n\t\t\t\tsignal,\n\t\t\t\ttimeoutMs,\n\t\t\t\t\"Z.AI quota endpoint\",\n\t\t\t);\n\t\t\treturn normalizeZaiQuotaPayload(\"zai\", \"Z.AI\", payload as ZaiQuotaPayload, Date.now());\n\t\t},\n\t},\n\t{\n\t\tid: \"zai-coding-cn\",\n\t\tdisplayName: \"Z.AI Coding CN\",\n\t\tsemantics: { kind: \"consumer-subscription\", label: \"GLM Coding Plan usage\" },\n\t\tasync query(auth, signal, timeoutMs) {\n\t\t\tconst payload = await fetchProviderJson(\n\t\t\t\tzaiMonitorUrl(auth.model.baseUrl),\n\t\t\t\tzaiMonitorAuth(auth),\n\t\t\t\tsignal,\n\t\t\t\ttimeoutMs,\n\t\t\t\t\"Z.AI Coding CN quota endpoint\",\n\t\t\t);\n\t\t\treturn normalizeZaiQuotaPayload(\n\t\t\t\t\"zai-coding-cn\",\n\t\t\t\t\"Z.AI Coding CN\",\n\t\t\t\tpayload as ZaiQuotaPayload,\n\t\t\t\tDate.now(),\n\t\t\t);\n\t\t},\n\t},\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\tid: \"xai\",\n\tdisplayName: \"xAI\",\n\tsemantics: {\n\t\tkind: \"consumer-subscription\",\n\t\tlabel: \"xAI consumer subscription usage\",\n\t},\n\tpublishesStatusline: false,\n\tasync query(auth, signal, timeoutMs, guard) {\n\t\tif (!guard) throw new Error(\"xAI usage requires request-boundary revalidation.\");\n\t\tconst startedAt = Date.now();\n\t\tconst clientAuth = {\n\t\t\t...auth,\n\t\t\theaders: { ...auth.headers, ...XAI_CLIENT_HEADERS },\n\t\t};\n\t\tawait guard();\n\t\tconst userPayload = (await fetchProviderJson(\n\t\t\tXAI_USER_URL,\n\t\t\tclientAuth,\n\t\t\tsignal,\n\t\t\tremainingTimeout(timeoutMs, startedAt),\n\t\t\t\"xAI consumer identity endpoint\",\n\t\t\t{ redirect: \"error\", userAgent: false },\n\t\t)) as XaiUserPayload;\n\t\tawait guard();\n\t\tconst userId = validatedXaiUserId(userPayload.userId);\n\t\tconst billingAuth = {\n\t\t\t...clientAuth,\n\t\t\theaders: { ...clientAuth.headers, \"x-userid\": userId },\n\t\t\tsecrets: [...clientAuth.secrets, userId],\n\t\t};\n\t\tawait guard();\n\t\tconst billingPayload = (await fetchProviderJson(\n\t\t\tXAI_BILLING_URL,\n\t\t\tbillingAuth,\n\t\t\tsignal,\n\t\t\tremainingTimeout(timeoutMs, startedAt),\n\t\t\t\"xAI consumer billing endpoint\",\n\t\t\t{ redirect: \"error\", userAgent: false },\n\t\t)) as XaiBillingPayload;\n\t\tawait guard();\n\t\treturn normalizeXaiBillingPayload(billingPayload, userPayload.subscriptionTier, Date.now());\n\t},\n};\n\nexport function usageAdapters(): readonly UsageProviderAdapter[] {\n\treturn [...SUPPORTED_ADAPTERS, XAI_ADAPTER];\n}\n\nexport function adapterForProvider(\n\tproviderId: string | undefined,\n): UsageProviderAdapter | undefined {\n\treturn usageAdapters().find((adapter) => adapter.id === providerId);\n}\n\nexport function isStaleExtensionContextError(error: unknown): boolean {\n\treturn (\n\t\terror instanceof Error &&\n\t\terror.message.includes(\"This extension ctx is stale after session replacement or reload\")\n\t);\n}\n\nexport async function resolveUsageAuth(\n\tctx: ExtensionContext,\n\tadapter: UsageProviderAdapter,\n\tsalt: Uint8Array = AUTH_FINGERPRINT_SALT,\n\tcredentialReader: StoredCredentialReader = readStoredCredential,\n\tcandidateReader?: OAuthCredentialCandidateReader,\n): Promise<ResolvedUsageAuth | undefined> {\n\tif (ctx.model?.provider === adapter.id && !hasOfficialOrigin(ctx.model, adapter.id)) {\n\t\tthrow new Error(\n\t\t\t`${adapter.displayName} usage cannot send a custom provider base URL credential to the official usage endpoint.`,\n\t\t);\n\t}\n\n\tconst model = candidateModels(ctx, adapter.id).find((candidate) =>\n\t\thasOfficialOrigin(candidate, adapter.id),\n\t);\n\tif (!model) return undefined;\n\t// SAFETY: Pi exposes the required auth methods at runtime, and checks below narrow them before use.\n\tconst registry = ctx.modelRegistry as unknown as UsageAuthRegistry;\n\tlet modelAuth: RequestAuth | undefined;\n\tconst currentModel = ctx.model?.provider === adapter.id ? ctx.model : undefined;\n\tconst resolveCurrentModelAuth = async (): Promise<RequestAuth | undefined> => {\n\t\tif (!currentModel || typeof registry.getApiKeyAndHeaders !== \"function\") return undefined;\n\t\tconst result = await registry.getApiKeyAndHeaders(currentModel);\n\t\tif (!result.ok) throw new Error(redactUsageError(result.error));\n\t\treturn authorizationFrom(result) ? result : undefined;\n\t};\n\tif (adapter.id !== \"deepseek\") modelAuth = await resolveCurrentModelAuth();\n\tif (typeof registry.getProviderAuth !== \"function\") {\n\t\tthrow new Error(\"pi-usage requires Pi 0.81.0 or newer to validate resolved provider auth.\");\n\t}\n\tconst providerResult = await registry.getProviderAuth(adapter.id);\n\tif (\n\t\tproviderResult?.auth.baseUrl &&\n\t\t!hasOfficialUrlOrigin(providerResult.auth.baseUrl, adapter.id)\n\t) {\n\t\tthrow new Error(\n\t\t\t`${adapter.displayName} usage cannot send a proxy-resolved credential to the official usage endpoint.`,\n\t\t);\n\t}\n\t// DeepSeek reads selected-model auth last so a rotation during provider-origin validation\n\t// cannot leave the earlier credential queued for the balance request.\n\tif (adapter.id === \"deepseek\") modelAuth = await resolveCurrentModelAuth();\n\tconst auth = modelAuth ?? providerResult?.auth;\n\tif (!auth) return undefined;\n\tif (adapter.id === \"github-copilot\") {\n\t\tconst offered = candidateReader\n\t\t\t? candidateReader(ctx, adapter.id)\n\t\t\t: fallbackOAuthCredentialCandidates(adapter.id, credentialReader);\n\t\tif (!offered.ok) {\n\t\t\tthrow new Error(\"GitHub Copilot OAuth credential discovery failed closed.\");\n\t\t}\n\t\treturn resolveGitHubCopilotUsageAuth(\n\t\t\tauth,\n\t\t\tmodel,\n\t\t\tsalt,\n\t\t\toffered.candidates,\n\t\t\toffered.offeredCount === 0,\n\t\t);\n\t}\n\tif (adapter.id === \"xai\") {\n\t\tconst offered = candidateReader\n\t\t\t? candidateReader(ctx, adapter.id)\n\t\t\t: fallbackOAuthCredentialCandidates(adapter.id, credentialReader);\n\t\tif (!offered.ok) throw new Error(\"xAI OAuth credential discovery failed closed.\");\n\t\treturn resolveXaiUsageAuth(auth, model, salt, offered.candidates);\n\t}\n\tif (adapter.id === \"deepseek\") {\n\t\tconst resolvedAuthorization = authorizationFrom(auth);\n\t\tconst access = bearerToken(resolvedAuthorization);\n\t\tif (!access) throw new Error(\"DeepSeek API balance requires Bearer authentication.\");\n\t\tconst authorization = `Bearer ${access}`;\n\t\tconst headers = { Authorization: authorization };\n\t\treturn {\n\t\t\tapiKey: access,\n\t\t\theaders,\n\t\t\tfingerprint: fingerprintResolvedAuth({ headers }, salt),\n\t\t\tsecrets: [\n\t\t\t\taccess,\n\t\t\t\tauth.apiKey,\n\t\t\t\theaderValue(auth.headers, \"Authorization\"),\n\t\t\t\tresolvedAuthorization,\n\t\t\t\tauthorization,\n\t\t\t].filter((value): value is string => Boolean(value)),\n\t\t\tmodel,\n\t\t};\n\t}\n\tconst authorization = authorizationFrom(auth);\n\tif (!authorization) return undefined;\n\tconst headers = { Authorization: authorization };\n\tconst secrets = [auth.apiKey, headerValue(auth.headers, \"Authorization\"), authorization].filter(\n\t\t(value): value is string => Boolean(value),\n\t);\n\treturn {\n\t\tapiKey: auth.apiKey,\n\t\theaders,\n\t\tfingerprint: fingerprintResolvedAuth({ headers }, salt),\n\t\tsecrets,\n\t\tmodel,\n\t};\n}\n\nexport async function queryProviderUsage(\n\tadapter: UsageProviderAdapter,\n\tauth: ResolvedUsageAuth,\n\tsignal: AbortSignal,\n\ttimeoutMs: number,\n\tguard?: UsageRequestGuard,\n\tsettings?: Readonly<UsageQuerySettings>,\n): Promise<UsageReport> {\n\ttry {\n\t\treturn await adapter.query(auth, signal, timeoutMs, guard, settings);\n\t} catch (error) {\n\t\tif (isStaleExtensionContextError(error) || isAbortError(error)) throw error;\n\t\tthrow new Error(redactUsageError(errorMessage(error), auth.secrets));\n\t}\n}\n\nexport function providerIsConfigured(ctx: ExtensionContext, providerId: string): boolean {\n\ttry {\n\t\treturn ctx.modelRegistry.getProviderAuthStatus(providerId).configured;\n\t} catch {\n\t\treturn candidateModels(ctx, providerId).length > 0;\n\t}\n}\n\nfunction candidateModels(ctx: ExtensionContext, providerId: string): PiModel[] {\n\tconst candidates: PiModel[] = [];\n\tconst seen = new Set<string>();\n\tconst add = (model: PiModel | undefined) => {\n\t\tif (!model || model.provider !== providerId) return;\n\t\tconst key = `${model.provider}/${model.id}`;\n\t\tif (seen.has(key)) return;\n\t\tseen.add(key);\n\t\tcandidates.push(model);\n\t};\n\tadd(ctx.model);\n\tfor (const model of ctx.modelRegistry.getAvailable()) add(model);\n\tfor (const model of ctx.modelRegistry.getAll()) add(model);\n\treturn candidates;\n}\n\nexport async function fetchProviderJson(\n\turl: string,\n\tauth: ResolvedUsageAuth,\n\tsignal: AbortSignal,\n\ttimeoutMs: number,\n\tdescription: string,\n\trequest: {\n\t\tmethod?: \"GET\" | \"POST\";\n\t\tbody?: Record<string, unknown>;\n\t\tredirect?: RequestRedirect;\n\t\tuserAgent?: boolean;\n\t} = {},\n): Promise<Record<string, unknown>> {\n\tconst controller = new AbortController();\n\tlet timedOut = false;\n\tconst abortFromCaller = () => controller.abort();\n\tif (signal.aborted) controller.abort();\n\telse signal.addEventListener(\"abort\", abortFromCaller, { once: true });\n\tconst timeout = setTimeout(() => {\n\t\ttimedOut = true;\n\t\tcontroller.abort();\n\t}, timeoutMs);\n\ttry {\n\t\tconst headers = { ...auth.headers };\n\t\tif (request.userAgent !== false && !hasHeader(headers, \"User-Agent\")) {\n\t\t\theaders[\"User-Agent\"] = \"pi-usage\";\n\t\t}\n\t\tif (request.body && !hasHeader(headers, \"Content-Type\")) {\n\t\t\theaders[\"Content-Type\"] = \"application/json\";\n\t\t}\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: request.method ?? \"GET\",\n\t\t\theaders,\n\t\t\t...(request.body ? { body: JSON.stringify(request.body) } : {}),\n\t\t\t...(request.redirect ? { redirect: request.redirect } : {}),\n\t\t\tsignal: controller.signal,\n\t\t});\n\t\tif (response.redirected) throw new Error(`${description} refused a redirected response.`);\n\t\tif (controller.signal.aborted)\n\t\t\tthrow Object.assign(new Error(\"Usage query aborted.\"), { name: \"AbortError\" });\n\t\tconst text = await readBoundedResponse(\n\t\t\tresponse,\n\t\t\tresponse.ok ? MAX_SUCCESS_BODY_BYTES : MAX_ERROR_BODY_BYTES,\n\t\t\t!response.ok,\n\t\t\tdescription,\n\t\t\tcontroller.signal,\n\t\t);\n\t\tif (controller.signal.aborted)\n\t\t\tthrow Object.assign(new Error(\"Usage query aborted.\"), { name: \"AbortError\" });\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(\n\t\t\t\t`${description} returned ${response.status} ${response.statusText}: ${redactUsageError(text, auth.secrets)}`,\n\t\t\t);\n\t\t}\n\t\tlet parsed: unknown;\n\t\ttry {\n\t\t\tparsed = JSON.parse(text) as unknown;\n\t\t} catch (error) {\n\t\t\tthrow new Error(`${description} returned invalid JSON: ${errorMessage(error)}`);\n\t\t}\n\t\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\t\tthrow new Error(`${description} response was not an object.`);\n\t\t}\n\t\treturn parsed as Record<string, unknown>;\n\t} catch (error) {\n\t\tif (timedOut) {\n\t\t\tthrow new Error(`Timed out after ${Math.round(timeoutMs / 1000)}s while fetching usage.`);\n\t\t}\n\t\tif (signal.aborted)\n\t\t\tthrow Object.assign(new Error(\"Usage query aborted.\"), { name: \"AbortError\" });\n\t\tthrow error;\n\t} finally {\n\t\tclearTimeout(timeout);\n\t\tsignal.removeEventListener(\"abort\", abortFromCaller);\n\t}\n}\n\nasync function readBoundedResponse(\n\tresponse: Response,\n\tmaxBytes: number,\n\ttruncateOverflow: boolean,\n\tdescription: string,\n\tsignal: AbortSignal,\n): Promise<string> {\n\tif (!response.body) return \"\";\n\tconst reader = response.body.getReader();\n\tconst chunks: Uint8Array[] = [];\n\tlet total = 0;\n\tlet truncated = false;\n\tconst abort = () => void reader.cancel().catch(() => undefined);\n\tif (signal.aborted) abort();\n\telse signal.addEventListener(\"abort\", abort, { once: true });\n\ttry {\n\t\twhile (true) {\n\t\t\tconst { done, value } = await reader.read();\n\t\t\tif (done) break;\n\t\t\tconst remaining = maxBytes - total;\n\t\t\tif (value.byteLength > remaining) {\n\t\t\t\tif (remaining > 0) chunks.push(value.subarray(0, remaining));\n\t\t\t\ttotal = maxBytes;\n\t\t\t\ttruncated = true;\n\t\t\t\tawait reader.cancel();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tchunks.push(value);\n\t\t\ttotal += value.byteLength;\n\t\t}\n\t} finally {\n\t\tsignal.removeEventListener(\"abort\", abort);\n\t\treader.releaseLock();\n\t}\n\tif (truncated && !truncateOverflow) {\n\t\tthrow new Error(`${description} response exceeded ${maxBytes} bytes.`);\n\t}\n\tconst body = new Uint8Array(total);\n\tlet offset = 0;\n\tfor (const chunk of chunks) {\n\t\tbody.set(chunk, offset);\n\t\toffset += chunk.byteLength;\n\t}\n\tconst text = new TextDecoder().decode(body);\n\treturn truncated ? `${text}\u2026` : text;\n}\n\ntype RequestAuth = {\n\tapiKey?: string;\n\theaders?: Record<string, string | null>;\n};\n\ntype StoredCredentialReader = (providerId: string) => unknown;\n\ntype UsageAuthRegistry = {\n\tgetApiKeyAndHeaders?(\n\t\tmodel: PiModel,\n\t): Promise<({ ok: true } & RequestAuth) | { ok: false; error: string }>;\n\tgetProviderAuth?(providerId: string): Promise<\n\t\t| {\n\t\t\t\tauth: RequestAuth & { baseUrl?: string };\n\t\t }\n\t\t| undefined\n\t>;\n};\n\nfunction resolveXaiUsageAuth(\n\tauth: RequestAuth,\n\tmodel: PiModel,\n\tsalt: Uint8Array,\n\tcandidates: readonly unknown[],\n): ResolvedUsageAuth {\n\tconst resolvedAccess = bearerToken(headerValue(auth.headers, \"Authorization\")) ?? auth.apiKey;\n\tif (!resolvedAccess) throw new Error(\"xAI runtime authentication was incomplete.\");\n\tlet sawOAuth = false;\n\tlet sawMatchingAccess = false;\n\tlet sawIncompleteMatch = false;\n\tconst matches: Array<{ access: string; refresh: string }> = [];\n\tfor (const candidate of candidates) {\n\t\ttry {\n\t\t\tconst credential = asObject(candidate);\n\t\t\tif (credential?.type !== \"oauth\") continue;\n\t\t\tsawOAuth = true;\n\t\t\tif (credential.access !== resolvedAccess) continue;\n\t\t\tsawMatchingAccess = true;\n\t\t\tif (\n\t\t\t\ttypeof credential.access !== \"string\" ||\n\t\t\t\t!credential.access ||\n\t\t\t\ttypeof credential.refresh !== \"string\" ||\n\t\t\t\t!credential.refresh ||\n\t\t\t\ttypeof credential.expires !== \"number\" ||\n\t\t\t\t!Number.isFinite(credential.expires)\n\t\t\t) {\n\t\t\t\tsawIncompleteMatch = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tmatches.push({ access: credential.access, refresh: credential.refresh });\n\t\t} catch {\n\t\t\t// Malformed candidates never authorize a consumer-proxy request.\n\t\t}\n\t}\n\tif (sawIncompleteMatch) throw new Error(\"The matching xAI OAuth credential was incomplete.\");\n\tif (matches.length > 1) {\n\t\tthrow new Error(\"Multiple OAuth credentials match the active xAI runtime account.\");\n\t}\n\tconst match = matches[0];\n\tif (!match) {\n\t\tif (!sawOAuth) {\n\t\t\tthrow new Error(\n\t\t\t\t\"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\t\t\t);\n\t\t}\n\t\tif (sawMatchingAccess) throw new Error(\"The matching xAI OAuth credential was incomplete.\");\n\t\tthrow new Error(\"The active xAI runtime account does not match Pi's stored OAuth account.\");\n\t}\n\tconst authorization = `Bearer ${match.access}`;\n\tconst headers = { Authorization: authorization };\n\treturn {\n\t\tapiKey: match.access,\n\t\theaders,\n\t\tfingerprint: fingerprintResolvedAuth({ headers }, salt),\n\t\tsecrets: [\n\t\t\tmatch.access,\n\t\t\tmatch.refresh,\n\t\t\tresolvedAccess,\n\t\t\tauth.apiKey,\n\t\t\theaderValue(auth.headers, \"Authorization\"),\n\t\t\tauthorization,\n\t\t].filter((value): value is string => Boolean(value)),\n\t\tmodel,\n\t};\n}\n\nfunction resolveGitHubCopilotUsageAuth(\n\tauth: RequestAuth,\n\tmodel: PiModel,\n\tsalt: Uint8Array,\n\tcandidates: readonly unknown[],\n\tstandaloneFallback: boolean,\n): ResolvedUsageAuth {\n\tconst resolvedAccess = bearerToken(headerValue(auth.headers, \"Authorization\")) ?? auth.apiKey;\n\tif (!resolvedAccess) throw new Error(\"GitHub Copilot OAuth credentials were incomplete.\");\n\tlet sawOAuth = false;\n\tlet sawMatchingAccess = false;\n\tlet sawIncompleteMatch = false;\n\tlet sawEnterpriseMatch = false;\n\tconst matches = new Map<string, { refresh: string; storedAccess: string }>();\n\tfor (const candidate of candidates) {\n\t\ttry {\n\t\t\tconst credential = asObject(candidate);\n\t\t\tif (credential?.type !== \"oauth\") continue;\n\t\t\tsawOAuth = true;\n\t\t\tconst storedAccess =\n\t\t\t\ttypeof credential.access === \"string\" && credential.access ? credential.access : undefined;\n\t\t\tif (storedAccess !== resolvedAccess) continue;\n\t\t\tsawMatchingAccess = true;\n\t\t\tconst enterpriseUrl = credential.enterpriseUrl;\n\t\t\tif (\n\t\t\t\ttypeof enterpriseUrl === \"string\" &&\n\t\t\t\tenterpriseUrl &&\n\t\t\t\t!isPublicGitHubDomain(enterpriseUrl)\n\t\t\t) {\n\t\t\t\tsawEnterpriseMatch = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst refresh =\n\t\t\t\ttypeof credential.refresh === \"string\" && credential.refresh\n\t\t\t\t\t? credential.refresh\n\t\t\t\t\t: undefined;\n\t\t\tif (!refresh) {\n\t\t\t\tsawIncompleteMatch = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tmatches.set(`${storedAccess.length}:${storedAccess}${refresh}`, { refresh, storedAccess });\n\t\t} catch {\n\t\t\t// Malformed candidates never authorize a provider request.\n\t\t}\n\t}\n\tif (sawEnterpriseMatch) {\n\t\tthrow new Error(\"GitHub Copilot usage does not yet support GitHub Enterprise accounts.\");\n\t}\n\tif (sawIncompleteMatch) throw new Error(\"GitHub Copilot OAuth credentials were incomplete.\");\n\tif (matches.size > 1) {\n\t\tthrow new Error(\n\t\t\t\"Conflicting OAuth credentials match the active GitHub Copilot runtime account.\",\n\t\t);\n\t}\n\tconst match = matches.values().next().value;\n\tif (!match) {\n\t\tif (!sawOAuth) {\n\t\t\tthrow new Error(\n\t\t\t\tstandaloneFallback\n\t\t\t\t\t? \"GitHub Copilot usage requires the OAuth account configured through Pi /login.\"\n\t\t\t\t\t: \"GitHub Copilot usage requires an OAuth account configured through Pi /login or a compatible credential source.\",\n\t\t\t);\n\t\t}\n\t\tif (sawMatchingAccess) throw new Error(\"GitHub Copilot OAuth credentials were incomplete.\");\n\t\tthrow new Error(\n\t\t\tstandaloneFallback\n\t\t\t\t? \"The active GitHub Copilot runtime account does not match Pi's stored OAuth account.\"\n\t\t\t\t: \"The active GitHub Copilot runtime account does not match any available OAuth account.\",\n\t\t);\n\t}\n\tconst { refresh, storedAccess } = match;\n\tconst authorization = `Bearer ${refresh}`;\n\tconst headers = {\n\t\tAuthorization: authorization,\n\t\t\"X-GitHub-Api-Version\": \"2025-05-01\",\n\t};\n\treturn {\n\t\tapiKey: refresh,\n\t\theaders,\n\t\tfingerprint: fingerprintResolvedAuth({ headers }, salt),\n\t\tsecrets: [refresh, storedAccess, resolvedAccess, authorization],\n\t\tmodel,\n\t};\n}\n\nfunction authorizationFrom(auth: RequestAuth): string | undefined {\n\treturn (\n\t\theaderValue(auth.headers, \"Authorization\") ??\n\t\t(auth.apiKey ? `Bearer ${auth.apiKey}` : undefined)\n\t);\n}\n\nfunction bearerToken(authorization: string | undefined): string | undefined {\n\tconst match = /^Bearer\\s+(.+)$/iu.exec(authorization ?? \"\");\n\treturn match?.[1];\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\treturn value as Record<string, unknown>;\n}\n\nfunction isPublicGitHubDomain(value: string): boolean {\n\ttry {\n\t\tconst url = new URL(value.includes(\"://\") ? value : `https://${value}`);\n\t\treturn url.hostname.toLowerCase() === \"github.com\";\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction hasOfficialOrigin(model: PiModel, providerId: string): boolean {\n\treturn hasOfficialUrlOrigin(model.baseUrl, providerId);\n}\n\nfunction hasOfficialUrlOrigin(value: string, providerId: string): boolean {\n\ttry {\n\t\tconst url = new URL(value);\n\t\tif (providerId === \"openai-codex\") return url.origin === \"https://chatgpt.com\";\n\t\tif (providerId === \"deepseek\") return url.origin === \"https://api.deepseek.com\";\n\t\tif (providerId === \"fireworks\") return url.origin === FIREWORKS_BILLING_SUMMARY_ORIGIN;\n\t\tif (providerId === \"openrouter\") return url.origin === \"https://openrouter.ai\";\n\t\tif (providerId === \"opencode-go\") return url.origin === \"https://opencode.ai\";\n\t\tif (providerId === \"kimi-coding\") return url.origin === \"https://api.kimi.com\";\n\t\tif (providerId === \"xai\") return url.origin === \"https://api.x.ai\";\n\t\tif (providerId === \"zai\") return url.origin === \"https://api.z.ai\";\n\t\tif (providerId === \"zai-coding-cn\") return url.origin === \"https://open.bigmodel.cn\";\n\t\tif (providerId === \"github-copilot\") {\n\t\t\treturn (\n\t\t\t\turl.protocol === \"https:\" && /^api\\.[a-z0-9-]+\\.githubcopilot\\.com$/u.test(url.hostname)\n\t\t\t);\n\t\t}\n\t\treturn false;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction headerValue(\n\theaders: Record<string, string | null> | undefined,\n\tname: string,\n): string | undefined {\n\tconst entry = Object.entries(headers ?? {}).find(\n\t\t([candidate]) => candidate.toLowerCase() === name.toLowerCase(),\n\t);\n\treturn entry?.[1] ?? undefined;\n}\n\nfunction hasHeader(headers: Record<string, string>, name: string): boolean {\n\treturn Object.keys(headers).some((key) => key.toLowerCase() === name.toLowerCase());\n}\n\nfunction validatedXaiUserId(value: unknown): string {\n\tif (typeof value !== \"string\" || !/^[A-Za-z0-9._~-]{1,128}$/u.test(value)) {\n\t\tthrow new Error(\"xAI consumer identity returned an unsafe canonical user ID.\");\n\t}\n\treturn value;\n}\n\nfunction remainingTimeout(\n\ttimeoutMs: number,\n\tstartedAt: number,\n\tdescription = \"fetching xAI consumer usage\",\n): number {\n\tconst remaining = timeoutMs - (Date.now() - startedAt);\n\tif (remaining <= 0) throw new Error(`Timed out while ${description}.`);\n\treturn remaining;\n}\n\n// Fireworks requires an account slug for its billing endpoints; discover it through the\n// documented account listing, requiring an explicit slug when a key can see several accounts.\nasync function resolveFireworksAccountId(\n\tauth: ResolvedUsageAuth,\n\tsignal: AbortSignal,\n\ttimeoutMs: number,\n\tguard: () => Promise<void>,\n\tconfiguredAccountId: string | undefined,\n): Promise<string> {\n\tif (configuredAccountId !== undefined && !isFireworksAccountId(configuredAccountId)) {\n\t\tthrow new Error(\"The Fireworks account setting was not a safe account slug.\");\n\t}\n\tconst startedAt = Date.now();\n\tconst accounts: string[] = [];\n\tlet pageToken: string | undefined;\n\tfor (let page = 0; page < FIREWORKS_MAX_ACCOUNT_PAGES; page += 1) {\n\t\tawait guard();\n\t\tconst payload = (await fetchProviderJson(\n\t\t\tfireworksAccountsUrl(pageToken),\n\t\t\tauth,\n\t\t\tsignal,\n\t\t\tremainingTimeout(timeoutMs, startedAt, \"fetching Fireworks accounts\"),\n\t\t\t\"Fireworks accounts endpoint\",\n\t\t\t{ redirect: \"error\" },\n\t\t)) as FireworksAccountsPayload;\n\t\tfor (const accountId of normalizeFireworksAccountsPayload(\n\t\t\tpayload as FireworksAccountsPayload,\n\t\t)) {\n\t\t\tif (accounts.includes(accountId)) {\n\t\t\t\tthrow new Error(`Fireworks accounts listing repeated ${accountId}.`);\n\t\t\t}\n\t\t\taccounts.push(accountId);\n\t\t\tif (configuredAccountId === accountId) return accountId;\n\t\t}\n\t\tpageToken = fireworksNextPageToken(payload.nextPageToken);\n\t\tif (!pageToken) break;\n\t}\n\tif (pageToken) {\n\t\tthrow new Error(\n\t\t\tconfiguredAccountId\n\t\t\t\t? `The configured Fireworks account was not found within the first ${FIREWORKS_MAX_ACCOUNT_PAGES} listing pages.`\n\t\t\t\t: `Fireworks account listing exceeded ${FIREWORKS_MAX_ACCOUNT_PAGES} pages; set fireworksAccountId in pi-usage.json to an account returned in those pages.`,\n\t\t);\n\t}\n\tif (accounts.length === 0) {\n\t\tthrow new Error(\"Fireworks account discovery returned no accounts for this API key.\");\n\t}\n\tif (configuredAccountId) {\n\t\tthrow new Error(\n\t\t\t\"The configured Fireworks account does not match an account visible to this API key.\",\n\t\t);\n\t}\n\tif (accounts.length === 1) return accounts[0] as string;\n\tconst preview = accounts.slice(0, 8).join(\", \");\n\tconst suffix = accounts.length > 8 ? ` \u2026and ${accounts.length - 8} more` : \"\";\n\tthrow new Error(\n\t\t`The Fireworks key can see ${accounts.length} accounts (${preview}${suffix}); set fireworksAccountId in pi-usage.json to one of them.`,\n\t);\n}\n\nfunction fireworksAccountsUrl(pageToken: string | undefined): string {\n\tconst url = new URL(\"/v1/accounts\", FIREWORKS_BILLING_SUMMARY_ORIGIN);\n\turl.searchParams.set(\"pageSize\", \"200\");\n\tif (pageToken !== undefined) url.searchParams.set(\"pageToken\", pageToken);\n\treturn url.toString();\n}\n\nfunction fireworksNextPageToken(value: unknown): string | undefined {\n\tif (value === undefined || value === null) return undefined;\n\tif (typeof value !== \"string\" || !value || value.length > 512) {\n\t\tthrow new Error(\"Fireworks accounts listing returned an invalid page token.\");\n\t}\n\treturn value;\n}\n\nfunction fireworksBillingSummaryUrl(accountId: string, startedAt: number): string {\n\tconst dayMs = 24 * 60 * 60 * 1000;\n\tconst dayFloor = (time: number) => `${new Date(time).toISOString().slice(0, 10)}T00:00:00Z`;\n\tconst url = new URL(\n\t\t`/v1/accounts/${accountId}/billing/summary`,\n\t\tFIREWORKS_BILLING_SUMMARY_ORIGIN,\n\t);\n\t// The endpoint aggregates by UTC date; endTime is exclusive, so the window includes today\n\t// plus the preceding 29 dates.\n\turl.searchParams.set(\n\t\t\"startTime\",\n\t\tdayFloor(startedAt - (FIREWORKS_SPEND_WINDOW_DAYS - 1) * dayMs),\n\t);\n\turl.searchParams.set(\"endTime\", dayFloor(startedAt + dayMs));\n\treturn url.toString();\n}\n\nfunction zaiMonitorUrl(baseUrl: string | undefined): string {\n\tconst base = baseUrl?.trim();\n\tif (!base) throw new Error(\"Z.AI model base URL is unavailable.\");\n\treturn `${new URL(base).origin}/api/monitor/usage/quota/limit`;\n}\n\nfunction zaiMonitorAuth(auth: ResolvedUsageAuth): ResolvedUsageAuth {\n\tconst authorization = headerValue(auth.headers, \"Authorization\");\n\tconst token =\n\t\tauthorization === undefined ? undefined : (bearerToken(authorization) ?? authorization);\n\tif (token === undefined || token === authorization) return auth;\n\treturn { ...auth, headers: { ...auth.headers, Authorization: token } };\n}\n\nfunction isAbortError(error: unknown): boolean {\n\treturn error instanceof Error && error.name === \"AbortError\";\n}\n", "import { sanitizeDisplayText } from \"../core.js\";\nimport type { CodexBackendPayload, UsageBucket, UsageMetric, UsageReport } from \"../types.js\";\n\nexport function normalizeCodexBackendPayload(\n\tpayload: CodexBackendPayload,\n\tcapturedAt: number,\n): UsageReport {\n\tconst buckets: UsageBucket[] = [];\n\tnormalizeRateLimitGroup(buckets, \"codex\", \"Codex\", payload.rate_limit, false);\n\n\tconst additional = Array.isArray(payload.additional_rate_limits)\n\t\t? payload.additional_rate_limits\n\t\t: [];\n\tfor (const item of additional) {\n\t\tconst value = asObject(item);\n\t\tconst id = asString(value?.metered_feature) ?? asString(value?.limit_name);\n\t\tif (!value || !id) continue;\n\t\ttry {\n\t\t\tnormalizeRateLimitGroup(\n\t\t\t\tbuckets,\n\t\t\t\tid,\n\t\t\t\tasString(value.limit_name) ?? id,\n\t\t\t\tvalue.rate_limit,\n\t\t\t\ttrue,\n\t\t\t);\n\t\t} catch {\n\t\t\t// Optional provider-specific buckets must not hide otherwise useful primary data.\n\t\t}\n\t}\n\n\tconst metrics: UsageMetric[] = [];\n\tconst credits = asObject(payload.credits);\n\tif (credits?.has_credits === true) {\n\t\tif (credits.unlimited === true) {\n\t\t\tmetrics.push({ id: \"credits\", label: \"Credits\", value: \"unlimited\" });\n\t\t} else {\n\t\t\tconst balance = asNumber(credits.balance);\n\t\t\tif (balance !== undefined) {\n\t\t\t\tmetrics.push({ id: \"credits\", label: \"Credits\", value: balance, unit: \"count\" });\n\t\t\t} else {\n\t\t\t\tmetrics.push({ id: \"credits\", label: \"Credits\", value: \"available\" });\n\t\t\t}\n\t\t}\n\t} else if (credits?.has_credits === false) {\n\t\tmetrics.push({ id: \"credits\", label: \"Credits\", value: \"none\" });\n\t}\n\tconst resetCredits = asObject(payload.rate_limit_reset_credits);\n\tconst resetCount = asNonnegativeInteger(resetCredits?.available_count);\n\tif (resetCount !== undefined) {\n\t\tmetrics.push({\n\t\t\tid: \"reset-credits\",\n\t\t\tlabel: \"Usage limit resets\",\n\t\t\tvalue: resetCount,\n\t\t\tunit: \"count\",\n\t\t});\n\t}\n\tif (buckets.length === 0 && metrics.length === 0) {\n\t\tthrow new Error(\"Codex usage endpoint returned no displayable usage data.\");\n\t}\n\n\tconst planType = asString(payload.plan_type);\n\treturn {\n\t\tproviderId: \"openai-codex\",\n\t\tproviderName: \"OpenAI Codex\",\n\t\tcapturedAt,\n\t\tsource: \"codex-pi-auth\",\n\t\tsemantics: {\n\t\t\tkind: \"consumer-subscription\",\n\t\t\tlabel: \"ChatGPT subscription limits\",\n\t\t},\n\t\tbuckets,\n\t\tmetrics,\n\t\t...(planType ? { notes: [`Plan: ${planType}`] } : {}),\n\t};\n}\n\nfunction normalizeRateLimitGroup(\n\tbuckets: UsageBucket[],\n\tgroupId: string,\n\tgroupLabel: string,\n\traw: unknown,\n\toptional: boolean,\n): void {\n\tif (raw === undefined || raw === null) return;\n\tconst details = asObject(raw);\n\tif (!details) {\n\t\tif (optional) return;\n\t\tthrow new Error(\"Codex rate limit was not an object.\");\n\t}\n\taddWindow(buckets, groupId, groupLabel, \"primary\", details.primary_window);\n\taddWindow(buckets, groupId, groupLabel, \"secondary\", details.secondary_window);\n}\n\nfunction addWindow(\n\tbuckets: UsageBucket[],\n\tgroupId: string,\n\tgroupLabel: string,\n\tposition: \"primary\" | \"secondary\",\n\traw: unknown,\n): void {\n\tif (raw === undefined || raw === null) return;\n\tconst value = asObject(raw);\n\tif (!value) throw new Error(\"Codex rate-limit window was not an object.\");\n\tconst used = asNumber(value.used_percent);\n\tif (used === undefined) return;\n\tconst seconds = asNumber(value.limit_window_seconds);\n\tconst resetsAt = asNumber(value.reset_at);\n\tbuckets.push({\n\t\tid: `${groupId}:${position}`,\n\t\tlabel: position === \"primary\" ? \"Primary limit\" : \"Secondary limit\",\n\t\tgroupId,\n\t\tgroupLabel,\n\t\tmodelKeys: [groupId, groupLabel],\n\t\tused,\n\t\tremaining: 100 - clampPercent(used),\n\t\tlimit: 100,\n\t\tunit: \"percent\",\n\t\t...(seconds !== undefined && seconds > 0 ? { windowMinutes: Math.ceil(seconds / 60) } : {}),\n\t\t...(resetsAt !== undefined ? { resetsAt } : {}),\n\t});\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\treturn value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\treturn sanitizeDisplayText(value, 160) || undefined;\n}\n\nfunction asNumber(value: unknown): number | undefined {\n\tif (typeof value === \"number\" && Number.isFinite(value)) return value;\n\tif (typeof value === \"string\" && value.trim()) {\n\t\tconst parsed = Number(value);\n\t\treturn Number.isFinite(parsed) ? parsed : undefined;\n\t}\n\treturn undefined;\n}\n\nfunction asNonnegativeInteger(value: unknown): number | undefined {\n\tconst parsed = asNumber(value);\n\tif (parsed === undefined || !Number.isSafeInteger(parsed)) return undefined;\n\treturn Math.max(0, parsed);\n}\n\nfunction clampPercent(value: number): number {\n\treturn 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\t[\"total\", \"Total balance\", \"total_balance\"],\n\t[\"granted\", \"Granted balance\", \"granted_balance\"],\n\t[\"topped-up\", \"Topped-up balance\", \"topped_up_balance\"],\n] as const;\n\nexport function normalizeDeepSeekBalancePayload(\n\tpayload: DeepSeekBalancePayload,\n\tcapturedAt: number,\n): UsageReport {\n\tif (typeof payload.is_available !== \"boolean\") {\n\t\tthrow new Error(\"DeepSeek API balance response availability was not a boolean.\");\n\t}\n\tif (!Array.isArray(payload.balance_infos) || payload.balance_infos.length === 0) {\n\t\tthrow new Error(\"DeepSeek API balance response returned no balance information.\");\n\t}\n\n\tconst balances = new Map<DeepSeekCurrency, Record<string, unknown>>();\n\tfor (const raw of payload.balance_infos) {\n\t\tconst balance = asObject(raw);\n\t\tif (!balance) throw new Error(\"DeepSeek API balance row was not an object.\");\n\t\tconst currency = deepSeekCurrency(balance.currency);\n\t\tif (!currency) throw new Error(\"DeepSeek API balance row returned an unsupported currency.\");\n\t\tif (balances.has(currency)) {\n\t\t\tthrow new Error(`DeepSeek API balance response repeated ${currency}.`);\n\t\t}\n\t\tfor (const [, label, field] of BALANCE_FIELDS) {\n\t\t\tif (!decimalAmount(balance[field])) {\n\t\t\t\tthrow new Error(`DeepSeek API balance ${label.toLowerCase()} was not a valid amount.`);\n\t\t\t}\n\t\t}\n\t\tbalances.set(currency, balance);\n\t}\n\n\tconst metrics: UsageMetric[] = [\n\t\t{\n\t\t\tid: \"api-availability\",\n\t\t\tlabel: \"API calls\",\n\t\t\tvalue: payload.is_available ? \"available\" : \"unavailable\",\n\t\t},\n\t];\n\tfor (const currency of CURRENCIES) {\n\t\tconst balance = balances.get(currency);\n\t\tif (!balance) continue;\n\t\tfor (const [id, label, field] of BALANCE_FIELDS) {\n\t\t\tmetrics.push({\n\t\t\t\tid: `${currency.toLowerCase()}-${id}`,\n\t\t\t\tlabel,\n\t\t\t\tvalue: balance[field] as string,\n\t\t\t\tunit: \"currency\",\n\t\t\t\tcurrency,\n\t\t\t});\n\t\t}\n\t}\n\n\treturn {\n\t\tproviderId: \"deepseek\",\n\t\tproviderName: \"DeepSeek\",\n\t\tcapturedAt,\n\t\tsource: \"deepseek-balance\",\n\t\tsemantics: { kind: \"api-key\", label: \"DeepSeek API balance\" },\n\t\tbuckets: [],\n\t\tmetrics,\n\t};\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\treturn value as Record<string, unknown>;\n}\n\nfunction deepSeekCurrency(value: unknown): DeepSeekCurrency | undefined {\n\treturn CURRENCIES.find((currency) => currency === value);\n}\n\nfunction decimalAmount(value: unknown): value is string {\n\treturn (\n\t\ttypeof value === \"string\" && value.length <= 64 && /^(?:0|[1-9]\\d*)(?:\\.\\d+)?$/u.test(value)\n\t);\n}\n", "import { sanitizeDisplayText } from \"../core.js\";\nimport type {\n\tFireworksAccountsPayload,\n\tFireworksBillingSummaryPayload,\n\tUsageMetric,\n\tUsageReport,\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;\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\tserverless: \"Serverless\",\n\tdedicated: \"Dedicated deployments\",\n\ttraining: \"Training\",\n\tother: \"Other\",\n};\n\nexport function isFireworksAccountId(value: unknown): value is string {\n\treturn typeof value === \"string\" && ACCOUNT_ID_PATTERN.test(value);\n}\n\nexport function normalizeFireworksAccountsPayload(payload: FireworksAccountsPayload): string[] {\n\tif (!Array.isArray(payload.accounts)) {\n\t\tthrow new Error(\"Fireworks accounts response did not contain an accounts array.\");\n\t}\n\tconst accounts: string[] = [];\n\tfor (const raw of payload.accounts) {\n\t\tconst account = asObject(raw);\n\t\tif (!account) throw new Error(\"Fireworks accounts response row was not an object.\");\n\t\tif (typeof account.name !== \"string\") {\n\t\t\tthrow new Error(\"Fireworks accounts response omitted the account resource name.\");\n\t\t}\n\t\tconst match = /^accounts\\/([^/]+)$/u.exec(account.name);\n\t\tif (!match || !isFireworksAccountId(match[1])) {\n\t\t\tthrow new Error(\"Fireworks accounts response returned an unsafe account resource name.\");\n\t\t}\n\t\tconst accountId = match[1];\n\t\tif (accounts.includes(accountId)) {\n\t\t\tthrow new Error(`Fireworks accounts response repeated ${accountId}.`);\n\t\t}\n\t\taccounts.push(accountId);\n\t}\n\treturn accounts;\n}\n\nexport function normalizeFireworksBillingSummaryPayload(\n\tpayload: FireworksBillingSummaryPayload,\n\taccountId: string,\n\tcapturedAt: number,\n): UsageReport {\n\tif (!isFireworksAccountId(accountId)) {\n\t\tthrow new Error(\"Fireworks billing summary received an unsafe account identifier.\");\n\t}\n\tif (payload.lineItems !== undefined && !Array.isArray(payload.lineItems)) {\n\t\tthrow new Error(\"Fireworks billing summary lineItems was not an array.\");\n\t}\n\n\tconst totals = new Map<string, Map<SeriesKey, bigint>>();\n\tfor (const raw of payload.lineItems ?? []) {\n\t\tconst lineItem = asObject(raw);\n\t\tif (!lineItem) throw new Error(\"Fireworks billing line item was not an object.\");\n\t\tconst cost = moneyAmount(lineItem.totalCost, \"line item total cost\");\n\t\tconst series = seriesKey(lineItem.series);\n\t\tlet amounts = totals.get(cost.currency);\n\t\tif (!amounts) {\n\t\t\tamounts = new Map<SeriesKey, bigint>();\n\t\t\ttotals.set(cost.currency, amounts);\n\t\t}\n\t\tamounts.set(series, (amounts.get(series) ?? 0n) + cost.amount);\n\t}\n\n\tconst metrics: UsageMetric[] = [];\n\tfor (const [currency, amounts] of totals) {\n\t\tmetrics.push({\n\t\t\tid: `${currency.toLowerCase()}-total`,\n\t\t\tlabel: \"Total spend\",\n\t\t\tvalue: formatMoneyAmount(sumSeries(amounts)),\n\t\t\tunit: \"currency\",\n\t\t\tcurrency,\n\t\t});\n\t\tfor (const series of SERIES_KEYS) {\n\t\t\tconst amount = amounts.get(series);\n\t\t\tif (amount === undefined) continue;\n\t\t\tmetrics.push({\n\t\t\t\tid: `${currency.toLowerCase()}-${series}`,\n\t\t\t\tlabel: SERIES_LABELS[series],\n\t\t\t\tvalue: formatMoneyAmount(amount),\n\t\t\t\tunit: \"currency\",\n\t\t\t\tcurrency,\n\t\t\t});\n\t\t}\n\t}\n\n\tconst notes = [\n\t\t\"Rated line items may differ from the final invoice once credits or adjustments are applied.\",\n\t];\n\tif (metrics.length === 0) {\n\t\tnotes.push(\"Fireworks returned no rated line items for the last 30 days.\");\n\t}\n\n\treturn {\n\t\tproviderId: \"fireworks\",\n\t\tproviderName: \"Fireworks\",\n\t\tcapturedAt,\n\t\tsource: \"fireworks-billing-summary\",\n\t\tsemantics: { kind: \"api-key\", label: \"Fireworks API spend\" },\n\t\taccountLabel: sanitizeDisplayText(accountId, 80),\n\t\tbuckets: [],\n\t\tmetrics,\n\t\tnotes,\n\t};\n}\n\ntype RatedMoney = { currency: string; amount: bigint };\n\nfunction moneyAmount(value: unknown, description: string): RatedMoney {\n\tconst money = asObject(value);\n\tif (!money) throw new Error(`Fireworks billing ${description} was not a money object.`);\n\tconst currency = typeof money.currencyCode === \"string\" ? money.currencyCode : undefined;\n\tif (!currency || !CURRENCY_PATTERN.test(currency)) {\n\t\tthrow new Error(`Fireworks billing ${description} currency was not an ISO 4217 code.`);\n\t}\n\t// proto3 JSON omits zero-valued money fields, so absent components default to zero.\n\tconst units =\n\t\tmoney.units === undefined\n\t\t\t? 0n\n\t\t\t: integerComponent(money.units, description, \"whole units\", MAX_UNITS_CHARS);\n\tif (units < INT64_MIN || units > INT64_MAX) {\n\t\tthrow new Error(`Fireworks billing ${description} whole units exceeded the int64 range.`);\n\t}\n\tconst nanos =\n\t\tmoney.nanos === undefined\n\t\t\t? 0n\n\t\t\t: integerComponent(money.nanos, description, \"nano units\", MAX_NANOS_CHARS);\n\tif (nanos <= -NANOS_PER_UNIT || nanos >= NANOS_PER_UNIT) {\n\t\tthrow new Error(`Fireworks billing ${description} nano units exceeded the Money range.`);\n\t}\n\tif ((units > 0n && nanos < 0n) || (units < 0n && nanos > 0n)) {\n\t\tthrow new Error(`Fireworks billing ${description} mixed unit and nano signs.`);\n\t}\n\treturn { currency, amount: units * NANOS_PER_UNIT + nanos };\n}\n\nfunction integerComponent(\n\tvalue: unknown,\n\tdescription: string,\n\tcomponent: string,\n\tmaxChars: number,\n): bigint {\n\tconst text =\n\t\ttypeof value === \"number\" && Number.isSafeInteger(value)\n\t\t\t? String(value)\n\t\t\t: typeof value === \"string\" && INTEGER_PATTERN.test(value)\n\t\t\t\t? value\n\t\t\t\t: undefined;\n\tif (text === undefined || text.length > maxChars) {\n\t\tthrow new Error(`Fireworks billing ${description} ${component} was not a bounded integer.`);\n\t}\n\treturn BigInt(text);\n}\n\nfunction seriesKey(value: unknown): SeriesKey {\n\tif (value === undefined || value === null) return \"other\";\n\tif (typeof value !== \"string\") throw new Error(\"Fireworks billing line item series was invalid.\");\n\tif (value === \"SERVERLESS\") return \"serverless\";\n\tif (value === \"DEDICATED_DEPLOYMENT\") return \"dedicated\";\n\tif (value === \"TRAINING\") return \"training\";\n\treturn \"other\";\n}\n\nfunction sumSeries(amounts: ReadonlyMap<SeriesKey, bigint>): bigint {\n\tlet total = 0n;\n\tfor (const amount of amounts.values()) total += amount;\n\treturn total;\n}\n\nfunction formatMoneyAmount(amount: bigint): string {\n\tconst negative = amount < 0n;\n\tconst magnitude = negative ? -amount : amount;\n\tconst units = magnitude / NANOS_PER_UNIT;\n\tconst nanos = (magnitude % NANOS_PER_UNIT).toString().padStart(9, \"0\").replace(/0+$/u, \"\");\n\treturn `${negative ? \"-\" : \"\"}${units.toString()}${nanos ? `.${nanos}` : \"\"}`;\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\treturn 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\tpayload: GitHubCopilotUsagePayload,\n\tcapturedAt: number,\n): UsageReport {\n\tconst snapshots = asObject(payload.quota_snapshots);\n\tconst premium = asObject(snapshots?.premium_interactions);\n\tconst metrics: UsageReport[\"metrics\"] = [];\n\tlet semanticsLabel: string;\n\tlet bucket: UsageBucket;\n\n\tif (premium) {\n\t\tconst tokenBasedBilling = premium.token_based_billing === true;\n\t\tconst id = tokenBasedBilling ? \"ai-credits\" : \"premium-requests\";\n\t\tconst label = tokenBasedBilling ? \"AI credits\" : \"Premium requests\";\n\t\tsemanticsLabel = tokenBasedBilling\n\t\t\t? \"GitHub Copilot AI Credits allowance\"\n\t\t\t: \"GitHub Copilot premium request quota\";\n\n\t\tif (premium.unlimited === true) {\n\t\t\tbucket = { id, label, unit: \"count\" };\n\t\t} else {\n\t\t\tconst entitlement = asNonnegativeNumber(premium.entitlement);\n\t\t\tconst rawRemaining =\n\t\t\t\tasFiniteNumber(premium.remaining) ?? asFiniteNumber(premium.quota_remaining);\n\t\t\tif (entitlement === undefined || rawRemaining === undefined) {\n\t\t\t\tthrow new Error(`GitHub Copilot ${label.toLowerCase()} quota was incomplete.`);\n\t\t\t}\n\t\t\tconst overageUsed = Math.max(\n\t\t\t\tasNonnegativeNumber(premium.overage_count) ?? 0,\n\t\t\t\tMath.max(0, -rawRemaining),\n\t\t\t);\n\t\t\tif (overageUsed > 0) {\n\t\t\t\tmetrics.push({\n\t\t\t\t\tid: \"overage-used\",\n\t\t\t\t\tlabel: \"Additional usage\",\n\t\t\t\t\tvalue: overageUsed,\n\t\t\t\t\tunit: \"count\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tbucket = {\n\t\t\t\tid,\n\t\t\t\tlabel,\n\t\t\t\tused: asNonnegativeNumber(premium.credits_used) ?? Math.max(0, entitlement - rawRemaining),\n\t\t\t\tremaining: Math.max(0, rawRemaining),\n\t\t\t\tlimit: entitlement,\n\t\t\t\tunit: \"count\",\n\t\t\t\tperiod: \"monthly\",\n\t\t\t\t...resetTimestamp(payload),\n\t\t\t};\n\t\t}\n\t} else {\n\t\tconst limited = asObject(payload.limited_user_quotas);\n\t\tconst monthly = asObject(payload.monthly_quotas);\n\t\tconst remaining = asNonnegativeNumber(limited?.chat);\n\t\tconst entitlement = asNonnegativeNumber(monthly?.chat);\n\t\tif (remaining === undefined || entitlement === undefined) {\n\t\t\tthrow new Error(\"GitHub Copilot usage response contained no supported quota.\");\n\t\t}\n\t\tsemanticsLabel = \"GitHub Copilot Free chat quota\";\n\t\tbucket = {\n\t\t\tid: \"chat-requests\",\n\t\t\tlabel: \"Chat requests\",\n\t\t\tused: Math.max(0, entitlement - remaining),\n\t\t\tremaining,\n\t\t\tlimit: entitlement,\n\t\t\tunit: \"count\",\n\t\t\tperiod: \"monthly\",\n\t\t\t...resetTimestamp(payload),\n\t\t};\n\t}\n\n\tconst notes: string[] = [];\n\tconst plan = asString(payload.copilot_plan) ?? asString(payload.access_type_sku);\n\tif (plan) notes.push(`Plan: ${plan}`);\n\n\treturn {\n\t\tproviderId: \"github-copilot\",\n\t\tproviderName: \"GitHub Copilot\",\n\t\tcapturedAt,\n\t\tsource: \"github-copilot-user\",\n\t\tsemantics: { kind: \"consumer-subscription\", label: semanticsLabel },\n\t\taccountLabel: asString(payload.login),\n\t\tbuckets: [bucket],\n\t\tmetrics,\n\t\t...(notes.length > 0 ? { notes } : {}),\n\t};\n}\n\nfunction resetTimestamp(payload: GitHubCopilotUsagePayload): { resetsAt?: number } {\n\tconst raw =\n\t\tasString(payload.quota_reset_date_utc) ??\n\t\tasString(payload.quota_reset_date) ??\n\t\tasString(payload.limited_user_reset_date);\n\tif (!raw) return {};\n\tconst milliseconds = Date.parse(raw);\n\treturn Number.isNaN(milliseconds) ? {} : { resetsAt: Math.floor(milliseconds / 1000) };\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\treturn value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\treturn sanitizeDisplayText(value, 80) || undefined;\n}\n\nfunction asFiniteNumber(value: unknown): number | undefined {\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) return undefined;\n\treturn value;\n}\n\nfunction asNonnegativeNumber(value: unknown): number | undefined {\n\tconst number = asFiniteNumber(value);\n\treturn 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 */\nexport function normalizeKimiCodingUsagePayload(\n\tpayload: KimiCodingUsagePayload,\n\tcapturedAt: number,\n): UsageReport {\n\tconst root = asObject(payload);\n\tif (!root) throw new Error(\"Kimi Coding usage response was not an object.\");\n\n\tconst candidates: UsageBucket[] = [];\n\tlet omittedWindow = false;\n\tconst summary = parseUsageRow(root.usage, WEEKLY_WINDOW_MINUTES, \"Weekly window\");\n\tif (summary) candidates.push(summary);\n\telse if (root.usage !== undefined) omittedWindow = true;\n\n\tif (Array.isArray(root.limits)) {\n\t\tfor (const raw of root.limits) {\n\t\t\tconst item = asObject(raw);\n\t\t\tconst windowMinutes = parseWindowMinutes(item?.window);\n\t\t\tconst label = sanitizedLabel(item?.name);\n\t\t\tconst bucket =\n\t\t\t\twindowMinutes === undefined\n\t\t\t\t\t? undefined\n\t\t\t\t\t: parseUsageRow(item?.detail, windowMinutes, label ?? defaultWindowLabel(windowMinutes));\n\t\t\tif (bucket) candidates.push(bucket);\n\t\t\telse omittedWindow = true;\n\t\t}\n\t} else if (root.limits !== undefined) {\n\t\tomittedWindow = true;\n\t}\n\n\tconst buckets: UsageBucket[] = [];\n\tconst byWindow = new Map<number, UsageBucket[]>();\n\tfor (const bucket of candidates) {\n\t\tconst windowMinutes = bucket.windowMinutes as number;\n\t\tbyWindow.set(windowMinutes, [...(byWindow.get(windowMinutes) ?? []), bucket]);\n\t}\n\tfor (const rows of byWindow.values()) {\n\t\tif (rows.length === 1) buckets.push(rows[0] as UsageBucket);\n\t\telse omittedWindow = true;\n\t}\n\tbuckets.sort((left, right) => (left.windowMinutes ?? 0) - (right.windowMinutes ?? 0));\n\n\tconst metrics = parseBoosterWallet(root.boosterWallet);\n\tif (buckets.length === 0 && metrics.length === 0) {\n\t\tthrow new Error(\"Kimi Coding usage endpoint returned no displayable usage data.\");\n\t}\n\n\treturn {\n\t\tproviderId: \"kimi-coding\",\n\t\tproviderName: \"Kimi For Coding\",\n\t\tcapturedAt,\n\t\tsource: \"kimi-managed-usage\",\n\t\tsemantics: { kind: \"consumer-subscription\", label: \"Kimi Coding Plan usage\" },\n\t\tbuckets,\n\t\tmetrics,\n\t\t...(omittedWindow\n\t\t\t? { notes: [\"Unsupported, malformed, or duplicate plan windows were unavailable.\"] }\n\t\t\t: {}),\n\t};\n}\n\nfunction parseUsageRow(\n\tvalue: unknown,\n\twindowMinutes: number,\n\tlabel: string,\n): UsageBucket | undefined {\n\tconst row = asObject(value);\n\tif (!row) return undefined;\n\tconst used = asNonnegativeInteger(row.used);\n\tconst limit = asNonnegativeInteger(row.limit);\n\tif (used === undefined || limit === undefined || limit === 0) return undefined;\n\tconst resetsAt = asIsoEpochSeconds(row.resetTime);\n\treturn {\n\t\tid: windowId(windowMinutes),\n\t\tlabel,\n\t\tused,\n\t\tremaining: Math.max(0, limit - used),\n\t\tlimit,\n\t\tunit: \"count\",\n\t\twindowMinutes,\n\t\t...(resetsAt !== undefined ? { resetsAt } : {}),\n\t};\n}\n\nfunction parseWindowMinutes(value: unknown): number | undefined {\n\tconst window = asObject(value);\n\tif (!window) return undefined;\n\tconst duration = asPositiveInteger(window.duration);\n\tif (duration === undefined) return undefined;\n\tconst multiplier =\n\t\twindow.timeUnit === \"TIME_UNIT_MINUTE\"\n\t\t\t? 1\n\t\t\t: window.timeUnit === \"TIME_UNIT_HOUR\"\n\t\t\t\t? 60\n\t\t\t\t: window.timeUnit === \"TIME_UNIT_DAY\"\n\t\t\t\t\t? 1_440\n\t\t\t\t\t: window.timeUnit === \"TIME_UNIT_WEEK\"\n\t\t\t\t\t\t? 10_080\n\t\t\t\t\t\t: undefined;\n\tif (multiplier === undefined) return undefined;\n\tconst minutes = duration * multiplier;\n\treturn Number.isSafeInteger(minutes) ? minutes : undefined;\n}\n\nfunction parseBoosterWallet(value: unknown): UsageMetric[] {\n\tconst wallet = asObject(value);\n\tconst balance = asObject(wallet?.balance);\n\tif (!wallet || !balance || balance.type !== \"BOOSTER\") return [];\n\tconst totalRaw = asPositiveInteger(balance.amount);\n\tif (totalRaw === undefined) return [];\n\tconst leftRaw = asNonnegativeInteger(balance.amountLeft) ?? 0;\n\tconst monthlyLimit = parseMoney(wallet.monthlyChargeLimit);\n\tconst monthlyUsed = parseMoney(wallet.monthlyUsed);\n\tconst currencies = new Set(\n\t\t[monthlyLimit?.currency, monthlyUsed?.currency].filter(\n\t\t\t(currency): currency is string => currency !== undefined,\n\t\t),\n\t);\n\tif (currencies.size !== 1) return [];\n\tconst currency = currencies.values().next().value;\n\tif (!currency) return [];\n\tconst total = fixedPointToMajor(totalRaw);\n\tconst left = fixedPointToMajor(leftRaw);\n\tif (total === undefined || left === undefined) return [];\n\n\tconst metrics: UsageMetric[] = [\n\t\t{ id: \"booster-balance\", label: \"Balance\", value: left, unit: \"currency\", currency },\n\t\t{ id: \"booster-total\", label: \"Total balance\", value: total, unit: \"currency\", currency },\n\t];\n\tif (monthlyUsed) {\n\t\tmetrics.push({\n\t\t\tid: \"booster-monthly-used\",\n\t\t\tlabel: \"Used this month\",\n\t\t\tvalue: monthlyUsed.cents / 100,\n\t\t\tunit: \"currency\",\n\t\t\tcurrency,\n\t\t});\n\t}\n\tif (wallet.monthlyChargeLimitEnabled === false) {\n\t\tmetrics.push({\n\t\t\tid: \"booster-monthly-limit\",\n\t\t\tlabel: \"Monthly limit\",\n\t\t\tvalue: \"unlimited\",\n\t\t\tunit: \"currency\",\n\t\t\tcurrency,\n\t\t});\n\t} else if (wallet.monthlyChargeLimitEnabled === true && monthlyLimit) {\n\t\tmetrics.push({\n\t\t\tid: \"booster-monthly-limit\",\n\t\t\tlabel: \"Monthly limit\",\n\t\t\tvalue: monthlyLimit.cents / 100,\n\t\t\tunit: \"currency\",\n\t\t\tcurrency,\n\t\t});\n\t}\n\treturn metrics;\n}\n\nfunction parseMoney(value: unknown): { cents: number; currency: string } | undefined {\n\tconst money = asObject(value);\n\tif (!money) return undefined;\n\tconst cents = asNonnegativeInteger(money.priceInCents);\n\tif (cents === undefined) return undefined;\n\tconst currency = asCurrency(money.currency);\n\tif (!currency) return undefined;\n\treturn { cents, currency };\n}\n\nfunction fixedPointToMajor(value: number): number | undefined {\n\tconst cents = value / FIXED_POINT_UNITS_PER_CENT;\n\tconst roundedCents = cents > 0 && cents < 1 ? 1 : Math.round(cents);\n\tconst major = roundedCents / 100;\n\treturn Number.isSafeInteger(roundedCents) && Number.isFinite(major) ? major : undefined;\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\treturn value as Record<string, unknown>;\n}\n\nfunction asNonnegativeInteger(value: unknown): number | undefined {\n\tif (typeof value === \"string\" && !/^\\d+$/u.test(value)) return undefined;\n\tconst number = typeof value === \"string\" ? Number(value) : value;\n\tif (typeof number !== \"number\" || !Number.isSafeInteger(number) || number < 0) return undefined;\n\treturn number;\n}\n\nfunction asPositiveInteger(value: unknown): number | undefined {\n\tconst number = asNonnegativeInteger(value);\n\treturn number !== undefined && number > 0 ? number : undefined;\n}\n\nfunction asIsoEpochSeconds(value: unknown): number | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\tconst match =\n\t\t/^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(?:\\.\\d+)?(?:Z|([+-])(\\d{2}):(\\d{2}))$/u.exec(\n\t\t\tvalue,\n\t\t);\n\tif (!match) return undefined;\n\tconst [\n\t\t,\n\t\tyearText,\n\t\tmonthText,\n\t\tdayText,\n\t\thourText,\n\t\tminuteText,\n\t\tsecondText,\n\t\t,\n\t\toffsetHour,\n\t\toffsetMinute,\n\t] = match;\n\tconst year = Number(yearText);\n\tconst month = Number(monthText);\n\tconst day = Number(dayText);\n\tconst hour = Number(hourText);\n\tconst minute = Number(minuteText);\n\tconst second = Number(secondText);\n\tif (\n\t\tmonth < 1 ||\n\t\tmonth > 12 ||\n\t\tday < 1 ||\n\t\tday > new Date(Date.UTC(year, month, 0)).getUTCDate() ||\n\t\thour > 23 ||\n\t\tminute > 59 ||\n\t\tsecond > 59 ||\n\t\t(offsetHour !== undefined && Number(offsetHour) > 23) ||\n\t\t(offsetMinute !== undefined && Number(offsetMinute) > 59)\n\t) {\n\t\treturn undefined;\n\t}\n\tconst millis = Date.parse(value);\n\treturn Number.isFinite(millis) && millis >= 0 ? Math.floor(millis / 1000) : undefined;\n}\n\nfunction sanitizedLabel(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\treturn sanitizeDisplayText(value, 80) || undefined;\n}\n\nfunction asCurrency(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\tconst currency = sanitizeDisplayText(value, 3).toUpperCase();\n\treturn /^[A-Z]{3}$/u.test(currency) ? currency : undefined;\n}\n\nfunction windowId(minutes: number): string {\n\tif (minutes === FIVE_HOUR_WINDOW_MINUTES) return \"five-hour\";\n\tif (minutes === DAILY_WINDOW_MINUTES) return \"daily\";\n\tif (minutes === WEEKLY_WINDOW_MINUTES) return \"weekly\";\n\treturn `window-${minutes}-minutes`;\n}\n\nfunction defaultWindowLabel(minutes: number): string {\n\tif (minutes === WEEKLY_WINDOW_MINUTES) return \"Weekly window\";\n\tif (minutes % 10_080 === 0) return `${minutes / 10_080}w window`;\n\tif (minutes % 1_440 === 0) return `${minutes / 1_440}d window`;\n\tif (minutes % 60 === 0) return `${minutes / 60}h window`;\n\treturn `${minutes}m window`;\n}\n", "import { sanitizeDisplayText } from \"../core.js\";\nimport type { OpenCodeZenPayload, UsageBucket, UsageReport } from \"../types.js\";\n\nconst ZEN_WINDOWS = [\n\t{ key: \"rolling\", label: \"Rolling\" },\n\t{ key: \"weekly\", label: \"Weekly\" },\n\t{ key: \"monthly\", label: \"Monthly\" },\n] as const;\n\nexport function normalizeOpenCodeZenPayload(\n\tpayload: OpenCodeZenPayload,\n\tcapturedAt: number,\n): UsageReport {\n\tconst usage = asObject(payload.usage);\n\tif (!usage) throw new Error(\"OpenCode Zen usage response was not an object.\");\n\n\tconst buckets: UsageBucket[] = [];\n\tconst notes: string[] = [];\n\tfor (const window of ZEN_WINDOWS) {\n\t\tconst raw = asObject(usage[window.key]);\n\t\tif (!raw) continue;\n\t\tconst status = asString(raw.status);\n\t\tif (status !== \"ok\" && status !== \"rate-limited\") {\n\t\t\tnotes.push(`${window.label} window unavailable (${status ?? \"unknown status\"}).`);\n\t\t\tcontinue;\n\t\t}\n\t\tconst used = asNonnegativeNumber(raw.percent);\n\t\tif (used === undefined) continue;\n\t\tconst resetsAt = asEpochSeconds(raw.resetsAt);\n\t\tbuckets.push({\n\t\t\tid: window.key,\n\t\t\tlabel: `${window.label} window`,\n\t\t\tused,\n\t\t\tremaining: 100 - clampPercent(used),\n\t\t\tlimit: 100,\n\t\t\tunit: \"percent\",\n\t\t\t...(resetsAt !== undefined ? { resetsAt } : {}),\n\t\t});\n\t}\n\tif (buckets.length === 0) {\n\t\tthrow new Error(\"OpenCode Zen usage endpoint returned no displayable usage data.\");\n\t}\n\n\treturn {\n\t\tproviderId: \"opencode-go\",\n\t\tproviderName: \"OpenCode Go\",\n\t\tcapturedAt,\n\t\tsource: \"opencode-zen-usage\",\n\t\tsemantics: {\n\t\t\tkind: \"consumer-subscription\",\n\t\t\tlabel: \"OpenCode Zen plan usage\",\n\t\t},\n\t\tbuckets,\n\t\tmetrics: [],\n\t\t...(notes.length > 0 ? { notes } : {}),\n\t};\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\treturn value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\treturn sanitizeDisplayText(value, 80) || undefined;\n}\n\nfunction asNonnegativeNumber(value: unknown): number | undefined {\n\tif (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) return undefined;\n\treturn value;\n}\n\nfunction asEpochSeconds(value: unknown): number | undefined {\n\tif (typeof value !== \"string\" || !value.trim()) return undefined;\n\tconst parsed = Date.parse(value);\n\tif (Number.isNaN(parsed)) return undefined;\n\treturn Math.floor(parsed / 1000);\n}\n\nfunction clampPercent(value: number): number {\n\treturn 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(\n\tpayload: OpenRouterKeyPayload,\n\tcapturedAt: number,\n): UsageReport {\n\tconst data = asObject(payload.data);\n\tif (!data) throw new Error(\"OpenRouter key response data was not an object.\");\n\n\tconst limit = asNonnegativeNumber(data.limit);\n\tconst remaining = asNonnegativeNumber(data.limit_remaining);\n\tconst period = asString(data.limit_reset);\n\tconst totalUsage = asNonnegativeNumber(data.usage);\n\tconst buckets: UsageBucket[] = [];\n\tif (limit !== undefined) {\n\t\tbuckets.push({\n\t\t\tid: \"key-limit\",\n\t\t\tlabel: \"Key limit\",\n\t\t\t...(remaining !== undefined ? { used: Math.max(0, limit - remaining), remaining } : {}),\n\t\t\tlimit,\n\t\t\tunit: \"usd\",\n\t\t\t...(period ? { period } : {}),\n\t\t});\n\t}\n\n\tconst metrics: UsageMetric[] = [];\n\taddUsageMetric(metrics, \"usage-daily\", \"Usage today\", data.usage_daily);\n\taddUsageMetric(metrics, \"usage-weekly\", \"Usage this week\", data.usage_weekly);\n\taddUsageMetric(metrics, \"usage-monthly\", \"Usage this month\", data.usage_monthly);\n\taddUsageMetric(metrics, \"usage-total\", \"All-time usage\", totalUsage);\n\tif (buckets.length === 0 && metrics.length === 0) {\n\t\tthrow new Error(\"OpenRouter key response returned no displayable usage data.\");\n\t}\n\n\tconst notes: string[] = [];\n\tif (data.limit === null) notes.push(\"No per-key spend cap\");\n\telse if (limit === undefined) notes.push(\"Per-key spend cap unavailable\");\n\tif (data.is_free_tier === true) notes.push(\"Free-tier API key\");\n\n\treturn {\n\t\tproviderId: \"openrouter\",\n\t\tproviderName: \"OpenRouter\",\n\t\tcapturedAt,\n\t\tsource: \"openrouter-key\",\n\t\tsemantics: { kind: \"api-key\", label: \"API-key spend limits\" },\n\t\taccountLabel: asString(data.label),\n\t\tbuckets,\n\t\tmetrics,\n\t\t...(notes.length > 0 ? { notes } : {}),\n\t};\n}\n\nfunction addUsageMetric(metrics: UsageMetric[], id: string, label: string, value: unknown): void {\n\tconst amount = typeof value === \"number\" ? asNonnegativeNumber(value) : undefined;\n\tif (amount === undefined) return;\n\tmetrics.push({ id, label, value: amount, unit: \"usd\" });\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\treturn value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\treturn sanitizeDisplayText(value, 80) || undefined;\n}\n\nfunction asNonnegativeNumber(value: unknown): number | undefined {\n\tif (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) return undefined;\n\treturn 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\tpayload: XaiBillingPayload,\n\tsubscriptionTier: unknown,\n\tcapturedAt: number,\n): UsageReport {\n\tconst configValue = payload.config;\n\tif (configValue !== null && configValue !== undefined && !isRecord(configValue)) {\n\t\tthrow new Error(\"xAI billing response config was not an object or null.\");\n\t}\n\tconst config = isRecord(configValue) ? configValue : undefined;\n\tconst buckets: UsageBucket[] = [];\n\tconst metrics: UsageMetric[] = [];\n\tconst notes: string[] = [];\n\n\tif (config) {\n\t\tconst period = normalizePeriod(\n\t\t\tconfig.currentPeriod,\n\t\t\tconfig.billingPeriodStart,\n\t\t\tconfig.billingPeriodEnd,\n\t\t);\n\t\tconst preferredPercent = optionalPercent(config.creditUsagePercent, \"creditUsagePercent\");\n\t\tif (preferredPercent !== undefined) {\n\t\t\tbuckets.push({\n\t\t\t\tid: \"included-allowance\",\n\t\t\t\tlabel: \"Included allowance\",\n\t\t\t\tused: preferredPercent,\n\t\t\t\tremaining: 100 - preferredPercent,\n\t\t\t\tunit: \"percent\",\n\t\t\t\t...period,\n\t\t\t});\n\t\t} else {\n\t\t\tconst limit = optionalUsd(config.monthlyLimit, \"monthlyLimit\");\n\t\t\tconst used = optionalUsd(config.used, \"used\");\n\t\t\tif (limit !== undefined || used !== undefined) {\n\t\t\t\tbuckets.push({\n\t\t\t\t\tid: \"included-allowance\",\n\t\t\t\t\tlabel: \"Included allowance\",\n\t\t\t\t\t...(limit !== undefined ? { limit } : {}),\n\t\t\t\t\t...(used !== undefined ? { used } : {}),\n\t\t\t\t\t...(limit !== undefined && used !== undefined ? { remaining: limit - used } : {}),\n\t\t\t\t\tunit: \"usd\",\n\t\t\t\t\t...period,\n\t\t\t\t});\n\t\t\t} else if (period.period || period.resetsAt !== undefined) {\n\t\t\t\tbuckets.push({\n\t\t\t\t\tid: \"included-allowance\",\n\t\t\t\t\tlabel: \"Included allowance\",\n\t\t\t\t\tunit: \"percent\",\n\t\t\t\t\t...period,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst onDemandCap = optionalUsd(config.onDemandCap, \"onDemandCap\");\n\t\tconst onDemandUsed = optionalUsd(config.onDemandUsed, \"onDemandUsed\");\n\t\tif (onDemandCap !== undefined || onDemandUsed !== undefined) {\n\t\t\tbuckets.push({\n\t\t\t\tid: \"on-demand\",\n\t\t\t\tlabel: \"On-demand usage\",\n\t\t\t\t...(onDemandCap !== undefined ? { limit: onDemandCap } : {}),\n\t\t\t\t...(onDemandUsed !== undefined ? { used: onDemandUsed } : {}),\n\t\t\t\t...(onDemandCap !== undefined && onDemandUsed !== undefined\n\t\t\t\t\t? { remaining: onDemandCap - onDemandUsed }\n\t\t\t\t\t: {}),\n\t\t\t\tunit: \"usd\",\n\t\t\t});\n\t\t}\n\n\t\tconst prepaidBalance = optionalUsd(config.prepaidBalance, \"prepaidBalance\");\n\t\tif (prepaidBalance !== undefined) {\n\t\t\tmetrics.push({\n\t\t\t\tid: \"prepaid-balance\",\n\t\t\t\tlabel: \"Prepaid balance\",\n\t\t\t\tvalue: prepaidBalance,\n\t\t\t\tunit: \"usd\",\n\t\t\t});\n\t\t}\n\t}\n\n\tconst tier = optionalTier(subscriptionTier);\n\tif (tier) metrics.push({ id: \"subscription-tier\", label: \"Plan tier\", value: tier });\n\tif (!config) notes.push(\"No xAI consumer billing configuration is available for this account.\");\n\telse if (buckets.length === 0 && metrics.length === 0) {\n\t\tnotes.push(\"The xAI consumer billing response contained no displayable usage fields.\");\n\t}\n\n\treturn {\n\t\tproviderId: \"xai\",\n\t\tproviderName: \"xAI\",\n\t\tcapturedAt,\n\t\tsource: \"cli-chat-proxy.grok.com consumer billing\",\n\t\tsemantics: {\n\t\t\tkind: \"consumer-subscription\",\n\t\t\tlabel: \"xAI consumer subscription usage\",\n\t\t},\n\t\tbuckets,\n\t\tmetrics,\n\t\t...(notes.length > 0 ? { notes } : {}),\n\t};\n}\n\nfunction normalizePeriod(\n\tcurrentPeriod: unknown,\n\tlegacyStart: unknown,\n\tlegacyEnd: unknown,\n): Pick<UsageBucket, \"period\" | \"resetsAt\"> {\n\tif (currentPeriod !== undefined && currentPeriod !== null && !isRecord(currentPeriod)) {\n\t\tthrow new Error(\"xAI billing currentPeriod was not an object or null.\");\n\t}\n\tif (isRecord(currentPeriod)) {\n\t\tconst type = optionalString(currentPeriod.type, \"currentPeriod.type\");\n\t\tconst start = optionalTimestamp(currentPeriod.start, \"currentPeriod.start\");\n\t\tconst end = optionalTimestamp(currentPeriod.end, \"currentPeriod.end\");\n\t\treturn {\n\t\t\t...(periodLabel(type, start) ? { period: periodLabel(type, start) } : {}),\n\t\t\t...(end !== undefined ? { resetsAt: end } : {}),\n\t\t};\n\t}\n\tconst start = optionalTimestamp(legacyStart, \"billingPeriodStart\");\n\tconst end = optionalTimestamp(legacyEnd, \"billingPeriodEnd\");\n\treturn {\n\t\t...(start !== undefined ? { period: \"Monthly\" } : {}),\n\t\t...(end !== undefined ? { resetsAt: end } : {}),\n\t};\n}\n\nfunction periodLabel(type: string | undefined, start: number | undefined): string | undefined {\n\tif (type === \"USAGE_PERIOD_TYPE_WEEKLY\") return \"Weekly\";\n\tif (type === \"USAGE_PERIOD_TYPE_MONTHLY\") return \"Monthly\";\n\tif (type)\n\t\treturn sanitizeDisplayText(type.replace(/^USAGE_PERIOD_TYPE_/u, \"\").replaceAll(\"_\", \" \"), 40);\n\treturn start === undefined ? undefined : \"Current period\";\n}\n\nfunction optionalUsd(value: unknown, field: string): number | undefined {\n\tif (value === undefined || value === null) return undefined;\n\tif (!isRecord(value)) throw new Error(`xAI billing ${field} was not a cent wrapper.`);\n\tconst cents = value.val === undefined ? 0 : value.val;\n\tif (!Number.isSafeInteger(cents) || Math.abs(cents as number) > MAX_SAFE_CENTS) {\n\t\tthrow new Error(`xAI billing ${field}.val was not a safe signed integer.`);\n\t}\n\treturn (cents as number) / 100;\n}\n\nfunction optionalPercent(value: unknown, field: string): number | undefined {\n\tif (value === undefined || value === null) return undefined;\n\tif (typeof value !== \"number\" || !Number.isFinite(value) || value < 0 || value > 100) {\n\t\tthrow new Error(`xAI billing ${field} was outside 0\u2013100.`);\n\t}\n\treturn value;\n}\n\nfunction optionalTimestamp(value: unknown, field: string): number | undefined {\n\tif (value === undefined || value === null) return undefined;\n\tif (typeof value !== \"string\" || value.length > 80) {\n\t\tthrow new Error(`xAI billing ${field} was not a bounded timestamp.`);\n\t}\n\tconst milliseconds = Date.parse(value);\n\tif (!Number.isFinite(milliseconds)) throw new Error(`xAI billing ${field} was invalid.`);\n\treturn Math.floor(milliseconds / 1000);\n}\n\nfunction optionalString(value: unknown, field: string): string | undefined {\n\tif (value === undefined || value === null) return undefined;\n\tif (typeof value !== \"string\" || value.length > 80) {\n\t\tthrow new Error(`xAI billing ${field} was not a bounded string.`);\n\t}\n\treturn value;\n}\n\nfunction optionalTier(value: unknown): string | undefined {\n\tif (value === undefined || value === null) return undefined;\n\tif (typeof value !== \"string\" || value.length > 160) {\n\t\tthrow new Error(\"xAI subscription tier was not a bounded string or null.\");\n\t}\n\treturn sanitizeDisplayText(value, 80) || undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n", "import { sanitizeDisplayText } from \"../core.js\";\nimport type { UsageBucket, UsageMetric, UsageReport, ZaiQuotaPayload } from \"../types.js\";\n\nconst FIVE_HOUR_WINDOW_MINUTES = 300;\nconst WEEKLY_WINDOW_MINUTES = 10_080;\n\nexport function normalizeZaiQuotaPayload(\n\tproviderId: string,\n\tproviderName: string,\n\tpayload: ZaiQuotaPayload,\n\tcapturedAt: number,\n): UsageReport {\n\tconst data = asObject(payload.data);\n\tif (!data) throw new Error(\"Z.AI quota response data was not an object.\");\n\tconst limits = Array.isArray(data.limits) ? (data.limits as unknown[]) : [];\n\n\tconst buckets: UsageBucket[] = [];\n\tconst metrics: UsageMetric[] = [];\n\tfor (const raw of limits) {\n\t\tconst limit = asObject(raw);\n\t\tif (!limit) continue;\n\t\tconst type = asString(limit.type);\n\t\tconst unit = asNonnegativeNumber(limit.unit);\n\t\tconst isPlanUsage = type === \"TOKENS_LIMIT\" || type === \"CREDIT_LIMIT\";\n\t\tif (type === \"TIME_LIMIT\") {\n\t\t\taddCountBucket(buckets, limit, \"mcp-monthly\", \"MCP monthly allowance\");\n\t\t\taddUsageDetailMetrics(metrics, limit.usageDetails);\n\t\t} else if (isPlanUsage && unit === 3) {\n\t\t\taddPercentBucket(buckets, limit, \"five-hour\", \"5h window\", FIVE_HOUR_WINDOW_MINUTES);\n\t\t} else if (isPlanUsage && unit === 6) {\n\t\t\tconst used = asNonnegativeNumber(limit.currentValue);\n\t\t\tconst quota = asNonnegativeNumber(limit.usage);\n\t\t\tif (used !== undefined && quota !== undefined) {\n\t\t\t\taddCountBucket(buckets, limit, \"weekly\", \"Weekly window\", WEEKLY_WINDOW_MINUTES);\n\t\t\t} else {\n\t\t\t\taddPercentBucket(buckets, limit, \"weekly\", \"Weekly window\", WEEKLY_WINDOW_MINUTES);\n\t\t\t}\n\t\t}\n\t}\n\tif (buckets.length === 0) {\n\t\tthrow new Error(\"Z.AI quota endpoint returned no displayable usage data.\");\n\t}\n\n\tconst notes: string[] = [];\n\tconst level = asString(data.level);\n\tif (level) notes.push(`Plan: ${level}`);\n\n\treturn {\n\t\tproviderId,\n\t\tproviderName,\n\t\tcapturedAt,\n\t\tsource: \"zai-quota\",\n\t\tsemantics: { kind: \"consumer-subscription\", label: \"GLM Coding Plan usage\" },\n\t\tbuckets,\n\t\tmetrics,\n\t\t...(notes.length > 0 ? { notes } : {}),\n\t};\n}\n\nfunction addPercentBucket(\n\tbuckets: UsageBucket[],\n\tlimit: Record<string, unknown>,\n\tid: string,\n\tlabel: string,\n\twindowMinutes: number,\n): void {\n\tconst used = asNonnegativeNumber(limit.percentage);\n\tif (used === undefined) return;\n\tconst percent = clampPercent(used);\n\tconst resetsAt = asEpochSeconds(limit.nextResetTime);\n\tbuckets.push({\n\t\tid,\n\t\tlabel,\n\t\tused: percent,\n\t\tremaining: 100 - percent,\n\t\tlimit: 100,\n\t\tunit: \"percent\",\n\t\twindowMinutes,\n\t\t...(resetsAt !== undefined ? { resetsAt } : {}),\n\t});\n}\n\nfunction addCountBucket(\n\tbuckets: UsageBucket[],\n\tlimit: Record<string, unknown>,\n\tid: string,\n\tlabel: string,\n\twindowMinutes?: number,\n): void {\n\tconst used = asNonnegativeNumber(limit.currentValue);\n\tconst quota = asNonnegativeNumber(limit.usage);\n\tif (used === undefined || quota === undefined) return;\n\tconst resetsAt = asEpochSeconds(limit.nextResetTime);\n\tbuckets.push({\n\t\tid,\n\t\tlabel,\n\t\tused,\n\t\tremaining: Math.max(0, quota - used),\n\t\tlimit: quota,\n\t\tunit: \"count\",\n\t\t...(windowMinutes !== undefined ? { windowMinutes } : {}),\n\t\t...(resetsAt !== undefined ? { resetsAt } : {}),\n\t});\n}\n\nfunction addUsageDetailMetrics(metrics: UsageMetric[], value: unknown): void {\n\tif (!Array.isArray(value)) return;\n\tfor (const raw of value) {\n\t\tconst detail = asObject(raw);\n\t\tif (!detail) continue;\n\t\tconst label = asString(detail.modelCode);\n\t\tconst usage = asNonnegativeNumber(detail.usage);\n\t\tif (!label || usage === undefined) continue;\n\t\tmetrics.push({ id: `mcp-${kebabCase(label)}`, label, value: usage, unit: \"count\" });\n\t}\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\treturn value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\treturn sanitizeDisplayText(value, 80) || undefined;\n}\n\nfunction asNonnegativeNumber(value: unknown): number | undefined {\n\tif (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) return undefined;\n\treturn value;\n}\n\nfunction asEpochSeconds(value: unknown): number | undefined {\n\tconst millis = asNonnegativeNumber(value);\n\tif (millis === undefined) return undefined;\n\treturn Math.floor(millis / 1000);\n}\n\nfunction kebabCase(label: string): string {\n\treturn (\n\t\tlabel\n\t\t\t.toLowerCase()\n\t\t\t.replace(/[^a-z0-9]+/gu, \"-\")\n\t\t\t.replace(/^-+|-+$/gu, \"\") || \"tool\"\n\t);\n}\n\nfunction clampPercent(value: number): number {\n\treturn Math.min(100, Math.max(0, value));\n}\n", "import type {\n\tProviderUsageState,\n\tUsageBucket,\n\tUsageDisplayState,\n\tUsageModel,\n\tUsageReport,\n} from \"./types.js\";\n\nconst BAR_SEGMENTS = 20;\nconst VALUE_COLUMN = 29;\n\nexport function formatUsageReport(report: UsageReport, displayState: UsageDisplayState): string {\n\tconst stateLabel = displayState === \"current\" ? \"Current\" : \"Configured\";\n\tconst title =\n\t\treport.providerId === \"deepseek\"\n\t\t\t? \"DeepSeek API Balance\"\n\t\t\t: report.providerId === \"fireworks\"\n\t\t\t\t? \"Fireworks API Spend\"\n\t\t\t\t: `${report.providerName} Usage`;\n\tconst lines = [`${title} \u00B7 ${stateLabel}`];\n\tif (report.accountLabel) lines.push(`Account: ${report.accountLabel}`);\n\tlines.push(`Semantics: ${report.semantics.label}`, \"\");\n\n\tif (report.providerId === \"openai-codex\") formatCodexReport(lines, report);\n\telse if (report.providerId === \"deepseek\") formatDeepSeekReport(lines, report);\n\telse if (report.providerId === \"fireworks\") formatFireworksReport(lines, report);\n\telse if (report.providerId === \"github-copilot\") formatGitHubCopilotReport(lines, report);\n\telse if (report.providerId === \"openrouter\") formatOpenRouterReport(lines, report);\n\telse if (report.providerId === \"opencode-go\") formatOpenCodeZenReport(lines, report);\n\telse if (report.providerId === \"kimi-coding\") formatKimiCodingReport(lines, report);\n\telse if (report.providerId === \"xai\") formatXaiReport(lines, report);\n\telse if (report.providerId === \"zai\" || report.providerId === \"zai-coding-cn\") {\n\t\tformatZaiReport(lines, report);\n\t} else formatGenericReport(lines, report);\n\n\tif (report.notes) {\n\t\tfor (const note of report.notes) lines.push(note);\n\t}\n\treturn lines.join(\"\\n\").trimEnd();\n}\n\nexport function formatUsageStatusline(\n\treport: UsageReport,\n\tmodel?: UsageModel,\n\tnow = Date.now(),\n\tshowCodexResetCountdown = true,\n): string | undefined {\n\tif (report.providerId === \"openai-codex\") {\n\t\treturn formatCodexStatusline(report, model, now, showCodexResetCountdown);\n\t}\n\tif (report.providerId === \"deepseek\") return formatDeepSeekStatusline(report);\n\tif (report.providerId === \"fireworks\") return formatFireworksStatusline(report);\n\tif (report.providerId === \"github-copilot\") return formatGitHubCopilotStatusline(report);\n\tif (report.providerId === \"openrouter\") {\n\t\tconst limit = report.buckets.find((bucket) => bucket.id === \"key-limit\");\n\t\tif (limit?.remaining !== undefined) return `openrouter ${formatUsd(limit.remaining)} left`;\n\t\tconst total = report.metrics.find((metric) => metric.id === \"usage-total\");\n\t\tif (typeof total?.value === \"number\") return `openrouter ${formatUsd(total.value)} used`;\n\t}\n\tif (report.providerId === \"opencode-go\") return formatOpenCodeZenStatusline(report);\n\tif (report.providerId === \"kimi-coding\") return formatKimiCodingStatusline(report);\n\tif (report.providerId === \"zai\" || report.providerId === \"zai-coding-cn\") {\n\t\treturn formatZaiStatusline(report);\n\t}\n\treturn undefined;\n}\n\nexport function formatProviderStates(states: readonly ProviderUsageState[]): string {\n\treturn states\n\t\t.map((state) => {\n\t\t\tif (state.status === \"ready\") return formatUsageReport(state.report, state.displayState);\n\t\t\tconst label = state.displayState === \"current\" ? \"Current\" : \"Configured\";\n\t\t\tconst status =\n\t\t\t\tstate.status === \"auth-unavailable\"\n\t\t\t\t\t? \"Authentication unavailable\"\n\t\t\t\t\t: state.status === \"unsupported\"\n\t\t\t\t\t\t? \"Unsupported\"\n\t\t\t\t\t\t: \"Query failed\";\n\t\t\treturn `${state.providerName} \u00B7 ${label}\\n${status}: ${state.message}`;\n\t\t})\n\t\t.join(\"\\n\\n\");\n}\n\nfunction formatCodexReport(lines: string[], report: UsageReport): void {\n\tlet previousGroup: string | undefined;\n\tfor (const bucket of report.buckets) {\n\t\tconst group = bucket.groupId ?? bucket.id;\n\t\tif (group !== previousGroup && group !== \"codex\") {\n\t\t\tlines.push(`${bucket.groupLabel ?? group} limit:`);\n\t\t}\n\t\tpreviousGroup = group;\n\t\tconst fallback = bucket.id.endsWith(\":secondary\") ? \"weekly\" : \"5h\";\n\t\tconst label = `${formatWindowLabel(bucket.windowMinutes, fallback, false)} limit:`;\n\t\tlines.push(`${label.padEnd(VALUE_COLUMN)}${formatPercentBucket(bucket)}`);\n\t}\n\tfor (const metric of report.metrics) {\n\t\tif (metric.id === \"reset-credits\") {\n\t\t\tlines.push(`${\"Usage limit resets:\".padEnd(VALUE_COLUMN)}${metric.value} available`);\n\t\t} else if (metric.id === \"credits\") {\n\t\t\tlines.push(\n\t\t\t\t`${\"Credits:\".padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\nfunction formatDeepSeekReport(lines: string[], report: UsageReport): void {\n\tconst availability = report.metrics.find((metric) => metric.id === \"api-availability\");\n\tlines.push(\n\t\t`${\"API calls:\".padEnd(VALUE_COLUMN)}${availability?.value === \"available\" ? \"Available\" : \"Unavailable\"}`,\n\t);\n\tfor (const currency of [\"CNY\", \"USD\"]) {\n\t\tconst metrics = report.metrics.filter((metric) => metric.currency === currency);\n\t\tif (metrics.length === 0) continue;\n\t\tlines.push(\"\", `${currency} balance:`);\n\t\tfor (const metric of metrics) {\n\t\t\tlines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${currency} ${metric.value}`);\n\t\t}\n\t}\n}\n\nfunction formatDeepSeekStatusline(report: UsageReport): string {\n\tconst availability = report.metrics.find((metric) => metric.id === \"api-availability\");\n\tif (availability?.value !== \"available\") return \"deepseek API unavailable\";\n\tconst totals = [\"CNY\", \"USD\"].flatMap((currency) => {\n\t\tconst metric = report.metrics.find(\n\t\t\t(candidate) => candidate.id === `${currency.toLowerCase()}-total`,\n\t\t);\n\t\treturn metric ? [`${currency} ${metric.value}`] : [];\n\t});\n\treturn totals.length > 0 ? `deepseek ${totals.join(\" \u00B7 \")}` : \"deepseek balance unavailable\";\n}\n\nfunction formatFireworksReport(lines: string[], report: UsageReport): void {\n\tlines.push(`${\"Spend window:\".padEnd(VALUE_COLUMN)}Last 30 days (rated)`);\n\tfor (const currency of fireworksCurrencies(report)) {\n\t\tlines.push(\"\", `${currency} rated spend:`);\n\t\tfor (const metric of report.metrics) {\n\t\t\tif (metric.currency !== currency) continue;\n\t\t\tlines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${currency} ${metric.value}`);\n\t\t}\n\t}\n}\n\nfunction formatFireworksStatusline(report: UsageReport): string {\n\tconst totals = report.metrics.filter((metric) => metric.id.endsWith(\"-total\"));\n\tif (totals.length === 0) return \"fireworks no rated usage\";\n\treturn `fireworks ${totals.map((metric) => `${metric.currency} ${metric.value}`).join(\" \u00B7 \")}`;\n}\n\nfunction fireworksCurrencies(report: UsageReport): string[] {\n\tconst currencies: string[] = [];\n\tfor (const metric of report.metrics) {\n\t\tif (!metric.currency || currencies.includes(metric.currency)) continue;\n\t\tcurrencies.push(metric.currency);\n\t}\n\treturn currencies;\n}\n\nfunction formatGitHubCopilotReport(lines: string[], report: UsageReport): void {\n\tconst quota = findGitHubCopilotQuota(report);\n\tif (!quota || quota.limit === undefined || quota.remaining === undefined) {\n\t\tlines.push(`${`${quota?.label ?? \"Copilot quota\"}:`.padEnd(VALUE_COLUMN)}unlimited`);\n\t\treturn;\n\t}\n\tconst percent = percentRemaining(quota);\n\tconst reset = quota.resetsAt ? ` (resets ${formatReset(quota.resetsAt)})` : \"\";\n\tlines.push(\n\t\t`${`${quota.label}:`.padEnd(VALUE_COLUMN)}${quota.remaining} of ${quota.limit} left \u00B7 ${percent}%${reset}`,\n\t);\n\tconst overage = report.metrics.find((metric) => metric.id === \"overage-used\");\n\tif (typeof overage?.value === \"number\" && overage.value > 0) {\n\t\tlines.push(`${\"Additional usage:\".padEnd(VALUE_COLUMN)}${overage.value} ${quota.label}`);\n\t}\n}\n\nfunction formatGitHubCopilotStatusline(report: UsageReport): string {\n\tconst quota = findGitHubCopilotQuota(report);\n\tconst kind = compactGitHubCopilotQuotaKind(quota);\n\tif (!quota || quota.limit === undefined || quota.remaining === undefined) {\n\t\treturn `copilot ${kind} unlimited`;\n\t}\n\tconst overage = report.metrics.find((metric) => metric.id === \"overage-used\");\n\tconst overageSuffix =\n\t\ttypeof overage?.value === \"number\" && overage.value > 0 ? ` +${overage.value} over` : \"\";\n\treturn `copilot ${kind === \"premium\" ? \"\" : `${kind} `}${quota.remaining}/${quota.limit} ${percentRemaining(quota)}%${overageSuffix}`;\n}\n\nfunction findGitHubCopilotQuota(report: UsageReport): UsageBucket | undefined {\n\treturn report.buckets.find((bucket) =>\n\t\t[\"ai-credits\", \"premium-requests\", \"chat-requests\"].includes(bucket.id),\n\t);\n}\n\nfunction compactGitHubCopilotQuotaKind(bucket: UsageBucket | undefined): string {\n\tif (bucket?.id === \"ai-credits\") return \"credits\";\n\tif (bucket?.id === \"chat-requests\") return \"chat\";\n\treturn \"premium\";\n}\n\nfunction percentRemaining(bucket: UsageBucket): number {\n\tif (!bucket.limit || bucket.remaining === undefined) return 0;\n\treturn Math.round(clampPercent((bucket.remaining / bucket.limit) * 100));\n}\n\nfunction formatOpenRouterReport(lines: string[], report: UsageReport): void {\n\tconst limit = report.buckets.find((bucket) => bucket.id === \"key-limit\");\n\tif (limit) {\n\t\tconst period = limit.period ? ` (${limit.period})` : \"\";\n\t\tconst value =\n\t\t\tlimit.remaining === undefined\n\t\t\t\t? `${formatUsd(limit.limit ?? 0)} cap; remaining unavailable`\n\t\t\t\t: `${formatUsd(limit.remaining)} of ${formatUsd(limit.limit ?? 0)} left`;\n\t\tlines.push(`${`Key limit${period}:`.padEnd(VALUE_COLUMN)}${value}`);\n\t}\n\tfor (const metric of report.metrics) {\n\t\tlines.push(\n\t\t\t`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`,\n\t\t);\n\t}\n}\n\nfunction formatOpenCodeZenReport(lines: string[], report: UsageReport): void {\n\tfor (const bucket of report.buckets) {\n\t\tconst reset = bucket.resetsAt ? ` (resets ${formatReset(bucket.resetsAt)})` : \"\";\n\t\tconst used = bucket.used ?? \"unavailable\";\n\t\tlines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${used}% used${reset}`);\n\t}\n}\n\nfunction formatOpenCodeZenStatusline(report: UsageReport): string | undefined {\n\tconst parts = [\"zen\"];\n\tfor (const bucket of report.buckets) {\n\t\tif (bucket.used === undefined) continue;\n\t\tconst compact = bucket.id === \"rolling\" ? \"r\" : bucket.id === \"weekly\" ? \"w\" : \"m\";\n\t\tparts.push(`${clampPercent(bucket.used).toFixed(0)}% ${compact}`);\n\t}\n\treturn parts.length > 1 ? parts.join(\" \") : undefined;\n}\n\nfunction formatKimiCodingReport(lines: string[], report: UsageReport): void {\n\tfor (const bucket of report.buckets) {\n\t\tconst reset = bucket.resetsAt ? ` (resets ${formatReset(bucket.resetsAt)})` : \"\";\n\t\tif (bucket.used === undefined || bucket.limit === undefined) {\n\t\t\tlines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}unavailable${reset}`);\n\t\t\tcontinue;\n\t\t}\n\t\tlines.push(\n\t\t\t`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${bucket.used} of ${bucket.limit} used \u00B7 ${percentRemaining(bucket)}% left${reset}`,\n\t\t);\n\t}\n\tconst balance = report.metrics.find((metric) => metric.id === \"booster-balance\");\n\tconst total = report.metrics.find((metric) => metric.id === \"booster-total\");\n\tconst monthlyUsed = report.metrics.find((metric) => metric.id === \"booster-monthly-used\");\n\tconst monthlyLimit = report.metrics.find((metric) => metric.id === \"booster-monthly-limit\");\n\tif (!balance && !monthlyUsed && !monthlyLimit) return;\n\tlines.push(\"\", \"Extra usage wallet:\");\n\tif (balance) {\n\t\tconst totalSuffix = total ? ` of ${formatCurrencyMetric(total)}` : \"\";\n\t\tlines.push(`${\"Balance:\".padEnd(VALUE_COLUMN)}${formatCurrencyMetric(balance)}${totalSuffix}`);\n\t}\n\tif (monthlyUsed) {\n\t\tlines.push(`${\"Used this month:\".padEnd(VALUE_COLUMN)}${formatCurrencyMetric(monthlyUsed)}`);\n\t}\n\tif (monthlyLimit) {\n\t\tlines.push(`${\"Monthly limit:\".padEnd(VALUE_COLUMN)}${formatCurrencyMetric(monthlyLimit)}`);\n\t}\n}\n\nfunction formatKimiCodingStatusline(report: UsageReport): string | undefined {\n\tconst fiveHour = report.buckets.find((bucket) => bucket.id === \"five-hour\");\n\tconst weekly = report.buckets.find((bucket) => bucket.id === \"weekly\");\n\tconst subWindow = fiveHour ?? report.buckets.find((bucket) => bucket.id !== \"weekly\");\n\tconst selected = [subWindow, weekly].filter(\n\t\t(bucket, index, buckets): bucket is UsageBucket =>\n\t\t\tbucket !== undefined && buckets.indexOf(bucket) === index,\n\t);\n\tconst parts = [\"kimi\"];\n\tfor (const bucket of selected) {\n\t\tif (!bucket.limit || bucket.remaining === undefined) continue;\n\t\tconst fallback = bucket.id === \"weekly\" ? \"weekly\" : \"5h\";\n\t\tparts.push(\n\t\t\t`${percentRemaining(bucket)}% ${formatWindowLabel(bucket.windowMinutes, fallback, true)}`,\n\t\t);\n\t}\n\treturn parts.length > 1 ? parts.join(\" \") : undefined;\n}\n\nfunction formatZaiStatusline(report: UsageReport): string | undefined {\n\tconst selected = [\n\t\treport.buckets.find((bucket) => bucket.id === \"five-hour\"),\n\t\treport.buckets.find((bucket) => bucket.id === \"weekly\"),\n\t];\n\tconst parts = [\"zai\"];\n\tfor (const bucket of selected) {\n\t\tif (!bucket?.limit || bucket.remaining === undefined) continue;\n\t\tconst fallback = bucket.id === \"weekly\" ? \"weekly\" : \"5h\";\n\t\tparts.push(\n\t\t\t`${percentRemaining(bucket)}% ${formatWindowLabel(bucket.windowMinutes, fallback, true)}`,\n\t\t);\n\t}\n\treturn parts.length > 1 ? parts.join(\" \") : undefined;\n}\n\nfunction formatCurrencyMetric(metric: UsageReport[\"metrics\"][number]): string {\n\tif (typeof metric.value !== \"number\") return String(metric.value);\n\tif (!metric.currency) return \"unavailable\";\n\tif (metric.currency === \"USD\") return `$${metric.value.toFixed(2)}`;\n\tif (metric.currency === \"CNY\") return `\u00A5${metric.value.toFixed(2)}`;\n\treturn `${metric.value.toFixed(2)} ${metric.currency}`;\n}\n\nfunction formatXaiReport(lines: string[], report: UsageReport): void {\n\tconst included = report.buckets.find((bucket) => bucket.id === \"included-allowance\");\n\tif (included) {\n\t\tlet value = \"unavailable\";\n\t\tif (included.unit === \"percent\" && included.used !== undefined) {\n\t\t\tvalue = `${included.used}% used`;\n\t\t\tif (included.remaining !== undefined) value += ` \u00B7 ${included.remaining}% left`;\n\t\t} else if (included.used !== undefined) {\n\t\t\tvalue = `${formatUsd(included.used)} used`;\n\t\t\tif (included.limit !== undefined) value += ` of ${formatUsd(included.limit)}`;\n\t\t} else if (included.limit !== undefined) {\n\t\t\tvalue = `usage unavailable \u00B7 ${formatUsd(included.limit)} limit`;\n\t\t}\n\t\tconst period = included.period ? ` \u00B7 ${included.period}` : \"\";\n\t\tconst reset = included.resetsAt ? ` (resets ${formatReset(included.resetsAt)})` : \"\";\n\t\tlines.push(`${\"Included allowance:\".padEnd(VALUE_COLUMN)}${value}${period}${reset}`);\n\t}\n\tconst onDemand = report.buckets.find((bucket) => bucket.id === \"on-demand\");\n\tif (onDemand) {\n\t\tlet value =\n\t\t\tonDemand.used === undefined ? \"usage unavailable\" : `${formatUsd(onDemand.used)} used`;\n\t\tif (onDemand.limit !== undefined) value += ` of ${formatUsd(onDemand.limit)} cap`;\n\t\tlines.push(`${\"On-demand usage:\".padEnd(VALUE_COLUMN)}${value}`);\n\t}\n\tfor (const metric of report.metrics) {\n\t\tlines.push(\n\t\t\t`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`,\n\t\t);\n\t}\n}\n\nfunction formatZaiReport(lines: string[], report: UsageReport): void {\n\tfor (const bucket of report.buckets) {\n\t\tconst reset = bucket.resetsAt ? ` (resets ${formatReset(bucket.resetsAt)})` : \"\";\n\t\tlet value = \"unavailable\";\n\t\tif (bucket.unit === \"percent\" && bucket.used !== undefined) {\n\t\t\tvalue = `${bucket.used}% used`;\n\t\t\tif (bucket.remaining !== undefined) value += ` \u00B7 ${bucket.remaining}% left`;\n\t\t} else if (bucket.used !== undefined && bucket.limit !== undefined) {\n\t\t\tvalue = `${bucket.used} of ${bucket.limit} used`;\n\t\t\tif (bucket.remaining !== undefined) value += ` \u00B7 ${bucket.remaining} left`;\n\t\t} else if (bucket.used !== undefined) {\n\t\t\tvalue = `${bucket.used} used`;\n\t\t} else if (bucket.remaining !== undefined) {\n\t\t\tvalue = `${bucket.remaining} left`;\n\t\t}\n\t\tlines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${value}${reset}`);\n\t}\n\tfor (const metric of report.metrics) {\n\t\tlines.push(\n\t\t\t`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`,\n\t\t);\n\t}\n}\n\nfunction formatGenericReport(lines: string[], report: UsageReport): void {\n\tfor (const bucket of report.buckets) {\n\t\tlines.push(\n\t\t\t`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(bucket.remaining ?? bucket.used ?? \"unavailable\", bucket.unit)}`,\n\t\t);\n\t}\n\tfor (const metric of report.metrics) {\n\t\tlines.push(\n\t\t\t`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`,\n\t\t);\n\t}\n}\n\nfunction formatCodexStatusline(\n\treport: UsageReport,\n\tmodel?: UsageModel,\n\tnow = Date.now(),\n\tshowResetCountdown = true,\n): string | undefined {\n\tconst group = selectCodexGroup(report, model);\n\tif (!group) return formatCodexCreditsStatus(report);\n\tconst buckets = report.buckets.filter((bucket) => (bucket.groupId ?? bucket.id) === group);\n\tconst labelBucket = buckets[0];\n\tconst parts = [\n\t\tgroup === \"codex\" ? \"codex\" : `codex ${compactLimitLabel(labelBucket?.groupLabel ?? group)}`,\n\t];\n\tfor (const bucket of buckets) {\n\t\tif (bucket.remaining === undefined) continue;\n\t\tconst percent = `${clampPercent(bucket.remaining).toFixed(0)}%`;\n\t\tconst fallback = bucket.id.endsWith(\":secondary\") ? \"weekly\" : \"5h\";\n\t\tconst window = formatWindowLabel(bucket.windowMinutes, fallback, true);\n\t\tif (!showResetCountdown) {\n\t\t\tparts.push(`${percent} ${window}`);\n\t\t\tcontinue;\n\t\t}\n\t\tconst reset = formatResetCountdown(bucket.resetsAt, now);\n\t\tparts.push(`${percent} ${reset ? `\u21BB ${reset}` : window}`);\n\t}\n\treturn parts.length > 1 ? parts.join(\" \") : formatCodexCreditsStatus(report);\n}\n\nfunction formatCodexCreditsStatus(report: UsageReport): string {\n\tconst credits = report.metrics.find((metric) => metric.id === \"credits\");\n\tif (!credits) return \"codex usage unavailable\";\n\tif (credits.value === \"none\") return \"codex no credits\";\n\tif (credits.value === \"available\") return \"codex credits available\";\n\tif (credits.value === \"unlimited\") return \"codex credits unlimited\";\n\treturn `codex ${formatMetricValue(credits.value, \"count\")} credits`;\n}\n\nfunction selectCodexGroup(report: UsageReport, model?: UsageModel): string | undefined {\n\tconst groups = [...new Set(report.buckets.map((bucket) => bucket.groupId ?? bucket.id))];\n\tif (model?.provider !== \"openai-codex\") {\n\t\treturn groups.includes(\"codex\") ? \"codex\" : groups[0];\n\t}\n\tconst modelKeys = normalizedModelKeys(model);\n\tfor (const group of groups) {\n\t\tconst bucket = report.buckets.find(\n\t\t\t(candidate) => (candidate.groupId ?? candidate.id) === group,\n\t\t);\n\t\tconst keys = [group, bucket?.groupLabel, ...(bucket?.modelKeys ?? [])]\n\t\t\t.map(normalizeKey)\n\t\t\t.filter((key): key is string => key !== undefined);\n\t\tif (keys.some((key) => modelKeys.has(key))) return group;\n\t}\n\tconst variants = [...modelKeys]\n\t\t.map((key) => key.match(/(?:^|-)codex-(.+)$/)?.[1])\n\t\t.filter((value): value is string => Boolean(value));\n\tfor (const variant of variants) {\n\t\tconst matches = groups.filter((group) => {\n\t\t\tif (group === \"codex\") return false;\n\t\t\tconst key = normalizeKey(group);\n\t\t\treturn key ? normalizedKeyHasToken(key, variant) : false;\n\t\t});\n\t\tif (matches.length === 1) return matches[0];\n\t}\n\treturn groups.includes(\"codex\") ? \"codex\" : groups[0];\n}\n\nfunction normalizedModelKeys(model: UsageModel): Set<string> {\n\tconst keys = new Set<string>();\n\tfor (const value of [model.id, model.name]) {\n\t\tconst key = normalizeKey(value);\n\t\tif (!key) continue;\n\t\tkeys.add(key);\n\t\tconst index = key.indexOf(\"codex\");\n\t\tif (index >= 0) keys.add(key.slice(index));\n\t}\n\treturn keys;\n}\n\nfunction normalizeKey(value: string | undefined): string | undefined {\n\tconst separated = value?.toLowerCase().replace(/[^a-z0-9]+/g, \"-\");\n\tif (!separated) return undefined;\n\tlet start = 0;\n\tlet end = separated.length;\n\twhile (separated[start] === \"-\") start += 1;\n\twhile (end > start && separated[end - 1] === \"-\") end -= 1;\n\treturn separated.slice(start, end) || undefined;\n}\n\nfunction normalizedKeyHasToken(key: string, token: string): boolean {\n\treturn (\n\t\tkey === token ||\n\t\tkey.startsWith(`${token}-`) ||\n\t\tkey.endsWith(`-${token}`) ||\n\t\tkey.includes(`-${token}-`)\n\t);\n}\n\nfunction compactLimitLabel(label: string): string {\n\tconst normalized = label.replace(/[_-]+/g, \" \").trim();\n\tconst codex = /\\bcodex\\s/iu.exec(normalized);\n\tconst suffix = codex ? normalized.slice(codex.index + codex[0].length).trim() : \"\";\n\treturn (suffix || normalized).toLowerCase().replace(/\\s+/g, \" \");\n}\n\nfunction formatPercentBucket(bucket: UsageBucket): string {\n\tconst remaining = clampPercent(bucket.remaining ?? 0);\n\tconst filled = Math.round((remaining / 100) * BAR_SEGMENTS);\n\tconst reset = bucket.resetsAt ? ` (resets ${formatReset(bucket.resetsAt)})` : \"\";\n\treturn `[${\"\u2588\".repeat(filled)}${\"\u2591\".repeat(BAR_SEGMENTS - filled)}] ${remaining.toFixed(0)}% left${reset}`;\n}\n\nfunction formatWindowLabel(\n\tminutes: number | undefined,\n\tfallback: \"5h\" | \"weekly\",\n\tcompact: boolean,\n): string {\n\tif (!minutes || !Number.isFinite(minutes) || minutes <= 0) {\n\t\treturn compact && fallback === \"weekly\" ? \"wk\" : capitalize(fallback);\n\t}\n\tif (minutes === 10_080) return compact ? \"wk\" : \"Weekly\";\n\tif (minutes % 10_080 === 0) return `${minutes / 10_080}w`;\n\tif (minutes % 1_440 === 0) return `${minutes / 1_440}d`;\n\tif (minutes % 60 === 0) return `${minutes / 60}h`;\n\treturn `${minutes}m`;\n}\n\nfunction formatResetCountdown(resetsAt: number | undefined, now: number): string | undefined {\n\tif (resetsAt === undefined || !Number.isFinite(resetsAt) || !Number.isFinite(now))\n\t\treturn undefined;\n\tconst totalMinutes = Math.max(0, Math.ceil((resetsAt * 1_000 - now) / 60_000));\n\tconst days = Math.floor(totalMinutes / 1_440);\n\tconst hours = Math.floor((totalMinutes % 1_440) / 60);\n\tconst minutes = totalMinutes % 60;\n\tif (days > 0) {\n\t\treturn [\n\t\t\t`${String(days)}d`,\n\t\t\thours > 0 ? `${String(hours)}h` : minutes > 0 ? `${String(minutes)}m` : \"\",\n\t\t]\n\t\t\t.filter(Boolean)\n\t\t\t.join(\"\");\n\t}\n\tif (hours > 0)\n\t\treturn [`${String(hours)}h`, minutes > 0 ? `${String(minutes)}m` : \"\"].filter(Boolean).join(\"\");\n\treturn `${String(minutes)}m`;\n}\n\nfunction formatMetricValue(value: number | string, unit: UsageBucket[\"unit\"] | undefined): string {\n\tif (unit === \"usd\" && typeof value === \"number\") return formatUsd(value);\n\treturn String(value);\n}\n\nfunction formatUsd(value: number): string {\n\treturn `$${value.toFixed(2)}`;\n}\n\nfunction formatReset(epochSeconds: number): string {\n\tconst reset = new Date(epochSeconds * 1000);\n\tif (Number.isNaN(reset.getTime())) return \"at an unknown time\";\n\tconst time = `${reset.getHours().toString().padStart(2, \"0\")}:${reset\n\t\t.getMinutes()\n\t\t.toString()\n\t\t.padStart(2, \"0\")}`;\n\tconst now = new Date();\n\tif (reset.toDateString() === now.toDateString()) return time;\n\treturn `${time} on ${reset.getDate()} ${reset.toLocaleDateString(undefined, { month: \"short\" })}`;\n}\n\nfunction capitalize(value: string): string {\n\treturn `${value[0]?.toUpperCase() ?? \"\"}${value.slice(1)}`;\n}\n\nfunction clampPercent(value: number): number {\n\treturn 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\";\n\nexport const USAGE_SETTINGS_FILE = \"pi-usage.json\";\nexport const MAX_USAGE_SETTINGS_BYTES = 64 * 1024;\n\nexport interface UsageSettings {\n\tcodexFastMode: boolean;\n\tcodexStatusResetCountdown: boolean;\n\tfireworksAccountId?: string;\n}\n\nexport const DEFAULT_USAGE_SETTINGS: Readonly<UsageSettings> = Object.freeze({\n\tcodexFastMode: false,\n\tcodexStatusResetCountdown: true,\n});\n\nexport interface UsageSettingsState {\n\tkind: \"missing\" | \"loaded\" | \"invalid\";\n\tpath: string;\n\tsettings: UsageSettings;\n\tdocument?: Record<string, unknown>;\n\tissue?: string;\n}\n\nexport interface UsageSettingsRuntime {\n\tget(): Readonly<UsageSettingsState>;\n\treload(signal?: AbortSignal): Promise<Readonly<UsageSettingsState>>;\n\tupdate(\n\t\tpatch: Partial<UsageSettings>,\n\t\tsignal?: AbortSignal,\n\t): Promise<Readonly<UsageSettingsState>>;\n\tflush(): Promise<void>;\n}\n\ninterface UsageSettingsFileOperations {\n\trename: typeof rename;\n\twriteFile: typeof writeFile;\n}\n\ninterface UsageSettingsRuntimeOptions {\n\toperations?: Partial<UsageSettingsFileOperations>;\n\tpath?: string;\n}\n\nexport function usageSettingsPath(): string {\n\treturn join(getAgentDir(), USAGE_SETTINGS_FILE);\n}\n\nexport function normalizeUsageSettings(value: unknown): UsageSettings | undefined {\n\tif (!isRecord(value)) return undefined;\n\tif (Object.hasOwn(value, \"codexFastMode\") && typeof value.codexFastMode !== \"boolean\") {\n\t\treturn undefined;\n\t}\n\tif (\n\t\tObject.hasOwn(value, \"codexStatusResetCountdown\") &&\n\t\ttypeof value.codexStatusResetCountdown !== \"boolean\"\n\t) {\n\t\treturn undefined;\n\t}\n\tif (\n\t\tObject.hasOwn(value, \"fireworksAccountId\") &&\n\t\t!isFireworksAccountId(value.fireworksAccountId)\n\t) {\n\t\treturn undefined;\n\t}\n\treturn {\n\t\tcodexFastMode:\n\t\t\ttypeof value.codexFastMode === \"boolean\"\n\t\t\t\t? value.codexFastMode\n\t\t\t\t: DEFAULT_USAGE_SETTINGS.codexFastMode,\n\t\tcodexStatusResetCountdown:\n\t\t\ttypeof value.codexStatusResetCountdown === \"boolean\"\n\t\t\t\t? value.codexStatusResetCountdown\n\t\t\t\t: DEFAULT_USAGE_SETTINGS.codexStatusResetCountdown,\n\t\t...(isFireworksAccountId(value.fireworksAccountId)\n\t\t\t? { fireworksAccountId: value.fireworksAccountId }\n\t\t\t: {}),\n\t};\n}\n\nexport async function loadUsageSettings(\n\tpath = usageSettingsPath(),\n\tsignal?: AbortSignal,\n): Promise<UsageSettingsState> {\n\tthrowIfAborted(signal);\n\ttry {\n\t\tconst handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);\n\t\tlet text: string;\n\t\ttry {\n\t\t\tconst stats = await handle.stat();\n\t\t\tthrowIfAborted(signal);\n\t\t\tif (!stats.isFile()) throw new Error(\"settings path is not a regular file\");\n\t\t\tif (stats.size > MAX_USAGE_SETTINGS_BYTES) {\n\t\t\t\tthrow new Error(\"settings file exceeds 64 KiB\");\n\t\t\t}\n\t\t\ttext = await handle.readFile(\"utf8\");\n\t\t} finally {\n\t\t\tawait handle.close();\n\t\t}\n\t\tthrowIfAborted(signal);\n\t\tconst document = JSON.parse(text) as unknown;\n\t\tconst settings = normalizeUsageSettings(document);\n\t\tif (!settings || !isRecord(document)) throw new Error(\"invalid settings shape\");\n\t\treturn { kind: \"loaded\", path, settings, document };\n\t} catch (error) {\n\t\tif (signal?.aborted) throw error;\n\t\tif (isNodeError(error) && error.code === \"ENOENT\") {\n\t\t\treturn {\n\t\t\t\tkind: \"missing\",\n\t\t\t\tpath,\n\t\t\t\tsettings: { ...DEFAULT_USAGE_SETTINGS },\n\t\t\t\tdocument: {},\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tkind: \"invalid\",\n\t\t\tpath,\n\t\t\tsettings: { ...DEFAULT_USAGE_SETTINGS },\n\t\t\tissue:\n\t\t\t\tisNodeError(error) && error.code === \"ELOOP\"\n\t\t\t\t\t? \"symbolic links are not accepted\"\n\t\t\t\t\t: error instanceof Error\n\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t: String(error),\n\t\t};\n\t}\n}\n\nexport function createUsageSettingsRuntime(\n\toptions: UsageSettingsRuntimeOptions | string = {},\n): UsageSettingsRuntime {\n\tconst path = typeof options === \"string\" ? options : (options.path ?? usageSettingsPath());\n\tconst operations: UsageSettingsFileOperations = {\n\t\trename,\n\t\twriteFile,\n\t\t...(typeof options === \"string\" ? undefined : options.operations),\n\t};\n\tlet state: UsageSettingsState = {\n\t\tkind: \"missing\",\n\t\tpath,\n\t\tsettings: { ...DEFAULT_USAGE_SETTINGS },\n\t\tdocument: {},\n\t};\n\tlet queue = Promise.resolve();\n\tconst enqueue = <T>(operation: () => Promise<T>): Promise<T> => {\n\t\tconst result = queue.then(operation, operation);\n\t\tqueue = result.then(\n\t\t\t() => undefined,\n\t\t\t() => undefined,\n\t\t);\n\t\treturn result;\n\t};\n\treturn {\n\t\tget: () => structuredClone(state),\n\t\treload: (signal) =>\n\t\t\tenqueue(async () => {\n\t\t\t\tconst loaded = await loadUsageSettings(path, signal);\n\t\t\t\tstate = loaded;\n\t\t\t\treturn structuredClone(state);\n\t\t\t}),\n\t\tupdate: (patch, signal) =>\n\t\t\tenqueue(async () => {\n\t\t\t\tconst saved = await saveUsageSettingsPatch(path, patch, operations, signal);\n\t\t\t\tstate = saved;\n\t\t\t\treturn structuredClone(state);\n\t\t\t}),\n\t\tflush: () => queue,\n\t};\n}\n\nasync function saveUsageSettingsPatch(\n\tpath: string,\n\tpatch: Partial<UsageSettings>,\n\toperations: UsageSettingsFileOperations,\n\tsignal?: AbortSignal,\n): Promise<UsageSettingsState> {\n\tconst latest = await loadUsageSettings(path, signal);\n\tif (latest.kind === \"invalid\") {\n\t\tthrow new Error(\"Cannot overwrite an invalid pi-usage.json; repair it and reload first\");\n\t}\n\tconst document = { ...latest.document };\n\tfor (const [key, value] of Object.entries(patch)) {\n\t\tif (value === undefined) delete document[key];\n\t\telse document[key] = value;\n\t}\n\tconst settings = normalizeUsageSettings(document);\n\tif (!settings) throw new Error(\"Refusing to save invalid pi-usage settings\");\n\tconst directory = dirname(path);\n\tconst temporaryPath = join(directory, `.${basename(path)}.${randomUUID()}.tmp`);\n\tawait mkdir(directory, { recursive: true, mode: 0o700 });\n\tthrowIfAborted(signal);\n\ttry {\n\t\tawait operations.writeFile(temporaryPath, `${JSON.stringify(document, null, 2)}\\n`, {\n\t\t\tencoding: \"utf8\",\n\t\t\tflag: \"wx\",\n\t\t\tmode: 0o600,\n\t\t});\n\t\tif (process.platform !== \"win32\") await chmodPrivate(temporaryPath);\n\t\tthrowIfAborted(signal);\n\t\tconst current = await loadUsageSettings(path, signal);\n\t\tif (\n\t\t\tcurrent.kind === \"invalid\" ||\n\t\t\tcurrent.kind !== latest.kind ||\n\t\t\tJSON.stringify(current.document) !== JSON.stringify(latest.document)\n\t\t) {\n\t\t\tthrow new Error(\"pi-usage.json changed while saving; retry the action\");\n\t\t}\n\t\tthrowIfAborted(signal);\n\t\tawait operations.rename(temporaryPath, path);\n\t} finally {\n\t\tawait rm(temporaryPath, { force: true }).catch(() => undefined);\n\t}\n\treturn { kind: \"loaded\", path, settings, document };\n}\n\nasync function chmodPrivate(path: string): Promise<void> {\n\tawait chmod(path, 0o600);\n}\n\nfunction throwIfAborted(signal?: AbortSignal): void {\n\tif (signal?.aborted) throw new DOMException(\"Settings operation aborted\", \"AbortError\");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n\treturn error instanceof Error && \"code\" in error;\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 {\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionContext,\n} from \"@earendil-works/pi-coding-agent\";\nimport { FAST_USAGE_WARNING, registerCodexFastMode } from \"./codex-fast-runtime.js\";\nimport {\n\ttype CodexResetAvailability,\n\ttype CodexResetOption,\n\ttype CodexResetOutcome,\n\tcodexResetActionDescription,\n\tcodexResetCount,\n\tconsumeCodexResetCredit,\n\tformatCodexResetOutcome,\n\tgenericCodexResetOption,\n\tlistCodexResetCredits,\n\tresetConfirmationLines,\n\tresetLabel,\n\tresetOptionExpiration,\n\tresolveCodexResetAuth,\n} from \"./codex-resets.js\";\nimport {\n\tabortError,\n\tawaitWithDeadline,\n\terrorMessage,\n\trunWithConcurrency,\n\tUsageCache,\n} from \"./core.js\";\nimport { formatProviderStates, formatUsageStatusline } from \"./format.js\";\nimport { createOAuthCredentialCandidateReader } from \"./oauth-credential-source.js\";\nimport {\n\tadapterForProvider,\n\tisStaleExtensionContextError,\n\tqueryProviderUsage,\n\tresolveUsageAuth,\n} from \"./query.js\";\nimport { createUsageSettingsRuntime, type UsageSettingsRuntime } from \"./settings.js\";\nimport type {\n\tPiModel,\n\tProviderUsageState,\n\tResolvedUsageAuth,\n\tUsageDisplayState,\n\tUsageProviderAdapter,\n} from \"./types.js\";\nimport {\n\tconfiguredAdapters,\n\tisAbortError,\n\tisTimeoutError,\n\tmodelIdentity,\n\tproviderDisplayName,\n\tsetBoundedMap,\n} from \"./usage-helpers.js\";\nimport { showUsageSettings } from \"./usage-settings-ui.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\tcredentialReader?: (providerId: string) => unknown;\n\tcreateRedemptionId?: () => string;\n\tsettingsRuntime?: UsageSettingsRuntime;\n};\n\ntype QueryOutcome = {\n\tstate: ProviderUsageState;\n\tfingerprint?: string;\n\tauthState?: \"unavailable\";\n};\n\ntype StableCurrent = {\n\toutcome: QueryOutcome;\n\tmodel: PiModel | undefined;\n};\n\nexport default function usageExtension(\n\tpi: ExtensionAPI,\n\tdependencies: UsageExtensionDependencies = {},\n) {\n\tconst credentialReader = dependencies.credentialReader;\n\tconst credentialCandidates = createOAuthCredentialCandidateReader(pi, credentialReader);\n\tconst createRedemptionId = dependencies.createRedemptionId ?? randomUUID;\n\tconst settingsRuntime = dependencies.settingsRuntime ?? createUsageSettingsRuntime();\n\tconst cache = new UsageCache(CACHE_TTL_MS);\n\tconst failureBackoff = new Map<string, { until: number; message: string }>();\n\tconst latestQueries = new Map<string, number>();\n\tconst activeControllers = new Set<AbortController>();\n\tlet querySequence = 0;\n\tlet activeCurrentIdentity: string | undefined;\n\tlet sessionActive = false;\n\tlet statusGeneration = 0;\n\tlet sessionGeneration = 0;\n\tlet statusRefreshTimer: ReturnType<typeof setTimeout> | undefined;\n\tlet statusCountdownTimer: ReturnType<typeof setTimeout> | undefined;\n\tlet statusController: AbortController | undefined;\n\tlet fastRuntime: ReturnType<typeof registerCodexFastMode>;\n\n\tconst clearStatusRefreshTimer = () => {\n\t\tif (statusRefreshTimer) clearTimeout(statusRefreshTimer);\n\t\tstatusRefreshTimer = undefined;\n\t};\n\n\tconst clearStatusCountdownTimer = () => {\n\t\tif (statusCountdownTimer) clearTimeout(statusCountdownTimer);\n\t\tstatusCountdownTimer = undefined;\n\t};\n\n\tconst clearStatusTimers = () => {\n\t\tclearStatusRefreshTimer();\n\t\tclearStatusCountdownTimer();\n\t};\n\n\tconst safeSetStatus = (ctx: ExtensionContext, value: string | undefined): boolean => {\n\t\ttry {\n\t\t\tctx.ui.setStatus(STATUS_KEY, value);\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\tif (isStaleExtensionContextError(error)) return false;\n\t\t\tthrow error;\n\t\t}\n\t};\n\n\tconst clearStatus = (ctx: ExtensionContext) => {\n\t\tstatusGeneration += 1;\n\t\tstatusController?.abort();\n\t\tstatusController = undefined;\n\t\tclearStatusTimers();\n\t\tsafeSetStatus(ctx, undefined);\n\t};\n\n\tconst scheduleStatusRefresh = (ctx: ExtensionContext, model: PiModel) => {\n\t\tclearStatusRefreshTimer();\n\t\tconst generation = statusGeneration;\n\t\tstatusRefreshTimer = setTimeout(() => {\n\t\t\tstatusRefreshTimer = undefined;\n\t\t\tif (!sessionActive || generation !== statusGeneration) return;\n\t\t\tstartStatusRefresh(ctx, model, true);\n\t\t}, CACHE_TTL_MS);\n\t\tstatusRefreshTimer.unref?.();\n\t};\n\n\tconst publishStatus = (\n\t\tctx: ExtensionContext,\n\t\toutcome: QueryOutcome,\n\t\tmodel: PiModel,\n\t\tshouldSchedule: boolean,\n\t) => {\n\t\tclearStatusCountdownTimer();\n\t\tif (adapterForProvider(model.provider)?.publishesStatusline === false) {\n\t\t\tclearStatusRefreshTimer();\n\t\t\tsafeSetStatus(ctx, undefined);\n\t\t\treturn;\n\t\t}\n\t\tif (outcome.state.status === \"unsupported\") {\n\t\t\tclearStatusRefreshTimer();\n\t\t\tsafeSetStatus(ctx, undefined);\n\t\t\treturn;\n\t\t}\n\t\tif (outcome.state.status !== \"ready\") {\n\t\t\tif (\n\t\t\t\tsafeSetStatus(\n\t\t\t\t\tctx,\n\t\t\t\t\toutcome.state.status === \"auth-unavailable\" ? \"auth unavailable\" : \"usage error\",\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tif (shouldSchedule && sessionActive) scheduleStatusRefresh(ctx, model);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tconst showCodexResetCountdown =\n\t\t\toutcome.state.report.providerId === \"openai-codex\" &&\n\t\t\tsettingsRuntime.get().settings.codexStatusResetCountdown;\n\t\tconst now = Date.now();\n\t\tconst rawValue = formatUsageStatusline(\n\t\t\toutcome.state.report,\n\t\t\tmodel,\n\t\t\tnow,\n\t\t\tshowCodexResetCountdown,\n\t\t);\n\t\tconst value = rawValue ? fastRuntime.decorateStatus(model, rawValue) : undefined;\n\t\tif (!safeSetStatus(ctx, value)) return;\n\t\tif (shouldSchedule && sessionActive) scheduleStatusRefresh(ctx, model);\n\t\tif (\n\t\t\tsessionActive &&\n\t\t\tshowCodexResetCountdown &&\n\t\t\toutcome.state.report.buckets.some(\n\t\t\t\t(bucket) =>\n\t\t\t\t\tbucket.resetsAt !== undefined &&\n\t\t\t\t\tNumber.isFinite(bucket.resetsAt) &&\n\t\t\t\t\tbucket.resetsAt * 1_000 > now,\n\t\t\t)\n\t\t) {\n\t\t\tconst generation = statusGeneration;\n\t\t\tstatusCountdownTimer = setTimeout(() => {\n\t\t\t\tstatusCountdownTimer = undefined;\n\t\t\t\tif (\n\t\t\t\t\t!sessionActive ||\n\t\t\t\t\tgeneration !== statusGeneration ||\n\t\t\t\t\tmodelIdentity(ctx.model) !== modelIdentity(model)\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tpublishStatus(ctx, outcome, model, false);\n\t\t\t}, STATUS_COUNTDOWN_REFRESH_MS);\n\t\t\tstatusCountdownTimer.unref?.();\n\t\t}\n\t};\n\n\tconst invalidateProviderState = (providerId: string) => {\n\t\tcache.clearProvider(providerId);\n\t\tfor (const key of failureBackoff.keys()) {\n\t\t\tif (key.startsWith(`${providerId}:`)) failureBackoff.delete(key);\n\t\t}\n\t\tfor (const key of latestQueries.keys()) {\n\t\t\tif (key.startsWith(`${providerId}:`)) latestQueries.delete(key);\n\t\t}\n\t};\n\n\tconst transitionCurrentIdentity = (nextIdentity: string, providerId: string) => {\n\t\tif (!activeCurrentIdentity || activeCurrentIdentity === nextIdentity) {\n\t\t\tactiveCurrentIdentity = nextIdentity;\n\t\t\treturn;\n\t\t}\n\t\tconst previousProviderId = activeCurrentIdentity.split(\":\", 1)[0] ?? \"\";\n\t\tfor (const id of new Set([previousProviderId, providerId])) {\n\t\t\tif (id) invalidateProviderState(id);\n\t\t}\n\t\tactiveCurrentIdentity = nextIdentity;\n\t};\n\n\tconst queryAdapterState = async (\n\t\tctx: ExtensionContext,\n\t\tadapter: UsageProviderAdapter,\n\t\tdisplayState: UsageDisplayState,\n\t\tforce: boolean,\n\t\tsignal: AbortSignal,\n\t\tauthRetry = 0,\n\t\tdeadlineAt = Date.now() + DEFAULT_TIMEOUT_MS,\n\t): Promise<QueryOutcome> => {\n\t\tconst expectedSessionGeneration = sessionGeneration;\n\t\tconst expectedSessionId = ctx.sessionManager.getSessionId();\n\t\tconst expectedModelIdentity = modelIdentity(ctx.model);\n\t\tconst expectedFireworksAccountId =\n\t\t\tadapter.id === \"fireworks\" ? settingsRuntime.get().settings.fireworksAccountId : undefined;\n\t\tconst querySettings =\n\t\t\tadapter.id === \"fireworks\" ? { fireworksAccountId: expectedFireworksAccountId } : undefined;\n\t\tlet auth: ResolvedUsageAuth | undefined;\n\t\ttry {\n\t\t\tauth = await awaitWithDeadline(\n\t\t\t\tresolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n\t\t\t\tsignal,\n\t\t\t\tMath.max(1, deadlineAt - Date.now()),\n\t\t\t\t`resolving ${adapter.displayName} runtime auth`,\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tif (isStaleExtensionContextError(error) || isAbortError(error)) throw error;\n\t\t\tif (displayState === \"current\") {\n\t\t\t\ttransitionCurrentIdentity(`${adapter.id}:auth-error`, adapter.id);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\tproviderId: adapter.id,\n\t\t\t\t\tproviderName: adapter.displayName,\n\t\t\t\t\tdisplayState,\n\t\t\t\t\tstatus: isTimeoutError(error) ? \"query-failed\" : \"auth-unavailable\",\n\t\t\t\t\tmessage: errorMessage(error),\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tconst requiresRequestBoundaryGuard = [\"deepseek\", \"fireworks\", \"xai\"].includes(adapter.id);\n\t\tconst requestContextChanged = () =>\n\t\t\texpectedSessionGeneration !== sessionGeneration ||\n\t\t\tctx.sessionManager.getSessionId() !== expectedSessionId ||\n\t\t\tmodelIdentity(ctx.model) !== expectedModelIdentity ||\n\t\t\t(adapter.id === \"fireworks\" &&\n\t\t\t\tsettingsRuntime.get().settings.fireworksAccountId !== expectedFireworksAccountId);\n\t\tif (requiresRequestBoundaryGuard && requestContextChanged()) throw abortError();\n\t\tif (!auth) {\n\t\t\tif (displayState === \"current\") {\n\t\t\t\ttransitionCurrentIdentity(`${adapter.id}:unavailable`, adapter.id);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\tproviderId: adapter.id,\n\t\t\t\t\tproviderName: adapter.displayName,\n\t\t\t\t\tdisplayState,\n\t\t\t\t\tstatus: \"auth-unavailable\",\n\t\t\t\t\tmessage: `No runtime credential is configured for ${adapter.displayName}.`,\n\t\t\t\t},\n\t\t\t\tauthState: \"unavailable\",\n\t\t\t};\n\t\t}\n\t\tconst queryFingerprint =\n\t\t\tadapter.id === \"fireworks\"\n\t\t\t\t? `${auth.fingerprint}:account:${expectedFireworksAccountId ?? \"auto\"}`\n\t\t\t\t: auth.fingerprint;\n\t\tif (displayState === \"current\") {\n\t\t\ttransitionCurrentIdentity(`${adapter.id}:${queryFingerprint}`, adapter.id);\n\t\t}\n\n\t\tconst cached = !force ? cache.get(adapter.id, queryFingerprint) : undefined;\n\t\tif (cached) {\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\tproviderId: adapter.id,\n\t\t\t\t\tproviderName: adapter.displayName,\n\t\t\t\t\tdisplayState,\n\t\t\t\t\tstatus: \"ready\",\n\t\t\t\t\treport: cached,\n\t\t\t\t},\n\t\t\t\tfingerprint: auth.fingerprint,\n\t\t\t};\n\t\t}\n\n\t\tconst failureKey = `${adapter.id}:${queryFingerprint}`;\n\t\tconst previousFailure = failureBackoff.get(failureKey);\n\t\tif (!force && previousFailure && previousFailure.until > Date.now()) {\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\tproviderId: adapter.id,\n\t\t\t\t\tproviderName: adapter.displayName,\n\t\t\t\t\tdisplayState,\n\t\t\t\t\tstatus: \"query-failed\",\n\t\t\t\t\tmessage: previousFailure.message,\n\t\t\t\t},\n\t\t\t\tfingerprint: auth.fingerprint,\n\t\t\t};\n\t\t}\n\t\tfailureBackoff.delete(failureKey);\n\t\tquerySequence += 1;\n\t\tconst queryId = querySequence;\n\t\tsetBoundedMap(latestQueries, failureKey, queryId, MAX_ACCOUNT_STATES);\n\n\t\tlet deepSeekAuthChanged = false;\n\t\ttry {\n\t\t\tconst remainingMs = Math.max(1, deadlineAt - Date.now());\n\t\t\tconst guard = requiresRequestBoundaryGuard\n\t\t\t\t? async () => {\n\t\t\t\t\t\tif (signal.aborted || requestContextChanged()) throw abortError();\n\t\t\t\t\t\tconst revalidated = await awaitWithDeadline(\n\t\t\t\t\t\t\tresolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\tMath.max(1, deadlineAt - Date.now()),\n\t\t\t\t\t\t\t`revalidating ${adapter.displayName} runtime auth`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (signal.aborted || requestContextChanged()) throw abortError();\n\t\t\t\t\t\tif (revalidated?.fingerprint !== auth.fingerprint) {\n\t\t\t\t\t\t\tif (adapter.id === \"deepseek\") {\n\t\t\t\t\t\t\t\tdeepSeekAuthChanged = true;\n\t\t\t\t\t\t\t\tthrow new Error(\"DeepSeek runtime credential changed during the balance query.\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthrow abortError();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t: undefined;\n\t\t\tconst report = await queryProviderUsage(\n\t\t\t\tadapter,\n\t\t\t\tauth,\n\t\t\t\tsignal,\n\t\t\t\tremainingMs,\n\t\t\t\tguard,\n\t\t\t\tquerySettings,\n\t\t\t);\n\t\t\tif (guard) await guard();\n\t\t\tif (latestQueries.get(failureKey) === queryId) {\n\t\t\t\tcache.set(adapter.id, queryFingerprint, report);\n\t\t\t\tfailureBackoff.delete(failureKey);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\tproviderId: adapter.id,\n\t\t\t\t\tproviderName: adapter.displayName,\n\t\t\t\t\tdisplayState,\n\t\t\t\t\tstatus: \"ready\",\n\t\t\t\t\treport,\n\t\t\t\t},\n\t\t\t\tfingerprint: auth.fingerprint,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tif (isStaleExtensionContextError(error) || isAbortError(error)) throw error;\n\t\t\tif (\n\t\t\t\tdeepSeekAuthChanged &&\n\t\t\t\tauthRetry === 0 &&\n\t\t\t\t!signal.aborted &&\n\t\t\t\t!requestContextChanged() &&\n\t\t\t\tDate.now() < deadlineAt\n\t\t\t) {\n\t\t\t\tif (latestQueries.get(failureKey) === queryId) latestQueries.delete(failureKey);\n\t\t\t\treturn queryAdapterState(\n\t\t\t\t\tctx,\n\t\t\t\t\tadapter,\n\t\t\t\t\tdisplayState,\n\t\t\t\t\ttrue,\n\t\t\t\t\tsignal,\n\t\t\t\t\tauthRetry + 1,\n\t\t\t\t\tdeadlineAt,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst message = errorMessage(error);\n\t\t\tconst now = Date.now();\n\t\t\tfor (const [key, failure] of failureBackoff) {\n\t\t\t\tif (failure.until <= now) failureBackoff.delete(key);\n\t\t\t}\n\t\t\tif (latestQueries.get(failureKey) === queryId) {\n\t\t\t\tsetBoundedMap(\n\t\t\t\t\tfailureBackoff,\n\t\t\t\t\tfailureKey,\n\t\t\t\t\t{ until: now + FAILURE_BACKOFF_MS, message },\n\t\t\t\t\tMAX_ACCOUNT_STATES,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\tproviderId: adapter.id,\n\t\t\t\t\tproviderName: adapter.displayName,\n\t\t\t\t\tdisplayState,\n\t\t\t\t\tstatus: \"query-failed\",\n\t\t\t\t\tmessage,\n\t\t\t\t},\n\t\t\t\tfingerprint: auth.fingerprint,\n\t\t\t};\n\t\t}\n\t};\n\n\tconst queryCurrentState = async (\n\t\tctx: ExtensionContext,\n\t\tmodel: PiModel | undefined,\n\t\tforce: boolean,\n\t\tsignal: AbortSignal,\n\t): Promise<QueryOutcome> => {\n\t\tconst adapter = adapterForProvider(model?.provider);\n\t\tif (!adapter) {\n\t\t\tconst providerId = model?.provider ?? \"none\";\n\t\t\ttransitionCurrentIdentity(`unsupported:${providerId}`, providerId);\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\tproviderId,\n\t\t\t\t\tproviderName: providerDisplayName(ctx, providerId),\n\t\t\t\t\tdisplayState: \"current\",\n\t\t\t\t\tstatus: \"unsupported\",\n\t\t\t\t\tmessage: model\n\t\t\t\t\t\t? `Usage reporting is not supported for ${providerDisplayName(ctx, providerId)}.`\n\t\t\t\t\t\t: \"No model is selected.\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\treturn queryAdapterState(ctx, adapter, \"current\", force, signal);\n\t};\n\n\tconst refreshCurrentStatus = async (\n\t\tctx: ExtensionContext,\n\t\tmodel: PiModel | undefined,\n\t\tforce: boolean,\n\t) => {\n\t\tconst adapter = adapterForProvider(model?.provider);\n\t\tif (!adapter || !model) {\n\t\t\tconst providerId = model?.provider ?? \"none\";\n\t\t\ttransitionCurrentIdentity(`unsupported:${providerId}`, providerId);\n\t\t\tclearStatus(ctx);\n\t\t\treturn;\n\t\t}\n\t\tif (adapter.publishesStatusline === false) {\n\t\t\tclearStatus(ctx);\n\t\t\treturn;\n\t\t}\n\t\tstatusGeneration += 1;\n\t\tconst generation = statusGeneration;\n\t\tclearStatusCountdownTimer();\n\t\tstatusController?.abort();\n\t\tconst controller = new AbortController();\n\t\tstatusController = controller;\n\t\tactiveControllers.add(controller);\n\t\ttry {\n\t\t\tif (!safeSetStatus(ctx, \"checking\")) return;\n\t\t\tconst outcome = await queryCurrentState(ctx, model, force, controller.signal);\n\t\t\tif (!sessionActive || generation !== statusGeneration || controller.signal.aborted) return;\n\t\t\tif (!(await outcomeStillCurrent(ctx, model, generation, outcome, controller.signal))) {\n\t\t\t\tif (sessionActive && generation === statusGeneration) {\n\t\t\t\t\tqueueMicrotask(() => startStatusRefresh(ctx, ctx.model, false));\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpublishStatus(ctx, outcome, model, true);\n\t\t} finally {\n\t\t\tactiveControllers.delete(controller);\n\t\t\tif (statusController === controller) statusController = undefined;\n\t\t}\n\t};\n\n\tconst startStatusRefresh = (\n\t\tctx: ExtensionContext,\n\t\tmodel: PiModel | undefined,\n\t\tforce: boolean,\n\t) => {\n\t\tvoid refreshCurrentStatus(ctx, model, force).catch((error) => {\n\t\t\tif (isStaleExtensionContextError(error) || isAbortError(error)) return;\n\t\t\tsafeSetStatus(ctx, \"usage error\");\n\t\t});\n\t};\n\n\tconst runMenuOperation = async <T>(\n\t\tctx: ExtensionCommandContext,\n\t\tlabel: string,\n\t\tparentSignal: AbortSignal,\n\t\toperation: (signal: AbortSignal) => Promise<T>,\n\t\tcancellable = true,\n\t): Promise<T | undefined> => {\n\t\tconst { runTask } = await import(\"@narumitw/pi-tui-kit\");\n\t\tif (parentSignal.aborted) return undefined;\n\t\tconst result = await runTask(ctx, {\n\t\t\tlabel,\n\t\t\tsignal: parentSignal,\n\t\t\tcancellable,\n\t\t\tonError: () => undefined,\n\t\t\ttask: ({ signal }) => operation(signal),\n\t\t});\n\t\tswitch (result.kind) {\n\t\t\tcase \"completed\":\n\t\t\t\treturn result.value;\n\t\t\tcase \"cancelled\":\n\t\t\tcase \"stale\":\n\t\t\t\treturn undefined;\n\t\t\tcase \"error\":\n\t\t\t\tthrow result.error;\n\t\t}\n\t};\n\n\tconst outcomeStillCurrent = async (\n\t\tctx: ExtensionContext,\n\t\tmodel: PiModel | undefined,\n\t\tgeneration: number,\n\t\toutcome: QueryOutcome,\n\t\tsignal: AbortSignal,\n\t): Promise<boolean> => {\n\t\tif (generation !== statusGeneration || modelIdentity(ctx.model) !== modelIdentity(model)) {\n\t\t\treturn false;\n\t\t}\n\t\tconst adapter = adapterForProvider(model?.provider);\n\t\tif (outcome.authState === \"unavailable\") {\n\t\t\tif (!adapter) return false;\n\t\t\ttry {\n\t\t\t\tconst auth = await awaitWithDeadline(\n\t\t\t\t\tresolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n\t\t\t\t\tsignal,\n\t\t\t\t\tDEFAULT_TIMEOUT_MS,\n\t\t\t\t\t`revalidating ${adapter.displayName} runtime auth`,\n\t\t\t\t);\n\t\t\t\treturn (\n\t\t\t\t\tgeneration === statusGeneration &&\n\t\t\t\t\tmodelIdentity(ctx.model) === modelIdentity(model) &&\n\t\t\t\t\tauth === undefined\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\tif (isAbortError(error) || isStaleExtensionContextError(error)) throw error;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\tif (!outcome.fingerprint) return true;\n\t\tif (!adapter) return false;\n\t\ttry {\n\t\t\tconst auth = await awaitWithDeadline(\n\t\t\t\tresolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n\t\t\t\tsignal,\n\t\t\t\tDEFAULT_TIMEOUT_MS,\n\t\t\t\t`revalidating ${adapter.displayName} runtime auth`,\n\t\t\t);\n\t\t\treturn (\n\t\t\t\tgeneration === statusGeneration &&\n\t\t\t\tmodelIdentity(ctx.model) === modelIdentity(model) &&\n\t\t\t\tauth?.fingerprint === outcome.fingerprint\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tif (isAbortError(error) || isStaleExtensionContextError(error)) throw error;\n\t\t\treturn false;\n\t\t}\n\t};\n\n\tconst queryStableCurrent = async (\n\t\tctx: ExtensionCommandContext,\n\t\tforce: boolean,\n\t\tcontroller: AbortController,\n\t\tlabel: string,\n\t): Promise<StableCurrent | undefined> => {\n\t\tfor (let attempt = 0; attempt < 3; attempt += 1) {\n\t\t\tconst model = ctx.model;\n\t\t\tconst generation = statusGeneration;\n\t\t\tconst result = await runMenuOperation(ctx, label, controller.signal, async (signal) => {\n\t\t\t\tconst outcome = await queryCurrentState(ctx, model, force, signal);\n\t\t\t\treturn {\n\t\t\t\t\toutcome,\n\t\t\t\t\tstable: await outcomeStillCurrent(ctx, model, generation, outcome, signal),\n\t\t\t\t};\n\t\t\t});\n\t\t\tif (!result) return undefined;\n\t\t\tif (result.stable) return { outcome: result.outcome, model };\n\t\t\tforce = false;\n\t\t}\n\t\tctx.ui.notify(\"The active model or account kept changing; reopen /usage to retry.\", \"warning\");\n\t\treturn undefined;\n\t};\n\n\tconst publishStableCurrent = (ctx: ExtensionCommandContext, current: StableCurrent) => {\n\t\tif (current.model) publishStatus(ctx, current.outcome, current.model, sessionActive);\n\t\telse safeSetStatus(ctx, undefined);\n\t};\n\n\tconst showMenu = async (ctx: ExtensionCommandContext): Promise<void> => {\n\t\tif (!ctx.hasUI) throw new Error(\"/usage requires TUI or RPC mode.\");\n\t\tstatusGeneration += 1;\n\t\tconst menuGeneration = statusGeneration;\n\t\tstatusController?.abort();\n\t\tstatusController = undefined;\n\t\tclearStatusTimers();\n\t\tconst controller = new AbortController();\n\t\tactiveControllers.add(controller);\n\t\ttry {\n\t\t\tlet stableCurrent = await queryStableCurrent(\n\t\t\t\tctx,\n\t\t\t\tfalse,\n\t\t\t\tcontroller,\n\t\t\t\t\"Checking current usage\u2026\",\n\t\t\t);\n\t\t\tif (!stableCurrent) return;\n\t\t\tpublishStableCurrent(ctx, stableCurrent);\n\t\t\tlet current = stableCurrent.outcome;\n\t\t\tlet visibleStates: ProviderUsageState[] = [current.state];\n\t\t\tlet fastState = settingsRuntime.get();\n\t\t\tlet resetAvailability: CodexResetAvailability | undefined;\n\t\t\tlet selectedReset: CodexResetOption | undefined;\n\t\t\tlet resetAuthFingerprint: string | undefined;\n\t\t\tlet resetModelIdentity: string | undefined;\n\t\t\tlet redemptionId: string | undefined;\n\t\t\tlet resetOutcome: CodexResetOutcome | undefined;\n\t\t\tlet resetFailure: string | undefined;\n\t\t\tconst { defineMenu, runMenu } = await import(\"@narumitw/pi-tui-kit\");\n\t\t\tif (controller.signal.aborted || statusGeneration !== menuGeneration) return;\n\t\t\ttype Screen =\n\t\t\t\t| \"main\"\n\t\t\t\t| \"providers\"\n\t\t\t\t| \"reset-picker\"\n\t\t\t\t| \"reset-confirm\"\n\t\t\t\t| \"reset-result\"\n\t\t\t\t| \"reset-error\";\n\t\t\ttype Action =\n\t\t\t\t| \"refresh\"\n\t\t\t\t| \"settings\"\n\t\t\t\t| \"toggle-fast\"\n\t\t\t\t| \"another\"\n\t\t\t\t| \"all\"\n\t\t\t\t| \"provider\"\n\t\t\t\t| \"open-resets\"\n\t\t\t\t| \"select-reset\"\n\t\t\t\t| \"cancel-reset\"\n\t\t\t\t| \"consume-reset\"\n\t\t\t\t| \"back-to-usage\"\n\t\t\t\t| \"back-to-resets\";\n\t\t\tconst menu = defineMenu<undefined, Screen, Action, ExtensionCommandContext>({\n\t\t\t\tstart: \"main\",\n\t\t\t\tscreens: {\n\t\t\t\t\tmain: () => {\n\t\t\t\t\t\tconst fastAvailability = fastRuntime.availability(ctx.model);\n\t\t\t\t\t\tconst fastLines =\n\t\t\t\t\t\t\tfastAvailability.kind === \"available\"\n\t\t\t\t\t\t\t\t? [`Fast mode: ${fastAvailability.enabled ? \"On\" : \"Off\"}`, FAST_USAGE_WARNING]\n\t\t\t\t\t\t\t\t: fastAvailability.kind === \"unavailable\"\n\t\t\t\t\t\t\t\t\t? [`Fast mode: Unavailable \u00B7 ${fastAvailability.reason}`]\n\t\t\t\t\t\t\t\t\t: [];\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tkind: \"actions\",\n\t\t\t\t\t\t\ttitle: \"Provider usage\",\n\t\t\t\t\t\t\tlines: [...formatProviderStates(visibleStates).split(\"\\n\"), ...fastLines],\n\t\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t\t{ id: \"refresh\", label: REFRESH_CURRENT, action: \"refresh\" },\n\t\t\t\t\t\t\t\t{ id: \"settings\", label: SETTINGS, action: \"settings\" },\n\t\t\t\t\t\t\t\t...(fastAvailability.kind === \"available\"\n\t\t\t\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tid: \"toggle-fast\",\n\t\t\t\t\t\t\t\t\t\t\t\tlabel: fastAvailability.enabled\n\t\t\t\t\t\t\t\t\t\t\t\t\t? \"Turn Fast mode off\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t: \"Turn Fast mode on\",\n\t\t\t\t\t\t\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\t\t\t\t\t\tfastState.kind === \"invalid\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? \"Repair pi-usage.json and reload before changing Fast mode.\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: FAST_USAGE_WARNING,\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled: fastState.kind === \"invalid\",\n\t\t\t\t\t\t\t\t\t\t\t\taction: \"toggle-fast\" as const,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t: []),\n\t\t\t\t\t\t\t\t...(current.state.status === \"ready\" && current.state.providerId === \"openai-codex\"\n\t\t\t\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tid: \"open-resets\",\n\t\t\t\t\t\t\t\t\t\t\t\tlabel: REDEEM_CODEX_RESET,\n\t\t\t\t\t\t\t\t\t\t\t\tdescription: codexResetActionDescription(current.state.report),\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled: codexResetCount(current.state.report) === 0,\n\t\t\t\t\t\t\t\t\t\t\t\taction: \"open-resets\" as const,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t: []),\n\t\t\t\t\t\t\t\t{ id: \"another\", label: VIEW_ANOTHER, action: \"another\" },\n\t\t\t\t\t\t\t\t{ id: \"all\", label: VIEW_ALL, action: \"all\" },\n\t\t\t\t\t\t\t\t{ id: \"close\", label: CLOSE, close: true },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\thint: \"close\",\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\t\t\t\t\tproviders: () => ({\n\t\t\t\t\t\tkind: \"actions\",\n\t\t\t\t\t\ttitle: \"Select a configured provider\",\n\t\t\t\t\t\titems: configuredAdapters(ctx)\n\t\t\t\t\t\t\t.filter((adapter) => adapter.id !== ctx.model?.provider)\n\t\t\t\t\t\t\t.map((adapter) => ({\n\t\t\t\t\t\t\t\tid: adapter.id,\n\t\t\t\t\t\t\t\tlabel: adapter.displayName,\n\t\t\t\t\t\t\t\taction: \"provider\" as const,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\thint: \"back\",\n\t\t\t\t\t}),\n\t\t\t\t\t\"reset-picker\": () => ({\n\t\t\t\t\t\tkind: \"choice\",\n\t\t\t\t\t\ttitle: \"Usage limit resets\",\n\t\t\t\t\t\tlines: [\n\t\t\t\t\t\t\t`${resetAvailability?.availableCount ?? 0} ${resetLabel(resetAvailability?.availableCount ?? 0)} available.`,\n\t\t\t\t\t\t],\n\t\t\t\t\t\titems: (resetAvailability?.options ?? []).map((option, index) => ({\n\t\t\t\t\t\t\tid: `reset-${index}`,\n\t\t\t\t\t\t\tlabel: option.title,\n\t\t\t\t\t\t\tdescription: resetOptionExpiration(option),\n\t\t\t\t\t\t\tdetails: [option.description],\n\t\t\t\t\t\t})),\n\t\t\t\t\t\taction: \"select-reset\",\n\t\t\t\t\t\tinitialItemId: \"reset-0\",\n\t\t\t\t\t\thint: \"back\",\n\t\t\t\t\t}),\n\t\t\t\t\t\"reset-confirm\": () => ({\n\t\t\t\t\t\tkind: \"actions\",\n\t\t\t\t\t\ttitle: \"Use this reset?\",\n\t\t\t\t\t\tlines: resetConfirmationLines(selectedReset),\n\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t{ id: \"cancel-reset\", label: \"No, go back\", action: \"cancel-reset\" },\n\t\t\t\t\t\t\t{ id: \"consume-reset\", label: \"Yes, use reset\", action: \"consume-reset\" },\n\t\t\t\t\t\t],\n\t\t\t\t\t\thint: \"back\",\n\t\t\t\t\t}),\n\t\t\t\t\t\"reset-result\": () => ({\n\t\t\t\t\t\tkind: \"actions\",\n\t\t\t\t\t\ttitle: \"Usage limit resets\",\n\t\t\t\t\t\tlines: [\n\t\t\t\t\t\t\tformatCodexResetOutcome(\n\t\t\t\t\t\t\t\tresetOutcome,\n\t\t\t\t\t\t\t\tcurrent.state.status === \"ready\"\n\t\t\t\t\t\t\t\t\t? codexResetCount(current.state.report)\n\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t],\n\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: \"back-to-usage\",\n\t\t\t\t\t\t\t\tlabel: \"Back to usage\",\n\t\t\t\t\t\t\t\taction: \"back-to-usage\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{ id: \"close\", label: CLOSE, close: true },\n\t\t\t\t\t\t],\n\t\t\t\t\t\thint: \"back\",\n\t\t\t\t\t}),\n\t\t\t\t\t\"reset-error\": () => ({\n\t\t\t\t\t\tkind: \"actions\",\n\t\t\t\t\t\ttitle: \"Usage limit resets\",\n\t\t\t\t\t\tlines: [resetFailure ?? \"Couldn't reset usage. Please try again.\"],\n\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t{ id: \"consume-reset\", label: \"Try again\", action: \"consume-reset\" },\n\t\t\t\t\t\t\t{ id: \"back-to-resets\", label: \"Back\", action: \"back-to-resets\" },\n\t\t\t\t\t\t],\n\t\t\t\t\t\thint: \"back\",\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\tactions: {\n\t\t\t\t\tsettings: async () => {\n\t\t\t\t\t\tawait showUsageSettings(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\tsettingsRuntime,\n\t\t\t\t\t\t\tcontroller.signal,\n\t\t\t\t\t\t\t() => statusGeneration === menuGeneration && !controller.signal.aborted,\n\t\t\t\t\t\t\t(id) => {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tid === \"codexStatusResetCountdown\" &&\n\t\t\t\t\t\t\t\t\tstableCurrent &&\n\t\t\t\t\t\t\t\t\tstatusGeneration === menuGeneration &&\n\t\t\t\t\t\t\t\t\t!controller.signal.aborted\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tpublishStableCurrent(ctx, stableCurrent);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\tfastState = settingsRuntime.get();\n\t\t\t\t\t\tconst revalidated = await queryStableCurrent(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\tcontroller,\n\t\t\t\t\t\t\t\"Applying usage settings\u2026\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!revalidated) return { kind: \"stay\" };\n\t\t\t\t\t\tstableCurrent = revalidated;\n\t\t\t\t\t\tcurrent = revalidated.outcome;\n\t\t\t\t\t\tvisibleStates = [current.state];\n\t\t\t\t\t\tpublishStableCurrent(ctx, revalidated);\n\t\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t\t},\n\t\t\t\t\t\"toggle-fast\": async () => {\n\t\t\t\t\t\tconst availability = fastRuntime.availability(ctx.model);\n\t\t\t\t\t\tif (availability.kind !== \"available\" || fastState.kind === \"invalid\") {\n\t\t\t\t\t\t\treturn { kind: \"rejected\" };\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst changed = await fastRuntime.toggle(ctx, !availability.enabled, controller.signal);\n\t\t\t\t\t\tif (!changed) return { kind: \"rejected\" };\n\t\t\t\t\t\tfastState = settingsRuntime.get();\n\t\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t\t},\n\t\t\t\t\t\"open-resets\": async () => {\n\t\t\t\t\t\tconst summaryCount =\n\t\t\t\t\t\t\tcurrent.state.status === \"ready\" && current.state.providerId === \"openai-codex\"\n\t\t\t\t\t\t\t\t? codexResetCount(current.state.report)\n\t\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst loaded = await runMenuOperation(\n\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\"Checking usage limit resets\u2026\",\n\t\t\t\t\t\t\t\tcontroller.signal,\n\t\t\t\t\t\t\t\tasync (signal) => {\n\t\t\t\t\t\t\t\t\tconst expectedModel = modelIdentity(ctx.model);\n\t\t\t\t\t\t\t\t\tconst auth = await awaitWithDeadline(\n\t\t\t\t\t\t\t\t\t\tresolveCodexResetAuth(ctx, undefined, credentialReader, credentialCandidates),\n\t\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t\t\tDEFAULT_TIMEOUT_MS,\n\t\t\t\t\t\t\t\t\t\t\"resolving current Codex reset authentication\",\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tlet availability: CodexResetAvailability;\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tavailability = await listCodexResetCredits(auth, signal, DEFAULT_TIMEOUT_MS);\n\t\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\t\tif (isAbortError(error) || summaryCount === undefined || summaryCount <= 0) {\n\t\t\t\t\t\t\t\t\t\t\tthrow error;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tavailability = {\n\t\t\t\t\t\t\t\t\t\t\tavailableCount: summaryCount,\n\t\t\t\t\t\t\t\t\t\t\toptions: [genericCodexResetOption()],\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tconst revalidated = await awaitWithDeadline(\n\t\t\t\t\t\t\t\t\t\tresolveCodexResetAuth(ctx, undefined, credentialReader, credentialCandidates),\n\t\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t\t\tDEFAULT_TIMEOUT_MS,\n\t\t\t\t\t\t\t\t\t\t\"revalidating current Codex reset authentication\",\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\tmodelIdentity(ctx.model) !== expectedModel ||\n\t\t\t\t\t\t\t\t\t\trevalidated.fingerprint !== auth.fingerprint\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\t\t\"The active Codex model or account changed while loading usage limit resets.\",\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn { availability, auth, expectedModel };\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (!loaded) return { kind: \"stay\" };\n\t\t\t\t\t\t\tresetAvailability = loaded.availability;\n\t\t\t\t\t\t\tresetAuthFingerprint = loaded.auth.fingerprint;\n\t\t\t\t\t\t\tresetModelIdentity = loaded.expectedModel;\n\t\t\t\t\t\t\tselectedReset = undefined;\n\t\t\t\t\t\t\tredemptionId = undefined;\n\t\t\t\t\t\t\tresetOutcome = undefined;\n\t\t\t\t\t\t\tresetFailure = undefined;\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tkind: \"to\",\n\t\t\t\t\t\t\t\tscreen: loaded.availability.availableCount > 0 ? \"reset-picker\" : \"reset-result\",\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tif (isAbortError(error) || isStaleExtensionContextError(error)) {\n\t\t\t\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tctx.ui.notify(`Couldn't load usage limit resets: ${errorMessage(error)}`, \"error\");\n\t\t\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t\"select-reset\": ({ itemId }) => {\n\t\t\t\t\t\tconst index = Number(itemId.replace(/^reset-/u, \"\"));\n\t\t\t\t\t\tconst option = Number.isSafeInteger(index)\n\t\t\t\t\t\t\t? resetAvailability?.options[index]\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\tif (!option) return { kind: \"rejected\" };\n\t\t\t\t\t\tselectedReset = option;\n\t\t\t\t\t\tredemptionId = undefined;\n\t\t\t\t\t\tresetFailure = undefined;\n\t\t\t\t\t\treturn { kind: \"to\", screen: \"reset-confirm\" };\n\t\t\t\t\t},\n\t\t\t\t\t\"cancel-reset\": () => ({ kind: \"back\" }),\n\t\t\t\t\t\"consume-reset\": async () => {\n\t\t\t\t\t\tif (!selectedReset || !resetAuthFingerprint || !resetModelIdentity) {\n\t\t\t\t\t\t\treturn { kind: \"rejected\" };\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tredemptionId ??= createRedemptionId();\n\t\t\t\t\t\t\tconst attemptId = redemptionId;\n\t\t\t\t\t\t\tconst option = selectedReset;\n\t\t\t\t\t\t\tconst expectedFingerprint = resetAuthFingerprint;\n\t\t\t\t\t\t\tconst expectedModel = resetModelIdentity;\n\t\t\t\t\t\t\tconst result = await runMenuOperation(\n\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\"Resetting your usage\u2026\",\n\t\t\t\t\t\t\t\tcontroller.signal,\n\t\t\t\t\t\t\t\tasync (signal) => {\n\t\t\t\t\t\t\t\t\tconst auth = await awaitWithDeadline(\n\t\t\t\t\t\t\t\t\t\tresolveCodexResetAuth(ctx, undefined, credentialReader, credentialCandidates),\n\t\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t\t\tDEFAULT_TIMEOUT_MS,\n\t\t\t\t\t\t\t\t\t\t\"revalidating current Codex reset authentication\",\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\tmodelIdentity(ctx.model) !== expectedModel ||\n\t\t\t\t\t\t\t\t\t\tauth.fingerprint !== expectedFingerprint\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\t\t\"The active Codex model or account changed; the reset was not used.\",\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tconst outcome = await consumeCodexResetCredit(\n\t\t\t\t\t\t\t\t\t\tauth,\n\t\t\t\t\t\t\t\t\t\toption,\n\t\t\t\t\t\t\t\t\t\tattemptId,\n\t\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t\t\tDEFAULT_TIMEOUT_MS,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tinvalidateProviderState(\"openai-codex\");\n\t\t\t\t\t\t\t\t\tconst model = ctx.model;\n\t\t\t\t\t\t\t\t\tif (modelIdentity(model) !== expectedModel) return { outcome };\n\t\t\t\t\t\t\t\t\tconst refreshed = await queryCurrentState(ctx, model, true, signal);\n\t\t\t\t\t\t\t\t\tconst stable = await outcomeStillCurrent(\n\t\t\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t\t\t\t\tmenuGeneration,\n\t\t\t\t\t\t\t\t\t\trefreshed,\n\t\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\treturn stable ? { outcome, refreshed, model } : { outcome };\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (!result) return { kind: \"close\" };\n\t\t\t\t\t\t\tresetOutcome = result.outcome;\n\t\t\t\t\t\t\tresetFailure = undefined;\n\t\t\t\t\t\t\tif (result.refreshed && result.model) {\n\t\t\t\t\t\t\t\tstableCurrent = { outcome: result.refreshed, model: result.model };\n\t\t\t\t\t\t\t\tcurrent = result.refreshed;\n\t\t\t\t\t\t\t\tvisibleStates = [current.state];\n\t\t\t\t\t\t\t\tpublishStableCurrent(ctx, stableCurrent);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn { kind: \"to\", screen: \"reset-result\" };\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tif (isAbortError(error) || isStaleExtensionContextError(error)) {\n\t\t\t\t\t\t\t\treturn { kind: \"close\" };\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tresetFailure = `Couldn't reset usage: ${errorMessage(error)}. Try again with the same request.`;\n\t\t\t\t\t\t\treturn { kind: \"to\", screen: \"reset-error\" };\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t\"back-to-usage\": () => ({ kind: \"to\", screen: \"main\" }),\n\t\t\t\t\t\"back-to-resets\": () => {\n\t\t\t\t\t\tredemptionId = undefined;\n\t\t\t\t\t\tresetFailure = undefined;\n\t\t\t\t\t\treturn { kind: \"to\", screen: \"reset-picker\" };\n\t\t\t\t\t},\n\t\t\t\t\trefresh: async () => {\n\t\t\t\t\t\tconst refreshed = await queryStableCurrent(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\tcontroller,\n\t\t\t\t\t\t\t\"Refreshing current usage\u2026\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!refreshed) return { kind: \"stay\" };\n\t\t\t\t\t\tstableCurrent = refreshed;\n\t\t\t\t\t\tpublishStableCurrent(ctx, refreshed);\n\t\t\t\t\t\tcurrent = refreshed.outcome;\n\t\t\t\t\t\tvisibleStates = [current.state];\n\t\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t\t},\n\t\t\t\t\tanother: async () => {\n\t\t\t\t\t\tconst others = configuredAdapters(ctx).filter(\n\t\t\t\t\t\t\t(adapter) => adapter.id !== ctx.model?.provider,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (others.length === 0) {\n\t\t\t\t\t\t\tctx.ui.notify(\"No other supported provider has configured runtime auth.\", \"info\");\n\t\t\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn { kind: \"to\", screen: \"providers\" };\n\t\t\t\t\t},\n\t\t\t\t\tprovider: async ({ itemId }) => {\n\t\t\t\t\t\tconst adapter = configuredAdapters(ctx).find(\n\t\t\t\t\t\t\t(candidate) => candidate.id === itemId && candidate.id !== ctx.model?.provider,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!adapter) return { kind: \"back\" };\n\t\t\t\t\t\tconst outcome = await runMenuOperation(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t`Checking ${adapter.displayName} usage\u2026`,\n\t\t\t\t\t\t\tcontroller.signal,\n\t\t\t\t\t\t\t(signal) => queryAdapterState(ctx, adapter, \"configured\", false, signal),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!outcome) return { kind: \"back\" };\n\t\t\t\t\t\tconst revalidated = await queryStableCurrent(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\tcontroller,\n\t\t\t\t\t\t\t\"Revalidating current usage\u2026\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!revalidated) return { kind: \"back\" };\n\t\t\t\t\t\tstableCurrent = revalidated;\n\t\t\t\t\t\tcurrent = revalidated.outcome;\n\t\t\t\t\t\tvisibleStates = [\n\t\t\t\t\t\t\toutcome.state.providerId === current.state.providerId\n\t\t\t\t\t\t\t\t? current.state\n\t\t\t\t\t\t\t\t: { ...outcome.state, displayState: \"configured\" },\n\t\t\t\t\t\t];\n\t\t\t\t\t\treturn { kind: \"back\" };\n\t\t\t\t\t},\n\t\t\t\t\tall: async () => {\n\t\t\t\t\t\tconst adapters = configuredAdapters(ctx);\n\t\t\t\t\t\tconst currentProviderId = ctx.model?.provider;\n\t\t\t\t\t\tconst settled = await runMenuOperation(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\"Checking configured provider usage\u2026\",\n\t\t\t\t\t\t\tcontroller.signal,\n\t\t\t\t\t\t\t(signal) =>\n\t\t\t\t\t\t\t\trunWithConcurrency(\n\t\t\t\t\t\t\t\t\tadapters,\n\t\t\t\t\t\t\t\t\tALL_PROVIDER_CONCURRENCY,\n\t\t\t\t\t\t\t\t\t(adapter, _index, workerSignal) =>\n\t\t\t\t\t\t\t\t\t\tqueryAdapterState(\n\t\t\t\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\t\t\tadapter,\n\t\t\t\t\t\t\t\t\t\t\tadapter.id === currentProviderId ? \"current\" : \"configured\",\n\t\t\t\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\t\t\t\tworkerSignal,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!settled) return { kind: \"stay\" };\n\t\t\t\t\t\tconst queriedStates: ProviderUsageState[] = settled.map((result, index) => {\n\t\t\t\t\t\t\tif (result.status === \"fulfilled\") {\n\t\t\t\t\t\t\t\treturn { ...result.value.state, displayState: \"configured\" };\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst adapter = adapters[index] as UsageProviderAdapter;\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tproviderId: adapter.id,\n\t\t\t\t\t\t\t\tproviderName: adapter.displayName,\n\t\t\t\t\t\t\t\tdisplayState: \"configured\",\n\t\t\t\t\t\t\t\tstatus: \"query-failed\",\n\t\t\t\t\t\t\t\tmessage: errorMessage(result.reason),\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconst revalidated = await queryStableCurrent(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\tcontroller,\n\t\t\t\t\t\t\t\"Revalidating current usage\u2026\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!revalidated) return { kind: \"stay\" };\n\t\t\t\t\t\tstableCurrent = revalidated;\n\t\t\t\t\t\tcurrent = revalidated.outcome;\n\t\t\t\t\t\tvisibleStates = [\n\t\t\t\t\t\t\tcurrent.state,\n\t\t\t\t\t\t\t...queriedStates.filter((state) => state.providerId !== current.state.providerId),\n\t\t\t\t\t\t];\n\t\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t\tawait runMenu(ctx, menu, {\n\t\t\t\tgetState: () => undefined,\n\t\t\t\tsignal: controller.signal,\n\t\t\t\tisCurrent: () => statusGeneration === menuGeneration && !controller.signal.aborted,\n\t\t\t});\n\t\t} finally {\n\t\t\tcontroller.abort(new DOMException(\"Usage menu closed\", \"AbortError\"));\n\t\t\tactiveControllers.delete(controller);\n\t\t}\n\t};\n\n\tpi.registerCommand(\"usage\", {\n\t\tdescription: \"Show usage for the current runtime account\",\n\t\thandler: async (args, ctx) => {\n\t\t\tif (args.trim()) {\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\"/usage does not accept arguments; choose an action from its menu.\",\n\t\t\t\t\t\"warning\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait showMenu(ctx);\n\t\t\t} catch (error) {\n\t\t\t\tif (isStaleExtensionContextError(error) || isAbortError(error)) return;\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t},\n\t});\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tsessionGeneration += 1;\n\t\tstatusGeneration += 1;\n\t\tclearStatusTimers();\n\t\tfor (const controller of activeControllers) controller.abort();\n\t\tactiveControllers.clear();\n\t\tstatusController = undefined;\n\t\tsessionActive = true;\n\t\tconst ownerGeneration = sessionGeneration;\n\t\ttry {\n\t\t\tawait fastRuntime.prepareSession(ctx);\n\t\t} catch (error) {\n\t\t\tif (isStaleExtensionContextError(error) || ownerGeneration !== sessionGeneration) return;\n\t\t\tthrow error;\n\t\t}\n\t});\n\tpi.on(\"session_tree\", (_event, ctx) => {\n\t\tstartStatusRefresh(ctx, ctx.model, false);\n\t});\n\tpi.on(\"model_select\", (event, ctx) => {\n\t\tstartStatusRefresh(ctx, event.model, false);\n\t});\n\tpi.on(\"turn_start\", (_event, ctx) => {\n\t\tstartStatusRefresh(ctx, ctx.model, false);\n\t});\n\tpi.on(\"session_shutdown\", (_event, ctx) => {\n\t\tsessionActive = false;\n\t\tsessionGeneration += 1;\n\t\tstatusGeneration += 1;\n\t\tclearStatusTimers();\n\t\tfor (const controller of activeControllers) controller.abort();\n\t\tactiveControllers.clear();\n\t\tstatusController = undefined;\n\t\tcache.clear();\n\t\tfailureBackoff.clear();\n\t\tlatestQueries.clear();\n\t\tactiveCurrentIdentity = undefined;\n\t\tsafeSetStatus(ctx, undefined);\n\t});\n\n\tfastRuntime = registerCodexFastMode(\n\t\tpi,\n\t\tsettingsRuntime,\n\t\t(ctx) => startStatusRefresh(ctx, ctx.model, false),\n\t\t{ registerSessionStart: false },\n\t);\n}\n", "import type {\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionContext,\n} from \"@earendil-works/pi-coding-agent\";\nimport {\n\tcodexFastAvailability,\n\tcodexFastIsEffective,\n\tcodexFastStatusLabel,\n\tcorrectCodexFastMessageCost,\n\trewriteCodexFastPayload,\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\tpi: ExtensionAPI,\n\tsettingsRuntime: UsageSettingsRuntime,\n\trefreshStatus: (ctx: ExtensionContext) => void,\n\toptions: { registerSessionStart?: boolean } = {},\n) {\n\tlet sessionController = new AbortController();\n\tlet generation = 0;\n\tconst pendingFastRequests = new Map<string, PendingFastRequest>();\n\n\tconst toggle = async (\n\t\tctx: ExtensionCommandContext,\n\t\tenabled: boolean,\n\t\tcallerSignal?: AbortSignal,\n\t): Promise<boolean> => {\n\t\tconst ownerGeneration = generation;\n\t\tconst sessionId = ctx.sessionManager.getSessionId();\n\t\tconst signal = callerSignal\n\t\t\t? AbortSignal.any([callerSignal, sessionController.signal])\n\t\t\t: sessionController.signal;\n\t\ttry {\n\t\t\tawait settingsRuntime.update({ codexFastMode: enabled }, signal);\n\t\t} catch (error) {\n\t\t\tif (isAbortError(error) || isStaleExtensionContextError(error)) return false;\n\t\t\tctx.ui.notify(`Could not save pi-usage.json: ${errorMessage(error)}`, \"error\");\n\t\t\treturn false;\n\t\t}\n\t\tif (\n\t\t\tsignal.aborted ||\n\t\t\townerGeneration !== generation ||\n\t\t\tctx.sessionManager.getSessionId() !== sessionId\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t\trefreshStatus(ctx);\n\t\tctx.ui.notify(\n\t\t\tenabled\n\t\t\t\t? `Codex Fast mode enabled. ${FAST_USAGE_WARNING}`\n\t\t\t\t: \"Codex Fast mode disabled; standard routing will be used.\",\n\t\t\t\"info\",\n\t\t);\n\t\treturn true;\n\t};\n\n\tpi.registerCommand(\"fast\", {\n\t\tdescription: \"Toggle Codex Fast mode\",\n\t\thandler: async (args, ctx) => {\n\t\t\tif (args.trim()) {\n\t\t\t\tif (!ctx.hasUI) throw new Error(\"/fast does not accept arguments.\");\n\t\t\t\tctx.ui.notify(\"/fast does not accept arguments.\", \"warning\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!ctx.hasUI) throw new Error(\"/fast requires TUI or RPC mode.\");\n\t\t\tconst availability = codexFastAvailability(\n\t\t\t\tctx.model,\n\t\t\t\tsettingsRuntime.get().settings.codexFastMode,\n\t\t\t);\n\t\t\tif (availability.kind === \"not-codex\") {\n\t\t\t\tctx.ui.notify(\"/fast is available only for the active OpenAI Codex model.\", \"warning\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (availability.kind === \"unavailable\") {\n\t\t\t\tctx.ui.notify(availability.reason, \"warning\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (settingsRuntime.get().kind === \"invalid\") {\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\"pi-usage.json is invalid; repair it and run /reload before changing Fast mode.\",\n\t\t\t\t\t\"error\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait toggle(ctx, !availability.enabled);\n\t\t},\n\t});\n\n\tconst prepareSession = (ctx: ExtensionContext): Promise<void> => {\n\t\tconst sessionId = ctx.sessionManager.getSessionId();\n\t\tgeneration += 1;\n\t\tsessionController.abort();\n\t\tpendingFastRequests.clear();\n\t\tsessionController = new AbortController();\n\t\tconst ownerGeneration = generation;\n\t\treturn (async () => {\n\t\t\tlet state: Readonly<UsageSettingsState>;\n\t\t\ttry {\n\t\t\t\tstate = await settingsRuntime.reload(sessionController.signal);\n\t\t\t} catch (error) {\n\t\t\t\tif (sessionController.signal.aborted || ownerGeneration !== generation) return;\n\t\t\t\tif (ctx.hasUI) {\n\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t`Could not load pi-usage.json; using defaults. ${errorMessage(error)}`,\n\t\t\t\t\t\t\"warning\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (\n\t\t\t\tsessionController.signal.aborted ||\n\t\t\t\townerGeneration !== generation ||\n\t\t\t\tctx.sessionManager.getSessionId() !== sessionId\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (ctx.hasUI && state.kind === \"invalid\") {\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t`Invalid pi-usage.json; using defaults without overwriting it. ${state.issue}`,\n\t\t\t\t\t\"warning\",\n\t\t\t\t);\n\t\t\t}\n\t\t\trefreshStatus(ctx);\n\t\t})();\n\t};\n\n\tif (options.registerSessionStart !== false) {\n\t\tpi.on(\"session_start\", async (_event, ctx) => prepareSession(ctx));\n\t}\n\n\tpi.on(\"before_provider_request\", (event, ctx) => {\n\t\tconst rewritten = rewriteCodexFastPayload(\n\t\t\tevent.payload,\n\t\t\tctx.model,\n\t\t\tsettingsRuntime.get().settings.codexFastMode,\n\t\t);\n\t\tconst key = activeRequestKey(ctx);\n\t\tif (key && ctx.model) {\n\t\t\tpendingFastRequests.set(key, {\n\t\t\t\tfastRequested: isRecord(rewritten) && rewritten.service_tier === \"priority\",\n\t\t\t\tmodel: ctx.model,\n\t\t\t});\n\t\t}\n\t\treturn rewritten;\n\t});\n\tpi.on(\"message_end\", (event, ctx) => {\n\t\tconst request = consumeFastRequest(ctx, event.message, pendingFastRequests);\n\t\tif (request === NO_FAST_REQUEST) return undefined;\n\t\tconst message = correctCodexFastMessageCost(\n\t\t\tevent.message,\n\t\t\trequest.model,\n\t\t\trequest.fastRequested,\n\t\t);\n\t\treturn message ? { message: message as never } : undefined;\n\t});\n\tpi.on(\"session_shutdown\", async () => {\n\t\tgeneration += 1;\n\t\tsessionController.abort();\n\t\tpendingFastRequests.clear();\n\t\tawait settingsRuntime.flush();\n\t});\n\n\treturn {\n\t\tprepareSession,\n\t\tavailability(model: PiModel | undefined) {\n\t\t\treturn codexFastAvailability(model, settingsRuntime.get().settings.codexFastMode);\n\t\t},\n\t\tdecorateStatus(model: PiModel | undefined, status: string) {\n\t\t\treturn codexFastStatusLabel(\n\t\t\t\tstatus,\n\t\t\t\tcodexFastIsEffective(model, settingsRuntime.get().settings.codexFastMode),\n\t\t\t);\n\t\t},\n\t\ttoggle,\n\t};\n}\n\nfunction activeRequestKey(ctx: ExtensionContext): string | undefined {\n\tconst model = ctx.model;\n\treturn model ? `${ctx.sessionManager.getSessionId()}:${model.provider}/${model.id}` : undefined;\n}\n\nfunction consumeFastRequest(\n\tctx: ExtensionContext,\n\tmessage: unknown,\n\tpending: Map<string, PendingFastRequest>,\n): PendingFastRequest | typeof NO_FAST_REQUEST {\n\tif (!isRecord(message) || message.role !== \"assistant\") return NO_FAST_REQUEST;\n\tconst key = messageRequestKey(ctx, message);\n\tif (!key) return NO_FAST_REQUEST;\n\tconst request = pending.get(key);\n\tpending.delete(key);\n\treturn request ?? NO_FAST_REQUEST;\n}\n\nfunction messageRequestKey(\n\tctx: ExtensionContext,\n\tmessage: Record<string, unknown>,\n): string | undefined {\n\tif (typeof message.provider !== \"string\" || typeof message.model !== \"string\") return undefined;\n\treturn `${ctx.sessionManager.getSessionId()}:${message.provider}/${message.model}`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isAbortError(error: unknown): boolean {\n\treturn 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\treturn usageAdapters().filter(\n\t\t(adapter) => adapter.id === ctx.model?.provider || providerIsConfigured(ctx, adapter.id),\n\t);\n}\n\nexport function providerDisplayName(ctx: ExtensionContext, providerId: string): string {\n\ttry {\n\t\treturn sanitizeDisplayText(ctx.modelRegistry.getProviderDisplayName(providerId), 80);\n\t} catch {\n\t\treturn sanitizeDisplayText(providerId, 80);\n\t}\n}\n\nexport function setBoundedMap<T>(map: Map<string, T>, key: string, value: T, limit: number): void {\n\tmap.delete(key);\n\twhile (map.size >= limit) {\n\t\tconst oldest = map.keys().next().value;\n\t\tif (oldest === undefined) break;\n\t\tmap.delete(oldest);\n\t}\n\tmap.set(key, value);\n}\n\nexport function modelIdentity(model: PiModel | undefined): string | undefined {\n\treturn model ? `${model.provider}/${model.id}` : undefined;\n}\n\nexport function isAbortError(error: unknown): boolean {\n\treturn error instanceof Error && error.name === \"AbortError\";\n}\n\nexport function isTimeoutError(error: unknown): boolean {\n\treturn error instanceof Error && error.name === \"TimeoutError\";\n}\n", "import {\n\ttype ExtensionCommandContext,\n\tgetSettingsListTheme,\n} from \"@earendil-works/pi-coding-agent\";\nimport {\n\tContainer,\n\tKey,\n\tmatchesKey,\n\ttype SettingItem,\n\tSettingsList,\n\tText,\n} from \"@earendil-works/pi-tui\";\nimport { errorMessage } from \"./core.js\";\nimport { isFireworksAccountId } from \"./providers/fireworks.js\";\nimport type { UsageSettings, UsageSettingsRuntime } from \"./settings.js\";\n\nconst AUTO = \"Auto\";\nconst EDIT = \"Edit\u2026\";\nconst OFF = \"Off\";\nconst ON = \"On\";\n\ntype UsageSettingId = keyof UsageSettings;\ntype SettingsScreenResult = { changed: boolean; editFireworksAccount: boolean };\n\nexport async function showUsageSettings(\n\tctx: ExtensionCommandContext,\n\tsettingsRuntime: UsageSettingsRuntime,\n\tparentSignal: AbortSignal,\n\tisCurrent: () => boolean,\n\tonApplied: (id: UsageSettingId) => void,\n): Promise<boolean> {\n\tif (ctx.mode !== \"tui\") {\n\t\tif (ctx.hasUI) ctx.ui.notify(`Edit settings manually: ${settingsRuntime.get().path}`, \"info\");\n\t\treturn false;\n\t}\n\tlet changed = false;\n\twhile (!parentSignal.aborted && isCurrent()) {\n\t\tconst result = await showSettingsList(ctx, settingsRuntime, parentSignal, isCurrent, onApplied);\n\t\tif (!result) return changed;\n\t\tchanged ||= result.changed;\n\t\tif (!result.editFireworksAccount) return changed;\n\t\tchanged ||= await editFireworksAccount(\n\t\t\tctx,\n\t\t\tsettingsRuntime,\n\t\t\tparentSignal,\n\t\t\tisCurrent,\n\t\t\tonApplied,\n\t\t);\n\t}\n\treturn changed;\n}\n\nasync function showSettingsList(\n\tctx: ExtensionCommandContext,\n\tsettingsRuntime: UsageSettingsRuntime,\n\tparentSignal: AbortSignal,\n\tisCurrent: () => boolean,\n\tonApplied: (id: UsageSettingId) => void,\n): Promise<SettingsScreenResult | undefined> {\n\treturn ctx.ui.custom<SettingsScreenResult>((tui, theme, _keybindings, done) => {\n\t\tconst localController = new AbortController();\n\t\tconst signal = AbortSignal.any([parentSignal, localController.signal]);\n\t\tlet changed = false;\n\t\tlet closing = false;\n\t\tlet saveQueue = Promise.resolve();\n\t\tconst state = settingsRuntime.get();\n\t\tconst fireworksValue = state.settings.fireworksAccountId ?? AUTO;\n\t\tconst items: SettingItem[] = [\n\t\t\t{\n\t\t\t\tid: \"codexFastMode\",\n\t\t\t\tlabel: \"Codex Fast mode\",\n\t\t\t\tdescription: \"Use faster Codex routing at increased plan allowance consumption.\",\n\t\t\t\tcurrentValue: state.settings.codexFastMode ? ON : OFF,\n\t\t\t\tvalues: [OFF, ON],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"codexStatusResetCountdown\",\n\t\t\t\tlabel: \"Codex reset countdown\",\n\t\t\t\tdescription: \"Show time remaining until each Codex usage limit resets.\",\n\t\t\t\tcurrentValue: state.settings.codexStatusResetCountdown ? ON : OFF,\n\t\t\t\tvalues: [OFF, ON],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"fireworksAccountId\",\n\t\t\t\tlabel: \"Fireworks account\",\n\t\t\t\tdescription: \"Select Edit to enter a visible account slug, or submit blank to clear it.\",\n\t\t\t\tcurrentValue: fireworksValue,\n\t\t\t\tvalues: state.settings.fireworksAccountId\n\t\t\t\t\t? [state.settings.fireworksAccountId, EDIT]\n\t\t\t\t\t: [AUTO, EDIT],\n\t\t\t},\n\t\t];\n\t\tconst container = new Container();\n\t\tcontainer.addChild(new Text(theme.fg(\"accent\", theme.bold(\"pi-usage Settings\")), 1, 1));\n\n\t\tlet settingsList: SettingsList;\n\t\tconst cancel = () => {\n\t\t\tif (closing) return;\n\t\t\tclosing = true;\n\t\t\tlocalController.abort();\n\t\t\tdone({ changed, editFireworksAccount: false });\n\t\t};\n\t\tconst queueUpdate = (\n\t\t\tid: UsageSettingId,\n\t\t\trequested: UsageSettings[UsageSettingId],\n\t\t\tdisplay: string,\n\t\t) => {\n\t\t\tsaveQueue = saveQueue.then(async () => {\n\t\t\t\tconst previous = settingsRuntime.get().settings[id];\n\t\t\t\tif (settingsRuntime.get().kind === \"invalid\") {\n\t\t\t\t\tsettingsList.updateValue(id, displaySetting(id, previous));\n\t\t\t\t\tif (!signal.aborted && isCurrent()) {\n\t\t\t\t\t\tctx.ui.notify(\"Repair pi-usage.json and reload before changing settings.\", \"error\");\n\t\t\t\t\t\ttui.requestRender();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tawait settingsRuntime.update({ [id]: requested }, signal);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (signal.aborted || !isCurrent()) return;\n\t\t\t\t\tsettingsList.updateValue(id, displaySetting(id, previous));\n\t\t\t\t\tctx.ui.notify(`Could not save pi-usage.json: ${errorMessage(error)}`, \"error\");\n\t\t\t\t\ttui.requestRender();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (previous !== requested) {\n\t\t\t\t\tchanged = true;\n\t\t\t\t\tonApplied(id);\n\t\t\t\t}\n\t\t\t\tif (signal.aborted || !isCurrent()) return;\n\t\t\t\tsettingsList.updateValue(id, display);\n\t\t\t\ttui.requestRender();\n\t\t\t});\n\t\t};\n\t\tsettingsList = new SettingsList(\n\t\t\titems,\n\t\t\titems.length + 2,\n\t\t\tgetSettingsListTheme(),\n\t\t\t(id, value) => {\n\t\t\t\tif (closing || signal.aborted || !isCurrent()) return;\n\t\t\t\tif (id === \"fireworksAccountId\") {\n\t\t\t\t\tif (value === EDIT) {\n\t\t\t\t\t\tsaveQueue = saveQueue.then(() => {\n\t\t\t\t\t\t\tif (closing || signal.aborted || !isCurrent()) return;\n\t\t\t\t\t\t\tclosing = true;\n\t\t\t\t\t\t\tdone({ changed, editFireworksAccount: true });\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst settingId = id as \"codexFastMode\" | \"codexStatusResetCountdown\";\n\t\t\t\tqueueUpdate(settingId, value !== OFF, value);\n\t\t\t},\n\t\t\tcancel,\n\t\t);\n\t\tcontainer.addChild(settingsList);\n\n\t\tparentSignal.addEventListener(\"abort\", cancel, { once: true });\n\t\treturn {\n\t\t\trender: (width: number) => container.render(width),\n\t\t\tinvalidate: () => container.invalidate(),\n\t\t\thandleInput(data: string) {\n\t\t\t\tif (closing) return;\n\t\t\t\tif (matchesKey(data, Key.ctrl(\"c\"))) cancel();\n\t\t\t\telse settingsList.handleInput(data);\n\t\t\t\ttui.requestRender();\n\t\t\t},\n\t\t\tdispose() {\n\t\t\t\tlocalController.abort();\n\t\t\t\tparentSignal.removeEventListener(\"abort\", cancel);\n\t\t\t},\n\t\t};\n\t});\n}\n\nasync function editFireworksAccount(\n\tctx: ExtensionCommandContext,\n\tsettingsRuntime: UsageSettingsRuntime,\n\tsignal: AbortSignal,\n\tisCurrent: () => boolean,\n\tonApplied: (id: UsageSettingId) => void,\n): Promise<boolean> {\n\twhile (!signal.aborted && isCurrent()) {\n\t\tconst state = settingsRuntime.get();\n\t\tif (state.kind === \"invalid\") {\n\t\t\tctx.ui.notify(\"Repair pi-usage.json and reload before changing settings.\", \"error\");\n\t\t\treturn false;\n\t\t}\n\t\tconst entered = await ctx.ui.input(\n\t\t\t\"Fireworks account slug \u00B7 submit blank for Auto\",\n\t\t\tstate.settings.fireworksAccountId ?? \"Example: acme\",\n\t\t\t{ signal },\n\t\t);\n\t\tif (signal.aborted || !isCurrent() || entered === undefined) return false;\n\t\tconst normalized = entered.trim();\n\t\tconst requested = normalized || undefined;\n\t\tif (requested !== undefined && !isFireworksAccountId(requested)) {\n\t\t\tctx.ui.notify(\"Enter a URL-safe Fireworks account slug.\", \"warning\");\n\t\t\tcontinue;\n\t\t}\n\t\tif (requested === state.settings.fireworksAccountId) return false;\n\t\ttry {\n\t\t\tawait settingsRuntime.update({ fireworksAccountId: requested }, signal);\n\t\t} catch (error) {\n\t\t\tif (signal.aborted || !isCurrent()) return false;\n\t\t\tctx.ui.notify(`Could not save pi-usage.json: ${errorMessage(error)}`, \"error\");\n\t\t\treturn false;\n\t\t}\n\t\tonApplied(\"fireworksAccountId\");\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nfunction displaySetting(id: UsageSettingId, value: UsageSettings[UsageSettingId]): string {\n\tif (id === \"fireworksAccountId\") return typeof value === \"string\" ? value : AUTO;\n\treturn value ? ON : OFF;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["readStoredCredential", "readStoredCredential", "asObject", "asObject", "asObject", "asString", "asObject", "asNonnegativeInteger", "currency", "asObject", "asString", "asNonnegativeNumber", "clampPercent", "asObject", "asNonnegativeNumber", "asString", "isRecord", "start", "end", "FIVE_HOUR_WINDOW_MINUTES", "WEEKLY_WINDOW_MINUTES", "asObject", "asString", "asNonnegativeNumber", "clampPercent", "asEpochSeconds", "readStoredCredential", "authorization", "headers", "asObject", "storedAccess", "refresh", "readStoredCredential", "bearerToken", "headerValue", "asObject", "clampPercent", "isRecord", "randomUUID", "isAbortError", "isRecord", "isAbortError", "randomUUID", "isAbortError"]
|
|
7
7
|
}
|