制作桌面端软件

This commit is contained in:
锦恢 2025-04-28 19:16:07 +08:00
parent 1c696fa585
commit 9ca03ef0fe
6 changed files with 8026 additions and 0 deletions

13
electron/.gitignore vendored Normal file
View File

@ -0,0 +1,13 @@
out
dist
node_modules
.vscode-test/
*.vsix
.env
resources
.DS_Store
.exe
.idea
resources
setting.json

7859
electron/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

60
electron/package.json Normal file
View File

@ -0,0 +1,60 @@
{
"name": "openmcp-electron",
"version": "0.0.1",
"description": "",
"main": "dist/main.js",
"scripts": {
"start": "electron .",
"build": "webpack --config webpack.config.js",
"watch": "webpack --watch --config webpack.config.js",
"dist": "electron-builder"
},
"author": {
"name": "LSTM-Kirigaya",
"email": "1193466151@qq.com"
},
"dependencies": {
"@modelcontextprotocol/sdk": "^1.10.2",
"axios": "^1.7.7",
"bson": "^6.8.0",
"openai": "^4.93.0",
"pako": "^2.1.0",
"sqlite": "^5.1.1",
"sqlite3": "^5.1.7",
"tesseract.js": "^6.0.1",
"uuid": "^11.1.0",
"ws": "^8.18.1"
},
"devDependencies": {
"@types/ws": "^8.18.1",
"electron": "^28.1.0",
"electron-builder": "^26.0.12",
"ts-loader": "^9.5.1",
"typescript": "^5.6.3",
"webpack": "^5.99.5",
"webpack-cli": "^5.1.4"
},
"build": {
"appId": "com.example.openmcp",
"productName": "OpenMCP",
"directories": {
"output": "dist"
},
"files": [
"dist/**/*",
"resources/**/*"
],
"mac": {
"target": "dmg",
"icon": "resources/icons/icon.icns"
},
"win": {
"target": "nsis",
"icon": "resources/icons/icon.ico"
},
"linux": {
"target": "AppImage",
"icon": "resources/icons/icon.png"
}
}
}

56
electron/src/main.ts Normal file
View File

@ -0,0 +1,56 @@
import { app, BrowserWindow } from 'electron';
import WebSocket from 'ws';
import * as OpenMCPService from '../resources/service';
let mainWindow: BrowserWindow
function createWindow(): void {
mainWindow = new BrowserWindow({
width: 1200,
height: 800,
webPreferences: {
nodeIntegration: true,
contextIsolation: false
}
})
mainWindow.loadFile('resources/renderer/index.html')
mainWindow.webContents.openDevTools()
}
const wss = new (WebSocket as any).Server({ port: 8080 });
wss.on('connection', (ws: any) => {
// 仿造 webview 进行统一接口访问
const webview = new OpenMCPService.VSCodeWebViewLike(ws);
// 先发送成功建立的消息
webview.postMessage({
command: 'hello',
data: {
version: '0.0.1',
name: '消息桥连接完成'
}
});
// 注册消息接受的管线
webview.onDidReceiveMessage(message => {
console.info(`command: [${message.command || 'No Command'}]`);
const { command, data } = message;
OpenMCPService.routeMessage(command, data, webview);
});
});
app.whenReady().then(() => {
createWindow()
app.on('activate', function () {
if (BrowserWindow.getAllWindows().length === 0) createWindow()
})
})
app.on('window-all-closed', function () {
if (process.platform !== 'darwin') app.quit()
})

15
electron/tsconfig.json Normal file
View File

@ -0,0 +1,15 @@
{
"compilerOptions": {
"target": "ES6",
"module": "commonjs",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"outDir": "./dist",
"declaration": true,
"declarationMap": true
},
"include": ["src/**/*.ts"], // .ts
"exclude": ["node_modules"]
}

View File

@ -0,0 +1,23 @@
const path = require('path');
module.exports = {
entry: './src/main.ts',
output: {
filename: 'main.js',
path: path.resolve(__dirname, 'dist'),
},
resolve: {
extensions: ['.ts', '.js'],
},
module: {
rules: [
{
test: /\.ts$/,
use: 'ts-loader',
exclude: /node_modules/,
},
],
},
mode: 'production',
target: 'electron-main',
};