前言¶
用 dsh 的 web profile 时,常见流程是开一个终端跑 dsh --profile web,再在浏览器里访问本地端口。终端一关,服务跟着退出,下次还得再来一遍。dsh-desktop-shell 把这串动作收敛成一个桌面图标:双击后自动检测本地 dsh web 服务器,没起来就替你启动,然后在原生窗口打开 web UI,关窗口只是缩到系统托盘。下面介绍它的做法、安装步骤和几个使用注意。
这是什么¶
dsh-desktop-shell 是 DeepSeek Harness(dsh)的桌面启动器外壳:一个托盘常驻的 Electron 薄封装,负责启动或复用本地 dsh web 服务器,并在原生窗口中打开 web UI。作者为 ikashana,MIT 许可,package.json 中版本号为 0.1.0,devDependencies 里有 electron ^43.4.0。
它由两部分组成:dsh 侧是一个 profile bundle,安装进 web profile 后打补丁、挂 glue 插件;桌面侧是 Electron 应用本体,负责窗口、托盘和 web 服务器生命周期。
核心功能¶
双击应用后,它会先检查 dsh web 服务器是否已在监听(默认 http://127.0.0.1:3080),未监听则自动启动,随后在原生窗口打开 web UI。在此基础上:
- 托盘常驻:关闭窗口只是隐藏到系统托盘而非退出,托盘菜单提供打开主窗口、退出两项。
- 单实例:再次启动会聚焦已有窗口,不会开出第二份。
- 所有权感知:由 shell 启动的 web 服务器,在 shell 退出时一并停止;你自己在终端或用其他工具预先启动的服务器不受影响。
- 可配置:dsh 命令、工作目录、额外环境变量、端口、窗口标题都在
config.json里设置。 - 日志:把
shell.log和web.log写入 Electron 的 userData 目录(Windows 下是%APPDATA%\dsh-desktop-shell\)。
第一步:安装 dsh 侧的 bundle¶
这个仓库同时是一个 dsh profile bundle:package.json 声明了 dsh.bundle.patch,安装进 web profile 后会激活一个补丁层,把 web 服务器固定到 loopback 127.0.0.1:3080,并挂载一个 glue 插件——打印 ready 行,服务器绑定超出 loopback 时给出警告。
从 git checkout 安装:
dsh plugin --profile web add github:ikashana/dsh-desktop-shell
从 npm 安装(README 标注为 once published,npm 包发布前这条命令可能不可用):
dsh plugin --profile web add dsh-desktop-shell
装完后照常启动 dsh web(dsh --profile web),也可以什么都不做,让下面的桌面 shell 替你启动。
第二步:安装桌面应用¶
要求 Node.js ≥ 18(Electron 在 npm install 时下载):
git clone https://github.com/ikashana/dsh-desktop-shell.git
cd dsh-desktop-shell
npm install
cp config.json.example config.json
npm start
唯一必须改的是 dshCommand(如果 dsh 不在当前目录,还有 cwd)。指向你的 dsh CLI,或指向源码安装的 node + 入口文件,例如:
{
"dshCommand": ["C:/path/to/node.exe", "--import", "tsx/esm", "apps/cli/src/bin.ts", "--profile", "web"],
"cwd": "C:/path/to/deepseek-harness"
}
config.json 配置项¶
| 字段 | 默认值 | 含义 |
|---|---|---|
port |
3080 |
web 服务器监听端口。若修改,需与 bundle 补丁层的 webserver.port 保持一致 |
dshCommand |
["dsh", "--profile", "web"] |
启动 dsh web 服务器的命令 argv |
cwd |
shell 目录 | dshCommand 的工作目录 |
env |
{} |
web 进程的额外环境变量 |
title |
dsh Desktop |
窗口与托盘标题 |
Windows:用 node.exe 绝对路径¶
裸写 dsh 会经过 .cmd shim 解析,child_process 在无 shell 时拒绝 spawn(CVE-2024-27980 加固)。shell 自己能处理这种情况,但写显式可执行文件最可靠,比如上面示例中的 C:/path/to/node.exe。
Windows:创建桌面快捷方式¶
用 WScript.Shell 创建 .lnk,指向 node_modules\electron\dist\electron.exe 并以项目目录为参数:
$WshShell = New-Object -ComObject WScript.Shell
$lnk = $WshShell.CreateShortcut("$HOME\Desktop\dsh Desktop.lnk")
$lnk.TargetPath = "C:\path\to\dsh-desktop-shell\node_modules\electron\dist\electron.exe"
$lnk.Arguments = "`"C:\path\to\dsh-desktop-shell`""
$lnk.WorkingDirectory = "C:\path\to\dsh-desktop-shell"
$lnk.IconLocation = "C:\path\to\dsh-desktop-shell\assets\icon.ico"
$lnk.Description = "dsh Desktop · DeepSeek Harness launcher shell"
$lnk.Save()
日志与排错¶
web 服务器起不来时,先看日志。shell 把 shell.log 和 web.log 写在 Electron 的 userData 目录,Windows 下是 %APPDATA%\dsh-desktop-shell\。
适用场景与注意¶
适合的人:在 Windows 上使用 dsh web profile,希望像普通桌面应用一样双击启动、关窗缩托盘、不用手动管服务器进程的人。托盘行为是跨平台的,但作者在 Windows 上开发并测试;进程树终止在 Windows 用 taskkill,其他平台回退到 kill()。
三点注意:
- 插件以当前 dsh 进程的权限运行,安装前建议阅读源码并确认许可证。该项目为 MIT;
assets/favicon.svg复制自 MIT 许可的 deepseek-harness 仓库。 - npm 安装命令在 README 中标注为 once published,npm 包发布前请用 git checkout 方式安装。
- 修改
port时,记得同步 bundle 补丁层里的webserver.port,否则两边对不上。
结语¶
dsh-desktop-shell 做的事不大但具体:把「起终端、跑命令、开浏览器」收敛成一次双击,再用所有权感知保证不误伤你手动起的服务器。项目主页在 GitHub:https://github.com/ikashana/dsh-desktop-shell;社区目录收录页在 https://www.skillhub.cn/plugins/ikashana/dsh-desktop-shell(社区站点,与 DeepSeek / 幻方无官方从属关系)。