import { useState, useCallback, useMemo } from 'react'; import { useAppStore } from '@/store/app-store'; import type { ModelAlias, CursorModelId, PhaseModelKey } from '@automaker/types'; export interface UseModelOverrideOptions { /** Which phase this override is for */ phase: PhaseModelKey; /** Initial override value (optional) */ initialOverride?: ModelAlias | CursorModelId | null; } export interface UseModelOverrideResult { /** The effective model (override or global default) */ effectiveModel: ModelAlias | CursorModelId; /** Whether the model is currently overridden */ isOverridden: boolean; /** Set a model override */ setOverride: (model: ModelAlias | CursorModelId | null) => void; /** Clear the override and use global default */ clearOverride: () => void; /** The global default for this phase */ globalDefault: ModelAlias | CursorModelId; /** The current override value (null if not overridden) */ override: ModelAlias | CursorModelId | null; } /** * Hook for managing model overrides per phase * * Provides a simple way to allow users to override the global phase model * for a specific run or context. * * @example * ```tsx * function EnhanceDialog() { * const { effectiveModel, isOverridden, setOverride, clearOverride } = useModelOverride({ * phase: 'enhancementModel', * }); * * return ( * * ); * } * ``` */ export function useModelOverride({ phase, initialOverride = null, }: UseModelOverrideOptions): UseModelOverrideResult { const { phaseModels } = useAppStore(); const [override, setOverrideState] = useState(initialOverride); const globalDefault = phaseModels[phase]; const effectiveModel = useMemo(() => { return override ?? globalDefault; }, [override, globalDefault]); const isOverridden = override !== null; const setOverride = useCallback((model: ModelAlias | CursorModelId | null) => { setOverrideState(model); }, []); const clearOverride = useCallback(() => { setOverrideState(null); }, []); return { effectiveModel, isOverridden, setOverride, clearOverride, globalDefault, override, }; }