展示HN:Adrafinil - 仅在代理工作时保持盖上闭合的Mac处于清醒状态
rx no. 006 ・ a·draf·i·nil /əˈdræfɪnɪl/ ・ 一种用于机器的兴奋剂 ♡ 服用注意 ・ 适用于您入睡后仍保持警觉的机器。现在是凌晨三点。你在睡觉。代理却没有 — 它仍然在您几个小时前开始的会话中思考,而您像不了解的人一样关闭了盖子,盖子似乎一直无法完全合上。caffeinate和Amphetamine是兴奋剂:它们让机器永远保持活跃,无论家里有没有人。Adrafinil是兴奋剂。它在代理获取之前无所作为,仅在该工作存在的时间内使您的Mac在闭合盖子下保持清醒,并在最后一个会话结束时立即清空。它只在工作时唤醒 — 然后你们俩都睡觉。♡ 仅在AI代理工作时保持您的Mac清醒。Adrafinil是一个macOS菜单栏应用,防止系统进入睡眠状态 — 包括闭合盖子(盖子关闭)时的睡眠 — 仅在AI编程代理有活动会话时生效。当没有代理工作时,睡眠行为不受影响:关闭盖子,Mac正常进入睡眠。这与像caffeinate或Amphetamine这样的始终打开的唤醒工具相反。Adrafinil只在代理(Claude Code、Codex、Cursor等)处于任务中时干预,并在该工作完成的那一刻让开。⚠️ 特权的睡眠控制。覆盖闭合盖子睡眠需要root权限。Adrafinil在一个微小的审核助手中隔离了这一点,只暴露setSleepBlocked(Bool) — 所有政策都存在于一个不特权的守护进程中。它持有一个标准的IOPMAssertion用于闲置睡眠,并使用pmset disablesleep对闭合盖子(盖子关闭)睡眠进行控制,在设备上验证干净的私有IOPMrootDomain路径没有让没有显示器的闭合盖子Mac保持清醒。请参阅Docs/ARCHITECTURE.md第2节。特点 代理感知,而非始终在线。睡眠仅在≥1个代理会话持有一个断言时被阻止。零会话 → 正常睡眠,包括盖子关闭。为9个代理提供钩子集成。一键安装程序将Adrafinil与Claude Code、Codex、Cursor、Gemini CLI、Aider、Hermes、OpenCode、Cline和Pi的钩子系统连接。小于50ms的CLI。adrafinil acquire / release 从代理钩子中调用,并在50ms内往返守护进程,因此它们从不阻塞代理的工作流程。引用计数的断言。重叠的会话整齐堆叠;睡眠仅在最后一个会话释放时解除阻止。热保护。如果在盖子关闭时皮肤/CPU温度超过阈值,所有断言都将被强制释放,以便放在包里的Mac不会过热。闲置释放。那些拥有进程已死亡或CPU闲置了N分钟的断言会被自动丢弃。进程嗅探(可选)。守护进程可以在看到已知的代理二进制文件运行时自动获取,即使没有安装钩子。盖子关闭音频 + 盖子打开摘要。当您关闭盖子时,音频提示确认持有一个断言(屏幕关闭,因此没有通知);重新打开显示您离开期间运行的内容、峰值温度以及热保护是否已触发。干净卸载。删除它在所有代理配置中添加的所有钩子条目。要求 macOS Tahoe 26.4。这是我构建和测试的版本;它可能在早期的26.x下运行,但我没有在那进行过测试。Xcode 26+用于构建,启用Swift 6严格并发。标准安装需要管理员权限(特权助手通过SMAppService安装)。非管理员安装路径将CLI放在~/.local/bin,而不是/usr/local/bin。下载 下载Adrafinil —一个签名、经过公证的磁盘映像。打开它,将Adrafinil拖到应用程序中,然后启动。第一次启动时会请求一次管理员权限,以注册特权助手。需要macOS 26.4或更高版本。更倾向于自己构建?请参阅构建。构建 git clone https://github.com/kageroumado/adrafinil.git cd adrafinil open Adrafinil.xcodeproj 在Xcode中,选择Adrafinil方案并运行。您需要为代码签名设置开发团队 — 守护进程(LaunchAgent)和助手(LaunchDaemon)嵌入到应用程序包中并在应用程序启动时注册到系统。(没有团队ID嵌入到源代码中;XPC调用者检查在运行时读取您自己的签名团队,因此在任何开发者ID下重建都不会涉及代码变更而授权其自身组件。)对于没有本地签名身份的无头编译检查: xcodebuild -project Adrafinil.xcodeproj -scheme Adrafinil -configuration Debug \ -destination ' generic/platform=macOS ' \ CODE_SIGNING_ALLOWED=NO CODE_SIGNING_REQUIRED=NO CODE_SIGN_IDENTITY= ' ' build 共享逻辑构建并作为Swift包独立测试: cd AdrafinilShared swift test 工作原理 代理不直接与Adrafinil沟通。每个代理的钩子系统调用捆绑的CLI: adrafinil acquire <session-key> --tool claude-code --reason "long build" # 当一个回合开始时 adrafinil release <session-key> # 当代理闲置时 保持是按活动范围的,而不是按会话范围的:Claude Code在UserPromptSubmit上获取并在Stop上释放,因此Mac仅在代理实际上工作时保持清醒 —— 在提示下打开但闲置的会话
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