diff --git a/src/components/chat/view/ChatInterface.tsx b/src/components/chat/view/ChatInterface.tsx index 2bff948..3e624db 100644 --- a/src/components/chat/view/ChatInterface.tsx +++ b/src/components/chat/view/ChatInterface.tsx @@ -14,6 +14,7 @@ import { useSessionStore } from '../../../stores/useSessionStore'; import ChatMessagesPane from './subcomponents/ChatMessagesPane'; import ChatComposer from './subcomponents/ChatComposer'; +import ModelSelectorBar from './subcomponents/ModelSelectorBar'; type PendingViewSession = { @@ -72,6 +73,10 @@ function ChatInterface({ setCodexModel, geminiModel, setGeminiModel, + claudeModelOptions, + codexModelOptions, + geminiModelOptions, + cursorModelOptions, permissionMode, pendingPermissionRequests, setPendingPermissionRequests, @@ -171,6 +176,7 @@ function ChatInterface({ handleGrantToolPermission, handleInputFocusChange, isInputFocused, + messageQueue, } = useChatComposerState({ selectedProject, selectedSession, @@ -205,13 +211,11 @@ function ChatInterface({ }); // On WebSocket reconnect, re-fetch the current session's messages from the server - // so missed streaming events are shown. Also reset isLoading. const handleWebSocketReconnect = useCallback(async () => { if (!selectedProject || !selectedSession) return; const providerVal = (localStorage.getItem('selected-provider') as LLMProvider) || 'claude'; await sessionStore.refreshFromServer(selectedSession.id, { provider: (selectedSession.__provider || providerVal) as LLMProvider, - // Use DB projectId; legacy folder-derived projectName is no longer accepted here. projectId: selectedProject.projectId, projectPath: selectedProject.fullPath || selectedProject.path || '', }); @@ -299,6 +303,23 @@ function ChatInterface({ return (
+ {/* Floating model selector bar — always visible above messages */} + +