import { create } from 'zustand'; import type { ModelInfo } from '../types/model'; import { api } from '../api/client'; import type { ModelListEntry } from '../api/client'; import { useSAEStore } from './useSAEStore'; import { useScanStore } from './useScanStore'; import { useCompareStore } from './useCompareStore'; import { useCrossModelStore } from './useCrossModelStore'; import { useSettingsStore } from './useSettingsStore'; import { useModelSearchStore } from './useModelSearchStore'; interface ModelState { modelInfo: ModelInfo | null; isLoading: boolean; error: string | null; availableModels: ModelListEntry[]; loadModel: (modelId: string) => Promise; fetchModelInfo: () => Promise; fetchModels: () => Promise; } export const useModelStore = create((set) => ({ modelInfo: null, isLoading: false, error: null, availableModels: [], loadModel: async (modelId) => { // Guard against concurrent loads if (useModelStore.getState().isLoading) return; set({ isLoading: true, error: null }); try { const device = useSettingsStore.getState().devicePreference; const info = await api.model.load(modelId, device); set({ modelInfo: info, isLoading: false }); // Clear stale data from previous model useScanStore.getState().clearScanData(); useCompareStore.getState().clear(); useCrossModelStore.getState().clear(); // Register as recent model useModelSearchStore.getState().addRecentModel(modelId); // Refresh model list to update is_loaded flags try { const models = await api.model.list(); set({ availableModels: models }); } catch { // non-critical } // Fetch SAE availability for the new model useSAEStore.getState().reset(); useSAEStore.getState().fetchInfo(); } catch (e) { set({ error: (e as Error).message, isLoading: false }); } }, fetchModelInfo: async () => { try { const info = await api.model.info(); set({ modelInfo: info, error: null }); // Fetch SAE availability useSAEStore.getState().fetchInfo(); } catch { // Model not yet loaded — that's ok on initial load } }, fetchModels: async () => { try { const models = await api.model.list(); set({ availableModels: models }); } catch { // Server may not be ready yet } }, }));