From f81bf71b9949be5d56aec739824a628009fbd735 Mon Sep 17 00:00:00 2001 From: Roo Code Date: Tue, 4 Nov 2025 12:21:10 +0000 Subject: [PATCH] fix: allow new tasks to bypass queued messages and add clear all button - Modified ChatView to detect and allow new tasks even when messages are queued - Added "Clear All" button to QueuedMessages component for bulk deletion - Implemented clearAll() method in MessageQueueService - Added webview message handler for clearQueuedMessages - Updated WebviewMessage type definitions Fixes #9015 --- src/core/message-queue/MessageQueueService.ts | 5 +++++ src/core/webview/webviewMessageHandler.ts | 4 ++++ src/shared/WebviewMessage.ts | 1 + webview-ui/src/components/chat/ChatView.tsx | 10 +++++----- .../src/components/chat/QueuedMessages.tsx | 17 ++++++++++++++++- 5 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/core/message-queue/MessageQueueService.ts b/src/core/message-queue/MessageQueueService.ts index fe38bf0194..256fb3639e 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 0a4bd9abb9..42a2f871fd 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 f10808cd42..b35885749e 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 e8a4874d59..d12ca76df5 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 5bfb6fdb48..2075822ce3 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)