dsh-desktop-shell:dsh web 的托盘常驻启动器

前言

用 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。在此基础上:

  1. 托盘常驻:关闭窗口只是隐藏到系统托盘而非退出,托盘菜单提供打开主窗口、退出两项。
  2. 单实例:再次启动会聚焦已有窗口,不会开出第二份。
  3. 所有权感知:由 shell 启动的 web 服务器,在 shell 退出时一并停止;你自己在终端或用其他工具预先启动的服务器不受影响。
  4. 可配置:dsh 命令、工作目录、额外环境变量、端口、窗口标题都在 config.json 里设置。
  5. 日志:把 shell.logweb.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.logweb.log 写在 Electron 的 userData 目录,Windows 下是 %APPDATA%\dsh-desktop-shell\

适用场景与注意

适合的人:在 Windows 上使用 dsh web profile,希望像普通桌面应用一样双击启动、关窗缩托盘、不用手动管服务器进程的人。托盘行为是跨平台的,但作者在 Windows 上开发并测试;进程树终止在 Windows 用 taskkill,其他平台回退到 kill()

三点注意:

  1. 插件以当前 dsh 进程的权限运行,安装前建议阅读源码并确认许可证。该项目为 MIT;assets/favicon.svg 复制自 MIT 许可的 deepseek-harness 仓库。
  2. npm 安装命令在 README 中标注为 once published,npm 包发布前请用 git checkout 方式安装。
  3. 修改 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 / 幻方无官方从属关系)。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