AI が止まってから Mac を眠らせる、スリープ防止を突き詰めたオープンソースツール
- Adrafinil は macOS のメニューバーツールで、AI コーディング Agent(Claude Code、Cursor など)がタスクを実行中のときだけ Mac のスリープを阻止し、Agent が止まると蓋を閉じたときの休眠を含めて通常のスリープ動作に即座に戻る。
- 主要な Agent 9 種類に対応し、それぞれの Hook システム経由で acquire / release を自動呼び出し、CLI の往復遅延は 50ms 未満。
- 複数 Agent が同時に動くときは参照カウントを採用:各セッションがそれぞれ +1 / −1 し、カウントがゼロになって初めてスリープ防止を解除、最後のタスクが終わってから Mac を眠らせる。
- サーマル保護を内蔵:筐体表面 / CPU の温度がしきい値を超えるとすべてのスリープ防止アサーションを強制解放し、蓋を閉じた状態での放熱不足による加熱を防ぐ。
- アーキテクチャは権限を 3 層に分け、root 権限は最小の Helper コンポーネントだけに集中、公開するのはブール値インターフェイス setSleepBlocked(Bool) ただ一つで、残りのロジックはすべてユーザー空間で動く。
あなたは蓋を閉じて寝た、Agent はまだ走っている
オープンソース開発者の kageroumado が先日 Adrafinil を公開した。macOS のメニューバーツールで、AI コーディング Agent が実際に働いているときだけ Mac のスリープを阻止し、Agent が止まると自動で通常のスリープに戻る。
午前 3 時、あなたは寝た、Agent は寝ていない。数時間前にあなたが立ち上げたあのセッションの中でまだ動いていて、あなたはまぶたを閉じるようにノートの蓋を閉じた、でもこの目は本当には閉じていない。矛盾はここにある:Agent のタスクサイクルと Mac のスリープ方針は、互いに相手が何をしているか知らない。蓋を閉じればシステムは慣例どおり休眠し、タスクは途中で切れる。
名前そのものが設計の説明になっている。Adrafinil はある覚醒促進薬(eugeroic)から借りた名だ。興奮剤(stimulant)とは違い、覚醒促進剤は必要なときだけ目を覚まさせ、不要なときは介入しない。これこそ caffeinate のような「常に覚醒」型ツールとの根本的な違いだ:仕事があるときだけスリープを防ぐ。
これまでのやり方では足りない理由
Adrafinil 以前、長いタスクを走らせる間 Mac を眠らせないようにするには両極端の二択しかなく、どちらも「タスクが実際に走っている」時間にぴたりと合わせられなかった。
caffeinate と Amphetamine は興奮剤型で、オンにすれば仕事の有無にかかわらず全行程ずっと覚醒したまま。タスクがとっくに終わっても、マシンは空回りして電力を食い熱を出す。逆に何も入れなければ蓋を閉じた瞬間に眠り、長いタスクはそのまま中断する。下では 3 つのケースを同じタイムライン上に並べた:スリープ防止のウィンドウとタスクのウィンドウが揃っているか、一目で分かる。
caffeinate のスリープ防止バーは最初から最後まで点きっぱなしで、タスク終了後の長い区間はまるごと無駄。何も入れない行は蓋を閉じたところに赤い×印があり、タスクが終わる前に切られる。adrafinil のバーだけがタスク区間にぴたりと貼りつき、前後に一秒も余計に保たない。
Agent の呼吸に合わせる
Adrafinil の核心はシンプルだ:Agent が働き始めればスリープ防止を申請し、手を止めれば解放する。Mac は Agent が実際にタスクを実行している間だけ覚醒し続ける。メニューバーのアイコンもこの 2 つの状態しかない。


