From 6c253b97d5b495af62ea03c2c7e078b764c0c055 Mon Sep 17 00:00:00 2001 From: Lyon <88232613+pikasTech@users.noreply.github.com> Date: Wed, 24 Jun 2026 17:35:26 +0800 Subject: [PATCH] fix(workbench): remove implicit completed fallback (#2053) --- web/hwlab-cloud-web/src/stores/workbench.ts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/web/hwlab-cloud-web/src/stores/workbench.ts b/web/hwlab-cloud-web/src/stores/workbench.ts index a1b75cbd..6207f12e 100644 --- a/web/hwlab-cloud-web/src/stores/workbench.ts +++ b/web/hwlab-cloud-web/src/stores/workbench.ts @@ -994,7 +994,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) || traceResultHasTerminalEvidence(result); + const terminal = result.terminal === true || isTerminalMessageStatus(resultStatus); const resultError = normalizeAgentError(result.error ?? null); const resultProjection = projectionFromResult(result); const mergedRunnerTrace = mergeRunnerTrace(message.runnerTrace, nextTrace); @@ -1656,7 +1656,7 @@ function normalizeChatMessage(message: ChatMessage): ChatMessage { const baseText = firstNonEmptyString(message.text, messageText((message as Record).content), messageText((message as Record).message)); const finalText = finalResponseText((message as Record).finalResponse); const errorText = agentErrorDisplayText(error); - const status = normalizeAgentMessageStatusFromEvidence(role, rawStatus, message, runnerTrace, finalText); + const status = normalizeAgentMessageStatusFromEvidence(role, rawStatus, runnerTrace); const text = role === "agent" ? isTerminalMessageStatus(status) ? projectedAgentMessageText({ status, finalText, errorText, baseText }) @@ -1666,12 +1666,11 @@ function normalizeChatMessage(message: ChatMessage): ChatMessage { return { ...message, ...messageTimingPatch(message), role, text, id: messageId, messageId, title: normalizeWorkbenchMessageTitle(role, message.title), createdAt: message.createdAt ?? new Date().toISOString(), status, runnerTrace, error: error ?? message.error ?? null, projection, projectionStatus: projection?.projectionStatus ?? null, projectionHealth: projection?.projectionHealth ?? null, blocker: projection?.blocker ?? null, agentRun: agentRun ?? undefined }; } -function normalizeAgentMessageStatusFromEvidence(role: ChatMessage["role"], status: ChatMessage["status"], message: ChatMessage, runnerTrace: ChatMessage["runnerTrace"], finalText: string | null): ChatMessage["status"] { +function normalizeAgentMessageStatusFromEvidence(role: ChatMessage["role"], status: ChatMessage["status"], runnerTrace: ChatMessage["runnerTrace"]): ChatMessage["status"] { if (role !== "agent") return status; const traceStatus = normalizedStatusText(runnerTrace?.status); if (isTerminalMessageStatus(traceStatus)) return traceStatus as ChatMessage["status"]; if (isTerminalMessageStatus(status)) return status; - if (finalText || traceSnapshotHasTerminalEvidence(message) || traceSnapshotHasTerminalEvidence(runnerTrace)) return "completed" as ChatMessage["status"]; return status; } @@ -1840,7 +1839,7 @@ function messageTimingPatchForMerge(message: ChatMessage, value: unknown): Parti const currentTiming = current.timing ?? null; const record = recordValue(value); const incomingStatus = normalizedStatusText(firstNonEmptyString(record?.status)); - const incomingTerminal = isTerminalMessageStatus(incomingStatus) || traceResultHasTerminalEvidence(value); + const incomingTerminal = record?.terminal === true || isTerminalMessageStatus(incomingStatus); if (!incomingTerminal || isTerminalMessageStatus(message.status) || currentTiming?.finishedAt || currentTiming?.durationMs != null) return current; const incoming = normalizeTimingProjection(value); const terminalTiming = incoming ?? ({} as Partial); @@ -1857,7 +1856,7 @@ function messageTimingPatchForMerge(message: ChatMessage, value: unknown): Parti function messageStatusPatchForTerminalMerge(message: ChatMessage, resultStatus: string | null, terminal: boolean): Partial { if (!terminal || isTerminalMessageStatus(message.status)) return {}; if (resultStatus && isTerminalMessageStatus(resultStatus)) return { status: resultStatus as ChatMessage["status"] }; - return { status: "completed" }; + return {}; } function inferFinishedAtFromDuration(startedAt: unknown, durationMs: number | null): string | null {