前言¶
用 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)在瀑布不可用时(例如手动重载插件)作为降级路径,并在任一会话重新有动作时立刻取消倒计时。
三级可反悔¶
- 冷静期(默认 120 秒):所有目标会话都空闲后开始倒计时,按钮显示如
118 秒后关机,点一下即可取消。倒数期间任一会话重新开始工作,倒计时自动作废。 - 系统倒计时(默认 20 秒):冷静期结束后执行
shutdown.exe /s /f /t 20(是否/f由配置force控制)。按钮变为红色正在关机 18 秒,点击相当于shutdown.exe /a撤销。 - 真正关机。
判定范围(可配置)¶
默认 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-testbody{"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