fix(workbench): remove implicit completed fallback (#2053)

This commit is contained in:
Lyon
2026-06-24 17:35:26 +08:00
committed by GitHub
parent b49f2a5ed2
commit 6c253b97d5
+5 -6
View File
@@ -994,7 +994,7 @@ function nonBlockingProjection(projection: ProjectionDiagnostic | null): Project
updatedAt: new Date().toISOString()
} as NonNullable<ChatMessage["runnerTrace"]>;
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<string, unknown>).content), messageText((message as Record<string, unknown>).message));
const finalText = finalResponseText((message as Record<string, unknown>).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<WorkbenchTurnTimingProjection>);
@@ -1857,7 +1856,7 @@ function messageTimingPatchForMerge(message: ChatMessage, value: unknown): Parti
function messageStatusPatchForTerminalMerge(message: ChatMessage, resultStatus: string | null, terminal: boolean): Partial<ChatMessage> {
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 {