diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index 7abc1d53e9..b1795f9b98 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -729,6 +729,10 @@ ); }; + $: if ($terminalServers !== null && $selectedTerminalId && !isTerminalAvailable($selectedTerminalId)) { + selectedTerminalId.set(null); + } + let settingDefaults = false; const setDefaults = async () => { if (settingDefaults) return; @@ -1286,11 +1290,6 @@ }); } - // Clear stale selectedTerminalId if the referenced terminal no longer exists - if ($selectedTerminalId && !isTerminalAvailable($selectedTerminalId)) { - selectedTerminalId.set(null); - } - const pageSubscribe = page.subscribe(async (p) => { if (p.url.pathname === '/' || p.url.pathname.startsWith('/folders/')) { await tick(); diff --git a/src/lib/components/chat/ChatControls.svelte b/src/lib/components/chat/ChatControls.svelte index 488e59be04..8344e51c18 100644 --- a/src/lib/components/chat/ChatControls.svelte +++ b/src/lib/components/chat/ChatControls.svelte @@ -110,6 +110,7 @@ // Clear selected direct terminal if user lost permission $: if ( $selectedTerminalId && + $terminalServers !== null && !($terminalServers ?? []).some((t) => t.id && t.id === $selectedTerminalId) && !($user?.role === 'admin' || ($user?.permissions?.features?.direct_tool_servers ?? true)) ) { diff --git a/src/lib/components/chat/MessageInput.svelte b/src/lib/components/chat/MessageInput.svelte index 44a4b49e55..883bdbad08 100644 --- a/src/lib/components/chat/MessageInput.svelte +++ b/src/lib/components/chat/MessageInput.svelte @@ -696,7 +696,7 @@ } // Clear selected terminal when model doesn't support terminal - $: if ($selectedTerminalId && terminalCapableModels.length === 0) { + $: if ($selectedTerminalId && selectedModelIds.length > 0 && terminalCapableModels.length === 0) { selectedTerminalId.set(null); } diff --git a/src/lib/stores/index.ts b/src/lib/stores/index.ts index 97455c32f8..c213977f32 100644 --- a/src/lib/stores/index.ts +++ b/src/lib/stores/index.ts @@ -94,7 +94,7 @@ export const adminLeaderboardCount: Writable = writable(null); export const adminFeedbackCount: Writable = writable(null); export const toolServers = writable([]); -export const terminalServers = writable([]); +export const terminalServers: Writable = writable(null); // Persistent Pyodide worker for code interpreter FS export const pyodideWorker: Writable = writable(null); diff --git a/src/routes/(app)/+layout.svelte b/src/routes/(app)/+layout.svelte index af267e55f2..7e4daa94f7 100644 --- a/src/routes/(app)/+layout.svelte +++ b/src/routes/(app)/+layout.svelte @@ -184,7 +184,7 @@ name: t.name, key: localStorage.token })); - terminalServers.update((existing) => [...existing, ...terminalEntries]); + terminalServers.update((existing) => [...(existing ?? []), ...terminalEntries]); } }; @@ -264,9 +264,10 @@ }).catch((e) => console.error('Failed to load user settings:', e)) ]); - const loadToolServers = setToolServers().catch((e) => - console.error('Failed to load tool servers:', e) - ); + const loadToolServers = setToolServers().catch((e) => { + console.error('Failed to load tool servers:', e); + terminalServers.set([]); + }); if ( $page.url.searchParams.get('q') && ($page.url.searchParams.get('submit') ?? 'true') === 'true'