Skip to content

Commit 4fd1d51

Browse files
committed
fix: improve message queue reliability when AI is working
- Add VS Code notifications for queue success/failure - Implement error recovery to restore user input when queueing fails - Enhance error handling with proper user feedback - Prevent data loss by preserving user messages on queue failures Fixes #8033
1 parent 2263d86 commit 4fd1d51

File tree

3 files changed

+81
-3
lines changed

3 files changed

+81
-3
lines changed

src/core/webview/webviewMessageHandler.ts

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2995,17 +2995,59 @@ export const webviewMessageHandler = async (
29952995
*/
29962996

29972997
case "queueMessage": {
2998-
provider.getCurrentTask()?.messageQueueService.addMessage(message.text ?? "", message.images)
2998+
const currentTask = provider.getCurrentTask()
2999+
if (currentTask && currentTask.messageQueueService) {
3000+
const queuedMessage = currentTask.messageQueueService.addMessage(message.text ?? "", message.images)
3001+
if (queuedMessage) {
3002+
provider.log(`Message queued successfully: ${queuedMessage.id}`)
3003+
// Send confirmation back to webview
3004+
provider.postMessageToWebview({
3005+
type: "messageQueued",
3006+
success: true,
3007+
messageId: queuedMessage.id,
3008+
})
3009+
// Show VS Code notification for success
3010+
vscode.window.showInformationMessage("Message queued. It will be sent when the AI is ready.")
3011+
} else {
3012+
provider.log(`Failed to queue message: empty text and no images`)
3013+
provider.postMessageToWebview({
3014+
type: "messageQueued",
3015+
success: false,
3016+
error: "Message cannot be empty",
3017+
text: message.text,
3018+
images: message.images,
3019+
})
3020+
}
3021+
} else {
3022+
provider.log(`Failed to queue message: No active task or message queue service`)
3023+
provider.postMessageToWebview({
3024+
type: "messageQueued",
3025+
success: false,
3026+
error: "No active task to queue message",
3027+
text: message.text,
3028+
images: message.images,
3029+
})
3030+
// Show VS Code notification for failure
3031+
vscode.window.showErrorMessage("Failed to queue message: No active task. Please try again.")
3032+
}
29993033
break
30003034
}
30013035
case "removeQueuedMessage": {
3002-
provider.getCurrentTask()?.messageQueueService.removeMessage(message.text ?? "")
3036+
const currentTask = provider.getCurrentTask()
3037+
if (currentTask && currentTask.messageQueueService) {
3038+
const success = currentTask.messageQueueService.removeMessage(message.text ?? "")
3039+
provider.log(`Message removal ${success ? "successful" : "failed"}: ${message.text}`)
3040+
}
30033041
break
30043042
}
30053043
case "editQueuedMessage": {
30063044
if (message.payload) {
30073045
const { id, text, images } = message.payload as EditQueuedMessagePayload
3008-
provider.getCurrentTask()?.messageQueueService.updateMessage(id, text, images)
3046+
const currentTask = provider.getCurrentTask()
3047+
if (currentTask && currentTask.messageQueueService) {
3048+
const success = currentTask.messageQueueService.updateMessage(id, text, images)
3049+
provider.log(`Message edit ${success ? "successful" : "failed"}: ${id}`)
3050+
}
30093051
}
30103052

30113053
break

src/shared/ExtensionMessage.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,8 @@ export interface ExtensionMessage {
124124
| "commands"
125125
| "insertTextIntoTextarea"
126126
| "dismissedUpsells"
127+
| "messageQueued"
128+
| "showNotification"
127129
text?: string
128130
payload?: any // Add a generic payload for now, can refine later
129131
action?:
@@ -201,6 +203,9 @@ export interface ExtensionMessage {
201203
commands?: Command[]
202204
queuedMessages?: QueuedMessage[]
203205
list?: string[] // For dismissedUpsells
206+
messageId?: string // For messageQueued response
207+
level?: "error" | "warning" | "info" // For showNotification
208+
message?: string // For showNotification
204209
}
205210

206211
export type ExtensionState = Pick<

webview-ui/src/components/chat/ChatView.tsx

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -595,15 +595,22 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
595595

596596
if (text || images.length > 0) {
597597
if (sendingDisabled) {
598+
// Queue the message when sending is disabled
598599
try {
599600
console.log("queueMessage", text, images)
600601
vscode.postMessage({ type: "queueMessage", text, images })
602+
603+
// Clear the input immediately for better UX
604+
// The backend will confirm if queueing was successful
601605
setInputValue("")
602606
setSelectedImages([])
603607
} catch (error) {
604608
console.error(
605609
`Failed to queue message: ${error instanceof Error ? error.message : String(error)}`,
606610
)
611+
// Keep the input so user doesn't lose their message
612+
// In webview context, we can't show VS Code notifications directly
613+
// The error will be logged to console for debugging
607614
}
608615

609616
return
@@ -781,6 +788,30 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
781788
const message: ExtensionMessage = e.data
782789

783790
switch (message.type) {
791+
case "messageQueued":
792+
// Handle message queue confirmation from backend
793+
if (!message.success) {
794+
// If queueing failed, show error and restore the input
795+
console.error("Message queueing failed:", message.error)
796+
// Restore the user's input since queueing failed
797+
if (message.text || message.images?.length) {
798+
setInputValue(message.text || "")
799+
setSelectedImages(message.images || [])
800+
}
801+
} else {
802+
console.log("Message queued successfully:", message.messageId)
803+
}
804+
break
805+
case "showNotification":
806+
// Handle notification messages from backend
807+
if (message.level === "error") {
808+
console.error(message.message)
809+
} else if (message.level === "warning") {
810+
console.warn(message.message)
811+
} else {
812+
console.log(message.message)
813+
}
814+
break
784815
case "action":
785816
switch (message.action!) {
786817
case "didBecomeVisible":

0 commit comments

Comments
 (0)