fix(chat): show the timeout message instead of an empty bubble (#6764) (#6768)

_isAgent was a const inside the try block of handleChatSubmit, but the
catch block reads it to pick the timeout message, so a client timeout
threw a ReferenceError and left the reply bubble empty. Declare it next
to the other catch-visible variables and assign it where it is computed.
This commit is contained in:
Grzegorz
2026-11-08 02:02:37 +00:00
committed by GitHub
parent e4cc8efa19
commit ae03bb8363
2 changed files with 15 additions and 1 deletions
+2 -1
View File
@@ -2588,6 +2588,7 @@ import { invalidateSettings } from './appConfig.js';
currentHolder = null;
let abortCtrl = null;
let _isAgent = false; // read by the catch block's timeout message
let streamingTTS = false;
try {
// Re-enable auto-scroll when user sends a message
@@ -2985,7 +2986,7 @@ import { invalidateSettings } from './appConfig.js';
currentAbort = abortCtrl;
const _tState = Storage.loadToggleState();
const _isAgent = (_tState.mode || 'chat') === 'agent' || !!_tState.plan_mode || workspaceAgentIntent;
_isAgent = (_tState.mode || 'chat') === 'agent' || !!_tState.plan_mode || workspaceAgentIntent;
// Timeout: 6 min for research and agent mode, 3 min otherwise
const timeoutMs = el('research-toggle').checked || _isAgent ? RESEARCH_TIMEOUT_MS : DEFAULT_TIMEOUT_MS;
+13
View File
@@ -0,0 +1,13 @@
from pathlib import Path
import re
ROOT = Path(__file__).resolve().parents[1]
def test_timeout_catch_can_read_is_agent():
"""The catch block reads _isAgent, so it must not be a try-scoped const (#6764)."""
src = (ROOT / "static/js/chat.js").read_text()
assert re.search(r"^\s*let _isAgent = false;", src, re.M)
assert not re.search(r"\bconst _isAgent\b", src)
assert re.search(r"^\s*_isAgent = \(_tState\.mode", src, re.M)