From aed4e9bc3e5e2bd34e0255cd128c28507dee4308 Mon Sep 17 00:00:00 2001 From: Lyon <88232613+pikasTech@users.noreply.github.com> Date: Tue, 23 Jun 2026 23:29:24 +0800 Subject: [PATCH] fix(workbench): ignore unsealed terminal durations (#1994) --- .../components/workbench/ConversationPanel.vue | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/web/hwlab-cloud-web/src/components/workbench/ConversationPanel.vue b/web/hwlab-cloud-web/src/components/workbench/ConversationPanel.vue index 2264a6c6..da9108db 100644 --- a/web/hwlab-cloud-web/src/components/workbench/ConversationPanel.vue +++ b/web/hwlab-cloud-web/src/components/workbench/ConversationPanel.vue @@ -307,13 +307,27 @@ function messageTimingForDisplay(message: ChatMessage): ChatMessage["timing"] { } function terminalMessageDurationMs(message: ChatMessage, timing: ChatMessage["timing"]): number | null { - const recorded = maxPositiveDurationMs(message.durationMs, timing?.durationMs, message.runnerTrace?.durationMs, message.runnerTrace?.timing?.durationMs); - if (recorded !== null) return recorded; const elapsed = elapsedTerminalDurationMs(message, timing); if (elapsed !== null && elapsed > 0) return elapsed; + const recorded = sealedTerminalRecordedDurationMs(message, timing); + if (recorded !== null) return recorded; return null; } +function sealedTerminalRecordedDurationMs(message: ChatMessage, timing: ChatMessage["timing"]): number | null { + const messageRecord = message as Record; + const trace = message.runnerTrace as Record | null | undefined; + const traceTiming = trace?.timing as Record | null | undefined; + const messageHasTerminalTimestamp = timestampMs(timing?.finishedAt ?? message.finishedAt ?? messageRecord.completedAt) !== null; + const traceHasTerminalTimestamp = timestampMs(traceTiming?.finishedAt ?? trace?.finishedAt ?? traceTiming?.completedAt ?? trace?.completedAt) !== null; + return maxPositiveDurationMs( + messageHasTerminalTimestamp ? message.durationMs : null, + messageHasTerminalTimestamp ? timing?.durationMs : null, + traceHasTerminalTimestamp ? message.runnerTrace?.durationMs : null, + traceHasTerminalTimestamp ? message.runnerTrace?.timing?.durationMs : null + ); +} + function elapsedTerminalDurationMs(message: ChatMessage, timing: ChatMessage["timing"]): number | null { const messageRecord = message as Record; const trace = message.runnerTrace as Record | null | undefined;