Agent は Adrafinil と直接やり取りせず、それぞれの Hook システム経由で付属のコマンドラインを呼び出す:
Claude Code を例にすると、信号の連鎖はこう流れる:
肝心なのは、守るのが「働いている」区間であって「プログラムが開いている」区間ではないこと。Claude Code は UserPromptSubmit のとき acquire し、Stop のとき release する。だから開いていても入力欄であなたの入力を待って止まっているセッションでは、Mac は普通に眠る。これを活動範囲スリープ防止(activity-scoped)と呼び、セッション単位のスリープ防止(session-scoped)とは区別する。
開発者にとっての直接の結果:安心して蓋を閉じて離れ、Agent にビルド・テスト・デプロイを走らせられる。タスクが終われば Mac は自動でスリープに戻り、caffeinate を手で切るのを覚えておく必要も、切り忘れて延々と無駄に消費する心配もない。
同時に何個動かしても混乱しない
複数の Agent を一緒に走らせたらどうなる?Adrafinil は参照カウントを使う:各セッションは開始で +1、終了で −1 し、カウントがゼロになって初めてスリープ防止を解除する。
オフィスは最後の一人が出てから消灯する、誰かが帰るたびに消すわけではない。途中でどれか一つのタスクが終わっても、まだ走っている他のタスクを巻き添えにすることはない。
下のこのカウントリングがこのページの目玉だ。好きな Agent をいくつか点けてみてほしい:リング内の数字が 0 より大きい限り Mac はスリープ防止(青いパルス);一つずつ消していき、数字がゼロになった瞬間、リングが灰色になり、Mac はようやく眠れる。
クリックで好きな Agent を起動 / 停止。リング内の数字 = 現在スリープ防止を保持しているセッション数;ゼロになって初めてスリープ防止を解除。
蓋を閉じても加熱しない
蓋を閉じて長いタスクを走らせるとき一番怖いのは、カバンに突っ込んで放熱が足りず、マシンを蒸し焼きにすること。Adrafinil はサーマル保護を内蔵していて、これが安心して蓋を閉じて離れられる肝心の備えになる。
温度以外にも、第二の自動解放がある:アサーションを保持しているプロセスがすでに死んでいる、あるいは CPU のアイドルが N 分を超えると、対応するスリープ防止は自動で破棄され、「プログラムが落ちたのにスリープ防止が外れない」という穴をふさぐ。
蓋を閉じると画面が消えて通知を出せないので、サウンドを一つ鳴らしてスリープ防止が有効になったことを知らせる;蓋を開け直すとサマリーを渡してくれる:離れている間に何が走ったか、ピーク温度はいくつか、サーマル保護が作動したかどうか。
プロセス検知(任意)
Hook を入れていなくても、Daemon は既知の Agent プログラムが動いているのを見つけると自動で acquire できる。これは任意のオプションで、Hook を設定しにくい場面の備えになる。
root は一つのことだけ
蓋を閉じたときの休眠を阻止するには root 権限が避けられない、これは macOS の固い決まりだ。Adrafinil のやり方は root の接触面を極限まで小さくすること。
まずなぜ root が必須かを説明する。Mac にはスリープ防止が二種類ある:「アイドル休眠」を阻止するには通常の API(IOPMAssertion)で足りる;だが「蓋閉じ休眠」(clamshell sleep)を阻止するには root レベルの pmset disablesleep が必須だ。Adrafinil は両方やるので、蓋を閉じてタスクを走らせても保つ。
一般社員はオフィスの照明タイマーを延長できる(アイドル休眠)が、ビル全体の入退室をロック解除して人が閉じ込められないようにする(蓋閉じ休眠)には、管理者権限を使う必要がある。
その解法は、このわずかな root 権限を最小の箱に閉じ込めること。アーキテクチャ全体は 3 層、縦に見ていくと:
ポリシーはすべてユーザー空間にある。参照カウント、サーマル監視、プロセス監視、CLI socket はすべて特権のない Daemon 内で動く;root で動く唯一の Helper が公開するのは状態を変更するインターフェイス setSleepBlocked(Bool) ただ一つで、最後のオンオフを実行するだけだ。この部分のコードを監査するなら、量はずっと少ない。
LaunchAgent vs LaunchDaemon、そして pmset の副作用
LaunchAgent はユーザーがログインした後に現在のユーザー権限で起動する;LaunchDaemon は起動時に root 権限で立ち上がる。Adrafinil はあえて Daemon を LaunchAgent(ユーザー権限)にし、最小の Helper だけを LaunchDaemon(root)にすることで、特権の面を縮めている。
もう二点、工学的な注意:公開の IOPM アサーション(つまり caffeinate が使うあれ)では蓋閉じ休眠をまったく防げないので、v1 はより乱暴な pmset disablesleep 1 を使った。これはアイドル休眠まで一緒に禁止してしまい、しかもシャットダウン時にクリアしないとリークするため、Helper は再起動時にまず状態を disablesleep 0 にリセットしてから再適用する。
対応する 9 種類と、入れ方
一つのコマンドで Hook をすべての Agent の設定に書き込む。まず対応リストを見よう:
インストールする
署名・公証済みの dmg をダウンロードし、開いて Applications にドラッグして起動する。初回起動時に一度だけ admin 権限を求め、あの特権 Helper を登録する。その後 install-hooks コマンド一つで、上記すべての Agent に Hook 設定を書き込む;使いたくなくなったら、uninstall-hooks が追加した Hook 項目を一つ残らず消してくれる。
システム要件
macOS Tahoe 26.4 以上(それより前の 26.x でも動くかもしれないが、作者は未検証)。自分でビルドするには Xcode 26 以上が必要で、Swift 6 の厳格な並行性を有効にする。管理者以外のインストールでは CLI を /usr/local/bin ではなく ~/.local/bin に置く。
知っておくと良いコマンドがもう二つ
返信より長く生き続けるバックグラウンドタスク(長いビルドやデプロイ)には、タイムアウト付きの hold コマンドで一定時間保たせ、時間が来れば自動で解放できる;MCP に対応した Agent なら adrafinil mcp が提供するツールから直接呼び出すこともできる:
Adrafinil only intervenes when an agent (Claude Code, Codex, Cursor, …) is mid-task, and gets out of the way the moment that work finishes. kageroumado · adrafinil README(GitHub)