export const MODEL_INFO_CHANNEL = "dashboard:model-info"; export const REFRESH_CHANNEL = "dashboard:refresh"; export interface ModelInfoState { provider: string; modelId: string; modelName: string; thinking: string; contextTokens: number | null; contextWindow: number; contextPercent: number | null; cost: number; tokensPerSecond: number | null; generating: boolean; } export function emptyModelInfoState(): ModelInfoState { return { provider: "", modelId: "no-model", modelName: "No model", thinking: "off", contextTokens: null, contextWindow: 0, contextPercent: null, cost: 0, tokensPerSecond: null, generating: false, }; } function isRecord(value: unknown): value is Record { return typeof value === "object" && value !== null; } function isNullableNumber(value: unknown) { return value === null || typeof value === "number"; } export function isModelInfoState(value: unknown): value is ModelInfoState { if (!isRecord(value)) return false; return ( typeof value.provider === "string" && typeof value.modelId === "string" && typeof value.modelName === "string" && typeof value.thinking === "string" && isNullableNumber(value.contextTokens) && typeof value.contextWindow === "number" && isNullableNumber(value.contextPercent) && typeof value.cost === "number" && isNullableNumber(value.tokensPerSecond) && typeof value.generating === "boolean" ); }