diff --git a/renderer/src/App.vue b/renderer/src/App.vue index 01991f8..c79c20c 100644 --- a/renderer/src/App.vue +++ b/renderer/src/App.vue @@ -68,8 +68,6 @@ function initProduce() { // 初始化 tab loadPanels(); - // 尝试连接 - doConnect(); } onMounted(() => { diff --git a/renderer/src/api/message-bridge.ts b/renderer/src/api/message-bridge.ts index 35c33ff..cb1a5d4 100644 --- a/renderer/src/api/message-bridge.ts +++ b/renderer/src/api/message-bridge.ts @@ -48,11 +48,6 @@ class MessageBridge { this.postMessage = (message) => vscode.postMessage(message); this.isConnected.value = true; - - this.postMessage({ - command: 'init', - data: {} - }); } // WebSocket 环境连接 diff --git a/renderer/src/hook/panel.ts b/renderer/src/hook/panel.ts index 95a5f4a..753c230 100644 --- a/renderer/src/hook/panel.ts +++ b/renderer/src/hook/panel.ts @@ -22,30 +22,36 @@ export function loadPanels() { const bridge = useMessageBridge(); bridge.addCommandListener('panel/load', data => { - const persistTab = data.msg as SaveTab; + if (data.code !== 200) { + pinkLog('tabs 加载失败'); + console.log(data.msg); + + } else { + const persistTab = data.msg as SaveTab; - console.log('receive persist tab', persistTab); - - if (persistTab.tabs.length === 0) { - // 空的,直接返回不需要管 - return; + pinkLog('tabs 加载成功'); + + if (persistTab.tabs.length === 0) { + // 空的,直接返回不需要管 + return; + } + + tabs.activeIndex = 0; + tabs.content = []; + + for (const tab of persistTab.tabs || []) { + tabs.content.push({ + name: tab.name, + icon: tab.icon, + type: tab.type, + componentIndex: tab.componentIndex, + component: markRaw(debugModes[tab.componentIndex]), + storage: tab.storage + }); + } + + tabs.activeIndex = persistTab.currentIndex; } - - tabs.activeIndex = 0; - tabs.content = []; - - for (const tab of persistTab.tabs || []) { - tabs.content.push({ - name: tab.name, - icon: tab.icon, - type: tab.type, - componentIndex: tab.componentIndex, - component: markRaw(debugModes[tab.componentIndex]), - storage: tab.storage - }); - } - - tabs.activeIndex = persistTab.currentIndex; }, { once: true }); diff --git a/renderer/src/hook/setting.ts b/renderer/src/hook/setting.ts index 71a297c..11d4d42 100644 --- a/renderer/src/hook/setting.ts +++ b/renderer/src/hook/setting.ts @@ -5,18 +5,23 @@ import I18n from '@/i18n/index'; export function loadSetting() { const bridge = useMessageBridge(); - - bridge.addCommandListener('setting/load', data => { - const persistConfig = data.msg; - console.log('receive persist config', persistConfig); - - llmManager.currentModelIndex = persistConfig.MODEL_INDEX; - I18n.global.locale.value = persistConfig.LANG; - - persistConfig.LLM_INFO.forEach((element: any) => { - llms.push(element); - }); + bridge.addCommandListener('setting/load', data => { + if (data.code !== 200) { + pinkLog('配置加载失败'); + console.log(data.msg); + + } else { + const persistConfig = data.msg; + pinkLog('配置加载成功'); + + llmManager.currentModelIndex = persistConfig.MODEL_INDEX; + I18n.global.locale.value = persistConfig.LANG; + + persistConfig.LLM_INFO.forEach((element: any) => { + llms.push(element); + }); + } }, { once: true }); @@ -37,7 +42,7 @@ export function saveSetting(saveHandler?: () => void) { bridge.addCommandListener('setting/save', data => { const saveStatusCode = data.code; pinkLog('配置保存状态:' + saveStatusCode); - + if (saveHandler) { saveHandler(); } diff --git a/service/src/adapter.ts b/service/src/adapter.ts index 5fa83d1..d7a4c35 100644 --- a/service/src/adapter.ts +++ b/service/src/adapter.ts @@ -13,6 +13,11 @@ export interface WebSocketResponse { error?: string; } +export interface PostMessageble { + postMessage(message: any): void; + onDidReceiveMessage(callback: MessageHandler): { dispose: () => void }; +} + // 监听器回调类型 export type MessageHandler = (message: any) => void; diff --git a/service/src/controller/handler.ts b/service/src/controller/handler.ts index 4108202..dbddb7c 100644 --- a/service/src/controller/handler.ts +++ b/service/src/controller/handler.ts @@ -1,4 +1,4 @@ -import { VSCodeWebViewLike } from "../adapter"; +import { PostMessageble } from "../adapter"; import { MCPClient } from "./connect"; // ==================== 接口定义 ==================== @@ -23,7 +23,7 @@ export interface CallToolOption { */ export async function listPrompts( client: MCPClient | undefined, - webview: VSCodeWebViewLike + webview: PostMessageble ) { if (!client) { const connectResult = { @@ -56,7 +56,7 @@ export async function listPrompts( export async function getPrompt( client: MCPClient | undefined, option: GetPromptOption, - webview: VSCodeWebViewLike + webview: PostMessageble ) { if (!client) { const connectResult = { @@ -88,7 +88,7 @@ export async function getPrompt( */ export async function listResources( client: MCPClient | undefined, - webview: VSCodeWebViewLike + webview: PostMessageble ) { if (!client) { const connectResult = { @@ -121,7 +121,7 @@ export async function listResources( */ export async function listResourceTemplates( client: MCPClient | undefined, - webview: VSCodeWebViewLike + webview: PostMessageble ) { if (!client) { const connectResult = { @@ -155,7 +155,7 @@ export async function listResourceTemplates( export async function readResource( client: MCPClient | undefined, option: ReadResourceOption, - webview: VSCodeWebViewLike + webview: PostMessageble ) { if (!client) { const connectResult = { @@ -187,7 +187,7 @@ export async function readResource( */ export async function listTools( client: MCPClient | undefined, - webview: VSCodeWebViewLike + webview: PostMessageble ) { if (!client) { const connectResult = { @@ -223,7 +223,7 @@ export async function listTools( export async function callTool( client: MCPClient | undefined, option: CallToolOption, - webview: VSCodeWebViewLike + webview: PostMessageble ) { if (!client) { const connectResult = { diff --git a/service/src/controller/index.ts b/service/src/controller/index.ts index 278f359..8666aa7 100644 --- a/service/src/controller/index.ts +++ b/service/src/controller/index.ts @@ -1,5 +1,5 @@ -import { VSCodeWebViewLike } from '../adapter'; +import { PostMessageble } from '../adapter'; import { connect, MCPClient, type MCPOptions } from './connect'; import { callTool, getPrompt, listPrompts, listResources, listResourceTemplates, listTools, readResource } from './handler'; import { chatCompletionHandler } from './llm'; @@ -11,7 +11,7 @@ import { ping } from './util'; // TODO: 支持更多的 client let client: MCPClient | undefined = undefined; -async function connectHandler(option: MCPOptions, webview: VSCodeWebViewLike) { +async function connectHandler(option: MCPOptions, webview: PostMessageble) { try { client = await connect(option); const connectResult = { @@ -34,7 +34,7 @@ async function connectHandler(option: MCPOptions, webview: VSCodeWebViewLike) { } -export function messageController(command: string, data: any, webview: VSCodeWebViewLike) { +export function messageController(command: string, data: any, webview: PostMessageble) { switch (command) { case 'connect': connectHandler(data, webview); diff --git a/service/src/controller/llm.ts b/service/src/controller/llm.ts index e17adca..a3dc3e3 100644 --- a/service/src/controller/llm.ts +++ b/service/src/controller/llm.ts @@ -1,9 +1,10 @@ import { OpenAI } from 'openai'; import { MCPClient } from './connect'; +import { PostMessageble } from '../adapter'; let currentStream: AsyncIterable | null = null; -export async function chatCompletionHandler(client: MCPClient | undefined, data: any, webview: { postMessage: (message: any) => void }) { +export async function chatCompletionHandler(client: MCPClient | undefined, data: any, webview: PostMessageble) { if (!client) { const connectResult = { code: 501, @@ -99,7 +100,7 @@ export async function chatCompletionHandler(client: MCPClient | undefined, data: } // 处理中止消息的函数 -export function handleAbortMessage(webview: { postMessage: (message: any) => void }) { +export function handleAbortMessage(webview: PostMessageble) { if (currentStream) { // 标记流已中止 currentStream = null; diff --git a/service/src/controller/panel.ts b/service/src/controller/panel.ts index dd85ec9..8d78db0 100644 --- a/service/src/controller/panel.ts +++ b/service/src/controller/panel.ts @@ -1,8 +1,8 @@ -import { VSCodeWebViewLike } from '../adapter'; +import { PostMessageble } from '../adapter'; import { loadConfig, loadTabSaveConfig, saveConfig, saveTabSaveConfig } from '../util'; import { MCPClient } from './connect'; -export async function panelSaveHandler(client: MCPClient | undefined, data: any, webview: VSCodeWebViewLike) { +export async function panelSaveHandler(client: MCPClient | undefined, data: any, webview: PostMessageble) { if (!client) { const connectResult = { code: 501, @@ -35,7 +35,7 @@ export async function panelSaveHandler(client: MCPClient | undefined, data: any, } } -export async function panelLoadHandler(client: MCPClient | undefined, webview: VSCodeWebViewLike) { +export async function panelLoadHandler(client: MCPClient | undefined, webview: PostMessageble) { if (!client) { const connectResult = { code: 501, diff --git a/service/src/controller/setting.ts b/service/src/controller/setting.ts index 6832b59..726ff94 100644 --- a/service/src/controller/setting.ts +++ b/service/src/controller/setting.ts @@ -1,8 +1,8 @@ -import { VSCodeWebViewLike } from '../adapter'; +import { PostMessageble } from '../adapter'; import { loadConfig, saveConfig } from '../util'; import { MCPClient } from './connect'; -export async function settingSaveHandler(client: MCPClient | undefined, data: any, webview: VSCodeWebViewLike) { +export async function settingSaveHandler(client: MCPClient | undefined, data: any, webview: PostMessageble) { if (!client) { const connectResult = { code: 501, @@ -35,7 +35,7 @@ export async function settingSaveHandler(client: MCPClient | undefined, data: an } } -export async function settingLoadHandler(client: MCPClient | undefined, webview: VSCodeWebViewLike) { +export async function settingLoadHandler(client: MCPClient | undefined, webview: PostMessageble) { if (!client) { const connectResult = { code: 501, diff --git a/service/src/controller/util.ts b/service/src/controller/util.ts index 73f1550..7d0da7b 100644 --- a/service/src/controller/util.ts +++ b/service/src/controller/util.ts @@ -1,7 +1,7 @@ -import { VSCodeWebViewLike } from "../adapter"; +import { PostMessageble } from "../adapter"; import { MCPClient } from "./connect"; -export function ping(client: MCPClient | undefined, webview: VSCodeWebViewLike) { +export function ping(client: MCPClient | undefined, webview: PostMessageble) { if (!client) { const connectResult = { code: 501,