From 2f00d1dbff62563e1ca5f6a4b639ea849886cea1 Mon Sep 17 00:00:00 2001 From: lyon Date: Mon, 22 Jun 2026 13:39:37 +0800 Subject: [PATCH] fix(workbench): refresh turn status on terminal evidence --- web/hwlab-cloud-web/src/stores/workbench.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/web/hwlab-cloud-web/src/stores/workbench.ts b/web/hwlab-cloud-web/src/stores/workbench.ts index 8a870494..92f348fd 100644 --- a/web/hwlab-cloud-web/src/stores/workbench.ts +++ b/web/hwlab-cloud-web/src/stores/workbench.ts @@ -491,7 +491,7 @@ export const useWorkbenchStore = defineStore("workbench", () => { if (turn?.terminal === true || isTerminalMessageStatus(turn?.status)) return false; const message = [...source].reverse().find((item) => firstNonEmptyString(item.traceId, item.runnerTrace?.traceId) === id) ?? null; if (isTerminalMessageStatus(message?.status) || isTerminalMessageStatus(message?.runnerTrace?.status)) return false; - if (message?.runnerTrace && traceSnapshotHasTerminalEvidence(message.runnerTrace)) return false; + if (message?.runnerTrace && traceSnapshotHasTerminalEvidence(message.runnerTrace)) return true; return true; } @@ -780,7 +780,7 @@ function nonBlockingProjection(projection: ProjectionDiagnostic | null): Project updatedAt: new Date().toISOString() } as NonNullable; const resultStatus = normalizedStatusText(result.status) ?? null; - const terminal = result.terminal === true || isTerminalMessageStatus(resultStatus); + const terminal = result.terminal === true || isTerminalMessageStatus(resultStatus) || traceResultHasTerminalEvidence(result); const resultError = normalizeAgentError(result.error ?? null); const resultProjection = projectionFromResult(result); const mergedRunnerTrace = mergeRunnerTrace(message.runnerTrace, nextTrace); @@ -793,6 +793,9 @@ function nonBlockingProjection(projection: ProjectionDiagnostic | null): Project return { ...message, ...messageTimingPatchForMerge(message, result), runnerTrace, error, projection, projectionStatus: projection?.projectionStatus ?? null, projectionHealth: projection?.projectionHealth ?? null, blocker: projection?.blocker ?? null, agentRun: agentRun ?? undefined, updatedAt: new Date().toISOString() }; })); markWorkbenchTraceProjected(traceId); + if (traceResultHasTerminalEvidence(result) && result.terminal !== true && !isTerminalMessageStatus(result.status)) { + void refreshTerminalTraceFromRest(traceId, "trace-hydration-terminal-evidence"); + } if (result.terminal === true || isTerminalMessageStatus(result.status)) { rememberTurnStatus(traceId, result); clearActiveTurnGapRefresh(traceId); @@ -1861,6 +1864,11 @@ function traceSnapshotHasTerminalEvidence(snapshot: unknown): boolean { return events.some((event) => traceEventHasTerminalEvidence(event)); } +function traceResultHasTerminalEvidence(result: unknown): boolean { + const record = recordValue(result); + return traceSnapshotHasTerminalEvidence(result) || traceSnapshotHasTerminalEvidence(record?.runnerTrace); +} + function recordValue(value: unknown): Record | null { return value && typeof value === "object" ? value as Record : null; }