完成插件端
This commit is contained in:
parent
f3677ad60f
commit
256d5e7bf3
25
package-lock.json
generated
25
package-lock.json
generated
@ -12,7 +12,8 @@
|
||||
"axios": "^1.7.7",
|
||||
"bson": "^6.8.0",
|
||||
"openai": "^4.93.0",
|
||||
"pako": "^2.1.0"
|
||||
"pako": "^2.1.0",
|
||||
"ws": "^8.18.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "16.x",
|
||||
@ -21,7 +22,7 @@
|
||||
"@types/vscode": "^1.72.0"
|
||||
},
|
||||
"engines": {
|
||||
"vscode": "^1.98.0"
|
||||
"vscode": "^1.95.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@modelcontextprotocol/sdk": {
|
||||
@ -1398,6 +1399,26 @@
|
||||
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/ws": {
|
||||
"version": "8.18.1",
|
||||
"resolved": "https://registry.npmmirror.com/ws/-/ws-8.18.1.tgz",
|
||||
"integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==",
|
||||
"engines": {
|
||||
"node": ">=10.0.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"bufferutil": "^4.0.1",
|
||||
"utf-8-validate": ">=5.0.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"bufferutil": {
|
||||
"optional": true
|
||||
},
|
||||
"utf-8-validate": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/zod": {
|
||||
"version": "3.24.2",
|
||||
"resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz",
|
||||
|
12
package.json
12
package.json
@ -4,7 +4,7 @@
|
||||
"description": "A MCP Client for MCP/OpenMCP",
|
||||
"version": "0.0.1",
|
||||
"engines": {
|
||||
"vscode": "^1.98.0"
|
||||
"vscode": "^1.95.0"
|
||||
},
|
||||
"categories": [
|
||||
"Other"
|
||||
@ -12,6 +12,13 @@
|
||||
"activationEvents": [],
|
||||
"main": "./dist/extension.js",
|
||||
"contributes": {
|
||||
"commands": [
|
||||
{
|
||||
"command": "openmcp.showOpenMCP",
|
||||
"title": "展示 OpenMCP",
|
||||
"category": "openmcp"
|
||||
}
|
||||
],
|
||||
"viewsContainers": {
|
||||
"activitybar": [
|
||||
{
|
||||
@ -45,7 +52,8 @@
|
||||
"axios": "^1.7.7",
|
||||
"bson": "^6.8.0",
|
||||
"openai": "^4.93.0",
|
||||
"pako": "^2.1.0"
|
||||
"pako": "^2.1.0",
|
||||
"ws": "^8.18.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "16.x",
|
||||
|
@ -9,25 +9,25 @@ const routes: Array<RouteRecordRaw> = [
|
||||
{
|
||||
path: "/debug",
|
||||
name: "debug",
|
||||
component: () => import("@/views/debug/index.vue"),
|
||||
component: () => import( /* webpackMode: "eager" */ "@/views/debug/index.vue"),
|
||||
meta: { title: "Debug" }
|
||||
},
|
||||
{
|
||||
path: "/connect",
|
||||
name: "connect",
|
||||
component: () => import("@/views/connect/index.vue"),
|
||||
component: () => import( /* webpackMode: "eager" */ "@/views/connect/index.vue"),
|
||||
meta: { title: "Connect" }
|
||||
},
|
||||
{
|
||||
path: "/setting",
|
||||
name: "setting",
|
||||
component: () => import("@/views/setting/index.vue"),
|
||||
component: () => import( /* webpackMode: "eager" */ "@/views/setting/index.vue"),
|
||||
meta: { title: "Setting" }
|
||||
},
|
||||
{
|
||||
path: "/about",
|
||||
name: "about",
|
||||
component: () => import("@/views/about/index.vue"),
|
||||
component: () => import( /* webpackMode: "eager" */ "@/views/about/index.vue"),
|
||||
meta: { title: "Tools" }
|
||||
}
|
||||
];
|
||||
|
@ -1,4 +1,21 @@
|
||||
const { defineConfig } = require("@vue/cli-service");
|
||||
module.exports = defineConfig({
|
||||
transpileDependencies: true,
|
||||
transpileDependencies: true,
|
||||
publicPath: process.env.NODE_ENV === 'production' ? '' : '/',
|
||||
configureWebpack: {
|
||||
optimization: {
|
||||
splitChunks: false
|
||||
}
|
||||
},
|
||||
chainWebpack: config => {
|
||||
// 删除所有预设的代码分割规则
|
||||
config.optimization.delete('splitChunks');
|
||||
|
||||
// 确保路由组件同步加载
|
||||
config.plugins.delete('prefetch');
|
||||
config.plugins.delete('preload');
|
||||
},
|
||||
css: {
|
||||
extract: false
|
||||
}
|
||||
});
|
||||
|
@ -2,14 +2,15 @@ import * as vscode from 'vscode';
|
||||
import * as fs from 'fs';
|
||||
import * as fspath from 'path';
|
||||
|
||||
import * as OpenMCPService from '@resources/service';
|
||||
import * as OpenMCPService from '../resources/service';
|
||||
|
||||
function getWebviewContent(context: vscode.ExtensionContext, panel?: vscode.WebviewPanel): string | undefined {
|
||||
function getWebviewContent(context: vscode.ExtensionContext, panel: vscode.WebviewPanel): string | undefined {
|
||||
const viewRoot = fspath.join(context.extensionPath, 'resources', 'renderer');
|
||||
const htmlIndexPath = fspath.join(viewRoot, 'index.html');
|
||||
const html = fs.readFileSync(htmlIndexPath, { encoding: 'utf-8' })?.replace(/(<link.+?href="|<script.+?src="|<img.+?src=")(.+?)"/g, (m, $1, $2) => {
|
||||
const absLocalPath = fspath.resolve(viewRoot, $2);
|
||||
const webviewUri = panel?.webview.asWebviewUri(vscode.Uri.file(absLocalPath));
|
||||
const webviewUri = panel.webview.asWebviewUri(vscode.Uri.file(absLocalPath));
|
||||
|
||||
const replaceHref = $1 + webviewUri?.toString() + '"';
|
||||
return replaceHref;
|
||||
});
|
||||
@ -22,58 +23,39 @@ export function activate(context: vscode.ExtensionContext) {
|
||||
// 注册 showOpenMCP 命令
|
||||
context.subscriptions.push(
|
||||
vscode.commands.registerCommand('openmcp.showOpenMCP', async () => {
|
||||
|
||||
const panel = vscode.window.createWebviewPanel(
|
||||
'openmcpView',
|
||||
'OpenMCP',
|
||||
'OpenMCP',
|
||||
vscode.ViewColumn.One,
|
||||
{
|
||||
enableScripts: true,
|
||||
retainContextWhenHidden: true
|
||||
retainContextWhenHidden: true,
|
||||
enableFindWidget: true
|
||||
}
|
||||
);
|
||||
|
||||
initaliseWebview(context, panel.webview);
|
||||
// 设置HTML内容
|
||||
const html = getWebviewContent(context, panel);
|
||||
panel.webview.html = html || '';
|
||||
|
||||
// 处理来自webview的消息
|
||||
panel.webview.onDidReceiveMessage(message => {
|
||||
const { command, data } = message;
|
||||
console.log('receive message', message);
|
||||
|
||||
OpenMCPService.messageController(command, data, panel.webview as any);
|
||||
});
|
||||
})
|
||||
);
|
||||
|
||||
const provider = new WebviewViewProvider(context);
|
||||
// const provider = new WebviewViewProvider(context);
|
||||
|
||||
context.subscriptions.push(
|
||||
vscode.window.registerWebviewViewProvider('webview-sidebar.view', provider)
|
||||
);
|
||||
// context.subscriptions.push(
|
||||
// vscode.window.registerWebviewViewProvider('webview-sidebar.view', provider)
|
||||
// );
|
||||
}
|
||||
|
||||
function initaliseWebview(context: vscode.ExtensionContext, webview: vscode.Webview) {
|
||||
webview.options = {
|
||||
enableScripts: true,
|
||||
};
|
||||
|
||||
// 设置HTML内容
|
||||
const html = getWebviewContent(context);
|
||||
webview.html = html || '';
|
||||
|
||||
// 处理来自webview的消息
|
||||
webview.onDidReceiveMessage(message => {
|
||||
const { command, data } = message;
|
||||
|
||||
OpenMCPService.messageController(command, data, webview as any);
|
||||
});
|
||||
}
|
||||
|
||||
class WebviewViewProvider implements vscode.WebviewViewProvider {
|
||||
private _view?: vscode.WebviewView;
|
||||
|
||||
constructor(private readonly context: vscode.ExtensionContext) {}
|
||||
|
||||
public resolveWebviewView(
|
||||
webviewView: vscode.WebviewView,
|
||||
_context: vscode.WebviewViewResolveContext,
|
||||
_token: vscode.CancellationToken,
|
||||
) {
|
||||
this._view = webviewView;
|
||||
initaliseWebview(this.context, webviewView.webview);
|
||||
}
|
||||
}
|
||||
|
||||
export function deactivate() {
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user