diff --git a/src/renderer/src/assets/images/cherry-text-logo.svg b/src/renderer/src/assets/images/cherry-text-logo.svg new file mode 100644 index 0000000000..4dad25f29f --- /dev/null +++ b/src/renderer/src/assets/images/cherry-text-logo.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/renderer/src/assets/images/mcp/npm.svg b/src/renderer/src/assets/images/mcp/npm.svg deleted file mode 100644 index df5b545d2f..0000000000 --- a/src/renderer/src/assets/images/mcp/npm.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/renderer/src/hooks/useMCPServers.ts b/src/renderer/src/hooks/useMCPServers.ts index b8d28cb75f..316f89d9dd 100644 --- a/src/renderer/src/hooks/useMCPServers.ts +++ b/src/renderer/src/hooks/useMCPServers.ts @@ -29,8 +29,13 @@ export const useMCPServers = () => { } export const useMCPServer = (id: string) => { - const { mcpServers } = useMCPServers() + const server = useAppSelector((state) => (state.mcp.servers || []).find((server) => server.id === id)) + const dispatch = useAppDispatch() + return { - server: mcpServers.find((server) => server.id === id) + server, + updateMCPServer: (server: MCPServer) => dispatch(updateMCPServer(server)), + setMCPServerActive: (server: MCPServer, isActive: boolean) => dispatch(updateMCPServer({ ...server, isActive })), + deleteMCPServer: (id: string) => dispatch(deleteMCPServer(id)) } } diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json index fd1f80cc14..8438afb5f7 100644 --- a/src/renderer/src/i18n/locales/en-us.json +++ b/src/renderer/src/i18n/locales/en-us.json @@ -1156,7 +1156,13 @@ "registryDefault": "Default", "not_support": "Model not supported", "user": "User", - "system": "System" + "system": "System", + "types": { + "inMemory": "In Memory", + "sse": "SSE", + "streamableHttp": "Streamable HTTP", + "stdio": "STDIO" + } }, "messages.divider": "Show divider between messages", "messages.grid_columns": "Message grid display columns", @@ -1442,4 +1448,4 @@ "visualization": "Visualization" } } -} \ No newline at end of file +} diff --git a/src/renderer/src/i18n/locales/ja-jp.json b/src/renderer/src/i18n/locales/ja-jp.json index 303574929f..dcafaf1ab8 100644 --- a/src/renderer/src/i18n/locales/ja-jp.json +++ b/src/renderer/src/i18n/locales/ja-jp.json @@ -1155,7 +1155,13 @@ "registryDefault": "デフォルト", "not_support": "モデルはサポートされていません", "user": "ユーザー", - "system": "システム" + "system": "システム", + "types": { + "inMemory": "組み込み", + "sse": "SSE", + "streamableHttp": "ストリーミング", + "stdio": "STDIO" + } }, "messages.divider": "メッセージ間に区切り線を表示", "messages.grid_columns": "メッセージグリッドの表示列数", @@ -1442,4 +1448,4 @@ "visualization": "可視化" } } -} \ No newline at end of file +} diff --git a/src/renderer/src/i18n/locales/ru-ru.json b/src/renderer/src/i18n/locales/ru-ru.json index 6b880a0fa8..c42b99dc26 100644 --- a/src/renderer/src/i18n/locales/ru-ru.json +++ b/src/renderer/src/i18n/locales/ru-ru.json @@ -1155,7 +1155,13 @@ "registryDefault": "По умолчанию", "not_support": "Модель не поддерживается", "user": "Пользователь", - "system": "Система" + "system": "Система", + "types": { + "inMemory": "Встроенный", + "sse": "SSE", + "streamableHttp": "Потоковый HTTP", + "stdio": "STDIO" + } }, "messages.divider": "Показывать разделитель между сообщениями", "messages.grid_columns": "Количество столбцов сетки сообщений", @@ -1442,4 +1448,4 @@ "visualization": "Визуализация" } } -} \ No newline at end of file +} diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index 565ad37067..0ce761265e 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -1156,7 +1156,13 @@ "registryDefault": "默认", "not_support": "模型不支持", "user": "用户", - "system": "系统" + "system": "系统", + "types": { + "inMemory": "内置", + "sse": "SSE", + "streamableHttp": "流式", + "stdio": "STDIO" + } }, "messages.divider": "消息分割线", "messages.grid_columns": "消息网格展示列数", @@ -1442,4 +1448,4 @@ "visualization": "可视化" } } -} \ No newline at end of file +} diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json index e5093bf728..a6417d212e 100644 --- a/src/renderer/src/i18n/locales/zh-tw.json +++ b/src/renderer/src/i18n/locales/zh-tw.json @@ -1155,7 +1155,13 @@ "registryDefault": "預設", "not_support": "不支援此模型", "user": "用戶", - "system": "系統" + "system": "系統", + "types": { + "inMemory": "內置", + "sse": "SSE", + "streamableHttp": "流式", + "stdio": "STDIO" + } }, "messages.divider": "訊息間顯示分隔線", "messages.grid_columns": "訊息網格展示列數", @@ -1442,4 +1448,4 @@ "visualization": "視覺化" } } -} \ No newline at end of file +} diff --git a/src/renderer/src/pages/settings/MCPSettings/InstallNpxUv.tsx b/src/renderer/src/pages/settings/MCPSettings/InstallNpxUv.tsx index 3de99712b6..0da94f76af 100644 --- a/src/renderer/src/pages/settings/MCPSettings/InstallNpxUv.tsx +++ b/src/renderer/src/pages/settings/MCPSettings/InstallNpxUv.tsx @@ -99,6 +99,7 @@ const InstallNpxUv: FC = ({ mini = false }) => { @@ -129,6 +130,7 @@ const InstallNpxUv: FC = ({ mini = false }) => { @@ -170,6 +172,7 @@ const Container = styled.div` flex-direction: column; margin-bottom: 20px; gap: 12px; + padding-top: 50px; ` export default InstallNpxUv diff --git a/src/renderer/src/pages/settings/MCPSettings/McpServersList.tsx b/src/renderer/src/pages/settings/MCPSettings/McpServersList.tsx index 9cc9c837b1..bd1df406e9 100644 --- a/src/renderer/src/pages/settings/MCPSettings/McpServersList.tsx +++ b/src/renderer/src/pages/settings/MCPSettings/McpServersList.tsx @@ -1,26 +1,22 @@ -import { CodeOutlined, PlusOutlined } from '@ant-design/icons' +import { EditOutlined } from '@ant-design/icons' import { nanoid } from '@reduxjs/toolkit' import DragableList from '@renderer/components/DragableList' -import IndicatorLight from '@renderer/components/IndicatorLight' -import { HStack, VStack } from '@renderer/components/Layout' import Scrollbar from '@renderer/components/Scrollbar' import { useMCPServers } from '@renderer/hooks/useMCPServers' import { MCPServer } from '@renderer/types' +import { Button, Empty, Tag } from 'antd' +import { MonitorCheck, Plus, Settings2 } from 'lucide-react' import { FC, useCallback } from 'react' import { useTranslation } from 'react-i18next' +import { useNavigate } from 'react-router' import styled from 'styled-components' import { SettingTitle } from '..' -import McpSettings from './McpSettings' - -interface Props { - selectedMcpServer: MCPServer | null - setSelectedMcpServer: (server: MCPServer | null) => void -} - -const McpServersList: FC = ({ selectedMcpServer, setSelectedMcpServer }) => { +import EditMcpJsonPopup from './EditMcpJsonPopup' +const McpServersList: FC = () => { const { mcpServers, addMCPServer, updateMcpServers } = useMCPServers() const { t } = useTranslation() + const navigate = useNavigate() const onAddMcpServer = useCallback(async () => { const newServer = { @@ -33,78 +29,81 @@ const McpServersList: FC = ({ selectedMcpServer, setSelectedMcpServer }) env: {}, isActive: false } - addMCPServer(newServer) + await addMCPServer(newServer) + navigate(`/settings/mcp/settings`, { state: { server: newServer } }) window.message.success({ content: t('settings.mcp.addSuccess'), key: 'mcp-list' }) - setSelectedMcpServer(newServer) - }, [addMCPServer, setSelectedMcpServer, t]) + }, [addMCPServer, navigate, t]) return ( - - - {t('settings.mcp.newServer')} - - - - {t('settings.mcp.addServer')} - - - {(server) => ( - setSelectedMcpServer(server)} - className={selectedMcpServer?.id === server.id ? 'active' : ''}> - + + + {t('settings.mcp.newServer')} + + + + {(server: MCPServer) => ( + navigate(`/settings/mcp/settings`, { state: { server } })}> + + + {server.name} - + - {server.name} - - - - - {server.description} - - )} - - - {selectedMcpServer && } + + + - setActiveTab(key as TabKey)} - style={{ marginTop: 8 }} + style={{ marginTop: 8, backgroundColor: 'transparent' }} /> diff --git a/src/renderer/src/pages/settings/MCPSettings/McpSettingsNavbar.tsx b/src/renderer/src/pages/settings/MCPSettings/McpSettingsNavbar.tsx index dbd0e8ad69..a40700c3ac 100644 --- a/src/renderer/src/pages/settings/MCPSettings/McpSettingsNavbar.tsx +++ b/src/renderer/src/pages/settings/MCPSettings/McpSettingsNavbar.tsx @@ -1,13 +1,11 @@ -import { EditOutlined, ExportOutlined } from '@ant-design/icons' import { NavbarRight } from '@renderer/components/app/Navbar' import { HStack } from '@renderer/components/Layout' import { isWindows } from '@renderer/config/constant' import { Button } from 'antd' -import { Search } from 'lucide-react' +import { Search, SquareArrowOutUpRight } from 'lucide-react' import { useTranslation } from 'react-i18next' import { useNavigate } from 'react-router' -import EditMcpJsonPopup from './EditMcpJsonPopup' import InstallNpxUv from './InstallNpxUv' export const McpSettingsNavbar = () => { @@ -27,20 +25,11 @@ export const McpSettingsNavbar = () => { style={{ fontSize: 13, height: 28, borderRadius: 20 }}> {t('settings.mcp.searchNpx')} -