import type { OAuthCredentials } from "@mariozechner/pi-ai"; import type { BotConfig } from "../../config/config.js"; import type { SecretRef } from "../../config/types.secrets.js"; export type ApiKeyCredential = { type: "api_key"; provider: string; key?: string; keyRef?: SecretRef; email?: string; /** Optional provider-specific metadata (e.g., account IDs, gateway IDs). */ metadata?: Record; }; export type TokenCredential = { /** * Static bearer-style token (often OAuth access token / PAT). * Not refreshable by HanzoBot (unlike `type: "oauth"`). */ type: "token"; provider: string; token?: string; tokenRef?: SecretRef; /** Optional expiry timestamp (ms since epoch). */ expires?: number; email?: string; }; export type OAuthCredential = OAuthCredentials & { type: "oauth"; provider: string; clientId?: string; email?: string; }; export type AuthProfileCredential = ApiKeyCredential | TokenCredential | OAuthCredential; export type AuthProfileFailureReason = "auth" | "auth_permanent" | "format" | "rate_limit" | "billing" | "timeout" | "model_not_found" | "session_expired" | "unknown"; /** Per-profile usage statistics for round-robin and cooldown tracking */ export type ProfileUsageStats = { lastUsed?: number; cooldownUntil?: number; disabledUntil?: number; disabledReason?: AuthProfileFailureReason; errorCount?: number; failureCounts?: Partial>; lastFailureAt?: number; }; export type AuthProfileStore = { version: number; profiles: Record; /** * Optional per-agent preferred profile order overrides. * This lets you lock/override auth rotation for a specific agent without * changing the global config. */ order?: Record; lastGood?: Record; /** Usage statistics per profile for round-robin rotation */ usageStats?: Record; }; export type AuthProfileIdRepairResult = { config: BotConfig; changes: string[]; migrated: boolean; fromProfileId?: string; toProfileId?: string; };