opencode-anthropic-multi-account 0.2.11 → 0.2.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -900,10 +900,13 @@ function printQuotaError(account, error) {
900
900
 
901
901
  // src/account-store.ts
902
902
  import {
903
- AccountStore,
904
- setAccountsFilename
903
+ AccountStore as CoreAccountStore
905
904
  } from "opencode-multi-account-core";
906
- setAccountsFilename(ACCOUNTS_FILENAME);
905
+ var AccountStore = class extends CoreAccountStore {
906
+ constructor() {
907
+ super(ACCOUNTS_FILENAME);
908
+ }
909
+ };
907
910
 
908
911
  // src/auth-handler.ts
909
912
  import { randomUUID } from "crypto";
@@ -1343,6 +1346,7 @@ function getModelBetas(modelId, excluded) {
1343
1346
  }
1344
1347
 
1345
1348
  // src/anthropic-prompt.ts
1349
+ var INJECTED_SYSTEM_PROMPT = "You are Claude Code, an interactive CLI tool that helps users with software engineering tasks.";
1346
1350
  var SYSTEM_PROMPT = `You are an interactive CLI tool that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user.
1347
1351
 
1348
1352
  IMPORTANT: Assist with defensive security tasks only. Refuse to create, modify, or improve code that may be used maliciously. Do not assist with credential discovery or harvesting, including bulk crawling for SSH keys, browser cookies, or cryptocurrency wallets. Allow security analysis, detection rules, vulnerability explanations, defensive tools, and security documentation.
@@ -1511,8 +1515,8 @@ assistant: Clients are marked as failed in the \`connectToServer\` function in s
1511
1515
  </example>`;
1512
1516
 
1513
1517
  // src/request-transform.ts
1514
- function getSystemPrompt() {
1515
- return SYSTEM_PROMPT;
1518
+ function getInjectedSystemPrompt() {
1519
+ return INJECTED_SYSTEM_PROMPT;
1516
1520
  }
1517
1521
  function sampleCodeUnits(text, indices) {
1518
1522
  return indices.map((i) => i < text.length ? text.charCodeAt(i).toString(16) : "30").join("");
@@ -1528,6 +1532,11 @@ function buildBillingHeader(firstUserMessage) {
1528
1532
  var OPENCODE_CAMEL_RE = /OpenCode/g;
1529
1533
  var OPENCODE_LOWER_RE = /(?<!\/)opencode/gi;
1530
1534
  var TOOL_PREFIX_RESPONSE_RE = /"name"\s*:\s*"mcp_([^"]+)"/g;
1535
+ var PARAGRAPH_REMOVAL_ANCHORS = [
1536
+ "github.com/anomalyco/opencode",
1537
+ "opencode.ai/docs"
1538
+ ];
1539
+ var BILLING_HEADER_PREFIX = "x-anthropic-billing-header:";
1531
1540
  function addToolPrefix(name) {
1532
1541
  if (!ANTHROPIC_OAUTH_ADAPTER.transform.addToolPrefix) {
1533
1542
  return name;
@@ -1537,6 +1546,115 @@ function addToolPrefix(name) {
1537
1546
  }
1538
1547
  return `${TOOL_PREFIX}${name}`;
1539
1548
  }
1549
+ function isRecord(value) {
1550
+ return typeof value === "object" && value !== null;
1551
+ }
1552
+ function isProtectedSystemText(text) {
1553
+ return text === SYSTEM_PROMPT || text === INJECTED_SYSTEM_PROMPT || text.startsWith(BILLING_HEADER_PREFIX);
1554
+ }
1555
+ function sanitizeSystemText(text) {
1556
+ const paragraphs = text.split(/\n\n+/).map((paragraph) => paragraph.trim()).filter(Boolean).filter((paragraph) => !PARAGRAPH_REMOVAL_ANCHORS.some((anchor) => paragraph.includes(anchor)));
1557
+ return paragraphs.join("\n\n").replace(OPENCODE_CAMEL_RE, "Claude Code").replace(OPENCODE_LOWER_RE, "Claude").replace(/\n{3,}/g, "\n\n").trim();
1558
+ }
1559
+ function normalizeSystemEntries(system) {
1560
+ if (typeof system === "string") {
1561
+ const text = system.trim();
1562
+ return text ? [{ type: "text", text }] : [];
1563
+ }
1564
+ if (!Array.isArray(system)) {
1565
+ return [];
1566
+ }
1567
+ const normalized = [];
1568
+ for (const entry of system) {
1569
+ if (typeof entry === "string") {
1570
+ const text = entry.trim();
1571
+ if (text) {
1572
+ normalized.push({ type: "text", text });
1573
+ }
1574
+ continue;
1575
+ }
1576
+ if (!isRecord(entry)) {
1577
+ continue;
1578
+ }
1579
+ const rawText = typeof entry.text === "string" ? entry.text.trim() : "";
1580
+ if (!rawText) {
1581
+ continue;
1582
+ }
1583
+ normalized.push({
1584
+ ...entry,
1585
+ type: "text",
1586
+ text: rawText
1587
+ });
1588
+ }
1589
+ return normalized;
1590
+ }
1591
+ function prependToMessageContent(content, prefix) {
1592
+ if (!prefix) {
1593
+ return content;
1594
+ }
1595
+ if (typeof content === "string") {
1596
+ return content ? `${prefix}
1597
+
1598
+ ${content}` : prefix;
1599
+ }
1600
+ if (!Array.isArray(content)) {
1601
+ return [{ type: "text", text: prefix }];
1602
+ }
1603
+ const firstTextIndex = content.findIndex(
1604
+ (block) => isRecord(block) && block.type === "text" && typeof block.text === "string"
1605
+ );
1606
+ if (firstTextIndex === -1) {
1607
+ return [{ type: "text", text: prefix }, ...content];
1608
+ }
1609
+ return content.map((block, index) => {
1610
+ if (index !== firstTextIndex || !isRecord(block) || typeof block.text !== "string") {
1611
+ return block;
1612
+ }
1613
+ return {
1614
+ ...block,
1615
+ text: block.text ? `${prefix}
1616
+
1617
+ ${block.text}` : prefix
1618
+ };
1619
+ });
1620
+ }
1621
+ function relocateSystemTextToFirstUser(parsed, systemEntries) {
1622
+ if (!Array.isArray(parsed.messages) || parsed.messages.length === 0) {
1623
+ return systemEntries.map((entry) => isProtectedSystemText(entry.text) ? entry : { ...entry, text: sanitizeSystemText(entry.text) }).filter((entry) => entry.text);
1624
+ }
1625
+ const preservedEntries = [];
1626
+ const relocatedTexts = [];
1627
+ for (const entry of systemEntries) {
1628
+ if (isProtectedSystemText(entry.text)) {
1629
+ preservedEntries.push(entry);
1630
+ continue;
1631
+ }
1632
+ const sanitizedText = sanitizeSystemText(entry.text);
1633
+ if (!sanitizedText) {
1634
+ continue;
1635
+ }
1636
+ relocatedTexts.push(sanitizedText);
1637
+ }
1638
+ if (relocatedTexts.length === 0) {
1639
+ return systemEntries.map((entry) => isProtectedSystemText(entry.text) ? entry : { ...entry, text: sanitizeSystemText(entry.text) }).filter((entry) => entry.text);
1640
+ }
1641
+ const prefix = relocatedTexts.join("\n\n");
1642
+ const nextMessages = [...parsed.messages];
1643
+ const userMessageIndex = nextMessages.findIndex((message) => message.role === "user");
1644
+ if (userMessageIndex === -1) {
1645
+ return systemEntries.map((entry) => isProtectedSystemText(entry.text) ? entry : { ...entry, text: sanitizeSystemText(entry.text) }).filter((entry) => entry.text);
1646
+ }
1647
+ const userMessage = nextMessages[userMessageIndex];
1648
+ if (!userMessage) {
1649
+ return systemEntries.map((entry) => isProtectedSystemText(entry.text) ? entry : { ...entry, text: sanitizeSystemText(entry.text) }).filter((entry) => entry.text);
1650
+ }
1651
+ nextMessages[userMessageIndex] = {
1652
+ ...userMessage,
1653
+ content: prependToMessageContent(userMessage.content, prefix)
1654
+ };
1655
+ parsed.messages = nextMessages;
1656
+ return preservedEntries;
1657
+ }
1540
1658
  function stripToolPrefixFromLine(line) {
1541
1659
  if (!ANTHROPIC_OAUTH_ADAPTER.transform.stripToolPrefixInResponse) {
1542
1660
  return line;
@@ -1593,16 +1711,9 @@ function transformRequestBody(body) {
1593
1711
  if (!body) return body;
1594
1712
  try {
1595
1713
  const parsed = JSON.parse(body);
1596
- if (parsed.system && Array.isArray(parsed.system)) {
1597
- parsed.system = parsed.system.map((systemEntry) => {
1598
- if (ANTHROPIC_OAUTH_ADAPTER.transform.rewriteOpenCodeBranding && systemEntry.type === "text" && systemEntry.text) {
1599
- return {
1600
- ...systemEntry,
1601
- text: systemEntry.text.replace(OPENCODE_CAMEL_RE, "Claude Code").replace(OPENCODE_LOWER_RE, "Claude")
1602
- };
1603
- }
1604
- return systemEntry;
1605
- });
1714
+ if (ANTHROPIC_OAUTH_ADAPTER.transform.rewriteOpenCodeBranding) {
1715
+ const normalizedSystemEntries = normalizeSystemEntries(parsed.system);
1716
+ parsed.system = relocateSystemTextToFirstUser(parsed, normalizedSystemEntries);
1606
1717
  }
1607
1718
  if (parsed.tools && Array.isArray(parsed.tools)) {
1608
1719
  parsed.tools = parsed.tools.map((tool2) => ({
@@ -1942,7 +2053,7 @@ function extractFirstUserText(input) {
1942
2053
  return "";
1943
2054
  }
1944
2055
  function injectSystemPrompt(output) {
1945
- const systemPrompt = getSystemPrompt();
2056
+ const systemPrompt = getInjectedSystemPrompt();
1946
2057
  if (!Array.isArray(output.system)) {
1947
2058
  output.system = [systemPrompt];
1948
2059
  return;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/account-manager.ts","../src/constants.ts","../src/pi-ai-adapter.ts","../src/token-node-request.ts","../src/utils.ts","../src/config.ts","../src/usage.ts","../src/types.ts","../src/token.ts","../src/executor.ts","../src/rate-limit.ts","../src/pool-chain-executor.ts","../src/ui/ansi.ts","../src/ui/select.ts","../src/ui/confirm.ts","../src/ui/auth-menu.ts","../src/account-store.ts","../src/auth-handler.ts","../src/request-transform.ts","../src/model-config.ts","../src/betas.ts","../src/anthropic-prompt.ts","../src/proactive-refresh.ts","../src/runtime-factory.ts","../src/bootstrap-auth.ts"],"sourcesContent":["import { tool } from \"@opencode-ai/plugin\";\nimport type { Plugin } from \"@opencode-ai/plugin\";\nimport {\n CascadeStateManager,\n loadPoolChainConfig,\n migrateFromAuthJson,\n PoolManager,\n type PoolChainConfig,\n} from \"opencode-multi-account-core\";\nimport { AccountManager } from \"./account-manager\";\nimport { executeWithAccountRotation } from \"./executor\";\nimport { getPlanLabel, getUsageSummary } from \"./usage\";\nimport { handleAuthorize } from \"./auth-handler\";\nimport { getSystemPrompt, buildBillingHeader } from \"./request-transform\";\nimport { ANTHROPIC_BETA_HEADER } from \"./constants\";\nimport { loadConfig } from \"./config\";\nimport { ProactiveRefreshQueue } from \"./proactive-refresh\";\nimport { AccountStore } from \"./account-store\";\nimport { AccountRuntimeFactory } from \"./runtime-factory\";\nimport { formatWaitTime, getAccountLabel, showToast } from \"./utils\";\nimport { ANTHROPIC_OAUTH_ADAPTER } from \"./constants\";\nimport { getUserAgent } from \"./model-config\";\nimport { syncBootstrapAuth } from \"./bootstrap-auth\";\nimport type { OAuthCredentials, PluginClient } from \"./types\";\n\nconst EMPTY_OAUTH_CREDENTIALS: OAuthCredentials = {\n type: \"oauth\",\n refresh: \"\",\n access: \"\",\n expires: 0,\n};\n\nfunction extractFirstUserText(input: Record<string, unknown>): string {\n try {\n const raw = input as { messages?: unknown; request?: { messages?: unknown } };\n const messages = (raw.messages ?? raw.request?.messages) as\n Array<{ role?: string; content?: string | Array<{ type?: string; text?: string }> }> | undefined;\n if (!Array.isArray(messages)) return \"\";\n for (const msg of messages) {\n if (msg.role !== \"user\") continue;\n if (typeof msg.content === \"string\") return msg.content;\n if (Array.isArray(msg.content)) {\n for (const block of msg.content) {\n if (block.type === \"text\" && block.text) return block.text;\n }\n }\n }\n } catch {}\n return \"\";\n}\n\nfunction injectSystemPrompt(output: { system?: string[] }): void {\n const systemPrompt = getSystemPrompt();\n\n if (!Array.isArray(output.system)) {\n output.system = [systemPrompt];\n return;\n }\n\n if (!output.system.includes(systemPrompt)) {\n output.system.unshift(systemPrompt);\n }\n}\n\nexport const ClaudeMultiAuthPlugin: Plugin = async (ctx) => {\n const { client } = ctx as unknown as { client: PluginClient } & Record<string, unknown>;\n\n await loadConfig();\n\n const store = new AccountStore();\n await syncBootstrapAuth(client, store).catch(() => {});\n\n let manager: AccountManager | null = null;\n let runtimeFactory: AccountRuntimeFactory | null = null;\n let refreshQueue: ProactiveRefreshQueue | null = null;\n let poolManager: PoolManager | null = null;\n let cascadeStateManager: CascadeStateManager | null = null;\n let poolChainConfig: PoolChainConfig = { pools: [], chains: [] };\n\n async function ensureExecutionInfrastructure(): Promise<void> {\n runtimeFactory ??= new AccountRuntimeFactory(store, client);\n poolChainConfig = await loadPoolChainConfig();\n\n poolManager ??= new PoolManager();\n poolManager.loadPools(poolChainConfig.pools);\n cascadeStateManager ??= new CascadeStateManager();\n\n if (manager) {\n manager.setRuntimeFactory(runtimeFactory);\n manager.setClient(client);\n }\n }\n\n async function startRefreshQueueIfNeeded(): Promise<void> {\n if (!manager || manager.getAccountCount() === 0) {\n return;\n }\n\n await ensureExecutionInfrastructure();\n\n if (refreshQueue) {\n return;\n }\n\n refreshQueue = new ProactiveRefreshQueue(\n client,\n store,\n (uuid) => {\n runtimeFactory?.invalidate(uuid);\n void manager?.refresh();\n },\n );\n refreshQueue.start();\n }\n\n async function initializeManagerFromStore(): Promise<boolean> {\n if (manager) {\n return manager.getAccountCount() > 0;\n }\n\n const storage = await store.load();\n if (storage.accounts.length === 0) {\n return false;\n }\n\n manager = await AccountManager.create(store, EMPTY_OAUTH_CREDENTIALS, client);\n await ensureExecutionInfrastructure();\n await startRefreshQueueIfNeeded();\n return manager.getAccountCount() > 0;\n }\n\n async function initializeManagerFromAuth(credentials: OAuthCredentials): Promise<void> {\n if (!manager) {\n manager = await AccountManager.create(store, credentials, client);\n }\n\n await ensureExecutionInfrastructure();\n await startRefreshQueueIfNeeded();\n }\n\n await initializeManagerFromStore().catch(() => {});\n\n return {\n \"experimental.chat.system.transform\": (input: Record<string, unknown>, output: { system?: string[] }) => {\n injectSystemPrompt(output);\n const billingHeader = buildBillingHeader(extractFirstUserText(input));\n if (billingHeader && !output.system?.includes(billingHeader)) {\n output.system?.unshift(billingHeader);\n }\n },\n\n tool: {\n [ANTHROPIC_OAUTH_ADAPTER.statusToolName]: tool({\n description:\n \"Show status of all multi-auth accounts including rate limits and usage.\",\n args: {},\n async execute(_args, _context) {\n if (!manager) {\n return \"Multi-auth not initialized. No OAuth accounts detected.\";\n }\n\n const accounts = manager.getAccounts();\n if (accounts.length === 0) {\n return \"No accounts configured. Run `opencode auth login` to add an account.\";\n }\n\n const lines: string[] = [\n `## ${ANTHROPIC_OAUTH_ADAPTER.modelDisplayName} Multi-Auth Status (${accounts.length} accounts)\\n`,\n ];\n\n for (const account of accounts) {\n const isActive = account.uuid === manager.getActiveAccount()?.uuid;\n const marker = isActive ? \" **[ACTIVE]**\" : \"\";\n const label = getAccountLabel(account);\n const usage = getUsageSummary(account);\n const planLabel = getPlanLabel(account);\n const planBadge = planLabel ? ` [${planLabel}]` : \"\";\n\n const statusParts: string[] = [];\n if (account.isAuthDisabled) statusParts.push(`AUTH DISABLED: ${account.authDisabledReason}`);\n else if (!account.enabled) statusParts.push(\"disabled\");\n else statusParts.push(\"enabled\");\n\n if (account.rateLimitResetAt) {\n if (account.rateLimitResetAt > Date.now()) {\n const remaining = formatWaitTime(account.rateLimitResetAt - Date.now());\n statusParts.push(`RATE LIMITED (resets in ${remaining})`);\n } else {\n statusParts.push(\"RATE LIMIT RESET\");\n }\n }\n\n if (account.cachedUsage) {\n const now = Date.now();\n const usage = account.cachedUsage;\n const exhaustedTiers = [usage.five_hour, usage.seven_day].filter((tier) =>\n tier\n && tier.utilization >= 100\n && tier.resets_at != null\n && Date.parse(tier.resets_at) > now,\n );\n if (exhaustedTiers.length > 0) {\n statusParts.push(\"USAGE EXHAUSTED\");\n }\n }\n\n lines.push(\n `- **${label}**${planBadge}${marker}: ${statusParts.join(\" | \")} | ${usage}`,\n );\n }\n\n return lines.join(\"\\n\");\n },\n }),\n },\n\n auth: {\n provider: ANTHROPIC_OAUTH_ADAPTER.authProviderId,\n methods: [\n {\n label: ANTHROPIC_OAUTH_ADAPTER.authMethodLabel,\n type: \"oauth\" as const,\n async authorize() {\n const inputs = arguments.length > 0 ? (arguments[0] as Record<string, string>) : undefined;\n return handleAuthorize(manager, inputs, client);\n },\n },\n { type: \"api\" as const, label: \"Create an API Key\" },\n { type: \"api\" as const, label: \"Manually enter API Key\" },\n ],\n\n async loader(\n getAuth: () => Promise<unknown>,\n provider: Record<string, unknown>,\n ) {\n const auth = await getAuth() as Record<string, unknown>;\n if (auth.type !== \"oauth\") {\n return { apiKey: \"\", fetch };\n }\n\n for (const model of Object.values((provider as Record<string, unknown>).models ?? {}) as Record<string, unknown>[]) {\n if (model) {\n model.cost = { input: 0, output: 0, cache: { read: 0, write: 0 } };\n }\n }\n\n const credentials = auth as OAuthCredentials;\n await migrateFromAuthJson(\"anthropic\", store);\n await initializeManagerFromAuth(credentials);\n\n const initializedManager = manager;\n if (!initializedManager) {\n return { apiKey: \"\", fetch };\n }\n\n if (initializedManager.getAccountCount() > 0) {\n const activeAccount = initializedManager.getActiveAccount();\n const activeLabel = activeAccount ? getAccountLabel(activeAccount) : \"none\";\n void showToast(\n client,\n `Multi-Auth: ${initializedManager.getAccountCount()} account(s) loaded. Active: ${activeLabel}`,\n \"info\",\n );\n await initializedManager.validateNonActiveTokens(client);\n\n const disabledCount = initializedManager.getAccounts().filter((a) => a.isAuthDisabled).length;\n if (disabledCount > 0) {\n void showToast(\n client,\n `${disabledCount} account(s) have auth failures.`,\n \"warning\",\n );\n }\n }\n\n return {\n apiKey: \"\",\n \"chat.headers\": async (input: { provider?: { info?: { id?: string } } }, output: { headers: Record<string, string> }) => {\n if (input.provider?.info?.id !== ANTHROPIC_OAUTH_ADAPTER.authProviderId) return;\n output.headers[\"user-agent\"] = getUserAgent();\n output.headers[\"anthropic-beta\"] = ANTHROPIC_BETA_HEADER;\n output.headers[\"x-app\"] = \"cli\";\n },\n async fetch(input: RequestInfo | URL, init?: RequestInit) {\n if (!initializedManager || !runtimeFactory) {\n return fetch(input, init);\n }\n\n if (initializedManager.getAccountCount() === 0) {\n throw new Error(\n \"No Anthropic accounts configured. Run `opencode auth login` to add an account.\",\n );\n }\n\n if (!poolManager || !cascadeStateManager) {\n poolManager = new PoolManager();\n poolManager.loadPools(poolChainConfig.pools);\n cascadeStateManager = new CascadeStateManager();\n }\n\n return executeWithAccountRotation(\n initializedManager,\n runtimeFactory,\n client,\n input,\n init,\n {\n poolManager,\n cascadeStateManager,\n poolChainConfig,\n },\n );\n },\n };\n },\n },\n };\n};\n","import { createAccountManagerForProvider } from \"opencode-multi-account-core\";\nimport { isTokenExpired, refreshToken } from \"./token\";\n\nexport const AccountManager = createAccountManagerForProvider({\n providerAuthId: \"anthropic\",\n isTokenExpired,\n refreshToken,\n});\n\nexport type AccountManager = InstanceType<typeof AccountManager>;\n","import { anthropicOAuthAdapter } from \"opencode-multi-account-core\";\n\n/** Anthropic OAuth adapter config */\nexport const ANTHROPIC_OAUTH_ADAPTER = anthropicOAuthAdapter;\n\nexport const ANTHROPIC_CLIENT_ID = ANTHROPIC_OAUTH_ADAPTER.oauthClientId;\n\n/** Token exchange / refresh endpoint */\nexport const ANTHROPIC_TOKEN_ENDPOINT =\n ANTHROPIC_OAUTH_ADAPTER.tokenEndpoint;\n\n/** OAuth usage stats endpoint */\nexport const ANTHROPIC_USAGE_ENDPOINT =\n ANTHROPIC_OAUTH_ADAPTER.usageEndpoint;\n\n/** OAuth profile endpoint for email/plan info */\nexport const ANTHROPIC_PROFILE_ENDPOINT = ANTHROPIC_OAUTH_ADAPTER.profileEndpoint;\n\n/** Required beta header for OAuth requests */\nexport const ANTHROPIC_BETA_HEADER =\n ANTHROPIC_OAUTH_ADAPTER.requestBetaHeader;\n\n/** User-Agent header to mimic Claude CLI */\nexport const CLAUDE_CLI_USER_AGENT = ANTHROPIC_OAUTH_ADAPTER.cliUserAgent;\n\n/** Tool name prefix required by Anthropic servers */\nexport const TOOL_PREFIX = ANTHROPIC_OAUTH_ADAPTER.toolPrefix;\n\n/** Account storage filename */\nexport const ACCOUNTS_FILENAME = ANTHROPIC_OAUTH_ADAPTER.accountStorageFilename;\n\n/** Plan display labels derived from adapter */\nexport const PLAN_LABELS = ANTHROPIC_OAUTH_ADAPTER.planLabels;\n\n/** Access token expiry buffer (refresh 60s before expiry) */\nexport const TOKEN_EXPIRY_BUFFER_MS = 60_000;\n\n/** Maximum time to wait for a token refresh HTTP request */\nexport const TOKEN_REFRESH_TIMEOUT_MS = 30_000;\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport * as piAiOauth from \"@mariozechner/pi-ai/oauth\";\nimport type { OAuthCredentials as PiAiOAuthCredentials, OAuthPrompt } from \"@mariozechner/pi-ai/oauth\";\nimport {\n ANTHROPIC_OAUTH_ADAPTER,\n TOKEN_REFRESH_TIMEOUT_MS,\n} from \"./constants\";\nimport * as tokenNodeRequest from \"./token-node-request\";\nimport { fetchProfile } from \"./usage\";\nimport type { StoredAccount, CredentialRefreshPatch } from \"./types\";\n\n// pi-ai `expires` is epoch milliseconds: Date.now() + expires_in * 1000 - 5min buffer\n// StoredAccount `expiresAt` is also epoch milliseconds → 1:1 mapping, no unit conversion needed.\n\nexport function toPiAiCredentials(\n account: Pick<StoredAccount, \"accessToken\" | \"refreshToken\" | \"expiresAt\">,\n): PiAiOAuthCredentials {\n return {\n access: account.accessToken ?? \"\",\n refresh: account.refreshToken,\n expires: account.expiresAt ?? 0,\n };\n}\n\nexport function fromPiAiCredentials(\n creds: PiAiOAuthCredentials,\n): Pick<StoredAccount, \"accessToken\" | \"refreshToken\" | \"expiresAt\"> {\n return {\n accessToken: creds.access,\n refreshToken: creds.refresh,\n expiresAt: creds.expires,\n };\n}\n\nexport interface LoginWithPiAiCallbacks {\n onAuth: (info: { url: string; instructions?: string }) => void;\n onPrompt: (prompt: OAuthPrompt) => Promise<string>;\n onProgress?: (message: string) => void;\n onManualCodeInput?: () => Promise<string>;\n}\n\nconst ANTHROPIC_REFRESH_ENDPOINT = \"https://platform.claude.com/v1/oauth/token\";\nconst REFRESH_NODE_EXECUTABLE = process.env.OPENCODE_REFRESH_NODE_EXECUTABLE || \"node\";\nconst tokenProxyContext = new AsyncLocalStorage<boolean>();\nlet tokenProxyInstalled = false;\nlet tokenProxyOriginalFetch: typeof globalThis.fetch | null = null;\nconst refreshEndpointUrl = new URL(ANTHROPIC_REFRESH_ENDPOINT);\n\nfunction buildRefreshRequestError(details: string): Error {\n return new Error(`Anthropic token refresh request failed. url=${ANTHROPIC_REFRESH_ENDPOINT}; details=${details}`);\n}\n\nfunction buildRefreshInvalidJsonError(body: string, details: string): Error {\n return new Error(`Anthropic token refresh returned invalid JSON. url=${ANTHROPIC_REFRESH_ENDPOINT}; body=${body}; details=${details}`);\n}\n\nfunction getRequestUrlString(input: RequestInfo | URL): string {\n if (typeof input === \"string\") return input;\n if (input instanceof URL) return input.toString();\n return input.url;\n}\n\nfunction isAnthropicTokenEndpoint(input: RequestInfo | URL): boolean {\n const rawUrl = getRequestUrlString(input);\n\n try {\n const url = new URL(rawUrl);\n return url.origin === refreshEndpointUrl.origin\n && url.pathname === refreshEndpointUrl.pathname;\n } catch {\n return rawUrl === ANTHROPIC_REFRESH_ENDPOINT;\n }\n}\n\nfunction getRequestBodySource(input: RequestInfo | URL, init?: RequestInit): BodyInit | null | undefined {\n if (init?.body !== undefined) {\n return init.body;\n }\n\n if (input instanceof Request) {\n return input.body;\n }\n\n return undefined;\n}\n\nfunction stringifyBinaryBody(body: ArrayBuffer | ArrayBufferView): string {\n if (body instanceof ArrayBuffer) {\n return Buffer.from(body).toString(\"utf8\");\n }\n\n return Buffer.from(body.buffer, body.byteOffset, body.byteLength).toString(\"utf8\");\n}\n\nasync function getRequestBody(input: RequestInfo | URL, init?: RequestInit): Promise<string> {\n const body = getRequestBodySource(input, init);\n\n if (typeof body === \"string\") return body;\n if (body instanceof URLSearchParams) return body.toString();\n if (body instanceof Uint8Array || body instanceof ArrayBuffer || ArrayBuffer.isView(body)) {\n return stringifyBinaryBody(body);\n }\n if (typeof Blob !== \"undefined\" && body instanceof Blob) return await body.text();\n if (body instanceof ReadableStream) return await new Response(body).text();\n if (input instanceof Request && init?.body === undefined) return await input.clone().text();\n if (body == null) return \"\";\n\n throw buildRefreshRequestError(`Unsupported token request body type: ${Object.prototype.toString.call(body)}`);\n}\n\nfunction getRequestMethod(input: RequestInfo | URL, init?: RequestInit): string {\n return init?.method ?? (input instanceof Request ? input.method : \"GET\");\n}\n\nfunction shouldProxyTokenRequest(input: RequestInfo | URL): boolean {\n return tokenProxyContext.getStore() === true && isAnthropicTokenEndpoint(input);\n}\n\nasync function postAnthropicTokenViaNode(body: string): Promise<Response> {\n let output: string;\n try {\n output = await tokenNodeRequest.runNodeTokenRequest({\n body,\n endpoint: ANTHROPIC_REFRESH_ENDPOINT,\n executable: REFRESH_NODE_EXECUTABLE,\n timeoutMs: TOKEN_REFRESH_TIMEOUT_MS,\n });\n } catch (error) {\n const details = error instanceof Error ? error.message : String(error);\n throw buildRefreshRequestError(details);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(output);\n } catch (error) {\n const details = error instanceof Error ? `${error.name}: ${error.message}` : String(error);\n throw buildRefreshInvalidJsonError(output, details);\n }\n\n const result = parsed as { ok?: boolean; status?: number; body?: string; error?: string };\n if (!result.ok) {\n if (result.error) {\n throw buildRefreshRequestError(result.error);\n }\n\n throw buildRefreshRequestError(`Error: HTTP request failed. status=${result.status ?? 0}; url=${ANTHROPIC_REFRESH_ENDPOINT}; body=${result.body ?? \"\"}`);\n }\n\n return new Response(result.body ?? \"\", {\n status: 200,\n headers: {\n \"content-type\": \"application/json\",\n },\n });\n}\n\nfunction createAnthropicTokenProxyFetch(originalFetch: typeof globalThis.fetch): typeof globalThis.fetch {\n return (async (input: RequestInfo | URL, init?: RequestInit) => {\n if (!shouldProxyTokenRequest(input)) {\n return originalFetch(input, init);\n }\n\n const method = getRequestMethod(input, init).toUpperCase();\n if (method !== \"POST\") {\n throw buildRefreshRequestError(`Unsupported token endpoint method: ${method}`);\n }\n\n return await postAnthropicTokenViaNode(await getRequestBody(input, init));\n }) as typeof globalThis.fetch;\n}\n\nfunction ensureAnthropicTokenProxyFetchInstalled(): void {\n if (tokenProxyInstalled) return;\n\n tokenProxyOriginalFetch = globalThis.fetch;\n globalThis.fetch = createAnthropicTokenProxyFetch(tokenProxyOriginalFetch);\n tokenProxyInstalled = true;\n}\n\nexport async function withAnthropicTokenProxyFetch<T>(operation: () => Promise<T>): Promise<T> {\n ensureAnthropicTokenProxyFetchInstalled();\n return await tokenProxyContext.run(true, operation);\n}\n\nexport function resetAnthropicTokenProxyStateForTest(): void {\n tokenProxyInstalled = false;\n tokenProxyOriginalFetch = null;\n}\n\nasync function fetchProfileWithSingleRetry(accessToken: string): Promise<Awaited<ReturnType<typeof fetchProfile>>> {\n let profileResult = await fetchProfile(accessToken);\n if (profileResult.ok) {\n return profileResult;\n }\n\n await new Promise((resolve) => setTimeout(resolve, 1000));\n profileResult = await fetchProfile(accessToken);\n return profileResult;\n}\n\nexport async function loginWithPiAi(\n callbacks: LoginWithPiAiCallbacks,\n): Promise<Partial<StoredAccount>> {\n const piCreds = await withAnthropicTokenProxyFetch(() => piAiOauth.loginAnthropic({\n onAuth: callbacks.onAuth,\n onPrompt: callbacks.onPrompt,\n onProgress: callbacks.onProgress,\n onManualCodeInput: callbacks.onManualCodeInput,\n }));\n\n const base = fromPiAiCredentials(piCreds);\n\n const profileResult = await fetchProfileWithSingleRetry(piCreds.access);\n const profileData = profileResult.ok ? profileResult.data : undefined;\n\n return {\n ...base,\n email: profileData?.email,\n planTier: profileData?.planTier ?? \"\",\n addedAt: Date.now(),\n lastUsed: Date.now(),\n };\n}\n\nexport async function refreshWithPiAi(\n currentRefreshToken: string,\n): Promise<CredentialRefreshPatch> {\n const piCreds = await withAnthropicTokenProxyFetch(() => piAiOauth.refreshAnthropicToken(currentRefreshToken));\n\n return {\n accessToken: piCreds.access,\n refreshToken: piCreds.refresh,\n expiresAt: piCreds.expires,\n };\n}\n\nexport const PI_AI_ADAPTER_SERVICE = ANTHROPIC_OAUTH_ADAPTER.serviceLogName;\n","import * as childProcess from \"node:child_process\";\n\nexport interface NodeTokenRequestOptions {\n body: string;\n endpoint: string;\n executable: string;\n timeoutMs: number;\n}\n\ntype NodeTokenRequestRunner = (options: NodeTokenRequestOptions) => Promise<string>;\n\nfunction buildNodeTokenRequestScript(): string {\n return `\nconst https = require(\"node:https\");\nconst endpoint = process.env.ANTHROPIC_REFRESH_ENDPOINT;\nconst timeoutMs = Number(process.env.ANTHROPIC_REFRESH_TIMEOUT_MS || \"30000\");\nconst payload = process.env.ANTHROPIC_REFRESH_REQUEST_BODY || \"\";\n\nfunction printSuccess(body) {\n console.log(JSON.stringify({ ok: true, body }));\n}\n\nfunction printFailure(error) {\n console.log(JSON.stringify({ ok: false, ...error }));\n}\n\nconst request = https.request(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"Content-Length\": Buffer.byteLength(payload).toString(),\n },\n}, (response) => {\n let body = \"\";\n response.setEncoding(\"utf8\");\n response.on(\"data\", (chunk) => {\n body += chunk;\n });\n response.on(\"end\", () => {\n const status = response.statusCode ?? 0;\n if (status < 200 || status >= 300) {\n printFailure({ status, body });\n return;\n }\n\n printSuccess(body);\n });\n});\n\nrequest.setTimeout(timeoutMs, () => {\n request.destroy(new Error(\"Request timed out after \" + timeoutMs + \"ms\"));\n});\n\nrequest.on(\"error\", (error) => {\n printFailure({ error: error instanceof Error ? error.name + \": \" + error.message : String(error) });\n});\n\nrequest.write(payload);\nrequest.end();\n`;\n}\n\nasync function defaultRunNodeTokenRequest(options: NodeTokenRequestOptions): Promise<string> {\n const script = buildNodeTokenRequestScript();\n\n return await new Promise<string>((resolve, reject) => {\n childProcess.execFile(\n options.executable,\n [\"-e\", script],\n {\n timeout: options.timeoutMs + 1000,\n maxBuffer: 1024 * 1024,\n env: {\n ...process.env,\n ANTHROPIC_REFRESH_ENDPOINT: options.endpoint,\n ANTHROPIC_REFRESH_REQUEST_BODY: options.body,\n ANTHROPIC_REFRESH_TIMEOUT_MS: String(options.timeoutMs),\n },\n },\n (error, stdout, stderr) => {\n const trimmedStdout = stdout.trim();\n\n if (error) {\n reject(new Error(stderr.trim() || error.message));\n return;\n }\n\n if (!trimmedStdout) {\n reject(new Error(\"Empty response from Node refresh helper\"));\n return;\n }\n\n resolve(trimmedStdout);\n },\n );\n });\n}\n\nlet nodeTokenRequestRunner: NodeTokenRequestRunner = defaultRunNodeTokenRequest;\n\nexport async function runNodeTokenRequest(options: NodeTokenRequestOptions): Promise<string> {\n return await nodeTokenRequestRunner(options);\n}\n\nexport function setNodeTokenRequestRunnerForTest(runner: NodeTokenRequestRunner | null): void {\n nodeTokenRequestRunner = runner ?? defaultRunNodeTokenRequest;\n}\n","import { setConfigGetter } from \"opencode-multi-account-core\";\nimport { getConfig } from \"./config\";\n\nsetConfigGetter(getConfig);\n\nexport {\n createMinimalClient,\n debugLog,\n formatWaitTime,\n getAccountLabel,\n getConfigDir,\n getErrorCode,\n showToast,\n sleep,\n} from \"opencode-multi-account-core\";\n","import {\n getConfig,\n initCoreConfig,\n loadConfig,\n resetConfigCache,\n updateConfigField,\n} from \"opencode-multi-account-core\";\n\ninitCoreConfig(\"claude-multiauth.json\");\n\nexport {\n getConfig,\n loadConfig,\n resetConfigCache,\n updateConfigField,\n};\n","import {\n ANTHROPIC_OAUTH_ADAPTER,\n ANTHROPIC_PROFILE_ENDPOINT,\n ANTHROPIC_USAGE_ENDPOINT,\n PLAN_LABELS,\n} from \"./constants\";\nimport { formatWaitTime } from \"./utils\";\nimport * as v from \"valibot\";\nimport { UsageLimitsSchema } from \"./types\";\nimport type { ManagedAccount, UsageLimits } from \"./types\";\n\nconst OAUTH_BETA_HEADER = ANTHROPIC_OAUTH_ADAPTER.oauthBetaHeader;\n\nconst ProfileResponseSchema = v.object({\n account: v.object({\n email: v.optional(v.string()),\n has_claude_pro: v.optional(v.boolean(), false),\n has_claude_max: v.optional(v.boolean(), false),\n }),\n});\n\nexport type ProfileData = {\n email?: string;\n planTier: string;\n};\n\nexport type FetchUsageResult =\n | { ok: true; data: UsageLimits }\n | { ok: false; reason: string };\n\nexport type FetchProfileResult =\n | { ok: true; data: ProfileData }\n | { ok: false; reason: string };\n\nexport async function fetchUsage(accessToken: string): Promise<FetchUsageResult> {\n try {\n const response = await fetch(ANTHROPIC_USAGE_ENDPOINT, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${accessToken}`,\n \"anthropic-beta\": OAUTH_BETA_HEADER,\n },\n });\n\n if (!response.ok) {\n return { ok: false, reason: `HTTP ${response.status} ${response.statusText}` };\n }\n\n const result = v.safeParse(UsageLimitsSchema, await response.json());\n if (!result.success) {\n return { ok: false, reason: `Invalid response: ${result.issues[0]?.message ?? \"unknown\"}` };\n }\n\n return { ok: true, data: result.output };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return { ok: false, reason: message };\n }\n}\n\nexport async function fetchProfile(accessToken: string): Promise<FetchProfileResult> {\n try {\n const response = await fetch(ANTHROPIC_PROFILE_ENDPOINT, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${accessToken}`,\n \"anthropic-beta\": OAUTH_BETA_HEADER,\n },\n });\n\n if (!response.ok) {\n return { ok: false, reason: `HTTP ${response.status} ${response.statusText}` };\n }\n\n const result = v.safeParse(ProfileResponseSchema, await response.json());\n if (!result.success) {\n return { ok: false, reason: `Invalid response: ${result.issues[0]?.message ?? \"unknown\"}` };\n }\n\n const planTier = result.output.account.has_claude_max ? \"max\"\n : result.output.account.has_claude_pro ? \"pro\"\n : \"free\";\n\n return { ok: true, data: { email: result.output.account.email, planTier } };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return { ok: false, reason: message };\n }\n}\n\nfunction formatTimeRemaining(resetAt: string | null): string {\n if (!resetAt) return \"unknown\";\n const diffMs = new Date(resetAt).getTime() - Date.now();\n if (diffMs <= 0) return \"0m\";\n return formatWaitTime(diffMs);\n}\n\nexport function getUsageSummary(account: ManagedAccount): string {\n if (!account.cachedUsage) return \"no data\";\n\n const parts: string[] = [];\n const { five_hour, seven_day } = account.cachedUsage;\n\n if (five_hour) {\n const reset = five_hour.resets_at\n ? ` (resets ${formatTimeRemaining(five_hour.resets_at)})`\n : \"\";\n parts.push(`5h: ${five_hour.utilization.toFixed(0)}%${reset}`);\n }\n if (seven_day) {\n const reset = seven_day.resets_at\n ? ` (resets ${formatTimeRemaining(seven_day.resets_at)})`\n : \"\";\n parts.push(`7d: ${seven_day.utilization.toFixed(0)}%${reset}`);\n }\n\n return parts.length > 0 ? parts.join(\", \") : \"no data\";\n}\n\nexport function getPlanLabel(account: ManagedAccount): string {\n if (!account.planTier || account.planTier === \"free\") return \"\";\n return PLAN_LABELS[account.planTier]\n ?? account.planTier.charAt(0).toUpperCase() + account.planTier.slice(1);\n}\n","import * as v from \"valibot\";\n\n// ─── Schemas (Single Source of Truth) ───────────────────────────\n\nexport const OAuthCredentialsSchema = v.object({\n type: v.literal(\"oauth\"),\n refresh: v.string(),\n access: v.string(),\n expires: v.number(),\n});\n\nexport const UsageLimitEntrySchema = v.object({\n utilization: v.number(),\n resets_at: v.nullable(v.string()),\n});\n\nexport const UsageLimitsSchema = v.object({\n five_hour: v.optional(v.nullable(UsageLimitEntrySchema), null),\n seven_day: v.optional(v.nullable(UsageLimitEntrySchema), null),\n seven_day_sonnet: v.optional(v.nullable(UsageLimitEntrySchema), null),\n});\n\nexport const CredentialRefreshPatchSchema = v.object({\n accessToken: v.string(),\n expiresAt: v.number(),\n refreshToken: v.optional(v.string()),\n uuid: v.optional(v.string()),\n email: v.optional(v.string()),\n});\n\nexport const StoredAccountSchema = v.object({\n uuid: v.optional(v.string()),\n label: v.optional(v.string()),\n email: v.optional(v.string()),\n planTier: v.optional(v.string(), \"\"),\n refreshToken: v.string(),\n accessToken: v.optional(v.string()),\n expiresAt: v.optional(v.number()),\n addedAt: v.number(),\n lastUsed: v.number(),\n enabled: v.optional(v.boolean(), true),\n rateLimitResetAt: v.optional(v.number()),\n cachedUsage: v.optional(UsageLimitsSchema),\n cachedUsageAt: v.optional(v.number()),\n consecutiveAuthFailures: v.optional(v.number(), 0),\n isAuthDisabled: v.optional(v.boolean(), false),\n authDisabledReason: v.optional(v.string()),\n});\n\nexport const AccountStorageSchema = v.object({\n version: v.literal(1),\n accounts: v.optional(v.array(StoredAccountSchema), []),\n activeAccountUuid: v.optional(v.string()),\n});\n\n/** Anthropic /v1/oauth/token response */\nexport const TokenResponseSchema = v.object({\n access_token: v.string(),\n refresh_token: v.optional(v.string()),\n expires_in: v.number(),\n account: v.optional(v.object({\n uuid: v.optional(v.string()),\n email_address: v.optional(v.string()),\n })),\n});\n\n// ─── Types (derived from schemas) ───────────────────────────────\n\nexport type OAuthCredentials = v.InferOutput<typeof OAuthCredentialsSchema>;\nexport type UsageLimitEntry = v.InferOutput<typeof UsageLimitEntrySchema>;\nexport type UsageLimits = v.InferOutput<typeof UsageLimitsSchema>;\nexport type CredentialRefreshPatch = v.InferOutput<typeof CredentialRefreshPatchSchema>;\nexport type StoredAccount = v.InferOutput<typeof StoredAccountSchema>;\nexport type AccountStorage = v.InferOutput<typeof AccountStorageSchema>;\nexport type TokenResponse = v.InferOutput<typeof TokenResponseSchema>;\n\n// ─── Plugin Config Schema ────────────────────────────────────────\n\nexport const AccountSelectionStrategySchema = v.picklist([\"sticky\", \"round-robin\", \"hybrid\"]);\nexport type AccountSelectionStrategy = v.InferOutput<typeof AccountSelectionStrategySchema>;\n\nexport const PluginConfigSchema = v.object({\n /** sticky: same account until failure, round-robin: rotate every request, hybrid: health+usage scoring */\n account_selection_strategy: v.optional(AccountSelectionStrategySchema, \"sticky\"),\n\n /** Use cross-process claim file to distribute parallel sessions across accounts */\n cross_process_claims: v.optional(v.boolean(), true),\n /** Skip account when any usage tier utilization >= this % (100 = disabled) */\n soft_quota_threshold_percent: v.optional(v.pipe(v.number(), v.minValue(0), v.maxValue(100)), 100),\n /** Minimum backoff after rate limit (ms) */\n rate_limit_min_backoff_ms: v.optional(v.pipe(v.number(), v.minValue(0)), 30_000),\n /** Default retry-after when header is missing (ms) */\n default_retry_after_ms: v.optional(v.pipe(v.number(), v.minValue(0)), 60_000),\n /** Consecutive auth failures before disabling account */\n max_consecutive_auth_failures: v.optional(v.pipe(v.number(), v.integer(), v.minValue(1)), 3),\n /** Backoff after token refresh failure (ms) */\n token_failure_backoff_ms: v.optional(v.pipe(v.number(), v.minValue(0)), 30_000),\n /** Enable proactive background token refresh */\n proactive_refresh: v.optional(v.boolean(), true),\n /** Seconds before expiry to trigger proactive refresh (default 30 min) */\n proactive_refresh_buffer_seconds: v.optional(v.pipe(v.number(), v.minValue(60)), 1800),\n /** Interval between background refresh checks in seconds (default 5 min) */\n proactive_refresh_interval_seconds: v.optional(v.pipe(v.number(), v.minValue(30)), 300),\n /** Suppress toast notifications */\n quiet_mode: v.optional(v.boolean(), false),\n /** Enable debug logging */\n debug: v.optional(v.boolean(), false),\n});\n\nexport type PluginConfig = v.InferOutput<typeof PluginConfigSchema>;\n\n// ─── External Plugin Auth Hook ───────────────────────────────────\n\nexport interface OriginalAuthHook {\n methods?: Array<{\n authorize?: (inputs?: Record<string, string>) => Promise<unknown>;\n }>;\n loader: (\n getAuth: () => Promise<unknown>,\n provider: unknown,\n ) => Promise<{ apiKey: string; fetch: (input: RequestInfo | URL, init?: RequestInit) => Promise<Response> }>;\n}\n\n// ─── Types (manual — not from external data) ────────────────────\n\nexport type TokenRefreshResult =\n | { ok: true; patch: CredentialRefreshPatch }\n | { ok: false; permanent: boolean };\n\nexport interface ManagedAccount {\n index: number;\n uuid?: string;\n label?: string;\n email?: string;\n planTier?: string;\n refreshToken: string;\n accessToken?: string;\n expiresAt?: number;\n addedAt: number;\n lastUsed: number;\n enabled: boolean;\n rateLimitResetAt?: number;\n last429At?: number;\n cachedUsage?: UsageLimits;\n cachedUsageAt?: number;\n consecutiveAuthFailures: number;\n isAuthDisabled: boolean;\n authDisabledReason?: string;\n}\n\nexport interface PluginClient {\n auth: {\n set: (params: {\n path: { id: string };\n body: {\n type: string;\n refresh: string;\n access: string;\n expires: number;\n };\n }) => Promise<void>;\n };\n tui: {\n showToast: (params: {\n body: {\n title?: string;\n message: string;\n variant: \"info\" | \"warning\" | \"success\" | \"error\";\n };\n }) => Promise<void>;\n };\n app: {\n log: (params: {\n body: {\n service: string;\n level: \"debug\" | \"info\" | \"warn\" | \"error\";\n message: string;\n extra?: Record<string, unknown>;\n };\n }) => Promise<void>;\n };\n}\n","import {\n ANTHROPIC_OAUTH_ADAPTER,\n TOKEN_EXPIRY_BUFFER_MS,\n} from \"./constants\";\nimport { refreshWithPiAi } from \"./pi-ai-adapter\";\nimport type {\n ManagedAccount,\n PluginClient,\n TokenRefreshResult,\n} from \"./types\";\n\nconst PERMANENT_FAILURE_HTTP_STATUSES = new Set([400, 401, 403]);\nconst PERMANENT_FAILURE_MESSAGE_PATTERNS = [\n /\\binvalid_grant\\b/i,\n /\\binvalid_scope\\b/i,\n /\\bunauthorized_client\\b/i,\n /\\brefresh token\\b.*\\b(invalid|expired|revoked|no longer valid)\\b/i,\n /\\bauth(?:entication)?(?:[_\\s-]+)?invalid\\b/i,\n];\nconst refreshMutexByAccountId = new Map<string, Promise<TokenRefreshResult>>();\n\nexport function isTokenExpired(account: Pick<ManagedAccount, \"accessToken\" | \"expiresAt\">): boolean {\n if (!account.accessToken || !account.expiresAt) return true;\n return account.expiresAt <= Date.now() + TOKEN_EXPIRY_BUFFER_MS;\n}\n\nexport async function refreshToken(\n currentRefreshToken: string,\n accountId: string,\n client: PluginClient,\n): Promise<TokenRefreshResult> {\n if (!currentRefreshToken) return { ok: false, permanent: true };\n\n const inFlightRefresh = refreshMutexByAccountId.get(accountId);\n if (inFlightRefresh) return inFlightRefresh;\n\n const refreshPromise = (async (): Promise<TokenRefreshResult> => {\n try {\n const patch = await refreshWithPiAi(currentRefreshToken);\n return { ok: true, patch };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const statusMatch = message.match(/\\b(400|401|403)\\b/);\n const hasPermanentStatus = statusMatch !== null\n && PERMANENT_FAILURE_HTTP_STATUSES.has(Number(statusMatch[1]));\n const hasPermanentMessage = PERMANENT_FAILURE_MESSAGE_PATTERNS\n .some((pattern) => pattern.test(message));\n const isPermanent = hasPermanentStatus || hasPermanentMessage;\n\n await client.app\n .log({\n body: {\n service: ANTHROPIC_OAUTH_ADAPTER.serviceLogName,\n level: isPermanent ? \"error\" : \"warn\",\n message: `Token refresh failed: ${message}${isPermanent ? \" (permanent)\" : \"\"}`,\n extra: { accountId },\n },\n })\n .catch(() => {});\n\n return { ok: false, permanent: isPermanent };\n } finally {\n refreshMutexByAccountId.delete(accountId);\n }\n })();\n\n refreshMutexByAccountId.set(accountId, refreshPromise);\n return refreshPromise;\n}\n\nexport function clearRefreshMutex(accountId?: string): void {\n if (accountId) {\n refreshMutexByAccountId.delete(accountId);\n return;\n }\n\n refreshMutexByAccountId.clear();\n}\n","import { createExecutorForProvider, getClearedOAuthBody } from \"opencode-multi-account-core\";\nimport { ANTHROPIC_OAUTH_ADAPTER } from \"./constants\";\nimport type {\n CascadeStateManager,\n ExecutorAccountManager,\n ExecutorRuntimeFactory,\n PluginClient,\n PoolChainConfig,\n PoolManager,\n RateLimitAccountManager,\n} from \"opencode-multi-account-core\";\nimport { handleRateLimitResponse as handleRateLimitResponseForProvider } from \"./rate-limit\";\nimport { executeWithPoolChainRotation } from \"./pool-chain-executor\";\nimport type { PoolChainAccountManager } from \"./pool-chain-executor\";\nimport { formatWaitTime, getAccountLabel, showToast, sleep } from \"./utils\";\n\nconst { executeWithAccountRotation: executeWithCoreAccountRotation } = createExecutorForProvider(\"Anthropic\", {\n handleRateLimitResponse: async (manager, client, account, response) =>\n handleRateLimitResponseForProvider(\n manager as RateLimitAccountManager,\n client,\n account,\n response,\n ),\n formatWaitTime,\n sleep,\n showToast,\n getAccountLabel,\n});\n\ninterface PoolChainExecutorOptions {\n poolManager: PoolManager;\n cascadeStateManager: CascadeStateManager;\n poolChainConfig: PoolChainConfig;\n}\n\nfunction isAllAccountsTerminalError(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n return error.message.includes(\"All Anthropic accounts\");\n}\n\nasync function clearAuthIfNoUsableAccount(\n manager: ExecutorAccountManager,\n client: PluginClient,\n): Promise<void> {\n await manager.refresh();\n if (manager.hasAnyUsableAccount()) return;\n\n await client.auth\n .set({\n path: { id: ANTHROPIC_OAUTH_ADAPTER.authProviderId },\n body: getClearedOAuthBody(),\n })\n .catch(() => {});\n}\n\nfunction hasPoolChainEntries(config: PoolChainConfig): boolean {\n return (config.pools?.length ?? 0) > 0 || (config.chains?.length ?? 0) > 0;\n}\n\nexport async function executeWithAccountRotation(\n manager: ExecutorAccountManager,\n runtimeFactory: ExecutorRuntimeFactory,\n client: PluginClient,\n input: RequestInfo | URL,\n init?: RequestInit,\n options?: PoolChainExecutorOptions,\n): Promise<Response> {\n try {\n if (!options || !hasPoolChainEntries(options.poolChainConfig)) {\n return await executeWithCoreAccountRotation(manager, runtimeFactory, client, input, init);\n }\n\n return await executeWithPoolChainRotation(\n manager as unknown as PoolChainAccountManager,\n runtimeFactory,\n options.poolManager,\n options.cascadeStateManager,\n options.poolChainConfig,\n client,\n input,\n init,\n );\n } catch (error) {\n if (isAllAccountsTerminalError(error)) {\n await clearAuthIfNoUsableAccount(manager, client);\n }\n throw error;\n }\n}\n","import { createRateLimitHandlers } from \"opencode-multi-account-core\";\nimport { getConfig } from \"./config\";\nimport { fetchUsage } from \"./usage\";\nimport { formatWaitTime, getAccountLabel, showToast } from \"./utils\";\n\nconst {\n fetchUsageLimits,\n getResetMsFromUsage,\n handleRateLimitResponse,\n retryAfterMsFromResponse,\n} = createRateLimitHandlers({\n fetchUsage: async (accessToken: string) => fetchUsage(accessToken),\n getConfig,\n formatWaitTime,\n getAccountLabel,\n showToast,\n});\n\nexport {\n fetchUsageLimits,\n getResetMsFromUsage,\n handleRateLimitResponse,\n retryAfterMsFromResponse,\n};\n","import { createExecutorForProvider } from \"opencode-multi-account-core\";\nimport type {\n CascadeStateManager,\n ExecutorAccountManager,\n ExecutorRuntimeFactory,\n PoolChainConfig,\n PoolManager,\n} from \"opencode-multi-account-core\";\nimport { handleRateLimitResponse as handleRateLimitResponseForProvider } from \"./rate-limit\";\nimport { formatWaitTime, getAccountLabel, showToast, sleep } from \"./utils\";\nimport type { ManagedAccount, PluginClient } from \"./types\";\n\ninterface PoolChainQueueEntry {\n accountUuid: string;\n chainIndex?: number;\n}\n\ntype RateLimitManager = Parameters<typeof handleRateLimitResponseForProvider>[0];\n\nexport interface PoolChainAccountManager extends ExecutorAccountManager, RateLimitManager {\n getAccounts(): ManagedAccount[];\n isRateLimited(account: ManagedAccount): boolean;\n getActiveAccount(): ManagedAccount | null;\n}\n\nfunction buildCascadePrompt(input: RequestInfo | URL, init?: RequestInit): string {\n if (typeof init?.body === \"string\" && init.body.length > 0) {\n return init.body;\n }\n\n const method = init?.method ?? \"GET\";\n return `${method}:${String(input)}`;\n}\n\nfunction createQueueAwareManager(\n manager: PoolChainAccountManager,\n queue: PoolChainQueueEntry[],\n cascadeStateManager: CascadeStateManager,\n): PoolChainAccountManager {\n return Object.create(manager, {\n selectAccount: { value: async function selectAccount() {\n await manager.refresh();\n\n while (queue.length > 0) {\n const next = queue.shift();\n if (!next) break;\n\n const account = manager\n .getAccounts()\n .find((candidate) => candidate.uuid === next.accountUuid);\n\n if (!account?.uuid) continue;\n if (!account.enabled || account.isAuthDisabled) continue;\n if (manager.isRateLimited(account)) continue;\n\n cascadeStateManager.markAttempted(account.uuid);\n if (next.chainIndex !== undefined) {\n cascadeStateManager.markVisitedChainIndex(next.chainIndex);\n }\n return account;\n }\n\n return manager.selectAccount();\n }},\n });\n}\n\nexport async function executeWithPoolChainRotation(\n manager: PoolChainAccountManager,\n runtimeFactory: ExecutorRuntimeFactory,\n poolManager: PoolManager,\n cascadeStateManager: CascadeStateManager,\n poolChainConfig: PoolChainConfig,\n client: PluginClient,\n input: RequestInfo | URL,\n init?: RequestInit,\n): Promise<Response> {\n const cascadePrompt = buildCascadePrompt(input, init);\n const currentAccountUuid = manager.getActiveAccount()?.uuid;\n cascadeStateManager.startTurn(cascadePrompt, currentAccountUuid);\n\n const queue: PoolChainQueueEntry[] = [];\n const queuedAccountUuids = new Set<string>();\n const queueAwareManager = createQueueAwareManager(manager, queue, cascadeStateManager);\n\n const { executeWithAccountRotation } = createExecutorForProvider(\"Anthropic\", {\n handleRateLimitResponse: async (rawManager, rawClient, account, response) => {\n await handleRateLimitResponseForProvider(\n rawManager as Parameters<typeof handleRateLimitResponseForProvider>[0],\n rawClient,\n account,\n response,\n );\n\n if (!account.uuid) return;\n\n poolManager.markExhausted(account.uuid);\n cascadeStateManager.markAttempted(account.uuid);\n\n const cascadeState = cascadeStateManager.ensureCascadeState(cascadePrompt, account.uuid);\n const failoverPlan = await poolManager.buildFailoverPlan(\n account,\n poolChainConfig,\n manager,\n {\n attemptedAccounts: cascadeState.attemptedAccounts,\n visitedChainIndexes: cascadeState.visitedChainIndexes,\n },\n );\n\n for (const candidate of failoverPlan.candidates) {\n if (queuedAccountUuids.has(candidate.accountUuid)) continue;\n queue.push({\n accountUuid: candidate.accountUuid,\n chainIndex: candidate.chainIndex,\n });\n queuedAccountUuids.add(candidate.accountUuid);\n }\n },\n formatWaitTime,\n sleep,\n showToast,\n getAccountLabel,\n });\n\n try {\n return await executeWithAccountRotation(\n queueAwareManager,\n runtimeFactory,\n client,\n input,\n init,\n );\n } finally {\n cascadeStateManager.clearCascadeState();\n }\n}\n","export {\n ANSI,\n isTTY,\n parseKey,\n type KeyAction,\n} from \"opencode-multi-account-core\";\n","export {\n select,\n type MenuItem,\n type SelectOptions,\n} from \"opencode-multi-account-core\";\n","export { confirm } from \"opencode-multi-account-core\";\n","import { ANSI } from \"./ansi\";\nimport { select, type MenuItem } from \"./select\";\nimport { confirm } from \"./confirm\";\nimport { getAccountLabel } from \"../utils\";\nimport { getPlanLabel } from \"../usage\";\nimport type { AccountSelectionStrategy, ManagedAccount, UsageLimits } from \"../types\";\n\nexport type AuthMenuAction =\n | { type: \"add\" }\n | { type: \"check-quotas\" }\n | { type: \"manage\" }\n | { type: \"load-balancing\" }\n | { type: \"delete-all\" }\n | { type: \"cancel\" };\n\nexport type AccountAction = \"back\" | \"toggle\" | \"delete\" | \"retry-auth\" | \"cancel\";\n\nfunction formatRelativeTime(timestamp: number | undefined): string {\n if (!timestamp) return \"never\";\n const days = Math.floor((Date.now() - timestamp) / 86_400_000);\n if (days === 0) return \"today\";\n if (days === 1) return \"yesterday\";\n if (days < 7) return `${days}d ago`;\n if (days < 30) return `${Math.floor(days / 7)}w ago`;\n return new Date(timestamp).toLocaleDateString();\n}\n\nfunction formatDate(timestamp: number | undefined): string {\n if (!timestamp) return \"unknown\";\n return new Date(timestamp).toLocaleDateString();\n}\n\ntype AccountStatus = \"active\" | \"rate-limited\" | \"auth-disabled\" | \"disabled\";\n\nexport function getAccountStatus(account: ManagedAccount): AccountStatus {\n if (account.isAuthDisabled) return \"auth-disabled\";\n if (!account.enabled) return \"disabled\";\n if (account.cachedUsage) {\n const now = Date.now();\n const usage = account.cachedUsage;\n const hasEvaluableUsageTier = [usage.five_hour, usage.seven_day].some((tier) => tier != null);\n const exhaustedTiers = [usage.five_hour, usage.seven_day].filter((tier) =>\n tier\n && tier.utilization >= 100\n && tier.resets_at != null\n && Date.parse(tier.resets_at) > now,\n );\n if (exhaustedTiers.length > 0) {\n return \"rate-limited\";\n }\n if (hasEvaluableUsageTier) {\n return \"active\";\n }\n }\n if (account.rateLimitResetAt && account.rateLimitResetAt > Date.now()) return \"rate-limited\";\n return \"active\";\n}\n\nconst STATUS_BADGE: Record<AccountStatus, string> = {\n \"active\": `${ANSI.green}[active]${ANSI.reset}`,\n \"rate-limited\": `${ANSI.yellow}[rate-limited]${ANSI.reset}`,\n \"auth-disabled\": `${ANSI.red}[auth-disabled]${ANSI.reset}`,\n \"disabled\": `${ANSI.red}[disabled]${ANSI.reset}`,\n};\n\nfunction buildAccountMenuItem(account: ManagedAccount): MenuItem<ManagedAccount> {\n const label = getAccountLabel(account);\n const status = getAccountStatus(account);\n const badge = STATUS_BADGE[status];\n const fullLabel = `${label} ${badge}`;\n\n return {\n label: fullLabel,\n hint: account.lastUsed ? `used ${formatRelativeTime(account.lastUsed)}` : \"\",\n value: account,\n disabled: false,\n };\n}\n\nexport async function showAuthMenu(accounts: ManagedAccount[]): Promise<AuthMenuAction> {\n const items: MenuItem<AuthMenuAction>[] = [\n { label: \"Add new account\", value: { type: \"add\" }, color: \"green\" },\n { label: \"Check quotas\", value: { type: \"check-quotas\" }, color: \"cyan\" },\n { label: \"Manage accounts\", value: { type: \"manage\" } },\n { label: \"Load balancing\", value: { type: \"load-balancing\" } },\n { label: \"\", value: { type: \"cancel\" }, separator: true },\n { label: \"Delete all accounts\", value: { type: \"delete-all\" }, color: \"red\" },\n ];\n\n while (true) {\n const subtitle = `${accounts.length} account(s) registered`;\n const result = await select(items, {\n message: \"Claude Multi-Auth\",\n subtitle,\n });\n\n if (!result) return { type: \"cancel\" };\n\n if (result.type === \"delete-all\") {\n const confirmed = await confirm(\"Delete ALL accounts? This cannot be undone.\");\n if (!confirmed) continue;\n }\n\n return result;\n }\n}\n\nexport async function showManageAccounts(accounts: ManagedAccount[]): Promise<{ action: AccountAction; account?: ManagedAccount }> {\n const items: MenuItem<ManagedAccount | null>[] = [\n { label: \"Back\", value: null },\n { label: \"\", value: null, separator: true },\n ...accounts.map(buildAccountMenuItem),\n ];\n\n const selected = await select(items, {\n message: \"Manage Accounts\",\n subtitle: \"Select an account to manage\",\n });\n\n if (!selected) return { action: \"back\" };\n\n return showAccountDetails(selected);\n}\n\nasync function showAccountDetails(account: ManagedAccount): Promise<{ action: AccountAction; account: ManagedAccount }> {\n const label = getAccountLabel(account);\n const status = getAccountStatus(account);\n const badge = STATUS_BADGE[status];\n\n console.log(\"\");\n console.log(`${ANSI.bold}Account: ${label} ${badge}${ANSI.reset}`);\n console.log(`${ANSI.dim}Added: ${formatDate(account.addedAt)}${ANSI.reset}`);\n console.log(`${ANSI.dim}Last used: ${formatRelativeTime(account.lastUsed)}${ANSI.reset}`);\n if (account.isAuthDisabled) {\n console.log(`${ANSI.red}Auth disabled: ${account.authDisabledReason ?? \"unknown\"}${ANSI.reset}`);\n }\n console.log(\"\");\n\n while (true) {\n const toggleLabel = account.enabled ? \"Disable account\" : \"Enable account\";\n const toggleColor = account.enabled ? \"yellow\" as const : \"green\" as const;\n\n const items: MenuItem<AccountAction>[] = [\n { label: \"Back\", value: \"back\" },\n ];\n\n items.push({ label: toggleLabel, value: \"toggle\", color: toggleColor });\n\n items.push({ label: \"Re-authenticate\", value: \"retry-auth\", color: \"cyan\" });\n\n items.push({ label: \"Delete this account\", value: \"delete\", color: \"red\" });\n\n const result = await select(items, {\n message: \"Account options\",\n subtitle: label,\n });\n\n if (result === \"delete\") {\n const confirmed = await confirm(`Delete ${label}?`);\n if (!confirmed) continue;\n }\n\n return { action: result ?? \"cancel\", account };\n }\n}\n\nfunction getUsageColor(utilization: number): string {\n if (utilization >= 90) return ANSI.red;\n if (utilization >= 60) return ANSI.yellow;\n return ANSI.green;\n}\n\nfunction createProgressBar(utilization: number, width = 20): string {\n const filled = Math.round((utilization / 100) * width);\n const empty = width - filled;\n const color = getUsageColor(utilization);\n return `${color}${\"█\".repeat(filled)}${ANSI.reset}${\"░\".repeat(empty)} ${color}${Math.round(utilization)}% used${ANSI.reset}`;\n}\n\nfunction formatResetTime(resetAt: string | null): string {\n if (!resetAt) return \"\";\n const date = new Date(resetAt);\n const now = new Date();\n const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n const timeStr = date.toLocaleTimeString(undefined, { hour: \"numeric\", minute: \"2-digit\", hour12: true });\n\n const isSameDay = date.getFullYear() === now.getFullYear()\n && date.getMonth() === now.getMonth()\n && date.getDate() === now.getDate();\n\n if (isSameDay) {\n return ` (resets ${timeStr}, ${tz})`;\n }\n const dateStr = date.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" });\n return ` (resets ${dateStr} ${timeStr}, ${tz})`;\n}\n\nfunction printUsageEntry(name: string, entry: { utilization: number; resets_at: string | null } | null, isLast: boolean): void {\n const connector = isLast ? \"└─\" : \"├─\";\n if (!entry) {\n console.log(` ${connector} ${name.padEnd(16)} no data`);\n return;\n }\n const bar = createProgressBar(entry.utilization);\n const reset = entry.resets_at\n ? formatResetTime(entry.resets_at)\n : \"\";\n console.log(` ${connector} ${name.padEnd(16)} ${bar}${reset}`);\n}\n\nexport function printQuotaReport(account: ManagedAccount, usage: UsageLimits): void {\n const label = getAccountLabel(account);\n const status = getAccountStatus(account);\n const badge = STATUS_BADGE[status];\n const planLabel = getPlanLabel(account) || \"Free\";\n\n console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);\n console.log(` ${label} ${badge}`);\n console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);\n if (account.email) {\n console.log(` 📧 ${account.email}`);\n }\n console.log(` 📋 ${planLabel}`);\n\n console.log(`\\n └─ Claude Quota`);\n printUsageEntry(\"Current session\", usage.five_hour, false);\n printUsageEntry(\"Current week\", usage.seven_day, !usage.seven_day_sonnet);\n if (usage.seven_day_sonnet) {\n printUsageEntry(\"Sonnet only\", usage.seven_day_sonnet, true);\n }\n console.log(\"\");\n}\n\nconst STRATEGY_DESCRIPTIONS: Record<AccountSelectionStrategy, string> = {\n \"sticky\": \"Same account until rate-limited\",\n \"round-robin\": \"Rotate every request\",\n \"hybrid\": \"Score-based (usage + health)\",\n};\n\nexport async function showStrategySelect(current: AccountSelectionStrategy): Promise<AccountSelectionStrategy | null> {\n const strategies: AccountSelectionStrategy[] = [\"sticky\", \"round-robin\", \"hybrid\"];\n\n const items: MenuItem<AccountSelectionStrategy>[] = strategies.map((s) => ({\n label: `${s}${s === current ? \" (current)\" : \"\"}`,\n hint: STRATEGY_DESCRIPTIONS[s],\n value: s,\n }));\n\n return select(items, {\n message: \"Load Balancing Strategy\",\n subtitle: `Current: ${current}`,\n });\n}\n\nexport function printQuotaError(account: ManagedAccount, error: string): void {\n const label = getAccountLabel(account);\n console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);\n console.log(` ${label}`);\n if (account.email) {\n console.log(` 📧 ${account.email}`);\n }\n console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);\n console.log(` ${ANSI.red}Error: ${error}${ANSI.reset}\\n`);\n}\n","import {\n AccountStore,\n setAccountsFilename,\n type DiskCredentials,\n} from \"opencode-multi-account-core\";\nimport { ACCOUNTS_FILENAME } from \"./constants\";\n\nsetAccountsFilename(ACCOUNTS_FILENAME);\n\nexport {\n AccountStore,\n type DiskCredentials,\n};\n","import { AccountManager } from \"./account-manager\";\nimport { CLAUDE_CLI_USER_AGENT } from \"./constants\";\nimport { fetchProfile, fetchUsage } from \"./usage\";\nimport { isTokenExpired } from \"./token\";\nimport { getConfig, updateConfigField } from \"./config\";\nimport { isTTY } from \"./ui/ansi\";\nimport { showAuthMenu, showManageAccounts, showStrategySelect, printQuotaReport, printQuotaError } from \"./ui/auth-menu\";\nimport { createMinimalClient, getAccountLabel } from \"./utils\";\nimport { AccountStore } from \"./account-store\";\nimport { loginWithPiAi } from \"./pi-ai-adapter\";\nimport { randomUUID } from \"node:crypto\";\nimport { createInterface } from \"node:readline\";\nimport { exec } from \"node:child_process\";\nimport type { ManagedAccount, OAuthCredentials, PluginClient, StoredAccount } from \"./types\";\n\ntype OAuthCallbackResponse =\n | ({ type: \"success\" } & { refresh: string; access: string; expires: number })\n | { type: \"failed\" };\n\nexport interface OAuthFlowResult {\n url: string;\n instructions: string;\n method: \"auto\";\n callback(code?: string): Promise<OAuthCallbackResponse>;\n _email?: string;\n}\n\ninterface OAuthPromptLike {\n text?: string;\n message?: string;\n label?: string;\n title?: string;\n placeholder?: string;\n}\n\nfunction makeFailedFlowResult(message: string): OAuthFlowResult {\n return {\n url: \"\",\n instructions: message,\n method: \"auto\",\n callback: async () => ({ type: \"failed\" }),\n };\n}\n\nfunction toOAuthCredentials(result: OAuthCallbackResponse & { type: \"success\" }): OAuthCredentials {\n return { type: \"oauth\", refresh: result.refresh, access: result.access, expires: result.expires };\n}\n\nfunction asOAuthCallbackResponse(account: Partial<StoredAccount>): OAuthCallbackResponse {\n if (!account.refreshToken || !account.accessToken || typeof account.expiresAt !== \"number\") {\n return { type: \"failed\" };\n }\n\n return {\n type: \"success\",\n refresh: account.refreshToken,\n access: account.accessToken,\n expires: account.expiresAt,\n };\n}\n\nfunction promptLine(message: string): Promise<string> {\n if (!isTTY()) return Promise.resolve(\"\");\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(message, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nfunction normalizePromptMessage(prompt: OAuthPromptLike): string {\n return (\n prompt.message\n ?? prompt.text\n ?? prompt.label\n ?? prompt.title\n ?? prompt.placeholder\n ?? \"Continue authentication: \"\n );\n}\n\nconst ANTHROPIC_TOKEN_HOST = \"platform.claude.com\";\n\nasync function startPiAiFlow(): Promise<OAuthFlowResult> {\n const originalFetch = globalThis.fetch;\n globalThis.fetch = ((input: RequestInfo | URL, init?: RequestInit) => {\n const url = typeof input === \"string\" ? input : input instanceof URL ? input.href : (input as Request).url;\n if (url.includes(ANTHROPIC_TOKEN_HOST)) {\n const headers = new Headers(init?.headers);\n headers.set(\"user-agent\", CLAUDE_CLI_USER_AGENT);\n return originalFetch(input, { ...init, headers });\n }\n return originalFetch(input, init);\n }) as typeof globalThis.fetch;\n try {\n const completedAccount = await loginWithPiAi({\n onAuth: (info) => {\n if (info.url) {\n openBrowser(info.url);\n }\n\n const instruction = info.instructions ?? \"Complete authorization in your browser.\";\n const urlLine = info.url ? `\\nAuth URL (manual fallback): ${info.url}` : \"\";\n console.log(`\\n${instruction}${urlLine}\\n`);\n },\n onPrompt: async (prompt) => {\n const text = normalizePromptMessage(prompt as OAuthPromptLike);\n return promptLine(text.endsWith(\":\") || text.endsWith(\"?\") ? `${text} ` : `${text}: `);\n },\n });\n\n const completedResult = asOAuthCallbackResponse(completedAccount);\n const accountEmail = completedAccount.email;\n\n return {\n url: \"\",\n instructions: \"\",\n method: \"auto\",\n callback: async () => completedResult,\n _email: accountEmail,\n };\n } catch {\n return makeFailedFlowResult(\"Failed to start OAuth flow\");\n } finally {\n globalThis.fetch = originalFetch;\n }\n}\n\nfunction wrapCallbackWithAccountReplace(\n result: OAuthFlowResult,\n manager: AccountManager,\n targetAccount: ManagedAccount,\n): OAuthFlowResult {\n const originalCallback = result.callback;\n return {\n ...result,\n callback: async function (code?: string) {\n const callbackResult = await originalCallback(code);\n\n if (callbackResult?.type === \"success\" && callbackResult.refresh) {\n if (targetAccount.uuid) {\n await manager.replaceAccountCredentials(targetAccount.uuid, toOAuthCredentials(callbackResult));\n }\n console.log(`\\n✅ ${getAccountLabel(targetAccount)} re-authenticated successfully.\\n`);\n }\n\n return callbackResult;\n },\n };\n}\n\nfunction wrapCallbackWithManagerSync(\n result: OAuthFlowResult & { _email?: string },\n manager: AccountManager | null,\n): OAuthFlowResult {\n const originalCallback = result.callback;\n const email = result._email;\n return {\n ...result,\n callback: async function (code?: string) {\n const callbackResult = await originalCallback(code);\n\n if (callbackResult?.type === \"success\" && callbackResult.refresh) {\n const auth = toOAuthCredentials(callbackResult);\n\n if (manager) {\n const countBefore = manager.getAccounts().length;\n await manager.addAccount(auth, email);\n const countAfter = manager.getAccounts().length;\n const added = countAfter > countBefore;\n console.log(added\n ? `\\n✅ Account added to multi-auth pool (${countAfter} total).\\n`\n : `\\nℹ️ Account already exists in multi-auth pool (${countAfter} total).\\n`);\n } else {\n await persistFallback(auth);\n console.log(\"\\n✅ Account saved.\\n\");\n }\n }\n\n return callbackResult;\n },\n };\n}\n\nfunction promptYesNo(message: string): Promise<boolean> {\n if (!isTTY()) return Promise.resolve(false);\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(message, (answer) => {\n rl.close();\n resolve(answer.trim().toLowerCase() === \"y\");\n });\n });\n}\n\nfunction openBrowser(url: string): void {\n const commands: Record<string, string> = {\n darwin: \"open\",\n win32: \"start\",\n };\n const cmd = commands[process.platform] ?? \"xdg-open\";\n exec(`${cmd} ${JSON.stringify(url)}`);\n}\n\nasync function addMoreAccountsLoop(\n manager: AccountManager,\n): Promise<void> {\n while (true) {\n const currentCount = manager.getAccounts().length;\n const shouldAdd = await promptYesNo(`Add another account? (${currentCount} added) (y/n): `);\n if (!shouldAdd) break;\n\n let flow: OAuthFlowResult;\n try {\n flow = await startPiAiFlow();\n } catch {\n console.log(\"\\n❌ Failed to start OAuth flow.\\n\");\n break;\n }\n\n if (flow.url) {\n openBrowser(flow.url);\n }\n if (flow.instructions) {\n console.log(`\\n${flow.instructions}\\n`);\n }\n\n let callbackResult: OAuthCallbackResponse;\n try {\n callbackResult = await flow.callback();\n } catch {\n console.log(\"\\n❌ Authentication failed.\\n\");\n break;\n }\n\n if (callbackResult?.type !== \"success\" || !(\"refresh\" in callbackResult)) {\n console.log(\"\\n❌ Authentication failed.\\n\");\n break;\n }\n\n const flowEmail = (flow as OAuthFlowResult & { _email?: string })._email;\n const countBefore = manager.getAccounts().length;\n await manager.addAccount(toOAuthCredentials(callbackResult), flowEmail);\n const countAfter = manager.getAccounts().length;\n const added = countAfter > countBefore;\n console.log(added\n ? `\\n✅ Account added to multi-auth pool (${countAfter} total).\\n`\n : `\\nℹ️ Account already exists in multi-auth pool (${countAfter} total).\\n`);\n }\n}\n\nasync function persistFallback(auth: OAuthCredentials): Promise<void> {\n try {\n const store = new AccountStore();\n const now = Date.now();\n const account: StoredAccount = {\n uuid: randomUUID(),\n refreshToken: auth.refresh,\n accessToken: auth.access,\n expiresAt: auth.expires,\n addedAt: now,\n lastUsed: now,\n enabled: true,\n planTier: \"\",\n consecutiveAuthFailures: 0,\n isAuthDisabled: false,\n };\n await store.addAccount(account);\n await store.setActiveUuid(account.uuid);\n } catch {\n // best-effort\n }\n}\n\nexport async function handleAuthorize(\n manager: AccountManager | null,\n inputs?: Record<string, string>,\n client?: PluginClient,\n): Promise<OAuthFlowResult> {\n if (!inputs || !isTTY()) {\n return wrapCallbackWithManagerSync(await startPiAiFlow(), manager);\n }\n\n const effectiveManager = manager ?? await loadManagerFromDisk(client);\n if (!effectiveManager || effectiveManager.getAccounts().length === 0) {\n return wrapCallbackWithManagerSync(await startPiAiFlow(), manager);\n }\n\n return runAccountManagementMenu(effectiveManager, client);\n}\n\nasync function loadManagerFromDisk(client?: PluginClient): Promise<AccountManager | null> {\n const store = new AccountStore();\n const stored = await store.load();\n if (stored.accounts.length === 0) return null;\n const emptyAuth: OAuthCredentials = { type: \"oauth\", refresh: \"\", access: \"\", expires: 0 };\n const mgr = await AccountManager.create(store, emptyAuth, client);\n return mgr;\n}\n\nasync function runAccountManagementMenu(\n manager: AccountManager,\n client?: PluginClient,\n): Promise<OAuthFlowResult> {\n while (true) {\n const allAccounts = manager.getAccounts();\n const menuAction = await showAuthMenu(allAccounts);\n\n switch (menuAction.type) {\n case \"add\":\n return wrapCallbackWithManagerSync(await startPiAiFlow(), manager);\n\n case \"check-quotas\":\n await handleCheckQuotas(manager, client);\n continue;\n\n case \"manage\": {\n const result = await showManageAccounts(allAccounts);\n if (result.action === \"back\" || result.action === \"cancel\") continue;\n const manageResult = await handleManageAction(manager, result.action, result.account, client);\n if (manageResult.triggerOAuth) {\n return wrapCallbackWithAccountReplace(await startPiAiFlow(), manager, manageResult.account);\n }\n continue;\n }\n\n case \"load-balancing\":\n await handleLoadBalancing();\n continue;\n\n case \"delete-all\":\n await manager.clearAllAccounts();\n console.log(\"\\nAll accounts deleted.\\n\");\n return wrapCallbackWithManagerSync(await startPiAiFlow(), manager);\n\n case \"cancel\":\n return makeFailedFlowResult(\"Authentication cancelled\");\n }\n }\n}\n\nasync function handleCheckQuotas(manager: AccountManager, client?: PluginClient): Promise<void> {\n await manager.refresh();\n const accounts = manager.getAccounts();\n const effectiveClient = client ?? createMinimalClient();\n if (client) manager.setClient(client);\n console.log(`\\n📊 Checking quotas for ${accounts.length} account(s)...\\n`);\n\n for (const account of accounts) {\n await checkAccountQuota(manager, account, effectiveClient);\n }\n}\n\nasync function checkAccountQuota(\n manager: AccountManager,\n account: ManagedAccount,\n client: PluginClient,\n): Promise<void> {\n if (account.isAuthDisabled || !account.accessToken || isTokenExpired(account)) {\n if (!account.uuid) {\n printQuotaError(account, \"Missing account UUID\");\n return;\n }\n\n const refreshResult = await manager.ensureValidToken(account.uuid, client);\n if (!refreshResult.ok) {\n await manager.markAuthFailure(account.uuid, refreshResult);\n await manager.refresh();\n\n const updatedAccount = manager.getAccounts().find((candidate) => candidate.uuid === account.uuid);\n if (!updatedAccount) {\n printQuotaError(account, refreshResult.permanent\n ? \"Refresh failed permanently; account removed\"\n : \"Failed to refresh token\");\n return;\n }\n\n printQuotaError(updatedAccount, updatedAccount.isAuthDisabled\n ? `${updatedAccount.authDisabledReason ?? \"Auth disabled\"} (refresh failed)`\n : \"Failed to refresh token\");\n return;\n }\n\n await manager.refresh();\n }\n\n const freshAccounts = manager.getAccounts();\n const freshAccount = freshAccounts.find((candidate) => candidate.uuid === account.uuid);\n\n if (!freshAccount?.accessToken) {\n printQuotaError(account, \"No access token available\");\n return;\n }\n\n const usageResult = await fetchUsage(freshAccount.accessToken);\n if (!usageResult.ok) {\n printQuotaError(freshAccount, `Failed to fetch usage: ${usageResult.reason}`);\n return;\n }\n\n if (freshAccount.uuid) {\n await manager.applyUsageCache(freshAccount.uuid, usageResult.data);\n }\n\n let reportAccount = freshAccount;\n const profileResult = await fetchProfile(freshAccount.accessToken);\n if (profileResult.ok) {\n if (freshAccount.uuid) {\n await manager.applyProfileCache(freshAccount.uuid, profileResult.data);\n }\n reportAccount = {\n ...freshAccount,\n email: profileResult.data.email ?? freshAccount.email,\n planTier: profileResult.data.planTier,\n };\n }\n\n printQuotaReport(reportAccount, usageResult.data);\n}\n\nasync function handleLoadBalancing(): Promise<void> {\n const current = getConfig().account_selection_strategy;\n const selected = await showStrategySelect(current);\n\n if (!selected || selected === current) return;\n\n await updateConfigField(\"account_selection_strategy\", selected);\n console.log(`\\nLoad balancing strategy changed: ${current} → ${selected}\\n`);\n}\n\ntype ManageActionResult =\n | { triggerOAuth: false }\n | { triggerOAuth: true; account: ManagedAccount };\n\nasync function handleManageAction(\n manager: AccountManager,\n action: string,\n account?: ManagedAccount,\n client?: PluginClient,\n): Promise<ManageActionResult> {\n if (!account) return { triggerOAuth: false };\n\n const label = getAccountLabel(account);\n\n switch (action) {\n case \"toggle\":\n if (!account.uuid) break;\n await manager.toggleEnabled(account.uuid);\n await manager.refresh();\n {\n const updated = manager.getAccounts().find((candidate) => candidate.uuid === account.uuid);\n console.log(`\\n${label} ${updated?.enabled ? \"enabled\" : \"disabled\"}.\\n`);\n }\n break;\n\n case \"delete\":\n if (!account.uuid) break;\n {\n const removed = await manager.removeAccount(account.index);\n console.log(removed ? \"\\nAccount deleted.\\n\" : \"\\nFailed to delete account.\\n\");\n }\n break;\n\n case \"retry-auth\": {\n if (!account.uuid) break;\n const effectiveClient = client ?? createMinimalClient();\n console.log(`\\nRetrying authentication for ${label}...\\n`);\n const result = await manager.retryAuth(account.uuid, effectiveClient);\n\n if (result.ok) {\n console.log(`✅ ${label} re-authenticated successfully.\\n`);\n } else {\n console.log(\"Token refresh failed — starting OAuth flow...\\n\");\n return { triggerOAuth: true, account };\n }\n break;\n }\n }\n\n return { triggerOAuth: false };\n}\n","import { createHash } from \"node:crypto\";\nimport {\n ANTHROPIC_OAUTH_ADAPTER,\n TOOL_PREFIX,\n} from \"./constants\";\nimport { getModelBetas } from \"./betas\";\nimport { getUserAgent } from \"./model-config\";\nimport { SYSTEM_PROMPT } from \"./anthropic-prompt\";\n\nexport function getSystemPrompt(): string {\n return SYSTEM_PROMPT;\n}\n\nfunction sampleCodeUnits(text: string, indices: number[]): string {\n return indices\n .map((i) => (i < text.length ? text.charCodeAt(i).toString(16) : \"30\"))\n .join(\"\");\n}\n\nexport function buildBillingHeader(firstUserMessage: string): string {\n const version = ANTHROPIC_OAUTH_ADAPTER.cliVersion;\n const salt = ANTHROPIC_OAUTH_ADAPTER.billingSalt;\n if (!version || !salt) return \"\";\n\n const sampled = sampleCodeUnits(firstUserMessage, [4, 7, 20]);\n const hash = createHash(\"sha256\")\n .update(`${salt}${sampled}${version}`)\n .digest(\"hex\")\n .slice(0, 3);\n return `x-anthropic-billing-header: cc_version=${version}.${hash}; cc_entrypoint=cli; cch=00000;`;\n}\n\nconst OPENCODE_CAMEL_RE = /OpenCode/g;\nconst OPENCODE_LOWER_RE = /(?<!\\/)opencode/gi;\nconst TOOL_PREFIX_RESPONSE_RE = /\"name\"\\s*:\\s*\"mcp_([^\"]+)\"/g;\n\ntype SystemTextEntry = { type: string; text?: string };\ntype ToolEntry = { name?: string };\ntype MessageContentBlock = { type: string; name?: string };\ntype MessageEntry = { content?: MessageContentBlock[] };\ntype RequestPayload = {\n system?: SystemTextEntry[];\n tools?: ToolEntry[];\n messages?: MessageEntry[];\n};\n\nfunction addToolPrefix(name: string | undefined): string | undefined {\n if (!ANTHROPIC_OAUTH_ADAPTER.transform.addToolPrefix) {\n return name;\n }\n\n if (!name || name.startsWith(TOOL_PREFIX)) {\n return name;\n }\n\n return `${TOOL_PREFIX}${name}`;\n}\n\nfunction stripToolPrefixFromLine(line: string): string {\n if (!ANTHROPIC_OAUTH_ADAPTER.transform.stripToolPrefixInResponse) {\n return line;\n }\n\n return line.replace(TOOL_PREFIX_RESPONSE_RE, '\"name\": \"$1\"');\n}\n\nfunction processCompleteLines(buffer: string): { output: string; remaining: string } {\n const lines = buffer.split(\"\\n\");\n const remaining = lines.pop() ?? \"\";\n\n if (lines.length === 0) {\n return { output: \"\", remaining };\n }\n\n const output = `${lines.map(stripToolPrefixFromLine).join(\"\\n\")}\\n`;\n return { output, remaining };\n}\n\nexport function buildRequestHeaders(\n input: RequestInfo | URL,\n init: RequestInit | undefined,\n accessToken: string,\n modelId = \"unknown\",\n excludedBetas?: Set<string>,\n): Headers {\n const headers = new Headers();\n\n if (input instanceof Request) {\n input.headers.forEach((value, key) => { headers.set(key, value); });\n }\n\n if (init?.headers) {\n if (init.headers instanceof Headers) {\n init.headers.forEach((value, key) => { headers.set(key, value); });\n } else if (Array.isArray(init.headers)) {\n for (const [key, value] of init.headers) {\n if (value !== undefined) headers.set(key, String(value));\n }\n } else {\n for (const [key, value] of Object.entries(init.headers)) {\n if (value !== undefined) headers.set(key, String(value));\n }\n }\n }\n\n const incomingBetas = (headers.get(\"anthropic-beta\") || \"\")\n .split(\",\")\n .map((b) => b.trim())\n .filter(Boolean);\n\n const modelBetas = getModelBetas(modelId, excludedBetas);\n const mergedBetas = [...new Set([\n ...modelBetas,\n ...incomingBetas,\n ])].join(\",\");\n\n headers.set(\"authorization\", `Bearer ${accessToken}`);\n headers.set(\"anthropic-beta\", mergedBetas);\n headers.set(\"user-agent\", getUserAgent());\n headers.set(\"anthropic-dangerous-direct-browser-access\", \"true\");\n headers.set(\"x-app\", \"cli\");\n headers.delete(\"x-api-key\");\n\n return headers;\n}\n\nexport function transformRequestBody(body: string | undefined): string | undefined {\n if (!body) return body;\n\n try {\n const parsed: RequestPayload = JSON.parse(body);\n\n if (parsed.system && Array.isArray(parsed.system)) {\n parsed.system = parsed.system.map((systemEntry) => {\n if (\n ANTHROPIC_OAUTH_ADAPTER.transform.rewriteOpenCodeBranding\n && systemEntry.type === \"text\"\n && systemEntry.text\n ) {\n return {\n ...systemEntry,\n text: systemEntry.text\n .replace(OPENCODE_CAMEL_RE, \"Claude Code\")\n .replace(OPENCODE_LOWER_RE, \"Claude\"),\n };\n }\n return systemEntry;\n });\n }\n\n if (parsed.tools && Array.isArray(parsed.tools)) {\n parsed.tools = parsed.tools.map((tool) => ({\n ...tool,\n name: addToolPrefix(tool.name),\n }));\n }\n\n if (parsed.messages && Array.isArray(parsed.messages)) {\n parsed.messages = parsed.messages.map((message) => {\n if (message.content && Array.isArray(message.content)) {\n message.content = message.content.map((contentBlock) => {\n if (contentBlock.type === \"tool_use\" && contentBlock.name) {\n return { ...contentBlock, name: addToolPrefix(contentBlock.name) };\n }\n return contentBlock;\n });\n }\n return message;\n });\n }\n\n return JSON.stringify(parsed);\n } catch {\n return body;\n }\n}\n\nexport function extractModelIdFromBody(body: BodyInit | null | undefined): string {\n if (typeof body !== \"string\") {\n return \"unknown\";\n }\n\n try {\n const parsed = JSON.parse(body) as { model?: string };\n return parsed.model ?? \"unknown\";\n } catch {\n return \"unknown\";\n }\n}\n\nexport function transformRequestUrl(input: RequestInfo | URL): RequestInfo | URL {\n let url: URL | null = null;\n try {\n if (typeof input === \"string\" || input instanceof URL) {\n url = new URL(input.toString());\n } else if (input instanceof Request) {\n url = new URL(input.url);\n }\n } catch {\n return input;\n }\n\n if (\n ANTHROPIC_OAUTH_ADAPTER.transform.enableMessagesBetaQuery\n && url\n && url.pathname === \"/v1/messages\"\n && !url.searchParams.has(\"beta\")\n ) {\n url.searchParams.set(\"beta\", \"true\");\n return input instanceof Request ? new Request(url.toString(), input) : url;\n }\n\n return input;\n}\n\nexport function createResponseStreamTransform(response: Response): Response {\n if (!response.body) return response;\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n const encoder = new TextEncoder();\n let buffer = \"\";\n\n const stream = new ReadableStream({\n async pull(controller) {\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n buffer += decoder.decode();\n if (buffer) {\n controller.enqueue(encoder.encode(stripToolPrefixFromLine(buffer)));\n buffer = \"\";\n }\n controller.close();\n return;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const { output, remaining } = processCompleteLines(buffer);\n buffer = remaining;\n\n if (output) {\n controller.enqueue(encoder.encode(output));\n return;\n }\n }\n } catch (error) {\n try { reader.cancel().catch(() => {}); } catch {}\n controller.error(error);\n }\n },\n async cancel(reason) {\n await reader.cancel(reason);\n },\n });\n\n return new Response(stream, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n });\n}\n","import { ANTHROPIC_OAUTH_ADAPTER } from \"./constants\";\n\nexport interface ModelOverride {\n exclude?: string[];\n add?: string[];\n}\n\nexport interface ModelConfig {\n ccVersion: string;\n baseBetas: string[];\n longContextBetas: string[];\n modelOverrides: Record<string, ModelOverride>;\n}\n\nfunction splitBetaFlags(value: string): string[] {\n return value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean);\n}\n\nexport const config: ModelConfig = {\n ccVersion: ANTHROPIC_OAUTH_ADAPTER.cliVersion,\n baseBetas: splitBetaFlags(ANTHROPIC_OAUTH_ADAPTER.requestBetaHeader),\n longContextBetas: [\"context-1m-2025-08-07\", \"interleaved-thinking-2025-05-14\"],\n modelOverrides: {\n \"4-6\": {\n add: [\"effort-2025-11-24\"],\n },\n },\n};\n\nexport function getCliVersion(): string {\n return process.env.ANTHROPIC_CLI_VERSION ?? config.ccVersion;\n}\n\nexport function getUserAgent(): string {\n if (process.env.ANTHROPIC_USER_AGENT) {\n return process.env.ANTHROPIC_USER_AGENT;\n }\n\n if (process.env.ANTHROPIC_CLI_VERSION) {\n return `claude-cli/${getCliVersion()} (external, cli)`;\n }\n\n return ANTHROPIC_OAUTH_ADAPTER.cliUserAgent;\n}\n\nexport function getRequiredBetas(): string[] {\n return splitBetaFlags(process.env.ANTHROPIC_BETA_FLAGS ?? config.baseBetas.join(\",\"));\n}\n\nexport function getModelOverride(modelId: string): ModelOverride | null {\n const lowerModelId = modelId.toLowerCase();\n for (const [pattern, override] of Object.entries(config.modelOverrides)) {\n if (lowerModelId.includes(pattern)) {\n return override;\n }\n }\n\n return null;\n}\n","import { config, getModelOverride, getRequiredBetas } from \"./model-config\";\n\nexport const LONG_CONTEXT_BETAS = config.longContextBetas;\n\nconst excludedBetas = new Map<string, Set<string>>();\n\nlet lastBetaFlagsEnv = process.env.ANTHROPIC_BETA_FLAGS;\nlet lastModelId: string | undefined;\n\nexport function getExcludedBetas(modelId: string): Set<string> {\n const currentBetaFlags = process.env.ANTHROPIC_BETA_FLAGS;\n if (currentBetaFlags !== lastBetaFlagsEnv) {\n excludedBetas.clear();\n lastBetaFlagsEnv = currentBetaFlags;\n }\n\n if (lastModelId !== undefined && lastModelId !== modelId) {\n excludedBetas.clear();\n }\n lastModelId = modelId;\n\n return excludedBetas.get(modelId) ?? new Set();\n}\n\nexport function addExcludedBeta(modelId: string, beta: string): void {\n const nextExcludedBetas = excludedBetas.get(modelId) ?? new Set<string>();\n nextExcludedBetas.add(beta);\n excludedBetas.set(modelId, nextExcludedBetas);\n}\n\nexport function resetExcludedBetas(): void {\n excludedBetas.clear();\n lastModelId = undefined;\n lastBetaFlagsEnv = process.env.ANTHROPIC_BETA_FLAGS;\n}\n\nexport function isLongContextError(responseBody: string): boolean {\n return responseBody.includes(\"Extra usage is required for long context requests\")\n || responseBody.includes(\"long context beta is not yet available\");\n}\n\nexport function getNextBetaToExclude(modelId: string): string | null {\n const excluded = getExcludedBetas(modelId);\n for (const beta of LONG_CONTEXT_BETAS) {\n if (!excluded.has(beta)) {\n return beta;\n }\n }\n\n return null;\n}\n\nexport function supports1mContext(modelId: string): boolean {\n const lowerModelId = modelId.toLowerCase();\n if (!lowerModelId.includes(\"opus\") && !lowerModelId.includes(\"sonnet\")) {\n return false;\n }\n\n const versionMatch = lowerModelId.match(/(opus|sonnet)-(\\d+)-(\\d+)/);\n if (!versionMatch) {\n return false;\n }\n\n const major = Number.parseInt(versionMatch[2] ?? \"0\", 10);\n const minor = Number.parseInt(versionMatch[3] ?? \"0\", 10);\n const effectiveMinor = minor > 99 ? 0 : minor;\n return major > 4 || (major === 4 && effectiveMinor >= 6);\n}\n\nexport function getModelBetas(modelId: string, excluded?: Set<string>): string[] {\n const betas = [...getRequiredBetas()];\n const longContextBeta = config.longContextBetas[0];\n\n if (\n longContextBeta\n && process.env.ANTHROPIC_ENABLE_1M_CONTEXT === \"true\"\n && supports1mContext(modelId)\n ) {\n betas.push(longContextBeta);\n }\n\n const override = getModelOverride(modelId);\n if (override?.exclude) {\n for (const excludedBeta of override.exclude) {\n const index = betas.indexOf(excludedBeta);\n if (index !== -1) {\n betas.splice(index, 1);\n }\n }\n }\n\n if (override?.add) {\n for (const addedBeta of override.add) {\n if (!betas.includes(addedBeta)) {\n betas.push(addedBeta);\n }\n }\n }\n\n if (!excluded || excluded.size === 0) {\n return betas;\n }\n\n return betas.filter((beta) => !excluded.has(beta));\n}\n","// Anthropic system prompt embedded from griffinmartin/opencode-claude-auth\n// Source: https://github.com/griffinmartin/opencode-claude-auth/blob/main/src/anthropic-prompt.txt\nexport const SYSTEM_PROMPT = `You are an interactive CLI tool that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user.\n\nIMPORTANT: Assist with defensive security tasks only. Refuse to create, modify, or improve code that may be used maliciously. Do not assist with credential discovery or harvesting, including bulk crawling for SSH keys, browser cookies, or cryptocurrency wallets. Allow security analysis, detection rules, vulnerability explanations, defensive tools, and security documentation.\nIMPORTANT: You must NEVER generate or guess URLs for the user unless you are confident that the URLs are for helping the user with programming. You may use URLs provided by the user in their messages or local files.\n\nIf the user asks for help or wants to give feedback inform them of the following: \n- /help: Get help with using Claude Code\n- To give feedback, users should report the issue at https://github.com/anthropics/claude-code/issues\n\nWhen the user directly asks about Claude Code (eg. \"can Claude Code do...\", \"does Claude Code have...\"), or asks in second person (eg. \"are you able...\", \"can you do...\"), or asks how to use a specific Claude Code feature (eg. implement a hook, or write a slash command), use the WebFetch tool to gather information to answer the question from Claude Code docs. The list of available docs is available at https://docs.claude.com/en/docs/claude-code/claude_code_docs_map.md.\n\n# Tone and style\nYou should be concise, direct, and to the point, while providing complete information and matching the level of detail you provide in your response with the level of complexity of the user's query or the work you have completed. \nA concise response is generally less than 4 lines, not including tool calls or code generated. You should provide more detail when the task is complex or when the user asks you to.\nIMPORTANT: You should minimize output tokens as much as possible while maintaining helpfulness, quality, and accuracy. Only address the specific task at hand, avoiding tangential information unless absolutely critical for completing the request. If you can answer in 1-3 sentences or a short paragraph, please do.\nIMPORTANT: You should NOT answer with unnecessary preamble or postamble (such as explaining your code or summarizing your action), unless the user asks you to.\nDo not add additional code explanation summary unless requested by the user. After working on a file, briefly confirm that you have completed the task, rather than providing an explanation of what you did.\nAnswer the user's question directly, avoiding any elaboration, explanation, introduction, conclusion, or excessive details. Brief answers are best, but be sure to provide complete information. You MUST avoid extra preamble before/after your response, such as \"The answer is <answer>.\", \"Here is the content of the file...\" or \"Based on the information provided, the answer is...\" or \"Here is what I will do next...\".\n\nHere are some examples to demonstrate appropriate verbosity:\n<example>\nuser: 2 + 2\nassistant: 4\n</example>\n\n<example>\nuser: what is 2+2?\nassistant: 4\n</example>\n\n<example>\nuser: is 11 a prime number?\nassistant: Yes\n</example>\n\n<example>\nuser: what command should I run to list files in the current directory?\nassistant: ls\n</example>\n\n<example>\nuser: what command should I run to watch files in the current directory?\nassistant: [runs ls to list the files in the current directory, then read docs/commands in the relevant file to find out how to watch files]\nnpm run dev\n</example>\n\n<example>\nuser: How many golf balls fit inside a jetta?\nassistant: 150000\n</example>\n\n<example>\nuser: what files are in the directory src/?\nassistant: [runs ls and sees foo.c, bar.c, baz.c]\nuser: which file contains the implementation of foo?\nassistant: src/foo.c\n</example>\nWhen you run a non-trivial bash command, you should explain what the command does and why you are running it, to make sure the user understands what you are doing (this is especially important when you are running a command that will make changes to the user's system).\nRemember that your output will be displayed on a command line interface. Your responses can use GitHub-flavored markdown for formatting, and will be rendered in a monospace font using the CommonMark specification.\nOutput text to communicate with the user; all text you output outside of tool use is displayed to the user. Only use tools to complete tasks. Never use tools like Bash or code comments as means to communicate with the user during the session.\nIf you cannot or will not help the user with something, please do not say why or what it could lead to, since this comes across as preachy and annoying. Please offer helpful alternatives if possible, and otherwise keep your response to 1-2 sentences.\nOnly use emojis if the user explicitly requests it. Avoid using emojis in all communication unless asked.\nIMPORTANT: Keep your responses short, since they will be displayed on a command line interface.\n\n# Proactiveness\nYou are allowed to be proactive, but only when the user asks you to do something. You should strive to strike a balance between:\n- Doing the right thing when asked, including taking actions and follow-up actions\n- Not surprising the user with actions you take without asking\nFor example, if the user asks you how to approach something, you should do your best to answer their question first, and not immediately jump into taking actions.\n\n# Professional objectivity\nPrioritize technical accuracy and truthfulness over validating the user's beliefs. Focus on facts and problem-solving, providing direct, objective technical info without any unnecessary superlatives, praise, or emotional validation. It is best for the user if Claude honestly applies the same rigorous standards to all ideas and disagrees when necessary, even if it may not be what the user wants to hear. Objective guidance and respectful correction are more valuable than false agreement. Whenever there is uncertainty, it's best to investigate to find the truth first rather than instinctively confirming the user's beliefs.\n\n# Task Management\nYou have access to the TodoWrite tools to help you manage and plan tasks. Use these tools VERY frequently to ensure that you are tracking your tasks and giving the user visibility into your progress.\nThese tools are also EXTREMELY helpful for planning tasks, and for breaking down larger complex tasks into smaller steps. If you do not use this tool when planning, you may forget to do important tasks - and that is unacceptable.\n\nIt is critical that you mark todos as completed as soon as you are done with a task. Do not batch up multiple tasks before marking them as completed.\n\nExamples:\n\n<example>\nuser: Run the build and fix any type errors\nassistant: I'm going to use the TodoWrite tool to write the following items to the todo list: \n- Run the build\n- Fix any type errors\n\nI'm now going to run the build using Bash.\n\nLooks like I found 10 type errors. I'm going to use the TodoWrite tool to write 10 items to the todo list.\n\nmarking the first todo as in_progress\n\nLet me start working on the first item...\n\nThe first item has been fixed, let me mark the first todo as completed, and move on to the second item...\n..\n..\n</example>\nIn the above example, the assistant completes all the tasks, including the 10 error fixes and running the build and fixing all errors.\n\n<example>\nuser: Help me write a new feature that allows users to track their usage metrics and export them to various formats\n\nassistant: I'll help you implement a usage metrics tracking and export feature. Let me first use the TodoWrite tool to plan this task.\nAdding the following todos to the todo list:\n1. Research existing metrics tracking in the codebase\n2. Design the metrics collection system\n3. Implement core metrics tracking functionality\n4. Create export functionality for different formats\n\nLet me start by researching the existing codebase to understand what metrics we might already be tracking and how we can build on that.\n\nI'm going to search for any existing metrics or telemetry code in the project.\n\nI've found some existing telemetry code. Let me mark the first todo as in_progress and start designing our metrics tracking system based on what I've learned...\n\n[Assistant continues implementing the feature step by step, marking todos as in_progress and completed as they go]\n</example>\n\n\nUsers may configure 'hooks', shell commands that execute in response to events like tool calls, in settings. Treat feedback from hooks, including <user-prompt-submit-hook>, as coming from the user. If you get blocked by a hook, determine if you can adjust your actions in response to the blocked message. If not, ask the user to check their hooks configuration.\n\n# Doing tasks\nThe user will primarily request you perform software engineering tasks. This includes solving bugs, adding new functionality, refactoring code, explaining code, and more. For these tasks the following steps are recommended:\n- Use the TodoWrite tool to plan the task if required\n\n- Tool results and user messages may include <system-reminder> tags. <system-reminder> tags contain useful information and reminders. They are automatically added by the system, and bear no direct relation to the specific tool results or user messages in which they appear.\n\n\n# Tool usage policy\n- When doing file search, prefer to use the Task tool in order to reduce context usage.\n- You should proactively use the Task tool with specialized agents when the task at hand matches the agent's description.\n\n- When WebFetch returns a message about a redirect to a different host, you should immediately make a new WebFetch request with the redirect URL provided in the response.\n- You have the capability to call multiple tools in a single response. When multiple independent pieces of information are requested, batch your tool calls together for optimal performance. When making multiple bash tool calls, you MUST send a single message with multiple tools calls to run the calls in parallel. For example, if you need to run \"git status\" and \"git diff\", send a single message with two tool calls to run the calls in parallel.\n- If the user specifies that they want you to run tools \"in parallel\", you MUST send a single message with multiple tool use content blocks. For example, if you need to launch multiple agents in parallel, send a single message with multiple Task tool calls.\n- Use specialized tools instead of bash commands when possible, as this provides a better user experience. For file operations, use dedicated tools: Read for reading files instead of cat/head/tail, Edit for editing instead of sed/awk, and Write for creating files instead of cat with heredoc or echo redirection. Reserve bash tools exclusively for actual system commands and terminal operations that require shell execution. NEVER use bash echo or other command-line tools to communicate thoughts, explanations, or instructions to the user. Output all communication directly in your response text instead.\n\n\nHere is useful information about the environment you are running in:\n<env>\nWorking directory: /home/thdxr/dev/projects/anomalyco/opencode/packages/opencode\nIs directory a git repo: Yes\nPlatform: linux\nOS Version: Linux 6.12.4-arch1-1\nToday's date: 2025-09-30\n</env>\nYou are powered by the model named Sonnet 4.5. The exact model ID is claude-sonnet-4-5-20250929.\n\nAssistant knowledge cutoff is January 2025.\n\n\nIMPORTANT: Assist with defensive security tasks only. Refuse to create, modify, or improve code that may be used maliciously. Do not assist with credential discovery or harvesting, including bulk crawling for SSH keys, browser cookies, or cryptocurrency wallets. Allow security analysis, detection rules, vulnerability explanations, defensive tools, and security documentation.\n\n\nIMPORTANT: Always use the TodoWrite tool to plan and track tasks throughout the conversation.\n\n# Code References\n\nWhen referencing specific functions or pieces of code include the pattern \\`file_path:line_number\\` to allow the user to easily navigate to the source code location.\n\n<example>\nuser: Where are errors from the client handled?\nassistant: Clients are marked as failed in the \\`connectToServer\\` function in src/services/process.ts:712.\n</example>`;\n","import { createProactiveRefreshQueueForProvider } from \"opencode-multi-account-core\";\nimport { getConfig } from \"./config\";\nimport { isTokenExpired, refreshToken } from \"./token\";\nimport { debugLog } from \"./utils\";\n\nexport const ProactiveRefreshQueue = createProactiveRefreshQueueForProvider({\n providerAuthId: \"anthropic\",\n getConfig,\n isTokenExpired,\n refreshToken,\n debugLog,\n});\n\nexport type ProactiveRefreshQueue = InstanceType<typeof ProactiveRefreshQueue>;\n","import { AccountStore } from \"./account-store\";\nimport { ANTHROPIC_OAUTH_ADAPTER } from \"./constants\";\nimport { isTokenExpired, refreshToken } from \"./token\";\nimport { TokenRefreshError } from \"opencode-multi-account-core\";\nimport {\n extractModelIdFromBody,\n buildRequestHeaders,\n createResponseStreamTransform,\n transformRequestBody,\n transformRequestUrl,\n} from \"./request-transform\";\nimport {\n addExcludedBeta,\n getExcludedBetas,\n getNextBetaToExclude,\n isLongContextError,\n LONG_CONTEXT_BETAS,\n} from \"./betas\";\nimport type { PluginClient, StoredAccount } from \"./types\";\nimport { debugLog } from \"./utils\";\n\ntype BaseFetch = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;\n\ninterface AccountRuntime {\n fetch: BaseFetch;\n}\n\nconst TOKEN_REFRESH_PERMANENT_FAILURE_STATUS = 401;\n\nexport class AccountRuntimeFactory {\n private runtimes = new Map<string, AccountRuntime>();\n private initLocks = new Map<string, Promise<AccountRuntime>>();\n\n constructor(\n private readonly store: AccountStore,\n private readonly client: PluginClient,\n ) {}\n\n async getRuntime(uuid: string): Promise<AccountRuntime> {\n const cached = this.runtimes.get(uuid);\n if (cached) return cached;\n\n const existing = this.initLocks.get(uuid);\n if (existing) return existing;\n\n const initPromise = this.createRuntime(uuid);\n this.initLocks.set(uuid, initPromise);\n\n try {\n const runtime = await initPromise;\n this.runtimes.set(uuid, runtime);\n return runtime;\n } finally {\n this.initLocks.delete(uuid);\n }\n }\n\n invalidate(uuid: string): void {\n this.runtimes.delete(uuid);\n }\n\n invalidateAll(): void {\n this.runtimes.clear();\n }\n\n private async ensureFreshToken(\n storedAccount: StoredAccount,\n uuid: string,\n ): Promise<{ accessToken: string; expiresAt: number }> {\n const refreshed = await refreshToken(storedAccount.refreshToken, uuid, this.client);\n if (!refreshed.ok) {\n throw new TokenRefreshError(\n refreshed.permanent,\n refreshed.permanent ? TOKEN_REFRESH_PERMANENT_FAILURE_STATUS : undefined,\n );\n }\n\n await this.store.mutateAccount(uuid, (account) => {\n account.accessToken = refreshed.patch.accessToken;\n account.expiresAt = refreshed.patch.expiresAt;\n if (refreshed.patch.refreshToken) account.refreshToken = refreshed.patch.refreshToken;\n if (refreshed.patch.uuid) account.uuid = refreshed.patch.uuid;\n if (refreshed.patch.email) account.email = refreshed.patch.email;\n account.consecutiveAuthFailures = 0;\n account.isAuthDisabled = false;\n account.authDisabledReason = undefined;\n });\n\n this.client.auth\n .set({\n path: { id: ANTHROPIC_OAUTH_ADAPTER.authProviderId },\n body: {\n type: \"oauth\",\n refresh: refreshed.patch.refreshToken ?? storedAccount.refreshToken,\n access: refreshed.patch.accessToken,\n expires: refreshed.patch.expiresAt,\n },\n })\n .catch(() => {});\n\n return { accessToken: refreshed.patch.accessToken, expiresAt: refreshed.patch.expiresAt };\n }\n\n private async executeTransformedFetch(\n input: RequestInfo | URL,\n init: RequestInit | undefined,\n accessToken: string,\n ): Promise<Response> {\n const transformedInput = transformRequestUrl(input);\n const modelId = extractModelIdFromBody(init?.body);\n const excludedBetas = getExcludedBetas(modelId);\n const headers = buildRequestHeaders(transformedInput, init, accessToken, modelId, excludedBetas);\n const transformedBody =\n typeof init?.body === \"string\" ? transformRequestBody(init.body) : init?.body;\n\n let response = await fetch(transformedInput, {\n ...init,\n headers,\n body: transformedBody,\n });\n\n for (let attempt = 0; attempt < LONG_CONTEXT_BETAS.length; attempt += 1) {\n if (response.status !== 400 && response.status !== 429) {\n break;\n }\n\n const responseBody = await response.clone().text();\n if (!isLongContextError(responseBody)) {\n break;\n }\n\n const betaToExclude = getNextBetaToExclude(modelId);\n if (!betaToExclude) {\n break;\n }\n\n addExcludedBeta(modelId, betaToExclude);\n\n const retryHeaders = buildRequestHeaders(\n transformedInput,\n init,\n accessToken,\n modelId,\n getExcludedBetas(modelId),\n );\n\n response = await fetch(transformedInput, {\n ...init,\n headers: retryHeaders,\n body: transformedBody,\n });\n }\n\n return createResponseStreamTransform(response);\n }\n\n private async createRuntime(uuid: string): Promise<AccountRuntime> {\n const fetchWithAccount: BaseFetch = async (input, init) => {\n const storage = await this.store.load();\n const storedAccount = storage.accounts.find((account: StoredAccount) => account.uuid === uuid);\n if (!storedAccount) {\n throw new Error(`No credentials found for account ${uuid}`);\n }\n\n let accessToken = storedAccount.accessToken;\n let expiresAt = storedAccount.expiresAt;\n\n if (!accessToken || !expiresAt || isTokenExpired({ accessToken, expiresAt })) {\n ({ accessToken, expiresAt } = await this.ensureFreshToken(storedAccount, uuid));\n }\n\n if (!accessToken) {\n throw new Error(`No access token available for account ${uuid}`);\n }\n\n return this.executeTransformedFetch(input, init, accessToken);\n };\n\n debugLog(this.client, `Runtime created for account ${uuid.slice(0, 8)}`);\n return { fetch: fetchWithAccount };\n }\n}\n","import { promises as fs } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { getConfigDir } from \"opencode-multi-account-core\";\nimport { ANTHROPIC_OAUTH_ADAPTER } from \"./constants\";\nimport type { AccountStore } from \"./account-store\";\nimport type { OAuthCredentials, PluginClient, StoredAccount } from \"./types\";\n\nconst AUTH_JSON_FILENAME = \"auth.json\";\n\nfunction hasCompleteOAuthCredential(account: StoredAccount): account is StoredAccount & {\n refreshToken: string;\n accessToken: string;\n expiresAt: number;\n} {\n return (\n typeof account.refreshToken === \"string\"\n && account.refreshToken.length > 0\n && typeof account.accessToken === \"string\"\n && account.accessToken.length > 0\n && typeof account.expiresAt === \"number\"\n && Number.isFinite(account.expiresAt)\n );\n}\n\nfunction selectBootstrapAccount(\n accounts: StoredAccount[],\n activeAccountUuid?: string,\n): (StoredAccount & { refreshToken: string; accessToken: string; expiresAt: number }) | null {\n const completeAccounts = accounts.filter(hasCompleteOAuthCredential);\n if (completeAccounts.length === 0) {\n return null;\n }\n\n const activeAccount = activeAccountUuid\n ? completeAccounts.find((account) => account.uuid === activeAccountUuid)\n : undefined;\n if (activeAccount) {\n return activeAccount;\n }\n\n const firstUsableAccount = completeAccounts.find(\n (account) => account.enabled !== false && account.isAuthDisabled !== true,\n );\n return firstUsableAccount ?? completeAccounts[0] ?? null;\n}\n\nasync function readCurrentAuth(providerId: string): Promise<OAuthCredentials | null> {\n const authPath = join(getConfigDir(), AUTH_JSON_FILENAME);\n\n let raw: string;\n try {\n raw = await fs.readFile(authPath, \"utf-8\");\n } catch {\n return null;\n }\n\n try {\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n const providerAuth = parsed[providerId] as Partial<OAuthCredentials> | undefined;\n if (\n providerAuth?.type !== \"oauth\"\n || typeof providerAuth.refresh !== \"string\"\n || typeof providerAuth.access !== \"string\"\n || typeof providerAuth.expires !== \"number\"\n ) {\n return null;\n }\n\n return {\n type: \"oauth\",\n refresh: providerAuth.refresh,\n access: providerAuth.access,\n expires: providerAuth.expires,\n };\n } catch {\n return null;\n }\n}\n\nfunction shouldSyncBootstrapAuth(currentAuth: OAuthCredentials | null, nextAuth: OAuthCredentials): boolean {\n if (!currentAuth) {\n return true;\n }\n\n if (\n currentAuth.refresh === nextAuth.refresh\n && currentAuth.access === nextAuth.access\n && currentAuth.expires === nextAuth.expires\n ) {\n return false;\n }\n\n return currentAuth.expires < nextAuth.expires;\n}\n\nexport async function syncBootstrapAuth(\n client: PluginClient,\n store: AccountStore,\n): Promise<boolean> {\n const storage = await store.load();\n const bootstrapAccount = selectBootstrapAccount(storage.accounts, storage.activeAccountUuid);\n if (!bootstrapAccount) {\n return false;\n }\n\n const nextAuth: OAuthCredentials = {\n type: \"oauth\",\n refresh: bootstrapAccount.refreshToken,\n access: bootstrapAccount.accessToken,\n expires: bootstrapAccount.expiresAt,\n };\n\n const currentAuth = await readCurrentAuth(ANTHROPIC_OAUTH_ADAPTER.authProviderId);\n if (!shouldSyncBootstrapAuth(currentAuth, nextAuth)) {\n return false;\n }\n\n await client.auth.set({\n path: { id: ANTHROPIC_OAUTH_ADAPTER.authProviderId },\n body: nextAuth,\n });\n return true;\n}\n\nexport const __bootstrapAuthTestUtils = {\n selectBootstrapAccount,\n shouldSyncBootstrapAuth,\n};\n"],"mappings":"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","names":["v","createExecutorForProvider","executeWithAccountRotation","createExecutorForProvider","config","excludedBetas","tool","excludedBetas","getConfigDir","getConfigDir","usage"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/account-manager.ts","../src/constants.ts","../src/pi-ai-adapter.ts","../src/token-node-request.ts","../src/utils.ts","../src/config.ts","../src/usage.ts","../src/types.ts","../src/token.ts","../src/executor.ts","../src/rate-limit.ts","../src/pool-chain-executor.ts","../src/ui/ansi.ts","../src/ui/select.ts","../src/ui/confirm.ts","../src/ui/auth-menu.ts","../src/account-store.ts","../src/auth-handler.ts","../src/request-transform.ts","../src/model-config.ts","../src/betas.ts","../src/anthropic-prompt.ts","../src/proactive-refresh.ts","../src/runtime-factory.ts","../src/bootstrap-auth.ts"],"sourcesContent":["import { tool } from \"@opencode-ai/plugin\";\nimport type { Plugin } from \"@opencode-ai/plugin\";\nimport {\n CascadeStateManager,\n loadPoolChainConfig,\n migrateFromAuthJson,\n PoolManager,\n type PoolChainConfig,\n} from \"opencode-multi-account-core\";\nimport { AccountManager } from \"./account-manager\";\nimport { executeWithAccountRotation } from \"./executor\";\nimport { getPlanLabel, getUsageSummary } from \"./usage\";\nimport { handleAuthorize } from \"./auth-handler\";\nimport { getInjectedSystemPrompt, buildBillingHeader } from \"./request-transform\";\nimport { ANTHROPIC_BETA_HEADER } from \"./constants\";\nimport { loadConfig } from \"./config\";\nimport { ProactiveRefreshQueue } from \"./proactive-refresh\";\nimport { AccountStore } from \"./account-store\";\nimport { AccountRuntimeFactory } from \"./runtime-factory\";\nimport { formatWaitTime, getAccountLabel, showToast } from \"./utils\";\nimport { ANTHROPIC_OAUTH_ADAPTER } from \"./constants\";\nimport { getUserAgent } from \"./model-config\";\nimport { syncBootstrapAuth } from \"./bootstrap-auth\";\nimport type { OAuthCredentials, PluginClient } from \"./types\";\n\nconst EMPTY_OAUTH_CREDENTIALS: OAuthCredentials = {\n type: \"oauth\",\n refresh: \"\",\n access: \"\",\n expires: 0,\n};\n\nfunction extractFirstUserText(input: Record<string, unknown>): string {\n try {\n const raw = input as { messages?: unknown; request?: { messages?: unknown } };\n const messages = (raw.messages ?? raw.request?.messages) as\n Array<{ role?: string; content?: string | Array<{ type?: string; text?: string }> }> | undefined;\n if (!Array.isArray(messages)) return \"\";\n for (const msg of messages) {\n if (msg.role !== \"user\") continue;\n if (typeof msg.content === \"string\") return msg.content;\n if (Array.isArray(msg.content)) {\n for (const block of msg.content) {\n if (block.type === \"text\" && block.text) return block.text;\n }\n }\n }\n } catch {}\n return \"\";\n}\n\nfunction injectSystemPrompt(output: { system?: string[] }): void {\n const systemPrompt = getInjectedSystemPrompt();\n\n if (!Array.isArray(output.system)) {\n output.system = [systemPrompt];\n return;\n }\n\n if (!output.system.includes(systemPrompt)) {\n output.system.unshift(systemPrompt);\n }\n}\n\nexport const ClaudeMultiAuthPlugin: Plugin = async (ctx) => {\n const { client } = ctx as unknown as { client: PluginClient } & Record<string, unknown>;\n\n await loadConfig();\n\n const store = new AccountStore();\n await syncBootstrapAuth(client, store).catch(() => {});\n\n let manager: AccountManager | null = null;\n let runtimeFactory: AccountRuntimeFactory | null = null;\n let refreshQueue: ProactiveRefreshQueue | null = null;\n let poolManager: PoolManager | null = null;\n let cascadeStateManager: CascadeStateManager | null = null;\n let poolChainConfig: PoolChainConfig = { pools: [], chains: [] };\n\n async function ensureExecutionInfrastructure(): Promise<void> {\n runtimeFactory ??= new AccountRuntimeFactory(store, client);\n poolChainConfig = await loadPoolChainConfig();\n\n poolManager ??= new PoolManager();\n poolManager.loadPools(poolChainConfig.pools);\n cascadeStateManager ??= new CascadeStateManager();\n\n if (manager) {\n manager.setRuntimeFactory(runtimeFactory);\n manager.setClient(client);\n }\n }\n\n async function startRefreshQueueIfNeeded(): Promise<void> {\n if (!manager || manager.getAccountCount() === 0) {\n return;\n }\n\n await ensureExecutionInfrastructure();\n\n if (refreshQueue) {\n return;\n }\n\n refreshQueue = new ProactiveRefreshQueue(\n client,\n store,\n (uuid) => {\n runtimeFactory?.invalidate(uuid);\n void manager?.refresh();\n },\n );\n refreshQueue.start();\n }\n\n async function initializeManagerFromStore(): Promise<boolean> {\n if (manager) {\n return manager.getAccountCount() > 0;\n }\n\n const storage = await store.load();\n if (storage.accounts.length === 0) {\n return false;\n }\n\n manager = await AccountManager.create(store, EMPTY_OAUTH_CREDENTIALS, client);\n await ensureExecutionInfrastructure();\n await startRefreshQueueIfNeeded();\n return manager.getAccountCount() > 0;\n }\n\n async function initializeManagerFromAuth(credentials: OAuthCredentials): Promise<void> {\n if (!manager) {\n manager = await AccountManager.create(store, credentials, client);\n }\n\n await ensureExecutionInfrastructure();\n await startRefreshQueueIfNeeded();\n }\n\n await initializeManagerFromStore().catch(() => {});\n\n return {\n \"experimental.chat.system.transform\": (input: Record<string, unknown>, output: { system?: string[] }) => {\n injectSystemPrompt(output);\n const billingHeader = buildBillingHeader(extractFirstUserText(input));\n if (billingHeader && !output.system?.includes(billingHeader)) {\n output.system?.unshift(billingHeader);\n }\n },\n\n tool: {\n [ANTHROPIC_OAUTH_ADAPTER.statusToolName]: tool({\n description:\n \"Show status of all multi-auth accounts including rate limits and usage.\",\n args: {},\n async execute(_args, _context) {\n if (!manager) {\n return \"Multi-auth not initialized. No OAuth accounts detected.\";\n }\n\n const accounts = manager.getAccounts();\n if (accounts.length === 0) {\n return \"No accounts configured. Run `opencode auth login` to add an account.\";\n }\n\n const lines: string[] = [\n `## ${ANTHROPIC_OAUTH_ADAPTER.modelDisplayName} Multi-Auth Status (${accounts.length} accounts)\\n`,\n ];\n\n for (const account of accounts) {\n const isActive = account.uuid === manager.getActiveAccount()?.uuid;\n const marker = isActive ? \" **[ACTIVE]**\" : \"\";\n const label = getAccountLabel(account);\n const usage = getUsageSummary(account);\n const planLabel = getPlanLabel(account);\n const planBadge = planLabel ? ` [${planLabel}]` : \"\";\n\n const statusParts: string[] = [];\n if (account.isAuthDisabled) statusParts.push(`AUTH DISABLED: ${account.authDisabledReason}`);\n else if (!account.enabled) statusParts.push(\"disabled\");\n else statusParts.push(\"enabled\");\n\n if (account.rateLimitResetAt) {\n if (account.rateLimitResetAt > Date.now()) {\n const remaining = formatWaitTime(account.rateLimitResetAt - Date.now());\n statusParts.push(`RATE LIMITED (resets in ${remaining})`);\n } else {\n statusParts.push(\"RATE LIMIT RESET\");\n }\n }\n\n if (account.cachedUsage) {\n const now = Date.now();\n const usage = account.cachedUsage;\n const exhaustedTiers = [usage.five_hour, usage.seven_day].filter((tier) =>\n tier\n && tier.utilization >= 100\n && tier.resets_at != null\n && Date.parse(tier.resets_at) > now,\n );\n if (exhaustedTiers.length > 0) {\n statusParts.push(\"USAGE EXHAUSTED\");\n }\n }\n\n lines.push(\n `- **${label}**${planBadge}${marker}: ${statusParts.join(\" | \")} | ${usage}`,\n );\n }\n\n return lines.join(\"\\n\");\n },\n }),\n },\n\n auth: {\n provider: ANTHROPIC_OAUTH_ADAPTER.authProviderId,\n methods: [\n {\n label: ANTHROPIC_OAUTH_ADAPTER.authMethodLabel,\n type: \"oauth\" as const,\n async authorize() {\n const inputs = arguments.length > 0 ? (arguments[0] as Record<string, string>) : undefined;\n return handleAuthorize(manager, inputs, client);\n },\n },\n { type: \"api\" as const, label: \"Create an API Key\" },\n { type: \"api\" as const, label: \"Manually enter API Key\" },\n ],\n\n async loader(\n getAuth: () => Promise<unknown>,\n provider: Record<string, unknown>,\n ) {\n const auth = await getAuth() as Record<string, unknown>;\n if (auth.type !== \"oauth\") {\n return { apiKey: \"\", fetch };\n }\n\n for (const model of Object.values((provider as Record<string, unknown>).models ?? {}) as Record<string, unknown>[]) {\n if (model) {\n model.cost = { input: 0, output: 0, cache: { read: 0, write: 0 } };\n }\n }\n\n const credentials = auth as OAuthCredentials;\n await migrateFromAuthJson(\"anthropic\", store);\n await initializeManagerFromAuth(credentials);\n\n const initializedManager = manager;\n if (!initializedManager) {\n return { apiKey: \"\", fetch };\n }\n\n if (initializedManager.getAccountCount() > 0) {\n const activeAccount = initializedManager.getActiveAccount();\n const activeLabel = activeAccount ? getAccountLabel(activeAccount) : \"none\";\n void showToast(\n client,\n `Multi-Auth: ${initializedManager.getAccountCount()} account(s) loaded. Active: ${activeLabel}`,\n \"info\",\n );\n await initializedManager.validateNonActiveTokens(client);\n\n const disabledCount = initializedManager.getAccounts().filter((a) => a.isAuthDisabled).length;\n if (disabledCount > 0) {\n void showToast(\n client,\n `${disabledCount} account(s) have auth failures.`,\n \"warning\",\n );\n }\n }\n\n return {\n apiKey: \"\",\n \"chat.headers\": async (input: { provider?: { info?: { id?: string } } }, output: { headers: Record<string, string> }) => {\n if (input.provider?.info?.id !== ANTHROPIC_OAUTH_ADAPTER.authProviderId) return;\n output.headers[\"user-agent\"] = getUserAgent();\n output.headers[\"anthropic-beta\"] = ANTHROPIC_BETA_HEADER;\n output.headers[\"x-app\"] = \"cli\";\n },\n async fetch(input: RequestInfo | URL, init?: RequestInit) {\n if (!initializedManager || !runtimeFactory) {\n return fetch(input, init);\n }\n\n if (initializedManager.getAccountCount() === 0) {\n throw new Error(\n \"No Anthropic accounts configured. Run `opencode auth login` to add an account.\",\n );\n }\n\n if (!poolManager || !cascadeStateManager) {\n poolManager = new PoolManager();\n poolManager.loadPools(poolChainConfig.pools);\n cascadeStateManager = new CascadeStateManager();\n }\n\n return executeWithAccountRotation(\n initializedManager,\n runtimeFactory,\n client,\n input,\n init,\n {\n poolManager,\n cascadeStateManager,\n poolChainConfig,\n },\n );\n },\n };\n },\n },\n };\n};\n","import { createAccountManagerForProvider } from \"opencode-multi-account-core\";\nimport { isTokenExpired, refreshToken } from \"./token\";\n\nexport const AccountManager = createAccountManagerForProvider({\n providerAuthId: \"anthropic\",\n isTokenExpired,\n refreshToken,\n});\n\nexport type AccountManager = InstanceType<typeof AccountManager>;\n","import { anthropicOAuthAdapter } from \"opencode-multi-account-core\";\n\n/** Anthropic OAuth adapter config */\nexport const ANTHROPIC_OAUTH_ADAPTER = anthropicOAuthAdapter;\n\nexport const ANTHROPIC_CLIENT_ID = ANTHROPIC_OAUTH_ADAPTER.oauthClientId;\n\n/** Token exchange / refresh endpoint */\nexport const ANTHROPIC_TOKEN_ENDPOINT =\n ANTHROPIC_OAUTH_ADAPTER.tokenEndpoint;\n\n/** OAuth usage stats endpoint */\nexport const ANTHROPIC_USAGE_ENDPOINT =\n ANTHROPIC_OAUTH_ADAPTER.usageEndpoint;\n\n/** OAuth profile endpoint for email/plan info */\nexport const ANTHROPIC_PROFILE_ENDPOINT = ANTHROPIC_OAUTH_ADAPTER.profileEndpoint;\n\n/** Required beta header for OAuth requests */\nexport const ANTHROPIC_BETA_HEADER =\n ANTHROPIC_OAUTH_ADAPTER.requestBetaHeader;\n\n/** User-Agent header to mimic Claude CLI */\nexport const CLAUDE_CLI_USER_AGENT = ANTHROPIC_OAUTH_ADAPTER.cliUserAgent;\n\n/** Tool name prefix required by Anthropic servers */\nexport const TOOL_PREFIX = ANTHROPIC_OAUTH_ADAPTER.toolPrefix;\n\n/** Account storage filename */\nexport const ACCOUNTS_FILENAME = ANTHROPIC_OAUTH_ADAPTER.accountStorageFilename;\n\n/** Plan display labels derived from adapter */\nexport const PLAN_LABELS = ANTHROPIC_OAUTH_ADAPTER.planLabels;\n\n/** Access token expiry buffer (refresh 60s before expiry) */\nexport const TOKEN_EXPIRY_BUFFER_MS = 60_000;\n\n/** Maximum time to wait for a token refresh HTTP request */\nexport const TOKEN_REFRESH_TIMEOUT_MS = 30_000;\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport * as piAiOauth from \"@mariozechner/pi-ai/oauth\";\nimport type { OAuthCredentials as PiAiOAuthCredentials, OAuthPrompt } from \"@mariozechner/pi-ai/oauth\";\nimport {\n ANTHROPIC_OAUTH_ADAPTER,\n TOKEN_REFRESH_TIMEOUT_MS,\n} from \"./constants\";\nimport * as tokenNodeRequest from \"./token-node-request\";\nimport { fetchProfile } from \"./usage\";\nimport type { StoredAccount, CredentialRefreshPatch } from \"./types\";\n\n// pi-ai `expires` is epoch milliseconds: Date.now() + expires_in * 1000 - 5min buffer\n// StoredAccount `expiresAt` is also epoch milliseconds → 1:1 mapping, no unit conversion needed.\n\nexport function toPiAiCredentials(\n account: Pick<StoredAccount, \"accessToken\" | \"refreshToken\" | \"expiresAt\">,\n): PiAiOAuthCredentials {\n return {\n access: account.accessToken ?? \"\",\n refresh: account.refreshToken,\n expires: account.expiresAt ?? 0,\n };\n}\n\nexport function fromPiAiCredentials(\n creds: PiAiOAuthCredentials,\n): Pick<StoredAccount, \"accessToken\" | \"refreshToken\" | \"expiresAt\"> {\n return {\n accessToken: creds.access,\n refreshToken: creds.refresh,\n expiresAt: creds.expires,\n };\n}\n\nexport interface LoginWithPiAiCallbacks {\n onAuth: (info: { url: string; instructions?: string }) => void;\n onPrompt: (prompt: OAuthPrompt) => Promise<string>;\n onProgress?: (message: string) => void;\n onManualCodeInput?: () => Promise<string>;\n}\n\nconst ANTHROPIC_REFRESH_ENDPOINT = \"https://platform.claude.com/v1/oauth/token\";\nconst REFRESH_NODE_EXECUTABLE = process.env.OPENCODE_REFRESH_NODE_EXECUTABLE || \"node\";\nconst tokenProxyContext = new AsyncLocalStorage<boolean>();\nlet tokenProxyInstalled = false;\nlet tokenProxyOriginalFetch: typeof globalThis.fetch | null = null;\nconst refreshEndpointUrl = new URL(ANTHROPIC_REFRESH_ENDPOINT);\n\nfunction buildRefreshRequestError(details: string): Error {\n return new Error(`Anthropic token refresh request failed. url=${ANTHROPIC_REFRESH_ENDPOINT}; details=${details}`);\n}\n\nfunction buildRefreshInvalidJsonError(body: string, details: string): Error {\n return new Error(`Anthropic token refresh returned invalid JSON. url=${ANTHROPIC_REFRESH_ENDPOINT}; body=${body}; details=${details}`);\n}\n\nfunction getRequestUrlString(input: RequestInfo | URL): string {\n if (typeof input === \"string\") return input;\n if (input instanceof URL) return input.toString();\n return input.url;\n}\n\nfunction isAnthropicTokenEndpoint(input: RequestInfo | URL): boolean {\n const rawUrl = getRequestUrlString(input);\n\n try {\n const url = new URL(rawUrl);\n return url.origin === refreshEndpointUrl.origin\n && url.pathname === refreshEndpointUrl.pathname;\n } catch {\n return rawUrl === ANTHROPIC_REFRESH_ENDPOINT;\n }\n}\n\nfunction getRequestBodySource(input: RequestInfo | URL, init?: RequestInit): BodyInit | null | undefined {\n if (init?.body !== undefined) {\n return init.body;\n }\n\n if (input instanceof Request) {\n return input.body;\n }\n\n return undefined;\n}\n\nfunction stringifyBinaryBody(body: ArrayBuffer | ArrayBufferView): string {\n if (body instanceof ArrayBuffer) {\n return Buffer.from(body).toString(\"utf8\");\n }\n\n return Buffer.from(body.buffer, body.byteOffset, body.byteLength).toString(\"utf8\");\n}\n\nasync function getRequestBody(input: RequestInfo | URL, init?: RequestInit): Promise<string> {\n const body = getRequestBodySource(input, init);\n\n if (typeof body === \"string\") return body;\n if (body instanceof URLSearchParams) return body.toString();\n if (body instanceof Uint8Array || body instanceof ArrayBuffer || ArrayBuffer.isView(body)) {\n return stringifyBinaryBody(body);\n }\n if (typeof Blob !== \"undefined\" && body instanceof Blob) return await body.text();\n if (body instanceof ReadableStream) return await new Response(body).text();\n if (input instanceof Request && init?.body === undefined) return await input.clone().text();\n if (body == null) return \"\";\n\n throw buildRefreshRequestError(`Unsupported token request body type: ${Object.prototype.toString.call(body)}`);\n}\n\nfunction getRequestMethod(input: RequestInfo | URL, init?: RequestInit): string {\n return init?.method ?? (input instanceof Request ? input.method : \"GET\");\n}\n\nfunction shouldProxyTokenRequest(input: RequestInfo | URL): boolean {\n return tokenProxyContext.getStore() === true && isAnthropicTokenEndpoint(input);\n}\n\nasync function postAnthropicTokenViaNode(body: string): Promise<Response> {\n let output: string;\n try {\n output = await tokenNodeRequest.runNodeTokenRequest({\n body,\n endpoint: ANTHROPIC_REFRESH_ENDPOINT,\n executable: REFRESH_NODE_EXECUTABLE,\n timeoutMs: TOKEN_REFRESH_TIMEOUT_MS,\n });\n } catch (error) {\n const details = error instanceof Error ? error.message : String(error);\n throw buildRefreshRequestError(details);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(output);\n } catch (error) {\n const details = error instanceof Error ? `${error.name}: ${error.message}` : String(error);\n throw buildRefreshInvalidJsonError(output, details);\n }\n\n const result = parsed as { ok?: boolean; status?: number; body?: string; error?: string };\n if (!result.ok) {\n if (result.error) {\n throw buildRefreshRequestError(result.error);\n }\n\n throw buildRefreshRequestError(`Error: HTTP request failed. status=${result.status ?? 0}; url=${ANTHROPIC_REFRESH_ENDPOINT}; body=${result.body ?? \"\"}`);\n }\n\n return new Response(result.body ?? \"\", {\n status: 200,\n headers: {\n \"content-type\": \"application/json\",\n },\n });\n}\n\nfunction createAnthropicTokenProxyFetch(originalFetch: typeof globalThis.fetch): typeof globalThis.fetch {\n return (async (input: RequestInfo | URL, init?: RequestInit) => {\n if (!shouldProxyTokenRequest(input)) {\n return originalFetch(input, init);\n }\n\n const method = getRequestMethod(input, init).toUpperCase();\n if (method !== \"POST\") {\n throw buildRefreshRequestError(`Unsupported token endpoint method: ${method}`);\n }\n\n return await postAnthropicTokenViaNode(await getRequestBody(input, init));\n }) as typeof globalThis.fetch;\n}\n\nfunction ensureAnthropicTokenProxyFetchInstalled(): void {\n if (tokenProxyInstalled) return;\n\n tokenProxyOriginalFetch = globalThis.fetch;\n globalThis.fetch = createAnthropicTokenProxyFetch(tokenProxyOriginalFetch);\n tokenProxyInstalled = true;\n}\n\nexport async function withAnthropicTokenProxyFetch<T>(operation: () => Promise<T>): Promise<T> {\n ensureAnthropicTokenProxyFetchInstalled();\n return await tokenProxyContext.run(true, operation);\n}\n\nexport function resetAnthropicTokenProxyStateForTest(): void {\n tokenProxyInstalled = false;\n tokenProxyOriginalFetch = null;\n}\n\nasync function fetchProfileWithSingleRetry(accessToken: string): Promise<Awaited<ReturnType<typeof fetchProfile>>> {\n let profileResult = await fetchProfile(accessToken);\n if (profileResult.ok) {\n return profileResult;\n }\n\n await new Promise((resolve) => setTimeout(resolve, 1000));\n profileResult = await fetchProfile(accessToken);\n return profileResult;\n}\n\nexport async function loginWithPiAi(\n callbacks: LoginWithPiAiCallbacks,\n): Promise<Partial<StoredAccount>> {\n const piCreds = await withAnthropicTokenProxyFetch(() => piAiOauth.loginAnthropic({\n onAuth: callbacks.onAuth,\n onPrompt: callbacks.onPrompt,\n onProgress: callbacks.onProgress,\n onManualCodeInput: callbacks.onManualCodeInput,\n }));\n\n const base = fromPiAiCredentials(piCreds);\n\n const profileResult = await fetchProfileWithSingleRetry(piCreds.access);\n const profileData = profileResult.ok ? profileResult.data : undefined;\n\n return {\n ...base,\n email: profileData?.email,\n planTier: profileData?.planTier ?? \"\",\n addedAt: Date.now(),\n lastUsed: Date.now(),\n };\n}\n\nexport async function refreshWithPiAi(\n currentRefreshToken: string,\n): Promise<CredentialRefreshPatch> {\n const piCreds = await withAnthropicTokenProxyFetch(() => piAiOauth.refreshAnthropicToken(currentRefreshToken));\n\n return {\n accessToken: piCreds.access,\n refreshToken: piCreds.refresh,\n expiresAt: piCreds.expires,\n };\n}\n\nexport const PI_AI_ADAPTER_SERVICE = ANTHROPIC_OAUTH_ADAPTER.serviceLogName;\n","import * as childProcess from \"node:child_process\";\n\nexport interface NodeTokenRequestOptions {\n body: string;\n endpoint: string;\n executable: string;\n timeoutMs: number;\n}\n\ntype NodeTokenRequestRunner = (options: NodeTokenRequestOptions) => Promise<string>;\n\nfunction buildNodeTokenRequestScript(): string {\n return `\nconst https = require(\"node:https\");\nconst endpoint = process.env.ANTHROPIC_REFRESH_ENDPOINT;\nconst timeoutMs = Number(process.env.ANTHROPIC_REFRESH_TIMEOUT_MS || \"30000\");\nconst payload = process.env.ANTHROPIC_REFRESH_REQUEST_BODY || \"\";\n\nfunction printSuccess(body) {\n console.log(JSON.stringify({ ok: true, body }));\n}\n\nfunction printFailure(error) {\n console.log(JSON.stringify({ ok: false, ...error }));\n}\n\nconst request = https.request(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"Content-Length\": Buffer.byteLength(payload).toString(),\n },\n}, (response) => {\n let body = \"\";\n response.setEncoding(\"utf8\");\n response.on(\"data\", (chunk) => {\n body += chunk;\n });\n response.on(\"end\", () => {\n const status = response.statusCode ?? 0;\n if (status < 200 || status >= 300) {\n printFailure({ status, body });\n return;\n }\n\n printSuccess(body);\n });\n});\n\nrequest.setTimeout(timeoutMs, () => {\n request.destroy(new Error(\"Request timed out after \" + timeoutMs + \"ms\"));\n});\n\nrequest.on(\"error\", (error) => {\n printFailure({ error: error instanceof Error ? error.name + \": \" + error.message : String(error) });\n});\n\nrequest.write(payload);\nrequest.end();\n`;\n}\n\nasync function defaultRunNodeTokenRequest(options: NodeTokenRequestOptions): Promise<string> {\n const script = buildNodeTokenRequestScript();\n\n return await new Promise<string>((resolve, reject) => {\n childProcess.execFile(\n options.executable,\n [\"-e\", script],\n {\n timeout: options.timeoutMs + 1000,\n maxBuffer: 1024 * 1024,\n env: {\n ...process.env,\n ANTHROPIC_REFRESH_ENDPOINT: options.endpoint,\n ANTHROPIC_REFRESH_REQUEST_BODY: options.body,\n ANTHROPIC_REFRESH_TIMEOUT_MS: String(options.timeoutMs),\n },\n },\n (error, stdout, stderr) => {\n const trimmedStdout = stdout.trim();\n\n if (error) {\n reject(new Error(stderr.trim() || error.message));\n return;\n }\n\n if (!trimmedStdout) {\n reject(new Error(\"Empty response from Node refresh helper\"));\n return;\n }\n\n resolve(trimmedStdout);\n },\n );\n });\n}\n\nlet nodeTokenRequestRunner: NodeTokenRequestRunner = defaultRunNodeTokenRequest;\n\nexport async function runNodeTokenRequest(options: NodeTokenRequestOptions): Promise<string> {\n return await nodeTokenRequestRunner(options);\n}\n\nexport function setNodeTokenRequestRunnerForTest(runner: NodeTokenRequestRunner | null): void {\n nodeTokenRequestRunner = runner ?? defaultRunNodeTokenRequest;\n}\n","import { setConfigGetter } from \"opencode-multi-account-core\";\nimport { getConfig } from \"./config\";\n\nsetConfigGetter(getConfig);\n\nexport {\n createMinimalClient,\n debugLog,\n formatWaitTime,\n getAccountLabel,\n getConfigDir,\n getErrorCode,\n showToast,\n sleep,\n} from \"opencode-multi-account-core\";\n","import {\n getConfig,\n initCoreConfig,\n loadConfig,\n resetConfigCache,\n updateConfigField,\n} from \"opencode-multi-account-core\";\n\ninitCoreConfig(\"claude-multiauth.json\");\n\nexport {\n getConfig,\n loadConfig,\n resetConfigCache,\n updateConfigField,\n};\n","import {\n ANTHROPIC_OAUTH_ADAPTER,\n ANTHROPIC_PROFILE_ENDPOINT,\n ANTHROPIC_USAGE_ENDPOINT,\n PLAN_LABELS,\n} from \"./constants\";\nimport { formatWaitTime } from \"./utils\";\nimport * as v from \"valibot\";\nimport { UsageLimitsSchema } from \"./types\";\nimport type { ManagedAccount, UsageLimits } from \"./types\";\n\nconst OAUTH_BETA_HEADER = ANTHROPIC_OAUTH_ADAPTER.oauthBetaHeader;\n\nconst ProfileResponseSchema = v.object({\n account: v.object({\n email: v.optional(v.string()),\n has_claude_pro: v.optional(v.boolean(), false),\n has_claude_max: v.optional(v.boolean(), false),\n }),\n});\n\nexport type ProfileData = {\n email?: string;\n planTier: string;\n};\n\nexport type FetchUsageResult =\n | { ok: true; data: UsageLimits }\n | { ok: false; reason: string };\n\nexport type FetchProfileResult =\n | { ok: true; data: ProfileData }\n | { ok: false; reason: string };\n\nexport async function fetchUsage(accessToken: string): Promise<FetchUsageResult> {\n try {\n const response = await fetch(ANTHROPIC_USAGE_ENDPOINT, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${accessToken}`,\n \"anthropic-beta\": OAUTH_BETA_HEADER,\n },\n });\n\n if (!response.ok) {\n return { ok: false, reason: `HTTP ${response.status} ${response.statusText}` };\n }\n\n const result = v.safeParse(UsageLimitsSchema, await response.json());\n if (!result.success) {\n return { ok: false, reason: `Invalid response: ${result.issues[0]?.message ?? \"unknown\"}` };\n }\n\n return { ok: true, data: result.output };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return { ok: false, reason: message };\n }\n}\n\nexport async function fetchProfile(accessToken: string): Promise<FetchProfileResult> {\n try {\n const response = await fetch(ANTHROPIC_PROFILE_ENDPOINT, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${accessToken}`,\n \"anthropic-beta\": OAUTH_BETA_HEADER,\n },\n });\n\n if (!response.ok) {\n return { ok: false, reason: `HTTP ${response.status} ${response.statusText}` };\n }\n\n const result = v.safeParse(ProfileResponseSchema, await response.json());\n if (!result.success) {\n return { ok: false, reason: `Invalid response: ${result.issues[0]?.message ?? \"unknown\"}` };\n }\n\n const planTier = result.output.account.has_claude_max ? \"max\"\n : result.output.account.has_claude_pro ? \"pro\"\n : \"free\";\n\n return { ok: true, data: { email: result.output.account.email, planTier } };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return { ok: false, reason: message };\n }\n}\n\nfunction formatTimeRemaining(resetAt: string | null): string {\n if (!resetAt) return \"unknown\";\n const diffMs = new Date(resetAt).getTime() - Date.now();\n if (diffMs <= 0) return \"0m\";\n return formatWaitTime(diffMs);\n}\n\nexport function getUsageSummary(account: ManagedAccount): string {\n if (!account.cachedUsage) return \"no data\";\n\n const parts: string[] = [];\n const { five_hour, seven_day } = account.cachedUsage;\n\n if (five_hour) {\n const reset = five_hour.resets_at\n ? ` (resets ${formatTimeRemaining(five_hour.resets_at)})`\n : \"\";\n parts.push(`5h: ${five_hour.utilization.toFixed(0)}%${reset}`);\n }\n if (seven_day) {\n const reset = seven_day.resets_at\n ? ` (resets ${formatTimeRemaining(seven_day.resets_at)})`\n : \"\";\n parts.push(`7d: ${seven_day.utilization.toFixed(0)}%${reset}`);\n }\n\n return parts.length > 0 ? parts.join(\", \") : \"no data\";\n}\n\nexport function getPlanLabel(account: ManagedAccount): string {\n if (!account.planTier || account.planTier === \"free\") return \"\";\n return PLAN_LABELS[account.planTier]\n ?? account.planTier.charAt(0).toUpperCase() + account.planTier.slice(1);\n}\n","import * as v from \"valibot\";\n\n// ─── Schemas (Single Source of Truth) ───────────────────────────\n\nexport const OAuthCredentialsSchema = v.object({\n type: v.literal(\"oauth\"),\n refresh: v.string(),\n access: v.string(),\n expires: v.number(),\n});\n\nexport const UsageLimitEntrySchema = v.object({\n utilization: v.number(),\n resets_at: v.nullable(v.string()),\n});\n\nexport const UsageLimitsSchema = v.object({\n five_hour: v.optional(v.nullable(UsageLimitEntrySchema), null),\n seven_day: v.optional(v.nullable(UsageLimitEntrySchema), null),\n seven_day_sonnet: v.optional(v.nullable(UsageLimitEntrySchema), null),\n});\n\nexport const CredentialRefreshPatchSchema = v.object({\n accessToken: v.string(),\n expiresAt: v.number(),\n refreshToken: v.optional(v.string()),\n uuid: v.optional(v.string()),\n email: v.optional(v.string()),\n});\n\nexport const StoredAccountSchema = v.object({\n uuid: v.optional(v.string()),\n label: v.optional(v.string()),\n email: v.optional(v.string()),\n planTier: v.optional(v.string(), \"\"),\n refreshToken: v.string(),\n accessToken: v.optional(v.string()),\n expiresAt: v.optional(v.number()),\n addedAt: v.number(),\n lastUsed: v.number(),\n enabled: v.optional(v.boolean(), true),\n rateLimitResetAt: v.optional(v.number()),\n cachedUsage: v.optional(UsageLimitsSchema),\n cachedUsageAt: v.optional(v.number()),\n consecutiveAuthFailures: v.optional(v.number(), 0),\n isAuthDisabled: v.optional(v.boolean(), false),\n authDisabledReason: v.optional(v.string()),\n});\n\nexport const AccountStorageSchema = v.object({\n version: v.literal(1),\n accounts: v.optional(v.array(StoredAccountSchema), []),\n activeAccountUuid: v.optional(v.string()),\n});\n\n/** Anthropic /v1/oauth/token response */\nexport const TokenResponseSchema = v.object({\n access_token: v.string(),\n refresh_token: v.optional(v.string()),\n expires_in: v.number(),\n account: v.optional(v.object({\n uuid: v.optional(v.string()),\n email_address: v.optional(v.string()),\n })),\n});\n\n// ─── Types (derived from schemas) ───────────────────────────────\n\nexport type OAuthCredentials = v.InferOutput<typeof OAuthCredentialsSchema>;\nexport type UsageLimitEntry = v.InferOutput<typeof UsageLimitEntrySchema>;\nexport type UsageLimits = v.InferOutput<typeof UsageLimitsSchema>;\nexport type CredentialRefreshPatch = v.InferOutput<typeof CredentialRefreshPatchSchema>;\nexport type StoredAccount = v.InferOutput<typeof StoredAccountSchema>;\nexport type AccountStorage = v.InferOutput<typeof AccountStorageSchema>;\nexport type TokenResponse = v.InferOutput<typeof TokenResponseSchema>;\n\n// ─── Plugin Config Schema ────────────────────────────────────────\n\nexport const AccountSelectionStrategySchema = v.picklist([\"sticky\", \"round-robin\", \"hybrid\"]);\nexport type AccountSelectionStrategy = v.InferOutput<typeof AccountSelectionStrategySchema>;\n\nexport const PluginConfigSchema = v.object({\n /** sticky: same account until failure, round-robin: rotate every request, hybrid: health+usage scoring */\n account_selection_strategy: v.optional(AccountSelectionStrategySchema, \"sticky\"),\n\n /** Use cross-process claim file to distribute parallel sessions across accounts */\n cross_process_claims: v.optional(v.boolean(), true),\n /** Skip account when any usage tier utilization >= this % (100 = disabled) */\n soft_quota_threshold_percent: v.optional(v.pipe(v.number(), v.minValue(0), v.maxValue(100)), 100),\n /** Minimum backoff after rate limit (ms) */\n rate_limit_min_backoff_ms: v.optional(v.pipe(v.number(), v.minValue(0)), 30_000),\n /** Default retry-after when header is missing (ms) */\n default_retry_after_ms: v.optional(v.pipe(v.number(), v.minValue(0)), 60_000),\n /** Consecutive auth failures before disabling account */\n max_consecutive_auth_failures: v.optional(v.pipe(v.number(), v.integer(), v.minValue(1)), 3),\n /** Backoff after token refresh failure (ms) */\n token_failure_backoff_ms: v.optional(v.pipe(v.number(), v.minValue(0)), 30_000),\n /** Enable proactive background token refresh */\n proactive_refresh: v.optional(v.boolean(), true),\n /** Seconds before expiry to trigger proactive refresh (default 30 min) */\n proactive_refresh_buffer_seconds: v.optional(v.pipe(v.number(), v.minValue(60)), 1800),\n /** Interval between background refresh checks in seconds (default 5 min) */\n proactive_refresh_interval_seconds: v.optional(v.pipe(v.number(), v.minValue(30)), 300),\n /** Suppress toast notifications */\n quiet_mode: v.optional(v.boolean(), false),\n /** Enable debug logging */\n debug: v.optional(v.boolean(), false),\n});\n\nexport type PluginConfig = v.InferOutput<typeof PluginConfigSchema>;\n\n// ─── External Plugin Auth Hook ───────────────────────────────────\n\nexport interface OriginalAuthHook {\n methods?: Array<{\n authorize?: (inputs?: Record<string, string>) => Promise<unknown>;\n }>;\n loader: (\n getAuth: () => Promise<unknown>,\n provider: unknown,\n ) => Promise<{ apiKey: string; fetch: (input: RequestInfo | URL, init?: RequestInit) => Promise<Response> }>;\n}\n\n// ─── Types (manual — not from external data) ────────────────────\n\nexport type TokenRefreshResult =\n | { ok: true; patch: CredentialRefreshPatch }\n | { ok: false; permanent: boolean };\n\nexport interface ManagedAccount {\n index: number;\n uuid?: string;\n label?: string;\n email?: string;\n planTier?: string;\n refreshToken: string;\n accessToken?: string;\n expiresAt?: number;\n addedAt: number;\n lastUsed: number;\n enabled: boolean;\n rateLimitResetAt?: number;\n last429At?: number;\n cachedUsage?: UsageLimits;\n cachedUsageAt?: number;\n consecutiveAuthFailures: number;\n isAuthDisabled: boolean;\n authDisabledReason?: string;\n}\n\nexport interface PluginClient {\n auth: {\n set: (params: {\n path: { id: string };\n body: {\n type: string;\n refresh: string;\n access: string;\n expires: number;\n };\n }) => Promise<void>;\n };\n tui: {\n showToast: (params: {\n body: {\n title?: string;\n message: string;\n variant: \"info\" | \"warning\" | \"success\" | \"error\";\n };\n }) => Promise<void>;\n };\n app: {\n log: (params: {\n body: {\n service: string;\n level: \"debug\" | \"info\" | \"warn\" | \"error\";\n message: string;\n extra?: Record<string, unknown>;\n };\n }) => Promise<void>;\n };\n}\n","import {\n ANTHROPIC_OAUTH_ADAPTER,\n TOKEN_EXPIRY_BUFFER_MS,\n} from \"./constants\";\nimport { refreshWithPiAi } from \"./pi-ai-adapter\";\nimport type {\n ManagedAccount,\n PluginClient,\n TokenRefreshResult,\n} from \"./types\";\n\nconst PERMANENT_FAILURE_HTTP_STATUSES = new Set([400, 401, 403]);\nconst PERMANENT_FAILURE_MESSAGE_PATTERNS = [\n /\\binvalid_grant\\b/i,\n /\\binvalid_scope\\b/i,\n /\\bunauthorized_client\\b/i,\n /\\brefresh token\\b.*\\b(invalid|expired|revoked|no longer valid)\\b/i,\n /\\bauth(?:entication)?(?:[_\\s-]+)?invalid\\b/i,\n];\nconst refreshMutexByAccountId = new Map<string, Promise<TokenRefreshResult>>();\n\nexport function isTokenExpired(account: Pick<ManagedAccount, \"accessToken\" | \"expiresAt\">): boolean {\n if (!account.accessToken || !account.expiresAt) return true;\n return account.expiresAt <= Date.now() + TOKEN_EXPIRY_BUFFER_MS;\n}\n\nexport async function refreshToken(\n currentRefreshToken: string,\n accountId: string,\n client: PluginClient,\n): Promise<TokenRefreshResult> {\n if (!currentRefreshToken) return { ok: false, permanent: true };\n\n const inFlightRefresh = refreshMutexByAccountId.get(accountId);\n if (inFlightRefresh) return inFlightRefresh;\n\n const refreshPromise = (async (): Promise<TokenRefreshResult> => {\n try {\n const patch = await refreshWithPiAi(currentRefreshToken);\n return { ok: true, patch };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const statusMatch = message.match(/\\b(400|401|403)\\b/);\n const hasPermanentStatus = statusMatch !== null\n && PERMANENT_FAILURE_HTTP_STATUSES.has(Number(statusMatch[1]));\n const hasPermanentMessage = PERMANENT_FAILURE_MESSAGE_PATTERNS\n .some((pattern) => pattern.test(message));\n const isPermanent = hasPermanentStatus || hasPermanentMessage;\n\n await client.app\n .log({\n body: {\n service: ANTHROPIC_OAUTH_ADAPTER.serviceLogName,\n level: isPermanent ? \"error\" : \"warn\",\n message: `Token refresh failed: ${message}${isPermanent ? \" (permanent)\" : \"\"}`,\n extra: { accountId },\n },\n })\n .catch(() => {});\n\n return { ok: false, permanent: isPermanent };\n } finally {\n refreshMutexByAccountId.delete(accountId);\n }\n })();\n\n refreshMutexByAccountId.set(accountId, refreshPromise);\n return refreshPromise;\n}\n\nexport function clearRefreshMutex(accountId?: string): void {\n if (accountId) {\n refreshMutexByAccountId.delete(accountId);\n return;\n }\n\n refreshMutexByAccountId.clear();\n}\n","import { createExecutorForProvider, getClearedOAuthBody } from \"opencode-multi-account-core\";\nimport { ANTHROPIC_OAUTH_ADAPTER } from \"./constants\";\nimport type {\n CascadeStateManager,\n ExecutorAccountManager,\n ExecutorRuntimeFactory,\n PluginClient,\n PoolChainConfig,\n PoolManager,\n RateLimitAccountManager,\n} from \"opencode-multi-account-core\";\nimport { handleRateLimitResponse as handleRateLimitResponseForProvider } from \"./rate-limit\";\nimport { executeWithPoolChainRotation } from \"./pool-chain-executor\";\nimport type { PoolChainAccountManager } from \"./pool-chain-executor\";\nimport { formatWaitTime, getAccountLabel, showToast, sleep } from \"./utils\";\n\nconst { executeWithAccountRotation: executeWithCoreAccountRotation } = createExecutorForProvider(\"Anthropic\", {\n handleRateLimitResponse: async (manager, client, account, response) =>\n handleRateLimitResponseForProvider(\n manager as RateLimitAccountManager,\n client,\n account,\n response,\n ),\n formatWaitTime,\n sleep,\n showToast,\n getAccountLabel,\n});\n\ninterface PoolChainExecutorOptions {\n poolManager: PoolManager;\n cascadeStateManager: CascadeStateManager;\n poolChainConfig: PoolChainConfig;\n}\n\nfunction isAllAccountsTerminalError(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n return error.message.includes(\"All Anthropic accounts\");\n}\n\nasync function clearAuthIfNoUsableAccount(\n manager: ExecutorAccountManager,\n client: PluginClient,\n): Promise<void> {\n await manager.refresh();\n if (manager.hasAnyUsableAccount()) return;\n\n await client.auth\n .set({\n path: { id: ANTHROPIC_OAUTH_ADAPTER.authProviderId },\n body: getClearedOAuthBody(),\n })\n .catch(() => {});\n}\n\nfunction hasPoolChainEntries(config: PoolChainConfig): boolean {\n return (config.pools?.length ?? 0) > 0 || (config.chains?.length ?? 0) > 0;\n}\n\nexport async function executeWithAccountRotation(\n manager: ExecutorAccountManager,\n runtimeFactory: ExecutorRuntimeFactory,\n client: PluginClient,\n input: RequestInfo | URL,\n init?: RequestInit,\n options?: PoolChainExecutorOptions,\n): Promise<Response> {\n try {\n if (!options || !hasPoolChainEntries(options.poolChainConfig)) {\n return await executeWithCoreAccountRotation(manager, runtimeFactory, client, input, init);\n }\n\n return await executeWithPoolChainRotation(\n manager as unknown as PoolChainAccountManager,\n runtimeFactory,\n options.poolManager,\n options.cascadeStateManager,\n options.poolChainConfig,\n client,\n input,\n init,\n );\n } catch (error) {\n if (isAllAccountsTerminalError(error)) {\n await clearAuthIfNoUsableAccount(manager, client);\n }\n throw error;\n }\n}\n","import { createRateLimitHandlers } from \"opencode-multi-account-core\";\nimport { getConfig } from \"./config\";\nimport { fetchUsage } from \"./usage\";\nimport { formatWaitTime, getAccountLabel, showToast } from \"./utils\";\n\nconst {\n fetchUsageLimits,\n getResetMsFromUsage,\n handleRateLimitResponse,\n retryAfterMsFromResponse,\n} = createRateLimitHandlers({\n fetchUsage: async (accessToken: string) => fetchUsage(accessToken),\n getConfig,\n formatWaitTime,\n getAccountLabel,\n showToast,\n});\n\nexport {\n fetchUsageLimits,\n getResetMsFromUsage,\n handleRateLimitResponse,\n retryAfterMsFromResponse,\n};\n","import { createExecutorForProvider } from \"opencode-multi-account-core\";\nimport type {\n CascadeStateManager,\n ExecutorAccountManager,\n ExecutorRuntimeFactory,\n PoolChainConfig,\n PoolManager,\n} from \"opencode-multi-account-core\";\nimport { handleRateLimitResponse as handleRateLimitResponseForProvider } from \"./rate-limit\";\nimport { formatWaitTime, getAccountLabel, showToast, sleep } from \"./utils\";\nimport type { ManagedAccount, PluginClient } from \"./types\";\n\ninterface PoolChainQueueEntry {\n accountUuid: string;\n chainIndex?: number;\n}\n\ntype RateLimitManager = Parameters<typeof handleRateLimitResponseForProvider>[0];\n\nexport interface PoolChainAccountManager extends ExecutorAccountManager, RateLimitManager {\n getAccounts(): ManagedAccount[];\n isRateLimited(account: ManagedAccount): boolean;\n getActiveAccount(): ManagedAccount | null;\n}\n\nfunction buildCascadePrompt(input: RequestInfo | URL, init?: RequestInit): string {\n if (typeof init?.body === \"string\" && init.body.length > 0) {\n return init.body;\n }\n\n const method = init?.method ?? \"GET\";\n return `${method}:${String(input)}`;\n}\n\nfunction createQueueAwareManager(\n manager: PoolChainAccountManager,\n queue: PoolChainQueueEntry[],\n cascadeStateManager: CascadeStateManager,\n): PoolChainAccountManager {\n return Object.create(manager, {\n selectAccount: { value: async function selectAccount() {\n await manager.refresh();\n\n while (queue.length > 0) {\n const next = queue.shift();\n if (!next) break;\n\n const account = manager\n .getAccounts()\n .find((candidate) => candidate.uuid === next.accountUuid);\n\n if (!account?.uuid) continue;\n if (!account.enabled || account.isAuthDisabled) continue;\n if (manager.isRateLimited(account)) continue;\n\n cascadeStateManager.markAttempted(account.uuid);\n if (next.chainIndex !== undefined) {\n cascadeStateManager.markVisitedChainIndex(next.chainIndex);\n }\n return account;\n }\n\n return manager.selectAccount();\n }},\n });\n}\n\nexport async function executeWithPoolChainRotation(\n manager: PoolChainAccountManager,\n runtimeFactory: ExecutorRuntimeFactory,\n poolManager: PoolManager,\n cascadeStateManager: CascadeStateManager,\n poolChainConfig: PoolChainConfig,\n client: PluginClient,\n input: RequestInfo | URL,\n init?: RequestInit,\n): Promise<Response> {\n const cascadePrompt = buildCascadePrompt(input, init);\n const currentAccountUuid = manager.getActiveAccount()?.uuid;\n cascadeStateManager.startTurn(cascadePrompt, currentAccountUuid);\n\n const queue: PoolChainQueueEntry[] = [];\n const queuedAccountUuids = new Set<string>();\n const queueAwareManager = createQueueAwareManager(manager, queue, cascadeStateManager);\n\n const { executeWithAccountRotation } = createExecutorForProvider(\"Anthropic\", {\n handleRateLimitResponse: async (rawManager, rawClient, account, response) => {\n await handleRateLimitResponseForProvider(\n rawManager as Parameters<typeof handleRateLimitResponseForProvider>[0],\n rawClient,\n account,\n response,\n );\n\n if (!account.uuid) return;\n\n poolManager.markExhausted(account.uuid);\n cascadeStateManager.markAttempted(account.uuid);\n\n const cascadeState = cascadeStateManager.ensureCascadeState(cascadePrompt, account.uuid);\n const failoverPlan = await poolManager.buildFailoverPlan(\n account,\n poolChainConfig,\n manager,\n {\n attemptedAccounts: cascadeState.attemptedAccounts,\n visitedChainIndexes: cascadeState.visitedChainIndexes,\n },\n );\n\n for (const candidate of failoverPlan.candidates) {\n if (queuedAccountUuids.has(candidate.accountUuid)) continue;\n queue.push({\n accountUuid: candidate.accountUuid,\n chainIndex: candidate.chainIndex,\n });\n queuedAccountUuids.add(candidate.accountUuid);\n }\n },\n formatWaitTime,\n sleep,\n showToast,\n getAccountLabel,\n });\n\n try {\n return await executeWithAccountRotation(\n queueAwareManager,\n runtimeFactory,\n client,\n input,\n init,\n );\n } finally {\n cascadeStateManager.clearCascadeState();\n }\n}\n","export {\n ANSI,\n isTTY,\n parseKey,\n type KeyAction,\n} from \"opencode-multi-account-core\";\n","export {\n select,\n type MenuItem,\n type SelectOptions,\n} from \"opencode-multi-account-core\";\n","export { confirm } from \"opencode-multi-account-core\";\n","import { ANSI } from \"./ansi\";\nimport { select, type MenuItem } from \"./select\";\nimport { confirm } from \"./confirm\";\nimport { getAccountLabel } from \"../utils\";\nimport { getPlanLabel } from \"../usage\";\nimport type { AccountSelectionStrategy, ManagedAccount, UsageLimits } from \"../types\";\n\nexport type AuthMenuAction =\n | { type: \"add\" }\n | { type: \"check-quotas\" }\n | { type: \"manage\" }\n | { type: \"load-balancing\" }\n | { type: \"delete-all\" }\n | { type: \"cancel\" };\n\nexport type AccountAction = \"back\" | \"toggle\" | \"delete\" | \"retry-auth\" | \"cancel\";\n\nfunction formatRelativeTime(timestamp: number | undefined): string {\n if (!timestamp) return \"never\";\n const days = Math.floor((Date.now() - timestamp) / 86_400_000);\n if (days === 0) return \"today\";\n if (days === 1) return \"yesterday\";\n if (days < 7) return `${days}d ago`;\n if (days < 30) return `${Math.floor(days / 7)}w ago`;\n return new Date(timestamp).toLocaleDateString();\n}\n\nfunction formatDate(timestamp: number | undefined): string {\n if (!timestamp) return \"unknown\";\n return new Date(timestamp).toLocaleDateString();\n}\n\ntype AccountStatus = \"active\" | \"rate-limited\" | \"auth-disabled\" | \"disabled\";\n\nexport function getAccountStatus(account: ManagedAccount): AccountStatus {\n if (account.isAuthDisabled) return \"auth-disabled\";\n if (!account.enabled) return \"disabled\";\n if (account.cachedUsage) {\n const now = Date.now();\n const usage = account.cachedUsage;\n const hasEvaluableUsageTier = [usage.five_hour, usage.seven_day].some((tier) => tier != null);\n const exhaustedTiers = [usage.five_hour, usage.seven_day].filter((tier) =>\n tier\n && tier.utilization >= 100\n && tier.resets_at != null\n && Date.parse(tier.resets_at) > now,\n );\n if (exhaustedTiers.length > 0) {\n return \"rate-limited\";\n }\n if (hasEvaluableUsageTier) {\n return \"active\";\n }\n }\n if (account.rateLimitResetAt && account.rateLimitResetAt > Date.now()) return \"rate-limited\";\n return \"active\";\n}\n\nconst STATUS_BADGE: Record<AccountStatus, string> = {\n \"active\": `${ANSI.green}[active]${ANSI.reset}`,\n \"rate-limited\": `${ANSI.yellow}[rate-limited]${ANSI.reset}`,\n \"auth-disabled\": `${ANSI.red}[auth-disabled]${ANSI.reset}`,\n \"disabled\": `${ANSI.red}[disabled]${ANSI.reset}`,\n};\n\nfunction buildAccountMenuItem(account: ManagedAccount): MenuItem<ManagedAccount> {\n const label = getAccountLabel(account);\n const status = getAccountStatus(account);\n const badge = STATUS_BADGE[status];\n const fullLabel = `${label} ${badge}`;\n\n return {\n label: fullLabel,\n hint: account.lastUsed ? `used ${formatRelativeTime(account.lastUsed)}` : \"\",\n value: account,\n disabled: false,\n };\n}\n\nexport async function showAuthMenu(accounts: ManagedAccount[]): Promise<AuthMenuAction> {\n const items: MenuItem<AuthMenuAction>[] = [\n { label: \"Add new account\", value: { type: \"add\" }, color: \"green\" },\n { label: \"Check quotas\", value: { type: \"check-quotas\" }, color: \"cyan\" },\n { label: \"Manage accounts\", value: { type: \"manage\" } },\n { label: \"Load balancing\", value: { type: \"load-balancing\" } },\n { label: \"\", value: { type: \"cancel\" }, separator: true },\n { label: \"Delete all accounts\", value: { type: \"delete-all\" }, color: \"red\" },\n ];\n\n while (true) {\n const subtitle = `${accounts.length} account(s) registered`;\n const result = await select(items, {\n message: \"Claude Multi-Auth\",\n subtitle,\n });\n\n if (!result) return { type: \"cancel\" };\n\n if (result.type === \"delete-all\") {\n const confirmed = await confirm(\"Delete ALL accounts? This cannot be undone.\");\n if (!confirmed) continue;\n }\n\n return result;\n }\n}\n\nexport async function showManageAccounts(accounts: ManagedAccount[]): Promise<{ action: AccountAction; account?: ManagedAccount }> {\n const items: MenuItem<ManagedAccount | null>[] = [\n { label: \"Back\", value: null },\n { label: \"\", value: null, separator: true },\n ...accounts.map(buildAccountMenuItem),\n ];\n\n const selected = await select(items, {\n message: \"Manage Accounts\",\n subtitle: \"Select an account to manage\",\n });\n\n if (!selected) return { action: \"back\" };\n\n return showAccountDetails(selected);\n}\n\nasync function showAccountDetails(account: ManagedAccount): Promise<{ action: AccountAction; account: ManagedAccount }> {\n const label = getAccountLabel(account);\n const status = getAccountStatus(account);\n const badge = STATUS_BADGE[status];\n\n console.log(\"\");\n console.log(`${ANSI.bold}Account: ${label} ${badge}${ANSI.reset}`);\n console.log(`${ANSI.dim}Added: ${formatDate(account.addedAt)}${ANSI.reset}`);\n console.log(`${ANSI.dim}Last used: ${formatRelativeTime(account.lastUsed)}${ANSI.reset}`);\n if (account.isAuthDisabled) {\n console.log(`${ANSI.red}Auth disabled: ${account.authDisabledReason ?? \"unknown\"}${ANSI.reset}`);\n }\n console.log(\"\");\n\n while (true) {\n const toggleLabel = account.enabled ? \"Disable account\" : \"Enable account\";\n const toggleColor = account.enabled ? \"yellow\" as const : \"green\" as const;\n\n const items: MenuItem<AccountAction>[] = [\n { label: \"Back\", value: \"back\" },\n ];\n\n items.push({ label: toggleLabel, value: \"toggle\", color: toggleColor });\n\n items.push({ label: \"Re-authenticate\", value: \"retry-auth\", color: \"cyan\" });\n\n items.push({ label: \"Delete this account\", value: \"delete\", color: \"red\" });\n\n const result = await select(items, {\n message: \"Account options\",\n subtitle: label,\n });\n\n if (result === \"delete\") {\n const confirmed = await confirm(`Delete ${label}?`);\n if (!confirmed) continue;\n }\n\n return { action: result ?? \"cancel\", account };\n }\n}\n\nfunction getUsageColor(utilization: number): string {\n if (utilization >= 90) return ANSI.red;\n if (utilization >= 60) return ANSI.yellow;\n return ANSI.green;\n}\n\nfunction createProgressBar(utilization: number, width = 20): string {\n const filled = Math.round((utilization / 100) * width);\n const empty = width - filled;\n const color = getUsageColor(utilization);\n return `${color}${\"█\".repeat(filled)}${ANSI.reset}${\"░\".repeat(empty)} ${color}${Math.round(utilization)}% used${ANSI.reset}`;\n}\n\nfunction formatResetTime(resetAt: string | null): string {\n if (!resetAt) return \"\";\n const date = new Date(resetAt);\n const now = new Date();\n const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n const timeStr = date.toLocaleTimeString(undefined, { hour: \"numeric\", minute: \"2-digit\", hour12: true });\n\n const isSameDay = date.getFullYear() === now.getFullYear()\n && date.getMonth() === now.getMonth()\n && date.getDate() === now.getDate();\n\n if (isSameDay) {\n return ` (resets ${timeStr}, ${tz})`;\n }\n const dateStr = date.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" });\n return ` (resets ${dateStr} ${timeStr}, ${tz})`;\n}\n\nfunction printUsageEntry(name: string, entry: { utilization: number; resets_at: string | null } | null, isLast: boolean): void {\n const connector = isLast ? \"└─\" : \"├─\";\n if (!entry) {\n console.log(` ${connector} ${name.padEnd(16)} no data`);\n return;\n }\n const bar = createProgressBar(entry.utilization);\n const reset = entry.resets_at\n ? formatResetTime(entry.resets_at)\n : \"\";\n console.log(` ${connector} ${name.padEnd(16)} ${bar}${reset}`);\n}\n\nexport function printQuotaReport(account: ManagedAccount, usage: UsageLimits): void {\n const label = getAccountLabel(account);\n const status = getAccountStatus(account);\n const badge = STATUS_BADGE[status];\n const planLabel = getPlanLabel(account) || \"Free\";\n\n console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);\n console.log(` ${label} ${badge}`);\n console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);\n if (account.email) {\n console.log(` 📧 ${account.email}`);\n }\n console.log(` 📋 ${planLabel}`);\n\n console.log(`\\n └─ Claude Quota`);\n printUsageEntry(\"Current session\", usage.five_hour, false);\n printUsageEntry(\"Current week\", usage.seven_day, !usage.seven_day_sonnet);\n if (usage.seven_day_sonnet) {\n printUsageEntry(\"Sonnet only\", usage.seven_day_sonnet, true);\n }\n console.log(\"\");\n}\n\nconst STRATEGY_DESCRIPTIONS: Record<AccountSelectionStrategy, string> = {\n \"sticky\": \"Same account until rate-limited\",\n \"round-robin\": \"Rotate every request\",\n \"hybrid\": \"Score-based (usage + health)\",\n};\n\nexport async function showStrategySelect(current: AccountSelectionStrategy): Promise<AccountSelectionStrategy | null> {\n const strategies: AccountSelectionStrategy[] = [\"sticky\", \"round-robin\", \"hybrid\"];\n\n const items: MenuItem<AccountSelectionStrategy>[] = strategies.map((s) => ({\n label: `${s}${s === current ? \" (current)\" : \"\"}`,\n hint: STRATEGY_DESCRIPTIONS[s],\n value: s,\n }));\n\n return select(items, {\n message: \"Load Balancing Strategy\",\n subtitle: `Current: ${current}`,\n });\n}\n\nexport function printQuotaError(account: ManagedAccount, error: string): void {\n const label = getAccountLabel(account);\n console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);\n console.log(` ${label}`);\n if (account.email) {\n console.log(` 📧 ${account.email}`);\n }\n console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);\n console.log(` ${ANSI.red}Error: ${error}${ANSI.reset}\\n`);\n}\n","import {\n AccountStore as CoreAccountStore,\n type DiskCredentials,\n} from \"opencode-multi-account-core\";\nimport { ACCOUNTS_FILENAME } from \"./constants\";\n\nexport class AccountStore extends CoreAccountStore {\n constructor() {\n super(ACCOUNTS_FILENAME);\n }\n}\n\nexport type { DiskCredentials };\n","import { AccountManager } from \"./account-manager\";\nimport { CLAUDE_CLI_USER_AGENT } from \"./constants\";\nimport { fetchProfile, fetchUsage } from \"./usage\";\nimport { isTokenExpired } from \"./token\";\nimport { getConfig, updateConfigField } from \"./config\";\nimport { isTTY } from \"./ui/ansi\";\nimport { showAuthMenu, showManageAccounts, showStrategySelect, printQuotaReport, printQuotaError } from \"./ui/auth-menu\";\nimport { createMinimalClient, getAccountLabel } from \"./utils\";\nimport { AccountStore } from \"./account-store\";\nimport { loginWithPiAi } from \"./pi-ai-adapter\";\nimport { randomUUID } from \"node:crypto\";\nimport { createInterface } from \"node:readline\";\nimport { exec } from \"node:child_process\";\nimport type { ManagedAccount, OAuthCredentials, PluginClient, StoredAccount } from \"./types\";\n\ntype OAuthCallbackResponse =\n | ({ type: \"success\" } & { refresh: string; access: string; expires: number })\n | { type: \"failed\" };\n\nexport interface OAuthFlowResult {\n url: string;\n instructions: string;\n method: \"auto\";\n callback(code?: string): Promise<OAuthCallbackResponse>;\n _email?: string;\n}\n\ninterface OAuthPromptLike {\n text?: string;\n message?: string;\n label?: string;\n title?: string;\n placeholder?: string;\n}\n\nfunction makeFailedFlowResult(message: string): OAuthFlowResult {\n return {\n url: \"\",\n instructions: message,\n method: \"auto\",\n callback: async () => ({ type: \"failed\" }),\n };\n}\n\nfunction toOAuthCredentials(result: OAuthCallbackResponse & { type: \"success\" }): OAuthCredentials {\n return { type: \"oauth\", refresh: result.refresh, access: result.access, expires: result.expires };\n}\n\nfunction asOAuthCallbackResponse(account: Partial<StoredAccount>): OAuthCallbackResponse {\n if (!account.refreshToken || !account.accessToken || typeof account.expiresAt !== \"number\") {\n return { type: \"failed\" };\n }\n\n return {\n type: \"success\",\n refresh: account.refreshToken,\n access: account.accessToken,\n expires: account.expiresAt,\n };\n}\n\nfunction promptLine(message: string): Promise<string> {\n if (!isTTY()) return Promise.resolve(\"\");\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(message, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nfunction normalizePromptMessage(prompt: OAuthPromptLike): string {\n return (\n prompt.message\n ?? prompt.text\n ?? prompt.label\n ?? prompt.title\n ?? prompt.placeholder\n ?? \"Continue authentication: \"\n );\n}\n\nconst ANTHROPIC_TOKEN_HOST = \"platform.claude.com\";\n\nasync function startPiAiFlow(): Promise<OAuthFlowResult> {\n const originalFetch = globalThis.fetch;\n globalThis.fetch = ((input: RequestInfo | URL, init?: RequestInit) => {\n const url = typeof input === \"string\" ? input : input instanceof URL ? input.href : (input as Request).url;\n if (url.includes(ANTHROPIC_TOKEN_HOST)) {\n const headers = new Headers(init?.headers);\n headers.set(\"user-agent\", CLAUDE_CLI_USER_AGENT);\n return originalFetch(input, { ...init, headers });\n }\n return originalFetch(input, init);\n }) as typeof globalThis.fetch;\n try {\n const completedAccount = await loginWithPiAi({\n onAuth: (info) => {\n if (info.url) {\n openBrowser(info.url);\n }\n\n const instruction = info.instructions ?? \"Complete authorization in your browser.\";\n const urlLine = info.url ? `\\nAuth URL (manual fallback): ${info.url}` : \"\";\n console.log(`\\n${instruction}${urlLine}\\n`);\n },\n onPrompt: async (prompt) => {\n const text = normalizePromptMessage(prompt as OAuthPromptLike);\n return promptLine(text.endsWith(\":\") || text.endsWith(\"?\") ? `${text} ` : `${text}: `);\n },\n });\n\n const completedResult = asOAuthCallbackResponse(completedAccount);\n const accountEmail = completedAccount.email;\n\n return {\n url: \"\",\n instructions: \"\",\n method: \"auto\",\n callback: async () => completedResult,\n _email: accountEmail,\n };\n } catch {\n return makeFailedFlowResult(\"Failed to start OAuth flow\");\n } finally {\n globalThis.fetch = originalFetch;\n }\n}\n\nfunction wrapCallbackWithAccountReplace(\n result: OAuthFlowResult,\n manager: AccountManager,\n targetAccount: ManagedAccount,\n): OAuthFlowResult {\n const originalCallback = result.callback;\n return {\n ...result,\n callback: async function (code?: string) {\n const callbackResult = await originalCallback(code);\n\n if (callbackResult?.type === \"success\" && callbackResult.refresh) {\n if (targetAccount.uuid) {\n await manager.replaceAccountCredentials(targetAccount.uuid, toOAuthCredentials(callbackResult));\n }\n console.log(`\\n✅ ${getAccountLabel(targetAccount)} re-authenticated successfully.\\n`);\n }\n\n return callbackResult;\n },\n };\n}\n\nfunction wrapCallbackWithManagerSync(\n result: OAuthFlowResult & { _email?: string },\n manager: AccountManager | null,\n): OAuthFlowResult {\n const originalCallback = result.callback;\n const email = result._email;\n return {\n ...result,\n callback: async function (code?: string) {\n const callbackResult = await originalCallback(code);\n\n if (callbackResult?.type === \"success\" && callbackResult.refresh) {\n const auth = toOAuthCredentials(callbackResult);\n\n if (manager) {\n const countBefore = manager.getAccounts().length;\n await manager.addAccount(auth, email);\n const countAfter = manager.getAccounts().length;\n const added = countAfter > countBefore;\n console.log(added\n ? `\\n✅ Account added to multi-auth pool (${countAfter} total).\\n`\n : `\\nℹ️ Account already exists in multi-auth pool (${countAfter} total).\\n`);\n } else {\n await persistFallback(auth);\n console.log(\"\\n✅ Account saved.\\n\");\n }\n }\n\n return callbackResult;\n },\n };\n}\n\nfunction promptYesNo(message: string): Promise<boolean> {\n if (!isTTY()) return Promise.resolve(false);\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(message, (answer) => {\n rl.close();\n resolve(answer.trim().toLowerCase() === \"y\");\n });\n });\n}\n\nfunction openBrowser(url: string): void {\n const commands: Record<string, string> = {\n darwin: \"open\",\n win32: \"start\",\n };\n const cmd = commands[process.platform] ?? \"xdg-open\";\n exec(`${cmd} ${JSON.stringify(url)}`);\n}\n\nasync function addMoreAccountsLoop(\n manager: AccountManager,\n): Promise<void> {\n while (true) {\n const currentCount = manager.getAccounts().length;\n const shouldAdd = await promptYesNo(`Add another account? (${currentCount} added) (y/n): `);\n if (!shouldAdd) break;\n\n let flow: OAuthFlowResult;\n try {\n flow = await startPiAiFlow();\n } catch {\n console.log(\"\\n❌ Failed to start OAuth flow.\\n\");\n break;\n }\n\n if (flow.url) {\n openBrowser(flow.url);\n }\n if (flow.instructions) {\n console.log(`\\n${flow.instructions}\\n`);\n }\n\n let callbackResult: OAuthCallbackResponse;\n try {\n callbackResult = await flow.callback();\n } catch {\n console.log(\"\\n❌ Authentication failed.\\n\");\n break;\n }\n\n if (callbackResult?.type !== \"success\" || !(\"refresh\" in callbackResult)) {\n console.log(\"\\n❌ Authentication failed.\\n\");\n break;\n }\n\n const flowEmail = (flow as OAuthFlowResult & { _email?: string })._email;\n const countBefore = manager.getAccounts().length;\n await manager.addAccount(toOAuthCredentials(callbackResult), flowEmail);\n const countAfter = manager.getAccounts().length;\n const added = countAfter > countBefore;\n console.log(added\n ? `\\n✅ Account added to multi-auth pool (${countAfter} total).\\n`\n : `\\nℹ️ Account already exists in multi-auth pool (${countAfter} total).\\n`);\n }\n}\n\nasync function persistFallback(auth: OAuthCredentials): Promise<void> {\n try {\n const store = new AccountStore();\n const now = Date.now();\n const account: StoredAccount = {\n uuid: randomUUID(),\n refreshToken: auth.refresh,\n accessToken: auth.access,\n expiresAt: auth.expires,\n addedAt: now,\n lastUsed: now,\n enabled: true,\n planTier: \"\",\n consecutiveAuthFailures: 0,\n isAuthDisabled: false,\n };\n await store.addAccount(account);\n await store.setActiveUuid(account.uuid);\n } catch {\n // best-effort\n }\n}\n\nexport async function handleAuthorize(\n manager: AccountManager | null,\n inputs?: Record<string, string>,\n client?: PluginClient,\n): Promise<OAuthFlowResult> {\n if (!inputs || !isTTY()) {\n return wrapCallbackWithManagerSync(await startPiAiFlow(), manager);\n }\n\n const effectiveManager = manager ?? await loadManagerFromDisk(client);\n if (!effectiveManager || effectiveManager.getAccounts().length === 0) {\n return wrapCallbackWithManagerSync(await startPiAiFlow(), manager);\n }\n\n return runAccountManagementMenu(effectiveManager, client);\n}\n\nasync function loadManagerFromDisk(client?: PluginClient): Promise<AccountManager | null> {\n const store = new AccountStore();\n const stored = await store.load();\n if (stored.accounts.length === 0) return null;\n const emptyAuth: OAuthCredentials = { type: \"oauth\", refresh: \"\", access: \"\", expires: 0 };\n const mgr = await AccountManager.create(store, emptyAuth, client);\n return mgr;\n}\n\nasync function runAccountManagementMenu(\n manager: AccountManager,\n client?: PluginClient,\n): Promise<OAuthFlowResult> {\n while (true) {\n const allAccounts = manager.getAccounts();\n const menuAction = await showAuthMenu(allAccounts);\n\n switch (menuAction.type) {\n case \"add\":\n return wrapCallbackWithManagerSync(await startPiAiFlow(), manager);\n\n case \"check-quotas\":\n await handleCheckQuotas(manager, client);\n continue;\n\n case \"manage\": {\n const result = await showManageAccounts(allAccounts);\n if (result.action === \"back\" || result.action === \"cancel\") continue;\n const manageResult = await handleManageAction(manager, result.action, result.account, client);\n if (manageResult.triggerOAuth) {\n return wrapCallbackWithAccountReplace(await startPiAiFlow(), manager, manageResult.account);\n }\n continue;\n }\n\n case \"load-balancing\":\n await handleLoadBalancing();\n continue;\n\n case \"delete-all\":\n await manager.clearAllAccounts();\n console.log(\"\\nAll accounts deleted.\\n\");\n return wrapCallbackWithManagerSync(await startPiAiFlow(), manager);\n\n case \"cancel\":\n return makeFailedFlowResult(\"Authentication cancelled\");\n }\n }\n}\n\nasync function handleCheckQuotas(manager: AccountManager, client?: PluginClient): Promise<void> {\n await manager.refresh();\n const accounts = manager.getAccounts();\n const effectiveClient = client ?? createMinimalClient();\n if (client) manager.setClient(client);\n console.log(`\\n📊 Checking quotas for ${accounts.length} account(s)...\\n`);\n\n for (const account of accounts) {\n await checkAccountQuota(manager, account, effectiveClient);\n }\n}\n\nasync function checkAccountQuota(\n manager: AccountManager,\n account: ManagedAccount,\n client: PluginClient,\n): Promise<void> {\n if (account.isAuthDisabled || !account.accessToken || isTokenExpired(account)) {\n if (!account.uuid) {\n printQuotaError(account, \"Missing account UUID\");\n return;\n }\n\n const refreshResult = await manager.ensureValidToken(account.uuid, client);\n if (!refreshResult.ok) {\n await manager.markAuthFailure(account.uuid, refreshResult);\n await manager.refresh();\n\n const updatedAccount = manager.getAccounts().find((candidate) => candidate.uuid === account.uuid);\n if (!updatedAccount) {\n printQuotaError(account, refreshResult.permanent\n ? \"Refresh failed permanently; account removed\"\n : \"Failed to refresh token\");\n return;\n }\n\n printQuotaError(updatedAccount, updatedAccount.isAuthDisabled\n ? `${updatedAccount.authDisabledReason ?? \"Auth disabled\"} (refresh failed)`\n : \"Failed to refresh token\");\n return;\n }\n\n await manager.refresh();\n }\n\n const freshAccounts = manager.getAccounts();\n const freshAccount = freshAccounts.find((candidate) => candidate.uuid === account.uuid);\n\n if (!freshAccount?.accessToken) {\n printQuotaError(account, \"No access token available\");\n return;\n }\n\n const usageResult = await fetchUsage(freshAccount.accessToken);\n if (!usageResult.ok) {\n printQuotaError(freshAccount, `Failed to fetch usage: ${usageResult.reason}`);\n return;\n }\n\n if (freshAccount.uuid) {\n await manager.applyUsageCache(freshAccount.uuid, usageResult.data);\n }\n\n let reportAccount = freshAccount;\n const profileResult = await fetchProfile(freshAccount.accessToken);\n if (profileResult.ok) {\n if (freshAccount.uuid) {\n await manager.applyProfileCache(freshAccount.uuid, profileResult.data);\n }\n reportAccount = {\n ...freshAccount,\n email: profileResult.data.email ?? freshAccount.email,\n planTier: profileResult.data.planTier,\n };\n }\n\n printQuotaReport(reportAccount, usageResult.data);\n}\n\nasync function handleLoadBalancing(): Promise<void> {\n const current = getConfig().account_selection_strategy;\n const selected = await showStrategySelect(current);\n\n if (!selected || selected === current) return;\n\n await updateConfigField(\"account_selection_strategy\", selected);\n console.log(`\\nLoad balancing strategy changed: ${current} → ${selected}\\n`);\n}\n\ntype ManageActionResult =\n | { triggerOAuth: false }\n | { triggerOAuth: true; account: ManagedAccount };\n\nasync function handleManageAction(\n manager: AccountManager,\n action: string,\n account?: ManagedAccount,\n client?: PluginClient,\n): Promise<ManageActionResult> {\n if (!account) return { triggerOAuth: false };\n\n const label = getAccountLabel(account);\n\n switch (action) {\n case \"toggle\":\n if (!account.uuid) break;\n await manager.toggleEnabled(account.uuid);\n await manager.refresh();\n {\n const updated = manager.getAccounts().find((candidate) => candidate.uuid === account.uuid);\n console.log(`\\n${label} ${updated?.enabled ? \"enabled\" : \"disabled\"}.\\n`);\n }\n break;\n\n case \"delete\":\n if (!account.uuid) break;\n {\n const removed = await manager.removeAccount(account.index);\n console.log(removed ? \"\\nAccount deleted.\\n\" : \"\\nFailed to delete account.\\n\");\n }\n break;\n\n case \"retry-auth\": {\n if (!account.uuid) break;\n const effectiveClient = client ?? createMinimalClient();\n console.log(`\\nRetrying authentication for ${label}...\\n`);\n const result = await manager.retryAuth(account.uuid, effectiveClient);\n\n if (result.ok) {\n console.log(`✅ ${label} re-authenticated successfully.\\n`);\n } else {\n console.log(\"Token refresh failed — starting OAuth flow...\\n\");\n return { triggerOAuth: true, account };\n }\n break;\n }\n }\n\n return { triggerOAuth: false };\n}\n","import { createHash } from \"node:crypto\";\nimport {\n ANTHROPIC_OAUTH_ADAPTER,\n TOOL_PREFIX,\n} from \"./constants\";\nimport { getModelBetas } from \"./betas\";\nimport { getUserAgent } from \"./model-config\";\nimport { INJECTED_SYSTEM_PROMPT, SYSTEM_PROMPT } from \"./anthropic-prompt\";\n\nexport function getSystemPrompt(): string {\n return SYSTEM_PROMPT;\n}\n\nexport function getInjectedSystemPrompt(): string {\n return INJECTED_SYSTEM_PROMPT;\n}\n\nfunction sampleCodeUnits(text: string, indices: number[]): string {\n return indices\n .map((i) => (i < text.length ? text.charCodeAt(i).toString(16) : \"30\"))\n .join(\"\");\n}\n\nexport function buildBillingHeader(firstUserMessage: string): string {\n const version = ANTHROPIC_OAUTH_ADAPTER.cliVersion;\n const salt = ANTHROPIC_OAUTH_ADAPTER.billingSalt;\n if (!version || !salt) return \"\";\n\n const sampled = sampleCodeUnits(firstUserMessage, [4, 7, 20]);\n const hash = createHash(\"sha256\")\n .update(`${salt}${sampled}${version}`)\n .digest(\"hex\")\n .slice(0, 3);\n return `x-anthropic-billing-header: cc_version=${version}.${hash}; cc_entrypoint=cli; cch=00000;`;\n}\n\nconst OPENCODE_CAMEL_RE = /OpenCode/g;\nconst OPENCODE_LOWER_RE = /(?<!\\/)opencode/gi;\nconst TOOL_PREFIX_RESPONSE_RE = /\"name\"\\s*:\\s*\"mcp_([^\"]+)\"/g;\nconst PARAGRAPH_REMOVAL_ANCHORS = [\n \"github.com/anomalyco/opencode\",\n \"opencode.ai/docs\",\n] as const;\nconst BILLING_HEADER_PREFIX = \"x-anthropic-billing-header:\";\n\ntype TextContentBlock = { type: string; text?: string; [key: string]: unknown };\ntype SystemTextEntry = { type: string; text?: string; [key: string]: unknown };\ntype ToolEntry = { name?: string };\ntype MessageContentBlock = { type: string; name?: string; text?: string; [key: string]: unknown };\ntype MessageEntry = {\n role?: string;\n content?: string | MessageContentBlock[];\n [key: string]: unknown;\n};\ntype RequestPayload = {\n system?: unknown;\n tools?: ToolEntry[];\n messages?: MessageEntry[];\n};\n\ntype NormalizedSystemEntry = SystemTextEntry & { type: \"text\"; text: string };\n\nfunction addToolPrefix(name: string | undefined): string | undefined {\n if (!ANTHROPIC_OAUTH_ADAPTER.transform.addToolPrefix) {\n return name;\n }\n\n if (!name || name.startsWith(TOOL_PREFIX)) {\n return name;\n }\n\n return `${TOOL_PREFIX}${name}`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isProtectedSystemText(text: string): boolean {\n return text === SYSTEM_PROMPT\n || text === INJECTED_SYSTEM_PROMPT\n || text.startsWith(BILLING_HEADER_PREFIX);\n}\n\nfunction sanitizeSystemText(text: string): string {\n const paragraphs = text\n .split(/\\n\\n+/)\n .map((paragraph) => paragraph.trim())\n .filter(Boolean)\n .filter((paragraph) => !PARAGRAPH_REMOVAL_ANCHORS.some((anchor) => paragraph.includes(anchor)));\n\n return paragraphs\n .join(\"\\n\\n\")\n .replace(OPENCODE_CAMEL_RE, \"Claude Code\")\n .replace(OPENCODE_LOWER_RE, \"Claude\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n}\n\nfunction normalizeSystemEntries(system: unknown): NormalizedSystemEntry[] {\n if (typeof system === \"string\") {\n const text = system.trim();\n return text ? [{ type: \"text\", text }] : [];\n }\n\n if (!Array.isArray(system)) {\n return [];\n }\n\n const normalized: NormalizedSystemEntry[] = [];\n for (const entry of system) {\n if (typeof entry === \"string\") {\n const text = entry.trim();\n if (text) {\n normalized.push({ type: \"text\", text });\n }\n continue;\n }\n\n if (!isRecord(entry)) {\n continue;\n }\n\n const rawText = typeof entry.text === \"string\" ? entry.text.trim() : \"\";\n if (!rawText) {\n continue;\n }\n\n normalized.push({\n ...entry,\n type: \"text\",\n text: rawText,\n });\n }\n\n return normalized;\n}\n\nfunction prependToMessageContent(\n content: MessageEntry[\"content\"],\n prefix: string,\n): MessageEntry[\"content\"] {\n if (!prefix) {\n return content;\n }\n\n if (typeof content === \"string\") {\n return content ? `${prefix}\\n\\n${content}` : prefix;\n }\n\n if (!Array.isArray(content)) {\n return [{ type: \"text\", text: prefix }];\n }\n\n const firstTextIndex = content.findIndex(\n (block) => isRecord(block) && block.type === \"text\" && typeof block.text === \"string\",\n );\n\n if (firstTextIndex === -1) {\n return [{ type: \"text\", text: prefix }, ...content];\n }\n\n return content.map((block, index) => {\n if (index !== firstTextIndex || !isRecord(block) || typeof block.text !== \"string\") {\n return block;\n }\n\n return {\n ...block,\n text: block.text ? `${prefix}\\n\\n${block.text}` : prefix,\n } satisfies TextContentBlock;\n });\n}\n\nfunction relocateSystemTextToFirstUser(parsed: RequestPayload, systemEntries: NormalizedSystemEntry[]): NormalizedSystemEntry[] {\n if (!Array.isArray(parsed.messages) || parsed.messages.length === 0) {\n return systemEntries.map((entry) => (\n isProtectedSystemText(entry.text)\n ? entry\n : { ...entry, text: sanitizeSystemText(entry.text) }\n )).filter((entry) => entry.text);\n }\n\n const preservedEntries: NormalizedSystemEntry[] = [];\n const relocatedTexts: string[] = [];\n\n for (const entry of systemEntries) {\n if (isProtectedSystemText(entry.text)) {\n preservedEntries.push(entry);\n continue;\n }\n\n const sanitizedText = sanitizeSystemText(entry.text);\n if (!sanitizedText) {\n continue;\n }\n\n relocatedTexts.push(sanitizedText);\n }\n\n if (relocatedTexts.length === 0) {\n return systemEntries.map((entry) => (\n isProtectedSystemText(entry.text)\n ? entry\n : { ...entry, text: sanitizeSystemText(entry.text) }\n )).filter((entry) => entry.text);\n }\n\n const prefix = relocatedTexts.join(\"\\n\\n\");\n const nextMessages = [...parsed.messages];\n const userMessageIndex = nextMessages.findIndex((message) => message.role === \"user\");\n\n if (userMessageIndex === -1) {\n return systemEntries.map((entry) => (\n isProtectedSystemText(entry.text)\n ? entry\n : { ...entry, text: sanitizeSystemText(entry.text) }\n )).filter((entry) => entry.text);\n }\n\n const userMessage = nextMessages[userMessageIndex];\n if (!userMessage) {\n return systemEntries.map((entry) => (\n isProtectedSystemText(entry.text)\n ? entry\n : { ...entry, text: sanitizeSystemText(entry.text) }\n )).filter((entry) => entry.text);\n }\n\n nextMessages[userMessageIndex] = {\n ...userMessage,\n content: prependToMessageContent(userMessage.content, prefix),\n };\n parsed.messages = nextMessages;\n\n return preservedEntries;\n}\n\nfunction stripToolPrefixFromLine(line: string): string {\n if (!ANTHROPIC_OAUTH_ADAPTER.transform.stripToolPrefixInResponse) {\n return line;\n }\n\n return line.replace(TOOL_PREFIX_RESPONSE_RE, '\"name\": \"$1\"');\n}\n\nfunction processCompleteLines(buffer: string): { output: string; remaining: string } {\n const lines = buffer.split(\"\\n\");\n const remaining = lines.pop() ?? \"\";\n\n if (lines.length === 0) {\n return { output: \"\", remaining };\n }\n\n const output = `${lines.map(stripToolPrefixFromLine).join(\"\\n\")}\\n`;\n return { output, remaining };\n}\n\nexport function buildRequestHeaders(\n input: RequestInfo | URL,\n init: RequestInit | undefined,\n accessToken: string,\n modelId = \"unknown\",\n excludedBetas?: Set<string>,\n): Headers {\n const headers = new Headers();\n\n if (input instanceof Request) {\n input.headers.forEach((value, key) => { headers.set(key, value); });\n }\n\n if (init?.headers) {\n if (init.headers instanceof Headers) {\n init.headers.forEach((value, key) => { headers.set(key, value); });\n } else if (Array.isArray(init.headers)) {\n for (const [key, value] of init.headers) {\n if (value !== undefined) headers.set(key, String(value));\n }\n } else {\n for (const [key, value] of Object.entries(init.headers)) {\n if (value !== undefined) headers.set(key, String(value));\n }\n }\n }\n\n const incomingBetas = (headers.get(\"anthropic-beta\") || \"\")\n .split(\",\")\n .map((b) => b.trim())\n .filter(Boolean);\n\n const modelBetas = getModelBetas(modelId, excludedBetas);\n const mergedBetas = [...new Set([\n ...modelBetas,\n ...incomingBetas,\n ])].join(\",\");\n\n headers.set(\"authorization\", `Bearer ${accessToken}`);\n headers.set(\"anthropic-beta\", mergedBetas);\n headers.set(\"user-agent\", getUserAgent());\n headers.set(\"anthropic-dangerous-direct-browser-access\", \"true\");\n headers.set(\"x-app\", \"cli\");\n headers.delete(\"x-api-key\");\n\n return headers;\n}\n\nexport function transformRequestBody(body: string | undefined): string | undefined {\n if (!body) return body;\n\n try {\n const parsed: RequestPayload = JSON.parse(body);\n\n if (ANTHROPIC_OAUTH_ADAPTER.transform.rewriteOpenCodeBranding) {\n const normalizedSystemEntries = normalizeSystemEntries(parsed.system);\n parsed.system = relocateSystemTextToFirstUser(parsed, normalizedSystemEntries);\n }\n\n if (parsed.tools && Array.isArray(parsed.tools)) {\n parsed.tools = parsed.tools.map((tool) => ({\n ...tool,\n name: addToolPrefix(tool.name),\n }));\n }\n\n if (parsed.messages && Array.isArray(parsed.messages)) {\n parsed.messages = parsed.messages.map((message) => {\n if (message.content && Array.isArray(message.content)) {\n message.content = message.content.map((contentBlock) => {\n if (contentBlock.type === \"tool_use\" && contentBlock.name) {\n return { ...contentBlock, name: addToolPrefix(contentBlock.name) };\n }\n return contentBlock;\n });\n }\n return message;\n });\n }\n\n return JSON.stringify(parsed);\n } catch {\n return body;\n }\n}\n\nexport function extractModelIdFromBody(body: BodyInit | null | undefined): string {\n if (typeof body !== \"string\") {\n return \"unknown\";\n }\n\n try {\n const parsed = JSON.parse(body) as { model?: string };\n return parsed.model ?? \"unknown\";\n } catch {\n return \"unknown\";\n }\n}\n\nexport function transformRequestUrl(input: RequestInfo | URL): RequestInfo | URL {\n let url: URL | null = null;\n try {\n if (typeof input === \"string\" || input instanceof URL) {\n url = new URL(input.toString());\n } else if (input instanceof Request) {\n url = new URL(input.url);\n }\n } catch {\n return input;\n }\n\n if (\n ANTHROPIC_OAUTH_ADAPTER.transform.enableMessagesBetaQuery\n && url\n && url.pathname === \"/v1/messages\"\n && !url.searchParams.has(\"beta\")\n ) {\n url.searchParams.set(\"beta\", \"true\");\n return input instanceof Request ? new Request(url.toString(), input) : url;\n }\n\n return input;\n}\n\nexport function createResponseStreamTransform(response: Response): Response {\n if (!response.body) return response;\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n const encoder = new TextEncoder();\n let buffer = \"\";\n\n const stream = new ReadableStream({\n async pull(controller) {\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n buffer += decoder.decode();\n if (buffer) {\n controller.enqueue(encoder.encode(stripToolPrefixFromLine(buffer)));\n buffer = \"\";\n }\n controller.close();\n return;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const { output, remaining } = processCompleteLines(buffer);\n buffer = remaining;\n\n if (output) {\n controller.enqueue(encoder.encode(output));\n return;\n }\n }\n } catch (error) {\n try { reader.cancel().catch(() => {}); } catch {}\n controller.error(error);\n }\n },\n async cancel(reason) {\n await reader.cancel(reason);\n },\n });\n\n return new Response(stream, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n });\n}\n","import { ANTHROPIC_OAUTH_ADAPTER } from \"./constants\";\n\nexport interface ModelOverride {\n exclude?: string[];\n add?: string[];\n}\n\nexport interface ModelConfig {\n ccVersion: string;\n baseBetas: string[];\n longContextBetas: string[];\n modelOverrides: Record<string, ModelOverride>;\n}\n\nfunction splitBetaFlags(value: string): string[] {\n return value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean);\n}\n\nexport const config: ModelConfig = {\n ccVersion: ANTHROPIC_OAUTH_ADAPTER.cliVersion,\n baseBetas: splitBetaFlags(ANTHROPIC_OAUTH_ADAPTER.requestBetaHeader),\n longContextBetas: [\"context-1m-2025-08-07\", \"interleaved-thinking-2025-05-14\"],\n modelOverrides: {\n \"4-6\": {\n add: [\"effort-2025-11-24\"],\n },\n },\n};\n\nexport function getCliVersion(): string {\n return process.env.ANTHROPIC_CLI_VERSION ?? config.ccVersion;\n}\n\nexport function getUserAgent(): string {\n if (process.env.ANTHROPIC_USER_AGENT) {\n return process.env.ANTHROPIC_USER_AGENT;\n }\n\n if (process.env.ANTHROPIC_CLI_VERSION) {\n return `claude-cli/${getCliVersion()} (external, cli)`;\n }\n\n return ANTHROPIC_OAUTH_ADAPTER.cliUserAgent;\n}\n\nexport function getRequiredBetas(): string[] {\n return splitBetaFlags(process.env.ANTHROPIC_BETA_FLAGS ?? config.baseBetas.join(\",\"));\n}\n\nexport function getModelOverride(modelId: string): ModelOverride | null {\n const lowerModelId = modelId.toLowerCase();\n for (const [pattern, override] of Object.entries(config.modelOverrides)) {\n if (lowerModelId.includes(pattern)) {\n return override;\n }\n }\n\n return null;\n}\n","import { config, getModelOverride, getRequiredBetas } from \"./model-config\";\n\nexport const LONG_CONTEXT_BETAS = config.longContextBetas;\n\nconst excludedBetas = new Map<string, Set<string>>();\n\nlet lastBetaFlagsEnv = process.env.ANTHROPIC_BETA_FLAGS;\nlet lastModelId: string | undefined;\n\nexport function getExcludedBetas(modelId: string): Set<string> {\n const currentBetaFlags = process.env.ANTHROPIC_BETA_FLAGS;\n if (currentBetaFlags !== lastBetaFlagsEnv) {\n excludedBetas.clear();\n lastBetaFlagsEnv = currentBetaFlags;\n }\n\n if (lastModelId !== undefined && lastModelId !== modelId) {\n excludedBetas.clear();\n }\n lastModelId = modelId;\n\n return excludedBetas.get(modelId) ?? new Set();\n}\n\nexport function addExcludedBeta(modelId: string, beta: string): void {\n const nextExcludedBetas = excludedBetas.get(modelId) ?? new Set<string>();\n nextExcludedBetas.add(beta);\n excludedBetas.set(modelId, nextExcludedBetas);\n}\n\nexport function resetExcludedBetas(): void {\n excludedBetas.clear();\n lastModelId = undefined;\n lastBetaFlagsEnv = process.env.ANTHROPIC_BETA_FLAGS;\n}\n\nexport function isLongContextError(responseBody: string): boolean {\n return responseBody.includes(\"Extra usage is required for long context requests\")\n || responseBody.includes(\"long context beta is not yet available\");\n}\n\nexport function getNextBetaToExclude(modelId: string): string | null {\n const excluded = getExcludedBetas(modelId);\n for (const beta of LONG_CONTEXT_BETAS) {\n if (!excluded.has(beta)) {\n return beta;\n }\n }\n\n return null;\n}\n\nexport function supports1mContext(modelId: string): boolean {\n const lowerModelId = modelId.toLowerCase();\n if (!lowerModelId.includes(\"opus\") && !lowerModelId.includes(\"sonnet\")) {\n return false;\n }\n\n const versionMatch = lowerModelId.match(/(opus|sonnet)-(\\d+)-(\\d+)/);\n if (!versionMatch) {\n return false;\n }\n\n const major = Number.parseInt(versionMatch[2] ?? \"0\", 10);\n const minor = Number.parseInt(versionMatch[3] ?? \"0\", 10);\n const effectiveMinor = minor > 99 ? 0 : minor;\n return major > 4 || (major === 4 && effectiveMinor >= 6);\n}\n\nexport function getModelBetas(modelId: string, excluded?: Set<string>): string[] {\n const betas = [...getRequiredBetas()];\n const longContextBeta = config.longContextBetas[0];\n\n if (\n longContextBeta\n && process.env.ANTHROPIC_ENABLE_1M_CONTEXT === \"true\"\n && supports1mContext(modelId)\n ) {\n betas.push(longContextBeta);\n }\n\n const override = getModelOverride(modelId);\n if (override?.exclude) {\n for (const excludedBeta of override.exclude) {\n const index = betas.indexOf(excludedBeta);\n if (index !== -1) {\n betas.splice(index, 1);\n }\n }\n }\n\n if (override?.add) {\n for (const addedBeta of override.add) {\n if (!betas.includes(addedBeta)) {\n betas.push(addedBeta);\n }\n }\n }\n\n if (!excluded || excluded.size === 0) {\n return betas;\n }\n\n return betas.filter((beta) => !excluded.has(beta));\n}\n","// Anthropic system prompt embedded from griffinmartin/opencode-claude-auth\n// Source: https://github.com/griffinmartin/opencode-claude-auth/blob/main/src/anthropic-prompt.txt\nexport const INJECTED_SYSTEM_PROMPT = \"You are Claude Code, an interactive CLI tool that helps users with software engineering tasks.\";\n\nexport const SYSTEM_PROMPT = `You are an interactive CLI tool that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user.\n\nIMPORTANT: Assist with defensive security tasks only. Refuse to create, modify, or improve code that may be used maliciously. Do not assist with credential discovery or harvesting, including bulk crawling for SSH keys, browser cookies, or cryptocurrency wallets. Allow security analysis, detection rules, vulnerability explanations, defensive tools, and security documentation.\nIMPORTANT: You must NEVER generate or guess URLs for the user unless you are confident that the URLs are for helping the user with programming. You may use URLs provided by the user in their messages or local files.\n\nIf the user asks for help or wants to give feedback inform them of the following: \n- /help: Get help with using Claude Code\n- To give feedback, users should report the issue at https://github.com/anthropics/claude-code/issues\n\nWhen the user directly asks about Claude Code (eg. \"can Claude Code do...\", \"does Claude Code have...\"), or asks in second person (eg. \"are you able...\", \"can you do...\"), or asks how to use a specific Claude Code feature (eg. implement a hook, or write a slash command), use the WebFetch tool to gather information to answer the question from Claude Code docs. The list of available docs is available at https://docs.claude.com/en/docs/claude-code/claude_code_docs_map.md.\n\n# Tone and style\nYou should be concise, direct, and to the point, while providing complete information and matching the level of detail you provide in your response with the level of complexity of the user's query or the work you have completed. \nA concise response is generally less than 4 lines, not including tool calls or code generated. You should provide more detail when the task is complex or when the user asks you to.\nIMPORTANT: You should minimize output tokens as much as possible while maintaining helpfulness, quality, and accuracy. Only address the specific task at hand, avoiding tangential information unless absolutely critical for completing the request. If you can answer in 1-3 sentences or a short paragraph, please do.\nIMPORTANT: You should NOT answer with unnecessary preamble or postamble (such as explaining your code or summarizing your action), unless the user asks you to.\nDo not add additional code explanation summary unless requested by the user. After working on a file, briefly confirm that you have completed the task, rather than providing an explanation of what you did.\nAnswer the user's question directly, avoiding any elaboration, explanation, introduction, conclusion, or excessive details. Brief answers are best, but be sure to provide complete information. You MUST avoid extra preamble before/after your response, such as \"The answer is <answer>.\", \"Here is the content of the file...\" or \"Based on the information provided, the answer is...\" or \"Here is what I will do next...\".\n\nHere are some examples to demonstrate appropriate verbosity:\n<example>\nuser: 2 + 2\nassistant: 4\n</example>\n\n<example>\nuser: what is 2+2?\nassistant: 4\n</example>\n\n<example>\nuser: is 11 a prime number?\nassistant: Yes\n</example>\n\n<example>\nuser: what command should I run to list files in the current directory?\nassistant: ls\n</example>\n\n<example>\nuser: what command should I run to watch files in the current directory?\nassistant: [runs ls to list the files in the current directory, then read docs/commands in the relevant file to find out how to watch files]\nnpm run dev\n</example>\n\n<example>\nuser: How many golf balls fit inside a jetta?\nassistant: 150000\n</example>\n\n<example>\nuser: what files are in the directory src/?\nassistant: [runs ls and sees foo.c, bar.c, baz.c]\nuser: which file contains the implementation of foo?\nassistant: src/foo.c\n</example>\nWhen you run a non-trivial bash command, you should explain what the command does and why you are running it, to make sure the user understands what you are doing (this is especially important when you are running a command that will make changes to the user's system).\nRemember that your output will be displayed on a command line interface. Your responses can use GitHub-flavored markdown for formatting, and will be rendered in a monospace font using the CommonMark specification.\nOutput text to communicate with the user; all text you output outside of tool use is displayed to the user. Only use tools to complete tasks. Never use tools like Bash or code comments as means to communicate with the user during the session.\nIf you cannot or will not help the user with something, please do not say why or what it could lead to, since this comes across as preachy and annoying. Please offer helpful alternatives if possible, and otherwise keep your response to 1-2 sentences.\nOnly use emojis if the user explicitly requests it. Avoid using emojis in all communication unless asked.\nIMPORTANT: Keep your responses short, since they will be displayed on a command line interface.\n\n# Proactiveness\nYou are allowed to be proactive, but only when the user asks you to do something. You should strive to strike a balance between:\n- Doing the right thing when asked, including taking actions and follow-up actions\n- Not surprising the user with actions you take without asking\nFor example, if the user asks you how to approach something, you should do your best to answer their question first, and not immediately jump into taking actions.\n\n# Professional objectivity\nPrioritize technical accuracy and truthfulness over validating the user's beliefs. Focus on facts and problem-solving, providing direct, objective technical info without any unnecessary superlatives, praise, or emotional validation. It is best for the user if Claude honestly applies the same rigorous standards to all ideas and disagrees when necessary, even if it may not be what the user wants to hear. Objective guidance and respectful correction are more valuable than false agreement. Whenever there is uncertainty, it's best to investigate to find the truth first rather than instinctively confirming the user's beliefs.\n\n# Task Management\nYou have access to the TodoWrite tools to help you manage and plan tasks. Use these tools VERY frequently to ensure that you are tracking your tasks and giving the user visibility into your progress.\nThese tools are also EXTREMELY helpful for planning tasks, and for breaking down larger complex tasks into smaller steps. If you do not use this tool when planning, you may forget to do important tasks - and that is unacceptable.\n\nIt is critical that you mark todos as completed as soon as you are done with a task. Do not batch up multiple tasks before marking them as completed.\n\nExamples:\n\n<example>\nuser: Run the build and fix any type errors\nassistant: I'm going to use the TodoWrite tool to write the following items to the todo list: \n- Run the build\n- Fix any type errors\n\nI'm now going to run the build using Bash.\n\nLooks like I found 10 type errors. I'm going to use the TodoWrite tool to write 10 items to the todo list.\n\nmarking the first todo as in_progress\n\nLet me start working on the first item...\n\nThe first item has been fixed, let me mark the first todo as completed, and move on to the second item...\n..\n..\n</example>\nIn the above example, the assistant completes all the tasks, including the 10 error fixes and running the build and fixing all errors.\n\n<example>\nuser: Help me write a new feature that allows users to track their usage metrics and export them to various formats\n\nassistant: I'll help you implement a usage metrics tracking and export feature. Let me first use the TodoWrite tool to plan this task.\nAdding the following todos to the todo list:\n1. Research existing metrics tracking in the codebase\n2. Design the metrics collection system\n3. Implement core metrics tracking functionality\n4. Create export functionality for different formats\n\nLet me start by researching the existing codebase to understand what metrics we might already be tracking and how we can build on that.\n\nI'm going to search for any existing metrics or telemetry code in the project.\n\nI've found some existing telemetry code. Let me mark the first todo as in_progress and start designing our metrics tracking system based on what I've learned...\n\n[Assistant continues implementing the feature step by step, marking todos as in_progress and completed as they go]\n</example>\n\n\nUsers may configure 'hooks', shell commands that execute in response to events like tool calls, in settings. Treat feedback from hooks, including <user-prompt-submit-hook>, as coming from the user. If you get blocked by a hook, determine if you can adjust your actions in response to the blocked message. If not, ask the user to check their hooks configuration.\n\n# Doing tasks\nThe user will primarily request you perform software engineering tasks. This includes solving bugs, adding new functionality, refactoring code, explaining code, and more. For these tasks the following steps are recommended:\n- Use the TodoWrite tool to plan the task if required\n\n- Tool results and user messages may include <system-reminder> tags. <system-reminder> tags contain useful information and reminders. They are automatically added by the system, and bear no direct relation to the specific tool results or user messages in which they appear.\n\n\n# Tool usage policy\n- When doing file search, prefer to use the Task tool in order to reduce context usage.\n- You should proactively use the Task tool with specialized agents when the task at hand matches the agent's description.\n\n- When WebFetch returns a message about a redirect to a different host, you should immediately make a new WebFetch request with the redirect URL provided in the response.\n- You have the capability to call multiple tools in a single response. When multiple independent pieces of information are requested, batch your tool calls together for optimal performance. When making multiple bash tool calls, you MUST send a single message with multiple tools calls to run the calls in parallel. For example, if you need to run \"git status\" and \"git diff\", send a single message with two tool calls to run the calls in parallel.\n- If the user specifies that they want you to run tools \"in parallel\", you MUST send a single message with multiple tool use content blocks. For example, if you need to launch multiple agents in parallel, send a single message with multiple Task tool calls.\n- Use specialized tools instead of bash commands when possible, as this provides a better user experience. For file operations, use dedicated tools: Read for reading files instead of cat/head/tail, Edit for editing instead of sed/awk, and Write for creating files instead of cat with heredoc or echo redirection. Reserve bash tools exclusively for actual system commands and terminal operations that require shell execution. NEVER use bash echo or other command-line tools to communicate thoughts, explanations, or instructions to the user. Output all communication directly in your response text instead.\n\n\nHere is useful information about the environment you are running in:\n<env>\nWorking directory: /home/thdxr/dev/projects/anomalyco/opencode/packages/opencode\nIs directory a git repo: Yes\nPlatform: linux\nOS Version: Linux 6.12.4-arch1-1\nToday's date: 2025-09-30\n</env>\nYou are powered by the model named Sonnet 4.5. The exact model ID is claude-sonnet-4-5-20250929.\n\nAssistant knowledge cutoff is January 2025.\n\n\nIMPORTANT: Assist with defensive security tasks only. Refuse to create, modify, or improve code that may be used maliciously. Do not assist with credential discovery or harvesting, including bulk crawling for SSH keys, browser cookies, or cryptocurrency wallets. Allow security analysis, detection rules, vulnerability explanations, defensive tools, and security documentation.\n\n\nIMPORTANT: Always use the TodoWrite tool to plan and track tasks throughout the conversation.\n\n# Code References\n\nWhen referencing specific functions or pieces of code include the pattern \\`file_path:line_number\\` to allow the user to easily navigate to the source code location.\n\n<example>\nuser: Where are errors from the client handled?\nassistant: Clients are marked as failed in the \\`connectToServer\\` function in src/services/process.ts:712.\n</example>`;\n","import { createProactiveRefreshQueueForProvider } from \"opencode-multi-account-core\";\nimport { getConfig } from \"./config\";\nimport { isTokenExpired, refreshToken } from \"./token\";\nimport { debugLog } from \"./utils\";\n\nexport const ProactiveRefreshQueue = createProactiveRefreshQueueForProvider({\n providerAuthId: \"anthropic\",\n getConfig,\n isTokenExpired,\n refreshToken,\n debugLog,\n});\n\nexport type ProactiveRefreshQueue = InstanceType<typeof ProactiveRefreshQueue>;\n","import { AccountStore } from \"./account-store\";\nimport { ANTHROPIC_OAUTH_ADAPTER } from \"./constants\";\nimport { isTokenExpired, refreshToken } from \"./token\";\nimport { TokenRefreshError } from \"opencode-multi-account-core\";\nimport {\n extractModelIdFromBody,\n buildRequestHeaders,\n createResponseStreamTransform,\n transformRequestBody,\n transformRequestUrl,\n} from \"./request-transform\";\nimport {\n addExcludedBeta,\n getExcludedBetas,\n getNextBetaToExclude,\n isLongContextError,\n LONG_CONTEXT_BETAS,\n} from \"./betas\";\nimport type { PluginClient, StoredAccount } from \"./types\";\nimport { debugLog } from \"./utils\";\n\ntype BaseFetch = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;\n\ninterface AccountRuntime {\n fetch: BaseFetch;\n}\n\nconst TOKEN_REFRESH_PERMANENT_FAILURE_STATUS = 401;\n\nexport class AccountRuntimeFactory {\n private runtimes = new Map<string, AccountRuntime>();\n private initLocks = new Map<string, Promise<AccountRuntime>>();\n\n constructor(\n private readonly store: AccountStore,\n private readonly client: PluginClient,\n ) {}\n\n async getRuntime(uuid: string): Promise<AccountRuntime> {\n const cached = this.runtimes.get(uuid);\n if (cached) return cached;\n\n const existing = this.initLocks.get(uuid);\n if (existing) return existing;\n\n const initPromise = this.createRuntime(uuid);\n this.initLocks.set(uuid, initPromise);\n\n try {\n const runtime = await initPromise;\n this.runtimes.set(uuid, runtime);\n return runtime;\n } finally {\n this.initLocks.delete(uuid);\n }\n }\n\n invalidate(uuid: string): void {\n this.runtimes.delete(uuid);\n }\n\n invalidateAll(): void {\n this.runtimes.clear();\n }\n\n private async ensureFreshToken(\n storedAccount: StoredAccount,\n uuid: string,\n ): Promise<{ accessToken: string; expiresAt: number }> {\n const refreshed = await refreshToken(storedAccount.refreshToken, uuid, this.client);\n if (!refreshed.ok) {\n throw new TokenRefreshError(\n refreshed.permanent,\n refreshed.permanent ? TOKEN_REFRESH_PERMANENT_FAILURE_STATUS : undefined,\n );\n }\n\n await this.store.mutateAccount(uuid, (account) => {\n account.accessToken = refreshed.patch.accessToken;\n account.expiresAt = refreshed.patch.expiresAt;\n if (refreshed.patch.refreshToken) account.refreshToken = refreshed.patch.refreshToken;\n if (refreshed.patch.uuid) account.uuid = refreshed.patch.uuid;\n if (refreshed.patch.email) account.email = refreshed.patch.email;\n account.consecutiveAuthFailures = 0;\n account.isAuthDisabled = false;\n account.authDisabledReason = undefined;\n });\n\n this.client.auth\n .set({\n path: { id: ANTHROPIC_OAUTH_ADAPTER.authProviderId },\n body: {\n type: \"oauth\",\n refresh: refreshed.patch.refreshToken ?? storedAccount.refreshToken,\n access: refreshed.patch.accessToken,\n expires: refreshed.patch.expiresAt,\n },\n })\n .catch(() => {});\n\n return { accessToken: refreshed.patch.accessToken, expiresAt: refreshed.patch.expiresAt };\n }\n\n private async executeTransformedFetch(\n input: RequestInfo | URL,\n init: RequestInit | undefined,\n accessToken: string,\n ): Promise<Response> {\n const transformedInput = transformRequestUrl(input);\n const modelId = extractModelIdFromBody(init?.body);\n const excludedBetas = getExcludedBetas(modelId);\n const headers = buildRequestHeaders(transformedInput, init, accessToken, modelId, excludedBetas);\n const transformedBody =\n typeof init?.body === \"string\" ? transformRequestBody(init.body) : init?.body;\n\n let response = await fetch(transformedInput, {\n ...init,\n headers,\n body: transformedBody,\n });\n\n for (let attempt = 0; attempt < LONG_CONTEXT_BETAS.length; attempt += 1) {\n if (response.status !== 400 && response.status !== 429) {\n break;\n }\n\n const responseBody = await response.clone().text();\n if (!isLongContextError(responseBody)) {\n break;\n }\n\n const betaToExclude = getNextBetaToExclude(modelId);\n if (!betaToExclude) {\n break;\n }\n\n addExcludedBeta(modelId, betaToExclude);\n\n const retryHeaders = buildRequestHeaders(\n transformedInput,\n init,\n accessToken,\n modelId,\n getExcludedBetas(modelId),\n );\n\n response = await fetch(transformedInput, {\n ...init,\n headers: retryHeaders,\n body: transformedBody,\n });\n }\n\n return createResponseStreamTransform(response);\n }\n\n private async createRuntime(uuid: string): Promise<AccountRuntime> {\n const fetchWithAccount: BaseFetch = async (input, init) => {\n const storage = await this.store.load();\n const storedAccount = storage.accounts.find((account: StoredAccount) => account.uuid === uuid);\n if (!storedAccount) {\n throw new Error(`No credentials found for account ${uuid}`);\n }\n\n let accessToken = storedAccount.accessToken;\n let expiresAt = storedAccount.expiresAt;\n\n if (!accessToken || !expiresAt || isTokenExpired({ accessToken, expiresAt })) {\n ({ accessToken, expiresAt } = await this.ensureFreshToken(storedAccount, uuid));\n }\n\n if (!accessToken) {\n throw new Error(`No access token available for account ${uuid}`);\n }\n\n return this.executeTransformedFetch(input, init, accessToken);\n };\n\n debugLog(this.client, `Runtime created for account ${uuid.slice(0, 8)}`);\n return { fetch: fetchWithAccount };\n }\n}\n","import { promises as fs } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { getConfigDir } from \"opencode-multi-account-core\";\nimport { ANTHROPIC_OAUTH_ADAPTER } from \"./constants\";\nimport type { AccountStore } from \"./account-store\";\nimport type { OAuthCredentials, PluginClient, StoredAccount } from \"./types\";\n\nconst AUTH_JSON_FILENAME = \"auth.json\";\n\nfunction hasCompleteOAuthCredential(account: StoredAccount): account is StoredAccount & {\n refreshToken: string;\n accessToken: string;\n expiresAt: number;\n} {\n return (\n typeof account.refreshToken === \"string\"\n && account.refreshToken.length > 0\n && typeof account.accessToken === \"string\"\n && account.accessToken.length > 0\n && typeof account.expiresAt === \"number\"\n && Number.isFinite(account.expiresAt)\n );\n}\n\nfunction selectBootstrapAccount(\n accounts: StoredAccount[],\n activeAccountUuid?: string,\n): (StoredAccount & { refreshToken: string; accessToken: string; expiresAt: number }) | null {\n const completeAccounts = accounts.filter(hasCompleteOAuthCredential);\n if (completeAccounts.length === 0) {\n return null;\n }\n\n const activeAccount = activeAccountUuid\n ? completeAccounts.find((account) => account.uuid === activeAccountUuid)\n : undefined;\n if (activeAccount) {\n return activeAccount;\n }\n\n const firstUsableAccount = completeAccounts.find(\n (account) => account.enabled !== false && account.isAuthDisabled !== true,\n );\n return firstUsableAccount ?? completeAccounts[0] ?? null;\n}\n\nasync function readCurrentAuth(providerId: string): Promise<OAuthCredentials | null> {\n const authPath = join(getConfigDir(), AUTH_JSON_FILENAME);\n\n let raw: string;\n try {\n raw = await fs.readFile(authPath, \"utf-8\");\n } catch {\n return null;\n }\n\n try {\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n const providerAuth = parsed[providerId] as Partial<OAuthCredentials> | undefined;\n if (\n providerAuth?.type !== \"oauth\"\n || typeof providerAuth.refresh !== \"string\"\n || typeof providerAuth.access !== \"string\"\n || typeof providerAuth.expires !== \"number\"\n ) {\n return null;\n }\n\n return {\n type: \"oauth\",\n refresh: providerAuth.refresh,\n access: providerAuth.access,\n expires: providerAuth.expires,\n };\n } catch {\n return null;\n }\n}\n\nfunction shouldSyncBootstrapAuth(currentAuth: OAuthCredentials | null, nextAuth: OAuthCredentials): boolean {\n if (!currentAuth) {\n return true;\n }\n\n if (\n currentAuth.refresh === nextAuth.refresh\n && currentAuth.access === nextAuth.access\n && currentAuth.expires === nextAuth.expires\n ) {\n return false;\n }\n\n return currentAuth.expires < nextAuth.expires;\n}\n\nexport async function syncBootstrapAuth(\n client: PluginClient,\n store: AccountStore,\n): Promise<boolean> {\n const storage = await store.load();\n const bootstrapAccount = selectBootstrapAccount(storage.accounts, storage.activeAccountUuid);\n if (!bootstrapAccount) {\n return false;\n }\n\n const nextAuth: OAuthCredentials = {\n type: \"oauth\",\n refresh: bootstrapAccount.refreshToken,\n access: bootstrapAccount.accessToken,\n expires: bootstrapAccount.expiresAt,\n };\n\n const currentAuth = await readCurrentAuth(ANTHROPIC_OAUTH_ADAPTER.authProviderId);\n if (!shouldSyncBootstrapAuth(currentAuth, nextAuth)) {\n return false;\n }\n\n await client.auth.set({\n path: { id: ANTHROPIC_OAUTH_ADAPTER.authProviderId },\n body: nextAuth,\n });\n return true;\n}\n\nexport const __bootstrapAuthTestUtils = {\n selectBootstrapAccount,\n shouldSyncBootstrapAuth,\n};\n"],"mappings":"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","names":["v","createExecutorForProvider","executeWithAccountRotation","createExecutorForProvider","config","excludedBetas","tool","excludedBetas","getConfigDir","getConfigDir","usage"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-anthropic-multi-account",
3
- "version": "0.2.11",
3
+ "version": "0.2.13",
4
4
  "description": "OpenCode plugin for Anthropic multi-account management with automatic rate limit switching",
5
5
  "main": "./dist/index.js",
6
6
  "type": "module",
@@ -39,7 +39,7 @@
39
39
  "directory": "packages/anthropic-multi-account"
40
40
  },
41
41
  "dependencies": {
42
- "opencode-multi-account-core": "^0.2.11",
42
+ "opencode-multi-account-core": "^0.2.13",
43
43
  "@mariozechner/pi-ai": "^0.61.0",
44
44
  "valibot": "^1.2.0"
45
45
  },