diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index 24f31fdc43..fbe45b4b2e 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -3112,7 +3112,7 @@ async def process_chat_payload(request, form_data, user, metadata, model): if name not in tools_dict: tools_dict[name] = tool_dict - # Only advertise user-shell tools when the originating browser has a connected shell. + # Automations and sub-agents never have a user's browser shell, so they never get these tools. shell_tools = { name: tool for name, tool in tools_dict.items() @@ -3128,32 +3128,8 @@ async def process_chat_payload(request, form_data, user, metadata, model): or (tool.get('direct') and tool.get('server', {}).get('url') == terminal_id) ) } - connected = False - if ( - selected - and event_caller - and metadata.get('session_id') - and metadata.get('chat_id') - and not metadata.get('automation_id') - and not metadata.get('internal') - ): - try: - state = await asyncio.wait_for( - event_caller( - { - 'type': 'request:terminal:state', - 'data': {'terminal_id': terminal_id, 'session_id': metadata['session_id']}, - } - ), - timeout=2, - ) - connected = isinstance(state, dict) and state.get('connected') is True - except Exception: - # Old/disconnected browsers cannot confirm availability; other tools still work. - pass - for name in shell_tools: - if not connected or name not in selected: + if name not in selected or metadata.get('automation_id') or metadata.get('internal'): tools_dict.pop(name) if tools_dict: diff --git a/src/lib/components/chat/XTerminal.svelte b/src/lib/components/chat/XTerminal.svelte index d9163812ed..e4e420068e 100644 --- a/src/lib/components/chat/XTerminal.svelte +++ b/src/lib/components/chat/XTerminal.svelte @@ -5,7 +5,6 @@ import { WebLinksAddon } from '@xterm/addon-web-links'; import '@xterm/xterm/css/xterm.css'; import { terminalRequest, type TerminalConnection } from '$lib/apis/terminal'; - import { connectedUserTerminals } from '$lib/stores'; export let connection: TerminalConnection; export let chatId: string | null = null; @@ -23,13 +22,8 @@ let pingInterval: ReturnType; let destroyed = false; let sessionId = ''; - const terminalOwner = Symbol(); function disconnect() { - connectedUserTerminals.update((entries) => { - entries.delete(terminalOwner); - return entries; - }); connected = false; connecting = false; clearInterval(pingInterval); @@ -75,10 +69,6 @@ ws?.send( JSON.stringify({ type: 'auth', token: connection.key.trim(), chat_id: chatId ?? '' }) ); - if (connection.selector && chatId) { - const shell = { terminalId: connection.selector, chatId }; - connectedUserTerminals.update((entries) => entries.set(terminalOwner, shell)); - } connected = true; connecting = false; fit(); diff --git a/src/lib/stores/index.ts b/src/lib/stores/index.ts index c42bff8a68..334290c10b 100644 --- a/src/lib/stores/index.ts +++ b/src/lib/stores/index.ts @@ -146,9 +146,6 @@ export type FileNavOpenRequest = string | { path: string; page?: number | null } export const showFileNavPath: Writable = writable(null); export const showFileNavDir: Writable = writable(null); export const selectedTerminalId: Writable = writable(null); -export const connectedUserTerminals = writable( - new Map() -); export const artifactCode = writable(null); export const artifactContents = writable(null); diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index a9b3c78730..5233e9541c 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -31,7 +31,6 @@ channels, channelId, terminalServers, - connectedUserTerminals, showControls, showFileNavPath, showFileNavDir, @@ -566,21 +565,6 @@ }; const chatEventHandler = async (event, cb) => { - // Answer this session's availability check even when another chat is active. - if ( - event?.data?.type === 'request:terminal:state' && - event.data.data?.session_id === $socket?.id - ) { - cb?.({ - connected: - $config?.features?.enable_tool_servers && - [...$connectedUserTerminals.values()].some( - (shell) => - shell.terminalId === event.data.data?.terminal_id && shell.chatId === event.chat_id - ) - }); - return; - } const chat = $page.url.pathname.includes(`/c/${event.chat_id}`); // Skip events from temporary chats that are not the current chat.