diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index abdfae29fa..3ad910b640 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -2995,17 +2995,59 @@ export const webviewMessageHandler = async ( */ case "queueMessage": { - provider.getCurrentTask()?.messageQueueService.addMessage(message.text ?? "", message.images) + const currentTask = provider.getCurrentTask() + if (currentTask && currentTask.messageQueueService) { + const queuedMessage = currentTask.messageQueueService.addMessage(message.text ?? "", message.images) + if (queuedMessage) { + provider.log(`Message queued successfully: ${queuedMessage.id}`) + // Send confirmation back to webview + provider.postMessageToWebview({ + type: "messageQueued", + success: true, + messageId: queuedMessage.id, + }) + // Show VS Code notification for success + vscode.window.showInformationMessage("Message queued. It will be sent when the AI is ready.") + } else { + provider.log(`Failed to queue message: empty text and no images`) + provider.postMessageToWebview({ + type: "messageQueued", + success: false, + error: "Message cannot be empty", + text: message.text, + images: message.images, + }) + } + } else { + provider.log(`Failed to queue message: No active task or message queue service`) + provider.postMessageToWebview({ + type: "messageQueued", + success: false, + error: "No active task to queue message", + text: message.text, + images: message.images, + }) + // Show VS Code notification for failure + vscode.window.showErrorMessage("Failed to queue message: No active task. Please try again.") + } break } case "removeQueuedMessage": { - provider.getCurrentTask()?.messageQueueService.removeMessage(message.text ?? "") + const currentTask = provider.getCurrentTask() + if (currentTask && currentTask.messageQueueService) { + const success = currentTask.messageQueueService.removeMessage(message.text ?? "") + provider.log(`Message removal ${success ? "successful" : "failed"}: ${message.text}`) + } break } case "editQueuedMessage": { if (message.payload) { const { id, text, images } = message.payload as EditQueuedMessagePayload - provider.getCurrentTask()?.messageQueueService.updateMessage(id, text, images) + const currentTask = provider.getCurrentTask() + if (currentTask && currentTask.messageQueueService) { + const success = currentTask.messageQueueService.updateMessage(id, text, images) + provider.log(`Message edit ${success ? "successful" : "failed"}: ${id}`) + } } break diff --git a/src/shared/ExtensionMessage.ts b/src/shared/ExtensionMessage.ts index aaddc520cb..d623ff684b 100644 --- a/src/shared/ExtensionMessage.ts +++ b/src/shared/ExtensionMessage.ts @@ -124,6 +124,8 @@ export interface ExtensionMessage { | "commands" | "insertTextIntoTextarea" | "dismissedUpsells" + | "messageQueued" + | "showNotification" text?: string payload?: any // Add a generic payload for now, can refine later action?: @@ -201,6 +203,9 @@ export interface ExtensionMessage { commands?: Command[] queuedMessages?: QueuedMessage[] list?: string[] // For dismissedUpsells + messageId?: string // For messageQueued response + level?: "error" | "warning" | "info" // For showNotification + message?: string // For showNotification } export type ExtensionState = Pick< diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index d358c68f1c..3ff155218a 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -595,15 +595,22 @@ const ChatViewComponent: React.ForwardRefRenderFunction 0) { if (sendingDisabled) { + // Queue the message when sending is disabled try { console.log("queueMessage", text, images) vscode.postMessage({ type: "queueMessage", text, images }) + + // Clear the input immediately for better UX + // The backend will confirm if queueing was successful setInputValue("") setSelectedImages([]) } catch (error) { console.error( `Failed to queue message: ${error instanceof Error ? error.message : String(error)}`, ) + // Keep the input so user doesn't lose their message + // In webview context, we can't show VS Code notifications directly + // The error will be logged to console for debugging } return @@ -781,6 +788,30 @@ const ChatViewComponent: React.ForwardRefRenderFunction