dsh-plugin-always-on-top:在 Composer 里一键置顶 DeepSeek Harness 桌面窗口

前言

用 DeepSeek Harness 桌面版写智能体或长对话时,经常需要同时对照终端、浏览器或 IDE。系统窗口层级一换,Harness 就被盖住,只能反复切窗口。macOS 上改 app.asar 可以动窗口层级,但会破坏代码签名,往往还要重启两次。下面介绍社区插件 dsh-plugin-always-on-top(维护者 jeremytenjo),在 Composer 里加一颗图钉按钮,通过本地 Host 路由和短时 Node inspector 调用 BrowserWindow.setAlwaysOnTop,不改 /Applications 下的应用包。

这是什么

dsh-plugin-always-on-top 是 DeepSeek Harness 的客户端类插件:在 Composer 中、紧邻 source control 与 backlog 触发器之间,增加一个 28×28 的置顶开关。关闭时为灰色描边图钉;点击后置顶,图标变为填充白色图钉;再点一次恢复普通层级。悬停时显示与其他 Composer 操作一致的原生标题(英文为 “Toggle always on top”)。插件读取真实的 BrowserWindow.isAlwaysOnTop(),不是仅改 UI 状态;页面 reload 后若窗口仍置顶,状态会保持。当前版本在 package.json 中为 1.0.3,许可证 MIT。

核心功能

  • 一颗 Composer 内按钮,紧挨 source control。
  • 关:描边图钉;开:填充白色图钉;中英文标签。
  • 原生 hover 标题。
  • 状态来自 Electron BrowserWindow.isAlwaysOnTop();置顶状态下 survive 页面 reload。
  • 加载插件后无需改 app.asar、无需重签名、无需为此重启(首次链入 profile 后需完全退出再打开应用,见安装节)。
  • 仅桌面客户端:dsh web 无 Electron 父进程时按钮禁用并说明原因。
  • 主要面向 macOS 与 Linux;Windows 走 process._debugProcess,README 标明未充分测试。

安装与启用

桌面应用不自带 dsh CLI,README 推荐本地 checkout 并用 profile 链接安装。

先克隆仓库并执行安装脚本:

git clone https://github.com/jeremytenjo/dsh-plugin-always-on-top.git
cd dsh-plugin-always-on-top
python3 scripts/install-local.py

脚本会:备份 ~/.dsh/profiles/desktop/package.json;在 dependencies 中加入 "dsh-plugin-always-on-top": "link:/path/to/this/checkout";把 dsh-plugin-always-on-top 追加到 dsh.profile.bundles;创建 node_modules 符号链接。

然后完全退出 DeepSeek Harness(托盘图标 → Quit;只关窗口只会隐藏),再重新打开,Composer 里会出现图钉按钮。若使用非默认 profile,可设置环境变量 DSH_DESKTOP_PROFILE 指向对应 profile。

手动安装

也可手改 ~/.dsh/profiles/desktop/package.json(追加 bundle,不要替换整个 bundles 数组),并手动 ln -s 到 node_modules,步骤见 GitHub README。完成后同样完全退出再打开。

卸载

cd dsh-plugin-always-on-top
python3 scripts/install-local.py --uninstall

完全退出并重新打开应用。备份文件 package.json.bak-always-on-top 会保留供参考。

典型用法

  1. 完成安装并重启桌面 Harness 后,在 Composer 找到 source control 旁的图钉按钮。
  2. 窗口被其他应用盖住时,点一次:图标变为填充白色,Harness 窗口浮在其他窗口之上(setAlwaysOnTop(value, 'floating'))。
  3. 不再需要置顶时,再点一次释放。
  4. 若页面打开期间有其他途径改了窗口层级,reload 页面以重新同步状态。

README 说明:退出 Harness 再打开后不会记住置顶状态;全屏应用若在另一 Space,仍可能盖住 Harness。

工作原理与安全(安装前宜读)

Desktop Host 是 Node 模式子进程,拿不到 BrowserWindow;官方 shell 也没有窗口层级的 IPC。本插件走更小的路径:客户端按钮 → GET/POST /__dsh/always-on-top → Host 通过 SIGUSR1 短时打开 Electron main 的 Node inspector → 在 main 里执行固定的 setAlwaysOnTop / isAlwaysOnTop 表达式 → finally 里关闭 inspector。若 toggle 前 inspector 已打开,插件不会动它。

这是面向本地进阶用户的工具:toggle 过程中 main 进程会在 127.0.0.1:9229(或下一个空闲端口)短暂暴露 Node inspector;同机进程若在该窗口连接,理论上可在 main 里执行代码。插件在 toggle 结束后立即关闭 inspector,不留下长期 eval 端点。若不能接受这一权衡,README 建议不要安装,并指向改用 app.asar 路线的 dsh-window-control(自带签名相关注意)。

插件会先读 Electron fuse:当前文档写明在 DeepSeek Harness 0.2.1-rc.3(Electron 44)上 EnableNodeCliInspectArguments 为启用;若未来构建关闭该 fuse,插件拒绝发 SIGUSR1(避免误杀进程),按钮会提示窗口调试不可用。README 在 macOS(Apple silicon)上使用该版本与 Electron 44.7.0 做过测试。

适用场景与注意

  • 适合:需要在 macOS/Linux 桌面 Harness 上边写对话边盯终端或文档、又不想改 asar 签名的开发者。
  • 不适合:纯 dsh web 终端会话;对短时 localhost inspector 暴露零容忍的环境。
  • 插件以当前 DSH 桌面进程权限运行;安装前应阅读 仓库源码 与 MIT 许可证,自行判断是否信任 maintainer 的实现(含 debugger 控制通道)。
  • 若 inspector 端口段被其他调试器占用,toggle 会失败并在 tooltip 中报错。

DeepSeek Harness 生态强调「一切皆插件」;SkillHub 目录页 为社区站点,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-plugin-always-on-top 把「窗口始终置顶」收成 Composer 里的一键切换,避开 asar 改写与重签名,代价是 toggle 时短暂的本地 inspector 窗口。需要细节、手动安装与开发说明时,以 GitHub 为准:

  • 目录页:https://www.skillhub.cn/plugins/jeremytenjo/dsh-plugin-always-on-top
  • 仓库:https://github.com/jeremytenjo/dsh-plugin-always-on-top
羽毛球分组比赛记分
小程序二维码

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

小夜