Event Overview
| Event | Trigger | Controllable Behavior |
|---|---|---|
PreToolUse | Before tool invocation | Intercept / allow / modify input |
PostToolUse | After tool succeeds | Audit / inject context / override output |
PostToolUseFailure | After tool fails | Error handling / logging |
UserPromptSubmit | Before user prompt is sent | Inject context / intercept |
SessionStart | Session begins | Initialize / inject context |
SessionEnd | Session ends | Cleanup / logging |
Stop | AI stops generating | Prevent stop, force continuation |
SubagentStart | Subagent starts | Observe / log |
SubagentStop | Subagent stops | Observe / log |
PreCompact | Before context compaction | Observe / log |
PostCompact | After context compaction | Observe / log |
CwdChanged | Working directory changes | Observe / log |
InstructionsLoaded | Instruction file loaded | Observe / log |
FileChanged | File created/modified/deleted | Observe / log |
PermissionRequest | Permission requested | Auto-approve / deny permission requests |
Configuration
Configure hooks viaQoderAgentOptions.hooks:
Matcher
Thematcher field is a regex pattern — hooks only fire when the tool name matches:
Callback Functions
Each hook callback receives the event input, tool use ID, and context:Inputs
All events share common fields:hook_event_name (event type), session_id (session ID), transcript_path (transcript file path), cwd (working directory). Each event also has event-specific fields, such as tool_name and tool_input for PreToolUse.
For complete input type definitions, see Hooks Reference.
Outputs
Callbacks return a dict that controls behavior through these fields:continue_: False— Terminate the session (serialized as JSON"continue")decision: "block"+reason— Block tool execution or prevent the AI from stoppinghookSpecificOutput— Event-specific output, such as modifying tool input (updatedInput), overriding tool output (updatedToolOutput), or injecting context (additionalContext)
Examples
Security Interception (PreToolUse)
Block dangerous shell commands:Redact Sensitive Information (PostToolUse)
Override tool output to replace AK/Token and other sensitive information:Truncate Long Output (PostToolUse)
Trim overly long Bash output, keeping head and tail:Force Continuation (Stop)
Prevent the AI from stopping when the task is incomplete:Auto-Approve Permissions (PermissionRequest)
Automatically approve Read tool permission requests:For the complete permission model, see the Permissions documentation.
Audit and Security Controls (Combined)
Combine audit logging with security interception:Notes
- Hook callbacks should return quickly to avoid blocking AI execution.
matcheruses Python regex syntax (theremodule), matching thetool_namefield.continue_: Falseterminates the session — only effective forPreToolUse,PostToolUse,PostToolUseFailure,UserPromptSubmit,Stop, andSubagentStopevents. Observation events (e.g.,SessionEnd,CwdChanged) ignore this field.- When multiple hooks return conflicting
decisionvalues,"deny"/"block"takes precedence (strictest rule wins). - When multiple hooks set
updatedToolOutput, the last non-empty value wins. For chained transforms (e.g., redact then truncate), execute them sequentially within a single callback. - The Python SDK uses trailing-underscore field names (
continue_) to avoid conflicts with Python keywords. The SDK automatically converts them to wire-protocol names (continue) during serialization.