diff --git a/web/hwlab-cloud-web/src/stores/workbench.ts b/web/hwlab-cloud-web/src/stores/workbench.ts index 45dcfa53..b46d8fa8 100644 --- a/web/hwlab-cloud-web/src/stores/workbench.ts +++ b/web/hwlab-cloud-web/src/stores/workbench.ts @@ -455,7 +455,18 @@ export const useWorkbenchStore = defineStore("workbench", () => { } async function hydrateTurnStatusAuthority(source: ChatMessage[] = messages.value): Promise { - await Promise.all(uniqueTraceIds(source).slice(-12).map((traceId) => refreshTurnStatusByTraceId(traceId))); + await Promise.all(uniqueTraceIds(source).slice(-12).filter((traceId) => traceNeedsTurnStatusRefresh(traceId, source)).map((traceId) => refreshTurnStatusByTraceId(traceId))); + } + + function traceNeedsTurnStatusRefresh(traceId: string | null | undefined, source: ChatMessage[] = messages.value): boolean { + const id = firstNonEmptyString(traceId); + if (!id) return false; + const turn = turnStatusAuthority.value[id]; + 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; + return true; } async function refreshTurnStatusByTraceId(traceId: string | null | undefined): Promise {