前言¶
DeepSeek Harness(DSH)桌面端默认行为是:点窗口右上角关闭按钮后,主窗口隐藏到系统托盘,Harness 相关进程仍在后台运行。对习惯「关窗即结束会话」的开发者来说,容易误以为已经退出,托盘里却还在跑 agent 轮次、终端子进程和后台任务。官方目前没有开关把「关闭」改成「退出应用」。
社区插件 dsh-ExitOnClose(维护者 xia0x1,npm 包名 dsh-exit-on-close)针对这一点:装上后,点 × 会结束 Electron 壳层及整棵 DSH 进程树,而不是只藏窗口。下面介绍它的定位、安装方式和使用时要注意的行为。
这是什么¶
dsh-ExitOnClose 是 DSH 桌面端(Windows) 客户端插件,分类上属于客户端能力增强。它不注册工具、Slot 或路由,也不改共享配置;通过 bundle patch 挂载后,在 Windows 上监听「窗口从可见变为不可见」并触发进程终止。
行为对比(来自项目 README):
之前 点 × → 窗口隐藏,托盘图标还在,DSH 继续运行
之后 点 × → 窗口关闭,DSH 全部进程结束
当前版本 0.1.0,许可证 MIT。在 SkillHub 插件目录 可找到条目;源码与说明见 GitHub 仓库。
核心功能¶
- 关闭即退出:关闭按钮会结束 Electron 壳层及其进程树,包括运行插件的宿主子进程;窗口、托盘图标、进行中的 agent 轮次、后台任务、终端子进程一并消失。
- 零配置:安装并启用后即生效,README 未描述额外配置文件或插件页选项。
- 仅 Windows 桌面端:依赖
@koromix/koffi-win32-x64做 Win32 层窗口可见性轮询与进程树终止;其他平台或浏览器里的dsh web未兼容。 - 隔离性:不声明
@deepseek-ai/dsh*peer 依赖,不注入或消费 DSH 服务;koffi懒加载,加载失败时只记日志,不影响其他插件或 profile 启动。
安装与启用¶
图形界面¶
在 DSH 桌面端打开插件页面,粘贴仓库 GitHub 链接:
https://github.com/xia0x1/dsh-ExitOnClose
命令行¶
在 PowerShell 中执行(# 后可跟分支或 tag 固定版本):
dsh plugin --profile desktop add https://github.com/xia0x1/dsh-ExitOnClose
dsh plugin --profile desktop add https://github.com/xia0x1/dsh-ExitOnClose#v0.1.0
本地开发时,可将 URL 换成本地目录路径。
停用:插件页关闭 dsh-exit-on-close。
卸载:插件页对 dsh-exit-on-close 执行卸载。
插件以当前 DSH 进程权限运行;安装前建议自行阅读仓库源码与 MIT 许可证。
典型用法与调试¶
日常使用没有额外步骤:启用插件后,照常点窗口关闭即可。
若想在不真正杀进程的前提下观察「关闭时会结束什么」,README 提供安全模式:设置环境变量后再启动桌面端:
DSH_EXIT_ON_CLOSE_DRY_RUN=1
此模式下关闭按钮只记录、不结束进程。
开发者可在仓库根目录跑纯逻辑单元测试(README 说明零依赖):
node --test "test/*.test.mjs"
仓库还提供 tools/dry-run.mjs 作为手动探针,只打印信息、不实际终止。
适用场景与注意事项¶
适合谁
- 在 Windows 上使用 DSH 桌面版,希望关窗后 Harness 完全退出、不在托盘常驻。
- 需要明确区分「隐藏窗口」与「结束全部 DSH 进程」的场景。
务必知晓
- 强制终止,非优雅退出:已落盘的会话、附件、日志仍在(DSH 运行中会落盘);进行中的模型输出与正在跑的子进程会丢失。
- 首次关闭:可能先出现官方「任务会继续,可从托盘打开」类提示,确认一次后不再出现(README 行为说明)。
- 版本兼容:作者在 README 中写明已在 DSH 桌面版
0.2.0-rc.2/0.2.1-rc.2(Electron 44 / Node 24 / Windows x64)验证;其他版本未测试。 - 生态说明:DSH 社区插件目录(如 SkillHub)为独立站点,与 DeepSeek / 幻方无官方从属关系;安装第三方插件前核对来源与代码是常规做法。
原理简述(可选阅读)¶
桌面端大致分为处理关闭按钮的 Electron 壳层,以及运行插件的宿主子进程。壳层只接受固定 IPC,插件无法直接请求其退出;关闭按钮又是原生控件,页面内难以观测。插件因此用 koffi 以约每秒 4 次轮询顶层窗口是否可见,捕获「曾经上屏 → 全部不可见」的跃迁,再依次终止壳层、其进程树与自身;选用轮询而非 Win32 钩子,是为了避免长期持有钩子状态。
结尾¶
若你的痛点是「点 × 后 DSH 还在托盘里跑」,dsh-ExitOnClose 用最小安装成本把关闭按钮改成整应用退出;接受强制终止带来的未保存输出风险,并仅在 Windows 桌面端使用时,可以按上文链接安装。
- 目录页:https://www.skillhub.cn/plugins/xia0x1/dsh-ExitOnClose
- GitHub:https://github.com/xia0x1/dsh-ExitOnClose