@narumitw/pi-usage 0.52.2 → 0.52.3
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 +2 -2
- package/dist/index.ts +2 -6
- package/dist/index.ts.map +2 -2
- package/package.json +1 -1
- package/src/query.ts +3 -7
package/README.md
CHANGED
|
@@ -148,11 +148,11 @@ OpenRouter documents the distinction between credit and rate limits in its [API
|
|
|
148
148
|
|
|
149
149
|
- Provider ID: `opencode-go`
|
|
150
150
|
- Semantics: OpenCode Zen plan usage windows—rolling, weekly, and monthly
|
|
151
|
-
- Source: `GET
|
|
151
|
+
- Source: `GET https://opencode.ai/zen/go/v1/usage` using Pi's resolved inference API key
|
|
152
152
|
- Displayed data: used percentage and reset time for each window; `rate-limited` windows remain visible at their reported usage, while unknown statuses are reported as unavailable notes
|
|
153
153
|
- Statusline examples: `zen 0% r 4% w 2% m`
|
|
154
154
|
|
|
155
|
-
The
|
|
155
|
+
The fixed endpoint is queried only when the candidate OpenCode Go model and the resolved provider-auth base URL, when present, use the official `https://opencode.ai` origin; other origins fail before sending the credential.
|
|
156
156
|
|
|
157
157
|
## 🧭 Current and configured accounts
|
|
158
158
|
|
package/dist/index.ts
CHANGED
|
@@ -686,6 +686,7 @@ function asNonnegativeNumber3(value) {
|
|
|
686
686
|
var CODEX_USAGE_URL = "https://chatgpt.com/backend-api/wham/usage";
|
|
687
687
|
var GITHUB_COPILOT_USAGE_URL = "https://api.github.com/copilot_internal/user";
|
|
688
688
|
var OPENROUTER_KEY_URL = "https://openrouter.ai/api/v1/key";
|
|
689
|
+
var OPENCODE_GO_USAGE_URL = "https://opencode.ai/zen/go/v1/usage";
|
|
689
690
|
var MAX_SUCCESS_BODY_BYTES = 64 * 1024;
|
|
690
691
|
var MAX_ERROR_BODY_BYTES = 4 * 1024;
|
|
691
692
|
var AUTH_FINGERPRINT_SALT = randomBytes(32);
|
|
@@ -747,7 +748,7 @@ var SUPPORTED_ADAPTERS = [
|
|
|
747
748
|
semantics: { kind: "consumer-subscription", label: "OpenCode Zen plan usage" },
|
|
748
749
|
async query(auth, signal, timeoutMs) {
|
|
749
750
|
const payload = await fetchProviderJson(
|
|
750
|
-
|
|
751
|
+
OPENCODE_GO_USAGE_URL,
|
|
751
752
|
auth,
|
|
752
753
|
signal,
|
|
753
754
|
timeoutMs,
|
|
@@ -1053,11 +1054,6 @@ function headerValue(headers, name) {
|
|
|
1053
1054
|
function hasHeader(headers, name) {
|
|
1054
1055
|
return Object.keys(headers).some((key) => key.toLowerCase() === name.toLowerCase());
|
|
1055
1056
|
}
|
|
1056
|
-
function opencodeUsageUrl(baseUrl) {
|
|
1057
|
-
const base = baseUrl?.trim().replace(/\/+$/u, "");
|
|
1058
|
-
if (!base) throw new Error("OpenCode Go model base URL is unavailable.");
|
|
1059
|
-
return `${base}/usage`;
|
|
1060
|
-
}
|
|
1061
1057
|
function isAbortError(error) {
|
|
1062
1058
|
return error instanceof Error && error.name === "AbortError";
|
|
1063
1059
|
}
|
package/dist/index.ts.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/codex-fast.ts", "../src/codex-resets.ts", "../src/core.ts", "../src/oauth-credential-source.ts", "../src/query.ts", "../src/providers/codex.ts", "../src/providers/github-copilot.ts", "../src/providers/opencode-zen.ts", "../src/providers/openrouter.ts", "../src/format.ts", "../src/settings.ts", "../src/usage.ts", "../src/codex-fast-runtime.ts", "../src/usage-helpers.ts"],
|
|
4
|
-
"sourcesContent": ["import { calculateCost, hasApi } from \"@earendil-works/pi-ai\";\nimport type { PiModel } from \"./types.js\";\n\nexport const CODEX_FAST_SERVICE_TIER = \"priority\";\nexport const CODEX_STANDARD_SERVICE_TIER = \"default\";\n\nexport const CODEX_FAST_MODEL_IDS: ReadonlySet<string> = new Set([\n\t\"gpt-5.4\",\n\t\"gpt-5.5\",\n\t\"gpt-5.6-luna\",\n\t\"gpt-5.6-sol\",\n\t\"gpt-5.6-terra\",\n]);\n\nexport type CodexFastAvailability =\n\t| { kind: \"available\"; enabled: boolean }\n\t| { kind: \"not-codex\" }\n\t| { kind: \"unavailable\"; reason: string };\n\nexport function codexFastAvailability(\n\tmodel: PiModel | undefined,\n\tenabled: boolean,\n): CodexFastAvailability {\n\tif (model?.provider !== \"openai-codex\") return { kind: \"not-codex\" };\n\tif (!isOfficialCodexModel(model)) {\n\t\treturn {\n\t\t\tkind: \"unavailable\",\n\t\t\treason: \"Fast mode requires the official OpenAI Codex Responses endpoint.\",\n\t\t};\n\t}\n\tif (!CODEX_FAST_MODEL_IDS.has(model.id)) {\n\t\treturn {\n\t\t\tkind: \"unavailable\",\n\t\t\treason: `${model.id} does not advertise Codex Fast support.`,\n\t\t};\n\t}\n\treturn { kind: \"available\", enabled };\n}\n\nexport function codexFastIsEffective(model: PiModel | undefined, enabled: boolean): boolean {\n\treturn codexFastAvailability(model, enabled).kind === \"available\" && enabled;\n}\n\nexport function codexFastRequestTier(\n\tmodel: PiModel | undefined,\n\tenabled: boolean,\n): typeof CODEX_FAST_SERVICE_TIER | typeof CODEX_STANDARD_SERVICE_TIER | undefined {\n\tif (!isOfficialCodexModel(model)) return undefined;\n\treturn enabled && CODEX_FAST_MODEL_IDS.has(model.id)\n\t\t? CODEX_FAST_SERVICE_TIER\n\t\t: CODEX_STANDARD_SERVICE_TIER;\n}\n\nexport function rewriteCodexFastPayload(\n\tpayload: unknown,\n\tmodel: PiModel | undefined,\n\tenabled: boolean,\n): unknown | undefined {\n\tconst serviceTier = codexFastRequestTier(model, enabled);\n\tif (!serviceTier || !isRecord(payload)) return undefined;\n\treturn { ...payload, service_tier: serviceTier };\n}\n\nexport function correctCodexFastMessageCost(\n\tmessage: unknown,\n\tmodel: PiModel | undefined,\n\tfastRequested: boolean,\n): unknown | undefined {\n\tif (\n\t\t!codexFastIsEffective(model, fastRequested) ||\n\t\t!isRecord(message) ||\n\t\tmessage.role !== \"assistant\" ||\n\t\tmessage.provider !== model?.provider ||\n\t\tmessage.model !== model?.id\n\t) {\n\t\treturn undefined;\n\t}\n\tconst usage = isRecord(message.usage) ? message.usage : undefined;\n\tconst cost = usage && isRecord(usage.cost) ? usage.cost : undefined;\n\tif (!usage || !cost || !hasCompleteUsage(usage) || !isOfficialCodexModel(model)) return undefined;\n\tconst correctedUsage = structuredClone(usage) as typeof usage;\n\tcalculateCost(model, correctedUsage as never);\n\tconst multiplier = model.id === \"gpt-5.5\" ? 2.5 : 2;\n\tconst correctedCost = correctedUsage.cost as Record<string, number>;\n\tfor (const key of [\"input\", \"output\", \"cacheRead\", \"cacheWrite\", \"total\"] as const) {\n\t\tcorrectedCost[key] *= multiplier;\n\t}\n\tif (costsEqual(cost, correctedCost)) return undefined;\n\treturn { ...message, usage: correctedUsage };\n}\n\nexport function codexFastStatusLabel(status: string, enabled: boolean): string {\n\tif (!enabled || !/^codex(?:\\s|$)/u.test(status)) return status;\n\treturn status === \"codex\" ? \"codex fast\" : `codex fast${status.slice(\"codex\".length)}`;\n}\n\nfunction isOfficialCodexModel(\n\tmodel: PiModel | undefined,\n): model is PiModel & { api: \"openai-codex-responses\" } {\n\tif (model?.provider !== \"openai-codex\" || !hasApi(model, \"openai-codex-responses\")) {\n\t\treturn false;\n\t}\n\ttry {\n\t\treturn new URL(model.baseUrl).origin === \"https://chatgpt.com\";\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasCompleteUsage(value: Record<string, unknown>): boolean {\n\treturn [\"input\", \"output\", \"cacheRead\", \"cacheWrite\"].every(\n\t\t(key) => typeof value[key] === \"number\" && Number.isFinite(value[key]),\n\t);\n}\n\nfunction costsEqual(left: Record<string, unknown>, right: Record<string, number>): boolean {\n\treturn [\"input\", \"output\", \"cacheRead\", \"cacheWrite\", \"total\"].every(\n\t\t(key) => left[key] === right[key],\n\t);\n}\n", "import type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { readStoredCredential } from \"@earendil-works/pi-coding-agent\";\nimport { fingerprintResolvedAuth, sanitizeDisplayText } from \"./core.js\";\nimport {\n\tfallbackOAuthCredentialCandidates,\n\ttype OAuthCredentialCandidateReader,\n} from \"./oauth-credential-source.js\";\nimport {\n\tAUTH_FINGERPRINT_SALT,\n\tadapterForProvider,\n\tfetchProviderJson,\n\tresolveUsageAuth,\n} from \"./query.js\";\nimport type { ResolvedUsageAuth, UsageReport } from \"./types.js\";\n\nconst CODEX_RESET_CREDITS_URL = \"https://chatgpt.com/backend-api/wham/rate-limit-reset-credits\";\nconst CODEX_RESET_CONSUME_URL = `${CODEX_RESET_CREDITS_URL}/consume`;\nconst MAX_RESET_OPTIONS = 32;\nconst MAX_CREDIT_ID_CHARS = 1_024;\n\ntype StoredCredentialReader = (providerId: string) => unknown;\n\nexport type CodexResetOutcomeCode = \"reset\" | \"nothing_to_reset\" | \"no_credit\" | \"already_redeemed\";\n\nexport interface CodexResetOption {\n\tcreditId?: string;\n\ttitle: string;\n\tdescription: string;\n\texpiresAt?: number;\n}\n\nexport interface CodexResetAvailability {\n\tavailableCount: number;\n\toptions: CodexResetOption[];\n}\n\nexport interface CodexResetOutcome {\n\tcode: CodexResetOutcomeCode;\n\twindowsReset: number;\n}\n\nexport function codexResetCount(report: UsageReport): number | undefined {\n\tconst value = report.metrics.find((metric) => metric.id === \"reset-credits\")?.value;\n\treturn typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0 ? value : undefined;\n}\n\nexport function codexResetActionDescription(report: UsageReport): string {\n\tconst count = codexResetCount(report);\n\tif (count === undefined) return \"Check reset availability.\";\n\tif (count === 0) return \"No usage limit resets available.\";\n\treturn `You have ${count} ${resetLabel(count)} available.`;\n}\n\nexport function genericCodexResetOption(): CodexResetOption {\n\treturn {\n\t\ttitle: \"Full reset\",\n\t\tdescription: \"Reset your current usage limits.\",\n\t};\n}\n\nexport function resetOptionExpiration(option: CodexResetOption): string {\n\tif (option.expiresAt === undefined) return \"Does not expire.\";\n\tconst expiration = new Date(option.expiresAt * 1_000);\n\tif (Number.isNaN(expiration.getTime())) return \"Expiration unavailable.\";\n\treturn `Expires ${expiration.toLocaleString()}.`;\n}\n\nexport function resetConfirmationLines(option: CodexResetOption | undefined): string[] {\n\tif (!option) return [\"The selected reset is unavailable.\"];\n\treturn [\n\t\toption.title,\n\t\tresetOptionExpiration(option),\n\t\toption.description,\n\t\t\"This consumes one earned reset for the current OpenAI Codex account.\",\n\t];\n}\n\nexport function formatCodexResetOutcome(\n\toutcome: CodexResetOutcome | undefined,\n\tremainingCount: number | undefined,\n): string {\n\tconst remaining =\n\t\tremainingCount === undefined\n\t\t\t? \"\"\n\t\t\t: ` You have ${remainingCount} ${resetLabel(remainingCount)} left.`;\n\tif (!outcome) return \"You don't have any usage limit resets available.\";\n\tif (outcome.code === \"reset\") return `Usage reset.${remaining}`.trim();\n\tif (outcome.code === \"already_redeemed\") {\n\t\treturn `Usage reset was already completed.${remaining}`.trim();\n\t}\n\tif (outcome.code === \"nothing_to_reset\") {\n\t\treturn \"Your usage does not need a reset right now.\";\n\t}\n\treturn \"No usage limit resets are available.\";\n}\n\nexport function resetLabel(count: number): string {\n\treturn count === 1 ? \"usage limit reset\" : \"usage limit resets\";\n}\n\nexport async function resolveCodexResetAuth(\n\tctx: ExtensionContext,\n\tsalt: Uint8Array = AUTH_FINGERPRINT_SALT,\n\tcredentialReader: StoredCredentialReader = readStoredCredential,\n\tcandidateReader?: OAuthCredentialCandidateReader,\n): Promise<ResolvedUsageAuth> {\n\tconst model = ctx.model;\n\tif (model?.provider !== \"openai-codex\") {\n\t\tthrow new Error(\"Usage limit resets require the current model to use OpenAI Codex.\");\n\t}\n\tconst expectedModel = `${model.provider}/${model.id}`;\n\tconst adapter = adapterForProvider(\"openai-codex\");\n\tif (!adapter) throw new Error(\"OpenAI Codex usage support is unavailable.\");\n\tconst auth = await resolveUsageAuth(ctx, adapter, salt, credentialReader);\n\tif (`${ctx.model?.provider}/${ctx.model?.id}` !== expectedModel) {\n\t\tthrow new Error(\"The current model changed while resolving Codex reset authentication.\");\n\t}\n\tif (!auth) throw new Error(\"No runtime credential is configured for OpenAI Codex.\");\n\n\tconst resolvedAccess = bearerToken(headerValue(auth.headers, \"Authorization\")) ?? auth.apiKey;\n\tif (!resolvedAccess) throw new Error(\"OpenAI Codex OAuth credentials were incomplete.\");\n\tconst resolvedAccountId = codexAccountIdFromAccessToken(resolvedAccess);\n\tif (!resolvedAccountId) {\n\t\tthrow new Error(\"The active OpenAI Codex access token did not contain a valid account ID.\");\n\t}\n\tconst offered = candidateReader\n\t\t? candidateReader(ctx, \"openai-codex\")\n\t\t: fallbackOAuthCredentialCandidates(\"openai-codex\", credentialReader);\n\tif (!offered.ok) throw new Error(\"OpenAI Codex OAuth credential discovery failed closed.\");\n\tconst { accountId, storedAccess } = selectCodexResetCredential(\n\t\toffered.candidates,\n\t\tresolvedAccess,\n\t\tresolvedAccountId,\n\t\toffered.offeredCount === 0,\n\t);\n\tconst authorization = `Bearer ${resolvedAccess}`;\n\tconst headers = {\n\t\tAuthorization: authorization,\n\t\t\"chatgpt-account-id\": accountId,\n\t};\n\treturn {\n\t\tapiKey: resolvedAccess,\n\t\theaders,\n\t\tfingerprint: fingerprintResolvedAuth({ headers }, salt),\n\t\tsecrets: [\n\t\t\t...new Set([...auth.secrets, storedAccess, resolvedAccess, authorization, accountId]),\n\t\t],\n\t\tmodel: auth.model,\n\t};\n}\n\nexport async function listCodexResetCredits(\n\tauth: ResolvedUsageAuth,\n\tsignal: AbortSignal,\n\ttimeoutMs: number,\n): Promise<CodexResetAvailability> {\n\tconst payload = await fetchProviderJson(\n\t\tCODEX_RESET_CREDITS_URL,\n\t\tauth,\n\t\tsignal,\n\t\ttimeoutMs,\n\t\t\"Codex usage-limit reset endpoint\",\n\t);\n\treturn normalizeCodexResetCreditsPayload(payload);\n}\n\nexport async function consumeCodexResetCredit(\n\tauth: ResolvedUsageAuth,\n\toption: CodexResetOption,\n\tredeemRequestId: string,\n\tsignal: AbortSignal,\n\ttimeoutMs: number,\n): Promise<CodexResetOutcome> {\n\tif (!redeemRequestId) throw new Error(\"Codex reset redemption request ID must not be empty.\");\n\tconst payload = await fetchProviderJson(\n\t\tCODEX_RESET_CONSUME_URL,\n\t\tauth,\n\t\tsignal,\n\t\ttimeoutMs,\n\t\t\"Codex usage-limit reset consume endpoint\",\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\tbody: {\n\t\t\t\tredeem_request_id: redeemRequestId,\n\t\t\t\t...(option.creditId ? { credit_id: option.creditId } : {}),\n\t\t\t},\n\t\t},\n\t);\n\tconst code = payload.code;\n\tif (!isCodexResetOutcomeCode(code)) {\n\t\tthrow new Error(\"Codex reset consume endpoint returned an unknown outcome code.\");\n\t}\n\tconst windowsReset =\n\t\tpayload.windows_reset === undefined ? 0 : nonnegativeInteger(payload.windows_reset);\n\tif (windowsReset === undefined) {\n\t\tthrow new Error(\"Codex reset consume endpoint returned an invalid windows_reset value.\");\n\t}\n\treturn { code, windowsReset };\n}\n\nexport function normalizeCodexResetCreditsPayload(\n\tpayload: Record<string, unknown>,\n): CodexResetAvailability {\n\tconst availableCount = nonnegativeInteger(payload.available_count);\n\tif (availableCount === undefined) {\n\t\tthrow new Error(\"Codex reset credits response returned an invalid available_count.\");\n\t}\n\tconst rawCredits = payload.credits;\n\tif (rawCredits !== undefined && !Array.isArray(rawCredits)) {\n\t\tthrow new Error(\"Codex reset credits response returned invalid credits.\");\n\t}\n\n\tconst options = (rawCredits ?? [])\n\t\t.map(asObject)\n\t\t.filter((credit): credit is Record<string, unknown> => Boolean(credit))\n\t\t.filter((credit) => credit.status === \"available\" && credit.reset_type === \"codex_rate_limits\")\n\t\t.map(normalizeResetOption)\n\t\t.sort(\n\t\t\t(left, right) =>\n\t\t\t\t(left.expiresAt ?? Number.MAX_SAFE_INTEGER) - (right.expiresAt ?? Number.MAX_SAFE_INTEGER),\n\t\t)\n\t\t.slice(0, Math.min(availableCount, MAX_RESET_OPTIONS));\n\n\tif (availableCount > 0 && options.length === 0) {\n\t\toptions.push(genericCodexResetOption());\n\t}\n\treturn { availableCount, options };\n}\n\nfunction selectCodexResetCredential(\n\tcandidates: readonly unknown[],\n\tresolvedAccess: string,\n\tresolvedAccountId: string,\n\tstandaloneFallback: boolean,\n): { accountId: string; storedAccess: string } {\n\tlet sawOAuth = false;\n\tlet sawMatchingAccess = false;\n\tlet sawInvalidAccountId = false;\n\tconst matches = new Map<string, { accountId: string; storedAccess: string }>();\n\tfor (const candidate of candidates) {\n\t\ttry {\n\t\t\tconst credential = asObject(candidate);\n\t\t\tif (credential?.type !== \"oauth\") continue;\n\t\t\tsawOAuth = true;\n\t\t\tconst storedAccess = asNonemptyString(credential.access);\n\t\t\tif (storedAccess !== resolvedAccess) continue;\n\t\t\tsawMatchingAccess = true;\n\t\t\tconst accountId = validHeaderValue(credential.accountId);\n\t\t\tconst refresh = asNonemptyString(credential.refresh);\n\t\t\tif (!accountId || accountId !== resolvedAccountId || !refresh) {\n\t\t\t\tsawInvalidAccountId = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tmatches.set(refresh, { accountId, storedAccess });\n\t\t} catch {\n\t\t\t// Malformed candidates never authorize a reset request.\n\t\t}\n\t}\n\tif (sawInvalidAccountId) {\n\t\tthrow new Error(\"The OpenAI Codex OAuth credential did not include a valid account ID.\");\n\t}\n\tif (matches.size > 1) {\n\t\tthrow new Error(\"Conflicting OAuth credentials match the active OpenAI Codex runtime account.\");\n\t}\n\tconst match = matches.values().next().value;\n\tif (match) return match;\n\tif (!sawOAuth) {\n\t\tthrow new Error(\n\t\t\tstandaloneFallback\n\t\t\t\t? \"Usage limit resets require the OpenAI Codex OAuth account configured through Pi /login.\"\n\t\t\t\t: \"Usage limit resets require an OpenAI Codex OAuth account configured through Pi /login or a compatible credential source.\",\n\t\t);\n\t}\n\tif (sawMatchingAccess) throw new Error(\"OpenAI Codex OAuth credentials were incomplete.\");\n\tthrow new Error(\n\t\tstandaloneFallback\n\t\t\t? \"The active OpenAI Codex runtime account does not match Pi's stored OAuth account.\"\n\t\t\t: \"The active OpenAI Codex runtime account does not match any available OAuth account.\",\n\t);\n}\n\nfunction codexAccountIdFromAccessToken(access: string): string | undefined {\n\ttry {\n\t\tconst parts = access.split(\".\");\n\t\tif (parts.length !== 3 || !parts[1]) return undefined;\n\t\tconst payload = JSON.parse(Buffer.from(parts[1], \"base64url\").toString(\"utf8\")) as unknown;\n\t\tconst claims = asObject(asObject(payload)?.[\"https://api.openai.com/auth\"]);\n\t\treturn validHeaderValue(claims?.chatgpt_account_id);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction normalizeResetOption(credit: Record<string, unknown>): CodexResetOption {\n\tconst creditId = asOpaqueId(credit.id);\n\tif (!creditId) throw new Error(\"Codex reset credits response returned an invalid credit ID.\");\n\tlet expiresAt: number | undefined;\n\tif (credit.expires_at !== undefined && credit.expires_at !== null) {\n\t\tif (typeof credit.expires_at !== \"string\") {\n\t\t\tthrow new Error(\"Codex reset credits response returned an invalid expiration time.\");\n\t\t}\n\t\tconst parsed = Date.parse(credit.expires_at);\n\t\tif (!Number.isFinite(parsed)) {\n\t\t\tthrow new Error(\"Codex reset credits response returned an invalid expiration time.\");\n\t\t}\n\t\texpiresAt = Math.floor(parsed / 1_000);\n\t}\n\tconst title = displayString(credit.title) ?? \"Full reset\";\n\tconst description = displayString(credit.description) ?? \"Reset your current usage limits.\";\n\treturn {\n\t\tcreditId,\n\t\ttitle,\n\t\tdescription,\n\t\t...(expiresAt === undefined ? {} : { expiresAt }),\n\t};\n}\n\nfunction isCodexResetOutcomeCode(value: unknown): value is CodexResetOutcomeCode {\n\treturn (\n\t\tvalue === \"reset\" ||\n\t\tvalue === \"nothing_to_reset\" ||\n\t\tvalue === \"no_credit\" ||\n\t\tvalue === \"already_redeemed\"\n\t);\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\treturn value as Record<string, unknown>;\n}\n\nfunction asNonemptyString(value: unknown): string | undefined {\n\treturn typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction asOpaqueId(value: unknown): string | undefined {\n\tif (typeof value !== \"string\" || value.length === 0 || value.length > MAX_CREDIT_ID_CHARS) {\n\t\treturn undefined;\n\t}\n\treturn value;\n}\n\nfunction displayString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\treturn sanitizeDisplayText(value, 160) || undefined;\n}\n\nfunction validHeaderValue(value: unknown): string | undefined {\n\tif (typeof value !== \"string\" || !value || value.length > 512) return undefined;\n\tif (/[^\\x20-\\x7e]/u.test(value)) return undefined;\n\treturn value;\n}\n\nfunction nonnegativeInteger(value: unknown): number | undefined {\n\tconst parsed =\n\t\ttypeof value === \"number\"\n\t\t\t? value\n\t\t\t: typeof value === \"string\" && value.trim()\n\t\t\t\t? Number(value)\n\t\t\t\t: Number.NaN;\n\tif (!Number.isSafeInteger(parsed) || parsed < 0) return undefined;\n\treturn parsed;\n}\n\nfunction bearerToken(authorization: string | undefined): string | undefined {\n\treturn /^Bearer\\s+(.+)$/iu.exec(authorization ?? \"\")?.[1];\n}\n\nfunction headerValue(headers: Record<string, string>, name: string): string | undefined {\n\treturn Object.entries(headers).find(\n\t\t([candidate]) => candidate.toLowerCase() === name.toLowerCase(),\n\t)?.[1];\n}\n", "import { createHmac } from \"node:crypto\";\nimport type { UsageReport } from \"./types.js\";\n\nexport class UsageCache {\n\tprivate readonly entries = new Map<string, { createdAt: number; report: UsageReport }>();\n\tprivate readonly ttlMs: number;\n\tprivate readonly maxEntries: number;\n\n\tconstructor(ttlMs: number, maxEntries = 32) {\n\t\tif (!Number.isFinite(ttlMs) || ttlMs <= 0) throw new Error(\"Cache TTL must be positive.\");\n\t\tif (!Number.isSafeInteger(maxEntries) || maxEntries < 1) {\n\t\t\tthrow new Error(\"Cache entry limit must be a positive integer.\");\n\t\t}\n\t\tthis.ttlMs = ttlMs;\n\t\tthis.maxEntries = maxEntries;\n\t}\n\n\tget size(): number {\n\t\treturn this.entries.size;\n\t}\n\n\tget(providerId: string, fingerprint: string, now = Date.now()): UsageReport | undefined {\n\t\tthis.sweepExpired(now);\n\t\treturn this.entries.get(cacheKey(providerId, fingerprint))?.report;\n\t}\n\n\tset(providerId: string, fingerprint: string, report: UsageReport, now = Date.now()): void {\n\t\tthis.sweepExpired(now);\n\t\tconst key = cacheKey(providerId, fingerprint);\n\t\tthis.entries.delete(key);\n\t\twhile (this.entries.size >= this.maxEntries) {\n\t\t\tconst oldest = this.entries.keys().next().value;\n\t\t\tif (oldest === undefined) break;\n\t\t\tthis.entries.delete(oldest);\n\t\t}\n\t\tthis.entries.set(key, { createdAt: now, report });\n\t}\n\n\tclearProvider(providerId: string): void {\n\t\tfor (const key of this.entries.keys()) {\n\t\t\tif (key.startsWith(`${providerId}:`)) this.entries.delete(key);\n\t\t}\n\t}\n\n\tclear(): void {\n\t\tthis.entries.clear();\n\t}\n\n\tprivate sweepExpired(now: number): void {\n\t\tfor (const [key, entry] of this.entries) {\n\t\t\tif (now - entry.createdAt >= this.ttlMs) this.entries.delete(key);\n\t\t}\n\t}\n}\n\nexport function fingerprintResolvedAuth(\n\tauth: { apiKey?: string; headers?: Record<string, string> },\n\tsalt: Uint8Array,\n): string {\n\tconst headers = Object.entries(auth.headers ?? {})\n\t\t.map(([name, value]) => [name.toLowerCase(), value] as const)\n\t\t.sort(([left], [right]) => left.localeCompare(right));\n\tconst canonical = JSON.stringify({ apiKey: auth.apiKey ?? \"\", headers });\n\treturn createHmac(\"sha256\", salt).update(canonical).digest(\"hex\");\n}\n\nexport async function runWithConcurrency<T, R>(\n\titems: readonly T[],\n\tlimit: number,\n\tworker: (item: T, index: number, signal: AbortSignal) => Promise<R>,\n\tsignal: AbortSignal,\n): Promise<PromiseSettledResult<R>[]> {\n\tif (signal.aborted) throw abortError();\n\tif (!Number.isSafeInteger(limit) || limit < 1)\n\t\tthrow new Error(\"Concurrency limit must be positive.\");\n\n\tconst results = new Array<PromiseSettledResult<R>>(items.length);\n\tlet nextIndex = 0;\n\tconst runners = Array.from({ length: Math.min(limit, items.length) }, async () => {\n\t\twhile (nextIndex < items.length) {\n\t\t\tif (signal.aborted) throw abortError();\n\t\t\tconst index = nextIndex;\n\t\t\tnextIndex += 1;\n\t\t\ttry {\n\t\t\t\tresults[index] = {\n\t\t\t\t\tstatus: \"fulfilled\",\n\t\t\t\t\tvalue: await worker(items[index] as T, index, signal),\n\t\t\t\t};\n\t\t\t} catch (reason) {\n\t\t\t\tresults[index] = { status: \"rejected\", reason };\n\t\t\t}\n\t\t}\n\t});\n\n\tawait Promise.all(runners);\n\tif (signal.aborted) throw abortError();\n\treturn results;\n}\n\nexport async function awaitWithDeadline<T>(\n\toperation: Promise<T>,\n\tsignal: AbortSignal,\n\ttimeoutMs: number,\n\tdescription: string,\n): Promise<T> {\n\tif (signal.aborted) throw abortError();\n\tconst controller = new AbortController();\n\tconst abortFromCaller = () => controller.abort();\n\tsignal.addEventListener(\"abort\", abortFromCaller, { once: true });\n\tconst timeout = setTimeout(() => controller.abort(), timeoutMs);\n\ttry {\n\t\treturn await Promise.race([\n\t\t\toperation,\n\t\t\tnew Promise<never>((_resolve, reject) => {\n\t\t\t\tcontroller.signal.addEventListener(\n\t\t\t\t\t\"abort\",\n\t\t\t\t\t() => {\n\t\t\t\t\t\treject(\n\t\t\t\t\t\t\tsignal.aborted\n\t\t\t\t\t\t\t\t? abortError()\n\t\t\t\t\t\t\t\t: Object.assign(\n\t\t\t\t\t\t\t\t\t\tnew Error(`Timed out after ${Math.round(timeoutMs / 1000)}s ${description}.`),\n\t\t\t\t\t\t\t\t\t\t{ name: \"TimeoutError\" },\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\t{ once: true },\n\t\t\t\t);\n\t\t\t}),\n\t\t]);\n\t} finally {\n\t\tclearTimeout(timeout);\n\t\tsignal.removeEventListener(\"abort\", abortFromCaller);\n\t}\n}\n\nexport function sanitizeDisplayText(value: string, maxChars = 160): string {\n\tlet result = \"\";\n\tfor (let index = 0; index < value.length; ) {\n\t\tconst codePoint = value.codePointAt(index) ?? 0;\n\t\tconst character = String.fromCodePoint(codePoint);\n\t\tif (codePoint === 0x1b || codePoint === 0x9b || codePoint === 0x9d) {\n\t\t\tindex = skipTerminalEscape(value, index, codePoint);\n\t\t\tcontinue;\n\t\t}\n\t\tif (codePoint <= 0x1f || (codePoint >= 0x7f && codePoint <= 0x9f)) {\n\t\t\tif (codePoint === 0x09 || codePoint === 0x0a || codePoint === 0x0d) result += \" \";\n\t\t\tindex += character.length;\n\t\t\tcontinue;\n\t\t}\n\t\tresult += character;\n\t\tindex += character.length;\n\t}\n\treturn truncate(result.replace(/\\s+/gu, \" \").trim(), maxChars);\n}\n\nexport function redactUsageError(value: string, secrets: readonly string[] = []): string {\n\tlet redacted = value;\n\tfor (const secret of [...new Set(secrets)].filter(Boolean).sort((a, b) => b.length - a.length)) {\n\t\tredacted = redacted.replace(new RegExp(escapeRegExp(secret), \"g\"), \"<redacted>\");\n\t}\n\tredacted = redacted\n\t\t.replace(/Bearer\\s+[A-Za-z0-9._~+/=-]+/gi, \"Bearer <redacted>\")\n\t\t.replace(/\"(?:access_token|refresh_token|api_key)\"\\s*:\\s*\"[^\"]+\"/gi, (match) => {\n\t\t\tconst separator = match.indexOf(\":\");\n\t\t\treturn `${match.slice(0, separator + 1)}\"<redacted>\"`;\n\t\t});\n\treturn sanitizeDisplayText(redacted, 600);\n}\n\nexport function errorMessage(error: unknown): string {\n\treturn sanitizeDisplayText(error instanceof Error ? error.message : String(error), 600);\n}\n\nexport function abortError(): Error {\n\treturn Object.assign(new Error(\"Usage query aborted.\"), { name: \"AbortError\" });\n}\n\nfunction skipTerminalEscape(value: string, start: number, codePoint: number): number {\n\tlet index = start + 1;\n\tconst next = value.charCodeAt(index);\n\tconst isOsc = codePoint === 0x9d || (codePoint === 0x1b && next === 0x5d);\n\tif (isOsc) {\n\t\tif (codePoint === 0x1b) index += 1;\n\t\twhile (index < value.length) {\n\t\t\tconst current = value.charCodeAt(index);\n\t\t\tif (current === 0x07) return index + 1;\n\t\t\tif (current === 0x1b && value.charCodeAt(index + 1) === 0x5c) return index + 2;\n\t\t\tindex += 1;\n\t\t}\n\t\treturn index;\n\t}\n\tconst isCsi = codePoint === 0x9b || (codePoint === 0x1b && next === 0x5b);\n\tif (isCsi) {\n\t\tif (codePoint === 0x1b) index += 1;\n\t\twhile (index < value.length) {\n\t\t\tconst current = value.charCodeAt(index);\n\t\t\tindex += 1;\n\t\t\tif (current >= 0x40 && current <= 0x7e) break;\n\t\t}\n\t\treturn index;\n\t}\n\treturn Math.min(value.length, start + (codePoint === 0x1b ? 2 : 1));\n}\n\nfunction cacheKey(providerId: string, fingerprint: string): string {\n\treturn `${providerId}:${fingerprint}`;\n}\n\nfunction escapeRegExp(value: string): string {\n\treturn value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction truncate(value: string, maxChars: number): string {\n\tif (value.length <= maxChars) return value;\n\treturn `${value.slice(0, maxChars - 1)}\u2026`;\n}\n", "import type { OAuthCredential } from \"@earendil-works/pi-ai\";\nimport {\n\ttype ExtensionAPI,\n\ttype ExtensionContext,\n\treadStoredCredential,\n} from \"@earendil-works/pi-coding-agent\";\n\nexport const OAUTH_CREDENTIAL_SOURCE_CHANNEL = \"oauth:credential-source:v1\";\n\nexport type StoredCredentialReader = (providerId: string) => unknown;\n\nexport type OAuthCredentialCandidates =\n\t| { ok: true; candidates: readonly OAuthCredential[]; offeredCount?: number }\n\t| { ok: false };\n\nexport type OAuthCredentialCandidateReader = (\n\tctx: ExtensionContext,\n\tproviderId: string,\n) => OAuthCredentialCandidates;\n\nexport function createOAuthCredentialCandidateReader(\n\tpi: ExtensionAPI,\n\tcredentialReader: StoredCredentialReader = readStoredCredential,\n): OAuthCredentialCandidateReader {\n\treturn (ctx, providerId) =>\n\t\tcollectOAuthCredentialCandidates(pi, ctx, providerId, credentialReader);\n}\n\nexport function collectOAuthCredentialCandidates(\n\tpi: Pick<ExtensionAPI, \"events\">,\n\tctx: ExtensionContext,\n\tproviderId: string,\n\tcredentialReader: StoredCredentialReader = readStoredCredential,\n): OAuthCredentialCandidates {\n\tconst candidates: OAuthCredential[] = [];\n\tlet collecting = true;\n\tconst request = Object.freeze({\n\t\tsession: ctx.sessionManager,\n\t\tprovider: providerId,\n\t\toffer(candidate: unknown) {\n\t\t\tif (!collecting) return;\n\t\t\tconst clone = cloneOAuthCredential(candidate);\n\t\t\tif (clone) candidates.push(clone);\n\t\t},\n\t});\n\ttry {\n\t\tpi.events.emit(OAUTH_CREDENTIAL_SOURCE_CHANNEL, request);\n\t} catch {\n\t\treturn { ok: false };\n\t} finally {\n\t\tcollecting = false;\n\t}\n\tconst offeredCount = candidates.length;\n\ttry {\n\t\tconst fallback = cloneOAuthCredential(credentialReader(providerId));\n\t\tif (fallback) candidates.push(fallback);\n\t} catch {\n\t\t// A malformed or unavailable standalone credential is equivalent to no fallback.\n\t}\n\treturn { ok: true, candidates, offeredCount };\n}\n\nexport function fallbackOAuthCredentialCandidates(\n\tproviderId: string,\n\tcredentialReader: StoredCredentialReader,\n): OAuthCredentialCandidates {\n\ttry {\n\t\tconst credential = cloneOAuthCredential(credentialReader(providerId));\n\t\treturn { ok: true, candidates: credential ? [credential] : [], offeredCount: 0 };\n\t} catch {\n\t\treturn { ok: true, candidates: [], offeredCount: 0 };\n\t}\n}\n\nfunction cloneOAuthCredential(value: unknown): OAuthCredential | undefined {\n\ttry {\n\t\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\t\tconst clone = structuredClone(value) as OAuthCredential;\n\t\tif (!clone || typeof clone !== \"object\" || Array.isArray(clone)) return undefined;\n\t\tif (clone.type !== \"oauth\") return undefined;\n\t\tif (typeof clone.access !== \"string\" || !clone.access) return undefined;\n\t\tif (typeof clone.refresh !== \"string\" || !clone.refresh) return undefined;\n\t\tif (typeof clone.expires !== \"number\" || !Number.isFinite(clone.expires)) return undefined;\n\t\treturn clone;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n", "import { randomBytes } from \"node:crypto\";\nimport { type ExtensionContext, readStoredCredential } from \"@earendil-works/pi-coding-agent\";\nimport { errorMessage, fingerprintResolvedAuth, redactUsageError } from \"./core.js\";\nimport {\n\tfallbackOAuthCredentialCandidates,\n\ttype OAuthCredentialCandidateReader,\n} from \"./oauth-credential-source.js\";\nimport { normalizeCodexBackendPayload } from \"./providers/codex.js\";\nimport { normalizeGitHubCopilotUsagePayload } from \"./providers/github-copilot.js\";\nimport { normalizeOpenCodeZenPayload } from \"./providers/opencode-zen.js\";\nimport { normalizeOpenRouterKeyPayload } from \"./providers/openrouter.js\";\nimport type {\n\tCodexBackendPayload,\n\tGitHubCopilotUsagePayload,\n\tOpenCodeZenPayload,\n\tOpenRouterKeyPayload,\n\tPiModel,\n\tResolvedUsageAuth,\n\tUsageProviderAdapter,\n\tUsageReport,\n} from \"./types.js\";\n\nconst CODEX_USAGE_URL = \"https://chatgpt.com/backend-api/wham/usage\";\nconst GITHUB_COPILOT_USAGE_URL = \"https://api.github.com/copilot_internal/user\";\nconst OPENROUTER_KEY_URL = \"https://openrouter.ai/api/v1/key\";\nconst MAX_SUCCESS_BODY_BYTES = 64 * 1024;\nconst MAX_ERROR_BODY_BYTES = 4 * 1024;\n\nexport const AUTH_FINGERPRINT_SALT = randomBytes(32);\n\nexport const SUPPORTED_ADAPTERS: readonly UsageProviderAdapter[] = [\n\t{\n\t\tid: \"openai-codex\",\n\t\tdisplayName: \"OpenAI Codex\",\n\t\tsemantics: {\n\t\t\tkind: \"consumer-subscription\",\n\t\t\tlabel: \"ChatGPT subscription limits\",\n\t\t},\n\t\tasync query(auth, signal, timeoutMs) {\n\t\t\tconst payload = await fetchProviderJson(\n\t\t\t\tCODEX_USAGE_URL,\n\t\t\t\tauth,\n\t\t\t\tsignal,\n\t\t\t\ttimeoutMs,\n\t\t\t\t\"Codex usage endpoint\",\n\t\t\t);\n\t\t\treturn normalizeCodexBackendPayload(payload as CodexBackendPayload, Date.now());\n\t\t},\n\t},\n\t{\n\t\tid: \"github-copilot\",\n\t\tdisplayName: \"GitHub Copilot\",\n\t\tsemantics: {\n\t\t\tkind: \"consumer-subscription\",\n\t\t\tlabel: \"GitHub Copilot account allowance\",\n\t\t},\n\t\tasync query(auth, signal, timeoutMs) {\n\t\t\tconst payload = await fetchProviderJson(\n\t\t\t\tGITHUB_COPILOT_USAGE_URL,\n\t\t\t\tauth,\n\t\t\t\tsignal,\n\t\t\t\ttimeoutMs,\n\t\t\t\t\"GitHub Copilot usage endpoint\",\n\t\t\t);\n\t\t\treturn normalizeGitHubCopilotUsagePayload(payload as GitHubCopilotUsagePayload, Date.now());\n\t\t},\n\t},\n\t{\n\t\tid: \"openrouter\",\n\t\tdisplayName: \"OpenRouter\",\n\t\tsemantics: { kind: \"api-key\", label: \"API-key spend limits\" },\n\t\tasync query(auth, signal, timeoutMs) {\n\t\t\tconst payload = await fetchProviderJson(\n\t\t\t\tOPENROUTER_KEY_URL,\n\t\t\t\tauth,\n\t\t\t\tsignal,\n\t\t\t\ttimeoutMs,\n\t\t\t\t\"OpenRouter key endpoint\",\n\t\t\t);\n\t\t\treturn normalizeOpenRouterKeyPayload(payload as OpenRouterKeyPayload, Date.now());\n\t\t},\n\t},\n\t{\n\t\tid: \"opencode-go\",\n\t\tdisplayName: \"OpenCode Go\",\n\t\tsemantics: { kind: \"consumer-subscription\", label: \"OpenCode Zen plan usage\" },\n\t\tasync query(auth, signal, timeoutMs) {\n\t\t\tconst payload = await fetchProviderJson(\n\t\t\t\topencodeUsageUrl(auth.model.baseUrl),\n\t\t\t\tauth,\n\t\t\t\tsignal,\n\t\t\t\ttimeoutMs,\n\t\t\t\t\"OpenCode Zen usage endpoint\",\n\t\t\t);\n\t\t\treturn normalizeOpenCodeZenPayload(payload as OpenCodeZenPayload, Date.now());\n\t\t},\n\t},\n];\n\nexport function adapterForProvider(\n\tproviderId: string | undefined,\n): UsageProviderAdapter | undefined {\n\treturn SUPPORTED_ADAPTERS.find((adapter) => adapter.id === providerId);\n}\n\nexport function isStaleExtensionContextError(error: unknown): boolean {\n\treturn (\n\t\terror instanceof Error &&\n\t\terror.message.includes(\"This extension ctx is stale after session replacement or reload\")\n\t);\n}\n\nexport async function resolveUsageAuth(\n\tctx: ExtensionContext,\n\tadapter: UsageProviderAdapter,\n\tsalt: Uint8Array = AUTH_FINGERPRINT_SALT,\n\tcredentialReader: StoredCredentialReader = readStoredCredential,\n\tcandidateReader?: OAuthCredentialCandidateReader,\n): Promise<ResolvedUsageAuth | undefined> {\n\tif (ctx.model?.provider === adapter.id && !hasOfficialOrigin(ctx.model, adapter.id)) {\n\t\tthrow new Error(\n\t\t\t`${adapter.displayName} usage cannot send a custom provider base URL credential to the official usage endpoint.`,\n\t\t);\n\t}\n\n\tconst model = candidateModels(ctx, adapter.id).find((candidate) =>\n\t\thasOfficialOrigin(candidate, adapter.id),\n\t);\n\tif (!model) return undefined;\n\tconst registry = ctx.modelRegistry as unknown as UsageAuthRegistry;\n\tlet modelAuth: RequestAuth | undefined;\n\tif (ctx.model?.provider === adapter.id && typeof registry.getApiKeyAndHeaders === \"function\") {\n\t\tconst result = await registry.getApiKeyAndHeaders(ctx.model);\n\t\tif (!result.ok) throw new Error(redactUsageError(result.error));\n\t\tif (authorizationFrom(result)) modelAuth = result;\n\t}\n\tif (typeof registry.getProviderAuth !== \"function\") {\n\t\tthrow new Error(\"pi-usage requires Pi 0.81.0 or newer to validate resolved provider auth.\");\n\t}\n\tconst providerResult = await registry.getProviderAuth(adapter.id);\n\tif (\n\t\tproviderResult?.auth.baseUrl &&\n\t\t!hasOfficialUrlOrigin(providerResult.auth.baseUrl, adapter.id)\n\t) {\n\t\tthrow new Error(\n\t\t\t`${adapter.displayName} usage cannot send a proxy-resolved credential to the official usage endpoint.`,\n\t\t);\n\t}\n\tconst auth = modelAuth ?? providerResult?.auth;\n\tif (!auth) return undefined;\n\tif (adapter.id === \"github-copilot\") {\n\t\tconst offered = candidateReader\n\t\t\t? candidateReader(ctx, adapter.id)\n\t\t\t: fallbackOAuthCredentialCandidates(adapter.id, credentialReader);\n\t\tif (!offered.ok) {\n\t\t\tthrow new Error(\"GitHub Copilot OAuth credential discovery failed closed.\");\n\t\t}\n\t\treturn resolveGitHubCopilotUsageAuth(\n\t\t\tauth,\n\t\t\tmodel,\n\t\t\tsalt,\n\t\t\toffered.candidates,\n\t\t\toffered.offeredCount === 0,\n\t\t);\n\t}\n\tconst authorization = authorizationFrom(auth);\n\tif (!authorization) return undefined;\n\tconst headers = { Authorization: authorization };\n\tconst secrets = [auth.apiKey, headerValue(auth.headers, \"Authorization\"), authorization].filter(\n\t\t(value): value is string => Boolean(value),\n\t);\n\treturn {\n\t\tapiKey: auth.apiKey,\n\t\theaders,\n\t\tfingerprint: fingerprintResolvedAuth({ headers }, salt),\n\t\tsecrets,\n\t\tmodel,\n\t};\n}\n\nexport async function queryProviderUsage(\n\tadapter: UsageProviderAdapter,\n\tauth: ResolvedUsageAuth,\n\tsignal: AbortSignal,\n\ttimeoutMs: number,\n): Promise<UsageReport> {\n\ttry {\n\t\treturn await adapter.query(auth, signal, timeoutMs);\n\t} catch (error) {\n\t\tif (isStaleExtensionContextError(error) || isAbortError(error)) throw error;\n\t\tthrow new Error(redactUsageError(errorMessage(error), auth.secrets));\n\t}\n}\n\nexport function providerIsConfigured(ctx: ExtensionContext, providerId: string): boolean {\n\ttry {\n\t\treturn ctx.modelRegistry.getProviderAuthStatus(providerId).configured;\n\t} catch {\n\t\treturn candidateModels(ctx, providerId).length > 0;\n\t}\n}\n\nfunction candidateModels(ctx: ExtensionContext, providerId: string): PiModel[] {\n\tconst candidates: PiModel[] = [];\n\tconst seen = new Set<string>();\n\tconst add = (model: PiModel | undefined) => {\n\t\tif (!model || model.provider !== providerId) return;\n\t\tconst key = `${model.provider}/${model.id}`;\n\t\tif (seen.has(key)) return;\n\t\tseen.add(key);\n\t\tcandidates.push(model);\n\t};\n\tadd(ctx.model);\n\tfor (const model of ctx.modelRegistry.getAvailable()) add(model);\n\tfor (const model of ctx.modelRegistry.getAll()) add(model);\n\treturn candidates;\n}\n\nexport async function fetchProviderJson(\n\turl: string,\n\tauth: ResolvedUsageAuth,\n\tsignal: AbortSignal,\n\ttimeoutMs: number,\n\tdescription: string,\n\trequest: {\n\t\tmethod?: \"GET\" | \"POST\";\n\t\tbody?: Record<string, unknown>;\n\t} = {},\n): Promise<Record<string, unknown>> {\n\tconst controller = new AbortController();\n\tlet timedOut = false;\n\tconst abortFromCaller = () => controller.abort();\n\tif (signal.aborted) controller.abort();\n\telse signal.addEventListener(\"abort\", abortFromCaller, { once: true });\n\tconst timeout = setTimeout(() => {\n\t\ttimedOut = true;\n\t\tcontroller.abort();\n\t}, timeoutMs);\n\ttry {\n\t\tconst headers = { ...auth.headers };\n\t\tif (!hasHeader(headers, \"User-Agent\")) headers[\"User-Agent\"] = \"pi-usage\";\n\t\tif (request.body && !hasHeader(headers, \"Content-Type\")) {\n\t\t\theaders[\"Content-Type\"] = \"application/json\";\n\t\t}\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: request.method ?? \"GET\",\n\t\t\theaders,\n\t\t\t...(request.body ? { body: JSON.stringify(request.body) } : {}),\n\t\t\tsignal: controller.signal,\n\t\t});\n\t\tif (controller.signal.aborted)\n\t\t\tthrow Object.assign(new Error(\"Usage query aborted.\"), { name: \"AbortError\" });\n\t\tconst text = await readBoundedResponse(\n\t\t\tresponse,\n\t\t\tresponse.ok ? MAX_SUCCESS_BODY_BYTES : MAX_ERROR_BODY_BYTES,\n\t\t\t!response.ok,\n\t\t\tdescription,\n\t\t);\n\t\tif (controller.signal.aborted)\n\t\t\tthrow Object.assign(new Error(\"Usage query aborted.\"), { name: \"AbortError\" });\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(\n\t\t\t\t`${description} returned ${response.status} ${response.statusText}: ${redactUsageError(text, auth.secrets)}`,\n\t\t\t);\n\t\t}\n\t\tlet parsed: unknown;\n\t\ttry {\n\t\t\tparsed = JSON.parse(text) as unknown;\n\t\t} catch (error) {\n\t\t\tthrow new Error(`${description} returned invalid JSON: ${errorMessage(error)}`);\n\t\t}\n\t\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\t\tthrow new Error(`${description} response was not an object.`);\n\t\t}\n\t\treturn parsed as Record<string, unknown>;\n\t} catch (error) {\n\t\tif (timedOut) {\n\t\t\tthrow new Error(`Timed out after ${Math.round(timeoutMs / 1000)}s while fetching usage.`);\n\t\t}\n\t\tif (signal.aborted)\n\t\t\tthrow Object.assign(new Error(\"Usage query aborted.\"), { name: \"AbortError\" });\n\t\tthrow error;\n\t} finally {\n\t\tclearTimeout(timeout);\n\t\tsignal.removeEventListener(\"abort\", abortFromCaller);\n\t}\n}\n\nasync function readBoundedResponse(\n\tresponse: Response,\n\tmaxBytes: number,\n\ttruncateOverflow: boolean,\n\tdescription: string,\n): Promise<string> {\n\tif (!response.body) return \"\";\n\tconst reader = response.body.getReader();\n\tconst chunks: Uint8Array[] = [];\n\tlet total = 0;\n\tlet truncated = false;\n\ttry {\n\t\twhile (true) {\n\t\t\tconst { done, value } = await reader.read();\n\t\t\tif (done) break;\n\t\t\tconst remaining = maxBytes - total;\n\t\t\tif (value.byteLength > remaining) {\n\t\t\t\tif (remaining > 0) chunks.push(value.subarray(0, remaining));\n\t\t\t\ttotal = maxBytes;\n\t\t\t\ttruncated = true;\n\t\t\t\tawait reader.cancel();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tchunks.push(value);\n\t\t\ttotal += value.byteLength;\n\t\t}\n\t} finally {\n\t\treader.releaseLock();\n\t}\n\tif (truncated && !truncateOverflow) {\n\t\tthrow new Error(`${description} response exceeded ${maxBytes} bytes.`);\n\t}\n\tconst body = new Uint8Array(total);\n\tlet offset = 0;\n\tfor (const chunk of chunks) {\n\t\tbody.set(chunk, offset);\n\t\toffset += chunk.byteLength;\n\t}\n\tconst text = new TextDecoder().decode(body);\n\treturn truncated ? `${text}\u2026` : text;\n}\n\ntype RequestAuth = {\n\tapiKey?: string;\n\theaders?: Record<string, string | null>;\n};\n\ntype StoredCredentialReader = (providerId: string) => unknown;\n\ntype UsageAuthRegistry = {\n\tgetApiKeyAndHeaders?(\n\t\tmodel: PiModel,\n\t): Promise<({ ok: true } & RequestAuth) | { ok: false; error: string }>;\n\tgetProviderAuth?(providerId: string): Promise<\n\t\t| {\n\t\t\t\tauth: RequestAuth & { baseUrl?: string };\n\t\t }\n\t\t| undefined\n\t>;\n};\n\nfunction resolveGitHubCopilotUsageAuth(\n\tauth: RequestAuth,\n\tmodel: PiModel,\n\tsalt: Uint8Array,\n\tcandidates: readonly unknown[],\n\tstandaloneFallback: boolean,\n): ResolvedUsageAuth {\n\tconst resolvedAccess = bearerToken(headerValue(auth.headers, \"Authorization\")) ?? auth.apiKey;\n\tif (!resolvedAccess) throw new Error(\"GitHub Copilot OAuth credentials were incomplete.\");\n\tlet sawOAuth = false;\n\tlet sawMatchingAccess = false;\n\tlet sawIncompleteMatch = false;\n\tlet sawEnterpriseMatch = false;\n\tconst matches = new Map<string, { refresh: string; storedAccess: string }>();\n\tfor (const candidate of candidates) {\n\t\ttry {\n\t\t\tconst credential = asObject(candidate);\n\t\t\tif (credential?.type !== \"oauth\") continue;\n\t\t\tsawOAuth = true;\n\t\t\tconst storedAccess =\n\t\t\t\ttypeof credential.access === \"string\" && credential.access ? credential.access : undefined;\n\t\t\tif (storedAccess !== resolvedAccess) continue;\n\t\t\tsawMatchingAccess = true;\n\t\t\tconst enterpriseUrl = credential.enterpriseUrl;\n\t\t\tif (\n\t\t\t\ttypeof enterpriseUrl === \"string\" &&\n\t\t\t\tenterpriseUrl &&\n\t\t\t\t!isPublicGitHubDomain(enterpriseUrl)\n\t\t\t) {\n\t\t\t\tsawEnterpriseMatch = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst refresh =\n\t\t\t\ttypeof credential.refresh === \"string\" && credential.refresh\n\t\t\t\t\t? credential.refresh\n\t\t\t\t\t: undefined;\n\t\t\tif (!refresh) {\n\t\t\t\tsawIncompleteMatch = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tmatches.set(`${storedAccess.length}:${storedAccess}${refresh}`, { refresh, storedAccess });\n\t\t} catch {\n\t\t\t// Malformed candidates never authorize a provider request.\n\t\t}\n\t}\n\tif (sawEnterpriseMatch) {\n\t\tthrow new Error(\"GitHub Copilot usage does not yet support GitHub Enterprise accounts.\");\n\t}\n\tif (sawIncompleteMatch) throw new Error(\"GitHub Copilot OAuth credentials were incomplete.\");\n\tif (matches.size > 1) {\n\t\tthrow new Error(\n\t\t\t\"Conflicting OAuth credentials match the active GitHub Copilot runtime account.\",\n\t\t);\n\t}\n\tconst match = matches.values().next().value;\n\tif (!match) {\n\t\tif (!sawOAuth) {\n\t\t\tthrow new Error(\n\t\t\t\tstandaloneFallback\n\t\t\t\t\t? \"GitHub Copilot usage requires the OAuth account configured through Pi /login.\"\n\t\t\t\t\t: \"GitHub Copilot usage requires an OAuth account configured through Pi /login or a compatible credential source.\",\n\t\t\t);\n\t\t}\n\t\tif (sawMatchingAccess) throw new Error(\"GitHub Copilot OAuth credentials were incomplete.\");\n\t\tthrow new Error(\n\t\t\tstandaloneFallback\n\t\t\t\t? \"The active GitHub Copilot runtime account does not match Pi's stored OAuth account.\"\n\t\t\t\t: \"The active GitHub Copilot runtime account does not match any available OAuth account.\",\n\t\t);\n\t}\n\tconst { refresh, storedAccess } = match;\n\tconst authorization = `Bearer ${refresh}`;\n\tconst headers = {\n\t\tAuthorization: authorization,\n\t\t\"X-GitHub-Api-Version\": \"2025-05-01\",\n\t};\n\treturn {\n\t\tapiKey: refresh,\n\t\theaders,\n\t\tfingerprint: fingerprintResolvedAuth({ headers }, salt),\n\t\tsecrets: [refresh, storedAccess, resolvedAccess, authorization],\n\t\tmodel,\n\t};\n}\n\nfunction authorizationFrom(auth: RequestAuth): string | undefined {\n\treturn (\n\t\theaderValue(auth.headers, \"Authorization\") ??\n\t\t(auth.apiKey ? `Bearer ${auth.apiKey}` : undefined)\n\t);\n}\n\nfunction bearerToken(authorization: string | undefined): string | undefined {\n\tconst match = /^Bearer\\s+(.+)$/iu.exec(authorization ?? \"\");\n\treturn match?.[1];\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\treturn value as Record<string, unknown>;\n}\n\nfunction isPublicGitHubDomain(value: string): boolean {\n\ttry {\n\t\tconst url = new URL(value.includes(\"://\") ? value : `https://${value}`);\n\t\treturn url.hostname.toLowerCase() === \"github.com\";\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction hasOfficialOrigin(model: PiModel, providerId: string): boolean {\n\treturn hasOfficialUrlOrigin(model.baseUrl, providerId);\n}\n\nfunction hasOfficialUrlOrigin(value: string, providerId: string): boolean {\n\ttry {\n\t\tconst url = new URL(value);\n\t\tif (providerId === \"openai-codex\") return url.origin === \"https://chatgpt.com\";\n\t\tif (providerId === \"openrouter\") return url.origin === \"https://openrouter.ai\";\n\t\tif (providerId === \"opencode-go\") return url.origin === \"https://opencode.ai\";\n\t\tif (providerId === \"github-copilot\") {\n\t\t\treturn (\n\t\t\t\turl.protocol === \"https:\" && /^api\\.[a-z0-9-]+\\.githubcopilot\\.com$/u.test(url.hostname)\n\t\t\t);\n\t\t}\n\t\treturn false;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction headerValue(\n\theaders: Record<string, string | null> | undefined,\n\tname: string,\n): string | undefined {\n\tconst entry = Object.entries(headers ?? {}).find(\n\t\t([candidate]) => candidate.toLowerCase() === name.toLowerCase(),\n\t);\n\treturn entry?.[1] ?? undefined;\n}\n\nfunction hasHeader(headers: Record<string, string>, name: string): boolean {\n\treturn Object.keys(headers).some((key) => key.toLowerCase() === name.toLowerCase());\n}\n\nfunction opencodeUsageUrl(baseUrl: string | undefined): string {\n\tconst base = baseUrl?.trim().replace(/\\/+$/u, \"\");\n\tif (!base) throw new Error(\"OpenCode Go model base URL is unavailable.\");\n\treturn `${base}/usage`;\n}\n\nfunction isAbortError(error: unknown): boolean {\n\treturn error instanceof Error && error.name === \"AbortError\";\n}\n", "import { sanitizeDisplayText } from \"../core.js\";\nimport type { CodexBackendPayload, UsageBucket, UsageMetric, UsageReport } from \"../types.js\";\n\nexport function normalizeCodexBackendPayload(\n\tpayload: CodexBackendPayload,\n\tcapturedAt: number,\n): UsageReport {\n\tconst buckets: UsageBucket[] = [];\n\tnormalizeRateLimitGroup(buckets, \"codex\", \"Codex\", payload.rate_limit, false);\n\n\tconst additional = Array.isArray(payload.additional_rate_limits)\n\t\t? payload.additional_rate_limits\n\t\t: [];\n\tfor (const item of additional) {\n\t\tconst value = asObject(item);\n\t\tconst id = asString(value?.metered_feature) ?? asString(value?.limit_name);\n\t\tif (!value || !id) continue;\n\t\ttry {\n\t\t\tnormalizeRateLimitGroup(\n\t\t\t\tbuckets,\n\t\t\t\tid,\n\t\t\t\tasString(value.limit_name) ?? id,\n\t\t\t\tvalue.rate_limit,\n\t\t\t\ttrue,\n\t\t\t);\n\t\t} catch {\n\t\t\t// Optional provider-specific buckets must not hide otherwise useful primary data.\n\t\t}\n\t}\n\n\tconst metrics: UsageMetric[] = [];\n\tconst credits = asObject(payload.credits);\n\tif (credits?.has_credits === true) {\n\t\tif (credits.unlimited === true) {\n\t\t\tmetrics.push({ id: \"credits\", label: \"Credits\", value: \"unlimited\" });\n\t\t} else {\n\t\t\tconst balance = asNumber(credits.balance);\n\t\t\tif (balance !== undefined) {\n\t\t\t\tmetrics.push({ id: \"credits\", label: \"Credits\", value: balance, unit: \"count\" });\n\t\t\t} else {\n\t\t\t\tmetrics.push({ id: \"credits\", label: \"Credits\", value: \"available\" });\n\t\t\t}\n\t\t}\n\t} else if (credits?.has_credits === false) {\n\t\tmetrics.push({ id: \"credits\", label: \"Credits\", value: \"none\" });\n\t}\n\tconst resetCredits = asObject(payload.rate_limit_reset_credits);\n\tconst resetCount = asNonnegativeInteger(resetCredits?.available_count);\n\tif (resetCount !== undefined) {\n\t\tmetrics.push({\n\t\t\tid: \"reset-credits\",\n\t\t\tlabel: \"Usage limit resets\",\n\t\t\tvalue: resetCount,\n\t\t\tunit: \"count\",\n\t\t});\n\t}\n\tif (buckets.length === 0 && metrics.length === 0) {\n\t\tthrow new Error(\"Codex usage endpoint returned no displayable usage data.\");\n\t}\n\n\tconst planType = asString(payload.plan_type);\n\treturn {\n\t\tproviderId: \"openai-codex\",\n\t\tproviderName: \"OpenAI Codex\",\n\t\tcapturedAt,\n\t\tsource: \"codex-pi-auth\",\n\t\tsemantics: {\n\t\t\tkind: \"consumer-subscription\",\n\t\t\tlabel: \"ChatGPT subscription limits\",\n\t\t},\n\t\tbuckets,\n\t\tmetrics,\n\t\t...(planType ? { notes: [`Plan: ${planType}`] } : {}),\n\t};\n}\n\nfunction normalizeRateLimitGroup(\n\tbuckets: UsageBucket[],\n\tgroupId: string,\n\tgroupLabel: string,\n\traw: unknown,\n\toptional: boolean,\n): void {\n\tif (raw === undefined || raw === null) return;\n\tconst details = asObject(raw);\n\tif (!details) {\n\t\tif (optional) return;\n\t\tthrow new Error(\"Codex rate limit was not an object.\");\n\t}\n\taddWindow(buckets, groupId, groupLabel, \"primary\", details.primary_window);\n\taddWindow(buckets, groupId, groupLabel, \"secondary\", details.secondary_window);\n}\n\nfunction addWindow(\n\tbuckets: UsageBucket[],\n\tgroupId: string,\n\tgroupLabel: string,\n\tposition: \"primary\" | \"secondary\",\n\traw: unknown,\n): void {\n\tif (raw === undefined || raw === null) return;\n\tconst value = asObject(raw);\n\tif (!value) throw new Error(\"Codex rate-limit window was not an object.\");\n\tconst used = asNumber(value.used_percent);\n\tif (used === undefined) return;\n\tconst seconds = asNumber(value.limit_window_seconds);\n\tconst resetsAt = asNumber(value.reset_at);\n\tbuckets.push({\n\t\tid: `${groupId}:${position}`,\n\t\tlabel: position === \"primary\" ? \"Primary limit\" : \"Secondary limit\",\n\t\tgroupId,\n\t\tgroupLabel,\n\t\tmodelKeys: [groupId, groupLabel],\n\t\tused,\n\t\tremaining: 100 - clampPercent(used),\n\t\tlimit: 100,\n\t\tunit: \"percent\",\n\t\t...(seconds !== undefined && seconds > 0 ? { windowMinutes: Math.ceil(seconds / 60) } : {}),\n\t\t...(resetsAt !== undefined ? { resetsAt } : {}),\n\t});\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\treturn value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\treturn sanitizeDisplayText(value, 160) || undefined;\n}\n\nfunction asNumber(value: unknown): number | undefined {\n\tif (typeof value === \"number\" && Number.isFinite(value)) return value;\n\tif (typeof value === \"string\" && value.trim()) {\n\t\tconst parsed = Number(value);\n\t\treturn Number.isFinite(parsed) ? parsed : undefined;\n\t}\n\treturn undefined;\n}\n\nfunction asNonnegativeInteger(value: unknown): number | undefined {\n\tconst parsed = asNumber(value);\n\tif (parsed === undefined || !Number.isSafeInteger(parsed)) return undefined;\n\treturn Math.max(0, parsed);\n}\n\nfunction clampPercent(value: number): number {\n\treturn Math.min(100, Math.max(0, value));\n}\n", "import { sanitizeDisplayText } from \"../core.js\";\nimport type { GitHubCopilotUsagePayload, UsageBucket, UsageReport } from \"../types.js\";\n\nexport function normalizeGitHubCopilotUsagePayload(\n\tpayload: GitHubCopilotUsagePayload,\n\tcapturedAt: number,\n): UsageReport {\n\tconst snapshots = asObject(payload.quota_snapshots);\n\tconst premium = asObject(snapshots?.premium_interactions);\n\tconst metrics: UsageReport[\"metrics\"] = [];\n\tlet semanticsLabel: string;\n\tlet bucket: UsageBucket;\n\n\tif (premium) {\n\t\tconst tokenBasedBilling = premium.token_based_billing === true;\n\t\tconst id = tokenBasedBilling ? \"ai-credits\" : \"premium-requests\";\n\t\tconst label = tokenBasedBilling ? \"AI credits\" : \"Premium requests\";\n\t\tsemanticsLabel = tokenBasedBilling\n\t\t\t? \"GitHub Copilot AI Credits allowance\"\n\t\t\t: \"GitHub Copilot premium request quota\";\n\n\t\tif (premium.unlimited === true) {\n\t\t\tbucket = { id, label, unit: \"count\" };\n\t\t} else {\n\t\t\tconst entitlement = asNonnegativeNumber(premium.entitlement);\n\t\t\tconst rawRemaining =\n\t\t\t\tasFiniteNumber(premium.remaining) ?? asFiniteNumber(premium.quota_remaining);\n\t\t\tif (entitlement === undefined || rawRemaining === undefined) {\n\t\t\t\tthrow new Error(`GitHub Copilot ${label.toLowerCase()} quota was incomplete.`);\n\t\t\t}\n\t\t\tconst overageUsed = Math.max(\n\t\t\t\tasNonnegativeNumber(premium.overage_count) ?? 0,\n\t\t\t\tMath.max(0, -rawRemaining),\n\t\t\t);\n\t\t\tif (overageUsed > 0) {\n\t\t\t\tmetrics.push({\n\t\t\t\t\tid: \"overage-used\",\n\t\t\t\t\tlabel: \"Additional usage\",\n\t\t\t\t\tvalue: overageUsed,\n\t\t\t\t\tunit: \"count\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tbucket = {\n\t\t\t\tid,\n\t\t\t\tlabel,\n\t\t\t\tused: asNonnegativeNumber(premium.credits_used) ?? Math.max(0, entitlement - rawRemaining),\n\t\t\t\tremaining: Math.max(0, rawRemaining),\n\t\t\t\tlimit: entitlement,\n\t\t\t\tunit: \"count\",\n\t\t\t\tperiod: \"monthly\",\n\t\t\t\t...resetTimestamp(payload),\n\t\t\t};\n\t\t}\n\t} else {\n\t\tconst limited = asObject(payload.limited_user_quotas);\n\t\tconst monthly = asObject(payload.monthly_quotas);\n\t\tconst remaining = asNonnegativeNumber(limited?.chat);\n\t\tconst entitlement = asNonnegativeNumber(monthly?.chat);\n\t\tif (remaining === undefined || entitlement === undefined) {\n\t\t\tthrow new Error(\"GitHub Copilot usage response contained no supported quota.\");\n\t\t}\n\t\tsemanticsLabel = \"GitHub Copilot Free chat quota\";\n\t\tbucket = {\n\t\t\tid: \"chat-requests\",\n\t\t\tlabel: \"Chat requests\",\n\t\t\tused: Math.max(0, entitlement - remaining),\n\t\t\tremaining,\n\t\t\tlimit: entitlement,\n\t\t\tunit: \"count\",\n\t\t\tperiod: \"monthly\",\n\t\t\t...resetTimestamp(payload),\n\t\t};\n\t}\n\n\tconst notes: string[] = [];\n\tconst plan = asString(payload.copilot_plan) ?? asString(payload.access_type_sku);\n\tif (plan) notes.push(`Plan: ${plan}`);\n\n\treturn {\n\t\tproviderId: \"github-copilot\",\n\t\tproviderName: \"GitHub Copilot\",\n\t\tcapturedAt,\n\t\tsource: \"github-copilot-user\",\n\t\tsemantics: { kind: \"consumer-subscription\", label: semanticsLabel },\n\t\taccountLabel: asString(payload.login),\n\t\tbuckets: [bucket],\n\t\tmetrics,\n\t\t...(notes.length > 0 ? { notes } : {}),\n\t};\n}\n\nfunction resetTimestamp(payload: GitHubCopilotUsagePayload): { resetsAt?: number } {\n\tconst raw =\n\t\tasString(payload.quota_reset_date_utc) ??\n\t\tasString(payload.quota_reset_date) ??\n\t\tasString(payload.limited_user_reset_date);\n\tif (!raw) return {};\n\tconst milliseconds = Date.parse(raw);\n\treturn Number.isNaN(milliseconds) ? {} : { resetsAt: Math.floor(milliseconds / 1000) };\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\treturn value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\treturn sanitizeDisplayText(value, 80) || undefined;\n}\n\nfunction asFiniteNumber(value: unknown): number | undefined {\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) return undefined;\n\treturn value;\n}\n\nfunction asNonnegativeNumber(value: unknown): number | undefined {\n\tconst number = asFiniteNumber(value);\n\treturn number === undefined || number < 0 ? undefined : number;\n}\n", "import { sanitizeDisplayText } from \"../core.js\";\nimport type { OpenCodeZenPayload, UsageBucket, UsageReport } from \"../types.js\";\n\nconst ZEN_WINDOWS = [\n\t{ key: \"rolling\", label: \"Rolling\" },\n\t{ key: \"weekly\", label: \"Weekly\" },\n\t{ key: \"monthly\", label: \"Monthly\" },\n] as const;\n\nexport function normalizeOpenCodeZenPayload(\n\tpayload: OpenCodeZenPayload,\n\tcapturedAt: number,\n): UsageReport {\n\tconst usage = asObject(payload.usage);\n\tif (!usage) throw new Error(\"OpenCode Zen usage response was not an object.\");\n\n\tconst buckets: UsageBucket[] = [];\n\tconst notes: string[] = [];\n\tfor (const window of ZEN_WINDOWS) {\n\t\tconst raw = asObject(usage[window.key]);\n\t\tif (!raw) continue;\n\t\tconst status = asString(raw.status);\n\t\tif (status !== \"ok\" && status !== \"rate-limited\") {\n\t\t\tnotes.push(`${window.label} window unavailable (${status ?? \"unknown status\"}).`);\n\t\t\tcontinue;\n\t\t}\n\t\tconst used = asNonnegativeNumber(raw.percent);\n\t\tif (used === undefined) continue;\n\t\tconst resetsAt = asEpochSeconds(raw.resetsAt);\n\t\tbuckets.push({\n\t\t\tid: window.key,\n\t\t\tlabel: `${window.label} window`,\n\t\t\tused,\n\t\t\tremaining: 100 - clampPercent(used),\n\t\t\tlimit: 100,\n\t\t\tunit: \"percent\",\n\t\t\t...(resetsAt !== undefined ? { resetsAt } : {}),\n\t\t});\n\t}\n\tif (buckets.length === 0) {\n\t\tthrow new Error(\"OpenCode Zen usage endpoint returned no displayable usage data.\");\n\t}\n\n\treturn {\n\t\tproviderId: \"opencode-go\",\n\t\tproviderName: \"OpenCode Go\",\n\t\tcapturedAt,\n\t\tsource: \"opencode-zen-usage\",\n\t\tsemantics: {\n\t\t\tkind: \"consumer-subscription\",\n\t\t\tlabel: \"OpenCode Zen plan usage\",\n\t\t},\n\t\tbuckets,\n\t\tmetrics: [],\n\t\t...(notes.length > 0 ? { notes } : {}),\n\t};\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\treturn value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\treturn sanitizeDisplayText(value, 80) || undefined;\n}\n\nfunction asNonnegativeNumber(value: unknown): number | undefined {\n\tif (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) return undefined;\n\treturn value;\n}\n\nfunction asEpochSeconds(value: unknown): number | undefined {\n\tif (typeof value !== \"string\" || !value.trim()) return undefined;\n\tconst parsed = Date.parse(value);\n\tif (Number.isNaN(parsed)) return undefined;\n\treturn Math.floor(parsed / 1000);\n}\n\nfunction clampPercent(value: number): number {\n\treturn Math.min(100, Math.max(0, value));\n}\n", "import { sanitizeDisplayText } from \"../core.js\";\nimport type { OpenRouterKeyPayload, UsageBucket, UsageMetric, UsageReport } from \"../types.js\";\n\nexport function normalizeOpenRouterKeyPayload(\n\tpayload: OpenRouterKeyPayload,\n\tcapturedAt: number,\n): UsageReport {\n\tconst data = asObject(payload.data);\n\tif (!data) throw new Error(\"OpenRouter key response data was not an object.\");\n\n\tconst limit = asNonnegativeNumber(data.limit);\n\tconst remaining = asNonnegativeNumber(data.limit_remaining);\n\tconst period = asString(data.limit_reset);\n\tconst totalUsage = asNonnegativeNumber(data.usage);\n\tconst buckets: UsageBucket[] = [];\n\tif (limit !== undefined) {\n\t\tbuckets.push({\n\t\t\tid: \"key-limit\",\n\t\t\tlabel: \"Key limit\",\n\t\t\t...(remaining !== undefined ? { used: Math.max(0, limit - remaining), remaining } : {}),\n\t\t\tlimit,\n\t\t\tunit: \"usd\",\n\t\t\t...(period ? { period } : {}),\n\t\t});\n\t}\n\n\tconst metrics: UsageMetric[] = [];\n\taddUsageMetric(metrics, \"usage-daily\", \"Usage today\", data.usage_daily);\n\taddUsageMetric(metrics, \"usage-weekly\", \"Usage this week\", data.usage_weekly);\n\taddUsageMetric(metrics, \"usage-monthly\", \"Usage this month\", data.usage_monthly);\n\taddUsageMetric(metrics, \"usage-total\", \"All-time usage\", totalUsage);\n\tif (buckets.length === 0 && metrics.length === 0) {\n\t\tthrow new Error(\"OpenRouter key response returned no displayable usage data.\");\n\t}\n\n\tconst notes: string[] = [];\n\tif (data.limit === null) notes.push(\"No per-key spend cap\");\n\telse if (limit === undefined) notes.push(\"Per-key spend cap unavailable\");\n\tif (data.is_free_tier === true) notes.push(\"Free-tier API key\");\n\n\treturn {\n\t\tproviderId: \"openrouter\",\n\t\tproviderName: \"OpenRouter\",\n\t\tcapturedAt,\n\t\tsource: \"openrouter-key\",\n\t\tsemantics: { kind: \"api-key\", label: \"API-key spend limits\" },\n\t\taccountLabel: asString(data.label),\n\t\tbuckets,\n\t\tmetrics,\n\t\t...(notes.length > 0 ? { notes } : {}),\n\t};\n}\n\nfunction addUsageMetric(metrics: UsageMetric[], id: string, label: string, value: unknown): void {\n\tconst amount = typeof value === \"number\" ? asNonnegativeNumber(value) : undefined;\n\tif (amount === undefined) return;\n\tmetrics.push({ id, label, value: amount, unit: \"usd\" });\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\treturn value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\treturn sanitizeDisplayText(value, 80) || undefined;\n}\n\nfunction asNonnegativeNumber(value: unknown): number | undefined {\n\tif (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) return undefined;\n\treturn value;\n}\n", "import type {\n\tProviderUsageState,\n\tUsageBucket,\n\tUsageDisplayState,\n\tUsageModel,\n\tUsageReport,\n} from \"./types.js\";\n\nconst BAR_SEGMENTS = 20;\nconst VALUE_COLUMN = 29;\n\nexport function formatUsageReport(report: UsageReport, displayState: UsageDisplayState): string {\n\tconst stateLabel = displayState === \"current\" ? \"Current\" : \"Configured\";\n\tconst lines = [`${report.providerName} Usage \u00B7 ${stateLabel}`];\n\tif (report.accountLabel) lines.push(`Account: ${report.accountLabel}`);\n\tlines.push(`Semantics: ${report.semantics.label}`, \"\");\n\n\tif (report.providerId === \"openai-codex\") formatCodexReport(lines, report);\n\telse if (report.providerId === \"github-copilot\") formatGitHubCopilotReport(lines, report);\n\telse if (report.providerId === \"openrouter\") formatOpenRouterReport(lines, report);\n\telse if (report.providerId === \"opencode-go\") formatOpenCodeZenReport(lines, report);\n\telse formatGenericReport(lines, report);\n\n\tif (report.notes) {\n\t\tfor (const note of report.notes) lines.push(note);\n\t}\n\treturn lines.join(\"\\n\").trimEnd();\n}\n\nexport function formatUsageStatusline(report: UsageReport, model?: UsageModel): string | undefined {\n\tif (report.providerId === \"openai-codex\") return formatCodexStatusline(report, model);\n\tif (report.providerId === \"github-copilot\") return formatGitHubCopilotStatusline(report);\n\tif (report.providerId === \"openrouter\") {\n\t\tconst limit = report.buckets.find((bucket) => bucket.id === \"key-limit\");\n\t\tif (limit?.remaining !== undefined) return `openrouter ${formatUsd(limit.remaining)} left`;\n\t\tconst total = report.metrics.find((metric) => metric.id === \"usage-total\");\n\t\tif (typeof total?.value === \"number\") return `openrouter ${formatUsd(total.value)} used`;\n\t}\n\tif (report.providerId === \"opencode-go\") return formatOpenCodeZenStatusline(report);\n\treturn undefined;\n}\n\nexport function formatProviderStates(states: readonly ProviderUsageState[]): string {\n\treturn states\n\t\t.map((state) => {\n\t\t\tif (state.status === \"ready\") return formatUsageReport(state.report, state.displayState);\n\t\t\tconst label = state.displayState === \"current\" ? \"Current\" : \"Configured\";\n\t\t\tconst status =\n\t\t\t\tstate.status === \"auth-unavailable\"\n\t\t\t\t\t? \"Authentication unavailable\"\n\t\t\t\t\t: state.status === \"unsupported\"\n\t\t\t\t\t\t? \"Unsupported\"\n\t\t\t\t\t\t: \"Query failed\";\n\t\t\treturn `${state.providerName} \u00B7 ${label}\\n${status}: ${state.message}`;\n\t\t})\n\t\t.join(\"\\n\\n\");\n}\n\nfunction formatCodexReport(lines: string[], report: UsageReport): void {\n\tlet previousGroup: string | undefined;\n\tfor (const bucket of report.buckets) {\n\t\tconst group = bucket.groupId ?? bucket.id;\n\t\tif (group !== previousGroup && group !== \"codex\") {\n\t\t\tlines.push(`${bucket.groupLabel ?? group} limit:`);\n\t\t}\n\t\tpreviousGroup = group;\n\t\tconst fallback = bucket.id.endsWith(\":secondary\") ? \"weekly\" : \"5h\";\n\t\tconst label = `${formatWindowLabel(bucket.windowMinutes, fallback, false)} limit:`;\n\t\tlines.push(`${label.padEnd(VALUE_COLUMN)}${formatPercentBucket(bucket)}`);\n\t}\n\tfor (const metric of report.metrics) {\n\t\tif (metric.id === \"reset-credits\") {\n\t\t\tlines.push(`${\"Usage limit resets:\".padEnd(VALUE_COLUMN)}${metric.value} available`);\n\t\t} else if (metric.id === \"credits\") {\n\t\t\tlines.push(\n\t\t\t\t`${\"Credits:\".padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\nfunction formatGitHubCopilotReport(lines: string[], report: UsageReport): void {\n\tconst quota = findGitHubCopilotQuota(report);\n\tif (!quota || quota.limit === undefined || quota.remaining === undefined) {\n\t\tlines.push(`${`${quota?.label ?? \"Copilot quota\"}:`.padEnd(VALUE_COLUMN)}unlimited`);\n\t\treturn;\n\t}\n\tconst percent = percentRemaining(quota);\n\tconst reset = quota.resetsAt ? ` (resets ${formatReset(quota.resetsAt)})` : \"\";\n\tlines.push(\n\t\t`${`${quota.label}:`.padEnd(VALUE_COLUMN)}${quota.remaining} of ${quota.limit} left \u00B7 ${percent}%${reset}`,\n\t);\n\tconst overage = report.metrics.find((metric) => metric.id === \"overage-used\");\n\tif (typeof overage?.value === \"number\" && overage.value > 0) {\n\t\tlines.push(`${\"Additional usage:\".padEnd(VALUE_COLUMN)}${overage.value} ${quota.label}`);\n\t}\n}\n\nfunction formatGitHubCopilotStatusline(report: UsageReport): string {\n\tconst quota = findGitHubCopilotQuota(report);\n\tconst kind = compactGitHubCopilotQuotaKind(quota);\n\tif (!quota || quota.limit === undefined || quota.remaining === undefined) {\n\t\treturn `copilot ${kind} unlimited`;\n\t}\n\tconst overage = report.metrics.find((metric) => metric.id === \"overage-used\");\n\tconst overageSuffix =\n\t\ttypeof overage?.value === \"number\" && overage.value > 0 ? ` +${overage.value} over` : \"\";\n\treturn `copilot ${kind === \"premium\" ? \"\" : `${kind} `}${quota.remaining}/${quota.limit} ${percentRemaining(quota)}%${overageSuffix}`;\n}\n\nfunction findGitHubCopilotQuota(report: UsageReport): UsageBucket | undefined {\n\treturn report.buckets.find((bucket) =>\n\t\t[\"ai-credits\", \"premium-requests\", \"chat-requests\"].includes(bucket.id),\n\t);\n}\n\nfunction compactGitHubCopilotQuotaKind(bucket: UsageBucket | undefined): string {\n\tif (bucket?.id === \"ai-credits\") return \"credits\";\n\tif (bucket?.id === \"chat-requests\") return \"chat\";\n\treturn \"premium\";\n}\n\nfunction percentRemaining(bucket: UsageBucket): number {\n\tif (!bucket.limit || bucket.remaining === undefined) return 0;\n\treturn Math.round(clampPercent((bucket.remaining / bucket.limit) * 100));\n}\n\nfunction formatOpenRouterReport(lines: string[], report: UsageReport): void {\n\tconst limit = report.buckets.find((bucket) => bucket.id === \"key-limit\");\n\tif (limit) {\n\t\tconst period = limit.period ? ` (${limit.period})` : \"\";\n\t\tconst value =\n\t\t\tlimit.remaining === undefined\n\t\t\t\t? `${formatUsd(limit.limit ?? 0)} cap; remaining unavailable`\n\t\t\t\t: `${formatUsd(limit.remaining)} of ${formatUsd(limit.limit ?? 0)} left`;\n\t\tlines.push(`${`Key limit${period}:`.padEnd(VALUE_COLUMN)}${value}`);\n\t}\n\tfor (const metric of report.metrics) {\n\t\tlines.push(\n\t\t\t`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`,\n\t\t);\n\t}\n}\n\nfunction formatOpenCodeZenReport(lines: string[], report: UsageReport): void {\n\tfor (const bucket of report.buckets) {\n\t\tconst reset = bucket.resetsAt ? ` (resets ${formatReset(bucket.resetsAt)})` : \"\";\n\t\tconst used = bucket.used ?? \"unavailable\";\n\t\tlines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${used}% used${reset}`);\n\t}\n}\n\nfunction formatOpenCodeZenStatusline(report: UsageReport): string | undefined {\n\tconst parts = [\"zen\"];\n\tfor (const bucket of report.buckets) {\n\t\tif (bucket.used === undefined) continue;\n\t\tconst compact = bucket.id === \"rolling\" ? \"r\" : bucket.id === \"weekly\" ? \"w\" : \"m\";\n\t\tparts.push(`${clampPercent(bucket.used).toFixed(0)}% ${compact}`);\n\t}\n\treturn parts.length > 1 ? parts.join(\" \") : undefined;\n}\n\nfunction formatGenericReport(lines: string[], report: UsageReport): void {\n\tfor (const bucket of report.buckets) {\n\t\tlines.push(\n\t\t\t`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(bucket.remaining ?? bucket.used ?? \"unavailable\", bucket.unit)}`,\n\t\t);\n\t}\n\tfor (const metric of report.metrics) {\n\t\tlines.push(\n\t\t\t`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`,\n\t\t);\n\t}\n}\n\nfunction formatCodexStatusline(report: UsageReport, model?: UsageModel): string | undefined {\n\tconst group = selectCodexGroup(report, model);\n\tif (!group) return formatCodexCreditsStatus(report);\n\tconst buckets = report.buckets.filter((bucket) => (bucket.groupId ?? bucket.id) === group);\n\tconst labelBucket = buckets[0];\n\tconst parts = [\n\t\tgroup === \"codex\" ? \"codex\" : `codex ${compactLimitLabel(labelBucket?.groupLabel ?? group)}`,\n\t];\n\tfor (const bucket of buckets) {\n\t\tif (bucket.remaining === undefined) continue;\n\t\tconst fallback = bucket.id.endsWith(\":secondary\") ? \"weekly\" : \"5h\";\n\t\tparts.push(\n\t\t\t`${clampPercent(bucket.remaining).toFixed(0)}% ${formatWindowLabel(bucket.windowMinutes, fallback, true)}`,\n\t\t);\n\t}\n\treturn parts.length > 1 ? parts.join(\" \") : formatCodexCreditsStatus(report);\n}\n\nfunction formatCodexCreditsStatus(report: UsageReport): string {\n\tconst credits = report.metrics.find((metric) => metric.id === \"credits\");\n\tif (!credits) return \"codex usage unavailable\";\n\tif (credits.value === \"none\") return \"codex no credits\";\n\tif (credits.value === \"available\") return \"codex credits available\";\n\tif (credits.value === \"unlimited\") return \"codex credits unlimited\";\n\treturn `codex ${formatMetricValue(credits.value, \"count\")} credits`;\n}\n\nfunction selectCodexGroup(report: UsageReport, model?: UsageModel): string | undefined {\n\tconst groups = [...new Set(report.buckets.map((bucket) => bucket.groupId ?? bucket.id))];\n\tif (model?.provider !== \"openai-codex\") {\n\t\treturn groups.includes(\"codex\") ? \"codex\" : groups[0];\n\t}\n\tconst modelKeys = normalizedModelKeys(model);\n\tfor (const group of groups) {\n\t\tconst bucket = report.buckets.find(\n\t\t\t(candidate) => (candidate.groupId ?? candidate.id) === group,\n\t\t);\n\t\tconst keys = [group, bucket?.groupLabel, ...(bucket?.modelKeys ?? [])]\n\t\t\t.map(normalizeKey)\n\t\t\t.filter((key): key is string => key !== undefined);\n\t\tif (keys.some((key) => modelKeys.has(key))) return group;\n\t}\n\tconst variants = [...modelKeys]\n\t\t.map((key) => key.match(/(?:^|-)codex-(.+)$/)?.[1])\n\t\t.filter((value): value is string => Boolean(value));\n\tfor (const variant of variants) {\n\t\tconst matches = groups.filter((group) => {\n\t\t\tif (group === \"codex\") return false;\n\t\t\tconst key = normalizeKey(group);\n\t\t\treturn key ? normalizedKeyHasToken(key, variant) : false;\n\t\t});\n\t\tif (matches.length === 1) return matches[0];\n\t}\n\treturn groups.includes(\"codex\") ? \"codex\" : groups[0];\n}\n\nfunction normalizedModelKeys(model: UsageModel): Set<string> {\n\tconst keys = new Set<string>();\n\tfor (const value of [model.id, model.name]) {\n\t\tconst key = normalizeKey(value);\n\t\tif (!key) continue;\n\t\tkeys.add(key);\n\t\tconst index = key.indexOf(\"codex\");\n\t\tif (index >= 0) keys.add(key.slice(index));\n\t}\n\treturn keys;\n}\n\nfunction normalizeKey(value: string | undefined): string | undefined {\n\tconst separated = value?.toLowerCase().replace(/[^a-z0-9]+/g, \"-\");\n\tif (!separated) return undefined;\n\tlet start = 0;\n\tlet end = separated.length;\n\twhile (separated[start] === \"-\") start += 1;\n\twhile (end > start && separated[end - 1] === \"-\") end -= 1;\n\treturn separated.slice(start, end) || undefined;\n}\n\nfunction normalizedKeyHasToken(key: string, token: string): boolean {\n\treturn (\n\t\tkey === token ||\n\t\tkey.startsWith(`${token}-`) ||\n\t\tkey.endsWith(`-${token}`) ||\n\t\tkey.includes(`-${token}-`)\n\t);\n}\n\nfunction compactLimitLabel(label: string): string {\n\tconst normalized = label.replace(/[_-]+/g, \" \").trim();\n\tconst codex = /\\bcodex\\s/iu.exec(normalized);\n\tconst suffix = codex ? normalized.slice(codex.index + codex[0].length).trim() : \"\";\n\treturn (suffix || normalized).toLowerCase().replace(/\\s+/g, \" \");\n}\n\nfunction formatPercentBucket(bucket: UsageBucket): string {\n\tconst remaining = clampPercent(bucket.remaining ?? 0);\n\tconst filled = Math.round((remaining / 100) * BAR_SEGMENTS);\n\tconst reset = bucket.resetsAt ? ` (resets ${formatReset(bucket.resetsAt)})` : \"\";\n\treturn `[${\"\u2588\".repeat(filled)}${\"\u2591\".repeat(BAR_SEGMENTS - filled)}] ${remaining.toFixed(0)}% left${reset}`;\n}\n\nfunction formatWindowLabel(\n\tminutes: number | undefined,\n\tfallback: \"5h\" | \"weekly\",\n\tcompact: boolean,\n): string {\n\tif (!minutes || !Number.isFinite(minutes) || minutes <= 0) {\n\t\treturn compact && fallback === \"weekly\" ? \"wk\" : capitalize(fallback);\n\t}\n\tif (minutes === 10_080) return compact ? \"wk\" : \"Weekly\";\n\tif (minutes % 10_080 === 0) return `${minutes / 10_080}w`;\n\tif (minutes % 1_440 === 0) return `${minutes / 1_440}d`;\n\tif (minutes % 60 === 0) return `${minutes / 60}h`;\n\treturn `${minutes}m`;\n}\n\nfunction formatMetricValue(value: number | string, unit: UsageBucket[\"unit\"] | undefined): string {\n\tif (unit === \"usd\" && typeof value === \"number\") return formatUsd(value);\n\treturn String(value);\n}\n\nfunction formatUsd(value: number): string {\n\treturn `$${value.toFixed(2)}`;\n}\n\nfunction formatReset(epochSeconds: number): string {\n\tconst reset = new Date(epochSeconds * 1000);\n\tif (Number.isNaN(reset.getTime())) return \"at an unknown time\";\n\tconst time = `${reset.getHours().toString().padStart(2, \"0\")}:${reset\n\t\t.getMinutes()\n\t\t.toString()\n\t\t.padStart(2, \"0\")}`;\n\tconst now = new Date();\n\tif (reset.toDateString() === now.toDateString()) return time;\n\treturn `${time} on ${reset.getDate()} ${reset.toLocaleDateString(undefined, { month: \"short\" })}`;\n}\n\nfunction capitalize(value: string): string {\n\treturn `${value[0]?.toUpperCase() ?? \"\"}${value.slice(1)}`;\n}\n\nfunction clampPercent(value: number): number {\n\treturn Math.min(100, Math.max(0, value));\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { constants } from \"node:fs\";\nimport { chmod, mkdir, open, rename, rm, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, join } from \"node:path\";\nimport { getAgentDir } from \"@earendil-works/pi-coding-agent\";\n\nexport const USAGE_SETTINGS_FILE = \"pi-usage.json\";\nexport const MAX_USAGE_SETTINGS_BYTES = 64 * 1024;\n\nexport interface UsageSettings {\n\tcodexFastMode: boolean;\n}\n\nexport const DEFAULT_USAGE_SETTINGS: Readonly<UsageSettings> = Object.freeze({\n\tcodexFastMode: false,\n});\n\nexport interface UsageSettingsState {\n\tkind: \"missing\" | \"loaded\" | \"invalid\";\n\tpath: string;\n\tsettings: UsageSettings;\n\tdocument?: Record<string, unknown>;\n\tissue?: string;\n}\n\nexport interface UsageSettingsRuntime {\n\tget(): Readonly<UsageSettingsState>;\n\treload(signal?: AbortSignal): Promise<Readonly<UsageSettingsState>>;\n\tupdate(\n\t\tpatch: Partial<UsageSettings>,\n\t\tsignal?: AbortSignal,\n\t): Promise<Readonly<UsageSettingsState>>;\n\tflush(): Promise<void>;\n}\n\ninterface UsageSettingsFileOperations {\n\trename: typeof rename;\n\twriteFile: typeof writeFile;\n}\n\ninterface UsageSettingsRuntimeOptions {\n\toperations?: Partial<UsageSettingsFileOperations>;\n\tpath?: string;\n}\n\nexport function usageSettingsPath(): string {\n\treturn join(getAgentDir(), USAGE_SETTINGS_FILE);\n}\n\nexport function normalizeUsageSettings(value: unknown): UsageSettings | undefined {\n\tif (!isRecord(value)) return undefined;\n\tif (Object.hasOwn(value, \"codexFastMode\") && typeof value.codexFastMode !== \"boolean\") {\n\t\treturn undefined;\n\t}\n\treturn {\n\t\tcodexFastMode:\n\t\t\ttypeof value.codexFastMode === \"boolean\"\n\t\t\t\t? value.codexFastMode\n\t\t\t\t: DEFAULT_USAGE_SETTINGS.codexFastMode,\n\t};\n}\n\nexport async function loadUsageSettings(\n\tpath = usageSettingsPath(),\n\tsignal?: AbortSignal,\n): Promise<UsageSettingsState> {\n\tthrowIfAborted(signal);\n\ttry {\n\t\tconst handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);\n\t\tlet text: string;\n\t\ttry {\n\t\t\tconst stats = await handle.stat();\n\t\t\tthrowIfAborted(signal);\n\t\t\tif (!stats.isFile()) throw new Error(\"settings path is not a regular file\");\n\t\t\tif (stats.size > MAX_USAGE_SETTINGS_BYTES) {\n\t\t\t\tthrow new Error(\"settings file exceeds 64 KiB\");\n\t\t\t}\n\t\t\ttext = await handle.readFile(\"utf8\");\n\t\t} finally {\n\t\t\tawait handle.close();\n\t\t}\n\t\tthrowIfAborted(signal);\n\t\tconst document = JSON.parse(text) as unknown;\n\t\tconst settings = normalizeUsageSettings(document);\n\t\tif (!settings || !isRecord(document)) throw new Error(\"invalid settings shape\");\n\t\treturn { kind: \"loaded\", path, settings, document };\n\t} catch (error) {\n\t\tif (signal?.aborted) throw error;\n\t\tif (isNodeError(error) && error.code === \"ENOENT\") {\n\t\t\treturn {\n\t\t\t\tkind: \"missing\",\n\t\t\t\tpath,\n\t\t\t\tsettings: { ...DEFAULT_USAGE_SETTINGS },\n\t\t\t\tdocument: {},\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tkind: \"invalid\",\n\t\t\tpath,\n\t\t\tsettings: { ...DEFAULT_USAGE_SETTINGS },\n\t\t\tissue:\n\t\t\t\tisNodeError(error) && error.code === \"ELOOP\"\n\t\t\t\t\t? \"symbolic links are not accepted\"\n\t\t\t\t\t: error instanceof Error\n\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t: String(error),\n\t\t};\n\t}\n}\n\nexport function createUsageSettingsRuntime(\n\toptions: UsageSettingsRuntimeOptions | string = {},\n): UsageSettingsRuntime {\n\tconst path = typeof options === \"string\" ? options : (options.path ?? usageSettingsPath());\n\tconst operations: UsageSettingsFileOperations = {\n\t\trename,\n\t\twriteFile,\n\t\t...(typeof options === \"string\" ? undefined : options.operations),\n\t};\n\tlet state: UsageSettingsState = {\n\t\tkind: \"missing\",\n\t\tpath,\n\t\tsettings: { ...DEFAULT_USAGE_SETTINGS },\n\t\tdocument: {},\n\t};\n\tlet queue = Promise.resolve();\n\tconst enqueue = <T>(operation: () => Promise<T>): Promise<T> => {\n\t\tconst result = queue.then(operation, operation);\n\t\tqueue = result.then(\n\t\t\t() => undefined,\n\t\t\t() => undefined,\n\t\t);\n\t\treturn result;\n\t};\n\treturn {\n\t\tget: () => structuredClone(state),\n\t\treload: (signal) =>\n\t\t\tenqueue(async () => {\n\t\t\t\tconst loaded = await loadUsageSettings(path, signal);\n\t\t\t\tstate = loaded;\n\t\t\t\treturn structuredClone(state);\n\t\t\t}),\n\t\tupdate: (patch, signal) =>\n\t\t\tenqueue(async () => {\n\t\t\t\tconst saved = await saveUsageSettingsPatch(path, patch, operations, signal);\n\t\t\t\tstate = saved;\n\t\t\t\treturn structuredClone(state);\n\t\t\t}),\n\t\tflush: () => queue,\n\t};\n}\n\nasync function saveUsageSettingsPatch(\n\tpath: string,\n\tpatch: Partial<UsageSettings>,\n\toperations: UsageSettingsFileOperations,\n\tsignal?: AbortSignal,\n): Promise<UsageSettingsState> {\n\tconst latest = await loadUsageSettings(path, signal);\n\tif (latest.kind === \"invalid\") {\n\t\tthrow new Error(\"Cannot overwrite an invalid pi-usage.json; repair it and reload first\");\n\t}\n\tconst document = { ...latest.document, ...patch };\n\tconst settings = normalizeUsageSettings(document);\n\tif (!settings) throw new Error(\"Refusing to save invalid pi-usage settings\");\n\tconst directory = dirname(path);\n\tconst temporaryPath = join(directory, `.${basename(path)}.${randomUUID()}.tmp`);\n\tawait mkdir(directory, { recursive: true, mode: 0o700 });\n\tthrowIfAborted(signal);\n\ttry {\n\t\tawait operations.writeFile(temporaryPath, `${JSON.stringify(document, null, 2)}\\n`, {\n\t\t\tencoding: \"utf8\",\n\t\t\tflag: \"wx\",\n\t\t\tmode: 0o600,\n\t\t});\n\t\tif (process.platform !== \"win32\") await chmodPrivate(temporaryPath);\n\t\tthrowIfAborted(signal);\n\t\tconst current = await loadUsageSettings(path, signal);\n\t\tif (\n\t\t\tcurrent.kind === \"invalid\" ||\n\t\t\tcurrent.kind !== latest.kind ||\n\t\t\tJSON.stringify(current.document) !== JSON.stringify(latest.document)\n\t\t) {\n\t\t\tthrow new Error(\"pi-usage.json changed while saving; retry the action\");\n\t\t}\n\t\tthrowIfAborted(signal);\n\t\tawait operations.rename(temporaryPath, path);\n\t} finally {\n\t\tawait rm(temporaryPath, { force: true }).catch(() => undefined);\n\t}\n\treturn { kind: \"loaded\", path, settings, document };\n}\n\nasync function chmodPrivate(path: string): Promise<void> {\n\tawait chmod(path, 0o600);\n}\n\nfunction throwIfAborted(signal?: AbortSignal): void {\n\tif (signal?.aborted) throw new DOMException(\"Settings operation aborted\", \"AbortError\");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n\treturn error instanceof Error && \"code\" in error;\n}\n", "import { randomUUID } from \"node:crypto\";\nimport type {\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionContext,\n} from \"@earendil-works/pi-coding-agent\";\nimport { FAST_USAGE_WARNING, registerCodexFastMode } from \"./codex-fast-runtime.js\";\nimport {\n\ttype CodexResetAvailability,\n\ttype CodexResetOption,\n\ttype CodexResetOutcome,\n\tcodexResetActionDescription,\n\tcodexResetCount,\n\tconsumeCodexResetCredit,\n\tformatCodexResetOutcome,\n\tgenericCodexResetOption,\n\tlistCodexResetCredits,\n\tresetConfirmationLines,\n\tresetLabel,\n\tresetOptionExpiration,\n\tresolveCodexResetAuth,\n} from \"./codex-resets.js\";\nimport { awaitWithDeadline, errorMessage, runWithConcurrency, UsageCache } from \"./core.js\";\nimport { formatProviderStates, formatUsageStatusline } from \"./format.js\";\nimport { createOAuthCredentialCandidateReader } from \"./oauth-credential-source.js\";\nimport {\n\tadapterForProvider,\n\tisStaleExtensionContextError,\n\tqueryProviderUsage,\n\tresolveUsageAuth,\n} from \"./query.js\";\nimport { createUsageSettingsRuntime, type UsageSettingsRuntime } from \"./settings.js\";\nimport type {\n\tPiModel,\n\tProviderUsageState,\n\tResolvedUsageAuth,\n\tUsageDisplayState,\n\tUsageProviderAdapter,\n} from \"./types.js\";\nimport {\n\tconfiguredAdapters,\n\tisAbortError,\n\tisTimeoutError,\n\tmodelIdentity,\n\tproviderDisplayName,\n\tsetBoundedMap,\n} from \"./usage-helpers.js\";\n\nconst CACHE_TTL_MS = 5 * 60 * 1000;\nconst DEFAULT_TIMEOUT_MS = 15_000;\nconst ALL_PROVIDER_CONCURRENCY = 2;\nconst FAILURE_BACKOFF_MS = 30_000;\nconst MAX_ACCOUNT_STATES = 32;\nconst STATUS_KEY = \"usage\";\n\nconst REFRESH_CURRENT = \"Refresh current usage\";\nconst VIEW_ANOTHER = \"View another configured provider\u2026\";\nconst VIEW_ALL = \"View all configured providers\u2026\";\nconst CLOSE = \"Close\";\nconst REDEEM_CODEX_RESET = \"Redeem usage limit reset\u2026\";\n\ntype UsageExtensionDependencies = {\n\tcredentialReader?: (providerId: string) => unknown;\n\tcreateRedemptionId?: () => string;\n\tsettingsRuntime?: UsageSettingsRuntime;\n};\n\ntype QueryOutcome = {\n\tstate: ProviderUsageState;\n\tfingerprint?: string;\n\tauthState?: \"unavailable\";\n};\n\ntype StableCurrent = {\n\toutcome: QueryOutcome;\n\tmodel: PiModel | undefined;\n};\n\nexport default function usageExtension(\n\tpi: ExtensionAPI,\n\tdependencies: UsageExtensionDependencies = {},\n) {\n\tconst credentialReader = dependencies.credentialReader;\n\tconst credentialCandidates = createOAuthCredentialCandidateReader(pi, credentialReader);\n\tconst createRedemptionId = dependencies.createRedemptionId ?? randomUUID;\n\tconst settingsRuntime = dependencies.settingsRuntime ?? createUsageSettingsRuntime();\n\tconst cache = new UsageCache(CACHE_TTL_MS);\n\tconst failureBackoff = new Map<string, { until: number; message: string }>();\n\tconst latestQueries = new Map<string, number>();\n\tconst activeControllers = new Set<AbortController>();\n\tlet querySequence = 0;\n\tlet activeCurrentIdentity: string | undefined;\n\tlet sessionActive = false;\n\tlet statusGeneration = 0;\n\tlet statusRefreshTimer: ReturnType<typeof setTimeout> | undefined;\n\tlet statusController: AbortController | undefined;\n\tlet fastRuntime: ReturnType<typeof registerCodexFastMode>;\n\n\tconst clearStatusTimer = () => {\n\t\tif (statusRefreshTimer) clearTimeout(statusRefreshTimer);\n\t\tstatusRefreshTimer = undefined;\n\t};\n\n\tconst safeSetStatus = (ctx: ExtensionContext, value: string | undefined): boolean => {\n\t\ttry {\n\t\t\tctx.ui.setStatus(STATUS_KEY, value);\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\tif (isStaleExtensionContextError(error)) return false;\n\t\t\tthrow error;\n\t\t}\n\t};\n\n\tconst clearStatus = (ctx: ExtensionContext) => {\n\t\tstatusGeneration += 1;\n\t\tstatusController?.abort();\n\t\tstatusController = undefined;\n\t\tclearStatusTimer();\n\t\tsafeSetStatus(ctx, undefined);\n\t};\n\n\tconst scheduleStatusRefresh = (ctx: ExtensionContext, model: PiModel) => {\n\t\tclearStatusTimer();\n\t\tconst generation = statusGeneration;\n\t\tstatusRefreshTimer = setTimeout(() => {\n\t\t\tstatusRefreshTimer = undefined;\n\t\t\tif (!sessionActive || generation !== statusGeneration) return;\n\t\t\tstartStatusRefresh(ctx, model, true);\n\t\t}, CACHE_TTL_MS);\n\t\tstatusRefreshTimer.unref?.();\n\t};\n\n\tconst publishStatus = (\n\t\tctx: ExtensionContext,\n\t\toutcome: QueryOutcome,\n\t\tmodel: PiModel,\n\t\tshouldSchedule: boolean,\n\t) => {\n\t\tif (outcome.state.status === \"unsupported\") {\n\t\t\tclearStatusTimer();\n\t\t\tsafeSetStatus(ctx, undefined);\n\t\t\treturn;\n\t\t}\n\t\tif (outcome.state.status !== \"ready\") {\n\t\t\tif (\n\t\t\t\tsafeSetStatus(\n\t\t\t\t\tctx,\n\t\t\t\t\toutcome.state.status === \"auth-unavailable\" ? \"auth unavailable\" : \"usage error\",\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tif (shouldSchedule && sessionActive) scheduleStatusRefresh(ctx, model);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tconst rawValue = formatUsageStatusline(outcome.state.report, model);\n\t\tconst value = rawValue ? fastRuntime.decorateStatus(model, rawValue) : undefined;\n\t\tif (!safeSetStatus(ctx, value)) return;\n\t\tif (shouldSchedule && sessionActive) scheduleStatusRefresh(ctx, model);\n\t};\n\n\tconst invalidateProviderState = (providerId: string) => {\n\t\tcache.clearProvider(providerId);\n\t\tfor (const key of failureBackoff.keys()) {\n\t\t\tif (key.startsWith(`${providerId}:`)) failureBackoff.delete(key);\n\t\t}\n\t\tfor (const key of latestQueries.keys()) {\n\t\t\tif (key.startsWith(`${providerId}:`)) latestQueries.delete(key);\n\t\t}\n\t};\n\n\tconst transitionCurrentIdentity = (nextIdentity: string, providerId: string) => {\n\t\tif (!activeCurrentIdentity || activeCurrentIdentity === nextIdentity) {\n\t\t\tactiveCurrentIdentity = nextIdentity;\n\t\t\treturn;\n\t\t}\n\t\tconst previousProviderId = activeCurrentIdentity.split(\":\", 1)[0] ?? \"\";\n\t\tfor (const id of new Set([previousProviderId, providerId])) {\n\t\t\tif (id) invalidateProviderState(id);\n\t\t}\n\t\tactiveCurrentIdentity = nextIdentity;\n\t};\n\n\tconst queryAdapterState = async (\n\t\tctx: ExtensionContext,\n\t\tadapter: UsageProviderAdapter,\n\t\tdisplayState: UsageDisplayState,\n\t\tforce: boolean,\n\t\tsignal: AbortSignal,\n\t): Promise<QueryOutcome> => {\n\t\tconst startedAt = Date.now();\n\t\tlet auth: ResolvedUsageAuth | undefined;\n\t\ttry {\n\t\t\tauth = await awaitWithDeadline(\n\t\t\t\tresolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n\t\t\t\tsignal,\n\t\t\t\tDEFAULT_TIMEOUT_MS,\n\t\t\t\t`resolving ${adapter.displayName} runtime auth`,\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tif (isStaleExtensionContextError(error) || isAbortError(error)) throw error;\n\t\t\tif (displayState === \"current\") {\n\t\t\t\ttransitionCurrentIdentity(`${adapter.id}:auth-error`, adapter.id);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\tproviderId: adapter.id,\n\t\t\t\t\tproviderName: adapter.displayName,\n\t\t\t\t\tdisplayState,\n\t\t\t\t\tstatus: isTimeoutError(error) ? \"query-failed\" : \"auth-unavailable\",\n\t\t\t\t\tmessage: errorMessage(error),\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tif (!auth) {\n\t\t\tif (displayState === \"current\") {\n\t\t\t\ttransitionCurrentIdentity(`${adapter.id}:unavailable`, adapter.id);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\tproviderId: adapter.id,\n\t\t\t\t\tproviderName: adapter.displayName,\n\t\t\t\t\tdisplayState,\n\t\t\t\t\tstatus: \"auth-unavailable\",\n\t\t\t\t\tmessage: `No runtime credential is configured for ${adapter.displayName}.`,\n\t\t\t\t},\n\t\t\t\tauthState: \"unavailable\",\n\t\t\t};\n\t\t}\n\t\tif (displayState === \"current\") {\n\t\t\ttransitionCurrentIdentity(`${adapter.id}:${auth.fingerprint}`, adapter.id);\n\t\t}\n\n\t\tconst cached = !force ? cache.get(adapter.id, auth.fingerprint) : undefined;\n\t\tif (cached) {\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\tproviderId: adapter.id,\n\t\t\t\t\tproviderName: adapter.displayName,\n\t\t\t\t\tdisplayState,\n\t\t\t\t\tstatus: \"ready\",\n\t\t\t\t\treport: cached,\n\t\t\t\t},\n\t\t\t\tfingerprint: auth.fingerprint,\n\t\t\t};\n\t\t}\n\n\t\tconst failureKey = `${adapter.id}:${auth.fingerprint}`;\n\t\tconst previousFailure = failureBackoff.get(failureKey);\n\t\tif (!force && previousFailure && previousFailure.until > Date.now()) {\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\tproviderId: adapter.id,\n\t\t\t\t\tproviderName: adapter.displayName,\n\t\t\t\t\tdisplayState,\n\t\t\t\t\tstatus: \"query-failed\",\n\t\t\t\t\tmessage: previousFailure.message,\n\t\t\t\t},\n\t\t\t\tfingerprint: auth.fingerprint,\n\t\t\t};\n\t\t}\n\t\tfailureBackoff.delete(failureKey);\n\t\tquerySequence += 1;\n\t\tconst queryId = querySequence;\n\t\tsetBoundedMap(latestQueries, failureKey, queryId, MAX_ACCOUNT_STATES);\n\n\t\ttry {\n\t\t\tconst remainingMs = Math.max(1, DEFAULT_TIMEOUT_MS - (Date.now() - startedAt));\n\t\t\tconst report = await queryProviderUsage(adapter, auth, signal, remainingMs);\n\t\t\tif (latestQueries.get(failureKey) === queryId) {\n\t\t\t\tcache.set(adapter.id, auth.fingerprint, report);\n\t\t\t\tfailureBackoff.delete(failureKey);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\tproviderId: adapter.id,\n\t\t\t\t\tproviderName: adapter.displayName,\n\t\t\t\t\tdisplayState,\n\t\t\t\t\tstatus: \"ready\",\n\t\t\t\t\treport,\n\t\t\t\t},\n\t\t\t\tfingerprint: auth.fingerprint,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tif (isStaleExtensionContextError(error) || isAbortError(error)) throw error;\n\t\t\tconst message = errorMessage(error);\n\t\t\tconst now = Date.now();\n\t\t\tfor (const [key, failure] of failureBackoff) {\n\t\t\t\tif (failure.until <= now) failureBackoff.delete(key);\n\t\t\t}\n\t\t\tif (latestQueries.get(failureKey) === queryId) {\n\t\t\t\tsetBoundedMap(\n\t\t\t\t\tfailureBackoff,\n\t\t\t\t\tfailureKey,\n\t\t\t\t\t{ until: now + FAILURE_BACKOFF_MS, message },\n\t\t\t\t\tMAX_ACCOUNT_STATES,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\tproviderId: adapter.id,\n\t\t\t\t\tproviderName: adapter.displayName,\n\t\t\t\t\tdisplayState,\n\t\t\t\t\tstatus: \"query-failed\",\n\t\t\t\t\tmessage,\n\t\t\t\t},\n\t\t\t\tfingerprint: auth.fingerprint,\n\t\t\t};\n\t\t}\n\t};\n\n\tconst queryCurrentState = async (\n\t\tctx: ExtensionContext,\n\t\tmodel: PiModel | undefined,\n\t\tforce: boolean,\n\t\tsignal: AbortSignal,\n\t): Promise<QueryOutcome> => {\n\t\tconst adapter = adapterForProvider(model?.provider);\n\t\tif (!adapter) {\n\t\t\tconst providerId = model?.provider ?? \"none\";\n\t\t\ttransitionCurrentIdentity(`unsupported:${providerId}`, providerId);\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\tproviderId,\n\t\t\t\t\tproviderName: providerDisplayName(ctx, providerId),\n\t\t\t\t\tdisplayState: \"current\",\n\t\t\t\t\tstatus: \"unsupported\",\n\t\t\t\t\tmessage: model\n\t\t\t\t\t\t? `Usage reporting is not supported for ${providerDisplayName(ctx, providerId)}.`\n\t\t\t\t\t\t: \"No model is selected.\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\treturn queryAdapterState(ctx, adapter, \"current\", force, signal);\n\t};\n\n\tconst refreshCurrentStatus = async (\n\t\tctx: ExtensionContext,\n\t\tmodel: PiModel | undefined,\n\t\tforce: boolean,\n\t) => {\n\t\tconst adapter = adapterForProvider(model?.provider);\n\t\tif (!adapter || !model) {\n\t\t\tconst providerId = model?.provider ?? \"none\";\n\t\t\ttransitionCurrentIdentity(`unsupported:${providerId}`, providerId);\n\t\t\tclearStatus(ctx);\n\t\t\treturn;\n\t\t}\n\t\tstatusGeneration += 1;\n\t\tconst generation = statusGeneration;\n\t\tstatusController?.abort();\n\t\tconst controller = new AbortController();\n\t\tstatusController = controller;\n\t\tactiveControllers.add(controller);\n\t\ttry {\n\t\t\tif (!safeSetStatus(ctx, \"checking\")) return;\n\t\t\tconst outcome = await queryCurrentState(ctx, model, force, controller.signal);\n\t\t\tif (!sessionActive || generation !== statusGeneration || controller.signal.aborted) return;\n\t\t\tif (!(await outcomeStillCurrent(ctx, model, generation, outcome, controller.signal))) {\n\t\t\t\tif (sessionActive && generation === statusGeneration) {\n\t\t\t\t\tqueueMicrotask(() => startStatusRefresh(ctx, ctx.model, false));\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpublishStatus(ctx, outcome, model, true);\n\t\t} finally {\n\t\t\tactiveControllers.delete(controller);\n\t\t\tif (statusController === controller) statusController = undefined;\n\t\t}\n\t};\n\n\tconst startStatusRefresh = (\n\t\tctx: ExtensionContext,\n\t\tmodel: PiModel | undefined,\n\t\tforce: boolean,\n\t) => {\n\t\tvoid refreshCurrentStatus(ctx, model, force).catch((error) => {\n\t\t\tif (isStaleExtensionContextError(error) || isAbortError(error)) return;\n\t\t\tsafeSetStatus(ctx, \"usage error\");\n\t\t});\n\t};\n\n\tconst runMenuOperation = async <T>(\n\t\tctx: ExtensionCommandContext,\n\t\tlabel: string,\n\t\tparentSignal: AbortSignal,\n\t\toperation: (signal: AbortSignal) => Promise<T>,\n\t\tcancellable = true,\n\t): Promise<T | undefined> => {\n\t\tconst { runTask } = await import(\"@narumitw/pi-tui-kit\");\n\t\tif (parentSignal.aborted) return undefined;\n\t\tconst result = await runTask(ctx, {\n\t\t\tlabel,\n\t\t\tsignal: parentSignal,\n\t\t\tcancellable,\n\t\t\tonError: () => undefined,\n\t\t\ttask: ({ signal }) => operation(signal),\n\t\t});\n\t\tswitch (result.kind) {\n\t\t\tcase \"completed\":\n\t\t\t\treturn result.value;\n\t\t\tcase \"cancelled\":\n\t\t\tcase \"stale\":\n\t\t\t\treturn undefined;\n\t\t\tcase \"error\":\n\t\t\t\tthrow result.error;\n\t\t}\n\t};\n\n\tconst outcomeStillCurrent = async (\n\t\tctx: ExtensionContext,\n\t\tmodel: PiModel | undefined,\n\t\tgeneration: number,\n\t\toutcome: QueryOutcome,\n\t\tsignal: AbortSignal,\n\t): Promise<boolean> => {\n\t\tif (generation !== statusGeneration || modelIdentity(ctx.model) !== modelIdentity(model)) {\n\t\t\treturn false;\n\t\t}\n\t\tconst adapter = adapterForProvider(model?.provider);\n\t\tif (outcome.authState === \"unavailable\") {\n\t\t\tif (!adapter) return false;\n\t\t\ttry {\n\t\t\t\tconst auth = await awaitWithDeadline(\n\t\t\t\t\tresolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n\t\t\t\t\tsignal,\n\t\t\t\t\tDEFAULT_TIMEOUT_MS,\n\t\t\t\t\t`revalidating ${adapter.displayName} runtime auth`,\n\t\t\t\t);\n\t\t\t\treturn (\n\t\t\t\t\tgeneration === statusGeneration &&\n\t\t\t\t\tmodelIdentity(ctx.model) === modelIdentity(model) &&\n\t\t\t\t\tauth === undefined\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\tif (isAbortError(error) || isStaleExtensionContextError(error)) throw error;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\tif (!outcome.fingerprint) return true;\n\t\tif (!adapter) return false;\n\t\ttry {\n\t\t\tconst auth = await awaitWithDeadline(\n\t\t\t\tresolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n\t\t\t\tsignal,\n\t\t\t\tDEFAULT_TIMEOUT_MS,\n\t\t\t\t`revalidating ${adapter.displayName} runtime auth`,\n\t\t\t);\n\t\t\treturn (\n\t\t\t\tgeneration === statusGeneration &&\n\t\t\t\tmodelIdentity(ctx.model) === modelIdentity(model) &&\n\t\t\t\tauth?.fingerprint === outcome.fingerprint\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tif (isAbortError(error) || isStaleExtensionContextError(error)) throw error;\n\t\t\treturn false;\n\t\t}\n\t};\n\n\tconst queryStableCurrent = async (\n\t\tctx: ExtensionCommandContext,\n\t\tforce: boolean,\n\t\tcontroller: AbortController,\n\t\tlabel: string,\n\t): Promise<StableCurrent | undefined> => {\n\t\tfor (let attempt = 0; attempt < 3; attempt += 1) {\n\t\t\tconst model = ctx.model;\n\t\t\tconst generation = statusGeneration;\n\t\t\tconst result = await runMenuOperation(ctx, label, controller.signal, async (signal) => {\n\t\t\t\tconst outcome = await queryCurrentState(ctx, model, force, signal);\n\t\t\t\treturn {\n\t\t\t\t\toutcome,\n\t\t\t\t\tstable: await outcomeStillCurrent(ctx, model, generation, outcome, signal),\n\t\t\t\t};\n\t\t\t});\n\t\t\tif (!result) return undefined;\n\t\t\tif (result.stable) return { outcome: result.outcome, model };\n\t\t\tforce = false;\n\t\t}\n\t\tctx.ui.notify(\"The active model or account kept changing; reopen /usage to retry.\", \"warning\");\n\t\treturn undefined;\n\t};\n\n\tconst publishStableCurrent = (ctx: ExtensionCommandContext, current: StableCurrent) => {\n\t\tif (current.model) publishStatus(ctx, current.outcome, current.model, sessionActive);\n\t\telse safeSetStatus(ctx, undefined);\n\t};\n\n\tconst showMenu = async (ctx: ExtensionCommandContext): Promise<void> => {\n\t\tif (!ctx.hasUI) throw new Error(\"/usage requires TUI or RPC mode.\");\n\t\tstatusGeneration += 1;\n\t\tconst menuGeneration = statusGeneration;\n\t\tstatusController?.abort();\n\t\tstatusController = undefined;\n\t\tclearStatusTimer();\n\t\tconst controller = new AbortController();\n\t\tactiveControllers.add(controller);\n\t\ttry {\n\t\t\tlet stableCurrent = await queryStableCurrent(\n\t\t\t\tctx,\n\t\t\t\tfalse,\n\t\t\t\tcontroller,\n\t\t\t\t\"Checking current usage\u2026\",\n\t\t\t);\n\t\t\tif (!stableCurrent) return;\n\t\t\tpublishStableCurrent(ctx, stableCurrent);\n\t\t\tlet current = stableCurrent.outcome;\n\t\t\tlet visibleStates: ProviderUsageState[] = [current.state];\n\t\t\tlet fastState = settingsRuntime.get();\n\t\t\tlet resetAvailability: CodexResetAvailability | undefined;\n\t\t\tlet selectedReset: CodexResetOption | undefined;\n\t\t\tlet resetAuthFingerprint: string | undefined;\n\t\t\tlet resetModelIdentity: string | undefined;\n\t\t\tlet redemptionId: string | undefined;\n\t\t\tlet resetOutcome: CodexResetOutcome | undefined;\n\t\t\tlet resetFailure: string | undefined;\n\t\t\tconst { defineMenu, runMenu } = await import(\"@narumitw/pi-tui-kit\");\n\t\t\tif (controller.signal.aborted || statusGeneration !== menuGeneration) return;\n\t\t\ttype Screen =\n\t\t\t\t| \"main\"\n\t\t\t\t| \"providers\"\n\t\t\t\t| \"reset-picker\"\n\t\t\t\t| \"reset-confirm\"\n\t\t\t\t| \"reset-result\"\n\t\t\t\t| \"reset-error\";\n\t\t\ttype Action =\n\t\t\t\t| \"refresh\"\n\t\t\t\t| \"toggle-fast\"\n\t\t\t\t| \"another\"\n\t\t\t\t| \"all\"\n\t\t\t\t| \"provider\"\n\t\t\t\t| \"open-resets\"\n\t\t\t\t| \"select-reset\"\n\t\t\t\t| \"cancel-reset\"\n\t\t\t\t| \"consume-reset\"\n\t\t\t\t| \"back-to-usage\"\n\t\t\t\t| \"back-to-resets\";\n\t\t\tconst menu = defineMenu<undefined, Screen, Action, ExtensionCommandContext>({\n\t\t\t\tstart: \"main\",\n\t\t\t\tscreens: {\n\t\t\t\t\tmain: () => {\n\t\t\t\t\t\tconst fastAvailability = fastRuntime.availability(ctx.model);\n\t\t\t\t\t\tconst fastLines =\n\t\t\t\t\t\t\tfastAvailability.kind === \"available\"\n\t\t\t\t\t\t\t\t? [`Fast mode: ${fastAvailability.enabled ? \"On\" : \"Off\"}`, FAST_USAGE_WARNING]\n\t\t\t\t\t\t\t\t: fastAvailability.kind === \"unavailable\"\n\t\t\t\t\t\t\t\t\t? [`Fast mode: Unavailable \u00B7 ${fastAvailability.reason}`]\n\t\t\t\t\t\t\t\t\t: [];\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tkind: \"actions\",\n\t\t\t\t\t\t\ttitle: \"Provider usage\",\n\t\t\t\t\t\t\tlines: [...formatProviderStates(visibleStates).split(\"\\n\"), ...fastLines],\n\t\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t\t{ id: \"refresh\", label: REFRESH_CURRENT, action: \"refresh\" },\n\t\t\t\t\t\t\t\t...(fastAvailability.kind === \"available\"\n\t\t\t\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tid: \"toggle-fast\",\n\t\t\t\t\t\t\t\t\t\t\t\tlabel: fastAvailability.enabled\n\t\t\t\t\t\t\t\t\t\t\t\t\t? \"Turn Fast mode off\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t: \"Turn Fast mode on\",\n\t\t\t\t\t\t\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\t\t\t\t\t\tfastState.kind === \"invalid\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? \"Repair pi-usage.json and reload before changing Fast mode.\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: FAST_USAGE_WARNING,\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled: fastState.kind === \"invalid\",\n\t\t\t\t\t\t\t\t\t\t\t\taction: \"toggle-fast\" as const,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t: []),\n\t\t\t\t\t\t\t\t...(current.state.status === \"ready\" && current.state.providerId === \"openai-codex\"\n\t\t\t\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tid: \"open-resets\",\n\t\t\t\t\t\t\t\t\t\t\t\tlabel: REDEEM_CODEX_RESET,\n\t\t\t\t\t\t\t\t\t\t\t\tdescription: codexResetActionDescription(current.state.report),\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled: codexResetCount(current.state.report) === 0,\n\t\t\t\t\t\t\t\t\t\t\t\taction: \"open-resets\" as const,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t: []),\n\t\t\t\t\t\t\t\t{ id: \"another\", label: VIEW_ANOTHER, action: \"another\" },\n\t\t\t\t\t\t\t\t{ id: \"all\", label: VIEW_ALL, action: \"all\" },\n\t\t\t\t\t\t\t\t{ id: \"close\", label: CLOSE, close: true },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\thint: \"close\",\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\t\t\t\t\tproviders: () => ({\n\t\t\t\t\t\tkind: \"actions\",\n\t\t\t\t\t\ttitle: \"Select a configured provider\",\n\t\t\t\t\t\titems: configuredAdapters(ctx)\n\t\t\t\t\t\t\t.filter((adapter) => adapter.id !== ctx.model?.provider)\n\t\t\t\t\t\t\t.map((adapter) => ({\n\t\t\t\t\t\t\t\tid: adapter.id,\n\t\t\t\t\t\t\t\tlabel: adapter.displayName,\n\t\t\t\t\t\t\t\taction: \"provider\" as const,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\thint: \"back\",\n\t\t\t\t\t}),\n\t\t\t\t\t\"reset-picker\": () => ({\n\t\t\t\t\t\tkind: \"choice\",\n\t\t\t\t\t\ttitle: \"Usage limit resets\",\n\t\t\t\t\t\tlines: [\n\t\t\t\t\t\t\t`${resetAvailability?.availableCount ?? 0} ${resetLabel(resetAvailability?.availableCount ?? 0)} available.`,\n\t\t\t\t\t\t],\n\t\t\t\t\t\titems: (resetAvailability?.options ?? []).map((option, index) => ({\n\t\t\t\t\t\t\tid: `reset-${index}`,\n\t\t\t\t\t\t\tlabel: option.title,\n\t\t\t\t\t\t\tdescription: resetOptionExpiration(option),\n\t\t\t\t\t\t\tdetails: [option.description],\n\t\t\t\t\t\t})),\n\t\t\t\t\t\taction: \"select-reset\",\n\t\t\t\t\t\tinitialItemId: \"reset-0\",\n\t\t\t\t\t\thint: \"back\",\n\t\t\t\t\t}),\n\t\t\t\t\t\"reset-confirm\": () => ({\n\t\t\t\t\t\tkind: \"actions\",\n\t\t\t\t\t\ttitle: \"Use this reset?\",\n\t\t\t\t\t\tlines: resetConfirmationLines(selectedReset),\n\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t{ id: \"cancel-reset\", label: \"No, go back\", action: \"cancel-reset\" },\n\t\t\t\t\t\t\t{ id: \"consume-reset\", label: \"Yes, use reset\", action: \"consume-reset\" },\n\t\t\t\t\t\t],\n\t\t\t\t\t\thint: \"back\",\n\t\t\t\t\t}),\n\t\t\t\t\t\"reset-result\": () => ({\n\t\t\t\t\t\tkind: \"actions\",\n\t\t\t\t\t\ttitle: \"Usage limit resets\",\n\t\t\t\t\t\tlines: [\n\t\t\t\t\t\t\tformatCodexResetOutcome(\n\t\t\t\t\t\t\t\tresetOutcome,\n\t\t\t\t\t\t\t\tcurrent.state.status === \"ready\"\n\t\t\t\t\t\t\t\t\t? codexResetCount(current.state.report)\n\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t],\n\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: \"back-to-usage\",\n\t\t\t\t\t\t\t\tlabel: \"Back to usage\",\n\t\t\t\t\t\t\t\taction: \"back-to-usage\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{ id: \"close\", label: CLOSE, close: true },\n\t\t\t\t\t\t],\n\t\t\t\t\t\thint: \"back\",\n\t\t\t\t\t}),\n\t\t\t\t\t\"reset-error\": () => ({\n\t\t\t\t\t\tkind: \"actions\",\n\t\t\t\t\t\ttitle: \"Usage limit resets\",\n\t\t\t\t\t\tlines: [resetFailure ?? \"Couldn't reset usage. Please try again.\"],\n\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t{ id: \"consume-reset\", label: \"Try again\", action: \"consume-reset\" },\n\t\t\t\t\t\t\t{ id: \"back-to-resets\", label: \"Back\", action: \"back-to-resets\" },\n\t\t\t\t\t\t],\n\t\t\t\t\t\thint: \"back\",\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\tactions: {\n\t\t\t\t\t\"toggle-fast\": async () => {\n\t\t\t\t\t\tconst availability = fastRuntime.availability(ctx.model);\n\t\t\t\t\t\tif (availability.kind !== \"available\" || fastState.kind === \"invalid\") {\n\t\t\t\t\t\t\treturn { kind: \"rejected\" };\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst changed = await fastRuntime.toggle(ctx, !availability.enabled, controller.signal);\n\t\t\t\t\t\tif (!changed) return { kind: \"rejected\" };\n\t\t\t\t\t\tfastState = settingsRuntime.get();\n\t\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t\t},\n\t\t\t\t\t\"open-resets\": async () => {\n\t\t\t\t\t\tconst summaryCount =\n\t\t\t\t\t\t\tcurrent.state.status === \"ready\" && current.state.providerId === \"openai-codex\"\n\t\t\t\t\t\t\t\t? codexResetCount(current.state.report)\n\t\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst loaded = await runMenuOperation(\n\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\"Checking usage limit resets\u2026\",\n\t\t\t\t\t\t\t\tcontroller.signal,\n\t\t\t\t\t\t\t\tasync (signal) => {\n\t\t\t\t\t\t\t\t\tconst expectedModel = modelIdentity(ctx.model);\n\t\t\t\t\t\t\t\t\tconst auth = await awaitWithDeadline(\n\t\t\t\t\t\t\t\t\t\tresolveCodexResetAuth(ctx, undefined, credentialReader, credentialCandidates),\n\t\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t\t\tDEFAULT_TIMEOUT_MS,\n\t\t\t\t\t\t\t\t\t\t\"resolving current Codex reset authentication\",\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tlet availability: CodexResetAvailability;\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tavailability = await listCodexResetCredits(auth, signal, DEFAULT_TIMEOUT_MS);\n\t\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\t\tif (isAbortError(error) || summaryCount === undefined || summaryCount <= 0) {\n\t\t\t\t\t\t\t\t\t\t\tthrow error;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tavailability = {\n\t\t\t\t\t\t\t\t\t\t\tavailableCount: summaryCount,\n\t\t\t\t\t\t\t\t\t\t\toptions: [genericCodexResetOption()],\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tconst revalidated = await awaitWithDeadline(\n\t\t\t\t\t\t\t\t\t\tresolveCodexResetAuth(ctx, undefined, credentialReader, credentialCandidates),\n\t\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t\t\tDEFAULT_TIMEOUT_MS,\n\t\t\t\t\t\t\t\t\t\t\"revalidating current Codex reset authentication\",\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\tmodelIdentity(ctx.model) !== expectedModel ||\n\t\t\t\t\t\t\t\t\t\trevalidated.fingerprint !== auth.fingerprint\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\t\t\"The active Codex model or account changed while loading usage limit resets.\",\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn { availability, auth, expectedModel };\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (!loaded) return { kind: \"stay\" };\n\t\t\t\t\t\t\tresetAvailability = loaded.availability;\n\t\t\t\t\t\t\tresetAuthFingerprint = loaded.auth.fingerprint;\n\t\t\t\t\t\t\tresetModelIdentity = loaded.expectedModel;\n\t\t\t\t\t\t\tselectedReset = undefined;\n\t\t\t\t\t\t\tredemptionId = undefined;\n\t\t\t\t\t\t\tresetOutcome = undefined;\n\t\t\t\t\t\t\tresetFailure = undefined;\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tkind: \"to\",\n\t\t\t\t\t\t\t\tscreen: loaded.availability.availableCount > 0 ? \"reset-picker\" : \"reset-result\",\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tif (isAbortError(error) || isStaleExtensionContextError(error)) {\n\t\t\t\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tctx.ui.notify(`Couldn't load usage limit resets: ${errorMessage(error)}`, \"error\");\n\t\t\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t\"select-reset\": ({ itemId }) => {\n\t\t\t\t\t\tconst index = Number(itemId.replace(/^reset-/u, \"\"));\n\t\t\t\t\t\tconst option = Number.isSafeInteger(index)\n\t\t\t\t\t\t\t? resetAvailability?.options[index]\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\tif (!option) return { kind: \"rejected\" };\n\t\t\t\t\t\tselectedReset = option;\n\t\t\t\t\t\tredemptionId = undefined;\n\t\t\t\t\t\tresetFailure = undefined;\n\t\t\t\t\t\treturn { kind: \"to\", screen: \"reset-confirm\" };\n\t\t\t\t\t},\n\t\t\t\t\t\"cancel-reset\": () => ({ kind: \"back\" }),\n\t\t\t\t\t\"consume-reset\": async () => {\n\t\t\t\t\t\tif (!selectedReset || !resetAuthFingerprint || !resetModelIdentity) {\n\t\t\t\t\t\t\treturn { kind: \"rejected\" };\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tredemptionId ??= createRedemptionId();\n\t\t\t\t\t\t\tconst attemptId = redemptionId;\n\t\t\t\t\t\t\tconst option = selectedReset;\n\t\t\t\t\t\t\tconst expectedFingerprint = resetAuthFingerprint;\n\t\t\t\t\t\t\tconst expectedModel = resetModelIdentity;\n\t\t\t\t\t\t\tconst result = await runMenuOperation(\n\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\"Resetting your usage\u2026\",\n\t\t\t\t\t\t\t\tcontroller.signal,\n\t\t\t\t\t\t\t\tasync (signal) => {\n\t\t\t\t\t\t\t\t\tconst auth = await awaitWithDeadline(\n\t\t\t\t\t\t\t\t\t\tresolveCodexResetAuth(ctx, undefined, credentialReader, credentialCandidates),\n\t\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t\t\tDEFAULT_TIMEOUT_MS,\n\t\t\t\t\t\t\t\t\t\t\"revalidating current Codex reset authentication\",\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\tmodelIdentity(ctx.model) !== expectedModel ||\n\t\t\t\t\t\t\t\t\t\tauth.fingerprint !== expectedFingerprint\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\t\t\"The active Codex model or account changed; the reset was not used.\",\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tconst outcome = await consumeCodexResetCredit(\n\t\t\t\t\t\t\t\t\t\tauth,\n\t\t\t\t\t\t\t\t\t\toption,\n\t\t\t\t\t\t\t\t\t\tattemptId,\n\t\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t\t\tDEFAULT_TIMEOUT_MS,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tinvalidateProviderState(\"openai-codex\");\n\t\t\t\t\t\t\t\t\tconst model = ctx.model;\n\t\t\t\t\t\t\t\t\tif (modelIdentity(model) !== expectedModel) return { outcome };\n\t\t\t\t\t\t\t\t\tconst refreshed = await queryCurrentState(ctx, model, true, signal);\n\t\t\t\t\t\t\t\t\tconst stable = await outcomeStillCurrent(\n\t\t\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t\t\t\t\tmenuGeneration,\n\t\t\t\t\t\t\t\t\t\trefreshed,\n\t\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\treturn stable ? { outcome, refreshed, model } : { outcome };\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (!result) return { kind: \"close\" };\n\t\t\t\t\t\t\tresetOutcome = result.outcome;\n\t\t\t\t\t\t\tresetFailure = undefined;\n\t\t\t\t\t\t\tif (result.refreshed && result.model) {\n\t\t\t\t\t\t\t\tstableCurrent = { outcome: result.refreshed, model: result.model };\n\t\t\t\t\t\t\t\tcurrent = result.refreshed;\n\t\t\t\t\t\t\t\tvisibleStates = [current.state];\n\t\t\t\t\t\t\t\tpublishStableCurrent(ctx, stableCurrent);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn { kind: \"to\", screen: \"reset-result\" };\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tif (isAbortError(error) || isStaleExtensionContextError(error)) {\n\t\t\t\t\t\t\t\treturn { kind: \"close\" };\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tresetFailure = `Couldn't reset usage: ${errorMessage(error)}. Try again with the same request.`;\n\t\t\t\t\t\t\treturn { kind: \"to\", screen: \"reset-error\" };\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t\"back-to-usage\": () => ({ kind: \"to\", screen: \"main\" }),\n\t\t\t\t\t\"back-to-resets\": () => {\n\t\t\t\t\t\tredemptionId = undefined;\n\t\t\t\t\t\tresetFailure = undefined;\n\t\t\t\t\t\treturn { kind: \"to\", screen: \"reset-picker\" };\n\t\t\t\t\t},\n\t\t\t\t\trefresh: async () => {\n\t\t\t\t\t\tconst refreshed = await queryStableCurrent(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\tcontroller,\n\t\t\t\t\t\t\t\"Refreshing current usage\u2026\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!refreshed) return { kind: \"stay\" };\n\t\t\t\t\t\tstableCurrent = refreshed;\n\t\t\t\t\t\tpublishStableCurrent(ctx, refreshed);\n\t\t\t\t\t\tcurrent = refreshed.outcome;\n\t\t\t\t\t\tvisibleStates = [current.state];\n\t\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t\t},\n\t\t\t\t\tanother: async () => {\n\t\t\t\t\t\tconst others = configuredAdapters(ctx).filter(\n\t\t\t\t\t\t\t(adapter) => adapter.id !== ctx.model?.provider,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (others.length === 0) {\n\t\t\t\t\t\t\tctx.ui.notify(\"No other supported provider has configured runtime auth.\", \"info\");\n\t\t\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn { kind: \"to\", screen: \"providers\" };\n\t\t\t\t\t},\n\t\t\t\t\tprovider: async ({ itemId }) => {\n\t\t\t\t\t\tconst adapter = configuredAdapters(ctx).find(\n\t\t\t\t\t\t\t(candidate) => candidate.id === itemId && candidate.id !== ctx.model?.provider,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!adapter) return { kind: \"back\" };\n\t\t\t\t\t\tconst outcome = await runMenuOperation(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t`Checking ${adapter.displayName} usage\u2026`,\n\t\t\t\t\t\t\tcontroller.signal,\n\t\t\t\t\t\t\t(signal) => queryAdapterState(ctx, adapter, \"configured\", false, signal),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!outcome) return { kind: \"back\" };\n\t\t\t\t\t\tconst revalidated = await queryStableCurrent(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\tcontroller,\n\t\t\t\t\t\t\t\"Revalidating current usage\u2026\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!revalidated) return { kind: \"back\" };\n\t\t\t\t\t\tstableCurrent = revalidated;\n\t\t\t\t\t\tcurrent = revalidated.outcome;\n\t\t\t\t\t\tvisibleStates = [\n\t\t\t\t\t\t\toutcome.state.providerId === current.state.providerId\n\t\t\t\t\t\t\t\t? current.state\n\t\t\t\t\t\t\t\t: { ...outcome.state, displayState: \"configured\" },\n\t\t\t\t\t\t];\n\t\t\t\t\t\treturn { kind: \"back\" };\n\t\t\t\t\t},\n\t\t\t\t\tall: async () => {\n\t\t\t\t\t\tconst adapters = configuredAdapters(ctx);\n\t\t\t\t\t\tconst currentProviderId = ctx.model?.provider;\n\t\t\t\t\t\tconst settled = await runMenuOperation(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\"Checking configured provider usage\u2026\",\n\t\t\t\t\t\t\tcontroller.signal,\n\t\t\t\t\t\t\t(signal) =>\n\t\t\t\t\t\t\t\trunWithConcurrency(\n\t\t\t\t\t\t\t\t\tadapters,\n\t\t\t\t\t\t\t\t\tALL_PROVIDER_CONCURRENCY,\n\t\t\t\t\t\t\t\t\t(adapter, _index, workerSignal) =>\n\t\t\t\t\t\t\t\t\t\tqueryAdapterState(\n\t\t\t\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\t\t\tadapter,\n\t\t\t\t\t\t\t\t\t\t\tadapter.id === currentProviderId ? \"current\" : \"configured\",\n\t\t\t\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\t\t\t\tworkerSignal,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!settled) return { kind: \"stay\" };\n\t\t\t\t\t\tconst queriedStates: ProviderUsageState[] = settled.map((result, index) => {\n\t\t\t\t\t\t\tif (result.status === \"fulfilled\") {\n\t\t\t\t\t\t\t\treturn { ...result.value.state, displayState: \"configured\" };\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst adapter = adapters[index] as UsageProviderAdapter;\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tproviderId: adapter.id,\n\t\t\t\t\t\t\t\tproviderName: adapter.displayName,\n\t\t\t\t\t\t\t\tdisplayState: \"configured\",\n\t\t\t\t\t\t\t\tstatus: \"query-failed\",\n\t\t\t\t\t\t\t\tmessage: errorMessage(result.reason),\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconst revalidated = await queryStableCurrent(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\tcontroller,\n\t\t\t\t\t\t\t\"Revalidating current usage\u2026\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!revalidated) return { kind: \"stay\" };\n\t\t\t\t\t\tstableCurrent = revalidated;\n\t\t\t\t\t\tcurrent = revalidated.outcome;\n\t\t\t\t\t\tvisibleStates = [\n\t\t\t\t\t\t\tcurrent.state,\n\t\t\t\t\t\t\t...queriedStates.filter((state) => state.providerId !== current.state.providerId),\n\t\t\t\t\t\t];\n\t\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t\tawait runMenu(ctx, menu, {\n\t\t\t\tgetState: () => undefined,\n\t\t\t\tsignal: controller.signal,\n\t\t\t\tisCurrent: () => statusGeneration === menuGeneration && !controller.signal.aborted,\n\t\t\t});\n\t\t} finally {\n\t\t\tcontroller.abort(new DOMException(\"Usage menu closed\", \"AbortError\"));\n\t\t\tactiveControllers.delete(controller);\n\t\t}\n\t};\n\n\tpi.registerCommand(\"usage\", {\n\t\tdescription: \"Show usage for the current runtime account\",\n\t\thandler: async (args, ctx) => {\n\t\t\tif (args.trim()) {\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\"/usage does not accept arguments; choose an action from its menu.\",\n\t\t\t\t\t\"warning\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait showMenu(ctx);\n\t\t\t} catch (error) {\n\t\t\t\tif (isStaleExtensionContextError(error) || isAbortError(error)) return;\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t},\n\t});\n\tpi.on(\"session_start\", (_event, ctx) => {\n\t\tstatusGeneration += 1;\n\t\tclearStatusTimer();\n\t\tfor (const controller of activeControllers) controller.abort();\n\t\tactiveControllers.clear();\n\t\tstatusController = undefined;\n\t\tsessionActive = true;\n\t\tstartStatusRefresh(ctx, ctx.model, false);\n\t});\n\tpi.on(\"session_tree\", (_event, ctx) => {\n\t\tstartStatusRefresh(ctx, ctx.model, false);\n\t});\n\tpi.on(\"model_select\", (event, ctx) => {\n\t\tstartStatusRefresh(ctx, event.model, false);\n\t});\n\tpi.on(\"turn_start\", (_event, ctx) => {\n\t\tstartStatusRefresh(ctx, ctx.model, false);\n\t});\n\tpi.on(\"session_shutdown\", (_event, ctx) => {\n\t\tsessionActive = false;\n\t\tstatusGeneration += 1;\n\t\tclearStatusTimer();\n\t\tfor (const controller of activeControllers) controller.abort();\n\t\tactiveControllers.clear();\n\t\tstatusController = undefined;\n\t\tcache.clear();\n\t\tfailureBackoff.clear();\n\t\tlatestQueries.clear();\n\t\tactiveCurrentIdentity = undefined;\n\t\tsafeSetStatus(ctx, undefined);\n\t});\n\n\tfastRuntime = registerCodexFastMode(pi, settingsRuntime, (ctx) =>\n\t\tstartStatusRefresh(ctx, ctx.model, false),\n\t);\n}\n", "import type {\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionContext,\n} from \"@earendil-works/pi-coding-agent\";\nimport {\n\tcodexFastAvailability,\n\tcodexFastIsEffective,\n\tcodexFastStatusLabel,\n\tcorrectCodexFastMessageCost,\n\trewriteCodexFastPayload,\n} from \"./codex-fast.js\";\nimport { errorMessage } from \"./core.js\";\nimport { isStaleExtensionContextError } from \"./query.js\";\nimport type { UsageSettingsRuntime, UsageSettingsState } from \"./settings.js\";\nimport type { PiModel } from \"./types.js\";\n\nconst NO_FAST_REQUEST = Symbol(\"no-fast-request\");\ntype PendingFastRequest = { fastRequested: boolean; model: PiModel };\n\nexport const FAST_USAGE_WARNING = \"Fast is about 1.5\u00D7 faster and uses more of your plan allowance.\";\n\nexport function registerCodexFastMode(\n\tpi: ExtensionAPI,\n\tsettingsRuntime: UsageSettingsRuntime,\n\trefreshStatus: (ctx: ExtensionContext) => void,\n) {\n\tlet sessionController = new AbortController();\n\tlet generation = 0;\n\tconst pendingFastRequests = new Map<string, PendingFastRequest>();\n\n\tconst toggle = async (\n\t\tctx: ExtensionCommandContext,\n\t\tenabled: boolean,\n\t\tcallerSignal?: AbortSignal,\n\t): Promise<boolean> => {\n\t\tconst ownerGeneration = generation;\n\t\tconst sessionId = ctx.sessionManager.getSessionId();\n\t\tconst signal = callerSignal\n\t\t\t? AbortSignal.any([callerSignal, sessionController.signal])\n\t\t\t: sessionController.signal;\n\t\ttry {\n\t\t\tawait settingsRuntime.update({ codexFastMode: enabled }, signal);\n\t\t} catch (error) {\n\t\t\tif (isAbortError(error) || isStaleExtensionContextError(error)) return false;\n\t\t\tctx.ui.notify(`Could not save pi-usage.json: ${errorMessage(error)}`, \"error\");\n\t\t\treturn false;\n\t\t}\n\t\tif (\n\t\t\tsignal.aborted ||\n\t\t\townerGeneration !== generation ||\n\t\t\tctx.sessionManager.getSessionId() !== sessionId\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t\trefreshStatus(ctx);\n\t\tctx.ui.notify(\n\t\t\tenabled\n\t\t\t\t? `Codex Fast mode enabled. ${FAST_USAGE_WARNING}`\n\t\t\t\t: \"Codex Fast mode disabled; standard routing will be used.\",\n\t\t\t\"info\",\n\t\t);\n\t\treturn true;\n\t};\n\n\tpi.registerCommand(\"fast\", {\n\t\tdescription: \"Toggle Codex Fast mode\",\n\t\thandler: async (args, ctx) => {\n\t\t\tif (args.trim()) {\n\t\t\t\tif (!ctx.hasUI) throw new Error(\"/fast does not accept arguments.\");\n\t\t\t\tctx.ui.notify(\"/fast does not accept arguments.\", \"warning\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!ctx.hasUI) throw new Error(\"/fast requires TUI or RPC mode.\");\n\t\t\tconst availability = codexFastAvailability(\n\t\t\t\tctx.model,\n\t\t\t\tsettingsRuntime.get().settings.codexFastMode,\n\t\t\t);\n\t\t\tif (availability.kind === \"not-codex\") {\n\t\t\t\tctx.ui.notify(\"/fast is available only for the active OpenAI Codex model.\", \"warning\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (availability.kind === \"unavailable\") {\n\t\t\t\tctx.ui.notify(availability.reason, \"warning\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (settingsRuntime.get().kind === \"invalid\") {\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\"pi-usage.json is invalid; repair it and run /reload before changing Fast mode.\",\n\t\t\t\t\t\"error\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait toggle(ctx, !availability.enabled);\n\t\t},\n\t});\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tgeneration += 1;\n\t\tsessionController.abort();\n\t\tpendingFastRequests.clear();\n\t\tsessionController = new AbortController();\n\t\tconst ownerGeneration = generation;\n\t\tconst sessionId = ctx.sessionManager.getSessionId();\n\t\tlet state: Readonly<UsageSettingsState>;\n\t\ttry {\n\t\t\tstate = await settingsRuntime.reload(sessionController.signal);\n\t\t} catch (error) {\n\t\t\tif (sessionController.signal.aborted || ownerGeneration !== generation) return;\n\t\t\tif (ctx.hasUI) {\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t`Could not load pi-usage.json; using defaults. ${errorMessage(error)}`,\n\t\t\t\t\t\"warning\",\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (\n\t\t\tsessionController.signal.aborted ||\n\t\t\townerGeneration !== generation ||\n\t\t\tctx.sessionManager.getSessionId() !== sessionId\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tif (ctx.hasUI && state.kind === \"invalid\") {\n\t\t\tctx.ui.notify(\n\t\t\t\t`Invalid pi-usage.json; using defaults without overwriting it. ${state.issue}`,\n\t\t\t\t\"warning\",\n\t\t\t);\n\t\t}\n\t\trefreshStatus(ctx);\n\t});\n\n\tpi.on(\"before_provider_request\", (event, ctx) => {\n\t\tconst rewritten = rewriteCodexFastPayload(\n\t\t\tevent.payload,\n\t\t\tctx.model,\n\t\t\tsettingsRuntime.get().settings.codexFastMode,\n\t\t);\n\t\tconst key = activeRequestKey(ctx);\n\t\tif (key && ctx.model) {\n\t\t\tpendingFastRequests.set(key, {\n\t\t\t\tfastRequested: isRecord(rewritten) && rewritten.service_tier === \"priority\",\n\t\t\t\tmodel: ctx.model,\n\t\t\t});\n\t\t}\n\t\treturn rewritten;\n\t});\n\tpi.on(\"message_end\", (event, ctx) => {\n\t\tconst request = consumeFastRequest(ctx, event.message, pendingFastRequests);\n\t\tif (request === NO_FAST_REQUEST) return undefined;\n\t\tconst message = correctCodexFastMessageCost(\n\t\t\tevent.message,\n\t\t\trequest.model,\n\t\t\trequest.fastRequested,\n\t\t);\n\t\treturn message ? { message: message as never } : undefined;\n\t});\n\tpi.on(\"session_shutdown\", async () => {\n\t\tgeneration += 1;\n\t\tsessionController.abort();\n\t\tpendingFastRequests.clear();\n\t\tawait settingsRuntime.flush();\n\t});\n\n\treturn {\n\t\tavailability(model: PiModel | undefined) {\n\t\t\treturn codexFastAvailability(model, settingsRuntime.get().settings.codexFastMode);\n\t\t},\n\t\tdecorateStatus(model: PiModel | undefined, status: string) {\n\t\t\treturn codexFastStatusLabel(\n\t\t\t\tstatus,\n\t\t\t\tcodexFastIsEffective(model, settingsRuntime.get().settings.codexFastMode),\n\t\t\t);\n\t\t},\n\t\ttoggle,\n\t};\n}\n\nfunction activeRequestKey(ctx: ExtensionContext): string | undefined {\n\tconst model = ctx.model;\n\treturn model ? `${ctx.sessionManager.getSessionId()}:${model.provider}/${model.id}` : undefined;\n}\n\nfunction consumeFastRequest(\n\tctx: ExtensionContext,\n\tmessage: unknown,\n\tpending: Map<string, PendingFastRequest>,\n): PendingFastRequest | typeof NO_FAST_REQUEST {\n\tif (!isRecord(message) || message.role !== \"assistant\") return NO_FAST_REQUEST;\n\tconst key = messageRequestKey(ctx, message);\n\tif (!key) return NO_FAST_REQUEST;\n\tconst request = pending.get(key);\n\tpending.delete(key);\n\treturn request ?? NO_FAST_REQUEST;\n}\n\nfunction messageRequestKey(\n\tctx: ExtensionContext,\n\tmessage: Record<string, unknown>,\n): string | undefined {\n\tif (typeof message.provider !== \"string\" || typeof message.model !== \"string\") return undefined;\n\treturn `${ctx.sessionManager.getSessionId()}:${message.provider}/${message.model}`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isAbortError(error: unknown): boolean {\n\treturn error instanceof Error && error.name === \"AbortError\";\n}\n", "import type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { sanitizeDisplayText } from \"./core.js\";\nimport { providerIsConfigured, SUPPORTED_ADAPTERS } from \"./query.js\";\nimport type { PiModel, UsageProviderAdapter } from \"./types.js\";\n\nexport function configuredAdapters(ctx: ExtensionContext): UsageProviderAdapter[] {\n\treturn SUPPORTED_ADAPTERS.filter(\n\t\t(adapter) => adapter.id === ctx.model?.provider || providerIsConfigured(ctx, adapter.id),\n\t);\n}\n\nexport function providerDisplayName(ctx: ExtensionContext, providerId: string): string {\n\ttry {\n\t\treturn sanitizeDisplayText(ctx.modelRegistry.getProviderDisplayName(providerId), 80);\n\t} catch {\n\t\treturn sanitizeDisplayText(providerId, 80);\n\t}\n}\n\nexport function setBoundedMap<T>(map: Map<string, T>, key: string, value: T, limit: number): void {\n\tmap.delete(key);\n\twhile (map.size >= limit) {\n\t\tconst oldest = map.keys().next().value;\n\t\tif (oldest === undefined) break;\n\t\tmap.delete(oldest);\n\t}\n\tmap.set(key, value);\n}\n\nexport function modelIdentity(model: PiModel | undefined): string | undefined {\n\treturn model ? `${model.provider}/${model.id}` : undefined;\n}\n\nexport function isAbortError(error: unknown): boolean {\n\treturn error instanceof Error && error.name === \"AbortError\";\n}\n\nexport function isTimeoutError(error: unknown): boolean {\n\treturn error instanceof Error && error.name === \"TimeoutError\";\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { calculateCost, hasApi } from \"@earendil-works/pi-ai\";\nimport type { PiModel } from \"./types.js\";\n\nexport const CODEX_FAST_SERVICE_TIER = \"priority\";\nexport const CODEX_STANDARD_SERVICE_TIER = \"default\";\n\nexport const CODEX_FAST_MODEL_IDS: ReadonlySet<string> = new Set([\n\t\"gpt-5.4\",\n\t\"gpt-5.5\",\n\t\"gpt-5.6-luna\",\n\t\"gpt-5.6-sol\",\n\t\"gpt-5.6-terra\",\n]);\n\nexport type CodexFastAvailability =\n\t| { kind: \"available\"; enabled: boolean }\n\t| { kind: \"not-codex\" }\n\t| { kind: \"unavailable\"; reason: string };\n\nexport function codexFastAvailability(\n\tmodel: PiModel | undefined,\n\tenabled: boolean,\n): CodexFastAvailability {\n\tif (model?.provider !== \"openai-codex\") return { kind: \"not-codex\" };\n\tif (!isOfficialCodexModel(model)) {\n\t\treturn {\n\t\t\tkind: \"unavailable\",\n\t\t\treason: \"Fast mode requires the official OpenAI Codex Responses endpoint.\",\n\t\t};\n\t}\n\tif (!CODEX_FAST_MODEL_IDS.has(model.id)) {\n\t\treturn {\n\t\t\tkind: \"unavailable\",\n\t\t\treason: `${model.id} does not advertise Codex Fast support.`,\n\t\t};\n\t}\n\treturn { kind: \"available\", enabled };\n}\n\nexport function codexFastIsEffective(model: PiModel | undefined, enabled: boolean): boolean {\n\treturn codexFastAvailability(model, enabled).kind === \"available\" && enabled;\n}\n\nexport function codexFastRequestTier(\n\tmodel: PiModel | undefined,\n\tenabled: boolean,\n): typeof CODEX_FAST_SERVICE_TIER | typeof CODEX_STANDARD_SERVICE_TIER | undefined {\n\tif (!isOfficialCodexModel(model)) return undefined;\n\treturn enabled && CODEX_FAST_MODEL_IDS.has(model.id)\n\t\t? CODEX_FAST_SERVICE_TIER\n\t\t: CODEX_STANDARD_SERVICE_TIER;\n}\n\nexport function rewriteCodexFastPayload(\n\tpayload: unknown,\n\tmodel: PiModel | undefined,\n\tenabled: boolean,\n): unknown | undefined {\n\tconst serviceTier = codexFastRequestTier(model, enabled);\n\tif (!serviceTier || !isRecord(payload)) return undefined;\n\treturn { ...payload, service_tier: serviceTier };\n}\n\nexport function correctCodexFastMessageCost(\n\tmessage: unknown,\n\tmodel: PiModel | undefined,\n\tfastRequested: boolean,\n): unknown | undefined {\n\tif (\n\t\t!codexFastIsEffective(model, fastRequested) ||\n\t\t!isRecord(message) ||\n\t\tmessage.role !== \"assistant\" ||\n\t\tmessage.provider !== model?.provider ||\n\t\tmessage.model !== model?.id\n\t) {\n\t\treturn undefined;\n\t}\n\tconst usage = isRecord(message.usage) ? message.usage : undefined;\n\tconst cost = usage && isRecord(usage.cost) ? usage.cost : undefined;\n\tif (!usage || !cost || !hasCompleteUsage(usage) || !isOfficialCodexModel(model)) return undefined;\n\tconst correctedUsage = structuredClone(usage) as typeof usage;\n\tcalculateCost(model, correctedUsage as never);\n\tconst multiplier = model.id === \"gpt-5.5\" ? 2.5 : 2;\n\tconst correctedCost = correctedUsage.cost as Record<string, number>;\n\tfor (const key of [\"input\", \"output\", \"cacheRead\", \"cacheWrite\", \"total\"] as const) {\n\t\tcorrectedCost[key] *= multiplier;\n\t}\n\tif (costsEqual(cost, correctedCost)) return undefined;\n\treturn { ...message, usage: correctedUsage };\n}\n\nexport function codexFastStatusLabel(status: string, enabled: boolean): string {\n\tif (!enabled || !/^codex(?:\\s|$)/u.test(status)) return status;\n\treturn status === \"codex\" ? \"codex fast\" : `codex fast${status.slice(\"codex\".length)}`;\n}\n\nfunction isOfficialCodexModel(\n\tmodel: PiModel | undefined,\n): model is PiModel & { api: \"openai-codex-responses\" } {\n\tif (model?.provider !== \"openai-codex\" || !hasApi(model, \"openai-codex-responses\")) {\n\t\treturn false;\n\t}\n\ttry {\n\t\treturn new URL(model.baseUrl).origin === \"https://chatgpt.com\";\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasCompleteUsage(value: Record<string, unknown>): boolean {\n\treturn [\"input\", \"output\", \"cacheRead\", \"cacheWrite\"].every(\n\t\t(key) => typeof value[key] === \"number\" && Number.isFinite(value[key]),\n\t);\n}\n\nfunction costsEqual(left: Record<string, unknown>, right: Record<string, number>): boolean {\n\treturn [\"input\", \"output\", \"cacheRead\", \"cacheWrite\", \"total\"].every(\n\t\t(key) => left[key] === right[key],\n\t);\n}\n", "import type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { readStoredCredential } from \"@earendil-works/pi-coding-agent\";\nimport { fingerprintResolvedAuth, sanitizeDisplayText } from \"./core.js\";\nimport {\n\tfallbackOAuthCredentialCandidates,\n\ttype OAuthCredentialCandidateReader,\n} from \"./oauth-credential-source.js\";\nimport {\n\tAUTH_FINGERPRINT_SALT,\n\tadapterForProvider,\n\tfetchProviderJson,\n\tresolveUsageAuth,\n} from \"./query.js\";\nimport type { ResolvedUsageAuth, UsageReport } from \"./types.js\";\n\nconst CODEX_RESET_CREDITS_URL = \"https://chatgpt.com/backend-api/wham/rate-limit-reset-credits\";\nconst CODEX_RESET_CONSUME_URL = `${CODEX_RESET_CREDITS_URL}/consume`;\nconst MAX_RESET_OPTIONS = 32;\nconst MAX_CREDIT_ID_CHARS = 1_024;\n\ntype StoredCredentialReader = (providerId: string) => unknown;\n\nexport type CodexResetOutcomeCode = \"reset\" | \"nothing_to_reset\" | \"no_credit\" | \"already_redeemed\";\n\nexport interface CodexResetOption {\n\tcreditId?: string;\n\ttitle: string;\n\tdescription: string;\n\texpiresAt?: number;\n}\n\nexport interface CodexResetAvailability {\n\tavailableCount: number;\n\toptions: CodexResetOption[];\n}\n\nexport interface CodexResetOutcome {\n\tcode: CodexResetOutcomeCode;\n\twindowsReset: number;\n}\n\nexport function codexResetCount(report: UsageReport): number | undefined {\n\tconst value = report.metrics.find((metric) => metric.id === \"reset-credits\")?.value;\n\treturn typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0 ? value : undefined;\n}\n\nexport function codexResetActionDescription(report: UsageReport): string {\n\tconst count = codexResetCount(report);\n\tif (count === undefined) return \"Check reset availability.\";\n\tif (count === 0) return \"No usage limit resets available.\";\n\treturn `You have ${count} ${resetLabel(count)} available.`;\n}\n\nexport function genericCodexResetOption(): CodexResetOption {\n\treturn {\n\t\ttitle: \"Full reset\",\n\t\tdescription: \"Reset your current usage limits.\",\n\t};\n}\n\nexport function resetOptionExpiration(option: CodexResetOption): string {\n\tif (option.expiresAt === undefined) return \"Does not expire.\";\n\tconst expiration = new Date(option.expiresAt * 1_000);\n\tif (Number.isNaN(expiration.getTime())) return \"Expiration unavailable.\";\n\treturn `Expires ${expiration.toLocaleString()}.`;\n}\n\nexport function resetConfirmationLines(option: CodexResetOption | undefined): string[] {\n\tif (!option) return [\"The selected reset is unavailable.\"];\n\treturn [\n\t\toption.title,\n\t\tresetOptionExpiration(option),\n\t\toption.description,\n\t\t\"This consumes one earned reset for the current OpenAI Codex account.\",\n\t];\n}\n\nexport function formatCodexResetOutcome(\n\toutcome: CodexResetOutcome | undefined,\n\tremainingCount: number | undefined,\n): string {\n\tconst remaining =\n\t\tremainingCount === undefined\n\t\t\t? \"\"\n\t\t\t: ` You have ${remainingCount} ${resetLabel(remainingCount)} left.`;\n\tif (!outcome) return \"You don't have any usage limit resets available.\";\n\tif (outcome.code === \"reset\") return `Usage reset.${remaining}`.trim();\n\tif (outcome.code === \"already_redeemed\") {\n\t\treturn `Usage reset was already completed.${remaining}`.trim();\n\t}\n\tif (outcome.code === \"nothing_to_reset\") {\n\t\treturn \"Your usage does not need a reset right now.\";\n\t}\n\treturn \"No usage limit resets are available.\";\n}\n\nexport function resetLabel(count: number): string {\n\treturn count === 1 ? \"usage limit reset\" : \"usage limit resets\";\n}\n\nexport async function resolveCodexResetAuth(\n\tctx: ExtensionContext,\n\tsalt: Uint8Array = AUTH_FINGERPRINT_SALT,\n\tcredentialReader: StoredCredentialReader = readStoredCredential,\n\tcandidateReader?: OAuthCredentialCandidateReader,\n): Promise<ResolvedUsageAuth> {\n\tconst model = ctx.model;\n\tif (model?.provider !== \"openai-codex\") {\n\t\tthrow new Error(\"Usage limit resets require the current model to use OpenAI Codex.\");\n\t}\n\tconst expectedModel = `${model.provider}/${model.id}`;\n\tconst adapter = adapterForProvider(\"openai-codex\");\n\tif (!adapter) throw new Error(\"OpenAI Codex usage support is unavailable.\");\n\tconst auth = await resolveUsageAuth(ctx, adapter, salt, credentialReader);\n\tif (`${ctx.model?.provider}/${ctx.model?.id}` !== expectedModel) {\n\t\tthrow new Error(\"The current model changed while resolving Codex reset authentication.\");\n\t}\n\tif (!auth) throw new Error(\"No runtime credential is configured for OpenAI Codex.\");\n\n\tconst resolvedAccess = bearerToken(headerValue(auth.headers, \"Authorization\")) ?? auth.apiKey;\n\tif (!resolvedAccess) throw new Error(\"OpenAI Codex OAuth credentials were incomplete.\");\n\tconst resolvedAccountId = codexAccountIdFromAccessToken(resolvedAccess);\n\tif (!resolvedAccountId) {\n\t\tthrow new Error(\"The active OpenAI Codex access token did not contain a valid account ID.\");\n\t}\n\tconst offered = candidateReader\n\t\t? candidateReader(ctx, \"openai-codex\")\n\t\t: fallbackOAuthCredentialCandidates(\"openai-codex\", credentialReader);\n\tif (!offered.ok) throw new Error(\"OpenAI Codex OAuth credential discovery failed closed.\");\n\tconst { accountId, storedAccess } = selectCodexResetCredential(\n\t\toffered.candidates,\n\t\tresolvedAccess,\n\t\tresolvedAccountId,\n\t\toffered.offeredCount === 0,\n\t);\n\tconst authorization = `Bearer ${resolvedAccess}`;\n\tconst headers = {\n\t\tAuthorization: authorization,\n\t\t\"chatgpt-account-id\": accountId,\n\t};\n\treturn {\n\t\tapiKey: resolvedAccess,\n\t\theaders,\n\t\tfingerprint: fingerprintResolvedAuth({ headers }, salt),\n\t\tsecrets: [\n\t\t\t...new Set([...auth.secrets, storedAccess, resolvedAccess, authorization, accountId]),\n\t\t],\n\t\tmodel: auth.model,\n\t};\n}\n\nexport async function listCodexResetCredits(\n\tauth: ResolvedUsageAuth,\n\tsignal: AbortSignal,\n\ttimeoutMs: number,\n): Promise<CodexResetAvailability> {\n\tconst payload = await fetchProviderJson(\n\t\tCODEX_RESET_CREDITS_URL,\n\t\tauth,\n\t\tsignal,\n\t\ttimeoutMs,\n\t\t\"Codex usage-limit reset endpoint\",\n\t);\n\treturn normalizeCodexResetCreditsPayload(payload);\n}\n\nexport async function consumeCodexResetCredit(\n\tauth: ResolvedUsageAuth,\n\toption: CodexResetOption,\n\tredeemRequestId: string,\n\tsignal: AbortSignal,\n\ttimeoutMs: number,\n): Promise<CodexResetOutcome> {\n\tif (!redeemRequestId) throw new Error(\"Codex reset redemption request ID must not be empty.\");\n\tconst payload = await fetchProviderJson(\n\t\tCODEX_RESET_CONSUME_URL,\n\t\tauth,\n\t\tsignal,\n\t\ttimeoutMs,\n\t\t\"Codex usage-limit reset consume endpoint\",\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\tbody: {\n\t\t\t\tredeem_request_id: redeemRequestId,\n\t\t\t\t...(option.creditId ? { credit_id: option.creditId } : {}),\n\t\t\t},\n\t\t},\n\t);\n\tconst code = payload.code;\n\tif (!isCodexResetOutcomeCode(code)) {\n\t\tthrow new Error(\"Codex reset consume endpoint returned an unknown outcome code.\");\n\t}\n\tconst windowsReset =\n\t\tpayload.windows_reset === undefined ? 0 : nonnegativeInteger(payload.windows_reset);\n\tif (windowsReset === undefined) {\n\t\tthrow new Error(\"Codex reset consume endpoint returned an invalid windows_reset value.\");\n\t}\n\treturn { code, windowsReset };\n}\n\nexport function normalizeCodexResetCreditsPayload(\n\tpayload: Record<string, unknown>,\n): CodexResetAvailability {\n\tconst availableCount = nonnegativeInteger(payload.available_count);\n\tif (availableCount === undefined) {\n\t\tthrow new Error(\"Codex reset credits response returned an invalid available_count.\");\n\t}\n\tconst rawCredits = payload.credits;\n\tif (rawCredits !== undefined && !Array.isArray(rawCredits)) {\n\t\tthrow new Error(\"Codex reset credits response returned invalid credits.\");\n\t}\n\n\tconst options = (rawCredits ?? [])\n\t\t.map(asObject)\n\t\t.filter((credit): credit is Record<string, unknown> => Boolean(credit))\n\t\t.filter((credit) => credit.status === \"available\" && credit.reset_type === \"codex_rate_limits\")\n\t\t.map(normalizeResetOption)\n\t\t.sort(\n\t\t\t(left, right) =>\n\t\t\t\t(left.expiresAt ?? Number.MAX_SAFE_INTEGER) - (right.expiresAt ?? Number.MAX_SAFE_INTEGER),\n\t\t)\n\t\t.slice(0, Math.min(availableCount, MAX_RESET_OPTIONS));\n\n\tif (availableCount > 0 && options.length === 0) {\n\t\toptions.push(genericCodexResetOption());\n\t}\n\treturn { availableCount, options };\n}\n\nfunction selectCodexResetCredential(\n\tcandidates: readonly unknown[],\n\tresolvedAccess: string,\n\tresolvedAccountId: string,\n\tstandaloneFallback: boolean,\n): { accountId: string; storedAccess: string } {\n\tlet sawOAuth = false;\n\tlet sawMatchingAccess = false;\n\tlet sawInvalidAccountId = false;\n\tconst matches = new Map<string, { accountId: string; storedAccess: string }>();\n\tfor (const candidate of candidates) {\n\t\ttry {\n\t\t\tconst credential = asObject(candidate);\n\t\t\tif (credential?.type !== \"oauth\") continue;\n\t\t\tsawOAuth = true;\n\t\t\tconst storedAccess = asNonemptyString(credential.access);\n\t\t\tif (storedAccess !== resolvedAccess) continue;\n\t\t\tsawMatchingAccess = true;\n\t\t\tconst accountId = validHeaderValue(credential.accountId);\n\t\t\tconst refresh = asNonemptyString(credential.refresh);\n\t\t\tif (!accountId || accountId !== resolvedAccountId || !refresh) {\n\t\t\t\tsawInvalidAccountId = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tmatches.set(refresh, { accountId, storedAccess });\n\t\t} catch {\n\t\t\t// Malformed candidates never authorize a reset request.\n\t\t}\n\t}\n\tif (sawInvalidAccountId) {\n\t\tthrow new Error(\"The OpenAI Codex OAuth credential did not include a valid account ID.\");\n\t}\n\tif (matches.size > 1) {\n\t\tthrow new Error(\"Conflicting OAuth credentials match the active OpenAI Codex runtime account.\");\n\t}\n\tconst match = matches.values().next().value;\n\tif (match) return match;\n\tif (!sawOAuth) {\n\t\tthrow new Error(\n\t\t\tstandaloneFallback\n\t\t\t\t? \"Usage limit resets require the OpenAI Codex OAuth account configured through Pi /login.\"\n\t\t\t\t: \"Usage limit resets require an OpenAI Codex OAuth account configured through Pi /login or a compatible credential source.\",\n\t\t);\n\t}\n\tif (sawMatchingAccess) throw new Error(\"OpenAI Codex OAuth credentials were incomplete.\");\n\tthrow new Error(\n\t\tstandaloneFallback\n\t\t\t? \"The active OpenAI Codex runtime account does not match Pi's stored OAuth account.\"\n\t\t\t: \"The active OpenAI Codex runtime account does not match any available OAuth account.\",\n\t);\n}\n\nfunction codexAccountIdFromAccessToken(access: string): string | undefined {\n\ttry {\n\t\tconst parts = access.split(\".\");\n\t\tif (parts.length !== 3 || !parts[1]) return undefined;\n\t\tconst payload = JSON.parse(Buffer.from(parts[1], \"base64url\").toString(\"utf8\")) as unknown;\n\t\tconst claims = asObject(asObject(payload)?.[\"https://api.openai.com/auth\"]);\n\t\treturn validHeaderValue(claims?.chatgpt_account_id);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction normalizeResetOption(credit: Record<string, unknown>): CodexResetOption {\n\tconst creditId = asOpaqueId(credit.id);\n\tif (!creditId) throw new Error(\"Codex reset credits response returned an invalid credit ID.\");\n\tlet expiresAt: number | undefined;\n\tif (credit.expires_at !== undefined && credit.expires_at !== null) {\n\t\tif (typeof credit.expires_at !== \"string\") {\n\t\t\tthrow new Error(\"Codex reset credits response returned an invalid expiration time.\");\n\t\t}\n\t\tconst parsed = Date.parse(credit.expires_at);\n\t\tif (!Number.isFinite(parsed)) {\n\t\t\tthrow new Error(\"Codex reset credits response returned an invalid expiration time.\");\n\t\t}\n\t\texpiresAt = Math.floor(parsed / 1_000);\n\t}\n\tconst title = displayString(credit.title) ?? \"Full reset\";\n\tconst description = displayString(credit.description) ?? \"Reset your current usage limits.\";\n\treturn {\n\t\tcreditId,\n\t\ttitle,\n\t\tdescription,\n\t\t...(expiresAt === undefined ? {} : { expiresAt }),\n\t};\n}\n\nfunction isCodexResetOutcomeCode(value: unknown): value is CodexResetOutcomeCode {\n\treturn (\n\t\tvalue === \"reset\" ||\n\t\tvalue === \"nothing_to_reset\" ||\n\t\tvalue === \"no_credit\" ||\n\t\tvalue === \"already_redeemed\"\n\t);\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\treturn value as Record<string, unknown>;\n}\n\nfunction asNonemptyString(value: unknown): string | undefined {\n\treturn typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction asOpaqueId(value: unknown): string | undefined {\n\tif (typeof value !== \"string\" || value.length === 0 || value.length > MAX_CREDIT_ID_CHARS) {\n\t\treturn undefined;\n\t}\n\treturn value;\n}\n\nfunction displayString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\treturn sanitizeDisplayText(value, 160) || undefined;\n}\n\nfunction validHeaderValue(value: unknown): string | undefined {\n\tif (typeof value !== \"string\" || !value || value.length > 512) return undefined;\n\tif (/[^\\x20-\\x7e]/u.test(value)) return undefined;\n\treturn value;\n}\n\nfunction nonnegativeInteger(value: unknown): number | undefined {\n\tconst parsed =\n\t\ttypeof value === \"number\"\n\t\t\t? value\n\t\t\t: typeof value === \"string\" && value.trim()\n\t\t\t\t? Number(value)\n\t\t\t\t: Number.NaN;\n\tif (!Number.isSafeInteger(parsed) || parsed < 0) return undefined;\n\treturn parsed;\n}\n\nfunction bearerToken(authorization: string | undefined): string | undefined {\n\treturn /^Bearer\\s+(.+)$/iu.exec(authorization ?? \"\")?.[1];\n}\n\nfunction headerValue(headers: Record<string, string>, name: string): string | undefined {\n\treturn Object.entries(headers).find(\n\t\t([candidate]) => candidate.toLowerCase() === name.toLowerCase(),\n\t)?.[1];\n}\n", "import { createHmac } from \"node:crypto\";\nimport type { UsageReport } from \"./types.js\";\n\nexport class UsageCache {\n\tprivate readonly entries = new Map<string, { createdAt: number; report: UsageReport }>();\n\tprivate readonly ttlMs: number;\n\tprivate readonly maxEntries: number;\n\n\tconstructor(ttlMs: number, maxEntries = 32) {\n\t\tif (!Number.isFinite(ttlMs) || ttlMs <= 0) throw new Error(\"Cache TTL must be positive.\");\n\t\tif (!Number.isSafeInteger(maxEntries) || maxEntries < 1) {\n\t\t\tthrow new Error(\"Cache entry limit must be a positive integer.\");\n\t\t}\n\t\tthis.ttlMs = ttlMs;\n\t\tthis.maxEntries = maxEntries;\n\t}\n\n\tget size(): number {\n\t\treturn this.entries.size;\n\t}\n\n\tget(providerId: string, fingerprint: string, now = Date.now()): UsageReport | undefined {\n\t\tthis.sweepExpired(now);\n\t\treturn this.entries.get(cacheKey(providerId, fingerprint))?.report;\n\t}\n\n\tset(providerId: string, fingerprint: string, report: UsageReport, now = Date.now()): void {\n\t\tthis.sweepExpired(now);\n\t\tconst key = cacheKey(providerId, fingerprint);\n\t\tthis.entries.delete(key);\n\t\twhile (this.entries.size >= this.maxEntries) {\n\t\t\tconst oldest = this.entries.keys().next().value;\n\t\t\tif (oldest === undefined) break;\n\t\t\tthis.entries.delete(oldest);\n\t\t}\n\t\tthis.entries.set(key, { createdAt: now, report });\n\t}\n\n\tclearProvider(providerId: string): void {\n\t\tfor (const key of this.entries.keys()) {\n\t\t\tif (key.startsWith(`${providerId}:`)) this.entries.delete(key);\n\t\t}\n\t}\n\n\tclear(): void {\n\t\tthis.entries.clear();\n\t}\n\n\tprivate sweepExpired(now: number): void {\n\t\tfor (const [key, entry] of this.entries) {\n\t\t\tif (now - entry.createdAt >= this.ttlMs) this.entries.delete(key);\n\t\t}\n\t}\n}\n\nexport function fingerprintResolvedAuth(\n\tauth: { apiKey?: string; headers?: Record<string, string> },\n\tsalt: Uint8Array,\n): string {\n\tconst headers = Object.entries(auth.headers ?? {})\n\t\t.map(([name, value]) => [name.toLowerCase(), value] as const)\n\t\t.sort(([left], [right]) => left.localeCompare(right));\n\tconst canonical = JSON.stringify({ apiKey: auth.apiKey ?? \"\", headers });\n\treturn createHmac(\"sha256\", salt).update(canonical).digest(\"hex\");\n}\n\nexport async function runWithConcurrency<T, R>(\n\titems: readonly T[],\n\tlimit: number,\n\tworker: (item: T, index: number, signal: AbortSignal) => Promise<R>,\n\tsignal: AbortSignal,\n): Promise<PromiseSettledResult<R>[]> {\n\tif (signal.aborted) throw abortError();\n\tif (!Number.isSafeInteger(limit) || limit < 1)\n\t\tthrow new Error(\"Concurrency limit must be positive.\");\n\n\tconst results = new Array<PromiseSettledResult<R>>(items.length);\n\tlet nextIndex = 0;\n\tconst runners = Array.from({ length: Math.min(limit, items.length) }, async () => {\n\t\twhile (nextIndex < items.length) {\n\t\t\tif (signal.aborted) throw abortError();\n\t\t\tconst index = nextIndex;\n\t\t\tnextIndex += 1;\n\t\t\ttry {\n\t\t\t\tresults[index] = {\n\t\t\t\t\tstatus: \"fulfilled\",\n\t\t\t\t\tvalue: await worker(items[index] as T, index, signal),\n\t\t\t\t};\n\t\t\t} catch (reason) {\n\t\t\t\tresults[index] = { status: \"rejected\", reason };\n\t\t\t}\n\t\t}\n\t});\n\n\tawait Promise.all(runners);\n\tif (signal.aborted) throw abortError();\n\treturn results;\n}\n\nexport async function awaitWithDeadline<T>(\n\toperation: Promise<T>,\n\tsignal: AbortSignal,\n\ttimeoutMs: number,\n\tdescription: string,\n): Promise<T> {\n\tif (signal.aborted) throw abortError();\n\tconst controller = new AbortController();\n\tconst abortFromCaller = () => controller.abort();\n\tsignal.addEventListener(\"abort\", abortFromCaller, { once: true });\n\tconst timeout = setTimeout(() => controller.abort(), timeoutMs);\n\ttry {\n\t\treturn await Promise.race([\n\t\t\toperation,\n\t\t\tnew Promise<never>((_resolve, reject) => {\n\t\t\t\tcontroller.signal.addEventListener(\n\t\t\t\t\t\"abort\",\n\t\t\t\t\t() => {\n\t\t\t\t\t\treject(\n\t\t\t\t\t\t\tsignal.aborted\n\t\t\t\t\t\t\t\t? abortError()\n\t\t\t\t\t\t\t\t: Object.assign(\n\t\t\t\t\t\t\t\t\t\tnew Error(`Timed out after ${Math.round(timeoutMs / 1000)}s ${description}.`),\n\t\t\t\t\t\t\t\t\t\t{ name: \"TimeoutError\" },\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\t{ once: true },\n\t\t\t\t);\n\t\t\t}),\n\t\t]);\n\t} finally {\n\t\tclearTimeout(timeout);\n\t\tsignal.removeEventListener(\"abort\", abortFromCaller);\n\t}\n}\n\nexport function sanitizeDisplayText(value: string, maxChars = 160): string {\n\tlet result = \"\";\n\tfor (let index = 0; index < value.length; ) {\n\t\tconst codePoint = value.codePointAt(index) ?? 0;\n\t\tconst character = String.fromCodePoint(codePoint);\n\t\tif (codePoint === 0x1b || codePoint === 0x9b || codePoint === 0x9d) {\n\t\t\tindex = skipTerminalEscape(value, index, codePoint);\n\t\t\tcontinue;\n\t\t}\n\t\tif (codePoint <= 0x1f || (codePoint >= 0x7f && codePoint <= 0x9f)) {\n\t\t\tif (codePoint === 0x09 || codePoint === 0x0a || codePoint === 0x0d) result += \" \";\n\t\t\tindex += character.length;\n\t\t\tcontinue;\n\t\t}\n\t\tresult += character;\n\t\tindex += character.length;\n\t}\n\treturn truncate(result.replace(/\\s+/gu, \" \").trim(), maxChars);\n}\n\nexport function redactUsageError(value: string, secrets: readonly string[] = []): string {\n\tlet redacted = value;\n\tfor (const secret of [...new Set(secrets)].filter(Boolean).sort((a, b) => b.length - a.length)) {\n\t\tredacted = redacted.replace(new RegExp(escapeRegExp(secret), \"g\"), \"<redacted>\");\n\t}\n\tredacted = redacted\n\t\t.replace(/Bearer\\s+[A-Za-z0-9._~+/=-]+/gi, \"Bearer <redacted>\")\n\t\t.replace(/\"(?:access_token|refresh_token|api_key)\"\\s*:\\s*\"[^\"]+\"/gi, (match) => {\n\t\t\tconst separator = match.indexOf(\":\");\n\t\t\treturn `${match.slice(0, separator + 1)}\"<redacted>\"`;\n\t\t});\n\treturn sanitizeDisplayText(redacted, 600);\n}\n\nexport function errorMessage(error: unknown): string {\n\treturn sanitizeDisplayText(error instanceof Error ? error.message : String(error), 600);\n}\n\nexport function abortError(): Error {\n\treturn Object.assign(new Error(\"Usage query aborted.\"), { name: \"AbortError\" });\n}\n\nfunction skipTerminalEscape(value: string, start: number, codePoint: number): number {\n\tlet index = start + 1;\n\tconst next = value.charCodeAt(index);\n\tconst isOsc = codePoint === 0x9d || (codePoint === 0x1b && next === 0x5d);\n\tif (isOsc) {\n\t\tif (codePoint === 0x1b) index += 1;\n\t\twhile (index < value.length) {\n\t\t\tconst current = value.charCodeAt(index);\n\t\t\tif (current === 0x07) return index + 1;\n\t\t\tif (current === 0x1b && value.charCodeAt(index + 1) === 0x5c) return index + 2;\n\t\t\tindex += 1;\n\t\t}\n\t\treturn index;\n\t}\n\tconst isCsi = codePoint === 0x9b || (codePoint === 0x1b && next === 0x5b);\n\tif (isCsi) {\n\t\tif (codePoint === 0x1b) index += 1;\n\t\twhile (index < value.length) {\n\t\t\tconst current = value.charCodeAt(index);\n\t\t\tindex += 1;\n\t\t\tif (current >= 0x40 && current <= 0x7e) break;\n\t\t}\n\t\treturn index;\n\t}\n\treturn Math.min(value.length, start + (codePoint === 0x1b ? 2 : 1));\n}\n\nfunction cacheKey(providerId: string, fingerprint: string): string {\n\treturn `${providerId}:${fingerprint}`;\n}\n\nfunction escapeRegExp(value: string): string {\n\treturn value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction truncate(value: string, maxChars: number): string {\n\tif (value.length <= maxChars) return value;\n\treturn `${value.slice(0, maxChars - 1)}\u2026`;\n}\n", "import type { OAuthCredential } from \"@earendil-works/pi-ai\";\nimport {\n\ttype ExtensionAPI,\n\ttype ExtensionContext,\n\treadStoredCredential,\n} from \"@earendil-works/pi-coding-agent\";\n\nexport const OAUTH_CREDENTIAL_SOURCE_CHANNEL = \"oauth:credential-source:v1\";\n\nexport type StoredCredentialReader = (providerId: string) => unknown;\n\nexport type OAuthCredentialCandidates =\n\t| { ok: true; candidates: readonly OAuthCredential[]; offeredCount?: number }\n\t| { ok: false };\n\nexport type OAuthCredentialCandidateReader = (\n\tctx: ExtensionContext,\n\tproviderId: string,\n) => OAuthCredentialCandidates;\n\nexport function createOAuthCredentialCandidateReader(\n\tpi: ExtensionAPI,\n\tcredentialReader: StoredCredentialReader = readStoredCredential,\n): OAuthCredentialCandidateReader {\n\treturn (ctx, providerId) =>\n\t\tcollectOAuthCredentialCandidates(pi, ctx, providerId, credentialReader);\n}\n\nexport function collectOAuthCredentialCandidates(\n\tpi: Pick<ExtensionAPI, \"events\">,\n\tctx: ExtensionContext,\n\tproviderId: string,\n\tcredentialReader: StoredCredentialReader = readStoredCredential,\n): OAuthCredentialCandidates {\n\tconst candidates: OAuthCredential[] = [];\n\tlet collecting = true;\n\tconst request = Object.freeze({\n\t\tsession: ctx.sessionManager,\n\t\tprovider: providerId,\n\t\toffer(candidate: unknown) {\n\t\t\tif (!collecting) return;\n\t\t\tconst clone = cloneOAuthCredential(candidate);\n\t\t\tif (clone) candidates.push(clone);\n\t\t},\n\t});\n\ttry {\n\t\tpi.events.emit(OAUTH_CREDENTIAL_SOURCE_CHANNEL, request);\n\t} catch {\n\t\treturn { ok: false };\n\t} finally {\n\t\tcollecting = false;\n\t}\n\tconst offeredCount = candidates.length;\n\ttry {\n\t\tconst fallback = cloneOAuthCredential(credentialReader(providerId));\n\t\tif (fallback) candidates.push(fallback);\n\t} catch {\n\t\t// A malformed or unavailable standalone credential is equivalent to no fallback.\n\t}\n\treturn { ok: true, candidates, offeredCount };\n}\n\nexport function fallbackOAuthCredentialCandidates(\n\tproviderId: string,\n\tcredentialReader: StoredCredentialReader,\n): OAuthCredentialCandidates {\n\ttry {\n\t\tconst credential = cloneOAuthCredential(credentialReader(providerId));\n\t\treturn { ok: true, candidates: credential ? [credential] : [], offeredCount: 0 };\n\t} catch {\n\t\treturn { ok: true, candidates: [], offeredCount: 0 };\n\t}\n}\n\nfunction cloneOAuthCredential(value: unknown): OAuthCredential | undefined {\n\ttry {\n\t\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\t\tconst clone = structuredClone(value) as OAuthCredential;\n\t\tif (!clone || typeof clone !== \"object\" || Array.isArray(clone)) return undefined;\n\t\tif (clone.type !== \"oauth\") return undefined;\n\t\tif (typeof clone.access !== \"string\" || !clone.access) return undefined;\n\t\tif (typeof clone.refresh !== \"string\" || !clone.refresh) return undefined;\n\t\tif (typeof clone.expires !== \"number\" || !Number.isFinite(clone.expires)) return undefined;\n\t\treturn clone;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n", "import { randomBytes } from \"node:crypto\";\nimport { type ExtensionContext, readStoredCredential } from \"@earendil-works/pi-coding-agent\";\nimport { errorMessage, fingerprintResolvedAuth, redactUsageError } from \"./core.js\";\nimport {\n\tfallbackOAuthCredentialCandidates,\n\ttype OAuthCredentialCandidateReader,\n} from \"./oauth-credential-source.js\";\nimport { normalizeCodexBackendPayload } from \"./providers/codex.js\";\nimport { normalizeGitHubCopilotUsagePayload } from \"./providers/github-copilot.js\";\nimport { normalizeOpenCodeZenPayload } from \"./providers/opencode-zen.js\";\nimport { normalizeOpenRouterKeyPayload } from \"./providers/openrouter.js\";\nimport type {\n\tCodexBackendPayload,\n\tGitHubCopilotUsagePayload,\n\tOpenCodeZenPayload,\n\tOpenRouterKeyPayload,\n\tPiModel,\n\tResolvedUsageAuth,\n\tUsageProviderAdapter,\n\tUsageReport,\n} from \"./types.js\";\n\nconst CODEX_USAGE_URL = \"https://chatgpt.com/backend-api/wham/usage\";\nconst GITHUB_COPILOT_USAGE_URL = \"https://api.github.com/copilot_internal/user\";\nconst OPENROUTER_KEY_URL = \"https://openrouter.ai/api/v1/key\";\nconst OPENCODE_GO_USAGE_URL = \"https://opencode.ai/zen/go/v1/usage\";\nconst MAX_SUCCESS_BODY_BYTES = 64 * 1024;\nconst MAX_ERROR_BODY_BYTES = 4 * 1024;\n\nexport const AUTH_FINGERPRINT_SALT = randomBytes(32);\n\nexport const SUPPORTED_ADAPTERS: readonly UsageProviderAdapter[] = [\n\t{\n\t\tid: \"openai-codex\",\n\t\tdisplayName: \"OpenAI Codex\",\n\t\tsemantics: {\n\t\t\tkind: \"consumer-subscription\",\n\t\t\tlabel: \"ChatGPT subscription limits\",\n\t\t},\n\t\tasync query(auth, signal, timeoutMs) {\n\t\t\tconst payload = await fetchProviderJson(\n\t\t\t\tCODEX_USAGE_URL,\n\t\t\t\tauth,\n\t\t\t\tsignal,\n\t\t\t\ttimeoutMs,\n\t\t\t\t\"Codex usage endpoint\",\n\t\t\t);\n\t\t\treturn normalizeCodexBackendPayload(payload as CodexBackendPayload, Date.now());\n\t\t},\n\t},\n\t{\n\t\tid: \"github-copilot\",\n\t\tdisplayName: \"GitHub Copilot\",\n\t\tsemantics: {\n\t\t\tkind: \"consumer-subscription\",\n\t\t\tlabel: \"GitHub Copilot account allowance\",\n\t\t},\n\t\tasync query(auth, signal, timeoutMs) {\n\t\t\tconst payload = await fetchProviderJson(\n\t\t\t\tGITHUB_COPILOT_USAGE_URL,\n\t\t\t\tauth,\n\t\t\t\tsignal,\n\t\t\t\ttimeoutMs,\n\t\t\t\t\"GitHub Copilot usage endpoint\",\n\t\t\t);\n\t\t\treturn normalizeGitHubCopilotUsagePayload(payload as GitHubCopilotUsagePayload, Date.now());\n\t\t},\n\t},\n\t{\n\t\tid: \"openrouter\",\n\t\tdisplayName: \"OpenRouter\",\n\t\tsemantics: { kind: \"api-key\", label: \"API-key spend limits\" },\n\t\tasync query(auth, signal, timeoutMs) {\n\t\t\tconst payload = await fetchProviderJson(\n\t\t\t\tOPENROUTER_KEY_URL,\n\t\t\t\tauth,\n\t\t\t\tsignal,\n\t\t\t\ttimeoutMs,\n\t\t\t\t\"OpenRouter key endpoint\",\n\t\t\t);\n\t\t\treturn normalizeOpenRouterKeyPayload(payload as OpenRouterKeyPayload, Date.now());\n\t\t},\n\t},\n\t{\n\t\tid: \"opencode-go\",\n\t\tdisplayName: \"OpenCode Go\",\n\t\tsemantics: { kind: \"consumer-subscription\", label: \"OpenCode Zen plan usage\" },\n\t\tasync query(auth, signal, timeoutMs) {\n\t\t\tconst payload = await fetchProviderJson(\n\t\t\t\tOPENCODE_GO_USAGE_URL,\n\t\t\t\tauth,\n\t\t\t\tsignal,\n\t\t\t\ttimeoutMs,\n\t\t\t\t\"OpenCode Zen usage endpoint\",\n\t\t\t);\n\t\t\treturn normalizeOpenCodeZenPayload(payload as OpenCodeZenPayload, Date.now());\n\t\t},\n\t},\n];\n\nexport function adapterForProvider(\n\tproviderId: string | undefined,\n): UsageProviderAdapter | undefined {\n\treturn SUPPORTED_ADAPTERS.find((adapter) => adapter.id === providerId);\n}\n\nexport function isStaleExtensionContextError(error: unknown): boolean {\n\treturn (\n\t\terror instanceof Error &&\n\t\terror.message.includes(\"This extension ctx is stale after session replacement or reload\")\n\t);\n}\n\nexport async function resolveUsageAuth(\n\tctx: ExtensionContext,\n\tadapter: UsageProviderAdapter,\n\tsalt: Uint8Array = AUTH_FINGERPRINT_SALT,\n\tcredentialReader: StoredCredentialReader = readStoredCredential,\n\tcandidateReader?: OAuthCredentialCandidateReader,\n): Promise<ResolvedUsageAuth | undefined> {\n\tif (ctx.model?.provider === adapter.id && !hasOfficialOrigin(ctx.model, adapter.id)) {\n\t\tthrow new Error(\n\t\t\t`${adapter.displayName} usage cannot send a custom provider base URL credential to the official usage endpoint.`,\n\t\t);\n\t}\n\n\tconst model = candidateModels(ctx, adapter.id).find((candidate) =>\n\t\thasOfficialOrigin(candidate, adapter.id),\n\t);\n\tif (!model) return undefined;\n\t// SAFETY: Pi exposes the required auth methods at runtime, and checks below narrow them before use.\n\tconst registry = ctx.modelRegistry as unknown as UsageAuthRegistry;\n\tlet modelAuth: RequestAuth | undefined;\n\tif (ctx.model?.provider === adapter.id && typeof registry.getApiKeyAndHeaders === \"function\") {\n\t\tconst result = await registry.getApiKeyAndHeaders(ctx.model);\n\t\tif (!result.ok) throw new Error(redactUsageError(result.error));\n\t\tif (authorizationFrom(result)) modelAuth = result;\n\t}\n\tif (typeof registry.getProviderAuth !== \"function\") {\n\t\tthrow new Error(\"pi-usage requires Pi 0.81.0 or newer to validate resolved provider auth.\");\n\t}\n\tconst providerResult = await registry.getProviderAuth(adapter.id);\n\tif (\n\t\tproviderResult?.auth.baseUrl &&\n\t\t!hasOfficialUrlOrigin(providerResult.auth.baseUrl, adapter.id)\n\t) {\n\t\tthrow new Error(\n\t\t\t`${adapter.displayName} usage cannot send a proxy-resolved credential to the official usage endpoint.`,\n\t\t);\n\t}\n\tconst auth = modelAuth ?? providerResult?.auth;\n\tif (!auth) return undefined;\n\tif (adapter.id === \"github-copilot\") {\n\t\tconst offered = candidateReader\n\t\t\t? candidateReader(ctx, adapter.id)\n\t\t\t: fallbackOAuthCredentialCandidates(adapter.id, credentialReader);\n\t\tif (!offered.ok) {\n\t\t\tthrow new Error(\"GitHub Copilot OAuth credential discovery failed closed.\");\n\t\t}\n\t\treturn resolveGitHubCopilotUsageAuth(\n\t\t\tauth,\n\t\t\tmodel,\n\t\t\tsalt,\n\t\t\toffered.candidates,\n\t\t\toffered.offeredCount === 0,\n\t\t);\n\t}\n\tconst authorization = authorizationFrom(auth);\n\tif (!authorization) return undefined;\n\tconst headers = { Authorization: authorization };\n\tconst secrets = [auth.apiKey, headerValue(auth.headers, \"Authorization\"), authorization].filter(\n\t\t(value): value is string => Boolean(value),\n\t);\n\treturn {\n\t\tapiKey: auth.apiKey,\n\t\theaders,\n\t\tfingerprint: fingerprintResolvedAuth({ headers }, salt),\n\t\tsecrets,\n\t\tmodel,\n\t};\n}\n\nexport async function queryProviderUsage(\n\tadapter: UsageProviderAdapter,\n\tauth: ResolvedUsageAuth,\n\tsignal: AbortSignal,\n\ttimeoutMs: number,\n): Promise<UsageReport> {\n\ttry {\n\t\treturn await adapter.query(auth, signal, timeoutMs);\n\t} catch (error) {\n\t\tif (isStaleExtensionContextError(error) || isAbortError(error)) throw error;\n\t\tthrow new Error(redactUsageError(errorMessage(error), auth.secrets));\n\t}\n}\n\nexport function providerIsConfigured(ctx: ExtensionContext, providerId: string): boolean {\n\ttry {\n\t\treturn ctx.modelRegistry.getProviderAuthStatus(providerId).configured;\n\t} catch {\n\t\treturn candidateModels(ctx, providerId).length > 0;\n\t}\n}\n\nfunction candidateModels(ctx: ExtensionContext, providerId: string): PiModel[] {\n\tconst candidates: PiModel[] = [];\n\tconst seen = new Set<string>();\n\tconst add = (model: PiModel | undefined) => {\n\t\tif (!model || model.provider !== providerId) return;\n\t\tconst key = `${model.provider}/${model.id}`;\n\t\tif (seen.has(key)) return;\n\t\tseen.add(key);\n\t\tcandidates.push(model);\n\t};\n\tadd(ctx.model);\n\tfor (const model of ctx.modelRegistry.getAvailable()) add(model);\n\tfor (const model of ctx.modelRegistry.getAll()) add(model);\n\treturn candidates;\n}\n\nexport async function fetchProviderJson(\n\turl: string,\n\tauth: ResolvedUsageAuth,\n\tsignal: AbortSignal,\n\ttimeoutMs: number,\n\tdescription: string,\n\trequest: {\n\t\tmethod?: \"GET\" | \"POST\";\n\t\tbody?: Record<string, unknown>;\n\t} = {},\n): Promise<Record<string, unknown>> {\n\tconst controller = new AbortController();\n\tlet timedOut = false;\n\tconst abortFromCaller = () => controller.abort();\n\tif (signal.aborted) controller.abort();\n\telse signal.addEventListener(\"abort\", abortFromCaller, { once: true });\n\tconst timeout = setTimeout(() => {\n\t\ttimedOut = true;\n\t\tcontroller.abort();\n\t}, timeoutMs);\n\ttry {\n\t\tconst headers = { ...auth.headers };\n\t\tif (!hasHeader(headers, \"User-Agent\")) headers[\"User-Agent\"] = \"pi-usage\";\n\t\tif (request.body && !hasHeader(headers, \"Content-Type\")) {\n\t\t\theaders[\"Content-Type\"] = \"application/json\";\n\t\t}\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: request.method ?? \"GET\",\n\t\t\theaders,\n\t\t\t...(request.body ? { body: JSON.stringify(request.body) } : {}),\n\t\t\tsignal: controller.signal,\n\t\t});\n\t\tif (controller.signal.aborted)\n\t\t\tthrow Object.assign(new Error(\"Usage query aborted.\"), { name: \"AbortError\" });\n\t\tconst text = await readBoundedResponse(\n\t\t\tresponse,\n\t\t\tresponse.ok ? MAX_SUCCESS_BODY_BYTES : MAX_ERROR_BODY_BYTES,\n\t\t\t!response.ok,\n\t\t\tdescription,\n\t\t);\n\t\tif (controller.signal.aborted)\n\t\t\tthrow Object.assign(new Error(\"Usage query aborted.\"), { name: \"AbortError\" });\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(\n\t\t\t\t`${description} returned ${response.status} ${response.statusText}: ${redactUsageError(text, auth.secrets)}`,\n\t\t\t);\n\t\t}\n\t\tlet parsed: unknown;\n\t\ttry {\n\t\t\tparsed = JSON.parse(text) as unknown;\n\t\t} catch (error) {\n\t\t\tthrow new Error(`${description} returned invalid JSON: ${errorMessage(error)}`);\n\t\t}\n\t\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\t\tthrow new Error(`${description} response was not an object.`);\n\t\t}\n\t\treturn parsed as Record<string, unknown>;\n\t} catch (error) {\n\t\tif (timedOut) {\n\t\t\tthrow new Error(`Timed out after ${Math.round(timeoutMs / 1000)}s while fetching usage.`);\n\t\t}\n\t\tif (signal.aborted)\n\t\t\tthrow Object.assign(new Error(\"Usage query aborted.\"), { name: \"AbortError\" });\n\t\tthrow error;\n\t} finally {\n\t\tclearTimeout(timeout);\n\t\tsignal.removeEventListener(\"abort\", abortFromCaller);\n\t}\n}\n\nasync function readBoundedResponse(\n\tresponse: Response,\n\tmaxBytes: number,\n\ttruncateOverflow: boolean,\n\tdescription: string,\n): Promise<string> {\n\tif (!response.body) return \"\";\n\tconst reader = response.body.getReader();\n\tconst chunks: Uint8Array[] = [];\n\tlet total = 0;\n\tlet truncated = false;\n\ttry {\n\t\twhile (true) {\n\t\t\tconst { done, value } = await reader.read();\n\t\t\tif (done) break;\n\t\t\tconst remaining = maxBytes - total;\n\t\t\tif (value.byteLength > remaining) {\n\t\t\t\tif (remaining > 0) chunks.push(value.subarray(0, remaining));\n\t\t\t\ttotal = maxBytes;\n\t\t\t\ttruncated = true;\n\t\t\t\tawait reader.cancel();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tchunks.push(value);\n\t\t\ttotal += value.byteLength;\n\t\t}\n\t} finally {\n\t\treader.releaseLock();\n\t}\n\tif (truncated && !truncateOverflow) {\n\t\tthrow new Error(`${description} response exceeded ${maxBytes} bytes.`);\n\t}\n\tconst body = new Uint8Array(total);\n\tlet offset = 0;\n\tfor (const chunk of chunks) {\n\t\tbody.set(chunk, offset);\n\t\toffset += chunk.byteLength;\n\t}\n\tconst text = new TextDecoder().decode(body);\n\treturn truncated ? `${text}\u2026` : text;\n}\n\ntype RequestAuth = {\n\tapiKey?: string;\n\theaders?: Record<string, string | null>;\n};\n\ntype StoredCredentialReader = (providerId: string) => unknown;\n\ntype UsageAuthRegistry = {\n\tgetApiKeyAndHeaders?(\n\t\tmodel: PiModel,\n\t): Promise<({ ok: true } & RequestAuth) | { ok: false; error: string }>;\n\tgetProviderAuth?(providerId: string): Promise<\n\t\t| {\n\t\t\t\tauth: RequestAuth & { baseUrl?: string };\n\t\t }\n\t\t| undefined\n\t>;\n};\n\nfunction resolveGitHubCopilotUsageAuth(\n\tauth: RequestAuth,\n\tmodel: PiModel,\n\tsalt: Uint8Array,\n\tcandidates: readonly unknown[],\n\tstandaloneFallback: boolean,\n): ResolvedUsageAuth {\n\tconst resolvedAccess = bearerToken(headerValue(auth.headers, \"Authorization\")) ?? auth.apiKey;\n\tif (!resolvedAccess) throw new Error(\"GitHub Copilot OAuth credentials were incomplete.\");\n\tlet sawOAuth = false;\n\tlet sawMatchingAccess = false;\n\tlet sawIncompleteMatch = false;\n\tlet sawEnterpriseMatch = false;\n\tconst matches = new Map<string, { refresh: string; storedAccess: string }>();\n\tfor (const candidate of candidates) {\n\t\ttry {\n\t\t\tconst credential = asObject(candidate);\n\t\t\tif (credential?.type !== \"oauth\") continue;\n\t\t\tsawOAuth = true;\n\t\t\tconst storedAccess =\n\t\t\t\ttypeof credential.access === \"string\" && credential.access ? credential.access : undefined;\n\t\t\tif (storedAccess !== resolvedAccess) continue;\n\t\t\tsawMatchingAccess = true;\n\t\t\tconst enterpriseUrl = credential.enterpriseUrl;\n\t\t\tif (\n\t\t\t\ttypeof enterpriseUrl === \"string\" &&\n\t\t\t\tenterpriseUrl &&\n\t\t\t\t!isPublicGitHubDomain(enterpriseUrl)\n\t\t\t) {\n\t\t\t\tsawEnterpriseMatch = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst refresh =\n\t\t\t\ttypeof credential.refresh === \"string\" && credential.refresh\n\t\t\t\t\t? credential.refresh\n\t\t\t\t\t: undefined;\n\t\t\tif (!refresh) {\n\t\t\t\tsawIncompleteMatch = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tmatches.set(`${storedAccess.length}:${storedAccess}${refresh}`, { refresh, storedAccess });\n\t\t} catch {\n\t\t\t// Malformed candidates never authorize a provider request.\n\t\t}\n\t}\n\tif (sawEnterpriseMatch) {\n\t\tthrow new Error(\"GitHub Copilot usage does not yet support GitHub Enterprise accounts.\");\n\t}\n\tif (sawIncompleteMatch) throw new Error(\"GitHub Copilot OAuth credentials were incomplete.\");\n\tif (matches.size > 1) {\n\t\tthrow new Error(\n\t\t\t\"Conflicting OAuth credentials match the active GitHub Copilot runtime account.\",\n\t\t);\n\t}\n\tconst match = matches.values().next().value;\n\tif (!match) {\n\t\tif (!sawOAuth) {\n\t\t\tthrow new Error(\n\t\t\t\tstandaloneFallback\n\t\t\t\t\t? \"GitHub Copilot usage requires the OAuth account configured through Pi /login.\"\n\t\t\t\t\t: \"GitHub Copilot usage requires an OAuth account configured through Pi /login or a compatible credential source.\",\n\t\t\t);\n\t\t}\n\t\tif (sawMatchingAccess) throw new Error(\"GitHub Copilot OAuth credentials were incomplete.\");\n\t\tthrow new Error(\n\t\t\tstandaloneFallback\n\t\t\t\t? \"The active GitHub Copilot runtime account does not match Pi's stored OAuth account.\"\n\t\t\t\t: \"The active GitHub Copilot runtime account does not match any available OAuth account.\",\n\t\t);\n\t}\n\tconst { refresh, storedAccess } = match;\n\tconst authorization = `Bearer ${refresh}`;\n\tconst headers = {\n\t\tAuthorization: authorization,\n\t\t\"X-GitHub-Api-Version\": \"2025-05-01\",\n\t};\n\treturn {\n\t\tapiKey: refresh,\n\t\theaders,\n\t\tfingerprint: fingerprintResolvedAuth({ headers }, salt),\n\t\tsecrets: [refresh, storedAccess, resolvedAccess, authorization],\n\t\tmodel,\n\t};\n}\n\nfunction authorizationFrom(auth: RequestAuth): string | undefined {\n\treturn (\n\t\theaderValue(auth.headers, \"Authorization\") ??\n\t\t(auth.apiKey ? `Bearer ${auth.apiKey}` : undefined)\n\t);\n}\n\nfunction bearerToken(authorization: string | undefined): string | undefined {\n\tconst match = /^Bearer\\s+(.+)$/iu.exec(authorization ?? \"\");\n\treturn match?.[1];\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\treturn value as Record<string, unknown>;\n}\n\nfunction isPublicGitHubDomain(value: string): boolean {\n\ttry {\n\t\tconst url = new URL(value.includes(\"://\") ? value : `https://${value}`);\n\t\treturn url.hostname.toLowerCase() === \"github.com\";\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction hasOfficialOrigin(model: PiModel, providerId: string): boolean {\n\treturn hasOfficialUrlOrigin(model.baseUrl, providerId);\n}\n\nfunction hasOfficialUrlOrigin(value: string, providerId: string): boolean {\n\ttry {\n\t\tconst url = new URL(value);\n\t\tif (providerId === \"openai-codex\") return url.origin === \"https://chatgpt.com\";\n\t\tif (providerId === \"openrouter\") return url.origin === \"https://openrouter.ai\";\n\t\tif (providerId === \"opencode-go\") return url.origin === \"https://opencode.ai\";\n\t\tif (providerId === \"github-copilot\") {\n\t\t\treturn (\n\t\t\t\turl.protocol === \"https:\" && /^api\\.[a-z0-9-]+\\.githubcopilot\\.com$/u.test(url.hostname)\n\t\t\t);\n\t\t}\n\t\treturn false;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction headerValue(\n\theaders: Record<string, string | null> | undefined,\n\tname: string,\n): string | undefined {\n\tconst entry = Object.entries(headers ?? {}).find(\n\t\t([candidate]) => candidate.toLowerCase() === name.toLowerCase(),\n\t);\n\treturn entry?.[1] ?? undefined;\n}\n\nfunction hasHeader(headers: Record<string, string>, name: string): boolean {\n\treturn Object.keys(headers).some((key) => key.toLowerCase() === name.toLowerCase());\n}\n\nfunction isAbortError(error: unknown): boolean {\n\treturn error instanceof Error && error.name === \"AbortError\";\n}\n", "import { sanitizeDisplayText } from \"../core.js\";\nimport type { CodexBackendPayload, UsageBucket, UsageMetric, UsageReport } from \"../types.js\";\n\nexport function normalizeCodexBackendPayload(\n\tpayload: CodexBackendPayload,\n\tcapturedAt: number,\n): UsageReport {\n\tconst buckets: UsageBucket[] = [];\n\tnormalizeRateLimitGroup(buckets, \"codex\", \"Codex\", payload.rate_limit, false);\n\n\tconst additional = Array.isArray(payload.additional_rate_limits)\n\t\t? payload.additional_rate_limits\n\t\t: [];\n\tfor (const item of additional) {\n\t\tconst value = asObject(item);\n\t\tconst id = asString(value?.metered_feature) ?? asString(value?.limit_name);\n\t\tif (!value || !id) continue;\n\t\ttry {\n\t\t\tnormalizeRateLimitGroup(\n\t\t\t\tbuckets,\n\t\t\t\tid,\n\t\t\t\tasString(value.limit_name) ?? id,\n\t\t\t\tvalue.rate_limit,\n\t\t\t\ttrue,\n\t\t\t);\n\t\t} catch {\n\t\t\t// Optional provider-specific buckets must not hide otherwise useful primary data.\n\t\t}\n\t}\n\n\tconst metrics: UsageMetric[] = [];\n\tconst credits = asObject(payload.credits);\n\tif (credits?.has_credits === true) {\n\t\tif (credits.unlimited === true) {\n\t\t\tmetrics.push({ id: \"credits\", label: \"Credits\", value: \"unlimited\" });\n\t\t} else {\n\t\t\tconst balance = asNumber(credits.balance);\n\t\t\tif (balance !== undefined) {\n\t\t\t\tmetrics.push({ id: \"credits\", label: \"Credits\", value: balance, unit: \"count\" });\n\t\t\t} else {\n\t\t\t\tmetrics.push({ id: \"credits\", label: \"Credits\", value: \"available\" });\n\t\t\t}\n\t\t}\n\t} else if (credits?.has_credits === false) {\n\t\tmetrics.push({ id: \"credits\", label: \"Credits\", value: \"none\" });\n\t}\n\tconst resetCredits = asObject(payload.rate_limit_reset_credits);\n\tconst resetCount = asNonnegativeInteger(resetCredits?.available_count);\n\tif (resetCount !== undefined) {\n\t\tmetrics.push({\n\t\t\tid: \"reset-credits\",\n\t\t\tlabel: \"Usage limit resets\",\n\t\t\tvalue: resetCount,\n\t\t\tunit: \"count\",\n\t\t});\n\t}\n\tif (buckets.length === 0 && metrics.length === 0) {\n\t\tthrow new Error(\"Codex usage endpoint returned no displayable usage data.\");\n\t}\n\n\tconst planType = asString(payload.plan_type);\n\treturn {\n\t\tproviderId: \"openai-codex\",\n\t\tproviderName: \"OpenAI Codex\",\n\t\tcapturedAt,\n\t\tsource: \"codex-pi-auth\",\n\t\tsemantics: {\n\t\t\tkind: \"consumer-subscription\",\n\t\t\tlabel: \"ChatGPT subscription limits\",\n\t\t},\n\t\tbuckets,\n\t\tmetrics,\n\t\t...(planType ? { notes: [`Plan: ${planType}`] } : {}),\n\t};\n}\n\nfunction normalizeRateLimitGroup(\n\tbuckets: UsageBucket[],\n\tgroupId: string,\n\tgroupLabel: string,\n\traw: unknown,\n\toptional: boolean,\n): void {\n\tif (raw === undefined || raw === null) return;\n\tconst details = asObject(raw);\n\tif (!details) {\n\t\tif (optional) return;\n\t\tthrow new Error(\"Codex rate limit was not an object.\");\n\t}\n\taddWindow(buckets, groupId, groupLabel, \"primary\", details.primary_window);\n\taddWindow(buckets, groupId, groupLabel, \"secondary\", details.secondary_window);\n}\n\nfunction addWindow(\n\tbuckets: UsageBucket[],\n\tgroupId: string,\n\tgroupLabel: string,\n\tposition: \"primary\" | \"secondary\",\n\traw: unknown,\n): void {\n\tif (raw === undefined || raw === null) return;\n\tconst value = asObject(raw);\n\tif (!value) throw new Error(\"Codex rate-limit window was not an object.\");\n\tconst used = asNumber(value.used_percent);\n\tif (used === undefined) return;\n\tconst seconds = asNumber(value.limit_window_seconds);\n\tconst resetsAt = asNumber(value.reset_at);\n\tbuckets.push({\n\t\tid: `${groupId}:${position}`,\n\t\tlabel: position === \"primary\" ? \"Primary limit\" : \"Secondary limit\",\n\t\tgroupId,\n\t\tgroupLabel,\n\t\tmodelKeys: [groupId, groupLabel],\n\t\tused,\n\t\tremaining: 100 - clampPercent(used),\n\t\tlimit: 100,\n\t\tunit: \"percent\",\n\t\t...(seconds !== undefined && seconds > 0 ? { windowMinutes: Math.ceil(seconds / 60) } : {}),\n\t\t...(resetsAt !== undefined ? { resetsAt } : {}),\n\t});\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\treturn value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\treturn sanitizeDisplayText(value, 160) || undefined;\n}\n\nfunction asNumber(value: unknown): number | undefined {\n\tif (typeof value === \"number\" && Number.isFinite(value)) return value;\n\tif (typeof value === \"string\" && value.trim()) {\n\t\tconst parsed = Number(value);\n\t\treturn Number.isFinite(parsed) ? parsed : undefined;\n\t}\n\treturn undefined;\n}\n\nfunction asNonnegativeInteger(value: unknown): number | undefined {\n\tconst parsed = asNumber(value);\n\tif (parsed === undefined || !Number.isSafeInteger(parsed)) return undefined;\n\treturn Math.max(0, parsed);\n}\n\nfunction clampPercent(value: number): number {\n\treturn Math.min(100, Math.max(0, value));\n}\n", "import { sanitizeDisplayText } from \"../core.js\";\nimport type { GitHubCopilotUsagePayload, UsageBucket, UsageReport } from \"../types.js\";\n\nexport function normalizeGitHubCopilotUsagePayload(\n\tpayload: GitHubCopilotUsagePayload,\n\tcapturedAt: number,\n): UsageReport {\n\tconst snapshots = asObject(payload.quota_snapshots);\n\tconst premium = asObject(snapshots?.premium_interactions);\n\tconst metrics: UsageReport[\"metrics\"] = [];\n\tlet semanticsLabel: string;\n\tlet bucket: UsageBucket;\n\n\tif (premium) {\n\t\tconst tokenBasedBilling = premium.token_based_billing === true;\n\t\tconst id = tokenBasedBilling ? \"ai-credits\" : \"premium-requests\";\n\t\tconst label = tokenBasedBilling ? \"AI credits\" : \"Premium requests\";\n\t\tsemanticsLabel = tokenBasedBilling\n\t\t\t? \"GitHub Copilot AI Credits allowance\"\n\t\t\t: \"GitHub Copilot premium request quota\";\n\n\t\tif (premium.unlimited === true) {\n\t\t\tbucket = { id, label, unit: \"count\" };\n\t\t} else {\n\t\t\tconst entitlement = asNonnegativeNumber(premium.entitlement);\n\t\t\tconst rawRemaining =\n\t\t\t\tasFiniteNumber(premium.remaining) ?? asFiniteNumber(premium.quota_remaining);\n\t\t\tif (entitlement === undefined || rawRemaining === undefined) {\n\t\t\t\tthrow new Error(`GitHub Copilot ${label.toLowerCase()} quota was incomplete.`);\n\t\t\t}\n\t\t\tconst overageUsed = Math.max(\n\t\t\t\tasNonnegativeNumber(premium.overage_count) ?? 0,\n\t\t\t\tMath.max(0, -rawRemaining),\n\t\t\t);\n\t\t\tif (overageUsed > 0) {\n\t\t\t\tmetrics.push({\n\t\t\t\t\tid: \"overage-used\",\n\t\t\t\t\tlabel: \"Additional usage\",\n\t\t\t\t\tvalue: overageUsed,\n\t\t\t\t\tunit: \"count\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tbucket = {\n\t\t\t\tid,\n\t\t\t\tlabel,\n\t\t\t\tused: asNonnegativeNumber(premium.credits_used) ?? Math.max(0, entitlement - rawRemaining),\n\t\t\t\tremaining: Math.max(0, rawRemaining),\n\t\t\t\tlimit: entitlement,\n\t\t\t\tunit: \"count\",\n\t\t\t\tperiod: \"monthly\",\n\t\t\t\t...resetTimestamp(payload),\n\t\t\t};\n\t\t}\n\t} else {\n\t\tconst limited = asObject(payload.limited_user_quotas);\n\t\tconst monthly = asObject(payload.monthly_quotas);\n\t\tconst remaining = asNonnegativeNumber(limited?.chat);\n\t\tconst entitlement = asNonnegativeNumber(monthly?.chat);\n\t\tif (remaining === undefined || entitlement === undefined) {\n\t\t\tthrow new Error(\"GitHub Copilot usage response contained no supported quota.\");\n\t\t}\n\t\tsemanticsLabel = \"GitHub Copilot Free chat quota\";\n\t\tbucket = {\n\t\t\tid: \"chat-requests\",\n\t\t\tlabel: \"Chat requests\",\n\t\t\tused: Math.max(0, entitlement - remaining),\n\t\t\tremaining,\n\t\t\tlimit: entitlement,\n\t\t\tunit: \"count\",\n\t\t\tperiod: \"monthly\",\n\t\t\t...resetTimestamp(payload),\n\t\t};\n\t}\n\n\tconst notes: string[] = [];\n\tconst plan = asString(payload.copilot_plan) ?? asString(payload.access_type_sku);\n\tif (plan) notes.push(`Plan: ${plan}`);\n\n\treturn {\n\t\tproviderId: \"github-copilot\",\n\t\tproviderName: \"GitHub Copilot\",\n\t\tcapturedAt,\n\t\tsource: \"github-copilot-user\",\n\t\tsemantics: { kind: \"consumer-subscription\", label: semanticsLabel },\n\t\taccountLabel: asString(payload.login),\n\t\tbuckets: [bucket],\n\t\tmetrics,\n\t\t...(notes.length > 0 ? { notes } : {}),\n\t};\n}\n\nfunction resetTimestamp(payload: GitHubCopilotUsagePayload): { resetsAt?: number } {\n\tconst raw =\n\t\tasString(payload.quota_reset_date_utc) ??\n\t\tasString(payload.quota_reset_date) ??\n\t\tasString(payload.limited_user_reset_date);\n\tif (!raw) return {};\n\tconst milliseconds = Date.parse(raw);\n\treturn Number.isNaN(milliseconds) ? {} : { resetsAt: Math.floor(milliseconds / 1000) };\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\treturn value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\treturn sanitizeDisplayText(value, 80) || undefined;\n}\n\nfunction asFiniteNumber(value: unknown): number | undefined {\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) return undefined;\n\treturn value;\n}\n\nfunction asNonnegativeNumber(value: unknown): number | undefined {\n\tconst number = asFiniteNumber(value);\n\treturn number === undefined || number < 0 ? undefined : number;\n}\n", "import { sanitizeDisplayText } from \"../core.js\";\nimport type { OpenCodeZenPayload, UsageBucket, UsageReport } from \"../types.js\";\n\nconst ZEN_WINDOWS = [\n\t{ key: \"rolling\", label: \"Rolling\" },\n\t{ key: \"weekly\", label: \"Weekly\" },\n\t{ key: \"monthly\", label: \"Monthly\" },\n] as const;\n\nexport function normalizeOpenCodeZenPayload(\n\tpayload: OpenCodeZenPayload,\n\tcapturedAt: number,\n): UsageReport {\n\tconst usage = asObject(payload.usage);\n\tif (!usage) throw new Error(\"OpenCode Zen usage response was not an object.\");\n\n\tconst buckets: UsageBucket[] = [];\n\tconst notes: string[] = [];\n\tfor (const window of ZEN_WINDOWS) {\n\t\tconst raw = asObject(usage[window.key]);\n\t\tif (!raw) continue;\n\t\tconst status = asString(raw.status);\n\t\tif (status !== \"ok\" && status !== \"rate-limited\") {\n\t\t\tnotes.push(`${window.label} window unavailable (${status ?? \"unknown status\"}).`);\n\t\t\tcontinue;\n\t\t}\n\t\tconst used = asNonnegativeNumber(raw.percent);\n\t\tif (used === undefined) continue;\n\t\tconst resetsAt = asEpochSeconds(raw.resetsAt);\n\t\tbuckets.push({\n\t\t\tid: window.key,\n\t\t\tlabel: `${window.label} window`,\n\t\t\tused,\n\t\t\tremaining: 100 - clampPercent(used),\n\t\t\tlimit: 100,\n\t\t\tunit: \"percent\",\n\t\t\t...(resetsAt !== undefined ? { resetsAt } : {}),\n\t\t});\n\t}\n\tif (buckets.length === 0) {\n\t\tthrow new Error(\"OpenCode Zen usage endpoint returned no displayable usage data.\");\n\t}\n\n\treturn {\n\t\tproviderId: \"opencode-go\",\n\t\tproviderName: \"OpenCode Go\",\n\t\tcapturedAt,\n\t\tsource: \"opencode-zen-usage\",\n\t\tsemantics: {\n\t\t\tkind: \"consumer-subscription\",\n\t\t\tlabel: \"OpenCode Zen plan usage\",\n\t\t},\n\t\tbuckets,\n\t\tmetrics: [],\n\t\t...(notes.length > 0 ? { notes } : {}),\n\t};\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\treturn value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\treturn sanitizeDisplayText(value, 80) || undefined;\n}\n\nfunction asNonnegativeNumber(value: unknown): number | undefined {\n\tif (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) return undefined;\n\treturn value;\n}\n\nfunction asEpochSeconds(value: unknown): number | undefined {\n\tif (typeof value !== \"string\" || !value.trim()) return undefined;\n\tconst parsed = Date.parse(value);\n\tif (Number.isNaN(parsed)) return undefined;\n\treturn Math.floor(parsed / 1000);\n}\n\nfunction clampPercent(value: number): number {\n\treturn Math.min(100, Math.max(0, value));\n}\n", "import { sanitizeDisplayText } from \"../core.js\";\nimport type { OpenRouterKeyPayload, UsageBucket, UsageMetric, UsageReport } from \"../types.js\";\n\nexport function normalizeOpenRouterKeyPayload(\n\tpayload: OpenRouterKeyPayload,\n\tcapturedAt: number,\n): UsageReport {\n\tconst data = asObject(payload.data);\n\tif (!data) throw new Error(\"OpenRouter key response data was not an object.\");\n\n\tconst limit = asNonnegativeNumber(data.limit);\n\tconst remaining = asNonnegativeNumber(data.limit_remaining);\n\tconst period = asString(data.limit_reset);\n\tconst totalUsage = asNonnegativeNumber(data.usage);\n\tconst buckets: UsageBucket[] = [];\n\tif (limit !== undefined) {\n\t\tbuckets.push({\n\t\t\tid: \"key-limit\",\n\t\t\tlabel: \"Key limit\",\n\t\t\t...(remaining !== undefined ? { used: Math.max(0, limit - remaining), remaining } : {}),\n\t\t\tlimit,\n\t\t\tunit: \"usd\",\n\t\t\t...(period ? { period } : {}),\n\t\t});\n\t}\n\n\tconst metrics: UsageMetric[] = [];\n\taddUsageMetric(metrics, \"usage-daily\", \"Usage today\", data.usage_daily);\n\taddUsageMetric(metrics, \"usage-weekly\", \"Usage this week\", data.usage_weekly);\n\taddUsageMetric(metrics, \"usage-monthly\", \"Usage this month\", data.usage_monthly);\n\taddUsageMetric(metrics, \"usage-total\", \"All-time usage\", totalUsage);\n\tif (buckets.length === 0 && metrics.length === 0) {\n\t\tthrow new Error(\"OpenRouter key response returned no displayable usage data.\");\n\t}\n\n\tconst notes: string[] = [];\n\tif (data.limit === null) notes.push(\"No per-key spend cap\");\n\telse if (limit === undefined) notes.push(\"Per-key spend cap unavailable\");\n\tif (data.is_free_tier === true) notes.push(\"Free-tier API key\");\n\n\treturn {\n\t\tproviderId: \"openrouter\",\n\t\tproviderName: \"OpenRouter\",\n\t\tcapturedAt,\n\t\tsource: \"openrouter-key\",\n\t\tsemantics: { kind: \"api-key\", label: \"API-key spend limits\" },\n\t\taccountLabel: asString(data.label),\n\t\tbuckets,\n\t\tmetrics,\n\t\t...(notes.length > 0 ? { notes } : {}),\n\t};\n}\n\nfunction addUsageMetric(metrics: UsageMetric[], id: string, label: string, value: unknown): void {\n\tconst amount = typeof value === \"number\" ? asNonnegativeNumber(value) : undefined;\n\tif (amount === undefined) return;\n\tmetrics.push({ id, label, value: amount, unit: \"usd\" });\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\treturn value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\treturn sanitizeDisplayText(value, 80) || undefined;\n}\n\nfunction asNonnegativeNumber(value: unknown): number | undefined {\n\tif (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) return undefined;\n\treturn value;\n}\n", "import type {\n\tProviderUsageState,\n\tUsageBucket,\n\tUsageDisplayState,\n\tUsageModel,\n\tUsageReport,\n} from \"./types.js\";\n\nconst BAR_SEGMENTS = 20;\nconst VALUE_COLUMN = 29;\n\nexport function formatUsageReport(report: UsageReport, displayState: UsageDisplayState): string {\n\tconst stateLabel = displayState === \"current\" ? \"Current\" : \"Configured\";\n\tconst lines = [`${report.providerName} Usage \u00B7 ${stateLabel}`];\n\tif (report.accountLabel) lines.push(`Account: ${report.accountLabel}`);\n\tlines.push(`Semantics: ${report.semantics.label}`, \"\");\n\n\tif (report.providerId === \"openai-codex\") formatCodexReport(lines, report);\n\telse if (report.providerId === \"github-copilot\") formatGitHubCopilotReport(lines, report);\n\telse if (report.providerId === \"openrouter\") formatOpenRouterReport(lines, report);\n\telse if (report.providerId === \"opencode-go\") formatOpenCodeZenReport(lines, report);\n\telse formatGenericReport(lines, report);\n\n\tif (report.notes) {\n\t\tfor (const note of report.notes) lines.push(note);\n\t}\n\treturn lines.join(\"\\n\").trimEnd();\n}\n\nexport function formatUsageStatusline(report: UsageReport, model?: UsageModel): string | undefined {\n\tif (report.providerId === \"openai-codex\") return formatCodexStatusline(report, model);\n\tif (report.providerId === \"github-copilot\") return formatGitHubCopilotStatusline(report);\n\tif (report.providerId === \"openrouter\") {\n\t\tconst limit = report.buckets.find((bucket) => bucket.id === \"key-limit\");\n\t\tif (limit?.remaining !== undefined) return `openrouter ${formatUsd(limit.remaining)} left`;\n\t\tconst total = report.metrics.find((metric) => metric.id === \"usage-total\");\n\t\tif (typeof total?.value === \"number\") return `openrouter ${formatUsd(total.value)} used`;\n\t}\n\tif (report.providerId === \"opencode-go\") return formatOpenCodeZenStatusline(report);\n\treturn undefined;\n}\n\nexport function formatProviderStates(states: readonly ProviderUsageState[]): string {\n\treturn states\n\t\t.map((state) => {\n\t\t\tif (state.status === \"ready\") return formatUsageReport(state.report, state.displayState);\n\t\t\tconst label = state.displayState === \"current\" ? \"Current\" : \"Configured\";\n\t\t\tconst status =\n\t\t\t\tstate.status === \"auth-unavailable\"\n\t\t\t\t\t? \"Authentication unavailable\"\n\t\t\t\t\t: state.status === \"unsupported\"\n\t\t\t\t\t\t? \"Unsupported\"\n\t\t\t\t\t\t: \"Query failed\";\n\t\t\treturn `${state.providerName} \u00B7 ${label}\\n${status}: ${state.message}`;\n\t\t})\n\t\t.join(\"\\n\\n\");\n}\n\nfunction formatCodexReport(lines: string[], report: UsageReport): void {\n\tlet previousGroup: string | undefined;\n\tfor (const bucket of report.buckets) {\n\t\tconst group = bucket.groupId ?? bucket.id;\n\t\tif (group !== previousGroup && group !== \"codex\") {\n\t\t\tlines.push(`${bucket.groupLabel ?? group} limit:`);\n\t\t}\n\t\tpreviousGroup = group;\n\t\tconst fallback = bucket.id.endsWith(\":secondary\") ? \"weekly\" : \"5h\";\n\t\tconst label = `${formatWindowLabel(bucket.windowMinutes, fallback, false)} limit:`;\n\t\tlines.push(`${label.padEnd(VALUE_COLUMN)}${formatPercentBucket(bucket)}`);\n\t}\n\tfor (const metric of report.metrics) {\n\t\tif (metric.id === \"reset-credits\") {\n\t\t\tlines.push(`${\"Usage limit resets:\".padEnd(VALUE_COLUMN)}${metric.value} available`);\n\t\t} else if (metric.id === \"credits\") {\n\t\t\tlines.push(\n\t\t\t\t`${\"Credits:\".padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\nfunction formatGitHubCopilotReport(lines: string[], report: UsageReport): void {\n\tconst quota = findGitHubCopilotQuota(report);\n\tif (!quota || quota.limit === undefined || quota.remaining === undefined) {\n\t\tlines.push(`${`${quota?.label ?? \"Copilot quota\"}:`.padEnd(VALUE_COLUMN)}unlimited`);\n\t\treturn;\n\t}\n\tconst percent = percentRemaining(quota);\n\tconst reset = quota.resetsAt ? ` (resets ${formatReset(quota.resetsAt)})` : \"\";\n\tlines.push(\n\t\t`${`${quota.label}:`.padEnd(VALUE_COLUMN)}${quota.remaining} of ${quota.limit} left \u00B7 ${percent}%${reset}`,\n\t);\n\tconst overage = report.metrics.find((metric) => metric.id === \"overage-used\");\n\tif (typeof overage?.value === \"number\" && overage.value > 0) {\n\t\tlines.push(`${\"Additional usage:\".padEnd(VALUE_COLUMN)}${overage.value} ${quota.label}`);\n\t}\n}\n\nfunction formatGitHubCopilotStatusline(report: UsageReport): string {\n\tconst quota = findGitHubCopilotQuota(report);\n\tconst kind = compactGitHubCopilotQuotaKind(quota);\n\tif (!quota || quota.limit === undefined || quota.remaining === undefined) {\n\t\treturn `copilot ${kind} unlimited`;\n\t}\n\tconst overage = report.metrics.find((metric) => metric.id === \"overage-used\");\n\tconst overageSuffix =\n\t\ttypeof overage?.value === \"number\" && overage.value > 0 ? ` +${overage.value} over` : \"\";\n\treturn `copilot ${kind === \"premium\" ? \"\" : `${kind} `}${quota.remaining}/${quota.limit} ${percentRemaining(quota)}%${overageSuffix}`;\n}\n\nfunction findGitHubCopilotQuota(report: UsageReport): UsageBucket | undefined {\n\treturn report.buckets.find((bucket) =>\n\t\t[\"ai-credits\", \"premium-requests\", \"chat-requests\"].includes(bucket.id),\n\t);\n}\n\nfunction compactGitHubCopilotQuotaKind(bucket: UsageBucket | undefined): string {\n\tif (bucket?.id === \"ai-credits\") return \"credits\";\n\tif (bucket?.id === \"chat-requests\") return \"chat\";\n\treturn \"premium\";\n}\n\nfunction percentRemaining(bucket: UsageBucket): number {\n\tif (!bucket.limit || bucket.remaining === undefined) return 0;\n\treturn Math.round(clampPercent((bucket.remaining / bucket.limit) * 100));\n}\n\nfunction formatOpenRouterReport(lines: string[], report: UsageReport): void {\n\tconst limit = report.buckets.find((bucket) => bucket.id === \"key-limit\");\n\tif (limit) {\n\t\tconst period = limit.period ? ` (${limit.period})` : \"\";\n\t\tconst value =\n\t\t\tlimit.remaining === undefined\n\t\t\t\t? `${formatUsd(limit.limit ?? 0)} cap; remaining unavailable`\n\t\t\t\t: `${formatUsd(limit.remaining)} of ${formatUsd(limit.limit ?? 0)} left`;\n\t\tlines.push(`${`Key limit${period}:`.padEnd(VALUE_COLUMN)}${value}`);\n\t}\n\tfor (const metric of report.metrics) {\n\t\tlines.push(\n\t\t\t`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`,\n\t\t);\n\t}\n}\n\nfunction formatOpenCodeZenReport(lines: string[], report: UsageReport): void {\n\tfor (const bucket of report.buckets) {\n\t\tconst reset = bucket.resetsAt ? ` (resets ${formatReset(bucket.resetsAt)})` : \"\";\n\t\tconst used = bucket.used ?? \"unavailable\";\n\t\tlines.push(`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${used}% used${reset}`);\n\t}\n}\n\nfunction formatOpenCodeZenStatusline(report: UsageReport): string | undefined {\n\tconst parts = [\"zen\"];\n\tfor (const bucket of report.buckets) {\n\t\tif (bucket.used === undefined) continue;\n\t\tconst compact = bucket.id === \"rolling\" ? \"r\" : bucket.id === \"weekly\" ? \"w\" : \"m\";\n\t\tparts.push(`${clampPercent(bucket.used).toFixed(0)}% ${compact}`);\n\t}\n\treturn parts.length > 1 ? parts.join(\" \") : undefined;\n}\n\nfunction formatGenericReport(lines: string[], report: UsageReport): void {\n\tfor (const bucket of report.buckets) {\n\t\tlines.push(\n\t\t\t`${`${bucket.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(bucket.remaining ?? bucket.used ?? \"unavailable\", bucket.unit)}`,\n\t\t);\n\t}\n\tfor (const metric of report.metrics) {\n\t\tlines.push(\n\t\t\t`${`${metric.label}:`.padEnd(VALUE_COLUMN)}${formatMetricValue(metric.value, metric.unit)}`,\n\t\t);\n\t}\n}\n\nfunction formatCodexStatusline(report: UsageReport, model?: UsageModel): string | undefined {\n\tconst group = selectCodexGroup(report, model);\n\tif (!group) return formatCodexCreditsStatus(report);\n\tconst buckets = report.buckets.filter((bucket) => (bucket.groupId ?? bucket.id) === group);\n\tconst labelBucket = buckets[0];\n\tconst parts = [\n\t\tgroup === \"codex\" ? \"codex\" : `codex ${compactLimitLabel(labelBucket?.groupLabel ?? group)}`,\n\t];\n\tfor (const bucket of buckets) {\n\t\tif (bucket.remaining === undefined) continue;\n\t\tconst fallback = bucket.id.endsWith(\":secondary\") ? \"weekly\" : \"5h\";\n\t\tparts.push(\n\t\t\t`${clampPercent(bucket.remaining).toFixed(0)}% ${formatWindowLabel(bucket.windowMinutes, fallback, true)}`,\n\t\t);\n\t}\n\treturn parts.length > 1 ? parts.join(\" \") : formatCodexCreditsStatus(report);\n}\n\nfunction formatCodexCreditsStatus(report: UsageReport): string {\n\tconst credits = report.metrics.find((metric) => metric.id === \"credits\");\n\tif (!credits) return \"codex usage unavailable\";\n\tif (credits.value === \"none\") return \"codex no credits\";\n\tif (credits.value === \"available\") return \"codex credits available\";\n\tif (credits.value === \"unlimited\") return \"codex credits unlimited\";\n\treturn `codex ${formatMetricValue(credits.value, \"count\")} credits`;\n}\n\nfunction selectCodexGroup(report: UsageReport, model?: UsageModel): string | undefined {\n\tconst groups = [...new Set(report.buckets.map((bucket) => bucket.groupId ?? bucket.id))];\n\tif (model?.provider !== \"openai-codex\") {\n\t\treturn groups.includes(\"codex\") ? \"codex\" : groups[0];\n\t}\n\tconst modelKeys = normalizedModelKeys(model);\n\tfor (const group of groups) {\n\t\tconst bucket = report.buckets.find(\n\t\t\t(candidate) => (candidate.groupId ?? candidate.id) === group,\n\t\t);\n\t\tconst keys = [group, bucket?.groupLabel, ...(bucket?.modelKeys ?? [])]\n\t\t\t.map(normalizeKey)\n\t\t\t.filter((key): key is string => key !== undefined);\n\t\tif (keys.some((key) => modelKeys.has(key))) return group;\n\t}\n\tconst variants = [...modelKeys]\n\t\t.map((key) => key.match(/(?:^|-)codex-(.+)$/)?.[1])\n\t\t.filter((value): value is string => Boolean(value));\n\tfor (const variant of variants) {\n\t\tconst matches = groups.filter((group) => {\n\t\t\tif (group === \"codex\") return false;\n\t\t\tconst key = normalizeKey(group);\n\t\t\treturn key ? normalizedKeyHasToken(key, variant) : false;\n\t\t});\n\t\tif (matches.length === 1) return matches[0];\n\t}\n\treturn groups.includes(\"codex\") ? \"codex\" : groups[0];\n}\n\nfunction normalizedModelKeys(model: UsageModel): Set<string> {\n\tconst keys = new Set<string>();\n\tfor (const value of [model.id, model.name]) {\n\t\tconst key = normalizeKey(value);\n\t\tif (!key) continue;\n\t\tkeys.add(key);\n\t\tconst index = key.indexOf(\"codex\");\n\t\tif (index >= 0) keys.add(key.slice(index));\n\t}\n\treturn keys;\n}\n\nfunction normalizeKey(value: string | undefined): string | undefined {\n\tconst separated = value?.toLowerCase().replace(/[^a-z0-9]+/g, \"-\");\n\tif (!separated) return undefined;\n\tlet start = 0;\n\tlet end = separated.length;\n\twhile (separated[start] === \"-\") start += 1;\n\twhile (end > start && separated[end - 1] === \"-\") end -= 1;\n\treturn separated.slice(start, end) || undefined;\n}\n\nfunction normalizedKeyHasToken(key: string, token: string): boolean {\n\treturn (\n\t\tkey === token ||\n\t\tkey.startsWith(`${token}-`) ||\n\t\tkey.endsWith(`-${token}`) ||\n\t\tkey.includes(`-${token}-`)\n\t);\n}\n\nfunction compactLimitLabel(label: string): string {\n\tconst normalized = label.replace(/[_-]+/g, \" \").trim();\n\tconst codex = /\\bcodex\\s/iu.exec(normalized);\n\tconst suffix = codex ? normalized.slice(codex.index + codex[0].length).trim() : \"\";\n\treturn (suffix || normalized).toLowerCase().replace(/\\s+/g, \" \");\n}\n\nfunction formatPercentBucket(bucket: UsageBucket): string {\n\tconst remaining = clampPercent(bucket.remaining ?? 0);\n\tconst filled = Math.round((remaining / 100) * BAR_SEGMENTS);\n\tconst reset = bucket.resetsAt ? ` (resets ${formatReset(bucket.resetsAt)})` : \"\";\n\treturn `[${\"\u2588\".repeat(filled)}${\"\u2591\".repeat(BAR_SEGMENTS - filled)}] ${remaining.toFixed(0)}% left${reset}`;\n}\n\nfunction formatWindowLabel(\n\tminutes: number | undefined,\n\tfallback: \"5h\" | \"weekly\",\n\tcompact: boolean,\n): string {\n\tif (!minutes || !Number.isFinite(minutes) || minutes <= 0) {\n\t\treturn compact && fallback === \"weekly\" ? \"wk\" : capitalize(fallback);\n\t}\n\tif (minutes === 10_080) return compact ? \"wk\" : \"Weekly\";\n\tif (minutes % 10_080 === 0) return `${minutes / 10_080}w`;\n\tif (minutes % 1_440 === 0) return `${minutes / 1_440}d`;\n\tif (minutes % 60 === 0) return `${minutes / 60}h`;\n\treturn `${minutes}m`;\n}\n\nfunction formatMetricValue(value: number | string, unit: UsageBucket[\"unit\"] | undefined): string {\n\tif (unit === \"usd\" && typeof value === \"number\") return formatUsd(value);\n\treturn String(value);\n}\n\nfunction formatUsd(value: number): string {\n\treturn `$${value.toFixed(2)}`;\n}\n\nfunction formatReset(epochSeconds: number): string {\n\tconst reset = new Date(epochSeconds * 1000);\n\tif (Number.isNaN(reset.getTime())) return \"at an unknown time\";\n\tconst time = `${reset.getHours().toString().padStart(2, \"0\")}:${reset\n\t\t.getMinutes()\n\t\t.toString()\n\t\t.padStart(2, \"0\")}`;\n\tconst now = new Date();\n\tif (reset.toDateString() === now.toDateString()) return time;\n\treturn `${time} on ${reset.getDate()} ${reset.toLocaleDateString(undefined, { month: \"short\" })}`;\n}\n\nfunction capitalize(value: string): string {\n\treturn `${value[0]?.toUpperCase() ?? \"\"}${value.slice(1)}`;\n}\n\nfunction clampPercent(value: number): number {\n\treturn Math.min(100, Math.max(0, value));\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { constants } from \"node:fs\";\nimport { chmod, mkdir, open, rename, rm, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, join } from \"node:path\";\nimport { getAgentDir } from \"@earendil-works/pi-coding-agent\";\n\nexport const USAGE_SETTINGS_FILE = \"pi-usage.json\";\nexport const MAX_USAGE_SETTINGS_BYTES = 64 * 1024;\n\nexport interface UsageSettings {\n\tcodexFastMode: boolean;\n}\n\nexport const DEFAULT_USAGE_SETTINGS: Readonly<UsageSettings> = Object.freeze({\n\tcodexFastMode: false,\n});\n\nexport interface UsageSettingsState {\n\tkind: \"missing\" | \"loaded\" | \"invalid\";\n\tpath: string;\n\tsettings: UsageSettings;\n\tdocument?: Record<string, unknown>;\n\tissue?: string;\n}\n\nexport interface UsageSettingsRuntime {\n\tget(): Readonly<UsageSettingsState>;\n\treload(signal?: AbortSignal): Promise<Readonly<UsageSettingsState>>;\n\tupdate(\n\t\tpatch: Partial<UsageSettings>,\n\t\tsignal?: AbortSignal,\n\t): Promise<Readonly<UsageSettingsState>>;\n\tflush(): Promise<void>;\n}\n\ninterface UsageSettingsFileOperations {\n\trename: typeof rename;\n\twriteFile: typeof writeFile;\n}\n\ninterface UsageSettingsRuntimeOptions {\n\toperations?: Partial<UsageSettingsFileOperations>;\n\tpath?: string;\n}\n\nexport function usageSettingsPath(): string {\n\treturn join(getAgentDir(), USAGE_SETTINGS_FILE);\n}\n\nexport function normalizeUsageSettings(value: unknown): UsageSettings | undefined {\n\tif (!isRecord(value)) return undefined;\n\tif (Object.hasOwn(value, \"codexFastMode\") && typeof value.codexFastMode !== \"boolean\") {\n\t\treturn undefined;\n\t}\n\treturn {\n\t\tcodexFastMode:\n\t\t\ttypeof value.codexFastMode === \"boolean\"\n\t\t\t\t? value.codexFastMode\n\t\t\t\t: DEFAULT_USAGE_SETTINGS.codexFastMode,\n\t};\n}\n\nexport async function loadUsageSettings(\n\tpath = usageSettingsPath(),\n\tsignal?: AbortSignal,\n): Promise<UsageSettingsState> {\n\tthrowIfAborted(signal);\n\ttry {\n\t\tconst handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);\n\t\tlet text: string;\n\t\ttry {\n\t\t\tconst stats = await handle.stat();\n\t\t\tthrowIfAborted(signal);\n\t\t\tif (!stats.isFile()) throw new Error(\"settings path is not a regular file\");\n\t\t\tif (stats.size > MAX_USAGE_SETTINGS_BYTES) {\n\t\t\t\tthrow new Error(\"settings file exceeds 64 KiB\");\n\t\t\t}\n\t\t\ttext = await handle.readFile(\"utf8\");\n\t\t} finally {\n\t\t\tawait handle.close();\n\t\t}\n\t\tthrowIfAborted(signal);\n\t\tconst document = JSON.parse(text) as unknown;\n\t\tconst settings = normalizeUsageSettings(document);\n\t\tif (!settings || !isRecord(document)) throw new Error(\"invalid settings shape\");\n\t\treturn { kind: \"loaded\", path, settings, document };\n\t} catch (error) {\n\t\tif (signal?.aborted) throw error;\n\t\tif (isNodeError(error) && error.code === \"ENOENT\") {\n\t\t\treturn {\n\t\t\t\tkind: \"missing\",\n\t\t\t\tpath,\n\t\t\t\tsettings: { ...DEFAULT_USAGE_SETTINGS },\n\t\t\t\tdocument: {},\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tkind: \"invalid\",\n\t\t\tpath,\n\t\t\tsettings: { ...DEFAULT_USAGE_SETTINGS },\n\t\t\tissue:\n\t\t\t\tisNodeError(error) && error.code === \"ELOOP\"\n\t\t\t\t\t? \"symbolic links are not accepted\"\n\t\t\t\t\t: error instanceof Error\n\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t: String(error),\n\t\t};\n\t}\n}\n\nexport function createUsageSettingsRuntime(\n\toptions: UsageSettingsRuntimeOptions | string = {},\n): UsageSettingsRuntime {\n\tconst path = typeof options === \"string\" ? options : (options.path ?? usageSettingsPath());\n\tconst operations: UsageSettingsFileOperations = {\n\t\trename,\n\t\twriteFile,\n\t\t...(typeof options === \"string\" ? undefined : options.operations),\n\t};\n\tlet state: UsageSettingsState = {\n\t\tkind: \"missing\",\n\t\tpath,\n\t\tsettings: { ...DEFAULT_USAGE_SETTINGS },\n\t\tdocument: {},\n\t};\n\tlet queue = Promise.resolve();\n\tconst enqueue = <T>(operation: () => Promise<T>): Promise<T> => {\n\t\tconst result = queue.then(operation, operation);\n\t\tqueue = result.then(\n\t\t\t() => undefined,\n\t\t\t() => undefined,\n\t\t);\n\t\treturn result;\n\t};\n\treturn {\n\t\tget: () => structuredClone(state),\n\t\treload: (signal) =>\n\t\t\tenqueue(async () => {\n\t\t\t\tconst loaded = await loadUsageSettings(path, signal);\n\t\t\t\tstate = loaded;\n\t\t\t\treturn structuredClone(state);\n\t\t\t}),\n\t\tupdate: (patch, signal) =>\n\t\t\tenqueue(async () => {\n\t\t\t\tconst saved = await saveUsageSettingsPatch(path, patch, operations, signal);\n\t\t\t\tstate = saved;\n\t\t\t\treturn structuredClone(state);\n\t\t\t}),\n\t\tflush: () => queue,\n\t};\n}\n\nasync function saveUsageSettingsPatch(\n\tpath: string,\n\tpatch: Partial<UsageSettings>,\n\toperations: UsageSettingsFileOperations,\n\tsignal?: AbortSignal,\n): Promise<UsageSettingsState> {\n\tconst latest = await loadUsageSettings(path, signal);\n\tif (latest.kind === \"invalid\") {\n\t\tthrow new Error(\"Cannot overwrite an invalid pi-usage.json; repair it and reload first\");\n\t}\n\tconst document = { ...latest.document, ...patch };\n\tconst settings = normalizeUsageSettings(document);\n\tif (!settings) throw new Error(\"Refusing to save invalid pi-usage settings\");\n\tconst directory = dirname(path);\n\tconst temporaryPath = join(directory, `.${basename(path)}.${randomUUID()}.tmp`);\n\tawait mkdir(directory, { recursive: true, mode: 0o700 });\n\tthrowIfAborted(signal);\n\ttry {\n\t\tawait operations.writeFile(temporaryPath, `${JSON.stringify(document, null, 2)}\\n`, {\n\t\t\tencoding: \"utf8\",\n\t\t\tflag: \"wx\",\n\t\t\tmode: 0o600,\n\t\t});\n\t\tif (process.platform !== \"win32\") await chmodPrivate(temporaryPath);\n\t\tthrowIfAborted(signal);\n\t\tconst current = await loadUsageSettings(path, signal);\n\t\tif (\n\t\t\tcurrent.kind === \"invalid\" ||\n\t\t\tcurrent.kind !== latest.kind ||\n\t\t\tJSON.stringify(current.document) !== JSON.stringify(latest.document)\n\t\t) {\n\t\t\tthrow new Error(\"pi-usage.json changed while saving; retry the action\");\n\t\t}\n\t\tthrowIfAborted(signal);\n\t\tawait operations.rename(temporaryPath, path);\n\t} finally {\n\t\tawait rm(temporaryPath, { force: true }).catch(() => undefined);\n\t}\n\treturn { kind: \"loaded\", path, settings, document };\n}\n\nasync function chmodPrivate(path: string): Promise<void> {\n\tawait chmod(path, 0o600);\n}\n\nfunction throwIfAborted(signal?: AbortSignal): void {\n\tif (signal?.aborted) throw new DOMException(\"Settings operation aborted\", \"AbortError\");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n\treturn error instanceof Error && \"code\" in error;\n}\n", "import { randomUUID } from \"node:crypto\";\nimport type {\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionContext,\n} from \"@earendil-works/pi-coding-agent\";\nimport { FAST_USAGE_WARNING, registerCodexFastMode } from \"./codex-fast-runtime.js\";\nimport {\n\ttype CodexResetAvailability,\n\ttype CodexResetOption,\n\ttype CodexResetOutcome,\n\tcodexResetActionDescription,\n\tcodexResetCount,\n\tconsumeCodexResetCredit,\n\tformatCodexResetOutcome,\n\tgenericCodexResetOption,\n\tlistCodexResetCredits,\n\tresetConfirmationLines,\n\tresetLabel,\n\tresetOptionExpiration,\n\tresolveCodexResetAuth,\n} from \"./codex-resets.js\";\nimport { awaitWithDeadline, errorMessage, runWithConcurrency, UsageCache } from \"./core.js\";\nimport { formatProviderStates, formatUsageStatusline } from \"./format.js\";\nimport { createOAuthCredentialCandidateReader } from \"./oauth-credential-source.js\";\nimport {\n\tadapterForProvider,\n\tisStaleExtensionContextError,\n\tqueryProviderUsage,\n\tresolveUsageAuth,\n} from \"./query.js\";\nimport { createUsageSettingsRuntime, type UsageSettingsRuntime } from \"./settings.js\";\nimport type {\n\tPiModel,\n\tProviderUsageState,\n\tResolvedUsageAuth,\n\tUsageDisplayState,\n\tUsageProviderAdapter,\n} from \"./types.js\";\nimport {\n\tconfiguredAdapters,\n\tisAbortError,\n\tisTimeoutError,\n\tmodelIdentity,\n\tproviderDisplayName,\n\tsetBoundedMap,\n} from \"./usage-helpers.js\";\n\nconst CACHE_TTL_MS = 5 * 60 * 1000;\nconst DEFAULT_TIMEOUT_MS = 15_000;\nconst ALL_PROVIDER_CONCURRENCY = 2;\nconst FAILURE_BACKOFF_MS = 30_000;\nconst MAX_ACCOUNT_STATES = 32;\nconst STATUS_KEY = \"usage\";\n\nconst REFRESH_CURRENT = \"Refresh current usage\";\nconst VIEW_ANOTHER = \"View another configured provider\u2026\";\nconst VIEW_ALL = \"View all configured providers\u2026\";\nconst CLOSE = \"Close\";\nconst REDEEM_CODEX_RESET = \"Redeem usage limit reset\u2026\";\n\ntype UsageExtensionDependencies = {\n\tcredentialReader?: (providerId: string) => unknown;\n\tcreateRedemptionId?: () => string;\n\tsettingsRuntime?: UsageSettingsRuntime;\n};\n\ntype QueryOutcome = {\n\tstate: ProviderUsageState;\n\tfingerprint?: string;\n\tauthState?: \"unavailable\";\n};\n\ntype StableCurrent = {\n\toutcome: QueryOutcome;\n\tmodel: PiModel | undefined;\n};\n\nexport default function usageExtension(\n\tpi: ExtensionAPI,\n\tdependencies: UsageExtensionDependencies = {},\n) {\n\tconst credentialReader = dependencies.credentialReader;\n\tconst credentialCandidates = createOAuthCredentialCandidateReader(pi, credentialReader);\n\tconst createRedemptionId = dependencies.createRedemptionId ?? randomUUID;\n\tconst settingsRuntime = dependencies.settingsRuntime ?? createUsageSettingsRuntime();\n\tconst cache = new UsageCache(CACHE_TTL_MS);\n\tconst failureBackoff = new Map<string, { until: number; message: string }>();\n\tconst latestQueries = new Map<string, number>();\n\tconst activeControllers = new Set<AbortController>();\n\tlet querySequence = 0;\n\tlet activeCurrentIdentity: string | undefined;\n\tlet sessionActive = false;\n\tlet statusGeneration = 0;\n\tlet statusRefreshTimer: ReturnType<typeof setTimeout> | undefined;\n\tlet statusController: AbortController | undefined;\n\tlet fastRuntime: ReturnType<typeof registerCodexFastMode>;\n\n\tconst clearStatusTimer = () => {\n\t\tif (statusRefreshTimer) clearTimeout(statusRefreshTimer);\n\t\tstatusRefreshTimer = undefined;\n\t};\n\n\tconst safeSetStatus = (ctx: ExtensionContext, value: string | undefined): boolean => {\n\t\ttry {\n\t\t\tctx.ui.setStatus(STATUS_KEY, value);\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\tif (isStaleExtensionContextError(error)) return false;\n\t\t\tthrow error;\n\t\t}\n\t};\n\n\tconst clearStatus = (ctx: ExtensionContext) => {\n\t\tstatusGeneration += 1;\n\t\tstatusController?.abort();\n\t\tstatusController = undefined;\n\t\tclearStatusTimer();\n\t\tsafeSetStatus(ctx, undefined);\n\t};\n\n\tconst scheduleStatusRefresh = (ctx: ExtensionContext, model: PiModel) => {\n\t\tclearStatusTimer();\n\t\tconst generation = statusGeneration;\n\t\tstatusRefreshTimer = setTimeout(() => {\n\t\t\tstatusRefreshTimer = undefined;\n\t\t\tif (!sessionActive || generation !== statusGeneration) return;\n\t\t\tstartStatusRefresh(ctx, model, true);\n\t\t}, CACHE_TTL_MS);\n\t\tstatusRefreshTimer.unref?.();\n\t};\n\n\tconst publishStatus = (\n\t\tctx: ExtensionContext,\n\t\toutcome: QueryOutcome,\n\t\tmodel: PiModel,\n\t\tshouldSchedule: boolean,\n\t) => {\n\t\tif (outcome.state.status === \"unsupported\") {\n\t\t\tclearStatusTimer();\n\t\t\tsafeSetStatus(ctx, undefined);\n\t\t\treturn;\n\t\t}\n\t\tif (outcome.state.status !== \"ready\") {\n\t\t\tif (\n\t\t\t\tsafeSetStatus(\n\t\t\t\t\tctx,\n\t\t\t\t\toutcome.state.status === \"auth-unavailable\" ? \"auth unavailable\" : \"usage error\",\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tif (shouldSchedule && sessionActive) scheduleStatusRefresh(ctx, model);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tconst rawValue = formatUsageStatusline(outcome.state.report, model);\n\t\tconst value = rawValue ? fastRuntime.decorateStatus(model, rawValue) : undefined;\n\t\tif (!safeSetStatus(ctx, value)) return;\n\t\tif (shouldSchedule && sessionActive) scheduleStatusRefresh(ctx, model);\n\t};\n\n\tconst invalidateProviderState = (providerId: string) => {\n\t\tcache.clearProvider(providerId);\n\t\tfor (const key of failureBackoff.keys()) {\n\t\t\tif (key.startsWith(`${providerId}:`)) failureBackoff.delete(key);\n\t\t}\n\t\tfor (const key of latestQueries.keys()) {\n\t\t\tif (key.startsWith(`${providerId}:`)) latestQueries.delete(key);\n\t\t}\n\t};\n\n\tconst transitionCurrentIdentity = (nextIdentity: string, providerId: string) => {\n\t\tif (!activeCurrentIdentity || activeCurrentIdentity === nextIdentity) {\n\t\t\tactiveCurrentIdentity = nextIdentity;\n\t\t\treturn;\n\t\t}\n\t\tconst previousProviderId = activeCurrentIdentity.split(\":\", 1)[0] ?? \"\";\n\t\tfor (const id of new Set([previousProviderId, providerId])) {\n\t\t\tif (id) invalidateProviderState(id);\n\t\t}\n\t\tactiveCurrentIdentity = nextIdentity;\n\t};\n\n\tconst queryAdapterState = async (\n\t\tctx: ExtensionContext,\n\t\tadapter: UsageProviderAdapter,\n\t\tdisplayState: UsageDisplayState,\n\t\tforce: boolean,\n\t\tsignal: AbortSignal,\n\t): Promise<QueryOutcome> => {\n\t\tconst startedAt = Date.now();\n\t\tlet auth: ResolvedUsageAuth | undefined;\n\t\ttry {\n\t\t\tauth = await awaitWithDeadline(\n\t\t\t\tresolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n\t\t\t\tsignal,\n\t\t\t\tDEFAULT_TIMEOUT_MS,\n\t\t\t\t`resolving ${adapter.displayName} runtime auth`,\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tif (isStaleExtensionContextError(error) || isAbortError(error)) throw error;\n\t\t\tif (displayState === \"current\") {\n\t\t\t\ttransitionCurrentIdentity(`${adapter.id}:auth-error`, adapter.id);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\tproviderId: adapter.id,\n\t\t\t\t\tproviderName: adapter.displayName,\n\t\t\t\t\tdisplayState,\n\t\t\t\t\tstatus: isTimeoutError(error) ? \"query-failed\" : \"auth-unavailable\",\n\t\t\t\t\tmessage: errorMessage(error),\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tif (!auth) {\n\t\t\tif (displayState === \"current\") {\n\t\t\t\ttransitionCurrentIdentity(`${adapter.id}:unavailable`, adapter.id);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\tproviderId: adapter.id,\n\t\t\t\t\tproviderName: adapter.displayName,\n\t\t\t\t\tdisplayState,\n\t\t\t\t\tstatus: \"auth-unavailable\",\n\t\t\t\t\tmessage: `No runtime credential is configured for ${adapter.displayName}.`,\n\t\t\t\t},\n\t\t\t\tauthState: \"unavailable\",\n\t\t\t};\n\t\t}\n\t\tif (displayState === \"current\") {\n\t\t\ttransitionCurrentIdentity(`${adapter.id}:${auth.fingerprint}`, adapter.id);\n\t\t}\n\n\t\tconst cached = !force ? cache.get(adapter.id, auth.fingerprint) : undefined;\n\t\tif (cached) {\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\tproviderId: adapter.id,\n\t\t\t\t\tproviderName: adapter.displayName,\n\t\t\t\t\tdisplayState,\n\t\t\t\t\tstatus: \"ready\",\n\t\t\t\t\treport: cached,\n\t\t\t\t},\n\t\t\t\tfingerprint: auth.fingerprint,\n\t\t\t};\n\t\t}\n\n\t\tconst failureKey = `${adapter.id}:${auth.fingerprint}`;\n\t\tconst previousFailure = failureBackoff.get(failureKey);\n\t\tif (!force && previousFailure && previousFailure.until > Date.now()) {\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\tproviderId: adapter.id,\n\t\t\t\t\tproviderName: adapter.displayName,\n\t\t\t\t\tdisplayState,\n\t\t\t\t\tstatus: \"query-failed\",\n\t\t\t\t\tmessage: previousFailure.message,\n\t\t\t\t},\n\t\t\t\tfingerprint: auth.fingerprint,\n\t\t\t};\n\t\t}\n\t\tfailureBackoff.delete(failureKey);\n\t\tquerySequence += 1;\n\t\tconst queryId = querySequence;\n\t\tsetBoundedMap(latestQueries, failureKey, queryId, MAX_ACCOUNT_STATES);\n\n\t\ttry {\n\t\t\tconst remainingMs = Math.max(1, DEFAULT_TIMEOUT_MS - (Date.now() - startedAt));\n\t\t\tconst report = await queryProviderUsage(adapter, auth, signal, remainingMs);\n\t\t\tif (latestQueries.get(failureKey) === queryId) {\n\t\t\t\tcache.set(adapter.id, auth.fingerprint, report);\n\t\t\t\tfailureBackoff.delete(failureKey);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\tproviderId: adapter.id,\n\t\t\t\t\tproviderName: adapter.displayName,\n\t\t\t\t\tdisplayState,\n\t\t\t\t\tstatus: \"ready\",\n\t\t\t\t\treport,\n\t\t\t\t},\n\t\t\t\tfingerprint: auth.fingerprint,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tif (isStaleExtensionContextError(error) || isAbortError(error)) throw error;\n\t\t\tconst message = errorMessage(error);\n\t\t\tconst now = Date.now();\n\t\t\tfor (const [key, failure] of failureBackoff) {\n\t\t\t\tif (failure.until <= now) failureBackoff.delete(key);\n\t\t\t}\n\t\t\tif (latestQueries.get(failureKey) === queryId) {\n\t\t\t\tsetBoundedMap(\n\t\t\t\t\tfailureBackoff,\n\t\t\t\t\tfailureKey,\n\t\t\t\t\t{ until: now + FAILURE_BACKOFF_MS, message },\n\t\t\t\t\tMAX_ACCOUNT_STATES,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\tproviderId: adapter.id,\n\t\t\t\t\tproviderName: adapter.displayName,\n\t\t\t\t\tdisplayState,\n\t\t\t\t\tstatus: \"query-failed\",\n\t\t\t\t\tmessage,\n\t\t\t\t},\n\t\t\t\tfingerprint: auth.fingerprint,\n\t\t\t};\n\t\t}\n\t};\n\n\tconst queryCurrentState = async (\n\t\tctx: ExtensionContext,\n\t\tmodel: PiModel | undefined,\n\t\tforce: boolean,\n\t\tsignal: AbortSignal,\n\t): Promise<QueryOutcome> => {\n\t\tconst adapter = adapterForProvider(model?.provider);\n\t\tif (!adapter) {\n\t\t\tconst providerId = model?.provider ?? \"none\";\n\t\t\ttransitionCurrentIdentity(`unsupported:${providerId}`, providerId);\n\t\t\treturn {\n\t\t\t\tstate: {\n\t\t\t\t\tproviderId,\n\t\t\t\t\tproviderName: providerDisplayName(ctx, providerId),\n\t\t\t\t\tdisplayState: \"current\",\n\t\t\t\t\tstatus: \"unsupported\",\n\t\t\t\t\tmessage: model\n\t\t\t\t\t\t? `Usage reporting is not supported for ${providerDisplayName(ctx, providerId)}.`\n\t\t\t\t\t\t: \"No model is selected.\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\treturn queryAdapterState(ctx, adapter, \"current\", force, signal);\n\t};\n\n\tconst refreshCurrentStatus = async (\n\t\tctx: ExtensionContext,\n\t\tmodel: PiModel | undefined,\n\t\tforce: boolean,\n\t) => {\n\t\tconst adapter = adapterForProvider(model?.provider);\n\t\tif (!adapter || !model) {\n\t\t\tconst providerId = model?.provider ?? \"none\";\n\t\t\ttransitionCurrentIdentity(`unsupported:${providerId}`, providerId);\n\t\t\tclearStatus(ctx);\n\t\t\treturn;\n\t\t}\n\t\tstatusGeneration += 1;\n\t\tconst generation = statusGeneration;\n\t\tstatusController?.abort();\n\t\tconst controller = new AbortController();\n\t\tstatusController = controller;\n\t\tactiveControllers.add(controller);\n\t\ttry {\n\t\t\tif (!safeSetStatus(ctx, \"checking\")) return;\n\t\t\tconst outcome = await queryCurrentState(ctx, model, force, controller.signal);\n\t\t\tif (!sessionActive || generation !== statusGeneration || controller.signal.aborted) return;\n\t\t\tif (!(await outcomeStillCurrent(ctx, model, generation, outcome, controller.signal))) {\n\t\t\t\tif (sessionActive && generation === statusGeneration) {\n\t\t\t\t\tqueueMicrotask(() => startStatusRefresh(ctx, ctx.model, false));\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpublishStatus(ctx, outcome, model, true);\n\t\t} finally {\n\t\t\tactiveControllers.delete(controller);\n\t\t\tif (statusController === controller) statusController = undefined;\n\t\t}\n\t};\n\n\tconst startStatusRefresh = (\n\t\tctx: ExtensionContext,\n\t\tmodel: PiModel | undefined,\n\t\tforce: boolean,\n\t) => {\n\t\tvoid refreshCurrentStatus(ctx, model, force).catch((error) => {\n\t\t\tif (isStaleExtensionContextError(error) || isAbortError(error)) return;\n\t\t\tsafeSetStatus(ctx, \"usage error\");\n\t\t});\n\t};\n\n\tconst runMenuOperation = async <T>(\n\t\tctx: ExtensionCommandContext,\n\t\tlabel: string,\n\t\tparentSignal: AbortSignal,\n\t\toperation: (signal: AbortSignal) => Promise<T>,\n\t\tcancellable = true,\n\t): Promise<T | undefined> => {\n\t\tconst { runTask } = await import(\"@narumitw/pi-tui-kit\");\n\t\tif (parentSignal.aborted) return undefined;\n\t\tconst result = await runTask(ctx, {\n\t\t\tlabel,\n\t\t\tsignal: parentSignal,\n\t\t\tcancellable,\n\t\t\tonError: () => undefined,\n\t\t\ttask: ({ signal }) => operation(signal),\n\t\t});\n\t\tswitch (result.kind) {\n\t\t\tcase \"completed\":\n\t\t\t\treturn result.value;\n\t\t\tcase \"cancelled\":\n\t\t\tcase \"stale\":\n\t\t\t\treturn undefined;\n\t\t\tcase \"error\":\n\t\t\t\tthrow result.error;\n\t\t}\n\t};\n\n\tconst outcomeStillCurrent = async (\n\t\tctx: ExtensionContext,\n\t\tmodel: PiModel | undefined,\n\t\tgeneration: number,\n\t\toutcome: QueryOutcome,\n\t\tsignal: AbortSignal,\n\t): Promise<boolean> => {\n\t\tif (generation !== statusGeneration || modelIdentity(ctx.model) !== modelIdentity(model)) {\n\t\t\treturn false;\n\t\t}\n\t\tconst adapter = adapterForProvider(model?.provider);\n\t\tif (outcome.authState === \"unavailable\") {\n\t\t\tif (!adapter) return false;\n\t\t\ttry {\n\t\t\t\tconst auth = await awaitWithDeadline(\n\t\t\t\t\tresolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n\t\t\t\t\tsignal,\n\t\t\t\t\tDEFAULT_TIMEOUT_MS,\n\t\t\t\t\t`revalidating ${adapter.displayName} runtime auth`,\n\t\t\t\t);\n\t\t\t\treturn (\n\t\t\t\t\tgeneration === statusGeneration &&\n\t\t\t\t\tmodelIdentity(ctx.model) === modelIdentity(model) &&\n\t\t\t\t\tauth === undefined\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\tif (isAbortError(error) || isStaleExtensionContextError(error)) throw error;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\tif (!outcome.fingerprint) return true;\n\t\tif (!adapter) return false;\n\t\ttry {\n\t\t\tconst auth = await awaitWithDeadline(\n\t\t\t\tresolveUsageAuth(ctx, adapter, undefined, credentialReader, credentialCandidates),\n\t\t\t\tsignal,\n\t\t\t\tDEFAULT_TIMEOUT_MS,\n\t\t\t\t`revalidating ${adapter.displayName} runtime auth`,\n\t\t\t);\n\t\t\treturn (\n\t\t\t\tgeneration === statusGeneration &&\n\t\t\t\tmodelIdentity(ctx.model) === modelIdentity(model) &&\n\t\t\t\tauth?.fingerprint === outcome.fingerprint\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tif (isAbortError(error) || isStaleExtensionContextError(error)) throw error;\n\t\t\treturn false;\n\t\t}\n\t};\n\n\tconst queryStableCurrent = async (\n\t\tctx: ExtensionCommandContext,\n\t\tforce: boolean,\n\t\tcontroller: AbortController,\n\t\tlabel: string,\n\t): Promise<StableCurrent | undefined> => {\n\t\tfor (let attempt = 0; attempt < 3; attempt += 1) {\n\t\t\tconst model = ctx.model;\n\t\t\tconst generation = statusGeneration;\n\t\t\tconst result = await runMenuOperation(ctx, label, controller.signal, async (signal) => {\n\t\t\t\tconst outcome = await queryCurrentState(ctx, model, force, signal);\n\t\t\t\treturn {\n\t\t\t\t\toutcome,\n\t\t\t\t\tstable: await outcomeStillCurrent(ctx, model, generation, outcome, signal),\n\t\t\t\t};\n\t\t\t});\n\t\t\tif (!result) return undefined;\n\t\t\tif (result.stable) return { outcome: result.outcome, model };\n\t\t\tforce = false;\n\t\t}\n\t\tctx.ui.notify(\"The active model or account kept changing; reopen /usage to retry.\", \"warning\");\n\t\treturn undefined;\n\t};\n\n\tconst publishStableCurrent = (ctx: ExtensionCommandContext, current: StableCurrent) => {\n\t\tif (current.model) publishStatus(ctx, current.outcome, current.model, sessionActive);\n\t\telse safeSetStatus(ctx, undefined);\n\t};\n\n\tconst showMenu = async (ctx: ExtensionCommandContext): Promise<void> => {\n\t\tif (!ctx.hasUI) throw new Error(\"/usage requires TUI or RPC mode.\");\n\t\tstatusGeneration += 1;\n\t\tconst menuGeneration = statusGeneration;\n\t\tstatusController?.abort();\n\t\tstatusController = undefined;\n\t\tclearStatusTimer();\n\t\tconst controller = new AbortController();\n\t\tactiveControllers.add(controller);\n\t\ttry {\n\t\t\tlet stableCurrent = await queryStableCurrent(\n\t\t\t\tctx,\n\t\t\t\tfalse,\n\t\t\t\tcontroller,\n\t\t\t\t\"Checking current usage\u2026\",\n\t\t\t);\n\t\t\tif (!stableCurrent) return;\n\t\t\tpublishStableCurrent(ctx, stableCurrent);\n\t\t\tlet current = stableCurrent.outcome;\n\t\t\tlet visibleStates: ProviderUsageState[] = [current.state];\n\t\t\tlet fastState = settingsRuntime.get();\n\t\t\tlet resetAvailability: CodexResetAvailability | undefined;\n\t\t\tlet selectedReset: CodexResetOption | undefined;\n\t\t\tlet resetAuthFingerprint: string | undefined;\n\t\t\tlet resetModelIdentity: string | undefined;\n\t\t\tlet redemptionId: string | undefined;\n\t\t\tlet resetOutcome: CodexResetOutcome | undefined;\n\t\t\tlet resetFailure: string | undefined;\n\t\t\tconst { defineMenu, runMenu } = await import(\"@narumitw/pi-tui-kit\");\n\t\t\tif (controller.signal.aborted || statusGeneration !== menuGeneration) return;\n\t\t\ttype Screen =\n\t\t\t\t| \"main\"\n\t\t\t\t| \"providers\"\n\t\t\t\t| \"reset-picker\"\n\t\t\t\t| \"reset-confirm\"\n\t\t\t\t| \"reset-result\"\n\t\t\t\t| \"reset-error\";\n\t\t\ttype Action =\n\t\t\t\t| \"refresh\"\n\t\t\t\t| \"toggle-fast\"\n\t\t\t\t| \"another\"\n\t\t\t\t| \"all\"\n\t\t\t\t| \"provider\"\n\t\t\t\t| \"open-resets\"\n\t\t\t\t| \"select-reset\"\n\t\t\t\t| \"cancel-reset\"\n\t\t\t\t| \"consume-reset\"\n\t\t\t\t| \"back-to-usage\"\n\t\t\t\t| \"back-to-resets\";\n\t\t\tconst menu = defineMenu<undefined, Screen, Action, ExtensionCommandContext>({\n\t\t\t\tstart: \"main\",\n\t\t\t\tscreens: {\n\t\t\t\t\tmain: () => {\n\t\t\t\t\t\tconst fastAvailability = fastRuntime.availability(ctx.model);\n\t\t\t\t\t\tconst fastLines =\n\t\t\t\t\t\t\tfastAvailability.kind === \"available\"\n\t\t\t\t\t\t\t\t? [`Fast mode: ${fastAvailability.enabled ? \"On\" : \"Off\"}`, FAST_USAGE_WARNING]\n\t\t\t\t\t\t\t\t: fastAvailability.kind === \"unavailable\"\n\t\t\t\t\t\t\t\t\t? [`Fast mode: Unavailable \u00B7 ${fastAvailability.reason}`]\n\t\t\t\t\t\t\t\t\t: [];\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tkind: \"actions\",\n\t\t\t\t\t\t\ttitle: \"Provider usage\",\n\t\t\t\t\t\t\tlines: [...formatProviderStates(visibleStates).split(\"\\n\"), ...fastLines],\n\t\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t\t{ id: \"refresh\", label: REFRESH_CURRENT, action: \"refresh\" },\n\t\t\t\t\t\t\t\t...(fastAvailability.kind === \"available\"\n\t\t\t\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tid: \"toggle-fast\",\n\t\t\t\t\t\t\t\t\t\t\t\tlabel: fastAvailability.enabled\n\t\t\t\t\t\t\t\t\t\t\t\t\t? \"Turn Fast mode off\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t: \"Turn Fast mode on\",\n\t\t\t\t\t\t\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\t\t\t\t\t\tfastState.kind === \"invalid\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? \"Repair pi-usage.json and reload before changing Fast mode.\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: FAST_USAGE_WARNING,\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled: fastState.kind === \"invalid\",\n\t\t\t\t\t\t\t\t\t\t\t\taction: \"toggle-fast\" as const,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t: []),\n\t\t\t\t\t\t\t\t...(current.state.status === \"ready\" && current.state.providerId === \"openai-codex\"\n\t\t\t\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tid: \"open-resets\",\n\t\t\t\t\t\t\t\t\t\t\t\tlabel: REDEEM_CODEX_RESET,\n\t\t\t\t\t\t\t\t\t\t\t\tdescription: codexResetActionDescription(current.state.report),\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled: codexResetCount(current.state.report) === 0,\n\t\t\t\t\t\t\t\t\t\t\t\taction: \"open-resets\" as const,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t: []),\n\t\t\t\t\t\t\t\t{ id: \"another\", label: VIEW_ANOTHER, action: \"another\" },\n\t\t\t\t\t\t\t\t{ id: \"all\", label: VIEW_ALL, action: \"all\" },\n\t\t\t\t\t\t\t\t{ id: \"close\", label: CLOSE, close: true },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\thint: \"close\",\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\t\t\t\t\tproviders: () => ({\n\t\t\t\t\t\tkind: \"actions\",\n\t\t\t\t\t\ttitle: \"Select a configured provider\",\n\t\t\t\t\t\titems: configuredAdapters(ctx)\n\t\t\t\t\t\t\t.filter((adapter) => adapter.id !== ctx.model?.provider)\n\t\t\t\t\t\t\t.map((adapter) => ({\n\t\t\t\t\t\t\t\tid: adapter.id,\n\t\t\t\t\t\t\t\tlabel: adapter.displayName,\n\t\t\t\t\t\t\t\taction: \"provider\" as const,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\thint: \"back\",\n\t\t\t\t\t}),\n\t\t\t\t\t\"reset-picker\": () => ({\n\t\t\t\t\t\tkind: \"choice\",\n\t\t\t\t\t\ttitle: \"Usage limit resets\",\n\t\t\t\t\t\tlines: [\n\t\t\t\t\t\t\t`${resetAvailability?.availableCount ?? 0} ${resetLabel(resetAvailability?.availableCount ?? 0)} available.`,\n\t\t\t\t\t\t],\n\t\t\t\t\t\titems: (resetAvailability?.options ?? []).map((option, index) => ({\n\t\t\t\t\t\t\tid: `reset-${index}`,\n\t\t\t\t\t\t\tlabel: option.title,\n\t\t\t\t\t\t\tdescription: resetOptionExpiration(option),\n\t\t\t\t\t\t\tdetails: [option.description],\n\t\t\t\t\t\t})),\n\t\t\t\t\t\taction: \"select-reset\",\n\t\t\t\t\t\tinitialItemId: \"reset-0\",\n\t\t\t\t\t\thint: \"back\",\n\t\t\t\t\t}),\n\t\t\t\t\t\"reset-confirm\": () => ({\n\t\t\t\t\t\tkind: \"actions\",\n\t\t\t\t\t\ttitle: \"Use this reset?\",\n\t\t\t\t\t\tlines: resetConfirmationLines(selectedReset),\n\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t{ id: \"cancel-reset\", label: \"No, go back\", action: \"cancel-reset\" },\n\t\t\t\t\t\t\t{ id: \"consume-reset\", label: \"Yes, use reset\", action: \"consume-reset\" },\n\t\t\t\t\t\t],\n\t\t\t\t\t\thint: \"back\",\n\t\t\t\t\t}),\n\t\t\t\t\t\"reset-result\": () => ({\n\t\t\t\t\t\tkind: \"actions\",\n\t\t\t\t\t\ttitle: \"Usage limit resets\",\n\t\t\t\t\t\tlines: [\n\t\t\t\t\t\t\tformatCodexResetOutcome(\n\t\t\t\t\t\t\t\tresetOutcome,\n\t\t\t\t\t\t\t\tcurrent.state.status === \"ready\"\n\t\t\t\t\t\t\t\t\t? codexResetCount(current.state.report)\n\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t],\n\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: \"back-to-usage\",\n\t\t\t\t\t\t\t\tlabel: \"Back to usage\",\n\t\t\t\t\t\t\t\taction: \"back-to-usage\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{ id: \"close\", label: CLOSE, close: true },\n\t\t\t\t\t\t],\n\t\t\t\t\t\thint: \"back\",\n\t\t\t\t\t}),\n\t\t\t\t\t\"reset-error\": () => ({\n\t\t\t\t\t\tkind: \"actions\",\n\t\t\t\t\t\ttitle: \"Usage limit resets\",\n\t\t\t\t\t\tlines: [resetFailure ?? \"Couldn't reset usage. Please try again.\"],\n\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t{ id: \"consume-reset\", label: \"Try again\", action: \"consume-reset\" },\n\t\t\t\t\t\t\t{ id: \"back-to-resets\", label: \"Back\", action: \"back-to-resets\" },\n\t\t\t\t\t\t],\n\t\t\t\t\t\thint: \"back\",\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\tactions: {\n\t\t\t\t\t\"toggle-fast\": async () => {\n\t\t\t\t\t\tconst availability = fastRuntime.availability(ctx.model);\n\t\t\t\t\t\tif (availability.kind !== \"available\" || fastState.kind === \"invalid\") {\n\t\t\t\t\t\t\treturn { kind: \"rejected\" };\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst changed = await fastRuntime.toggle(ctx, !availability.enabled, controller.signal);\n\t\t\t\t\t\tif (!changed) return { kind: \"rejected\" };\n\t\t\t\t\t\tfastState = settingsRuntime.get();\n\t\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t\t},\n\t\t\t\t\t\"open-resets\": async () => {\n\t\t\t\t\t\tconst summaryCount =\n\t\t\t\t\t\t\tcurrent.state.status === \"ready\" && current.state.providerId === \"openai-codex\"\n\t\t\t\t\t\t\t\t? codexResetCount(current.state.report)\n\t\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst loaded = await runMenuOperation(\n\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\"Checking usage limit resets\u2026\",\n\t\t\t\t\t\t\t\tcontroller.signal,\n\t\t\t\t\t\t\t\tasync (signal) => {\n\t\t\t\t\t\t\t\t\tconst expectedModel = modelIdentity(ctx.model);\n\t\t\t\t\t\t\t\t\tconst auth = await awaitWithDeadline(\n\t\t\t\t\t\t\t\t\t\tresolveCodexResetAuth(ctx, undefined, credentialReader, credentialCandidates),\n\t\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t\t\tDEFAULT_TIMEOUT_MS,\n\t\t\t\t\t\t\t\t\t\t\"resolving current Codex reset authentication\",\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tlet availability: CodexResetAvailability;\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tavailability = await listCodexResetCredits(auth, signal, DEFAULT_TIMEOUT_MS);\n\t\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\t\tif (isAbortError(error) || summaryCount === undefined || summaryCount <= 0) {\n\t\t\t\t\t\t\t\t\t\t\tthrow error;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tavailability = {\n\t\t\t\t\t\t\t\t\t\t\tavailableCount: summaryCount,\n\t\t\t\t\t\t\t\t\t\t\toptions: [genericCodexResetOption()],\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tconst revalidated = await awaitWithDeadline(\n\t\t\t\t\t\t\t\t\t\tresolveCodexResetAuth(ctx, undefined, credentialReader, credentialCandidates),\n\t\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t\t\tDEFAULT_TIMEOUT_MS,\n\t\t\t\t\t\t\t\t\t\t\"revalidating current Codex reset authentication\",\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\tmodelIdentity(ctx.model) !== expectedModel ||\n\t\t\t\t\t\t\t\t\t\trevalidated.fingerprint !== auth.fingerprint\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\t\t\"The active Codex model or account changed while loading usage limit resets.\",\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn { availability, auth, expectedModel };\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (!loaded) return { kind: \"stay\" };\n\t\t\t\t\t\t\tresetAvailability = loaded.availability;\n\t\t\t\t\t\t\tresetAuthFingerprint = loaded.auth.fingerprint;\n\t\t\t\t\t\t\tresetModelIdentity = loaded.expectedModel;\n\t\t\t\t\t\t\tselectedReset = undefined;\n\t\t\t\t\t\t\tredemptionId = undefined;\n\t\t\t\t\t\t\tresetOutcome = undefined;\n\t\t\t\t\t\t\tresetFailure = undefined;\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tkind: \"to\",\n\t\t\t\t\t\t\t\tscreen: loaded.availability.availableCount > 0 ? \"reset-picker\" : \"reset-result\",\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tif (isAbortError(error) || isStaleExtensionContextError(error)) {\n\t\t\t\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tctx.ui.notify(`Couldn't load usage limit resets: ${errorMessage(error)}`, \"error\");\n\t\t\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t\"select-reset\": ({ itemId }) => {\n\t\t\t\t\t\tconst index = Number(itemId.replace(/^reset-/u, \"\"));\n\t\t\t\t\t\tconst option = Number.isSafeInteger(index)\n\t\t\t\t\t\t\t? resetAvailability?.options[index]\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\tif (!option) return { kind: \"rejected\" };\n\t\t\t\t\t\tselectedReset = option;\n\t\t\t\t\t\tredemptionId = undefined;\n\t\t\t\t\t\tresetFailure = undefined;\n\t\t\t\t\t\treturn { kind: \"to\", screen: \"reset-confirm\" };\n\t\t\t\t\t},\n\t\t\t\t\t\"cancel-reset\": () => ({ kind: \"back\" }),\n\t\t\t\t\t\"consume-reset\": async () => {\n\t\t\t\t\t\tif (!selectedReset || !resetAuthFingerprint || !resetModelIdentity) {\n\t\t\t\t\t\t\treturn { kind: \"rejected\" };\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tredemptionId ??= createRedemptionId();\n\t\t\t\t\t\t\tconst attemptId = redemptionId;\n\t\t\t\t\t\t\tconst option = selectedReset;\n\t\t\t\t\t\t\tconst expectedFingerprint = resetAuthFingerprint;\n\t\t\t\t\t\t\tconst expectedModel = resetModelIdentity;\n\t\t\t\t\t\t\tconst result = await runMenuOperation(\n\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\"Resetting your usage\u2026\",\n\t\t\t\t\t\t\t\tcontroller.signal,\n\t\t\t\t\t\t\t\tasync (signal) => {\n\t\t\t\t\t\t\t\t\tconst auth = await awaitWithDeadline(\n\t\t\t\t\t\t\t\t\t\tresolveCodexResetAuth(ctx, undefined, credentialReader, credentialCandidates),\n\t\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t\t\tDEFAULT_TIMEOUT_MS,\n\t\t\t\t\t\t\t\t\t\t\"revalidating current Codex reset authentication\",\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\tmodelIdentity(ctx.model) !== expectedModel ||\n\t\t\t\t\t\t\t\t\t\tauth.fingerprint !== expectedFingerprint\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\t\t\"The active Codex model or account changed; the reset was not used.\",\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tconst outcome = await consumeCodexResetCredit(\n\t\t\t\t\t\t\t\t\t\tauth,\n\t\t\t\t\t\t\t\t\t\toption,\n\t\t\t\t\t\t\t\t\t\tattemptId,\n\t\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t\t\tDEFAULT_TIMEOUT_MS,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tinvalidateProviderState(\"openai-codex\");\n\t\t\t\t\t\t\t\t\tconst model = ctx.model;\n\t\t\t\t\t\t\t\t\tif (modelIdentity(model) !== expectedModel) return { outcome };\n\t\t\t\t\t\t\t\t\tconst refreshed = await queryCurrentState(ctx, model, true, signal);\n\t\t\t\t\t\t\t\t\tconst stable = await outcomeStillCurrent(\n\t\t\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t\t\t\t\tmenuGeneration,\n\t\t\t\t\t\t\t\t\t\trefreshed,\n\t\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\treturn stable ? { outcome, refreshed, model } : { outcome };\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (!result) return { kind: \"close\" };\n\t\t\t\t\t\t\tresetOutcome = result.outcome;\n\t\t\t\t\t\t\tresetFailure = undefined;\n\t\t\t\t\t\t\tif (result.refreshed && result.model) {\n\t\t\t\t\t\t\t\tstableCurrent = { outcome: result.refreshed, model: result.model };\n\t\t\t\t\t\t\t\tcurrent = result.refreshed;\n\t\t\t\t\t\t\t\tvisibleStates = [current.state];\n\t\t\t\t\t\t\t\tpublishStableCurrent(ctx, stableCurrent);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn { kind: \"to\", screen: \"reset-result\" };\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tif (isAbortError(error) || isStaleExtensionContextError(error)) {\n\t\t\t\t\t\t\t\treturn { kind: \"close\" };\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tresetFailure = `Couldn't reset usage: ${errorMessage(error)}. Try again with the same request.`;\n\t\t\t\t\t\t\treturn { kind: \"to\", screen: \"reset-error\" };\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t\"back-to-usage\": () => ({ kind: \"to\", screen: \"main\" }),\n\t\t\t\t\t\"back-to-resets\": () => {\n\t\t\t\t\t\tredemptionId = undefined;\n\t\t\t\t\t\tresetFailure = undefined;\n\t\t\t\t\t\treturn { kind: \"to\", screen: \"reset-picker\" };\n\t\t\t\t\t},\n\t\t\t\t\trefresh: async () => {\n\t\t\t\t\t\tconst refreshed = await queryStableCurrent(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\tcontroller,\n\t\t\t\t\t\t\t\"Refreshing current usage\u2026\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!refreshed) return { kind: \"stay\" };\n\t\t\t\t\t\tstableCurrent = refreshed;\n\t\t\t\t\t\tpublishStableCurrent(ctx, refreshed);\n\t\t\t\t\t\tcurrent = refreshed.outcome;\n\t\t\t\t\t\tvisibleStates = [current.state];\n\t\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t\t},\n\t\t\t\t\tanother: async () => {\n\t\t\t\t\t\tconst others = configuredAdapters(ctx).filter(\n\t\t\t\t\t\t\t(adapter) => adapter.id !== ctx.model?.provider,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (others.length === 0) {\n\t\t\t\t\t\t\tctx.ui.notify(\"No other supported provider has configured runtime auth.\", \"info\");\n\t\t\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn { kind: \"to\", screen: \"providers\" };\n\t\t\t\t\t},\n\t\t\t\t\tprovider: async ({ itemId }) => {\n\t\t\t\t\t\tconst adapter = configuredAdapters(ctx).find(\n\t\t\t\t\t\t\t(candidate) => candidate.id === itemId && candidate.id !== ctx.model?.provider,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!adapter) return { kind: \"back\" };\n\t\t\t\t\t\tconst outcome = await runMenuOperation(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t`Checking ${adapter.displayName} usage\u2026`,\n\t\t\t\t\t\t\tcontroller.signal,\n\t\t\t\t\t\t\t(signal) => queryAdapterState(ctx, adapter, \"configured\", false, signal),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!outcome) return { kind: \"back\" };\n\t\t\t\t\t\tconst revalidated = await queryStableCurrent(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\tcontroller,\n\t\t\t\t\t\t\t\"Revalidating current usage\u2026\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!revalidated) return { kind: \"back\" };\n\t\t\t\t\t\tstableCurrent = revalidated;\n\t\t\t\t\t\tcurrent = revalidated.outcome;\n\t\t\t\t\t\tvisibleStates = [\n\t\t\t\t\t\t\toutcome.state.providerId === current.state.providerId\n\t\t\t\t\t\t\t\t? current.state\n\t\t\t\t\t\t\t\t: { ...outcome.state, displayState: \"configured\" },\n\t\t\t\t\t\t];\n\t\t\t\t\t\treturn { kind: \"back\" };\n\t\t\t\t\t},\n\t\t\t\t\tall: async () => {\n\t\t\t\t\t\tconst adapters = configuredAdapters(ctx);\n\t\t\t\t\t\tconst currentProviderId = ctx.model?.provider;\n\t\t\t\t\t\tconst settled = await runMenuOperation(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\"Checking configured provider usage\u2026\",\n\t\t\t\t\t\t\tcontroller.signal,\n\t\t\t\t\t\t\t(signal) =>\n\t\t\t\t\t\t\t\trunWithConcurrency(\n\t\t\t\t\t\t\t\t\tadapters,\n\t\t\t\t\t\t\t\t\tALL_PROVIDER_CONCURRENCY,\n\t\t\t\t\t\t\t\t\t(adapter, _index, workerSignal) =>\n\t\t\t\t\t\t\t\t\t\tqueryAdapterState(\n\t\t\t\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\t\t\tadapter,\n\t\t\t\t\t\t\t\t\t\t\tadapter.id === currentProviderId ? \"current\" : \"configured\",\n\t\t\t\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\t\t\t\tworkerSignal,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!settled) return { kind: \"stay\" };\n\t\t\t\t\t\tconst queriedStates: ProviderUsageState[] = settled.map((result, index) => {\n\t\t\t\t\t\t\tif (result.status === \"fulfilled\") {\n\t\t\t\t\t\t\t\treturn { ...result.value.state, displayState: \"configured\" };\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst adapter = adapters[index] as UsageProviderAdapter;\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tproviderId: adapter.id,\n\t\t\t\t\t\t\t\tproviderName: adapter.displayName,\n\t\t\t\t\t\t\t\tdisplayState: \"configured\",\n\t\t\t\t\t\t\t\tstatus: \"query-failed\",\n\t\t\t\t\t\t\t\tmessage: errorMessage(result.reason),\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconst revalidated = await queryStableCurrent(\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\tcontroller,\n\t\t\t\t\t\t\t\"Revalidating current usage\u2026\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!revalidated) return { kind: \"stay\" };\n\t\t\t\t\t\tstableCurrent = revalidated;\n\t\t\t\t\t\tcurrent = revalidated.outcome;\n\t\t\t\t\t\tvisibleStates = [\n\t\t\t\t\t\t\tcurrent.state,\n\t\t\t\t\t\t\t...queriedStates.filter((state) => state.providerId !== current.state.providerId),\n\t\t\t\t\t\t];\n\t\t\t\t\t\treturn { kind: \"stay\" };\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t\tawait runMenu(ctx, menu, {\n\t\t\t\tgetState: () => undefined,\n\t\t\t\tsignal: controller.signal,\n\t\t\t\tisCurrent: () => statusGeneration === menuGeneration && !controller.signal.aborted,\n\t\t\t});\n\t\t} finally {\n\t\t\tcontroller.abort(new DOMException(\"Usage menu closed\", \"AbortError\"));\n\t\t\tactiveControllers.delete(controller);\n\t\t}\n\t};\n\n\tpi.registerCommand(\"usage\", {\n\t\tdescription: \"Show usage for the current runtime account\",\n\t\thandler: async (args, ctx) => {\n\t\t\tif (args.trim()) {\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\"/usage does not accept arguments; choose an action from its menu.\",\n\t\t\t\t\t\"warning\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait showMenu(ctx);\n\t\t\t} catch (error) {\n\t\t\t\tif (isStaleExtensionContextError(error) || isAbortError(error)) return;\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t},\n\t});\n\tpi.on(\"session_start\", (_event, ctx) => {\n\t\tstatusGeneration += 1;\n\t\tclearStatusTimer();\n\t\tfor (const controller of activeControllers) controller.abort();\n\t\tactiveControllers.clear();\n\t\tstatusController = undefined;\n\t\tsessionActive = true;\n\t\tstartStatusRefresh(ctx, ctx.model, false);\n\t});\n\tpi.on(\"session_tree\", (_event, ctx) => {\n\t\tstartStatusRefresh(ctx, ctx.model, false);\n\t});\n\tpi.on(\"model_select\", (event, ctx) => {\n\t\tstartStatusRefresh(ctx, event.model, false);\n\t});\n\tpi.on(\"turn_start\", (_event, ctx) => {\n\t\tstartStatusRefresh(ctx, ctx.model, false);\n\t});\n\tpi.on(\"session_shutdown\", (_event, ctx) => {\n\t\tsessionActive = false;\n\t\tstatusGeneration += 1;\n\t\tclearStatusTimer();\n\t\tfor (const controller of activeControllers) controller.abort();\n\t\tactiveControllers.clear();\n\t\tstatusController = undefined;\n\t\tcache.clear();\n\t\tfailureBackoff.clear();\n\t\tlatestQueries.clear();\n\t\tactiveCurrentIdentity = undefined;\n\t\tsafeSetStatus(ctx, undefined);\n\t});\n\n\tfastRuntime = registerCodexFastMode(pi, settingsRuntime, (ctx) =>\n\t\tstartStatusRefresh(ctx, ctx.model, false),\n\t);\n}\n", "import type {\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionContext,\n} from \"@earendil-works/pi-coding-agent\";\nimport {\n\tcodexFastAvailability,\n\tcodexFastIsEffective,\n\tcodexFastStatusLabel,\n\tcorrectCodexFastMessageCost,\n\trewriteCodexFastPayload,\n} from \"./codex-fast.js\";\nimport { errorMessage } from \"./core.js\";\nimport { isStaleExtensionContextError } from \"./query.js\";\nimport type { UsageSettingsRuntime, UsageSettingsState } from \"./settings.js\";\nimport type { PiModel } from \"./types.js\";\n\nconst NO_FAST_REQUEST = Symbol(\"no-fast-request\");\ntype PendingFastRequest = { fastRequested: boolean; model: PiModel };\n\nexport const FAST_USAGE_WARNING = \"Fast is about 1.5\u00D7 faster and uses more of your plan allowance.\";\n\nexport function registerCodexFastMode(\n\tpi: ExtensionAPI,\n\tsettingsRuntime: UsageSettingsRuntime,\n\trefreshStatus: (ctx: ExtensionContext) => void,\n) {\n\tlet sessionController = new AbortController();\n\tlet generation = 0;\n\tconst pendingFastRequests = new Map<string, PendingFastRequest>();\n\n\tconst toggle = async (\n\t\tctx: ExtensionCommandContext,\n\t\tenabled: boolean,\n\t\tcallerSignal?: AbortSignal,\n\t): Promise<boolean> => {\n\t\tconst ownerGeneration = generation;\n\t\tconst sessionId = ctx.sessionManager.getSessionId();\n\t\tconst signal = callerSignal\n\t\t\t? AbortSignal.any([callerSignal, sessionController.signal])\n\t\t\t: sessionController.signal;\n\t\ttry {\n\t\t\tawait settingsRuntime.update({ codexFastMode: enabled }, signal);\n\t\t} catch (error) {\n\t\t\tif (isAbortError(error) || isStaleExtensionContextError(error)) return false;\n\t\t\tctx.ui.notify(`Could not save pi-usage.json: ${errorMessage(error)}`, \"error\");\n\t\t\treturn false;\n\t\t}\n\t\tif (\n\t\t\tsignal.aborted ||\n\t\t\townerGeneration !== generation ||\n\t\t\tctx.sessionManager.getSessionId() !== sessionId\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t\trefreshStatus(ctx);\n\t\tctx.ui.notify(\n\t\t\tenabled\n\t\t\t\t? `Codex Fast mode enabled. ${FAST_USAGE_WARNING}`\n\t\t\t\t: \"Codex Fast mode disabled; standard routing will be used.\",\n\t\t\t\"info\",\n\t\t);\n\t\treturn true;\n\t};\n\n\tpi.registerCommand(\"fast\", {\n\t\tdescription: \"Toggle Codex Fast mode\",\n\t\thandler: async (args, ctx) => {\n\t\t\tif (args.trim()) {\n\t\t\t\tif (!ctx.hasUI) throw new Error(\"/fast does not accept arguments.\");\n\t\t\t\tctx.ui.notify(\"/fast does not accept arguments.\", \"warning\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!ctx.hasUI) throw new Error(\"/fast requires TUI or RPC mode.\");\n\t\t\tconst availability = codexFastAvailability(\n\t\t\t\tctx.model,\n\t\t\t\tsettingsRuntime.get().settings.codexFastMode,\n\t\t\t);\n\t\t\tif (availability.kind === \"not-codex\") {\n\t\t\t\tctx.ui.notify(\"/fast is available only for the active OpenAI Codex model.\", \"warning\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (availability.kind === \"unavailable\") {\n\t\t\t\tctx.ui.notify(availability.reason, \"warning\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (settingsRuntime.get().kind === \"invalid\") {\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\"pi-usage.json is invalid; repair it and run /reload before changing Fast mode.\",\n\t\t\t\t\t\"error\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait toggle(ctx, !availability.enabled);\n\t\t},\n\t});\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tgeneration += 1;\n\t\tsessionController.abort();\n\t\tpendingFastRequests.clear();\n\t\tsessionController = new AbortController();\n\t\tconst ownerGeneration = generation;\n\t\tconst sessionId = ctx.sessionManager.getSessionId();\n\t\tlet state: Readonly<UsageSettingsState>;\n\t\ttry {\n\t\t\tstate = await settingsRuntime.reload(sessionController.signal);\n\t\t} catch (error) {\n\t\t\tif (sessionController.signal.aborted || ownerGeneration !== generation) return;\n\t\t\tif (ctx.hasUI) {\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t`Could not load pi-usage.json; using defaults. ${errorMessage(error)}`,\n\t\t\t\t\t\"warning\",\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (\n\t\t\tsessionController.signal.aborted ||\n\t\t\townerGeneration !== generation ||\n\t\t\tctx.sessionManager.getSessionId() !== sessionId\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tif (ctx.hasUI && state.kind === \"invalid\") {\n\t\t\tctx.ui.notify(\n\t\t\t\t`Invalid pi-usage.json; using defaults without overwriting it. ${state.issue}`,\n\t\t\t\t\"warning\",\n\t\t\t);\n\t\t}\n\t\trefreshStatus(ctx);\n\t});\n\n\tpi.on(\"before_provider_request\", (event, ctx) => {\n\t\tconst rewritten = rewriteCodexFastPayload(\n\t\t\tevent.payload,\n\t\t\tctx.model,\n\t\t\tsettingsRuntime.get().settings.codexFastMode,\n\t\t);\n\t\tconst key = activeRequestKey(ctx);\n\t\tif (key && ctx.model) {\n\t\t\tpendingFastRequests.set(key, {\n\t\t\t\tfastRequested: isRecord(rewritten) && rewritten.service_tier === \"priority\",\n\t\t\t\tmodel: ctx.model,\n\t\t\t});\n\t\t}\n\t\treturn rewritten;\n\t});\n\tpi.on(\"message_end\", (event, ctx) => {\n\t\tconst request = consumeFastRequest(ctx, event.message, pendingFastRequests);\n\t\tif (request === NO_FAST_REQUEST) return undefined;\n\t\tconst message = correctCodexFastMessageCost(\n\t\t\tevent.message,\n\t\t\trequest.model,\n\t\t\trequest.fastRequested,\n\t\t);\n\t\treturn message ? { message: message as never } : undefined;\n\t});\n\tpi.on(\"session_shutdown\", async () => {\n\t\tgeneration += 1;\n\t\tsessionController.abort();\n\t\tpendingFastRequests.clear();\n\t\tawait settingsRuntime.flush();\n\t});\n\n\treturn {\n\t\tavailability(model: PiModel | undefined) {\n\t\t\treturn codexFastAvailability(model, settingsRuntime.get().settings.codexFastMode);\n\t\t},\n\t\tdecorateStatus(model: PiModel | undefined, status: string) {\n\t\t\treturn codexFastStatusLabel(\n\t\t\t\tstatus,\n\t\t\t\tcodexFastIsEffective(model, settingsRuntime.get().settings.codexFastMode),\n\t\t\t);\n\t\t},\n\t\ttoggle,\n\t};\n}\n\nfunction activeRequestKey(ctx: ExtensionContext): string | undefined {\n\tconst model = ctx.model;\n\treturn model ? `${ctx.sessionManager.getSessionId()}:${model.provider}/${model.id}` : undefined;\n}\n\nfunction consumeFastRequest(\n\tctx: ExtensionContext,\n\tmessage: unknown,\n\tpending: Map<string, PendingFastRequest>,\n): PendingFastRequest | typeof NO_FAST_REQUEST {\n\tif (!isRecord(message) || message.role !== \"assistant\") return NO_FAST_REQUEST;\n\tconst key = messageRequestKey(ctx, message);\n\tif (!key) return NO_FAST_REQUEST;\n\tconst request = pending.get(key);\n\tpending.delete(key);\n\treturn request ?? NO_FAST_REQUEST;\n}\n\nfunction messageRequestKey(\n\tctx: ExtensionContext,\n\tmessage: Record<string, unknown>,\n): string | undefined {\n\tif (typeof message.provider !== \"string\" || typeof message.model !== \"string\") return undefined;\n\treturn `${ctx.sessionManager.getSessionId()}:${message.provider}/${message.model}`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isAbortError(error: unknown): boolean {\n\treturn error instanceof Error && error.name === \"AbortError\";\n}\n", "import type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { sanitizeDisplayText } from \"./core.js\";\nimport { providerIsConfigured, SUPPORTED_ADAPTERS } from \"./query.js\";\nimport type { PiModel, UsageProviderAdapter } from \"./types.js\";\n\nexport function configuredAdapters(ctx: ExtensionContext): UsageProviderAdapter[] {\n\treturn SUPPORTED_ADAPTERS.filter(\n\t\t(adapter) => adapter.id === ctx.model?.provider || providerIsConfigured(ctx, adapter.id),\n\t);\n}\n\nexport function providerDisplayName(ctx: ExtensionContext, providerId: string): string {\n\ttry {\n\t\treturn sanitizeDisplayText(ctx.modelRegistry.getProviderDisplayName(providerId), 80);\n\t} catch {\n\t\treturn sanitizeDisplayText(providerId, 80);\n\t}\n}\n\nexport function setBoundedMap<T>(map: Map<string, T>, key: string, value: T, limit: number): void {\n\tmap.delete(key);\n\twhile (map.size >= limit) {\n\t\tconst oldest = map.keys().next().value;\n\t\tif (oldest === undefined) break;\n\t\tmap.delete(oldest);\n\t}\n\tmap.set(key, value);\n}\n\nexport function modelIdentity(model: PiModel | undefined): string | undefined {\n\treturn model ? `${model.provider}/${model.id}` : undefined;\n}\n\nexport function isAbortError(error: unknown): boolean {\n\treturn error instanceof Error && error.name === \"AbortError\";\n}\n\nexport function isTimeoutError(error: unknown): boolean {\n\treturn error instanceof Error && error.name === \"TimeoutError\";\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["readStoredCredential", "readStoredCredential", "asObject", "asString", "asObject", "asString", "asNonnegativeNumber", "clampPercent", "asObject", "asNonnegativeNumber", "asString", "readStoredCredential", "asObject", "storedAccess", "refresh", "readStoredCredential", "bearerToken", "headerValue", "asObject", "clampPercent", "isRecord", "randomUUID", "isAbortError", "isRecord", "isAbortError", "randomUUID", "isAbortError"]
|
|
7
7
|
}
|
package/package.json
CHANGED
package/src/query.ts
CHANGED
|
@@ -23,6 +23,7 @@ import type {
|
|
|
23
23
|
const CODEX_USAGE_URL = "https://chatgpt.com/backend-api/wham/usage";
|
|
24
24
|
const GITHUB_COPILOT_USAGE_URL = "https://api.github.com/copilot_internal/user";
|
|
25
25
|
const OPENROUTER_KEY_URL = "https://openrouter.ai/api/v1/key";
|
|
26
|
+
const OPENCODE_GO_USAGE_URL = "https://opencode.ai/zen/go/v1/usage";
|
|
26
27
|
const MAX_SUCCESS_BODY_BYTES = 64 * 1024;
|
|
27
28
|
const MAX_ERROR_BODY_BYTES = 4 * 1024;
|
|
28
29
|
|
|
@@ -86,7 +87,7 @@ export const SUPPORTED_ADAPTERS: readonly UsageProviderAdapter[] = [
|
|
|
86
87
|
semantics: { kind: "consumer-subscription", label: "OpenCode Zen plan usage" },
|
|
87
88
|
async query(auth, signal, timeoutMs) {
|
|
88
89
|
const payload = await fetchProviderJson(
|
|
89
|
-
|
|
90
|
+
OPENCODE_GO_USAGE_URL,
|
|
90
91
|
auth,
|
|
91
92
|
signal,
|
|
92
93
|
timeoutMs,
|
|
@@ -127,6 +128,7 @@ export async function resolveUsageAuth(
|
|
|
127
128
|
hasOfficialOrigin(candidate, adapter.id),
|
|
128
129
|
);
|
|
129
130
|
if (!model) return undefined;
|
|
131
|
+
// SAFETY: Pi exposes the required auth methods at runtime, and checks below narrow them before use.
|
|
130
132
|
const registry = ctx.modelRegistry as unknown as UsageAuthRegistry;
|
|
131
133
|
let modelAuth: RequestAuth | undefined;
|
|
132
134
|
if (ctx.model?.provider === adapter.id && typeof registry.getApiKeyAndHeaders === "function") {
|
|
@@ -493,12 +495,6 @@ function hasHeader(headers: Record<string, string>, name: string): boolean {
|
|
|
493
495
|
return Object.keys(headers).some((key) => key.toLowerCase() === name.toLowerCase());
|
|
494
496
|
}
|
|
495
497
|
|
|
496
|
-
function opencodeUsageUrl(baseUrl: string | undefined): string {
|
|
497
|
-
const base = baseUrl?.trim().replace(/\/+$/u, "");
|
|
498
|
-
if (!base) throw new Error("OpenCode Go model base URL is unavailable.");
|
|
499
|
-
return `${base}/usage`;
|
|
500
|
-
}
|
|
501
|
-
|
|
502
498
|
function isAbortError(error: unknown): boolean {
|
|
503
499
|
return error instanceof Error && error.name === "AbortError";
|
|
504
500
|
}
|