Merge pull request #1892 from pikasTech/fix-1189-active-turn-terminal-evidence

fix(workbench): terminal evidence 触发 turn 状态追赶
This commit is contained in:
Lyon
2026-06-22 13:40:23 +08:00
committed by GitHub
+10 -2
View File
@@ -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<ChatMessage["runnerTrace"]>;
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<string, unknown> | null {
return value && typeof value === "object" ? value as Record<string, unknown> : null;
}