diff --git a/webview-ui/src/components/chat/ChatRow.tsx b/webview-ui/src/components/chat/ChatRow.tsx
index fd3d480014..fdb18daf0b 100644
--- a/webview-ui/src/components/chat/ChatRow.tsx
+++ b/webview-ui/src/components/chat/ChatRow.tsx
@@ -16,6 +16,12 @@ import { findMatchingResourceOrTemplate } from "@src/utils/mcp"
import { vscode } from "@src/utils/vscode"
import { removeLeadingNonAlphanumeric } from "@src/utils/removeLeadingNonAlphanumeric"
import { getLanguageFromPath } from "@src/utils/getLanguageFromPath"
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuTrigger,
+} from "@src/components/ui/dropdown-menu"
import { ToolUseBlock, ToolUseBlockHeader } from "../common/ToolUseBlock"
import UpdateTodoListToolBlock from "./UpdateTodoListToolBlock"
@@ -1002,29 +1008,63 @@ export const ChatRowContent = ({
return (
<>
-
-
- {icon}
- {title}
-
-
0 ? 1 : 0 }}>
- ${Number(cost || 0)?.toFixed(4)}
-
-
+
+
+ e.preventDefault()}>
+
+ {icon}
+ {title}
+
+
+
0 ? 1 : 0,
+ }}>
+ ${Number(cost || 0)?.toFixed(4)}
+
+
{
+ e.stopPropagation()
+ vscode.postMessage({ type: "deleteMessage", value: message.ts })
+ }}
+ title={t("chat:deleteMessageAndSubsequent")}>
+
+
+
+
+
+
+ vscode.postMessage({ type: "deleteMessage", value: message.ts })}
+ className="flex items-center gap-2"
+ disabled={isApiRequestInProgress}>
+
+
+ {t(
+ "chat:deleteMessageAndSubsequent",
+ "Delete message and subsequent nodes",
+ )}
+
+
+
+
{(((cost === null || cost === undefined) && apiRequestFailedMessage) ||
apiReqStreamingFailedMessage) && (
-
-
- {t("chat:text.rooSaid")}
-
-
-
- {message.images && message.images.length > 0 && (
-
- {message.images.map((image, index) => (
-
- ))}
+
+
+ e.preventDefault()}>
+
+
+
+ {t("chat:text.rooSaid")}
+
+
{
+ e.stopPropagation()
+ vscode.postMessage({ type: "deleteMessage", value: message.ts })
+ }}
+ title={t("chat:deleteMessageAndSubsequent")}>
+
+
- )}
-
-
+
+
+ {message.images && message.images.length > 0 && (
+
+ {message.images.map((image, index) => (
+
+ ))}
+
+ )}
+
+
+
+
+ vscode.postMessage({ type: "deleteMessage", value: message.ts })}
+ className="flex items-center gap-2"
+ disabled={isStreaming}>
+
+
+ {t("chat:deleteMessageAndSubsequent", "Delete message and subsequent nodes")}
+
+
+
+
)
case "user_feedback":
return (
@@ -1162,15 +1229,42 @@ export const ChatRowContent = ({
return
case "completion_result":
return (
- <>
-
- {icon}
- {title}
-
-
-
-
- >
+
+
+ e.preventDefault()}>
+
+
+ {icon}
+ {title}
+
+
{
+ e.stopPropagation()
+ vscode.postMessage({ type: "deleteMessage", value: message.ts })
+ }}
+ title={t("chat:deleteMessageAndSubsequent")}>
+
+
+
+
+
+
+
+
+
+ vscode.postMessage({ type: "deleteMessage", value: message.ts })}
+ className="flex items-center gap-2"
+ disabled={isStreaming}>
+
+
+ {t("chat:deleteMessageAndSubsequent", "Delete message and subsequent nodes")}
+
+
+
+
)
case "shell_integration_warning":
return