diff --git a/web/hwlab-cloud-web/app-trace.test.ts b/web/hwlab-cloud-web/app-trace.test.ts index 3d55e62f..d66c085b 100644 --- a/web/hwlab-cloud-web/app-trace.test.ts +++ b/web/hwlab-cloud-web/app-trace.test.ts @@ -121,6 +121,30 @@ test("trace display rows suppress low-value AgentRun backend noise", () => { assert.match(text, /当前可见 1 个 device-pod/u); }); +test("trace display rows collapse successful assistant-only AgentRun turns", () => { + const events = [ + event(1, "agentrun:request:accepted", { message: "accepted" }), + event(2, "agentrun:run:reused"), + event(3, "agentrun:command:created"), + event(4, "agentrun:runner-job:reused"), + event(5, "agentrun:backend:codex-app-server:reused"), + event(6, "agentrun:backend:turn/start:completed"), + event(7, "agentrun:assistant:message", { + type: "assistant", + status: "completed", + terminal: true, + message: "HWLAB663_FINAL_T2_OK" + }), + event(8, "agentrun:terminal:completed", { type: "result", terminal: true, status: "completed" }) + ]; + + const rows = traceDisplayRows({ traceId: "trc_agentrun_assistant_only", events }, events); + assert.equal(rows.length, 1); + assert.equal(rows[0].tone, "ok"); + assert.match(rows[0].header, /助手最后一条消息/u); + assert.match(rows[0].body ?? "", /HWLAB663_FINAL_T2_OK/u); +}); + function traceEvents() { return [ event(1, "request:accepted", { promptSummary: "请检查 trace" }), diff --git a/web/hwlab-cloud-web/app-trace.ts b/web/hwlab-cloud-web/app-trace.ts index d152db57..872a58da 100644 --- a/web/hwlab-cloud-web/app-trace.ts +++ b/web/hwlab-cloud-web/app-trace.ts @@ -289,6 +289,7 @@ export function traceDisplayRows(trace, events) { const commandGroups = traceCommandExecutionGroups(events); const requestEvent = tracePrimaryRequestEvent(events); const hasTerminalAssistant = events.some((event) => isTerminalAssistantTraceEvent(event)); + const terminalAssistantOnly = hasTerminalAssistant && !events.some((event) => isCommandExecutionTraceEvent(event)); const renderedCommands = new Set(); let requestRendered = false; let setupRendered = false; @@ -315,6 +316,7 @@ export function traceDisplayRows(trace, events) { continue; } if (isRequestTraceEvent(event)) { + if (terminalAssistantOnly) continue; if (!requestRendered) { const row = traceRequestSummaryRow(trace, event, requestEvent ?? event); if (row) rows.push(row); @@ -323,6 +325,7 @@ export function traceDisplayRows(trace, events) { continue; } if (isSetupTraceEvent(event)) { + if (terminalAssistantOnly) continue; if (!setupRendered) { const row = traceSetupSummaryRow(trace, events, event); if (row) rows.push(row); @@ -638,7 +641,7 @@ function traceAssistantSummaryRow(trace, event, index = 0) { return { rowId: `event:${event.seq ?? `${event.label ?? event.type ?? "assistant"}:${event.createdAt ?? "unknown"}`}`, seq: event.seq ?? null, - tone: traceEventTone(event), + tone: terminal ? "ok" : traceEventTone(event), header: terminal ? `${traceClock(event.createdAt)} 🤖 助手最后一条消息,轮次完成(总耗时 ${elapsed})` : `${traceClock(event.createdAt)} 🤖 助手消息${index === 0 ? "(第一条)" : ""}`,