前言¶
在 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 活得更久。
两个开关¶
- Session 标题栏:utilities 区域有新月图标与开关。打开表示「这条会话工作时保持 Mac 不空闲休眠」;关闭会写入该会话的 per-session mute,选择会记在 profile 里。
- 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
典型用法¶
- 按上文命令为
desktopprofile 安装插件,确认运行在 macOS 且 DSH 版本满足engines.dsh。 - 打开 Settings → General,确认 Keep awake 为开(默认
enabled: true)。 - 开始一条 Agent 会话并触发 turn;此时 Host 应在有未静音会话运行 turn 时启动
caffeinate -i -w <host pid>。 - 若某条会话希望「跑着任务也允许系统休眠」,在该会话标题栏 utilities 里关掉新月开关;其它会话仍可按总开关策略保活。
- 不再需要插件时执行
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 / 幻方无官方从属关系,不等同于官方应用商店。