diff --git a/package.json b/package.json index 60ad85b638..f6bbde8a2b 100644 --- a/package.json +++ b/package.json @@ -179,6 +179,11 @@ "command": "roo-cline.focusInput", "title": "%command.focusInput.title%", "category": "%extension.displayName%" + }, + { + "command": "roo.acceptInput", + "title": "%command.acceptInput.title%", + "category": "%extension.displayName%" } ], "menus": { diff --git a/package.nls.ca.json b/package.nls.ca.json index 29c7ba0afc..1967482973 100644 --- a/package.nls.ca.json +++ b/package.nls.ca.json @@ -14,6 +14,7 @@ "command.terminal.explainCommand.title": "Explicar Aquesta Ordre", "command.terminal.fixCommandInCurrentTask.title": "Corregir Aquesta Ordre (Tasca Actual)", "command.terminal.explainCommandInCurrentTask.title": "Explicar Aquesta Ordre (Tasca Actual)", + "command.acceptInput.title": "Acceptar Entrada/Suggeriment", "views.activitybar.title": "Roo Code", "views.contextMenu.label": "Roo Code", "views.terminalMenu.label": "Roo Code", diff --git a/package.nls.de.json b/package.nls.de.json index cc3c629c63..0207fa92df 100644 --- a/package.nls.de.json +++ b/package.nls.de.json @@ -14,6 +14,7 @@ "command.terminal.explainCommand.title": "Diesen Befehl Erklären", "command.terminal.fixCommandInCurrentTask.title": "Diesen Befehl Reparieren (Aktuelle Aufgabe)", "command.terminal.explainCommandInCurrentTask.title": "Diesen Befehl Erklären (Aktuelle Aufgabe)", + "command.acceptInput.title": "Eingabe/Vorschlag Akzeptieren", "views.activitybar.title": "Roo Code", "views.contextMenu.label": "Roo Code", "views.terminalMenu.label": "Roo Code", diff --git a/package.nls.es.json b/package.nls.es.json index cadebe311e..752846b5cf 100644 --- a/package.nls.es.json +++ b/package.nls.es.json @@ -14,6 +14,7 @@ "command.terminal.explainCommand.title": "Explicar Este Comando", "command.terminal.fixCommandInCurrentTask.title": "Corregir Este Comando (Tarea Actual)", "command.terminal.explainCommandInCurrentTask.title": "Explicar Este Comando (Tarea Actual)", + "command.acceptInput.title": "Aceptar Entrada/Sugerencia", "views.activitybar.title": "Roo Code", "views.contextMenu.label": "Roo Code", "views.terminalMenu.label": "Roo Code", diff --git a/package.nls.fr.json b/package.nls.fr.json index d1023a7bd2..d7ab199df8 100644 --- a/package.nls.fr.json +++ b/package.nls.fr.json @@ -14,6 +14,7 @@ "command.terminal.explainCommand.title": "Expliquer cette Commande", "command.terminal.fixCommandInCurrentTask.title": "Corriger cette Commande (Tâche Actuelle)", "command.terminal.explainCommandInCurrentTask.title": "Expliquer cette Commande (Tâche Actuelle)", + "command.acceptInput.title": "Accepter l'Entrée/Suggestion", "views.activitybar.title": "Roo Code", "views.contextMenu.label": "Roo Code", "views.terminalMenu.label": "Roo Code", diff --git a/package.nls.hi.json b/package.nls.hi.json index 9f0ecbb1ac..50419a6b1e 100644 --- a/package.nls.hi.json +++ b/package.nls.hi.json @@ -14,6 +14,7 @@ "command.terminal.explainCommand.title": "यह कमांड समझाएं", "command.terminal.fixCommandInCurrentTask.title": "यह कमांड ठीक करें (वर्तमान कार्य)", "command.terminal.explainCommandInCurrentTask.title": "यह कमांड समझाएं (वर्तमान कार्य)", + "command.acceptInput.title": "इनपुट/सुझाव स्वीकारें", "views.activitybar.title": "Roo Code", "views.contextMenu.label": "Roo Code", "views.terminalMenu.label": "Roo Code", diff --git a/package.nls.it.json b/package.nls.it.json index 2e69a977a6..32b47a8a1a 100644 --- a/package.nls.it.json +++ b/package.nls.it.json @@ -14,6 +14,7 @@ "command.terminal.explainCommand.title": "Spiega Questo Comando", "command.terminal.fixCommandInCurrentTask.title": "Correggi Questo Comando (Task Corrente)", "command.terminal.explainCommandInCurrentTask.title": "Spiega Questo Comando (Task Corrente)", + "command.acceptInput.title": "Accetta Input/Suggerimento", "views.activitybar.title": "Roo Code", "views.contextMenu.label": "Roo Code", "views.terminalMenu.label": "Roo Code", diff --git a/package.nls.ja.json b/package.nls.ja.json index 6fbe01f9e8..76eb5246fa 100644 --- a/package.nls.ja.json +++ b/package.nls.ja.json @@ -23,6 +23,7 @@ "command.terminal.explainCommand.title": "このコマンドを説明", "command.terminal.fixCommandInCurrentTask.title": "このコマンドを修正(現在のタスク)", "command.terminal.explainCommandInCurrentTask.title": "このコマンドを説明(現在のタスク)", + "command.acceptInput.title": "入力/提案を承認", "configuration.title": "Roo Code", "commands.allowedCommands.description": "'常に実行操作を承認する'が有効な場合に自動実行できるコマンド", "settings.vsCodeLmModelSelector.description": "VSCode 言語モデル API の設定", diff --git a/package.nls.json b/package.nls.json index 30a977fdde..9a63a421ef 100644 --- a/package.nls.json +++ b/package.nls.json @@ -23,6 +23,7 @@ "command.terminal.explainCommand.title": "Explain This Command", "command.terminal.fixCommandInCurrentTask.title": "Fix This Command (Current Task)", "command.terminal.explainCommandInCurrentTask.title": "Explain This Command (Current Task)", + "command.acceptInput.title": "Accept Input/Suggestion", "configuration.title": "Roo Code", "commands.allowedCommands.description": "Commands that can be auto-executed when 'Always approve execute operations' is enabled", "settings.vsCodeLmModelSelector.description": "Settings for VSCode Language Model API", diff --git a/package.nls.ko.json b/package.nls.ko.json index a39b83b384..598aa075ef 100644 --- a/package.nls.ko.json +++ b/package.nls.ko.json @@ -14,6 +14,7 @@ "command.terminal.explainCommand.title": "이 명령어 설명", "command.terminal.fixCommandInCurrentTask.title": "이 명령어 수정 (현재 작업)", "command.terminal.explainCommandInCurrentTask.title": "이 명령어 설명 (현재 작업)", + "command.acceptInput.title": "입력/제안 수락", "views.activitybar.title": "Roo Code", "views.contextMenu.label": "Roo Code", "views.terminalMenu.label": "Roo Code", diff --git a/package.nls.pl.json b/package.nls.pl.json index 1c378b782e..86661c7cbe 100644 --- a/package.nls.pl.json +++ b/package.nls.pl.json @@ -14,6 +14,7 @@ "command.terminal.explainCommand.title": "Wyjaśnij tę Komendę", "command.terminal.fixCommandInCurrentTask.title": "Napraw tę Komendę (Bieżące Zadanie)", "command.terminal.explainCommandInCurrentTask.title": "Wyjaśnij tę Komendę (Bieżące Zadanie)", + "command.acceptInput.title": "Akceptuj Wprowadzanie/Sugestię", "views.activitybar.title": "Roo Code", "views.contextMenu.label": "Roo Code", "views.terminalMenu.label": "Roo Code", diff --git a/package.nls.pt-BR.json b/package.nls.pt-BR.json index 4d3e71fa46..0664f51000 100644 --- a/package.nls.pt-BR.json +++ b/package.nls.pt-BR.json @@ -14,6 +14,7 @@ "command.terminal.explainCommand.title": "Explicar Este Comando", "command.terminal.fixCommandInCurrentTask.title": "Corrigir Este Comando (Tarefa Atual)", "command.terminal.explainCommandInCurrentTask.title": "Explicar Este Comando (Tarefa Atual)", + "command.acceptInput.title": "Aceitar Entrada/Sugestão", "views.activitybar.title": "Roo Code", "views.contextMenu.label": "Roo Code", "views.terminalMenu.label": "Roo Code", diff --git a/package.nls.tr.json b/package.nls.tr.json index 04628c62a3..e1ed1f8871 100644 --- a/package.nls.tr.json +++ b/package.nls.tr.json @@ -14,6 +14,7 @@ "command.terminal.explainCommand.title": "Bu Komutu Açıkla", "command.terminal.fixCommandInCurrentTask.title": "Bu Komutu Düzelt (Mevcut Görev)", "command.terminal.explainCommandInCurrentTask.title": "Bu Komutu Açıkla (Mevcut Görev)", + "command.acceptInput.title": "Girişi/Öneriyi Kabul Et", "views.activitybar.title": "Roo Code", "views.contextMenu.label": "Roo Code", "views.terminalMenu.label": "Roo Code", diff --git a/package.nls.vi.json b/package.nls.vi.json index 635ba62a1a..db06a3812f 100644 --- a/package.nls.vi.json +++ b/package.nls.vi.json @@ -14,6 +14,7 @@ "command.terminal.explainCommand.title": "Giải Thích Lệnh Này", "command.terminal.fixCommandInCurrentTask.title": "Sửa Lệnh Này (Tác Vụ Hiện Tại)", "command.terminal.explainCommandInCurrentTask.title": "Giải Thích Lệnh Này (Tác Vụ Hiện Tại)", + "command.acceptInput.title": "Chấp Nhận Đầu Vào/Gợi Ý", "views.activitybar.title": "Roo Code", "views.contextMenu.label": "Roo Code", "views.terminalMenu.label": "Roo Code", diff --git a/package.nls.zh-CN.json b/package.nls.zh-CN.json index 90caec3718..9cd6198ac3 100644 --- a/package.nls.zh-CN.json +++ b/package.nls.zh-CN.json @@ -14,6 +14,7 @@ "command.terminal.explainCommand.title": "解释此命令", "command.terminal.fixCommandInCurrentTask.title": "修复此命令(当前任务)", "command.terminal.explainCommandInCurrentTask.title": "解释此命令(当前任务)", + "command.acceptInput.title": "接受输入/建议", "views.activitybar.title": "Roo Code", "views.contextMenu.label": "Roo Code", "views.terminalMenu.label": "Roo Code", diff --git a/package.nls.zh-TW.json b/package.nls.zh-TW.json index 0efdcf41a0..629d5f1790 100644 --- a/package.nls.zh-TW.json +++ b/package.nls.zh-TW.json @@ -14,6 +14,7 @@ "command.terminal.explainCommand.title": "解釋此命令", "command.terminal.fixCommandInCurrentTask.title": "修復此命令(當前任務)", "command.terminal.explainCommandInCurrentTask.title": "解釋此命令(當前任務)", + "command.acceptInput.title": "接受輸入/建議", "views.activitybar.title": "Roo Code", "views.contextMenu.label": "Roo Code", "views.terminalMenu.label": "Roo Code", diff --git a/src/activate/registerCommands.ts b/src/activate/registerCommands.ts index c0b50113c9..0d4e8d59b6 100644 --- a/src/activate/registerCommands.ts +++ b/src/activate/registerCommands.ts @@ -117,6 +117,11 @@ const getCommandsMap = ({ context, outputChannel, provider }: RegisterCommandOpt "roo-cline.focusInput": () => { provider.postMessageToWebview({ type: "action", action: "focusInput" }) }, + "roo.acceptInput": () => { + const visibleProvider = getVisibleProviderOrLog(outputChannel) + if (!visibleProvider) return + visibleProvider.postMessageToWebview({ type: "acceptInput" }) + }, } } diff --git a/src/shared/ExtensionMessage.ts b/src/shared/ExtensionMessage.ts index 822e4239b5..a33929b9dc 100644 --- a/src/shared/ExtensionMessage.ts +++ b/src/shared/ExtensionMessage.ts @@ -69,6 +69,7 @@ export interface ExtensionMessage { | "maxReadFileLine" | "fileSearchResults" | "toggleApiConfigPin" + | "acceptInput" text?: string action?: | "chatButtonClicked" diff --git a/webview-ui/src/App.tsx b/webview-ui/src/App.tsx index 2bf0a0afd6..b3ac36775c 100644 --- a/webview-ui/src/App.tsx +++ b/webview-ui/src/App.tsx @@ -8,7 +8,7 @@ import TranslationProvider from "./i18n/TranslationContext" import { vscode } from "./utils/vscode" import { telemetryClient } from "./utils/TelemetryClient" import { ExtensionStateContextProvider, useExtensionState } from "./context/ExtensionStateContext" -import ChatView from "./components/chat/ChatView" +import ChatView, { ChatViewRef } from "./components/chat/ChatView" import HistoryView from "./components/history/HistoryView" import SettingsView, { SettingsViewRef } from "./components/settings/SettingsView" import WelcomeView from "./components/welcome/WelcomeView" @@ -44,6 +44,7 @@ const App = () => { }) const settingsRef = useRef(null) + const chatViewRef = useRef(null) const switchTab = useCallback((newTab: Tab) => { setCurrentSection(undefined) @@ -75,6 +76,10 @@ const App = () => { const { requestId, promptText } = message setHumanRelayDialogState({ isOpen: true, requestId, promptText }) } + + if (message.type === "acceptInput") { + chatViewRef.current?.acceptInput() + } }, [switchTab], ) @@ -114,6 +119,7 @@ const App = () => { setTab("chat")} targetSection={currentSection} /> )} setShowAnnouncement(false)} diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index 54f7f56e59..f56b5b1274 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -1,6 +1,6 @@ import { VSCodeButton, VSCodeLink } from "@vscode/webview-ui-toolkit/react" import debounce from "debounce" -import { useCallback, useEffect, useMemo, useRef, useState } from "react" +import { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from "react" import { useDeepCompareEffect, useEvent, useMount } from "react-use" import { Virtuoso, type VirtuosoHandle } from "react-virtuoso" import styled from "styled-components" @@ -40,11 +40,18 @@ interface ChatViewProps { showHistoryView: () => void } +export interface ChatViewRef { + acceptInput: () => void +} + export const MAX_IMAGES_PER_MESSAGE = 20 // Anthropic limits to 20 images const isMac = navigator.platform.toUpperCase().indexOf("MAC") >= 0 -const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryView }: ChatViewProps) => { +const ChatViewComponent: React.ForwardRefRenderFunction = ( + { isHidden, showAnnouncement, hideAnnouncement, showHistoryView }, + ref, +) => { const { t } = useAppTranslation() const modeShortcutText = `${isMac ? "⌘" : "Ctrl"} + . ${t("chat:forNextMode")}` const { @@ -1162,6 +1169,16 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie } }, [handleKeyDown]) + useImperativeHandle(ref, () => ({ + acceptInput: () => { + if (enableButtons && primaryButtonText) { + handlePrimaryButtonClick(inputValue, selectedImages) + } else if (!textAreaDisabled && (inputValue.trim() || selectedImages.length > 0)) { + handleSendMessage(inputValue, selectedImages) + } + }, + })) + return (