前言¶
DeepSeek Harness Desktop 默认只有一种关闭动作:点关闭就是退出。日常挂在后台跑 Agent 的人会碰到两个具体问题——想暂时收起窗口但让任务继续跑,只能靠关掉再重开;想把某个会话或整个工作区单独拉出来看,也没有入口。DSH 的窗口和退出逻辑不在插件运行时里,插件只跑在 Host(Node 子进程)和 Web 前端,拿不到窗口 IPC。
下面介绍 lczment 维护的插件 dsh-window。它把关闭行为做成可选(最小化到后台 / 完全退出 / 每次询问),并支持把单个会话或整个工作区开进独立子窗口。注意这是第三方扩展,不是 DeepSeek 官方组件,壳扩展部分会直接改本机安装目录的 resources/app。
这是什么¶
dsh-window 是 DeepSeek Harness Desktop 的客户端插件,由 lczment 维护,MIT 协议,npm 包 @lczment/dsh-window@0.1.0。它解决上面说的两个动作缺口:关闭窗口时由你决定退到托盘还是完全退出,以及把会话 / 工作区开成子窗口。
项目分两部分:插件(index.js / client.js)负责设置页、侧栏按钮、会话行按钮和关闭对话框的 UI,加上 Host 侧路由;壳扩展(shell/install.mjs)注入 Electron 主进程,接管窗口关闭、创建子窗口、读写共享配置。只装插件的话,设置页和多开按钮会出现,但顶部会提示壳扩展未安装,关闭窗口仍走 DSH 原行为。
核心功能¶
关闭行为可选:关闭主窗口时弹出与主界面同风格的对话框,选项是最小化到后台、完全退出、取消,可勾选「记住我的选择」。
设置页:设置 →「窗口与多开」里有三个选项(每次询问 / 最小化到后台 / 完全退出),立即生效,与关闭对话框共用同一份配置。
侧栏快捷入口:侧栏底部、设置齿轮上方新增「多开」按钮(窄栏只显示图标),点开可改关闭行为或把目标丢进子窗口。
每会话独立窗口:会话行悬停时,在「…」菜单旁出现窗口图标,点击即把该会话开进新窗口。
工作区整窗:设置页里每个工作区有 Open workspace,把整个工作区开进新窗口。
后台保活:选「最小化到后台」后进程与 Agent 继续运行,托盘图标可以重新打开或退出。
另外插件内按钮带 120ms 悬停过渡,系统开启「减少动画」时自动关闭位移效果。安装 / 升级收尾通过隐藏的 wscript 启动,不会闪控制台窗口。
安装与启用¶
前置条件:Windows、DeepSeek Harness Desktop 0.2.1-rc.5 或更新、Node.js 可用。两个步骤要分开做,先装插件,再装壳扩展。
第一步,装插件。已发布到 npm,命令如下:
dsh plugin add @lczment/dsh-window
也可以在 设置 → 插件 → 发现 里搜索 DSH Window,或直接按仓库安装:
dsh plugin add github:lczment/dsh-window
装完打开 设置 → 窗口与多开,应能看到设置页。
第二步,装壳扩展。这一步要写入 D:\DeepSeek Harness(或你的安装目录),并以当前用户运行 PowerShell:
# 在仓库根目录
node tools/install-shell-extension.mjs --stage-only
# 注册隐藏的收尾任务(每分钟检查一次,成功后自动删除)
powershell -NoProfile -ExecutionPolicy Bypass -File tools/register-completion-task.ps1
# 然后:托盘图标 → 退出。约一分钟内应用会带着扩展重启
--stage-only 做的是:解包 resources/app.asar → resources/app、叠加 app.asar.unpacked、给 lib/main.js 打补丁(关闭钩子、子窗口 WebSocket 白名单、子窗口 IPC 放行)、给 lib/preload-app.cjs 加 window.dshWindow 桥,然后等应用退出时把 app.asar 改名为 app.asar.orig。应用正在运行时 app.asar 被占用,所以切换必须等退出后由收尾任务完成。
通过市场 / npm 安装时,插件位于 %USERPROFILE%\.dsh\profiles\desktop\node_modules\@lczment\dsh-window(设置了 DSH_HOME 则在 %DSH_HOME%\profiles\desktop\node_modules\@lczment\dsh-window),把上面命令里的 tools/ 换成该目录下的 tools/ 即可。安装目录不是默认的 D:\DeepSeek Harness 时,先设置环境变量:
$env:DSH_DESKTOP_ROOT = 'E:\Apps\DeepSeek Harness'
收尾任务有 75 秒健康检查:启动后扩展没写日志、或补丁缺失,会自动回滚到原版 app.asar 并重启,不会把应用留在坏状态。
第三步,验证。设置页顶部显示绿色 “Desktop shell extension is installed”;关闭主窗口出现对话框;侧栏会话悬停出现窗口图标。
配置与行为¶
配置文件在 %USERPROFILE%\.dsh\desktop\window-policy.json(DSH_HOME 存在时用 $DSH_HOME\desktop\window-policy.json):
{ "closeAction": "ask" }
三个取值:ask 是每次关闭都询问(默认),background 直接隐藏到托盘,quit 直接退出。关闭对话框勾选「记住我的选择」会写入同一文件;设置页修改后立即广播给所有窗口。
典型用法¶
把某个长任务的会话单独开出来:会话行悬停 → 点窗口图标,新窗口加载该会话。子窗口与主窗口共享同一份登录 cookie 与 Host 连接,会话数据是同一个 runtime。
把整个工作区整体隔离到独立窗口:设置 →「窗口与多开」里点该工作区的 Open workspace。
收窗口不退任务:在设置页选「最小化到后台」或在关闭对话框勾选「记住我的选择」,之后关主窗口只会把应用收到托盘,Agent 继续跑,可以从托盘图标重新打开或退出。
改回原行为:把关闭行为设为「每次询问」即可,对话框每次弹出。
适用场景与注意¶
适合 Windows 上用 DeepSeek Harness Desktop、希望关窗不退、或需要把会话 / 工作区拆到子窗口并行看的人。
几条必须说清楚的限制:壳扩展只支持 Windows(依赖 DSH 的 win32 托盘、titleBarOverlay 与 PowerShell 脚本);它是对本机安装目录的补丁,不是官方扩展点,DSH 升级后 resources/app.asar 会被新文件替换,旧补丁失效,需要重跑第 2 步那条收尾命令;插件运行在当前 dsh 进程权限下,壳扩展要写安装目录,安装前应先检查 shell/install.mjs 与仓库源码、确认 MIT 许可证;前端尚未就绪时关闭对话框回退到系统原生对话框;只装插件不装壳扩展的话,关闭行为不会改变。
DSH 升级后重新执行安装脚本即可:
node tools/install-shell-extension.mjs --stage-only
powershell -NoProfile -ExecutionPolicy Bypass -File tools/register-completion-task.ps1
插件部分通常不需要重装。卸载则先退出应用,运行 tools/uninstall-shell-extension.ps1(会恢复 app.asar.orig、删除 resources/app 与 resources/dsh-window-extension),再在 设置 → 插件 里移除本插件。
小结¶
dsh-window 的价值在于把 DSH Desktop 里原本写死的关闭动作和单窗口结构变成可选项,不需要自己改官方代码。它由 lczment 个人维护(当前星标 0,客户端分类),功能边界和补丁式安装方式在 README 里都写得很清楚,装之前按上面的注意项核对一遍即可。
目录页:https://www.skillhub.cn/plugins/lczment/dsh-window
GitHub:https://github.com/lczment/dsh-window