From 24042d20c2554b2648e7f76c3faabb00d363e5c0 Mon Sep 17 00:00:00 2001 From: DhanushSantosh Date: Sat, 17 Jan 2026 20:55:04 +0530 Subject: [PATCH] fix: filter dynamic OpenCode models by enabled status in model selector The phase model selector was showing ALL discovered dynamic models regardless of whether they were enabled in settings. Now it filters dynamic models by enabledDynamicModelIds, matching the behavior of Cursor models and making the enable/disable setting meaningful. Users can now: - Disable models in settings they don't want to use - See only enabled dynamic models in the model selector dropdown - Have the "Select all" checkbox properly control which models appear This ensures consistency: enabling/disabling models in settings affects which models are available for feature execution. Co-Authored-By: Claude Haiku 4.5 --- .../model-defaults/phase-model-selector.tsx | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/apps/ui/src/components/views/settings-view/model-defaults/phase-model-selector.tsx b/apps/ui/src/components/views/settings-view/model-defaults/phase-model-selector.tsx index ddd48b46..392445e0 100644 --- a/apps/ui/src/components/views/settings-view/model-defaults/phase-model-selector.tsx +++ b/apps/ui/src/components/views/settings-view/model-defaults/phase-model-selector.tsx @@ -166,6 +166,7 @@ export function PhaseModelSelector({ codexModelsLoading, fetchCodexModels, dynamicOpencodeModels, + enabledDynamicModelIds, opencodeModelsLoading, fetchOpencodeModels, disabledProviders, @@ -383,13 +384,16 @@ export function PhaseModelSelector({ const staticModels = [...OPENCODE_MODELS]; // Add dynamic models (convert ModelDefinition to ModelOption) - const dynamicModelOptions: ModelOption[] = dynamicOpencodeModels.map((model) => ({ - id: model.id, - label: model.name, - description: model.description, - badge: model.tier === 'premium' ? 'Premium' : model.tier === 'basic' ? 'Free' : undefined, - provider: 'opencode' as const, - })); + // Only include dynamic models that are enabled by the user + const dynamicModelOptions: ModelOption[] = dynamicOpencodeModels + .filter((model) => enabledDynamicModelIds.includes(model.id)) + .map((model) => ({ + id: model.id, + label: model.name, + description: model.description, + badge: model.tier === 'premium' ? 'Premium' : model.tier === 'basic' ? 'Free' : undefined, + provider: 'opencode' as const, + })); // Merge, avoiding duplicates (static models take precedence for same ID) // In practice, static and dynamic IDs don't overlap @@ -397,7 +401,7 @@ export function PhaseModelSelector({ const uniqueDynamic = dynamicModelOptions.filter((m) => !staticIds.has(m.id)); return [...staticModels, ...uniqueDynamic]; - }, [dynamicOpencodeModels]); + }, [dynamicOpencodeModels, enabledDynamicModelIds]); // Group models (filtering out disabled providers) const { favorites, claude, cursor, codex, opencode } = useMemo(() => {