SpyBara
Go Premium Account
2026
8 Apr 2026, 00:40
14 May 2026, 21:00 14 May 2026, 07:00 13 May 2026, 00:57 12 May 2026, 01:59 11 May 2026, 18:00 7 May 2026, 20:02 7 May 2026, 17:08 5 May 2026, 23:00 2 May 2026, 06:45 2 May 2026, 00:48 1 May 2026, 18:29 30 Apr 2026, 18:36 29 Apr 2026, 12:40 29 Apr 2026, 00:50 25 Apr 2026, 06:37 25 Apr 2026, 00:42 24 Apr 2026, 18:20 24 Apr 2026, 12:28 23 Apr 2026, 18:31 23 Apr 2026, 12:28 23 Apr 2026, 00:46 22 Apr 2026, 18:29 22 Apr 2026, 00:42 21 Apr 2026, 18:29 21 Apr 2026, 12:30 21 Apr 2026, 06:45 20 Apr 2026, 18:26 20 Apr 2026, 06:53 18 Apr 2026, 18:18 17 Apr 2026, 00:44 16 Apr 2026, 18:31 16 Apr 2026, 00:46 15 Apr 2026, 18:31 15 Apr 2026, 06:44 14 Apr 2026, 18:31 14 Apr 2026, 12:29 13 Apr 2026, 18:37 13 Apr 2026, 00:44 12 Apr 2026, 06:38 10 Apr 2026, 18:23 9 Apr 2026, 00:33 8 Apr 2026, 18:32 8 Apr 2026, 00:40 7 Apr 2026, 00:40 2 Apr 2026, 18:23 31 Mar 2026, 06:35 31 Mar 2026, 00:39 28 Mar 2026, 06:26 28 Mar 2026, 00:36 27 Mar 2026, 18:23 27 Mar 2026, 00:39 26 Mar 2026, 18:27 25 Mar 2026, 18:24 23 Mar 2026, 18:22 20 Mar 2026, 00:35 18 Mar 2026, 12:23 18 Mar 2026, 00:36 17 Mar 2026, 18:24 17 Mar 2026, 00:33 16 Mar 2026, 18:25 16 Mar 2026, 12:23 14 Mar 2026, 00:32 13 Mar 2026, 18:15 13 Mar 2026, 00:34 11 Mar 2026, 00:31 9 Mar 2026, 00:34 8 Mar 2026, 18:10 8 Mar 2026, 00:35 7 Mar 2026, 18:10 7 Mar 2026, 06:14 7 Mar 2026, 00:33 6 Mar 2026, 00:38 5 Mar 2026, 18:41 5 Mar 2026, 06:22 5 Mar 2026, 00:34 4 Mar 2026, 18:18 4 Mar 2026, 06:20 3 Mar 2026, 18:20 3 Mar 2026, 00:35 27 Feb 2026, 18:15 24 Feb 2026, 06:27 24 Feb 2026, 00:33 23 Feb 2026, 18:27 21 Feb 2026, 00:33 20 Feb 2026, 12:16 19 Feb 2026, 20:53 19 Feb 2026, 20:37
5 May 2026, 23:00
14 May 2026, 21:00 14 May 2026, 07:00 13 May 2026, 00:57 12 May 2026, 01:59 11 May 2026, 18:00 7 May 2026, 20:02 7 May 2026, 17:08 5 May 2026, 23:00 2 May 2026, 06:45 2 May 2026, 00:48 1 May 2026, 18:29 30 Apr 2026, 18:36 29 Apr 2026, 12:40 29 Apr 2026, 00:50 25 Apr 2026, 06:37 25 Apr 2026, 00:42 24 Apr 2026, 18:20 24 Apr 2026, 12:28 23 Apr 2026, 18:31 23 Apr 2026, 12:28 23 Apr 2026, 00:46 22 Apr 2026, 18:29 22 Apr 2026, 00:42 21 Apr 2026, 18:29 21 Apr 2026, 12:30 21 Apr 2026, 06:45 20 Apr 2026, 18:26 20 Apr 2026, 06:53 18 Apr 2026, 18:18 17 Apr 2026, 00:44 16 Apr 2026, 18:31 16 Apr 2026, 00:46 15 Apr 2026, 18:31 15 Apr 2026, 06:44 14 Apr 2026, 18:31 14 Apr 2026, 12:29 13 Apr 2026, 18:37 13 Apr 2026, 00:44 12 Apr 2026, 06:38 10 Apr 2026, 18:23 9 Apr 2026, 00:33 8 Apr 2026, 18:32 8 Apr 2026, 00:40 7 Apr 2026, 00:40 2 Apr 2026, 18:23 31 Mar 2026, 06:35 31 Mar 2026, 00:39 28 Mar 2026, 06:26 28 Mar 2026, 00:36 27 Mar 2026, 18:23 27 Mar 2026, 00:39 26 Mar 2026, 18:27 25 Mar 2026, 18:24 23 Mar 2026, 18:22 20 Mar 2026, 00:35 18 Mar 2026, 12:23 18 Mar 2026, 00:36 17 Mar 2026, 18:24 17 Mar 2026, 00:33 16 Mar 2026, 18:25 16 Mar 2026, 12:23 14 Mar 2026, 00:32 13 Mar 2026, 18:15 13 Mar 2026, 00:34 11 Mar 2026, 00:31 9 Mar 2026, 00:34 8 Mar 2026, 18:10 8 Mar 2026, 00:35 7 Mar 2026, 18:10 7 Mar 2026, 06:14 7 Mar 2026, 00:33 6 Mar 2026, 00:38 5 Mar 2026, 18:41 5 Mar 2026, 06:22 5 Mar 2026, 00:34 4 Mar 2026, 18:18 4 Mar 2026, 06:20 3 Mar 2026, 18:20 3 Mar 2026, 00:35 27 Feb 2026, 18:15 24 Feb 2026, 06:27 24 Feb 2026, 00:33 23 Feb 2026, 18:27 21 Feb 2026, 00:33 20 Feb 2026, 12:16 19 Feb 2026, 20:53 19 Feb 2026, 20:37
Fri 1 18:29 Sat 2 00:48 Sat 2 06:45 Tue 5 23:00 Thu 7 17:08 Thu 7 20:02 Mon 11 18:00 Tue 12 01:59 Wed 13 00:57 Thu 14 07:00 Thu 14 21:00

