diff --git a/tools/server/webui/src/lib/components/app/misc/MarkdownContent.svelte b/tools/server/webui/src/lib/components/app/misc/MarkdownContent.svelte index d151bb91d9..32125405ea 100644 --- a/tools/server/webui/src/lib/components/app/misc/MarkdownContent.svelte +++ b/tools/server/webui/src/lib/components/app/misc/MarkdownContent.svelte @@ -21,6 +21,7 @@ import githubLightCss from 'highlight.js/styles/github.css?inline'; import { mode } from 'mode-watcher'; import CodePreviewDialog from './CodePreviewDialog.svelte'; + import { getImageErrorFallbackHtml } from '$lib/utils/image-error-fallback'; interface Props { content: string; @@ -345,24 +346,7 @@ // Create fallback element const fallback = document.createElement('div'); fallback.className = 'image-load-error'; - fallback.innerHTML = ` -
- - - - - - External image cannot be displayed - - Open in new tab - - - - - - -
- `; + fallback.innerHTML = getImageErrorFallbackHtml(src); // Replace image with fallback img.parentNode?.replaceChild(fallback, img); diff --git a/tools/server/webui/src/lib/config/mcp.ts b/tools/server/webui/src/lib/config/mcp.ts index 18f465ab3e..11f9def311 100644 --- a/tools/server/webui/src/lib/config/mcp.ts +++ b/tools/server/webui/src/lib/config/mcp.ts @@ -1,4 +1,9 @@ -import type { MCPClientConfig, MCPServerConfig, MCPServerSettingsEntry } from '$lib/types/mcp'; +import type { + MCPClientConfig, + MCPServerConfig, + MCPServerSettingsEntry, + McpServerUsageStats +} from '$lib/types/mcp'; import type { SettingsConfigType } from '$lib/types/settings'; import type { McpServerOverride } from '$lib/types/database'; import { DEFAULT_MCP_CONFIG } from '$lib/constants/mcp'; @@ -144,8 +149,6 @@ export function hasEnabledMcpServers( // MCP Server Usage Stats // ───────────────────────────────────────────────────────────────────────────── -export type McpServerUsageStats = Record; - /** * Parse MCP server usage stats from settings. */ diff --git a/tools/server/webui/src/lib/mcp/host-manager.ts b/tools/server/webui/src/lib/mcp/host-manager.ts index fe21105e12..7c3bd26def 100644 --- a/tools/server/webui/src/lib/mcp/host-manager.ts +++ b/tools/server/webui/src/lib/mcp/host-manager.ts @@ -21,41 +21,17 @@ * - Automatic tool-to-server routing */ -import { MCPServerConnection, type ToolExecutionResult } from './server-connection'; +import { MCPServerConnection } from './server-connection'; +import type { ToolExecutionResult } from '$lib/types/mcp'; import type { - MCPClientConfig, MCPToolCall, - ClientCapabilities, - Implementation + MCPHostManagerConfig, + OpenAIToolDefinition, + ServerStatus } from '$lib/types/mcp'; import { MCPError } from '$lib/errors'; import type { Tool } from '@modelcontextprotocol/sdk/types.js'; -export interface MCPHostManagerConfig { - /** Server configurations keyed by server name */ - servers: MCPClientConfig['servers']; - /** Client info to advertise to all servers */ - clientInfo?: Implementation; - /** Default capabilities to advertise */ - capabilities?: ClientCapabilities; -} - -export interface OpenAIToolDefinition { - type: 'function'; - function: { - name: string; - description?: string; - parameters: Record; - }; -} - -export interface ServerStatus { - name: string; - isConnected: boolean; - toolCount: number; - error?: string; -} - /** * Manages multiple MCP server connections and provides unified tool access. */ diff --git a/tools/server/webui/src/lib/mcp/index.ts b/tools/server/webui/src/lib/mcp/index.ts index e9a618e5ac..7337258001 100644 --- a/tools/server/webui/src/lib/mcp/index.ts +++ b/tools/server/webui/src/lib/mcp/index.ts @@ -1,20 +1,6 @@ // New architecture exports export { MCPHostManager } from './host-manager'; -export type { MCPHostManagerConfig, OpenAIToolDefinition, ServerStatus } from './host-manager'; export { MCPServerConnection } from './server-connection'; -export type { - MCPServerConnectionConfig, - ToolCallParams, - ToolExecutionResult -} from './server-connection'; // Errors export { MCPError } from '$lib/errors'; - -// Types -export type { - MCPClientConfig, - MCPServerConfig, - MCPToolCall, - MCPServerSettingsEntry -} from '$lib/types/mcp'; diff --git a/tools/server/webui/src/lib/mcp/server-connection.ts b/tools/server/webui/src/lib/mcp/server-connection.ts index 3ddf2c32f1..2abe081657 100644 --- a/tools/server/webui/src/lib/mcp/server-connection.ts +++ b/tools/server/webui/src/lib/mcp/server-connection.ts @@ -22,7 +22,11 @@ import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js'; import { WebSocketClientTransport } from '@modelcontextprotocol/sdk/client/websocket.js'; import type { Tool } from '@modelcontextprotocol/sdk/types.js'; import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js'; -import type { MCPServerConfig, ClientCapabilities, Implementation } from '$lib/types/mcp'; +import type { + MCPServerConnectionConfig, + ToolCallParams, + ToolExecutionResult +} from '$lib/types/mcp'; import { MCPError } from '$lib/errors'; import { DEFAULT_MCP_CONFIG } from '$lib/constants/mcp'; @@ -42,27 +46,6 @@ interface ToolCallResult { _meta?: Record; } -export interface MCPServerConnectionConfig { - /** Unique server name/identifier */ - name: string; - /** Server configuration */ - server: MCPServerConfig; - /** Client info to advertise */ - clientInfo?: Implementation; - /** Capabilities to advertise */ - capabilities?: ClientCapabilities; -} - -export interface ToolCallParams { - name: string; - arguments: Record; -} - -export interface ToolExecutionResult { - content: string; - isError: boolean; -} - /** * Wraps the MCP SDK Client and provides a clean interface for tool operations. */ diff --git a/tools/server/webui/src/lib/stores/mcp.svelte.ts b/tools/server/webui/src/lib/stores/mcp.svelte.ts index b5a18463fd..367ff24047 100644 --- a/tools/server/webui/src/lib/stores/mcp.svelte.ts +++ b/tools/server/webui/src/lib/stores/mcp.svelte.ts @@ -1,11 +1,7 @@ import { browser } from '$app/environment'; -import { - MCPHostManager, - type OpenAIToolDefinition, - type ServerStatus -} from '$lib/mcp/host-manager'; +import { MCPHostManager } from '$lib/mcp/host-manager'; import { MCPServerConnection } from '$lib/mcp/server-connection'; -import type { ToolExecutionResult } from '$lib/mcp/server-connection'; +import type { OpenAIToolDefinition, ServerStatus, ToolExecutionResult } from '$lib/types/mcp'; import { buildMcpClientConfig, incrementMcpServerUsage } from '$lib/config/mcp'; import { config, settingsStore } from '$lib/stores/settings.svelte'; import type { MCPToolCall } from '$lib/types/mcp'; diff --git a/tools/server/webui/src/lib/types/mcp.ts b/tools/server/webui/src/lib/types/mcp.ts index e4f195ac17..ade450bedd 100644 --- a/tools/server/webui/src/lib/types/mcp.ts +++ b/tools/server/webui/src/lib/types/mcp.ts @@ -70,3 +70,63 @@ export type MCPServerSettingsEntry = { /** Server icon URL from metadata (fetched during health check). */ iconUrl?: string; }; + +// ───────────────────────────────────────────────────────────────────────────── +// Host Manager Types +// ───────────────────────────────────────────────────────────────────────────── + +export interface MCPHostManagerConfig { + /** Server configurations keyed by server name */ + servers: MCPClientConfig['servers']; + /** Client info to advertise to all servers */ + clientInfo?: Implementation; + /** Default capabilities to advertise */ + capabilities?: ClientCapabilities; +} + +export interface OpenAIToolDefinition { + type: 'function'; + function: { + name: string; + description?: string; + parameters: Record; + }; +} + +export interface ServerStatus { + name: string; + isConnected: boolean; + toolCount: number; + error?: string; +} + +// ───────────────────────────────────────────────────────────────────────────── +// Usage Stats +// ───────────────────────────────────────────────────────────────────────────── + +export type McpServerUsageStats = Record; + +// ───────────────────────────────────────────────────────────────────────────── +// Server Connection Types +// ───────────────────────────────────────────────────────────────────────────── + +export interface MCPServerConnectionConfig { + /** Unique server name/identifier */ + name: string; + /** Server configuration */ + server: MCPServerConfig; + /** Client info to advertise */ + clientInfo?: Implementation; + /** Capabilities to advertise */ + capabilities?: ClientCapabilities; +} + +export interface ToolCallParams { + name: string; + arguments: Record; +} + +export interface ToolExecutionResult { + content: string; + isError: boolean; +} diff --git a/tools/server/webui/src/lib/utils/image-error-fallback.ts b/tools/server/webui/src/lib/utils/image-error-fallback.ts new file mode 100644 index 0000000000..6e3260f4ae --- /dev/null +++ b/tools/server/webui/src/lib/utils/image-error-fallback.ts @@ -0,0 +1,10 @@ +/** + * Simplified HTML fallback for external images that fail to load. + * Displays a centered message with a link to open the image in a new tab. + */ +export function getImageErrorFallbackHtml(src: string): string { + return `
+ Image cannot be displayed + (open link) +
`; +}