diff --git a/apps/ui/src/components/views/project-settings-view/project-models-section.tsx b/apps/ui/src/components/views/project-settings-view/project-models-section.tsx index 5102d243..2e9bf40b 100644 --- a/apps/ui/src/components/views/project-settings-view/project-models-section.tsx +++ b/apps/ui/src/components/views/project-settings-view/project-models-section.tsx @@ -104,7 +104,10 @@ function FeatureDefaultModelOverrideSection({ project }: { project: Project }) { const hasOverride = !!projectOverride; const effectiveValue = projectOverride || globalValue; - // Get display name for a model + /** + * Formats a user-friendly model label using provider metadata when available, + * falling back to known Claude aliases or the raw model id. + */ const getModelDisplayName = (entry: PhaseModelEntry): string => { if (entry.providerId) { const provider = (claudeCompatibleProviders || []).find((p) => p.id === entry.providerId); @@ -127,10 +130,16 @@ function FeatureDefaultModelOverrideSection({ project }: { project: Project }) { return modelMap[entry.model] || entry.model; }; + /** + * Clears the project-level model override for this scope. + */ const handleClearOverride = () => { setProjectDefaultFeatureModel(project.id, null); }; + /** + * Sets the project-level model override for this scope. + */ const handleSetOverride = (entry: PhaseModelEntry) => { setProjectDefaultFeatureModel(project.id, entry); }; @@ -209,6 +218,10 @@ function FeatureDefaultModelOverrideSection({ project }: { project: Project }) { ); } +/** + * Renders a single phase override row, showing the effective model + * (project override or global default) and wiring selector/reset actions. + */ function PhaseOverrideItem({ phase, project, @@ -225,7 +238,10 @@ function PhaseOverrideItem({ const hasOverride = !!projectOverride; const effectiveValue = projectOverride || globalValue; - // Get display name for a model + /** + * Formats a user-friendly model label using provider metadata when available, + * falling back to known Claude aliases or the raw model id. + */ const getModelDisplayName = (entry: PhaseModelEntry): string => { if (entry.providerId) { const provider = (claudeCompatibleProviders || []).find((p) => p.id === entry.providerId); @@ -248,10 +264,16 @@ function PhaseOverrideItem({ return modelMap[entry.model] || entry.model; }; + /** + * Clears the project-level model override for this scope. + */ const handleClearOverride = () => { setProjectPhaseModelOverride(project.id, phase.key, null); }; + /** + * Sets the project-level model override for this scope. + */ const handleSetOverride = (entry: PhaseModelEntry) => { setProjectPhaseModelOverride(project.id, phase.key, entry); }; @@ -315,6 +337,10 @@ function PhaseOverrideItem({ ); } +/** + * Renders a titled group of phase override rows and resolves each phase's + * global default model with a fallback to DEFAULT_PHASE_MODELS. + */ function PhaseGroup({ title, subtitle, @@ -350,8 +376,11 @@ function PhaseGroup({ ); } +/** + * Renders the per-project model overrides UI for all phase models. + */ export function ProjectModelsSection({ project }: ProjectModelsSectionProps) { - const { clearAllProjectPhaseModelOverrides, disabledProviders, claudeCompatibleProviders } = + const { clearAllProjectPhaseModelOverrides, claudeCompatibleProviders } = useAppStore(); const [showBulkReplace, setShowBulkReplace] = useState(false); @@ -360,25 +389,13 @@ export function ProjectModelsSection({ project }: ProjectModelsSectionProps) { const hasDefaultFeatureModelOverride = !!project.defaultFeatureModel; const overrideCount = phaseOverrideCount + (hasDefaultFeatureModelOverride ? 1 : 0); - // Check if Claude is available - const isClaudeDisabled = disabledProviders.includes('claude'); - // Check if there are any enabled ClaudeCompatibleProviders const hasEnabledProviders = claudeCompatibleProviders && claudeCompatibleProviders.some((p) => p.enabled !== false); - if (isClaudeDisabled) { - return ( -
- -

Claude not configured

-

- Enable Claude in global settings to configure per-project model overrides. -

-
- ); - } - + /** + * Clears all project-level phase model overrides for this project. + */ const handleClearAll = () => { clearAllProjectPhaseModelOverrides(project.id); };