Adrafinil: macOS 上的 AI 编程智能体条件式睡眠预防工具
Adrafinil: macOS 上的 AI 编程智能体条件式睡眠预防工具
Adrafinil 是一款专为 macOS 设计的实用程序,旨在仅在 AI 编程智能体活跃会话期间保持 Mac 处于唤醒状态,从而允许系统在没有工作进行时正常进入睡眠模式。与始终开启的唤醒工具不同,Adrafinil 仅在智能体执行任务中时动态阻止睡眠——包括合盖模式(clamshell)睡眠——并在会话结束时自动释放锁定。
智能体感知型睡眠管理
当一个或多个 AI 编程智能体会话持有活跃的断言(assertion)时,Adrafinil 会阻止系统进入睡眠。当没有活跃会话时,Mac 的默认睡眠行为保持不变。这种方法与 caffeinate 或 Amphetamine 等工具不同,后者通常无论实际系统活动如何都会维持恒定的唤醒状态。
支持的智能体与集成
Adrafinil 提供了一键式安装程序,可与九种 AI 智能体的钩子系统(hook systems)集成:
- 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 空闲,断言将自动释放。
- 开盖状态反馈 (Lid-State Feedback): 合盖时会发出提示音以确认断言已持有。重新开盖时,用户会看到运行情况摘要,包括运行了什么、达到的峰值温度以及是否发生了热量切断。
要求与安装
Adrafinil 需要 macOS Tahoe 26.4(或可能更早的 26.x 版本)并使用 Xcode 26+ 结合 Swift 6 严格并发模式构建。安装需要管理员权限,以便通过 SMAppService 注册特权辅助程序。
社区观点
虽然该工具解决了 AI 智能体用户的特定痛点,但一些社区成员提出了更简单的替代方案或表达了担忧:
- 现有工具: 一些用户指出,Amphetamine 等应用可以设置为在特定应用关闭时结束,或者使用基于
pmset的简单 shell 脚本可以实现类似效果。 - 硬件风险: 用户提醒开发者,笔记本电脑在背包内无法有效散热,这证明了加入热量切断功能的必要性。
- 手动替代方案: 一位用户建议使用虚拟 HDMI/USB-C 插头来模拟外部显示器以防止睡眠,尽管他们报告结果并不一致。
"I used to do this :// 15 年前我曾这样做来让我的笔记本电脑保持听音乐... 一个注意事项是,你的笔记本电脑在背包内无法有效散热,它会过热并自动关机。"
CLI 命令摘要
| Command | Purpose |
| :--- | :--- | |
| acquire <key> | 智能体轮次开始时阻止睡眠 |
| release <key> | 智能体进入空闲时取消阻止睡眠 |
| hold --for <time> | 为后台任务(如部署)提供限时唤醒 |
| mcp | 在 stdio 上启用 Model Context Protocol 通信 |
| status | 检查当前断言状态 |