dsh-keepawake:DSH 会话期间的 Windows 睡眠保活

前言

用 DeepSeek Harness(DSH)跑一轮带工具调用的对话,往往需要几分钟甚至十几分钟。这段时间里你多半在等模型返回,键盘和鼠标不一定在动。Windows 的空闲计时器不知道你在等 DSH,到点会关屏、睡眠,有时还会休眠;回来发现会话卡在半路,需要重新拉起上下文。

系统自带的「演示模式」在不少机器上并不可靠:PresentationSettings.exe 不一定存在。passing11 维护的客户端插件 dsh-keepawake 在会话输入框下方提供一个保活开关,开启后由后台 PowerShell 看门狗调用 Win32 SetThreadExecutionState 申请执行状态锁,在 DSH 思考、调工具、与模型对话期间尽量阻止睡眠和休眠;对新笔记本常见的 S0 现代待机还有专门探测与兜底逻辑。插件归属社区目录 passing11/dsh-keepawake,源码在 GitHub,许可证 MIT,当前 package 版本 1.0.0。

下面按定位、原理要点、安装、用法和限制说明怎么用它。

这是什么

dsh-keepawake 是 DSH 的 客户端(Web UI)插件:在输入框正下方与宿主统计小胶囊同一行增加「保活」按钮。点开进入保活后显示「保活中」和绿点;再点一次关闭。

宿主侧提供 /dsh-keepawake/api 路由;真正持锁的是独立于 DSH 的看门狗进程 dsh-keepawake-watch.ps1,由 keepawake-toggle.ps1 启停。仅支持 Windows;其他平台上按钮不出现,不会占一行假按钮。

为什么普通保活不够:S0 现代待机

许多新笔记本只有 S0 低电量待机,没有传统 S3。可用 powercfg /a 查看本机支持的睡眠状态。

在部分 S0 机型上,只申请 ES_SYSTEM_REQUIRED(默认组合下 flags 常为 0x80000001,允许息屏)仍可能在关屏超时后进入 Modern Standby(事件日志 Kernel-Power Id=506,Reason 如 Idle Timeout)。关屏是否必然触发待机因固件而异。

插件默认允许息屏,持锁期间每 60 秒查事件日志;若持锁时间段内出现 Id=506(进 S0)或 Id=42(进睡眠),会自动补上 ES_DISPLAY_REQUIRED(如 0x80000003),相当于本机关屏即待机时改为屏幕常亮兜底。若你明确要常亮、不做试探,可用 -KeepDisplayOn;若宁可系统睡也不要自动亮屏,可用 -NoAutoDisplayOn(保活在那类机器上可能失效)。

核心工作方式

看门狗约每 10 秒判断两个信号,任一成立则持锁:

  1. 会话文件活跃:DSH 的 session.v4.jsonl.* 在最近 IdleMinutes 分钟内被写过。
  2. 模型连接活跃:进程名为 DeepSeek Harness 的进程存在指向公网 443 的 ESTABLISHED 连接。

两个信号都消失后,再空转满 IdleMinutes 分钟才释放锁,避免工具调用间隙误放行。

流程概览:切换开关 → 后台看门狗循环 → 忙则上锁 → Windows 内核拒绝睡眠 → 闲满阈值(默认 5 分钟)放锁 → 恢复原电源行为。图示见仓库 docs/keepawake-diagram.png。

安装与启用

1. 放置 PowerShell 脚本

将仓库 scripts/ 下三个脚本放在同一目录(脚本按文件名互相查找):

  • keepawake-toggle.ps1 — 总开关
  • dsh-keepawake-watch.ps1 — 看门狗
  • keepawake-status.ps1 — 仅查状态

插件按顺序解析 keepawake-toggle.ps1 路径,第一个命中即用:

  1. 插件配置里的 scriptPath
  2. 环境变量 DSH_KEEPAWAKE_SCRIPT
  3. 当前工作区根目录
  4. process.cwd()
  5. ~/Documents/deepseek-harness/default-workspace
  6. ~/.dsh

2. 安装插件

在对应 profile 下执行官方命令:

dsh plugin --profile <你的 profile> add dsh-keepawake

也可手动把本仓库 link 进 profile 的 dependencies 和 dsh.profile.bundles。若改包名,须保证 client.js 第一行注册的 id 与 package.json 的 name 一致(本仓库均为 dsh-keepawake),否则客户端 bundle 可能半静默失效、界面上无按钮。

环境要求:package.json 声明 node >= 20。

3. 界面上打开

安装并放置脚本后,输入框下方出现「保活」;点击切换。开着时为「保活中」+ 绿点。

说明:插件在 DSH 进程权限下运行;安装前建议自行审阅源码与 MIT 许可证,确认脚本路径与自启策略符合你的安全策略。

典型用法

界面

与会话并排点击「保活」/「保活中」即可,无需额外配置即可使用默认策略(允许息屏 + S0 自动兜底)。

命令行(不经过 UI)

在脚本所在目录用 PowerShell:

# 切换(弹窗告知结果)
.\keepawake-toggle.ps1

# 明确开启 / 关闭
.\keepawake-toggle.ps1 -Action On
.\keepawake-toggle.ps1 -Action Off

# 只看状态
.\keepawake-toggle.ps1 -Action Status

# 不弹窗,只打印
.\keepawake-toggle.ps1 -Quiet

# 自定义空闲阈值(分钟,支持小数)
.\keepawake-toggle.ps1 -Action On -IdleMinutes 3

# 直接屏幕常亮
.\keepawake-toggle.ps1 -KeepDisplayOn

# 不自动亮屏
.\keepawake-toggle.ps1 -NoAutoDisplayOn

看门狗日志:%TEMP%\dsh-keepawake.log。

可选:开机自启

默认不配置自启。需要时可运行 scripts/install-keepawake-autostart.ps1,在用户启动文件夹放置快捷方式。

验证锁是否生效

powercfg /requests 通常需管理员权限,持锁成功时 SYSTEM: 段会出现对应 powershell.exe 路径。也可查系统事件 Id=42、506、107 判断是否曾进睡眠或 Modern Standby。README 中有完整示例命令。

适用场景与注意

适合谁:在 Windows 上长时间用 DSH 做 agent 开发、多轮工具调用,且经常被系统睡眠打断会话的用户。

务必知晓的限制(来自上游 README):

  • 仅 Windows;DSH 整进程被终止时看门狗一并退出,需重新开启保活;默认不随 DSH 重启自动恢复保活状态。
  • 执行状态锁不跨用户会话,注销即失效。
  • 「关屏即待机」机型在自动兜底后可能长期亮屏;用 -NoAutoDisplayOn 可拒绝自动亮屏,但保活可能挡不住待机。
  • 社区插件目录 skillhub.cn 为独立生态站点,与 DeepSeek / 幻方无官方从属关系;DSH 本身遵循「一切皆插件」的扩展方式。

结尾

dsh-keepawake 把「等模型、等工具」这段时间从 Windows 空闲计时的盲区里拎出来:UI 上一条开关,底层用会话文件与 DSH 外连信号驱动看门狗持锁,并对 S0 做事件日志级别的自适应。若你经常在笔记本上长跑 DSH,可先装好三份脚本、执行 dsh plugin --profile <你的 profile> add dsh-keepawake,再在输入框下点开保活试用。

  • 目录页:https://www.skillhub.cn/plugins/passing11/dsh-keepawake
  • 源码与文档:https://github.com/passing11/dsh-keepawake
羽毛球分组比赛记分
小程序二维码

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

Xiaoye