diff --git a/packages/ui/src/components/message-block.tsx b/packages/ui/src/components/message-block.tsx index 4f9560f7..7b18047d 100644 --- a/packages/ui/src/components/message-block.tsx +++ b/packages/ui/src/components/message-block.tsx @@ -1,5 +1,5 @@ import { For, Match, Show, Switch, createEffect, createMemo, createSignal, untrack } from "solid-js" -import { ChevronsDownUp, ChevronsUpDown, ExternalLink, FoldVertical, MessageSquareX, Trash2 } from "lucide-solid" +import { ChevronsDownUp, ChevronsUpDown, ExternalLink, FoldVertical, Trash2 } from "lucide-solid" import MessageItem from "./message-item" import ToolCall from "./tool-call" import type { InstanceMessageStore } from "../stores/message-v2/instance-store" @@ -12,7 +12,6 @@ import { formatTokenTotal } from "../lib/formatters" import { sessions, setActiveParentSession, setActiveSession } from "../stores/sessions" import { setActiveInstanceId } from "../stores/instances" import { showAlertDialog } from "../stores/alerts" -import { deleteMessagePart } from "../stores/session-actions" import { deleteMessage } from "../stores/session-actions" import { useI18n } from "../lib/i18n" import type { DeleteHoverState } from "../types/delete-hover" @@ -199,7 +198,6 @@ interface MessageContentItemProps { onFork?: (messageId?: string) => void onContentRendered?: () => void showDeleteMessage?: boolean - deleteHover?: () => DeleteHoverState onDeleteHoverChange?: (state: DeleteHoverState) => void } @@ -288,7 +286,6 @@ function MessageContentItem(props: MessageContentItemProps) { isQueued={isQueued()} showAgentMeta={showAgentMeta()} showDeleteMessage={props.showDeleteMessage} - deleteHover={props.deleteHover} onDeleteHoverChange={props.onDeleteHoverChange} onRevert={props.onRevert} onFork={props.onFork} @@ -307,15 +304,12 @@ interface ToolCallItemProps { partId: string onContentRendered?: () => void showDeleteMessage?: boolean - deleteHover?: () => DeleteHoverState onDeleteHoverChange?: (state: DeleteHoverState) => void } function ToolCallItem(props: ToolCallItemProps) { const { t } = useI18n() - const [deleting, setDeleting] = createSignal(false) const [deletingMessage, setDeletingMessage] = createSignal(false) - const [hoverDeletePart, setHoverDeletePart] = createSignal(false) const record = createMemo(() => props.store().getMessage(props.messageId)) const messageInfo = createMemo(() => props.store().getMessageInfo(props.messageId)) @@ -332,14 +326,6 @@ function ToolCallItem(props: ToolCallItemProps) { const messageVersion = createMemo(() => record()?.revision ?? 0) const partVersion = createMemo(() => partEntry()?.revision ?? 0) - const deleteDisabled = createMemo(() => { - if (deleting()) return true - // Avoid deleting while a tool is actively running to prevent confusing UI states. - if (isToolStateRunning(toolState())) return true - // Avoid deleting permission prompts from here; those are interactive. - return Boolean(toolPart()?.pendingPermission) - }) - const taskSessionId = createMemo(() => { const state = toolState() if (!state) return "" @@ -363,26 +349,6 @@ function ToolCallItem(props: ToolCallItemProps) { navigateToTaskSession(location) } - const handleDeleteToolPart = async (event: MouseEvent) => { - event.preventDefault() - event.stopPropagation() - - if (deleteDisabled()) return - - setDeleting(true) - try { - await deleteMessagePart(props.instanceId, props.sessionId, props.messageId, props.partId) - } catch (error) { - showAlertDialog(t("messageBlock.tool.deletePart.failed.message"), { - title: t("messageBlock.tool.deletePart.failed.title"), - detail: error instanceof Error ? error.message : String(error), - variant: "error", - }) - } finally { - setDeleting(false) - } - } - const handleDeleteMessage = async (event: MouseEvent) => { event.preventDefault() event.stopPropagation() @@ -404,18 +370,10 @@ function ToolCallItem(props: ToolCallItemProps) { } } - const isDeleteHoveredFromStore = () => { - const hover = props.deleteHover?.() ?? ({ kind: "none" } as DeleteHoverState) - return hover.kind === "part" && hover.messageId === props.messageId && hover.partId === props.partId - } - return ( {(resolvedToolPart) => ( -
+
{TOOL_ICON} @@ -423,7 +381,7 @@ function ToolCallItem(props: ToolCallItemProps) { {toolName() || t("messageBlock.tool.unknown")}
-
+
- - - - -
+
+
@@ -820,9 +757,7 @@ export default function MessageBlock(props: MessageBlockProps) { instanceId={props.instanceId} sessionId={props.sessionId} messageId={(item as CompactionDisplayItem).messageId} - partId={(item as CompactionDisplayItem).partId} showDeleteMessage={index() === 0} - deleteHover={props.deleteHover} onDeleteHoverChange={props.onDeleteHoverChange} /> @@ -833,11 +768,9 @@ export default function MessageBlock(props: MessageBlockProps) { instanceId={props.instanceId} sessionId={props.sessionId} messageId={(item as ReasoningDisplayItem).messageId} - partId={(item as ReasoningDisplayItem).partId} showAgentMeta={(item as ReasoningDisplayItem).showAgentMeta} defaultExpanded={(item as ReasoningDisplayItem).defaultExpanded} showDeleteMessage={index() === 0} - deleteHover={props.deleteHover} onDeleteHoverChange={props.onDeleteHoverChange} /> @@ -871,17 +804,13 @@ interface CompactionCardProps { instanceId: string sessionId: string messageId: string - partId: string showDeleteMessage?: boolean - deleteHover?: () => DeleteHoverState onDeleteHoverChange?: (state: DeleteHoverState) => void } function CompactionCard(props: CompactionCardProps) { const { t } = useI18n() - const [deleting, setDeleting] = createSignal(false) const [deletingMessage, setDeletingMessage] = createSignal(false) - const [hoverDeletePart, setHoverDeletePart] = createSignal(false) const isAuto = () => Boolean((props.part as any)?.auto) const label = () => (isAuto() ? t("messageBlock.compaction.autoLabel") : t("messageBlock.compaction.manualLabel")) const borderColor = () => props.borderColor ?? (isAuto() ? "var(--session-status-compacting-fg)" : USER_BORDER_COLOR) @@ -889,26 +818,6 @@ function CompactionCard(props: CompactionCardProps) { const containerClass = () => `message-compaction-card ${isAuto() ? "message-compaction-card--auto" : "message-compaction-card--manual"}` - const canDelete = () => Boolean(props.partId) && !deleting() - - const handleDelete = async (event: MouseEvent) => { - event.preventDefault() - event.stopPropagation() - if (!canDelete()) return - setDeleting(true) - try { - await deleteMessagePart(props.instanceId, props.sessionId, props.messageId, props.partId) - } catch (error) { - showAlertDialog(t("messagePart.actions.deleteFailedMessage"), { - title: t("messagePart.actions.deleteFailedTitle"), - detail: error instanceof Error ? error.message : String(error), - variant: "error", - }) - } finally { - setDeleting(false) - } - } - const canDeleteMessage = () => Boolean(props.showDeleteMessage) && !deletingMessage() const handleDeleteMessage = async (event: MouseEvent) => { @@ -930,15 +839,9 @@ function CompactionCard(props: CompactionCardProps) { } } - const isDeleteHoveredFromStore = () => { - const hover = props.deleteHover?.() ?? ({ kind: "none" } as DeleteHoverState) - return hover.kind === "part" && hover.messageId === props.messageId && hover.partId === props.partId - } - return (
-
@@ -1097,7 +981,7 @@ function StepCard(props: StepCardProps) { title={deletingMessage() ? t("messageItem.actions.deletingMessage") : t("messageItem.actions.deleteMessage")} aria-label={deletingMessage() ? t("messageItem.actions.deletingMessage") : t("messageItem.actions.deleteMessage")} > -