dsh-nightowl: Preventing Mac Idle Sleep During Agent Task Execution

前言

在 DeepSeek Harness(DSH)里跑长任务时,Mac 若按系统策略进入空闲休眠,Host 进程可能被挂起,未完成的 turn 会中断。手动在终端里开 caffeinate 可以顶一阵,但要自己记着在任务结束后再关,且和「哪条会话还在跑」对不上号。dsh-nightowl 是社区维护的 DSH bundle 插件:在至少有一条未静音的 Agent 会话正在执行 turn 时,由 Host 侧拉起 /usr/bin/caffeinate -i,turn 结束或插件卸载时再停掉;浏览器侧提供会话级开关和总开关,无需模型工具或额外网络。插件仅支持 macOS,分类属于客户端能力扩展。

这是什么

dsh-nightowl 由 ihodorchenko 维护,仓库为 ihodorchenko/dsh-nightowl。它解决的是「DSH 在工作时 Mac 因空闲而系统休眠」的问题:包体分 Host 与 Web 客户端两半,Host 在条件满足时维持 PreventUserIdleSystemSleep 断言;客户端在 Session 标题栏和 Settings → General 里提供开关。不注册 model tools,不订阅 session 事件,也不发起网络请求。

会做什么、不会做什么

下面表格来自插件 README,描述的是「有一条 turn 正在跑且功能未关闭、会话未静音」时的行为。

情况 效果
系统空闲休眠 阻止(caffeinate -i)
显示器休眠 允许,屏幕可关,CPU 仍可继续跑
合盖 允许,Mac 仍按系统规则睡眠
仅用电池 turn 期间按 -i 语义阻止空闲休眠

断言仅在「总开关打开、至少一个 live agent session 在跑、该 session 未静音」时存在。最后一个 turn 结束后会终止 caffeinate 子进程;若 Host 在 turn 中途崩溃,子进程通过 -w <host pid> 绑定 Host PID,不会比 DSH 活得更久。

两个开关

  1. Session 标题栏:utilities 区域有新月图标与开关。打开表示「这条会话工作时保持 Mac 不空闲休眠」;关闭会写入该会话的 per-session mute,选择会记在 profile 里。
  2. Settings → General → Keep awake:总开关。关闭则整项功能禁用,Session 侧开关也无效;打开时默认每条会话都保活,除非在 Session 里单独静音。

界面反映的是配置状态,不是实时读取系统断言;断言是否存在取决于当前是否有正在运行的 agent。

安装与移除

推荐从 GitHub 安装(git 安装只拉源码,仓库已提交构建好的 lib/client.js,本地无需 build):

dsh plugin --profile desktop add git+https://github.com/ihodorchenko/dsh-nightowl.git

也可在 Plugins → Add plugin 粘贴同一 spec。需要固定版本时在 spec 末尾加 #v0.1.0(首个公开发布 tag)。

本地目录开发时可使用 link(路径换成你的绝对路径):

dsh plugin --profile desktop add link:/absolute/path/to/dsh-nightowl

移除 bundle 会同时去掉 Host 行与客户端脚本:

dsh plugin --profile desktop remove dsh-nightowl

package.json 中 engines.dsh 要求 DeepSeek Harness >=0.2.1-rc.5 <0.3.0;bundle 平台为 darwin,非 macOS 上插件处于 inert 状态并可能打一条 warning。

配置项

Host 行 config 可覆盖 schema 默认值;两字段均为 volatile,在 Settings 里改完即生效,无需重启。

字段 默认 含义
enabled true 总开关:是否允许 Host 在会话运行时保活
mutedSessions {} session id → true,表示用户在 Session 标题栏静音过的会话

手动改 cordis.patch.yml 时需保留两字段;用 Settings 总开关写入的 profile 覆盖会替换整段 config。静音按 session id 累积,旧 id 可手动在 patch 里清理,不影响正确性。

示例片段(id 仅为格式示意):

- insert:
    - id: nightowl
      name: dsh-nightowl
      config:
        enabled: true
        mutedSessions:
          session-01234567-89ab-cdef-0123-456789abcdef: true

典型用法

  1. 按上文命令为 desktop profile 安装插件,确认运行在 macOS 且 DSH 版本满足 engines.dsh。
  2. 打开 Settings → General,确认 Keep awake 为开(默认 enabled: true)。
  3. 开始一条 Agent 会话并触发 turn;此时 Host 应在有未静音会话运行 turn 时启动 caffeinate -i -w <host pid>。
  4. 若某条会话希望「跑着任务也允许系统休眠」,在该会话标题栏 utilities 里关掉新月开关;其它会话仍可按总开关策略保活。
  5. 不再需要插件时执行 dsh plugin --profile desktop remove dsh-nightowl。

实现要点(便于排查)

Host 入口 index.js 通过 inject: ['agents'] 接入:从 ctx.agents.list() 种子化运行中会话集合,监听 agent/status、agent/created、agent/disposed,在上升沿 spawn、下降沿 SIGTERM,并在 loader/volatile-update 时重读配置。客户端由 lib/client.js(自 src/client/index.tsx 构建)向 conversation.session.header.utilities 与 settings.general.item 注册 UI。

适用场景与注意

适合在 Mac 上用 DSH desktop profile 做长时间编译、测试或 Agent 多步任务、又不想全局改「系统设置 → 电池/显示器」的用户。Linux 与 Windows 未实现 wake lock;无 caffeinate 时 Host 侧同样 inactive。

插件以当前 DSH Host 进程权限运行,安装前建议阅读仓库源码与 MIT 许可证。DSH 生态强调「一切皆插件」;SkillHub 目录页 是社区索引,与 DeepSeek / 幻方无官方从属关系,不等同于官方应用商店。

链接

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

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

Xiaoye