diff --git a/ui/src/ui/chat/grouped-render.test.ts b/ui/src/ui/chat/grouped-render.test.ts index aa801b79613..72115dbb524 100644 --- a/ui/src/ui/chat/grouped-render.test.ts +++ b/ui/src/ui/chat/grouped-render.test.ts @@ -4,7 +4,6 @@ import { html, render } from "lit"; import { afterEach, describe, expect, it, vi } from "vitest"; import { getSafeLocalStorage } from "../../local-storage.ts"; import type { MessageGroup } from "../types/chat-types.ts"; -import { buildChatItems, type BuildChatItemsProps } from "./build-chat-items.ts"; import { renderMessageGroup, resetAssistantAttachmentAvailabilityCacheForTest, @@ -104,6 +103,44 @@ function createMessageGroup(message: unknown, role: string): MessageGroup { }; } +function createAssistantCanvasBlock(params: { + suffix: string; + title?: string; + url?: string; + preferredHeight?: number; + presentationTarget?: "assistant_message" | "tool_card"; +}) { + const viewId = `cv_inline_${params.suffix}`; + const url = params.url ?? `/__openclaw__/canvas/documents/${viewId}/index.html`; + const title = params.title ?? "Inline demo"; + const preferredHeight = params.preferredHeight ?? 360; + return { + type: "canvas", + preview: { + kind: "canvas", + surface: "assistant_message", + render: "url", + viewId, + title, + url, + preferredHeight, + }, + rawText: JSON.stringify({ + kind: "canvas", + view: { + backend: "canvas", + id: viewId, + url, + title, + preferred_height: preferredHeight, + }, + presentation: { + target: params.presentationTarget ?? "assistant_message", + }, + }), + }; +} + function renderMessageGroups( container: HTMLElement, groups: MessageGroup[], @@ -123,24 +160,6 @@ function renderMessageGroups( ); } -function renderBuiltMessageGroups( - container: HTMLElement, - props: Partial, - opts: Partial = {}, -) { - const groups = buildChatItems({ - sessionKey: "main", - messages: [], - toolMessages: [], - streamSegments: [], - stream: null, - streamStartedAt: null, - showToolCalls: true, - ...props, - }).filter((item) => item.kind === "group"); - renderMessageGroups(container, groups, opts); -} - function clearDeleteConfirmSkip() { try { getSafeLocalStorage()?.removeItem("openclaw:skipDeleteConfirm"); @@ -1110,41 +1129,22 @@ describe("grouped chat rendering", () => { it("renders hidden assistant_message canvas results with the configured sandbox", () => { const container = document.createElement("div"); const renderCanvas = (params: { embedSandboxMode?: "trusted"; suffix: string }) => - renderBuiltMessageGroups( + renderMessageGroups( container, - { - showToolCalls: false, - messages: [ + [ + createMessageGroup( { id: `assistant-canvas-inline-${params.suffix}`, role: "assistant", - content: [{ type: "text", text: "Inline canvas result." }], + content: [ + { type: "text", text: "Inline canvas result." }, + createAssistantCanvasBlock({ suffix: params.suffix }), + ], timestamp: Date.now(), }, - ], - toolMessages: [ - { - id: `tool-artifact-inline-${params.suffix}`, - role: "tool", - toolCallId: `call-artifact-inline-${params.suffix}`, - toolName: "canvas_render", - content: JSON.stringify({ - kind: "canvas", - view: { - backend: "canvas", - id: `cv_inline_${params.suffix}`, - url: `/__openclaw__/canvas/documents/cv_inline_${params.suffix}/index.html`, - title: "Inline demo", - preferred_height: 360, - }, - presentation: { - target: "assistant_message", - }, - }), - timestamp: Date.now() + 1, - }, - ], - }, + "assistant", + ), + ], { embedSandboxMode: params.embedSandboxMode ?? "scripts", }, @@ -1169,19 +1169,22 @@ describe("grouped chat rendering", () => { it("renders assistant_message canvas results in the assistant bubble even when tool rows are visible", () => { const container = document.createElement("div"); - renderBuiltMessageGroups( + renderMessageGroups( container, - { - showToolCalls: true, - messages: [ + [ + createMessageGroup( { id: "assistant-canvas-inline-visible", role: "assistant", - content: [{ type: "text", text: "Inline canvas result." }], + content: [ + { type: "text", text: "Inline canvas result." }, + createAssistantCanvasBlock({ suffix: "visible" }), + ], timestamp: Date.now(), }, - ], - toolMessages: [ + "assistant", + ), + createMessageGroup( { id: "tool-artifact-inline-visible", role: "tool", @@ -1202,8 +1205,9 @@ describe("grouped chat rendering", () => { }), timestamp: Date.now() + 1, }, - ], - }, + "tool", + ), + ], { isToolMessageExpanded: () => true, }, @@ -1222,19 +1226,19 @@ describe("grouped chat rendering", () => { it("opens generic tool details instead of a canvas preview from tool rows", () => { const container = document.createElement("div"); const onOpenSidebar = vi.fn(); - renderBuiltMessageGroups( + renderMessageGroups( container, - { - showToolCalls: true, - messages: [ + [ + createMessageGroup( { id: "assistant-canvas-sidebar", role: "assistant", content: [{ type: "text", text: "Sidebar canvas result." }], timestamp: Date.now(), }, - ], - toolMessages: [ + "assistant", + ), + createMessageGroup( { id: "tool-artifact-sidebar", role: "tool", @@ -1255,8 +1259,9 @@ describe("grouped chat rendering", () => { }), timestamp: Date.now() + 1, }, - ], - }, + "tool", + ), + ], { isToolExpanded: () => true, isToolMessageExpanded: () => true,