@nick3/copilot-api 1.5.3 → 1.5.6

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.
Files changed (28) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +26 -3
  3. package/dist/{account-BMFr8t9b.js → account-AacnHem5.js} +2 -2
  4. package/dist/{account-BMFr8t9b.js.map → account-AacnHem5.js.map} +1 -1
  5. package/dist/{accounts-manager-DgQH4KtO.js → accounts-manager-BE-Dq5Wn.js} +76 -31
  6. package/dist/accounts-manager-BE-Dq5Wn.js.map +1 -0
  7. package/dist/admin/assets/index-CdoHTemy.css +1 -0
  8. package/dist/admin/assets/index-wcoGQpIM.js +66 -0
  9. package/dist/admin/index.html +2 -2
  10. package/dist/{auth-DipSy-jV.js → auth-B7x3wjry.js} +3 -3
  11. package/dist/{auth-DipSy-jV.js.map → auth-B7x3wjry.js.map} +1 -1
  12. package/dist/{check-usage-Dbjs73E0.js → check-usage-B1cbDEOI.js} +3 -3
  13. package/dist/{check-usage-Dbjs73E0.js.map → check-usage-B1cbDEOI.js.map} +1 -1
  14. package/dist/{get-copilot-token-DoK8Ia3u.js → get-copilot-token-cha9rQwA.js} +2 -2
  15. package/dist/{get-copilot-token-DoK8Ia3u.js.map → get-copilot-token-cha9rQwA.js.map} +1 -1
  16. package/dist/main.js +3 -3
  17. package/dist/{poll-access-token-BzenaGHn.js → poll-access-token-DFooFWhY.js} +7 -5
  18. package/dist/poll-access-token-DFooFWhY.js.map +1 -0
  19. package/dist/{server-DzE_zmUf.js → server-DVpkQrk2.js} +97 -34
  20. package/dist/server-DVpkQrk2.js.map +1 -0
  21. package/dist/{start-DEugVHqn.js → start-fPbCDj4c.js} +6 -6
  22. package/dist/{start-DEugVHqn.js.map → start-fPbCDj4c.js.map} +1 -1
  23. package/package.json +2 -1
  24. package/dist/accounts-manager-DgQH4KtO.js.map +0 -1
  25. package/dist/admin/assets/index-519a65q_.js +0 -66
  26. package/dist/admin/assets/index-ChMaMig2.css +0 -1
  27. package/dist/poll-access-token-BzenaGHn.js.map +0 -1
  28. package/dist/server-DzE_zmUf.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accounts-manager-BE-Dq5Wn.js","names":["defaultConfig: AppConfig","cachedConfig: AppConfig | null","normalizedTarget","normalized: ModelAliasInfoMap","normalized: ModelAliasMap","runtime: AccountRuntime","accounts: Array<AccountRuntime>","overageFallback:\n | {\n account: AccountRuntime\n model: Model\n endpoint: string\n costUnits: number\n }\n | undefined","statuses: Array<{\n id: string\n entitlement?: number\n remaining?: number\n unlimited?: boolean\n overagePermitted?: boolean\n failed?: boolean\n failureReason?: string\n }>","allAccounts: Array<AccountRuntime>","added: Array<string>","removed: Array<string>","updated: Array<string>","changes: Array<string>"],"sources":["../src/lib/config.ts","../src/lib/account-affinity.ts","../src/lib/accounts-manager-auth.ts","../src/lib/accounts-manager-quota.ts","../src/lib/accounts-manager.ts"],"sourcesContent":["import consola from \"consola\"\nimport fs from \"node:fs\"\n\nimport { PATHS } from \"./paths\"\n\nexport interface AppConfig {\n auth?: {\n apiKeys?: Array<string>\n }\n providers?: Record<string, ProviderConfig>\n extraPrompts?: Record<string, string>\n smallModel?: string\n accountAffinity?: boolean\n /** @deprecated */\n apiKey?: string\n responsesApiContextManagementModels?: Array<string>\n modelReasoningEfforts?: Record<\n string,\n \"none\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\"\n >\n modelAliases?: Record<string, { target: string; allowOriginal?: boolean }>\n allowOriginalModelNamesForAliases?: boolean\n useFunctionApplyPatch?: boolean\n forceAgent?: boolean\n compactUseSmallModel?: boolean\n messageStartInputTokensFallback?: boolean\n modelRefreshIntervalHours?: number\n useMessagesApi?: boolean\n anthropicApiKey?: string\n useResponsesApiWebSearch?: boolean\n claudeTokenMultiplier?: number\n}\n\nexport interface ModelConfig {\n temperature?: number\n topP?: number\n topK?: number\n}\n\nexport const PROVIDER_TYPE_ANTHROPIC = \"anthropic\" as const\n\nexport type ProviderType = typeof PROVIDER_TYPE_ANTHROPIC\n\nexport type ProviderAuthType = \"authorization\" | \"x-api-key\"\n\nexport interface ProviderConfig {\n type?: string\n enabled?: boolean\n baseUrl?: string\n apiKey?: string\n authType?: ProviderAuthType\n models?: Record<string, ModelConfig>\n adjustInputTokens?: boolean\n}\n\nexport interface ResolvedProviderConfig {\n name: string\n type: ProviderType\n baseUrl: string\n apiKey: string\n authType: ProviderAuthType\n models?: Record<string, ModelConfig>\n adjustInputTokens?: boolean\n}\n\nconst gpt5ExplorationPrompt = `## Exploration and reading files\n- **Think first.** Before any tool call, decide ALL files/resources you will need.\n- **Batch everything.** If you need multiple files (even from different places), read them together.\n- **multi_tool_use.parallel** Use multi_tool_use.parallel to parallelize tool calls and only this.\n- **Only make sequential calls if you truly cannot know the next file without seeing a result first.**\n- **Workflow:** (a) plan all needed reads → (b) issue one parallel batch → (c) analyze results → (d) repeat if new, unpredictable reads arise.`\n\nconst gpt5CommentaryPrompt = `# Working with the user\n\nYou interact with the user through a terminal. You have 2 ways of communicating with the users: \n- Share intermediary updates in \\`commentary\\` channel. \n- After you have completed all your work, send a message to the \\`final\\` channel. \n\n## Intermediary updates\n\n- Intermediary updates go to the \\`commentary\\` channel.\n- User updates are short updates while you are working, they are NOT final answers.\n- You use 1-2 sentence user updates to communicate progress and new information to the user as you are doing work.\n- Do not begin responses with conversational interjections or meta commentary. Avoid openers such as acknowledgements (“Done —”, “Got it”, “Great question, ”) or framing phrases.\n- You provide user updates frequently, every 20s.\n- Before exploring or doing substantial work, you start with a user update acknowledging the request and explaining your first step. You should include your understanding of the user request and explain what you will do. Avoid commenting on the request or using starters such as \"Got it -\" or \"Understood -\" etc.\n- When exploring, e.g. searching, reading files, you provide user updates as you go, every 20s, explaining what context you are gathering and what you've learned. Vary your sentence structure when providing these updates to avoid sounding repetitive - in particular, don't start each sentence the same way.\n- After you have sufficient context, and the work is substantial, you provide a longer plan (this is the only user update that may be longer than 2 sentences and can contain formatting).\n- Before performing file edits of any kind, you provide updates explaining what edits you are making.\n- As you are thinking, you very frequently provide updates even if not taking any actions, informing the user of your progress. You interrupt your thinking and send multiple updates in a row if thinking for more than 100 words.\n- Tone of your updates MUST match your personality.`\n\nconst defaultConfig: AppConfig = {\n auth: {\n apiKeys: [],\n },\n providers: {},\n extraPrompts: {\n \"gpt-5-mini\": gpt5ExplorationPrompt,\n \"gpt-5.3-codex\": gpt5CommentaryPrompt,\n \"gpt-5.4-mini\": gpt5CommentaryPrompt,\n \"gpt-5.4\": gpt5CommentaryPrompt,\n },\n smallModel: \"gpt-5-mini\",\n accountAffinity: true,\n responsesApiContextManagementModels: [],\n modelReasoningEfforts: {\n \"gpt-5-mini\": \"low\",\n \"gpt-5.3-codex\": \"xhigh\",\n \"gpt-5.4-mini\": \"xhigh\",\n \"gpt-5.4\": \"xhigh\",\n },\n allowOriginalModelNamesForAliases: false,\n useFunctionApplyPatch: true,\n forceAgent: false,\n compactUseSmallModel: true,\n messageStartInputTokensFallback: false,\n modelRefreshIntervalHours: 24,\n useMessagesApi: true,\n useResponsesApiWebSearch: true,\n}\n\nlet cachedConfig: AppConfig | null = null\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nfunction normalizeAuthApiKeys(value: unknown): Array<string> {\n if (!Array.isArray(value)) return []\n\n return [\n ...new Set(\n value\n .filter((item): item is string => typeof item === \"string\")\n .map((item) => item.trim())\n .filter((item) => item.length > 0),\n ),\n ]\n}\n\nfunction normalizeModelRefreshIntervalHours(\n value: unknown,\n): number | undefined {\n if (typeof value !== \"number\") return undefined\n if (!Number.isFinite(value)) return undefined\n if (value < 0) return undefined\n return value\n}\n\nfunction ensureConfigFile(): void {\n try {\n fs.accessSync(PATHS.CONFIG_PATH, fs.constants.R_OK)\n return\n } catch {\n // Fall through to try creating the default config file.\n }\n\n try {\n fs.mkdirSync(PATHS.APP_DIR, { recursive: true })\n fs.writeFileSync(\n PATHS.CONFIG_PATH,\n `${JSON.stringify(defaultConfig, null, 2)}\\n`,\n \"utf8\",\n )\n try {\n fs.chmodSync(PATHS.CONFIG_PATH, 0o600)\n } catch {\n // Ignore chmod errors (e.g. unsupported filesystem).\n }\n } catch {\n // Best-effort only: if we can't create the file, reads will fall back to defaults.\n }\n}\n\nfunction readConfigFromDisk(): AppConfig {\n ensureConfigFile()\n try {\n const raw = fs.readFileSync(PATHS.CONFIG_PATH, \"utf8\")\n if (!raw.trim()) {\n fs.writeFileSync(\n PATHS.CONFIG_PATH,\n `${JSON.stringify(defaultConfig, null, 2)}\\n`,\n \"utf8\",\n )\n return defaultConfig\n }\n return JSON.parse(raw) as AppConfig\n } catch (error) {\n consola.error(\"Failed to read config file, using default config\", error)\n return defaultConfig\n }\n}\n\nfunction mergeDefaultConfig(config: AppConfig): {\n mergedConfig: AppConfig\n changed: boolean\n} {\n const extraPrompts = config.extraPrompts ?? {}\n const defaultExtraPrompts = defaultConfig.extraPrompts ?? {}\n const modelReasoningEfforts = config.modelReasoningEfforts ?? {}\n const defaultModelReasoningEfforts = defaultConfig.modelReasoningEfforts ?? {}\n const hasForceAgent = typeof config.forceAgent === \"boolean\"\n const defaultForceAgent = defaultConfig.forceAgent ?? false\n\n const missingExtraPromptModels = Object.keys(defaultExtraPrompts).filter(\n (model) => !Object.hasOwn(extraPrompts, model),\n )\n\n const missingReasoningEffortModels = Object.keys(\n defaultModelReasoningEfforts,\n ).filter((model) => !Object.hasOwn(modelReasoningEfforts, model))\n\n const hasExtraPromptChanges = missingExtraPromptModels.length > 0\n const hasReasoningEffortChanges = missingReasoningEffortModels.length > 0\n const hasForceAgentChanges = !hasForceAgent\n\n if (\n !hasExtraPromptChanges\n && !hasReasoningEffortChanges\n && !hasForceAgentChanges\n ) {\n return { mergedConfig: config, changed: false }\n }\n\n return {\n mergedConfig: {\n ...config,\n extraPrompts: {\n ...defaultExtraPrompts,\n ...extraPrompts,\n },\n modelReasoningEfforts: {\n ...defaultModelReasoningEfforts,\n ...modelReasoningEfforts,\n },\n forceAgent: hasForceAgent ? config.forceAgent : defaultForceAgent,\n },\n changed: true,\n }\n}\n\nfunction mergeDefaultAuth(config: AppConfig): {\n mergedConfig: AppConfig\n changed: boolean\n} {\n const authConfig = isPlainObject(config.auth) ? config.auth : undefined\n const rawApiKeys =\n Array.isArray(authConfig?.apiKeys) ? authConfig.apiKeys : undefined\n const normalizedApiKeys = normalizeAuthApiKeys(rawApiKeys)\n const nextAuth = { apiKeys: normalizedApiKeys }\n\n if (authConfig && JSON.stringify(authConfig) === JSON.stringify(nextAuth)) {\n return { mergedConfig: config, changed: false }\n }\n\n return {\n mergedConfig: {\n ...config,\n auth: nextAuth,\n },\n changed: true,\n }\n}\n\nfunction mergeDefaultAccountAffinity(config: AppConfig): {\n mergedConfig: AppConfig\n changed: boolean\n} {\n // Migration: map old freeModelLoadBalancing to accountAffinity\n const raw = config as Record<string, unknown>\n const hasOld = typeof raw.freeModelLoadBalancing === \"boolean\"\n const hasNew = typeof config.accountAffinity === \"boolean\"\n\n if (hasOld) {\n const next = { ...config } as Record<string, unknown>\n if (!hasNew) {\n next.accountAffinity = raw.freeModelLoadBalancing\n }\n delete next.freeModelLoadBalancing\n return { mergedConfig: next as AppConfig, changed: true }\n }\n\n if (hasNew) {\n return { mergedConfig: config, changed: false }\n }\n\n return {\n mergedConfig: {\n ...config,\n accountAffinity: defaultConfig.accountAffinity ?? true,\n },\n changed: true,\n }\n}\n\nfunction mergeDefaultModelRefreshInterval(config: AppConfig): {\n mergedConfig: AppConfig\n changed: boolean\n} {\n const normalized = normalizeModelRefreshIntervalHours(\n config.modelRefreshIntervalHours,\n )\n\n if (normalized !== undefined) {\n return { mergedConfig: config, changed: false }\n }\n\n return {\n mergedConfig: {\n ...config,\n modelRefreshIntervalHours: defaultConfig.modelRefreshIntervalHours ?? 24,\n },\n changed: true,\n }\n}\n\ntype ConfigMergeResult = {\n mergedConfig: AppConfig\n changed: boolean\n}\n\ntype ConfigMergeFn = (config: AppConfig) => ConfigMergeResult\n\nfunction applyConfigMerges(\n config: AppConfig,\n mergeFns: ReadonlyArray<ConfigMergeFn>,\n): ConfigMergeResult {\n return mergeFns.reduce<ConfigMergeResult>(\n (acc, mergeFn) => {\n const result = mergeFn(acc.mergedConfig)\n return {\n mergedConfig: result.mergedConfig,\n changed: acc.changed || result.changed,\n }\n },\n { mergedConfig: config, changed: false },\n )\n}\n\nexport function mergeConfigWithDefaults(): AppConfig {\n const config = readConfigFromDisk()\n\n const { mergedConfig, changed } = applyConfigMerges(config, [\n mergeDefaultAuth,\n mergeDefaultConfig,\n mergeDefaultAccountAffinity,\n mergeDefaultModelRefreshInterval,\n ])\n\n if (changed) {\n try {\n fs.writeFileSync(\n PATHS.CONFIG_PATH,\n `${JSON.stringify(mergedConfig, null, 2)}\\n`,\n \"utf8\",\n )\n } catch (writeError) {\n consola.warn(\"Failed to write merged config defaults\", writeError)\n }\n }\n\n cachedConfig = mergedConfig\n return mergedConfig\n}\n\nexport function getConfig(): AppConfig {\n cachedConfig ??= readConfigFromDisk()\n return cachedConfig\n}\n\ntype ModelAliasSpec = {\n target: string\n allowOriginal?: boolean\n}\n\ntype ModelAliasMap = Record<string, string>\n\ntype ModelAliasInfoMap = Record<string, ModelAliasSpec>\n\ntype ModelAliasRawMap = Record<string, unknown>\n\nfunction normalizeAliasKey(value: string): string | null {\n const trimmed = value.trim().toLowerCase()\n return trimmed.length > 0 ? trimmed : null\n}\n\nfunction normalizeAliasTarget(value: string): string | null {\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : null\n}\n\nfunction normalizeAliasSpec(value: unknown): ModelAliasSpec | null {\n if (typeof value === \"string\") {\n const normalizedTarget = normalizeAliasTarget(value)\n return normalizedTarget ? { target: normalizedTarget } : null\n }\n if (!value || typeof value !== \"object\") {\n return null\n }\n\n const targetValue = (value as { target?: unknown }).target\n if (typeof targetValue !== \"string\") {\n return null\n }\n\n const normalizedTarget = normalizeAliasTarget(targetValue)\n if (!normalizedTarget) {\n return null\n }\n\n const allowOriginalValue = (value as { allowOriginal?: unknown })\n .allowOriginal\n const allowOriginal =\n typeof allowOriginalValue === \"boolean\" ? allowOriginalValue : undefined\n return { target: normalizedTarget, allowOriginal }\n}\n\nexport function getModelAliasesInfo(): ModelAliasInfoMap {\n const config = getConfig()\n const raw = (config.modelAliases ?? {}) as ModelAliasRawMap\n const normalized: ModelAliasInfoMap = {}\n\n for (const [alias, rawSpec] of Object.entries(raw)) {\n const normalizedAlias = normalizeAliasKey(alias)\n const normalizedSpec = normalizeAliasSpec(rawSpec)\n if (!normalizedAlias || !normalizedSpec) {\n continue\n }\n if (!Object.hasOwn(normalized, normalizedAlias)) {\n normalized[normalizedAlias] = normalizedSpec\n }\n }\n\n return normalized\n}\n\nexport function getModelAliases(): ModelAliasMap {\n const info = getModelAliasesInfo()\n const normalized: ModelAliasMap = {}\n\n for (const [alias, spec] of Object.entries(info)) {\n normalized[alias] = spec.target\n }\n\n return normalized\n}\n\nexport function resolveModelAlias(modelId: string): string {\n const normalized = normalizeAliasKey(modelId)\n if (!normalized) return modelId\n const aliases = getModelAliases()\n return aliases[normalized] ?? modelId\n}\n\nexport function isOriginalModelNameAllowedForAliases(): boolean {\n const config = getConfig()\n return config.allowOriginalModelNamesForAliases ?? false\n}\n\nexport function getAliasTargetSet(): Set<string> {\n const aliases = getModelAliasesInfo()\n const allowOriginalDefault = isOriginalModelNameAllowedForAliases()\n const targetAllowMap = new Map<string, boolean>()\n\n for (const { target, allowOriginal } of Object.values(aliases)) {\n const normalizedTarget = target.toLowerCase()\n const effectiveAllow = allowOriginal ?? allowOriginalDefault\n const currentAllow = targetAllowMap.get(normalizedTarget)\n if (currentAllow === true) {\n continue\n }\n if (effectiveAllow) {\n targetAllowMap.set(normalizedTarget, true)\n } else if (currentAllow === undefined) {\n targetAllowMap.set(normalizedTarget, false)\n }\n }\n\n const blockedTargets = new Set<string>()\n for (const [target, allowed] of targetAllowMap.entries()) {\n if (!allowed) {\n blockedTargets.add(target)\n }\n }\n\n return blockedTargets\n}\n\nexport function isOriginalModelNameAllowedForTarget(modelId: string): boolean {\n const normalized = normalizeAliasKey(modelId)\n if (!normalized) return true\n const blockedTargets = getAliasTargetSet()\n return !blockedTargets.has(normalized)\n}\n\nexport function getPreferredAliasForTarget(modelId: string): string | null {\n const aliases = getModelAliases()\n const aliasKeys = getAliasKeysForTarget(modelId, aliases)\n return aliasKeys[0] ?? null\n}\n\nfunction getAliasKeysForTarget(\n target: string,\n aliases: ModelAliasMap,\n): Array<string> {\n const normalizedTarget = target.toLowerCase()\n return Object.entries(aliases)\n .filter(([, model]) => model.toLowerCase() === normalizedTarget)\n .map(([alias]) => alias)\n .sort()\n}\n\nfunction getAliasFallbackValue<T extends string>(\n record: Record<string, T> | undefined,\n modelId: string,\n aliases: ModelAliasMap,\n): T | undefined {\n if (!record) return undefined\n\n const aliasKeys = getAliasKeysForTarget(modelId, aliases)\n if (aliasKeys.length === 0) return undefined\n\n const recordByAlias = new Map<string, T>()\n for (const [key, value] of Object.entries(record)) {\n const normalized = normalizeAliasKey(key)\n if (normalized) {\n recordByAlias.set(normalized, value)\n }\n }\n\n for (const alias of aliasKeys) {\n const value = recordByAlias.get(alias)\n if (value !== undefined) {\n return value\n }\n }\n\n return undefined\n}\n\nexport function getExtraPromptForModel(model: string): string {\n const config = getConfig()\n const direct = config.extraPrompts?.[model]\n if (direct !== undefined) return direct\n\n const aliases = getModelAliases()\n const fallback = getAliasFallbackValue(config.extraPrompts, model, aliases)\n return fallback ?? \"\"\n}\n\nexport function getSmallModel(): string {\n const config = getConfig()\n const model = config.smallModel ?? \"gpt-5-mini\"\n if (isOriginalModelNameAllowedForTarget(model)) {\n return model\n }\n\n return getPreferredAliasForTarget(model) ?? model\n}\n\nexport function isAccountAffinityEnabled(): boolean {\n const config = getConfig()\n return config.accountAffinity ?? true\n}\n\nexport function getModelRefreshIntervalHours(): number {\n const config = getConfig()\n const normalized = normalizeModelRefreshIntervalHours(\n config.modelRefreshIntervalHours,\n )\n return normalized ?? defaultConfig.modelRefreshIntervalHours ?? 24\n}\n\nexport function getModelRefreshIntervalMs(): number {\n const hours = getModelRefreshIntervalHours()\n if (!Number.isFinite(hours) || hours <= 0) return 0\n return hours * 60 * 60 * 1000\n}\n\nexport function isMessageStartInputTokensFallbackEnabled(): boolean {\n const config = getConfig()\n return config.messageStartInputTokensFallback ?? false\n}\n\nexport function shouldCompactUseSmallModel(): boolean {\n const config = getConfig()\n return config.compactUseSmallModel ?? true\n}\n\nexport function getResponsesApiContextManagementModels(): Array<string> {\n const config = getConfig()\n return (\n config.responsesApiContextManagementModels\n ?? defaultConfig.responsesApiContextManagementModels\n ?? []\n )\n}\n\nexport function isResponsesApiContextManagementModel(model: string): boolean {\n return getResponsesApiContextManagementModels().includes(model)\n}\n\nexport function getReasoningEffortForModel(\n model: string,\n): \"none\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" {\n const config = getConfig()\n const direct = config.modelReasoningEfforts?.[model]\n if (direct !== undefined) return direct\n\n const aliases = getModelAliases()\n const fallback = getAliasFallbackValue(\n config.modelReasoningEfforts,\n model,\n aliases,\n )\n return fallback ?? \"high\"\n}\n\nexport function isForceAgentEnabled(): boolean {\n const config = getConfig()\n return config.forceAgent ?? false\n}\n\nexport function normalizeProviderBaseUrl(url: string): string {\n return url.trim().replace(/\\/+$/u, \"\")\n}\n\nfunction resolveProviderAuthType(\n providerName: string,\n authType?: string,\n): ProviderAuthType | null {\n if (authType === undefined || authType === \"x-api-key\") {\n return \"x-api-key\"\n }\n\n if (authType === \"authorization\") {\n return authType\n }\n\n consola.warn(\n `Provider ${providerName} has invalid authType '${authType}', ignoring provider`,\n )\n return null\n}\n\nexport function getProviderConfig(name: string): ResolvedProviderConfig | null {\n const providerName = name.trim()\n if (!providerName) {\n return null\n }\n\n const config = getConfig()\n const provider = config.providers?.[providerName]\n if (!provider) {\n return null\n }\n\n if (provider.enabled === false) {\n return null\n }\n\n const type = provider.type ?? PROVIDER_TYPE_ANTHROPIC\n if (type !== PROVIDER_TYPE_ANTHROPIC) {\n consola.warn(\n `Provider ${providerName} is ignored because only anthropic type is supported`,\n )\n return null\n }\n\n const baseUrl = normalizeProviderBaseUrl(provider.baseUrl ?? \"\")\n const apiKey = (provider.apiKey ?? \"\").trim()\n const authType = resolveProviderAuthType(providerName, provider.authType)\n if (!authType) {\n return null\n }\n if (!baseUrl || !apiKey) {\n consola.warn(\n `Provider ${providerName} is enabled but missing baseUrl or apiKey`,\n )\n return null\n }\n\n return {\n name: providerName,\n type: PROVIDER_TYPE_ANTHROPIC,\n baseUrl,\n apiKey,\n authType,\n models: provider.models,\n adjustInputTokens: provider.adjustInputTokens,\n }\n}\n\nexport function listEnabledProviders(): Array<string> {\n const config = getConfig()\n const providerNames = Object.keys(config.providers ?? {})\n return providerNames.filter((name) => getProviderConfig(name) !== null)\n}\n\nexport function isMessagesApiEnabled(): boolean {\n const config = getConfig()\n return config.useMessagesApi ?? true\n}\n\nexport function getAnthropicApiKey(): string | undefined {\n const config = getConfig()\n return config.anthropicApiKey ?? process.env.ANTHROPIC_API_KEY ?? undefined\n}\n\nexport function isResponsesApiWebSearchEnabled(): boolean {\n const config = getConfig()\n return config.useResponsesApiWebSearch ?? true\n}\n\nexport function getClaudeTokenMultiplier(): number {\n const config = getConfig()\n return config.claudeTokenMultiplier ?? 1.15\n}\n","import type { AccountRuntime } from \"~/lib/types/account\"\n\nexport interface AffinityContext {\n requestId?: string\n}\n\ninterface AffinityCacheEntry {\n accountId: string\n expiresAt: number\n}\n\nconst DEFAULT_MAX_ENTRIES = 10_000\nconst DEFAULT_TTL_MS = 60 * 60 * 1000 // 1 hour\n\n/**\n * In-memory LRU cache with TTL for account affinity mappings.\n *\n * Uses Map insertion order for LRU eviction: accessed/updated entries are\n * deleted and re-inserted so they move to the \"newest\" end.\n */\nexport class AccountAffinityCache {\n private readonly cache = new Map<string, AffinityCacheEntry>()\n private readonly maxEntries: number\n private readonly ttlMs: number\n\n constructor(maxEntries = DEFAULT_MAX_ENTRIES, ttlMs = DEFAULT_TTL_MS) {\n this.maxEntries = maxEntries\n this.ttlMs = ttlMs\n }\n\n /** Look up the preferred account ID for a cache key. Returns undefined if not found or expired. */\n get(key: string): string | undefined {\n const entry = this.cache.get(key)\n if (!entry) {\n return undefined\n }\n\n if (Date.now() >= entry.expiresAt) {\n this.cache.delete(key)\n return undefined\n }\n\n return entry.accountId\n }\n\n /** Record a successful account mapping. Refreshes TTL and moves the entry to the newest position. */\n set(key: string, accountId: string): void {\n // Delete first so re-insertion moves it to the newest position (LRU).\n this.cache.delete(key)\n\n // Evict oldest entries if at capacity.\n while (this.cache.size >= this.maxEntries) {\n const oldest = this.cache.keys().next()\n if (oldest.done) break\n this.cache.delete(oldest.value)\n }\n\n this.cache.set(key, {\n accountId,\n expiresAt: Date.now() + this.ttlMs,\n })\n }\n\n /** Remove a specific entry. */\n delete(key: string): boolean {\n return this.cache.delete(key)\n }\n\n /** Remove all entries. */\n clear(): void {\n this.cache.clear()\n }\n\n /** Current number of entries (including potentially expired ones). */\n get size(): number {\n return this.cache.size\n }\n}\n\n/**\n * Extract the affinity key from the request context.\n * Uses the upstream request ID which is deterministic for the same user message.\n */\nexport function extractAffinityKey(\n context: AffinityContext,\n): string | undefined {\n return context.requestId?.trim() || undefined\n}\n\n/**\n * Build the full cache key by combining the affinity key with the model ID.\n * This prevents cross-model pollution (same session requesting different models\n * can be routed to different accounts).\n */\nexport function buildAffinityCacheKey(\n affinityKey: string,\n modelId: string,\n): string {\n return `${affinityKey}:${modelId}`\n}\n\n/**\n * Check whether an account is a valid affinity candidate.\n * An account is valid if it is not failed and is present in the provided\n * runtime list.\n */\nexport function isAffinityAccountUsable(\n accountId: string,\n accounts: ReadonlyArray<AccountRuntime>,\n): AccountRuntime | undefined {\n const account = accounts.find((a) => a.id === accountId)\n if (!account) return undefined\n if (account.failed) return undefined\n return account\n}\n","import consola from \"consola\"\n\nimport type {\n AccountContext,\n AccountRuntime,\n AccountType,\n} from \"~/lib/types/account\"\nimport type { QuotaDetail } from \"~/services/github/get-copilot-usage\"\n\nexport type AuthSnapshot = Readonly<{\n githubToken: string\n accountType: AccountType\n}>\n\nexport const takeAuthSnapshot = (account: AccountRuntime): AuthSnapshot => ({\n githubToken: account.githubToken,\n accountType: account.accountType,\n})\n\nexport const isAuthSnapshotCurrent = (\n account: AccountRuntime,\n snapshot: AuthSnapshot,\n): boolean =>\n account.githubToken === snapshot.githubToken\n && account.accountType === snapshot.accountType\n\nexport const isSameAuthSnapshot = (\n a: AuthSnapshot | undefined,\n b: AuthSnapshot,\n): boolean => {\n if (!a) return false\n return a.githubToken === b.githubToken && a.accountType === b.accountType\n}\n\nexport const toAccountContextFromSnapshot = (\n account: AccountRuntime,\n snapshot: AuthSnapshot,\n copilotToken?: string,\n): AccountContext => ({\n accountLogin: account.accountLogin,\n githubToken: snapshot.githubToken,\n copilotToken,\n ...(account.copilotApiUrl !== undefined ?\n { copilotApiUrl: account.copilotApiUrl }\n : {}),\n accountType: snapshot.accountType,\n vsCodeVersion: account.vsCodeVersion,\n clientDeviceId: account.clientDeviceId,\n clientMachineId: account.clientMachineId,\n clientSessionId: account.clientSessionId,\n})\n\nexport const applyCopilotTokenIfCurrent = (\n account: AccountRuntime,\n snapshot: AuthSnapshot,\n copilotToken: string,\n): boolean => {\n if (!isAuthSnapshotCurrent(account, snapshot)) {\n return false\n }\n\n account.copilotToken = copilotToken\n return true\n}\n\nexport const applyModelsIfCurrent = (\n account: AccountRuntime,\n snapshot: AuthSnapshot,\n models: AccountRuntime[\"models\"],\n): boolean => {\n if (!isAuthSnapshotCurrent(account, snapshot)) {\n return false\n }\n\n account.models = models\n return true\n}\n\nexport const applyTokenRefreshSuccessIfCurrent = (\n account: AccountRuntime,\n snapshot: AuthSnapshot,\n token: string,\n): boolean => {\n if (!isAuthSnapshotCurrent(account, snapshot)) {\n return false\n }\n\n account.copilotToken = token\n account.failed = false\n account.failureReason = undefined\n return true\n}\n\nexport const applyTokenRefreshFailureIfCurrent = (\n account: AccountRuntime,\n snapshot: AuthSnapshot,\n error: unknown,\n): boolean => {\n if (!isAuthSnapshotCurrent(account, snapshot)) {\n return false\n }\n\n account.failed = true\n account.failureReason = String(error)\n return true\n}\n\nexport const applyQuotaRefreshSuccessIfCurrent = (\n account: AccountRuntime,\n snapshot: AuthSnapshot,\n result: {\n premium: QuotaDetail\n copilotApiUrl?: string\n },\n): boolean => {\n if (!isAuthSnapshotCurrent(account, snapshot)) {\n return false\n }\n\n const { premium, copilotApiUrl } = result\n\n account.premiumEntitlement = premium.entitlement\n account.premiumRemaining = premium.remaining\n account.unlimited = premium.unlimited\n account.overagePermitted = premium.overage_permitted\n if (copilotApiUrl) {\n account.copilotApiUrl = copilotApiUrl\n }\n account.lastQuotaFetch = Date.now()\n account.failed = false\n account.failureReason = undefined\n return true\n}\n\nexport const setAccountFailedState = (\n account: AccountRuntime,\n reason: string,\n): void => {\n account.failed = true\n account.failureReason = reason\n consola.warn(`Account ${account.id} marked as failed: ${reason}`)\n}\n\nexport const applyUnauthorizedIfCurrent = (\n account: AccountRuntime,\n snapshot: AuthSnapshot,\n reason: string,\n): boolean => {\n if (!isAuthSnapshotCurrent(account, snapshot)) {\n return false\n }\n\n setAccountFailedState(account, reason)\n return true\n}\n","import type { AccountRuntime } from \"~/lib/types/account\"\nimport type { Model } from \"~/services/copilot/get-models\"\n\nexport type QuotaReservation = Readonly<{ id: symbol }>\n\nexport const getCostUnits = (model: Model): number => {\n // Per user decision: missing billing => treat as free (costUnits = 0)\n const billing = model.billing\n if (!billing) {\n return 0\n }\n\n if (billing.is_premium !== true) {\n return 0\n }\n\n const multiplier = billing.multiplier\n if (\n typeof multiplier !== \"number\"\n || !Number.isFinite(multiplier)\n || multiplier <= 0\n ) {\n return 1\n }\n\n return multiplier\n}\n\nexport const getEffectivePremiumRemaining = (\n account: AccountRuntime,\n): number | undefined => {\n if (account.premiumRemaining === undefined) {\n return undefined\n }\n\n const reserved = account.premiumReserved ?? 0\n return account.premiumRemaining - reserved\n}\n\nexport const reservePremiumUnits = (\n account: AccountRuntime,\n units: number,\n): QuotaReservation | undefined => {\n if (units <= 0) {\n return undefined\n }\n\n const id = Symbol(\"quotaReservation\")\n\n if (!account.premiumReservations) {\n account.premiumReservations = new Map()\n }\n\n account.premiumReservations.set(id, units)\n account.premiumReserved = (account.premiumReserved ?? 0) + units\n\n return { id }\n}\n\nexport const releasePremiumReservation = (\n account: AccountRuntime,\n reservation?: QuotaReservation,\n): void => {\n if (!reservation) {\n return\n }\n\n const reservations = account.premiumReservations\n if (!reservations) {\n return\n }\n\n const reservedUnits = reservations.get(reservation.id)\n if (reservedUnits === undefined) {\n return\n }\n\n reservations.delete(reservation.id)\n\n const nextReserved = (account.premiumReserved ?? 0) - reservedUnits\n account.premiumReserved = Math.max(0, nextReserved)\n\n if (reservations.size === 0) {\n account.premiumReservations = undefined\n }\n}\n","/* eslint-disable max-lines */\nimport consola from \"consola\"\nimport fs from \"node:fs\"\n\nimport type {\n AccountContext,\n AccountRuntime,\n AccountType,\n} from \"~/lib/types/account\"\n\nimport {\n AccountAffinityCache,\n buildAffinityCacheKey,\n extractAffinityKey,\n isAffinityAccountUsable,\n type AffinityContext,\n} from \"~/lib/account-affinity\"\nimport { resolveModelAlias } from \"~/lib/config\"\nimport { HTTPError } from \"~/lib/error\"\nimport { getModels, type Model } from \"~/services/copilot/get-models\"\nimport { getCopilotToken } from \"~/services/github/get-copilot-token\"\nimport { getCopilotUsage } from \"~/services/github/get-copilot-usage\"\nimport { getGitHubUser } from \"~/services/github/get-user\"\n\nimport {\n buildIdentityKey,\n createAccountSessionId,\n getCurrentIdentityEnvironment,\n} from \"./account-client-identity\"\nimport {\n applyCopilotTokenIfCurrent,\n applyModelsIfCurrent,\n applyQuotaRefreshSuccessIfCurrent,\n applyTokenRefreshFailureIfCurrent,\n applyTokenRefreshSuccessIfCurrent,\n applyUnauthorizedIfCurrent,\n isAuthSnapshotCurrent,\n isSameAuthSnapshot,\n setAccountFailedState,\n takeAuthSnapshot,\n toAccountContextFromSnapshot,\n type AuthSnapshot,\n} from \"./accounts-manager-auth\"\nimport {\n getCostUnits,\n getEffectivePremiumRemaining,\n releasePremiumReservation,\n reservePremiumUnits,\n type QuotaReservation,\n} from \"./accounts-manager-quota\"\nimport {\n hasLegacyToken,\n hasRegistry,\n ensureAccountClientIdentity,\n listAccountsFromRegistry,\n loadAccountToken,\n readLegacyToken,\n saveAccountToken,\n addAccountToRegistry,\n} from \"./accounts-registry\"\nimport { PATHS } from \"./paths\"\n\n/** Quota cache TTL in milliseconds (45 seconds) for pre-request selection. */\nconst QUOTA_CACHE_TTL = 45 * 1000\n\n/** Debounce delay for registry reload in milliseconds */\nconst RELOAD_DEBOUNCE_MS = 500\n\n/** Registry watcher restart initial delay in milliseconds */\nconst WATCHER_RESTART_INITIAL_DELAY_MS = 1000\n/** Registry watcher restart max delay in milliseconds */\nconst WATCHER_RESTART_MAX_DELAY_MS = 60 * 1000\n/** Session refresh base interval in milliseconds. */\nconst SESSION_REFRESH_BASE_MS = 60 * 60 * 1000\n/** Session refresh jitter window in milliseconds. */\nconst SESSION_REFRESH_JITTER_MS = 20 * 60 * 1000\n\n/** Minimum delay between account initializations in milliseconds. */\nconst INIT_STAGGER_MIN_MS = 2000\n/** Maximum delay between account initializations in milliseconds. */\nconst INIT_STAGGER_MAX_MS = 5000\n/** Random jitter window added to token refresh delay in milliseconds. */\nconst TOKEN_REFRESH_JITTER_MS = 30_000\n\nexport interface AccountRequestCandidate {\n modelId: string\n endpoint: string\n}\n\nexport type { QuotaReservation } from \"./accounts-manager-quota\"\nexport type { AffinityContext } from \"~/lib/account-affinity\"\n\nexport type SelectAccountForRequestFailureReason =\n | \"NO_ACCOUNTS\"\n | \"MODEL_NOT_SUPPORTED\"\n | \"NO_QUOTA\"\n\ntype SelectAccountForRequestSuccess = {\n ok: true\n account: AccountRuntime\n selectedModel: Model\n endpoint: string\n costUnits: number\n reservation?: QuotaReservation\n /** Call after a successful upstream response to persist the affinity mapping. */\n confirmAffinity?: () => void\n /** Whether this selection was served from the affinity cache. */\n affinityHit?: boolean\n /** The cache key used for affinity lookup (e.g. `\"session-1:claude-sonnet-4\"`). */\n affinityCacheKey?: string\n}\n\nexport type SelectAccountForRequestResult =\n | SelectAccountForRequestSuccess\n | {\n ok: false\n reason: SelectAccountForRequestFailureReason\n }\n\n/** Manages multiple GitHub Copilot accounts at runtime. */\nexport class AccountsManager {\n private accounts: Map<string, AccountRuntime> = new Map()\n private accountOrder: Array<string> = []\n private temporaryAccount?: AccountRuntime\n private vsCodeVersion?: string\n private accountAffinityEnabled = true\n private affinityCache = new AccountAffinityCache()\n private loadBalanceCursor = 0\n\n private quotaRefreshSnapshotByAccount = new WeakMap<\n AccountRuntime,\n AuthSnapshot\n >()\n private modelsRefreshSnapshotByAccount = new WeakMap<\n AccountRuntime,\n AuthSnapshot\n >()\n private tokenRefreshEnabledAccounts = new WeakSet<AccountRuntime>()\n private modelsRefreshTimer?: ReturnType<typeof setTimeout>\n private modelsRefreshIntervalMs = 0\n\n // Registry file watcher for hot reload\n private registryWatcher?: fs.FSWatcher\n private reloadDebounceTimer?: ReturnType<typeof setTimeout>\n private registryWatcherRestartTimer?: ReturnType<typeof setTimeout>\n private registryWatcherRestartDelayMs = WATCHER_RESTART_INITIAL_DELAY_MS\n private isReloading = false\n private currentReloadPromise?: Promise<void>\n\n /** Initialize accounts manager (load registry, migrate legacy token). */\n async initialize(vsCodeVersion?: string): Promise<void> {\n this.vsCodeVersion = vsCodeVersion\n\n // Check if we need to migrate legacy token\n const hasReg = await hasRegistry()\n const hasLegacy = await hasLegacyToken()\n\n if (!hasReg && hasLegacy) {\n await this.migrateLegacyToken()\n }\n\n // Load accounts from registry\n const accountMetas = await listAccountsFromRegistry()\n\n for (const meta of accountMetas) {\n const token = await loadAccountToken(meta.id)\n if (!token) {\n consola.warn(`No token found for account ${meta.id}, skipping`)\n continue\n }\n\n const runtime: AccountRuntime = {\n ...meta,\n accountLogin: meta.id,\n githubToken: token,\n vsCodeVersion: this.vsCodeVersion,\n }\n\n this.accounts.set(meta.id, runtime)\n this.accountOrder.push(meta.id)\n }\n\n // Initialize Copilot tokens for all accounts (staggered to avoid burst traffic)\n let isFirstAccount = true\n for (const account of this.accounts.values()) {\n if (!isFirstAccount) {\n const staggerDelay =\n INIT_STAGGER_MIN_MS\n + Math.floor(\n Math.random() * (INIT_STAGGER_MAX_MS - INIT_STAGGER_MIN_MS),\n )\n consola.debug(\n `Staggering initialization of account ${account.id} by ${staggerDelay}ms`,\n )\n await new Promise((resolve) => setTimeout(resolve, staggerDelay))\n }\n isFirstAccount = false\n\n try {\n await this.initializeAccount(account)\n } catch (error) {\n consola.error(`Failed to initialize account ${account.id}:`, error)\n account.failed = true\n account.failureReason = String(error)\n }\n }\n\n consola.info(`Loaded ${this.accounts.size} account(s)`)\n\n // Start watching the registry file for hot reload\n this.startRegistryWatcher()\n }\n\n setAccountAffinityEnabled(enabled: boolean): void {\n this.accountAffinityEnabled = enabled\n if (!enabled) {\n this.affinityCache.clear()\n }\n }\n\n setModelsRefreshIntervalMs(intervalMs: number): void {\n this.modelsRefreshIntervalMs =\n Number.isFinite(intervalMs) && intervalMs > 0 ? intervalMs : 0\n this.scheduleModelsRefresh()\n }\n\n private computeTokenRefreshDelayMs(refreshInSeconds: number): number {\n const baseDelay = Math.max((refreshInSeconds - 60) * 1000, 1000)\n const jitter = Math.floor(Math.random() * TOKEN_REFRESH_JITTER_MS)\n // Ensure the jittered delay doesn't exceed the token's validity window\n const maxSafeDelay = Math.max(refreshInSeconds * 1000 - 1000, 1000)\n return Math.min(baseDelay + jitter, maxSafeDelay)\n }\n\n private computeSessionRefreshDelayMs(): number {\n const randomDelay = Math.floor(Math.random() * SESSION_REFRESH_JITTER_MS)\n return SESSION_REFRESH_BASE_MS + randomDelay\n }\n\n private resolveAccountLogin(account: AccountRuntime): string {\n return account.accountLogin ?? account.id\n }\n\n private commitAccountIdentity(\n account: AccountRuntime,\n {\n identityKey,\n login,\n deviceId,\n machineId,\n }: {\n identityKey: string\n login: string\n deviceId: string\n machineId: string\n },\n ): void {\n account.accountLogin = login\n account.identityKey = identityKey\n account.clientDeviceId = deviceId\n account.clientMachineId = machineId\n }\n\n private async applyAccountIdentity(account: AccountRuntime): Promise<void> {\n const login = this.resolveAccountLogin(account)\n const { oauthApp, enterpriseDomain } = getCurrentIdentityEnvironment()\n const identityKey = buildIdentityKey({\n login,\n oauthApp,\n enterpriseDomain,\n })\n const identity = await ensureAccountClientIdentity({\n login,\n oauthApp,\n enterpriseDomain,\n })\n\n this.commitAccountIdentity(account, {\n identityKey,\n login,\n deviceId: identity.deviceId,\n machineId: identity.machineId,\n })\n\n if (!account.clientSessionId) {\n account.clientSessionId = createAccountSessionId()\n consola.debug(\n `Generated VSCode session ID for account ${account.id}: ${account.clientSessionId}`,\n )\n }\n\n this.startSessionRefresh(account)\n }\n\n private shouldContinueTokenRefresh(\n account: AccountRuntime,\n snapshot: AuthSnapshot,\n ): boolean {\n return (\n this.tokenRefreshEnabledAccounts.has(account)\n && isAuthSnapshotCurrent(account, snapshot)\n )\n }\n\n private async runTokenRefreshTick(\n account: AccountRuntime,\n snapshot: AuthSnapshot,\n refreshInSeconds: number,\n ): Promise<void> {\n if (!this.shouldContinueTokenRefresh(account, snapshot)) {\n return\n }\n\n try {\n const ctx = toAccountContextFromSnapshot(account, snapshot)\n const { token, refresh_in } = await getCopilotToken(ctx)\n\n if (!this.shouldContinueTokenRefresh(account, snapshot)) {\n return\n }\n\n const applied = applyTokenRefreshSuccessIfCurrent(\n account,\n snapshot,\n token,\n )\n if (!applied) {\n return\n }\n\n consola.debug(`Refreshed token for account ${account.id}`)\n\n // Schedule next refresh using the new refresh interval.\n if (!this.shouldContinueTokenRefresh(account, snapshot)) {\n return\n }\n this.startTokenRefresh(account, refresh_in)\n } catch (error) {\n consola.error(`Failed to refresh token for ${account.id}:`, error)\n\n if (!this.shouldContinueTokenRefresh(account, snapshot)) {\n return\n }\n\n applyTokenRefreshFailureIfCurrent(account, snapshot, error)\n\n // Retry using the previous refresh interval (best effort).\n if (!this.shouldContinueTokenRefresh(account, snapshot)) {\n return\n }\n this.startTokenRefresh(account, refreshInSeconds)\n }\n }\n\n private finalizeQuotaRefreshPromise(\n account: AccountRuntime,\n promise: Promise<void>,\n ): void {\n if (account.quotaRefreshPromise !== promise) {\n return\n }\n\n account.isRefreshingQuota = false\n account.quotaRefreshPromise = undefined\n this.quotaRefreshSnapshotByAccount.delete(account)\n }\n\n /** Initialize a single account. */\n private async initializeAccount(account: AccountRuntime): Promise<void> {\n await this.applyAccountIdentity(account)\n const snapshot = takeAuthSnapshot(account)\n\n try {\n // Get Copilot token\n const tokenCtx = toAccountContextFromSnapshot(account, snapshot)\n const { token, refresh_in } = await getCopilotToken(tokenCtx)\n\n if (!applyCopilotTokenIfCurrent(account, snapshot, token)) {\n return\n }\n\n // Resolve the account-specific Copilot endpoint before the first models fetch.\n await this.refreshQuota(account)\n\n // Start token refresh timer\n this.startTokenRefresh(account, refresh_in)\n\n // Get models\n const modelsCtx = toAccountContextFromSnapshot(account, snapshot, token)\n const models = await getModels(modelsCtx)\n\n if (!applyModelsIfCurrent(account, snapshot, models)) {\n return\n }\n account.lastModelsFetch = Date.now()\n\n consola.debug(`Account ${account.id} initialized`)\n } catch (error) {\n // Ignore stale results if registry hot reload changed auth.\n if (!isAuthSnapshotCurrent(account, snapshot)) {\n return\n }\n\n throw error\n }\n }\n\n /** Migrate legacy github_token to the new multi-account system. */\n private async migrateLegacyToken(): Promise<void> {\n const token = await readLegacyToken()\n if (!token) return\n\n try {\n // Get user info to determine the account ID\n const user = await getGitHubUser({\n githubToken: token,\n accountType: \"individual\",\n })\n const id = user.login\n\n // Save token to new location\n await saveAccountToken(id, token)\n\n // Add to registry\n await addAccountToRegistry({\n id,\n accountType: \"individual\",\n addedAt: Date.now(),\n })\n\n consola.info(`Migrated legacy token to account: ${id}`)\n } catch (error) {\n consola.error(\"Failed to migrate legacy token:\", error)\n }\n }\n\n /** Start token refresh timer for an account. */\n private startTokenRefresh(\n account: AccountRuntime,\n refreshInSeconds: number,\n ): void {\n // Stop existing timer if any\n this.stopTokenRefresh(account)\n\n this.tokenRefreshEnabledAccounts.add(account)\n\n const snapshot = takeAuthSnapshot(account)\n const delayMs = this.computeTokenRefreshDelayMs(refreshInSeconds)\n\n account.refreshTimer = setTimeout(() => {\n void this.runTokenRefreshTick(account, snapshot, refreshInSeconds)\n }, delayMs)\n }\n\n /** Stop token refresh timer for an account. */\n private stopTokenRefresh(account: AccountRuntime): void {\n this.tokenRefreshEnabledAccounts.delete(account)\n\n if (account.refreshTimer) {\n clearTimeout(account.refreshTimer)\n account.refreshTimer = undefined\n }\n }\n\n /** Stop all token refresh timers. */\n private stopAllTokenRefresh(): void {\n for (const account of this.accounts.values()) {\n this.stopTokenRefresh(account)\n }\n if (this.temporaryAccount) {\n this.stopTokenRefresh(this.temporaryAccount)\n }\n }\n\n private startSessionRefresh(account: AccountRuntime): void {\n this.stopSessionRefresh(account)\n\n const delayMs = this.computeSessionRefreshDelayMs()\n consola.debug(\n `Scheduling next VSCode session ID refresh for ${account.id} in ${Math.round(\n delayMs / 1000,\n )} seconds`,\n )\n\n account.sessionRefreshTimer = setTimeout(() => {\n try {\n account.clientSessionId = createAccountSessionId()\n consola.debug(\n `Refreshed VSCode session ID for account ${account.id}: ${account.clientSessionId}`,\n )\n } catch (error) {\n consola.error(\n `Failed to refresh VSCode session ID for ${account.id}, rescheduling...`,\n error,\n )\n } finally {\n this.startSessionRefresh(account)\n }\n }, delayMs)\n }\n\n private stopSessionRefresh(account: AccountRuntime): void {\n if (account.sessionRefreshTimer) {\n clearTimeout(account.sessionRefreshTimer)\n account.sessionRefreshTimer = undefined\n }\n }\n\n private stopAllSessionRefresh(): void {\n for (const account of this.accounts.values()) {\n this.stopSessionRefresh(account)\n }\n\n if (this.temporaryAccount) {\n this.stopSessionRefresh(this.temporaryAccount)\n }\n }\n\n private scheduleModelsRefresh(): void {\n this.stopModelsRefresh()\n\n if (!this.modelsRefreshIntervalMs || this.modelsRefreshIntervalMs <= 0) {\n return\n }\n\n this.modelsRefreshTimer = setTimeout(() => {\n void this.runModelsRefreshTick()\n }, this.modelsRefreshIntervalMs)\n }\n\n private stopModelsRefresh(): void {\n if (this.modelsRefreshTimer) {\n clearTimeout(this.modelsRefreshTimer)\n this.modelsRefreshTimer = undefined\n }\n }\n\n private async runModelsRefreshTick(): Promise<void> {\n try {\n await this.refreshAllModels()\n } catch (error) {\n consola.error(\"Failed to refresh models:\", error)\n } finally {\n this.scheduleModelsRefresh()\n }\n }\n\n private finalizeModelsRefreshPromise(\n account: AccountRuntime,\n promise: Promise<void>,\n ): void {\n if (account.modelsRefreshPromise !== promise) {\n return\n }\n\n account.isRefreshingModels = false\n account.modelsRefreshPromise = undefined\n this.modelsRefreshSnapshotByAccount.delete(account)\n }\n\n private async refreshModels(account: AccountRuntime): Promise<void> {\n if (!account.copilotToken) {\n consola.debug(\n `Skip model refresh for ${account.id}: missing Copilot token`,\n )\n return\n }\n\n const snapshot = takeAuthSnapshot(account)\n\n if (account.modelsRefreshPromise) {\n const existingSnapshot = this.modelsRefreshSnapshotByAccount.get(account)\n if (isSameAuthSnapshot(existingSnapshot, snapshot)) {\n await account.modelsRefreshPromise\n return\n }\n }\n\n account.isRefreshingModels = true\n\n const ctx = toAccountContextFromSnapshot(\n account,\n snapshot,\n account.copilotToken,\n )\n\n const promise = (async () => {\n try {\n const models = await getModels(ctx)\n const applied = applyModelsIfCurrent(account, snapshot, models)\n if (applied) {\n account.lastModelsFetch = Date.now()\n }\n } catch (error) {\n if (error instanceof HTTPError && error.response.status === 401) {\n applyUnauthorizedIfCurrent(account, snapshot, \"Unauthorized (401)\")\n return\n }\n\n consola.error(`Failed to refresh models for ${account.id}:`, error)\n }\n })()\n\n account.modelsRefreshPromise = promise\n this.modelsRefreshSnapshotByAccount.set(account, snapshot)\n\n void promise.finally(() => {\n this.finalizeModelsRefreshPromise(account, promise)\n })\n\n await promise\n }\n\n private async refreshAllModels(): Promise<void> {\n const accounts: Array<AccountRuntime> = []\n\n if (this.temporaryAccount) {\n accounts.push(this.temporaryAccount)\n }\n\n for (const id of this.accountOrder) {\n const account = this.accounts.get(id)\n if (account) {\n accounts.push(account)\n }\n }\n\n if (accounts.length === 0) {\n return\n }\n\n await Promise.allSettled(\n accounts.map((account) => this.refreshModels(account)),\n )\n }\n\n /** Refresh quota information for an account. */\n async refreshQuota(account: AccountRuntime): Promise<void> {\n const snapshot = takeAuthSnapshot(account)\n\n if (account.quotaRefreshPromise) {\n const existingSnapshot = this.quotaRefreshSnapshotByAccount.get(account)\n if (isSameAuthSnapshot(existingSnapshot, snapshot)) {\n await account.quotaRefreshPromise\n return\n }\n }\n\n account.isRefreshingQuota = true\n\n const ctx = toAccountContextFromSnapshot(account, snapshot)\n const promise = (async () => {\n try {\n const usage = await getCopilotUsage(ctx)\n const premium = usage.quota_snapshots.premium_interactions\n applyQuotaRefreshSuccessIfCurrent(account, snapshot, {\n premium,\n copilotApiUrl: usage.endpoints.api,\n })\n } catch (error) {\n if (error instanceof HTTPError && error.response.status === 401) {\n applyUnauthorizedIfCurrent(account, snapshot, \"Unauthorized (401)\")\n return\n }\n\n consola.error(`Failed to refresh quota for ${account.id}:`, error)\n // Don't mark as failed for non-401 quota refresh errors\n }\n })()\n\n account.quotaRefreshPromise = promise\n this.quotaRefreshSnapshotByAccount.set(account, snapshot)\n\n void promise.finally(() => {\n this.finalizeQuotaRefreshPromise(account, promise)\n })\n\n await promise\n }\n\n /** Check if quota cache is expired. */\n private isQuotaCacheExpired(account: AccountRuntime): boolean {\n if (!account.lastQuotaFetch) return true\n return Date.now() - account.lastQuotaFetch > QUOTA_CACHE_TTL\n }\n\n private isAccountFailed(account: AccountRuntime): boolean {\n return account.failed === true\n }\n\n private useOverageFallback(fallback: {\n account: AccountRuntime\n model: Model\n endpoint: string\n costUnits: number\n }): SelectAccountForRequestSuccess {\n const reservation = reservePremiumUnits(\n fallback.account,\n fallback.costUnits,\n )\n return {\n ok: true,\n account: fallback.account,\n selectedModel: fallback.model,\n endpoint: fallback.endpoint,\n costUnits: fallback.costUnits,\n reservation,\n }\n }\n\n private isModelSupportedForEndpoint(model: Model, endpoint: string): boolean {\n if (endpoint === \"/responses\") {\n return model.supported_endpoints?.includes(endpoint) ?? false\n }\n\n const supported = model.supported_endpoints\n if (!supported) {\n return true\n }\n\n return supported.includes(endpoint)\n }\n\n private pickSupportedCandidate(\n account: AccountRuntime,\n candidates: Array<AccountRequestCandidate>,\n ): { candidate: AccountRequestCandidate; model: Model } | null {\n const models = account.models?.data\n if (!models) {\n return null\n }\n\n for (const candidate of candidates) {\n const model = models.find((m) => m.id === candidate.modelId)\n if (!model) {\n continue\n }\n\n if (!this.isModelSupportedForEndpoint(model, candidate.endpoint)) {\n continue\n }\n\n return { candidate, model }\n }\n\n return null\n }\n\n private async selectAccountForCandidates(\n orderedAccounts: Array<AccountRuntime>,\n candidates: Array<AccountRequestCandidate>,\n ): Promise<SelectAccountForRequestResult> {\n if (orderedAccounts.length === 0) {\n return { ok: false, reason: \"NO_ACCOUNTS\" }\n }\n\n let supportedCandidateFound = false\n let overageFallback:\n | {\n account: AccountRuntime\n model: Model\n endpoint: string\n costUnits: number\n }\n | undefined\n\n for (const account of orderedAccounts) {\n if (this.isAccountFailed(account)) {\n continue\n }\n\n const supported = this.pickSupportedCandidate(account, candidates)\n if (!supported) {\n continue\n }\n\n supportedCandidateFound = true\n\n const { candidate, model } = supported\n const costUnits = getCostUnits(model)\n\n if (costUnits <= 0) {\n // Free model: sequential routing (first available account).\n // When account affinity is enabled, the caller (selectAccountForRequest)\n // handles cache lookup/write-back; this path only runs on cache miss.\n return {\n ok: true,\n account,\n selectedModel: model,\n endpoint: candidate.endpoint,\n costUnits,\n }\n }\n\n if (!account.unlimited && this.isQuotaCacheExpired(account)) {\n await this.refreshQuota(account)\n }\n\n if (this.isAccountFailed(account)) {\n continue\n }\n\n if (account.unlimited) {\n return {\n ok: true,\n account,\n selectedModel: model,\n endpoint: candidate.endpoint,\n costUnits,\n }\n }\n\n // Check if account has sufficient quota.\n const effectiveRemaining = getEffectivePremiumRemaining(account)\n if (effectiveRemaining !== undefined && effectiveRemaining < costUnits) {\n // Insufficient quota - store as overage fallback if permitted, but keep\n // looking for accounts with quota to avoid unnecessary overage charges.\n if (account.overagePermitted && !overageFallback) {\n overageFallback = {\n account,\n model,\n endpoint: candidate.endpoint,\n costUnits,\n }\n }\n continue\n }\n\n const reservation = reservePremiumUnits(account, costUnits)\n\n return {\n ok: true,\n account,\n selectedModel: model,\n endpoint: candidate.endpoint,\n costUnits,\n reservation,\n }\n }\n\n if (!supportedCandidateFound) {\n return { ok: false, reason: \"MODEL_NOT_SUPPORTED\" }\n }\n\n // No account with quota found - use overage fallback if available.\n return overageFallback ?\n this.useOverageFallback(overageFallback)\n : { ok: false, reason: \"NO_QUOTA\" }\n }\n\n /**\n * Try to use a preferred (affinity) account for the request.\n * Returns a successful selection if the account is usable; null otherwise.\n */\n\n private async tryAffinityAccount(\n preferredAccountId: string,\n orderedAccounts: Array<AccountRuntime>,\n candidates: Array<AccountRequestCandidate>,\n ): Promise<SelectAccountForRequestSuccess | null> {\n const account = isAffinityAccountUsable(preferredAccountId, orderedAccounts)\n if (!account) {\n return null\n }\n\n // Try original candidates first, then alias-resolved candidates.\n const supported =\n this.pickSupportedCandidate(account, candidates)\n ?? this.pickAliasFallbackCandidate(account, candidates)\n if (!supported) {\n return null\n }\n\n return this.validateAffinityQuota(account, supported)\n }\n\n /**\n * Resolve model aliases and try to pick a supported candidate.\n * Returns null if no alias differs or the account doesn't support the alias.\n */\n private pickAliasFallbackCandidate(\n account: AccountRuntime,\n candidates: Array<AccountRequestCandidate>,\n ): { candidate: AccountRequestCandidate; model: Model } | null {\n const aliasCandidates = candidates.map((candidate) => {\n const modelId = resolveModelAlias(candidate.modelId)\n if (modelId === candidate.modelId) return candidate\n return { ...candidate, modelId }\n })\n const aliasChanged = aliasCandidates.some(\n (candidate, index) => candidate.modelId !== candidates[index].modelId,\n )\n if (!aliasChanged) return null\n\n return this.pickSupportedCandidate(account, aliasCandidates)\n }\n\n /**\n * Validate quota for an affinity candidate. Free models pass immediately;\n * premium models go through quota refresh / reservation.\n */\n private async validateAffinityQuota(\n account: AccountRuntime,\n supported: { candidate: AccountRequestCandidate; model: Model },\n ): Promise<SelectAccountForRequestSuccess | null> {\n const { candidate, model } = supported\n const costUnits = getCostUnits(model)\n\n // Free model — no quota checks needed.\n if (costUnits <= 0) {\n return {\n ok: true,\n account,\n selectedModel: model,\n endpoint: candidate.endpoint,\n costUnits,\n }\n }\n\n // Premium model — validate quota.\n if (!account.unlimited && this.isQuotaCacheExpired(account)) {\n await this.refreshQuota(account)\n }\n\n if (this.isAccountFailed(account)) {\n return null\n }\n\n if (account.unlimited) {\n return {\n ok: true,\n account,\n selectedModel: model,\n endpoint: candidate.endpoint,\n costUnits,\n }\n }\n\n const effectiveRemaining = getEffectivePremiumRemaining(account)\n if (effectiveRemaining !== undefined && effectiveRemaining < costUnits) {\n return null\n }\n\n const reservation = reservePremiumUnits(account, costUnits)\n\n return {\n ok: true,\n account,\n selectedModel: model,\n endpoint: candidate.endpoint,\n costUnits,\n reservation,\n }\n }\n\n /**\n * Select an available account for a specific request (model + endpoint).\n * When account affinity is enabled, routes to the previously successful account\n * for the same affinity key + model combination.\n * Uses reservation to avoid oversubscribing premium quota under concurrency.\n */\n async selectAccountForRequest(\n candidates: Array<AccountRequestCandidate>,\n affinityContext?: AffinityContext,\n ): Promise<SelectAccountForRequestResult> {\n if (candidates.length === 0) {\n throw new Error(\"selectAccountForRequest requires at least one candidate\")\n }\n\n const orderedAccounts = [\n ...(this.temporaryAccount ? [this.temporaryAccount] : []),\n ...this.accountOrder\n .map((id) => this.accounts.get(id))\n .filter((account): account is AccountRuntime => account !== undefined),\n ]\n\n // Resolve the affinity key once — reused for both lookup and write-back.\n const affinityKey =\n this.accountAffinityEnabled && affinityContext ?\n extractAffinityKey(affinityContext)\n : undefined\n\n const modelKey = candidates[0].modelId\n const cacheKey =\n affinityKey ? buildAffinityCacheKey(affinityKey, modelKey) : undefined\n\n // Step 1: Try the preferred (affinity) account.\n if (cacheKey) {\n const preferredId = this.affinityCache.get(cacheKey)\n if (preferredId) {\n const affinityResult = await this.tryAffinityAccount(\n preferredId,\n orderedAccounts,\n candidates,\n )\n if (affinityResult) {\n affinityResult.affinityHit = true\n affinityResult.affinityCacheKey = cacheKey\n affinityResult.confirmAffinity = () => {\n if (!this.accountAffinityEnabled) return\n this.affinityCache.set(cacheKey, affinityResult.account.id)\n }\n return affinityResult\n }\n }\n }\n\n // Step 2: Cache miss — rotate accounts for load balancing when affinity is enabled.\n const accountsForSelection =\n this.accountAffinityEnabled && orderedAccounts.length > 1 ?\n this.rotateAccounts(orderedAccounts)\n : orderedAccounts\n\n const result = await this.selectWithAliasFallback(\n accountsForSelection,\n candidates,\n )\n\n if (result.ok) {\n this.loadBalanceCursor++\n }\n\n // Attach confirmAffinity callback so the handler can persist the mapping on success.\n if (result.ok && cacheKey) {\n const successResult = result\n successResult.confirmAffinity = () => {\n if (!this.accountAffinityEnabled) return\n this.affinityCache.set(cacheKey, successResult.account.id)\n }\n }\n\n return result\n }\n\n /**\n * Rotate the accounts array by the current load-balance cursor for round-robin distribution.\n * This ensures cache-miss requests are spread across accounts instead of always hitting the first.\n */\n private rotateAccounts(\n accounts: Array<AccountRuntime>,\n ): Array<AccountRuntime> {\n const start = this.loadBalanceCursor % accounts.length\n if (start === 0) return accounts\n return [...accounts.slice(start), ...accounts.slice(0, start)]\n }\n\n /**\n * Normal account selection with alias fallback.\n * Extracted to keep selectAccountForRequest readable after adding affinity logic.\n */\n private async selectWithAliasFallback(\n orderedAccounts: Array<AccountRuntime>,\n candidates: Array<AccountRequestCandidate>,\n ): Promise<SelectAccountForRequestResult> {\n const primary = await this.selectAccountForCandidates(\n orderedAccounts,\n candidates,\n )\n if (primary.ok || primary.reason !== \"MODEL_NOT_SUPPORTED\") {\n return primary\n }\n\n const aliasCandidates = candidates.map((candidate) => {\n const modelId = resolveModelAlias(candidate.modelId)\n if (modelId === candidate.modelId) return candidate\n return { ...candidate, modelId }\n })\n const aliasChanged = aliasCandidates.some(\n (candidate, index) => candidate.modelId !== candidates[index].modelId,\n )\n if (!aliasChanged) {\n return primary\n }\n\n return this.selectAccountForCandidates(orderedAccounts, aliasCandidates)\n }\n\n /**\n * Finalize quota after a request completes.\n * This releases any in-flight reservation and refreshes the actual quota from the API.\n */\n async finalizeQuota(\n account: AccountRuntime,\n reservation?: QuotaReservation,\n ): Promise<void> {\n releasePremiumReservation(account, reservation)\n\n try {\n await this.refreshQuota(account)\n } catch (error) {\n consola.debug(`Failed to finalize quota for ${account.id}:`, error)\n }\n }\n\n /**\n * Mark an account as failed.\n */\n markAccountFailed(id: string, reason: string): void {\n const account = this.accounts.get(id)\n if (account) {\n setAccountFailedState(account, reason)\n return\n }\n\n if (this.temporaryAccount && this.temporaryAccount.id === id) {\n setAccountFailedState(this.temporaryAccount, reason)\n }\n }\n\n /**\n * Get status of all accounts.\n */\n getAccountStatus(): Array<{\n id: string\n entitlement?: number\n remaining?: number\n unlimited?: boolean\n overagePermitted?: boolean\n failed?: boolean\n failureReason?: string\n }> {\n const statuses: Array<{\n id: string\n entitlement?: number\n remaining?: number\n unlimited?: boolean\n overagePermitted?: boolean\n failed?: boolean\n failureReason?: string\n }> = []\n\n if (this.temporaryAccount) {\n statuses.push({\n id: \"(temporary)\",\n entitlement: this.temporaryAccount.premiumEntitlement,\n remaining: this.temporaryAccount.premiumRemaining,\n unlimited: this.temporaryAccount.unlimited,\n overagePermitted: this.temporaryAccount.overagePermitted,\n failed: this.temporaryAccount.failed,\n failureReason: this.temporaryAccount.failureReason,\n })\n }\n\n for (const id of this.accountOrder) {\n const account = this.accounts.get(id)\n if (account) {\n statuses.push({\n id: account.id,\n entitlement: account.premiumEntitlement,\n remaining: account.premiumRemaining,\n unlimited: account.unlimited,\n overagePermitted: account.overagePermitted,\n failed: account.failed,\n failureReason: account.failureReason,\n })\n }\n }\n\n return statuses\n }\n\n /**\n * Set a temporary account from a GitHub token (--github-token).\n * This account takes priority over registered accounts.\n */\n async setTemporaryAccount(\n githubToken: string,\n accountType: AccountType,\n ): Promise<void> {\n const user = await getGitHubUser({ githubToken, accountType })\n\n if (this.temporaryAccount) {\n this.stopTokenRefresh(this.temporaryAccount)\n this.stopSessionRefresh(this.temporaryAccount)\n }\n\n const runtime: AccountRuntime = {\n id: \"(temporary)\",\n accountLogin: user.login,\n accountType,\n addedAt: Date.now(),\n githubToken,\n vsCodeVersion: this.vsCodeVersion,\n }\n\n try {\n await this.initializeAccount(runtime)\n this.temporaryAccount = runtime\n consola.info(\"Temporary account initialized\")\n } catch (error) {\n consola.error(\"Failed to initialize temporary account:\", error)\n throw error\n }\n }\n\n /**\n * Check if any accounts are available.\n */\n hasAccounts(): boolean {\n return this.accounts.size > 0 || this.temporaryAccount !== undefined\n }\n\n /**\n * Get the first available account's models.\n * Used for caching models in legacy compatibility mode.\n */\n getFirstAccountModels(): AccountRuntime[\"models\"] {\n if (this.temporaryAccount?.models) {\n return this.temporaryAccount.models\n }\n\n for (const id of this.accountOrder) {\n const account = this.accounts.get(id)\n if (account?.models) {\n return account.models\n }\n }\n\n return undefined\n }\n\n /**\n * Get account context by index.\n * Index 0 is the temporary account (if exists), otherwise the first registered account.\n * Returns null if index is out of bounds.\n */\n getAccountContextByIndex(index: number): AccountContext | null {\n // Build the same order as getAccountStatus()\n const allAccounts: Array<AccountRuntime> = []\n\n if (this.temporaryAccount) {\n allAccounts.push(this.temporaryAccount)\n }\n\n for (const id of this.accountOrder) {\n const account = this.accounts.get(id)\n if (account) {\n allAccounts.push(account)\n }\n }\n\n if (index < 0 || index >= allAccounts.length) {\n return null\n }\n\n return this.toAccountContext(allAccounts[index])\n }\n\n /**\n * Get the total number of accounts (including temporary).\n */\n getAccountCount(): number {\n return (this.temporaryAccount ? 1 : 0) + this.accountOrder.length\n }\n\n /**\n * Convert AccountRuntime to AccountContext for service calls.\n */\n private toAccountContext(account: AccountRuntime): AccountContext {\n return {\n accountLogin: account.accountLogin,\n githubToken: account.githubToken,\n copilotToken: account.copilotToken,\n ...(account.copilotApiUrl !== undefined ?\n { copilotApiUrl: account.copilotApiUrl }\n : {}),\n accountType: account.accountType,\n vsCodeVersion: account.vsCodeVersion,\n clientDeviceId: account.clientDeviceId,\n clientMachineId: account.clientMachineId,\n clientSessionId: account.clientSessionId,\n }\n }\n\n /**\n * Start watching the registry file for changes.\n * Enables hot reload of accounts when the file is modified.\n */\n private startRegistryWatcher(): void {\n // Stop existing watcher if any\n this.stopRegistryWatcher()\n\n try {\n this.registryWatcher = fs.watch(\n PATHS.ACCOUNTS_REGISTRY_PATH,\n (eventType) => {\n // Only react to 'change' events (file content modified)\n if (eventType === \"change\") {\n this.scheduleReload()\n }\n },\n )\n\n // Successful start: reset restart backoff.\n this.registryWatcherRestartDelayMs = WATCHER_RESTART_INITIAL_DELAY_MS\n if (this.registryWatcherRestartTimer) {\n clearTimeout(this.registryWatcherRestartTimer)\n this.registryWatcherRestartTimer = undefined\n }\n\n // Handle watcher errors (e.g., file deleted)\n this.registryWatcher.on(\"error\", (error) => {\n consola.debug(\"Registry watcher error:\", error)\n\n const delayMs = this.registryWatcherRestartDelayMs\n this.registryWatcherRestartDelayMs = Math.min(\n this.registryWatcherRestartDelayMs * 2,\n WATCHER_RESTART_MAX_DELAY_MS,\n )\n\n // Close broken watcher to avoid repeated error events.\n this.stopRegistryWatcher()\n\n // Try to restart the watcher after a delay (with backoff)\n this.registryWatcherRestartTimer = setTimeout(() => {\n this.registryWatcherRestartTimer = undefined\n this.startRegistryWatcher()\n }, delayMs)\n\n consola.debug(`Restarting registry watcher in ${delayMs}ms`)\n })\n\n consola.debug(\"Started registry file watcher\")\n } catch (error) {\n consola.warn(\"Failed to start registry watcher:\", error)\n }\n }\n\n /**\n * Immediately reload the registry, bypassing the debounce delay.\n * If a reload is already running, waits for it to complete and then\n * runs another reload to ensure the latest changes are captured.\n */\n async reloadRegistryNow(): Promise<void> {\n if (this.reloadDebounceTimer) {\n clearTimeout(this.reloadDebounceTimer)\n this.reloadDebounceTimer = undefined\n }\n // Wait for any in-progress reload before starting a fresh one\n if (this.currentReloadPromise) {\n await this.currentReloadPromise\n }\n await this.reloadRegistry()\n }\n\n /**\n * Schedule a registry reload with debouncing.\n */\n private scheduleReload(): void {\n // Clear existing timer\n if (this.reloadDebounceTimer) {\n clearTimeout(this.reloadDebounceTimer)\n }\n\n // Schedule reload after debounce delay\n this.reloadDebounceTimer = setTimeout(() => {\n void this.reloadRegistry()\n }, RELOAD_DEBOUNCE_MS)\n }\n\n /**\n * Reload the registry and perform incremental updates.\n * Adds new accounts, removes deleted ones, and reinitializes existing accounts\n * when token/accountType changes.\n */\n private async reloadRegistry(): Promise<void> {\n // Prevent concurrent reloads\n if (this.isReloading) {\n return\n }\n this.isReloading = true\n\n this.currentReloadPromise = (async () => {\n try {\n const newMetas = await listAccountsFromRegistry()\n const newIds = new Set(newMetas.map((m) => m.id))\n const currentIds = new Set(this.accountOrder)\n\n // Track changes for logging\n const added: Array<string> = []\n const removed: Array<string> = []\n const updated: Array<string> = []\n\n this.removeDeletedAccounts(currentIds, newIds, removed)\n\n // Add new accounts (newIds - currentIds)\n for (const meta of newMetas) {\n if (!currentIds.has(meta.id)) {\n await this.addNewAccount(meta, added)\n }\n }\n\n // Update existing accounts when meta/token changed\n await this.reinitializeUpdatedAccounts(newMetas, currentIds, updated)\n\n // Update accountOrder to reflect new order\n this.accountOrder = newMetas\n .map((m) => m.id)\n .filter((id) => this.accounts.has(id))\n\n // Reset load-balance cursor on account list/order changes.\n this.loadBalanceCursor = 0\n\n this.logRegistryReloadChanges(added, removed, updated)\n } catch (error) {\n consola.error(\"Failed to reload registry:\", error)\n this.shutdown()\n process.exit(1)\n } finally {\n this.isReloading = false\n this.currentReloadPromise = undefined\n }\n })()\n\n await this.currentReloadPromise\n }\n\n private removeDeletedAccounts(\n currentIds: Set<string>,\n newIds: Set<string>,\n removed: Array<string>,\n ): void {\n for (const id of currentIds) {\n if (!newIds.has(id)) {\n const account = this.accounts.get(id)\n if (!account) {\n continue\n }\n\n this.stopTokenRefresh(account)\n this.stopSessionRefresh(account)\n this.accounts.delete(id)\n removed.push(id)\n }\n }\n }\n\n private async reinitializeUpdatedAccounts(\n newMetas: Array<{ id: string; accountType: AccountType; addedAt: number }>,\n currentIds: Set<string>,\n updated: Array<string>,\n ): Promise<void> {\n for (const meta of newMetas) {\n if (!currentIds.has(meta.id)) {\n continue\n }\n\n const account = this.accounts.get(meta.id)\n if (!account) {\n continue\n }\n\n const token = await loadAccountToken(meta.id)\n if (!token) {\n consola.warn(`No token found for account ${meta.id}, skipping update`)\n continue\n }\n\n const accountTypeChanged = account.accountType !== meta.accountType\n const tokenChanged = account.githubToken !== token\n const addedAtChanged = account.addedAt !== meta.addedAt\n\n // Keep runtime metadata in sync with the registry.\n if (accountTypeChanged) {\n account.accountType = meta.accountType\n }\n if (addedAtChanged) {\n account.addedAt = meta.addedAt\n }\n account.accountLogin = meta.id\n if (tokenChanged) {\n account.githubToken = token\n }\n\n if (!accountTypeChanged && !tokenChanged) {\n continue\n }\n\n try {\n await this.initializeAccount(account)\n updated.push(meta.id)\n } catch (error) {\n consola.error(\n `Failed to reinitialize account ${meta.id} after update:`,\n error,\n )\n account.failed = true\n account.failureReason = String(error)\n updated.push(`${meta.id} (failed)`)\n }\n }\n }\n\n private logRegistryReloadChanges(\n added: Array<string>,\n removed: Array<string>,\n updated: Array<string>,\n ): void {\n if (added.length === 0 && removed.length === 0 && updated.length === 0) {\n return\n }\n\n const changes: Array<string> = []\n if (added.length > 0) {\n changes.push(`added: ${added.join(\", \")}`)\n }\n if (removed.length > 0) {\n changes.push(`removed: ${removed.join(\", \")}`)\n }\n if (updated.length > 0) {\n changes.push(`updated: ${updated.join(\", \")}`)\n }\n\n consola.info(\n `Registry reloaded (${changes.join(\"; \")}). Total: ${this.accounts.size} account(s)`,\n )\n }\n\n /**\n * Helper to add a new account during reload.\n */\n private async addNewAccount(\n meta: { id: string; accountType: AccountType; addedAt: number },\n added: Array<string>,\n ): Promise<void> {\n const token = await loadAccountToken(meta.id)\n if (!token) {\n consola.warn(`No token found for new account ${meta.id}, skipping`)\n return\n }\n\n const runtime: AccountRuntime = {\n ...meta,\n accountLogin: meta.id,\n githubToken: token,\n vsCodeVersion: this.vsCodeVersion,\n }\n\n try {\n await this.initializeAccount(runtime)\n this.accounts.set(meta.id, runtime)\n added.push(meta.id)\n } catch (error) {\n consola.error(`Failed to initialize new account ${meta.id}:`, error)\n runtime.failed = true\n runtime.failureReason = String(error)\n this.accounts.set(meta.id, runtime)\n added.push(`${meta.id} (failed)`)\n }\n }\n\n /**\n * Stop the registry file watcher.\n */\n private stopRegistryWatcher(): void {\n if (this.reloadDebounceTimer) {\n clearTimeout(this.reloadDebounceTimer)\n this.reloadDebounceTimer = undefined\n }\n if (this.registryWatcherRestartTimer) {\n clearTimeout(this.registryWatcherRestartTimer)\n this.registryWatcherRestartTimer = undefined\n }\n if (this.registryWatcher) {\n this.registryWatcher.close()\n this.registryWatcher = undefined\n }\n }\n\n /**\n * Shutdown the manager and clean up resources.\n */\n shutdown(): void {\n this.stopRegistryWatcher()\n this.stopAllTokenRefresh()\n this.stopAllSessionRefresh()\n this.stopModelsRefresh()\n this.affinityCache.clear()\n this.loadBalanceCursor = 0\n this.accounts.clear()\n this.accountOrder = []\n this.temporaryAccount = undefined\n }\n}\n\n/** Singleton instance of AccountsManager */\nexport const accountsManager = new AccountsManager()\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-content:"";--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-amber-500:oklch(76.9% .188 70.08);--color-green-500:oklch(72.3% .219 149.579);--color-emerald-500:oklch(69.6% .17 162.48);--color-neutral-300:oklch(87% 0 0);--color-neutral-400:oklch(70.8% 0 0);--color-neutral-700:oklch(37.1% 0 0);--color-neutral-800:oklch(26.9% 0 0);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wider:.05em;--leading-tight:1.25;--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0,0,.2,1)infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){*{outline-color:color-mix(in oklab,var(--ring)50%,transparent)}}body{background-color:var(--background);color:var(--foreground)}}@layer components;@layer utilities{.\@container\/card-header{container:card-header/inline-size}.\[container-type\:inline-size\]{container-type:inline-size}.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing)*0)}.inset-px{inset:1px}.inset-x-0{inset-inline:calc(var(--spacing)*0)}.inset-y-0{inset-block:calc(var(--spacing)*0)}.top-0{top:calc(var(--spacing)*0)}.top-1\/2{top:50%}.top-4{top:calc(var(--spacing)*4)}.top-6{top:calc(var(--spacing)*6)}.top-\[50\%\]{top:50%}.right-0{right:calc(var(--spacing)*0)}.right-2{right:calc(var(--spacing)*2)}.right-4{right:calc(var(--spacing)*4)}.right-6{right:calc(var(--spacing)*6)}.bottom-0{bottom:calc(var(--spacing)*0)}.bottom-6{bottom:calc(var(--spacing)*6)}.left-0{left:calc(var(--spacing)*0)}.left-2\.5{left:calc(var(--spacing)*2.5)}.left-\[50\%\]{left:50%}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.col-span-3{grid-column:span 3/span 3}.col-start-2{grid-column-start:2}.row-span-2{grid-row:span 2/span 2}.row-start-1{grid-row-start:1}.-mx-1{margin-inline:calc(var(--spacing)*-1)}.mx-auto{margin-inline:auto}.my-1{margin-block:calc(var(--spacing)*1)}.ms-2{margin-inline-start:calc(var(--spacing)*2)}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-auto{margin-top:auto}.mr-0\.5{margin-right:calc(var(--spacing)*.5)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-row{display:table-row}.aspect-square{aspect-ratio:1}.size-3\.5{width:calc(var(--spacing)*3.5);height:calc(var(--spacing)*3.5)}.size-4{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.size-6{width:calc(var(--spacing)*6);height:calc(var(--spacing)*6)}.size-7{width:calc(var(--spacing)*7);height:calc(var(--spacing)*7)}.size-8{width:calc(var(--spacing)*8);height:calc(var(--spacing)*8)}.size-9{width:calc(var(--spacing)*9);height:calc(var(--spacing)*9)}.size-10{width:calc(var(--spacing)*10);height:calc(var(--spacing)*10)}.h-1\.5{height:calc(var(--spacing)*1.5)}.h-2{height:calc(var(--spacing)*2)}.h-2\.5{height:calc(var(--spacing)*2.5)}.h-3{height:calc(var(--spacing)*3)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-7{height:calc(var(--spacing)*7)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-11{height:calc(var(--spacing)*11)}.h-12{height:calc(var(--spacing)*12)}.h-14{height:calc(var(--spacing)*14)}.h-24{height:calc(var(--spacing)*24)}.h-\[calc\(100\%-1px\)\]{height:calc(100% - 1px)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.max-h-\(--radix-select-content-available-height\){max-height:var(--radix-select-content-available-height)}.max-h-\[30vh\]{max-height:30vh}.max-h-\[36vh\]{max-height:36vh}.max-h-\[40vh\]{max-height:40vh}.min-h-\[96px\]{min-height:96px}.min-h-\[120px\]{min-height:120px}.min-h-\[160px\]{min-height:160px}.min-h-\[200px\]{min-height:200px}.min-h-svh{min-height:100svh}.w-2{width:calc(var(--spacing)*2)}.w-2\.5{width:calc(var(--spacing)*2.5)}.w-3\/4{width:75%}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-11{width:calc(var(--spacing)*11)}.w-12{width:calc(var(--spacing)*12)}.w-14{width:calc(var(--spacing)*14)}.w-20{width:calc(var(--spacing)*20)}.w-24{width:calc(var(--spacing)*24)}.w-28{width:calc(var(--spacing)*28)}.w-32{width:calc(var(--spacing)*32)}.w-36{width:calc(var(--spacing)*36)}.w-40{width:calc(var(--spacing)*40)}.w-48{width:calc(var(--spacing)*48)}.w-56{width:calc(var(--spacing)*56)}.w-64{width:calc(var(--spacing)*64)}.w-72{width:calc(var(--spacing)*72)}.w-\[8\.5rem\]{width:8.5rem}.w-fit{width:fit-content}.w-full{width:100%}.max-w-60{max-width:calc(var(--spacing)*60)}.max-w-64{max-width:calc(var(--spacing)*64)}.max-w-72{max-width:calc(var(--spacing)*72)}.max-w-\[10rem\]{max-width:10rem}.max-w-\[14rem\]{max-width:14rem}.max-w-\[16rem\]{max-width:16rem}.max-w-\[26rem\]{max-width:26rem}.max-w-\[calc\(100\%-2rem\)\]{max-width:calc(100% - 2rem)}.max-w-lg{max-width:var(--container-lg)}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-\[8rem\]{min-width:8rem}.min-w-\[180px\]{min-width:180px}.min-w-\[200px\]{min-width:200px}.min-w-\[220px\]{min-width:220px}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.caption-bottom{caption-side:bottom}.origin-\(--radix-select-content-transform-origin\){transform-origin:var(--radix-select-content-transform-origin)}.origin-left{transform-origin:0}.translate-x-1{--tw-translate-x:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-5{--tw-translate-x:calc(var(--spacing)*5);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-0{--tw-translate-y:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-10{--tw-translate-y:calc(var(--spacing)*10);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x)var(--tw-translate-y)}.transform-gpu{transform:translateZ(0)var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-gradient{animation:8s linear infinite gradient}.animate-in{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.animate-pulse{animation:var(--animate-pulse)}.animate-rainbow{animation:rainbow var(--speed,2s)infinite linear}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-pointer{cursor:pointer}.scroll-my-1{scroll-margin-block:calc(var(--spacing)*1)}.scroll-mt-6{scroll-margin-top:calc(var(--spacing)*6)}.auto-rows-\[22rem\]{grid-auto-rows:22rem}.auto-rows-min{grid-auto-rows:min-content}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-rows-\[auto_auto\]{grid-template-rows:auto auto}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-5{gap:calc(var(--spacing)*5)}.gap-6{gap:calc(var(--spacing)*6)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}.gap-x-4{column-gap:calc(var(--spacing)*4)}.gap-y-0\.5{row-gap:calc(var(--spacing)*.5)}.self-start{align-self:flex-start}.justify-self-end{justify-self:flex-end}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-\(length\:--border-beam-width\){border-style:var(--tw-border-style);border-width:var(--border-beam-width)}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-500\/20{border-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/20{border-color:color-mix(in oklab,var(--color-amber-500)20%,transparent)}}.border-border,.border-border\/60{border-color:var(--border)}@supports (color:color-mix(in lab,red,red)){.border-border\/60{border-color:color-mix(in oklab,var(--border)60%,transparent)}}.border-destructive\/20{border-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.border-destructive\/20{border-color:color-mix(in oklab,var(--destructive)20%,transparent)}}.border-emerald-500\/20{border-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/20{border-color:color-mix(in oklab,var(--color-emerald-500)20%,transparent)}}.border-input{border-color:var(--input)}.border-muted-foreground{border-color:var(--muted-foreground)}.border-primary,.border-primary\/50{border-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.border-primary\/50{border-color:color-mix(in oklab,var(--primary)50%,transparent)}}.border-transparent{border-color:#0000}.border-b-transparent{border-bottom-color:#0000}.bg-accent\/50{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.bg-accent\/50{background-color:color-mix(in oklab,var(--accent)50%,transparent)}}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/10{background-color:color-mix(in oklab,var(--color-amber-500)10%,transparent)}}.bg-background,.bg-background\/70{background-color:var(--background)}@supports (color:color-mix(in lab,red,red)){.bg-background\/70{background-color:color-mix(in oklab,var(--background)70%,transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.bg-border{background-color:var(--border)}.bg-card{background-color:var(--card)}.bg-destructive,.bg-destructive\/5{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.bg-destructive\/5{background-color:color-mix(in oklab,var(--destructive)5%,transparent)}}.bg-destructive\/10{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.bg-destructive\/10{background-color:color-mix(in oklab,var(--destructive)10%,transparent)}}.bg-emerald-500\/10{background-color:#00bb7f1a}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/10{background-color:color-mix(in oklab,var(--color-emerald-500)10%,transparent)}}.bg-green-500\/10{background-color:#00c7581a}@supports (color:color-mix(in lab,red,red)){.bg-green-500\/10{background-color:color-mix(in oklab,var(--color-green-500)10%,transparent)}}.bg-input\/30{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.bg-input\/30{background-color:color-mix(in oklab,var(--input)30%,transparent)}}.bg-muted,.bg-muted\/20{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/20{background-color:color-mix(in oklab,var(--muted)20%,transparent)}}.bg-muted\/30{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/30{background-color:color-mix(in oklab,var(--muted)30%,transparent)}}.bg-muted\/50{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/50{background-color:color-mix(in oklab,var(--muted)50%,transparent)}}.bg-muted\/60{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/60{background-color:color-mix(in oklab,var(--muted)60%,transparent)}}.bg-popover{background-color:var(--popover)}.bg-primary,.bg-primary\/5{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.bg-primary\/5{background-color:color-mix(in oklab,var(--primary)5%,transparent)}}.bg-secondary{background-color:var(--secondary)}.bg-transparent{background-color:#0000}.bg-gradient-to-l{--tw-gradient-position:to left in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-\[linear-gradient\(\#121213\,\#121213\)\,linear-gradient\(\#121213_50\%\,rgba\(18\,18\,19\,0\.6\)_80\%\,rgba\(18\,18\,19\,0\)\)\,linear-gradient\(90deg\,var\(--color-1\)\,var\(--color-5\)\,var\(--color-3\)\,var\(--color-4\)\,var\(--color-2\)\)\]{background-image:linear-gradient(#121213,#121213),linear-gradient(#121213 50%,#12121399 80%,#12121300),linear-gradient(90deg,var(--color-1),var(--color-5),var(--color-3),var(--color-4),var(--color-2))}.bg-\[linear-gradient\(\#ffffff\,\#ffffff\)\,linear-gradient\(\#ffffff_50\%\,rgba\(18\,18\,19\,0\.6\)_80\%\,rgba\(18\,18\,19\,0\)\)\,linear-gradient\(90deg\,var\(--color-1\)\,var\(--color-5\)\,var\(--color-3\)\,var\(--color-4\)\,var\(--color-2\)\)\]{background-image:linear-gradient(#fff,#fff),linear-gradient(#fff 50%,#12121399 80%,#12121300),linear-gradient(90deg,var(--color-1),var(--color-5),var(--color-3),var(--color-4),var(--color-2))}.bg-\[linear-gradient\(90deg\,var\(--color-1\)\,var\(--color-5\)\,var\(--color-3\)\,var\(--color-4\)\,var\(--color-2\)\)\]{background-image:linear-gradient(90deg,var(--color-1),var(--color-5),var(--color-3),var(--color-4),var(--color-2))}.from-\[var\(--color-from\)\]{--tw-gradient-from:var(--color-from);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.via-\[var\(--color-to\)\]{--tw-gradient-via:var(--color-to);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.to-\[var\(--color-from\)\]{--tw-gradient-to:var(--color-from);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.\[mask-image\:linear-gradient\(transparent\,transparent\)\,linear-gradient\(\#000\,\#000\)\]{-webkit-mask-image:linear-gradient(#0000,#0000),linear-gradient(#000,#000);mask-image:linear-gradient(#0000,#0000),linear-gradient(#000,#000)}.bg-\[length\:200\%\]{background-size:200%}.bg-\[length\:200\%_100\%\]{background-size:200% 100%}.bg-\[length\:var\(--bg-size\)_100\%\]{background-size:var(--bg-size)100%}.\[background-clip\:padding-box\,border-box\,border-box\]{background-clip:padding-box,border-box,border-box}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.\[background-origin\:border-box\]{background-origin:border-box}.\[mask-composite\:intersect\]{-webkit-mask-composite:source-in;mask-composite:intersect}.\[mask-clip\:padding-box\,border-box\]{-webkit-mask-clip:padding-box,border-box;mask-clip:padding-box,border-box}.p-0{padding:calc(var(--spacing)*0)}.p-1{padding:calc(var(--spacing)*1)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.p-\[2px\]{padding:2px}.p-\[3px\]{padding:3px}.px-0\.5{padding-inline:calc(var(--spacing)*.5)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.px-8{padding-inline:calc(var(--spacing)*8)}.py-0{padding-block:calc(var(--spacing)*0)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-6{padding-block:calc(var(--spacing)*6)}.py-12{padding-block:calc(var(--spacing)*12)}.pt-2{padding-top:calc(var(--spacing)*2)}.pr-8{padding-right:calc(var(--spacing)*8)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pl-2{padding-left:calc(var(--spacing)*2)}.pl-8{padding-left:calc(var(--spacing)*8)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-5{--tw-leading:calc(var(--spacing)*5);line-height:calc(var(--spacing)*5)}.leading-none{--tw-leading:1;line-height:1}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.3em\]{--tw-tracking:.3em;letter-spacing:.3em}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-words{overflow-wrap:break-word}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.text-accent-foreground{color:var(--accent-foreground)}.text-amber-500{color:var(--color-amber-500)}.text-black{color:var(--color-black)}.text-card-foreground{color:var(--card-foreground)}.text-destructive{color:var(--destructive)}.text-foreground{color:var(--foreground)}.text-green-500{color:var(--color-green-500)}.text-muted-foreground{color:var(--muted-foreground)}.text-neutral-400{color:var(--color-neutral-400)}.text-neutral-700{color:var(--color-neutral-700)}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-transparent{color:#0000}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.underline{text-decoration-line:underline}.decoration-border{-webkit-text-decoration-color:var(--border);text-decoration-color:var(--border)}.decoration-current\/30{text-decoration-color:currentColor}@supports (color:color-mix(in lab,red,red)){.decoration-current\/30{-webkit-text-decoration-color:color-mix(in oklab,currentcolor 30%,transparent);text-decoration-color:color-mix(in oklab,currentcolor 30%,transparent)}}.decoration-dashed{text-decoration-style:dashed}.underline-offset-2{text-underline-offset:2px}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.shadow-\[0_0_8px_rgba\(0\,0\,0\,0\.06\)\]{--tw-shadow:0 0 8px var(--tw-shadow-color,#0000000f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring,.ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.\[box-shadow\:0_0_0_1px_rgba\(0\,0\,0\,\.03\)\,0_2px_4px_rgba\(0\,0\,0\,\.05\)\,0_12px_24px_rgba\(0\,0\,0\,\.05\)\]{box-shadow:0 0 0 1px #00000008,0 2px 4px #0000000d,0 12px 24px #0000000d}.ring-border\/40{--tw-ring-color:var(--border)}@supports (color:color-mix(in lab,red,red)){.ring-border\/40{--tw-ring-color:color-mix(in oklab,var(--border)40%,transparent)}}.ring-primary\/30{--tw-ring-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.ring-primary\/30{--tw-ring-color:color-mix(in oklab,var(--primary)30%,transparent)}}.ring-offset-background{--tw-ring-offset-color:var(--background)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[color\,box-shadow\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.fade-in-0{--tw-enter-opacity:0}.fill-mode-backwards{--tw-animation-fill-mode:backwards;animation-fill-mode:backwards}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.zoom-in-95{--tw-enter-scale:.95}.\[border\:calc\(0\.125rem\)_solid_transparent\]{border:.125rem solid #0000}.running{animation-play-state:running}@media(hover:hover){.group-hover\:translate-y-0:is(:where(.group):hover *){--tw-translate-y:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-hover\:scale-75:is(:where(.group):hover *){--tw-scale-x:75%;--tw-scale-y:75%;--tw-scale-z:75%;scale:var(--tw-scale-x)var(--tw-scale-y)}.group-hover\:bg-black\/\[\.03\]:is(:where(.group):hover *){background-color:#00000008}@supports (color:color-mix(in lab,red,red)){.group-hover\:bg-black\/\[\.03\]:is(:where(.group):hover *){background-color:color-mix(in oklab,var(--color-black)3%,transparent)}}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.group-data-\[disabled\=true\]\:pointer-events-none:is(:where(.group)[data-disabled=true] *){pointer-events:none}.group-data-\[disabled\=true\]\:opacity-50:is(:where(.group)[data-disabled=true] *){opacity:.5}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5}.selection\:bg-primary ::selection{background-color:var(--primary)}.selection\:bg-primary::selection{background-color:var(--primary)}.selection\:text-primary-foreground ::selection{color:var(--primary-foreground)}.selection\:text-primary-foreground::selection{color:var(--primary-foreground)}.file\:inline-flex::file-selector-button{display:inline-flex}.file\:h-7::file-selector-button{height:calc(var(--spacing)*7)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:inset-0:before{content:var(--tw-content);inset:calc(var(--spacing)*0)}.before\:inset-y-0:before{content:var(--tw-content);inset-block:calc(var(--spacing)*0)}.before\:bottom-\[-20\%\]:before{content:var(--tw-content);bottom:-20%}.before\:left-0:before{content:var(--tw-content);left:calc(var(--spacing)*0)}.before\:left-1\/2:before{content:var(--tw-content);left:50%}.before\:z-0:before{content:var(--tw-content);z-index:0}.before\:h-1\/5:before{content:var(--tw-content);height:20%}.before\:w-3\/5:before{content:var(--tw-content);width:60%}.before\:-translate-x-1\/2:before{content:var(--tw-content);--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.before\:-translate-x-full:before{content:var(--tw-content);--tw-translate-x:-100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.before\:animate-\[skeleton-shimmer_1\.8s_ease-in-out_infinite\]:before{content:var(--tw-content);animation:1.8s ease-in-out infinite skeleton-shimmer}.before\:animate-rainbow:before{content:var(--tw-content);animation:rainbow var(--speed,2s)infinite linear}.before\:animate-shimmer-slide:before{content:var(--tw-content);animation:shimmer-slide var(--speed)ease-in-out infinite alternate}.before\:rounded-full:before{content:var(--tw-content);border-radius:3.40282e38px}.before\:bg-gradient-to-r:before{content:var(--tw-content);--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.before\:bg-\[linear-gradient\(90deg\,transparent\,rgba\(255\,255\,255\,0\.55\)\,transparent\)\]:before{content:var(--tw-content);background-image:linear-gradient(90deg,#0000,#ffffff8c,#0000)}.before\:bg-\[linear-gradient\(90deg\,var\(--color-1\)\,var\(--color-5\)\,var\(--color-3\)\,var\(--color-4\)\,var\(--color-2\)\)\]:before{content:var(--tw-content);background-image:linear-gradient(90deg,var(--color-1),var(--color-5),var(--color-3),var(--color-4),var(--color-2))}.before\:from-transparent:before{content:var(--tw-content);--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.before\:via-foreground\/\[0\.07\]:before{content:var(--tw-content);--tw-gradient-via:var(--foreground)}@supports (color:color-mix(in lab,red,red)){.before\:via-foreground\/\[0\.07\]:before{--tw-gradient-via:color-mix(in oklab,var(--foreground)7%,transparent)}}.before\:via-foreground\/\[0\.07\]:before{--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.before\:to-transparent:before{content:var(--tw-content);--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.before\:opacity-50:before{content:var(--tw-content);opacity:.5}.before\:\[filter\:blur\(0\.75rem\)\]:before{content:var(--tw-content);filter:blur(.75rem)}.before\:content-\[\'\'\]:before{--tw-content:"";content:var(--tw-content)}@media(hover:hover){.hover\:bg-accent:hover,.hover\:bg-accent\/50:hover{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent\/50:hover{background-color:color-mix(in oklab,var(--accent)50%,transparent)}}.hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--destructive)90%,transparent)}}.hover\:bg-muted\/50:hover{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab,var(--muted)50%,transparent)}}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--primary)90%,transparent)}}.hover\:bg-secondary\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab,var(--secondary)80%,transparent)}}.hover\:bg-transparent:hover{background-color:#0000}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:underline:hover{text-decoration-line:underline}.hover\:decoration-foreground:hover{-webkit-text-decoration-color:var(--foreground);text-decoration-color:var(--foreground)}.hover\:opacity-100:hover{opacity:1}}.focus\:bg-accent:focus{background-color:var(--accent)}.focus\:text-accent-foreground:focus{color:var(--accent-foreground)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-ring:focus{--tw-ring-color:var(--ring)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(3px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab,var(--destructive)20%,transparent)}}.focus-visible\:ring-ring:focus-visible,.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab,var(--ring)50%,transparent)}}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus-visible\:ring-offset-background:focus-visible{--tw-ring-offset-color:var(--background)}.focus-visible\:outline-1:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-ring:focus-visible{outline-color:var(--ring)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.has-data-\[slot\=card-action\]\:grid-cols-\[1fr_auto\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.has-\[\>svg\]\:px-2\.5:has(>svg){padding-inline:calc(var(--spacing)*2.5)}.has-\[\>svg\]\:px-3:has(>svg){padding-inline:calc(var(--spacing)*3)}.has-\[\>svg\]\:px-4:has(>svg){padding-inline:calc(var(--spacing)*4)}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive)20%,transparent)}}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[orientation\=horizontal\]\:h-px[data-orientation=horizontal]{height:1px}.data-\[orientation\=horizontal\]\:w-full[data-orientation=horizontal]{width:100%}.data-\[orientation\=vertical\]\:h-full[data-orientation=vertical]{height:100%}.data-\[orientation\=vertical\]\:w-px[data-orientation=vertical]{width:1px}.data-\[placeholder\]\:text-muted-foreground[data-placeholder]{color:var(--muted-foreground)}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:calc(2*var(--spacing)*-1)}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:calc(2*var(--spacing))}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:calc(2*var(--spacing))}.data-\[size\=default\]\:h-9[data-size=default]{height:calc(var(--spacing)*9)}.data-\[size\=sm\]\:h-8[data-size=sm]{height:calc(var(--spacing)*8)}:is(.\*\:data-\[slot\=select-value\]\:line-clamp-1>*)[data-slot=select-value]{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}:is(.\*\:data-\[slot\=select-value\]\:flex>*)[data-slot=select-value]{display:flex}:is(.\*\:data-\[slot\=select-value\]\:items-center>*)[data-slot=select-value]{align-items:center}:is(.\*\:data-\[slot\=select-value\]\:gap-2>*)[data-slot=select-value]{gap:calc(var(--spacing)*2)}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:var(--background)}.data-\[state\=active\]\:shadow-sm[data-state=active]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=closed\]\:duration-300[data-state=closed]{--tw-duration:.3s;transition-duration:.3s}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=closed\]\:slide-out-to-bottom[data-state=closed]{--tw-exit-translate-y:100%}.data-\[state\=closed\]\:slide-out-to-left[data-state=closed]{--tw-exit-translate-x:-100%}.data-\[state\=closed\]\:slide-out-to-right[data-state=closed]{--tw-exit-translate-x:100%}.data-\[state\=closed\]\:slide-out-to-top[data-state=closed]{--tw-exit-translate-y:-100%}.data-\[state\=open\]\:animate-in[data-state=open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--accent)}.data-\[state\=open\]\:bg-secondary[data-state=open]{background-color:var(--secondary)}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:var(--muted-foreground)}.data-\[state\=open\]\:duration-500[data-state=open]{--tw-duration:.5s;transition-duration:.5s}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale:.95}.data-\[state\=open\]\:slide-in-from-bottom[data-state=open]{--tw-enter-translate-y:100%}.data-\[state\=open\]\:slide-in-from-left[data-state=open]{--tw-enter-translate-x:-100%}.data-\[state\=open\]\:slide-in-from-right[data-state=open]{--tw-enter-translate-x:100%}.data-\[state\=open\]\:slide-in-from-top[data-state=open]{--tw-enter-translate-y:-100%}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:var(--muted)}@media(prefers-reduced-motion:no-preference){.motion-safe\:animate-in{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.motion-safe\:animate-ping{animation:var(--animate-ping)}.motion-safe\:animate-pulse{animation:var(--animate-pulse)}.motion-safe\:animate-spin{animation:var(--animate-spin)}.motion-safe\:duration-300{--tw-duration:.3s;transition-duration:.3s}.motion-safe\:fade-in-0{--tw-enter-opacity:0}.motion-safe\:zoom-in-95{--tw-enter-scale:.95}.motion-safe\:slide-in-from-bottom-1{--tw-enter-translate-y:calc(1*var(--spacing))}.motion-safe\:slide-in-from-bottom-2{--tw-enter-translate-y:calc(2*var(--spacing))}.motion-safe\:slide-in-from-bottom-4{--tw-enter-translate-y:calc(4*var(--spacing))}}@media(min-width:40rem){.sm\:ml-auto{margin-left:auto}.sm\:block{display:block}.sm\:inline{display:inline}.sm\:inline-flex{display:inline-flex}.sm\:max-w-lg{max-width:var(--container-lg)}.sm\:max-w-md{max-width:var(--container-md)}.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:max-w-xs{max-width:var(--container-xs)}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:justify-end{justify-content:flex-end}.sm\:gap-2{gap:calc(var(--spacing)*2)}.sm\:text-left{text-align:left}}@media(min-width:48rem){.md\:flex{display:flex}.md\:hidden{display:none}.md\:table-cell{display:table-cell}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media(min-width:64rem){.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-10{grid-column:span 10/span 10}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:table-cell{display:table-cell}.lg\:min-h-\[96px\]{min-height:96px}.lg\:min-h-\[120px\]{min-height:120px}.lg\:min-h-\[140px\]{min-height:140px}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:px-6{padding-inline:calc(var(--spacing)*6)}.lg\:py-6{padding-block:calc(var(--spacing)*6)}.lg\:text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}@media(hover:hover){.lg\:group-hover\:-translate-y-10:is(:where(.group):hover *){--tw-translate-y:calc(var(--spacing)*-10);translate:var(--tw-translate-x)var(--tw-translate-y)}}}@media(min-width:80rem){.xl\:table-cell{display:table-cell}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.xl\:grid-cols-\[1fr_2fr\]{grid-template-columns:1fr 2fr}}@media(min-width:96rem){.\32xl\:table-cell{display:table-cell}.\32xl\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}}.rtl\:rotate-180:where(:dir(rtl),[dir=rtl],[dir=rtl] *){rotate:180deg}.dark\:border-input:is(.dark *){border-color:var(--input)}.dark\:bg-background:is(.dark *){background-color:var(--background)}.dark\:bg-destructive\/60:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-destructive\/60:is(.dark *){background-color:color-mix(in oklab,var(--destructive)60%,transparent)}}.dark\:bg-input\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-input\/30:is(.dark *){background-color:color-mix(in oklab,var(--input)30%,transparent)}}.dark\:bg-\[linear-gradient\(\#0a0a0a\,\#0a0a0a\)\,linear-gradient\(\#0a0a0a_50\%\,rgba\(255\,255\,255\,0\.6\)_80\%\,rgba\(0\,0\,0\,0\)\)\,linear-gradient\(90deg\,var\(--color-1\)\,var\(--color-5\)\,var\(--color-3\)\,var\(--color-4\)\,var\(--color-2\)\)\]:is(.dark *){background-image:linear-gradient(#0a0a0a,#0a0a0a),linear-gradient(#0a0a0a 50%,#fff9 80%,#0000),linear-gradient(90deg,var(--color-1),var(--color-5),var(--color-3),var(--color-4),var(--color-2))}.dark\:bg-\[linear-gradient\(\#fff\,\#fff\)\,linear-gradient\(\#fff_50\%\,rgba\(255\,255\,255\,0\.6\)_80\%\,rgba\(0\,0\,0\,0\)\)\,linear-gradient\(90deg\,var\(--color-1\)\,var\(--color-5\)\,var\(--color-3\)\,var\(--color-4\)\,var\(--color-2\)\)\]:is(.dark *){background-image:linear-gradient(#fff,#fff),linear-gradient(#fff 50%,#fff9 80%,#0000),linear-gradient(90deg,var(--color-1),var(--color-5),var(--color-3),var(--color-4),var(--color-2))}.dark\:text-muted-foreground:is(.dark *){color:var(--muted-foreground)}.dark\:text-neutral-300:is(.dark *){color:var(--color-neutral-300)}.dark\:text-white:is(.dark *){color:var(--color-white)}.dark\:shadow-\[0_0_12px_rgba\(255\,255\,255\,0\.12\)\]:is(.dark *){--tw-shadow:0 0 12px var(--tw-shadow-color,#ffffff1f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark\:\[box-shadow\:0_-20px_80px_-20px_\#ffffff1f_inset\]:is(.dark *){box-shadow:inset 0 -20px 80px -20px #ffffff1f}.dark\:\[border\:1px_solid_rgba\(255\,255\,255\,\.1\)\]:is(.dark *){border:1px solid #ffffff1a}@media(hover:hover){.group-hover\:dark\:bg-neutral-800\/10:is(:where(.group):hover *):is(.dark *){background-color:#2626261a}@supports (color:color-mix(in lab,red,red)){.group-hover\:dark\:bg-neutral-800\/10:is(:where(.group):hover *):is(.dark *){background-color:color-mix(in oklab,var(--color-neutral-800)10%,transparent)}}}.dark\:before\:via-foreground\/\[0\.05\]:is(.dark *):before{content:var(--tw-content);--tw-gradient-via:var(--foreground)}@supports (color:color-mix(in lab,red,red)){.dark\:before\:via-foreground\/\[0\.05\]:is(.dark *):before{--tw-gradient-via:color-mix(in oklab,var(--foreground)5%,transparent)}}.dark\:before\:via-foreground\/\[0\.05\]:is(.dark *):before{--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}@media(hover:hover){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--accent)50%,transparent)}}.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--input)50%,transparent)}}}.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab,var(--destructive)40%,transparent)}}.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive)40%,transparent)}}.dark\:data-\[state\=active\]\:border-input:is(.dark *)[data-state=active]{border-color:var(--input)}.dark\:data-\[state\=active\]\:bg-input\/30:is(.dark *)[data-state=active]{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:data-\[state\=active\]\:bg-input\/30:is(.dark *)[data-state=active]{background-color:color-mix(in oklab,var(--input)30%,transparent)}}.dark\:data-\[state\=active\]\:text-foreground:is(.dark *)[data-state=active]{color:var(--foreground)}.\[\&_span\:last-child\]\:flex span:last-child{display:flex}.\[\&_span\:last-child\]\:items-center span:last-child{align-items:center}.\[\&_span\:last-child\]\:gap-2 span:last-child{gap:calc(var(--spacing)*2)}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.\[\&_svg\:not\(\[class\*\=\'text-\'\]\)\]\:text-muted-foreground svg:not([class*=text-]){color:var(--muted-foreground)}.\[\&_td\]\:py-1\.5 td{padding-block:calc(var(--spacing)*1.5)}.\[\&_th\]\:h-9 th{height:calc(var(--spacing)*9)}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:calc(var(--spacing)*0)}.\[\.border-b\]\:pb-6.border-b{padding-bottom:calc(var(--spacing)*6)}.\[\.border-t\]\:pt-6.border-t{padding-top:calc(var(--spacing)*6)}.\[\&\>\[role\=checkbox\]\]\:translate-y-\[2px\]>[role=checkbox]{--tw-translate-y:2px;translate:var(--tw-translate-x)var(--tw-translate-y)}.\[\&\>svg\]\:pointer-events-none>svg{pointer-events:none}.\[\&\>svg\]\:size-3>svg{width:calc(var(--spacing)*3);height:calc(var(--spacing)*3)}.\[\&\>tr\]\:last\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media(hover:hover){a.\[a\&\]\:hover\:bg-accent:hover{background-color:var(--accent)}a.\[a\&\]\:hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){a.\[a\&\]\:hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--destructive)90%,transparent)}}a.\[a\&\]\:hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){a.\[a\&\]\:hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--primary)90%,transparent)}}a.\[a\&\]\:hover\:bg-secondary\/90:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab,red,red)){a.\[a\&\]\:hover\:bg-secondary\/90:hover{background-color:color-mix(in oklab,var(--secondary)90%,transparent)}}a.\[a\&\]\:hover\:text-accent-foreground:hover{color:var(--accent-foreground)}}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}:root{--radius:.625rem;--background:oklch(100% .003 260);--foreground:oklch(14.5% .005 260);--card:oklch(100% .003 260);--card-foreground:oklch(14.5% .005 260);--popover:oklch(100% .003 260);--popover-foreground:oklch(14.5% .005 260);--primary:oklch(20.5% .005 260);--primary-foreground:oklch(98.5% .003 260);--secondary:oklch(97% .003 260);--secondary-foreground:oklch(20.5% .005 260);--muted:oklch(97% .003 260);--muted-foreground:oklch(55.6% .006 260);--accent:oklch(97% .003 260);--accent-foreground:oklch(20.5% .005 260);--destructive:oklch(57.7% .245 27.325);--border:oklch(92.2% .004 260);--input:oklch(92.2% .004 260);--ring:oklch(70.8% .006 260);--chart-1:oklch(64.6% .222 41.116);--chart-2:oklch(60% .118 184.704);--chart-3:oklch(39.8% .07 227.392);--chart-4:oklch(82.8% .189 84.429);--chart-5:oklch(76.9% .188 70.08);--sidebar:oklch(98.5% .003 260);--sidebar-foreground:oklch(14.5% .005 260);--sidebar-primary:oklch(20.5% .005 260);--sidebar-primary-foreground:oklch(98.5% .003 260);--sidebar-accent:oklch(97% .003 260);--sidebar-accent-foreground:oklch(20.5% .005 260);--sidebar-border:oklch(92.2% .004 260);--sidebar-ring:oklch(70.8% .006 260);--color-1:oklch(66.2% .225 25.9);--color-2:oklch(60.4% .26 302);--color-3:oklch(69.6% .165 251);--color-4:oklch(80.2% .134 225);--color-5:oklch(90.7% .231 133)}.dark{--background:oklch(14.5% .005 260);--foreground:oklch(98.5% .003 260);--card:oklch(20.5% .005 260);--card-foreground:oklch(98.5% .003 260);--popover:oklch(20.5% .005 260);--popover-foreground:oklch(98.5% .003 260);--primary:oklch(92.2% .004 260);--primary-foreground:oklch(20.5% .005 260);--secondary:oklch(26.9% .005 260);--secondary-foreground:oklch(98.5% .003 260);--muted:oklch(26.9% .005 260);--muted-foreground:oklch(70.8% .006 260);--accent:oklch(26.9% .005 260);--accent-foreground:oklch(98.5% .003 260);--destructive:oklch(70.4% .191 22.216);--border:oklch(100% .003 260/.1);--input:oklch(100% .003 260/.15);--ring:oklch(55.6% .006 260);--chart-1:oklch(48.8% .243 264.376);--chart-2:oklch(69.6% .17 162.48);--chart-3:oklch(76.9% .188 70.08);--chart-4:oklch(62.7% .265 303.9);--chart-5:oklch(64.5% .246 16.439);--sidebar:oklch(20.5% .005 260);--sidebar-foreground:oklch(98.5% .003 260);--sidebar-primary:oklch(48.8% .243 264.376);--sidebar-primary-foreground:oklch(98.5% .003 260);--sidebar-accent:oklch(26.9% .005 260);--sidebar-accent-foreground:oklch(98.5% .003 260);--sidebar-border:oklch(100% .003 260/.1);--sidebar-ring:oklch(55.6% .006 260);--color-1:oklch(66.2% .225 25.9);--color-2:oklch(60.4% .26 302);--color-3:oklch(69.6% .165 251);--color-4:oklch(80.2% .134 225);--color-5:oklch(90.7% .231 133)}@keyframes skeleton-shimmer{to{transform:translate(100%)}}[data-glow-table] tr{--glow-x:50%;--glow-y:50%}[data-glow-table] tbody tr:hover{background:radial-gradient(600px circle at var(--glow-x)var(--glow-y),oklch(70% .15 250/.06),transparent 50%)}.dark [data-glow-table] tbody tr:hover{background:radial-gradient(600px circle at var(--glow-x)var(--glow-y),oklch(60% .18 250/.08),transparent 50%)}@view-transition{navigation:auto}::view-transition-old(page-content){animation:.18s ease-out both fade-and-scale-out}::view-transition-new(page-content){animation:.18s ease-out 60ms both fade-and-scale-in}@keyframes fade-and-scale-out{to{opacity:0;transform:scale(.98)}}@keyframes fade-and-scale-in{0%{opacity:0;transform:scale(.98)}}@media(prefers-reduced-motion:reduce){::view-transition-old(page-content){animation:none}::view-transition-new(page-content){animation:none}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}}@keyframes shimmer-slide{to{transform:translate(calc(100cqw - 100%))}}@keyframes gradient{to{background-position:var(--bg-size,300%)0}}@keyframes rainbow{0%{background-position:0%}to{background-position:200%}}