From 4c562e717662815c4b46cf82f474ec70001a7f62 Mon Sep 17 00:00:00 2001 From: Lyon <88232613+pikasTech@users.noreply.github.com> Date: Sun, 21 Jun 2026 10:50:56 +0800 Subject: [PATCH] fix(workbench): skip terminal turn polling (#1809) Stop realtime gap hydration from polling completed/terminal Workbench turns. This avoids repeated /v1/workbench/turns requests for old traces while preserving active turn refresh.\n\nRefs #1791. --- web/hwlab-cloud-web/src/stores/workbench.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) 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 {