Files
goodbuddy/package.json
T
mesalogo 38d0923d79 fix: stop repeated history migration after restart
Desktop 0.13.8 still treated SQLite freelist pages left by normal chat and note writes as evidence of pending migration when a file-backed note existed. Migration detection now checks only the schema version and legacy note payloads, while the startup worker reuses its confirmed pending decision during retries so actual migrations can still finish compaction.

Release note: 修复已有笔记用户正常聊天后重启仍重复显示历史迁移的问题;已完成迁移的数据继续按新格式保存,普通写入产生的空闲页不再触发迁移。
2026-09-21 12:31:14 +08:00

423 lines
13 KiB
JSON

{
"name": "goodbuddy",
"version": "0.13.9",
"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.agent.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",
"rg",
"rg.exe"
]
},
{
"from": ".runtime-resources",
"to": "runtimes",
"filter": [
"opencode-config{,/**/*}"
]
},
{
"from": "node_modules/opencode-ai/LICENSE",
"to": "licenses/opencode-ai-LICENSE"
},
{
"from": "node_modules/@vscode/ripgrep/LICENSE",
"to": "licenses/vscode-ripgrep-MIT.txt"
},
{
"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/fabric/LICENSE",
"to": "licenses/fabric-MIT.txt"
},
{
"from": "node_modules/jspdf/LICENSE",
"to": "licenses/jspdf-MIT.txt"
},
{
"from": "node_modules/quill/LICENSE",
"to": "licenses/quill-BSD-3-Clause.txt"
},
{
"from": "node_modules/pdfjs-dist/LICENSE",
"to": "licenses/pdfjs-Apache-2.0.txt"
},
{
"from": "src/renderer/src/magic-canvas/NOTICE.md",
"to": "licenses/peoplelib-canvas-NOTICE.md"
},
{
"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.2",
"@deepseek-ai/dsh-agent": "0.1.2-rc.1",
"@deepseek-ai/dsh-agent-loop": "0.1.2-rc.1",
"@deepseek-ai/dsh-bash-local": "0.1.2-rc.1",
"@deepseek-ai/dsh-credentials": "0.1.2-rc.1",
"@deepseek-ai/dsh-fs-local": "0.1.2-rc.1",
"@deepseek-ai/dsh-llm": "0.1.2-rc.1",
"@deepseek-ai/dsh-llm-pi-ai": "0.1.2-rc.1",
"@deepseek-ai/dsh-pwsh-local": "0.1.2-rc.1",
"@deepseek-ai/dsh-sandbox": "0.1.2-rc.1",
"@deepseek-ai/dsh-sandbox-policy": "0.1.2-rc.1",
"@deepseek-ai/dsh-session": "0.1.2-rc.1",
"@deepseek-ai/dsh-session-projection": "0.1.2-rc.1",
"@deepseek-ai/dsh-shell-env": "0.1.2-rc.1",
"@deepseek-ai/dsh-skill": "0.1.2-rc.1",
"@deepseek-ai/dsh-subprocess-local": "0.1.2-rc.1",
"@deepseek-ai/dsh-system-prompt": "0.1.2-rc.1",
"@deepseek-ai/dsh-token-meter": "0.1.2-rc.1",
"@deepseek-ai/dsh-tool-bash": "0.1.2-rc.1",
"@deepseek-ai/dsh-tool-fs": "0.1.2-rc.1",
"@deepseek-ai/dsh-tool-pwsh": "0.1.2-rc.1",
"@deepseek-ai/dsh-tool-skill": "0.1.2-rc.1",
"@deepseek-ai/dsh-tools": "0.1.2-rc.1",
"@deepseek-ai/dsh-user-approval": "0.1.2-rc.1",
"@huggingface/tokenizers": "^0.1.3",
"@modelcontextprotocol/sdk": "^1.30.0",
"@napi-rs/canvas": "1.0.3",
"@opencode-ai/plugin": "1.18.29",
"@opencode-ai/sdk": "1.18.29",
"@vscode/ripgrep": "1.18.0",
"@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",
"fabric": "7.4.0",
"html-to-text": "^10.0.0",
"i18next": "^25.10.10",
"json5": "^2.2.3",
"jspdf": "4.2.1",
"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.29",
"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.2-rc.1": 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.29": true,
"protobufjs@7.6.5": true,
"ssh2@1.17.0": true
}
}