fix(workbench): remove implicit completed fallback (#2053)
This commit is contained in:
@@ -994,7 +994,7 @@ function nonBlockingProjection(projection: ProjectionDiagnostic | null): Project
|
|||||||
updatedAt: new Date().toISOString()
|
updatedAt: new Date().toISOString()
|
||||||
} as NonNullable<ChatMessage["runnerTrace"]>;
|
} as NonNullable<ChatMessage["runnerTrace"]>;
|
||||||
const resultStatus = normalizedStatusText(result.status) ?? null;
|
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 resultError = normalizeAgentError(result.error ?? null);
|
||||||
const resultProjection = projectionFromResult(result);
|
const resultProjection = projectionFromResult(result);
|
||||||
const mergedRunnerTrace = mergeRunnerTrace(message.runnerTrace, nextTrace);
|
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 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 finalText = finalResponseText((message as Record<string, unknown>).finalResponse);
|
||||||
const errorText = agentErrorDisplayText(error);
|
const errorText = agentErrorDisplayText(error);
|
||||||
const status = normalizeAgentMessageStatusFromEvidence(role, rawStatus, message, runnerTrace, finalText);
|
const status = normalizeAgentMessageStatusFromEvidence(role, rawStatus, runnerTrace);
|
||||||
const text = role === "agent"
|
const text = role === "agent"
|
||||||
? isTerminalMessageStatus(status)
|
? isTerminalMessageStatus(status)
|
||||||
? projectedAgentMessageText({ status, finalText, errorText, baseText })
|
? 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 };
|
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;
|
if (role !== "agent") return status;
|
||||||
const traceStatus = normalizedStatusText(runnerTrace?.status);
|
const traceStatus = normalizedStatusText(runnerTrace?.status);
|
||||||
if (isTerminalMessageStatus(traceStatus)) return traceStatus as ChatMessage["status"];
|
if (isTerminalMessageStatus(traceStatus)) return traceStatus as ChatMessage["status"];
|
||||||
if (isTerminalMessageStatus(status)) return status;
|
if (isTerminalMessageStatus(status)) return status;
|
||||||
if (finalText || traceSnapshotHasTerminalEvidence(message) || traceSnapshotHasTerminalEvidence(runnerTrace)) return "completed" as ChatMessage["status"];
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1840,7 +1839,7 @@ function messageTimingPatchForMerge(message: ChatMessage, value: unknown): Parti
|
|||||||
const currentTiming = current.timing ?? null;
|
const currentTiming = current.timing ?? null;
|
||||||
const record = recordValue(value);
|
const record = recordValue(value);
|
||||||
const incomingStatus = normalizedStatusText(firstNonEmptyString(record?.status));
|
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;
|
if (!incomingTerminal || isTerminalMessageStatus(message.status) || currentTiming?.finishedAt || currentTiming?.durationMs != null) return current;
|
||||||
const incoming = normalizeTimingProjection(value);
|
const incoming = normalizeTimingProjection(value);
|
||||||
const terminalTiming = incoming ?? ({} as Partial<WorkbenchTurnTimingProjection>);
|
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> {
|
function messageStatusPatchForTerminalMerge(message: ChatMessage, resultStatus: string | null, terminal: boolean): Partial<ChatMessage> {
|
||||||
if (!terminal || isTerminalMessageStatus(message.status)) return {};
|
if (!terminal || isTerminalMessageStatus(message.status)) return {};
|
||||||
if (resultStatus && isTerminalMessageStatus(resultStatus)) return { status: resultStatus as ChatMessage["status"] };
|
if (resultStatus && isTerminalMessageStatus(resultStatus)) return { status: resultStatus as ChatMessage["status"] };
|
||||||
return { status: "completed" };
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
function inferFinishedAtFromDuration(startedAt: unknown, durationMs: number | null): string | null {
|
function inferFinishedAtFromDuration(startedAt: unknown, durationMs: number | null): string | null {
|
||||||
|
|||||||
Reference in New Issue
Block a user