From fe1f8cf6b3ae2defd72b0d89ab5c3467481d2512 Mon Sep 17 00:00:00 2001 From: lyon Date: Mon, 22 Jun 2026 05:28:50 +0800 Subject: [PATCH] fix(workbench): prefer durable terminal duration --- .../src/components/workbench/ConversationPanel.vue | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/web/hwlab-cloud-web/src/components/workbench/ConversationPanel.vue b/web/hwlab-cloud-web/src/components/workbench/ConversationPanel.vue index eaeeabd6..4492effe 100644 --- a/web/hwlab-cloud-web/src/components/workbench/ConversationPanel.vue +++ b/web/hwlab-cloud-web/src/components/workbench/ConversationPanel.vue @@ -255,7 +255,7 @@ function traceForDisplay(message: ChatMessage): ChatMessage["runnerTrace"] { function messageDurationMeta(message: ChatMessage): { text: string; label: string } | null { if (message.role !== "agent") return null; const timing = messageTimingForDisplay(message); - const rawDurationMs = isRunningMessage(message) ? durationSince(timing?.startedAt) : finiteDurationMs(timing?.durationMs); + const rawDurationMs = isRunningMessage(message) ? durationSince(timing?.startedAt) : terminalMessageDurationMs(message, timing); if (rawDurationMs === null) return null; const durationMs = isRunningMessage(message) ? monotonicDisplayDurationMs(message, rawDurationMs) : sealedDisplayDurationMs(message, rawDurationMs); const value = formatDuration(durationMs); @@ -289,9 +289,14 @@ function messageActivityMeta(message: ChatMessage): { text: string; label: strin } function messageTimingForDisplay(message: ChatMessage): ChatMessage["timing"] { + if (!isRunningMessage(message)) return message.timing ?? message.runnerTrace?.timing ?? null; return message.runnerTrace?.timing ?? message.timing ?? null; } +function terminalMessageDurationMs(message: ChatMessage, timing: ChatMessage["timing"]): number | null { + return finiteDurationMs(message.durationMs) ?? finiteDurationMs(timing?.durationMs) ?? finiteDurationMs(message.runnerTrace?.durationMs); +} + function durationSince(timestamp: unknown): number | null { const startedAtMs = timestampMs(timestamp); return startedAtMs === null ? null : Math.max(0, nowMs.value - startedAtMs);