export type ModelId = 'gfs' | 'arome' | 'arpege' | 'icon-eu'; export interface SourceSetting { model: ModelId; resolution?: string; hours?: number; archiveRuns?: number; autoDownload?: boolean; enabled?: boolean; } export interface Bbox { latMin: number; lonMin: number; latMax: number; lonMax: number; } export type InternetState = 'online' | 'offline' | 'metered' | 'captive' | 'unknown'; export interface PluginSettings { gribsRoot?: string; checkIntervalMinutes?: number; meteredIntervalMultiplier?: number; } export interface AppSettings { mode?: 'auto' | 'manual'; checkIntervalMinutes?: number; bbox?: Bbox; sources?: SourceSetting[]; } export interface SourceStatus { name: string; model: ModelId; autoDownload: boolean; lastRun: string | null; expectedRun: string; upToDate: boolean; configStale: boolean; running: boolean; lastError: string | null; lastOutcome: 'downloaded' | 'up-to-date' | 'unavailable' | 'failed' | null; lastFinishedAt: string | null; lastLog: string[]; }