After 2026-05-02 06:45 UTC, this monitor no longer uses markdownified HTML/MDX. Comparisons across that boundary can therefore show more extensive diffs.

hooks.md +206 −51

Details

1# Hooks1# Hooks

2 2 

3Experimental. Hooks are under active development. Windows support temporarily

4disabled.

5 

6Hooks are an extensibility framework for Codex. They allow3Hooks are an extensibility framework for Codex. They allow

7you to inject your own scripts into the agentic loop, enabling features such as:4you to inject your own scripts into the agentic loop, enabling features such as:

8 5 

9- Send the conversation to a custom logging/analytics engine6- Send the conversation to a custom logging/analytics engine

10- Scan your team's prompts to block accidentally pasting API keys7- Scan your team's prompts to block accidentally pasting API keys

11- Summarize conversations to create persistent memories automatically8- Summarize conversations to create persistent memories automatically

12- Run a custom validator when a conversation turn stops, enforcing standards9- Run a custom validation check when a conversation turn stops, enforcing standards

13- Customize prompting when in a certain directory10- Customize prompting when in a certain directory

14 11 

15Hooks are behind a feature flag in `config.toml`:12Hooks are behind a feature flag in `config.toml`:


24- Matching hooks from multiple files all run.21- Matching hooks from multiple files all run.

25- Multiple matching command hooks for the same event are launched concurrently,22- Multiple matching command hooks for the same event are launched concurrently,

