dsh-nightowl:在 Agent 跑任務時阻止 Mac 空閒休眠

前言

在 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 / 幻方無官方從屬關係,不等同於官方應用商店。

鏈接

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

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

小夜