From fa6e0f942cdcfda6bbad0bcff8459ff4cbfa4cad Mon Sep 17 00:00:00 2001 From: ytahdn <1294726970@qq.com> Date: Mon, 6 Jul 2026 11:02:49 +0800 Subject: [PATCH] fix(web-shell): suppress stale pending prompt refresh errors (#6352) Co-authored-by: ytahdn --- .../client/hooks/useQueuedPrompts.ts | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/packages/web-shell/client/hooks/useQueuedPrompts.ts b/packages/web-shell/client/hooks/useQueuedPrompts.ts index b356f2e6a4..38d4951459 100644 --- a/packages/web-shell/client/hooks/useQueuedPrompts.ts +++ b/packages/web-shell/client/hooks/useQueuedPrompts.ts @@ -52,6 +52,12 @@ interface UseQueuedPromptsArgs { const MAX_COMPLETED_PROMPT_IDS = 100; +type RefreshPendingPromptsResult = + | 'refreshed' + | 'skipped' + | 'superseded' + | 'failed'; + function areQueuedPromptsEqual( left: readonly QueuedPrompt[], right: readonly QueuedPrompt[], @@ -221,26 +227,28 @@ export function useQueuedPrompts({ ); const refreshPendingPrompts = useCallback( - async (targetSessionId = sessionId): Promise => { - if (!connected || !targetSessionId) return false; - if (latestSessionIdRef.current !== targetSessionId) return false; + async ( + targetSessionId = sessionId, + ): Promise => { + if (!connected || !targetSessionId) return 'skipped'; + if (latestSessionIdRef.current !== targetSessionId) return 'skipped'; const requestSeq = ++refreshRequestSeqRef.current; try { const result = await sessionActions.getPendingPrompts({ sessionId: targetSessionId, }); - if (requestSeq !== refreshRequestSeqRef.current) return false; - if (latestSessionIdRef.current !== targetSessionId) return false; + if (requestSeq !== refreshRequestSeqRef.current) return 'superseded'; + if (latestSessionIdRef.current !== targetSessionId) return 'skipped'; syncServerQueuedPrompts( result.pendingPrompts.filter( (p) => p.state === 'queued' || p.state === 'running', ), targetSessionId, ); - return true; + return 'refreshed'; } catch (error) { console.warn('Failed to refresh pending prompts', error); - return false; + return 'failed'; } }, [connected, sessionActions, sessionId, syncServerQueuedPrompts], @@ -595,7 +603,7 @@ export function useQueuedPrompts({ return false; } completionCallbacksRef.current.delete(target.serverPromptId); - if (!(await refreshPendingPrompts(targetSessionId))) { + if ((await refreshPendingPrompts(targetSessionId)) === 'failed') { setQueuedPromptFlags(target.id, { isEditing: false, isRemoving: false, @@ -612,7 +620,7 @@ export function useQueuedPrompts({ isEditing: false, isRemoving: false, }); - if (!(await refreshPendingPrompts(targetSessionId))) { + if ((await refreshPendingPrompts(targetSessionId)) !== 'refreshed') { restoreQueuedPrompts([target]); } reportError(error, fallback);