dsh-nightwatch: Add a nightwatch button to the DSH input box to automatically stop the session after running until the specified time

前言

用 DeepSeek Harness(DSH)做长任务时,模型答完一轮往往会停下来等你下一句「继续」。人若离开几小时,会话就空转或中断,没法按 wall-clock 截止时间一直跑下去。手动反复发「继续」既费事,也不适合「去睡觉,让它自己干到早上」这类场景。

下面介绍社区插件 dsh-nightwatch(维护者 Zci514,GitHub 仓库 Zci514/dsh-nightwatch)。它在 DSH 输入框加一颗「☽ 守夜」按钮:选截止时间后,每轮回答结束自动接一句续跑文案,到点不再开口;默认不注册 slash 指令,开关与时间都在按钮和卡片里完成。

这是什么

dsh-nightwatch 是 DSH 的本地 bundle 插件,npm 包名 dsh-nightwatch,许可证 MIT。SkillHub 目录分类为「工作流」;仓库简介与 README 一致:给输入框加按钮,选钟点,会话续跑到那时自动停。

与只处理「输出被截断」时补一句的 dsh-plugin-continue-on-limit 不同:nightwatch 管的是时钟——每轮正常结束后接着开下一轮,到点收工;两者可同时安装,由 skipTruncatedTurnEnd 避免同一轮抢钩子。

核心功能

输入框按钮(主界面)

插件在输入框左下角小按钮区(「完全权限」右侧,与「↻ 迭代」并排)提供 ☽ 守夜。这个插件只有按钮,没有指令(默认不注册 slash);开关、改时间、立刻停、看还剩多久,全在按钮和卡片里,对话流里不会留下操作流水。

  1. 点 ☽ 守夜 弹出卡片;
  2. 选快捷项:+30 分 / +1 小时 / +2 小时 / 今晚 23:00 / 明早 7:00 / +8 小时,或在底部输入框自定义时间后回车;
  3. 点「开始守夜」。

开启后按钮显示 ☽ 守夜 · 3h20m,倒计时每秒更新。再点开卡片可改时间(「改到」)或点红色「立刻停」。最后 10 分钟(默认 wrapUpMinutes)会切换收尾语气,便于到点时留下可接手的现场说明。

若宿主未挂载或会话未加载,按钮会变灰并说明原因,旁有「重试」。

每轮结束后如何续跑

在 turn/end 时插件检查:未开守夜、已到点、轮次用完等则不动;若还有你未处理的消息排队则不插嘴;距上一轮不足 1.5 秒则稍等。否则投递一条 source.kind = 'cordis-host-runner' 的用户侧消息(默认大意:继续,并带上当前时间与距截止还有多久),不是以你的 user 身份发送,因此不会替你去批准自己的操作请求。

另有默认 20 秒一次的后台心跳:若某轮结束时钩子未执行,会话空着且未到点,会补一句,避免一次意外就整夜停摆。

何时会停

条件 说明
到点 主功能;默认不强行掐断正在跑的那一轮(graceMs: 0 表示只是不再开新轮)
轮次上限 默认 maxRounds 400;0 表示不限
连续出错 默认连续 3 轮报错停
连续 idle 默认连续 4 轮未调工具停
手动 卡片里「立刻停」
会话删除 记录一并清除

状态持久化在 $DSH_HOME/nightwatch.json(默认 ~/.dsh/nightwatch.json),原子写入;重启 DSH 后若截止未过且该会话被加载,会自动认领继续。从 1.1.0 的 @local/dsh-run-until 升级时,状态会从 $DSH_HOME/run-until.json 迁移到新文件。

可选 slash 指令(默认关闭)

配置 enableCommand: true 时会额外注册 /nightwatch(及 1.1.0 旧名 /run-until),供无头会话、脚本等没有按钮的场景。GUI 下一般保持默认 false,避免两套界面并存。示例:/nightwatch 22:30、/nightwatch +90m、/nightwatch stop 等,写法与按钮卡片输入框一致(支持全角冒号、不补零时间等)。

安装与启用

本插件按 DSH「本地 bundle」方式装载:在 profile 目录增加 npm 依赖,并在 dsh.profile.bundles 末尾追加 dsh-nightwatch。

从 npm 安装(推荐)

包已发布:https://www.npmjs.com/package/dsh-nightwatch。profile 目录为 ~/.dsh/profiles/<你的 profile>。

cd ~/.dsh/profiles/<你的 profile>
npm i dsh-nightwatch

在同一 package.json 中配置依赖与 bundle(README 示例版本为 ^1.2.2;当前 package.json 发布版本为 1.2.3):

{
  "dependencies": { "dsh-nightwatch": "^1.2.2" },
  "dsh": { "profile": { "bundles": ["…原有的不要动…", "dsh-nightwatch"] } }
}

npm i 会把包装进 node_modules/dsh-nightwatch,无需再建 junction。bundles 顺序即加载顺序,将 dsh-nightwatch 追加到最后即可。

运行环境要求 Node >=22(见 package.json engines)。

配置(按需)

可在 cordis.patch.yml 的 nightwatch 段或 profile patch 中覆盖,例如:enabled、maxRounds、wrapUpMinutes、heartbeatMs、enableCommand 等。完整键与默认值见仓库 README 配置表。

典型用法

  1. 在目标 profile 按上文完成 npm i 与 bundles 配置,重启或加载 DSH。
  2. 打开要长跑的会话,点 ☽ 守夜 → 选「明早 7:00」或 +8 小时 →「开始守夜」。
  3. 离开前确认药丸在倒计时;回来若已过截止,会话应已安静,可查看最后一轮是否按收尾语气写了待办与下一步。
  4. 若与截断续写并用,可同时安装 dsh-plugin-continue-on-limit,由 nightwatch 的 skipTruncatedTurnEnd: true 与前者分工。

适用场景与注意

适合:需要按 wall-clock 截止时间让 DSH 会话自动多轮推进、又不想记指令或往对话里刷「继续」的开发者;夜间或离席前的长时间自动化尝试(仍受轮次、idle、错误上限约束)。

注意:

  • 插件以当前 DSH 进程权限运行;安装前请阅读 GitHub 源码 与 MIT 许可证,自行评估风险。
  • README 写明宿主侧 lib/ 改动需重启 DSH;client.js 可热更。
  • 重启后须打开对应会话(或在该会话发话)才会认领守夜;过期记录会自动丢弃。
  • 已知限制:README 称主要在 Windows + DSH 桌面版实测;逻辑层与平台无关。
  • SkillHub 目录页:https://www.skillhub.cn/plugins/Zci514/dsh-nightwatch;社区目录与 DeepSeek / 幻方无官方从属关系,属「一切皆插件」生态中的第三方工作流插件。

结尾

dsh-nightwatch 把「续跑到某个钟点再停」收成输入框一颗按钮:选时间、看倒计时、改点或立刻停,默认不占对话流。需要无头控制时再开 enableCommand 与 /nightwatch。详情与变更见 GitHub README,安装以 npm 与 profile bundle 为准。

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

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

Xiaoye