Roo-Code/src/core/message-queue/MessageQueueService.ts
Roo Code f81bf71b99 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
2025-11-04 12:21:10 +00:00

103 lines
2 KiB
TypeScript

import { EventEmitter } from "events"
import { v4 as uuidv4 } from "uuid"
import { QueuedMessage } from "@roo-code/types"
export interface MessageQueueState {
messages: QueuedMessage[]
isProcessing: boolean
isPaused: boolean
}
export interface QueueEvents {
stateChanged: [messages: QueuedMessage[]]
}
export class MessageQueueService extends EventEmitter<QueueEvents> {
private _messages: QueuedMessage[]
constructor() {
super()
this._messages = []
}
private findMessage(id: string) {
const index = this._messages.findIndex((msg) => msg.id === id)
if (index === -1) {
return { index, message: undefined }
}
return { index, message: this._messages[index] }
}
public addMessage(text: string, images?: string[]): QueuedMessage | undefined {
if (!text && !images?.length) {
return undefined
}
const message: QueuedMessage = {
timestamp: Date.now(),
id: uuidv4(),
text,
images,
}
this._messages.push(message)
this.emit("stateChanged", this._messages)
return message
}
public removeMessage(id: string): boolean {
const { index, message } = this.findMessage(id)
if (!message) {
return false
}
this._messages.splice(index, 1)
this.emit("stateChanged", this._messages)
return true
}
public updateMessage(id: string, text: string, images?: string[]): boolean {
const { message } = this.findMessage(id)
if (!message) {
return false
}
message.timestamp = Date.now()
message.text = text
message.images = images
this.emit("stateChanged", this._messages)
return true
}
public dequeueMessage(): QueuedMessage | undefined {
const message = this._messages.shift()
this.emit("stateChanged", this._messages)
return message
}
public get messages(): QueuedMessage[] {
return this._messages
}
public isEmpty(): boolean {
return this._messages.length === 0
}
public clearAll(): void {
this._messages = []
this.emit("stateChanged", this._messages)
}
public dispose(): void {
this._messages = []
this.removeAllListeners()
}
}