最近我尝试把 DeepSeek Harness 做成一个类似 Codex 的 Windows 桌面程序。
最终实现的功能包括:
一键启动 DeepSeek Harness
独立的 Electron 桌面窗口
开机自动启动
桌面快捷方式
插件管理界面
Wallpaper Engine 动态壁纸
程序、插件、缓存和会话尽量存放在 D 盘
不再需要每次手动打开浏览器地址
本文记录完整的实现思路、目录结构、打包方法,以及过程中遇到的 pnpm、Electron 和动态壁纸问题。
一、这个桌面版本质上是什么
这套桌面版使用 Electron 实现。
DeepSeek Harness 本身仍然负责模型、会话、智能体和插件运行。Electron 只是给它增加一个真正的 Windows 桌面窗口。
整体工作流程如下:
桌面快捷方式启动 VBS 脚本。
VBS 脚本设置 DeepSeek Harness 的数据目录、pnpm 仓库和本地服务端口。
DeepSeek Harness CLI 启动本地 Web 服务。
Electron 创建桌面窗口,并加载:
Electron preload 再通过 window.desktopWindow 提供动态壁纸、本地文件访问和窗口控制等桌面能力。
所以,它不是把大模型直接打进 EXE,而是把本地运行的 DeepSeek Harness Web 界面包装成一个桌面应用。
二、最终的目录结构
为了避免插件和缓存全部跑到 C 盘,我把主要数据统一放在:
D:\deepseek
目录规划如下:
D:\deepseek\app
用于存放解压后的 Electron 桌面程序。
D:\deepseek\dsh-home
用于存放 DeepSeek Harness 的配置、插件、技能、会话和存储数据。
D:\deepseek\dsh-home\profiles\web-desktop
这是桌面版专用的 profile。桌面版安装的插件及其 node_modules 主要位于这里。
D:\deepseek\eac-data\agent
用于存放已经安装的 DeepSeek Harness CLI 运行环境。
D:\deepseek\pnpm-store
用于存放 pnpm 下载的依赖包。
D:\deepseek\wallpaper-desktop-data
用于存放 Electron 的用户数据、Local Storage 和缓存。
通过这种方式,可以避免 DeepSeek Harness 的主要数据散落在 C 盘。
需要注意的是,Electron 和 Windows 仍可能读取少量系统用户信息,但插件、会话、pnpm 包和 Electron 用户数据都可以通过启动参数放到 D 盘。
三、便携版如何使用
下载 Windows x64 便携包后,需要完整解压。
建议解压到:
D:\deepseek\app
不要只复制里面的 EXE 文件。
Electron 除了 EXE,还依赖 resources、locales、DLL、PAK 等文件。只复制 EXE 会导致程序无法启动。
解压后,双击:
DeepSeek Harness桌面版-一键启动.vbs
启动脚本会自动设置:
DSH_HOME=D:\deepseek\dsh-home
npm_config_store_dir=D:\deepseek\pnpm-store
Electron 用户数据目录:
D:\deepseek\wallpaper-desktop-data
本地服务地址:
桌面版使用的 profile:
web-desktop
如果电脑上已经安装过 DeepSeek Harness EAC,启动器会优先复用现有的 Node.js 和 DSH CLI。
如果没有找到现有运行环境,Electron 桌面壳会尝试查找系统中的全局 dsh 命令。
因此,公开发布的压缩包只是 Electron 桌面壳,不应该包含作者自己的 API Key、会话数据或账号配置。
四、创建桌面快捷方式和开机自启
便携包中还包含:
安装桌面快捷方式和开机自启.vbs
双击后,它会创建:
桌面快捷方式
当前 Windows 用户的开机启动快捷方式
如果以后不需要开机自启,可以运行:
关闭开机自启.vbs
这个脚本只会删除启动目录中的快捷方式,不会删除桌面图标,也不会删除 D:\deepseek 中的数据。
五、为什么使用 VBS,而不是直接双击 EXE
直接双击 Electron EXE 时,无法保证它使用正确的数据目录和 DeepSeek Harness profile。
VBS 启动器可以在启动前统一设置环境变量,例如:
DSH_HOME
DSH_DESKTOP_URL
DSH_DESKTOP_PROFILE
DSH_DESKTOP_NODE
DSH_DESKTOP_WEB_ENTRY
npm_config_store_dir
NO_PROXY
同时,它还可以给 Electron 添加:
--user-data-dir="D:\deepseek\wallpaper-desktop-data"
这样可以保证每次都使用同一套 D 盘数据。
如果直接使用 Windows 应用 ID 启动旧版 EAC,可能会产生另一个使用 C 盘数据的实例。最后就会出现两个界面、两套插件和两套配置。
因此,最好始终通过同一个 VBS 启动器进入桌面版。
六、代理如何设置
如果访问 GitHub 或下载 Electron、npm 插件时需要代理,可以在 VBS 中增加:
env("HTTP_PROXY") = "http://127.0.0.1:7897"
env("HTTPS_PROXY") = "http://127.0.0.1:7897"
env("NO_PROXY") = "127.0.0.1,localhost"
其中 7897 是我本机 VPN 的 HTTP 代理端口,需要根据自己的代理软件修改。
如果不需要代理,只保留:
NO_PROXY=127.0.0.1,localhost
NO_PROXY 很重要,否则本地的 DeepSeek Harness 服务也可能被发送到代理服务器,导致 Electron 无法加载本地界面。
公开发布便携包时,不建议写死作者自己的代理地址。
七、pnpm Unexpected store location 是什么问题
安装插件时,我遇到过下面的错误:
ERR_PNPM_UNEXPECTED_STORE
错误信息表示当前 node_modules 原来链接到了:
C:\Users\用户名\AppData\Local\pnpm\store\v11
但现在 pnpm 又希望使用:
D:\deepseek\pnpm-store\v11
原因是同一份 node_modules 先使用了 C 盘 pnpm store,后来又切换到了 D 盘。
pnpm 不允许一套 node_modules 同时混用两个 store。
解决方法是先固定 store:
pnpm config set store-dir D:\deepseek\pnpm-store --global
然后进入对应 profile:
cd D:\deepseek\dsh-home\profiles\web-desktop
重新安装:
pnpm install
不要直接从另一个 profile 复制 node_modules,因为其中可能包含指向旧 pnpm store 的链接。
八、插件安装到哪里
桌面版使用独立的 profile:
web-desktop
所以桌面版插件一般安装在:
D:\deepseek\dsh-home\profiles\web-desktop\node_modules
这样可以把普通 Web 版插件和桌面专用插件分开。
如果插件安装成功但界面中没有出现,可以检查以下内容:
插件是否安装到了 web-desktop profile。
package.json、pnpm-lock.yaml 和 node_modules 是否一致。
pnpm store 是否仍然指向 D 盘。
是否彻底结束旧的 Electron 和 EAC 进程。
插件要求的是 window.desktopWindow,还是其他不兼容的桌面桥接 API。
有些插件虽然能在普通 Web 界面中运行,但桌面功能依赖 Electron preload。如果桌面壳没有提供插件需要的 API,插件就会提示“仅桌面版支持”。
九、Electron 打包方法
桌面壳使用:
Electron 37.10.3
@electron/packager
在项目目录执行:
cd D:\deepseek\wallpaper-desktop\desktop
pnpm run build
pnpm run package:win
打包输出目录为:
D:\deepseek\wallpaper-desktop\desktop\release\DeepSeek Harness桌面版-win32-x64
打包后会得到完整的 Windows x64 Electron 程序目录。
十、Compress-Archive 打包失败
部分精简版 Windows 缺少 PowerShell 的 Compress-Archive 模块。
原打包脚本通过 Compress-Archive 创建 Electron ZIP 缓存,因此会直接失败。
我将其改成使用 Windows 自带的 tar.exe:
tar.exe -a -c -f electron.zip .
tar.exe 的 -a 参数会根据扩展名自动选择 ZIP 格式。
这样即使系统没有 Compress-Archive,也能继续完成 Electron 打包。
十一、为什么完整程序有 300 多 MB
Electron 包含 Chromium、Node.js、V8、国际化资源、媒体组件和图形库,因此体积较大。
完整解压目录约为 300 MB。
压缩成 ZIP 后约为 128 MB。
这是正常现象。
如果只追求更小体积,可以考虑 WebView2 或 Tauri。但对于现有的 React Web UI、preload IPC、视频播放和插件系统,Electron 的兼容性更直接。
十二、双击后只有托盘图标,没有窗口
这种情况通常不是程序完全没有启动,而是以下问题之一:
旧的 Electron 或 EAC 实例仍在运行。
窗口被其他软件的覆盖层遮挡。
旧实例使用了不同的 user-data-dir。
DeepSeek Harness 本地服务没有成功启动。
Electron 加载的端口与 DSH 实际端口不一致。
可以先在任务管理器中结束旧的 Electron 和 Deepseek Harness EAC 进程,然后只通过统一的一键启动 VBS 重新进入。
不要同时使用旧 EAC 快捷方式和新的 Electron 桌面壳。
十三、为什么没有弹出网页地址
桌面版不会额外弹出浏览器页面。
Electron 已经直接在自己的窗口中加载:
如果只运行 dsh web,终端一般会输出网页地址。
使用 Electron 桌面壳时,这个地址直接显示在应用窗口中,所以不需要再打开浏览器。
十四、插件下载出现 404
如果插件依赖指向 GitHub Releases 中的固定 tgz 文件,而作者没有发布对应附件,就会出现 404。
例如依赖地址指向:
releases/latest/download/插件名-0.1.0.tgz
但 GitHub Release 中不存在这个文件,pnpm 就无法下载。
解决方法包括:
使用插件仓库的正确 GitHub 地址。
从源码本地执行 npm pack 或 pnpm pack。
把生成的 tgz 保存到本地目录。
在 profile 的 package.json 中使用 file: 本地路径。
需要注意,404 下载失败和 pnpm store 位置冲突是两类不同问题。
十五、开源项目和许可证
桌面壳参考或基于:
TianYa-DAO/dsh-wallpaper-engine
该项目使用 MIT License。
DeepSeek Harness、Electron、Chromium 和其他依赖应分别遵守各自许可证。
Electron 打包目录中的 Chromium 第三方许可证文件也应保留。
在博客或发布页面中,建议注明:
本文中的 DeepSeek Harness、Electron、Wallpaper Engine 等名称及商标归各自权利人所有。项目仅用于个人学习和技术交流。
十六、最终效果
完成后,使用方式就和普通 Windows 桌面软件差不多:
双击桌面图标。
DeepSeek Harness 本地服务自动启动。
Electron 窗口自动显示。
插件管理器可以直接使用。
插件、会话和主要缓存保存在 D 盘。
开机后可以自动运行。
Wallpaper Engine 动态壁纸可以显示在应用内部,也可以同步到 Windows 桌面。
整个方案分为三层:
DeepSeek Harness 负责模型、智能体、会话和插件。
Electron 负责桌面窗口和 Windows 系统能力。
VBS 负责数据目录、环境变量、一键启动和开机自启。
这种方式既保留了 DeepSeek Harness 的插件生态,又获得了类似 Codex 的 Windows 桌面使用体验。

108

被折叠的 条评论
为什么被折叠?



