Codexに「中断されたら実行されるフック」が追加──タイムアウトは既定1秒・最大3秒
OpenAI Codex 0.150.0(2026年8月26日)に、実行中のターンが中断されたときにコマンドやMCPハンドラを起動できるInterrupt hooksが追加された。実装したPR本文によれば、フックにはセッション・ターン・トランスクリプト・作業ディレクトリ・モデル・権限モードが渡され、タイムアウトは既定1秒・最大3秒という具体的な数字がある。

目次
OpenAIのコーディングエージェントCLI「Codex」の0.150.0(2026年8月26日公開)に、実行を中断したタイミングでコマンドやMCPハンドラを走らせられる新しいフックが追加された。リリースノート本文の1行と、実装したマージ済みPR #40511の本文、そしてPR内の差分ファイルを確認した。
3行まとめ
- Codex 0.150.0(2026年8月26日)で、12種類あるフックイベントの1つとして
Interruptが新設され、hooks.jsonに"Interrupt"キーとして設定する- 入力JSONは
hook_event_name・session_id・turn_id・cwd・model・transcript_path・permission_modeの7フィールド(すべて必須)で、permission_modeはdefault/acceptEdits/plan/dontAsk/bypassPermissionsの5値のいずれか- タイムアウトは既定1秒・最大3秒だが、PR内のテストコードでは「設定ファイルに20秒と書いても実際には3秒に切り詰められる」ことがアサーションで確認されている(エラー拒否ではなくクランプ)
リリースノートの1行
New
Interrupthooks can run commands or MCP handlers when an active top-level turn is interrupted. (#40511)
(新しいInterruptフックは、アクティブなトップレベルのターンが中断されたときに、コマンドやMCPハンドラを実行できる)
フックに渡される情報とタイムアウト
PR本文には、リリースノート1行以上の実装詳細が書かれている。
- Add an
Interrupthook event that runs for an active top-level turn before its interrupted abort event is emitted.- Flush the turn transcript before invoking the hook and provide the session, turn, transcript, working directory, model, and permission mode in its input.
- Support command and MCP handlers, including asynchronous commands, with a one-second default timeout and a three-second maximum.
- Expose the event through hook configuration, managed requirements, app-server notifications, generated schemas, analytics, and the TUI hook views.
(アクティブなトップレベルのターンに対して、中断のabortイベントが発行される前に実行されるInterruptフックイベントを追加する。フックを呼び出す前にターンのトランスクリプトをフラッシュし、その入力にセッション・ターン・トランスクリプト・作業ディレクトリ・モデル・権限モードを提供する。非同期コマンドを含む、コマンドとMCPハンドラの両方をサポートし、タイムアウトは既定1秒・最大3秒。このイベントを、フック設定・管理された要件・アプリサーバー通知・生成されたスキーマ・分析・TUIのフックビューを通じて公開する)
タイムアウトの数字が明記されている点は実務上参考になる。フック側の処理が1秒を超えると既定ではタイムアウトし、設定を変えても3秒が上限になる、という制約だ。中断イベント自体を止めてしまわないよう、フックの実行時間に強い制限をかけている設計だと読み取れる。
フック入力の正確なフィールド一覧
PR本文の説明は「セッション・ターン・トランスクリプト・作業ディレクトリ・モデル・権限モード」という言葉だったが、実際にPR内で追加されたJSON Schemaファイル(interrupt.command.input.schema.json)を確認すると、フックの標準入力(stdin)に渡されるJSONの正確なフィールド名と型が分かる。
| フィールド | 型 | 内容 |
|---|---|---|
hook_event_name |
文字列(固定値"Interrupt") |
このフックがどのイベントで呼ばれたか |
session_id |
文字列 | セッションID |
turn_id |
文字列 | 中断されたターンのID(Codex独自の拡張フィールドと注記あり) |
cwd |
文字列 | 作業ディレクトリ |
model |
文字列 | 使用中のモデル名 |
transcript_path |
文字列またはnull | トランスクリプトファイルのパス |
permission_mode |
列挙型 | default / acceptEdits / plan / dontAsk / bypassPermissionsのいずれか |
出典: PR #40511内interrupt.command.input.schema.json(2026年8月29日確認、7フィールドすべてがrequired指定)
permission_modeの5つの値がここで確認できたことで、Codexの権限モードが少なくともこの5種類に分かれていることが分かる。出力側のスキーマ(interrupt.command.output.schema.json)はさらに単純で、systemMessageという文字列フィールド1つだけが定義されていた。
設定ファイルの実際の形と、タイムアウトが「拒否」ではなく「切り詰め」であることの確認
PRに追加されたテストコード(interrupt_hooks.rs・mod_tests.rs)を読むと、Interrupt hookの設定はCODEX_HOME直下のhooks.jsonというファイルに、次のような形で書くことが分かる。
{
"hooks": {
"Interrupt": [{
"hooks": [{
"type": "mcp_tool",
"server": "security",
"tool": "notify",
"input": {
"event": "${hook_event_name}",
"turn_id": "${turn_id}",
"permission_mode": "${permission_mode}"
},
"timeout": 20
}]
}]
}
}
(コマンド型の場合は"type": "command"と"command"フィールドで実行コマンドを指定する形になる)
このテストコードで特に興味深いのは、"timeout": 20(20秒)を設定ファイルに書いているにもかかわらず、実際にMCPツール呼び出しへ渡されるタイムアウトがDuration::from_secs(3)(3秒)になっている、とテストのアサーションで明示的に検証されている点だ。テスト自体の名前もbound_timeout(タイムアウトを上限で切り詰める)となっている。つまり「最大3秒」という制約は、3秒を超える設定値をエラーで拒否するのではなく、黙って3秒に切り詰める(クランプする)という実装であることが、PR本文の説明文だけでなく、実際のテストコードのアサーションからも確認できた。
12種類あるフックイベントの中の1つ
hook_config.rsを確認すると、Interruptは今回新設された13番目ではなく、既存の11種類に追加された12番目のフックイベントであることが分かる。
| フックイベント名 | 新規/既存 |
|---|---|
| PreToolUse | 既存 |
| PermissionRequest | 既存 |
| PostToolUse | 既存 |
| PreCompact | 既存 |
| PostCompact | 既存 |
| SessionStart | 既存 |
| SessionEnd | 既存 |
| UserPromptSubmit | 既存 |
| SubagentStart | 既存 |
| SubagentStop | 既存 |
| Stop | 既存 |
| Interrupt | 今回のPR #40511で新規追加 |
出典: PR #40511内codex-rs/config/src/hook_config.rs(2026年8月29日確認)
何に使えるのか
「中断されたときに何かを実行する」という機能は、たとえば作業途中の状態を外部システムへ通知する、ログを追加で書き出す、後片付け処理を挟む、といった用途を想定していると考えられる。ただし、PR本文にはこうした具体的なユースケースの記載はなく、これは本記事による推測にとどまる。テストの範囲としては「ハンドラの発見、タイムアウトの正規化、出力のパース、プロトコルの互換性、TUIでの表示、中断実行の順序」をカバーしたとPR本文に書かれている。
同じリリースにあった他の新機能
Codex 0.150.0のリリースノートには、Interrupt hooks以外にも「@メンションで他のCodexタスクを参照する」機能(別記事で扱う)、/copyにフルレスポンス・個別コードブロック・引用のピッカーが追加されたこと、名前の無いターミナルタスクに自動で説明的なタイトルが付くようになったこと、Vimモードで.キーによる直前の編集の繰り返しなどが挙げられている。
実際に中断フックを設定して動かしたわけではない
本記事はCodex 0.150.0のリリースノート本文、実装PR #40511の本文、そしてPR内の差分ファイル(JSON Schema・Rustソース・テストコード)を情報源としている。設定ファイルの構造やタイムアウトの切り詰め挙動はテストコードのアサーションから確認できたが、これはあくまでPRに含まれるテストスイートの中身であり、この記事を書いている自分の手元でCodex CLIを実際にインストールし、hooks.jsonを書いてコマンドまたはMCPハンドラをInterrupt hookとして設定し、意図的にターンを中断させて動作を確認する検証は行っていない。また、hooks.jsonというJSON形式の設定ファイルが唯一の設定経路なのか、TOML形式(config.toml)でも同様に書けるのかは、hook_config.rsがserdeのDeserializeを使っている以上どちらも技術的には可能に見えるが、実際にどちらが公式にドキュメント化された記法なのかは、今回確認したPRの差分だけからは断定できなかった。
関連記事: AIコーディングアシスタント比較──Copilot/Cursor/Claude Code【2026年】 / Codex Goal Mode 一般提供開始 / MCP(Model Context Protocol)とは
感想・指摘はコメント欄へ。
出典・参照資料
AIニュースの解説を動画でも
YouTubeでは注目ニュースの背景を解説し、Xでは新着記事をお知らせしています。
コメント
まだコメントはありません。最初のコメントを書いてみませんか?
AIについて聞きたいことはありますか?
質問箱で無料で受け付けています。回答は公開され、他の方の参考にもなります。
質問箱を見る →新しい記事をメールで受け取る
AIの新しい発表を、出典付きで整理して届けます。