From d10c88f35e111bfbf8f4ab1d07781f7b00784066 Mon Sep 17 00:00:00 2001 From: Kirigaya <1193466151@qq.com> Date: Sun, 22 Jun 2025 04:00:14 +0800 Subject: [PATCH] finish config export --- renderer/public/iconfont.css | 10 +- renderer/public/iconfont.woff2 | Bin 7284 -> 7468 bytes .../chat/chat-box/options/export.vue | 208 ++++++++++++++++++ .../chat/chat-box/options/setting.vue | 2 + .../chat/chat-box/prompt-chat-item.vue | 11 +- .../components/main-panel/tool/tool-list.vue | 7 +- renderer/src/i18n/ar.json | 8 +- renderer/src/i18n/de.json | 8 +- renderer/src/i18n/en.json | 8 +- renderer/src/i18n/fr.json | 8 +- renderer/src/i18n/ja.json | 8 +- renderer/src/i18n/ko.json | 8 +- renderer/src/i18n/ru.json | 8 +- renderer/src/i18n/zh-cn.json | 8 +- renderer/src/i18n/zh-tw.json | 8 +- renderer/src/views/connect/core.ts | 15 +- service/src/common/router.ts | 1 - service/src/hook/adapter.ts | 1 + service/src/main.ts | 8 +- service/src/mcp/connect-monitor.service.ts | 23 +- service/src/mcp/connect.service.ts | 31 +-- 21 files changed, 334 insertions(+), 55 deletions(-) create mode 100644 renderer/src/components/main-panel/chat/chat-box/options/export.vue diff --git a/renderer/public/iconfont.css b/renderer/public/iconfont.css index 6df823e..6b9f716 100644 --- a/renderer/public/iconfont.css +++ b/renderer/public/iconfont.css @@ -1,8 +1,8 @@ @font-face { font-family: "iconfont"; /* Project id 4870215 */ - src: url('iconfont.woff2?t=1750172161574') format('woff2'), - url('iconfont.woff?t=1750172161574') format('woff'), - url('iconfont.ttf?t=1750172161574') format('truetype'); + src: url('iconfont.woff2?t=1750532923458') format('woff2'), + url('iconfont.woff?t=1750532923458') format('woff'), + url('iconfont.ttf?t=1750532923458') format('truetype'); } .iconfont { @@ -13,6 +13,10 @@ -moz-osx-font-smoothing: grayscale; } +.icon-deploy:before { + content: "\e614"; +} + .icon-suffix-xml:before { content: "\e653"; } diff --git a/renderer/public/iconfont.woff2 b/renderer/public/iconfont.woff2 index be144e92dee69dff99cdfbc67db408adb3644109..c6056df561998cfb1e2f6348760d6cc4b1bd8e9e 100644 GIT binary patch literal 7468 zcmV+{9n<1>Pew8T0RR91039p<3jhEB05#kI036%^0RR9100000000000000000000 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 ORqkL#g@mAl2sazK@cyp= diff --git a/renderer/src/components/main-panel/chat/chat-box/options/export.vue b/renderer/src/components/main-panel/chat/chat-box/options/export.vue new file mode 100644 index 0000000..ba2bec5 --- /dev/null +++ b/renderer/src/components/main-panel/chat/chat-box/options/export.vue @@ -0,0 +1,208 @@ + + + + + diff --git a/renderer/src/components/main-panel/chat/chat-box/options/setting.vue b/renderer/src/components/main-panel/chat/chat-box/options/setting.vue index cdd97f2..f7d03d6 100644 --- a/renderer/src/components/main-panel/chat/chat-box/options/setting.vue +++ b/renderer/src/components/main-panel/chat/chat-box/options/setting.vue @@ -9,6 +9,7 @@ + @@ -27,6 +28,7 @@ import ParallelToolCalls from './parallel-tool-calls.vue'; import Temperature from './temperature.vue'; import ContextLength from './context-length.vue'; import XmlWrapper from './xml-wrapper.vue'; +import Export from './export.vue'; const props = defineProps({ modelValue: { diff --git a/renderer/src/components/main-panel/chat/chat-box/prompt-chat-item.vue b/renderer/src/components/main-panel/chat/chat-box/prompt-chat-item.vue index 0453fc8..3e48ec1 100644 --- a/renderer/src/components/main-panel/chat/chat-box/prompt-chat-item.vue +++ b/renderer/src/components/main-panel/chat/chat-box/prompt-chat-item.vue @@ -22,9 +22,6 @@ const props = defineProps({ \ No newline at end of file diff --git a/renderer/src/components/main-panel/tool/tool-list.vue b/renderer/src/components/main-panel/tool/tool-list.vue index f8f4c05..9eed698 100644 --- a/renderer/src/components/main-panel/tool/tool-list.vue +++ b/renderer/src/components/main-panel/tool/tool-list.vue @@ -18,7 +18,7 @@
- +
@@ -148,10 +148,9 @@ onMounted(async () => { margin-left: 10px; background-color: var(--main-color); padding: 2px 5px; - border-radius: .5em; + border-radius: .3em; height: fit-content; - font-size: 10px; - + font-size: 13px; color: black; } diff --git a/renderer/src/i18n/ar.json b/renderer/src/i18n/ar.json index 73f5338..1506e7a 100644 --- a/renderer/src/i18n/ar.json +++ b/renderer/src/i18n/ar.json @@ -176,5 +176,11 @@ "tool-manage": "إدارة الأدوات", "enable-all-tools": "تفعيل جميع الأدوات", "disable-all-tools": "تعطيل جميع الأدوات", - "using-tool": "جاري استخدام الأداة" + "using-tool": "جاري استخدام الأداة", + "copy-success": "تم النسخ بنجاح", + "copy-fail": "فشل النسخ", + "copy": "نسخ", + "export": "تصدير", + "export-filename": "اسم ملف التصدير", + "how-to-use": "كيفية الاستخدام؟" } \ No newline at end of file diff --git a/renderer/src/i18n/de.json b/renderer/src/i18n/de.json index 4f45f0c..14dd286 100644 --- a/renderer/src/i18n/de.json +++ b/renderer/src/i18n/de.json @@ -176,5 +176,11 @@ "tool-manage": "Werkzeugverwaltung", "enable-all-tools": "Alle Tools aktivieren", "disable-all-tools": "Alle Tools deaktivieren", - "using-tool": "Werkzeug wird verwendet" + "using-tool": "Werkzeug wird verwendet", + "copy-success": "Erfolgreich kopiert", + "copy-fail": "Kopieren fehlgeschlagen", + "copy": "Kopieren", + "export": "Exportieren", + "export-filename": "Exportdateiname", + "how-to-use": "Wie benutzt man?" } \ No newline at end of file diff --git a/renderer/src/i18n/en.json b/renderer/src/i18n/en.json index 6bd6c9e..02c9246 100644 --- a/renderer/src/i18n/en.json +++ b/renderer/src/i18n/en.json @@ -176,5 +176,11 @@ "tool-manage": "Tool Management", "enable-all-tools": "Activate all tools", "disable-all-tools": "Disable all tools", - "using-tool": "Using tool" + "using-tool": "Using tool", + "copy-success": "Copied successfully", + "copy-fail": "Copy failed", + "copy": "Copy", + "export": "Export", + "export-filename": "Export file name", + "how-to-use": "How to use?" } \ No newline at end of file diff --git a/renderer/src/i18n/fr.json b/renderer/src/i18n/fr.json index bebf323..1dda9a9 100644 --- a/renderer/src/i18n/fr.json +++ b/renderer/src/i18n/fr.json @@ -176,5 +176,11 @@ "tool-manage": "Gestion des outils", "enable-all-tools": "Activer tous les outils", "disable-all-tools": "Désactiver tous les outils", - "using-tool": "Utilisation de l'outil" + "using-tool": "Utilisation de l'outil", + "copy-success": "Copié avec succès", + "copy-fail": "Échec de la copie", + "copy": "Copier", + "export": "Exporter", + "export-filename": "Nom du fichier d'exportation", + "how-to-use": "Comment utiliser ?" } \ No newline at end of file diff --git a/renderer/src/i18n/ja.json b/renderer/src/i18n/ja.json index df0ee58..e5e70fd 100644 --- a/renderer/src/i18n/ja.json +++ b/renderer/src/i18n/ja.json @@ -176,5 +176,11 @@ "tool-manage": "ツール管理", "enable-all-tools": "すべてのツールを有効にする", "disable-all-tools": "すべてのツールを無効にする", - "using-tool": "ツール使用中" + "using-tool": "ツール使用中", + "copy-success": "コピーしました", + "copy-fail": "コピーに失敗しました", + "copy": "コピー", + "export": "エクスポート", + "export-filename": "エクスポートファイル名", + "how-to-use": "使い方は?" } \ No newline at end of file diff --git a/renderer/src/i18n/ko.json b/renderer/src/i18n/ko.json index ae18984..d175a89 100644 --- a/renderer/src/i18n/ko.json +++ b/renderer/src/i18n/ko.json @@ -176,5 +176,11 @@ "tool-manage": "도구 관리", "enable-all-tools": "모든 도구 활성화", "disable-all-tools": "모든 도구 비활성화", - "using-tool": "도구 사용 중" + "using-tool": "도구 사용 중", + "copy-success": "성공적으로 복사되었습니다", + "copy-fail": "복사 실패", + "copy": "복사", + "export": "내보내기", + "export-filename": "내보내기 파일 이름", + "how-to-use": "사용 방법?" } \ No newline at end of file diff --git a/renderer/src/i18n/ru.json b/renderer/src/i18n/ru.json index 5f009ca..d088ece 100644 --- a/renderer/src/i18n/ru.json +++ b/renderer/src/i18n/ru.json @@ -176,5 +176,11 @@ "tool-manage": "Управление инструментами", "enable-all-tools": "Активировать все инструменты", "disable-all-tools": "Отключить все инструменты", - "using-tool": "Использование инструмента" + "using-tool": "Использование инструмента", + "copy-success": "Скопировано успешно", + "copy-fail": "Ошибка копирования", + "copy": "Копировать", + "export": "Экспорт", + "export-filename": "Имя экспортируемого файла", + "how-to-use": "Как использовать?" } \ No newline at end of file diff --git a/renderer/src/i18n/zh-cn.json b/renderer/src/i18n/zh-cn.json index 0096a40..7906cc5 100644 --- a/renderer/src/i18n/zh-cn.json +++ b/renderer/src/i18n/zh-cn.json @@ -176,5 +176,11 @@ "tool-manage": "工具管理", "enable-all-tools": "激活所有工具", "disable-all-tools": "禁用所有工具", - "using-tool": "正在使用工具" + "using-tool": "正在使用工具", + "copy-success": "复制成功", + "copy-fail": "复制失败", + "copy": "复制", + "export": "导出", + "export-filename": "导出文件名", + "how-to-use": "如何使用?" } \ No newline at end of file diff --git a/renderer/src/i18n/zh-tw.json b/renderer/src/i18n/zh-tw.json index e3e7c6b..fa951d6 100644 --- a/renderer/src/i18n/zh-tw.json +++ b/renderer/src/i18n/zh-tw.json @@ -176,5 +176,11 @@ "tool-manage": "工具管理", "enable-all-tools": "啟用所有工具", "disable-all-tools": "禁用所有工具", - "using-tool": "正在使用工具" + "using-tool": "正在使用工具", + "copy-success": "複製成功", + "copy-fail": "複製失敗", + "copy": "複製", + "export": "匯出", + "export-filename": "匯出檔案名稱", + "how-to-use": "如何使用?" } \ No newline at end of file diff --git a/renderer/src/views/connect/core.ts b/renderer/src/views/connect/core.ts index 126d2be..e90be33 100644 --- a/renderer/src/views/connect/core.ts +++ b/renderer/src/views/connect/core.ts @@ -506,7 +506,11 @@ class McpClientAdapter { constructor( public platform: string - ) {} + ) { + if (platform !== 'nodejs') { + this.addConnectRefreshListener(); + } + } /** * @description 获取连接参数签名 @@ -564,18 +568,23 @@ class McpClientAdapter { * @description register HMR */ public addConnectRefreshListener() { - // 创建对于 connect/refresh 的监听 + // 创建对于 connect/refresh 的监听 if (!this.connectrefreshListener) { const bridge = useMessageBridge(); - this.connectrefreshListener = bridge.addCommandListener('connect/refresh', async (message) => { + this.connectrefreshListener = bridge.addCommandListener('connect/refresh', async (message) => { const { code, msg } = message; + console.log('refresh'); + + if (code === 200) { // 查找目标客户端 const clientIndex = this.findClientIndexByUuid(msg.uuid); if (clientIndex > -1) { // 刷新该客户端的所有资源 + console.log('clientIndex', clientIndex); + await this.clients[clientIndex].refreshAllResources(); this.refreshSignal.value++; } else { diff --git a/service/src/common/router.ts b/service/src/common/router.ts index c9d53fb..571b269 100644 --- a/service/src/common/router.ts +++ b/service/src/common/router.ts @@ -22,7 +22,6 @@ export async function routeMessage(command: string, data: any, webview: PostMess const { handler, option = {} } = handlerStore; try { - // TODO: select client based on something const res = await handler(data, webview); // res.code = -1 代表当前请求不需要返回发送 diff --git a/service/src/hook/adapter.ts b/service/src/hook/adapter.ts index 0e65837..47fc0ef 100644 --- a/service/src/hook/adapter.ts +++ b/service/src/hook/adapter.ts @@ -57,6 +57,7 @@ export class VSCodeWebViewLike { * @param message - 包含 command 和 args 的消息 */ postMessage(message: WebSocketMessage): void { + if (this.ws.readyState === WebSocket.OPEN) { this.ws.send(JSON.stringify(message)); } else { diff --git a/service/src/main.ts b/service/src/main.ts index cec6a29..10cbce2 100644 --- a/service/src/main.ts +++ b/service/src/main.ts @@ -5,8 +5,7 @@ import { dirname, join } from 'path'; import { routeMessage } from './common/router.js'; import { VSCodeWebViewLike } from './hook/adapter.js'; import fs from 'fs/promises'; // 使用 Promise API 替代回调 -import path from 'path'; -import axios from 'axios'; +import chalk from 'chalk'; export interface VSCodeMessage { command: string; @@ -101,7 +100,10 @@ wss.on('connection', (ws) => { acquireConnectionOption().then(option => { webview.onDidReceiveMessage(async (message) => { - logger.info(`收到命令: [${message.command || '未定义'}]`); + console.log( + chalk.white('receive command') + + chalk.blue(` [${message.command || '未定义'}]`) + ); const { command, data } = message; diff --git a/service/src/mcp/connect-monitor.service.ts b/service/src/mcp/connect-monitor.service.ts index e228d6a..b486354 100644 --- a/service/src/mcp/connect-monitor.service.ts +++ b/service/src/mcp/connect-monitor.service.ts @@ -4,6 +4,8 @@ import { PostMessageble } from '../hook/adapter.js'; import * as fs from 'fs'; import * as path from 'path'; import { pino } from 'pino'; +import chalk from 'chalk'; + // 保留现有 logger 配置 const logger = pino({ @@ -59,15 +61,11 @@ export class McpServerConnectMonitor { debounceTime: 500, duplicateCheckTime: 500, onChange: async (curr, prev) => { - // 使用 info 级别记录文件修改 - logger.info({ - uuid: this.uuid, - size: curr.size, - mtime: new Date(curr.mtime).toLocaleString() - }, 'File modified'); - try { await onchange(this.uuid, this.Options); + + console.log('send something'); + this.sendWebviewMessage('connect/refresh', { code: 200, msg: { @@ -75,7 +73,11 @@ export class McpServerConnectMonitor { uuid: this.uuid, } }); - logger.info({ uuid: this.uuid }, 'Connection refresh successful'); + + console.log( + chalk.green('Connection refresh successfully') + ); + } catch (err) { this.sendWebviewMessage('connect/refresh', { code: 500, @@ -122,4 +124,9 @@ export class McpServerConnectMonitor { // 发送消息到webview this.webview?.postMessage({ command, data }); } + + public close() { + this.Monitor?.close(); + } + } diff --git a/service/src/mcp/connect.service.ts b/service/src/mcp/connect.service.ts index efc26e0..1e7c6e8 100644 --- a/service/src/mcp/connect.service.ts +++ b/service/src/mcp/connect.service.ts @@ -9,7 +9,7 @@ import path from 'node:path'; import fs from 'node:fs'; import * as os from 'os'; import { PostMessageble } from '../hook/adapter.js'; -import Table from 'cli-table3'; +import chalk from 'chalk'; export const clientMap: Map = new Map(); export function getClient(clientId?: string): RequestClientType | undefined { @@ -21,7 +21,10 @@ export async function updateClientMap(uuid: string, options: McpOptions): Promis const client = await connect(options); clientMap.set(uuid, client); const tools = await client.listTools(); - console.log('[updateClientMap] tools:', tools); + console.log( + chalk.white('update client tools'), + chalk.blue(tools.tools.map(tool => tool.name).join(',')) + ); return { res: true }; } catch (error) { console.error('[updateClientMap] error:', error); @@ -267,25 +270,6 @@ export async function connectService( webview?: PostMessageble ): Promise { try { - // 使用cli-table3创建美观的表格 - // const table = new Table({ - // head: ['Property', 'Value'], - // colWidths: [20, 60], - // style: { - // head: ['green'], - // border: ['grey'] - // } - // }); - - // table.push( - // ['Connection Type', option.connectionType], - // ['Command', option.command || 'N/A'], - // ['Arguments', option.args?.join(' ') || 'N/A'], - // ['Working Directory', option.cwd || 'N/A'], - // ['URL', option.url || 'N/A'] - // ); - - // console.log(table.toString()); // 预处理字符串 await preprocessCommand(option, webview); @@ -301,6 +285,11 @@ export async function connectService( // } // const client = clientMap.get(uuid)!; + { + clientMap.get(uuid)?.disconnect(); + clientMonitorMap.get(uuid)?.close(); + } + const client = await connect(option); clientMap.set(uuid, client); clientMonitorMap.set(uuid, new McpServerConnectMonitor(uuid, option, updateClientMap, webview));