diff --git a/apps/desktop/src/assets/client-icons/android-studio.svg b/apps/desktop/src/assets/client-icons/android-studio.svg new file mode 100644 index 00000000..5c92e3aa --- /dev/null +++ b/apps/desktop/src/assets/client-icons/android-studio.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/desktop/src/assets/client-icons/jetbrains.svg b/apps/desktop/src/assets/client-icons/jetbrains.svg new file mode 100644 index 00000000..397ac754 --- /dev/null +++ b/apps/desktop/src/assets/client-icons/jetbrains.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + JB + diff --git a/apps/desktop/src/components/ConnectIDEs.tsx b/apps/desktop/src/components/ConnectIDEs.tsx index 790f7f79..28b83685 100644 --- a/apps/desktop/src/components/ConnectIDEs.tsx +++ b/apps/desktop/src/components/ConnectIDEs.tsx @@ -4,6 +4,9 @@ import { Card, CardHeader, CardTitle, CardDescription, CardContent, Button } fro import cursorIcon from '@/assets/client-icons/cursor.svg'; import vscodeIcon from '@/assets/client-icons/vscode.png'; import claudeIcon from '@/assets/client-icons/claude.svg'; +import windsurfIcon from '@/assets/client-icons/windsurf.svg'; +import jetbrainsIcon from '@/assets/client-icons/jetbrains.svg'; +import androidStudioIcon from '@/assets/client-icons/android-studio.svg'; import { addToVscode, addToCursor } from '@/lib/api/clientInstall'; type GridAction = 'deep_link' | 'copy_command' | 'copy_config'; @@ -46,6 +49,14 @@ export function ConnectIDEs({ gatewayUrl, gatewayRunning }: ConnectIDEsProps) { action: 'deep_link', handler: () => addToCursor(gatewayUrl), }, + { + id: 'windsurf', + name: 'Windsurf', + label: 'Windsurf', + icon: windsurfIcon, + action: 'copy_config', + handler: `"mcpmux": {\n "serverUrl": "${mcpUrl}"\n}`, + }, { id: 'claude-code', name: 'Claude Code', @@ -54,6 +65,22 @@ export function ConnectIDEs({ gatewayUrl, gatewayRunning }: ConnectIDEsProps) { action: 'copy_command', handler: `claude mcp add --transport http --scope user mcpmux ${mcpUrl}`, }, + { + id: 'jetbrains', + name: 'JetBrains IDEs', + label: 'JetBrains', + icon: jetbrainsIcon, + action: 'copy_config', + handler: `"mcpmux": {\n "url": "${mcpUrl}"\n}`, + }, + { + id: 'android-studio', + name: 'Android Studio', + label: 'Android', + icon: androidStudioIcon, + action: 'copy_config', + handler: `"mcpmux": {\n "httpUrl": "${mcpUrl}"\n}`, + }, { id: 'copy-config', name: 'JSON Config', diff --git a/apps/desktop/src/components/OAuthConsentModal.tsx b/apps/desktop/src/components/OAuthConsentModal.tsx index 0a022187..79d9d8c9 100644 --- a/apps/desktop/src/components/OAuthConsentModal.tsx +++ b/apps/desktop/src/components/OAuthConsentModal.tsx @@ -22,6 +22,8 @@ import cursorIcon from '@/assets/client-icons/cursor.svg'; import vscodeIcon from '@/assets/client-icons/vscode.png'; import claudeIcon from '@/assets/client-icons/claude.svg'; import windsurfIcon from '@/assets/client-icons/windsurf.svg'; +import jetbrainsIcon from '@/assets/client-icons/jetbrains.svg'; +import androidStudioIcon from '@/assets/client-icons/android-studio.svg'; /** Bundled icon assets for known clients */ const CLIENT_ICON_ASSETS: Record = { @@ -29,6 +31,8 @@ const CLIENT_ICON_ASSETS: Record = { vscode: vscodeIcon, claude: claudeIcon, windsurf: windsurfIcon, + jetbrains: jetbrainsIcon, + 'android-studio': androidStudioIcon, }; /** Look up a bundled logo for a known client by name */ diff --git a/apps/desktop/src/features/clients/ClientsPage.tsx b/apps/desktop/src/features/clients/ClientsPage.tsx index 3d158488..094ce065 100644 --- a/apps/desktop/src/features/clients/ClientsPage.tsx +++ b/apps/desktop/src/features/clients/ClientsPage.tsx @@ -4,6 +4,8 @@ import cursorIcon from '@/assets/client-icons/cursor.svg'; import vscodeIcon from '@/assets/client-icons/vscode.png'; import claudeIcon from '@/assets/client-icons/claude.svg'; import windsurfIcon from '@/assets/client-icons/windsurf.svg'; +import jetbrainsIcon from '@/assets/client-icons/jetbrains.svg'; +import androidStudioIcon from '@/assets/client-icons/android-studio.svg'; import { resolveKnownClientKey } from '@/lib/clientIcons'; import { Laptop, @@ -85,6 +87,8 @@ const CLIENT_ICON_ASSETS: Record = { vscode: vscodeIcon, claude: claudeIcon, windsurf: windsurfIcon, + jetbrains: jetbrainsIcon, + 'android-studio': androidStudioIcon, }; // Client icon component — uses bundled icon for known clients, falls back to logo_uri, then emoji diff --git a/apps/desktop/src/lib/clientIcons.ts b/apps/desktop/src/lib/clientIcons.ts index 1e0f77bd..c49c45b0 100644 --- a/apps/desktop/src/lib/clientIcons.ts +++ b/apps/desktop/src/lib/clientIcons.ts @@ -5,11 +5,21 @@ */ const KNOWN_CLIENT_PATTERNS: { pattern: string; iconKey: string }[] = [ { pattern: 'visual studio code', iconKey: 'vscode' }, + { pattern: 'android studio', iconKey: 'android-studio' }, { pattern: 'claude desktop', iconKey: 'claude' }, { pattern: 'claude code', iconKey: 'claude' }, { pattern: 'vs code', iconKey: 'vscode' }, { pattern: 'windsurf', iconKey: 'windsurf' }, { pattern: 'codeium', iconKey: 'windsurf' }, + { pattern: 'intellij', iconKey: 'jetbrains' }, + { pattern: 'webstorm', iconKey: 'jetbrains' }, + { pattern: 'pycharm', iconKey: 'jetbrains' }, + { pattern: 'phpstorm', iconKey: 'jetbrains' }, + { pattern: 'rustrover', iconKey: 'jetbrains' }, + { pattern: 'goland', iconKey: 'jetbrains' }, + { pattern: 'rider', iconKey: 'jetbrains' }, + { pattern: 'clion', iconKey: 'jetbrains' }, + { pattern: 'jetbrains', iconKey: 'jetbrains' }, { pattern: 'cursor', iconKey: 'cursor' }, { pattern: 'vscode', iconKey: 'vscode' }, { pattern: 'claude', iconKey: 'claude' },