26 so one hook cannot prevent another matching hook from starting.23 so one hook cannot prevent another matching hook from starting.

27- `PreToolUse`, `PostToolUse`, `UserPromptSubmit`, and `Stop` run at turn24- `PreToolUse`, `PermissionRequest`, `PostToolUse`, `UserPromptSubmit`, and

28 scope.25 `Stop` run at turn scope.

29- Hooks are currently disabled on Windows.

30 26 

31## Where Codex looks for hooks27## Where Codex looks for hooks

32 28 

33Codex discovers `hooks.json` next to active config layers.29Codex discovers hooks next to active config layers in either of these forms:

30 

31- `hooks.json`

32- inline `[hooks]` tables inside `config.toml`

33 

34Installed plugins can also bundle lifecycle config through their plugin

35manifest or a default `hooks/hooks.json` file. See [Build

36plugins](https://developers.openai.com/codex/plugins/build#bundled-mcp-servers-and-lifecycle-config) for the

37plugin packaging rules.

34 38 

35In practice, the two most useful locations are:39In practice, the four most useful locations are:

36 40 

37- `~/.codex/hooks.json`41- `~/.codex/hooks.json`

42- `~/.codex/config.toml`

38- `<repo>/.codex/hooks.json`43- `<repo>/.codex/hooks.json`

44- `<repo>/.codex/config.toml`

39 45 

40If more than one `hooks.json` file exists, Codex loads all matching hooks.46If more than one hook source exists, Codex loads all matching hooks.

41Higher-precedence config layers do not replace lower-precedence hooks.47Higher-precedence config layers do not replace lower-precedence hooks.

48If a single layer contains both `hooks.json` and inline `[hooks]`, Codex

49merges them and warns at startup. Prefer one representation per layer.

50 

51Project-local hooks load only when the project `.codex/` layer is trusted. In

52untrusted projects, Codex still loads user and system hooks from their own

53active config layers.

42 54 

43## Config shape55## Config shape

44 56 


75 ]87 ]

76 }88 }

77 ],89 ],

90 "PermissionRequest": [

91 {

92 "matcher": "Bash",

93 "hooks": [

94 {

95 "type": "command",

96 "command": "/usr/bin/python3 \"$(git rev-parse --show-toplevel)/.codex/hooks/permission_request.py\"",

97 "statusMessage": "Checking approval request"

98 }

99 ]

100 }

101 ],

