diff --git a/src/core/message-queue/MessageQueueService.ts b/src/core/message-queue/MessageQueueService.ts index fe38bf0194f8..256fb3639eac 100644 --- a/src/core/message-queue/MessageQueueService.ts +++ b/src/core/message-queue/MessageQueueService.ts @@ -91,6 +91,11 @@ export class MessageQueueService extends EventEmitter { return this._messages.length === 0 } + public clearAll(): void { + this._messages = [] + this.emit("stateChanged", this._messages) + } + public dispose(): void { this._messages = [] this.removeAllListeners() diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index 0a4bd9abb90c..42a2f871fd22 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -3155,6 +3155,10 @@ export const webviewMessageHandler = async ( provider.getCurrentTask()?.messageQueueService.removeMessage(message.text ?? "") break } + case "clearQueuedMessages": { + provider.getCurrentTask()?.messageQueueService.clearAll() + break + } case "editQueuedMessage": { if (message.payload) { const { id, text, images } = message.payload as EditQueuedMessagePayload diff --git a/src/shared/WebviewMessage.ts b/src/shared/WebviewMessage.ts index f10808cd428d..b35885749ecc 100644 --- a/src/shared/WebviewMessage.ts +++ b/src/shared/WebviewMessage.ts @@ -230,6 +230,7 @@ export interface WebviewMessage { | "openRouterImageGenerationSelectedModel" | "queueMessage" | "removeQueuedMessage" + | "clearQueuedMessages" | "editQueuedMessage" | "dismissUpsell" | "getDismissedUpsells" diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index e8a4874d5985..d12ca76df5c9 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -608,11 +608,11 @@ const ChatViewComponent: React.ForwardRefRenderFunction 0) { - // Queue message if: - // - Task is busy (sendingDisabled) - // - API request in progress (isStreaming) - // - Queue has items (preserve message order during drain) - if (sendingDisabled || isStreaming || messageQueue.length > 0) { + // Check if this is a new task request (no existing messages) + const isNewTask = messagesRef.current.length === 0 + + // Allow starting new tasks even if queue has items + if (!isNewTask && (sendingDisabled || isStreaming || messageQueue.length > 0)) { try { console.log("queueMessage", text, images) vscode.postMessage({ type: "queueMessage", text, images }) diff --git a/webview-ui/src/components/chat/QueuedMessages.tsx b/webview-ui/src/components/chat/QueuedMessages.tsx index 5bfb6fdb48a9..2075822ce39c 100644 --- a/webview-ui/src/components/chat/QueuedMessages.tsx +++ b/webview-ui/src/components/chat/QueuedMessages.tsx @@ -4,6 +4,7 @@ import { useTranslation } from "react-i18next" import { QueuedMessage } from "@roo-code/types" import { Button } from "@src/components/ui" +import { vscode } from "@src/utils/vscode" import Thumbnails from "../common/Thumbnails" @@ -41,7 +42,21 @@ export const QueuedMessages = ({ queue, onRemove, onUpdate }: QueuedMessagesProp return (
-
{t("queuedMessages.title")}
+
+
{t("queuedMessages.title")}
+ {queue.length > 0 && ( + + )} +
{queue.map((message, index) => { const editState = getEditState(message.id, message.text)