跳过主要内容
D

dsh-power-menu-web

dddmuc/dsh-power-menu-web

给 dsh web 部署加一个右上角电源按钮:刷新 / 重启 / 定时 / 关闭。重启后自动把新 token 的链接打开——dsh web 每次启动都换 token,不打开就得自己去日志里翻。macOS 走 launchd、Linux 走 systemd、其它平台自己 respawn。

安装

dsh plugin --profile web add github:dddmuc/dsh-power-menu-web

README

dsh-power-menu-web

npm version npm downloads GitHub stars license

⭐ 如果这个项目对你有帮助,欢迎点个 Star 支持一下。

⭐ If you find this project useful, a star is appreciated.

给 dsh web 部署加一个右上角电源按钮:刷新 / 重启 / 定时 / 关闭。重启后自动把新 token 的链接直接打开——dsh web 每次启动都生成新 token,浏览器拿它换一次签名 cookie 之后就作废,光把进程杀掉再起来,手上的链接当场失效,只能去日志里翻新的一行。

只服务 dsh web(浏览器界面)。桌面版请用 dsh-power-menu-mac 或 dsh-power-menu-win。

macOS · Linux · Windows 都能用 —— 但"重启"的实现各不相同,见下表。

为什么需要它

dsh web 改完插件/配置要重启宿主,而宿主在后台跑着:没有按钮就只能回终端敲命令。

更要紧的是:dsh web 每次启动都生成一个新的 token,浏览器拿它换一次签名 cookie 之后就作废。所以"重启"如果只是把进程杀掉再起来,你手上的链接当场失效,只能去日志里翻新的一行。这个插件会把新链接直接打开。这也是它和桌面版最大的不同:桌面版要清旧的 dsh-auth-* cookie,web 版的 cookie 在用户浏览器里,插件碰不到也不需要碰。

为什么不更快:helper 原来的固定等待已经收紧——等浏览器应答从 1.2 秒降到 0.3 秒、本机回环端口探测超时从 1200ms 降到 600ms、等日志里出现新 URL 的轮询从 400ms 降到 250ms。剩下的时间主要是宿主重新加载整组插件、把新 URL 写进日志(实测十几秒),这一段不属于插件,所以 WEB_URL_TIMEOUT_MS 仍是 90 秒。

三个平台怎么重启

平台谁负责拉起「重启」「关闭」
macOSlaunchd 作业launchctl kickstart -k,然后从作业日志里抓新链接launchctl bootout(真关,不会自己回来)
Linuxsystemd 单元systemctl restart(单元名从 cgroup 取)systemctl stop
Windows / 无 supervisor没有自己杀掉 → 等端口释放 → 用原 argv 重新 spawn结束进程

判断"有没有 supervisor"不是看环境变量就完事:

  • XPC_SERVICE_NAME 会一路继承给子进程(终端里起的 dsh web 带的是终端自己的作业名),所以还要回查 launchctl print 里那个作业的 pid 是不是本进程;
  • Linux 用 INVOCATION_ID(systemd 注入)+ /proc/self/cgroup 里的单元名。

装

npm i dsh-power-menu-web          # 或在插件管理页里装
node_modules/dsh-power-menu-web/enable.sh web   # 补进 dsh.profile.bundles,然后重启宿主

enable.sh 只做一件事:把 dsh-power-menu-web 补进指定 profile 的 dsh.profile.bundles(写之前备份 package.json)。少了这一步宿主半不会加载,点按钮就是 404。

profile 不在 ~/.dsh 下的话(部署把 HOME 指到别处,比如 ~/fish2):

HOME=~/fish2 node_modules/dsh-power-menu-web/enable.sh web
# 或
DSH_PROFILE_ROOT=~/fish2/.dsh/profiles node_modules/dsh-power-menu-web/enable.sh web

四项

  • 刷新:只重载这一层页面。点之前会先比对插件文件:某个 client.js 在你打开页面之后被改过时,刷新会让它加载失败(DSH 的 bundle 按 revision 发布且不可变),这时会弹框列出改动的插件,建议改走重启。
  • 重启:见上表。新链接会自动在浏览器打开。
  • 定时:居中弹窗,填分钟数后可选「N 分钟后重启」「N 分钟后关闭」。有 supervisor 时「现在关闭,N 分钟后启动」会收起(杀掉会被立刻拉回来,自己再 spawn 会抢端口)。排定后按钮下方出现每秒跳的倒计时胶囊。
  • 关闭:见上表。注意:没有 supervisor 时,关掉就真的没了,只能手动再起。

配置

在插件管理页里改:插件列表 → dsh-power-menu-web → 组件行右侧的配置控件。

也可以直接改 ~/.dsh/dsh-power-menu-web/config.json(第一次读取时自动生成):

{
  "delayedRestartMinutes": 10,
  "restartGuidance": true,
  "restartGuidanceText": ""
}
字段作用合法值
delayedRestartMinutes定时弹窗输入框的默认分钟数1–1440 的整数;其它值一律回落 10
restartGuidance是否注入系统提示词只有显式 false 才关
restartGuidanceText提示词正文与默认一字不差时存为空串(=跟随默认);超过 2000 字截断

无头部署

设 DSH_POWER_MENU_NO_OPEN=1 就不去打开浏览器 —— 重启照常进行,新链接会写在 helper 日志里:

$HOME/.dsh/dsh-power-menu-web/helper-restart-*.log
$HOME/.dsh/dsh-power-menu-web/helper-restart-*.web.log   # 自己 spawn 时子进程的输出

systemd 部署下输出进 journal,重启后请用 journalctl -u <单元> 取新链接。

安全

  • 所有接口只监听回环地址,并做同源校验(loopback socket + loopback Host + 非跨站 fetch)。
  • 没有遥测、没有外部请求。
  • 会执行 launchctl / systemctl / spawn —— 这是它存在的理由,请只装在你能信任的机器上。

致谢

菜单的视觉与交互沿用 dsh-power-menu(MIT)。

许可证

MIT

相关插件