dsh-web-restart:在 WebUI 里一键重启 DSH,并配好 macOS 外部守护

前言

用 DeepSeek Harness(DSH)跑 dsh web 时,改 profile、换 bundle 或排查 host 侧问题,常常需要整进程退出再拉起。在终端里 Ctrl+C 再手动启动可以,但 WebUI 一旦断线,侧边栏和当前页面状态都会丢;若希望「点一下就能重启,页面还能自己回来」,单靠 Node 进程内部做不到——dsh web 是单进程,进程一退出 UI 就断线,必须由外部守护在退出后重新拉起。

下面介绍社区插件 dsh-web-restart(维护者 DEVbyQIN):在 WebUI 侧边栏增加「重启 DSH」按钮,并附带 macOS 上 launchd LaunchAgent、启动台图标等配套脚本。插件本身无法在进程死后自举;重启按钮与外部守护是配套的两半,缺一不可。

这是什么

dsh-web-restart 是一个 DSH profile bundle:host 侧注册重启 HTTP 端点与可选 slash 命令,client 侧在 WebUI 注入侧边栏按钮与全屏遮罩、恢复轮询。仓库同时提供 launcher/macos/ 下的 launchd 安装脚本与 AppleScript 启动台 App 源码,用于崩溃或主动退出后的自动拉起与登录自启。

社区插件目录为独立站点,与 DeepSeek / 幻方无官方从属关系;安装前请自行查看源码与许可证。

核心功能

能力 说明
WebUI 重启按钮 侧边栏底部「⇄ 重启 DSH」,两段式确认防误触;触发后全屏遮罩,进程退出后由外部守护拉起,页面轮询恢复并自动刷新
双通道触发 首选 DSH 官方 RPC(remote.commands.execute("/restart")),回退同源 fetch
launchd 守护 KeepAlive 在崩溃或退出后自动拉起 dsh web,可配置登录自启
启动台图标 可用 AppleScript 编译 .app,点击启动并打开浏览器
可选 token host 端点支持 Authorization / X-Dsh-Restart-Token 校验

host 端(index.mjs)注册同源 POST /api/_dsh/restart,命中后返回 202,延迟让响应落盘再退出。默认 mode: "exit" 为 process.exit(),交给 launchd KeepAlive 拉起;mode: "exec" 在同进程内 spawn 新 dsh web 并 unref,适合无外部守护、从终端手动跑的场景。client 端(lib/client.js)使用槽位 sidebar.footer.action,遮罩挂在 documentElement 上,每 2 秒轮询服务是否恢复,不依赖 window.confirm(嵌入 WebView 中可能被静默禁用)。

安装与启用

插件装进 DSH 的 web profile,而不是凭插件名拼接 dsh plugin add。

从 GitHub 安装(推荐)

在 profile 目录 ~/.dsh/profiles/web/ 中执行:

cd ~/.dsh/profiles/web
pnpm add "dsh-web-restart@github:<你的用户名>/<仓库名>"

在 ~/.dsh/profiles/web/package.json 的 dsh.profile.bundles 数组末尾增加 bundle 名:

"dsh": {
  "profile": {
    "bundles": [
      "@deepseek-ai/dsh-base",
      "@deepseek-ai/dsh-web-app",
      "dsh-web-restart"
    ]
  }
}

重启 dsh web 后生效。

cd ~/.dsh/profiles/web
pnpm add "link:/绝对/路径/dsh-web-restart"

同样在 bundles 中加入 "dsh-web-restart",重启生效。

覆盖默认配置

可在 profile 的 cordis.patch.yml 中覆盖 mode、token、flushMs、enableCommand 等,例如:

- id: web-restart
  name: dsh-web-restart
  token: my-secret

典型用法

WebUI 内重启

  1. 确认 profile 已启用 dsh-web-restart 且 dsh web 已重启。
  2. 在 macOS 上若希望退出后能自动回来,先完成下一节的 launchd 安装(仅 mode: "exec" 且无守护时,可依赖同进程 spawn,但 README 强调与 launchd 配套使用)。
  3. 打开 WebUI,在侧边栏底部点击「⇄ 重启 DSH」,按两段式确认。
  4. 全屏显示「正在重启 DSH…」,外部守护拉起进程后,客户端约每 2 秒轮询,恢复后自动刷新页面。

macOS:launchd 守护

安装脚本会复制启动逻辑到 ~/Library/Application Support/dsh-web/(规避 launchd 在 TCC 下无法读取 ~/Documents 等路径里脚本的问题),并自动探测 node 与 dsh 路径;可用 NODE_BIN、DSH_ENTRY、DSH_HOME 覆盖。

chmod +x launcher/macos/*.sh
launcher/macos/dsh-web-control.sh install

常用控制命令:

命令 作用
dsh-web-control.sh status 查看 launchd 状态
dsh-web-control.sh restart 手动重启
dsh-web-control.sh stop / start 停 / 启(停止不解除自启)
dsh-web-control.sh uninstall 卸载

日志路径:~/.dsh/dsh-web.launchd.log 与 ~/.dsh/dsh-web.launchd.err.log。

启动台 / Dock 图标

用仓库内 AppleScript 编译 App:

mkdir -p build
osacompile -o build/DSH.app launcher/macos/DSH-Web-Launcher.applescript
cp -R build/DSH.app /Applications/

也可新建 Automator「应用程序」,运行 shell 脚本调用 ~/Library/Application Support/dsh-web/dsh-web-start.sh,sleep 3 后 open http://127.0.0.1:3080,另存为 DSH.app 拖到 Dock 或启动台。

适用场景与注意

适合长期在 macOS 上用 dsh web 做本地开发、需要改 bundle 后快速整进程重启、又希望少碰终端的场景。launchd 与启动台脚本面向 macOS;Linux 等环境仍可使用 WebUI 按钮与 host 端点,但「退出后自动拉起」需自行用 systemd 等外部守护,仓库 README 以 macOS launchd 为完整示例。

插件以当前 dsh web 进程权限运行;若配置了 token,请避免把密钥提交到公开仓库。重启会中断所有 Web 连接与进行中的会话,生产或共享环境使用前请评估影响。

开发自测(来自 README):

node --check index.mjs lib/client.js
node validate.mjs

结尾

dsh-web-restart 把「WebUI 一键重启」与「macOS 外部拉起」拆成清晰的两半:按钮负责有序退出与前端恢复体验,launchd 负责进程死后回来。在 DSH「一切皆插件」的生态里,它补的是本地 Web 运维里很小但高频的一步。

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

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

小夜