export interface QuotaWindow { usedPercent: number; remainingPercent: number; resetsAt?: string; } export interface ScopedQuotaWindow extends QuotaWindow { id: string; title: string; modelId?: string; modelName: string; } export interface AccountQuota { five_hour?: QuotaWindow; seven_day?: QuotaWindow; scoped?: ScopedQuotaWindow[]; extraUsage?: { used: { amountMinor: number; currency: string; exponent: number; }; limit: { amountMinor: number; currency: string; exponent: number; }; utilizationPercent?: number; severity?: string; exhausted: boolean; }; bindingWindow?: string; fallbackAdvised?: boolean; } export interface SidebarAccountState { id: string; label: string | undefined; quota: AccountQuota | null; enabled: boolean; needsReauth: boolean; tierLabel?: string; } export interface FableRecoverySidebarState { sessionId: string; mode: 'opus' | 'fable'; remaining: number; changedAt: number; /** * The model id the user originally requested (e.g. 'claude-fable-5' or * 'claude-opus-5'). Optional for backward compatibility with pre-Opus-5 * state files; older recoveries default to Fable 5 in the summary. */ requestedModelId?: string; } export interface SidebarState { main: { quota: AccountQuota | null; tierLabel?: string; quotaBackedOff?: boolean; quotaBackoffUntil?: number; refreshBackedOff?: boolean; refreshBackoffUntil?: number; }; fallbacks: SidebarAccountState[]; activeId: string | undefined; route: string; relay: { enabled: boolean; transport: string; } | null; fastMode: boolean; cacheKeep?: { enabled: boolean; window?: string; trackedSessions?: number; }; fableRecoveries?: FableRecoverySidebarState[]; lastUpdated: number; } export declare function getSidebarStateFile(): string; export declare const DEFAULT_SIDEBAR_STATE: SidebarState; export declare function normalizeSidebarState(raw: unknown): SidebarState; interface SidebarStateWriteTestHooks { afterMergeRead?: (stateFile: string) => void | Promise; beforeRename?: (stateFile: string, tempFile: string) => void | Promise; afterRename?: (stateFile: string) => void | Promise; afterStaleLockStat?: (lockDir: string) => void | Promise; onStaleLockClaimed?: (lockDir: string) => void | Promise; onLockAcquired?: (lockDir: string) => void | Promise; beforeReleaseDirectoryRemoval?: (lockDir: string) => void | Promise; lockBudgetMs?: number; lockRetryMinMs?: number; lockRetryMaxMs?: number; } export declare function __setSidebarStateWriteTestHooks(hooks: SidebarStateWriteTestHooks | null): void; export interface InitialSidebarRoutingTestHooks { beforeSidebarRead?: () => void | Promise; beforeStorageLoad?: () => void | Promise; afterStorageLoad?: () => void | Promise; } export declare function __setInitialSidebarRoutingTestHooks(hooks: InitialSidebarRoutingTestHooks | null): void; export declare function getInitialSidebarRoutingTestHooks(): InitialSidebarRoutingTestHooks | null; export declare function __acquireSidebarStateLockForTest(stateFile: string): Promise<(() => Promise) | null>; export declare function getSidebarState(stateFile?: string): Promise; export interface SidebarStateWriteOptions { routingAuthoritative?: boolean; resolvePreservedRouting?: (current: SidebarState) => (Pick & { state?: SidebarState; }) | undefined | Promise<(Pick & { state?: SidebarState; }) | undefined>; onRoutingResolved?: (routing: Pick) => void; } export declare function setSidebarState(state: SidebarState, stateFile?: string, options?: SidebarStateWriteOptions): Promise; export declare function drainSidebarWrites(): Promise; export declare function resolveActiveAccount(state: SidebarState): { id: string; name: string; quota: AccountQuota | null; }; export declare function formatScopedQuotaLabel(title: string): string; /** * Pretty label for a recoverable-refusal source model (Fable 5 or Opus 5). * Falls back to the raw id for unrecognized ids so the sidebar never goes * blank on a future model that has not yet been cataloged here. */ export declare function formatFallbackModelLabel(modelId: string | undefined): string; export declare function getFableRecoverySummary(state: SidebarState, sessionId: string): string | undefined; export declare function getCollapsedQuotaSummary(quota: AccountQuota | null): { fiveHourUsedPercent: number | null; sevenDayUsedPercent: number | null; scopedUsedPercents: number[]; text: string | null; }; export declare const FIVE_HOUR_MS: number; export declare const SEVEN_DAY_MS: number; export interface QuotaPacing { pacePercent: number; deltaPercent: number; state: 'deficit' | 'reserve' | 'on-pace'; runsOutAt: string | null; } export declare function computeQuotaPacing(window: QuotaWindow, windowMs: number, now: number): QuotaPacing | null; export {};