Files
goodbuddy/package.json
T
mesalogo be39665ca9 feat: add managed local tool environments
GoodBuddy can now provide managed Node.js and on-demand Python to local Skills and stdio MCP servers, or validate an explicitly selected custom interpreter. The Capabilities and tools settings page exposes source selection, diagnostics, installation progress, cancellation, and removal while new processes receive immutable PATH snapshots.

Application settings migrate to v10. Local terminal and remote Host environments remain unchanged. Windows x64 native-source Node and Python paths are validated; OSS mirror publication, redistributed license resources, and the remaining native platform probes are recorded as release blockers.

Release note: 新增工具执行环境,可为本机 Skills 和 stdio MCP 使用 GoodBuddy 托管的 Node.js、按需安装的 Python,或经过验证的自定义解释器。
2026-09-02 10:36:56 +08:00

385 lines
12 KiB
JSON

{
"name": "goodbuddy",
"version": "0.11.14",
"private": true,
"description": "Secure desktop AI workspace with controlled Agent Runtimes",
"desktopName": "GoodBuddy",
"homepage": "https://mesalogo.github.io/goodbuddy/",
"author": {
"name": "MesaLogo"
},
"license": "0BSD",
"repository": {
"type": "git",
"url": "git+https://github.com/mesalogo/goodbuddy.git"
},
"bugs": {
"url": "https://github.com/mesalogo/goodbuddy/issues"
},
"main": "./out/main/index.js",
"type": "module",
"scripts": {
"dev": "electron-vite dev",
"start": "electron-vite preview",
"typecheck": "tsc --noEmit -p tsconfig.node.json && tsc --noEmit -p tsconfig.web.json",
"lint": "eslint .",
"test": "vitest run",
"test:watch": "vitest",
"eval:retrieval": "vitest run --config tests/support/knowledge-retrieval-evaluation.ts tests/knowledge-retrieval-metrics.test.ts tests/knowledge-retrieval-evaluation.test.ts",
"build": "npm run typecheck && npm run build:bundle",
"build:bundle": "electron-vite build && node build/check-control-plane-package-installer.cjs",
"smoke:deepseek-harness": "npm run build:bundle && node build/run-deepseek-harness-utility-smoke.cjs",
"smoke:deepseek-harness:packaged": "node build/run-packaged-deepseek-harness-smoke.cjs",
"agent:build": "node build/agent-bundle.cjs build",
"agent:verify": "node build/agent-bundle.cjs verify",
"agent:import": "node build/agent-bundle.cjs import",
"remote-runtime:build": "node build/remote-runtime-bundle.cjs build",
"remote-runtime:verify": "node build/remote-runtime-bundle.cjs verify",
"remote-runtime:import": "node build/remote-runtime-bundle.cjs import",
"release:notes:verify": "node build/release-notes.cjs",
"dist": "npm run build && node build/run-electron-builder.cjs",
"dist:win": "npm run build && node build/run-electron-builder.cjs --win nsis --x64 --arm64",
"dist:mac": "npm run build && node build/run-electron-builder.cjs --mac dmg --x64 --arm64",
"dist:linux": "npm run dist:linux:x64 && npm run dist:linux:arm64",
"dist:linux:x64": "npm run build && node build/run-electron-builder.cjs --linux AppImage deb rpm --x64",
"dist:linux:arm64": "npm run build && node build/run-electron-builder.cjs --linux AppImage deb rpm --arm64",
"icons": "node build/generate-icons.mjs",
"release:package": "node build/build-release.cjs",
"portable": "node build/build-portable.cjs"
},
"build": {
"appId": "live.digiman.goodbuddy",
"productName": "GoodBuddy",
"directories": {
"buildResources": "build",
"output": "dist"
},
"artifactName": "${productName}-${version}-${os}-${arch}.${ext}",
"beforePack": "build/runtime-hooks.cjs",
"asar": true,
"asarUnpack": [
"out/main/package.json",
"out/main/deepseek-harness-*",
"out/main/embedding-inference-bootstrap.js",
"out/main/chunks/**/*",
"node_modules/node-pty/lib/**/*",
"node_modules/node-pty/package.json",
"node_modules/node-pty/prebuilds/**/*",
"node_modules/node-pty/build/Release/**/*",
"node_modules/koffi/**/*",
"node_modules/@koromix/koffi-*/**/*",
"node_modules/@napi-rs/canvas{,/**/*}",
"node_modules/@napi-rs/canvas-*/**/*",
"node_modules/onnxruntime-web/dist/**/*.wasm"
],
"npmRebuild": false,
"compression": "maximum",
"files": [
"out/**/*",
"package.json",
"!node_modules/npm{,/**/*}"
],
"extraResources": [
{
"from": "resources/skills",
"to": "skills",
"filter": [
"**/*"
]
},
{
"from": "resources/release-notes.json",
"to": "release-notes.json"
},
{
"from": "resources/tool-environment/managed-python-artifacts.json",
"to": "tool-environment/managed-python-artifacts.json"
},
{
"from": "agent-runtime-lock.json",
"to": "agent-runtime-lock.json"
},
{
"from": "remote-runtime-lock.json",
"to": "remote-runtime-lock.json"
},
{
"from": "resources/agent-release-keys.json",
"to": "agent-release-keys.json"
},
{
"from": "build/icon-taskbar.ico",
"to": "icon.ico"
},
{
"from": "build/icon.png",
"to": "icon.png"
},
{
"from": "build/icon-tray.png",
"to": "tray-icon.png"
},
{
"from": ".runtime-resources/${arch}",
"to": "runtimes/opencode",
"filter": [
"opencode",
"opencode.exe"
]
},
{
"from": "node_modules/opencode-ai/LICENSE",
"to": "licenses/opencode-ai-LICENSE"
},
{
"from": "node_modules/@deepseek-ai/dsh-agent/LICENSE",
"to": "licenses/deepseek-harness-MIT.txt"
},
{
"from": "node_modules/@deepseek-ai/cordis/LICENSE",
"to": "licenses/deepseek-cordis-MIT.txt"
},
{
"from": "node_modules/@agentclientprotocol/sdk/LICENSE",
"to": "licenses/agent-client-protocol-Apache-2.0.txt"
},
{
"from": "node_modules",
"to": "runtimes",
"filter": [
"npm{,/**/*}"
]
},
{
"from": "node_modules/node-pty/LICENSE",
"to": "licenses/node-pty-MIT.txt"
},
{
"from": "node_modules/ssh2/LICENSE",
"to": "licenses/ssh2-MIT.txt"
},
{
"from": "node_modules/koffi/LICENSE.txt",
"to": "licenses/koffi-MIT.txt"
},
{
"from": "node_modules/@napi-rs/canvas/LICENSE",
"to": "licenses/napi-rs-canvas-MIT.txt"
},
{
"from": "node_modules/@continuedev/cli",
"to": "runtimes/continue",
"filter": [
"package.json",
"dist/cn.js",
"dist/index.js",
"dist/xhr-sync-worker.js"
]
},
{
"from": "node_modules/typescript/LICENSE.txt",
"to": "licenses/continuedev-cli-LICENSE"
},
{
"from": "node_modules/@fontsource-variable/inter/LICENSE",
"to": "licenses/inter-OFL-1.1.txt"
},
{
"from": "node_modules/@fontsource-variable/noto-sans-sc/LICENSE",
"to": "licenses/noto-sans-sc-OFL-1.1.txt"
},
{
"from": "node_modules/ppu-paddle-ocr/LICENSE",
"to": "licenses/ppu-paddle-ocr-MIT.txt"
},
{
"from": "node_modules/ppu-ocv/LICENSE",
"to": "licenses/ppu-ocv-MIT.txt"
},
{
"from": "resources/licenses/onnxruntime-MIT.txt",
"to": "licenses/onnxruntime-web-MIT.txt"
},
{
"from": "node_modules/@huggingface/tokenizers/LICENSE",
"to": "licenses/huggingface-tokenizers-Apache-2.0.txt"
},
{
"from": "node_modules/katex/LICENSE",
"to": "licenses/katex-MIT.txt"
},
{
"from": "node_modules/mermaid/LICENSE",
"to": "licenses/mermaid-MIT.txt"
},
{
"from": "node_modules/dompurify/LICENSE",
"to": "licenses/dompurify-Apache-2.0.txt"
},
{
"from": "node_modules/dompurify/LICENSE-MPL",
"to": "licenses/dompurify-MPL-2.0.txt"
}
],
"win": {
"icon": "build/icon-taskbar.ico",
"target": [
"nsis"
]
},
"nsis": {
"oneClick": false,
"allowToChangeInstallationDirectory": true,
"createDesktopShortcut": "always",
"createStartMenuShortcut": true,
"deleteAppDataOnUninstall": false
},
"mac": {
"icon": "build/icon.png",
"target": [
"dmg"
],
"category": "public.app-category.productivity",
"hardenedRuntime": true,
"gatekeeperAssess": false,
"notarize": true,
"extendInfo": {
"NSMicrophoneUsageDescription": "GoodBuddy 需要访问麦克风,将语音转换为可编辑文字。"
}
},
"linux": {
"icon": "build/icon.png",
"maintainer": "MesaLogo",
"vendor": "MesaLogo",
"synopsis": "安全可控的桌面智能助手与 Agent 工作空间",
"syncDesktopName": true,
"target": [
"AppImage",
"deb",
"rpm"
],
"category": "Utility"
}
},
"dependencies": {
"@agentclientprotocol/sdk": "0.25.1",
"@deepseek-ai/cordis": "4.0.1",
"@deepseek-ai/dsh-agent": "0.1.0-rc.8",
"@deepseek-ai/dsh-agent-loop": "0.1.0-rc.8",
"@deepseek-ai/dsh-bash-local": "0.1.0-rc.8",
"@deepseek-ai/dsh-credentials": "0.1.0-rc.8",
"@deepseek-ai/dsh-fs-local": "0.1.0-rc.8",
"@deepseek-ai/dsh-llm": "0.1.0-rc.8",
"@deepseek-ai/dsh-llm-pi-ai": "0.1.0-rc.8",
"@deepseek-ai/dsh-pwsh-local": "0.1.0-rc.8",
"@deepseek-ai/dsh-sandbox": "0.1.0-rc.8",
"@deepseek-ai/dsh-sandbox-policy": "0.1.0-rc.8",
"@deepseek-ai/dsh-session": "0.1.0-rc.8",
"@deepseek-ai/dsh-shell-env": "0.1.0-rc.8",
"@deepseek-ai/dsh-skill": "0.1.0-rc.8",
"@deepseek-ai/dsh-subprocess-local": "0.1.0-rc.8",
"@deepseek-ai/dsh-system-prompt": "0.1.0-rc.8",
"@deepseek-ai/dsh-token-meter": "0.1.0-rc.8",
"@deepseek-ai/dsh-tool-bash": "0.1.0-rc.8",
"@deepseek-ai/dsh-tool-fs": "0.1.0-rc.8",
"@deepseek-ai/dsh-tool-pwsh": "0.1.0-rc.8",
"@deepseek-ai/dsh-tool-skill": "0.1.0-rc.8",
"@deepseek-ai/dsh-tools": "0.1.0-rc.8",
"@deepseek-ai/dsh-user-approval": "0.1.0-rc.8",
"@huggingface/tokenizers": "^0.1.3",
"@modelcontextprotocol/sdk": "^1.30.0",
"@napi-rs/canvas": "1.0.3",
"@opencode-ai/sdk": "^1.18.9",
"@wecom/aibot-node-sdk": "^1.0.6",
"@xterm/addon-fit": "0.11.0",
"@xterm/addon-search": "0.16.0",
"@xterm/addon-webgl": "0.19.0",
"@xterm/xterm": "6.0.0",
"cross-spawn": "^7.0.6",
"dingtalk-stream": "^2.1.6-beta.1",
"dompurify": "^3.4.13",
"fflate": "^0.8.3",
"html-to-text": "^10.0.0",
"i18next": "^25.10.10",
"json5": "^2.2.3",
"katex": "^0.16.47",
"koffi": "3.1.4",
"lucide-react": "^1.27.0",
"mermaid": "^11.16.1",
"node-pty": "^1.2.0-beta.15",
"npm": "11.19.0",
"onnxruntime-web": "^1.23.2",
"pdfjs-dist": "^6.2.108",
"ppu-paddle-ocr": "^6.4.0",
"qrcode": "^1.5.4",
"quill": "^2.0.3",
"react": "^19.2.8",
"react-dom": "^19.2.8",
"react-i18next": "^16.6.6",
"react-markdown": "^10.1.0",
"rehype-katex": "^7.0.1",
"remark-gfm": "^4.0.1",
"remark-math": "^6.0.0",
"sherpa-onnx": "1.13.4",
"ssh2": "^1.17.0",
"undici": "^7.29.0",
"yaml": "^2.9.0",
"zod": "^4.4.3"
},
"devDependencies": {
"@antv/g6": "^5.1.1",
"@continuedev/cli": "1.5.47",
"@eslint/js": "^10.0.1",
"@fontsource-variable/inter": "^5.3.0",
"@fontsource-variable/noto-sans-sc": "^5.3.0",
"@testing-library/jest-dom": "^7.0.0",
"@testing-library/react": "^16.3.2",
"@types/cross-spawn": "^6.0.6",
"@types/html-to-text": "^9.0.4",
"@types/node": "^26.1.2",
"@types/qrcode": "^1.5.5",
"@types/react": "^19.2.17",
"@types/react-dom": "^19.2.3",
"@types/ssh2": "^1.15.5",
"@vitejs/plugin-react": "^5.2.0",
"electron": "^43.2.0",
"electron-builder": "^26.15.3",
"electron-vite": "^5.0.0",
"esbuild": "0.25.12",
"eslint": "^10.8.0",
"eslint-plugin-react-hooks": "^7.1.1",
"globals": "^17.8.0",
"jsdom": "^30.0.1",
"opencode-ai": "1.18.9",
"png-to-ico": "^3.0.2",
"pngjs": "^7.0.0",
"tar": "7.5.22",
"typescript": "^6.0.3",
"typescript-eslint": "^8.65.0",
"vite": "^7.3.6",
"vitest": "^4.1.10"
},
"optionalDependencies": {
"@koromix/koffi-darwin-arm64": "3.1.4",
"@koromix/koffi-darwin-x64": "3.1.4",
"@koromix/koffi-linux-arm64": "3.1.4",
"@koromix/koffi-linux-x64": "3.1.4",
"@koromix/koffi-win32-arm64": "3.1.4",
"@koromix/koffi-win32-x64": "3.1.4"
},
"allowScripts": {
"@deepseek-ai/dsh-subprocess-local@0.1.0-rc.8": true,
"@google/genai@1.52.0": true,
"cpu-features@0.0.10": true,
"electron-winstaller@5.4.0": true,
"esbuild@0.25.12": true,
"esbuild@0.28.1": true,
"fsevents@2.3.3": true,
"koffi@3.1.4": true,
"node-pty@1.2.0-beta.15": true,
"opencode-ai@1.18.9": true,
"protobufjs@7.6.5": true,
"ssh2@1.17.0": true
}
}