@@ -1648,7 +1648,7 @@ const ImageAttachment = ({ file, onRemove, uploadProgress, error }) => {
16481648//
16491649// This ensures uninterrupted chat experience by pausing sidebar refreshes during conversations.
16501650function ChatInterface ( { selectedProject, selectedSession, ws, sendMessage, messages, onFileOpen, onInputFocusChange, onSessionActive, onSessionInactive, onSessionProcessing, onSessionNotProcessing, processingSessions, onReplaceTemporarySession, onNavigateToSession, onShowSettings, autoExpandTools, showRawParameters, showThinking, autoScrollToBottom, sendByCtrlEnter, externalMessageUpdate, onTaskClick, onShowAllTasks } ) {
1651- const { tasksEnabled } = useTasksSettings ( ) ;
1651+ const { tasksEnabled, isTaskMasterInstalled } = useTasksSettings ( ) ;
16521652 const [ input , setInput ] = useState ( ( ) => {
16531653 if ( typeof window !== 'undefined' && selectedProject ) {
16541654 return safeLocalStorage . getItem ( `draft_input_${ selectedProject . name } ` ) || '' ;
@@ -1716,6 +1716,9 @@ function ChatInterface({ selectedProject, selectedSession, ws, sendMessage, mess
17161716 const [ cursorModel , setCursorModel ] = useState ( ( ) => {
17171717 return localStorage . getItem ( 'cursor-model' ) || 'gpt-5' ;
17181718 } ) ;
1719+ const [ claudeModel , setClaudeModel ] = useState ( ( ) => {
1720+ return localStorage . getItem ( 'claude-model' ) || 'sonnet' ;
1721+ } ) ;
17191722 // Load permission mode for the current session
17201723 useEffect ( ( ) => {
17211724 if ( selectedSession ?. id ) {
@@ -2047,7 +2050,7 @@ function ChatInterface({ selectedProject, selectedSession, ws, sendMessage, mess
20472050 projectName : selectedProject . name ,
20482051 sessionId : currentSessionId ,
20492052 provider,
2050- model : provider === 'cursor' ? cursorModel : 'claude-sonnet-4.5' ,
2053+ model : provider === 'cursor' ? cursorModel : claudeModel ,
20512054 tokenUsage : tokenBudget
20522055 } ;
20532056
@@ -3863,6 +3866,7 @@ function ChatInterface({ selectedProject, selectedSession, ws, sendMessage, mess
38633866 resume : ! ! currentSessionId ,
38643867 toolsSettings : toolsSettings ,
38653868 permissionMode : permissionMode ,
3869+ model : claudeModel ,
38663870 images : uploadedImages // Pass images to backend
38673871 }
38683872 } ) ;
@@ -3883,7 +3887,7 @@ function ChatInterface({ selectedProject, selectedSession, ws, sendMessage, mess
38833887 if ( selectedProject ) {
38843888 safeLocalStorage . removeItem ( `draft_input_${ selectedProject . name } ` ) ;
38853889 }
3886- } , [ input , isLoading , selectedProject , attachedImages , currentSessionId , selectedSession , provider , permissionMode , onSessionActive , cursorModel , sendMessage , setInput , setAttachedImages , setUploadingImages , setImageErrors , setIsTextareaExpanded , textareaRef , setChatMessages , setIsLoading , setCanAbortSession , setClaudeStatus , setIsUserScrolledUp , scrollToBottom ] ) ;
3890+ } , [ input , isLoading , selectedProject , attachedImages , currentSessionId , selectedSession , provider , permissionMode , onSessionActive , cursorModel , claudeModel , sendMessage , setInput , setAttachedImages , setUploadingImages , setImageErrors , setIsTextareaExpanded , textareaRef , setChatMessages , setIsLoading , setCanAbortSession , setClaudeStatus , setIsUserScrolledUp , scrollToBottom ] ) ;
38873891
38883892 // Store handleSubmit in ref so handleCustomCommand can access it
38893893 useEffect ( ( ) => {
@@ -4282,40 +4286,72 @@ function ChatInterface({ selectedProject, selectedSession, ws, sendMessage, mess
42824286 </ button >
42834287 </ div >
42844288
4285- { /* Model Selection for Cursor - Always reserve space to prevent jumping */ }
4286- < div className = { `mb-6 transition-opacity duration-200 ${ provider === 'cursor' ? 'opacity-100' : 'opacity-0 pointer-events-none' } ` } >
4289+ { /* Model Selection - Always reserve space to prevent jumping */ }
4290+ < div className = { `mb-6 transition-opacity duration-200 ${ provider ? 'opacity-100' : 'opacity-0 pointer-events-none' } ` } >
42874291 < label className = "block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2" >
4288- { provider === 'cursor' ? ' Select Model' : '\u00A0' }
4292+ Select Model
42894293 </ label >
4290- < select
4291- value = { cursorModel }
4292- onChange = { ( e ) => {
4293- const newModel = e . target . value ;
4294- setCursorModel ( newModel ) ;
4295- localStorage . setItem ( 'cursor-model' , newModel ) ;
4296- } }
4297- className = "pl-4 pr-10 py-2 text-sm bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-purple-500 min-w-[140px]"
4298- disabled = { provider !== 'cursor' }
4299- >
4300- < option value = "gpt-5" > GPT-5</ option >
4301- < option value = "sonnet-4" > Sonnet-4</ option >
4302- < option value = "opus-4.1" > Opus 4.1</ option >
4303- </ select >
4294+ { provider === 'claude' ? (
4295+ < select
4296+ value = { claudeModel }
4297+ onChange = { ( e ) => {
4298+ const newModel = e . target . value ;
4299+ setClaudeModel ( newModel ) ;
4300+ localStorage . setItem ( 'claude-model' , newModel ) ;
4301+ } }
4302+ className = "pl-4 pr-10 py-2 text-sm bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-purple-500 min-w-[140px]"
4303+ >
4304+ < option value = "sonnet" > Sonnet</ option >
4305+ < option value = "opus" > Opus</ option >
4306+ < option value = "haiku" > Haiku</ option >
4307+ < option value = "opusplan" > Opus Plan</ option >
4308+ < option value = "sonnet[1m]" > Sonnet [1M]</ option >
4309+ </ select >
4310+ ) : (
4311+ < select
4312+ value = { cursorModel }
4313+ onChange = { ( e ) => {
4314+ const newModel = e . target . value ;
4315+ setCursorModel ( newModel ) ;
4316+ localStorage . setItem ( 'cursor-model' , newModel ) ;
4317+ } }
4318+ className = "pl-4 pr-10 py-2 text-sm bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-purple-500 min-w-[140px]"
4319+ disabled = { provider !== 'cursor' }
4320+ >
4321+ < option value = "gpt-5.2-high" > GPT-5.2 High</ option >
4322+ < option value = "gemini-3-pro" > Gemini 3 Pro</ option >
4323+ < option value = "opus-4.5-thinking" > Claude 4.5 Opus (Thinking)</ option >
4324+ < option value = "gpt-5.2" > GPT-5.2</ option >
4325+ < option value = "gpt-5.1" > GPT-5.1</ option >
4326+ < option value = "gpt-5.1-high" > GPT-5.1 High</ option >
4327+ < option value = "composer-1" > Composer 1</ option >
4328+ < option value = "auto" > Auto</ option >
4329+ < option value = "sonnet-4.5" > Claude 4.5 Sonnet</ option >
4330+ < option value = "sonnet-4.5-thinking" > Claude 4.5 Sonnet (Thinking)</ option >
4331+ < option value = "opus-4.5" > Claude 4.5 Opus</ option >
4332+ < option value = "gpt-5.1-codex" > GPT-5.1 Codex</ option >
4333+ < option value = "gpt-5.1-codex-high" > GPT-5.1 Codex High</ option >
4334+ < option value = "gpt-5.1-codex-max" > GPT-5.1 Codex Max</ option >
4335+ < option value = "gpt-5.1-codex-max-high" > GPT-5.1 Codex Max High</ option >
4336+ < option value = "opus-4.1" > Claude 4.1 Opus</ option >
4337+ < option value = "grok" > Grok</ option >
4338+ </ select >
4339+ ) }
43044340 </ div >
43054341
43064342 < p className = "text-sm text-gray-500 dark:text-gray-400" >
4307- { provider === 'claude'
4308- ? ' Ready to use Claude AI . Start typing your message below.'
4343+ { provider === 'claude'
4344+ ? ` Ready to use Claude with ${ claudeModel } . Start typing your message below.`
43094345 : provider === 'cursor'
43104346 ? `Ready to use Cursor with ${ cursorModel } . Start typing your message below.`
43114347 : 'Select a provider above to begin'
43124348 }
43134349 </ p >
43144350
4315- { /* Show NextTaskBanner when provider is selected and ready */ }
4316- { provider && tasksEnabled && (
4351+ { /* Show NextTaskBanner when provider is selected and ready, only if TaskMaster is installed */ }
4352+ { provider && tasksEnabled && isTaskMasterInstalled && (
43174353 < div className = "mt-4 px-4 sm:px-0" >
4318- < NextTaskBanner
4354+ < NextTaskBanner
43194355 onStartTask = { ( ) => setInput ( 'Start the next task' ) }
43204356 onShowAllTasks = { onShowAllTasks }
43214357 />
@@ -4330,10 +4366,10 @@ function ChatInterface({ selectedProject, selectedSession, ws, sendMessage, mess
43304366 Ask questions about your code, request changes, or get help with development tasks
43314367 </ p >
43324368
4333- { /* Show NextTaskBanner for existing sessions too */ }
4334- { tasksEnabled && (
4369+ { /* Show NextTaskBanner for existing sessions too, only if TaskMaster is installed */ }
4370+ { tasksEnabled && isTaskMasterInstalled && (
43354371 < div className = "mt-4 px-4 sm:px-0" >
4336- < NextTaskBanner
4372+ < NextTaskBanner
43374373 onStartTask = { ( ) => setInput ( 'Start the next task' ) }
43384374 onShowAllTasks = { onShowAllTasks }
43394375 />
0 commit comments