製品リリース · 小互解読

AI が止まってから Mac を眠らせる、スリープ防止を突き詰めたオープンソースツール

Claude Code など 9 種類の Agent をワンクリック統合、蓋を閉じてもタスクを継続、作業停止から 50ms 以内にスリープ制御を自動解放
概要
  • 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) ただ一つで、残りのロジックはすべてユーザー空間で動く。
1シーン

あなたは蓋を閉じて寝た、Agent はまだ走っている

オープンソース開発者の kageroumado が先日 Adrafinil を公開した。macOS のメニューバーツールで、AI コーディング Agent が実際に働いているときだけ Mac のスリープを阻止し、Agent が止まると自動で通常のスリープに戻る。

午前 3 時、あなたは寝た、Agent は寝ていない。数時間前にあなたが立ち上げたあのセッションの中でまだ動いていて、あなたはまぶたを閉じるようにノートの蓋を閉じた、でもこの目は本当には閉じていない。矛盾はここにある:Agent のタスクサイクルと Mac のスリープ方針は、互いに相手が何をしているか知らない。蓋を閉じればシステムは慣例どおり休眠し、タスクは途中で切れる。

Adrafinil はスリープ防止を AI Agent の作業状態に正確に紐づける:Agent が実際にタスクを走らせている間は眠らせない(蓋を閉じても)、タスクが止まればすぐにスリープの制御権を返す。
macOS のスリープ防止を Agent セッションの活動状態で正確にオンオフする初のツール。CLI 往復 50ms 未満、ワンクリック Hook で 9 種類の主要 Agent に接続、参照カウントで複数セッションの並行を処理、root 権限の面を ブール値インターフェイス一つまで圧縮。
<50ms
CLI の acquire / release コマンドから Daemon への往復遅延。Agent のワークフローを遅らせない
9
ワンクリック Hook インストールに対応する AI Agent の数
3
権限の層数(App/CLI → Daemon → Helper)、root の接触面を最小化
1
Helper が公開する root インターフェイスの数:setSleepBlocked(Bool)

名前そのものが設計の説明になっている。Adrafinil はある覚醒促進薬(eugeroic)から借りた名だ。興奮剤(stimulant)とは違い、覚醒促進剤は必要なときだけ目を覚まさせ、不要なときは介入しない。これこそ caffeinate のような「常に覚醒」型ツールとの根本的な違いだ:仕事があるときだけスリープを防ぐ。

2比較

これまでのやり方では足りない理由

Adrafinil 以前、長いタスクを走らせる間 Mac を眠らせないようにするには両極端の二択しかなく、どちらも「タスクが実際に走っている」時間にぴたりと合わせられなかった。

caffeinate と Amphetamine は興奮剤型で、オンにすれば仕事の有無にかかわらず全行程ずっと覚醒したまま。タスクがとっくに終わっても、マシンは空回りして電力を食い熱を出す。逆に何も入れなければ蓋を閉じた瞬間に眠り、長いタスクはそのまま中断する。下では 3 つのケースを同じタイムライン上に並べた:スリープ防止のウィンドウとタスクのウィンドウが揃っているか、一目で分かる。

夜に長いタスクを起動 ─────────────▶ タスク完了
タスクが実際に走る(基準)
caffeinate / Amphetamine
何も入れない
adrafinil
タスク区間スリープ防止蓋閉じで即スリープ・中断

caffeinate のスリープ防止バーは最初から最後まで点きっぱなしで、タスク終了後の長い区間はまるごと無駄。何も入れない行は蓋を閉じたところに赤い×印があり、タスクが終わる前に切られる。adrafinil のバーだけがタスク区間にぴたりと貼りつき、前後に一秒も余計に保たない。

3コア仕組み

Agent の呼吸に合わせる

Adrafinil の核心はシンプルだ:Agent が働き始めればスリープ防止を申請し、手を止めれば解放する。Mac は Agent が実際にタスクを実行している間だけ覚醒し続ける。メニューバーのアイコンもこの 2 つの状態しかない。

awake 状態:Agent が作業中
「awake」状態:Agent が作業中で、メニューバーのアイコンがスリープ防止中を表示。出典:プロジェクトの README
sleeping 状態:Agent なし、通常スリープ
「sleeping」状態:動いている Agent がなく、Mac は通常どおりスリープ。出典:プロジェクトの README

Agent は Adrafinil と直接やり取りせず、それぞれの Hook システム経由で付属のコマンドラインを呼び出す:

adrafinil acquire <session-key> --tool claude-code --reason "long build" # 1 ラウンド開始時 adrafinil release <session-key> # Agent がアイドルに入るとき

Claude Code を例にすると、信号の連鎖はこう流れる:

UserPromptSubmit指示を送る
acquireカウント +1
Agent 作業中スリープ阻止
Stopタスク停止
releaseカウント −1
カウント 0復帰
Mac スリープ可蓋閉じで即眠
Hero · 活動範囲スリープ防止

肝心なのは、守るのが「働いている」区間であって「プログラムが開いている」区間ではないこと。Claude Code は UserPromptSubmit のとき acquire し、Stop のとき release する。だから開いていても入力欄であなたの入力を待って止まっているセッションでは、Mac は普通に眠る。これを活動範囲スリープ防止(activity-scoped)と呼び、セッション単位のスリープ防止(session-scoped)とは区別する。