78 "PostToolUse": [102 "PostToolUse": [

79 {103 {

80 "matcher": "Bash",104 "matcher": "Bash",


115Notes:139Notes:

116 140 

117- `timeout` is in seconds.141- `timeout` is in seconds.

118- `timeoutSec` is also accepted as an alias.

119- If `timeout` is omitted, Codex uses `600` seconds.142- If `timeout` is omitted, Codex uses `600` seconds.

120- `statusMessage` is optional.143- `statusMessage` is optional.

121- Commands run with the session `cwd` as their working directory.144- Commands run with the session `cwd` as their working directory.


123 relative path such as `.codex/hooks/...`. Codex may be started from a146 relative path such as `.codex/hooks/...`. Codex may be started from a

124 subdirectory, and a git-root-based path keeps the hook location stable.147 subdirectory, and a git-root-based path keeps the hook location stable.

125 148 

149Equivalent inline TOML in `config.toml`:

150 

151```toml

152[features]

153codex_hooks = true

154 

155[[hooks.PreToolUse]]

156matcher = "^Bash$"

157 

158[[hooks.PreToolUse.hooks]]

159type = "command"

160command = '/usr/bin/python3 "$(git rev-parse --show-toplevel)/.codex/hooks/pre_tool_use_policy.py"'

161timeout = 30

162statusMessage = "Checking Bash command"

163 

164[[hooks.PostToolUse]]

165matcher = "^Bash$"

166 

167[[hooks.PostToolUse.hooks]]

168type = "command"

169command = '/usr/bin/python3 "$(git rev-parse --show-toplevel)/.codex/hooks/post_tool_use_review.py"'

170timeout = 30

171statusMessage = "Reviewing Bash output"

172```

173 

174## Managed hooks from `requirements.toml`

175 

176Enterprise-managed requirements can also define hooks inline under `[hooks]`.

177This is useful when admins want to enforce the hook configuration while

178delivering the actual scripts through MDM or another device-management system.

179 

180```toml

181[features]

182codex_hooks = true

183 

184[hooks]

185managed_dir = "/enterprise/hooks"

186windows_managed_dir = 'C:\enterprise\hooks'

187 

188[[hooks.PreToolUse]]

189matcher = "^Bash$"

190 

191[[hooks.PreToolUse.hooks]]

192type = "command"

193command = "python3 /enterprise/hooks/pre_tool_use_policy.py"

194timeout = 30

195statusMessage = "Checking managed Bash command"

196```

197 

198Notes for managed hooks:

199 

200- `managed_dir` is used on macOS and Linux.

201- `windows_managed_dir` is used on Windows.

202- Codex does not distribute the scripts in `managed_dir`; your enterprise

203 tooling must install and update them separately.

204- Managed hook commands should use absolute script paths under the configured

205 managed directory.

206 

126## Matcher patterns207## Matcher patterns

127 208 

128The `matcher` field is a regex string that filters when hooks fire. Use `"*"`,209The `matcher` field is a regex string that filters when hooks fire. Use `"*"`,


132Only some current Codex events honor `matcher`:213Only some current Codex events honor `matcher`:

133 214 

134| Event | What `matcher` filters | Notes |215| Event | What `matcher` filters | Notes |

135| --- | --- | --- |216| ------------------- | ---------------------- | ------------------------------------------------------------ |

136| `PostToolUse` | tool name | Current Codex runtime only emits `Bash`. |217| `PermissionRequest` | tool name | Support includes `Bash`, `apply_patch`\*, and MCP tool names |

137| `PreToolUse` | tool name | Current Codex runtime only emits `Bash`. |218| `PostToolUse` | tool name | Support includes `Bash`, `apply_patch`\*, and MCP tool names |

138| `SessionStart` | start source | Current runtime values are `startup` and `resume`. |219| `PreToolUse` | tool name | Support includes `Bash`, `apply_patch`\*, and MCP tool names |

139| `UserPromptSubmit` | not supported | Any configured `matcher` is ignored for this event. |220| `SessionStart` | start source | Current runtime values are `startup`, `resume`, and `clear` |

140| `Stop` | not supported | Any configured `matcher` is ignored for this event. |221| `UserPromptSubmit` | not supported | Any configured `matcher` is ignored for this event |

222| `Stop` | not supported | Any configured `matcher` is ignored for this event |

223 

224\*For `apply_patch`, matchers can also use `Edit` or `Write`.

141 225 

142Examples:226Examples:

143 227 

144- `Bash`228- `Bash`

145- `startup|resume`229- `^apply_patch$`

146- `Edit|Write`230- `Edit|Write`

147 231- `mcp__filesystem__read_file`

148That last example is still a valid regex, but current Codex `PreToolUse` and232- `mcp__filesystem__.*`

149`PostToolUse` events only emit `Bash`, so it will not match anything today.233- `startup|resume|clear`

150 234 

151## Common input fields235## Common input fields

152 236 


155These are the shared fields you will usually use:239These are the shared fields you will usually use:

156 240 

157| Field | Type | Meaning |241| Field | Type | Meaning |

158| --- | --- | --- |242| ----------------- | ---------------- | ------------------------------------------- |

159| `session_id` | `string` | Current session or thread id. |243| `session_id` | `string` | Current session or thread id. |

160| `transcript_path` | `string | null` | Path to the session transcript file, if any |244| `transcript_path` | `string \| null` | Path to the session transcript file, if any |

161| `cwd` | `string` | Working directory for the session |245| `cwd` | `string` | Working directory for the session |

162| `hook_event_name` | `string` | Current hook event name |246| `hook_event_name` | `string` | Current hook event name |

163| `model` | `string` | Active model slug |247| `model` | `string` | Active model slug |


189 273 

190Exit `0` with no output is treated as success and Codex continues.274Exit `0` with no output is treated as success and Codex continues.

191 275 

192`PreToolUse` supports `systemMessage`, but `continue`, `stopReason`, and276`PreToolUse` and `PermissionRequest` support `systemMessage`, but `continue`,

193`suppressOutput` are not currently supported for that event.277`stopReason`, and `suppressOutput` aren't currently supported for those events.

194 278 

195`PostToolUse` supports `systemMessage`, `continue: false`, and `stopReason`.279`PostToolUse` supports `systemMessage`, `continue: false`, and `stopReason`.

196`suppressOutput` is parsed but not currently supported for that event.280`suppressOutput` is parsed but not currently supported for that event.


204Fields in addition to [Common input fields](#common-input-fields):288Fields in addition to [Common input fields](#common-input-fields):

205 289 

206| Field | Type | Meaning |290| Field | Type | Meaning |

207| --- | --- | --- |291| -------- | -------- | ---------------------------------------------- |

208| `source` | `string` | How the session started: `startup` or `resume` |292| `source` | `string` | How the session started: `startup` or `resume` |

209 293 

210Plain text on `stdout` is added as extra developer context.294Plain text on `stdout` is added as extra developer context.


225 309 

226### PreToolUse310### PreToolUse

227 311 

228Currently `PreToolUse` only supports Bash tool interception. The model can312`PreToolUse` can intercept Bash, file edits performed through `apply_patch`,

229still work around this by writing its own script to disk and then running that313and MCP tool calls. It is still a guardrail rather than a complete enforcement

230script with Bash, so treat this as a useful guardrail rather than a complete314boundary because Codex can often perform equivalent work through another

231enforcement boundary.315supported tool path.

316 

317This doesn't intercept all shell calls yet, only the simple ones. The newer

318 `unified_exec` mechanism allows richer streaming stdin/stdout handling of

319 shell, but interception is incomplete. Similarly, this doesn't intercept

320 `WebSearch` or other non-shell, non-MCP tool calls.

232 321 

233`matcher` is applied to `tool_name`, which currently always equals `Bash`.322`matcher` is applied to `tool_name` and matcher aliases. For file edits through

323`apply_patch`, matchers can use `apply_patch`, `Edit`, or `Write`; hook input

324still reports `tool_name: "apply_patch"`.

234 325 

235Fields in addition to [Common input fields](#common-input-fields):326Fields in addition to [Common input fields](#common-input-fields):

236 327 

237| Field | Type | Meaning |328| Field | Type | Meaning |

238| --- | --- | --- |329| ------------- | ------------ | --------------------------------------------------------------------------------------------------------- |

239| `turn_id` | `string` | Codex-specific extension. Active Codex turn id |330| `turn_id` | `string` | Codex-specific extension. Active Codex turn id |

240| `tool_name` | `string` | Currently always `Bash` |331| `tool_name` | `string` | Canonical hook tool name, such as `Bash`, `apply_patch`, or an MCP name like `mcp__fs__read` |

241| `tool_use_id` | `string` | Tool-call id for this invocation |332| `tool_use_id` | `string` | Tool-call id for this invocation |

242| `tool_input.command` | `string` | Shell command Codex is about to run |333| `tool_input` | `JSON value` | Tool-specific input. `Bash` and `apply_patch` use `tool_input.command` while MCP tools send all the args. |

243 334 

244Plain text on `stdout` is ignored.335Plain text on `stdout` is ignored.

245 336 


271`updatedInput`, `additionalContext`, `continue: false`, `stopReason`, and362`updatedInput`, `additionalContext`, `continue: false`, `stopReason`, and

272`suppressOutput` are parsed but not supported yet, so they fail open.363`suppressOutput` are parsed but not supported yet, so they fail open.

273 364 

365### PermissionRequest

366 

367`PermissionRequest` runs when Codex is about to ask for approval, such as a

368shell escalation or managed-network approval. It can allow the request, deny

369the request, or decline to decide and let the normal approval prompt continue.

370It doesn't run for commands that don't need approval.

371 

372`matcher` is applied to `tool_name` and matcher aliases. Current canonical

373values include `Bash`, `apply_patch`, and MCP tool names such as

374`mcp__server__tool`; `apply_patch` also matches `Edit` and `Write`.

375 

376Fields in addition to [Common input fields](#common-input-fields):

377 

378| Field | Type | Meaning |

379| ------------------------ | ---------------- | --------------------------------------------------------------------------------------------------------- |

380| `turn_id` | `string` | Codex-specific extension. Active Codex turn id |

381| `tool_name` | `string` | Canonical hook tool name, such as `Bash`, `apply_patch`, or an MCP name like `mcp__fs__read` |

382| `tool_input` | `JSON value` | Tool-specific input. `Bash` and `apply_patch` use `tool_input.command` while MCP tools send all the args. |

383| `tool_input.description` | `string \| null` | Human-readable approval reason, when Codex has one |

384 

385Plain text on `stdout` is ignored.

386 

387To approve the request, return:

388 

389```json

390{

391 "hookSpecificOutput": {

392 "hookEventName": "PermissionRequest",

393 "decision": {

394 "behavior": "allow"

395 }

396 }

397}

398```

399 

400To deny the request, return:

401 

402```json

403{

404 "hookSpecificOutput": {

405 "hookEventName": "PermissionRequest",

406 "decision": {

407 "behavior": "deny",

408 "message": "Blocked by repository policy."

409 }

410 }

411}

412```

413 

414If multiple matching hooks return decisions, any `deny` wins. Otherwise, an

415`allow` lets the request proceed without surfacing the approval prompt. If no

416matching hook decides, Codex uses the normal approval flow.

417 

418Don't return `updatedInput`, `updatedPermissions`, or `interrupt` for

419`PermissionRequest`; those fields are reserved for future behavior and fail

420closed today.

421 

274### PostToolUse422### PostToolUse

275 423 

276Currently `PostToolUse` only supports Bash tool results. It is not limited to424`PostToolUse` runs after supported tools produce output, including Bash,

277commands that exit successfully: non-interactive `exec_command` calls can still425`apply_patch`, and MCP tool calls. For Bash, it also runs after commands that

278trigger `PostToolUse` when Codex emits a Bash post-tool payload. It cannot undo426exit with a non-zero status. It can't undo side effects from the tool that

279side effects from the command that already ran.427already ran.

428 

429This doesn't intercept all shell calls yet, only the simple ones. The newer

430 `unified_exec` mechanism allows richer streaming stdin/stdout handling of

431 shell, but interception is incomplete. Similarly, this doesn't intercept

432 `WebSearch` or other non-shell, non-MCP tool calls.

280 433 

281`matcher` is applied to `tool_name`, which currently always equals `Bash`.434`matcher` is applied to `tool_name` and matcher aliases. For file edits through

435`apply_patch`, matchers can use `apply_patch`, `Edit`, or `Write`; hook input

436still reports `tool_name: "apply_patch"`.

282 437 

283Fields in addition to [Common input fields](#common-input-fields):438Fields in addition to [Common input fields](#common-input-fields):

284 439 

285| Field | Type | Meaning |440| Field | Type | Meaning |

286| --- | --- | --- |441| --------------- | ------------ | --------------------------------------------------------------------------------------------------------- |

287| `turn_id` | `string` | Codex-specific extension. Active Codex turn id |442| `turn_id` | `string` | Codex-specific extension. Active Codex turn id |

288| `tool_name` | `string` | Currently always `Bash` |443| `tool_name` | `string` | Canonical hook tool name, such as `Bash`, `apply_patch`, or an MCP name like `mcp__fs__read` |

289| `tool_use_id` | `string` | Tool-call id for this invocation |444| `tool_use_id` | `string` | Tool-call id for this invocation |

290| `tool_input.command` | `string` | Shell command Codex just ran |445| `tool_input` | `JSON value` | Tool-specific input. `Bash` and `apply_patch` use `tool_input.command` while MCP tools send all the args. |

291| `tool_response` | `JSON value` | Bash tool output payload. Today this is usually a JSON string |446| `tool_response` | `JSON value` | Tool-specific output. For MCP tools, this is the MCP call result. |

292 447 

293Plain text on `stdout` is ignored.448Plain text on `stdout` is ignored.

294 449 


307 462 

308That `additionalContext` text is added as extra developer context.463That `additionalContext` text is added as extra developer context.

309 464 

310For this event, `decision: "block"` does not undo the completed Bash command.465For this event, `decision: "block"` doesn't undo the completed Bash command.

311Instead, Codex records the feedback, replaces the tool result with that466Instead, Codex records the feedback, replaces the tool result with that

312feedback, and continues the model from the hook-provided message.467feedback, and continues the model from the hook-provided message.

313 468 


322 477 

323### UserPromptSubmit478### UserPromptSubmit

324 479 

325`matcher` is not currently used for this event.480`matcher` isn't currently used for this event.

326 481 

327Fields in addition to [Common input fields](#common-input-fields):482Fields in addition to [Common input fields](#common-input-fields):

328 483 

329| Field | Type | Meaning |484| Field | Type | Meaning |

330| --- | --- | --- |485| --------- | -------- | ---------------------------------------------- |

331| `turn_id` | `string` | Codex-specific extension. Active Codex turn id |486| `turn_id` | `string` | Codex-specific extension. Active Codex turn id |

332| `prompt` | `string` | User prompt that is about to be sent |487| `prompt` | `string` | User prompt that's about to be sent |

333 488 

334Plain text on `stdout` is added as extra developer context.489Plain text on `stdout` is added as extra developer context.

335 490 


360 515 

361### Stop516### Stop

362 517 

363`matcher` is not currently used for this event.518`matcher` isn't currently used for this event.

364 519 

365Fields in addition to [Common input fields](#common-input-fields):520Fields in addition to [Common input fields](#common-input-fields):

366 521 

367| Field | Type | Meaning |522| Field | Type | Meaning |

368| --- | --- | --- |523| ------------------------ | ---------------- | ------------------------------------------------- |

369| `turn_id` | `string` | Codex-specific extension. Active Codex turn id |524| `turn_id` | `string` | Codex-specific extension. Active Codex turn id |

370| `stop_hook_active` | `boolean` | Whether this turn was already continued by `Stop` |525| `stop_hook_active` | `boolean` | Whether this turn was already continued by `Stop` |

371| `last_assistant_message` | `string | null` | Latest assistant message text, if available |526| `last_assistant_message` | `string \| null` | Latest assistant message text, if available |

372 527 

373`Stop` expects JSON on `stdout` when it exits `0`. Plain text output is invalid528`Stop` expects JSON on `stdout` when it exits `0`. Plain text output is invalid

374for this event.529for this event.


385 540 

386You can also use exit code `2` and write the continuation reason to `stderr`.541You can also use exit code `2` and write the continuation reason to `stderr`.

387 542 

388For this event, `decision: "block"` does not reject the turn. Instead, it tells543For this event, `decision: "block"` doesn't reject the turn. Instead, it tells

389Codex to continue and automatically creates a new continuation prompt that acts544Codex to continue and automatically creates a new continuation prompt that acts

390as a new user prompt, using your `reason` as that prompt text.545as a new user prompt, using your `reason` as that prompt text.

391 546