@narumitw/pi-usage 0.64.2 → 0.65.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -3
- package/dist/chunks/{chunk-ACPQJ2CM.ts → chunk-N2ZD5X4K.ts} +4 -4
- package/dist/chunks/{chunk-ACPQJ2CM.ts.map → chunk-N2ZD5X4K.ts.map} +2 -2
- package/dist/chunks/{openai-companion-auth-FGFC6DBT.ts → openai-companion-auth-QIKCD3WA.ts} +2 -2
- package/dist/chunks/{openai-companion-usage-TGHK2OQR.ts → openai-companion-usage-ZFAHCGEY.ts} +2 -2
- package/dist/index.ts +372 -108
- package/dist/index.ts.map +4 -4
- package/package.json +1 -1
- package/src/codex-fast-catalog.ts +272 -0
- package/src/codex-fast-runtime.ts +107 -26
- package/src/codex-fast.ts +28 -17
- package/src/index.ts +3 -1
- package/src/query.ts +2 -1
- package/src/usage.ts +31 -10
- /package/dist/chunks/{openai-companion-auth-FGFC6DBT.ts.map → openai-companion-auth-QIKCD3WA.ts.map} +0 -0
- /package/dist/chunks/{openai-companion-usage-TGHK2OQR.ts.map → openai-companion-usage-ZFAHCGEY.ts.map} +0 -0
package/dist/index.ts.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/codex-fast.ts", "../src/codex-resets.ts", "../src/format.ts", "../src/settings.ts", "../src/usage.ts", "../src/codex-fast-
|
|
4
|
-
"sourcesContent": ["import { calculateCost, hasApi } from \"@earendil-works/pi-ai\";\nimport type { PiModel } from \"./types.js\";\n\nexport const CODEX_FAST_SERVICE_TIER = \"priority\";\nexport const CODEX_STANDARD_SERVICE_TIER = \"default\";\n\nexport const CODEX_FAST_MODEL_IDS: ReadonlySet<string> = new Set([\n \"gpt-5.5\",\n \"gpt-5.6-luna\",\n \"gpt-5.6-sol\",\n \"gpt-5.6-terra\",\n \"gpt-6-sol\",\n \"gpt-6.1-sol\",\n]);\n\nexport type CodexFastAvailability =\n | { kind: \"available\"; enabled: boolean }\n | { kind: \"not-codex\" }\n | { kind: \"unavailable\"; reason: string };\n\nexport function codexFastAvailability(model: PiModel | undefined, enabled: boolean): CodexFastAvailability {\n if (model?.provider !== \"openai-codex\") return { kind: \"not-codex\" };\n if (!isOfficialCodexModel(model)) {\n return {\n kind: \"unavailable\",\n reason: \"Fast mode requires the official OpenAI Codex Responses endpoint.\",\n };\n }\n if (!CODEX_FAST_MODEL_IDS.has(model.id)) {\n return {\n kind: \"unavailable\",\n reason: `${model.id} does not advertise Codex Fast support.`,\n };\n }\n return { kind: \"available\", enabled };\n}\n\nexport function codexFastIsEffective(model: PiModel | undefined, enabled: boolean): boolean {\n return codexFastAvailability(model, enabled).kind === \"available\" && enabled;\n}\n\nexport function codexFastRequestTier(\n model: PiModel | undefined,\n enabled: boolean,\n): typeof CODEX_FAST_SERVICE_TIER | typeof CODEX_STANDARD_SERVICE_TIER | undefined {\n if (!isOfficialCodexModel(model)) return undefined;\n return enabled && CODEX_FAST_MODEL_IDS.has(model.id) ? CODEX_FAST_SERVICE_TIER : CODEX_STANDARD_SERVICE_TIER;\n}\n\nexport function rewriteCodexFastPayload(\n payload: unknown,\n model: PiModel | undefined,\n enabled: boolean,\n): unknown | undefined {\n const serviceTier = codexFastRequestTier(model, enabled);\n if (!serviceTier || !isRecord(payload)) return undefined;\n return { ...payload, service_tier: serviceTier };\n}\n\nexport function correctCodexFastMessageCost(\n message: unknown,\n model: PiModel | undefined,\n fastRequested: boolean,\n): unknown | undefined {\n if (\n !codexFastIsEffective(model, fastRequested) ||\n !isRecord(message) ||\n message.role !== \"assistant\" ||\n message.provider !== model?.provider ||\n message.model !== model?.id\n ) {\n return undefined;\n }\n const usage = isRecord(message.usage) ? message.usage : undefined;\n const cost = usage && isRecord(usage.cost) ? usage.cost : undefined;\n if (!usage || !cost || !hasCompleteUsage(usage) || !isOfficialCodexModel(model)) return undefined;\n const correctedUsage = structuredClone(usage) as typeof usage;\n calculateCost(model, correctedUsage as never);\n const multiplier = model.id === \"gpt-5.5\" ? 2.5 : 2;\n const correctedCost = correctedUsage.cost as Record<string, number>;\n for (const key of [\"input\", \"output\", \"cacheRead\", \"cacheWrite\", \"total\"] as const) {\n correctedCost[key] *= multiplier;\n }\n if (costsEqual(cost, correctedCost)) return undefined;\n return { ...message, usage: correctedUsage };\n}\n\nexport function codexFastStatusLabel(status: string, enabled: boolean): string {\n if (!enabled || !/^codex(?:\\s|$)/u.test(status)) return status;\n return status === \"codex\" ? \"codex fast\" : `codex fast${status.slice(\"codex\".length)}`;\n}\n\nfunction isOfficialCodexModel(model: PiModel | undefined): model is PiModel & { api: \"openai-codex-responses\" } {\n if (model?.provider !== \"openai-codex\" || !hasApi(model, \"openai-codex-responses\")) {\n return false;\n }\n try {\n return new URL(model.baseUrl).origin === \"https://chatgpt.com\";\n } catch {\n return false;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasCompleteUsage(value: Record<string, unknown>): boolean {\n return [\"input\", \"output\", \"cacheRead\", \"cacheWrite\"].every(\n (key) => typeof value[key] === \"number\" && Number.isFinite(value[key]),\n );\n}\n\nfunction costsEqual(left: Record<string, unknown>, right: Record<string, number>): boolean {\n return [\"input\", \"output\", \"cacheRead\", \"cacheWrite\", \"total\"].every((key) => left[key] === right[key]);\n}\n", "import type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { readStoredCredential } from \"@earendil-works/pi-coding-agent\";\nimport { fingerprintResolvedAuth, sanitizeDisplayText } from \"./core.js\";\nimport { fallbackOAuthCredentialCandidates, type OAuthCredentialCandidateReader } from \"./oauth-credential-source.js\";\nimport { AUTH_FINGERPRINT_SALT, adapterForProvider, fetchProviderJson, resolveUsageAuth } from \"./query.js\";\nimport type { ResolvedUsageAuth, UsageReport } from \"./types.js\";\n\nconst CODEX_RESET_CREDITS_URL = \"https://chatgpt.com/backend-api/wham/rate-limit-reset-credits\";\nconst CODEX_RESET_CONSUME_URL = `${CODEX_RESET_CREDITS_URL}/consume`;\nconst MAX_RESET_OPTIONS = 32;\nconst MAX_CREDIT_ID_CHARS = 1_024;\n\ntype StoredCredentialReader = (providerId: string) => unknown;\n\nexport type CodexResetOutcomeCode = \"reset\" | \"nothing_to_reset\" | \"no_credit\" | \"already_redeemed\";\n\nexport interface CodexResetOption {\n creditId?: string;\n title: string;\n description: string;\n expiresAt?: number;\n}\n\nexport interface CodexResetAvailability {\n availableCount: number;\n options: CodexResetOption[];\n}\n\nexport interface CodexResetOutcome {\n code: CodexResetOutcomeCode;\n windowsReset: number;\n}\n\nexport function codexResetCount(report: UsageReport): number | undefined {\n const value = report.metrics.find((metric) => metric.id === \"reset-credits\")?.value;\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0 ? value : undefined;\n}\n\nexport function codexResetActionDescription(report: UsageReport): string {\n const count = codexResetCount(report);\n if (count === undefined) return \"Check reset availability.\";\n if (count === 0) return \"No usage limit resets available.\";\n return `You have ${count} ${resetLabel(count)} available.`;\n}\n\nexport function genericCodexResetOption(): CodexResetOption {\n return {\n title: \"Full reset\",\n description: \"Reset your current usage limits.\",\n };\n}\n\nexport function resetOptionExpiration(option: CodexResetOption): string {\n if (option.expiresAt === undefined) return \"Does not expire.\";\n const expiration = new Date(option.expiresAt * 1_000);\n if (Number.isNaN(expiration.getTime())) return \"Expiration unavailable.\";\n return `Expires ${expiration.toLocaleString()}.`;\n}\n\nexport function resetConfirmationLines(option: CodexResetOption | undefined): string[] {\n if (!option) return [\"The selected reset is unavailable.\"];\n return [\n option.title,\n resetOptionExpiration(option),\n option.description,\n \"This consumes one earned reset for the current OpenAI Codex account.\",\n ];\n}\n\nexport function formatCodexResetOutcome(\n outcome: CodexResetOutcome | undefined,\n remainingCount: number | undefined,\n): string {\n const remaining =\n remainingCount === undefined ? \"\" : ` You have ${remainingCount} ${resetLabel(remainingCount)} left.`;\n if (!outcome) return \"You don't have any usage limit resets available.\";\n if (outcome.code === \"reset\") return `Usage reset.${remaining}`.trim();\n if (outcome.code === \"already_redeemed\") {\n return `Usage reset was already completed.${remaining}`.trim();\n }\n if (outcome.code === \"nothing_to_reset\") {\n return \"Your usage does not need a reset right now.\";\n }\n return \"No usage limit resets are available.\";\n}\n\nexport function resetLabel(count: number): string {\n return count === 1 ? \"usage limit reset\" : \"usage limit resets\";\n}\n\nexport async function resolveCodexResetAuth(\n ctx: ExtensionContext,\n salt: Uint8Array = AUTH_FINGERPRINT_SALT,\n credentialReader: StoredCredentialReader = readStoredCredential,\n candidateReader?: OAuthCredentialCandidateReader,\n): Promise<ResolvedUsageAuth> {\n const model = ctx.model;\n if (model?.provider !== \"openai-codex\") {\n throw new Error(\"Usage limit resets require the current model to use OpenAI Codex.\");\n }\n const expectedModel = `${model.provider}/${model.id}`;\n const adapter = adapterForProvider(\"openai-codex\");\n if (!adapter) throw new Error(\"OpenAI Codex usage support is unavailable.\");\n if (candidateReader?.waitUntilReady && !(await candidateReader.waitUntilReady(ctx, \"openai-codex\"))) {\n throw new Error(\"OpenAI Codex OAuth credential readiness failed closed.\");\n }\n const auth = await resolveUsageAuth(ctx, adapter, salt, credentialReader);\n if (`${ctx.model?.provider}/${ctx.model?.id}` !== expectedModel) {\n throw new Error(\"The current model changed while resolving Codex reset authentication.\");\n }\n if (!auth) throw new Error(\"No runtime credential is configured for OpenAI Codex.\");\n const offered = candidateReader\n ? await candidateReader(ctx, \"openai-codex\")\n : fallbackOAuthCredentialCandidates(\"openai-codex\", credentialReader);\n if (!offered.ok) throw new Error(\"OpenAI Codex OAuth credential discovery failed closed.\");\n\n const resolvedAccess = bearerToken(headerValue(auth.headers, \"Authorization\")) ?? auth.apiKey;\n if (!resolvedAccess) throw new Error(\"OpenAI Codex OAuth credentials were incomplete.\");\n const resolvedAccountId = codexAccountIdFromAccessToken(resolvedAccess);\n if (!resolvedAccountId) {\n throw new Error(\"The active OpenAI Codex access token did not contain a valid account ID.\");\n }\n const { accountId, storedAccess } = selectCodexResetCredential(\n offered.candidates,\n resolvedAccess,\n resolvedAccountId,\n offered.offeredCount === 0,\n );\n const authorization = `Bearer ${resolvedAccess}`;\n const headers = {\n Authorization: authorization,\n \"chatgpt-account-id\": accountId,\n };\n return {\n apiKey: resolvedAccess,\n headers,\n fingerprint: fingerprintResolvedAuth({ headers }, salt),\n secrets: [...new Set([...auth.secrets, storedAccess, resolvedAccess, authorization, accountId])],\n model: auth.model,\n };\n}\n\nexport async function listCodexResetCredits(\n auth: ResolvedUsageAuth,\n signal: AbortSignal,\n timeoutMs: number,\n): Promise<CodexResetAvailability> {\n const payload = await fetchProviderJson(\n CODEX_RESET_CREDITS_URL,\n auth,\n signal,\n timeoutMs,\n \"Codex usage-limit reset endpoint\",\n );\n return normalizeCodexResetCreditsPayload(payload);\n}\n\nexport async function consumeCodexResetCredit(\n auth: ResolvedUsageAuth,\n option: CodexResetOption,\n redeemRequestId: string,\n signal: AbortSignal,\n timeoutMs: number,\n): Promise<CodexResetOutcome> {\n if (!redeemRequestId) throw new Error(\"Codex reset redemption request ID must not be empty.\");\n const payload = await fetchProviderJson(\n CODEX_RESET_CONSUME_URL,\n auth,\n signal,\n timeoutMs,\n \"Codex usage-limit reset consume endpoint\",\n {\n method: \"POST\",\n body: {\n redeem_request_id: redeemRequestId,\n ...(option.creditId ? { credit_id: option.creditId } : {}),\n },\n },\n );\n const code = payload.code;\n if (!isCodexResetOutcomeCode(code)) {\n throw new Error(\"Codex reset consume endpoint returned an unknown outcome code.\");\n }\n const windowsReset = payload.windows_reset === undefined ? 0 : nonnegativeInteger(payload.windows_reset);\n if (windowsReset === undefined) {\n throw new Error(\"Codex reset consume endpoint returned an invalid windows_reset value.\");\n }\n return { code, windowsReset };\n}\n\nexport function normalizeCodexResetCreditsPayload(payload: Record<string, unknown>): CodexResetAvailability {\n const availableCount = nonnegativeInteger(payload.available_count);\n if (availableCount === undefined) {\n throw new Error(\"Codex reset credits response returned an invalid available_count.\");\n }\n const rawCredits = payload.credits;\n if (rawCredits !== undefined && !Array.isArray(rawCredits)) {\n throw new Error(\"Codex reset credits response returned invalid credits.\");\n }\n\n const options = (rawCredits ?? [])\n .map(asObject)\n .filter((credit): credit is Record<string, unknown> => Boolean(credit))\n .filter((credit) => credit.status === \"available\" && credit.reset_type === \"codex_rate_limits\")\n .map(normalizeResetOption)\n .sort((left, right) => (left.expiresAt ?? Number.MAX_SAFE_INTEGER) - (right.expiresAt ?? Number.MAX_SAFE_INTEGER))\n .slice(0, Math.min(availableCount, MAX_RESET_OPTIONS));\n\n if (availableCount > 0 && options.length === 0) {\n options.push(genericCodexResetOption());\n }\n return { availableCount, options };\n}\n\nfunction selectCodexResetCredential(\n candidates: readonly unknown[],\n resolvedAccess: string,\n resolvedAccountId: string,\n standaloneFallback: boolean,\n): { accountId: string; storedAccess: string } {\n let sawOAuth = false;\n let sawMatchingAccess = false;\n let sawInvalidAccountId = false;\n const matches = new Map<string, { accountId: string; storedAccess: string }>();\n for (const candidate of candidates) {\n try {\n const credential = asObject(candidate);\n if (credential?.type !== \"oauth\") continue;\n sawOAuth = true;\n const storedAccess = asNonemptyString(credential.access);\n if (storedAccess !== resolvedAccess) continue;\n sawMatchingAccess = true;\n const accountId = validHeaderValue(credential.accountId);\n const refresh = asNonemptyString(credential.refresh);\n if (!accountId || accountId !== resolvedAccountId || !refresh) {\n sawInvalidAccountId = true;\n continue;\n }\n matches.set(refresh, { accountId, storedAccess });\n } catch {\n // Malformed candidates never authorize a reset request.\n }\n }\n if (sawInvalidAccountId) {\n throw new Error(\"The OpenAI Codex OAuth credential did not include a valid account ID.\");\n }\n if (matches.size > 1) {\n throw new Error(\"Conflicting OAuth credentials match the active OpenAI Codex runtime account.\");\n }\n const match = matches.values().next().value;\n if (match) return match;\n if (!sawOAuth) {\n throw new Error(\n standaloneFallback\n ? \"Usage limit resets require the OpenAI Codex OAuth account configured through Pi /login.\"\n : \"Usage limit resets require an OpenAI Codex OAuth account configured through Pi /login or a compatible credential source.\",\n );\n }\n if (sawMatchingAccess) throw new Error(\"OpenAI Codex OAuth credentials were incomplete.\");\n throw new Error(\n standaloneFallback\n ? \"The active OpenAI Codex runtime account does not match Pi's stored OAuth account.\"\n : \"The active OpenAI Codex runtime account does not match any available OAuth account.\",\n );\n}\n\nfunction codexAccountIdFromAccessToken(access: string): string | undefined {\n try {\n const parts = access.split(\".\");\n if (parts.length !== 3 || !parts[1]) return undefined;\n const payload = JSON.parse(Buffer.from(parts[1], \"base64url\").toString(\"utf8\")) as unknown;\n const claims = asObject(asObject(payload)?.[\"https://api.openai.com/auth\"]);\n return validHeaderValue(claims?.chatgpt_account_id);\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeResetOption(credit: Record<string, unknown>): CodexResetOption {\n const creditId = asOpaqueId(credit.id);\n if (!creditId) throw new Error(\"Codex reset credits response returned an invalid credit ID.\");\n let expiresAt: number | undefined;\n if (credit.expires_at !== undefined && credit.expires_at !== null) {\n if (typeof credit.expires_at !== \"string\") {\n throw new Error(\"Codex reset credits response returned an invalid expiration time.\");\n }\n const parsed = Date.parse(credit.expires_at);\n if (!Number.isFinite(parsed)) {\n throw new Error(\"Codex reset credits response returned an invalid expiration time.\");\n }\n expiresAt = Math.floor(parsed / 1_000);\n }\n const title = displayString(credit.title) ?? \"Full reset\";\n const description = displayString(credit.description) ?? \"Reset your current usage limits.\";\n return {\n creditId,\n title,\n description,\n ...(expiresAt === undefined ? {} : { expiresAt }),\n };\n}\n\nfunction isCodexResetOutcomeCode(value: unknown): value is CodexResetOutcomeCode {\n return value === \"reset\" || value === \"nothing_to_reset\" || value === \"no_credit\" || value === \"already_redeemed\";\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n return value as Record<string, unknown>;\n}\n\nfunction asNonemptyString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction asOpaqueId(value: unknown): string | undefined {\n if (typeof value !== \"string\" || value.length === 0 || value.length > MAX_CREDIT_ID_CHARS) {\n return undefined;\n }\n return value;\n}\n\nfunction displayString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n return sanitizeDisplayText(value, 160) || undefined;\n}\n\nfunction validHeaderValue(value: unknown): string | undefined {\n if (typeof value !== \"string\" || !value || value.length > 512) return undefined;\n if (/[^\\x20-\\x7e]/u.test(value)) return undefined;\n return value;\n}\n\nfunction nonnegativeInteger(value: unknown): number | undefined {\n const parsed =\n typeof value === \"number\" ? value : typeof value === \"string\" && value.trim() ? Number(value) : Number.NaN;\n if (!Number.isSafeInteger(parsed) || parsed < 0) return undefined;\n return parsed;\n}\n\nfunction bearerToken(authorization: string | undefined): string | undefined {\n return /^Bearer\\s+(.+)$/iu.exec(authorization ?? \"\")?.[1];\n}\n\nfunction headerValue(headers: Record<string, string>, name: string): string | undefined {\n return Object.entries(headers).find(([candidate]) => candidate.toLowerCase() === name.toLowerCase())?.[1];\n}\n", "import type { CodexStatusPercentage } from \"./settings.js\";\nimport type { ProviderUsageState, UsageBucket, UsageDisplayState, UsageModel, UsageReport } from \"./types.js\";\n\nconst BAR_SEGMENTS = 20;\nconst VALUE_COLUMN = 29;\n\nexport function formatUsageReport(report: UsageReport, displayState: UsageDisplayState): string {\n const stateLabel = displayState === \"current\" ? \"Current\" : \"Configured\";\n const title =\n report.providerId === \"baseten\"\n ? \"Baseten Model APIs Spend\"\n : report.providerId === \"deepseek\"\n ? \"DeepSeek API Balance\"\n : report.providerId === \"fireworks\"\n ? \"Fireworks API Spend\"\n : report.providerId === \"vercel-ai-gateway\"\n ? \"Vercel AI Gateway Credits\"\n : report.providerId === \"moonshotai\" || report.providerId === \"moonshotai-cn\"\n ? `${report.providerName} Balance`\n : report.providerId === \"minimax\" || report.providerId === \"minimax-cn\"\n ? report.source === \"minimax-account-balance\"\n ? `${report.providerName} API Balance`\n : `${report.providerName} Token Plan`\n : report.source === \"openai-chatgpt-auth\"\n ? `${report.providerName} ChatGPT Plan Status`\n : `${report.providerName} Usage`;\n const lines = [`${title} \u00B7 ${stateLabel}`];\n if (report.accountLabel) lines.push(`Account: ${report.accountLabel}`);\n lines.push(`Semantics: ${report.semantics.label}`, \"\");\n\n if (report.source === \"openai-chatgpt-companion\") formatOpenAICompanionReport(lines, report);\n else if (report.providerId === \"baseten\") formatBasetenReport(lines, report);\n else if (report.providerId === \"openai-codex\") formatCodexReport(lines, report);\n else if (report.providerId === \"deepseek\") formatDeepSeekReport(lines, report);\n else if (report.providerId === \"fireworks\") formatFireworksReport(lines, report);\n else if (report.providerId === \"vercel-ai-gateway\") formatVercelAIGatewayReport(lines, report);\n else if (report.providerId === \"github-copilot\") formatGitHubCopilotReport(lines, report);\n else if (report.providerId === \"openrouter\") formatOpenRouterReport(lines, report);\n else if (report.providerId === \"opencode-go\") formatOpenCodeZenReport(lines, report);\n else if (report.providerId === \"command-code\") formatCommandCodeReport(lines, report);\n else if (report.providerId === \"kimi-coding\") formatKimiCodingReport(lines, report);\n else if (report.providerId === \"moonshotai\" || report.providerId === \"moonshotai-cn\") {\n formatMoonshotReport(lines, report);\n } else if (report.providerId === \"minimax\" || report.providerId === \"minimax-cn\") {\n formatMiniMaxReport(lines, report);\n } else if (report.providerId === \"xai\") formatXaiReport(lines, report);\n else if (report.providerId === \"zai\" || report.providerId === \"zai-coding-cn\") {\n formatZaiReport(lines, report);\n } else formatGenericReport(lines, report);\n\n if (report.notes) {\n for (const note of report.notes) lines.push(note);\n }\n return lines.join(\"\\n\").trimEnd();\n}\n\nexport function formatUsageStatusline(\n report: UsageReport,\n model?: UsageModel,\n now = Date.now(),\n showCodexResetCountdown = true,\n codexStatusPercentage: CodexStatusPercentage = \"remaining\",\n): string | undefined {\n if (report.providerId === \"openai\" && report.source === \"openai-chatgpt-auth\") return \"chatgpt usage: web only\";\n if (report.source === \"openai-chatgpt-companion\") {\n const windows = report.buckets\n .filter((bucket) => bucket.groupId === \"chatgpt-plan\")\n .map((bucket) => {\n const reset = formatResetCountdown(bucket.resetsAt, now);\n const window = reset ? `\u21BB ${reset}` : formatWindowLabel(bucket.windowMinutes, \"weekly\", true);\n return `${bucket.remaining === undefined ? \"unavailable\" : `${bucket.remaining.toFixed(0)}%`} ${window}`;\n });\n return `chatgpt plan ${windows.join(\" \")}`;\n }\n if (report.providerId === \"baseten\") return formatBasetenStatusline(report);\n if (report.providerId === \"openai-codex\") {\n return formatCodexStatusline(report, model, now, showCodexResetCountdown, codexStatusPercentage);\n }\n if (report.providerId === \"deepseek\") return formatDeepSeekStatusline(report);\n if (report.providerId === \"fireworks\") return formatFireworksStatusline(report);\n if (report.providerId === \"vercel-ai-gateway\") return formatVercelAIGatewayStatusline(report);\n if (report.providerId === \"github-copilot\") return formatGitHubCopilotStatusline(report);\n if (report.providerId === \"openrouter\") {\n const limit = report.buckets.find((bucket) => bucket.id === \"key-limit\");\n if (limit?.remaining !== undefined) return `openrouter ${formatUsd(limit.remaining)} left`;\n const total = report.metrics.find((metric) => metric.id === \"usage-total\");\n if (typeof total?.value === \"number\") return `openrouter ${formatUsd(total.value)} used`;\n }\n if (report.providerId === \"opencode-go\") return formatOpenCodeZenStatusline(report);\n if (report.providerId === \"command-code\") return formatCommandCodeStatusline(report);\n if (report.providerId === \"kimi-coding\") return formatKimiCodingStatusline(report);\n if (report.providerId === \"moonshotai\" || report.providerId === \"moonshotai-cn\") {\n return formatMoonshotStatusline(report);\n }\n if (report.providerId === \"minimax\" || report.providerId === \"minimax-cn\") {\n return formatMiniMaxStatusline(report, model);\n }\n if (report.providerId === \"zai\" || report.providerId === \"zai-coding-cn\") {\n return formatZaiStatusline(report);\n }\n return undefined;\n}\n\nexport function formatProviderStates(states: readonly ProviderUsageState[]): string {\n return states\n .map((state) => {\n if (state.status === \"ready\") return formatUsageReport(state.report, state.displayState);\n const label = state.displayState === \"current\" ? \"Current\" : \"Configured\";\n if (state.status === \"selection-required\") {\n return `${state.providerName} \u00B7 ${label}\\nSelection required: choose this provider's ${state.singularLabel} by viewing it individually.`;\n }\n const status =\n state.status === \"auth-unavailable\"\n ? \"Authentication unavailable\"\n : state.status === \"unsupported\"\n ? \"Unsupported\"\n : \"Query failed\";\n return `${state.providerName} \u00B7 ${label}\\n${status}: ${state.message}`;\n })\n .join(\"\\n\\n\");\n}\n\nfunction formatBasetenReport(lines: string[], report: UsageReport): void {\n lines.push(`${\"Spend window:\".padEnd(VALUE_COLUMN)}Last 30 days`);\n for (const metric of report.metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}USD ${metric.value}`);\n }\n}\n\nfunction formatBasetenStatusline(report: UsageReport): string {\n const subtotal = report.metrics.find((metric) => metric.id === \"net-subtotal\");\n return subtotal ? `baseten USD ${subtotal.value} net` : \"baseten no Model APIs usage\";\n}\n\nfunction formatCodexReport(lines: string[], report: UsageReport): void {\n let previousGroup: string | undefined;\n for (const bucket of report.buckets) {\n const group = bucket.groupId ?? bucket.id;\n if (group !== previousGroup && group !== \"codex\") {\n lines.push(`${bucket.groupLabel ?? group} limit:`);\n }\n previousGroup = group;\n const fallback = bucket.id.endsWith(\":secondary\") ? \"weekly\" : \"5h\";\n const label = `${formatWindowLabel(bucket.windowMinutes, fallback, false)} limit:`;\n lines.push(`${label.padEnd(VALUE_COLUMN)}${formatPercentBucket(bucket)}`);\n }\n for (const metric of report.metrics) {\n if (metric.id === \"reset-credits\") {\n lines.push(`${\"Usage limit resets:\".padEnd(VALUE_COLUMN)}${metric.value} available`);\n } else if (metric.id === \"credits\") {\n lines.push(`${\"Credits:\".padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`);\n }\n }\n}\n\nfunction formatDeepSeekReport(lines: string[], report: UsageReport): void {\n const availability = report.metrics.find((metric) => metric.id === \"api-availability\");\n lines.push(\n `${\"API calls:\".padEnd(VALUE_COLUMN)}${availability?.value === \"available\" ? \"Available\" : \"Unavailable\"}`,\n );\n for (const currency of [\"CNY\", \"USD\"]) {\n const metrics = report.metrics.filter((metric) => metric.currency === currency);\n if (metrics.length === 0) continue;\n lines.push(\"\", `${currency} balance:`);\n for (const metric of metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${currency} ${metric.value}`);\n }\n }\n}\n\nfunction formatDeepSeekStatusline(report: UsageReport): string {\n const availability = report.metrics.find((metric) => metric.id === \"api-availability\");\n if (availability?.value !== \"available\") return \"deepseek API unavailable\";\n const totals = [\"CNY\", \"USD\"].flatMap((currency) => {\n const metric = report.metrics.find((candidate) => candidate.id === `${currency.toLowerCase()}-total`);\n return metric ? [`${currency} ${metric.value}`] : [];\n });\n return totals.length > 0 ? `deepseek ${totals.join(\" \u00B7 \")}` : \"deepseek balance unavailable\";\n}\n\nfunction formatFireworksReport(lines: string[], report: UsageReport): void {\n lines.push(`${\"Spend window:\".padEnd(VALUE_COLUMN)}Last 30 days (rated)`);\n for (const currency of fireworksCurrencies(report)) {\n lines.push(\"\", `${currency} rated spend:`);\n for (const metric of report.metrics) {\n if (metric.currency !== currency) continue;\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${currency} ${metric.value}`);\n }\n }\n}\n\nfunction formatFireworksStatusline(report: UsageReport): string {\n const totals = report.metrics.filter((metric) => metric.id.endsWith(\"-total\"));\n if (totals.length === 0) return \"fireworks no rated usage\";\n return `fireworks ${totals.map((metric) => `${metric.currency} ${metric.value}`).join(\" \u00B7 \")}`;\n}\n\nfunction fireworksCurrencies(report: UsageReport): string[] {\n const currencies: string[] = [];\n for (const metric of report.metrics) {\n if (!metric.currency || currencies.includes(metric.currency)) continue;\n currencies.push(metric.currency);\n }\n return currencies;\n}\n\nfunction formatVercelAIGatewayReport(lines: string[], report: UsageReport): void {\n for (const metric of report.metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}USD ${metric.value}`);\n }\n}\n\nfunction formatVercelAIGatewayStatusline(report: UsageReport): string {\n const balance = report.metrics.find((metric) => metric.id === \"credit-balance\");\n return balance ? `vercel USD ${balance.value} left` : \"vercel credits unavailable\";\n}\n\nfunction formatGitHubCopilotReport(lines: string[], report: UsageReport): void {\n const quota = findGitHubCopilotQuota(report);\n if (!quota || quota.limit === undefined || quota.remaining === undefined) {\n lines.push(`${`${quota?.label ?? \"Copilot quota\"}:`.padEnd(VALUE_COLUMN)}unlimited`);\n return;\n }\n const percent = percentRemaining(quota);\n const reset = quota.resetsAt ? ` (resets ${formatReset(quota.resetsAt)})` : \"\";\n lines.push(\n `${`${quota.label}:`.padEnd(VALUE_COLUMN)}${quota.remaining} of ${quota.limit} left \u00B7 ${percent}%${reset}`,\n );\n const overage = report.metrics.find((metric) => metric.id === \"overage-used\");\n if (typeof overage?.value === \"number\" && overage.value > 0) {\n lines.push(`${\"Additional usage:\".padEnd(VALUE_COLUMN)}${overage.value} ${quota.label}`);\n }\n}\n\nfunction formatGitHubCopilotStatusline(report: UsageReport): string {\n const quota = findGitHubCopilotQuota(report);\n const kind = compactGitHubCopilotQuotaKind(quota);\n if (!quota || quota.limit === undefined || quota.remaining === undefined) {\n return `copilot ${kind} unlimited`;\n }\n const overage = report.metrics.find((metric) => metric.id === \"overage-used\");\n const overageSuffix = typeof overage?.value === \"number\" && overage.value > 0 ? ` +${overage.value} over` : \"\";\n return `copilot ${kind === \"premium\" ? \"\" : `${kind} `}${quota.remaining}/${quota.limit} ${percentRemaining(quota)}%${overageSuffix}`;\n}\n\nfunction findGitHubCopilotQuota(report: UsageReport): UsageBucket | undefined {\n return report.buckets.find((bucket) => [\"ai-credits\", \"premium-requests\", \"chat-requests\"].includes(bucket.id));\n}\n\nfunction compactGitHubCopilotQuotaKind(bucket: UsageBucket | undefined): string {\n if (bucket?.id === \"ai-credits\") return \"credits\";\n if (bucket?.id === \"chat-requests\") return \"chat\";\n return \"premium\";\n}\n\nfunction percentRemaining(bucket: UsageBucket): number {\n if (!bucket.limit || bucket.remaining === undefined) return 0;\n return Math.round(clampPercent((bucket.remaining / bucket.limit) * 100));\n}\n\nfunction formatOpenRouterReport(lines: string[], report: UsageReport): void {\n const limit = report.buckets.find((bucket) => bucket.id === \"key-limit\");\n if (limit) {\n const period = limit.period ? ` (${limit.period})` : \"\";\n const value =\n limit.remaining === undefined\n ? `${formatUsd(limit.limit ?? 0)} cap; remaining unavailable`\n : `${formatUsd(limit.remaining)} of ${formatUsd(limit.limit ?? 0)} left`;\n lines.push(`${`Key limit${period}:`.padEnd(VALUE_COLUMN)}${value}`);\n }\n for (const metric of report.metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`);\n }\n}\n\nfunction formatOpenCodeZenReport(lines: string[], report: UsageReport): void {\n for (const bucket of report.buckets) {\n if (bucket.unit === \"percent\" && bucket.used !== undefined) {\n lines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${formatPercentBucket(bucket)}`);\n continue;\n }\n const reset = bucket.resetsAt ? ` (resets ${formatReset(bucket.resetsAt)})` : \"\";\n const used = bucket.used ?? \"unavailable\";\n lines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${used}% used${reset}`);\n }\n}\n\nfunction formatOpenCodeZenStatusline(report: UsageReport): string | undefined {\n const parts = [\"zen\"];\n for (const bucket of report.buckets) {\n if (bucket.used === undefined) continue;\n const compact = bucket.id === \"rolling\" ? \"r\" : bucket.id === \"weekly\" ? \"w\" : \"m\";\n parts.push(`${clampPercent(bucket.used).toFixed(0)}% ${compact}`);\n }\n return parts.length > 1 ? parts.join(\" \") : undefined;\n}\n\nfunction formatCommandCodeReport(lines: string[], report: UsageReport): void {\n for (const bucket of report.buckets) {\n const reset = bucket.resetsAt ? ` (resets ${formatReset(bucket.resetsAt)})` : \"\";\n if (bucket.used === undefined || bucket.limit === undefined) {\n lines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}unavailable${reset}`);\n continue;\n }\n lines.push(\n `${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${formatUsd(bucket.used)} of ${formatUsd(bucket.limit)} used \u00B7 ${percentRemaining(bucket)}% left${reset}`,\n );\n }\n for (const metric of report.metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`);\n }\n}\n\nfunction formatCommandCodeStatusline(report: UsageReport): string | undefined {\n const parts = [\"cmd\"];\n for (const [id, label] of [\n [\"five-hour\", \"5h\"],\n [\"weekly\", \"wk\"],\n [\"monthly\", \"mo\"],\n ] as const) {\n const bucket = report.buckets.find((candidate) => candidate.id === id);\n if (bucket?.unit !== \"usd\" || bucket.limit === undefined || bucket.remaining === undefined) continue;\n parts.push(`${percentRemaining(bucket)}% ${label}`);\n }\n return parts.length > 1 ? parts.join(\" \") : undefined;\n}\n\nfunction formatKimiCodingReport(lines: string[], report: UsageReport): void {\n for (const bucket of report.buckets) {\n const reset = bucket.resetsAt ? ` (resets ${formatReset(bucket.resetsAt)})` : \"\";\n if (bucket.unit === \"percent\") {\n const remaining = bucket.remaining === undefined ? undefined : Math.round(clampPercent(bucket.remaining));\n const value =\n bucket.used === undefined || remaining === undefined\n ? \"unavailable\"\n : `${100 - remaining}% used \u00B7 ${remaining}% left`;\n lines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${value}${reset}`);\n continue;\n }\n if (bucket.used === undefined || bucket.limit === undefined) {\n lines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}unavailable${reset}`);\n continue;\n }\n lines.push(\n `${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${bucket.used} of ${bucket.limit} used \u00B7 ${percentRemaining(bucket)}% left${reset}`,\n );\n }\n const balance = report.metrics.find((metric) => metric.id === \"booster-balance\");\n const total = report.metrics.find((metric) => metric.id === \"booster-total\");\n const monthlyUsed = report.metrics.find((metric) => metric.id === \"booster-monthly-used\");\n const monthlyLimit = report.metrics.find((metric) => metric.id === \"booster-monthly-limit\");\n if (!balance && !monthlyUsed && !monthlyLimit) return;\n lines.push(\"\", \"Extra usage wallet:\");\n if (balance) {\n const totalSuffix = total ? ` of ${formatCurrencyMetric(total)}` : \"\";\n lines.push(`${\"Balance:\".padEnd(VALUE_COLUMN)}${formatCurrencyMetric(balance)}${totalSuffix}`);\n }\n if (monthlyUsed) {\n lines.push(`${\"Used this month:\".padEnd(VALUE_COLUMN)}${formatCurrencyMetric(monthlyUsed)}`);\n }\n if (monthlyLimit) {\n lines.push(`${\"Monthly limit:\".padEnd(VALUE_COLUMN)}${formatCurrencyMetric(monthlyLimit)}`);\n }\n}\n\nfunction formatKimiCodingStatusline(report: UsageReport): string | undefined {\n const fiveHour = report.buckets.find((bucket) => bucket.id === \"five-hour\");\n const weekly = report.buckets.find((bucket) => bucket.id === \"weekly\");\n const monthly = report.buckets.find((bucket) => bucket.id === \"monthly\");\n const subWindow = fiveHour ?? report.buckets.find((bucket) => bucket.id !== \"weekly\" && bucket.id !== \"monthly\");\n const selected = [subWindow, weekly, monthly].filter(\n (bucket, index, buckets): bucket is UsageBucket => bucket !== undefined && buckets.indexOf(bucket) === index,\n );\n const parts = [\"kimi\"];\n for (const bucket of selected) {\n if (bucket.remaining === undefined || (bucket.unit !== \"percent\" && !bucket.limit)) continue;\n const fallback = bucket.id === \"weekly\" ? \"weekly\" : \"5h\";\n const window = bucket.id === \"monthly\" ? \"mo\" : formatWindowLabel(bucket.windowMinutes, fallback, true);\n const remaining = bucket.unit === \"percent\" ? Math.round(clampPercent(bucket.remaining)) : percentRemaining(bucket);\n parts.push(`${remaining}% ${window}`);\n }\n return parts.length > 1 ? parts.join(\" \") : undefined;\n}\n\nfunction formatMoonshotReport(lines: string[], report: UsageReport): void {\n for (const metric of report.metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${metric.currency} ${metric.value}`);\n }\n}\n\nfunction formatMoonshotStatusline(report: UsageReport): string {\n const available = report.metrics.find((metric) => metric.id === \"available-balance\");\n if (!available) return \"moonshot balance unavailable\";\n return `moonshot ${available.currency ?? \"\"} ${available.value}`.replace(/\\s+/gu, \" \");\n}\n\nfunction formatMiniMaxReport(lines: string[], report: UsageReport): void {\n if (report.source === \"minimax-account-balance\") {\n for (const metric of report.metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${metric.currency} ${metric.value}`);\n }\n return;\n }\n let previousGroup: string | undefined;\n for (const bucket of report.buckets) {\n if (bucket.groupId !== previousGroup) lines.push(`${bucket.groupLabel ?? \"Token Plan\"}:`);\n previousGroup = bucket.groupId;\n const reset = bucket.resetsAt ? ` (resets ${formatReset(bucket.resetsAt)})` : \"\";\n const value =\n bucket.period === \"unlimited\"\n ? \"unlimited\"\n : bucket.unit === \"percent\" && bucket.remaining !== undefined\n ? `${bucket.remaining}% remaining${reset}`\n : bucket.limit !== undefined && bucket.remaining !== undefined\n ? `${bucket.remaining} of ${bucket.limit} left \u00B7 ${percentRemaining(bucket)}%${reset}`\n : \"unavailable\";\n lines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${value}`);\n }\n}\n\nfunction formatMiniMaxStatusline(report: UsageReport, model?: UsageModel): string | undefined {\n const prefix = report.providerId === \"minimax-cn\" ? \"minimax cn\" : \"minimax\";\n if (report.source === \"minimax-account-balance\") {\n const available = report.metrics.find((metric) => metric.id === \"available-balance\");\n return available ? `${prefix} ${available.currency} ${available.value}` : undefined;\n }\n const selectedGroup = selectMiniMaxGroup(report, model);\n if (!selectedGroup) return undefined;\n const selected = report.buckets.filter((bucket) => bucket.groupId === selectedGroup);\n const parts = [prefix];\n for (const bucket of selected) {\n const fallback = bucket.id.endsWith(\":weekly\") ? \"weekly\" : \"5h\";\n const window = formatWindowLabel(bucket.windowMinutes, fallback, true);\n if (bucket.period === \"unlimited\") {\n parts.push(`unlimited ${window}`);\n continue;\n }\n if (bucket.unit === \"percent\" && bucket.remaining !== undefined) {\n parts.push(`${bucket.remaining}% ${window}`);\n continue;\n }\n if (bucket.limit === undefined || bucket.remaining === undefined) continue;\n parts.push(`${percentRemaining(bucket)}% ${window}`);\n }\n return parts.length > 1 ? parts.join(\" \") : undefined;\n}\n\nfunction selectMiniMaxGroup(report: UsageReport, model?: UsageModel): string | undefined {\n const groups = [\n ...new Set(report.buckets.map((bucket) => bucket.groupId).filter((group): group is string => group !== undefined)),\n ];\n if (groups.length <= 1) return groups[0];\n if (model && model.provider !== report.providerId) return undefined;\n if (model) {\n const modelKeys = [model.id, model.name]\n .map(normalizeMiniMaxModelKey)\n .filter((key): key is string => key !== undefined);\n const candidates = groups.map((group) => {\n const bucket = report.buckets.find((candidate) => candidate.groupId === group);\n const patterns = [bucket?.groupLabel, ...(bucket?.modelKeys ?? []), group]\n .map(normalizeMiniMaxModelKey)\n .filter((key): key is string => key !== undefined);\n return { group, patterns };\n });\n const exact = candidates.find(({ patterns }) =>\n patterns.some((pattern) => !pattern.includes(\"*\") && modelKeys.includes(pattern)),\n );\n if (exact) return exact.group;\n const wildcard = candidates.find(({ patterns }) =>\n patterns.some((pattern) => pattern.includes(\"*\") && modelKeys.some((key) => wildcardKeyMatches(pattern, key))),\n );\n if (wildcard) return wildcard.group;\n }\n // Prefer the Coding Plan catch-all over hiding the chip.\n return groups.find((group) => group === \"general\");\n}\n\nfunction normalizeMiniMaxModelKey(value: string | undefined): string | undefined {\n const key = value?.toLowerCase().replace(/[^a-z0-9*]+/gu, \"\");\n return key && /[a-z0-9]/u.test(key) ? key : undefined;\n}\n\nfunction wildcardKeyMatches(pattern: string, value: string): boolean {\n if (!pattern.includes(\"*\")) return pattern === value;\n const segments = pattern.split(\"*\").filter(Boolean);\n let offset = 0;\n for (const [index, segment] of segments.entries()) {\n const found = value.indexOf(segment, offset);\n if (found < 0 || (index === 0 && !pattern.startsWith(\"*\") && found !== 0)) return false;\n offset = found + segment.length;\n }\n const last = segments.at(-1);\n return pattern.endsWith(\"*\") || (last !== undefined && value.endsWith(last));\n}\n\nfunction formatZaiStatusline(report: UsageReport): string | undefined {\n const selected = [\n report.buckets.find((bucket) => bucket.id === \"five-hour\"),\n report.buckets.find((bucket) => bucket.id === \"weekly\"),\n ];\n const parts = [\"zai\"];\n for (const bucket of selected) {\n if (!bucket?.limit || bucket.remaining === undefined) continue;\n const fallback = bucket.id === \"weekly\" ? \"weekly\" : \"5h\";\n parts.push(`${percentRemaining(bucket)}% ${formatWindowLabel(bucket.windowMinutes, fallback, true)}`);\n }\n return parts.length > 1 ? parts.join(\" \") : undefined;\n}\n\nfunction formatCurrencyMetric(metric: UsageReport[\"metrics\"][number]): string {\n if (typeof metric.value !== \"number\") return String(metric.value);\n if (!metric.currency) return \"unavailable\";\n if (metric.currency === \"USD\") return `$${metric.value.toFixed(2)}`;\n if (metric.currency === \"CNY\") return `\u00A5${metric.value.toFixed(2)}`;\n return `${metric.value.toFixed(2)} ${metric.currency}`;\n}\n\nfunction formatXaiReport(lines: string[], report: UsageReport): void {\n const included = report.buckets.find((bucket) => bucket.id === \"included-allowance\");\n if (included) {\n let value = \"unavailable\";\n if (included.unit === \"percent\" && included.used !== undefined) {\n value = formatPercentBar(included);\n } else if (included.used !== undefined) {\n value = `${formatUsd(included.used)} used`;\n if (included.limit !== undefined) value += ` of ${formatUsd(included.limit)}`;\n } else if (included.limit !== undefined) {\n value = `usage unavailable \u00B7 ${formatUsd(included.limit)} limit`;\n }\n const period = included.period ? ` \u00B7 ${included.period}` : \"\";\n const reset = included.resetsAt ? ` (resets ${formatReset(included.resetsAt)})` : \"\";\n lines.push(`${\"Included allowance:\".padEnd(VALUE_COLUMN)}${value}${period}${reset}`);\n }\n const onDemand = report.buckets.find((bucket) => bucket.id === \"on-demand\");\n if (onDemand) {\n let value = onDemand.used === undefined ? \"usage unavailable\" : `${formatUsd(onDemand.used)} used`;\n if (onDemand.limit !== undefined) value += ` of ${formatUsd(onDemand.limit)} cap`;\n lines.push(`${\"On-demand usage:\".padEnd(VALUE_COLUMN)}${value}`);\n }\n for (const metric of report.metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`);\n }\n}\n\nfunction formatZaiReport(lines: string[], report: UsageReport): void {\n for (const bucket of report.buckets) {\n if (bucket.unit === \"percent\" && bucket.used !== undefined) {\n lines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${formatPercentBucket(bucket)}`);\n continue;\n }\n const reset = bucket.resetsAt ? ` (resets ${formatReset(bucket.resetsAt)})` : \"\";\n let value = \"unavailable\";\n if (bucket.used !== undefined && bucket.limit !== undefined) {\n value = `${bucket.used} of ${bucket.limit} used`;\n if (bucket.remaining !== undefined) value += ` \u00B7 ${bucket.remaining} left`;\n } else if (bucket.used !== undefined) {\n value = `${bucket.used} used`;\n } else if (bucket.remaining !== undefined) {\n value = `${bucket.remaining} left`;\n }\n lines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${value}${reset}`);\n }\n for (const metric of report.metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`);\n }\n}\n\nfunction formatOpenAICompanionReport(lines: string[], report: UsageReport): void {\n for (const group of [\"chatgpt-plan\", \"chatgpt-app\"]) {\n lines.push(group === \"chatgpt-plan\" ? \"Plan limits:\" : \"App limits:\");\n for (const bucket of report.buckets.filter((bucket) => bucket.groupId === group)) {\n const value =\n group === \"chatgpt-app\"\n ? bucket.resetsAt === undefined\n ? \"Reset time unavailable\"\n : `resets ${formatReset(bucket.resetsAt)}`\n : formatPercentBucket(bucket);\n lines.push(`${formatWindowLabel(bucket.windowMinutes, \"weekly\", false).padEnd(VALUE_COLUMN)}${value}`);\n }\n }\n for (const metric of report.metrics)\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`);\n}\n\nfunction formatGenericReport(lines: string[], report: UsageReport): void {\n for (const bucket of report.buckets) {\n lines.push(\n `${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(bucket.remaining ?? bucket.used ?? \"unavailable\", bucket.unit)}`,\n );\n }\n for (const metric of report.metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`);\n }\n}\n\nfunction formatCodexStatusline(\n report: UsageReport,\n model?: UsageModel,\n now = Date.now(),\n showResetCountdown = true,\n percentage: CodexStatusPercentage = \"remaining\",\n): string | undefined {\n const group = selectCodexGroup(report, model);\n if (!group) return formatCodexCreditsStatus(report);\n const buckets = report.buckets.filter((bucket) => (bucket.groupId ?? bucket.id) === group);\n const labelBucket = buckets[0];\n const parts = [group === \"codex\" ? \"codex\" : `codex ${compactLimitLabel(labelBucket?.groupLabel ?? group)}`];\n for (const bucket of buckets) {\n if (bucket.remaining === undefined) continue;\n const displayedPercentage = percentage === \"used\" ? (bucket.used ?? 100 - bucket.remaining) : bucket.remaining;\n const percent = `${clampPercent(displayedPercentage).toFixed(0)}%`;\n const fallback = bucket.id.endsWith(\":secondary\") ? \"weekly\" : \"5h\";\n const window = formatWindowLabel(bucket.windowMinutes, fallback, true);\n if (!showResetCountdown) {\n parts.push(`${percent} ${window}`);\n continue;\n }\n const reset = formatResetCountdown(bucket.resetsAt, now);\n parts.push(`${percent} ${reset ? `\u21BB ${reset}` : window}`);\n }\n return parts.length > 1 ? parts.join(\" \") : formatCodexCreditsStatus(report);\n}\n\nfunction formatCodexCreditsStatus(report: UsageReport): string {\n const credits = report.metrics.find((metric) => metric.id === \"credits\");\n if (!credits) return \"codex usage unavailable\";\n if (credits.value === \"none\") return \"codex no credits\";\n if (credits.value === \"available\") return \"codex credits available\";\n if (credits.value === \"unlimited\") return \"codex credits unlimited\";\n return `codex ${formatMetricValue(credits.value, \"count\")} credits`;\n}\n\nfunction selectCodexGroup(report: UsageReport, model?: UsageModel): string | undefined {\n const groups = [...new Set(report.buckets.map((bucket) => bucket.groupId ?? bucket.id))];\n if (model?.provider !== \"openai-codex\") {\n return groups.includes(\"codex\") ? \"codex\" : groups[0];\n }\n const modelKeys = normalizedModelKeys(model);\n for (const group of groups) {\n const bucket = report.buckets.find((candidate) => (candidate.groupId ?? candidate.id) === group);\n const keys = [group, bucket?.groupLabel, ...(bucket?.modelKeys ?? [])]\n .map(normalizeKey)\n .filter((key): key is string => key !== undefined);\n if (keys.some((key) => modelKeys.has(key))) return group;\n }\n const variants = [...modelKeys]\n .map((key) => key.match(/(?:^|-)codex-(.+)$/)?.[1])\n .filter((value): value is string => Boolean(value));\n for (const variant of variants) {\n const matches = groups.filter((group) => {\n if (group === \"codex\") return false;\n const key = normalizeKey(group);\n return key ? normalizedKeyHasToken(key, variant) : false;\n });\n if (matches.length === 1) return matches[0];\n }\n return groups.includes(\"codex\") ? \"codex\" : groups[0];\n}\n\nfunction normalizedModelKeys(model: UsageModel): Set<string> {\n const keys = new Set<string>();\n for (const value of [model.id, model.name]) {\n const key = normalizeKey(value);\n if (!key) continue;\n keys.add(key);\n const index = key.indexOf(\"codex\");\n if (index >= 0) keys.add(key.slice(index));\n }\n return keys;\n}\n\nfunction normalizeKey(value: string | undefined): string | undefined {\n const separated = value?.toLowerCase().replace(/[^a-z0-9]+/g, \"-\");\n if (!separated) return undefined;\n let start = 0;\n let end = separated.length;\n while (separated[start] === \"-\") start += 1;\n while (end > start && separated[end - 1] === \"-\") end -= 1;\n return separated.slice(start, end) || undefined;\n}\n\nfunction normalizedKeyHasToken(key: string, token: string): boolean {\n return key === token || key.startsWith(`${token}-`) || key.endsWith(`-${token}`) || key.includes(`-${token}-`);\n}\n\nfunction compactLimitLabel(label: string): string {\n const normalized = label.replace(/[_-]+/g, \" \").trim();\n const codex = /\\bcodex\\s/iu.exec(normalized);\n const suffix = codex ? normalized.slice(codex.index + codex[0].length).trim() : \"\";\n return (suffix || normalized).toLowerCase().replace(/\\s+/g, \" \");\n}\n\nfunction formatPercentBucket(bucket: UsageBucket): string {\n return `${formatPercentBar(bucket)}${bucket.resetsAt ? ` (resets ${formatReset(bucket.resetsAt)})` : \"\"}`;\n}\n\nfunction formatPercentBar(bucket: UsageBucket): string {\n const remaining = clampPercent(bucket.remaining ?? 0);\n const filled = Math.round((remaining / 100) * BAR_SEGMENTS);\n return `[${\"\u2588\".repeat(filled)}${\"\u2591\".repeat(BAR_SEGMENTS - filled)}] ${remaining.toFixed(0)}% left`;\n}\n\nfunction formatWindowLabel(minutes: number | undefined, fallback: \"5h\" | \"weekly\", compact: boolean): string {\n if (!minutes || !Number.isFinite(minutes) || minutes <= 0) {\n return compact && fallback === \"weekly\" ? \"wk\" : capitalize(fallback);\n }\n if (minutes === 10_080) return compact ? \"wk\" : \"Weekly\";\n if (minutes % 10_080 === 0) return `${minutes / 10_080}w`;\n if (minutes % 1_440 === 0) return `${minutes / 1_440}d`;\n if (minutes % 60 === 0) return `${minutes / 60}h`;\n return `${minutes}m`;\n}\n\nfunction formatResetCountdown(resetsAt: number | undefined, now: number): string | undefined {\n if (resetsAt === undefined || !Number.isFinite(resetsAt) || !Number.isFinite(now)) return undefined;\n const totalMinutes = Math.max(0, Math.ceil((resetsAt * 1_000 - now) / 60_000));\n const days = Math.floor(totalMinutes / 1_440);\n const hours = Math.floor((totalMinutes % 1_440) / 60);\n const minutes = totalMinutes % 60;\n if (days > 0) {\n return [`${String(days)}d`, hours > 0 ? `${String(hours)}h` : minutes > 0 ? `${String(minutes)}m` : \"\"]\n .filter(Boolean)\n .join(\"\");\n }\n if (hours > 0) return [`${String(hours)}h`, minutes > 0 ? `${String(minutes)}m` : \"\"].filter(Boolean).join(\"\");\n return `${String(minutes)}m`;\n}\n\nfunction formatMetricValue(value: number | string, unit: UsageBucket[\"unit\"] | undefined): string {\n if (unit === \"usd\" && typeof value === \"number\") return formatUsd(value);\n if (unit === \"percent\" && typeof value === \"number\") return `${value}%`;\n return String(value);\n}\n\nfunction formatUsd(value: number): string {\n return `$${value.toFixed(2)}`;\n}\n\nfunction formatReset(epochSeconds: number): string {\n const reset = new Date(epochSeconds * 1000);\n if (Number.isNaN(reset.getTime())) return \"at an unknown time\";\n const time = `${reset.getHours().toString().padStart(2, \"0\")}:${reset.getMinutes().toString().padStart(2, \"0\")}`;\n const now = new Date();\n if (reset.toDateString() === now.toDateString()) return time;\n return `${time} on ${reset.getDate()} ${reset.toLocaleDateString(undefined, { month: \"short\" })}`;\n}\n\nfunction capitalize(value: string): string {\n return `${value[0]?.toUpperCase() ?? \"\"}${value.slice(1)}`;\n}\n\nfunction clampPercent(value: number): number {\n return Math.min(100, Math.max(0, value));\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { constants } from \"node:fs\";\nimport { chmod, mkdir, open, rename, rm, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, join } from \"node:path\";\nimport { getAgentDir } from \"@earendil-works/pi-coding-agent\";\nimport { isFireworksAccountId } from \"./providers/fireworks.js\";\nimport { isBoundedTargetId } from \"./usage-targets.js\";\n\nexport const USAGE_SETTINGS_FILE = \"pi-usage.json\";\nexport const MAX_USAGE_SETTINGS_BYTES = 64 * 1024;\n\nexport type CodexStatusPercentage = \"remaining\" | \"used\";\n\nexport interface UsageSettings {\n codexFastMode: boolean;\n codexStatusResetCountdown: boolean;\n codexStatusPercentage: CodexStatusPercentage;\n selectedTargets: Record<string, string>;\n}\n\nexport const DEFAULT_USAGE_SETTINGS: Readonly<UsageSettings> = Object.freeze({\n codexFastMode: false,\n codexStatusResetCountdown: true,\n codexStatusPercentage: \"remaining\",\n selectedTargets: Object.freeze({}),\n});\n\nexport interface UsageSettingsState {\n kind: \"missing\" | \"loaded\" | \"invalid\";\n path: string;\n settings: UsageSettings;\n document?: Record<string, unknown>;\n issue?: string;\n}\n\nexport type UsageTargetPublicationCheck = () => Promise<void>;\n\nexport interface UsageSettingsRuntime {\n get(): Readonly<UsageSettingsState>;\n reload(signal?: AbortSignal): Promise<Readonly<UsageSettingsState>>;\n update(patch: Partial<UsageSettings>, signal?: AbortSignal): Promise<Readonly<UsageSettingsState>>;\n updateSelectedTarget(\n providerId: string,\n targetId: string,\n signal?: AbortSignal,\n checkPublishedSelection?: UsageTargetPublicationCheck,\n ): Promise<Readonly<UsageSettingsState>>;\n flush(): Promise<void>;\n}\n\ninterface UsageSettingsFileOperations {\n rename: typeof rename;\n writeFile: typeof writeFile;\n}\n\ninterface UsageSettingsRuntimeOptions {\n operations?: Partial<UsageSettingsFileOperations>;\n path?: string;\n}\n\nexport function usageSettingsPath(): string {\n return join(getAgentDir(), USAGE_SETTINGS_FILE);\n}\n\nexport function normalizeUsageSettings(value: unknown): UsageSettings | undefined {\n if (!isRecord(value)) return undefined;\n if (Object.hasOwn(value, \"codexFastMode\") && typeof value.codexFastMode !== \"boolean\") {\n return undefined;\n }\n if (Object.hasOwn(value, \"codexStatusResetCountdown\") && typeof value.codexStatusResetCountdown !== \"boolean\") {\n return undefined;\n }\n if (\n Object.hasOwn(value, \"codexStatusPercentage\") &&\n value.codexStatusPercentage !== \"remaining\" &&\n value.codexStatusPercentage !== \"used\"\n ) {\n return undefined;\n }\n if (Object.hasOwn(value, \"fireworksAccountId\") && !isFireworksAccountId(value.fireworksAccountId)) {\n return undefined;\n }\n const selectedTargets = normalizeSelectedTargets(value.selectedTargets);\n if (Object.hasOwn(value, \"selectedTargets\") && !selectedTargets) return undefined;\n const effectiveTargets = { ...(selectedTargets ?? {}) };\n if (!effectiveTargets.fireworks && isFireworksAccountId(value.fireworksAccountId)) {\n effectiveTargets.fireworks = value.fireworksAccountId;\n }\n return {\n codexFastMode:\n typeof value.codexFastMode === \"boolean\" ? value.codexFastMode : DEFAULT_USAGE_SETTINGS.codexFastMode,\n codexStatusResetCountdown:\n typeof value.codexStatusResetCountdown === \"boolean\"\n ? value.codexStatusResetCountdown\n : DEFAULT_USAGE_SETTINGS.codexStatusResetCountdown,\n codexStatusPercentage:\n value.codexStatusPercentage === \"used\" ? \"used\" : DEFAULT_USAGE_SETTINGS.codexStatusPercentage,\n selectedTargets: effectiveTargets,\n };\n}\n\nexport async function loadUsageSettings(path = usageSettingsPath(), signal?: AbortSignal): Promise<UsageSettingsState> {\n throwIfAborted(signal);\n try {\n const handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);\n let text: string;\n try {\n const stats = await handle.stat();\n throwIfAborted(signal);\n if (!stats.isFile()) throw new Error(\"settings path is not a regular file\");\n if (stats.size > MAX_USAGE_SETTINGS_BYTES) {\n throw new Error(\"settings file exceeds 64 KiB\");\n }\n text = await handle.readFile(\"utf8\");\n } finally {\n await handle.close();\n }\n throwIfAborted(signal);\n const document = JSON.parse(text) as unknown;\n const settings = normalizeUsageSettings(document);\n if (!settings || !isRecord(document)) throw new Error(\"invalid settings shape\");\n return { kind: \"loaded\", path, settings, document };\n } catch (error) {\n if (signal?.aborted) throw error;\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return {\n kind: \"missing\",\n path,\n settings: { ...DEFAULT_USAGE_SETTINGS },\n document: {},\n };\n }\n return {\n kind: \"invalid\",\n path,\n settings: { ...DEFAULT_USAGE_SETTINGS },\n issue:\n isNodeError(error) && error.code === \"ELOOP\"\n ? \"symbolic links are not accepted\"\n : error instanceof Error\n ? error.message\n : String(error),\n };\n }\n}\n\nexport function createUsageSettingsRuntime(options: UsageSettingsRuntimeOptions | string = {}): UsageSettingsRuntime {\n const path = typeof options === \"string\" ? options : (options.path ?? usageSettingsPath());\n const operations: UsageSettingsFileOperations = {\n rename,\n writeFile,\n ...(typeof options === \"string\" ? undefined : options.operations),\n };\n let state: UsageSettingsState = {\n kind: \"missing\",\n path,\n settings: { ...DEFAULT_USAGE_SETTINGS },\n document: {},\n };\n let queue = Promise.resolve();\n const enqueue = <T>(operation: () => Promise<T>): Promise<T> => {\n const result = queue.then(operation, operation);\n queue = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n };\n return {\n get: () => structuredClone(state),\n reload: (signal) =>\n enqueue(async () => {\n const loaded = await loadUsageSettings(path, signal);\n state = loaded;\n return structuredClone(state);\n }),\n update: (patch, signal) =>\n enqueue(async () => {\n const saved = await saveUsageSettingsPatch(path, patch, operations, signal);\n state = saved;\n return structuredClone(state);\n }),\n updateSelectedTarget: (providerId, targetId, signal, checkPublishedSelection) =>\n enqueue(async () => {\n const transaction = await saveUsageTargetSelection(path, providerId, targetId, operations, signal);\n try {\n await checkPublishedSelection?.();\n throwIfAborted(signal);\n } catch (error) {\n try {\n await restoreUsageSettingsState(path, transaction.saved, transaction.previous, operations);\n state = transaction.previous;\n } catch (rollbackError) {\n state = await loadUsageSettings(path);\n throw new AggregateError(\n [error, rollbackError],\n \"Target selection changed after publication and pi-usage.json rollback failed\",\n );\n }\n throw error;\n }\n state = transaction.saved;\n return structuredClone(state);\n }),\n flush: () => queue,\n };\n}\n\nasync function saveUsageSettingsPatch(\n path: string,\n patch: Partial<UsageSettings>,\n operations: UsageSettingsFileOperations,\n signal?: AbortSignal,\n): Promise<UsageSettingsState> {\n return saveUsageSettingsDocument(\n path,\n (document) => {\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) delete document[key];\n else document[key] = value;\n }\n },\n operations,\n signal,\n );\n}\n\nasync function saveUsageTargetSelection(\n path: string,\n providerId: string,\n targetId: string,\n operations: UsageSettingsFileOperations,\n signal?: AbortSignal,\n): Promise<{ saved: UsageSettingsState; previous: UsageSettingsState }> {\n if (!isProviderId(providerId) || !isBoundedTargetId(targetId)) {\n throw new Error(\"Refusing to save an invalid usage target selection\");\n }\n const previous = await loadUsageSettings(path, signal);\n const saved = await saveUsageSettingsDocument(\n path,\n (document) => {\n document.selectedTargets = {\n ...(normalizeSelectedTargets(document.selectedTargets) ?? {}),\n [providerId]: targetId,\n };\n if (providerId === \"fireworks\") delete document.fireworksAccountId;\n },\n operations,\n signal,\n previous,\n );\n return { saved, previous };\n}\n\nasync function saveUsageSettingsDocument(\n path: string,\n mutate: (document: Record<string, unknown>) => void,\n operations: UsageSettingsFileOperations,\n signal?: AbortSignal,\n expected?: UsageSettingsState,\n): Promise<UsageSettingsState> {\n const latest = await loadUsageSettings(path, signal);\n if (latest.kind === \"invalid\") {\n throw new Error(\"Cannot overwrite an invalid pi-usage.json; repair it and reload first\");\n }\n if (expected && !sameUsageSettingsDocument(latest, expected)) {\n throw new Error(\"pi-usage.json changed while saving; retry the action\");\n }\n const document = { ...latest.document };\n mutate(document);\n const settings = normalizeUsageSettings(document);\n if (!settings) throw new Error(\"Refusing to save invalid pi-usage settings\");\n const directory = dirname(path);\n const temporaryPath = join(directory, `.${basename(path)}.${randomUUID()}.tmp`);\n await mkdir(directory, { recursive: true, mode: 0o700 });\n throwIfAborted(signal);\n try {\n await operations.writeFile(temporaryPath, `${JSON.stringify(document, null, 2)}\\n`, {\n encoding: \"utf8\",\n flag: \"wx\",\n mode: 0o600,\n });\n if (process.platform !== \"win32\") await chmodPrivate(temporaryPath);\n throwIfAborted(signal);\n const current = await loadUsageSettings(path, signal);\n if (\n current.kind === \"invalid\" ||\n current.kind !== latest.kind ||\n JSON.stringify(current.document) !== JSON.stringify(latest.document)\n ) {\n throw new Error(\"pi-usage.json changed while saving; retry the action\");\n }\n throwIfAborted(signal);\n await operations.rename(temporaryPath, path);\n } finally {\n await rm(temporaryPath, { force: true }).catch(() => undefined);\n }\n return { kind: \"loaded\", path, settings, document };\n}\n\nasync function restoreUsageSettingsState(\n path: string,\n published: UsageSettingsState,\n previous: UsageSettingsState,\n operations: UsageSettingsFileOperations,\n): Promise<void> {\n if (previous.kind === \"missing\") {\n const current = await loadUsageSettings(path);\n if (!sameUsageSettingsDocument(current, published)) {\n throw new Error(\"pi-usage.json changed before target selection rollback\");\n }\n await rm(path);\n return;\n }\n if (previous.kind !== \"loaded\" || !previous.document) {\n throw new Error(\"Cannot restore invalid prior pi-usage.json settings\");\n }\n await saveUsageSettingsDocument(\n path,\n (document) => {\n for (const key of Object.keys(document)) delete document[key];\n Object.assign(document, previous.document);\n },\n operations,\n undefined,\n published,\n );\n}\n\nfunction sameUsageSettingsDocument(\n left: Pick<UsageSettingsState, \"kind\" | \"document\">,\n right: Pick<UsageSettingsState, \"kind\" | \"document\">,\n): boolean {\n return left.kind === right.kind && JSON.stringify(left.document) === JSON.stringify(right.document);\n}\n\nasync function chmodPrivate(path: string): Promise<void> {\n await chmod(path, 0o600);\n}\n\nfunction throwIfAborted(signal?: AbortSignal): void {\n if (signal?.aborted) throw new DOMException(\"Settings operation aborted\", \"AbortError\");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error;\n}\n\nfunction normalizeSelectedTargets(value: unknown): Record<string, string> | undefined {\n if (value === undefined) return {};\n if (!isRecord(value)) return undefined;\n const targets: Record<string, string> = {};\n for (const [providerId, targetId] of Object.entries(value)) {\n if (!isProviderId(providerId) || !isBoundedTargetId(targetId)) return undefined;\n targets[providerId] = targetId;\n }\n return targets;\n}\n\nfunction isProviderId(value: string): boolean {\n return /^[A-Za-z0-9][A-Za-z0-9._~-]{0,127}$/u.test(value);\n}\n", "// This orchestrator intentionally remains over 1,000 lines because its menu, query generations,\n// account cache, cancellation, and session lifecycle share one consistency boundary.\nimport { randomUUID } from \"node:crypto\";\nimport type { ExtensionAPI, ExtensionCommandContext, ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { FAST_USAGE_WARNING, registerCodexFastMode } from \"./codex-fast-runtime.js\";\nimport {\n type CodexResetAvailability,\n type CodexResetOption,\n type CodexResetOutcome,\n codexResetActionDescription,\n codexResetCount,\n consumeCodexResetCredit,\n formatCodexResetOutcome,\n genericCodexResetOption,\n listCodexResetCredits,\n resetConfirmationLines,\n resetLabel,\n resetOptionExpiration,\n resolveCodexResetAuth,\n} from \"./codex-resets.js\";\nimport { abortError, awaitWithDeadline, errorMessage, runWithConcurrency, UsageCache } from \"./core.js\";\nimport { formatProviderStates, formatUsageStatusline } from \"./format.js\";\nimport { createOAuthCredentialCandidateReader } from \"./oauth-credential-source.js\";\nimport { UnsupportedOpenAIUsageAuthError } from \"./providers/openai-chatgpt.js\";\nimport {\n adapterForProvider,\n isStaleExtensionContextError,\n queryProviderUsage,\n resolveUsageAuth as resolveRuntimeUsageAuth,\n} from \"./query.js\";\nimport { createUsageSettingsRuntime, type UsageSettingsRuntime, type UsageSettingsState } from \"./settings.js\";\nimport type {\n PiModel,\n ProviderUsageState,\n ResolvedUsageAuth,\n UsageDisplayState,\n UsageProviderAdapter,\n} from \"./types.js\";\nimport {\n configuredAdapters,\n isAbortError,\n isTimeoutError,\n modelIdentity,\n providerDisplayName,\n setBoundedMap,\n} from \"./usage-helpers.js\";\nimport { showUsageSettings } from \"./usage-settings-ui.js\";\nimport { createUsageTargetSelectOptions, listUsageTargets, resolveUsageTarget } from \"./usage-targets.js\";\n\nconst CACHE_TTL_MS = 5 * 60 * 1000;\nconst STATUS_COUNTDOWN_REFRESH_MS = 60 * 1000;\nconst DEFAULT_TIMEOUT_MS = 15_000;\nconst COMMAND_CODE_REVALIDATION_RESERVE_MS = 1_000;\nconst ALL_PROVIDER_CONCURRENCY = 2;\nconst FAILURE_BACKOFF_MS = 30_000;\nconst MAX_ACCOUNT_STATES = 32;\nconst STATUS_KEY = \"usage\";\n\nconst REFRESH_CURRENT = \"Refresh current usage\";\nconst VIEW_ANOTHER = \"View another configured provider\u2026\";\nconst VIEW_ALL = \"View all configured providers\u2026\";\nconst CLOSE = \"Close\";\nconst SETTINGS = \"Settings\";\nconst REDEEM_CODEX_RESET = \"Redeem usage limit reset\u2026\";\n\ntype UsageExtensionDependencies = {\n credentialReader?: (providerId: string) => unknown;\n createRedemptionId?: () => string;\n settingsRuntime?: UsageSettingsRuntime;\n};\n\ntype QueryOutcome = {\n state: ProviderUsageState;\n fingerprint?: string;\n authState?: \"unavailable\" | \"unsupported\" | \"failed\";\n rememberedTargetId?: string;\n};\n\nclass UsageTargetSelectionChangedError extends Error {\n override readonly name = \"UsageTargetSelectionChangedError\";\n}\n\ntype StableCurrent = {\n outcome: QueryOutcome;\n model: PiModel | undefined;\n};\n\nexport default function usageExtension(pi: ExtensionAPI, dependencies: UsageExtensionDependencies = {}) {\n const credentialReader = dependencies.credentialReader;\n const credentialCandidates = createOAuthCredentialCandidateReader(pi, credentialReader);\n const createRedemptionId = dependencies.createRedemptionId ?? randomUUID;\n const settingsRuntime = dependencies.settingsRuntime ?? createUsageSettingsRuntime();\n const resolveUsageAuth = resolveRuntimeUsageAuth;\n const cache = new UsageCache(CACHE_TTL_MS);\n const failureBackoff = new Map<string, { until: number; message: string }>();\n const latestQueries = new Map<string, number>();\n const activeControllers = new Set<AbortController>();\n const nativeQueryControllers = new Set<AbortController>();\n let querySequence = 0;\n let activeCurrentIdentity: string | undefined;\n let sessionActive = false;\n let statusGeneration = 0;\n let sessionGeneration = 0;\n let statusRefreshTimer: ReturnType<typeof setTimeout> | undefined;\n let statusCountdownTimer: ReturnType<typeof setTimeout> | undefined;\n let statusController: AbortController | undefined;\n let fastRuntime: ReturnType<typeof registerCodexFastMode>;\n\n const clearStatusRefreshTimer = () => {\n if (statusRefreshTimer) clearTimeout(statusRefreshTimer);\n statusRefreshTimer = undefined;\n };\n\n const clearStatusCountdownTimer = () => {\n if (statusCountdownTimer) clearTimeout(statusCountdownTimer);\n statusCountdownTimer = undefined;\n };\n\n const clearStatusTimers = () => {\n clearStatusRefreshTimer();\n clearStatusCountdownTimer();\n };\n\n const safeSetStatus = (ctx: ExtensionContext, value: string | undefined): boolean => {\n try {\n ctx.ui.setStatus(STATUS_KEY, value);\n return true;\n } catch (error) {\n if (isStaleExtensionContextError(error)) return false;\n throw error;\n }\n };\n\n const clearStatus = (ctx: ExtensionContext) => {\n statusGeneration += 1;\n statusController?.abort();\n statusController = undefined;\n clearStatusTimers();\n safeSetStatus(ctx, undefined);\n };\n\n const scheduleStatusRefresh = (ctx: ExtensionContext, model: PiModel) => {\n clearStatusRefreshTimer();\n const generation = statusGeneration;\n statusRefreshTimer = setTimeout(() => {\n statusRefreshTimer = undefined;\n if (!sessionActive || generation !== statusGeneration) return;\n startStatusRefresh(ctx, model, true);\n }, CACHE_TTL_MS);\n statusRefreshTimer.unref?.();\n };\n\n const publishStatus = (ctx: ExtensionContext, outcome: QueryOutcome, model: PiModel, shouldSchedule: boolean) => {\n clearStatusCountdownTimer();\n if (adapterForProvider(model.provider)?.publishesStatusline === false) {\n clearStatusRefreshTimer();\n safeSetStatus(ctx, undefined);\n return;\n }\n if (outcome.state.status === \"unsupported\") {\n clearStatusRefreshTimer();\n safeSetStatus(ctx, undefined);\n return;\n }\n if (outcome.state.status !== \"ready\") {\n const chip =\n outcome.state.status === \"auth-unavailable\"\n ? \"auth unavailable\"\n : outcome.state.status === \"selection-required\"\n ? \"selection required\"\n : `usage err: ${outcome.state.message.slice(0, 50)}`;\n\n if (safeSetStatus(ctx, chip)) {\n if (shouldSchedule && sessionActive) scheduleStatusRefresh(ctx, model);\n }\n return;\n }\n const settings = settingsRuntime.get().settings;\n const showCodexResetCountdown =\n outcome.state.report.providerId === \"openai-codex\" && settings.codexStatusResetCountdown;\n const isCompanionReport = outcome.state.report.source === \"openai-chatgpt-companion\";\n const now = Date.now();\n const rawValue = formatUsageStatusline(\n outcome.state.report,\n model,\n now,\n showCodexResetCountdown,\n settings.codexStatusPercentage,\n );\n const value = rawValue ? fastRuntime.decorateStatus(model, rawValue) : undefined;\n if (!safeSetStatus(ctx, value)) return;\n if (shouldSchedule && sessionActive) scheduleStatusRefresh(ctx, model);\n if (\n sessionActive &&\n (showCodexResetCountdown || isCompanionReport) &&\n outcome.state.report.buckets.some(\n (bucket) =>\n (!isCompanionReport || bucket.groupId === \"chatgpt-plan\") &&\n bucket.resetsAt !== undefined &&\n Number.isFinite(bucket.resetsAt) &&\n bucket.resetsAt * 1_000 > now,\n )\n ) {\n const generation = statusGeneration;\n statusCountdownTimer = setTimeout(() => {\n statusCountdownTimer = undefined;\n if (!sessionActive || generation !== statusGeneration) return;\n publishStatus(ctx, outcome, model, false);\n }, STATUS_COUNTDOWN_REFRESH_MS);\n statusCountdownTimer.unref?.();\n }\n };\n\n const invalidateProviderState = (providerId: string) => {\n cache.clearProvider(providerId);\n for (const key of failureBackoff.keys()) {\n if (key.startsWith(`${providerId}:`)) failureBackoff.delete(key);\n }\n for (const key of latestQueries.keys()) {\n if (key.startsWith(`${providerId}:`)) latestQueries.delete(key);\n }\n };\n\n const transitionCurrentIdentity = (nextIdentity: string, providerId: string) => {\n if (!activeCurrentIdentity || activeCurrentIdentity === nextIdentity) {\n activeCurrentIdentity = nextIdentity;\n return;\n }\n const previousProviderId = activeCurrentIdentity.split(\":\", 1)[0] ?? \"\";\n for (const id of new Set([previousProviderId, providerId])) {\n if (id) invalidateProviderState(id);\n }\n activeCurrentIdentity = nextIdentity;\n };\n\n const queryAdapterStateInternal = async (\n ctx: ExtensionContext,\n adapter: UsageProviderAdapter,\n displayState: UsageDisplayState,\n force: boolean,\n signal: AbortSignal,\n authRetry = 0,\n deadlineAt = Date.now() + DEFAULT_TIMEOUT_MS,\n ): Promise<QueryOutcome> => {\n const expectedSessionGeneration = sessionGeneration;\n const expectedSessionId = ctx.sessionManager.getSessionId();\n const expectedModelIdentity = modelIdentity(ctx.model);\n const expectedTargetId = adapter.targets ? settingsRuntime.get().settings.selectedTargets[adapter.id] : undefined;\n const providerName = providerDisplayName(ctx, adapter.id);\n let auth: ResolvedUsageAuth | undefined;\n try {\n auth = await awaitWithDeadline(\n resolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n signal,\n Math.max(1, deadlineAt - Date.now()),\n `resolving ${adapter.displayName} runtime auth`,\n );\n } catch (error) {\n if (isStaleExtensionContextError(error) || isAbortError(error)) throw error;\n if (adapter.id === \"openai\") invalidateProviderState(adapter.id);\n const authState =\n error instanceof UnsupportedOpenAIUsageAuthError\n ? \"unsupported\"\n : adapter.id === \"openai\" && !isTimeoutError(error)\n ? \"failed\"\n : undefined;\n if (displayState === \"current\") {\n transitionCurrentIdentity(`${adapter.id}:auth-error`, adapter.id);\n }\n return {\n state: {\n providerId: adapter.id,\n providerName,\n displayState,\n status:\n authState === \"unsupported\" ? \"unsupported\" : isTimeoutError(error) ? \"query-failed\" : \"auth-unavailable\",\n message: errorMessage(error),\n },\n ...(authState ? { authState } : {}),\n };\n }\n const requiresRequestBoundaryGuard =\n adapter.targets !== undefined ||\n [\n \"baseten\",\n \"command-code\",\n \"deepseek\",\n \"minimax\",\n \"minimax-cn\",\n \"moonshotai\",\n \"moonshotai-cn\",\n \"openai\",\n \"vercel-ai-gateway\",\n \"xai\",\n \"zai\",\n \"zai-coding-cn\",\n ].includes(adapter.id);\n const requestContextChanged = () =>\n expectedSessionGeneration !== sessionGeneration ||\n ctx.sessionManager.getSessionId() !== expectedSessionId ||\n modelIdentity(ctx.model) !== expectedModelIdentity ||\n (adapter.targets !== undefined &&\n settingsRuntime.get().settings.selectedTargets[adapter.id] !== expectedTargetId);\n if (requiresRequestBoundaryGuard && requestContextChanged()) throw abortError();\n if (!auth) {\n if (adapter.id === \"openai\") invalidateProviderState(adapter.id);\n if (displayState === \"current\") {\n transitionCurrentIdentity(`${adapter.id}:unavailable`, adapter.id);\n }\n return {\n state: {\n providerId: adapter.id,\n providerName,\n displayState,\n status: \"auth-unavailable\",\n message: `No runtime credential is configured for ${providerName}.`,\n },\n authState: \"unavailable\",\n };\n }\n if (adapter.id === \"openai\" && !auth.openaiCompanion) invalidateProviderState(adapter.id);\n let retryableAuthChanged = false;\n const guard = async () => {\n if (signal.aborted || requestContextChanged()) throw abortError();\n if (!requiresRequestBoundaryGuard) return;\n const revalidated = await awaitWithDeadline(\n resolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n signal,\n Math.max(1, deadlineAt - Date.now()),\n `revalidating ${providerName} runtime auth`,\n );\n if (signal.aborted || requestContextChanged()) throw abortError();\n if (revalidated?.fingerprint !== auth.fingerprint) {\n if ([\"deepseek\", \"minimax\", \"minimax-cn\"].includes(adapter.id)) {\n retryableAuthChanged = true;\n throw new Error(`${providerName} runtime credential changed during the usage query.`);\n }\n throw abortError();\n }\n };\n let queryFingerprint = adapter.targets\n ? `${auth.fingerprint}:target:${expectedTargetId ?? \"unresolved\"}`\n : auth.fingerprint;\n let failureKey = `${adapter.id}:${queryFingerprint}`;\n let queryId: number | undefined;\n try {\n const previousDiscoveryFailure = failureBackoff.get(failureKey);\n if (!force && previousDiscoveryFailure && previousDiscoveryFailure.until > Date.now()) {\n return {\n state: {\n providerId: adapter.id,\n providerName,\n displayState,\n status: \"query-failed\",\n message: previousDiscoveryFailure.message,\n },\n fingerprint: auth.fingerprint,\n rememberedTargetId: expectedTargetId,\n };\n }\n const target = await resolveUsageTarget(\n adapter,\n auth,\n expectedTargetId,\n signal,\n Math.max(1, deadlineAt - Date.now()),\n guard,\n );\n if (target.kind === \"selection-required\") {\n if (displayState === \"current\") {\n transitionCurrentIdentity(`${adapter.id}:${queryFingerprint}`, adapter.id);\n }\n return {\n state: {\n providerId: adapter.id,\n providerName,\n displayState,\n status: \"selection-required\",\n singularLabel: adapter.targets?.singularLabel ?? \"target\",\n pluralLabel: adapter.targets?.pluralLabel ?? \"targets\",\n choices: target.choices,\n },\n fingerprint: auth.fingerprint,\n rememberedTargetId: expectedTargetId,\n };\n }\n queryFingerprint = adapter.targets ? `${auth.fingerprint}:target:${target.targetId ?? \"none\"}` : auth.fingerprint;\n failureKey = `${adapter.id}:${queryFingerprint}`;\n if (displayState === \"current\") {\n transitionCurrentIdentity(`${adapter.id}:${queryFingerprint}`, adapter.id);\n }\n const cached = !force ? cache.get(adapter.id, queryFingerprint) : undefined;\n if (cached) {\n return {\n state: {\n providerId: adapter.id,\n providerName,\n displayState,\n status: \"ready\",\n report: cached,\n },\n fingerprint: auth.fingerprint,\n rememberedTargetId: expectedTargetId,\n };\n }\n const previousFailure = failureBackoff.get(failureKey);\n if (!force && previousFailure && previousFailure.until > Date.now()) {\n return {\n state: {\n providerId: adapter.id,\n providerName,\n displayState,\n status: \"query-failed\",\n message: previousFailure.message,\n },\n fingerprint: auth.fingerprint,\n rememberedTargetId: expectedTargetId,\n };\n }\n failureBackoff.delete(failureKey);\n querySequence += 1;\n queryId = querySequence;\n setBoundedMap(latestQueries, failureKey, queryId, MAX_ACCOUNT_STATES);\n // Command Code can retain partial data after an optional transport timeout. Keep time\n // inside the overall deadline for its remaining auth guards and publication guard.\n const queryTimeoutMs = Math.max(\n 1,\n deadlineAt - Date.now() - (adapter.id === \"command-code\" ? COMMAND_CODE_REVALIDATION_RESERVE_MS : 0),\n );\n const report = await queryProviderUsage(\n adapter,\n auth,\n signal,\n queryTimeoutMs,\n requiresRequestBoundaryGuard ? guard : undefined,\n target.targetId,\n );\n if (requiresRequestBoundaryGuard) await guard();\n const effectiveReport = { ...report, providerName };\n if (latestQueries.get(failureKey) === queryId) {\n cache.set(adapter.id, queryFingerprint, effectiveReport);\n failureBackoff.delete(failureKey);\n }\n return {\n state: {\n providerId: adapter.id,\n providerName,\n displayState,\n status: \"ready\",\n report: effectiveReport,\n },\n fingerprint: auth.fingerprint,\n rememberedTargetId: expectedTargetId,\n };\n } catch (error) {\n if (isStaleExtensionContextError(error) || isAbortError(error)) throw error;\n if (\n retryableAuthChanged &&\n authRetry === 0 &&\n !signal.aborted &&\n !requestContextChanged() &&\n Date.now() < deadlineAt\n ) {\n if (queryId !== undefined && latestQueries.get(failureKey) === queryId) {\n latestQueries.delete(failureKey);\n }\n return queryAdapterState(ctx, adapter, displayState, true, signal, authRetry + 1, deadlineAt);\n }\n const message = errorMessage(error);\n const now = Date.now();\n for (const [key, failure] of failureBackoff) {\n if (failure.until <= now) failureBackoff.delete(key);\n }\n if (queryId === undefined || latestQueries.get(failureKey) === queryId) {\n if (adapter.invalidateCacheOnFailure) cache.delete(adapter.id, queryFingerprint);\n setBoundedMap(failureBackoff, failureKey, { until: now + FAILURE_BACKOFF_MS, message }, MAX_ACCOUNT_STATES);\n }\n return {\n state: {\n providerId: adapter.id,\n providerName,\n displayState,\n status: \"query-failed\",\n message,\n },\n fingerprint: auth.fingerprint,\n rememberedTargetId: expectedTargetId,\n };\n }\n };\n\n const queryAdapterState = async (...args: Parameters<typeof queryAdapterStateInternal>): Promise<QueryOutcome> => {\n const [ctx, adapter, displayState, force, signal, ...rest] = args;\n if (adapter.id !== \"openai\") return queryAdapterStateInternal(...args);\n const controller = new AbortController();\n nativeQueryControllers.add(controller);\n try {\n return await queryAdapterStateInternal(\n ctx,\n adapter,\n displayState,\n force,\n AbortSignal.any([signal, controller.signal]),\n ...rest,\n );\n } finally {\n nativeQueryControllers.delete(controller);\n }\n };\n\n const loadTargetChoices = async (ctx: ExtensionContext, adapter: UsageProviderAdapter, signal: AbortSignal) => {\n if (!adapter.targets) throw new Error(\"Provider does not support usage targets.\");\n const expectedSessionGeneration = sessionGeneration;\n const expectedSessionId = ctx.sessionManager.getSessionId();\n const expectedModel = modelIdentity(ctx.model);\n const expectedTargetId = settingsRuntime.get().settings.selectedTargets[adapter.id];\n const deadlineAt = Date.now() + DEFAULT_TIMEOUT_MS;\n const changed = () =>\n expectedSessionGeneration !== sessionGeneration ||\n ctx.sessionManager.getSessionId() !== expectedSessionId ||\n modelIdentity(ctx.model) !== expectedModel ||\n settingsRuntime.get().settings.selectedTargets[adapter.id] !== expectedTargetId;\n const auth = await awaitWithDeadline(\n resolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n signal,\n Math.max(1, deadlineAt - Date.now()),\n `resolving ${providerDisplayName(ctx, adapter.id)} runtime auth`,\n );\n if (!auth || signal.aborted || changed()) throw abortError();\n const guard = async () => {\n if (signal.aborted || changed()) throw abortError();\n const revalidated = await awaitWithDeadline(\n resolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n signal,\n Math.max(1, deadlineAt - Date.now()),\n `revalidating ${providerDisplayName(ctx, adapter.id)} runtime auth`,\n );\n if (signal.aborted || changed() || revalidated?.fingerprint !== auth.fingerprint) {\n throw abortError();\n }\n };\n const choices = await listUsageTargets(adapter, auth, signal, Math.max(1, deadlineAt - Date.now()), guard);\n return { choices, fingerprint: auth.fingerprint };\n };\n\n const queryCurrentState = async (\n ctx: ExtensionContext,\n model: PiModel | undefined,\n force: boolean,\n signal: AbortSignal,\n ): Promise<QueryOutcome> => {\n const adapter = adapterForProvider(model?.provider);\n if (!adapter) {\n const providerId = model?.provider ?? \"none\";\n transitionCurrentIdentity(`unsupported:${providerId}`, providerId);\n return {\n state: {\n providerId,\n providerName: providerDisplayName(ctx, providerId),\n displayState: \"current\",\n status: \"unsupported\",\n message: model\n ? `Usage reporting is not supported for ${providerDisplayName(ctx, providerId)}.`\n : \"No model is selected.\",\n },\n };\n }\n return queryAdapterState(ctx, adapter, \"current\", force, signal);\n };\n\n const refreshCurrentStatus = async (ctx: ExtensionContext, model: PiModel | undefined, force: boolean) => {\n const adapter = adapterForProvider(model?.provider);\n if (!adapter || !model) {\n const providerId = model?.provider ?? \"none\";\n transitionCurrentIdentity(`unsupported:${providerId}`, providerId);\n clearStatus(ctx);\n return;\n }\n if (adapter.publishesStatusline === false) {\n clearStatus(ctx);\n return;\n }\n statusGeneration += 1;\n const generation = statusGeneration;\n clearStatusCountdownTimer();\n statusController?.abort();\n const controller = new AbortController();\n statusController = controller;\n activeControllers.add(controller);\n try {\n if (!safeSetStatus(ctx, \"checking\")) return;\n const outcome = await queryCurrentState(ctx, model, force, controller.signal);\n if (!sessionActive || generation !== statusGeneration || controller.signal.aborted) return;\n if (!(await outcomeStillCurrent(ctx, model, generation, outcome, controller.signal))) {\n if (sessionActive && generation === statusGeneration) {\n queueMicrotask(() => startStatusRefresh(ctx, ctx.model, false));\n }\n return;\n }\n publishStatus(ctx, outcome, model, true);\n } finally {\n activeControllers.delete(controller);\n if (statusController === controller) statusController = undefined;\n }\n };\n\n const startStatusRefresh = (ctx: ExtensionContext, model: PiModel | undefined, force: boolean) => {\n void refreshCurrentStatus(ctx, model, force).catch((error) => {\n if (isStaleExtensionContextError(error) || isAbortError(error)) return;\n const message = errorMessage(error);\n console.error(\"[pi-usage] refresh failed:\", message);\n safeSetStatus(ctx, `usage err: ${message.slice(0, 50)}`);\n });\n };\n\n const runMenuOperation = async <T>(\n ctx: ExtensionCommandContext,\n label: string,\n parentSignal: AbortSignal,\n operation: (signal: AbortSignal) => Promise<T>,\n cancellable = true,\n ): Promise<T | undefined> => {\n const { runTask } = await import(\"@narumitw/pi-tui-kit\");\n if (parentSignal.aborted) return undefined;\n const result = await runTask(ctx, {\n label,\n signal: parentSignal,\n cancellable,\n onError: () => undefined,\n task: ({ signal }) => operation(signal),\n });\n switch (result.kind) {\n case \"completed\":\n return result.value;\n case \"cancelled\":\n case \"stale\":\n return undefined;\n case \"error\":\n throw result.error;\n }\n };\n\n const outcomeStillCurrent = async (\n ctx: ExtensionContext,\n model: PiModel | undefined,\n generation: number,\n outcome: QueryOutcome,\n signal: AbortSignal,\n ): Promise<boolean> => {\n if (generation !== statusGeneration || modelIdentity(ctx.model) !== modelIdentity(model)) {\n return false;\n }\n const adapter = adapterForProvider(outcome.state.providerId);\n const selectionStillCurrent =\n !adapter?.targets || settingsRuntime.get().settings.selectedTargets[adapter.id] === outcome.rememberedTargetId;\n if (!selectionStillCurrent) return false;\n if (outcome.authState) {\n if (!adapter) return false;\n try {\n const auth = await awaitWithDeadline(\n resolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n signal,\n DEFAULT_TIMEOUT_MS,\n `revalidating ${adapter.displayName} runtime auth`,\n );\n return (\n generation === statusGeneration &&\n modelIdentity(ctx.model) === modelIdentity(model) &&\n (!adapter.targets ||\n settingsRuntime.get().settings.selectedTargets[adapter.id] === outcome.rememberedTargetId) &&\n outcome.authState === \"unavailable\" &&\n auth === undefined\n );\n } catch (error) {\n if (isAbortError(error) || isStaleExtensionContextError(error)) throw error;\n // Stable failures are still useful. A recovered credential or changed reason must\n // retry, but confirming the same native failure must not create a refresh loop.\n const unchangedFailure =\n (outcome.authState === \"unsupported\" && error instanceof UnsupportedOpenAIUsageAuthError) ||\n (outcome.authState === \"failed\" &&\n outcome.state.status === \"auth-unavailable\" &&\n !(error instanceof UnsupportedOpenAIUsageAuthError) &&\n !isTimeoutError(error) &&\n errorMessage(error) === outcome.state.message);\n return (\n unchangedFailure &&\n generation === statusGeneration &&\n modelIdentity(ctx.model) === modelIdentity(model) &&\n (!adapter.targets ||\n settingsRuntime.get().settings.selectedTargets[adapter.id] === outcome.rememberedTargetId)\n );\n }\n }\n if (!outcome.fingerprint) return true;\n if (!adapter) return false;\n try {\n const auth = await awaitWithDeadline(\n resolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n signal,\n DEFAULT_TIMEOUT_MS,\n `revalidating ${adapter.displayName} runtime auth`,\n );\n return (\n generation === statusGeneration &&\n modelIdentity(ctx.model) === modelIdentity(model) &&\n (!adapter.targets ||\n settingsRuntime.get().settings.selectedTargets[adapter.id] === outcome.rememberedTargetId) &&\n auth?.fingerprint === outcome.fingerprint\n );\n } catch (error) {\n if (isAbortError(error) || isStaleExtensionContextError(error)) throw error;\n return false;\n }\n };\n\n const queryStableAdapterState = async (\n ctx: ExtensionContext,\n adapter: UsageProviderAdapter,\n displayState: UsageDisplayState,\n force: boolean,\n signal: AbortSignal,\n ): Promise<QueryOutcome> => {\n if (adapter.id !== \"openai\") return queryAdapterState(ctx, adapter, displayState, force, signal);\n // Configured/all-provider views must confirm native auth failures too, independently\n // of the selected provider's subsequent revalidation.\n for (let attempt = 0; attempt < 3; attempt += 1) {\n const model = ctx.model;\n const generation = statusGeneration;\n const outcome = await queryAdapterState(ctx, adapter, displayState, force, signal);\n if (signal.aborted) throw abortError();\n if (await outcomeStillCurrent(ctx, model, generation, outcome, signal)) return outcome;\n force = false;\n }\n throw new Error(\"OpenAI runtime authentication kept changing; reopen /usage to retry.\");\n };\n\n const queryStableCurrent = async (\n ctx: ExtensionCommandContext,\n force: boolean,\n controller: AbortController,\n label: string,\n ): Promise<StableCurrent | undefined> => {\n for (let attempt = 0; attempt < 3; attempt += 1) {\n const model = ctx.model;\n const generation = statusGeneration;\n const result = await runMenuOperation(ctx, label, controller.signal, async (signal) => {\n const outcome = await queryCurrentState(ctx, model, force, signal);\n return {\n outcome,\n stable: await outcomeStillCurrent(ctx, model, generation, outcome, signal),\n };\n });\n if (!result) return undefined;\n if (result.stable) return { outcome: result.outcome, model };\n force = false;\n }\n ctx.ui.notify(\"The active model or account kept changing; reopen /usage to retry.\", \"warning\");\n return undefined;\n };\n\n const publishStableCurrent = (ctx: ExtensionCommandContext, current: StableCurrent) => {\n if (current.model) publishStatus(ctx, current.outcome, current.model, sessionActive);\n else safeSetStatus(ctx, undefined);\n };\n\n const showMenu = async (ctx: ExtensionCommandContext): Promise<void> => {\n if (!ctx.hasUI) throw new Error(\"/usage requires TUI or RPC mode.\");\n statusGeneration += 1;\n const menuGeneration = statusGeneration;\n statusController?.abort();\n statusController = undefined;\n clearStatusTimers();\n const controller = new AbortController();\n activeControllers.add(controller);\n try {\n let stableCurrent = await queryStableCurrent(ctx, false, controller, \"Checking current usage\u2026\");\n if (!stableCurrent) return;\n publishStableCurrent(ctx, stableCurrent);\n let current = stableCurrent.outcome;\n let visibleStates: ProviderUsageState[] = [current.state];\n let fastState = settingsRuntime.get();\n let resetAvailability: CodexResetAvailability | undefined;\n let selectedReset: CodexResetOption | undefined;\n let resetAuthFingerprint: string | undefined;\n let resetModelIdentity: string | undefined;\n let redemptionId: string | undefined;\n let resetOutcome: CodexResetOutcome | undefined;\n let resetFailure: string | undefined;\n const actionableTargetState = (): ProviderUsageState | undefined => {\n if (visibleStates.length !== 1) return undefined;\n const state = visibleStates[0];\n return state &&\n (state.status === \"ready\" || state.status === \"selection-required\") &&\n adapterForProvider(state.providerId)?.targets\n ? state\n : undefined;\n };\n const promptForTarget = async (state: ProviderUsageState, stateFingerprint?: string): Promise<boolean> => {\n const adapter = adapterForProvider(state.providerId);\n if (!adapter?.targets) return false;\n const expectedRememberedTargetId = settingsRuntime.get().settings.selectedTargets[adapter.id];\n const snapshot =\n state.status === \"selection-required\" && stateFingerprint\n ? { choices: state.choices, fingerprint: stateFingerprint }\n : await runMenuOperation(ctx, `Loading ${adapter.targets.pluralLabel}\u2026`, controller.signal, (signal) =>\n loadTargetChoices(ctx, adapter, signal),\n );\n if (!snapshot || controller.signal.aborted || statusGeneration !== menuGeneration) {\n return false;\n }\n const selectOptions = createUsageTargetSelectOptions(snapshot.choices);\n const selected = await ctx.ui.select(\n `Select ${adapter.targets.singularLabel} for ${providerDisplayName(ctx, adapter.id)}`,\n [...selectOptions.options],\n { signal: controller.signal },\n );\n if (\n selected === undefined ||\n controller.signal.aborted ||\n statusGeneration !== menuGeneration ||\n settingsRuntime.get().settings.selectedTargets[adapter.id] !== expectedRememberedTargetId\n ) {\n return false;\n }\n const targetId = selectOptions.targetIdFor(selected);\n if (!targetId) return false;\n const revalidated = await runMenuOperation(\n ctx,\n `Revalidating ${adapter.targets.singularLabel}\u2026`,\n controller.signal,\n (signal) => loadTargetChoices(ctx, adapter, signal),\n );\n if (\n !revalidated ||\n controller.signal.aborted ||\n statusGeneration !== menuGeneration ||\n settingsRuntime.get().settings.selectedTargets[adapter.id] !== expectedRememberedTargetId\n ) {\n return false;\n }\n if (\n revalidated.fingerprint !== snapshot.fingerprint ||\n !revalidated.choices.some((choice) => choice.id === targetId)\n ) {\n ctx.ui.notify(\n `${providerDisplayName(ctx, adapter.id)} ${adapter.targets.pluralLabel} changed; choose again.`,\n \"warning\",\n );\n return false;\n }\n let saved: Readonly<UsageSettingsState> | undefined;\n try {\n saved = await runMenuOperation(ctx, `Saving ${adapter.targets.singularLabel}\u2026`, controller.signal, (signal) =>\n settingsRuntime.updateSelectedTarget(adapter.id, targetId, signal, async () => {\n let published: Awaited<ReturnType<typeof loadTargetChoices>>;\n try {\n published = await loadTargetChoices(ctx, adapter, signal);\n } catch (error) {\n if (\n signal.aborted ||\n controller.signal.aborted ||\n statusGeneration !== menuGeneration ||\n isStaleExtensionContextError(error)\n ) {\n throw error;\n }\n throw new UsageTargetSelectionChangedError();\n }\n if (\n published.fingerprint !== snapshot.fingerprint ||\n !published.choices.some((choice) => choice.id === targetId)\n ) {\n throw new UsageTargetSelectionChangedError();\n }\n }),\n );\n } catch (error) {\n if (error instanceof UsageTargetSelectionChangedError) {\n ctx.ui.notify(\n `${providerDisplayName(ctx, adapter.id)} ${adapter.targets.pluralLabel} changed; choose again.`,\n \"warning\",\n );\n return false;\n }\n throw error;\n }\n if (!saved || controller.signal.aborted || statusGeneration !== menuGeneration) {\n return false;\n }\n invalidateProviderState(adapter.id);\n return true;\n };\n const { defineMenu, runMenu } = await import(\"@narumitw/pi-tui-kit\");\n if (controller.signal.aborted || statusGeneration !== menuGeneration) return;\n type Screen = \"main\" | \"providers\" | \"reset-picker\" | \"reset-confirm\" | \"reset-result\" | \"reset-error\";\n type Action =\n | \"refresh\"\n | \"settings\"\n | \"target\"\n | \"toggle-fast\"\n | \"another\"\n | \"all\"\n | \"provider\"\n | \"open-resets\"\n | \"select-reset\"\n | \"cancel-reset\"\n | \"consume-reset\"\n | \"back-to-usage\"\n | \"back-to-resets\";\n const menu = defineMenu<undefined, Screen, Action, ExtensionCommandContext>({\n start: \"main\",\n screens: {\n main: () => {\n const fastAvailability = fastRuntime.availability(ctx.model);\n const targetState = actionableTargetState();\n const targetAdapter = adapterForProvider(targetState?.providerId);\n const fastLines =\n fastAvailability.kind === \"available\"\n ? [`Fast mode: ${fastAvailability.enabled ? \"On\" : \"Off\"}`, FAST_USAGE_WARNING]\n : fastAvailability.kind === \"unavailable\"\n ? [`Fast mode: Unavailable \u00B7 ${fastAvailability.reason}`]\n : [];\n return {\n kind: \"actions\",\n title: \"Provider usage\",\n lines: [...formatProviderStates(visibleStates).split(\"\\n\"), ...fastLines],\n items: [\n { id: \"refresh\", label: REFRESH_CURRENT, action: \"refresh\" },\n { id: \"settings\", label: SETTINGS, action: \"settings\" },\n ...(targetState && targetAdapter?.targets\n ? [\n {\n id: \"target\",\n label: `${targetState.status === \"selection-required\" ? \"Select\" : \"Change\"} ${targetAdapter.targets.singularLabel}\u2026`,\n action: \"target\" as const,\n },\n ]\n : []),\n ...(fastAvailability.kind === \"available\"\n ? [\n {\n id: \"toggle-fast\",\n label: fastAvailability.enabled ? \"Turn Fast mode off\" : \"Turn Fast mode on\",\n description:\n fastState.kind === \"invalid\"\n ? \"Repair pi-usage.json and reload before changing Fast mode.\"\n : FAST_USAGE_WARNING,\n disabled: fastState.kind === \"invalid\",\n action: \"toggle-fast\" as const,\n },\n ]\n : []),\n ...(current.state.status === \"ready\" && current.state.providerId === \"openai-codex\"\n ? [\n {\n id: \"open-resets\",\n label: REDEEM_CODEX_RESET,\n description: codexResetActionDescription(current.state.report),\n disabled: codexResetCount(current.state.report) === 0,\n action: \"open-resets\" as const,\n },\n ]\n : []),\n { id: \"another\", label: VIEW_ANOTHER, action: \"another\" },\n { id: \"all\", label: VIEW_ALL, action: \"all\" },\n { id: \"close\", label: CLOSE, close: true },\n ],\n hint: \"close\",\n };\n },\n providers: () => ({\n kind: \"actions\",\n title: \"Select a configured provider\",\n items: configuredAdapters(ctx)\n .filter((adapter) => adapter.id !== ctx.model?.provider)\n .map((adapter) => ({\n id: adapter.id,\n label: providerDisplayName(ctx, adapter.id),\n action: \"provider\" as const,\n })),\n hint: \"back\",\n }),\n \"reset-picker\": () => ({\n kind: \"choice\",\n title: \"Usage limit resets\",\n lines: [\n `${resetAvailability?.availableCount ?? 0} ${resetLabel(resetAvailability?.availableCount ?? 0)} available.`,\n ],\n items: (resetAvailability?.options ?? []).map((option, index) => ({\n id: `reset-${index}`,\n label: option.title,\n description: resetOptionExpiration(option),\n details: [option.description],\n })),\n action: \"select-reset\",\n initialItemId: \"reset-0\",\n hint: \"back\",\n }),\n \"reset-confirm\": () => ({\n kind: \"actions\",\n title: \"Use this reset?\",\n lines: resetConfirmationLines(selectedReset),\n items: [\n { id: \"cancel-reset\", label: \"No, go back\", action: \"cancel-reset\" },\n { id: \"consume-reset\", label: \"Yes, use reset\", action: \"consume-reset\" },\n ],\n hint: \"back\",\n }),\n \"reset-result\": () => ({\n kind: \"actions\",\n title: \"Usage limit resets\",\n lines: [\n formatCodexResetOutcome(\n resetOutcome,\n current.state.status === \"ready\" ? codexResetCount(current.state.report) : undefined,\n ),\n ],\n items: [\n {\n id: \"back-to-usage\",\n label: \"Back to usage\",\n action: \"back-to-usage\",\n },\n { id: \"close\", label: CLOSE, close: true },\n ],\n hint: \"back\",\n }),\n \"reset-error\": () => ({\n kind: \"actions\",\n title: \"Usage limit resets\",\n lines: [resetFailure ?? \"Couldn't reset usage. Please try again.\"],\n items: [\n { id: \"consume-reset\", label: \"Try again\", action: \"consume-reset\" },\n { id: \"back-to-resets\", label: \"Back\", action: \"back-to-resets\" },\n ],\n hint: \"back\",\n }),\n },\n actions: {\n target: async () => {\n const targetState = actionableTargetState();\n if (!targetState) return { kind: \"rejected\" };\n try {\n const stateFingerprint = targetState === current.state ? current.fingerprint : undefined;\n if (!(await promptForTarget(targetState, stateFingerprint))) {\n return { kind: \"stay\" };\n }\n const adapter = adapterForProvider(targetState.providerId);\n if (!adapter) return { kind: \"rejected\" };\n if (targetState.providerId === ctx.model?.provider) {\n const refreshed = await queryStableCurrent(\n ctx,\n true,\n controller,\n `Checking ${providerDisplayName(ctx, adapter.id)} usage\u2026`,\n );\n if (!refreshed) return { kind: \"stay\" };\n stableCurrent = refreshed;\n current = refreshed.outcome;\n visibleStates = [current.state];\n publishStableCurrent(ctx, refreshed);\n return { kind: \"stay\" };\n }\n const outcome = await runMenuOperation(\n ctx,\n `Checking ${providerDisplayName(ctx, adapter.id)} usage\u2026`,\n controller.signal,\n (signal) => queryStableAdapterState(ctx, adapter, \"configured\", true, signal),\n );\n if (!outcome) return { kind: \"stay\" };\n const revalidated = await queryStableCurrent(ctx, false, controller, \"Revalidating current usage\u2026\");\n if (!revalidated) return { kind: \"stay\" };\n stableCurrent = revalidated;\n current = revalidated.outcome;\n visibleStates = [\n outcome.state.providerId === current.state.providerId\n ? current.state\n : { ...outcome.state, displayState: \"configured\" },\n ];\n return { kind: \"stay\" };\n } catch (error) {\n if (isAbortError(error) || isStaleExtensionContextError(error)) {\n return { kind: \"stay\" };\n }\n ctx.ui.notify(`Could not select target: ${errorMessage(error)}`, \"error\");\n return { kind: \"stay\" };\n }\n },\n settings: async () => {\n await showUsageSettings(\n ctx,\n settingsRuntime,\n controller.signal,\n () => statusGeneration === menuGeneration && !controller.signal.aborted,\n (id) => {\n if (\n (id === \"codexStatusResetCountdown\" || id === \"codexStatusPercentage\") &&\n stableCurrent &&\n statusGeneration === menuGeneration &&\n !controller.signal.aborted\n ) {\n publishStableCurrent(ctx, stableCurrent);\n }\n },\n );\n fastState = settingsRuntime.get();\n const revalidated = await queryStableCurrent(ctx, false, controller, \"Applying usage settings\u2026\");\n if (!revalidated) return { kind: \"stay\" };\n stableCurrent = revalidated;\n current = revalidated.outcome;\n visibleStates = [current.state];\n publishStableCurrent(ctx, revalidated);\n return { kind: \"stay\" };\n },\n \"toggle-fast\": async () => {\n const availability = fastRuntime.availability(ctx.model);\n if (availability.kind !== \"available\" || fastState.kind === \"invalid\") {\n return { kind: \"rejected\" };\n }\n const changed = await fastRuntime.toggle(ctx, !availability.enabled, controller.signal);\n if (!changed) return { kind: \"rejected\" };\n fastState = settingsRuntime.get();\n return { kind: \"stay\" };\n },\n \"open-resets\": async () => {\n const summaryCount =\n current.state.status === \"ready\" && current.state.providerId === \"openai-codex\"\n ? codexResetCount(current.state.report)\n : undefined;\n try {\n const loaded = await runMenuOperation(\n ctx,\n \"Checking usage limit resets\u2026\",\n controller.signal,\n async (signal) => {\n const expectedModel = modelIdentity(ctx.model);\n const auth = await awaitWithDeadline(\n resolveCodexResetAuth(ctx, undefined, credentialReader, credentialCandidates),\n signal,\n DEFAULT_TIMEOUT_MS,\n \"resolving current Codex reset authentication\",\n );\n let availability: CodexResetAvailability;\n try {\n availability = await listCodexResetCredits(auth, signal, DEFAULT_TIMEOUT_MS);\n } catch (error) {\n if (isAbortError(error) || summaryCount === undefined || summaryCount <= 0) {\n throw error;\n }\n availability = {\n availableCount: summaryCount,\n options: [genericCodexResetOption()],\n };\n }\n const revalidated = await awaitWithDeadline(\n resolveCodexResetAuth(ctx, undefined, credentialReader, credentialCandidates),\n signal,\n DEFAULT_TIMEOUT_MS,\n \"revalidating current Codex reset authentication\",\n );\n if (modelIdentity(ctx.model) !== expectedModel || revalidated.fingerprint !== auth.fingerprint) {\n throw new Error(\"The active Codex model or account changed while loading usage limit resets.\");\n }\n return { availability, auth, expectedModel };\n },\n );\n if (!loaded) return { kind: \"stay\" };\n resetAvailability = loaded.availability;\n resetAuthFingerprint = loaded.auth.fingerprint;\n resetModelIdentity = loaded.expectedModel;\n selectedReset = undefined;\n redemptionId = undefined;\n resetOutcome = undefined;\n resetFailure = undefined;\n return {\n kind: \"to\",\n screen: loaded.availability.availableCount > 0 ? \"reset-picker\" : \"reset-result\",\n };\n } catch (error) {\n if (isAbortError(error) || isStaleExtensionContextError(error)) {\n return { kind: \"stay\" };\n }\n ctx.ui.notify(`Couldn't load usage limit resets: ${errorMessage(error)}`, \"error\");\n return { kind: \"stay\" };\n }\n },\n \"select-reset\": ({ itemId }) => {\n const index = Number(itemId.replace(/^reset-/u, \"\"));\n const option = Number.isSafeInteger(index) ? resetAvailability?.options[index] : undefined;\n if (!option) return { kind: \"rejected\" };\n selectedReset = option;\n redemptionId = undefined;\n resetFailure = undefined;\n return { kind: \"to\", screen: \"reset-confirm\" };\n },\n \"cancel-reset\": () => ({ kind: \"back\" }),\n \"consume-reset\": async () => {\n if (!selectedReset || !resetAuthFingerprint || !resetModelIdentity) {\n return { kind: \"rejected\" };\n }\n try {\n redemptionId ??= createRedemptionId();\n const attemptId = redemptionId;\n const option = selectedReset;\n const expectedFingerprint = resetAuthFingerprint;\n const expectedModel = resetModelIdentity;\n const result = await runMenuOperation(\n ctx,\n \"Resetting your usage\u2026\",\n controller.signal,\n async (signal) => {\n const auth = await awaitWithDeadline(\n resolveCodexResetAuth(ctx, undefined, credentialReader, credentialCandidates),\n signal,\n DEFAULT_TIMEOUT_MS,\n \"revalidating current Codex reset authentication\",\n );\n if (modelIdentity(ctx.model) !== expectedModel || auth.fingerprint !== expectedFingerprint) {\n throw new Error(\"The active Codex model or account changed; the reset was not used.\");\n }\n const outcome = await consumeCodexResetCredit(auth, option, attemptId, signal, DEFAULT_TIMEOUT_MS);\n invalidateProviderState(\"openai-codex\");\n const model = ctx.model;\n if (modelIdentity(model) !== expectedModel) return { outcome };\n const refreshed = await queryCurrentState(ctx, model, true, signal);\n const stable = await outcomeStillCurrent(ctx, model, menuGeneration, refreshed, signal);\n return stable ? { outcome, refreshed, model } : { outcome };\n },\n false,\n );\n if (!result) return { kind: \"close\" };\n resetOutcome = result.outcome;\n resetFailure = undefined;\n if (result.refreshed && result.model) {\n stableCurrent = { outcome: result.refreshed, model: result.model };\n current = result.refreshed;\n visibleStates = [current.state];\n publishStableCurrent(ctx, stableCurrent);\n }\n return { kind: \"to\", screen: \"reset-result\" };\n } catch (error) {\n if (isAbortError(error) || isStaleExtensionContextError(error)) {\n return { kind: \"close\" };\n }\n resetFailure = `Couldn't reset usage: ${errorMessage(error)}. Try again with the same request.`;\n return { kind: \"to\", screen: \"reset-error\" };\n }\n },\n \"back-to-usage\": () => ({ kind: \"to\", screen: \"main\" }),\n \"back-to-resets\": () => {\n redemptionId = undefined;\n resetFailure = undefined;\n return { kind: \"to\", screen: \"reset-picker\" };\n },\n refresh: async () => {\n const refreshed = await queryStableCurrent(ctx, true, controller, \"Refreshing current usage\u2026\");\n if (!refreshed) return { kind: \"stay\" };\n stableCurrent = refreshed;\n publishStableCurrent(ctx, refreshed);\n current = refreshed.outcome;\n visibleStates = [current.state];\n return { kind: \"stay\" };\n },\n another: async () => {\n const others = configuredAdapters(ctx).filter((adapter) => adapter.id !== ctx.model?.provider);\n if (others.length === 0) {\n ctx.ui.notify(\"No other supported provider has configured runtime auth.\", \"info\");\n return { kind: \"stay\" };\n }\n return { kind: \"to\", screen: \"providers\" };\n },\n provider: async ({ itemId }) => {\n const adapter = configuredAdapters(ctx).find(\n (candidate) => candidate.id === itemId && candidate.id !== ctx.model?.provider,\n );\n if (!adapter) return { kind: \"back\" };\n let outcome = await runMenuOperation(\n ctx,\n `Checking ${providerDisplayName(ctx, adapter.id)} usage\u2026`,\n controller.signal,\n (signal) => queryStableAdapterState(ctx, adapter, \"configured\", false, signal),\n );\n if (!outcome) return { kind: \"back\" };\n if (outcome.state.status === \"selection-required\") {\n if (!(await promptForTarget(outcome.state, outcome.fingerprint))) {\n return { kind: \"back\" };\n }\n outcome = await runMenuOperation(\n ctx,\n `Checking ${providerDisplayName(ctx, adapter.id)} usage\u2026`,\n controller.signal,\n (signal) => queryStableAdapterState(ctx, adapter, \"configured\", true, signal),\n );\n if (!outcome) return { kind: \"back\" };\n }\n const revalidated = await queryStableCurrent(ctx, false, controller, \"Revalidating current usage\u2026\");\n if (!revalidated) return { kind: \"back\" };\n // Current-provider revalidation can await unrelated work after the configured\n // native report was checked. Refresh its identity at the publication boundary.\n if (adapter.id === \"openai\") {\n outcome = await runMenuOperation(\n ctx,\n \"Revalidating ChatGPT companion usage\u2026\",\n controller.signal,\n (signal) => queryStableAdapterState(ctx, adapter, \"configured\", false, signal),\n );\n if (!outcome) return { kind: \"back\" };\n }\n stableCurrent = revalidated;\n current = revalidated.outcome;\n visibleStates = [\n outcome.state.providerId === current.state.providerId\n ? current.state\n : { ...outcome.state, displayState: \"configured\" },\n ];\n return { kind: \"back\" };\n },\n all: async () => {\n const adapters = configuredAdapters(ctx);\n const currentProviderId = ctx.model?.provider;\n const settled = await runMenuOperation(\n ctx,\n \"Checking configured provider usage\u2026\",\n controller.signal,\n (signal) =>\n runWithConcurrency(\n adapters,\n ALL_PROVIDER_CONCURRENCY,\n (adapter, _index, workerSignal) =>\n queryStableAdapterState(\n ctx,\n adapter,\n adapter.id === currentProviderId ? \"current\" : \"configured\",\n true,\n workerSignal,\n ),\n signal,\n ),\n );\n if (!settled) return { kind: \"stay\" };\n const queriedStates: ProviderUsageState[] = settled.map((result, index) => {\n if (result.status === \"fulfilled\") {\n return { ...result.value.state, displayState: \"configured\" };\n }\n const adapter = adapters[index] as UsageProviderAdapter;\n return {\n providerId: adapter.id,\n providerName: providerDisplayName(ctx, adapter.id),\n displayState: \"configured\",\n status: \"query-failed\",\n message: errorMessage(result.reason),\n };\n });\n const revalidated = await queryStableCurrent(ctx, false, controller, \"Revalidating current usage\u2026\");\n if (!revalidated) return { kind: \"stay\" };\n const nativeIndex = adapters.findIndex(\n (adapter) => adapter.id === \"openai\" && adapter.id !== currentProviderId,\n );\n if (nativeIndex >= 0) {\n const nativeAdapter = adapters[nativeIndex];\n if (nativeAdapter) {\n const native = await runMenuOperation(\n ctx,\n \"Revalidating ChatGPT companion usage\u2026\",\n controller.signal,\n (signal) => queryStableAdapterState(ctx, nativeAdapter, \"configured\", false, signal),\n );\n if (!native) return { kind: \"stay\" };\n queriedStates[nativeIndex] = native.state;\n }\n }\n stableCurrent = revalidated;\n current = revalidated.outcome;\n visibleStates = [\n current.state,\n ...queriedStates.filter((state) => state.providerId !== current.state.providerId),\n ];\n return { kind: \"stay\" };\n },\n },\n });\n await runMenu(ctx, menu, {\n getState: () => undefined,\n signal: controller.signal,\n isCurrent: () => statusGeneration === menuGeneration && !controller.signal.aborted,\n });\n } finally {\n controller.abort(new DOMException(\"Usage menu closed\", \"AbortError\"));\n activeControllers.delete(controller);\n }\n };\n\n pi.registerCommand(\"usage\", {\n description: \"Show usage for the current runtime account\",\n handler: async (args, ctx) => {\n if (args.trim()) {\n ctx.ui.notify(\"/usage does not accept arguments; choose an action from its menu.\", \"warning\");\n return;\n }\n try {\n await showMenu(ctx);\n } catch (error) {\n if (isStaleExtensionContextError(error) || isAbortError(error)) return;\n throw error;\n }\n },\n });\n pi.on(\"session_start\", async (_event, ctx) => {\n sessionGeneration += 1;\n statusGeneration += 1;\n clearStatusTimers();\n for (const controller of activeControllers) controller.abort();\n activeControllers.clear();\n statusController = undefined;\n sessionActive = true;\n const ownerGeneration = sessionGeneration;\n try {\n await fastRuntime.prepareSession(ctx);\n } catch (error) {\n if (isStaleExtensionContextError(error) || ownerGeneration !== sessionGeneration) return;\n throw error;\n }\n });\n pi.on(\"session_tree\", (_event, ctx) => {\n startStatusRefresh(ctx, ctx.model, false);\n });\n pi.on(\"model_select\", (event, ctx) => {\n // Cancel read-only native queries, not confirmed legacy reset mutations.\n for (const controller of nativeQueryControllers) controller.abort();\n startStatusRefresh(ctx, event.model, false);\n });\n pi.on(\"turn_start\", (_event, ctx) => {\n startStatusRefresh(ctx, ctx.model, false);\n });\n pi.on(\"session_shutdown\", (_event, ctx) => {\n sessionActive = false;\n sessionGeneration += 1;\n statusGeneration += 1;\n clearStatusTimers();\n for (const controller of activeControllers) controller.abort();\n activeControllers.clear();\n statusController = undefined;\n cache.clear();\n failureBackoff.clear();\n latestQueries.clear();\n activeCurrentIdentity = undefined;\n safeSetStatus(ctx, undefined);\n });\n\n fastRuntime = registerCodexFastMode(pi, settingsRuntime, (ctx) => startStatusRefresh(ctx, ctx.model, false), {\n registerSessionStart: false,\n });\n}\n", "import type { ExtensionAPI, ExtensionCommandContext, ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport {\n codexFastAvailability,\n codexFastIsEffective,\n codexFastStatusLabel,\n correctCodexFastMessageCost,\n rewriteCodexFastPayload,\n} from \"./codex-fast.js\";\nimport { errorMessage } from \"./core.js\";\nimport { isStaleExtensionContextError } from \"./query.js\";\nimport type { UsageSettingsRuntime, UsageSettingsState } from \"./settings.js\";\nimport type { PiModel } from \"./types.js\";\n\nconst NO_FAST_REQUEST = Symbol(\"no-fast-request\");\ntype PendingFastRequest = { fastRequested: boolean; model: PiModel };\n\nexport const FAST_USAGE_WARNING = \"Fast is about 1.5\u00D7 faster and uses more of your plan allowance.\";\n\nexport function registerCodexFastMode(\n pi: ExtensionAPI,\n settingsRuntime: UsageSettingsRuntime,\n refreshStatus: (ctx: ExtensionContext) => void,\n options: { registerSessionStart?: boolean } = {},\n) {\n let sessionController = new AbortController();\n let generation = 0;\n const pendingFastRequests = new Map<string, PendingFastRequest>();\n\n const toggle = async (\n ctx: ExtensionCommandContext,\n enabled: boolean,\n callerSignal?: AbortSignal,\n ): Promise<boolean> => {\n const ownerGeneration = generation;\n const sessionId = ctx.sessionManager.getSessionId();\n const signal = callerSignal ? AbortSignal.any([callerSignal, sessionController.signal]) : sessionController.signal;\n try {\n await settingsRuntime.update({ codexFastMode: enabled }, signal);\n } catch (error) {\n if (isAbortError(error) || isStaleExtensionContextError(error)) return false;\n ctx.ui.notify(`Could not save pi-usage.json: ${errorMessage(error)}`, \"error\");\n return false;\n }\n if (signal.aborted || ownerGeneration !== generation || ctx.sessionManager.getSessionId() !== sessionId) {\n return false;\n }\n refreshStatus(ctx);\n ctx.ui.notify(\n enabled\n ? `Codex Fast mode enabled. ${FAST_USAGE_WARNING}`\n : \"Codex Fast mode disabled; standard routing will be used.\",\n \"info\",\n );\n return true;\n };\n\n pi.registerCommand(\"fast\", {\n description: \"Toggle Codex Fast mode\",\n handler: async (args, ctx) => {\n if (args.trim()) {\n if (!ctx.hasUI) throw new Error(\"/fast does not accept arguments.\");\n ctx.ui.notify(\"/fast does not accept arguments.\", \"warning\");\n return;\n }\n if (!ctx.hasUI) throw new Error(\"/fast requires TUI or RPC mode.\");\n const availability = codexFastAvailability(ctx.model, settingsRuntime.get().settings.codexFastMode);\n if (availability.kind === \"not-codex\") {\n ctx.ui.notify(\"/fast is available only for the active OpenAI Codex model.\", \"warning\");\n return;\n }\n if (availability.kind === \"unavailable\") {\n ctx.ui.notify(availability.reason, \"warning\");\n return;\n }\n if (settingsRuntime.get().kind === \"invalid\") {\n ctx.ui.notify(\"pi-usage.json is invalid; repair it and run /reload before changing Fast mode.\", \"error\");\n return;\n }\n await toggle(ctx, !availability.enabled);\n },\n });\n\n const prepareSession = (ctx: ExtensionContext): Promise<void> => {\n const sessionId = ctx.sessionManager.getSessionId();\n generation += 1;\n sessionController.abort();\n pendingFastRequests.clear();\n sessionController = new AbortController();\n const ownerGeneration = generation;\n return (async () => {\n let state: Readonly<UsageSettingsState>;\n try {\n state = await settingsRuntime.reload(sessionController.signal);\n } catch (error) {\n if (sessionController.signal.aborted || ownerGeneration !== generation) return;\n if (ctx.hasUI) {\n ctx.ui.notify(`Could not load pi-usage.json; using defaults. ${errorMessage(error)}`, \"warning\");\n }\n return;\n }\n if (\n sessionController.signal.aborted ||\n ownerGeneration !== generation ||\n ctx.sessionManager.getSessionId() !== sessionId\n ) {\n return;\n }\n if (ctx.hasUI && state.kind === \"invalid\") {\n ctx.ui.notify(`Invalid pi-usage.json; using defaults without overwriting it. ${state.issue}`, \"warning\");\n }\n refreshStatus(ctx);\n })();\n };\n\n if (options.registerSessionStart !== false) {\n pi.on(\"session_start\", async (_event, ctx) => prepareSession(ctx));\n }\n\n pi.on(\"before_provider_request\", (event, ctx) => {\n const rewritten = rewriteCodexFastPayload(event.payload, ctx.model, settingsRuntime.get().settings.codexFastMode);\n const key = activeRequestKey(ctx);\n if (key && ctx.model) {\n pendingFastRequests.set(key, {\n fastRequested: isRecord(rewritten) && rewritten.service_tier === \"priority\",\n model: ctx.model,\n });\n }\n return rewritten;\n });\n pi.on(\"message_end\", (event, ctx) => {\n const request = consumeFastRequest(ctx, event.message, pendingFastRequests);\n if (request === NO_FAST_REQUEST) return undefined;\n const message = correctCodexFastMessageCost(event.message, request.model, request.fastRequested);\n return message ? { message: message as never } : undefined;\n });\n pi.on(\"session_shutdown\", async () => {\n generation += 1;\n sessionController.abort();\n pendingFastRequests.clear();\n await settingsRuntime.flush();\n });\n\n return {\n prepareSession,\n availability(model: PiModel | undefined) {\n return codexFastAvailability(model, settingsRuntime.get().settings.codexFastMode);\n },\n decorateStatus(model: PiModel | undefined, status: string) {\n return codexFastStatusLabel(status, codexFastIsEffective(model, settingsRuntime.get().settings.codexFastMode));\n },\n toggle,\n };\n}\n\nfunction activeRequestKey(ctx: ExtensionContext): string | undefined {\n const model = ctx.model;\n return model ? `${ctx.sessionManager.getSessionId()}:${model.provider}/${model.id}` : undefined;\n}\n\nfunction consumeFastRequest(\n ctx: ExtensionContext,\n message: unknown,\n pending: Map<string, PendingFastRequest>,\n): PendingFastRequest | typeof NO_FAST_REQUEST {\n if (!isRecord(message) || message.role !== \"assistant\") return NO_FAST_REQUEST;\n const key = messageRequestKey(ctx, message);\n if (!key) return NO_FAST_REQUEST;\n const request = pending.get(key);\n pending.delete(key);\n return request ?? NO_FAST_REQUEST;\n}\n\nfunction messageRequestKey(ctx: ExtensionContext, message: Record<string, unknown>): string | undefined {\n if (typeof message.provider !== \"string\" || typeof message.model !== \"string\") return undefined;\n return `${ctx.sessionManager.getSessionId()}:${message.provider}/${message.model}`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === \"AbortError\";\n}\n", "import type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { sanitizeDisplayText } from \"./core.js\";\nimport { providerIsConfigured, usageAdapters } from \"./query.js\";\nimport type { PiModel, UsageProviderAdapter } from \"./types.js\";\n\nexport function configuredAdapters(ctx: ExtensionContext): UsageProviderAdapter[] {\n return usageAdapters().filter(\n (adapter) => adapter.id === ctx.model?.provider || providerIsConfigured(ctx, adapter.id),\n );\n}\n\nexport function providerDisplayName(ctx: ExtensionContext, providerId: string): string {\n try {\n return sanitizeDisplayText(ctx.modelRegistry.getProviderDisplayName(providerId), 80);\n } catch {\n return sanitizeDisplayText(providerId, 80);\n }\n}\n\nexport function setBoundedMap<T>(map: Map<string, T>, key: string, value: T, limit: number): void {\n map.delete(key);\n while (map.size >= limit) {\n const oldest = map.keys().next().value;\n if (oldest === undefined) break;\n map.delete(oldest);\n }\n map.set(key, value);\n}\n\nexport function modelIdentity(model: PiModel | undefined): string | undefined {\n return model ? `${model.provider}/${model.id}` : undefined;\n}\n\nexport function isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === \"AbortError\";\n}\n\nexport function isTimeoutError(error: unknown): boolean {\n return error instanceof Error && error.name === \"TimeoutError\";\n}\n", "import { stripVTControlCharacters } from \"node:util\";\nimport { type ExtensionCommandContext, getSettingsListTheme } from \"@earendil-works/pi-coding-agent\";\nimport { Key, matchesKey, type SettingItem, SettingsList, Text } from \"@earendil-works/pi-tui\";\nimport { errorMessage } from \"./core.js\";\nimport type { UsageSettings, UsageSettingsRuntime } from \"./settings.js\";\n\nconst OFF = \"Off\";\nconst ON = \"On\";\nconst REMAINING = \"Remaining\";\nconst USED = \"Used\";\n\ntype UsageSettingId = \"codexFastMode\" | \"codexStatusResetCountdown\" | \"codexStatusPercentage\";\n\nfunction settingValueLabel(id: UsageSettingId, value: UsageSettings[UsageSettingId]): string {\n if (id === \"codexStatusPercentage\") return value === \"used\" ? USED : REMAINING;\n return value === true ? ON : OFF;\n}\n\nexport async function showUsageSettings(\n ctx: ExtensionCommandContext,\n settingsRuntime: UsageSettingsRuntime,\n parentSignal: AbortSignal,\n isCurrent: () => boolean,\n onApplied: (id: UsageSettingId) => void,\n): Promise<boolean> {\n if (ctx.mode !== \"tui\") {\n if (ctx.hasUI) ctx.ui.notify(`Edit settings manually: ${settingsRuntime.get().path}`, \"info\");\n return false;\n }\n const { HorizontalRule, renderBoundedFrame } = await import(\"@narumitw/pi-tui-kit\");\n if (parentSignal.aborted || !isCurrent()) return false;\n let changed = false;\n return ctx.ui.custom<boolean>((tui, theme, _keybindings, done) => {\n const localController = new AbortController();\n const signal = AbortSignal.any([parentSignal, localController.signal]);\n let closing = false;\n let saveQueue = Promise.resolve();\n const state = settingsRuntime.get();\n const items: SettingItem[] = [\n {\n id: \"codexFastMode\",\n label: \"Codex Fast mode\",\n description: \"Use faster Codex routing at increased plan allowance consumption.\",\n currentValue: state.settings.codexFastMode ? ON : OFF,\n values: [OFF, ON],\n },\n {\n id: \"codexStatusResetCountdown\",\n label: \"Codex reset countdown\",\n description: \"Show time remaining until each Codex usage limit resets.\",\n currentValue: state.settings.codexStatusResetCountdown ? ON : OFF,\n values: [OFF, ON],\n },\n {\n id: \"codexStatusPercentage\",\n label: \"Codex percentage\",\n description: \"Show remaining or used Codex quota in the statusline.\",\n currentValue: settingValueLabel(\"codexStatusPercentage\", state.settings.codexStatusPercentage),\n values: [REMAINING, USED],\n },\n ];\n const rule = new HorizontalRule({ ruleStyle: (text) => theme.fg(\"border\", text) });\n\n let settingsList: SettingsList;\n const close = (result: boolean) => {\n if (closing) return;\n closing = true;\n localController.abort();\n done(result);\n };\n const cancel = () => close(changed);\n const queueUpdate = <Id extends UsageSettingId>(id: Id, requested: UsageSettings[Id], display: string) => {\n saveQueue = saveQueue.then(async () => {\n if (signal.aborted || !isCurrent()) return;\n const previous = settingsRuntime.get().settings[id];\n if (settingsRuntime.get().kind === \"invalid\") {\n settingsList.updateValue(id, settingValueLabel(id, previous));\n if (!signal.aborted && isCurrent()) {\n ctx.ui.notify(\"Repair pi-usage.json and reload before changing settings.\", \"error\");\n tui.requestRender();\n }\n return;\n }\n try {\n const patch: Partial<UsageSettings> = {};\n patch[id] = requested;\n await settingsRuntime.update(patch, signal);\n } catch (error) {\n if (signal.aborted || !isCurrent()) return;\n settingsList.updateValue(id, settingValueLabel(id, previous));\n ctx.ui.notify(`Could not save pi-usage.json: ${errorMessage(error)}`, \"error\");\n tui.requestRender();\n return;\n }\n // A rename can win a cancellation race. Apply owned lifecycle cleanup after a\n // durable save, but let the owner guard its session before touching UI.\n if (previous !== requested) {\n changed = true;\n onApplied(id);\n }\n if (signal.aborted || !isCurrent()) return;\n settingsList.updateValue(id, display);\n tui.requestRender();\n });\n };\n settingsList = new SettingsList(\n items,\n items.length + 2,\n getSettingsListTheme(),\n (id, value) => {\n if (closing || signal.aborted || !isCurrent()) return;\n if (id === \"codexStatusPercentage\") {\n queueUpdate(id, value === USED ? \"used\" : \"remaining\", value);\n } else if (id === \"codexFastMode\" || id === \"codexStatusResetCountdown\") {\n queueUpdate(id, value === ON, value);\n }\n },\n cancel,\n );\n\n parentSignal.addEventListener(\"abort\", cancel, { once: true });\n return {\n render(width: number) {\n // Compatibility: Kit puts the title directly below the top rule and keeps compact\n // rules when at least five rows fit; both replace the legacy wrapper layout.\n const title = new Text(theme.fg(\"accent\", theme.bold(\"pi-usage Settings\")), 1, 0).render(width);\n const content = settingsList.render(width);\n const focusedRow = content.findIndex((line) => /^[\u2192\u203A]\\s/u.test(stripVTControlCharacters(line)));\n const terminalRows = Number.isFinite(tui.terminal?.rows) ? Math.floor(tui.terminal.rows) : 24;\n const [ruleLine = \"\"] = rule.render(width);\n return renderBoundedFrame({\n width,\n maxRows: Math.max(1, terminalRows - 3),\n rule: ruleLine,\n title,\n content,\n priorityRows: focusedRow < 0 ? [] : [focusedRow],\n focusedRow,\n });\n },\n invalidate: () => settingsList.invalidate(),\n handleInput(data: string) {\n if (closing) return;\n if (matchesKey(data, Key.ctrl(\"c\"))) cancel();\n else settingsList.handleInput(data);\n tui.requestRender();\n },\n dispose() {\n localController.abort();\n parentSignal.removeEventListener(\"abort\", cancel);\n },\n };\n });\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["bucket", "isRecord", "randomUUID", "isRecord", "isAbortError", "
|
|
3
|
+
"sources": ["../src/codex-fast.ts", "../src/codex-resets.ts", "../src/format.ts", "../src/settings.ts", "../src/usage.ts", "../src/codex-fast-catalog.ts", "../src/usage-helpers.ts", "../src/codex-fast-runtime.ts", "../src/usage-settings-ui.ts"],
|
|
4
|
+
"sourcesContent": ["import { calculateCost, hasApi } from \"@earendil-works/pi-ai\";\nimport type { PiModel } from \"./types.js\";\n\nexport const CODEX_FAST_SERVICE_TIER = \"priority\";\nexport const CODEX_STANDARD_SERVICE_TIER = \"default\";\n\nexport type CodexFastCapability = { kind: \"supported\" } | { kind: \"unsupported\" } | { kind: \"unknown\"; reason: string };\n\nexport const UNKNOWN_CODEX_FAST_CAPABILITY = {\n kind: \"unknown\",\n reason: \"Codex Fast capability information has not been fetched.\",\n} as const;\n\nexport type CodexFastAvailability =\n | { kind: \"available\"; enabled: boolean }\n | { kind: \"not-codex\" }\n | { kind: \"unavailable\"; reason: string }\n | { kind: \"unknown\"; reason: string };\n\nexport function codexFastAvailability(\n model: PiModel | undefined,\n enabled: boolean,\n capability: CodexFastCapability = UNKNOWN_CODEX_FAST_CAPABILITY,\n): CodexFastAvailability {\n if (model?.provider !== \"openai-codex\") return { kind: \"not-codex\" };\n if (!isOfficialCodexModel(model)) {\n return {\n kind: \"unavailable\",\n reason: \"Fast mode requires the official OpenAI Codex Responses endpoint.\",\n };\n }\n if (capability.kind === \"unknown\") return capability;\n if (capability.kind === \"unsupported\") {\n return {\n kind: \"unavailable\",\n reason: `${model.id} does not advertise Codex Fast support.`,\n };\n }\n return { kind: \"available\", enabled };\n}\n\nexport function codexFastIsEffective(\n model: PiModel | undefined,\n enabled: boolean,\n capability: CodexFastCapability = UNKNOWN_CODEX_FAST_CAPABILITY,\n): boolean {\n return codexFastAvailability(model, enabled, capability).kind === \"available\" && enabled;\n}\n\nexport function codexFastRequestTier(\n model: PiModel | undefined,\n enabled: boolean,\n capability: CodexFastCapability = UNKNOWN_CODEX_FAST_CAPABILITY,\n): typeof CODEX_FAST_SERVICE_TIER | typeof CODEX_STANDARD_SERVICE_TIER | undefined {\n if (!isOfficialCodexModel(model)) return undefined;\n return enabled && capability.kind === \"supported\" ? CODEX_FAST_SERVICE_TIER : CODEX_STANDARD_SERVICE_TIER;\n}\n\nexport function rewriteCodexFastPayload(\n payload: unknown,\n model: PiModel | undefined,\n enabled: boolean,\n capability: CodexFastCapability = UNKNOWN_CODEX_FAST_CAPABILITY,\n): unknown | undefined {\n const serviceTier = codexFastRequestTier(model, enabled, capability);\n if (!serviceTier || !isRecord(payload)) return undefined;\n return { ...payload, service_tier: serviceTier };\n}\n\nexport function correctCodexFastMessageCost(\n message: unknown,\n model: PiModel | undefined,\n fastRequested: boolean,\n capability: CodexFastCapability = UNKNOWN_CODEX_FAST_CAPABILITY,\n): unknown | undefined {\n if (\n !codexFastIsEffective(model, fastRequested, capability) ||\n !isRecord(message) ||\n message.role !== \"assistant\" ||\n message.provider !== model?.provider ||\n message.model !== model?.id\n ) {\n return undefined;\n }\n const usage = isRecord(message.usage) ? message.usage : undefined;\n const cost = usage && isRecord(usage.cost) ? usage.cost : undefined;\n if (!usage || !cost || !hasCompleteUsage(usage) || !isOfficialCodexModel(model)) return undefined;\n const correctedUsage = structuredClone(usage) as typeof usage;\n calculateCost(model, correctedUsage as never);\n const multiplier = model.id === \"gpt-5.5\" ? 2.5 : 2;\n const correctedCost = correctedUsage.cost as Record<string, number>;\n for (const key of [\"input\", \"output\", \"cacheRead\", \"cacheWrite\", \"total\"] as const) {\n correctedCost[key] *= multiplier;\n }\n if (costsEqual(cost, correctedCost)) return undefined;\n return { ...message, usage: correctedUsage };\n}\n\nexport function codexFastStatusLabel(status: string, enabled: boolean): string {\n if (!enabled || !/^codex(?:\\s|$)/u.test(status)) return status;\n return status === \"codex\" ? \"codex fast\" : `codex fast${status.slice(\"codex\".length)}`;\n}\n\nexport function isOfficialCodexModel(model: PiModel | undefined): model is PiModel & { api: \"openai-codex-responses\" } {\n if (model?.provider !== \"openai-codex\" || !hasApi(model, \"openai-codex-responses\")) {\n return false;\n }\n try {\n return new URL(model.baseUrl).origin === \"https://chatgpt.com\";\n } catch {\n return false;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasCompleteUsage(value: Record<string, unknown>): boolean {\n return [\"input\", \"output\", \"cacheRead\", \"cacheWrite\"].every(\n (key) => typeof value[key] === \"number\" && Number.isFinite(value[key]),\n );\n}\n\nfunction costsEqual(left: Record<string, unknown>, right: Record<string, number>): boolean {\n return [\"input\", \"output\", \"cacheRead\", \"cacheWrite\", \"total\"].every((key) => left[key] === right[key]);\n}\n", "import type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { readStoredCredential } from \"@earendil-works/pi-coding-agent\";\nimport { fingerprintResolvedAuth, sanitizeDisplayText } from \"./core.js\";\nimport { fallbackOAuthCredentialCandidates, type OAuthCredentialCandidateReader } from \"./oauth-credential-source.js\";\nimport { AUTH_FINGERPRINT_SALT, adapterForProvider, fetchProviderJson, resolveUsageAuth } from \"./query.js\";\nimport type { ResolvedUsageAuth, UsageReport } from \"./types.js\";\n\nconst CODEX_RESET_CREDITS_URL = \"https://chatgpt.com/backend-api/wham/rate-limit-reset-credits\";\nconst CODEX_RESET_CONSUME_URL = `${CODEX_RESET_CREDITS_URL}/consume`;\nconst MAX_RESET_OPTIONS = 32;\nconst MAX_CREDIT_ID_CHARS = 1_024;\n\ntype StoredCredentialReader = (providerId: string) => unknown;\n\nexport type CodexResetOutcomeCode = \"reset\" | \"nothing_to_reset\" | \"no_credit\" | \"already_redeemed\";\n\nexport interface CodexResetOption {\n creditId?: string;\n title: string;\n description: string;\n expiresAt?: number;\n}\n\nexport interface CodexResetAvailability {\n availableCount: number;\n options: CodexResetOption[];\n}\n\nexport interface CodexResetOutcome {\n code: CodexResetOutcomeCode;\n windowsReset: number;\n}\n\nexport function codexResetCount(report: UsageReport): number | undefined {\n const value = report.metrics.find((metric) => metric.id === \"reset-credits\")?.value;\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0 ? value : undefined;\n}\n\nexport function codexResetActionDescription(report: UsageReport): string {\n const count = codexResetCount(report);\n if (count === undefined) return \"Check reset availability.\";\n if (count === 0) return \"No usage limit resets available.\";\n return `You have ${count} ${resetLabel(count)} available.`;\n}\n\nexport function genericCodexResetOption(): CodexResetOption {\n return {\n title: \"Full reset\",\n description: \"Reset your current usage limits.\",\n };\n}\n\nexport function resetOptionExpiration(option: CodexResetOption): string {\n if (option.expiresAt === undefined) return \"Does not expire.\";\n const expiration = new Date(option.expiresAt * 1_000);\n if (Number.isNaN(expiration.getTime())) return \"Expiration unavailable.\";\n return `Expires ${expiration.toLocaleString()}.`;\n}\n\nexport function resetConfirmationLines(option: CodexResetOption | undefined): string[] {\n if (!option) return [\"The selected reset is unavailable.\"];\n return [\n option.title,\n resetOptionExpiration(option),\n option.description,\n \"This consumes one earned reset for the current OpenAI Codex account.\",\n ];\n}\n\nexport function formatCodexResetOutcome(\n outcome: CodexResetOutcome | undefined,\n remainingCount: number | undefined,\n): string {\n const remaining =\n remainingCount === undefined ? \"\" : ` You have ${remainingCount} ${resetLabel(remainingCount)} left.`;\n if (!outcome) return \"You don't have any usage limit resets available.\";\n if (outcome.code === \"reset\") return `Usage reset.${remaining}`.trim();\n if (outcome.code === \"already_redeemed\") {\n return `Usage reset was already completed.${remaining}`.trim();\n }\n if (outcome.code === \"nothing_to_reset\") {\n return \"Your usage does not need a reset right now.\";\n }\n return \"No usage limit resets are available.\";\n}\n\nexport function resetLabel(count: number): string {\n return count === 1 ? \"usage limit reset\" : \"usage limit resets\";\n}\n\nexport async function resolveCodexResetAuth(\n ctx: ExtensionContext,\n salt: Uint8Array = AUTH_FINGERPRINT_SALT,\n credentialReader: StoredCredentialReader = readStoredCredential,\n candidateReader?: OAuthCredentialCandidateReader,\n): Promise<ResolvedUsageAuth> {\n const model = ctx.model;\n if (model?.provider !== \"openai-codex\") {\n throw new Error(\"Usage limit resets require the current model to use OpenAI Codex.\");\n }\n const expectedModel = `${model.provider}/${model.id}`;\n const adapter = adapterForProvider(\"openai-codex\");\n if (!adapter) throw new Error(\"OpenAI Codex usage support is unavailable.\");\n if (candidateReader?.waitUntilReady && !(await candidateReader.waitUntilReady(ctx, \"openai-codex\"))) {\n throw new Error(\"OpenAI Codex OAuth credential readiness failed closed.\");\n }\n const auth = await resolveUsageAuth(ctx, adapter, salt, credentialReader);\n if (`${ctx.model?.provider}/${ctx.model?.id}` !== expectedModel) {\n throw new Error(\"The current model changed while resolving Codex reset authentication.\");\n }\n if (!auth) throw new Error(\"No runtime credential is configured for OpenAI Codex.\");\n const offered = candidateReader\n ? await candidateReader(ctx, \"openai-codex\")\n : fallbackOAuthCredentialCandidates(\"openai-codex\", credentialReader);\n if (!offered.ok) throw new Error(\"OpenAI Codex OAuth credential discovery failed closed.\");\n\n const resolvedAccess = bearerToken(headerValue(auth.headers, \"Authorization\")) ?? auth.apiKey;\n if (!resolvedAccess) throw new Error(\"OpenAI Codex OAuth credentials were incomplete.\");\n const resolvedAccountId = codexAccountIdFromAccessToken(resolvedAccess);\n if (!resolvedAccountId) {\n throw new Error(\"The active OpenAI Codex access token did not contain a valid account ID.\");\n }\n const { accountId, storedAccess } = selectCodexResetCredential(\n offered.candidates,\n resolvedAccess,\n resolvedAccountId,\n offered.offeredCount === 0,\n );\n const authorization = `Bearer ${resolvedAccess}`;\n const headers = {\n Authorization: authorization,\n \"chatgpt-account-id\": accountId,\n };\n return {\n apiKey: resolvedAccess,\n headers,\n fingerprint: fingerprintResolvedAuth({ headers }, salt),\n secrets: [...new Set([...auth.secrets, storedAccess, resolvedAccess, authorization, accountId])],\n model: auth.model,\n };\n}\n\nexport async function listCodexResetCredits(\n auth: ResolvedUsageAuth,\n signal: AbortSignal,\n timeoutMs: number,\n): Promise<CodexResetAvailability> {\n const payload = await fetchProviderJson(\n CODEX_RESET_CREDITS_URL,\n auth,\n signal,\n timeoutMs,\n \"Codex usage-limit reset endpoint\",\n );\n return normalizeCodexResetCreditsPayload(payload);\n}\n\nexport async function consumeCodexResetCredit(\n auth: ResolvedUsageAuth,\n option: CodexResetOption,\n redeemRequestId: string,\n signal: AbortSignal,\n timeoutMs: number,\n): Promise<CodexResetOutcome> {\n if (!redeemRequestId) throw new Error(\"Codex reset redemption request ID must not be empty.\");\n const payload = await fetchProviderJson(\n CODEX_RESET_CONSUME_URL,\n auth,\n signal,\n timeoutMs,\n \"Codex usage-limit reset consume endpoint\",\n {\n method: \"POST\",\n body: {\n redeem_request_id: redeemRequestId,\n ...(option.creditId ? { credit_id: option.creditId } : {}),\n },\n },\n );\n const code = payload.code;\n if (!isCodexResetOutcomeCode(code)) {\n throw new Error(\"Codex reset consume endpoint returned an unknown outcome code.\");\n }\n const windowsReset = payload.windows_reset === undefined ? 0 : nonnegativeInteger(payload.windows_reset);\n if (windowsReset === undefined) {\n throw new Error(\"Codex reset consume endpoint returned an invalid windows_reset value.\");\n }\n return { code, windowsReset };\n}\n\nexport function normalizeCodexResetCreditsPayload(payload: Record<string, unknown>): CodexResetAvailability {\n const availableCount = nonnegativeInteger(payload.available_count);\n if (availableCount === undefined) {\n throw new Error(\"Codex reset credits response returned an invalid available_count.\");\n }\n const rawCredits = payload.credits;\n if (rawCredits !== undefined && !Array.isArray(rawCredits)) {\n throw new Error(\"Codex reset credits response returned invalid credits.\");\n }\n\n const options = (rawCredits ?? [])\n .map(asObject)\n .filter((credit): credit is Record<string, unknown> => Boolean(credit))\n .filter((credit) => credit.status === \"available\" && credit.reset_type === \"codex_rate_limits\")\n .map(normalizeResetOption)\n .sort((left, right) => (left.expiresAt ?? Number.MAX_SAFE_INTEGER) - (right.expiresAt ?? Number.MAX_SAFE_INTEGER))\n .slice(0, Math.min(availableCount, MAX_RESET_OPTIONS));\n\n if (availableCount > 0 && options.length === 0) {\n options.push(genericCodexResetOption());\n }\n return { availableCount, options };\n}\n\nfunction selectCodexResetCredential(\n candidates: readonly unknown[],\n resolvedAccess: string,\n resolvedAccountId: string,\n standaloneFallback: boolean,\n): { accountId: string; storedAccess: string } {\n let sawOAuth = false;\n let sawMatchingAccess = false;\n let sawInvalidAccountId = false;\n const matches = new Map<string, { accountId: string; storedAccess: string }>();\n for (const candidate of candidates) {\n try {\n const credential = asObject(candidate);\n if (credential?.type !== \"oauth\") continue;\n sawOAuth = true;\n const storedAccess = asNonemptyString(credential.access);\n if (storedAccess !== resolvedAccess) continue;\n sawMatchingAccess = true;\n const accountId = validHeaderValue(credential.accountId);\n const refresh = asNonemptyString(credential.refresh);\n if (!accountId || accountId !== resolvedAccountId || !refresh) {\n sawInvalidAccountId = true;\n continue;\n }\n matches.set(refresh, { accountId, storedAccess });\n } catch {\n // Malformed candidates never authorize a reset request.\n }\n }\n if (sawInvalidAccountId) {\n throw new Error(\"The OpenAI Codex OAuth credential did not include a valid account ID.\");\n }\n if (matches.size > 1) {\n throw new Error(\"Conflicting OAuth credentials match the active OpenAI Codex runtime account.\");\n }\n const match = matches.values().next().value;\n if (match) return match;\n if (!sawOAuth) {\n throw new Error(\n standaloneFallback\n ? \"Usage limit resets require the OpenAI Codex OAuth account configured through Pi /login.\"\n : \"Usage limit resets require an OpenAI Codex OAuth account configured through Pi /login or a compatible credential source.\",\n );\n }\n if (sawMatchingAccess) throw new Error(\"OpenAI Codex OAuth credentials were incomplete.\");\n throw new Error(\n standaloneFallback\n ? \"The active OpenAI Codex runtime account does not match Pi's stored OAuth account.\"\n : \"The active OpenAI Codex runtime account does not match any available OAuth account.\",\n );\n}\n\nfunction codexAccountIdFromAccessToken(access: string): string | undefined {\n try {\n const parts = access.split(\".\");\n if (parts.length !== 3 || !parts[1]) return undefined;\n const payload = JSON.parse(Buffer.from(parts[1], \"base64url\").toString(\"utf8\")) as unknown;\n const claims = asObject(asObject(payload)?.[\"https://api.openai.com/auth\"]);\n return validHeaderValue(claims?.chatgpt_account_id);\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeResetOption(credit: Record<string, unknown>): CodexResetOption {\n const creditId = asOpaqueId(credit.id);\n if (!creditId) throw new Error(\"Codex reset credits response returned an invalid credit ID.\");\n let expiresAt: number | undefined;\n if (credit.expires_at !== undefined && credit.expires_at !== null) {\n if (typeof credit.expires_at !== \"string\") {\n throw new Error(\"Codex reset credits response returned an invalid expiration time.\");\n }\n const parsed = Date.parse(credit.expires_at);\n if (!Number.isFinite(parsed)) {\n throw new Error(\"Codex reset credits response returned an invalid expiration time.\");\n }\n expiresAt = Math.floor(parsed / 1_000);\n }\n const title = displayString(credit.title) ?? \"Full reset\";\n const description = displayString(credit.description) ?? \"Reset your current usage limits.\";\n return {\n creditId,\n title,\n description,\n ...(expiresAt === undefined ? {} : { expiresAt }),\n };\n}\n\nfunction isCodexResetOutcomeCode(value: unknown): value is CodexResetOutcomeCode {\n return value === \"reset\" || value === \"nothing_to_reset\" || value === \"no_credit\" || value === \"already_redeemed\";\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n return value as Record<string, unknown>;\n}\n\nfunction asNonemptyString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction asOpaqueId(value: unknown): string | undefined {\n if (typeof value !== \"string\" || value.length === 0 || value.length > MAX_CREDIT_ID_CHARS) {\n return undefined;\n }\n return value;\n}\n\nfunction displayString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n return sanitizeDisplayText(value, 160) || undefined;\n}\n\nfunction validHeaderValue(value: unknown): string | undefined {\n if (typeof value !== \"string\" || !value || value.length > 512) return undefined;\n if (/[^\\x20-\\x7e]/u.test(value)) return undefined;\n return value;\n}\n\nfunction nonnegativeInteger(value: unknown): number | undefined {\n const parsed =\n typeof value === \"number\" ? value : typeof value === \"string\" && value.trim() ? Number(value) : Number.NaN;\n if (!Number.isSafeInteger(parsed) || parsed < 0) return undefined;\n return parsed;\n}\n\nfunction bearerToken(authorization: string | undefined): string | undefined {\n return /^Bearer\\s+(.+)$/iu.exec(authorization ?? \"\")?.[1];\n}\n\nfunction headerValue(headers: Record<string, string>, name: string): string | undefined {\n return Object.entries(headers).find(([candidate]) => candidate.toLowerCase() === name.toLowerCase())?.[1];\n}\n", "import type { CodexStatusPercentage } from \"./settings.js\";\nimport type { ProviderUsageState, UsageBucket, UsageDisplayState, UsageModel, UsageReport } from \"./types.js\";\n\nconst BAR_SEGMENTS = 20;\nconst VALUE_COLUMN = 29;\n\nexport function formatUsageReport(report: UsageReport, displayState: UsageDisplayState): string {\n const stateLabel = displayState === \"current\" ? \"Current\" : \"Configured\";\n const title =\n report.providerId === \"baseten\"\n ? \"Baseten Model APIs Spend\"\n : report.providerId === \"deepseek\"\n ? \"DeepSeek API Balance\"\n : report.providerId === \"fireworks\"\n ? \"Fireworks API Spend\"\n : report.providerId === \"vercel-ai-gateway\"\n ? \"Vercel AI Gateway Credits\"\n : report.providerId === \"moonshotai\" || report.providerId === \"moonshotai-cn\"\n ? `${report.providerName} Balance`\n : report.providerId === \"minimax\" || report.providerId === \"minimax-cn\"\n ? report.source === \"minimax-account-balance\"\n ? `${report.providerName} API Balance`\n : `${report.providerName} Token Plan`\n : report.source === \"openai-chatgpt-auth\"\n ? `${report.providerName} ChatGPT Plan Status`\n : `${report.providerName} Usage`;\n const lines = [`${title} \u00B7 ${stateLabel}`];\n if (report.accountLabel) lines.push(`Account: ${report.accountLabel}`);\n lines.push(`Semantics: ${report.semantics.label}`, \"\");\n\n if (report.source === \"openai-chatgpt-companion\") formatOpenAICompanionReport(lines, report);\n else if (report.providerId === \"baseten\") formatBasetenReport(lines, report);\n else if (report.providerId === \"openai-codex\") formatCodexReport(lines, report);\n else if (report.providerId === \"deepseek\") formatDeepSeekReport(lines, report);\n else if (report.providerId === \"fireworks\") formatFireworksReport(lines, report);\n else if (report.providerId === \"vercel-ai-gateway\") formatVercelAIGatewayReport(lines, report);\n else if (report.providerId === \"github-copilot\") formatGitHubCopilotReport(lines, report);\n else if (report.providerId === \"openrouter\") formatOpenRouterReport(lines, report);\n else if (report.providerId === \"opencode-go\") formatOpenCodeZenReport(lines, report);\n else if (report.providerId === \"command-code\") formatCommandCodeReport(lines, report);\n else if (report.providerId === \"kimi-coding\") formatKimiCodingReport(lines, report);\n else if (report.providerId === \"moonshotai\" || report.providerId === \"moonshotai-cn\") {\n formatMoonshotReport(lines, report);\n } else if (report.providerId === \"minimax\" || report.providerId === \"minimax-cn\") {\n formatMiniMaxReport(lines, report);\n } else if (report.providerId === \"xai\") formatXaiReport(lines, report);\n else if (report.providerId === \"zai\" || report.providerId === \"zai-coding-cn\") {\n formatZaiReport(lines, report);\n } else formatGenericReport(lines, report);\n\n if (report.notes) {\n for (const note of report.notes) lines.push(note);\n }\n return lines.join(\"\\n\").trimEnd();\n}\n\nexport function formatUsageStatusline(\n report: UsageReport,\n model?: UsageModel,\n now = Date.now(),\n showCodexResetCountdown = true,\n codexStatusPercentage: CodexStatusPercentage = \"remaining\",\n): string | undefined {\n if (report.providerId === \"openai\" && report.source === \"openai-chatgpt-auth\") return \"chatgpt usage: web only\";\n if (report.source === \"openai-chatgpt-companion\") {\n const windows = report.buckets\n .filter((bucket) => bucket.groupId === \"chatgpt-plan\")\n .map((bucket) => {\n const reset = formatResetCountdown(bucket.resetsAt, now);\n const window = reset ? `\u21BB ${reset}` : formatWindowLabel(bucket.windowMinutes, \"weekly\", true);\n return `${bucket.remaining === undefined ? \"unavailable\" : `${bucket.remaining.toFixed(0)}%`} ${window}`;\n });\n return `chatgpt plan ${windows.join(\" \")}`;\n }\n if (report.providerId === \"baseten\") return formatBasetenStatusline(report);\n if (report.providerId === \"openai-codex\") {\n return formatCodexStatusline(report, model, now, showCodexResetCountdown, codexStatusPercentage);\n }\n if (report.providerId === \"deepseek\") return formatDeepSeekStatusline(report);\n if (report.providerId === \"fireworks\") return formatFireworksStatusline(report);\n if (report.providerId === \"vercel-ai-gateway\") return formatVercelAIGatewayStatusline(report);\n if (report.providerId === \"github-copilot\") return formatGitHubCopilotStatusline(report);\n if (report.providerId === \"openrouter\") {\n const limit = report.buckets.find((bucket) => bucket.id === \"key-limit\");\n if (limit?.remaining !== undefined) return `openrouter ${formatUsd(limit.remaining)} left`;\n const total = report.metrics.find((metric) => metric.id === \"usage-total\");\n if (typeof total?.value === \"number\") return `openrouter ${formatUsd(total.value)} used`;\n }\n if (report.providerId === \"opencode-go\") return formatOpenCodeZenStatusline(report);\n if (report.providerId === \"command-code\") return formatCommandCodeStatusline(report);\n if (report.providerId === \"kimi-coding\") return formatKimiCodingStatusline(report);\n if (report.providerId === \"moonshotai\" || report.providerId === \"moonshotai-cn\") {\n return formatMoonshotStatusline(report);\n }\n if (report.providerId === \"minimax\" || report.providerId === \"minimax-cn\") {\n return formatMiniMaxStatusline(report, model);\n }\n if (report.providerId === \"zai\" || report.providerId === \"zai-coding-cn\") {\n return formatZaiStatusline(report);\n }\n return undefined;\n}\n\nexport function formatProviderStates(states: readonly ProviderUsageState[]): string {\n return states\n .map((state) => {\n if (state.status === \"ready\") return formatUsageReport(state.report, state.displayState);\n const label = state.displayState === \"current\" ? \"Current\" : \"Configured\";\n if (state.status === \"selection-required\") {\n return `${state.providerName} \u00B7 ${label}\\nSelection required: choose this provider's ${state.singularLabel} by viewing it individually.`;\n }\n const status =\n state.status === \"auth-unavailable\"\n ? \"Authentication unavailable\"\n : state.status === \"unsupported\"\n ? \"Unsupported\"\n : \"Query failed\";\n return `${state.providerName} \u00B7 ${label}\\n${status}: ${state.message}`;\n })\n .join(\"\\n\\n\");\n}\n\nfunction formatBasetenReport(lines: string[], report: UsageReport): void {\n lines.push(`${\"Spend window:\".padEnd(VALUE_COLUMN)}Last 30 days`);\n for (const metric of report.metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}USD ${metric.value}`);\n }\n}\n\nfunction formatBasetenStatusline(report: UsageReport): string {\n const subtotal = report.metrics.find((metric) => metric.id === \"net-subtotal\");\n return subtotal ? `baseten USD ${subtotal.value} net` : \"baseten no Model APIs usage\";\n}\n\nfunction formatCodexReport(lines: string[], report: UsageReport): void {\n let previousGroup: string | undefined;\n for (const bucket of report.buckets) {\n const group = bucket.groupId ?? bucket.id;\n if (group !== previousGroup && group !== \"codex\") {\n lines.push(`${bucket.groupLabel ?? group} limit:`);\n }\n previousGroup = group;\n const fallback = bucket.id.endsWith(\":secondary\") ? \"weekly\" : \"5h\";\n const label = `${formatWindowLabel(bucket.windowMinutes, fallback, false)} limit:`;\n lines.push(`${label.padEnd(VALUE_COLUMN)}${formatPercentBucket(bucket)}`);\n }\n for (const metric of report.metrics) {\n if (metric.id === \"reset-credits\") {\n lines.push(`${\"Usage limit resets:\".padEnd(VALUE_COLUMN)}${metric.value} available`);\n } else if (metric.id === \"credits\") {\n lines.push(`${\"Credits:\".padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`);\n }\n }\n}\n\nfunction formatDeepSeekReport(lines: string[], report: UsageReport): void {\n const availability = report.metrics.find((metric) => metric.id === \"api-availability\");\n lines.push(\n `${\"API calls:\".padEnd(VALUE_COLUMN)}${availability?.value === \"available\" ? \"Available\" : \"Unavailable\"}`,\n );\n for (const currency of [\"CNY\", \"USD\"]) {\n const metrics = report.metrics.filter((metric) => metric.currency === currency);\n if (metrics.length === 0) continue;\n lines.push(\"\", `${currency} balance:`);\n for (const metric of metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${currency} ${metric.value}`);\n }\n }\n}\n\nfunction formatDeepSeekStatusline(report: UsageReport): string {\n const availability = report.metrics.find((metric) => metric.id === \"api-availability\");\n if (availability?.value !== \"available\") return \"deepseek API unavailable\";\n const totals = [\"CNY\", \"USD\"].flatMap((currency) => {\n const metric = report.metrics.find((candidate) => candidate.id === `${currency.toLowerCase()}-total`);\n return metric ? [`${currency} ${metric.value}`] : [];\n });\n return totals.length > 0 ? `deepseek ${totals.join(\" \u00B7 \")}` : \"deepseek balance unavailable\";\n}\n\nfunction formatFireworksReport(lines: string[], report: UsageReport): void {\n lines.push(`${\"Spend window:\".padEnd(VALUE_COLUMN)}Last 30 days (rated)`);\n for (const currency of fireworksCurrencies(report)) {\n lines.push(\"\", `${currency} rated spend:`);\n for (const metric of report.metrics) {\n if (metric.currency !== currency) continue;\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${currency} ${metric.value}`);\n }\n }\n}\n\nfunction formatFireworksStatusline(report: UsageReport): string {\n const totals = report.metrics.filter((metric) => metric.id.endsWith(\"-total\"));\n if (totals.length === 0) return \"fireworks no rated usage\";\n return `fireworks ${totals.map((metric) => `${metric.currency} ${metric.value}`).join(\" \u00B7 \")}`;\n}\n\nfunction fireworksCurrencies(report: UsageReport): string[] {\n const currencies: string[] = [];\n for (const metric of report.metrics) {\n if (!metric.currency || currencies.includes(metric.currency)) continue;\n currencies.push(metric.currency);\n }\n return currencies;\n}\n\nfunction formatVercelAIGatewayReport(lines: string[], report: UsageReport): void {\n for (const metric of report.metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}USD ${metric.value}`);\n }\n}\n\nfunction formatVercelAIGatewayStatusline(report: UsageReport): string {\n const balance = report.metrics.find((metric) => metric.id === \"credit-balance\");\n return balance ? `vercel USD ${balance.value} left` : \"vercel credits unavailable\";\n}\n\nfunction formatGitHubCopilotReport(lines: string[], report: UsageReport): void {\n const quota = findGitHubCopilotQuota(report);\n if (!quota || quota.limit === undefined || quota.remaining === undefined) {\n lines.push(`${`${quota?.label ?? \"Copilot quota\"}:`.padEnd(VALUE_COLUMN)}unlimited`);\n return;\n }\n const percent = percentRemaining(quota);\n const reset = quota.resetsAt ? ` (resets ${formatReset(quota.resetsAt)})` : \"\";\n lines.push(\n `${`${quota.label}:`.padEnd(VALUE_COLUMN)}${quota.remaining} of ${quota.limit} left \u00B7 ${percent}%${reset}`,\n );\n const overage = report.metrics.find((metric) => metric.id === \"overage-used\");\n if (typeof overage?.value === \"number\" && overage.value > 0) {\n lines.push(`${\"Additional usage:\".padEnd(VALUE_COLUMN)}${overage.value} ${quota.label}`);\n }\n}\n\nfunction formatGitHubCopilotStatusline(report: UsageReport): string {\n const quota = findGitHubCopilotQuota(report);\n const kind = compactGitHubCopilotQuotaKind(quota);\n if (!quota || quota.limit === undefined || quota.remaining === undefined) {\n return `copilot ${kind} unlimited`;\n }\n const overage = report.metrics.find((metric) => metric.id === \"overage-used\");\n const overageSuffix = typeof overage?.value === \"number\" && overage.value > 0 ? ` +${overage.value} over` : \"\";\n return `copilot ${kind === \"premium\" ? \"\" : `${kind} `}${quota.remaining}/${quota.limit} ${percentRemaining(quota)}%${overageSuffix}`;\n}\n\nfunction findGitHubCopilotQuota(report: UsageReport): UsageBucket | undefined {\n return report.buckets.find((bucket) => [\"ai-credits\", \"premium-requests\", \"chat-requests\"].includes(bucket.id));\n}\n\nfunction compactGitHubCopilotQuotaKind(bucket: UsageBucket | undefined): string {\n if (bucket?.id === \"ai-credits\") return \"credits\";\n if (bucket?.id === \"chat-requests\") return \"chat\";\n return \"premium\";\n}\n\nfunction percentRemaining(bucket: UsageBucket): number {\n if (!bucket.limit || bucket.remaining === undefined) return 0;\n return Math.round(clampPercent((bucket.remaining / bucket.limit) * 100));\n}\n\nfunction formatOpenRouterReport(lines: string[], report: UsageReport): void {\n const limit = report.buckets.find((bucket) => bucket.id === \"key-limit\");\n if (limit) {\n const period = limit.period ? ` (${limit.period})` : \"\";\n const value =\n limit.remaining === undefined\n ? `${formatUsd(limit.limit ?? 0)} cap; remaining unavailable`\n : `${formatUsd(limit.remaining)} of ${formatUsd(limit.limit ?? 0)} left`;\n lines.push(`${`Key limit${period}:`.padEnd(VALUE_COLUMN)}${value}`);\n }\n for (const metric of report.metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`);\n }\n}\n\nfunction formatOpenCodeZenReport(lines: string[], report: UsageReport): void {\n for (const bucket of report.buckets) {\n if (bucket.unit === \"percent\" && bucket.used !== undefined) {\n lines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${formatPercentBucket(bucket)}`);\n continue;\n }\n const reset = bucket.resetsAt ? ` (resets ${formatReset(bucket.resetsAt)})` : \"\";\n const used = bucket.used ?? \"unavailable\";\n lines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${used}% used${reset}`);\n }\n}\n\nfunction formatOpenCodeZenStatusline(report: UsageReport): string | undefined {\n const parts = [\"zen\"];\n for (const bucket of report.buckets) {\n if (bucket.used === undefined) continue;\n const compact = bucket.id === \"rolling\" ? \"r\" : bucket.id === \"weekly\" ? \"w\" : \"m\";\n parts.push(`${clampPercent(bucket.used).toFixed(0)}% ${compact}`);\n }\n return parts.length > 1 ? parts.join(\" \") : undefined;\n}\n\nfunction formatCommandCodeReport(lines: string[], report: UsageReport): void {\n for (const bucket of report.buckets) {\n const reset = bucket.resetsAt ? ` (resets ${formatReset(bucket.resetsAt)})` : \"\";\n if (bucket.used === undefined || bucket.limit === undefined) {\n lines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}unavailable${reset}`);\n continue;\n }\n lines.push(\n `${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${formatUsd(bucket.used)} of ${formatUsd(bucket.limit)} used \u00B7 ${percentRemaining(bucket)}% left${reset}`,\n );\n }\n for (const metric of report.metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`);\n }\n}\n\nfunction formatCommandCodeStatusline(report: UsageReport): string | undefined {\n const parts = [\"cmd\"];\n for (const [id, label] of [\n [\"five-hour\", \"5h\"],\n [\"weekly\", \"wk\"],\n [\"monthly\", \"mo\"],\n ] as const) {\n const bucket = report.buckets.find((candidate) => candidate.id === id);\n if (bucket?.unit !== \"usd\" || bucket.limit === undefined || bucket.remaining === undefined) continue;\n parts.push(`${percentRemaining(bucket)}% ${label}`);\n }\n return parts.length > 1 ? parts.join(\" \") : undefined;\n}\n\nfunction formatKimiCodingReport(lines: string[], report: UsageReport): void {\n for (const bucket of report.buckets) {\n const reset = bucket.resetsAt ? ` (resets ${formatReset(bucket.resetsAt)})` : \"\";\n if (bucket.unit === \"percent\") {\n const remaining = bucket.remaining === undefined ? undefined : Math.round(clampPercent(bucket.remaining));\n const value =\n bucket.used === undefined || remaining === undefined\n ? \"unavailable\"\n : `${100 - remaining}% used \u00B7 ${remaining}% left`;\n lines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${value}${reset}`);\n continue;\n }\n if (bucket.used === undefined || bucket.limit === undefined) {\n lines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}unavailable${reset}`);\n continue;\n }\n lines.push(\n `${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${bucket.used} of ${bucket.limit} used \u00B7 ${percentRemaining(bucket)}% left${reset}`,\n );\n }\n const balance = report.metrics.find((metric) => metric.id === \"booster-balance\");\n const total = report.metrics.find((metric) => metric.id === \"booster-total\");\n const monthlyUsed = report.metrics.find((metric) => metric.id === \"booster-monthly-used\");\n const monthlyLimit = report.metrics.find((metric) => metric.id === \"booster-monthly-limit\");\n if (!balance && !monthlyUsed && !monthlyLimit) return;\n lines.push(\"\", \"Extra usage wallet:\");\n if (balance) {\n const totalSuffix = total ? ` of ${formatCurrencyMetric(total)}` : \"\";\n lines.push(`${\"Balance:\".padEnd(VALUE_COLUMN)}${formatCurrencyMetric(balance)}${totalSuffix}`);\n }\n if (monthlyUsed) {\n lines.push(`${\"Used this month:\".padEnd(VALUE_COLUMN)}${formatCurrencyMetric(monthlyUsed)}`);\n }\n if (monthlyLimit) {\n lines.push(`${\"Monthly limit:\".padEnd(VALUE_COLUMN)}${formatCurrencyMetric(monthlyLimit)}`);\n }\n}\n\nfunction formatKimiCodingStatusline(report: UsageReport): string | undefined {\n const fiveHour = report.buckets.find((bucket) => bucket.id === \"five-hour\");\n const weekly = report.buckets.find((bucket) => bucket.id === \"weekly\");\n const monthly = report.buckets.find((bucket) => bucket.id === \"monthly\");\n const subWindow = fiveHour ?? report.buckets.find((bucket) => bucket.id !== \"weekly\" && bucket.id !== \"monthly\");\n const selected = [subWindow, weekly, monthly].filter(\n (bucket, index, buckets): bucket is UsageBucket => bucket !== undefined && buckets.indexOf(bucket) === index,\n );\n const parts = [\"kimi\"];\n for (const bucket of selected) {\n if (bucket.remaining === undefined || (bucket.unit !== \"percent\" && !bucket.limit)) continue;\n const fallback = bucket.id === \"weekly\" ? \"weekly\" : \"5h\";\n const window = bucket.id === \"monthly\" ? \"mo\" : formatWindowLabel(bucket.windowMinutes, fallback, true);\n const remaining = bucket.unit === \"percent\" ? Math.round(clampPercent(bucket.remaining)) : percentRemaining(bucket);\n parts.push(`${remaining}% ${window}`);\n }\n return parts.length > 1 ? parts.join(\" \") : undefined;\n}\n\nfunction formatMoonshotReport(lines: string[], report: UsageReport): void {\n for (const metric of report.metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${metric.currency} ${metric.value}`);\n }\n}\n\nfunction formatMoonshotStatusline(report: UsageReport): string {\n const available = report.metrics.find((metric) => metric.id === \"available-balance\");\n if (!available) return \"moonshot balance unavailable\";\n return `moonshot ${available.currency ?? \"\"} ${available.value}`.replace(/\\s+/gu, \" \");\n}\n\nfunction formatMiniMaxReport(lines: string[], report: UsageReport): void {\n if (report.source === \"minimax-account-balance\") {\n for (const metric of report.metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${metric.currency} ${metric.value}`);\n }\n return;\n }\n let previousGroup: string | undefined;\n for (const bucket of report.buckets) {\n if (bucket.groupId !== previousGroup) lines.push(`${bucket.groupLabel ?? \"Token Plan\"}:`);\n previousGroup = bucket.groupId;\n const reset = bucket.resetsAt ? ` (resets ${formatReset(bucket.resetsAt)})` : \"\";\n const value =\n bucket.period === \"unlimited\"\n ? \"unlimited\"\n : bucket.unit === \"percent\" && bucket.remaining !== undefined\n ? `${bucket.remaining}% remaining${reset}`\n : bucket.limit !== undefined && bucket.remaining !== undefined\n ? `${bucket.remaining} of ${bucket.limit} left \u00B7 ${percentRemaining(bucket)}%${reset}`\n : \"unavailable\";\n lines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${value}`);\n }\n}\n\nfunction formatMiniMaxStatusline(report: UsageReport, model?: UsageModel): string | undefined {\n const prefix = report.providerId === \"minimax-cn\" ? \"minimax cn\" : \"minimax\";\n if (report.source === \"minimax-account-balance\") {\n const available = report.metrics.find((metric) => metric.id === \"available-balance\");\n return available ? `${prefix} ${available.currency} ${available.value}` : undefined;\n }\n const selectedGroup = selectMiniMaxGroup(report, model);\n if (!selectedGroup) return undefined;\n const selected = report.buckets.filter((bucket) => bucket.groupId === selectedGroup);\n const parts = [prefix];\n for (const bucket of selected) {\n const fallback = bucket.id.endsWith(\":weekly\") ? \"weekly\" : \"5h\";\n const window = formatWindowLabel(bucket.windowMinutes, fallback, true);\n if (bucket.period === \"unlimited\") {\n parts.push(`unlimited ${window}`);\n continue;\n }\n if (bucket.unit === \"percent\" && bucket.remaining !== undefined) {\n parts.push(`${bucket.remaining}% ${window}`);\n continue;\n }\n if (bucket.limit === undefined || bucket.remaining === undefined) continue;\n parts.push(`${percentRemaining(bucket)}% ${window}`);\n }\n return parts.length > 1 ? parts.join(\" \") : undefined;\n}\n\nfunction selectMiniMaxGroup(report: UsageReport, model?: UsageModel): string | undefined {\n const groups = [\n ...new Set(report.buckets.map((bucket) => bucket.groupId).filter((group): group is string => group !== undefined)),\n ];\n if (groups.length <= 1) return groups[0];\n if (model && model.provider !== report.providerId) return undefined;\n if (model) {\n const modelKeys = [model.id, model.name]\n .map(normalizeMiniMaxModelKey)\n .filter((key): key is string => key !== undefined);\n const candidates = groups.map((group) => {\n const bucket = report.buckets.find((candidate) => candidate.groupId === group);\n const patterns = [bucket?.groupLabel, ...(bucket?.modelKeys ?? []), group]\n .map(normalizeMiniMaxModelKey)\n .filter((key): key is string => key !== undefined);\n return { group, patterns };\n });\n const exact = candidates.find(({ patterns }) =>\n patterns.some((pattern) => !pattern.includes(\"*\") && modelKeys.includes(pattern)),\n );\n if (exact) return exact.group;\n const wildcard = candidates.find(({ patterns }) =>\n patterns.some((pattern) => pattern.includes(\"*\") && modelKeys.some((key) => wildcardKeyMatches(pattern, key))),\n );\n if (wildcard) return wildcard.group;\n }\n // Prefer the Coding Plan catch-all over hiding the chip.\n return groups.find((group) => group === \"general\");\n}\n\nfunction normalizeMiniMaxModelKey(value: string | undefined): string | undefined {\n const key = value?.toLowerCase().replace(/[^a-z0-9*]+/gu, \"\");\n return key && /[a-z0-9]/u.test(key) ? key : undefined;\n}\n\nfunction wildcardKeyMatches(pattern: string, value: string): boolean {\n if (!pattern.includes(\"*\")) return pattern === value;\n const segments = pattern.split(\"*\").filter(Boolean);\n let offset = 0;\n for (const [index, segment] of segments.entries()) {\n const found = value.indexOf(segment, offset);\n if (found < 0 || (index === 0 && !pattern.startsWith(\"*\") && found !== 0)) return false;\n offset = found + segment.length;\n }\n const last = segments.at(-1);\n return pattern.endsWith(\"*\") || (last !== undefined && value.endsWith(last));\n}\n\nfunction formatZaiStatusline(report: UsageReport): string | undefined {\n const selected = [\n report.buckets.find((bucket) => bucket.id === \"five-hour\"),\n report.buckets.find((bucket) => bucket.id === \"weekly\"),\n ];\n const parts = [\"zai\"];\n for (const bucket of selected) {\n if (!bucket?.limit || bucket.remaining === undefined) continue;\n const fallback = bucket.id === \"weekly\" ? \"weekly\" : \"5h\";\n parts.push(`${percentRemaining(bucket)}% ${formatWindowLabel(bucket.windowMinutes, fallback, true)}`);\n }\n return parts.length > 1 ? parts.join(\" \") : undefined;\n}\n\nfunction formatCurrencyMetric(metric: UsageReport[\"metrics\"][number]): string {\n if (typeof metric.value !== \"number\") return String(metric.value);\n if (!metric.currency) return \"unavailable\";\n if (metric.currency === \"USD\") return `$${metric.value.toFixed(2)}`;\n if (metric.currency === \"CNY\") return `\u00A5${metric.value.toFixed(2)}`;\n return `${metric.value.toFixed(2)} ${metric.currency}`;\n}\n\nfunction formatXaiReport(lines: string[], report: UsageReport): void {\n const included = report.buckets.find((bucket) => bucket.id === \"included-allowance\");\n if (included) {\n let value = \"unavailable\";\n if (included.unit === \"percent\" && included.used !== undefined) {\n value = formatPercentBar(included);\n } else if (included.used !== undefined) {\n value = `${formatUsd(included.used)} used`;\n if (included.limit !== undefined) value += ` of ${formatUsd(included.limit)}`;\n } else if (included.limit !== undefined) {\n value = `usage unavailable \u00B7 ${formatUsd(included.limit)} limit`;\n }\n const period = included.period ? ` \u00B7 ${included.period}` : \"\";\n const reset = included.resetsAt ? ` (resets ${formatReset(included.resetsAt)})` : \"\";\n lines.push(`${\"Included allowance:\".padEnd(VALUE_COLUMN)}${value}${period}${reset}`);\n }\n const onDemand = report.buckets.find((bucket) => bucket.id === \"on-demand\");\n if (onDemand) {\n let value = onDemand.used === undefined ? \"usage unavailable\" : `${formatUsd(onDemand.used)} used`;\n if (onDemand.limit !== undefined) value += ` of ${formatUsd(onDemand.limit)} cap`;\n lines.push(`${\"On-demand usage:\".padEnd(VALUE_COLUMN)}${value}`);\n }\n for (const metric of report.metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`);\n }\n}\n\nfunction formatZaiReport(lines: string[], report: UsageReport): void {\n for (const bucket of report.buckets) {\n if (bucket.unit === \"percent\" && bucket.used !== undefined) {\n lines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${formatPercentBucket(bucket)}`);\n continue;\n }\n const reset = bucket.resetsAt ? ` (resets ${formatReset(bucket.resetsAt)})` : \"\";\n let value = \"unavailable\";\n if (bucket.used !== undefined && bucket.limit !== undefined) {\n value = `${bucket.used} of ${bucket.limit} used`;\n if (bucket.remaining !== undefined) value += ` \u00B7 ${bucket.remaining} left`;\n } else if (bucket.used !== undefined) {\n value = `${bucket.used} used`;\n } else if (bucket.remaining !== undefined) {\n value = `${bucket.remaining} left`;\n }\n lines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${value}${reset}`);\n }\n for (const metric of report.metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`);\n }\n}\n\nfunction formatOpenAICompanionReport(lines: string[], report: UsageReport): void {\n for (const group of [\"chatgpt-plan\", \"chatgpt-app\"]) {\n lines.push(group === \"chatgpt-plan\" ? \"Plan limits:\" : \"App limits:\");\n for (const bucket of report.buckets.filter((bucket) => bucket.groupId === group)) {\n const value =\n group === \"chatgpt-app\"\n ? bucket.resetsAt === undefined\n ? \"Reset time unavailable\"\n : `resets ${formatReset(bucket.resetsAt)}`\n : formatPercentBucket(bucket);\n lines.push(`${formatWindowLabel(bucket.windowMinutes, \"weekly\", false).padEnd(VALUE_COLUMN)}${value}`);\n }\n }\n for (const metric of report.metrics)\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`);\n}\n\nfunction formatGenericReport(lines: string[], report: UsageReport): void {\n for (const bucket of report.buckets) {\n lines.push(\n `${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(bucket.remaining ?? bucket.used ?? \"unavailable\", bucket.unit)}`,\n );\n }\n for (const metric of report.metrics) {\n lines.push(`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`);\n }\n}\n\nfunction formatCodexStatusline(\n report: UsageReport,\n model?: UsageModel,\n now = Date.now(),\n showResetCountdown = true,\n percentage: CodexStatusPercentage = \"remaining\",\n): string | undefined {\n const group = selectCodexGroup(report, model);\n if (!group) return formatCodexCreditsStatus(report);\n const buckets = report.buckets.filter((bucket) => (bucket.groupId ?? bucket.id) === group);\n const labelBucket = buckets[0];\n const parts = [group === \"codex\" ? \"codex\" : `codex ${compactLimitLabel(labelBucket?.groupLabel ?? group)}`];\n for (const bucket of buckets) {\n if (bucket.remaining === undefined) continue;\n const displayedPercentage = percentage === \"used\" ? (bucket.used ?? 100 - bucket.remaining) : bucket.remaining;\n const percent = `${clampPercent(displayedPercentage).toFixed(0)}%`;\n const fallback = bucket.id.endsWith(\":secondary\") ? \"weekly\" : \"5h\";\n const window = formatWindowLabel(bucket.windowMinutes, fallback, true);\n if (!showResetCountdown) {\n parts.push(`${percent} ${window}`);\n continue;\n }\n const reset = formatResetCountdown(bucket.resetsAt, now);\n parts.push(`${percent} ${reset ? `\u21BB ${reset}` : window}`);\n }\n return parts.length > 1 ? parts.join(\" \") : formatCodexCreditsStatus(report);\n}\n\nfunction formatCodexCreditsStatus(report: UsageReport): string {\n const credits = report.metrics.find((metric) => metric.id === \"credits\");\n if (!credits) return \"codex usage unavailable\";\n if (credits.value === \"none\") return \"codex no credits\";\n if (credits.value === \"available\") return \"codex credits available\";\n if (credits.value === \"unlimited\") return \"codex credits unlimited\";\n return `codex ${formatMetricValue(credits.value, \"count\")} credits`;\n}\n\nfunction selectCodexGroup(report: UsageReport, model?: UsageModel): string | undefined {\n const groups = [...new Set(report.buckets.map((bucket) => bucket.groupId ?? bucket.id))];\n if (model?.provider !== \"openai-codex\") {\n return groups.includes(\"codex\") ? \"codex\" : groups[0];\n }\n const modelKeys = normalizedModelKeys(model);\n for (const group of groups) {\n const bucket = report.buckets.find((candidate) => (candidate.groupId ?? candidate.id) === group);\n const keys = [group, bucket?.groupLabel, ...(bucket?.modelKeys ?? [])]\n .map(normalizeKey)\n .filter((key): key is string => key !== undefined);\n if (keys.some((key) => modelKeys.has(key))) return group;\n }\n const variants = [...modelKeys]\n .map((key) => key.match(/(?:^|-)codex-(.+)$/)?.[1])\n .filter((value): value is string => Boolean(value));\n for (const variant of variants) {\n const matches = groups.filter((group) => {\n if (group === \"codex\") return false;\n const key = normalizeKey(group);\n return key ? normalizedKeyHasToken(key, variant) : false;\n });\n if (matches.length === 1) return matches[0];\n }\n return groups.includes(\"codex\") ? \"codex\" : groups[0];\n}\n\nfunction normalizedModelKeys(model: UsageModel): Set<string> {\n const keys = new Set<string>();\n for (const value of [model.id, model.name]) {\n const key = normalizeKey(value);\n if (!key) continue;\n keys.add(key);\n const index = key.indexOf(\"codex\");\n if (index >= 0) keys.add(key.slice(index));\n }\n return keys;\n}\n\nfunction normalizeKey(value: string | undefined): string | undefined {\n const separated = value?.toLowerCase().replace(/[^a-z0-9]+/g, \"-\");\n if (!separated) return undefined;\n let start = 0;\n let end = separated.length;\n while (separated[start] === \"-\") start += 1;\n while (end > start && separated[end - 1] === \"-\") end -= 1;\n return separated.slice(start, end) || undefined;\n}\n\nfunction normalizedKeyHasToken(key: string, token: string): boolean {\n return key === token || key.startsWith(`${token}-`) || key.endsWith(`-${token}`) || key.includes(`-${token}-`);\n}\n\nfunction compactLimitLabel(label: string): string {\n const normalized = label.replace(/[_-]+/g, \" \").trim();\n const codex = /\\bcodex\\s/iu.exec(normalized);\n const suffix = codex ? normalized.slice(codex.index + codex[0].length).trim() : \"\";\n return (suffix || normalized).toLowerCase().replace(/\\s+/g, \" \");\n}\n\nfunction formatPercentBucket(bucket: UsageBucket): string {\n return `${formatPercentBar(bucket)}${bucket.resetsAt ? ` (resets ${formatReset(bucket.resetsAt)})` : \"\"}`;\n}\n\nfunction formatPercentBar(bucket: UsageBucket): string {\n const remaining = clampPercent(bucket.remaining ?? 0);\n const filled = Math.round((remaining / 100) * BAR_SEGMENTS);\n return `[${\"\u2588\".repeat(filled)}${\"\u2591\".repeat(BAR_SEGMENTS - filled)}] ${remaining.toFixed(0)}% left`;\n}\n\nfunction formatWindowLabel(minutes: number | undefined, fallback: \"5h\" | \"weekly\", compact: boolean): string {\n if (!minutes || !Number.isFinite(minutes) || minutes <= 0) {\n return compact && fallback === \"weekly\" ? \"wk\" : capitalize(fallback);\n }\n if (minutes === 10_080) return compact ? \"wk\" : \"Weekly\";\n if (minutes % 10_080 === 0) return `${minutes / 10_080}w`;\n if (minutes % 1_440 === 0) return `${minutes / 1_440}d`;\n if (minutes % 60 === 0) return `${minutes / 60}h`;\n return `${minutes}m`;\n}\n\nfunction formatResetCountdown(resetsAt: number | undefined, now: number): string | undefined {\n if (resetsAt === undefined || !Number.isFinite(resetsAt) || !Number.isFinite(now)) return undefined;\n const totalMinutes = Math.max(0, Math.ceil((resetsAt * 1_000 - now) / 60_000));\n const days = Math.floor(totalMinutes / 1_440);\n const hours = Math.floor((totalMinutes % 1_440) / 60);\n const minutes = totalMinutes % 60;\n if (days > 0) {\n return [`${String(days)}d`, hours > 0 ? `${String(hours)}h` : minutes > 0 ? `${String(minutes)}m` : \"\"]\n .filter(Boolean)\n .join(\"\");\n }\n if (hours > 0) return [`${String(hours)}h`, minutes > 0 ? `${String(minutes)}m` : \"\"].filter(Boolean).join(\"\");\n return `${String(minutes)}m`;\n}\n\nfunction formatMetricValue(value: number | string, unit: UsageBucket[\"unit\"] | undefined): string {\n if (unit === \"usd\" && typeof value === \"number\") return formatUsd(value);\n if (unit === \"percent\" && typeof value === \"number\") return `${value}%`;\n return String(value);\n}\n\nfunction formatUsd(value: number): string {\n return `$${value.toFixed(2)}`;\n}\n\nfunction formatReset(epochSeconds: number): string {\n const reset = new Date(epochSeconds * 1000);\n if (Number.isNaN(reset.getTime())) return \"at an unknown time\";\n const time = `${reset.getHours().toString().padStart(2, \"0\")}:${reset.getMinutes().toString().padStart(2, \"0\")}`;\n const now = new Date();\n if (reset.toDateString() === now.toDateString()) return time;\n return `${time} on ${reset.getDate()} ${reset.toLocaleDateString(undefined, { month: \"short\" })}`;\n}\n\nfunction capitalize(value: string): string {\n return `${value[0]?.toUpperCase() ?? \"\"}${value.slice(1)}`;\n}\n\nfunction clampPercent(value: number): number {\n return Math.min(100, Math.max(0, value));\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { constants } from \"node:fs\";\nimport { chmod, mkdir, open, rename, rm, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, join } from \"node:path\";\nimport { getAgentDir } from \"@earendil-works/pi-coding-agent\";\nimport { isFireworksAccountId } from \"./providers/fireworks.js\";\nimport { isBoundedTargetId } from \"./usage-targets.js\";\n\nexport const USAGE_SETTINGS_FILE = \"pi-usage.json\";\nexport const MAX_USAGE_SETTINGS_BYTES = 64 * 1024;\n\nexport type CodexStatusPercentage = \"remaining\" | \"used\";\n\nexport interface UsageSettings {\n codexFastMode: boolean;\n codexStatusResetCountdown: boolean;\n codexStatusPercentage: CodexStatusPercentage;\n selectedTargets: Record<string, string>;\n}\n\nexport const DEFAULT_USAGE_SETTINGS: Readonly<UsageSettings> = Object.freeze({\n codexFastMode: false,\n codexStatusResetCountdown: true,\n codexStatusPercentage: \"remaining\",\n selectedTargets: Object.freeze({}),\n});\n\nexport interface UsageSettingsState {\n kind: \"missing\" | \"loaded\" | \"invalid\";\n path: string;\n settings: UsageSettings;\n document?: Record<string, unknown>;\n issue?: string;\n}\n\nexport type UsageTargetPublicationCheck = () => Promise<void>;\n\nexport interface UsageSettingsRuntime {\n get(): Readonly<UsageSettingsState>;\n reload(signal?: AbortSignal): Promise<Readonly<UsageSettingsState>>;\n update(patch: Partial<UsageSettings>, signal?: AbortSignal): Promise<Readonly<UsageSettingsState>>;\n updateSelectedTarget(\n providerId: string,\n targetId: string,\n signal?: AbortSignal,\n checkPublishedSelection?: UsageTargetPublicationCheck,\n ): Promise<Readonly<UsageSettingsState>>;\n flush(): Promise<void>;\n}\n\ninterface UsageSettingsFileOperations {\n rename: typeof rename;\n writeFile: typeof writeFile;\n}\n\ninterface UsageSettingsRuntimeOptions {\n operations?: Partial<UsageSettingsFileOperations>;\n path?: string;\n}\n\nexport function usageSettingsPath(): string {\n return join(getAgentDir(), USAGE_SETTINGS_FILE);\n}\n\nexport function normalizeUsageSettings(value: unknown): UsageSettings | undefined {\n if (!isRecord(value)) return undefined;\n if (Object.hasOwn(value, \"codexFastMode\") && typeof value.codexFastMode !== \"boolean\") {\n return undefined;\n }\n if (Object.hasOwn(value, \"codexStatusResetCountdown\") && typeof value.codexStatusResetCountdown !== \"boolean\") {\n return undefined;\n }\n if (\n Object.hasOwn(value, \"codexStatusPercentage\") &&\n value.codexStatusPercentage !== \"remaining\" &&\n value.codexStatusPercentage !== \"used\"\n ) {\n return undefined;\n }\n if (Object.hasOwn(value, \"fireworksAccountId\") && !isFireworksAccountId(value.fireworksAccountId)) {\n return undefined;\n }\n const selectedTargets = normalizeSelectedTargets(value.selectedTargets);\n if (Object.hasOwn(value, \"selectedTargets\") && !selectedTargets) return undefined;\n const effectiveTargets = { ...(selectedTargets ?? {}) };\n if (!effectiveTargets.fireworks && isFireworksAccountId(value.fireworksAccountId)) {\n effectiveTargets.fireworks = value.fireworksAccountId;\n }\n return {\n codexFastMode:\n typeof value.codexFastMode === \"boolean\" ? value.codexFastMode : DEFAULT_USAGE_SETTINGS.codexFastMode,\n codexStatusResetCountdown:\n typeof value.codexStatusResetCountdown === \"boolean\"\n ? value.codexStatusResetCountdown\n : DEFAULT_USAGE_SETTINGS.codexStatusResetCountdown,\n codexStatusPercentage:\n value.codexStatusPercentage === \"used\" ? \"used\" : DEFAULT_USAGE_SETTINGS.codexStatusPercentage,\n selectedTargets: effectiveTargets,\n };\n}\n\nexport async function loadUsageSettings(path = usageSettingsPath(), signal?: AbortSignal): Promise<UsageSettingsState> {\n throwIfAborted(signal);\n try {\n const handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);\n let text: string;\n try {\n const stats = await handle.stat();\n throwIfAborted(signal);\n if (!stats.isFile()) throw new Error(\"settings path is not a regular file\");\n if (stats.size > MAX_USAGE_SETTINGS_BYTES) {\n throw new Error(\"settings file exceeds 64 KiB\");\n }\n text = await handle.readFile(\"utf8\");\n } finally {\n await handle.close();\n }\n throwIfAborted(signal);\n const document = JSON.parse(text) as unknown;\n const settings = normalizeUsageSettings(document);\n if (!settings || !isRecord(document)) throw new Error(\"invalid settings shape\");\n return { kind: \"loaded\", path, settings, document };\n } catch (error) {\n if (signal?.aborted) throw error;\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return {\n kind: \"missing\",\n path,\n settings: { ...DEFAULT_USAGE_SETTINGS },\n document: {},\n };\n }\n return {\n kind: \"invalid\",\n path,\n settings: { ...DEFAULT_USAGE_SETTINGS },\n issue:\n isNodeError(error) && error.code === \"ELOOP\"\n ? \"symbolic links are not accepted\"\n : error instanceof Error\n ? error.message\n : String(error),\n };\n }\n}\n\nexport function createUsageSettingsRuntime(options: UsageSettingsRuntimeOptions | string = {}): UsageSettingsRuntime {\n const path = typeof options === \"string\" ? options : (options.path ?? usageSettingsPath());\n const operations: UsageSettingsFileOperations = {\n rename,\n writeFile,\n ...(typeof options === \"string\" ? undefined : options.operations),\n };\n let state: UsageSettingsState = {\n kind: \"missing\",\n path,\n settings: { ...DEFAULT_USAGE_SETTINGS },\n document: {},\n };\n let queue = Promise.resolve();\n const enqueue = <T>(operation: () => Promise<T>): Promise<T> => {\n const result = queue.then(operation, operation);\n queue = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n };\n return {\n get: () => structuredClone(state),\n reload: (signal) =>\n enqueue(async () => {\n const loaded = await loadUsageSettings(path, signal);\n state = loaded;\n return structuredClone(state);\n }),\n update: (patch, signal) =>\n enqueue(async () => {\n const saved = await saveUsageSettingsPatch(path, patch, operations, signal);\n state = saved;\n return structuredClone(state);\n }),\n updateSelectedTarget: (providerId, targetId, signal, checkPublishedSelection) =>\n enqueue(async () => {\n const transaction = await saveUsageTargetSelection(path, providerId, targetId, operations, signal);\n try {\n await checkPublishedSelection?.();\n throwIfAborted(signal);\n } catch (error) {\n try {\n await restoreUsageSettingsState(path, transaction.saved, transaction.previous, operations);\n state = transaction.previous;\n } catch (rollbackError) {\n state = await loadUsageSettings(path);\n throw new AggregateError(\n [error, rollbackError],\n \"Target selection changed after publication and pi-usage.json rollback failed\",\n );\n }\n throw error;\n }\n state = transaction.saved;\n return structuredClone(state);\n }),\n flush: () => queue,\n };\n}\n\nasync function saveUsageSettingsPatch(\n path: string,\n patch: Partial<UsageSettings>,\n operations: UsageSettingsFileOperations,\n signal?: AbortSignal,\n): Promise<UsageSettingsState> {\n return saveUsageSettingsDocument(\n path,\n (document) => {\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) delete document[key];\n else document[key] = value;\n }\n },\n operations,\n signal,\n );\n}\n\nasync function saveUsageTargetSelection(\n path: string,\n providerId: string,\n targetId: string,\n operations: UsageSettingsFileOperations,\n signal?: AbortSignal,\n): Promise<{ saved: UsageSettingsState; previous: UsageSettingsState }> {\n if (!isProviderId(providerId) || !isBoundedTargetId(targetId)) {\n throw new Error(\"Refusing to save an invalid usage target selection\");\n }\n const previous = await loadUsageSettings(path, signal);\n const saved = await saveUsageSettingsDocument(\n path,\n (document) => {\n document.selectedTargets = {\n ...(normalizeSelectedTargets(document.selectedTargets) ?? {}),\n [providerId]: targetId,\n };\n if (providerId === \"fireworks\") delete document.fireworksAccountId;\n },\n operations,\n signal,\n previous,\n );\n return { saved, previous };\n}\n\nasync function saveUsageSettingsDocument(\n path: string,\n mutate: (document: Record<string, unknown>) => void,\n operations: UsageSettingsFileOperations,\n signal?: AbortSignal,\n expected?: UsageSettingsState,\n): Promise<UsageSettingsState> {\n const latest = await loadUsageSettings(path, signal);\n if (latest.kind === \"invalid\") {\n throw new Error(\"Cannot overwrite an invalid pi-usage.json; repair it and reload first\");\n }\n if (expected && !sameUsageSettingsDocument(latest, expected)) {\n throw new Error(\"pi-usage.json changed while saving; retry the action\");\n }\n const document = { ...latest.document };\n mutate(document);\n const settings = normalizeUsageSettings(document);\n if (!settings) throw new Error(\"Refusing to save invalid pi-usage settings\");\n const directory = dirname(path);\n const temporaryPath = join(directory, `.${basename(path)}.${randomUUID()}.tmp`);\n await mkdir(directory, { recursive: true, mode: 0o700 });\n throwIfAborted(signal);\n try {\n await operations.writeFile(temporaryPath, `${JSON.stringify(document, null, 2)}\\n`, {\n encoding: \"utf8\",\n flag: \"wx\",\n mode: 0o600,\n });\n if (process.platform !== \"win32\") await chmodPrivate(temporaryPath);\n throwIfAborted(signal);\n const current = await loadUsageSettings(path, signal);\n if (\n current.kind === \"invalid\" ||\n current.kind !== latest.kind ||\n JSON.stringify(current.document) !== JSON.stringify(latest.document)\n ) {\n throw new Error(\"pi-usage.json changed while saving; retry the action\");\n }\n throwIfAborted(signal);\n await operations.rename(temporaryPath, path);\n } finally {\n await rm(temporaryPath, { force: true }).catch(() => undefined);\n }\n return { kind: \"loaded\", path, settings, document };\n}\n\nasync function restoreUsageSettingsState(\n path: string,\n published: UsageSettingsState,\n previous: UsageSettingsState,\n operations: UsageSettingsFileOperations,\n): Promise<void> {\n if (previous.kind === \"missing\") {\n const current = await loadUsageSettings(path);\n if (!sameUsageSettingsDocument(current, published)) {\n throw new Error(\"pi-usage.json changed before target selection rollback\");\n }\n await rm(path);\n return;\n }\n if (previous.kind !== \"loaded\" || !previous.document) {\n throw new Error(\"Cannot restore invalid prior pi-usage.json settings\");\n }\n await saveUsageSettingsDocument(\n path,\n (document) => {\n for (const key of Object.keys(document)) delete document[key];\n Object.assign(document, previous.document);\n },\n operations,\n undefined,\n published,\n );\n}\n\nfunction sameUsageSettingsDocument(\n left: Pick<UsageSettingsState, \"kind\" | \"document\">,\n right: Pick<UsageSettingsState, \"kind\" | \"document\">,\n): boolean {\n return left.kind === right.kind && JSON.stringify(left.document) === JSON.stringify(right.document);\n}\n\nasync function chmodPrivate(path: string): Promise<void> {\n await chmod(path, 0o600);\n}\n\nfunction throwIfAborted(signal?: AbortSignal): void {\n if (signal?.aborted) throw new DOMException(\"Settings operation aborted\", \"AbortError\");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error;\n}\n\nfunction normalizeSelectedTargets(value: unknown): Record<string, string> | undefined {\n if (value === undefined) return {};\n if (!isRecord(value)) return undefined;\n const targets: Record<string, string> = {};\n for (const [providerId, targetId] of Object.entries(value)) {\n if (!isProviderId(providerId) || !isBoundedTargetId(targetId)) return undefined;\n targets[providerId] = targetId;\n }\n return targets;\n}\n\nfunction isProviderId(value: string): boolean {\n return /^[A-Za-z0-9][A-Za-z0-9._~-]{0,127}$/u.test(value);\n}\n", "// This orchestrator intentionally remains over 1,000 lines because its menu, query generations,\n// account cache, cancellation, and session lifecycle share one consistency boundary.\nimport { randomUUID } from \"node:crypto\";\nimport type { ExtensionAPI, ExtensionCommandContext, ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { isOfficialCodexModel } from \"./codex-fast.js\";\nimport { FAST_USAGE_WARNING, registerCodexFastMode } from \"./codex-fast-runtime.js\";\nimport {\n type CodexResetAvailability,\n type CodexResetOption,\n type CodexResetOutcome,\n codexResetActionDescription,\n codexResetCount,\n consumeCodexResetCredit,\n formatCodexResetOutcome,\n genericCodexResetOption,\n listCodexResetCredits,\n resetConfirmationLines,\n resetLabel,\n resetOptionExpiration,\n resolveCodexResetAuth,\n} from \"./codex-resets.js\";\nimport { abortError, awaitWithDeadline, errorMessage, runWithConcurrency, UsageCache } from \"./core.js\";\nimport { formatProviderStates, formatUsageStatusline } from \"./format.js\";\nimport { createOAuthCredentialCandidateReader } from \"./oauth-credential-source.js\";\nimport { UnsupportedOpenAIUsageAuthError } from \"./providers/openai-chatgpt.js\";\nimport {\n adapterForProvider,\n isStaleExtensionContextError,\n queryProviderUsage,\n resolveUsageAuth as resolveRuntimeUsageAuth,\n} from \"./query.js\";\nimport { createUsageSettingsRuntime, type UsageSettingsRuntime, type UsageSettingsState } from \"./settings.js\";\nimport type {\n PiModel,\n ProviderUsageState,\n ResolvedUsageAuth,\n UsageDisplayState,\n UsageProviderAdapter,\n} from \"./types.js\";\nimport {\n configuredAdapters,\n isAbortError,\n isTimeoutError,\n modelIdentity,\n providerDisplayName,\n setBoundedMap,\n} from \"./usage-helpers.js\";\nimport { showUsageSettings } from \"./usage-settings-ui.js\";\nimport { createUsageTargetSelectOptions, listUsageTargets, resolveUsageTarget } from \"./usage-targets.js\";\n\nconst CACHE_TTL_MS = 5 * 60 * 1000;\nconst STATUS_COUNTDOWN_REFRESH_MS = 60 * 1000;\nconst DEFAULT_TIMEOUT_MS = 15_000;\nconst COMMAND_CODE_REVALIDATION_RESERVE_MS = 1_000;\nconst ALL_PROVIDER_CONCURRENCY = 2;\nconst FAILURE_BACKOFF_MS = 30_000;\nconst MAX_ACCOUNT_STATES = 32;\nconst STATUS_KEY = \"usage\";\n\nconst REFRESH_CURRENT = \"Refresh current usage\";\nconst VIEW_ANOTHER = \"View another configured provider\u2026\";\nconst VIEW_ALL = \"View all configured providers\u2026\";\nconst CLOSE = \"Close\";\nconst SETTINGS = \"Settings\";\nconst REDEEM_CODEX_RESET = \"Redeem usage limit reset\u2026\";\n\ntype UsageExtensionDependencies = {\n credentialReader?: (providerId: string) => unknown;\n createRedemptionId?: () => string;\n settingsRuntime?: UsageSettingsRuntime;\n};\n\ntype QueryOutcome = {\n state: ProviderUsageState;\n fingerprint?: string;\n authState?: \"unavailable\" | \"unsupported\" | \"failed\";\n rememberedTargetId?: string;\n};\n\nclass UsageTargetSelectionChangedError extends Error {\n override readonly name = \"UsageTargetSelectionChangedError\";\n}\n\ntype StableCurrent = {\n outcome: QueryOutcome;\n model: PiModel | undefined;\n};\n\nexport default function usageExtension(pi: ExtensionAPI, dependencies: UsageExtensionDependencies = {}) {\n const credentialReader = dependencies.credentialReader;\n const credentialCandidates = createOAuthCredentialCandidateReader(pi, credentialReader);\n const createRedemptionId = dependencies.createRedemptionId ?? randomUUID;\n const settingsRuntime = dependencies.settingsRuntime ?? createUsageSettingsRuntime();\n const resolveUsageAuth = resolveRuntimeUsageAuth;\n const cache = new UsageCache(CACHE_TTL_MS);\n const failureBackoff = new Map<string, { until: number; message: string }>();\n const latestQueries = new Map<string, number>();\n const activeControllers = new Set<AbortController>();\n const nativeQueryControllers = new Set<AbortController>();\n let querySequence = 0;\n let activeCurrentIdentity: string | undefined;\n let sessionActive = false;\n let statusGeneration = 0;\n let sessionGeneration = 0;\n let statusRefreshTimer: ReturnType<typeof setTimeout> | undefined;\n let statusCountdownTimer: ReturnType<typeof setTimeout> | undefined;\n let statusController: AbortController | undefined;\n let fastRuntime: ReturnType<typeof registerCodexFastMode>;\n\n const clearStatusRefreshTimer = () => {\n if (statusRefreshTimer) clearTimeout(statusRefreshTimer);\n statusRefreshTimer = undefined;\n };\n\n const clearStatusCountdownTimer = () => {\n if (statusCountdownTimer) clearTimeout(statusCountdownTimer);\n statusCountdownTimer = undefined;\n };\n\n const clearStatusTimers = () => {\n clearStatusRefreshTimer();\n clearStatusCountdownTimer();\n };\n\n const safeSetStatus = (ctx: ExtensionContext, value: string | undefined): boolean => {\n try {\n ctx.ui.setStatus(STATUS_KEY, value);\n return true;\n } catch (error) {\n if (isStaleExtensionContextError(error)) return false;\n throw error;\n }\n };\n\n const clearStatus = (ctx: ExtensionContext) => {\n statusGeneration += 1;\n statusController?.abort();\n statusController = undefined;\n clearStatusTimers();\n safeSetStatus(ctx, undefined);\n };\n\n const scheduleStatusRefresh = (ctx: ExtensionContext, model: PiModel) => {\n clearStatusRefreshTimer();\n const generation = statusGeneration;\n statusRefreshTimer = setTimeout(() => {\n statusRefreshTimer = undefined;\n if (!sessionActive || generation !== statusGeneration) return;\n startStatusRefresh(ctx, model, true);\n }, CACHE_TTL_MS);\n statusRefreshTimer.unref?.();\n };\n\n const publishStatus = (ctx: ExtensionContext, outcome: QueryOutcome, model: PiModel, shouldSchedule: boolean) => {\n clearStatusCountdownTimer();\n if (adapterForProvider(model.provider)?.publishesStatusline === false) {\n clearStatusRefreshTimer();\n safeSetStatus(ctx, undefined);\n return;\n }\n if (outcome.state.status === \"unsupported\") {\n clearStatusRefreshTimer();\n safeSetStatus(ctx, undefined);\n return;\n }\n if (outcome.state.status !== \"ready\") {\n const chip =\n outcome.state.status === \"auth-unavailable\"\n ? \"auth unavailable\"\n : outcome.state.status === \"selection-required\"\n ? \"selection required\"\n : `usage err: ${outcome.state.message.slice(0, 50)}`;\n\n if (safeSetStatus(ctx, chip)) {\n if (shouldSchedule && sessionActive) scheduleStatusRefresh(ctx, model);\n }\n return;\n }\n const settings = settingsRuntime.get().settings;\n const showCodexResetCountdown =\n outcome.state.report.providerId === \"openai-codex\" && settings.codexStatusResetCountdown;\n const isCompanionReport = outcome.state.report.source === \"openai-chatgpt-companion\";\n const now = Date.now();\n const rawValue = formatUsageStatusline(\n outcome.state.report,\n model,\n now,\n showCodexResetCountdown,\n settings.codexStatusPercentage,\n );\n const value = rawValue ? fastRuntime.decorateStatus(model, rawValue) : undefined;\n if (!safeSetStatus(ctx, value)) return;\n if (shouldSchedule && sessionActive) scheduleStatusRefresh(ctx, model);\n if (\n sessionActive &&\n (showCodexResetCountdown || isCompanionReport) &&\n outcome.state.report.buckets.some(\n (bucket) =>\n (!isCompanionReport || bucket.groupId === \"chatgpt-plan\") &&\n bucket.resetsAt !== undefined &&\n Number.isFinite(bucket.resetsAt) &&\n bucket.resetsAt * 1_000 > now,\n )\n ) {\n const generation = statusGeneration;\n statusCountdownTimer = setTimeout(() => {\n statusCountdownTimer = undefined;\n if (!sessionActive || generation !== statusGeneration) return;\n publishStatus(ctx, outcome, model, false);\n }, STATUS_COUNTDOWN_REFRESH_MS);\n statusCountdownTimer.unref?.();\n }\n };\n\n const invalidateProviderState = (providerId: string) => {\n cache.clearProvider(providerId);\n for (const key of failureBackoff.keys()) {\n if (key.startsWith(`${providerId}:`)) failureBackoff.delete(key);\n }\n for (const key of latestQueries.keys()) {\n if (key.startsWith(`${providerId}:`)) latestQueries.delete(key);\n }\n };\n\n const transitionCurrentIdentity = (nextIdentity: string, providerId: string) => {\n if (!activeCurrentIdentity || activeCurrentIdentity === nextIdentity) {\n activeCurrentIdentity = nextIdentity;\n return;\n }\n const previousProviderId = activeCurrentIdentity.split(\":\", 1)[0] ?? \"\";\n for (const id of new Set([previousProviderId, providerId])) {\n if (id) invalidateProviderState(id);\n }\n activeCurrentIdentity = nextIdentity;\n };\n\n const queryAdapterStateInternal = async (\n ctx: ExtensionContext,\n adapter: UsageProviderAdapter,\n displayState: UsageDisplayState,\n force: boolean,\n signal: AbortSignal,\n authRetry = 0,\n deadlineAt = Date.now() + DEFAULT_TIMEOUT_MS,\n ): Promise<QueryOutcome> => {\n const expectedSessionGeneration = sessionGeneration;\n const expectedSessionId = ctx.sessionManager.getSessionId();\n const expectedModelIdentity = modelIdentity(ctx.model);\n const expectedTargetId = adapter.targets ? settingsRuntime.get().settings.selectedTargets[adapter.id] : undefined;\n const providerName = providerDisplayName(ctx, adapter.id);\n let auth: ResolvedUsageAuth | undefined;\n try {\n auth = await awaitWithDeadline(\n resolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n signal,\n Math.max(1, deadlineAt - Date.now()),\n `resolving ${adapter.displayName} runtime auth`,\n );\n } catch (error) {\n if (isStaleExtensionContextError(error) || isAbortError(error)) throw error;\n if (adapter.id === \"openai\") invalidateProviderState(adapter.id);\n const authState =\n error instanceof UnsupportedOpenAIUsageAuthError\n ? \"unsupported\"\n : adapter.id === \"openai\" && !isTimeoutError(error)\n ? \"failed\"\n : undefined;\n if (displayState === \"current\") {\n transitionCurrentIdentity(`${adapter.id}:auth-error`, adapter.id);\n }\n return {\n state: {\n providerId: adapter.id,\n providerName,\n displayState,\n status:\n authState === \"unsupported\" ? \"unsupported\" : isTimeoutError(error) ? \"query-failed\" : \"auth-unavailable\",\n message: errorMessage(error),\n },\n ...(authState ? { authState } : {}),\n };\n }\n const requiresRequestBoundaryGuard =\n adapter.targets !== undefined ||\n [\n \"baseten\",\n \"command-code\",\n \"deepseek\",\n \"minimax\",\n \"minimax-cn\",\n \"moonshotai\",\n \"moonshotai-cn\",\n \"openai\",\n \"vercel-ai-gateway\",\n \"xai\",\n \"zai\",\n \"zai-coding-cn\",\n ].includes(adapter.id);\n const requestContextChanged = () =>\n expectedSessionGeneration !== sessionGeneration ||\n ctx.sessionManager.getSessionId() !== expectedSessionId ||\n modelIdentity(ctx.model) !== expectedModelIdentity ||\n (adapter.targets !== undefined &&\n settingsRuntime.get().settings.selectedTargets[adapter.id] !== expectedTargetId);\n if (requiresRequestBoundaryGuard && requestContextChanged()) throw abortError();\n if (!auth) {\n if (adapter.id === \"openai\") invalidateProviderState(adapter.id);\n if (displayState === \"current\") {\n transitionCurrentIdentity(`${adapter.id}:unavailable`, adapter.id);\n }\n return {\n state: {\n providerId: adapter.id,\n providerName,\n displayState,\n status: \"auth-unavailable\",\n message: `No runtime credential is configured for ${providerName}.`,\n },\n authState: \"unavailable\",\n };\n }\n if (adapter.id === \"openai\" && !auth.openaiCompanion) invalidateProviderState(adapter.id);\n let retryableAuthChanged = false;\n const guard = async () => {\n if (signal.aborted || requestContextChanged()) throw abortError();\n if (!requiresRequestBoundaryGuard) return;\n const revalidated = await awaitWithDeadline(\n resolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n signal,\n Math.max(1, deadlineAt - Date.now()),\n `revalidating ${providerName} runtime auth`,\n );\n if (signal.aborted || requestContextChanged()) throw abortError();\n if (revalidated?.fingerprint !== auth.fingerprint) {\n if ([\"deepseek\", \"minimax\", \"minimax-cn\"].includes(adapter.id)) {\n retryableAuthChanged = true;\n throw new Error(`${providerName} runtime credential changed during the usage query.`);\n }\n throw abortError();\n }\n };\n let queryFingerprint = adapter.targets\n ? `${auth.fingerprint}:target:${expectedTargetId ?? \"unresolved\"}`\n : auth.fingerprint;\n let failureKey = `${adapter.id}:${queryFingerprint}`;\n let queryId: number | undefined;\n try {\n const previousDiscoveryFailure = failureBackoff.get(failureKey);\n if (!force && previousDiscoveryFailure && previousDiscoveryFailure.until > Date.now()) {\n return {\n state: {\n providerId: adapter.id,\n providerName,\n displayState,\n status: \"query-failed\",\n message: previousDiscoveryFailure.message,\n },\n fingerprint: auth.fingerprint,\n rememberedTargetId: expectedTargetId,\n };\n }\n const target = await resolveUsageTarget(\n adapter,\n auth,\n expectedTargetId,\n signal,\n Math.max(1, deadlineAt - Date.now()),\n guard,\n );\n if (target.kind === \"selection-required\") {\n if (displayState === \"current\") {\n transitionCurrentIdentity(`${adapter.id}:${queryFingerprint}`, adapter.id);\n }\n return {\n state: {\n providerId: adapter.id,\n providerName,\n displayState,\n status: \"selection-required\",\n singularLabel: adapter.targets?.singularLabel ?? \"target\",\n pluralLabel: adapter.targets?.pluralLabel ?? \"targets\",\n choices: target.choices,\n },\n fingerprint: auth.fingerprint,\n rememberedTargetId: expectedTargetId,\n };\n }\n queryFingerprint = adapter.targets ? `${auth.fingerprint}:target:${target.targetId ?? \"none\"}` : auth.fingerprint;\n failureKey = `${adapter.id}:${queryFingerprint}`;\n if (displayState === \"current\") {\n transitionCurrentIdentity(`${adapter.id}:${queryFingerprint}`, adapter.id);\n }\n const cached = !force ? cache.get(adapter.id, queryFingerprint) : undefined;\n if (cached) {\n return {\n state: {\n providerId: adapter.id,\n providerName,\n displayState,\n status: \"ready\",\n report: cached,\n },\n fingerprint: auth.fingerprint,\n rememberedTargetId: expectedTargetId,\n };\n }\n const previousFailure = failureBackoff.get(failureKey);\n if (!force && previousFailure && previousFailure.until > Date.now()) {\n return {\n state: {\n providerId: adapter.id,\n providerName,\n displayState,\n status: \"query-failed\",\n message: previousFailure.message,\n },\n fingerprint: auth.fingerprint,\n rememberedTargetId: expectedTargetId,\n };\n }\n failureBackoff.delete(failureKey);\n querySequence += 1;\n queryId = querySequence;\n setBoundedMap(latestQueries, failureKey, queryId, MAX_ACCOUNT_STATES);\n // Command Code can retain partial data after an optional transport timeout. Keep time\n // inside the overall deadline for its remaining auth guards and publication guard.\n const queryTimeoutMs = Math.max(\n 1,\n deadlineAt - Date.now() - (adapter.id === \"command-code\" ? COMMAND_CODE_REVALIDATION_RESERVE_MS : 0),\n );\n const report = await queryProviderUsage(\n adapter,\n auth,\n signal,\n queryTimeoutMs,\n requiresRequestBoundaryGuard ? guard : undefined,\n target.targetId,\n );\n if (requiresRequestBoundaryGuard) await guard();\n const effectiveReport = { ...report, providerName };\n if (latestQueries.get(failureKey) === queryId) {\n cache.set(adapter.id, queryFingerprint, effectiveReport);\n failureBackoff.delete(failureKey);\n }\n return {\n state: {\n providerId: adapter.id,\n providerName,\n displayState,\n status: \"ready\",\n report: effectiveReport,\n },\n fingerprint: auth.fingerprint,\n rememberedTargetId: expectedTargetId,\n };\n } catch (error) {\n if (isStaleExtensionContextError(error) || isAbortError(error)) throw error;\n if (\n retryableAuthChanged &&\n authRetry === 0 &&\n !signal.aborted &&\n !requestContextChanged() &&\n Date.now() < deadlineAt\n ) {\n if (queryId !== undefined && latestQueries.get(failureKey) === queryId) {\n latestQueries.delete(failureKey);\n }\n return queryAdapterState(ctx, adapter, displayState, true, signal, authRetry + 1, deadlineAt);\n }\n const message = errorMessage(error);\n const now = Date.now();\n for (const [key, failure] of failureBackoff) {\n if (failure.until <= now) failureBackoff.delete(key);\n }\n if (queryId === undefined || latestQueries.get(failureKey) === queryId) {\n if (adapter.invalidateCacheOnFailure) cache.delete(adapter.id, queryFingerprint);\n setBoundedMap(failureBackoff, failureKey, { until: now + FAILURE_BACKOFF_MS, message }, MAX_ACCOUNT_STATES);\n }\n return {\n state: {\n providerId: adapter.id,\n providerName,\n displayState,\n status: \"query-failed\",\n message,\n },\n fingerprint: auth.fingerprint,\n rememberedTargetId: expectedTargetId,\n };\n }\n };\n\n const queryAdapterState = async (...args: Parameters<typeof queryAdapterStateInternal>): Promise<QueryOutcome> => {\n const [ctx, adapter, displayState, force, signal, ...rest] = args;\n if (adapter.id !== \"openai\") return queryAdapterStateInternal(...args);\n const controller = new AbortController();\n nativeQueryControllers.add(controller);\n try {\n return await queryAdapterStateInternal(\n ctx,\n adapter,\n displayState,\n force,\n AbortSignal.any([signal, controller.signal]),\n ...rest,\n );\n } finally {\n nativeQueryControllers.delete(controller);\n }\n };\n\n const loadTargetChoices = async (ctx: ExtensionContext, adapter: UsageProviderAdapter, signal: AbortSignal) => {\n if (!adapter.targets) throw new Error(\"Provider does not support usage targets.\");\n const expectedSessionGeneration = sessionGeneration;\n const expectedSessionId = ctx.sessionManager.getSessionId();\n const expectedModel = modelIdentity(ctx.model);\n const expectedTargetId = settingsRuntime.get().settings.selectedTargets[adapter.id];\n const deadlineAt = Date.now() + DEFAULT_TIMEOUT_MS;\n const changed = () =>\n expectedSessionGeneration !== sessionGeneration ||\n ctx.sessionManager.getSessionId() !== expectedSessionId ||\n modelIdentity(ctx.model) !== expectedModel ||\n settingsRuntime.get().settings.selectedTargets[adapter.id] !== expectedTargetId;\n const auth = await awaitWithDeadline(\n resolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n signal,\n Math.max(1, deadlineAt - Date.now()),\n `resolving ${providerDisplayName(ctx, adapter.id)} runtime auth`,\n );\n if (!auth || signal.aborted || changed()) throw abortError();\n const guard = async () => {\n if (signal.aborted || changed()) throw abortError();\n const revalidated = await awaitWithDeadline(\n resolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n signal,\n Math.max(1, deadlineAt - Date.now()),\n `revalidating ${providerDisplayName(ctx, adapter.id)} runtime auth`,\n );\n if (signal.aborted || changed() || revalidated?.fingerprint !== auth.fingerprint) {\n throw abortError();\n }\n };\n const choices = await listUsageTargets(adapter, auth, signal, Math.max(1, deadlineAt - Date.now()), guard);\n return { choices, fingerprint: auth.fingerprint };\n };\n\n const queryCurrentState = async (\n ctx: ExtensionContext,\n model: PiModel | undefined,\n force: boolean,\n signal: AbortSignal,\n ): Promise<QueryOutcome> => {\n const adapter = adapterForProvider(model?.provider);\n if (!adapter) {\n const providerId = model?.provider ?? \"none\";\n transitionCurrentIdentity(`unsupported:${providerId}`, providerId);\n return {\n state: {\n providerId,\n providerName: providerDisplayName(ctx, providerId),\n displayState: \"current\",\n status: \"unsupported\",\n message: model\n ? `Usage reporting is not supported for ${providerDisplayName(ctx, providerId)}.`\n : \"No model is selected.\",\n },\n };\n }\n return queryAdapterState(ctx, adapter, \"current\", force, signal);\n };\n\n const refreshCurrentStatus = async (ctx: ExtensionContext, model: PiModel | undefined, force: boolean) => {\n const adapter = adapterForProvider(model?.provider);\n if (!adapter || !model) {\n const providerId = model?.provider ?? \"none\";\n transitionCurrentIdentity(`unsupported:${providerId}`, providerId);\n clearStatus(ctx);\n return;\n }\n if (adapter.publishesStatusline === false) {\n clearStatus(ctx);\n return;\n }\n statusGeneration += 1;\n const generation = statusGeneration;\n clearStatusCountdownTimer();\n statusController?.abort();\n const controller = new AbortController();\n statusController = controller;\n activeControllers.add(controller);\n try {\n if (!safeSetStatus(ctx, \"checking\")) return;\n const outcome = await queryCurrentState(ctx, model, force, controller.signal);\n if (!sessionActive || generation !== statusGeneration || controller.signal.aborted) return;\n if (!(await outcomeStillCurrent(ctx, model, generation, outcome, controller.signal))) {\n if (sessionActive && generation === statusGeneration) {\n queueMicrotask(() => startStatusRefresh(ctx, ctx.model, false));\n }\n return;\n }\n publishStatus(ctx, outcome, model, true);\n } finally {\n activeControllers.delete(controller);\n if (statusController === controller) statusController = undefined;\n }\n };\n\n const startStatusRefresh = (ctx: ExtensionContext, model: PiModel | undefined, force: boolean) => {\n void refreshCurrentStatus(ctx, model, force).catch((error) => {\n if (isStaleExtensionContextError(error) || isAbortError(error)) return;\n const message = errorMessage(error);\n console.error(\"[pi-usage] refresh failed:\", message);\n safeSetStatus(ctx, `usage err: ${message.slice(0, 50)}`);\n });\n };\n\n const runMenuOperation = async <T>(\n ctx: ExtensionCommandContext,\n label: string,\n parentSignal: AbortSignal,\n operation: (signal: AbortSignal) => Promise<T>,\n cancellable = true,\n ): Promise<T | undefined> => {\n const { runTask } = await import(\"@narumitw/pi-tui-kit\");\n if (parentSignal.aborted) return undefined;\n const result = await runTask(ctx, {\n label,\n signal: parentSignal,\n cancellable,\n onError: () => undefined,\n task: ({ signal }) => operation(signal),\n });\n switch (result.kind) {\n case \"completed\":\n return result.value;\n case \"cancelled\":\n case \"stale\":\n return undefined;\n case \"error\":\n throw result.error;\n }\n };\n\n const outcomeStillCurrent = async (\n ctx: ExtensionContext,\n model: PiModel | undefined,\n generation: number,\n outcome: QueryOutcome,\n signal: AbortSignal,\n ): Promise<boolean> => {\n if (generation !== statusGeneration || modelIdentity(ctx.model) !== modelIdentity(model)) {\n return false;\n }\n const adapter = adapterForProvider(outcome.state.providerId);\n const selectionStillCurrent =\n !adapter?.targets || settingsRuntime.get().settings.selectedTargets[adapter.id] === outcome.rememberedTargetId;\n if (!selectionStillCurrent) return false;\n if (outcome.authState) {\n if (!adapter) return false;\n try {\n const auth = await awaitWithDeadline(\n resolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n signal,\n DEFAULT_TIMEOUT_MS,\n `revalidating ${adapter.displayName} runtime auth`,\n );\n return (\n generation === statusGeneration &&\n modelIdentity(ctx.model) === modelIdentity(model) &&\n (!adapter.targets ||\n settingsRuntime.get().settings.selectedTargets[adapter.id] === outcome.rememberedTargetId) &&\n outcome.authState === \"unavailable\" &&\n auth === undefined\n );\n } catch (error) {\n if (isAbortError(error) || isStaleExtensionContextError(error)) throw error;\n // Stable failures are still useful. A recovered credential or changed reason must\n // retry, but confirming the same native failure must not create a refresh loop.\n const unchangedFailure =\n (outcome.authState === \"unsupported\" && error instanceof UnsupportedOpenAIUsageAuthError) ||\n (outcome.authState === \"failed\" &&\n outcome.state.status === \"auth-unavailable\" &&\n !(error instanceof UnsupportedOpenAIUsageAuthError) &&\n !isTimeoutError(error) &&\n errorMessage(error) === outcome.state.message);\n return (\n unchangedFailure &&\n generation === statusGeneration &&\n modelIdentity(ctx.model) === modelIdentity(model) &&\n (!adapter.targets ||\n settingsRuntime.get().settings.selectedTargets[adapter.id] === outcome.rememberedTargetId)\n );\n }\n }\n if (!outcome.fingerprint) return true;\n if (!adapter) return false;\n try {\n const auth = await awaitWithDeadline(\n resolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n signal,\n DEFAULT_TIMEOUT_MS,\n `revalidating ${adapter.displayName} runtime auth`,\n );\n return (\n generation === statusGeneration &&\n modelIdentity(ctx.model) === modelIdentity(model) &&\n (!adapter.targets ||\n settingsRuntime.get().settings.selectedTargets[adapter.id] === outcome.rememberedTargetId) &&\n auth?.fingerprint === outcome.fingerprint\n );\n } catch (error) {\n if (isAbortError(error) || isStaleExtensionContextError(error)) throw error;\n return false;\n }\n };\n\n const queryStableAdapterState = async (\n ctx: ExtensionContext,\n adapter: UsageProviderAdapter,\n displayState: UsageDisplayState,\n force: boolean,\n signal: AbortSignal,\n ): Promise<QueryOutcome> => {\n if (adapter.id !== \"openai\") return queryAdapterState(ctx, adapter, displayState, force, signal);\n // Configured/all-provider views must confirm native auth failures too, independently\n // of the selected provider's subsequent revalidation.\n for (let attempt = 0; attempt < 3; attempt += 1) {\n const model = ctx.model;\n const generation = statusGeneration;\n const outcome = await queryAdapterState(ctx, adapter, displayState, force, signal);\n if (signal.aborted) throw abortError();\n if (await outcomeStillCurrent(ctx, model, generation, outcome, signal)) return outcome;\n force = false;\n }\n throw new Error(\"OpenAI runtime authentication kept changing; reopen /usage to retry.\");\n };\n\n const queryStableCurrent = async (\n ctx: ExtensionCommandContext,\n force: boolean,\n controller: AbortController,\n label: string,\n ): Promise<StableCurrent | undefined> => {\n for (let attempt = 0; attempt < 3; attempt += 1) {\n const model = ctx.model;\n const generation = statusGeneration;\n const result = await runMenuOperation(ctx, label, controller.signal, async (signal) => {\n const outcome = await queryCurrentState(ctx, model, force, signal);\n return {\n outcome,\n stable: await outcomeStillCurrent(ctx, model, generation, outcome, signal),\n };\n });\n if (!result) return undefined;\n if (result.stable) return { outcome: result.outcome, model };\n force = false;\n }\n ctx.ui.notify(\"The active model or account kept changing; reopen /usage to retry.\", \"warning\");\n return undefined;\n };\n\n const publishStableCurrent = (ctx: ExtensionCommandContext, current: StableCurrent) => {\n if (current.model) publishStatus(ctx, current.outcome, current.model, sessionActive);\n else safeSetStatus(ctx, undefined);\n };\n\n const showMenu = async (ctx: ExtensionCommandContext): Promise<void> => {\n if (!ctx.hasUI) throw new Error(\"/usage requires TUI or RPC mode.\");\n const controller = new AbortController();\n activeControllers.add(controller);\n try {\n if (isOfficialCodexModel(ctx.model)) {\n const refreshed = await runMenuOperation(\n ctx,\n \"Checking Codex Fast capability\u2026\",\n controller.signal,\n async (signal) => {\n await fastRuntime.refreshCapabilities(ctx, signal);\n return true;\n },\n );\n if (!refreshed || controller.signal.aborted) return;\n }\n // Capability updates can refresh status; take menu ownership after discovery.\n statusGeneration += 1;\n const menuGeneration = statusGeneration;\n statusController?.abort();\n statusController = undefined;\n clearStatusTimers();\n let stableCurrent = await queryStableCurrent(ctx, false, controller, \"Checking current usage\u2026\");\n if (!stableCurrent) return;\n publishStableCurrent(ctx, stableCurrent);\n let current = stableCurrent.outcome;\n let visibleStates: ProviderUsageState[] = [current.state];\n let fastState = settingsRuntime.get();\n let resetAvailability: CodexResetAvailability | undefined;\n let selectedReset: CodexResetOption | undefined;\n let resetAuthFingerprint: string | undefined;\n let resetModelIdentity: string | undefined;\n let redemptionId: string | undefined;\n let resetOutcome: CodexResetOutcome | undefined;\n let resetFailure: string | undefined;\n const actionableTargetState = (): ProviderUsageState | undefined => {\n if (visibleStates.length !== 1) return undefined;\n const state = visibleStates[0];\n return state &&\n (state.status === \"ready\" || state.status === \"selection-required\") &&\n adapterForProvider(state.providerId)?.targets\n ? state\n : undefined;\n };\n const promptForTarget = async (state: ProviderUsageState, stateFingerprint?: string): Promise<boolean> => {\n const adapter = adapterForProvider(state.providerId);\n if (!adapter?.targets) return false;\n const expectedRememberedTargetId = settingsRuntime.get().settings.selectedTargets[adapter.id];\n const snapshot =\n state.status === \"selection-required\" && stateFingerprint\n ? { choices: state.choices, fingerprint: stateFingerprint }\n : await runMenuOperation(ctx, `Loading ${adapter.targets.pluralLabel}\u2026`, controller.signal, (signal) =>\n loadTargetChoices(ctx, adapter, signal),\n );\n if (!snapshot || controller.signal.aborted || statusGeneration !== menuGeneration) {\n return false;\n }\n const selectOptions = createUsageTargetSelectOptions(snapshot.choices);\n const selected = await ctx.ui.select(\n `Select ${adapter.targets.singularLabel} for ${providerDisplayName(ctx, adapter.id)}`,\n [...selectOptions.options],\n { signal: controller.signal },\n );\n if (\n selected === undefined ||\n controller.signal.aborted ||\n statusGeneration !== menuGeneration ||\n settingsRuntime.get().settings.selectedTargets[adapter.id] !== expectedRememberedTargetId\n ) {\n return false;\n }\n const targetId = selectOptions.targetIdFor(selected);\n if (!targetId) return false;\n const revalidated = await runMenuOperation(\n ctx,\n `Revalidating ${adapter.targets.singularLabel}\u2026`,\n controller.signal,\n (signal) => loadTargetChoices(ctx, adapter, signal),\n );\n if (\n !revalidated ||\n controller.signal.aborted ||\n statusGeneration !== menuGeneration ||\n settingsRuntime.get().settings.selectedTargets[adapter.id] !== expectedRememberedTargetId\n ) {\n return false;\n }\n if (\n revalidated.fingerprint !== snapshot.fingerprint ||\n !revalidated.choices.some((choice) => choice.id === targetId)\n ) {\n ctx.ui.notify(\n `${providerDisplayName(ctx, adapter.id)} ${adapter.targets.pluralLabel} changed; choose again.`,\n \"warning\",\n );\n return false;\n }\n let saved: Readonly<UsageSettingsState> | undefined;\n try {\n saved = await runMenuOperation(ctx, `Saving ${adapter.targets.singularLabel}\u2026`, controller.signal, (signal) =>\n settingsRuntime.updateSelectedTarget(adapter.id, targetId, signal, async () => {\n let published: Awaited<ReturnType<typeof loadTargetChoices>>;\n try {\n published = await loadTargetChoices(ctx, adapter, signal);\n } catch (error) {\n if (\n signal.aborted ||\n controller.signal.aborted ||\n statusGeneration !== menuGeneration ||\n isStaleExtensionContextError(error)\n ) {\n throw error;\n }\n throw new UsageTargetSelectionChangedError();\n }\n if (\n published.fingerprint !== snapshot.fingerprint ||\n !published.choices.some((choice) => choice.id === targetId)\n ) {\n throw new UsageTargetSelectionChangedError();\n }\n }),\n );\n } catch (error) {\n if (error instanceof UsageTargetSelectionChangedError) {\n ctx.ui.notify(\n `${providerDisplayName(ctx, adapter.id)} ${adapter.targets.pluralLabel} changed; choose again.`,\n \"warning\",\n );\n return false;\n }\n throw error;\n }\n if (!saved || controller.signal.aborted || statusGeneration !== menuGeneration) {\n return false;\n }\n invalidateProviderState(adapter.id);\n return true;\n };\n const { defineMenu, runMenu } = await import(\"@narumitw/pi-tui-kit\");\n if (controller.signal.aborted || statusGeneration !== menuGeneration) return;\n type Screen = \"main\" | \"providers\" | \"reset-picker\" | \"reset-confirm\" | \"reset-result\" | \"reset-error\";\n type Action =\n | \"refresh\"\n | \"settings\"\n | \"target\"\n | \"toggle-fast\"\n | \"another\"\n | \"all\"\n | \"provider\"\n | \"open-resets\"\n | \"select-reset\"\n | \"cancel-reset\"\n | \"consume-reset\"\n | \"back-to-usage\"\n | \"back-to-resets\";\n const menu = defineMenu<undefined, Screen, Action, ExtensionCommandContext>({\n start: \"main\",\n screens: {\n main: () => {\n const fastAvailability = fastRuntime.availability(ctx.model);\n const targetState = actionableTargetState();\n const targetAdapter = adapterForProvider(targetState?.providerId);\n const fastLines =\n fastAvailability.kind === \"available\"\n ? [`Fast mode: ${fastAvailability.enabled ? \"On\" : \"Off\"}`, FAST_USAGE_WARNING]\n : fastAvailability.kind === \"unavailable\"\n ? [`Fast mode: Unavailable \u00B7 ${fastAvailability.reason}`]\n : fastAvailability.kind === \"unknown\"\n ? [`Fast mode: Unknown \u00B7 ${fastAvailability.reason}`]\n : [];\n return {\n kind: \"actions\",\n title: \"Provider usage\",\n lines: [...formatProviderStates(visibleStates).split(\"\\n\"), ...fastLines],\n items: [\n { id: \"refresh\", label: REFRESH_CURRENT, action: \"refresh\" },\n { id: \"settings\", label: SETTINGS, action: \"settings\" },\n ...(targetState && targetAdapter?.targets\n ? [\n {\n id: \"target\",\n label: `${targetState.status === \"selection-required\" ? \"Select\" : \"Change\"} ${targetAdapter.targets.singularLabel}\u2026`,\n action: \"target\" as const,\n },\n ]\n : []),\n ...(fastAvailability.kind === \"available\" ||\n (fastState.settings.codexFastMode && isOfficialCodexModel(ctx.model))\n ? [\n {\n id: \"toggle-fast\",\n label: fastState.settings.codexFastMode ? \"Turn Fast mode off\" : \"Turn Fast mode on\",\n description:\n fastState.kind === \"invalid\"\n ? \"Repair pi-usage.json and reload before changing Fast mode.\"\n : FAST_USAGE_WARNING,\n disabled: fastState.kind === \"invalid\",\n action: \"toggle-fast\" as const,\n },\n ]\n : []),\n ...(current.state.status === \"ready\" && current.state.providerId === \"openai-codex\"\n ? [\n {\n id: \"open-resets\",\n label: REDEEM_CODEX_RESET,\n description: codexResetActionDescription(current.state.report),\n disabled: codexResetCount(current.state.report) === 0,\n action: \"open-resets\" as const,\n },\n ]\n : []),\n { id: \"another\", label: VIEW_ANOTHER, action: \"another\" },\n { id: \"all\", label: VIEW_ALL, action: \"all\" },\n { id: \"close\", label: CLOSE, close: true },\n ],\n hint: \"close\",\n };\n },\n providers: () => ({\n kind: \"actions\",\n title: \"Select a configured provider\",\n items: configuredAdapters(ctx)\n .filter((adapter) => adapter.id !== ctx.model?.provider)\n .map((adapter) => ({\n id: adapter.id,\n label: providerDisplayName(ctx, adapter.id),\n action: \"provider\" as const,\n })),\n hint: \"back\",\n }),\n \"reset-picker\": () => ({\n kind: \"choice\",\n title: \"Usage limit resets\",\n lines: [\n `${resetAvailability?.availableCount ?? 0} ${resetLabel(resetAvailability?.availableCount ?? 0)} available.`,\n ],\n items: (resetAvailability?.options ?? []).map((option, index) => ({\n id: `reset-${index}`,\n label: option.title,\n description: resetOptionExpiration(option),\n details: [option.description],\n })),\n action: \"select-reset\",\n initialItemId: \"reset-0\",\n hint: \"back\",\n }),\n \"reset-confirm\": () => ({\n kind: \"actions\",\n title: \"Use this reset?\",\n lines: resetConfirmationLines(selectedReset),\n items: [\n { id: \"cancel-reset\", label: \"No, go back\", action: \"cancel-reset\" },\n { id: \"consume-reset\", label: \"Yes, use reset\", action: \"consume-reset\" },\n ],\n hint: \"back\",\n }),\n \"reset-result\": () => ({\n kind: \"actions\",\n title: \"Usage limit resets\",\n lines: [\n formatCodexResetOutcome(\n resetOutcome,\n current.state.status === \"ready\" ? codexResetCount(current.state.report) : undefined,\n ),\n ],\n items: [\n {\n id: \"back-to-usage\",\n label: \"Back to usage\",\n action: \"back-to-usage\",\n },\n { id: \"close\", label: CLOSE, close: true },\n ],\n hint: \"back\",\n }),\n \"reset-error\": () => ({\n kind: \"actions\",\n title: \"Usage limit resets\",\n lines: [resetFailure ?? \"Couldn't reset usage. Please try again.\"],\n items: [\n { id: \"consume-reset\", label: \"Try again\", action: \"consume-reset\" },\n { id: \"back-to-resets\", label: \"Back\", action: \"back-to-resets\" },\n ],\n hint: \"back\",\n }),\n },\n actions: {\n target: async () => {\n const targetState = actionableTargetState();\n if (!targetState) return { kind: \"rejected\" };\n try {\n const stateFingerprint = targetState === current.state ? current.fingerprint : undefined;\n if (!(await promptForTarget(targetState, stateFingerprint))) {\n return { kind: \"stay\" };\n }\n const adapter = adapterForProvider(targetState.providerId);\n if (!adapter) return { kind: \"rejected\" };\n if (targetState.providerId === ctx.model?.provider) {\n const refreshed = await queryStableCurrent(\n ctx,\n true,\n controller,\n `Checking ${providerDisplayName(ctx, adapter.id)} usage\u2026`,\n );\n if (!refreshed) return { kind: \"stay\" };\n stableCurrent = refreshed;\n current = refreshed.outcome;\n visibleStates = [current.state];\n publishStableCurrent(ctx, refreshed);\n return { kind: \"stay\" };\n }\n const outcome = await runMenuOperation(\n ctx,\n `Checking ${providerDisplayName(ctx, adapter.id)} usage\u2026`,\n controller.signal,\n (signal) => queryStableAdapterState(ctx, adapter, \"configured\", true, signal),\n );\n if (!outcome) return { kind: \"stay\" };\n const revalidated = await queryStableCurrent(ctx, false, controller, \"Revalidating current usage\u2026\");\n if (!revalidated) return { kind: \"stay\" };\n stableCurrent = revalidated;\n current = revalidated.outcome;\n visibleStates = [\n outcome.state.providerId === current.state.providerId\n ? current.state\n : { ...outcome.state, displayState: \"configured\" },\n ];\n return { kind: \"stay\" };\n } catch (error) {\n if (isAbortError(error) || isStaleExtensionContextError(error)) {\n return { kind: \"stay\" };\n }\n ctx.ui.notify(`Could not select target: ${errorMessage(error)}`, \"error\");\n return { kind: \"stay\" };\n }\n },\n settings: async () => {\n await showUsageSettings(\n ctx,\n settingsRuntime,\n controller.signal,\n () => statusGeneration === menuGeneration && !controller.signal.aborted,\n (id) => {\n if (\n (id === \"codexStatusResetCountdown\" || id === \"codexStatusPercentage\") &&\n stableCurrent &&\n statusGeneration === menuGeneration &&\n !controller.signal.aborted\n ) {\n publishStableCurrent(ctx, stableCurrent);\n }\n },\n );\n fastState = settingsRuntime.get();\n const revalidated = await queryStableCurrent(ctx, false, controller, \"Applying usage settings\u2026\");\n if (!revalidated) return { kind: \"stay\" };\n stableCurrent = revalidated;\n current = revalidated.outcome;\n visibleStates = [current.state];\n publishStableCurrent(ctx, revalidated);\n return { kind: \"stay\" };\n },\n \"toggle-fast\": async () => {\n const availability = fastRuntime.availability(ctx.model);\n const enabled = settingsRuntime.get().settings.codexFastMode;\n if ((availability.kind !== \"available\" && !enabled) || fastState.kind === \"invalid\") {\n return { kind: \"rejected\" };\n }\n const changed = await fastRuntime.toggle(ctx, !enabled, controller.signal);\n if (!changed) return { kind: \"rejected\" };\n fastState = settingsRuntime.get();\n return { kind: \"stay\" };\n },\n \"open-resets\": async () => {\n const summaryCount =\n current.state.status === \"ready\" && current.state.providerId === \"openai-codex\"\n ? codexResetCount(current.state.report)\n : undefined;\n try {\n const loaded = await runMenuOperation(\n ctx,\n \"Checking usage limit resets\u2026\",\n controller.signal,\n async (signal) => {\n const expectedModel = modelIdentity(ctx.model);\n const auth = await awaitWithDeadline(\n resolveCodexResetAuth(ctx, undefined, credentialReader, credentialCandidates),\n signal,\n DEFAULT_TIMEOUT_MS,\n \"resolving current Codex reset authentication\",\n );\n let availability: CodexResetAvailability;\n try {\n availability = await listCodexResetCredits(auth, signal, DEFAULT_TIMEOUT_MS);\n } catch (error) {\n if (isAbortError(error) || summaryCount === undefined || summaryCount <= 0) {\n throw error;\n }\n availability = {\n availableCount: summaryCount,\n options: [genericCodexResetOption()],\n };\n }\n const revalidated = await awaitWithDeadline(\n resolveCodexResetAuth(ctx, undefined, credentialReader, credentialCandidates),\n signal,\n DEFAULT_TIMEOUT_MS,\n \"revalidating current Codex reset authentication\",\n );\n if (modelIdentity(ctx.model) !== expectedModel || revalidated.fingerprint !== auth.fingerprint) {\n throw new Error(\"The active Codex model or account changed while loading usage limit resets.\");\n }\n return { availability, auth, expectedModel };\n },\n );\n if (!loaded) return { kind: \"stay\" };\n resetAvailability = loaded.availability;\n resetAuthFingerprint = loaded.auth.fingerprint;\n resetModelIdentity = loaded.expectedModel;\n selectedReset = undefined;\n redemptionId = undefined;\n resetOutcome = undefined;\n resetFailure = undefined;\n return {\n kind: \"to\",\n screen: loaded.availability.availableCount > 0 ? \"reset-picker\" : \"reset-result\",\n };\n } catch (error) {\n if (isAbortError(error) || isStaleExtensionContextError(error)) {\n return { kind: \"stay\" };\n }\n ctx.ui.notify(`Couldn't load usage limit resets: ${errorMessage(error)}`, \"error\");\n return { kind: \"stay\" };\n }\n },\n \"select-reset\": ({ itemId }) => {\n const index = Number(itemId.replace(/^reset-/u, \"\"));\n const option = Number.isSafeInteger(index) ? resetAvailability?.options[index] : undefined;\n if (!option) return { kind: \"rejected\" };\n selectedReset = option;\n redemptionId = undefined;\n resetFailure = undefined;\n return { kind: \"to\", screen: \"reset-confirm\" };\n },\n \"cancel-reset\": () => ({ kind: \"back\" }),\n \"consume-reset\": async () => {\n if (!selectedReset || !resetAuthFingerprint || !resetModelIdentity) {\n return { kind: \"rejected\" };\n }\n try {\n redemptionId ??= createRedemptionId();\n const attemptId = redemptionId;\n const option = selectedReset;\n const expectedFingerprint = resetAuthFingerprint;\n const expectedModel = resetModelIdentity;\n const result = await runMenuOperation(\n ctx,\n \"Resetting your usage\u2026\",\n controller.signal,\n async (signal) => {\n const auth = await awaitWithDeadline(\n resolveCodexResetAuth(ctx, undefined, credentialReader, credentialCandidates),\n signal,\n DEFAULT_TIMEOUT_MS,\n \"revalidating current Codex reset authentication\",\n );\n if (modelIdentity(ctx.model) !== expectedModel || auth.fingerprint !== expectedFingerprint) {\n throw new Error(\"The active Codex model or account changed; the reset was not used.\");\n }\n const outcome = await consumeCodexResetCredit(auth, option, attemptId, signal, DEFAULT_TIMEOUT_MS);\n invalidateProviderState(\"openai-codex\");\n const model = ctx.model;\n if (modelIdentity(model) !== expectedModel) return { outcome };\n const refreshed = await queryCurrentState(ctx, model, true, signal);\n const stable = await outcomeStillCurrent(ctx, model, menuGeneration, refreshed, signal);\n return stable ? { outcome, refreshed, model } : { outcome };\n },\n false,\n );\n if (!result) return { kind: \"close\" };\n resetOutcome = result.outcome;\n resetFailure = undefined;\n if (result.refreshed && result.model) {\n stableCurrent = { outcome: result.refreshed, model: result.model };\n current = result.refreshed;\n visibleStates = [current.state];\n publishStableCurrent(ctx, stableCurrent);\n }\n return { kind: \"to\", screen: \"reset-result\" };\n } catch (error) {\n if (isAbortError(error) || isStaleExtensionContextError(error)) {\n return { kind: \"close\" };\n }\n resetFailure = `Couldn't reset usage: ${errorMessage(error)}. Try again with the same request.`;\n return { kind: \"to\", screen: \"reset-error\" };\n }\n },\n \"back-to-usage\": () => ({ kind: \"to\", screen: \"main\" }),\n \"back-to-resets\": () => {\n redemptionId = undefined;\n resetFailure = undefined;\n return { kind: \"to\", screen: \"reset-picker\" };\n },\n refresh: async () => {\n const refreshed = await queryStableCurrent(ctx, true, controller, \"Refreshing current usage\u2026\");\n if (!refreshed) return { kind: \"stay\" };\n stableCurrent = refreshed;\n publishStableCurrent(ctx, refreshed);\n current = refreshed.outcome;\n visibleStates = [current.state];\n return { kind: \"stay\" };\n },\n another: async () => {\n const others = configuredAdapters(ctx).filter((adapter) => adapter.id !== ctx.model?.provider);\n if (others.length === 0) {\n ctx.ui.notify(\"No other supported provider has configured runtime auth.\", \"info\");\n return { kind: \"stay\" };\n }\n return { kind: \"to\", screen: \"providers\" };\n },\n provider: async ({ itemId }) => {\n const adapter = configuredAdapters(ctx).find(\n (candidate) => candidate.id === itemId && candidate.id !== ctx.model?.provider,\n );\n if (!adapter) return { kind: \"back\" };\n let outcome = await runMenuOperation(\n ctx,\n `Checking ${providerDisplayName(ctx, adapter.id)} usage\u2026`,\n controller.signal,\n (signal) => queryStableAdapterState(ctx, adapter, \"configured\", false, signal),\n );\n if (!outcome) return { kind: \"back\" };\n if (outcome.state.status === \"selection-required\") {\n if (!(await promptForTarget(outcome.state, outcome.fingerprint))) {\n return { kind: \"back\" };\n }\n outcome = await runMenuOperation(\n ctx,\n `Checking ${providerDisplayName(ctx, adapter.id)} usage\u2026`,\n controller.signal,\n (signal) => queryStableAdapterState(ctx, adapter, \"configured\", true, signal),\n );\n if (!outcome) return { kind: \"back\" };\n }\n const revalidated = await queryStableCurrent(ctx, false, controller, \"Revalidating current usage\u2026\");\n if (!revalidated) return { kind: \"back\" };\n // Current-provider revalidation can await unrelated work after the configured\n // native report was checked. Refresh its identity at the publication boundary.\n if (adapter.id === \"openai\") {\n outcome = await runMenuOperation(\n ctx,\n \"Revalidating ChatGPT companion usage\u2026\",\n controller.signal,\n (signal) => queryStableAdapterState(ctx, adapter, \"configured\", false, signal),\n );\n if (!outcome) return { kind: \"back\" };\n }\n stableCurrent = revalidated;\n current = revalidated.outcome;\n visibleStates = [\n outcome.state.providerId === current.state.providerId\n ? current.state\n : { ...outcome.state, displayState: \"configured\" },\n ];\n return { kind: \"back\" };\n },\n all: async () => {\n const adapters = configuredAdapters(ctx);\n const currentProviderId = ctx.model?.provider;\n const settled = await runMenuOperation(\n ctx,\n \"Checking configured provider usage\u2026\",\n controller.signal,\n (signal) =>\n runWithConcurrency(\n adapters,\n ALL_PROVIDER_CONCURRENCY,\n (adapter, _index, workerSignal) =>\n queryStableAdapterState(\n ctx,\n adapter,\n adapter.id === currentProviderId ? \"current\" : \"configured\",\n true,\n workerSignal,\n ),\n signal,\n ),\n );\n if (!settled) return { kind: \"stay\" };\n const queriedStates: ProviderUsageState[] = settled.map((result, index) => {\n if (result.status === \"fulfilled\") {\n return { ...result.value.state, displayState: \"configured\" };\n }\n const adapter = adapters[index] as UsageProviderAdapter;\n return {\n providerId: adapter.id,\n providerName: providerDisplayName(ctx, adapter.id),\n displayState: \"configured\",\n status: \"query-failed\",\n message: errorMessage(result.reason),\n };\n });\n const revalidated = await queryStableCurrent(ctx, false, controller, \"Revalidating current usage\u2026\");\n if (!revalidated) return { kind: \"stay\" };\n const nativeIndex = adapters.findIndex(\n (adapter) => adapter.id === \"openai\" && adapter.id !== currentProviderId,\n );\n if (nativeIndex >= 0) {\n const nativeAdapter = adapters[nativeIndex];\n if (nativeAdapter) {\n const native = await runMenuOperation(\n ctx,\n \"Revalidating ChatGPT companion usage\u2026\",\n controller.signal,\n (signal) => queryStableAdapterState(ctx, nativeAdapter, \"configured\", false, signal),\n );\n if (!native) return { kind: \"stay\" };\n queriedStates[nativeIndex] = native.state;\n }\n }\n stableCurrent = revalidated;\n current = revalidated.outcome;\n visibleStates = [\n current.state,\n ...queriedStates.filter((state) => state.providerId !== current.state.providerId),\n ];\n return { kind: \"stay\" };\n },\n },\n });\n await runMenu(ctx, menu, {\n getState: () => undefined,\n signal: controller.signal,\n isCurrent: () => statusGeneration === menuGeneration && !controller.signal.aborted,\n });\n } finally {\n controller.abort(new DOMException(\"Usage menu closed\", \"AbortError\"));\n activeControllers.delete(controller);\n }\n };\n\n pi.registerCommand(\"usage\", {\n description: \"Show usage for the current runtime account\",\n handler: async (args, ctx) => {\n if (args.trim()) {\n ctx.ui.notify(\"/usage does not accept arguments; choose an action from its menu.\", \"warning\");\n return;\n }\n try {\n await showMenu(ctx);\n } catch (error) {\n if (isStaleExtensionContextError(error) || isAbortError(error)) return;\n throw error;\n }\n },\n });\n pi.on(\"session_start\", async (_event, ctx) => {\n sessionGeneration += 1;\n statusGeneration += 1;\n clearStatusTimers();\n for (const controller of activeControllers) controller.abort();\n activeControllers.clear();\n statusController = undefined;\n sessionActive = true;\n const ownerGeneration = sessionGeneration;\n try {\n await fastRuntime.prepareSession(ctx);\n } catch (error) {\n if (isStaleExtensionContextError(error) || ownerGeneration !== sessionGeneration) return;\n throw error;\n }\n });\n pi.on(\"session_tree\", (_event, ctx) => {\n startStatusRefresh(ctx, ctx.model, false);\n });\n pi.on(\"model_select\", (event, ctx) => {\n // Cancel read-only native queries, not confirmed legacy reset mutations.\n for (const controller of nativeQueryControllers) controller.abort();\n startStatusRefresh(ctx, event.model, false);\n });\n pi.on(\"turn_start\", (_event, ctx) => {\n startStatusRefresh(ctx, ctx.model, false);\n });\n pi.on(\"session_shutdown\", (_event, ctx) => {\n sessionActive = false;\n sessionGeneration += 1;\n statusGeneration += 1;\n clearStatusTimers();\n for (const controller of activeControllers) controller.abort();\n activeControllers.clear();\n statusController = undefined;\n cache.clear();\n failureBackoff.clear();\n latestQueries.clear();\n activeCurrentIdentity = undefined;\n safeSetStatus(ctx, undefined);\n });\n\n fastRuntime = registerCodexFastMode(pi, settingsRuntime, (ctx) => startStatusRefresh(ctx, ctx.model, false), {\n registerSessionStart: false,\n credentialReader,\n candidateReader: credentialCandidates,\n timeoutMs: DEFAULT_TIMEOUT_MS,\n });\n}\n", "import { type ExtensionContext, VERSION } from \"@earendil-works/pi-coding-agent\";\nimport { type CodexFastCapability, isOfficialCodexModel, UNKNOWN_CODEX_FAST_CAPABILITY } from \"./codex-fast.js\";\nimport { resolveCodexResetAuth } from \"./codex-resets.js\";\nimport { awaitWithDeadline, errorMessage, fingerprintResolvedAuth, redactUsageError } from \"./core.js\";\nimport type { OAuthCredentialCandidateReader, StoredCredentialReader } from \"./oauth-credential-source.js\";\nimport { AUTH_FINGERPRINT_SALT, fetchProviderJson } from \"./query.js\";\nimport type { PiModel, ResolvedUsageAuth } from \"./types.js\";\nimport { setBoundedMap } from \"./usage-helpers.js\";\n\nconst CACHE_TTL_MS = 5 * 60 * 1000;\nconst FAILURE_BACKOFF_MS = 30_000;\nconst MAX_ACCOUNT_STATES = 32;\nconst MAX_DIRECTORY_BODY_BYTES = 8 * 1024 * 1024;\nconst DIRECTORY_URL = new URL(\"https://chatgpt.com/backend-api/codex/models\");\nDIRECTORY_URL.searchParams.set(\"client_version\", VERSION);\n\ntype CatalogEntry = {\n models?: ReadonlyMap<string, boolean | undefined>;\n fetchedAt: number;\n fingerprint?: string;\n retryAt?: number;\n issue?: string;\n};\n\ntype AccountScope = {\n key: string;\n fingerprint: string;\n model: string;\n session: string;\n generation: number;\n};\n\ntype CatalogOptions = {\n credentialReader?: StoredCredentialReader;\n candidateReader?: OAuthCredentialCandidateReader;\n timeoutMs?: number;\n onChanged?: (ctx: ExtensionContext) => void;\n};\n\n/** Account-scoped discovery; request hooks authenticate their cache read without awaiting directory I/O. */\nexport function createCodexFastCatalog(options: CatalogOptions = {}) {\n const accounts = new Map<string, CatalogEntry>();\n const requests = new Map<string, { controller: AbortController; promise: Promise<void> }>();\n const latestRequests = new Map<string, number>();\n const timeoutMs = options.timeoutMs ?? 15_000;\n let requestSequence = 0;\n let identitySequence = 0;\n let generation = 0;\n let active: AccountScope | undefined;\n let issue: string = UNKNOWN_CODEX_FAST_CAPABILITY.reason;\n\n const current = (scope: AccountScope, ctx: ExtensionContext, signal: AbortSignal) =>\n !signal.aborted &&\n generation === scope.generation &&\n active?.key === scope.key &&\n active.fingerprint === scope.fingerprint &&\n active.model === scope.model &&\n active.session === scope.session &&\n modelIdentity(ctx.model) === scope.model &&\n ctx.sessionManager.getSessionId() === scope.session;\n\n const capability = (model: PiModel | undefined, key = active?.key): CodexFastCapability => {\n const entry = key ? accounts.get(key) : undefined;\n const supported = model ? entry?.models?.get(model.id) : undefined;\n if (supported !== undefined) return { kind: supported ? \"supported\" : \"unsupported\" };\n return {\n kind: \"unknown\",\n reason:\n entry?.issue ??\n (entry?.models && model\n ? `The Codex model directory has no Fast capability information for ${model.id}.`\n : issue),\n };\n };\n\n const identify = async (ctx: ExtensionContext, signal: AbortSignal) => {\n const identity = ++identitySequence;\n const owner = generation;\n const model = modelIdentity(ctx.model);\n const session = ctx.sessionManager.getSessionId();\n if (!isOfficialCodexModel(ctx.model)) {\n active = undefined;\n return undefined;\n }\n try {\n // Reuse the existing active-runtime OAuth/account validation, without any reset request.\n const auth = await awaitWithDeadline(\n resolveCodexResetAuth(ctx, undefined, options.credentialReader, options.candidateReader),\n signal,\n timeoutMs,\n \"resolving the current Codex model-directory account\",\n );\n if (\n signal.aborted ||\n owner !== generation ||\n identity !== identitySequence ||\n modelIdentity(ctx.model) !== model ||\n ctx.sessionManager.getSessionId() !== session\n ) {\n return undefined;\n }\n const accountId = auth.headers[\"chatgpt-account-id\"];\n if (!accountId) throw new Error(\"The active Codex account ID is unavailable.\");\n const scope: AccountScope = {\n key: fingerprintResolvedAuth({ headers: { \"chatgpt-account-id\": accountId } }, AUTH_FINGERPRINT_SALT),\n fingerprint: auth.fingerprint,\n model,\n session,\n generation: owner,\n };\n const changed = active?.key !== scope.key;\n active = scope;\n issue = \"Codex Fast capability information has not been fetched for this account.\";\n if (changed) options.onChanged?.(ctx);\n return { auth, scope };\n } catch (error) {\n if (signal.aborted || owner !== generation || identity !== identitySequence) return undefined;\n active = undefined;\n issue = `Codex Fast capability is unknown: ${redactUsageError(errorMessage(error))}`;\n options.onChanged?.(ctx);\n return undefined;\n }\n };\n\n const load = async (\n ctx: ExtensionContext,\n auth: ResolvedUsageAuth,\n scope: AccountScope,\n signal: AbortSignal,\n force: boolean,\n ): Promise<void> => {\n const entry = accounts.get(scope.key);\n if (\n !force &&\n ((entry?.models && entry.fingerprint === auth.fingerprint && Date.now() - entry.fetchedAt < CACHE_TTL_MS) ||\n (entry?.retryAt && Date.now() < entry.retryAt))\n ) {\n return;\n }\n const before = capability(ctx.model, scope.key);\n const existing = requests.get(auth.fingerprint);\n let promise = existing?.promise;\n if (!promise) {\n const sequence = ++requestSequence;\n latestRequests.set(scope.key, sequence);\n const controller = new AbortController();\n const combined = AbortSignal.any([signal, controller.signal]);\n let status: number | undefined;\n promise = (async () => {\n try {\n const payload = await fetchProviderJson(\n DIRECTORY_URL.href,\n auth,\n combined,\n timeoutMs,\n \"Codex model directory\",\n {\n redirect: \"error\",\n maxSuccessBodyBytes: MAX_DIRECTORY_BODY_BYTES,\n responseError: (responseStatus) => {\n status = responseStatus;\n return undefined;\n },\n },\n );\n const models = normalizeDirectory(payload);\n if (combined.aborted || scope.generation !== generation || latestRequests.get(scope.key) !== sequence) return;\n setBoundedMap(\n accounts,\n scope.key,\n { models, fetchedAt: Date.now(), fingerprint: auth.fingerprint },\n MAX_ACCOUNT_STATES,\n );\n } catch (error) {\n if (combined.aborted || scope.generation !== generation || latestRequests.get(scope.key) !== sequence) return;\n const previous = accounts.get(scope.key);\n const transient = status === undefined || status >= 500 || status === 429;\n setBoundedMap(\n accounts,\n scope.key,\n {\n ...(transient && previous?.models ? previous : { fetchedAt: 0 }),\n retryAt: Date.now() + FAILURE_BACKOFF_MS,\n issue: `Codex Fast capability is unknown: ${redactUsageError(errorMessage(error), auth.secrets)}`,\n },\n MAX_ACCOUNT_STATES,\n );\n } finally {\n if (requests.get(auth.fingerprint)?.controller === controller) requests.delete(auth.fingerprint);\n if (latestRequests.get(scope.key) === sequence) latestRequests.delete(scope.key);\n }\n })();\n requests.set(auth.fingerprint, { controller, promise });\n }\n // A cancelled menu must stop waiting without aborting a session-owned shared request.\n try {\n await awaitWithDeadline(promise, signal, timeoutMs, \"fetching the Codex model directory\");\n } catch (error) {\n if (signal.aborted) return;\n throw error;\n }\n const after = capability(ctx.model, scope.key);\n if (current(scope, ctx, signal) && JSON.stringify(before) !== JSON.stringify(after)) options.onChanged?.(ctx);\n };\n\n return {\n get(model: PiModel | undefined) {\n return capability(model);\n },\n async read(\n ctx: ExtensionContext,\n signal: AbortSignal,\n refresh = false,\n force = false,\n ): Promise<CodexFastCapability | undefined> {\n const resolved = await identify(ctx, signal);\n if (!resolved) return undefined;\n const { auth, scope } = resolved;\n if (refresh) await load(ctx, auth, scope, signal, force || capability(ctx.model, scope.key).kind === \"unknown\");\n else void load(ctx, auth, scope, signal, false);\n return current(scope, ctx, signal) ? capability(ctx.model, scope.key) : undefined;\n },\n reset(clearCache = false) {\n generation += 1;\n identitySequence += 1;\n active = undefined;\n issue = UNKNOWN_CODEX_FAST_CAPABILITY.reason;\n for (const { controller } of requests.values()) controller.abort();\n requests.clear();\n latestRequests.clear();\n if (clearCache) accounts.clear();\n },\n };\n}\n\nfunction normalizeDirectory(payload: Record<string, unknown>): ReadonlyMap<string, boolean | undefined> {\n if (!Array.isArray(payload.models)) throw new Error(\"The Codex model directory returned invalid models.\");\n const models = new Map<string, boolean | undefined>();\n for (const item of payload.models) {\n if (!isRecord(item) || typeof item.slug !== \"string\" || !item.slug.trim() || models.has(item.slug)) {\n throw new Error(\"The Codex model directory returned an invalid or duplicate model ID.\");\n }\n const hasTiers = item.service_tiers !== undefined;\n const hasLegacy = item.additional_speed_tiers !== undefined;\n if (\n (hasTiers &&\n (!Array.isArray(item.service_tiers) ||\n item.service_tiers.some((tier) => !isRecord(tier) || typeof tier.id !== \"string\"))) ||\n (hasLegacy &&\n (!Array.isArray(item.additional_speed_tiers) ||\n item.additional_speed_tiers.some((tier) => typeof tier !== \"string\")))\n ) {\n throw new Error(\"The Codex model directory returned invalid service tiers.\");\n }\n if (!hasTiers && !hasLegacy) {\n models.set(item.slug, undefined);\n continue;\n }\n const tiers = (item.service_tiers ?? []) as Array<{ id: string }>;\n const legacy = (item.additional_speed_tiers ?? []) as string[];\n models.set(item.slug, tiers.some((tier) => tier.id === \"priority\") || legacy.includes(\"fast\"));\n }\n return models;\n}\n\nfunction modelIdentity(model: PiModel | undefined): string {\n return model ? `${model.provider}/${model.id}` : \"\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n", "import type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { sanitizeDisplayText } from \"./core.js\";\nimport { providerIsConfigured, usageAdapters } from \"./query.js\";\nimport type { PiModel, UsageProviderAdapter } from \"./types.js\";\n\nexport function configuredAdapters(ctx: ExtensionContext): UsageProviderAdapter[] {\n return usageAdapters().filter(\n (adapter) => adapter.id === ctx.model?.provider || providerIsConfigured(ctx, adapter.id),\n );\n}\n\nexport function providerDisplayName(ctx: ExtensionContext, providerId: string): string {\n try {\n return sanitizeDisplayText(ctx.modelRegistry.getProviderDisplayName(providerId), 80);\n } catch {\n return sanitizeDisplayText(providerId, 80);\n }\n}\n\nexport function setBoundedMap<T>(map: Map<string, T>, key: string, value: T, limit: number): void {\n map.delete(key);\n while (map.size >= limit) {\n const oldest = map.keys().next().value;\n if (oldest === undefined) break;\n map.delete(oldest);\n }\n map.set(key, value);\n}\n\nexport function modelIdentity(model: PiModel | undefined): string | undefined {\n return model ? `${model.provider}/${model.id}` : undefined;\n}\n\nexport function isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === \"AbortError\";\n}\n\nexport function isTimeoutError(error: unknown): boolean {\n return error instanceof Error && error.name === \"TimeoutError\";\n}\n", "import type { ExtensionAPI, ExtensionCommandContext, ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport {\n type CodexFastCapability,\n codexFastAvailability,\n codexFastIsEffective,\n codexFastStatusLabel,\n correctCodexFastMessageCost,\n isOfficialCodexModel,\n rewriteCodexFastPayload,\n UNKNOWN_CODEX_FAST_CAPABILITY,\n} from \"./codex-fast.js\";\nimport { createCodexFastCatalog } from \"./codex-fast-catalog.js\";\nimport { errorMessage } from \"./core.js\";\nimport {\n createOAuthCredentialCandidateReader,\n type OAuthCredentialCandidateReader,\n type StoredCredentialReader,\n} from \"./oauth-credential-source.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; capability: CodexFastCapability };\n\nexport const FAST_USAGE_WARNING = \"Fast is about 1.5\u00D7 faster and uses more of your plan allowance.\";\n\nexport function registerCodexFastMode(\n pi: ExtensionAPI,\n settingsRuntime: UsageSettingsRuntime,\n refreshStatus: (ctx: ExtensionContext) => void,\n options: {\n registerSessionStart?: boolean;\n credentialReader?: StoredCredentialReader;\n candidateReader?: OAuthCredentialCandidateReader;\n timeoutMs?: number;\n } = {},\n) {\n let sessionController = new AbortController();\n let generation = 0;\n const pendingFastRequests = new Map<string, PendingFastRequest>();\n const catalog = createCodexFastCatalog({\n credentialReader: options.credentialReader,\n candidateReader: options.candidateReader ?? createOAuthCredentialCandidateReader(pi, options.credentialReader),\n timeoutMs: options.timeoutMs,\n onChanged(ctx) {\n if (sessionController.signal.aborted || !settingsRuntime.get().settings.codexFastMode) return;\n try {\n refreshStatus(ctx);\n } catch (error) {\n if (!isStaleExtensionContextError(error)) throw error;\n }\n },\n });\n\n const toggle = async (\n ctx: ExtensionCommandContext,\n enabled: boolean,\n callerSignal?: AbortSignal,\n ): Promise<boolean> => {\n const ownerGeneration = generation;\n const sessionId = ctx.sessionManager.getSessionId();\n const signal = callerSignal ? AbortSignal.any([callerSignal, sessionController.signal]) : sessionController.signal;\n if (ctx.model?.provider !== \"openai-codex\") {\n ctx.ui.notify(\"/fast is available only for the active OpenAI Codex model.\", \"warning\");\n return false;\n }\n if (!isOfficialCodexModel(ctx.model)) {\n ctx.ui.notify(\"Fast mode requires the official OpenAI Codex Responses endpoint.\", \"warning\");\n return false;\n }\n if (settingsRuntime.get().kind === \"invalid\") {\n ctx.ui.notify(\"pi-usage.json is invalid; repair it and run /reload before changing Fast mode.\", \"error\");\n return false;\n }\n if (enabled) {\n const capability = await catalog.read(ctx, signal, true, catalog.get(ctx.model).kind !== \"supported\");\n if (signal.aborted || ownerGeneration !== generation) return false;\n if (!capability) {\n const latest = catalog.get(ctx.model);\n ctx.ui.notify(\n latest.kind === \"unknown\"\n ? latest.reason\n : \"The active Codex account changed while checking Fast capability.\",\n \"warning\",\n );\n return false;\n }\n const availability = codexFastAvailability(ctx.model, false, capability);\n if (availability.kind !== \"available\") {\n if (availability.kind === \"unknown\" || availability.kind === \"unavailable\") {\n ctx.ui.notify(availability.reason, \"warning\");\n }\n return false;\n }\n }\n try {\n await settingsRuntime.update({ codexFastMode: enabled }, signal);\n } catch (error) {\n if (isAbortError(error) || isStaleExtensionContextError(error)) return false;\n ctx.ui.notify(`Could not save pi-usage.json: ${errorMessage(error)}`, \"error\");\n return false;\n }\n if (signal.aborted || ownerGeneration !== generation || ctx.sessionManager.getSessionId() !== sessionId) {\n return false;\n }\n refreshStatus(ctx);\n ctx.ui.notify(\n enabled\n ? `Codex Fast mode enabled. ${FAST_USAGE_WARNING}`\n : \"Codex Fast mode disabled; standard routing will be used.\",\n \"info\",\n );\n return true;\n };\n\n pi.registerCommand(\"fast\", {\n description: \"Toggle Codex Fast mode\",\n handler: async (args, ctx) => {\n if (args.trim()) {\n if (!ctx.hasUI) throw new Error(\"/fast does not accept arguments.\");\n ctx.ui.notify(\"/fast does not accept arguments.\", \"warning\");\n return;\n }\n if (!ctx.hasUI) throw new Error(\"/fast requires TUI or RPC mode.\");\n await toggle(ctx, !settingsRuntime.get().settings.codexFastMode);\n },\n });\n\n const refreshCapabilities = (ctx: ExtensionContext, callerSignal?: AbortSignal, force = false) => {\n const signal = callerSignal ? AbortSignal.any([callerSignal, sessionController.signal]) : sessionController.signal;\n return catalog.read(ctx, signal, true, force);\n };\n\n const prepareSession = (ctx: ExtensionContext): Promise<void> => {\n const sessionId = ctx.sessionManager.getSessionId();\n generation += 1;\n sessionController.abort();\n catalog.reset();\n pendingFastRequests.clear();\n sessionController = new AbortController();\n const ownerGeneration = generation;\n return (async () => {\n let state: Readonly<UsageSettingsState>;\n try {\n state = await settingsRuntime.reload(sessionController.signal);\n } catch (error) {\n if (sessionController.signal.aborted || ownerGeneration !== generation) return;\n if (ctx.hasUI) {\n ctx.ui.notify(`Could not load pi-usage.json; using defaults. ${errorMessage(error)}`, \"warning\");\n }\n return;\n }\n if (\n sessionController.signal.aborted ||\n ownerGeneration !== generation ||\n ctx.sessionManager.getSessionId() !== sessionId\n ) {\n return;\n }\n if (ctx.hasUI && state.kind === \"invalid\") {\n ctx.ui.notify(`Invalid pi-usage.json; using defaults without overwriting it. ${state.issue}`, \"warning\");\n }\n refreshStatus(ctx);\n if (state.kind !== \"invalid\" && isOfficialCodexModel(ctx.model)) void refreshCapabilities(ctx);\n })();\n };\n\n if (options.registerSessionStart !== false) {\n pi.on(\"session_start\", async (_event, ctx) => prepareSession(ctx));\n }\n pi.on(\"model_select\", (_event, ctx) => {\n void refreshCapabilities(ctx);\n });\n\n pi.on(\"before_provider_request\", async (event, ctx) => {\n const ownerGeneration = generation;\n const model = ctx.model;\n const enabled = settingsRuntime.get().settings.codexFastMode;\n const capability =\n enabled && isOfficialCodexModel(model)\n ? ((await catalog.read(ctx, sessionController.signal)) ?? UNKNOWN_CODEX_FAST_CAPABILITY)\n : UNKNOWN_CODEX_FAST_CAPABILITY;\n if (sessionController.signal.aborted || ownerGeneration !== generation) return undefined;\n const rewritten = rewriteCodexFastPayload(event.payload, model, enabled, capability);\n const key = activeRequestKey(ctx, model);\n if (key && model) {\n pendingFastRequests.set(key, {\n fastRequested: isRecord(rewritten) && rewritten.service_tier === \"priority\",\n model,\n capability,\n });\n }\n return rewritten;\n });\n pi.on(\"message_end\", (event, ctx) => {\n const request = consumeFastRequest(ctx, event.message, pendingFastRequests);\n if (request === NO_FAST_REQUEST) return undefined;\n const message = correctCodexFastMessageCost(\n event.message,\n request.model,\n request.fastRequested,\n request.capability,\n );\n return message ? { message: message as never } : undefined;\n });\n pi.on(\"session_shutdown\", async () => {\n generation += 1;\n sessionController.abort();\n catalog.reset(true);\n pendingFastRequests.clear();\n await settingsRuntime.flush();\n });\n\n return {\n prepareSession,\n refreshCapabilities,\n availability(model: PiModel | undefined) {\n return codexFastAvailability(model, settingsRuntime.get().settings.codexFastMode, catalog.get(model));\n },\n decorateStatus(model: PiModel | undefined, status: string) {\n const enabled = settingsRuntime.get().settings.codexFastMode;\n const capability = catalog.get(model);\n if (\n enabled &&\n codexFastAvailability(model, enabled, capability).kind === \"unknown\" &&\n /^codex(?:\\s|$)/u.test(status)\n ) {\n return `codex (Fast unknown)${status.slice(\"codex\".length)}`;\n }\n return codexFastStatusLabel(status, codexFastIsEffective(model, enabled, capability));\n },\n toggle,\n };\n}\n\nfunction activeRequestKey(ctx: ExtensionContext, model = ctx.model): string | undefined {\n return model ? `${ctx.sessionManager.getSessionId()}:${model.provider}/${model.id}` : undefined;\n}\n\nfunction consumeFastRequest(\n ctx: ExtensionContext,\n message: unknown,\n pending: Map<string, PendingFastRequest>,\n): PendingFastRequest | typeof NO_FAST_REQUEST {\n if (!isRecord(message) || message.role !== \"assistant\") return NO_FAST_REQUEST;\n const key = messageRequestKey(ctx, message);\n if (!key) return NO_FAST_REQUEST;\n const request = pending.get(key);\n pending.delete(key);\n return request ?? NO_FAST_REQUEST;\n}\n\nfunction messageRequestKey(ctx: ExtensionContext, message: Record<string, unknown>): string | undefined {\n if (typeof message.provider !== \"string\" || typeof message.model !== \"string\") return undefined;\n return `${ctx.sessionManager.getSessionId()}:${message.provider}/${message.model}`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === \"AbortError\";\n}\n", "import { stripVTControlCharacters } from \"node:util\";\nimport { type ExtensionCommandContext, getSettingsListTheme } from \"@earendil-works/pi-coding-agent\";\nimport { Key, matchesKey, type SettingItem, SettingsList, Text } from \"@earendil-works/pi-tui\";\nimport { errorMessage } from \"./core.js\";\nimport type { UsageSettings, UsageSettingsRuntime } from \"./settings.js\";\n\nconst OFF = \"Off\";\nconst ON = \"On\";\nconst REMAINING = \"Remaining\";\nconst USED = \"Used\";\n\ntype UsageSettingId = \"codexFastMode\" | \"codexStatusResetCountdown\" | \"codexStatusPercentage\";\n\nfunction settingValueLabel(id: UsageSettingId, value: UsageSettings[UsageSettingId]): string {\n if (id === \"codexStatusPercentage\") return value === \"used\" ? USED : REMAINING;\n return value === true ? ON : OFF;\n}\n\nexport async function showUsageSettings(\n ctx: ExtensionCommandContext,\n settingsRuntime: UsageSettingsRuntime,\n parentSignal: AbortSignal,\n isCurrent: () => boolean,\n onApplied: (id: UsageSettingId) => void,\n): Promise<boolean> {\n if (ctx.mode !== \"tui\") {\n if (ctx.hasUI) ctx.ui.notify(`Edit settings manually: ${settingsRuntime.get().path}`, \"info\");\n return false;\n }\n const { HorizontalRule, renderBoundedFrame } = await import(\"@narumitw/pi-tui-kit\");\n if (parentSignal.aborted || !isCurrent()) return false;\n let changed = false;\n return ctx.ui.custom<boolean>((tui, theme, _keybindings, done) => {\n const localController = new AbortController();\n const signal = AbortSignal.any([parentSignal, localController.signal]);\n let closing = false;\n let saveQueue = Promise.resolve();\n const state = settingsRuntime.get();\n const items: SettingItem[] = [\n {\n id: \"codexFastMode\",\n label: \"Codex Fast mode\",\n description: \"Use faster Codex routing at increased plan allowance consumption.\",\n currentValue: state.settings.codexFastMode ? ON : OFF,\n values: [OFF, ON],\n },\n {\n id: \"codexStatusResetCountdown\",\n label: \"Codex reset countdown\",\n description: \"Show time remaining until each Codex usage limit resets.\",\n currentValue: state.settings.codexStatusResetCountdown ? ON : OFF,\n values: [OFF, ON],\n },\n {\n id: \"codexStatusPercentage\",\n label: \"Codex percentage\",\n description: \"Show remaining or used Codex quota in the statusline.\",\n currentValue: settingValueLabel(\"codexStatusPercentage\", state.settings.codexStatusPercentage),\n values: [REMAINING, USED],\n },\n ];\n const rule = new HorizontalRule({ ruleStyle: (text) => theme.fg(\"border\", text) });\n\n let settingsList: SettingsList;\n const close = (result: boolean) => {\n if (closing) return;\n closing = true;\n localController.abort();\n done(result);\n };\n const cancel = () => close(changed);\n const queueUpdate = <Id extends UsageSettingId>(id: Id, requested: UsageSettings[Id], display: string) => {\n saveQueue = saveQueue.then(async () => {\n if (signal.aborted || !isCurrent()) return;\n const previous = settingsRuntime.get().settings[id];\n if (settingsRuntime.get().kind === \"invalid\") {\n settingsList.updateValue(id, settingValueLabel(id, previous));\n if (!signal.aborted && isCurrent()) {\n ctx.ui.notify(\"Repair pi-usage.json and reload before changing settings.\", \"error\");\n tui.requestRender();\n }\n return;\n }\n try {\n const patch: Partial<UsageSettings> = {};\n patch[id] = requested;\n await settingsRuntime.update(patch, signal);\n } catch (error) {\n if (signal.aborted || !isCurrent()) return;\n settingsList.updateValue(id, settingValueLabel(id, previous));\n ctx.ui.notify(`Could not save pi-usage.json: ${errorMessage(error)}`, \"error\");\n tui.requestRender();\n return;\n }\n // A rename can win a cancellation race. Apply owned lifecycle cleanup after a\n // durable save, but let the owner guard its session before touching UI.\n if (previous !== requested) {\n changed = true;\n onApplied(id);\n }\n if (signal.aborted || !isCurrent()) return;\n settingsList.updateValue(id, display);\n tui.requestRender();\n });\n };\n settingsList = new SettingsList(\n items,\n items.length + 2,\n getSettingsListTheme(),\n (id, value) => {\n if (closing || signal.aborted || !isCurrent()) return;\n if (id === \"codexStatusPercentage\") {\n queueUpdate(id, value === USED ? \"used\" : \"remaining\", value);\n } else if (id === \"codexFastMode\" || id === \"codexStatusResetCountdown\") {\n queueUpdate(id, value === ON, value);\n }\n },\n cancel,\n );\n\n parentSignal.addEventListener(\"abort\", cancel, { once: true });\n return {\n render(width: number) {\n // Compatibility: Kit puts the title directly below the top rule and keeps compact\n // rules when at least five rows fit; both replace the legacy wrapper layout.\n const title = new Text(theme.fg(\"accent\", theme.bold(\"pi-usage Settings\")), 1, 0).render(width);\n const content = settingsList.render(width);\n const focusedRow = content.findIndex((line) => /^[\u2192\u203A]\\s/u.test(stripVTControlCharacters(line)));\n const terminalRows = Number.isFinite(tui.terminal?.rows) ? Math.floor(tui.terminal.rows) : 24;\n const [ruleLine = \"\"] = rule.render(width);\n return renderBoundedFrame({\n width,\n maxRows: Math.max(1, terminalRows - 3),\n rule: ruleLine,\n title,\n content,\n priorityRows: focusedRow < 0 ? [] : [focusedRow],\n focusedRow,\n });\n },\n invalidate: () => settingsList.invalidate(),\n handleInput(data: string) {\n if (closing) return;\n if (matchesKey(data, Key.ctrl(\"c\"))) cancel();\n else settingsList.handleInput(data);\n tui.requestRender();\n },\n dispose() {\n localController.abort();\n parentSignal.removeEventListener(\"abort\", cancel);\n },\n };\n });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["bucket", "isRecord", "randomUUID", "modelIdentity", "isRecord", "isAbortError", "isRecord", "CACHE_TTL_MS", "FAILURE_BACKOFF_MS", "MAX_ACCOUNT_STATES", "randomUUID", "resolveUsageAuth"]
|
|
7
7
|
}
|