mirror of
https://github.com/openai/codex.git
synced 2026-05-23 20:44:50 +00:00
# What <img width="1792" height="1024" alt="image" src="https://github.com/user-attachments/assets/8f81d232-5813-4994-a61d-e42a05a93a3e" /> `SubagentStop` runs when a thread-spawned subagent turn is about to finish. Thread-spawned subagents use `SubagentStop` instead of the normal root-agent `Stop` hook. Configured handlers match on `agent_type`. Hook input includes the normal stop fields plus: - `agent_id`: the child thread id. - `agent_type`: the resolved subagent type. - `agent_transcript_path`: the child subagent transcript path. - `transcript_path`: the parent thread transcript path. - `last_assistant_message`: the final assistant message from the child turn, when available. - `stop_hook_active`: `true` when the child is already continuing because an earlier stop-like hook blocked completion. `SubagentStop` shares the same completion-control semantics as `Stop`, scoped to the child turn: - No decision allows the child turn to finish. - `decision: "block"` with a non-empty `reason` records that reason as hook feedback and continues the child with that prompt. - `continue: false` stops the child turn. If `stopReason` is present, Codex surfaces it as the stop reason. # Lifecycle Scope Only thread-spawned subagents run `SubagentStop`. Internal/system subagents such as Review, Compact, MemoryConsolidation, and Other do not run normal `Stop` hooks and do not run `SubagentStop`. This avoids exposing synthetic matcher labels for internal implementation paths. # Stack 1. #22782: add `SubagentStart`. 2. This PR: add `SubagentStop`. 3. #22882: add subagent identity to normal hook inputs.
65 lines
1.3 KiB
JSON
Generated
65 lines
1.3 KiB
JSON
Generated
{
|
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
"additionalProperties": false,
|
|
"definitions": {
|
|
"HookEventNameWire": {
|
|
"enum": [
|
|
"PreToolUse",
|
|
"PermissionRequest",
|
|
"PostToolUse",
|
|
"PreCompact",
|
|
"PostCompact",
|
|
"SessionStart",
|
|
"UserPromptSubmit",
|
|
"SubagentStart",
|
|
"SubagentStop",
|
|
"Stop"
|
|
],
|
|
"type": "string"
|
|
},
|
|
"SessionStartHookSpecificOutputWire": {
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"additionalContext": {
|
|
"default": null,
|
|
"type": "string"
|
|
},
|
|
"hookEventName": {
|
|
"$ref": "#/definitions/HookEventNameWire"
|
|
}
|
|
},
|
|
"required": [
|
|
"hookEventName"
|
|
],
|
|
"type": "object"
|
|
}
|
|
},
|
|
"properties": {
|
|
"continue": {
|
|
"default": true,
|
|
"type": "boolean"
|
|
},
|
|
"hookSpecificOutput": {
|
|
"allOf": [
|
|
{
|
|
"$ref": "#/definitions/SessionStartHookSpecificOutputWire"
|
|
}
|
|
],
|
|
"default": null
|
|
},
|
|
"stopReason": {
|
|
"default": null,
|
|
"type": "string"
|
|
},
|
|
"suppressOutput": {
|
|
"default": false,
|
|
"type": "boolean"
|
|
},
|
|
"systemMessage": {
|
|
"default": null,
|
|
"type": "string"
|
|
}
|
|
},
|
|
"title": "session-start.command.output",
|
|
"type": "object"
|
|
} |