11import { TorchGlow } from "@components/TorchGlow" ;
22import { FolderPicker } from "@features/folder-picker/components/FolderPicker" ;
33import type { MessageEditorHandle } from "@features/message-editor/components/MessageEditor" ;
4+ import { useModelsStore } from "@features/sessions/stores/modelsStore" ;
45import type { AgentAdapter } from "@features/settings/stores/settingsStore" ;
56import { useSettingsStore } from "@features/settings/stores/settingsStore" ;
67import { useRepositoryIntegration } from "@hooks/useIntegrations" ;
@@ -13,6 +14,7 @@ import { useTaskCreation } from "../hooks/useTaskCreation";
1314import { AdapterSelect } from "./AdapterSelect" ;
1415import { SuggestedTasks } from "./SuggestedTasks" ;
1516import { TaskInputEditor } from "./TaskInputEditor" ;
17+ import { TaskInputModelSelector } from "./TaskInputModelSelector" ;
1618import { type WorkspaceMode , WorkspaceModeSelect } from "./WorkspaceModeSelect" ;
1719
1820const DOT_FILL = "var(--gray-6)" ;
@@ -25,7 +27,10 @@ export function TaskInput() {
2527 setLastUsedLocalWorkspaceMode,
2628 lastUsedAdapter,
2729 setLastUsedAdapter,
30+ lastUsedModel,
31+ setLastUsedModel,
2832 } = useSettingsStore ( ) ;
33+ const { getEffectiveModel } = useModelsStore ( ) ;
2934
3035 const editorRef = useRef < MessageEditorHandle > ( null ) ;
3136 const containerRef = useRef < HTMLDivElement > ( null ) ;
@@ -36,13 +41,15 @@ export function TaskInput() {
3641 const selectedDirectory = lastUsedDirectory || "" ;
3742 const workspaceMode = lastUsedLocalWorkspaceMode || "worktree" ;
3843 const adapter = lastUsedAdapter ;
44+ const selectedModel = lastUsedModel ?? getEffectiveModel ( ) ;
3945
4046 const setSelectedDirectory = ( path : string ) =>
4147 setLastUsedDirectory ( path || null ) ;
4248 const setWorkspaceMode = ( mode : WorkspaceMode ) =>
4349 setLastUsedLocalWorkspaceMode ( mode as "worktree" | "local" ) ;
4450 const setAdapter = ( newAdapter : AgentAdapter ) =>
4551 setLastUsedAdapter ( newAdapter ) ;
52+ const setSelectedModel = ( model : string ) => setLastUsedModel ( model ) ;
4653
4754 const { githubIntegration } = useRepositoryIntegration ( ) ;
4855
@@ -56,6 +63,31 @@ export function TaskInput() {
5663 }
5764 } , [ view . folderId , setLastUsedDirectory ] ) ;
5865
66+ // When adapter changes, validate that selected model is compatible
67+ useEffect ( ( ) => {
68+ const { groupedModels } = useModelsStore . getState ( ) ;
69+ if ( groupedModels . length === 0 ) return ;
70+
71+ // Filter models by current adapter
72+ const compatibleModels =
73+ adapter === "claude"
74+ ? groupedModels . filter ( ( g ) => g . provider === "Anthropic" )
75+ : groupedModels . filter ( ( g ) => g . provider !== "Anthropic" ) ;
76+
77+ const allCompatibleModelIds = compatibleModels . flatMap ( ( g ) =>
78+ g . models . map ( ( m ) => m . modelId ) ,
79+ ) ;
80+
81+ // If current model is not compatible with adapter, select first available model
82+ if ( ! selectedModel || ! allCompatibleModelIds . includes ( selectedModel ) ) {
83+ // Get first available model for this adapter
84+ const firstCompatibleModel = compatibleModels [ 0 ] ?. models [ 0 ] ?. modelId ;
85+ if ( firstCompatibleModel ) {
86+ setLastUsedModel ( firstCompatibleModel ) ;
87+ }
88+ }
89+ } , [ adapter , selectedModel , setLastUsedModel ] ) ;
90+
5991 const effectiveWorkspaceMode = workspaceMode ;
6092
6193 const { isCreatingTask, canSubmit, handleSubmit } = useTaskCreation ( {
@@ -66,6 +98,7 @@ export function TaskInput() {
6698 branch : null ,
6799 editorIsEmpty,
68100 adapter,
101+ model : selectedModel ,
69102 } ) ;
70103
71104 return (
@@ -146,6 +179,12 @@ export function TaskInput() {
146179 size = "1"
147180 />
148181 < AdapterSelect value = { adapter } onChange = { setAdapter } size = "1" />
182+ < TaskInputModelSelector
183+ value = { selectedModel }
184+ onChange = { setSelectedModel }
185+ adapter = { adapter }
186+ size = "1"
187+ />
149188 </ Flex >
150189
151190 < TaskInputEditor
0 commit comments