dsh-power-button:为 DSH 桌面版补上可拖动的重启与退出入口

前言

DeepSeek Harness(DSH)桌面版日常用 Electron 壳承载宿主与浏览器界面。发布版里,托盘菜单往往没有「重启」:想干净重开通常要先退出,再从开始菜单重新打开。长时间挂着 agent、改 profile 或排查问题时,少这一格入口会多一步操作。

dsh-power-button 是社区插件(维护者 WhichWitchWin,分类:客户端),给桌面 GUI 补两个可单独开关的电源入口:可拖动、贴边收起的悬浮按钮,以及侧栏头像行旁的电源图标。二者弹出同一菜单,可选重启 DSH 或退出 DSH。插件仅支持 Windows,纯 JavaScript、零 npm 运行时依赖,通过官方 bundle 槽位挂载,不依赖去读其他插件的 DOM。

下面介绍它解决什么问题、怎么装、怎么用,以及安装前需要知道的边界。

这是什么

项 说明
包名 dsh-power-button(npm 当前 0.1.0)
仓库 WhichWitchWin/dsh-power-button
目录页 SkillHub 插件页
许可证 MIT
平台 Windows(taskkill、WMI、Windows PowerShell 5.1)
对等依赖 @deepseek-ai/dsh >= 0.2.0-rc.2

DSH 生态里客户端能力常以插件形式扩展;SkillHub 等目录是社区站点,与 DeepSeek / 幻方无官方从属关系。本插件以当前 DSH 进程权限运行,安装前建议自行查看源码与许可证。

核心功能

  1. 悬浮电源按钮
    可拖动;靠近左右边缘会吸附并收成细边,鼠标移到细边上再展开。点击弹出「重启 DSH / 退出 DSH」。上下边缘故意不做吸附,避免挡住窗口控件和输入框。位置保存在浏览器 localStorage。

  2. 侧栏电源图标
    落在侧栏头像行、头像左侧,形态与官方图标按钮一致,菜单与悬浮按钮相同。与 @linxin666/dsh-web-all 等同位置时走同一官方槽位,不依赖其他插件样式。

  3. 有任务在跑时的二次确认
    仅当宿主报告有 agent(含子代理)正在运行时弹出确认;空闲时直接执行。宿主无法作答时按「有任务」处理。

  4. 插件管理器内分项开关
    卡片开关管整个包;配置页另有「悬浮电源按钮」「侧栏底部电源图标」,改动即时生效、无需刷新。

重启语义上,插件从外部复刻一次「退出再按原命令行拉起」:Electron 主进程的 app.relaunch() 未对插件开放,因此宿主通过 loopback API 启动脱离应用进程树的 PowerShell 辅助脚本完成杀树、等端口、再起实例。退出路径使用 taskkill。

安装与启用

安装会修改 profile 的 package.json 与 pnpm-lock.yaml,建议先备份:

Copy-Item "$env:DSH_HOME\profiles\desktop\package.json" `
  "$env:DSH_HOME\profiles\desktop\package.json.bak" -Force

方式一:从 npm 安装(推荐)

只有此方式会被插件管理器的「检查更新」识别(对 registry 直装包做版本比对)。

& 'D:\DeepSeek Harness\resources\runtime\cli\bin\dsh.cmd' `
  plugin --profile desktop add dsh-power-button

方式二:本地目录

& 'D:\DeepSeek Harness\resources\runtime\cli\bin\dsh.cmd' `
  plugin --profile desktop add 'D:\path\to\dsh-power-button'

方式三:从 GitHub 直接装

& 'D:\DeepSeek Harness\resources\runtime\cli\bin\dsh.cmd' `
  plugin --profile desktop add 'github:WhichWitchWin/dsh-power-button#main'

CLI 路径以本机 DSH 安装目录为准,且须使用桌面版自带的 dsh.cmd(带 manageDesktopProfile);PATH 里其他 dsh 可能对 desktop profile 报错。三种方式都会写入 profile 依赖并激活 dsh.bundle.patch。装完后托盘退出 DSH 再打开一次,两个界面才会出现。包内 lib/ 为可直接加载的成品,无构建步骤。

卸载:

& 'D:\DeepSeek Harness\resources\runtime\cli\bin\dsh.cmd' `
  plugin --profile desktop remove dsh-power-button

典型用法

操作 结果
拖动悬浮按钮 移动;松手靠近左右边缘则吸附并收起
鼠标移到细边 展开;移开收回
点击按钮 打开电源菜单
点击菜单外空白 关闭菜单,控件回到细条
Esc 关闭菜单
Enter / Space 等同点击按钮

在插件配置页可分别关闭悬浮或侧栏入口。持久化配置写在 profile 目录下的 dsh-power-button.json,例如:

{ "floating": true, "sidebar": true }

若重启时在日志里看到 WARNING: proceeding after ...s,可在 bundle patch 里为宿主半调高等待上限(默认 settleMs 500、waitForExitSeconds 20):

- insert:
    - id: ui-restart-button
      name: 'dsh-power-button'
      config:
        settleMs: 800
        waitForExitSeconds: 30

排障日志:restart-button.log;拒绝标记 restart-button.refused。目录解析顺序为 $DSH_HOME\logs → 从宿主 profile 反推 → %TEMP%。

适用场景与注意

适合谁

  • 主要在 Windows 上使用 DSH 桌面版,希望界面内一键重启或退出,而不必每次从开始菜单重开。
  • 需要悬浮快捷入口,或习惯在侧栏底部操作的用户。

务必知晓的边界

  • 仅 Windows;macOS / Linux 返回 supported: false 并隐藏 UI。需要 WMI 可用。
  • dsh web 终止模式下两个界面均不出现。
  • 重启等价于退出再打开:不保证恢复界面状态,进行中的回合不会自动续上;有任务时强杀是固有代价,确认框会说明。
  • 重启后新窗口会尽量置前,但不保证立即获得键盘焦点。
  • 侧栏布局依赖 CSS :has() 与外壳 class 后缀;不支持时侧栏重排失效,悬浮按钮不受影响。

插件对破坏性 REST 动作做了 loopback、Host/Origin 与一次性闸门等护栏,细节见仓库 README 的「安全护栏」一节。

结尾

dsh-power-button 填的是发布版桌面 GUI 里「界内重启/退出」这一格:双入口、可分项关闭、有 agent 跑时才二次确认。若你已在用 DSH desktop profile,可按上文 npm 方式安装并重启壳体后试用。

  • 目录页:https://www.skillhub.cn/plugins/WhichWitchWin/dsh-power-button
  • GitHub:https://github.com/WhichWitchWin/dsh-power-button
羽毛球分组比赛记分
小程序二维码

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

Xiaoye