build: optimize pnpm config and add missing dependencies

- Comment out shamefully-hoist in .npmrc for better pnpm compatibility
- Add React-related packages to optimizeDeps in electron.vite.config.ts
- Add missing peer dependencies and packages that were previously hoisted

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
beyondkmp 2026-01-04 15:15:58 +08:00
parent 8646347cf9
commit acffad31f8
18 changed files with 291 additions and 40 deletions

4
.npmrc
View File

@ -1,4 +1,4 @@
electron_mirror=https://npmmirror.com/mirrors/electron/
shamefully-hoist=true
#shamefully-hoist=true
strict-peer-dependencies=false
auto-install-peers=true
auto-install-peers=true

View File

@ -90,6 +90,7 @@ export default defineConfig({
}
},
optimizeDeps: {
include: ['react', 'react-dom', 'react/jsx-runtime', 'react/jsx-dev-runtime'],
exclude: ['pyodide'],
esbuildOptions: {
target: 'esnext' // for dev

View File

@ -97,6 +97,7 @@
"@agentic/tavily": "^7.3.3",
"@ai-sdk/amazon-bedrock": "^3.0.61",
"@ai-sdk/anthropic": "^2.0.49",
"@ai-sdk/azure": "2.0.91",
"@ai-sdk/cerebras": "^1.0.31",
"@ai-sdk/gateway": "^2.0.15",
"@ai-sdk/google": "2.0.49",
@ -105,7 +106,11 @@
"@ai-sdk/mistral": "^2.0.24",
"@ai-sdk/openai": "2.0.85",
"@ai-sdk/perplexity": "^2.0.20",
"@ai-sdk/provider": "^2.0.1",
"@ai-sdk/provider-utils": "3.0.20",
"@ai-sdk/test-server": "^0.0.1",
"@ai-sdk/xai": "^2.0.43",
"@ant-design/cssinjs": "^1.21.1",
"@ant-design/v5-patch-for-react-19": "^1.0.3",
"@anthropic-ai/sdk": "^0.41.0",
"@anthropic-ai/vertex-sdk": "0.11.4",
@ -125,9 +130,19 @@
"@cherrystudio/embedjs-loader-web": "^0.1.31",
"@cherrystudio/embedjs-loader-xml": "^0.1.31",
"@cherrystudio/embedjs-ollama": "^0.1.31",
"@opentelemetry/context-async-hooks": "2.2.0",
"@cherrystudio/embedjs-openai": "^0.1.31",
"@cherrystudio/embedjs-interfaces": "^0.1.33",
"@cherrystudio/embedjs-utils": "^0.1.33",
"md5": "2.3.0",
"adm-zip": "0.5.16",
"form-data": "4.0.5",
"@cherrystudio/extension-table-plus": "workspace:^",
"@ant-design/icons": "6.1.0",
"@cherrystudio/openai": "6.15.0",
"@codemirror/lang-json": "^6.0.1",
"@codemirror/lint": "^6.8.5",
"@codemirror/view": "^6.38.1",
"@dnd-kit/core": "^6.3.1",
"@dnd-kit/modifiers": "^9.0.0",
"@dnd-kit/sortable": "^10.0.0",
@ -140,6 +155,7 @@
"@emotion/is-prop-valid": "^1.3.1",
"@eslint-react/eslint-plugin": "^1.36.1",
"@eslint/js": "^9.22.0",
"@floating-ui/dom": "^1.6.14",
"@google/genai": "1.0.1",
"@hello-pangea/dnd": "^18.0.1",
"@kangfenmao/keyv-storage": "^0.1.0",
@ -171,10 +187,13 @@
"@testing-library/jest-dom": "^6.6.3",
"@testing-library/react": "^16.3.0",
"@testing-library/user-event": "^14.6.1",
"@tiptap/core": "^3.2.0",
"@tiptap/extension-code-block": "^3.2.0",
"@tiptap/extension-collaboration": "^3.2.0",
"@tiptap/extension-drag-handle": "3.2.0",
"@tiptap/extension-drag-handle-react": "^3.2.0",
"@tiptap/extension-image": "^3.2.0",
"@tiptap/extension-link": "^3.2.0",
"@tiptap/extension-list": "^3.2.0",
"@tiptap/extension-mathematics": "^3.2.0",
"@tiptap/extension-mention": "^3.2.0",
@ -196,11 +215,13 @@
"@types/dotenv": "^8.2.3",
"@types/express": "^5",
"@types/fs-extra": "^11",
"@types/hast": "^3.0.4",
"@types/he": "^1",
"@types/html-to-text": "^9",
"@types/js-yaml": "^4.0.9",
"@types/lodash": "^4.17.5",
"@types/markdown-it": "^14",
"@types/mdast": "^4.0.4",
"@types/md5": "^2.3.5",
"@types/mime-types": "^3",
"@types/node": "^22.17.1",
@ -214,6 +235,7 @@
"@types/swagger-ui-express": "^4.1.8",
"@types/tinycolor2": "^1",
"@types/turndown": "^5.0.5",
"@types/unist": "^3.0.3",
"@types/uuid": "^10.0.0",
"@types/word-extractor": "^1",
"@typescript/native-preview": "latest",
@ -242,6 +264,8 @@
"cli-progress": "^3.12.0",
"clsx": "^2.1.1",
"code-inspector-plugin": "^0.20.14",
"codemirror-lang-mermaid": "^0.5.0",
"builder-util-runtime": "9.3.1",
"color": "^5.0.0",
"concurrently": "^9.2.1",
"country-flag-emoji-polyfill": "0.1.8",
@ -251,6 +275,7 @@
"diff": "^8.0.2",
"docx": "^9.0.2",
"dompurify": "^3.2.6",
"dotenv": "^16.4.7",
"dotenv-cli": "^7.4.2",
"drizzle-kit": "^0.31.4",
"drizzle-orm": "^0.44.5",
@ -275,7 +300,7 @@
"fast-diff": "^1.3.0",
"fast-xml-parser": "^5.2.0",
"fetch-socks": "1.3.2",
"framer-motion": "^12.23.12",
"framer-motion": "^12.23.26",
"franc-min": "^6.2.0",
"fs-extra": "^11.2.0",
"google-auth-library": "^9.15.1",
@ -291,6 +316,10 @@
"isbinaryfile": "5.0.4",
"jaison": "^2.0.2",
"jest-styled-components": "^7.2.0",
"js-base64": "^3.7.7",
"json-schema": "^0.4.0",
"katex": "^0.16.19",
"ky": "^1.7.3",
"linguist-languages": "^8.1.0",
"lint-staged": "^15.5.0",
"lodash": "^4.17.21",
@ -301,15 +330,18 @@
"mermaid": "^11.10.1",
"mime": "^4.0.4",
"mime-types": "^3.0.1",
"motion": "^12.10.5",
"motion": "^12.23.26",
"nanoid": "^5.0.9",
"notion-helper": "^1.3.22",
"npx-scope-finder": "^1.2.0",
"ollama-ai-provider-v2": "1.5.5",
"oxlint": "^1.22.0",
"oxlint-tsgolint": "^0.2.0",
"p-queue": "^8.1.0",
"pako": "^2.1.0",
"pdf-lib": "^1.17.1",
"pdf-parse": "^1.1.1",
"prosemirror-model": "^1.24.4",
"proxy-agent": "^6.5.0",
"react": "^19.2.0",
"react-dom": "^19.2.0",
@ -321,6 +353,9 @@
"react-markdown": "^10.1.0",
"react-player": "^3.3.1",
"react-redux": "^9.1.2",
"rc-input": "^1.8.0",
"rc-select": "14.16.8",
"rc-virtual-list": "^3.19.2",
"react-router": "6",
"react-router-dom": "6",
"react-spinners": "^0.14.1",
@ -337,6 +372,8 @@
"remark-gfm": "^4.0.1",
"remark-github-blockquote-alert": "^2.0.0",
"remark-math": "^6.0.0",
"remark-parse": "^11.0.0",
"remark-stringify": "^11.0.0",
"remove-markdown": "^0.6.2",
"rollup-plugin-visualizer": "^5.12.0",
"shiki": "^3.12.0",
@ -348,6 +385,10 @@
"tailwind-merge": "^3.3.1",
"tailwindcss": "^4.1.13",
"tar": "^7.4.3",
"semver": "7.7.3",
"chalk": "5.6.2",
"cors": "2.8.5",
"@langchain/textsplitters": "1.0.1",
"tiny-pinyin": "^1.3.2",
"tokenx": "^1.1.0",
"tsx": "^4.20.3",
@ -356,6 +397,7 @@
"typescript": "~5.8.2",
"undici": "6.21.2",
"unified": "^11.0.5",
"unist-util-visit": "^5.0.0",
"uuid": "^13.0.0",
"vite": "npm:rolldown-vite@7.3.0",
"vitest": "^3.2.4",

View File

@ -172,6 +172,9 @@ importers:
'@ai-sdk/anthropic':
specifier: ^2.0.49
version: 2.0.57(zod@4.3.4)
'@ai-sdk/azure':
specifier: 2.0.91
version: 2.0.91(zod@4.3.4)
'@ai-sdk/cerebras':
specifier: ^1.0.31
version: 1.0.34(zod@4.3.4)
@ -196,9 +199,24 @@ importers:
'@ai-sdk/perplexity':
specifier: ^2.0.20
version: 2.0.23(zod@4.3.4)
'@ai-sdk/provider':
specifier: ^2.0.1
version: 2.0.1
'@ai-sdk/provider-utils':
specifier: 3.0.20
version: 3.0.20(zod@4.3.4)
'@ai-sdk/test-server':
specifier: ^0.0.1
version: 0.0.1(@types/node@22.19.3)(typescript@5.8.3)
'@ai-sdk/xai':
specifier: ^2.0.43
version: 2.0.43(zod@4.3.4)
'@ant-design/cssinjs':
specifier: ^1.21.1
version: 1.24.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
'@ant-design/icons':
specifier: 6.1.0
version: 6.1.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
'@ant-design/v5-patch-for-react-19':
specifier: ^1.0.3
version: 1.0.3(antd@5.27.0(patch_hash=cdc383bd0d9b9fe0df2ce7b1f1d4ead200012b7f9517d9257b4ea0a5b324e243)(moment@2.30.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
@ -226,6 +244,9 @@ importers:
'@cherrystudio/embedjs':
specifier: ^0.1.31
version: 0.1.33(@langchain/core@1.0.2(patch_hash=8dc787a82cebafe8b23c8826f25f29aca64fc8b43a0a1878e0010782e4da96ed)(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.15.0(ws@8.18.3)(zod@4.3.4)))(@langchain/ollama@0.1.6(@langchain/core@1.0.2(patch_hash=8dc787a82cebafe8b23c8826f25f29aca64fc8b43a0a1878e0010782e4da96ed)(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.15.0(ws@8.18.3)(zod@4.3.4))))(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(axios@1.13.2)(cheerio@1.1.2)(handlebars@4.7.8)(openai@6.15.0(ws@8.18.3)(zod@4.3.4))(ws@8.18.3)
'@cherrystudio/embedjs-interfaces':
specifier: ^0.1.33
version: 0.1.33(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.15.0(ws@8.18.3)(zod@4.3.4))
'@cherrystudio/embedjs-libsql':
specifier: ^0.1.31
version: 0.1.33(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.15.0(ws@8.18.3)(zod@4.3.4))
@ -259,12 +280,24 @@ importers:
'@cherrystudio/embedjs-openai':
specifier: ^0.1.31
version: 0.1.33(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.15.0(ws@8.18.3)(zod@4.3.4))(ws@8.18.3)
'@cherrystudio/embedjs-utils':
specifier: ^0.1.33
version: 0.1.33(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.15.0(ws@8.18.3)(zod@4.3.4))
'@cherrystudio/extension-table-plus':
specifier: workspace:^
version: link:packages/extension-table-plus
'@cherrystudio/openai':
specifier: 6.15.0
version: 6.15.0(ws@8.18.3)(zod@4.3.4)
'@codemirror/lang-json':
specifier: ^6.0.1
version: 6.0.2
'@codemirror/lint':
specifier: 6.8.5
version: 6.8.5
'@codemirror/view':
specifier: 6.38.1
version: 6.38.1
'@dnd-kit/core':
specifier: ^6.3.1
version: 6.3.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
@ -301,6 +334,9 @@ importers:
'@eslint/js':
specifier: ^9.22.0
version: 9.39.2
'@floating-ui/dom':
specifier: ^1.6.14
version: 1.7.4
'@google/genai':
specifier: 1.0.1
version: 1.0.1(patch_hash=5cf01cdc644f9e1a03dea633c111140f865a17927cdefb48a6dc2d9004f2dcf8)(@modelcontextprotocol/sdk@1.25.1(@cfworker/json-schema@4.1.1)(hono@4.11.3)(zod@4.3.4))(encoding@0.1.13)
@ -312,13 +348,16 @@ importers:
version: 0.1.0
'@langchain/community':
specifier: ^1.0.0
version: 1.1.1(b8960301de9277df01d5543678b7dfa2)
version: 1.1.1(a8664fc25ef3048ffc7f9eb268b97cf5)
'@langchain/core':
specifier: 1.0.2
version: 1.0.2(patch_hash=8dc787a82cebafe8b23c8826f25f29aca64fc8b43a0a1878e0010782e4da96ed)(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.15.0(ws@8.18.3)(zod@4.3.4))
'@langchain/openai':
specifier: 1.0.0
version: 1.0.0(patch_hash=d6ed38e7008b7a6b45ee16826e31b0198ffb0cb581852fd8de532ddeca633334)(@langchain/core@1.0.2(patch_hash=8dc787a82cebafe8b23c8826f25f29aca64fc8b43a0a1878e0010782e4da96ed)(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.15.0(ws@8.18.3)(zod@4.3.4)))(ws@8.18.3)
'@langchain/textsplitters':
specifier: 1.0.1
version: 1.0.1(@langchain/core@1.0.2(patch_hash=8dc787a82cebafe8b23c8826f25f29aca64fc8b43a0a1878e0010782e4da96ed)(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.15.0(ws@8.18.3)(zod@4.3.4)))
'@mistralai/mistralai':
specifier: ^1.7.5
version: 1.11.0
@ -337,6 +376,9 @@ importers:
'@opentelemetry/api':
specifier: ^1.9.0
version: 1.9.0
'@opentelemetry/context-async-hooks':
specifier: 2.2.0
version: 2.2.0(@opentelemetry/api@1.9.0)
'@opentelemetry/core':
specifier: 2.0.0
version: 2.0.0(@opentelemetry/api@1.9.0)
@ -394,6 +436,12 @@ importers:
'@testing-library/user-event':
specifier: ^14.6.1
version: 14.6.1(@testing-library/dom@10.4.1)
'@tiptap/core':
specifier: ^3.2.0
version: 3.14.0(@tiptap/pm@3.14.0)
'@tiptap/extension-code-block':
specifier: ^3.2.0
version: 3.14.0(@tiptap/core@3.14.0(@tiptap/pm@3.14.0))(@tiptap/pm@3.14.0)
'@tiptap/extension-collaboration':
specifier: ^3.2.0
version: 3.14.0(@tiptap/core@3.14.0(@tiptap/pm@3.14.0))(@tiptap/pm@3.14.0)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29))(yjs@13.6.29)
@ -406,6 +454,9 @@ importers:
'@tiptap/extension-image':
specifier: ^3.2.0
version: 3.14.0(@tiptap/core@3.14.0(@tiptap/pm@3.14.0))
'@tiptap/extension-link':
specifier: ^3.2.0
version: 3.14.0(@tiptap/core@3.14.0(@tiptap/pm@3.14.0))(@tiptap/pm@3.14.0)
'@tiptap/extension-list':
specifier: ^3.2.0
version: 3.14.0(@tiptap/core@3.14.0(@tiptap/pm@3.14.0))(@tiptap/pm@3.14.0)
@ -469,6 +520,9 @@ importers:
'@types/fs-extra':
specifier: ^11
version: 11.0.4
'@types/hast':
specifier: ^3.0.4
version: 3.0.4
'@types/he':
specifier: ^1
version: 1.2.3
@ -487,6 +541,9 @@ importers:
'@types/md5':
specifier: ^2.3.5
version: 2.3.6
'@types/mdast':
specifier: ^4.0.4
version: 4.0.4
'@types/mime-types':
specifier: ^3
version: 3.0.1
@ -523,6 +580,9 @@ importers:
'@types/turndown':
specifier: ^5.0.5
version: 5.0.6
'@types/unist':
specifier: ^3.0.3
version: 3.0.3
'@types/uuid':
specifier: ^10.0.0
version: 10.0.0
@ -565,6 +625,9 @@ importers:
'@xyflow/react':
specifier: ^12.4.4
version: 12.10.0(@types/react@19.2.7)(immer@11.1.3)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
adm-zip:
specifier: 0.5.16
version: 0.5.16
ai:
specifier: ^5.0.98
version: 5.0.117(zod@4.3.4)
@ -583,6 +646,12 @@ importers:
browser-image-compression:
specifier: ^2.0.2
version: 2.0.2
builder-util-runtime:
specifier: 9.3.1
version: 9.3.1
chalk:
specifier: 5.6.2
version: 5.6.2
chardet:
specifier: ^2.1.0
version: 2.1.1
@ -607,12 +676,18 @@ importers:
code-inspector-plugin:
specifier: ^0.20.14
version: 0.20.17
codemirror-lang-mermaid:
specifier: ^0.5.0
version: 0.5.0
color:
specifier: ^5.0.0
version: 5.0.3
concurrently:
specifier: ^9.2.1
version: 9.2.1
cors:
specifier: 2.8.5
version: 2.8.5
country-flag-emoji-polyfill:
specifier: 0.1.8
version: 0.1.8
@ -634,6 +709,9 @@ importers:
dompurify:
specifier: ^3.2.6
version: 3.3.1
dotenv:
specifier: ^16.4.7
version: 16.6.1
dotenv-cli:
specifier: ^7.4.2
version: 7.4.4
@ -706,8 +784,11 @@ importers:
fetch-socks:
specifier: 1.3.2
version: 1.3.2
form-data:
specifier: 4.0.5
version: 4.0.5
framer-motion:
specifier: ^12.23.12
specifier: ^12.23.26
version: 12.23.26(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
franc-min:
specifier: ^6.2.0
@ -754,6 +835,18 @@ importers:
jest-styled-components:
specifier: ^7.2.0
version: 7.2.0(styled-components@6.1.19(react-dom@19.2.3(react@19.2.3))(react@19.2.3))
js-base64:
specifier: ^3.7.7
version: 3.7.8
json-schema:
specifier: ^0.4.0
version: 0.4.0
katex:
specifier: ^0.16.19
version: 0.16.27
ky:
specifier: ^1.7.3
version: 1.14.2
linguist-languages:
specifier: ^8.1.0
version: 8.2.0
@ -775,6 +868,9 @@ importers:
markdown-it:
specifier: ^14.1.0
version: 14.1.0
md5:
specifier: 2.3.0
version: 2.3.0
mermaid:
specifier: ^11.10.1
version: 11.12.2
@ -785,8 +881,11 @@ importers:
specifier: ^3.0.1
version: 3.0.2
motion:
specifier: ^12.10.5
specifier: ^12.23.26
version: 12.23.26(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
nanoid:
specifier: ^5.0.9
version: 5.1.6
notion-helper:
specifier: ^1.3.22
version: 1.3.29
@ -805,15 +904,30 @@ importers:
p-queue:
specifier: ^8.1.0
version: 8.1.1
pako:
specifier: ^2.1.0
version: 2.1.0
pdf-lib:
specifier: ^1.17.1
version: 1.17.1
pdf-parse:
specifier: ^1.1.1
version: 1.1.4
prosemirror-model:
specifier: ^1.24.4
version: 1.25.4
proxy-agent:
specifier: ^6.5.0
version: 6.5.0
rc-input:
specifier: ^1.8.0
version: 1.8.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
rc-select:
specifier: 14.16.8
version: 14.16.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
rc-virtual-list:
specifier: ^3.19.2
version: 3.19.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
react:
specifier: ^19.2.0
version: 19.2.3
@ -892,12 +1006,21 @@ importers:
remark-math:
specifier: ^6.0.0
version: 6.0.0
remark-parse:
specifier: ^11.0.0
version: 11.0.0
remark-stringify:
specifier: ^11.0.0
version: 11.0.0
remove-markdown:
specifier: ^0.6.2
version: 0.6.2
rollup-plugin-visualizer:
specifier: ^5.12.0
version: 5.14.0
semver:
specifier: 7.7.3
version: 7.7.3
shiki:
specifier: ^3.12.0
version: 3.20.0
@ -949,6 +1072,9 @@ importers:
unified:
specifier: ^11.0.5
version: 11.0.5
unist-util-visit:
specifier: ^5.0.0
version: 5.0.0
uuid:
specifier: ^13.0.0
version: 13.0.0
@ -1276,6 +1402,9 @@ packages:
'@ant-design/colors@7.2.1':
resolution: {integrity: sha512-lCHDcEzieu4GA3n8ELeZ5VQ8pKQAWcGGLRTQ50aQM2iqPpq2evTxER84jfdPvsPAtEcZ7m44NI45edFMo8oOYQ==}
'@ant-design/colors@8.0.0':
resolution: {integrity: sha512-6YzkKCw30EI/E9kHOIXsQDHmMvTllT8STzjMb4K2qzit33RW2pqCJP0sk+hidBntXxE+Vz4n1+RvCTfBw6OErw==}
'@ant-design/cssinjs-utils@1.1.3':
resolution: {integrity: sha512-nOoQMLW1l+xR1Co8NFVYiP8pZp3VjIIzqV6D6ShYF2ljtdwWJn5WSsH+7kvCktXL/yhEtWURKOfH5Xz/gzlwsg==}
peerDependencies:
@ -1292,6 +1421,10 @@ packages:
resolution: {integrity: sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==}
engines: {node: '>=8.x'}
'@ant-design/fast-color@3.0.0':
resolution: {integrity: sha512-eqvpP7xEDm2S7dUzl5srEQCBTXZMmY3ekf97zI+M2DHOYyKdJGH0qua0JACHTqbkRnD/KHFQP9J1uMJ/XWVzzA==}
engines: {node: '>=8.x'}
'@ant-design/icons-svg@4.4.2':
resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==}
@ -1302,6 +1435,13 @@ packages:
react: '>=16.0.0'
react-dom: '>=16.0.0'
'@ant-design/icons@6.1.0':
resolution: {integrity: sha512-KrWMu1fIg3w/1F2zfn+JlfNDU8dDqILfA5Tg85iqs1lf8ooyGlbkA+TkwfOKKgqpUmAiRY1PTFpuOU2DAIgSUg==}
engines: {node: '>=8'}
peerDependencies:
react: '>=16.0.0'
react-dom: '>=16.0.0'
'@ant-design/react-slick@1.1.2':
resolution: {integrity: sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==}
peerDependencies:
@ -3811,6 +3951,12 @@ packages:
react: '>=16.9.0'
react-dom: '>=16.9.0'
'@rc-component/util@1.7.0':
resolution: {integrity: sha512-tIvIGj4Vl6fsZFvWSkYw9sAfiCKUXMyhVz6kpKyZbwyZyRPqv2vxYZROdaO1VB4gqTNvUZFXh6i3APUiterw5g==}
peerDependencies:
react: '>=18.0.0'
react-dom: '>=18.0.0'
'@reduxjs/toolkit@2.11.2':
resolution: {integrity: sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==}
peerDependencies:
@ -5471,6 +5617,10 @@ packages:
resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==}
engines: {node: '>=0.3.0'}
adm-zip@0.5.16:
resolution: {integrity: sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==}
engines: {node: '>=12.0'}
agent-base@7.1.4:
resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==}
engines: {node: '>= 14'}
@ -5792,6 +5942,10 @@ packages:
buffer@6.0.3:
resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
builder-util-runtime@9.3.1:
resolution: {integrity: sha512-2/egrNDDnRaxVwK3A+cJq6UOlqOdedGA7JPqCeJjN2Zjk1/QB/6QUi3b714ScIGS7HafFXTyzJEOr5b44I3kvQ==}
engines: {node: '>=12.0.0'}
builder-util-runtime@9.5.0:
resolution: {integrity: sha512-7qmRMH8X/IzDM+1TysKNFo5cNWBbfacdLX4EqkuE5aiRTECAlYiKHSqEc6cc3c4Lrmpgk0utbxOPkj0iYaWAWQ==}
engines: {node: '>=12.0.0'}
@ -6661,10 +6815,6 @@ packages:
resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==}
engines: {node: '>=12'}
dotenv@17.2.3:
resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==}
engines: {node: '>=12'}
drizzle-kit@0.31.8:
resolution: {integrity: sha512-O9EC/miwdnRDY10qRxM8P3Pg8hXe3LyU4ZipReKOgTwn4OqANmftj8XJz1UPUAS6NMHf0E2htjsbQujUTkncCg==}
hasBin: true
@ -7955,6 +8105,9 @@ packages:
resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==}
engines: {node: '>=8'}
is-mobile@5.0.0:
resolution: {integrity: sha512-Tz/yndySvLAEXh+Uk8liFCxOwVH6YutuR74utvOcu7I9Di+DwM0mtdPVZNaVvvBUM2OXxne/NhOs1zAO7riusQ==}
is-natural-number@4.0.1:
resolution: {integrity: sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==}
@ -9471,6 +9624,9 @@ packages:
pako@1.0.11:
resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
pako@2.1.0:
resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==}
parent-module@1.0.1:
resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
engines: {node: '>=6'}
@ -12128,6 +12284,10 @@ snapshots:
dependencies:
'@ant-design/fast-color': 2.0.6
'@ant-design/colors@8.0.0':
dependencies:
'@ant-design/fast-color': 3.0.0
'@ant-design/cssinjs-utils@1.1.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
dependencies:
'@ant-design/cssinjs': 1.24.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
@ -12152,6 +12312,8 @@ snapshots:
dependencies:
'@babel/runtime': 7.28.4
'@ant-design/fast-color@3.0.0': {}
'@ant-design/icons-svg@4.4.2': {}
'@ant-design/icons@5.6.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
@ -12164,6 +12326,15 @@ snapshots:
react: 19.2.3
react-dom: 19.2.3(react@19.2.3)
'@ant-design/icons@6.1.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
dependencies:
'@ant-design/colors': 8.0.0
'@ant-design/icons-svg': 4.4.2
'@rc-component/util': 1.7.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
clsx: 2.1.1
react: 19.2.3
react-dom: 19.2.3(react@19.2.3)
'@ant-design/react-slick@1.1.2(react@19.2.3)':
dependencies:
'@babel/runtime': 7.28.4
@ -13041,13 +13212,13 @@ snapshots:
transitivePeerDependencies:
- encoding
'@browserbasehq/stagehand@1.14.0(@playwright/test@1.57.0)(deepmerge@4.3.1)(dotenv@17.2.3)(encoding@0.1.13)(openai@6.15.0(ws@8.18.3)(zod@4.3.4))(zod@4.3.4)':
'@browserbasehq/stagehand@1.14.0(@playwright/test@1.57.0)(deepmerge@4.3.1)(dotenv@16.6.1)(encoding@0.1.13)(openai@6.15.0(ws@8.18.3)(zod@4.3.4))(zod@4.3.4)':
dependencies:
'@anthropic-ai/sdk': 0.27.3(encoding@0.1.13)
'@browserbasehq/sdk': 2.6.0(encoding@0.1.13)
'@playwright/test': 1.57.0
deepmerge: 4.3.1
dotenv: 17.2.3
dotenv: 16.6.1
openai: 6.15.0(ws@8.18.3)(zod@4.3.4)
ws: 8.18.3
zod: 4.3.4
@ -13729,7 +13900,7 @@ snapshots:
node-gyp: 11.5.0
ora: 5.4.1
read-binary-file-arch: 1.0.6
semver: 7.7.2
semver: 7.7.3
tar: 6.2.1
yargs: 17.7.2
transitivePeerDependencies:
@ -14340,9 +14511,9 @@ snapshots:
- openai
- ws
'@langchain/community@1.1.1(b8960301de9277df01d5543678b7dfa2)':
'@langchain/community@1.1.1(a8664fc25ef3048ffc7f9eb268b97cf5)':
dependencies:
'@browserbasehq/stagehand': 1.14.0(@playwright/test@1.57.0)(deepmerge@4.3.1)(dotenv@17.2.3)(encoding@0.1.13)(openai@6.15.0(ws@8.18.3)(zod@4.3.4))(zod@4.3.4)
'@browserbasehq/stagehand': 1.14.0(@playwright/test@1.57.0)(deepmerge@4.3.1)(dotenv@16.6.1)(encoding@0.1.13)(openai@6.15.0(ws@8.18.3)(zod@4.3.4))(zod@4.3.4)
'@ibm-cloud/watsonx-ai': 1.7.5
'@langchain/classic': 1.0.7(@langchain/core@1.0.2(patch_hash=8dc787a82cebafe8b23c8826f25f29aca64fc8b43a0a1878e0010782e4da96ed)(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.15.0(ws@8.18.3)(zod@4.3.4)))(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(cheerio@1.1.2)(openai@6.15.0(ws@8.18.3)(zod@4.3.4))(ws@8.18.3)
'@langchain/core': 1.0.2(patch_hash=8dc787a82cebafe8b23c8826f25f29aca64fc8b43a0a1878e0010782e4da96ed)(@opentelemetry/api@1.9.0)(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.15.0(ws@8.18.3)(zod@4.3.4))
@ -14760,7 +14931,7 @@ snapshots:
'@npmcli/fs@4.0.0':
dependencies:
semver: 7.7.2
semver: 7.7.3
'@open-draft/deferred-promise@2.2.0': {}
@ -15294,6 +15465,13 @@ snapshots:
react: 19.2.3
react-dom: 19.2.3(react@19.2.3)
'@rc-component/util@1.7.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
dependencies:
is-mobile: 5.0.0
react: 19.2.3
react-dom: 19.2.3(react@19.2.3)
react-is: 18.3.1
'@reduxjs/toolkit@2.11.2(react-redux@9.2.0(@types/react@19.2.7)(react@19.2.3)(redux@5.0.1))(react@19.2.3)':
dependencies:
'@standard-schema/spec': 1.1.0
@ -16443,7 +16621,7 @@ snapshots:
'@types/dotenv@8.2.3':
dependencies:
dotenv: 17.2.3
dotenv: 16.6.1
'@types/estree-jsx@1.0.5':
dependencies:
@ -17359,6 +17537,8 @@ snapshots:
adm-zip@0.4.16: {}
adm-zip@0.5.16: {}
agent-base@7.1.4: {}
agentkeepalive@4.6.0:
@ -17758,6 +17938,13 @@ snapshots:
base64-js: 1.5.1
ieee754: 1.2.1
builder-util-runtime@9.3.1:
dependencies:
debug: 4.4.3
sax: 1.4.3
transitivePeerDependencies:
- supports-color
builder-util-runtime@9.5.0:
dependencies:
debug: 4.4.3
@ -18028,7 +18215,7 @@ snapshots:
code-inspector-core@0.20.17:
dependencies:
'@vue/compiler-dom': 3.5.26
chalk: 4.1.1
chalk: 4.1.2
dotenv: 16.6.1
launch-ide: 1.0.8
portfinder: 1.0.38
@ -18719,8 +18906,6 @@ snapshots:
dotenv@16.6.1: {}
dotenv@17.2.3: {}
drizzle-kit@0.31.8:
dependencies:
'@drizzle-team/brocli': 0.10.2
@ -20257,6 +20442,8 @@ snapshots:
is-interactive@1.0.0: {}
is-mobile@5.0.0: {}
is-natural-number@4.0.1: {}
is-node-process@1.2.0: {}
@ -20569,7 +20756,7 @@ snapshots:
launch-ide@1.0.8:
dependencies:
chalk: 4.1.1
chalk: 4.1.2
dotenv: 16.6.1
layerr@3.0.0: {}
@ -21744,7 +21931,7 @@ snapshots:
node-api-version@0.2.1:
dependencies:
semver: 7.7.2
semver: 7.7.3
node-domexception@1.0.0: {}
@ -21772,7 +21959,7 @@ snapshots:
make-fetch-happen: 14.0.3
nopt: 8.1.0
proc-log: 5.0.0
semver: 7.7.2
semver: 7.7.3
tar: 7.5.2
tinyglobby: 0.2.15
which: 5.0.0
@ -22085,6 +22272,8 @@ snapshots:
pako@1.0.11: {}
pako@2.1.0: {}
parent-module@1.0.1:
dependencies:
callsites: 3.1.0

View File

@ -4,10 +4,10 @@ import { getIpCountry } from '@main/utils/ipService'
import { generateUserAgent } from '@main/utils/systemInfo'
import { FeedUrl, UpdateConfigUrl, UpdateMirror, UpgradeChannel } from '@shared/config/constant'
import { IpcChannel } from '@shared/IpcChannel'
import type { UpdateInfo } from 'builder-util-runtime'
import { CancellationToken } from 'builder-util-runtime'
import { app, net } from 'electron'
import type { UpdateInfo } from 'electron-updater'
import type { AppUpdater as _AppUpdater, Logger, NsisUpdater, UpdateCheckResult } from 'electron-updater'
import { CancellationToken } from 'electron-updater'
import { autoUpdater } from 'electron-updater'
import path from 'path'
import semver from 'semver'

View File

@ -629,7 +629,7 @@ class McpService {
// Set up logging message notification handler
client.setNotificationHandler(LoggingMessageNotificationSchema, async (notification) => {
logger.debug(`Message from server ${server.name}:`, notification.params)
const msg = notification.params?.message
const msg = notification.params?.data as string
if (msg) {
this.emitServerLog(server, {
timestamp: Date.now(),

View File

@ -81,7 +81,10 @@ vi.mock('electron-updater', () => ({
},
Logger: vi.fn(),
NsisUpdater: vi.fn(),
AppUpdater: vi.fn()
AppUpdater: vi.fn(),
CancellationToken: vi.fn(() => ({
cancel: vi.fn()
}))
}))
// Import after mocks

View File

@ -8,7 +8,7 @@ import type {
OAuthClientInformationFull,
OAuthTokens
} from '@modelcontextprotocol/sdk/shared/auth'
import open from 'open'
import { shell } from 'electron'
import { sanitizeUrl } from 'strict-url-sanitise'
import { JsonFileStorage } from './storage'
@ -67,7 +67,7 @@ export class McpOAuthClientProvider implements OAuthClientProvider {
async redirectToAuthorization(authorizationUrl: URL): Promise<void> {
try {
// Open the browser to the authorization URL
await open(sanitizeUrl(authorizationUrl.toString()))
await shell.openExternal(sanitizeUrl(authorizationUrl.toString()))
logger.debug('Browser opened automatically.')
} catch (error) {
logger.error('Could not open browser automatically.')

View File

@ -258,13 +258,18 @@ describe('file', () => {
describe('readTextFileWithAutoEncoding', () => {
const mockFilePath = '/path/to/mock/file.txt'
const toNonSharedBuffer = (input: Buffer) => {
const arrayBuffer = new ArrayBuffer(input.byteLength)
new Uint8Array(arrayBuffer).set(input)
return Buffer.from(arrayBuffer)
}
it('should read file with auto encoding', async () => {
const content = '这是一段GB18030编码的测试内容'
const buffer = iconv.encode(content, 'GB18030')
// 模拟文件读取和编码检测
vi.spyOn(fsPromises, 'readFile').mockResolvedValue(buffer)
vi.spyOn(fsPromises, 'readFile').mockResolvedValue(toNonSharedBuffer(buffer))
vi.spyOn(chardet, 'detectFile').mockResolvedValue('GB18030')
const result = await readTextFileWithAutoEncoding(mockFilePath)
@ -276,7 +281,7 @@ describe('file', () => {
const buffer = iconv.encode(content, 'UTF-8')
// 模拟文件读取
vi.spyOn(fsPromises, 'readFile').mockResolvedValue(buffer)
vi.spyOn(fsPromises, 'readFile').mockResolvedValue(toNonSharedBuffer(buffer))
vi.spyOn(chardet, 'detectFile').mockResolvedValue('GB18030')
const result = await readTextFileWithAutoEncoding(mockFilePath)

View File

@ -50,7 +50,9 @@ export const ImageGenerationMiddleware: CompletionsMiddleware =
if (!block.file) return null
const binaryData: Uint8Array = await FileManager.readBinaryImage(block.file)
const mimeType = `${block.file.type}/${block.file.ext.slice(1)}`
return await toFile(new Blob([binaryData]), block.file.origin_name || 'image.png', { type: mimeType })
return await toFile(new Blob([new Uint8Array(binaryData)]), block.file.origin_name || 'image.png', {
type: mimeType
})
})
)
imageFiles = imageFiles.concat(userImages.filter(Boolean) as Blob[])

View File

@ -42,7 +42,7 @@ const ImageViewer: React.FC<ImageViewerProps> = ({ src, style, ...props }) => {
if (!match) throw new Error('Invalid base64 image format')
const mimeType = match[1]
const byteArray = Base64.toUint8Array(match[2])
blob = new Blob([byteArray], { type: mimeType })
blob = new Blob([new Uint8Array(byteArray)], { type: mimeType })
} else if (src.startsWith('file://')) {
// 处理本地文件路径
const bytes = await window.api.fs.read(src)

View File

@ -3,7 +3,8 @@ import { TopView } from '@renderer/components/TopView'
import { handleSaveData, useAppDispatch } from '@renderer/store'
import { setUpdateState } from '@renderer/store/runtime'
import { Button, Modal } from 'antd'
import type { ReleaseNoteInfo, UpdateInfo } from 'builder-util-runtime'
import type { ReleaseNoteInfo } from 'builder-util-runtime'
import type { UpdateInfo } from 'electron-updater'
import { useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next'
import Markdown from 'react-markdown'

View File

@ -13,6 +13,8 @@ export const CodeBlockShiki = CodeBlock.extend<CodeBlockShikiOptions>({
addOptions() {
return {
...this.parent?.(),
enableTabIndentation: false,
tabSize: 2,
languageClassPrefix: 'language-',
exitOnTripleEnter: true,
exitOnArrowDown: true,

View File

@ -15,10 +15,15 @@ declare module '@tiptap/core' {
// Enhanced Image extension that emits events for image upload
export const EnhancedImage = Image.extend({
addOptions() {
const parentOptions = this.parent?.() ?? { resize: false, HTMLAttributes: {} }
return {
...this.parent?.(),
...parentOptions,
resize: parentOptions.resize ?? false,
inline: false,
allowBase64: true,
HTMLAttributes: {
...parentOptions.HTMLAttributes,
class: 'rich-editor-image'
}
}

View File

@ -8,7 +8,7 @@ exports[`InputEmbeddingDimension > basic rendering > should match snapshot with
<input
data-testid="input-number"
placeholder="请输入维度大小"
style="flex: 1;"
style="flex: 1 1 0%;"
type="number"
value="1536"
/>
@ -43,7 +43,7 @@ exports[`InputEmbeddingDimension > basic rendering > should match snapshot with
<input
data-testid="input-number"
placeholder="请输入维度大小"
style="flex: 1;"
style="flex: 1 1 0%;"
type="number"
value=""
/>

View File

@ -24,6 +24,7 @@ exports[`Spinner > should match snapshot 1`] = `
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
style="color: unset;"
viewBox="0 0 24 24"
width="16"
xmlns="http://www.w3.org/2000/svg"

View File

@ -50,7 +50,7 @@ const MessageImage: FC<Props> = ({ block }) => {
const mimeType = parts[0].replace('data:', '')
const base64Data = parts[1]
const byteCharacters = atob(base64Data)
const byteArrays: Uint8Array[] = []
const byteArrays: BlobPart[] = []
for (let offset = 0; offset < byteCharacters.length; offset += 512) {
const slice = byteCharacters.slice(offset, offset + 512)

View File

@ -18,7 +18,7 @@ import type { PayloadAction } from '@reduxjs/toolkit'
import { createSlice } from '@reduxjs/toolkit'
import { AppLogo, UserAvatar } from '@renderer/config/env'
import type { MinAppType, Topic, WebSearchStatus } from '@renderer/types'
import type { UpdateInfo } from 'builder-util-runtime'
import type { UpdateInfo } from 'electron-updater'
export interface ChatState {
isMultiSelectMode: boolean