dsh-auto-shutdown:会话级「任务完成后自动关机」开关

前言

用 DeepSeek Harness(DSH)跑长任务时,常见做法是盯着 Web GUI,等对话、后台 job、子代理都停下来了再关电脑。若开了多个会话,还要自己记「哪一个还没跑完」。手动关机容易误关正在写的会话,或者任务早结束了却空等。

下面介绍社区插件 dsh-auto-shutdown(维护者 ypx01):在每个会话标题栏右侧加一个开关,由 harness 用与会话归档相同的空闲判据判断「是否还有活」;条件满足后走冷静期与系统关机倒计时,并预留撤销路径。插件仅支持 Windows,以当前 DSH 进程权限执行关机命令;安装前建议阅读源码与 MIT 许可证。

这是什么

dsh-auto-shutdown 是 DSH 的 per-session 自动关机开关:默认关;打开后,当「本会话以及所有同样打开开关的会话」上的工作都执行完,再进入关机流程。多个会话都开时,必须全部完成才会关机,任一还在跑就继续等。

开关状态不落盘,DSH 重启后全部复位为关,避免重启后误触发关机。

  • 目录页:https://www.skillhub.cn/plugins/ypx01/dsh-auto-shutdown
  • 源码:https://github.com/ypx01/dsh-auto-shutdown
  • 版本(package.json):0.1.0
  • DSH 兼容:>=0.2.0-rc.0;Node >=20

开关行为

开关 行为
关(默认) 任务全部执行完后什么都不做
开 本会话及所有也开了开关的会话上的活全部执行完 → 倒计时 → 电脑自动关机
多个会话都开 必须全部会话都完成才关机;任何一个还在跑就等

新建会话默认是关。

如何判断「任务执行完了」

插件不猜、也不靠数事件,而是直接问 harness,与会话归档拒绝「还有活」时使用同一接口:

await ctx.waterfall('workspace/session-activity', { sessionId }, () => [])
// [] => 这个会话没活干了

判据汇总四类活动源:turn(正在跑的一轮对话)、job(后台任务)、subagent(子代理)、schedule(定时/计划中的执行)。子代理未结束、后台 job 仍在运行,不会被误判为完成。

事件订阅(session/event / api-session/status)在瀑布不可用时(例如手动重载插件)作为降级路径,并在任一会话重新有动作时立刻取消倒计时。

三级可反悔

  1. 冷静期(默认 120 秒):所有目标会话都空闲后开始倒计时,按钮显示如 118 秒后关机,点一下即可取消。倒数期间任一会话重新开始工作,倒计时自动作废。
  2. 系统倒计时(默认 20 秒):冷静期结束后执行 shutdown.exe /s /f /t 20(是否 /f 由配置 force 控制)。按钮变为红色 正在关机 18 秒,点击相当于 shutdown.exe /a 撤销。
  3. 真正关机。

判定范围(可配置)

默认 requireGlobalQuiet: true:除开了开关的会话外,其它任何在线会话(含子代理会话)也必须空闲才会关机,避免「A 会话触发关机却把 B 会话正在写的稿子关掉」。若只关心已开开关的会话,将其设为 false。

安装与启用

插件目录示例:D:\deepseek-workspace\plugins\dsh-auto-shutdown。

用 plug-in manager 安装本地目录(软链,改源码后重载插件即生效):

plugin_manager { action: "install_bundle", target: "D:\\deepseek-workspace\\plugins\\dsh-auto-shutdown" }

装完后刷新 Web GUI(地址以 dsh web 启动时打印为准,形如 http://127.0.0.1:6673),会话标题栏右侧应出现「自动关机」按钮。

非 Windows 环境会显示「仅支持 Windows」并拒绝开启。

配置

在 cordis.patch.yml 的 config 中设置,也可在 profile 组合里覆盖:

键 默认 说明
countdownMs 120000 冷静期毫秒数(最小 1000)
shutdownGraceSeconds 20 调用 shutdown /t N 的 N,期间可 /a 撤销
requireGlobalQuiet true 是否要求所有在线会话都空闲
force true 是否加 /f 强制结束阻止关机的程序
dryRun false 只演练不真关机,日志记录将要执行的命令
ignoreKinds [] 不想让某类活动阻止关机时填写,如 ["schedule"]
debug false 同时输出到 stdout
logFile .dsh/auto-shutdown.log 日志路径;填 null 关闭落盘

日志默认路径:%USERPROFILE%\.dsh\auto-shutdown.log(JSON 行,含 arm/disarm/倒计时/下发命令/撤销等)。

典型用法与自检

日常使用:在需要「跑完就关电脑」的会话标题栏打开「自动关机」;冷静期内可随时点按钮取消;系统关机倒计时阶段点红色按钮可撤销。

离线测试(不发真关机):

node D:\deepseek-workspace\plugins\dsh-auto-shutdown\test\state-machine.test.mjs
node D:\deepseek-workspace\plugins\dsh-auto-shutdown\test\client-smoke.test.mjs

运行时探测(<port> 为 dsh web 打印的端口):

  • GET http://127.0.0.1:<port>/api/auto-shutdown/probe — 只算判定,不改状态。关注 blocking / otherBusy(谁在忙、哪一类活动);空表示可随时关机。stats.clientAlive 表示最近 15 秒内浏览器是否在轮询 /state。
  • POST http://127.0.0.1:<port>/api/auto-shutdown/self-test body {"realShutdown":false} — 验证 spawn 链路(跑 cmd /c exit 7,返回 exitCode 7 即正常)。

常用 HTTP 接口(供本机 UI,无鉴权,勿暴露到公网):

方法 路径 用途
GET /api/auto-shutdown/state?sessionId= 全量状态
GET /api/auto-shutdown/probe 只算判定
POST /api/auto-shutdown/set {sessionId, armed}
POST /api/auto-shutdown/cancel 撤销倒计时 / shutdown /a
POST /api/auto-shutdown/self-test {realShutdown} 验证下发链路

适用场景与注意

适合:夜间或外出前在 Windows 上挂 DSH 批任务,希望「所有已开开关的会话都 idle 后再关机」,且需要冷静期与 /a 两级撤销。

务必注意:

  • 插件以当前 DSH 进程权限运行;spawn-process 会执行系统关机命令,安装前应检查源码与许可证。
  • DSH 进程必须保持运行;退出 DSH 即放弃本次自动关机。
  • requireGlobalQuiet: false 时,其它会话若仍在跑长任务,到点仍会关机;true 时若某会话长期「一直有活」,会一直不关机,可用 probe 查看阻塞原因。
  • 开关不持久化是刻意设计;重启后自动关机风险更高,目前未接 ctx.storageDomain。

DSH 生态是「一切皆插件」;SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-auto-shutdown 把「会话是否还有活」交给 harness 的 session-activity 瀑布,与归档逻辑一致,并在多会话、全局安静、子代理与 job 等边界上做了可配置与可撤销的关机链路。需要细节与 issue 时见 GitHub README,安装与分类信息见 SkillHub 目录页。

  • https://www.skillhub.cn/plugins/ypx01/dsh-auto-shutdown
  • https://github.com/ypx01/dsh-auto-shutdown
羽毛球分组比赛记分
小程序二维码

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

小夜