dsh-shutdown-idle:会话与后台任务都空闲后再执行关机

前言

在 DeepSeek Harness(DSH)里跑 Agent,常见情况是:你派了一轮或多轮任务,转身去做别的事,希望「这一轮都跑完、机器也真的闲下来」之后再关机、锁屏或休眠。手工盯着会话列表容易漏看后台任务,定时关机又可能在回合间隙误触发。

dsh-shutdown-idle 是社区维护者 liaoyuqing 发布的工作流类 DSH 插件:开启后,等所有会话结束且(可配置)后台任务也空闲,经过确认与倒计时,再执行你选定的系统动作。下面介绍它的判据、参数和用法;安装与配置以 GitHub 仓库与 SkillHub 目录页为准。

这是什么

插件全名 dsh-shutdown-idle(npm 包名同),一句话定位是:在 DSH 进程内监测 Agent 会话与后台作业,全部空闲后自动执行关机、重启、休眠、睡眠、锁定、注销或仅记录(none)。

DSH 生态强调「一切皆插件」;本插件通过 cordis.patch.yml 打入 bundle,并在浏览器侧提供设置页与浮层状态卡片。

核心功能

空闲判据

插件每秒采样一次,用与 dshmarket 更新守卫相同的思路判断「还在忙」:

  1. 会话进行中:ctx.get('agents').list() 里存在 status === 'running' 的 Agent。这一条固定生效,不可关闭。
  2. 后台任务(可选):ctx.get('jobs') 中 status === 'running' 的作业(含各存活会话名下的作业),即界面里的「后台任务」。是否计入由配置项 considerJobs 决定;关闭后不再检测 shell 作业。
  3. 拿不到 agents 服务:按不空闲处理,宁可不执行也不误关机。
  4. 必须观察到会话运行过(默认开启):刚开启且没有任何任务时不会执行动作,避免误触发。

执行流程

全部空闲后,先等待「空闲确认」秒数,再进入「倒计时」秒数;倒计时结束执行所选动作。期间任意会话重新开始运行,或用户在界面上点 取消,本次动作都会撤销。

开启后,右上角(浮层右下角)会常驻一张小卡片,显示当前阶段与剩余秒数,并提供「取消」。按住卡片标题可拖动;松手后位置写入浏览器 localStorage(键 dsh.shutdown-idle.pill.position),拖动时保持在视口内(留 8px 可见)。从「取消」按钮按下不会误触发拖动。

可配置参数

参数 默认 说明
动作 shutdown shutdown / restart / hibernate / sleep / lock / logoff / none(none 只记录不执行)
空闲确认 20 秒 全部空闲后先确认这么久,避免回合间隙被误判为结束
倒计时 60 秒 可取消的执行前倒计时
必须观察到会话运行过 是 防止刚开启就执行
后台任务也算占用(considerJobs) 是 关掉后完全不再检测后台任务

设置页把后两项收在「什么算『还在忙』」区块:会话在跑固定算忙,下面两个复选框对应后两项配置。

初始值来自包内 cordis.patch.yml 的 config 行;界面改动写入 <DSH_HOME>/dsh-shutdown-idle/settings.json 并优先生效(删除该文件即回落到 patch 初始值)。

开关状态不持久化:宿主重启后一律是「关闭」,避免开机即误关机。

HTTP 接口(宿主半)

方法 路径 说明
GET /dsh-shutdown/api/state 开关、阶段、倒计时、运行中会话/作业
POST /dsh-shutdown/api/config { enabled?, action?, settleSeconds?, countdownSeconds?, requireActivity?, considerJobs? }
POST /dsh-shutdown/api/cancel 取消倒计时并关闭开关
GET /dsh-shutdown 客户端半不可用时的兜底页面

平台

动作命令使用 Windows 自带的 shutdown / rundll32。非 Windows 平台上,除 none 外的动作会降级为 none 并在界面标注,不会执行系统命令。

安装与启用

在已安装 DSH 的环境里,可用官方文档中的命令从社区标识安装:

dsh plugin add liaoyuqing/dsh-shutdown-idle

本地开发或已有源码目录时,README 也支持 link 方式(路径换成你的实际目录):

dsh plugin add link:/path/to/dsh-shutdown-idle

安装完成后,在 DSH 中打开 设置 → 会话结束后关机,点 开启,并按需调整动作与「什么算还在忙」相关选项。

典型用法

  1. 执行 dsh plugin add liaoyuqing/dsh-shutdown-idle 安装插件。
  2. 在设置里开启「会话结束后关机」,选择动作(例如 shutdown 或 lock),按需修改空闲确认、倒计时,以及是否要求「必须观察到会话运行过」、是否把后台任务算作占用。
  3. 正常向任意会话派活;当所有会话回合结束、且判据认为机器空闲时,插件先等空闲确认时间,再进入倒计时。
  4. 若仍需继续使用 DSH,在倒计时内点浮层上的 取消,或让任意会话再次进入 running,即可中止本次动作。

需要脚本或外部工具查询状态时,可调用 GET /dsh-shutdown/api/state;改配置用 POST /dsh-shutdown/api/config,紧急取消用 POST /dsh-shutdown/api/cancel。

适用场景与注意

适合谁:长时间批跑 Agent、希望「任务真正跑完再关机/锁屏」的 Windows 用户;需要把后台 shell 作业也算进「占用」时,保持默认 considerJobs 即可。

务必注意:

  • 插件以当前 DSH 宿主进程权限运行,安装前请阅读源码与 MIT 许可证,确认动作命令符合你的安全策略。
  • 非 Windows 上除 none 外不会真正执行电源/会话动作,仅适合联调状态机或 UI。
  • 开关不随宿主重启保留,每次重启后需重新开启,这是刻意设计的安全措施。
  • 社区目录页标注星标为 0(截至资料抓取时),选型时请自行评估维护活跃度与 Issue 区。

实现上,host.v2.mjs 负责状态机与 HTTP;client.js 负责设置页与可拖动浮层;升级宿主半代码时需换文件名并同步 package.json 的 main / exports,因为仅改配置的 hot reload 不会重新加载同路径模块。

结尾

dsh-shutdown-idle 把「会话结束」和「后台任务空闲」绑在一起,用确认窗口、可取消倒计时和不持久化的总开关,降低误关机风险。若你在 DSH 里需要这类工作流,可从目录页查看简介与版本信息,并在 GitHub 阅读完整 README 与 README.zh.md。

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

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

Xiaoye