From c094b757c64a0d61bbade5092deb4d9581d90d8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=88=91=E4=B8=80=E7=9B=B4=E5=9C=A8=E5=93=AD?= Date: Sun, 19 Jul 2026 03:24:41 +0800 Subject: [PATCH 1/4] Update useMessages.ts --- dashboard/src/composables/useMessages.ts | 30 +++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/dashboard/src/composables/useMessages.ts b/dashboard/src/composables/useMessages.ts index 5286229008..703f456a3c 100644 --- a/dashboard/src/composables/useMessages.ts +++ b/dashboard/src/composables/useMessages.ts @@ -1,4 +1,11 @@ -import { computed, onBeforeUnmount, reactive, ref, type Ref } from "vue"; +import { + computed, + onBeforeUnmount, + reactive, + ref, + watch, + type Ref, +} from "vue"; import { chatApi, fileApi } from "@/api/v1"; import { fetchWithAuth } from "@/api/http"; @@ -150,6 +157,7 @@ export function useMessages(options: UseMessagesOptions) { const sessionProjects = reactive>( {}, ); + let sessionPollTimer: number | undefined; const activeMessages = computed(() => options.currentSessionId.value @@ -158,6 +166,9 @@ export function useMessages(options: UseMessagesOptions) { ); onBeforeUnmount(() => { + if (sessionPollTimer !== undefined) { + window.clearInterval(sessionPollTimer); + } cleanupConnections(); for (const promise of attachmentBlobCache.values()) { promise.then((url) => URL.revokeObjectURL(url)).catch(() => {}); @@ -165,6 +176,23 @@ export function useMessages(options: UseMessagesOptions) { attachmentBlobCache.clear(); }); + watch( + () => options.currentSessionId.value, + (sessionId) => { + if (sessionPollTimer !== undefined) { + window.clearInterval(sessionPollTimer); + sessionPollTimer = undefined; + } + if (!sessionId) return; + sessionPollTimer = window.setInterval(() => { + if (!isSessionRunning(sessionId)) { + void loadSessionMessages(sessionId, false, false); + } + }, 2000); + }, + { immediate: true }, + ); + function isSessionRunning(sessionId: string) { return Object.values(activeConnections).some( (connection) => connection.sessionId === sessionId, From 757e7c53650c289687cc7f9176387330b9bae77d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=88=91=E4=B8=80=E7=9B=B4=E5=9C=A8=E5=93=AD?= Date: Sun, 19 Jul 2026 03:25:44 +0800 Subject: [PATCH 2/4] Update useMessages.ts --- dashboard/src/composables/useMessages.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dashboard/src/composables/useMessages.ts b/dashboard/src/composables/useMessages.ts index 703f456a3c..9709ab696a 100644 --- a/dashboard/src/composables/useMessages.ts +++ b/dashboard/src/composables/useMessages.ts @@ -1552,6 +1552,6 @@ export function parseJsonSafe(value: unknown) { try { return JSON.parse(value); } catch { - return value; + return value } } From 354da55a3b2259633f1621271ec33d34d72ad585 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=88=91=E4=B8=80=E7=9B=B4=E5=9C=A8=E5=93=AD?= Date: Sun, 19 Jul 2026 03:26:10 +0800 Subject: [PATCH 3/4] fix: show background task results in webchat --- dashboard/src/composables/useMessages.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dashboard/src/composables/useMessages.ts b/dashboard/src/composables/useMessages.ts index 9709ab696a..703f456a3c 100644 --- a/dashboard/src/composables/useMessages.ts +++ b/dashboard/src/composables/useMessages.ts @@ -1552,6 +1552,6 @@ export function parseJsonSafe(value: unknown) { try { return JSON.parse(value); } catch { - return value + return value; } } From 1f8f26dc54e9c07207d1bfdf092a57a5a12bec5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=88=91=E4=B8=80=E7=9B=B4=E5=9C=A8=E5=93=AD?= Date: Sun, 19 Jul 2026 03:53:53 +0800 Subject: [PATCH 4/4] fix: avoid overlapping webchat polling requests --- dashboard/src/composables/useMessages.ts | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/dashboard/src/composables/useMessages.ts b/dashboard/src/composables/useMessages.ts index 703f456a3c..99aebfdd05 100644 --- a/dashboard/src/composables/useMessages.ts +++ b/dashboard/src/composables/useMessages.ts @@ -158,6 +158,7 @@ export function useMessages(options: UseMessagesOptions) { {}, ); let sessionPollTimer: number | undefined; + let isUnmounted = false; const activeMessages = computed(() => options.currentSessionId.value @@ -166,8 +167,10 @@ export function useMessages(options: UseMessagesOptions) { ); onBeforeUnmount(() => { + isUnmounted = true; if (sessionPollTimer !== undefined) { - window.clearInterval(sessionPollTimer); + window.clearTimeout(sessionPollTimer); + sessionPollTimer = undefined; } cleanupConnections(); for (const promise of attachmentBlobCache.values()) { @@ -180,15 +183,22 @@ export function useMessages(options: UseMessagesOptions) { () => options.currentSessionId.value, (sessionId) => { if (sessionPollTimer !== undefined) { - window.clearInterval(sessionPollTimer); + window.clearTimeout(sessionPollTimer); sessionPollTimer = undefined; } if (!sessionId) return; - sessionPollTimer = window.setInterval(() => { + + const poll = async () => { if (!isSessionRunning(sessionId)) { - void loadSessionMessages(sessionId, false, false); + await loadSessionMessages(sessionId, false, false); + } + + if (!isUnmounted && options.currentSessionId.value === sessionId) { + sessionPollTimer = window.setTimeout(poll, 2000); } - }, 2000); + }; + + sessionPollTimer = window.setTimeout(poll, 2000); }, { immediate: true }, );