support on windows

This commit is contained in:
锦恢 2025-06-04 22:56:21 +08:00
parent 5361f88381
commit e65ebe3b81
4 changed files with 1260 additions and 21 deletions

View File

@ -1,4 +1,5 @@
{
"clientId": "1fa64d92-4d92-564d924e141-864d924e1413324-133245eb",
"currentIndex": 1,
"tabs": [
{
@ -159,36 +160,150 @@
{
"name": "puppeteer_navigate",
"description": "Navigate to a URL",
"inputSchema": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "URL to navigate to"
},
"launchOptions": {
"type": "object",
"description": "PuppeteerJS LaunchOptions. Default null. If changed and not null, browser restarts. Example: { headless: true, args: ['--no-sandbox'] }"
},
"allowDangerous": {
"type": "boolean",
"description": "Allow dangerous LaunchOptions that reduce security. When false, dangerous args like --no-sandbox will throw errors. Default false."
}
},
"required": [
"url"
]
},
"enabled": true
},
{
"name": "puppeteer_screenshot",
"description": "Take a screenshot of the current page or a specific element",
"inputSchema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Name for the screenshot"
},
"selector": {
"type": "string",
"description": "CSS selector for element to screenshot"
},
"width": {
"type": "number",
"description": "Width in pixels (default: 800)"
},
"height": {
"type": "number",
"description": "Height in pixels (default: 600)"
}
},
"required": [
"name"
]
},
"enabled": true
},
{
"name": "puppeteer_click",
"description": "Click an element on the page",
"inputSchema": {
"type": "object",
"properties": {
"selector": {
"type": "string",
"description": "CSS selector for element to click"
}
},
"required": [
"selector"
]
},
"enabled": true
},
{
"name": "puppeteer_fill",
"description": "Fill out an input field",
"inputSchema": {
"type": "object",
"properties": {
"selector": {
"type": "string",
"description": "CSS selector for input field"
},
"value": {
"type": "string",
"description": "Value to fill"
}
},
"required": [
"selector",
"value"
]
},
"enabled": true
},
{
"name": "puppeteer_select",
"description": "Select an element on the page with Select tag",
"inputSchema": {
"type": "object",
"properties": {
"selector": {
"type": "string",
"description": "CSS selector for element to select"
},
"value": {
"type": "string",
"description": "Value to select"
}
},
"required": [
"selector",
"value"
]
},
"enabled": true
},
{
"name": "puppeteer_hover",
"description": "Hover an element on the page",
"inputSchema": {
"type": "object",
"properties": {
"selector": {
"type": "string",
"description": "CSS selector for element to hover"
}
},
"required": [
"selector"
]
},
"enabled": true
},
{
"name": "puppeteer_evaluate",
"description": "Execute JavaScript in the browser console",
"inputSchema": {
"type": "object",
"properties": {
"script": {
"type": "string",
"description": "JavaScript code to execute"
}
},
"required": [
"script"
]
},
"enabled": true
}
],
@ -334,29 +449,57 @@
},
{
"role": "user",
"content": "请将下面的更新日志翻译成 GitHub release 风格的英文说明,请只返回翻译后的结果,不要出现任何多余的前缀: ",
"content": "error during build:\n[vite-plugin-static-copy:build] No file was found to copy on C:\\Users\\K\\project\\openmcp-client\\resources\\openmcp-sdk-release\\* src.\n\n但是实际上这个文件夹下有东西的mac 上可以运行,我的 配置如下:\nimport { defineConfig } from 'vite';\nimport { resolve } from 'path';\nimport { viteStaticCopy } from 'vite-plugin-static-copy';\n// import { visualizer } from 'rollup-plugin-visualizer';\n\nexport default defineConfig({\n define: {\n 'window': {\n 'nodejs': true,\n 'navigator': {\n 'userAgent': 2\n },\n 'performance': {\n 'now': () => performance.now()\n },\n 'Date': {\n 'now': () => Date.now()\n }\n },\n },\n plugins: [\n viteStaticCopy({\n targets: [\n {\n src: resolve(__dirname, '../resources/openmcp-sdk-release/*'),\n dest: resolve(__dirname, '../openmcp-sdk')\n }\n ]\n }),\n // visualizer({\n // open: true,\n // filename: 'stats.html'\n // })\n ],\n build: {\n target: 'node18',\n lib: {\n entry: resolve(__dirname, '..', 'renderer/src/components/main-panel/chat/core/task-loop.ts'),\n name: 'TaskLoop',\n fileName: 'task-loop',\n formats: ['cjs']\n },\n outDir: resolve(__dirname, '..', 'openmcp-sdk'),\n emptyOutDir: false,\n rollupOptions: {\n external: [\n 'vue',\n 'element-plus',\n ],\n output: {\n globals: {\n vue: 'Vue',\n 'element-plus': './tools.js'\n }\n }\n },\n minify: false,\n sourcemap: false, // 禁用sourcemap生成\n cssCodeSplit: false // 禁用CSS文件生成\n },\n resolve: {\n alias: {\n '@': resolve(__dirname, '..', 'renderer/src'),\n }\n }\n});",
"extraInfo": {
"created": 1747598248965,
"created": 1749048385652,
"state": "success",
"serverName": "deepseek"
}
},
{
"role": "assistant",
"content": "Heres the translation in GitHub release style:\n\n---\n\n### **New Features**\n- Added support for real-time data synchronization.\n- Introduced a new dashboard for analytics.\n\n### **Improvements**\n- Optimized query performance for large datasets.\n- Enhanced error handling for API requests.\n\n### **Bug Fixes**\n- Fixed an issue where the system crashed on invalid input.\n- Resolved a memory leak in the background service.\n\n### **Breaking Changes**\n- Removed deprecated endpoints (`/v1/old`).\n- Updated the authentication mechanism to use OAuth 2.0.\n\n### **Documentation**\n- Added detailed guides for API integration.\n- Improved inline code comments.",
"content": "这个错误是因为 `vite-plugin-static-copy` 在处理 Windows 路径时可能存在问题。以下是解决方案:\n\n### 问题分析\n1. 错误表明插件找不到要复制的文件,但文件确实存在\n2. 在 Mac 上可以运行,但在 Windows 上失败\n3. 问题可能出在路径解析或通配符处理上\n\n### 解决方案\n\n#### 方案 1修改路径配置推荐\n```javascript\nviteStaticCopy({\n targets: [\n {\n src: '../resources/openmcp-sdk-release/**/*', // 使用 **/* 匹配所有文件\n dest: '../openmcp-sdk',\n rename: (name, extension, fullPath) => {\n // 移除路径前缀\n const relativePath = path.relative(\n path.resolve(__dirname, '../resources/openmcp-sdk-release'),\n fullPath\n );\n return relativePath;\n }\n }\n ]\n})\n```\n\n#### 方案 2明确指定文件列表\n```javascript\nimport fs from 'fs';\nimport path from 'path';\n\n// 获取所有文件\nconst getFiles = (dir) => {\n const files = [];\n const walkSync = (currentDir) => {\n fs.readdirSync(currentDir).forEach(file => {\n const fullPath = path.join(currentDir, file);\n if (fs.statSync(fullPath).isDirectory()) {\n walkSync(fullPath);\n } else {\n files.push(fullPath);\n }\n });\n };\n walkSync(path.resolve(__dirname, '../resources/openmcp-sdk-release'));\n return files;\n};\n\nconst filesToCopy = getFiles(path.resolve(__dirname, '../resources/openmcp-sdk-release'));\n\nexport default defineConfig({\n plugins: [\n viteStaticCopy({\n targets: filesToCopy.map(file => ({\n src: file,\n dest: path.relative(\n path.resolve(__dirname, '../resources/openmcp-sdk-release'),\n path.dirname(file)\n ),\n rename: path.basename(file)\n }))\n })\n ]\n})\n```\n\n#### 方案 3使用绝对路径并转义\n```javascript\nviteStaticCopy({\n targets: [\n {\n src: path.resolve(__dirname, '../resources/openmcp-sdk-release').replace(/\\\\/g, '/') + '/*',\n dest: path.resolve(__dirname, '../openmcp-sdk').replace(/\\\\/g, '/')\n }\n ]\n})\n```\n\n### 其他注意事项\n\n1. **路径分隔符问题**\n - Windows 使用 `\\` 而 Mac/Linux 使用 `/`\n - 可以统一使用 `path.posix` 方法:\n ```javascript\n const srcPath = path.posix.join('..', 'resources', 'openmcp-sdk-release', '*');\n ```\n\n2. **文件权限问题**\n - 确保 Windows 用户有读取源目录的权限\n\n3. **调试建议**\n - 在插件前添加日志:\n ```javascript\n console.log('Source path exists:', fs.existsSync(path.resolve(__dirname, '../resources/openmcp-sdk-release')));\n console.log('Source files:', fs.readdirSync(path.resolve(__dirname, '../resources/openmcp-sdk-release')));\n ```\n\n4. **备选方案**\n 如果仍然有问题,可以考虑使用 `vite-plugin-copy` 替代:\n ```javascript\n import copy from 'vite-plugin-copy';\n \n copy({\n targets: [\n { \n src: 'resources/openmcp-sdk-release/*',\n dest: 'openmcp-sdk'\n }\n ]\n })\n ```\n\n### 最终建议配置\n\n```javascript\nviteStaticCopy({\n targets: [\n {\n src: path.posix.join('..', 'resources', 'openmcp-sdk-release', '**', '*'),\n dest: path.posix.join('..', 'openmcp-sdk')\n }\n ]\n})\n```\n\n选择最适合你项目的一种方案通常方案1或方案3就能解决Windows路径问题。如果仍有问题可以尝试在Windows上使用WSL环境进行构建。",
"extraInfo": {
"created": 1747598260799,
"created": 1749048431015,
"state": "success",
"serverName": "deepseek",
"usage": {
"prompt_tokens": 7946,
"completion_tokens": 136,
"total_tokens": 8082,
"prompt_tokens": 7440,
"completion_tokens": 887,
"total_tokens": 8327,
"prompt_tokens_details": {
"cached_tokens": 896
"cached_tokens": 0
},
"prompt_cache_hit_tokens": 896,
"prompt_cache_miss_tokens": 7050
"prompt_cache_hit_tokens": 0,
"prompt_cache_miss_tokens": 7440
}
}
},
{
"role": "user",
"content": "error during build:\r\n[vite-plugin-static-copy:build] No file was found to copy on C:\\Users\\K\\project\\openmcp-client\\resources\\openmcp-sdk-release\\package.json src.,但是实际上这个路径是存在的",
"extraInfo": {
"created": 1749048724100,
"state": "success",
"serverName": "deepseek"
}
},
{
"role": "assistant",
"content": "这个错误表明 `vite-plugin-static-copy` 在尝试复制 `package.json` 文件时找不到文件,尽管文件确实存在。这通常是由于 Windows 路径处理或插件配置问题导致的。以下是详细的解决方案:\n\n---\n\n### **解决方案**\n\n#### **1. 使用明确的文件路径(推荐)**\n修改 `vite.config.ts`,明确指定要复制的文件路径:\n\n```javascript\nimport { defineConfig } from 'vite';\nimport { resolve } from 'path';\nimport { viteStaticCopy } from 'vite-plugin-static-copy';\n\nexport default defineConfig({\n plugins: [\n viteStaticCopy({\n targets: [\n {\n // 明确指定要复制的文件\n src: resolve(__dirname, '../resources/openmcp-sdk-release/package.json'),\n dest: resolve(__dirname, '../openmcp-sdk'),\n }\n ]\n })\n ]\n});\n```\n\n#### **2. 检查路径是否正确**\n在配置文件中添加调试代码验证路径是否存在\n\n```javascript\nconst srcPath = resolve(__dirname, '../resources/openmcp-sdk-release/package.json');\nconsole.log('File exists:', require('fs').existsSync(srcPath)); // 检查文件是否存在\nconsole.log('Full path:', srcPath); // 打印完整路径\n```\n\n如果输出 `false`,说明路径解析有问题。\n\n#### **3. 使用 `path.posix` 统一路径格式**\nWindows 使用反斜杠 `\\`,而插件可能预期正斜杠 `/`。强制使用 POSIX 格式:\n\n```javascript\nimport { posix } from 'path';\n\nviteStaticCopy({\n targets: [\n {\n src: posix.join('..', 'resources', 'openmcp-sdk-release', 'package.json'),\n dest: posix.join('..', 'openmcp-sdk'),\n }\n ]\n})\n```\n\n#### **4. 禁用 `flatten` 选项**\n如果目标路径结构需要保留添加 `flatten: false`\n\n```javascript\nviteStaticCopy({\n targets: [\n {\n src: resolve(__dirname, '../resources/openmcp-sdk-release/package.json'),\n dest: resolve(__dirname, '../openmcp-sdk'),\n flatten: false, // 保留原始目录结构\n }\n ]\n})\n```\n\n#### **5. 使用通配符的正确方式**\n如果需要复制多个文件确保通配符语法正确\n\n```javascript\nviteStaticCopy({\n targets: [\n {\n src: resolve(__dirname, '../resources/openmcp-sdk-release') + '/*', // 显式拼接通配符\n dest: resolve(__dirname, '../openmcp-sdk'),\n }\n ]\n})\n```\n\n#### **6. 替换为 `vite-plugin-copy`**\n如果问题依旧尝试使用更简单的 [`vite-plugin-copy`](https://github.com/fengxinming/vite-plugins/tree/main/packages/vite-plugin-copy)\n\n```bash\nnpm install vite-plugin-copy --save-dev\n```\n\n配置示例\n```javascript\nimport copy from 'vite-plugin-copy';\n\ncopy({\n targets: [\n {\n src: 'resources/openmcp-sdk-release/package.json',\n dest: 'openmcp-sdk',\n }\n ]\n})\n```\n\n---\n\n### **验证步骤**\n1. **检查文件权限**\n - 确保当前用户对 `resources/openmcp-sdk-release/package.json` 有读取权限。\n\n2. **打印调试信息**\n ```javascript\n console.log('Resolved src path:', resolve(__dirname, '../resources/openmcp-sdk-release/package.json'));\n console.log('Resolved dest path:', resolve(__dirname, '../openmcp-sdk'));\n ```\n\n3. **手动测试复制**\n 在 Node 中运行以下代码,验证是否能复制文件:\n ```javascript\n const fs = require('fs');\n const src = resolve(__dirname, '../resources/openmcp-sdk-release/package.json');\n const dest = resolve(__dirname, '../openmcp-sdk/package.json');\n fs.copyFileSync(src, dest);\n ```\n\n---\n\n### **常见问题原因**\n1. **路径大小写敏感**\n - Windows 路径不区分大小写,但插件内部可能严格匹配。检查路径中的大小写是否完全一致。\n\n2. **符号链接或虚拟路径**\n - 如果路径包含符号链接(如 `node_modules` 中的依赖),插件可能无法解析。\n\n3. **防病毒软件拦截**\n - 某些安全软件会阻止构建工具访问特定目录,尝试临时禁用防护软件。\n\n---\n\n### **最终建议**\n优先使用 **方案1明确文件路径** 或 **方案6替换插件**。如果问题仍未解决,请提供以下信息:\n1. 完整的 `vite.config.ts`。\n2. 运行 `dir C:\\Users\\K\\project\\openmcp-client\\resources\\openmcp-sdk-release` 的输出。\n3. 构建时的完整错误日志。",
"extraInfo": {
"created": 1749048777709,
"state": "success",
"serverName": "deepseek",
"usage": {
"prompt_tokens": 8385,
"completion_tokens": 1071,
"total_tokens": 9456,
"prompt_tokens_details": {
"cached_tokens": 8064
},
"prompt_cache_hit_tokens": 8064,
"prompt_cache_miss_tokens": 321
}
}
}
@ -367,37 +510,151 @@
{
"name": "puppeteer_navigate",
"description": "Navigate to a URL",
"enabled": true
"inputSchema": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "URL to navigate to"
},
"launchOptions": {
"type": "object",
"description": "PuppeteerJS LaunchOptions. Default null. If changed and not null, browser restarts. Example: { headless: true, args: ['--no-sandbox'] }"
},
"allowDangerous": {
"type": "boolean",
"description": "Allow dangerous LaunchOptions that reduce security. When false, dangerous args like --no-sandbox will throw errors. Default false."
}
},
"required": [
"url"
]
},
"enabled": false
},
{
"name": "puppeteer_screenshot",
"description": "Take a screenshot of the current page or a specific element",
"enabled": true
"inputSchema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Name for the screenshot"
},
"selector": {
"type": "string",
"description": "CSS selector for element to screenshot"
},
"width": {
"type": "number",
"description": "Width in pixels (default: 800)"
},
"height": {
"type": "number",
"description": "Height in pixels (default: 600)"
}
},
"required": [
"name"
]
},
"enabled": false
},
{
"name": "puppeteer_click",
"description": "Click an element on the page",
"enabled": true
"inputSchema": {
"type": "object",
"properties": {
"selector": {
"type": "string",
"description": "CSS selector for element to click"
}
},
"required": [
"selector"
]
},
"enabled": false
},
{
"name": "puppeteer_fill",
"description": "Fill out an input field",
"enabled": true
"inputSchema": {
"type": "object",
"properties": {
"selector": {
"type": "string",
"description": "CSS selector for input field"
},
"value": {
"type": "string",
"description": "Value to fill"
}
},
"required": [
"selector",
"value"
]
},
"enabled": false
},
{
"name": "puppeteer_select",
"description": "Select an element on the page with Select tag",
"enabled": true
"inputSchema": {
"type": "object",
"properties": {
"selector": {
"type": "string",
"description": "CSS selector for element to select"
},
"value": {
"type": "string",
"description": "Value to select"
}
},
"required": [
"selector",
"value"
]
},
"enabled": false
},
{
"name": "puppeteer_hover",
"description": "Hover an element on the page",
"enabled": true
"inputSchema": {
"type": "object",
"properties": {
"selector": {
"type": "string",
"description": "CSS selector for element to hover"
}
},
"required": [
"selector"
]
},
"enabled": false
},
{
"name": "puppeteer_evaluate",
"description": "Execute JavaScript in the browser console",
"enabled": true
"inputSchema": {
"type": "object",
"properties": {
"script": {
"type": "string",
"description": "JavaScript code to execute"
}
},
"required": [
"script"
]
},
"enabled": false
}
],
"enableWebSearch": false,

