dsh
OpenPetsHQ/openpets将 DeepSeek Harness 的生命周期状态、错误与审批请求,桥接到本地运行的 OpenPets 桌面伙伴。
为运行在 WSL 的 DSH 提供 Windows 桌面快捷方式和系统托盘启动器:完全隐藏启动,托盘菜单支持打开/重启/退出,插件配置页可管理快捷方式。
中文 | English
为运行在 WSL 里的 DeepSeek Harness(DSH)提供 Windows 桌面快捷方式与系统托盘启动器。
watchdog.log(详见下文「守护进程」)。wscript.exe + VBS 完全隐藏启动。WSL_DISTRO_NAME 已设置,或 /mnt/c 可访问)。wscript.exe / powershell.exe / wsl.exe。发布到 npm 后,在 DSH web profile 中执行:
dsh plugin --profile web add dsh-wsl-tray
或手动加入 profile:
cd ~/.dsh/profiles/web
pnpm add dsh-wsl-tray
并把 "dsh-wsl-tray" 加入 package.json 的:
"dsh": {
"profile": {
"bundles": [
"@deepseek-ai/dsh-base",
"@deepseek-ai/dsh-web-app",
"dsh-wsl-tray"
]
}
}
重启 dsh web,然后打开 设置 → WSL 桌面与托盘 即可看到该页面。
托盘永远不用 src 启动 checkout。用 tsx 跑 src 时,插件包会按 runtime 解析模式从
lib 加载,同一个包在一个进程里出现两份实例;Symbol 不跨实例共享,于是工具状态取到
undefined、调用工具直接报错。因此 start.sh 只会启动 checkout 的构建产物:
cd ~/deepseek-harness
pnpm run build # 必须执行一次;之后每次改源码都要重新构建
然后在 设置 → WSL 桌面与托盘 里把源码路径填上(填仓库根目录或它的 apps/cli
目录都可以)。配置了路径之后:
start.sh 优先执行 node <checkout>/apps/cli/lib/bin.js web --no-open —— 既不用
src,也不会被 PATH 上的另一个 dsh 抢走。~/.dsh/dsh-wsl-tray/start.log 并退出,
而不是悄悄换成别的安装版本运行。DSH_WSL_TRAY_AUTO_BUILD=1,脚本会在产物缺失时自己跑
pnpm run build(完整构建较慢,因此默认关闭)。WARN ... newer than the build output 日志,
避免「改了源码却像没生效」这种排查噩梦。已知限制:新鲜度检查只扫描 <checkout>/apps/cli/src,改 packages/ 下的源码不会被
检测到,改完记得自己跑一次 pnpm run build。
插件会在以下位置写入五个生成文件:
| 文件 | 位置 |
|---|---|
dsh.ico | %USERPROFILE%\.dsh\dsh-wsl-tray\dsh.ico |
dsh-tray.ps1 | %USERPROFILE%\.dsh\dsh-wsl-tray\dsh-tray.ps1 |
dsh-tray.vbs | %USERPROFILE%\.dsh\dsh-wsl-tray\dsh-tray.vbs |
start.sh | ~/.dsh/dsh-wsl-tray/start.sh |
stop.sh | ~/.dsh/dsh-wsl-tray/stop.sh |
并创建:
%USERPROFILE%\Desktop\DeepSeek Harness.lnk
托盘运行期间,守护进程会维护两个运行期文件(设置页面上都能看到):
| 文件 | 位置 |
|---|---|
watchdog.log | %USERPROFILE%\.dsh\dsh-wsl-tray\watchdog.log(512KB 自动滚动) |
watchdog-status.json | %USERPROFILE%\.dsh\dsh-wsl-tray\watchdog-status.json(每次探测更新) |
快捷方式指向 wscript.exe,通过 dsh-tray.vbs 隐藏启动托盘 PowerShell;托盘再通过
WScript.Shell.Run(..., 0, false) 隐藏启动 WSL 中的 start.sh。
守护进程放在托盘里运行(托盘是唯一刻意独立于 DSH 的常驻进程),它回答了重启守护的 三个核心问题:
probeIntervalSec(默认 10 秒)对 DSH 网址做一次
Invoke-WebRequest HTTP 探测(超时 3 秒)。每次探测都会记录状态码或错误文本,
因此「连接被拒(无进程监听)」「超时(服务器卡死)」「异常状态码」在日志里是可以
区分的。连续 downThreshold(3)次探测失败才会判定 DSH 失活。wsl.exe 停止再启动)后,等待
restartWaitSec(180 秒)内网址重新有响应:有响应 = 重启成功,失败计数清零;
窗口内没响应 = 本次重启失败。连续 maxRestartFailures(3)次失败后守护进程
暂停自动重启,不再无限重试。可通过托盘菜单「恢复守护进程」手动恢复,DSH
一旦恢复响应也会自动恢复。watchdog.log;当前状态机快照每次探测写入 watchdog-status.json。
设置页面通过 /dsh-wsl-tray/watchdog 和 /dsh-wsl-tray/watchdog-log 暴露它们。状态机:starting(启动宽限期)→ probing(稳态探测)→ restarting(重启后等待)
→ backoff(冷却)或 paused(放弃/手动暂停)。上面的调参值烘焙在生成的
dsh-tray.ps1 里;改 src/artifacts.ts 的 DEFAULT_WATCHDOG_CONFIG 后重新生成即可。
如果暂时不想注册 npm 账号,可以直接安装仓库里已生成的预构建 tarball:
cd ~/.dsh/profiles/web
pnpm add /path/to/dsh-wsl-tray-github/dist/dsh-wsl-tray-0.1.7.tgz
然后按上面的方式把 "dsh-wsl-tray" 加入 profile 的 dsh.profile.bundles。
wscript.exe -> VBS -> 隐藏 PowerShell 托盘。start.sh 让 DSH 在隐藏 wsl.exe 会话中前台运行,因此 WSL 不会在
一次性启动器退出后回收进程。Start-Process $webUrl 打开默认浏览器。dsh-tray.ps1 -Regenerate 逻辑。npm install
npm run typecheck
npm test
npm run build
npm pack --dry-run
stop.sh 同时停止守护进程和
它启动的 DSH 实例(PID 文件精确跟踪 start.sh 启动的实例,另有模式兜底覆盖源码、
npm 全局、npx 三种 bin.js web 启动方式)。若希望开机后就有守护,可把快捷方式加入
Windows 启动文件夹。wsl --shutdown)。