import { z } from 'zod'; /** * User configuration (spec section 7). Every key is optional in the file; the * schema fills defaults so `loadConfig` always returns a fully-populated object. */ export declare const ConfigSchema: z.ZodObject<{ profilesDir: z.ZodOptional; priorityOrder: z.ZodDefault>; browser: z.ZodDefault; channel: z.ZodDefault; }, "strip", z.ZodTypeAny, { debugPort: number; channel: string; }, { debugPort?: number | undefined; channel?: string | undefined; }>>; rotation: z.ZodDefault; autoRelaunchInteractive: z.ZodDefault; defaultBackoffMinutes: z.ZodDefault; capThresholdPercent: z.ZodDefault; /** * Move off an account once its binding window hits this percent. * OFF by default (0): moving a live session is something the operator * opts into, not a surprise. Turn it on with `ccx proactive on`. */ proactivePercent: z.ZodDefault; /** Require this many points more headroom on the target (anti-flap). */ proactiveHysteresisPercent: z.ZodDefault; /** How often a running session checks its own usage. */ usageCheckSeconds: z.ZodDefault; /** * Which model to move to when the one in use runs out everywhere. * * A per-model limit stops that model, not the account, so rotation looks * for another account with room on the SAME model first. Only when none * has any is the model changed, and then it follows this order rather than * whatever happens to be free. */ modelPreference: z.ZodDefault>; /** * Which runs out first: the model, or the account. * * model-first uses up the CURRENT MODEL everywhere before changing * model, so a session stays on Fable across every account and only then * falls back to Opus. account-first uses up each ACCOUNT across the * whole chain before moving to the next one. * * A one-model chain (`modelPreference: ['fable']`) means never fall * back at all, under either strategy. */ modelStrategy: z.ZodDefault>; /** * Set false to ignore models entirely and rotate on account limits alone, * which is how ccx behaved before this existed. */ preferSameModel: z.ZodDefault; /** * Which account rotation reaches for first. * - `most-room` (default): the least-used account, the one with the most * headroom left on its binding window (5-hour or weekly, whichever is * tighter). Spreads work across accounts and delays hitting any limit. * - `priority`: the classic order, lowest `priority` number first. * Either way a manually pinned account (`ccx use`) still wins, and priority * is the tiebreak when two accounts are equally roomy. */ accountOrder: z.ZodDefault>; }, "strip", z.ZodTypeAny, { autoRotateHeadless: boolean; autoRelaunchInteractive: boolean; defaultBackoffMinutes: number; capThresholdPercent: number; proactivePercent: number; proactiveHysteresisPercent: number; usageCheckSeconds: number; modelPreference: [string, ...string[]]; modelStrategy: "model-first" | "account-first"; preferSameModel: boolean; accountOrder: "priority" | "most-room"; }, { autoRotateHeadless?: boolean | undefined; autoRelaunchInteractive?: boolean | undefined; defaultBackoffMinutes?: number | undefined; capThresholdPercent?: number | undefined; proactivePercent?: number | undefined; proactiveHysteresisPercent?: number | undefined; usageCheckSeconds?: number | undefined; modelPreference?: [string, ...string[]] | undefined; modelStrategy?: "model-first" | "account-first" | undefined; preferSameModel?: boolean | undefined; accountOrder?: "priority" | "most-room" | undefined; }>>; realClaudePath: z.ZodDefault>; }, "strip", z.ZodTypeAny, { priorityOrder: string[]; browser: { debugPort: number; channel: string; }; rotation: { autoRotateHeadless: boolean; autoRelaunchInteractive: boolean; defaultBackoffMinutes: number; capThresholdPercent: number; proactivePercent: number; proactiveHysteresisPercent: number; usageCheckSeconds: number; modelPreference: [string, ...string[]]; modelStrategy: "model-first" | "account-first"; preferSameModel: boolean; accountOrder: "priority" | "most-room"; }; realClaudePath: string | null; profilesDir?: string | undefined; }, { profilesDir?: string | undefined; priorityOrder?: string[] | undefined; browser?: { debugPort?: number | undefined; channel?: string | undefined; } | undefined; rotation?: { autoRotateHeadless?: boolean | undefined; autoRelaunchInteractive?: boolean | undefined; defaultBackoffMinutes?: number | undefined; capThresholdPercent?: number | undefined; proactivePercent?: number | undefined; proactiveHysteresisPercent?: number | undefined; usageCheckSeconds?: number | undefined; modelPreference?: [string, ...string[]] | undefined; modelStrategy?: "model-first" | "account-first" | undefined; preferSameModel?: boolean | undefined; accountOrder?: "priority" | "most-room" | undefined; } | undefined; realClaudePath?: string | null | undefined; }>; export type Config = z.infer; /** Deep-partial shape for file input, env overrides, and saveConfig. */ export interface PartialConfig { profilesDir?: string; priorityOrder?: string[]; browser?: { debugPort?: number; channel?: string; }; rotation?: { autoRotateHeadless?: boolean; autoRelaunchInteractive?: boolean; defaultBackoffMinutes?: number; capThresholdPercent?: number; proactivePercent?: number; proactiveHysteresisPercent?: number; usageCheckSeconds?: number; modelPreference?: string[]; modelStrategy?: 'model-first' | 'account-first'; preferSameModel?: boolean; accountOrder?: 'priority' | 'most-room'; }; realClaudePath?: string | null; }