From 86c218ab5eff2851f95db6873ecc7469617195e7 Mon Sep 17 00:00:00 2001 From: Kirigaya <1193466151@qq.com> Date: Wed, 21 May 2025 01:51:27 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=20service=EF=BC=8C=20?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=20mcp=20=E8=BF=9E=E6=8E=A5=E5=A4=8D=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/main-panel/tool/tool-list.vue | 2 + renderer/src/components/sidebar/connected.ts | 3 + renderer/src/components/sidebar/connected.vue | 109 ++++++++++++------ renderer/src/hook/panel.ts | 8 +- renderer/src/views/connect/index.ts | 5 +- renderer/src/views/connect/index.vue | 4 +- service/src/mcp/connect.service.ts | 32 ++++- 7 files changed, 118 insertions(+), 45 deletions(-) create mode 100644 renderer/src/components/sidebar/connected.ts diff --git a/renderer/src/components/main-panel/tool/tool-list.vue b/renderer/src/components/main-panel/tool/tool-list.vue index f3497ae..6ec415e 100644 --- a/renderer/src/components/main-panel/tool/tool-list.vue +++ b/renderer/src/components/main-panel/tool/tool-list.vue @@ -69,6 +69,8 @@ function reloadTools(option: { first: boolean }) { } function handleClick(tool: { name: string }) { + console.log('enter'); + tabStorage.currentToolName = tool.name; tabStorage.lastToolCallResponse = undefined; } diff --git a/renderer/src/components/sidebar/connected.ts b/renderer/src/components/sidebar/connected.ts new file mode 100644 index 0000000..051817e --- /dev/null +++ b/renderer/src/components/sidebar/connected.ts @@ -0,0 +1,3 @@ +import { ref } from "vue"; + +export const isConnecting = ref(true); \ No newline at end of file diff --git a/renderer/src/components/sidebar/connected.vue b/renderer/src/components/sidebar/connected.vue index afebeef..101a5b3 100644 --- a/renderer/src/components/sidebar/connected.vue +++ b/renderer/src/components/sidebar/connected.vue @@ -1,16 +1,9 @@ @@ -33,6 +52,7 @@ import { defineComponent, computed } from 'vue'; import { useI18n } from 'vue-i18n'; import { Connection } from './sidebar'; import { mcpClientAdapter } from '@/views/connect/core'; +import { isConnecting } from './connected'; defineComponent({ name: 'connected' }); @@ -46,29 +66,29 @@ const fullDisplayServerName = computed(() => { }); const displayServerName = computed(() => { - const name = client.value.connectionResult.name; - if (name.length <= 3) return name; - - // 处理中文混合名称 - const chineseMatch = name.match(/[\u4e00-\u9fa5]/g); - if (chineseMatch && chineseMatch.length >= 2) { - return chineseMatch.slice(0, 3).join(''); - } - - // 处理各种命名格式 - const words = name - .replace(/([a-z])([A-Z])/g, '$1 $2') // 驼峰分割 - .split(/[\s\-_]+/) // 分割空格、连字符和下划线 - .filter(word => word.length > 0); - - if (words.length === 1 && words[0].length > 3) { - return words[0].substring(0, 3).toUpperCase(); - } - - return words - .map(word => word[0].toUpperCase()) - .slice(0, 3) - .join(''); + const name = client.value.connectionResult.name; + if (name.length <= 3) return name; + + // 处理中文混合名称 + const chineseMatch = name.match(/[\u4e00-\u9fa5]/g); + if (chineseMatch && chineseMatch.length >= 2) { + return chineseMatch.slice(0, 3).join(''); + } + + // 处理各种命名格式 + const words = name + .replace(/([a-z])([A-Z])/g, '$1 $2') // 驼峰分割 + .split(/[\s\-_]+/) // 分割空格、连字符和下划线 + .filter(word => word.length > 0); + + if (words.length === 1 && words[0].length > 3) { + return words[0].substring(0, 3).toUpperCase(); + } + + return words + .map(word => word[0].toUpperCase()) + .slice(0, 3) + .join(''); }); function toggleConnectionPanel() { @@ -104,7 +124,7 @@ function toggleConnectionPanel() { } .connected-status-container { - user-select: none; + user-select: none; display: flex; align-items: center; width: auto; @@ -163,7 +183,22 @@ function toggleConnectionPanel() { .mcp-server-info .version { font-size: 12px; - font-weight: 400; + font-weight: 400; } +.custom-loading .circular { + margin-right: 6px; + width: 18px; + height: 18px; + animation: loading-rotate 2s linear infinite; +} + +.custom-loading .circular .path { + animation: loading-dash 1.5s ease-in-out infinite; + stroke-dasharray: 90, 150; + stroke-dashoffset: 0; + stroke-width: 2; + stroke: var(--el-button-text-color); + stroke-linecap: round; +} \ No newline at end of file diff --git a/renderer/src/hook/panel.ts b/renderer/src/hook/panel.ts index f60f8fc..e48b309 100644 --- a/renderer/src/hook/panel.ts +++ b/renderer/src/hook/panel.ts @@ -3,7 +3,7 @@ import { pinkLog } from "@/views/setting/util"; import { debugModes, tabs } from "@/components/main-panel/panel"; import { markRaw, ref, type Reactive } from "vue"; import { v4 as uuidv4 } from 'uuid'; -import type { McpClient } from "@/views/connect/core"; +import { mcpClientAdapter, type McpClient } from "@/views/connect/core"; interface SaveTabItem { name: string; @@ -104,8 +104,12 @@ export function savePanels(saveHandler?: () => void) { } }, { once: true }); + const masterNode = mcpClientAdapter.masterNode; bridge.postMessage({ command: 'panel/save', - data: saveTabs + data: { + clientId: masterNode.clientId, + ...saveTabs + } }); } \ No newline at end of file diff --git a/renderer/src/views/connect/index.ts b/renderer/src/views/connect/index.ts index 50dfbb0..1be9787 100644 --- a/renderer/src/views/connect/index.ts +++ b/renderer/src/views/connect/index.ts @@ -2,11 +2,12 @@ import { getTour, loadSetting } from "@/hook/setting"; import { ElLoading } from "element-plus"; import { pinkLog } from "../setting/util"; import { mcpClientAdapter } from "./core"; +import { isConnecting } from "@/components/sidebar/connected"; export async function initialise() { pinkLog('准备请求设置'); - + const loading = ElLoading.service({ fullscreen: true, lock: true, @@ -27,4 +28,6 @@ export async function initialise() { // loading panels await mcpClientAdapter.loadPanels(); + + isConnecting.value = false; } \ No newline at end of file diff --git a/renderer/src/views/connect/index.vue b/renderer/src/views/connect/index.vue index 075c62a..05db3e4 100644 --- a/renderer/src/views/connect/index.vue +++ b/renderer/src/views/connect/index.vue @@ -43,7 +43,7 @@