Adrafinil: macOS AI 編碼代理程式的條件式睡眠防止工具
Adrafinil: macOS AI 編碼代理程式的條件式睡眠防止工具
Adrafinil 是一款專為 macOS 設計的工具,旨在僅在 AI 編碼代理程式活躍的工作階段期間保持 Mac 喚醒,並允許系統在沒有工作進行時正常進入睡眠狀態。與始終開啟的喚醒工具不同,Adrafinil 僅在代理程式執行任務的中途動態地阻止睡眠——包括闔蓋模式 (clamshell) 睡眠——並在工作階段結束後自動釋放鎖定。
代理程式感知型睡眠管理
當一個或多個 AI 編碼代理程式工作階段持有活躍的斷言 (assertion) 時,Adrafinil 才會防止系統進入睡眠。當沒有任何工作階段處於活躍狀態時,Mac 的預設睡眠行為將保持不變。這種方法與 caffeinate 或 Amphetamine 等工具不同,後者通常不論實際系統活動如何,都會維持恆定的喚醒狀態。
支援的代理程式與整合
Adrafinil 提供一鍵式安裝程式,可與九種 AI 代理程式的掛鉤 (hook) 系統整合:
- Claude Code
- Codex
- Cursor
- Gemini CLI
- Aider
- Hermes
- OpenCode
- Cline
- Pi
整合是透過一個內建的 CLI 處理的,代理程式在任務開始時會呼叫它來 acquire 一個工作階段金鑰,並在代理程式進入閒置狀態時呼叫它來 release。這些 CLI 呼叫經過優化,往返時間低於 50ms,以確保不會阻礙代理程式的工作流程。
技術架構與安全性
由於覆蓋闔蓋模式睡眠需要 root 權限,Adrafinil 使用分層架構來最小化特權攻擊面。
權限層級
- Adrafinil.app: 一個面向使用者的介面列應用程式,負責處理 UI、設定以及闔蓋摘要資訊。
- AdrafinilDaemon: 一個以使用者身份運行的 LaunchAgent。此組件負責管理引用計數斷言註冊表、監控溫度與闔蓋狀態,並處理 CLI socket。
- AdrafinilHelper: 一個 root 層級的 SMAppService LaunchDaemon。這是唯一具有存取睡眠阻止 API 的組件,並提供簡單的
setSleepBlocked(Bool)方法。它在執行指令前會驗證呼叫者的程式碼簽章要求。
睡眠阻止機制
Adrafinil 對於閒置睡眠使用標準的 IOPMAssertion。為了處理闔蓋模式睡眠,它採用了 pmset disablesleep 1。開發者指出,公開的 IOPM 斷言(如 caffeinate 所使用的)不足以讓闔蓋的 Mac 保持喚醒。為了防止狀態洩漏,helper 在重新啟動時會先將 disablesleep 重設為 0,然後再重新套用當前狀態。
安全與監控功能
為了防止硬體損壞並確保系統穩定性,Adrafinil 包含幾項自動化防護措施:
- 溫度切斷 (Thermal Cutout): 如果在闔蓋時 CPU 或表面溫度超過預設閾值,所有斷言將被強制釋放,以防止 Mac 在密閉空間(例如筆記型電腦包)中過熱。
- 閒置釋放 (Idle Release): 如果持有者程序結束或在指定分鐘數內保持 CPU 閒置,斷言將會自動釋放。
- 闔蓋狀態回饋: 闔蓋時會發出提示音以確認斷言已被持有。重新開啟時,使用者會看到一份摘要,說明執行了哪些工作,達到過的峰值溫度,以及是否發生了溫度切斷。
需求與安裝
Adrafinil 需要 macOS Tahoe 26.4(或可能更早的 26.x 版本)並使用 Xcode 26+ 與 Swift 6 嚴格並行處理 (strict concurrency) 建置。安裝需要管理員權限以透過 SMAppService 註冊特權輔助程式。
社群觀點
雖然此工具解決了 AI 代理程式使用者的特定痛點,但一些社群成員提出了更簡單的替代方案或提出了疑慮:
- 現有工具: 一些使用者指出,Amphetamine 等應用程式可以在特定應用程式關閉時結束,或使用
pmset的簡單 shell 腳本可以達到類似效果。 - 硬體風險: 使用者提醒開發者,筆記型電腦在背包內無法有效散熱,這證明了加入溫度切斷功能的必要性。
- 手動替代方案: 有一名使用者建議使用虛擬 HDMI/USB-C 插頭來模擬外部顯示器以防止睡眠,但他們報告結果並不一致。
"I used to do this 15 years ago to keep listening to music from my laptop... One caveat, your laptop cannot cool inside a backpack, it will overheat and shut down anyway."
CLI 指令摘要
| Command | Purpose |
| :--- | :--- | |
| acquire <key> | 當代理程式回合開始時阻止睡眠 |
| release <key> | 當代理程式進入閒置時解除阻止睡眠 |
| hold --for <time> | 為背景任務(例如部署)提供限時喚醒功能 |
| mcp | 在 stdio 上啟用 Model Context Protocol 通訊 |
| status | 檢查當前斷言狀態 |