From 3576662e25c0eace70d598fc5f7571721534e70c Mon Sep 17 00:00:00 2001 From: Haileyesus <118998054+blackmammoth@users.noreply.github.com> Date: Fri, 5 Jun 2026 15:28:58 +0300 Subject: [PATCH] fix: remove thinking mode --- .../chat/constants/thinkingModes.ts | 44 ---- .../chat/hooks/useChatComposerState.ts | 12 +- src/components/chat/view/ChatInterface.tsx | 4 - .../chat/view/subcomponents/ChatComposer.tsx | 28 +- .../subcomponents/ThinkingModeSelector.tsx | 244 ------------------ src/i18n/locales/de/chat.json | 36 --- src/i18n/locales/en/chat.json | 36 --- src/i18n/locales/it/chat.json | 36 --- src/i18n/locales/ja/chat.json | 36 --- src/i18n/locales/ko/chat.json | 36 --- src/i18n/locales/ru/chat.json | 36 --- src/i18n/locales/tr/chat.json | 36 --- src/i18n/locales/zh-CN/chat.json | 36 --- 13 files changed, 11 insertions(+), 609 deletions(-) delete mode 100644 src/components/chat/constants/thinkingModes.ts delete mode 100644 src/components/chat/view/subcomponents/ThinkingModeSelector.tsx diff --git a/src/components/chat/constants/thinkingModes.ts b/src/components/chat/constants/thinkingModes.ts deleted file mode 100644 index 3b281319..00000000 --- a/src/components/chat/constants/thinkingModes.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Brain, Zap, Sparkles, Atom } from 'lucide-react'; - -export const thinkingModes = [ - { - id: 'none', - name: 'Standard', - description: 'Regular Claude response', - icon: null, - prefix: '', - color: 'text-gray-600' - }, - { - id: 'think', - name: 'Think', - description: 'Basic extended thinking', - icon: Brain, - prefix: 'think', - color: 'text-blue-600' - }, - { - id: 'think-hard', - name: 'Think Hard', - description: 'More thorough evaluation', - icon: Zap, - prefix: 'think hard', - color: 'text-purple-600' - }, - { - id: 'think-harder', - name: 'Think Harder', - description: 'Deep analysis with alternatives', - icon: Sparkles, - prefix: 'think harder', - color: 'text-indigo-600' - }, - { - id: 'ultrathink', - name: 'Ultrathink', - description: 'Maximum thinking budget', - icon: Atom, - prefix: 'ultrathink', - color: 'text-red-600' - } -]; \ No newline at end of file diff --git a/src/components/chat/hooks/useChatComposerState.ts b/src/components/chat/hooks/useChatComposerState.ts index 6d3b93df..7d2fc9b4 100644 --- a/src/components/chat/hooks/useChatComposerState.ts +++ b/src/components/chat/hooks/useChatComposerState.ts @@ -12,7 +12,6 @@ import type { import { useDropzone } from 'react-dropzone'; import { authenticatedFetch } from '../../../utils/api'; -import { thinkingModes } from '../constants/thinkingModes'; import { grantClaudeToolPermission } from '../utils/chatPermissions'; import { safeLocalStorage } from '../utils/chatStorage'; import type { @@ -204,7 +203,6 @@ export function useChatComposerState({ const [uploadingImages, setUploadingImages] = useState>(new Map()); const [imageErrors, setImageErrors] = useState>(new Map()); const [isTextareaExpanded, setIsTextareaExpanded] = useState(false); - const [thinkingMode, setThinkingMode] = useState('none'); const [commandModalPayload, setCommandModalPayload] = useState(null); const textareaRef = useRef(null); @@ -562,11 +560,7 @@ export function useChatComposerState({ } } - let messageContent = currentInput; - const selectedThinkingMode = thinkingModes.find((mode: { id: string; prefix?: string }) => mode.id === thinkingMode); - if (selectedThinkingMode && selectedThinkingMode.prefix) { - messageContent = `${selectedThinkingMode.prefix}: ${currentInput}`; - } + const messageContent = currentInput; let uploadedImages: unknown[] = []; if (attachedImages.length > 0) { @@ -749,7 +743,6 @@ export function useChatComposerState({ setUploadingImages(new Map()); setImageErrors(new Map()); setIsTextareaExpanded(false); - setThinkingMode('none'); if (textareaRef.current) { textareaRef.current.style.height = 'auto'; @@ -783,7 +776,6 @@ export function useChatComposerState({ setIsLoading, setIsUserScrolledUp, slashCommands, - thinkingMode, ], ); @@ -1020,8 +1012,6 @@ export function useChatComposerState({ textareaRef, inputHighlightRef, isTextareaExpanded, - thinkingMode, - setThinkingMode, slashCommandsCount, filteredCommands, frequentCommands, diff --git a/src/components/chat/view/ChatInterface.tsx b/src/components/chat/view/ChatInterface.tsx index 2f677bbb..850ae589 100644 --- a/src/components/chat/view/ChatInterface.tsx +++ b/src/components/chat/view/ChatInterface.tsx @@ -141,8 +141,6 @@ function ChatInterface({ textareaRef, inputHighlightRef, isTextareaExpanded, - thinkingMode, - setThinkingMode, slashCommandsCount, filteredCommands, frequentCommands, @@ -369,8 +367,6 @@ function ChatInterface({ provider={provider} permissionMode={permissionMode} onModeSwitch={cyclePermissionMode} - thinkingMode={thinkingMode} - setThinkingMode={setThinkingMode} tokenBudget={tokenBudget} slashCommandsCount={slashCommandsCount} onToggleCommandMenu={handleToggleCommandMenu} diff --git a/src/components/chat/view/subcomponents/ChatComposer.tsx b/src/components/chat/view/subcomponents/ChatComposer.tsx index f041b773..8b543f6a 100644 --- a/src/components/chat/view/subcomponents/ChatComposer.tsx +++ b/src/components/chat/view/subcomponents/ChatComposer.tsx @@ -2,23 +2,16 @@ import { useTranslation } from 'react-i18next'; import type { ChangeEvent, ClipboardEvent, - Dispatch, FormEvent, KeyboardEvent, MouseEvent, ReactNode, RefObject, - SetStateAction, TouchEvent, } from 'react'; import { ImageIcon, MessageSquareIcon, XIcon, ArrowDownIcon } from 'lucide-react'; + import type { PendingPermissionRequest, PermissionMode, Provider } from '../../types/types'; -import CommandMenu from './CommandMenu'; -import ClaudeStatus from './ClaudeStatus'; -import ImageAttachment from './ImageAttachment'; -import PermissionRequestsBanner from './PermissionRequestsBanner'; -import ThinkingModeSelector from './ThinkingModeSelector'; -import TokenUsageSummary from './TokenUsageSummary'; import { PromptInput, PromptInputHeader, @@ -30,6 +23,12 @@ import { PromptInputSubmit, } from '../../../../shared/view/ui'; +import CommandMenu from './CommandMenu'; +import ClaudeStatus from './ClaudeStatus'; +import ImageAttachment from './ImageAttachment'; +import PermissionRequestsBanner from './PermissionRequestsBanner'; +import TokenUsageSummary from './TokenUsageSummary'; + interface MentionableFile { name: string; path: string; @@ -58,8 +57,6 @@ interface ChatComposerProps { provider: Provider | string; permissionMode: PermissionMode | string; onModeSwitch: () => void; - thinkingMode: string; - setThinkingMode: Dispatch>; tokenBudget: Record | null; slashCommandsCount: number; onToggleCommandMenu: () => void; @@ -113,8 +110,6 @@ export default function ChatComposer({ provider, permissionMode, onModeSwitch, - thinkingMode, - setThinkingMode, tokenBudget, slashCommandsCount, onToggleCommandMenu, @@ -358,10 +353,6 @@ export default function ChatComposer({ - {provider === 'claude' && ( - {}} className="" /> - )} - @@ -400,7 +391,8 @@ export default function ChatComposer({ {sendByCtrlEnter ? t('input.hintText.ctrlEnter') : t('input.hintText.enter')} diff --git a/src/components/chat/view/subcomponents/ThinkingModeSelector.tsx b/src/components/chat/view/subcomponents/ThinkingModeSelector.tsx deleted file mode 100644 index 2b8d8062..00000000 --- a/src/components/chat/view/subcomponents/ThinkingModeSelector.tsx +++ /dev/null @@ -1,244 +0,0 @@ -import { useState, useRef, useEffect, useCallback, type CSSProperties } from 'react'; -import { createPortal } from 'react-dom'; -import { Brain, X } from 'lucide-react'; -import { useTranslation } from 'react-i18next'; -import { thinkingModes } from '../../constants/thinkingModes'; - -type ThinkingModeSelectorProps = { - selectedMode: string; - onModeChange: (modeId: string) => void; - onClose?: () => void; - className?: string; -}; - -function ThinkingModeSelector({ selectedMode, onModeChange, onClose, className = '' }: ThinkingModeSelectorProps) { - const { t } = useTranslation('chat'); - const [isOpen, setIsOpen] = useState(false); - const containerRef = useRef(null); - const triggerRef = useRef(null); - const dropdownRef = useRef(null); - const [dropdownStyle, setDropdownStyle] = useState(null); - - // Mapping from mode ID to translation key - const modeKeyMap: Record = { - 'think-hard': 'thinkHard', - 'think-harder': 'thinkHarder' - }; - // Create translated modes for display - const translatedModes = thinkingModes.map(mode => { - const modeKey = modeKeyMap[mode.id] || mode.id; - return { - ...mode, - name: t(`thinkingMode.modes.${modeKey}.name`), - description: t(`thinkingMode.modes.${modeKey}.description`), - prefix: t(`thinkingMode.modes.${modeKey}.prefix`) - }; - }); - - const closeDropdown = useCallback(() => { - setIsOpen(false); - onClose?.(); - }, [onClose]); - - const updateDropdownPosition = useCallback(() => { - const trigger = triggerRef.current; - const dropdown = dropdownRef.current; - if (!trigger || !dropdown || typeof window === 'undefined') { - return; - } - - const triggerRect = trigger.getBoundingClientRect(); - const viewportPadding = window.innerWidth < 640 ? 12 : 16; - const spacing = 8; - const width = Math.min(window.innerWidth - viewportPadding * 2, window.innerWidth < 640 ? 320 : 256); - let left = triggerRect.left + triggerRect.width / 2 - width / 2; - left = Math.max(viewportPadding, Math.min(left, window.innerWidth - width - viewportPadding)); - - const measuredHeight = dropdown.offsetHeight || 0; - const spaceBelow = window.innerHeight - triggerRect.bottom - spacing - viewportPadding; - const spaceAbove = triggerRect.top - spacing - viewportPadding; - const openBelow = spaceBelow >= Math.min(measuredHeight || 320, 320) || spaceBelow >= spaceAbove; - const availableHeight = Math.min( - window.innerHeight - viewportPadding * 2, - Math.max(180, openBelow ? spaceBelow : spaceAbove), - ); - const panelHeight = Math.min(measuredHeight || availableHeight, availableHeight); - const top = openBelow - ? Math.min(triggerRect.bottom + spacing, window.innerHeight - viewportPadding - panelHeight) - : Math.max(viewportPadding, triggerRect.top - spacing - panelHeight); - - setDropdownStyle({ - position: 'fixed', - top, - left, - width, - maxHeight: availableHeight, - zIndex: 80, - }); - }, []); - - useEffect(() => { - if (!isOpen) { - setDropdownStyle(null); - return; - } - - const rafId = window.requestAnimationFrame(updateDropdownPosition); - const handleViewportChange = () => updateDropdownPosition(); - - window.addEventListener('resize', handleViewportChange); - window.addEventListener('scroll', handleViewportChange, true); - - return () => { - window.cancelAnimationFrame(rafId); - window.removeEventListener('resize', handleViewportChange); - window.removeEventListener('scroll', handleViewportChange, true); - }; - }, [isOpen, updateDropdownPosition]); - - useEffect(() => { - if (!isOpen) { - return; - } - - const handlePointerDown = (event: PointerEvent) => { - const target = event.target; - if (!(target instanceof Node)) { - return; - } - - if (containerRef.current?.contains(target) || dropdownRef.current?.contains(target)) { - return; - } - - closeDropdown(); - }; - - const handleKeyDown = (event: KeyboardEvent) => { - if (event.key === 'Escape') { - closeDropdown(); - } - }; - - document.addEventListener('pointerdown', handlePointerDown, true); - document.addEventListener('keydown', handleKeyDown); - - return () => { - document.removeEventListener('pointerdown', handlePointerDown, true); - document.removeEventListener('keydown', handleKeyDown); - }; - }, [isOpen, closeDropdown]); - - const currentMode = translatedModes.find(mode => mode.id === selectedMode) || translatedModes[0]; - const IconComponent = currentMode.icon || Brain; - - return ( -
- - - {isOpen && typeof document !== 'undefined' && createPortal( -
-
-
-

- {t('thinkingMode.selector.title')} -

- -
-

- {t('thinkingMode.selector.description')} -

-
- -
- {translatedModes.map((mode) => { - const ModeIcon = mode.icon; - const isSelected = mode.id === selectedMode; - - return ( - - ); - })} -
- -
-

- Tip: {t('thinkingMode.selector.tip')} -

-
-
, - document.body - )} -
- ); -} - -export default ThinkingModeSelector; diff --git a/src/i18n/locales/de/chat.json b/src/i18n/locales/de/chat.json index 1737114a..f0b10d7a 100644 --- a/src/i18n/locales/de/chat.json +++ b/src/i18n/locales/de/chat.json @@ -138,42 +138,6 @@ "clearInput": "Eingabe leeren", "scrollToBottom": "Nach unten scrollen" }, - "thinkingMode": { - "selector": { - "title": "Denkmodus", - "description": "Erweitertes Denken gibt Claude mehr Zeit, Alternativen zu evaluieren", - "active": "Aktiv", - "tip": "Höhere Denkmodi brauchen mehr Zeit, liefern aber eine gründlichere Analyse" - }, - "modes": { - "none": { - "name": "Standard", - "description": "Reguläre Claude-Antwort", - "prefix": "" - }, - "think": { - "name": "Denken", - "description": "Grundlegendes erweitertes Denken", - "prefix": "think" - }, - "thinkHard": { - "name": "Intensiv denken", - "description": "Gründlichere Auswertung", - "prefix": "think hard" - }, - "thinkHarder": { - "name": "Sehr intensiv denken", - "description": "Tiefgehende Analyse mit Alternativen", - "prefix": "think harder" - }, - "ultrathink": { - "name": "Ultradenken", - "description": "Maximales Denkbudget", - "prefix": "ultrathink" - } - }, - "buttonTitle": "Denkmodus: {{mode}}" - }, "providerSelection": { "title": "KI-Assistent wählen", "description": "Anbieter auswählen, um eine neue Unterhaltung zu starten", diff --git a/src/i18n/locales/en/chat.json b/src/i18n/locales/en/chat.json index 2f5af581..0ab11187 100644 --- a/src/i18n/locales/en/chat.json +++ b/src/i18n/locales/en/chat.json @@ -139,42 +139,6 @@ "clearInput": "Clear input", "scrollToBottom": "Scroll to bottom" }, - "thinkingMode": { - "selector": { - "title": "Thinking Mode", - "description": "Extended thinking gives Claude more time to evaluate alternatives", - "active": "Active", - "tip": "Higher thinking modes take more time but provide more thorough analysis" - }, - "modes": { - "none": { - "name": "Standard", - "description": "Regular Claude response", - "prefix": "" - }, - "think": { - "name": "Think", - "description": "Basic extended thinking", - "prefix": "think" - }, - "thinkHard": { - "name": "Think Hard", - "description": "More thorough evaluation", - "prefix": "think hard" - }, - "thinkHarder": { - "name": "Think Harder", - "description": "Deep analysis with alternatives", - "prefix": "think harder" - }, - "ultrathink": { - "name": "Ultrathink", - "description": "Maximum thinking budget", - "prefix": "ultrathink" - } - }, - "buttonTitle": "Thinking mode: {{mode}}" - }, "providerSelection": { "title": "Choose Your AI Assistant", "description": "Select a provider to start a new conversation", diff --git a/src/i18n/locales/it/chat.json b/src/i18n/locales/it/chat.json index 848e5bfb..ae845d9a 100644 --- a/src/i18n/locales/it/chat.json +++ b/src/i18n/locales/it/chat.json @@ -138,42 +138,6 @@ "clearInput": "Cancella input", "scrollToBottom": "Scorri in basso" }, - "thinkingMode": { - "selector": { - "title": "Modalità ragionamento", - "description": "Il ragionamento esteso dà a Claude più tempo per valutare le alternative", - "active": "Attivo", - "tip": "Modalità di ragionamento più elevate richiedono più tempo ma forniscono un'analisi più approfondita" - }, - "modes": { - "none": { - "name": "Standard", - "description": "Risposta Claude normale", - "prefix": "" - }, - "think": { - "name": "Pensa", - "description": "Ragionamento esteso base", - "prefix": "think" - }, - "thinkHard": { - "name": "Pensa di più", - "description": "Valutazione più approfondita", - "prefix": "think hard" - }, - "thinkHarder": { - "name": "Pensa ancora", - "description": "Analisi profonda con alternative", - "prefix": "think harder" - }, - "ultrathink": { - "name": "Ultrapensiero", - "description": "Budget massimo di ragionamento", - "prefix": "ultrathink" - } - }, - "buttonTitle": "Modalità ragionamento: {{mode}}" - }, "providerSelection": { "title": "Scegli il tuo assistente AI", "description": "Seleziona un provider per iniziare una nuova conversazione", diff --git a/src/i18n/locales/ja/chat.json b/src/i18n/locales/ja/chat.json index 780bf76c..cd20292e 100644 --- a/src/i18n/locales/ja/chat.json +++ b/src/i18n/locales/ja/chat.json @@ -117,42 +117,6 @@ "clickToChangeMode": "クリックで権限モードを変更(または入力欄でTab)", "showAllCommands": "すべてのコマンドを表示" }, - "thinkingMode": { - "selector": { - "title": "思考モード", - "description": "拡張思考によりClaudeがより多くの選択肢を検討できます", - "active": "有効", - "tip": "高い思考モードは時間がかかりますが、より深い分析が得られます" - }, - "modes": { - "none": { - "name": "標準", - "description": "通常のClaudeの応答", - "prefix": "" - }, - "think": { - "name": "Think", - "description": "基本的な拡張思考", - "prefix": "think" - }, - "thinkHard": { - "name": "Think Hard", - "description": "より深い検討", - "prefix": "think hard" - }, - "thinkHarder": { - "name": "Think Harder", - "description": "代替案を含む深い分析", - "prefix": "think harder" - }, - "ultrathink": { - "name": "Ultrathink", - "description": "最大限の思考予算", - "prefix": "ultrathink" - } - }, - "buttonTitle": "思考モード: {{mode}}" - }, "providerSelection": { "title": "AIアシスタントを選択", "description": "新しい会話を始めるプロバイダーを選択してください", diff --git a/src/i18n/locales/ko/chat.json b/src/i18n/locales/ko/chat.json index 545f35ce..c9df5c2e 100644 --- a/src/i18n/locales/ko/chat.json +++ b/src/i18n/locales/ko/chat.json @@ -120,42 +120,6 @@ "clearInput": "입력 지우기", "scrollToBottom": "맨 아래로 스크롤" }, - "thinkingMode": { - "selector": { - "title": "Thinking 모드", - "description": "확장된 thinking은 Claude에게 대안을 평가할 시간을 더 줍니다", - "active": "활성", - "tip": "높은 thinking 모드는 시간이 더 걸리지만 더 철저한 분석을 제공합니다" - }, - "modes": { - "none": { - "name": "Standard", - "description": "일반 Claude 응답", - "prefix": "" - }, - "think": { - "name": "Think", - "description": "기본 확장 thinking", - "prefix": "think" - }, - "thinkHard": { - "name": "Think Hard", - "description": "더 철저한 평가", - "prefix": "think hard" - }, - "thinkHarder": { - "name": "Think Harder", - "description": "대안을 포함한 심층 분석", - "prefix": "think harder" - }, - "ultrathink": { - "name": "Ultrathink", - "description": "최대 thinking 예산", - "prefix": "ultrathink" - } - }, - "buttonTitle": "Thinking 모드: {{mode}}" - }, "providerSelection": { "title": "AI 어시스턴트 선택", "description": "새 대화를 시작할 프로바이더를 선택하세요", diff --git a/src/i18n/locales/ru/chat.json b/src/i18n/locales/ru/chat.json index 4be43572..8d3e9e09 100644 --- a/src/i18n/locales/ru/chat.json +++ b/src/i18n/locales/ru/chat.json @@ -138,42 +138,6 @@ "clearInput": "Очистить ввод", "scrollToBottom": "Прокрутить вниз" }, - "thinkingMode": { - "selector": { - "title": "Режим размышления", - "description": "Расширенное размышление дает Claude больше времени для оценки альтернатив", - "active": "Активен", - "tip": "Более высокие режимы размышления занимают больше времени, но обеспечивают более тщательный анализ" - }, - "modes": { - "none": { - "name": "Стандартный", - "description": "Обычный ответ Claude", - "prefix": "" - }, - "think": { - "name": "Думать", - "description": "Базовое расширенное размышление", - "prefix": "думать" - }, - "thinkHard": { - "name": "Думать усердно", - "description": "Более тщательная оценка", - "prefix": "думать усердно" - }, - "thinkHarder": { - "name": "Думать еще усерднее", - "description": "Глубокий анализ с альтернативами", - "prefix": "думать еще усерднее" - }, - "ultrathink": { - "name": "Ультра-размышление", - "description": "Максимальный бюджет размышления", - "prefix": "ультра-размышление" - } - }, - "buttonTitle": "Режим размышления: {{mode}}" - }, "providerSelection": { "title": "Выберите вашего AI-ассистента", "description": "Выберите провайдера для начала нового разговора", diff --git a/src/i18n/locales/tr/chat.json b/src/i18n/locales/tr/chat.json index fb2cde17..74ce9548 100644 --- a/src/i18n/locales/tr/chat.json +++ b/src/i18n/locales/tr/chat.json @@ -138,42 +138,6 @@ "clearInput": "Girdiyi temizle", "scrollToBottom": "En alta git" }, - "thinkingMode": { - "selector": { - "title": "Düşünme Modu", - "description": "Uzatılmış düşünme, Claude'a alternatifleri değerlendirmek için daha fazla zaman verir", - "active": "Aktif", - "tip": "Daha yüksek düşünme modları daha fazla zaman alır ama daha kapsamlı analiz sağlar" - }, - "modes": { - "none": { - "name": "Standart", - "description": "Normal Claude yanıtı", - "prefix": "" - }, - "think": { - "name": "Düşün", - "description": "Temel uzatılmış düşünme", - "prefix": "think" - }, - "thinkHard": { - "name": "Daha Fazla Düşün", - "description": "Daha kapsamlı değerlendirme", - "prefix": "think hard" - }, - "thinkHarder": { - "name": "Derin Düşün", - "description": "Alternatiflerle derin analiz", - "prefix": "think harder" - }, - "ultrathink": { - "name": "Ultra Düşün", - "description": "Maksimum düşünme bütçesi", - "prefix": "ultrathink" - } - }, - "buttonTitle": "Düşünme modu: {{mode}}" - }, "providerSelection": { "title": "AI Asistanını Seç", "description": "Yeni bir konuşma başlatmak için bir sağlayıcı seç", diff --git a/src/i18n/locales/zh-CN/chat.json b/src/i18n/locales/zh-CN/chat.json index 7f882281..8ebe68d1 100644 --- a/src/i18n/locales/zh-CN/chat.json +++ b/src/i18n/locales/zh-CN/chat.json @@ -120,42 +120,6 @@ "clearInput": "清空输入", "scrollToBottom": "滚动到底部" }, - "thinkingMode": { - "selector": { - "title": "思考模式", - "description": "扩展思考给 Claude 更多时间来评估替代方案", - "active": "激活", - "tip": "更高的思考模式需要更多时间,但提供更彻底的分析" - }, - "modes": { - "none": { - "name": "标准", - "description": "常规 Claude 响应", - "prefix": "" - }, - "think": { - "name": "思考", - "description": "基本扩展思考", - "prefix": "思考" - }, - "thinkHard": { - "name": "深入思考", - "description": "更彻底的评估", - "prefix": "深入思考" - }, - "thinkHarder": { - "name": "更深入思考", - "description": "考虑替代方案的深度分析", - "prefix": "更深入思考" - }, - "ultrathink": { - "name": "超级思考", - "description": "最大思考预算", - "prefix": "超级思考" - } - }, - "buttonTitle": "思考模式:{{mode}}" - }, "providerSelection": { "title": "选择您的 AI 助手", "description": "选择一个供应商以开始新对话",