980
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -229,7 +229,7 @@
"lint": "eslint src --ext ts",
"test": "node ./out/test/runTest.js",
"prepare:ocr": "webpack --config webpack/webpack.tesseract.js",
"build:task-loop": "npx vite build --config webpack/vite.config.task-loop.js && node renderer/scripts/task-loop.build.mjs"
"build:task-loop": "npx vite build --config webpack/vite.config.task-loop.mjs && node renderer/scripts/task-loop.build.mjs"
},
"dependencies": {
"@modelcontextprotocol/sdk": "^1.12.1",
@ -244,7 +244,9 @@
"ws": "^8.18.1"
},
"devDependencies": {
"@esbuild/win32-x64": "^0.25.5",
"@rollup/plugin-inject": "^5.0.5",
"@rollup/rollup-win32-x64-msvc": "^4.41.1",
"@types/node": "^22.15.29",
"@types/pako": "^2.0.3",
"@types/showdown": "^2.0.0",

View File

@ -1,4 +1,4 @@
import { defineConfig } from 'vite';
import { defineConfig, normalizePath } from 'vite';
import { resolve } from 'path';
import { viteStaticCopy } from 'vite-plugin-static-copy';
// import { visualizer } from 'rollup-plugin-visualizer';
@ -22,8 +22,8 @@ export default defineConfig({
viteStaticCopy({
targets: [
{
src: resolve(__dirname, '../resources/openmcp-sdk-release/*'),
dest: resolve(__dirname, '../openmcp-sdk')
src: normalizePath(resolve(__dirname, '../resources/openmcp-sdk-release/*')),
dest: normalizePath(resolve(__dirname, '../openmcp-sdk'))
}
]
}),