開発者にとっての直接の結果:安心して蓋を閉じて離れ、Agent にビルド・テスト・デプロイを走らせられる。タスクが終われば Mac は自動でスリープに戻り、caffeinate を手で切るのを覚えておく必要も、切り忘れて延々と無駄に消費する心配もない。

4複数セッション

同時に何個動かしても混乱しない

複数の Agent を一緒に走らせたらどうなる?Adrafinil は参照カウントを使う:各セッションは開始で +1、終了で −1 し、カウントがゼロになって初めてスリープ防止を解除する。

たとえると

オフィスは最後の一人が出てから消灯する、誰かが帰るたびに消すわけではない。途中でどれか一つのタスクが終わっても、まだ走っている他のタスクを巻き添えにすることはない。

下のこのカウントリングがこのページの目玉だ。好きな Agent をいくつか点けてみてほしい:リング内の数字が 0 より大きい限り Mac はスリープ防止(青いパルス);一つずつ消していき、数字がゼロになった瞬間、リングが灰色になり、Mac はようやく眠れる。

稼働セッション

クリックで好きな Agent を起動 / 停止。リング内の数字 = 現在スリープ防止を保持しているセッション数;ゼロになって初めてスリープ防止を解除。

5安全の備え

蓋を閉じても加熱しない

蓋を閉じて長いタスクを走らせるとき一番怖いのは、カバンに突っ込んで放熱が足りず、マシンを蒸し焼きにすること。Adrafinil はサーマル保護を内蔵していて、これが安心して蓋を閉じて離れられる肝心の備えになる。

SMC 温度計測常時監視
筐体 / CPU 温度しきい値超過
強制 release全アサーション解放
Mac 復帰通常スリープで放熱

温度以外にも、第二の自動解放がある:アサーションを保持しているプロセスがすでに死んでいる、あるいは CPU のアイドルが N 分を超えると、対応するスリープ防止は自動で破棄され、「プログラムが落ちたのにスリープ防止が外れない」という穴をふさぐ。

蓋を閉じると画面が消えて通知を出せないので、サウンドを一つ鳴らしてスリープ防止が有効になったことを知らせる;蓋を開け直すとサマリーを渡してくれる:離れている間に何が走ったか、ピーク温度はいくつか、サーマル保護が作動したかどうか。

プロセス検知(任意)

Hook を入れていなくても、Daemon は既知の Agent プログラムが動いているのを見つけると自動で acquire できる。これは任意のオプションで、Hook を設定しにくい場面の備えになる。

6セキュリティ設計

root は一つのことだけ

蓋を閉じたときの休眠を阻止するには root 権限が避けられない、これは macOS の固い決まりだ。Adrafinil のやり方は root の接触面を極限まで小さくすること。

まずなぜ root が必須かを説明する。Mac にはスリープ防止が二種類ある:「アイドル休眠」を阻止するには通常の API(IOPMAssertion)で足りる;だが「蓋閉じ休眠」(clamshell sleep)を阻止するには root レベルの pmset disablesleep が必須だ。Adrafinil は両方やるので、蓋を閉じてタスクを走らせても保つ。

たとえると

一般社員はオフィスの照明タイマーを延長できる(アイドル休眠)が、ビル全体の入退室をロック解除して人が閉じ込められないようにする(蓋閉じ休眠)には、管理者権限を使う必要がある。

その解法は、このわずかな root 権限を最小の箱に閉じ込めること。アーキテクチャ全体は 3 層、縦に見ていくと:

Adrafinil.app ユーザー空間 · メニューバー
状態アイコン、設定、インストールウィザード GUI、蓋開けサマリー。純粋な表示層で、終了・再起動しても保持中のスリープ防止には影響しない。
XPC
AdrafinilDaemon ユーザー空間 · LaunchAgent
参照カウントの登録、プロセス監視(kqueue NOTE_EXIT + 周期巡回)、サーマル監視(SMC)、蓋閉じサウンド、CLI socket。すべてのポリシーはここにあり、これこそが唯一の真実の源だ。
XPC · 特権 Mach service
AdrafinilHelper root · LaunchDaemon
スリープ防止 API に触れる唯一のコンポーネント。公開するのは setSleepBlocked(Bool) と読み取り専用の状態照会だけで、呼び出し元のコード署名を検証する。ポリシーロジックは一切含まない。
adrafinil CLI は .app に同梱され、PATH にシンボリックリンクされ、Daemon socket に直結、往復 <50ms
Hero · root 最小化

ポリシーはすべてユーザー空間にある。参照カウント、サーマル監視、プロセス監視、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 にリセットしてから再適用する。

7対応範囲とインストール

対応する 9 種類と、入れ方

一つのコマンドで Hook をすべての Agent の設定に書き込む。まず対応リストを見よう:

Claude CodeCodexCursorGemini CLIAiderHermesOpenCodeClinePi

インストールする

署名・公証済みの 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 hold --for 30m --reason "deploy" # 最大 30 分スリープ防止して自動解放 adrafinil mcp # stdio 上で MCP プロトコルを話し、Agent に使わせる
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)
出典:本記事は kageroumado が GitHub で公開した adrafinil プロジェクトの説明(README と Docs/ARCHITECTURE.md)をもとにまとめた。プロジェクトは MIT ライセンスでオープンソース化されている。本文中の性能と仕組みの記述はすべてプロジェクトのドキュメントによる。