{
  "version": 3,
  "sources": ["../src/codex-fast.ts", "../src/codex-resets.ts", "../src/core.ts", "../src/query.ts", "../src/providers/codex.ts", "../src/providers/github-copilot.ts", "../src/providers/opencode-zen.ts", "../src/providers/openrouter.ts", "../src/format.ts", "../src/settings.ts", "../src/usage.ts", "../src/codex-fast-runtime.ts", "../src/footer.ts", "../src/usage-helpers.ts"],
  "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\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): 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 credential = asObject(credentialReader(\"openai-codex\"));\n\tif (credential?.type !== \"oauth\") {\n\t\tthrow new Error(\n\t\t\t\"Usage limit resets require the OpenAI Codex OAuth account configured through Pi /login.\",\n\t\t);\n\t}\n\tconst storedAccess = asNonemptyString(credential.access);\n\tconst resolvedAccess = bearerToken(headerValue(auth.headers, \"Authorization\")) ?? auth.apiKey;\n\tif (!storedAccess || !resolvedAccess) {\n\t\tthrow new Error(\"OpenAI Codex OAuth credentials were incomplete.\");\n\t}\n\tif (storedAccess !== resolvedAccess) {\n\t\tthrow new Error(\n\t\t\t\"The active OpenAI Codex runtime account does not match Pi's stored OAuth account.\",\n\t\t);\n\t}\n\tconst accountId = validHeaderValue(credential.accountId);\n\tif (!accountId)\n\t\tthrow new Error(\"The OpenAI Codex OAuth credential did not include a valid account ID.\");\n\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 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 { randomBytes } from \"node:crypto\";\nimport { type ExtensionContext, readStoredCredential } from \"@earendil-works/pi-coding-agent\";\nimport { errorMessage, fingerprintResolvedAuth, redactUsageError } from \"./core.js\";\nimport { normalizeCodexBackendPayload } from \"./providers/codex.js\";\nimport { normalizeGitHubCopilotUsagePayload } from \"./providers/github-copilot.js\";\nimport { normalizeOpenCodeZenPayload } from \"./providers/opencode-zen.js\";\nimport { normalizeOpenRouterKeyPayload } from \"./providers/openrouter.js\";\nimport type {\n\tCodexBackendPayload,\n\tGitHubCopilotUsagePayload,\n\tOpenCodeZenPayload,\n\tOpenRouterKeyPayload,\n\tPiModel,\n\tResolvedUsageAuth,\n\tUsageProviderAdapter,\n\tUsageReport,\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 MAX_SUCCESS_BODY_BYTES = 64 * 1024;\nconst MAX_ERROR_BODY_BYTES = 4 * 1024;\n\nexport const AUTH_FINGERPRINT_SALT = randomBytes(32);\n\nexport const SUPPORTED_ADAPTERS: readonly UsageProviderAdapter[] = [\n\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\topencodeUsageUrl(auth.model.baseUrl),\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];\n\nexport function adapterForProvider(\n\tproviderId: string | undefined,\n): UsageProviderAdapter | undefined {\n\treturn SUPPORTED_ADAPTERS.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): 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\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\treturn resolveGitHubCopilotUsageAuth(auth, model, salt, credentialReader);\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): Promise<UsageReport> {\n\ttry {\n\t\treturn await adapter.query(auth, signal, timeoutMs);\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} = {},\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 (!hasHeader(headers, \"User-Agent\")) headers[\"User-Agent\"] = \"pi-usage\";\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\tsignal: controller.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\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);\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): 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\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\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 resolveGitHubCopilotUsageAuth(\n\tauth: RequestAuth,\n\tmodel: PiModel,\n\tsalt: Uint8Array,\n\tcredentialReader: StoredCredentialReader,\n): ResolvedUsageAuth {\n\tconst credential = asObject(credentialReader(\"github-copilot\"));\n\tif (credential?.type !== \"oauth\") {\n\t\tthrow new Error(\n\t\t\t\"GitHub Copilot usage requires the OAuth account configured through Pi /login.\",\n\t\t);\n\t}\n\tif (\n\t\ttypeof credential.enterpriseUrl === \"string\" &&\n\t\tcredential.enterpriseUrl &&\n\t\t!isPublicGitHubDomain(credential.enterpriseUrl)\n\t) {\n\t\tthrow new Error(\"GitHub Copilot usage does not yet support GitHub Enterprise accounts.\");\n\t}\n\tconst refresh = typeof credential.refresh === \"string\" ? credential.refresh : undefined;\n\tconst storedAccess = typeof credential.access === \"string\" ? credential.access : undefined;\n\tconst resolvedAccess = bearerToken(headerValue(auth.headers, \"Authorization\")) ?? auth.apiKey;\n\tif (!refresh || !storedAccess || !resolvedAccess) {\n\t\tthrow new Error(\"GitHub Copilot OAuth credentials were incomplete.\");\n\t}\n\tif (storedAccess !== resolvedAccess) {\n\t\tthrow new Error(\n\t\t\t\"The active GitHub Copilot runtime account does not match Pi's stored OAuth account.\",\n\t\t);\n\t}\n\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 === \"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 opencodeUsageUrl(baseUrl: string | undefined): string {\n\tconst base = baseUrl?.trim().replace(/\\/+$/u, \"\");\n\tif (!base) throw new Error(\"OpenCode Go model base URL is unavailable.\");\n\treturn `${base}/usage`;\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 { 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 type {\n\tProviderUsageState,\n\tUsageBucket,\n\tUsageDisplayState,\n\tUsageModel,\n\tUsageReport,\n} from \"./types.js\";\n\nexport type UsageStatusColor = \"success\" | \"warning\" | \"error\";\n\nexport const MUTED_USAGE_COLORS: Record<UsageStatusColor, string> = {\n\tsuccess: \"\\u001b[38;2;82;119;82m\", // #527752\n\twarning: \"\\u001b[38;2;120;107;58m\", // #786b3a\n\terror: \"\\u001b[38;2;144;92;87m\", // #905c57\n};\n\ntype UsageStatusStyler = {\n\tcolor: (color: UsageStatusColor, text: string) => string;\n\tdim: (text: string) => string;\n};\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 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): string | undefined {\n\tif (report.providerId === \"openai-codex\") return formatCodexStatusline(report, model, now);\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 `${formatUsd(limit.remaining)} left`;\n\t\tconst total = report.metrics.find((metric) => metric.id === \"usage-total\");\n\t\tif (typeof total?.value === \"number\") return `${formatUsd(total.value)} used`;\n\t}\n\tif (report.providerId === \"opencode-go\") return formatOpenCodeZenStatusline(report);\n\treturn undefined;\n}\n\nexport function styleUsageStatusline(\n\tvalue: string,\n\treport: UsageReport,\n\tstyler: UsageStatusStyler,\n): string {\n\tconst percentagePattern = /(\\d+(?:\\.\\d+)?)%/gu;\n\tconst isUsedPercentage = report.providerId === \"opencode-go\";\n\tlet cursor = 0;\n\tlet styled = \"\";\n\tfor (const match of value.matchAll(percentagePattern)) {\n\t\tconst index = match.index ?? 0;\n\t\tconst numeric = Number(match[1]);\n\t\tconst remaining = isUsedPercentage ? 100 - numeric : numeric;\n\t\tconst color = usageStatusColor(remaining);\n\t\tstyled += styler.dim(value.slice(cursor, index));\n\t\tstyled += styler.color(color, match[0]);\n\t\tcursor = index + match[0].length;\n\t}\n\treturn `${styled}${styler.dim(value.slice(cursor))}`;\n}\n\nexport function usageStatusColor(remaining: number): UsageStatusColor {\n\treturn remaining >= 70 ? \"success\" : remaining >= 30 ? \"warning\" : \"error\";\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 `${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 `${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: string[] = [];\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 > 0 ? parts.join(\" \") : undefined;\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 | undefined,\n\tnow: number,\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 parts: string[] = [];\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)}% (${formatResetCountdown(bucket, fallback, now)})`,\n\t\t);\n\t}\n\treturn parts.length > 0 ? 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 \"usage unavailable\";\n\tif (credits.value === \"none\") return \"no credits\";\n\tif (credits.value === \"available\") return \"credits available\";\n\tif (credits.value === \"unlimited\") return \"credits unlimited\";\n\treturn `${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 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(bucket: UsageBucket, fallback: \"5h\" | \"weekly\", now: number): string {\n\tif (bucket.resetsAt === undefined) {\n\t\treturn formatWindowLabel(bucket.windowMinutes, fallback, true);\n\t}\n\tconst remainingMs = bucket.resetsAt * 1000 - now;\n\tif (!Number.isFinite(remainingMs)) {\n\t\treturn formatWindowLabel(bucket.windowMinutes, fallback, true);\n\t}\n\tif (remainingMs <= 0) return \"reset due\";\n\tconst totalMinutes = Math.floor(remainingMs / 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\treturn `${days}d ${hours}h ${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}\n\nexport const DEFAULT_USAGE_SETTINGS: Readonly<UsageSettings> = Object.freeze({\n\tcodexFastMode: false,\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\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};\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", "import { 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 { awaitWithDeadline, errorMessage, runWithConcurrency, UsageCache } from \"./core.js\";\nimport { installUsageFooter } from \"./footer.js\";\nimport {\n\tformatProviderStates,\n\tformatUsageStatusline,\n\tMUTED_USAGE_COLORS,\n\tstyleUsageStatusline,\n} from \"./format.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\";\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 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 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 hasSuccessfulStatus = false;\n\tlet statusGeneration = 0;\n\tlet statusController: AbortController | undefined;\n\tlet fastRuntime: ReturnType<typeof registerCodexFastMode>;\n\n\tconst safeSetStatus = (\n\t\tctx: ExtensionContext,\n\t\tvalue: string | undefined,\n\t\tstyled = false,\n\t): boolean => {\n\t\ttry {\n\t\t\tctx.ui.setStatus(\n\t\t\t\tSTATUS_KEY,\n\t\t\t\tvalue === undefined || styled ? value : (ctx.ui.theme?.fg(\"dim\", value) ?? value),\n\t\t\t);\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\thasSuccessfulStatus = false;\n\t\tstatusGeneration += 1;\n\t\tstatusController?.abort();\n\t\tstatusController = undefined;\n\t\tsafeSetStatus(ctx, undefined);\n\t};\n\n\tconst publishStatus = (ctx: ExtensionContext, outcome: QueryOutcome, model: PiModel) => {\n\t\tif (outcome.state.status === \"unsupported\") {\n\t\t\tsafeSetStatus(ctx, undefined);\n\t\t\treturn;\n\t\t}\n\t\tif (outcome.state.status !== \"ready\") {\n\t\t\tif (!hasSuccessfulStatus) {\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\treturn;\n\t\t}\n\t\tconst rawValue = formatUsageStatusline(outcome.state.report, model);\n\t\tconst decoratedValue = rawValue ? fastRuntime.decorateStatus(model, rawValue) : undefined;\n\t\tconst value =\n\t\t\tdecoratedValue && ctx.mode === \"tui\" && ctx.ui.theme\n\t\t\t\t? styleUsageStatusline(decoratedValue, outcome.state.report, {\n\t\t\t\t\t\tcolor: (color, text) => `${MUTED_USAGE_COLORS[color]}${text}\\u001b[39m`,\n\t\t\t\t\t\tdim: (text) => ctx.ui.theme.fg(\"dim\", text),\n\t\t\t\t\t})\n\t\t\t\t: decoratedValue;\n\t\tif (safeSetStatus(ctx, value, ctx.mode === \"tui\")) hasSuccessfulStatus = true;\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\thasSuccessfulStatus = false;\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\tlet auth: ResolvedUsageAuth | undefined;\n\t\ttry {\n\t\t\tauth = await awaitWithDeadline(\n\t\t\t\tresolveUsageAuth(ctx, adapter),\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 (!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\tconst now = Date.now();\n\t\tconst cachedResetPassed = cached?.buckets.some(\n\t\t\t(bucket) => bucket.resetsAt !== undefined && bucket.resetsAt * 1000 <= now,\n\t\t);\n\t\tif (cached && !cachedResetPassed) {\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\t\tif (cachedResetPassed) cache.clearProvider(adapter.id);\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 report = await queryProviderUsage(adapter, auth, signal, remainingMs);\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 = 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\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 (!hasSuccessfulStatus && !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);\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\tif (!hasSuccessfulStatus) safeSetStatus(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),\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),\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);\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\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| \"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...(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\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),\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),\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),\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\tinstallUsageFooter(ctx);\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\tstatusGeneration += 1;\n\t\tfor (const controller of activeControllers) controller.abort();\n\t\tactiveControllers.clear();\n\t\tstatusController = undefined;\n\t\tsessionActive = true;\n\t\tinstallUsageFooter(ctx);\n\t\tstartStatusRefresh(ctx, ctx.model, false);\n\t});\n\tpi.on(\"session_tree\", (_event, ctx) => {\n\t\tinstallUsageFooter(ctx);\n\t\tstartStatusRefresh(ctx, ctx.model, false);\n\t});\n\tpi.on(\"model_select\", (event, ctx) => {\n\t\tinstallUsageFooter(ctx);\n\t\tstartStatusRefresh(ctx, event.model, false);\n\t});\n\tpi.on(\"turn_start\", (_event, ctx) => {\n\t\tinstallUsageFooter(ctx);\n\t\tstartStatusRefresh(ctx, ctx.model, false);\n\t});\n\tpi.on(\"agent_settled\", (_event, ctx) => {\n\t\tinstallUsageFooter(ctx);\n\t\tconst adapter = adapterForProvider(ctx.model?.provider);\n\t\tif (adapter) cache.clearProvider(adapter.id);\n\t\tstartStatusRefresh(ctx, ctx.model, false);\n\t});\n\tpi.on(\"session_shutdown\", (_event, ctx) => {\n\t\tsessionActive = false;\n\t\thasSuccessfulStatus = false;\n\t\tstatusGeneration += 1;\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 {\n\ttype ExtensionContext,\n\tFooterComponent,\n\ttype ReadonlyFooterDataProvider,\n} from \"@earendil-works/pi-coding-agent\";\nimport { stripTerminalSequences, truncateToWidth } from \"@earendil-works/pi-tui\";\nimport { MUTED_USAGE_COLORS, usageStatusColor } from \"./format.js\";\n\nconst USAGE_STATUS_KEY = \"usage\";\ntype FooterSession = ConstructorParameters<typeof FooterComponent>[0];\n\n/** Install the built-in footer with pi-usage on a dedicated status line. */\nexport function installUsageFooter(ctx: ExtensionContext): void {\n\tif (ctx.mode !== \"tui\") return;\n\n\tctx.ui.setFooter((tui, theme, footerData) => {\n\t\tconst footerDataWithoutUsage: ReadonlyFooterDataProvider = {\n\t\t\tgetGitBranch: () => footerData.getGitBranch(),\n\t\t\tgetAvailableProviderCount: () => 1,\n\t\t\tonBranchChange: (callback) => footerData.onBranchChange(callback),\n\t\t\tgetExtensionStatuses: () => {\n\t\t\t\tconst statuses = new Map(footerData.getExtensionStatuses());\n\t\t\t\tstatuses.delete(USAGE_STATUS_KEY);\n\t\t\t\treturn statuses;\n\t\t\t},\n\t\t};\n\t\tconst session = {\n\t\t\tstate: {\n\t\t\t\tget model() {\n\t\t\t\t\treturn ctx.model;\n\t\t\t\t},\n\t\t\t\tget thinkingLevel() {\n\t\t\t\t\treturn ctx.thinkingLevel;\n\t\t\t\t},\n\t\t\t},\n\t\t\tsessionManager: ctx.sessionManager,\n\t\t\tgetContextUsage: () => ctx.getContextUsage(),\n\t\t\tmodelRuntime: {\n\t\t\t\tisUsingSubscription: (provider: string) => provider === \"kimi-coding\",\n\t\t\t},\n\t\t} as unknown as FooterSession;\n\t\tconst builtInFooter = new FooterComponent(session, footerDataWithoutUsage);\n\t\tconst unsubscribe = footerData.onBranchChange(() => tui.requestRender());\n\n\t\treturn {\n\t\t\tdispose() {\n\t\t\t\tunsubscribe();\n\t\t\t\tbuiltInFooter.dispose();\n\t\t\t},\n\t\t\tinvalidate() {},\n\t\t\trender(width: number): string[] {\n\t\t\t\tconst lines = builtInFooter.render(width);\n\t\t\t\tconst secondLine = stripTerminalSequences(lines[1] ?? \"\");\n\t\t\t\tconst model = ctx.model;\n\t\t\t\tconst modelName = model?.id || \"no-model\";\n\t\t\t\tconst thinkingLevel = ctx.thinkingLevel || \"off\";\n\t\t\t\tconst modelText = model?.reasoning\n\t\t\t\t\t? `${modelName} \u2022 ${thinkingLevel === \"off\" ? \"thinking off\" : thinkingLevel}`\n\t\t\t\t\t: modelName;\n\t\t\t\tconst stats = secondLine.endsWith(modelText)\n\t\t\t\t\t? secondLine.slice(0, -modelText.length).trimEnd()\n\t\t\t\t\t: secondLine.trimEnd();\n\t\t\t\tconst truncatedStats = truncateToWidth(stats, width, \"\");\n\t\t\t\tconst contextPercent = /(\\d+(?:\\.\\d+)?)%(?=\\/\\S)/u.exec(truncatedStats);\n\t\t\t\tif (contextPercent?.index !== undefined) {\n\t\t\t\t\tconst percentage = contextPercent[0];\n\t\t\t\t\tconst remaining = 100 - Number(contextPercent[1]);\n\t\t\t\t\tconst before = truncatedStats.slice(0, contextPercent.index);\n\t\t\t\t\tconst after = truncatedStats.slice(contextPercent.index + percentage.length);\n\t\t\t\t\tlines[1] = `${theme.fg(\"dim\", before)}${MUTED_USAGE_COLORS[usageStatusColor(remaining)]}${percentage}\\u001b[39m${theme.fg(\"dim\", after)}`;\n\t\t\t\t} else {\n\t\t\t\t\tlines[1] = theme.fg(\"dim\", truncatedStats);\n\t\t\t\t}\n\t\t\t\tconst usageText = footerData.getExtensionStatuses().get(USAGE_STATUS_KEY);\n\t\t\t\tif (usageText) lines.splice(2, 0, truncateToWidth(usageText, width, \"\"));\n\t\t\t\treturn lines;\n\t\t\t},\n\t\t};\n\t});\n}\n", "import type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { sanitizeDisplayText } from \"./core.js\";\nimport { providerIsConfigured, SUPPORTED_ADAPTERS } from \"./query.js\";\nimport type { PiModel, UsageProviderAdapter } from \"./types.js\";\n\nexport function configuredAdapters(ctx: ExtensionContext): UsageProviderAdapter[] {\n\treturn SUPPORTED_ADAPTERS.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"],
  "mappings": "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",
  "names": ["readStoredCredential", "asObject", "asString", "asObject", "asString", "asNonnegativeNumber", "clampPercent", "asObject", "asNonnegativeNumber", "asString", "asObject", "readStoredCredential", "asObject", "bearerToken", "headerValue", "clampPercent", "isRecord", "randomUUID", "isAbortError", "isRecord", "isAbortError", "randomUUID", "isAbortError", "now"]
}
