From 8a42aa53e826d5f25d6443ca95e0173e3cf034cf Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Wed, 19 Aug 2026 22:48:32 -0700 Subject: [PATCH] refac --- backend/open_webui/routers/terminals.py | 2 + backend/open_webui/utils/terminals.py | 7 ++ src/lib/apis/terminal/index.ts | 4 + .../components/AddTerminalServerModal.svelte | 36 ++++++++- .../admin/Settings/Integrations.svelte | 3 +- src/lib/components/chat/MessageInput.svelte | 79 ++++++++++++++++++- .../chat/MessageInput/TerminalMenu.svelte | 9 ++- .../chat/Settings/Integrations.svelte | 9 ++- src/lib/i18n/locales/en-GB/translation.json | 2 + src/lib/i18n/locales/en-US/translation.json | 2 + src/routes/(app)/+layout.svelte | 6 +- 11 files changed, 147 insertions(+), 12 deletions(-) diff --git a/backend/open_webui/routers/terminals.py b/backend/open_webui/routers/terminals.py index d9c586fa45..2b5555bc23 100644 --- a/backend/open_webui/routers/terminals.py +++ b/backend/open_webui/routers/terminals.py @@ -27,6 +27,7 @@ from open_webui.utils.terminals import ( terminal_context_available, terminal_context_config, terminal_context_id, + terminal_chat_uploads, terminal_contexts, ) from open_webui.utils.tools import bearer_auth_header, normalize_bearer_token @@ -87,6 +88,7 @@ async def list_terminal_servers(request: Request, user=Depends(get_verified_user 'url': connection.get('url', ''), 'name': connection.get('name', ''), 'contexts': terminal_contexts(connection), + 'config': {'chat_uploads': terminal_chat_uploads(connection)}, } for connection in connections if connection.get('enabled', True) and await has_connection_access(user, connection, user_group_ids) diff --git a/backend/open_webui/utils/terminals.py b/backend/open_webui/utils/terminals.py index 2ca2579c4d..506c15bff9 100644 --- a/backend/open_webui/utils/terminals.py +++ b/backend/open_webui/utils/terminals.py @@ -8,6 +8,7 @@ TERMINAL_CONTEXT_HEADER = 'X-Terminal-Context-Id' TERMINAL_CONTEXT_DEFAULT = 'default' TERMINAL_CONTEXT_TYPES = {'chat', 'automation'} TERMINAL_CONTEXT_ID_SOURCES = {'chat': 'chat_id', 'automation': 'automation_id'} +TERMINAL_CHAT_UPLOAD_MODES = {'default', 'filesystem'} def is_terminal_orchestrator(connection: dict) -> bool: @@ -104,3 +105,9 @@ def terminal_contexts(connection: dict) -> dict: else: result[context] = {} return result + + +def terminal_chat_uploads(connection: dict) -> str: + """Return normalized main-chat upload behavior for this connection.""" + value = (connection.get('config') or {}).get('chat_uploads') + return value if value in TERMINAL_CHAT_UPLOAD_MODES else 'default' diff --git a/src/lib/apis/terminal/index.ts b/src/lib/apis/terminal/index.ts index b4ec6a4ac2..4bec25fdf9 100644 --- a/src/lib/apis/terminal/index.ts +++ b/src/lib/apis/terminal/index.ts @@ -43,6 +43,10 @@ export type TerminalServer = { url: string; name: string; contexts?: Record; + config?: { + chat_uploads?: 'default' | 'filesystem'; + [key: string]: unknown; + }; }; export const getTerminalServers = async (token: string): Promise => { diff --git a/src/lib/components/AddTerminalServerModal.svelte b/src/lib/components/AddTerminalServerModal.svelte index e9fccfecf5..31f2f30e30 100644 --- a/src/lib/components/AddTerminalServerModal.svelte +++ b/src/lib/components/AddTerminalServerModal.svelte @@ -36,6 +36,7 @@ let auth_type = 'bearer'; let path = '/openapi.json'; let enabled = false; + let chatUploads: 'default' | 'filesystem' = 'default'; let chatContextMode: 'default' | 'chat_id' | 'off' = 'default'; let automationContextMode: 'default' | 'automation_id' | 'off' = 'default'; let showAdvanced = false; @@ -80,6 +81,7 @@ auth_type = connection?.auth_type ?? 'bearer'; path = connection?.path ?? '/openapi.json'; enabled = connection?.enabled ?? true; + chatUploads = connection?.config?.chat_uploads === 'filesystem' ? 'filesystem' : 'default'; accessGrants = connection?.config?.access_grants ?? []; // Restore policy state @@ -125,6 +127,7 @@ auth_type = 'bearer'; path = '/openapi.json'; enabled = false; + chatUploads = 'default'; accessGrants = []; chatContextMode = 'default'; automationContextMode = 'default'; @@ -373,6 +376,14 @@ contexts.automation = { context_id: 'automation_id' }; } const useContexts = !direct && serverType === 'orchestrator' && Object.keys(contexts).length > 0; + const connectionConfig: Record = + connection?.config && typeof connection.config === 'object' ? { ...connection.config } : {}; + if (!direct) connectionConfig.access_grants = accessGrants; + else delete connectionConfig.access_grants; + if (useContexts) connectionConfig.contexts = contexts; + else delete connectionConfig.contexts; + if (chatUploads === 'filesystem') connectionConfig.chat_uploads = 'filesystem'; + else delete connectionConfig.chat_uploads; const result = { ...(!direct && id.trim() ? { id: id.trim() } : {}), @@ -382,10 +393,7 @@ path, auth_type, enabled: enabled, - config: { - ...(!direct ? { access_grants: accessGrants } : {}), - ...(useContexts ? { contexts } : {}) - }, + config: connectionConfig, // Policy fields ...(serverType ? { server_type: serverType } : {}), ...(serverType === 'orchestrator' && policyId ? { policy_id: policyId } : {}) @@ -532,6 +540,26 @@ +
+
+
+ +
+
+ +
+
+
+ {#if serverType === 'orchestrator' && !direct}