diff --git a/frontend/app/components/assistant-ui/activity-panel.tsx b/frontend/app/components/assistant-ui/activity-panel.tsx index 4a03773..5532092 100644 --- a/frontend/app/components/assistant-ui/activity-panel.tsx +++ b/frontend/app/components/assistant-ui/activity-panel.tsx @@ -984,7 +984,18 @@ function summarizeLiveRunEvents( events: readonly LiveRunEvent[], ) { const lines: string[] = []; + let contentBuffer = ""; + const flushContentBuffer = () => { + const preview = compactLiveContentDelta(contentBuffer); + contentBuffer = ""; + if (preview) lines.push(`输出:${preview}`); + }; for (const event of events) { + if (event.type === "content_delta") { + contentBuffer += event.delta ?? ""; + continue; + } + flushContentBuffer(); if (event.type === "run_queued") { lines.push("当前会话已有任务在执行,本轮正在排队。"); } @@ -1013,6 +1024,7 @@ function summarizeLiveRunEvents( lines.push("正在整理回复"); } } + flushContentBuffer(); if (runStatus.current_stage && lines.at(-1) !== runStatus.current_stage) { lines.push(runStatus.current_stage); } @@ -1030,6 +1042,14 @@ function isNoisyLiveDelta(value: string) { return value === "。" || value === "," || value === "," || value.length <= 1; } +function compactLiveContentDelta(value: string) { + const normalized = value.replace(/\s+/g, " ").trim(); + if (!normalized || isNoisyLiveDelta(normalized)) return ""; + return normalized.length <= 36 + ? normalized + : `${normalized.slice(Math.max(0, normalized.length - 35))}…`; +} + function collectActivityItems(messages: readonly MessageState[]) { const items: ActivityItem[] = []; diff --git a/frontend/app/components/assistant-ui/thread-list.tsx b/frontend/app/components/assistant-ui/thread-list.tsx index d447cba..c0004b5 100644 --- a/frontend/app/components/assistant-ui/thread-list.tsx +++ b/frontend/app/components/assistant-ui/thread-list.tsx @@ -24,8 +24,8 @@ import { readActiveSessionId, writeActiveSessionId, } from "@/lib/claw-active-session"; -import { pushHomeUrl, pushSessionUrl } from "@/lib/claw-session-url"; import { useClawSessionReplay } from "@/lib/claw-session-replay"; +import { pushHomeUrl, pushSessionUrl } from "@/lib/claw-session-url"; type ClawSession = { session_id: string; @@ -647,7 +647,18 @@ function buildActiveRunParts(runStatus: ClawActiveRunStatus) { function summarizeRunEvents(runStatus: ClawActiveRunStatus) { const lines: string[] = []; + let contentBuffer = ""; + const flushContentBuffer = () => { + const preview = compactLiveContentDelta(contentBuffer); + contentBuffer = ""; + if (preview) lines.push(`输出:${preview}`); + }; for (const event of runStatus.events ?? []) { + if (event.type === "content_delta") { + contentBuffer += event.delta ?? ""; + continue; + } + flushContentBuffer(); if (event.type === "run_queued") { lines.push("当前会话已有任务在执行,本轮正在排队。"); } @@ -679,6 +690,7 @@ function summarizeRunEvents(runStatus: ClawActiveRunStatus) { lines.push("等待用户 review"); } } + flushContentBuffer(); if (runStatus.current_stage && lines.at(-1) !== runStatus.current_stage) { lines.push(runStatus.current_stage); } @@ -689,6 +701,14 @@ function isNoisyLiveDelta(value: string) { return value === "。" || value === "," || value === "," || value.length <= 1; } +function compactLiveContentDelta(value: string) { + const normalized = value.replace(/\s+/g, " ").trim(); + if (!normalized || isNoisyLiveDelta(normalized)) return ""; + return normalized.length <= 36 + ? normalized + : `${normalized.slice(Math.max(0, normalized.length - 35))}…`; +} + function buildRunToolParts(events: readonly ClawRunEvent[]) { const resultById = new Map(); for (const event of events) {