dsh-restart-dock:在 DSH Web 界面一键重启宿主或刷新页面

前言

在 DSH 里做插件或改宿主侧代码时,经常会碰到两类「生效」方式:浏览器里的客户端脚本改完,刷新页面即可;进程里已经加载过的宿主模块改完,必须重启 DSH 进程,否则磁盘上的新文件不会换掉内存里那一版。日常做法往往是关窗口、找快捷方式、再开一遍,步骤多且容易打断调试节奏。

下面介绍社区插件 dsh-restart-dock(界面里常叫「重启坞」):在 Web UI 右下角提供一个小浮层,用两个按钮分别处理「只刷新页面」和「按原命令行重启 DSH 宿主」。维护者为 7gzgn,分类为客户端;仓库见 GitHub,目录页见 SkillHub。

这是什么

一句话:在 DSH Web 界面上一键 重启 / 重载 dock——「重启」停掉宿主再按原参数拉起;「刷新」仅 location.reload(),不碰进程。

它不往 DSH 里塞业务功能,只提供一个固定的「门把手」,专门解决宿主半改完必须重启、而客户端半改完只需刷页这一分工问题。

核心功能

界面与交互

装妥并重启 DSH 后,右下角会出现小框,两个按钮:

  • 重启:适合改插件、改 client.js、改 profile 等需要宿主重新加载的场景。
  • 刷新:只重载当前页面,任何平台都可用。

点 重启 会先弹出选择:立即 / 30 秒 / 60 秒 / 2 分钟 / 取消;选延迟会在原地倒计时,期间可撤回。再点一次确认流程里还有防误触:第一次点后按钮变为「确认重启?」,4 秒内再点一次才执行。

浮层可拖动并始终贴边:按住约 0.3 秒后可拖(README 亦提到 320ms 按住才拖),松手后贴最近的一边;收起为小圆点后仍可拖。位置记的是「贴哪条边 + 离边多远」,窗口缩放或全屏时仍贴在边框上,避免漂到视口外看不见。

重启在后台做什么(Windows)

宿主半通过 lib/relaunch.ps1 拉起脱离宿主的独立 PowerShell 进程执行重启,以便宿主被停掉后 helper 仍能完成拉起。大致步骤:

  1. 从宿主 pid 向上定位 DSH 进程,再找到同一可执行文件的最顶层实例(跳过 Chromium --type= 子进程);探测失败则拒绝,不按进程名猜测去杀。
  2. 等待约 2 秒,让 HTTP 响应先回到界面。
  3. 按进程树停止(先叶子后根),最多等 20 秒;并清理本次名单内父 pid 对应的漏网进程,避免残留 web 宿主占端口导致新实例报 desktop welcome: Web authentication failed。
  4. 按目标进程原命令行重新启动,参数保留。
  5. 将结果写入 ~/.dsh/dsh-restart-dock/last.json。

界面会轮询 GET /dsh-restart-dock/status:先确认宿主断连,再等恢复后自动刷新页面(浏览器里打开的 DSH 体验更明显;桌面版重启会关窗,窗口会自行回来)。

刷新

纯前端 location.reload(),不经过宿主。README 说明刷新前会检查插件 bundle,若仍在重建或已损坏则拒绝,避免一次 reload 把应用卡死。

安全边界(摘要)

重启会打断一切,HTTP 入口收紧:跨源依赖自定义头 x-dsh-restart-dock: 1 且插件不响应 CORS preflight;拒绝 Sec-Fetch-Site: cross-site;在带 Origin 时做同源校验(127.0.0.1 / localhost / 0.0.0.0 同端口视为同源)。桌面 dsh-app:// 页面可能不带 Origin,实现上以实测为准。status 只读接口同样仅对同源开放。响应不含凭据,仅回 pid / 端口 / 上次重启报告。

安装与启用

在 DSH 中安装本地目录 bundle(命令来自仓库 README):

# 在 DSH 里让 agent 装本地目录
plugin_manager install_bundle target=D:\path\to\dsh-restart-dock

也可在插件市场安装(发布后)。装完后需要再重启一次 DSH,右下角才会出现小框。

兼容性(README):DSH >=0.2.1-rc.2 <0.3.0-0(0.2.1-rc.2 真机验证);Node >=18;客户端半无构建步骤。package.json 当前版本为 0.1.3,许可证 MIT。

插件以当前 DSH 进程权限运行;安装前请自行查看仓库源码与许可证,确认重启行为符合你的环境预期。

典型用法

  1. 改完客户端脚本或样式:点 刷新,或依赖重启完成后的自动刷新。
  2. 改完宿主插件或 profile:点 重启,按需选立即或延迟,确认后等待 helper 完成;需要核对结果时查看 ~/.dsh/dsh-restart-dock/last.json 与 helper.log。
  3. 只想看会动哪些进程、不真正杀进程(Windows PowerShell):
powershell -NoProfile -ExecutionPolicy Bypass `
  -File lib\relaunch.ps1 -CallerPid <宿主pid> -StateDir D:\tmp\rd -DryRun

-DryRun 只探测并写报告;也可用 -TargetPid <pid> 显式指定目标做测试。

适用场景与注意

适合谁:在 Windows 上频繁改 DSH 插件或宿主配置、希望少走「关窗再开」的开发者;需要界面内可控延迟重启的人。

平台:重启仅实现 Windows;非 Windows 点重启会返回 501,提示使用刷新;UI 与刷新全平台可用。重启依赖 Windows PowerShell 5.1+,lib/relaunch.ps1 须带 UTF-8 BOM(否则 PS 5.1 可能按 ANSI 解码中文注释导致语法错误)。

行为取舍:重启会打断正在跑的任务;不做「等这一轮说完」式排程——可与 dsh-restart-planner 共存(一个给人点,一个给 agent)。重启后不会自动往对话里续话;若宿主被某些终端的 job object 托管,脱离的 helper 也可能被一并带走(从快捷方式启动的桌面版实测正常)。

排障文件:

路径 作用
~/.dsh/dsh-restart-dock/last.json 上次重启结果(relaunched / failed / armed / dry-run 等)
~/.dsh/dsh-restart-dock/helper.log helper 逐步日志
~/.dsh/dsh-restart-dock/pending.json 点击后到 helper 执行前的排程

结构一览

lib/index.js       宿主半:路由 + spawn helper
lib/relaunch.ps1   执行体:探测 → 停 → 拉 → 报告
client.js          客户端半:右下角小框(shell.overlay)
locale/{zh,en}.json  插件列表标题与描述
icon.svg           图标

结尾

dsh-restart-dock 把「改宿主必须重启、改客户端只需刷页」拆成两个明确动作,并在 Windows 上用独立 helper 按原命令行安全拉起 DSH,同时用同源与自定义头限制误触与跨站调用。若你主要在浏览器或桌面里折腾 DSH 插件,装好后重启一次 DSH,右下角 dock 即可长期使用。

  • 目录页:https://www.skillhub.cn/plugins/7gzgn/dsh-restart-dock
  • GitHub:https://github.com/7gzgn/dsh-restart-dock

社区插件目录为独立站点,与 DeepSeek / 幻方无官方从属关系;「一切皆插件」是 DSH 生态的常见做法,具体以你所用 DSH 版本文档为准。

羽毛球分组比赛记分
小程序二维码

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

Xiaoye