Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
e5bb310
fix: add AlertDialogDescription to resolve accessibility warning (#706)
yyhhyyyyyy Aug 6, 2025
0c528c8
fix: resolve focus flicker when creating new windows with Ctrl+Shift+…
yyhhyyyyyy Aug 6, 2025
68fc0e2
feat: enhance window management by implementing main window ID handli…
hllshiro Aug 7, 2025
0d65009
docs: update zhipu developer doc website link (#715)
tomsun28 Aug 8, 2025
1909d8b
refactor: better translate (#716)
zerob13 Aug 8, 2025
d78c05c
feat: add GPT-5 series model support (#717)
yyhhyyyyyy Aug 9, 2025
4ba53ab
ci(vite): Bundle the main file into a single file to speed up loading…
zerob13 Aug 10, 2025
4b15796
fix(math): parser by upgrade vue-renderer-markdown (#722)
Simon-He95 Aug 11, 2025
d7a5953
chore: bump deps (#721)
zerob13 Aug 11, 2025
181430d
fix: add scrollable support to PopoverContent to prevent overflow (#720)
yyhhyyyyyy Aug 11, 2025
08658c3
feat: implement floating chat window system with performance optimiza…
yyhhyyyyyy Aug 11, 2025
3feafbc
feat: add mcp sync and modelscope provider #615 (#723)
zerob13 Aug 11, 2025
720ee4f
fix: move_files newPath parse issue (#725)
wangle201210 Aug 12, 2025
f5f93c9
feat: add Claude Opus 4.1 to anthropic default model list (#726)
yyhhyyyyyy Aug 12, 2025
f02aaaf
feat: Add mcprouter's MCP marketplace api support (#727)
zerob13 Aug 12, 2025
b359f46
feat: add ESC key to close floating chat window (#728)
yyhhyyyyyy Aug 12, 2025
a336ea0
feat: add floating button position persistence with boundary validati…
yyhhyyyyyy Aug 12, 2025
7a58eef
chore: bump to 0.3.0
zerob13 Aug 13, 2025
3fffea3
feat: add reasoning_effort parameter support for gpt-oss models (#731)
yyhhyyyyyy Aug 13, 2025
82f408a
fix: artifacts code not streaming (#732)
zerob13 Aug 13, 2025
bce1fec
feat: disable automatic model enabling for better UX (#734)
yyhhyyyyyy Aug 13, 2025
7174593
feat: sync provider sorting from settings to model selection (#736)
yyhhyyyyyy Aug 13, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion README.jp.md
Original file line number Diff line number Diff line change
Expand Up @@ -325,7 +325,6 @@ deepchatへの貢献をご検討いただきありがとうございます!貢
- [Vue](https://vuejs.org/)
- [Electron](https://www.electronjs.org/)
- [Electron-Vite](https://electron-vite.org/)
- [Rolldown-Vite](https://github.com/vitejs/rolldown-vite)
- [oxlint](https://github.com/oxc-project/oxc)

## 📃 ライセンス
Expand Down
1 change: 0 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -331,7 +331,6 @@ This project is built with the help of these awesome libraries:
- [Vue](https://vuejs.org/)
- [Electron](https://www.electronjs.org/)
- [Electron-Vite](https://electron-vite.org/)
- [Rolldown-Vite](https://github.com/vitejs/rolldown-vite)
- [oxlint](https://github.com/oxc-project/oxc)

## 📃 License
Expand Down
1 change: 0 additions & 1 deletion README.zh.md
Original file line number Diff line number Diff line change
Expand Up @@ -325,7 +325,6 @@ DeepChat是一个活跃的开源社区项目,我们欢迎各种形式的贡献
- [Vue](https://vuejs.org/)
- [Electron](https://www.electronjs.org/)
- [Electron-Vite](https://electron-vite.org/)
- [Rolldown-Vite](https://github.com/vitejs/rolldown-vite)
- [oxlint](https://github.com/oxc-project/oxc)

## 📃 许可证
Expand Down
6 changes: 5 additions & 1 deletion electron.vite.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,11 @@ export default defineConfig({
},
build: {
rollupOptions: {
external: ['sharp']
external: ['sharp','@duckdb/node-api'],
output: {
inlineDynamicImports: true,
manualChunks: undefined, // Disable automatic chunk splitting
}
}
}
},
Expand Down
51 changes: 24 additions & 27 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "DeepChat",
"version": "0.2.9",
"version": "0.3.0",
"description": "DeepChat,一个简单易用的AI客户端",
"main": "./out/main/index.js",
"author": "ThinkInAIXYZ",
Expand Down Expand Up @@ -42,13 +42,13 @@
"build:linux:x64": "pnpm run build && electron-builder --linux --x64",
"build:linux:arm64": "pnpm run build && electron-builder --linux --arm64",
"afterSign": "scripts/notarize.js",
"installRuntime": "npx -y tiny-runtime-injector --type uv --dir ./runtime/uv && npx -y tiny-runtime-injector --type bun --dir ./runtime/bun",
"installRuntime:win:x64": "npx -y tiny-runtime-injector --type uv --dir ./runtime/uv -a x64 -p win32 && npx -y tiny-runtime-injector --type node --dir ./runtime/node -a x64 -p win32",
"installRuntime:win:arm64": "npx -y tiny-runtime-injector --type uv --dir ./runtime/uv -a arm64 -p win32 && npx -y tiny-runtime-injector --type node --dir ./runtime/node -a arm64 -p win32",
"installRuntime:mac:arm64": "npx -y tiny-runtime-injector --type uv --dir ./runtime/uv -a arm64 -p darwin && npx -y tiny-runtime-injector --type bun --dir ./runtime/bun -a arm64 -p darwin",
"installRuntime:mac:x64": "npx -y tiny-runtime-injector --type uv --dir ./runtime/uv -a x64 -p darwin && npx -y tiny-runtime-injector --type bun --dir ./runtime/bun -a x64 -p darwin",
"installRuntime:linux:x64": "npx -y tiny-runtime-injector --type uv --dir ./runtime/uv -a x64 -p linux && npx -y tiny-runtime-injector --type bun --dir ./runtime/bun -a x64 -p linux",
"installRuntime:linux:arm64": "npx -y tiny-runtime-injector --type uv --dir ./runtime/uv -a arm64 -p linux && npx -y tiny-runtime-injector --type bun --dir ./runtime/bun -a arm64 -p linux",
"installRuntime": "npx -y tiny-runtime-injector --type uv --dir ./runtime/uv --runtime-version 0.8.8 && npx -y tiny-runtime-injector --type bun --dir ./runtime/bun --runtime-version v1.2.20",
"installRuntime:win:x64": "npx -y tiny-runtime-injector --type uv --dir ./runtime/uv --runtime-version 0.8.8 -a x64 -p win32 && npx -y tiny-runtime-injector --type node --dir ./runtime/node -a x64 -p win32",
"installRuntime:win:arm64": "npx -y tiny-runtime-injector --type uv --dir ./runtime/uv --runtime-version 0.8.8 -a arm64 -p win32 && npx -y tiny-runtime-injector --type node --dir ./runtime/node -a arm64 -p win32",
"installRuntime:mac:arm64": "npx -y tiny-runtime-injector --type uv --dir ./runtime/uv --runtime-version 0.8.8 -a arm64 -p darwin && npx -y tiny-runtime-injector --type bun --runtime-version v1.2.20 --dir ./runtime/bun -a arm64 -p darwin",
"installRuntime:mac:x64": "npx -y tiny-runtime-injector --type uv --dir ./runtime/uv --runtime-version 0.8.8 -a x64 -p darwin && npx -y tiny-runtime-injector --type bun --runtime-version v1.2.20 --dir ./runtime/bun -a x64 -p darwin",
"installRuntime:linux:x64": "npx -y tiny-runtime-injector --type uv --dir ./runtime/uv --runtime-version 0.8.8 -a x64 -p linux && npx -y tiny-runtime-injector --type bun --runtime-version v1.2.20 --dir ./runtime/bun -a x64 -p linux",
"installRuntime:linux:arm64": "npx -y tiny-runtime-injector --type uv --dir ./runtime/uv --runtime-version 0.8.8 -a arm64 -p linux && npx -y tiny-runtime-injector --type bun --runtime-version v1.2.20 --dir ./runtime/bun -a arm64 -p linux",
"installRuntime:duckdb:vss": "node scripts/installVss.js",
"i18n": "i18n-check -s zh-CN -f i18next --locales src/renderer/src/i18n",
"i18n:en": "i18n-check -s en-US -f i18next --locales src/renderer/src/i18n",
Expand All @@ -61,9 +61,9 @@
"@e2b/code-interpreter": "^1.5.1",
"@electron-toolkit/preload": "^3.0.1",
"@electron-toolkit/utils": "^4.0.0",
"@google/genai": "^1.5.1",
"@google/genai": "^1.13.0",
"@jxa/run": "^1.4.0",
"@modelcontextprotocol/sdk": "^1.13.1",
"@modelcontextprotocol/sdk": "^1.17.2",
"axios": "^1.7.9",
"better-sqlite3-multiple-ciphers": "11.10.0",
"cheerio": "^1.0.0",
Expand All @@ -78,12 +78,12 @@
"file-type": "^20.5.0",
"glob": "^11.0.3",
"https-proxy-agent": "^7.0.6",
"jsonrepair": "^3.12.0",
"jsonrepair": "^3.13.0",
"mammoth": "^1.9.0",
"mime-types": "^2.1.35",
"nanoid": "^5.1.5",
"ollama": "^0.5.16",
"openai": "^5.3.0",
"openai": "^5.12.2",
"pdf-parse-new": "^1.3.9",
"run-applescript": "^7.0.0",
"sharp": "^0.33.5",
Expand Down Expand Up @@ -121,18 +121,18 @@
"@types/node": "^22.14.1",
"@types/xlsx": "^0.0.35",
"@vitejs/plugin-vue": "^6.0.1",
"@vitest/ui": "^3.2.3",
"@vitest/ui": "^3.2.4",
"@vue/test-utils": "^2.4.6",
"@vueuse/core": "^12.7.0",
"autoprefixer": "^10.4.20",
"autoprefixer": "^10.4.21",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"dompurify": "^3.2.4",
"electron": "^35.5.1",
"dompurify": "^3.2.6",
"electron": "^36.7.4",
"electron-builder": "26.0.12",
"electron-vite": "^4.0.0",
"jsdom": "^26.1.0",
"lint-staged": "^16.1.2",
"lint-staged": "^16.1.5",
"lucide-vue-next": "^0.511.0",
"mermaid": "^11.6.0",
"minimatch": "^10.0.1",
Expand All @@ -148,21 +148,21 @@
"tailwindcss-animate": "^1.0.7",
"tippy.js": "^6.3.7",
"typescript": "^5.8.3",
"vite": "npm:rolldown-vite@latest",
"vite": "7.1.1",
"vite-plugin-monaco-editor-esm": "^2.0.2",
"vite-plugin-vue-devtools": "^8.0.0",
"vite-svg-loader": "^5.1.0",
"vitest": "^3.2.3",
"vue": "^3.5.14",
"vue-i18n": "^11.1.3",
"vue-renderer-markdown": "^0.0.32",
"vue-renderer-markdown": "^0.0.34",
"vitest": "^3.2.4",
"vue": "^3.5.18",
"vue-i18n": "^11.1.11",
"vue-router": "4",
"vue-tsc": "^2.2.10",
"vue-use-monaco": "^0.0.6",
"vue-use-monaco": "^0.0.8",
"vue-virtual-scroller": "^2.0.0-beta.8",
"vuedraggable": "^4.1.0",
"yaml": "^2.8.0",
"zod-to-json-schema": "^3.24.5"
"zod-to-json-schema": "^3.24.6"
},
"simple-git-hooks": {
"pre-commit": "pnpm lint-staged && pnpm typecheck",
Expand All @@ -177,9 +177,6 @@
]
},
"pnpm": {
"overrides": {
"vite": "npm:rolldown-vite@latest"
},
"onlyBuiltDependencies": [
"@tailwindcss/oxide",
"electron",
Expand Down
1 change: 1 addition & 0 deletions src/main/events.ts
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,7 @@ export const MEETING_EVENTS = {
// 悬浮按钮相关事件
export const FLOATING_BUTTON_EVENTS = {
CLICKED: 'floating-button:clicked', // 悬浮按钮被点击
RIGHT_CLICKED: 'floating-button:right-clicked', // 悬浮按钮被右键点击
VISIBILITY_CHANGED: 'floating-button:visibility-changed', // 悬浮按钮显示状态改变
POSITION_CHANGED: 'floating-button:position-changed', // 悬浮按钮位置改变
ENABLED_CHANGED: 'floating-button:enabled-changed' // 悬浮按钮启用状态改变
Expand Down
21 changes: 11 additions & 10 deletions src/main/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -156,17 +156,18 @@ app.whenReady().then(async () => {
// 注册 'deepcdn' 协议,用于加载应用内置资源 (模拟 CDN)
protocol.handle('deepcdn', (request) => {
try {
// console.log('deepcdn', request.url)
const filePath = request.url.slice('deepcdn://'.length)
// 根据开发/生产环境确定资源路径
const resourcesPath = is.dev
? path.join(app.getAppPath(), 'resources')
: process.resourcesPath
// 检查资源是否被解包 (app.asar.unpacked),优先使用解包路径
const unpackedResourcesPath = path.join(resourcesPath, 'app.asar.unpacked', 'resources')

const baseResourcesDir = fs.existsSync(unpackedResourcesPath)
? unpackedResourcesPath
: path.join(resourcesPath, 'resources') // 否则使用默认资源路径
// 根据开发/生产环境确定资源路径(按候选目录探测,避免错误拼接导致重复 resources)
const candidates = is.dev
? [path.join(app.getAppPath(), 'resources')]
: [
path.join(process.resourcesPath, 'app.asar.unpacked', 'resources'),
path.join(process.resourcesPath, 'resources'),
process.resourcesPath
]
const baseResourcesDir =
candidates.find((p) => fs.existsSync(path.join(p, 'cdn'))) || candidates[0]

const fullPath = path.join(baseResourcesDir, 'cdn', filePath)

Expand Down
32 changes: 30 additions & 2 deletions src/main/presenter/configPresenter/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -331,7 +331,7 @@ export class ConfigPresenter implements IConfigPresenter {

// Cache miss: read from settings and cache the result
const status = this.getSetting<boolean>(statusKey)
const finalStatus = typeof status === 'boolean' ? status : true
const finalStatus = typeof status === 'boolean' ? status : false
this.modelStatusCache.set(statusKey, finalStatus)

return finalStatus
Expand Down Expand Up @@ -359,7 +359,7 @@ export class ConfigPresenter implements IConfigPresenter {
const modelId = uncachedModelIds[i]
const statusKey = uncachedKeys[i]
const status = this.getSetting<boolean>(statusKey)
const finalStatus = typeof status === 'boolean' ? status : true
const finalStatus = typeof status === 'boolean' ? status : false

// Cache the result and add to return object
this.modelStatusCache.set(statusKey, finalStatus)
Expand Down Expand Up @@ -1166,6 +1166,34 @@ export class ConfigPresenter implements IConfigPresenter {
newConfigs
)
}

// 批量导入MCP服务器
async batchImportMcpServers(
servers: Array<{
name: string
description: string
package: string
version?: string
type?: any
args?: string[]
env?: Record<string, string>
enabled?: boolean
source?: string
[key: string]: unknown
}>,
options: {
skipExisting?: boolean
enableByDefault?: boolean
overwriteExisting?: boolean
} = {}
): Promise<{ imported: number; skipped: number; errors: string[] }> {
return this.mcpConfHelper.batchImportMcpServers(servers, options)
}

// 根据包名查找服务器
async findMcpServerByPackage(packageName: string): Promise<string | null> {
return this.mcpConfHelper.findServerByPackage(packageName)
}
}

export { defaultShortcutKey } from './shortcutKeySettings'
Loading