mod config_rules; mod declarations; mod engine; pub(crate) mod events; mod legacy_notify; mod mcp; mod output_spill; mod registry; mod schema; mod types; use codex_protocol::protocol::HookEventName; pub use config_rules::hook_states_from_stack; pub use declarations::PluginHookDeclaration; pub use declarations::plugin_hook_declarations; pub use engine::HookListEntry; pub use engine::HookListEntryHandler; pub use engine::dispatcher::hook_execution_mode_label; pub use engine::dispatcher::hook_handler_type_label; pub use events::common::SubagentHookContext; /// Hook event names as they appear in hooks JSON and config files. pub const HOOK_EVENT_NAMES: [&str; 12] = [ "PreToolUse", "PermissionRequest", "PostToolUse", "PreCompact", "PostCompact", "SessionStart", "SessionEnd", "UserPromptSubmit", "SubagentStart", "SubagentStop", "Stop", "Interrupt", ]; /// Hook event names whose matcher fields are meaningful during dispatch. /// /// Other events can appear in hooks JSON, but Codex ignores their matcher /// fields because those events do not dispatch against a tool, compaction /// trigger, session-start source, or session-end reason. pub const HOOK_EVENT_NAMES_WITH_MATCHERS: [&str; 9] = [ "PreToolUse", "PermissionRequest", "PostToolUse", "PreCompact", "PostCompact", "SessionStart", "SessionEnd", "SubagentStart", "SubagentStop", ]; pub use events::compact::PostCompactRequest; pub use events::compact::PreCompactOutcome; pub use events::compact::PreCompactRequest; pub use events::compact::StatelessHookOutcome; pub use events::interrupt::InterruptOutcome; pub use events::interrupt::InterruptRequest; pub use events::permission_request::PermissionRequestDecision; pub use events::permission_request::PermissionRequestOutcome; pub use events::permission_request::PermissionRequestRequest; pub use events::post_tool_use::PostToolUseOutcome; pub use events::post_tool_use::PostToolUseRequest; pub use events::pre_tool_use::PreToolUseOutcome; pub use events::pre_tool_use::PreToolUseRequest; pub use events::session_end::SessionEndOutcome; pub use events::session_end::SessionEndRequest; pub use events::session_start::SessionStartOutcome; pub use events::session_start::SessionStartRequest; pub use events::session_start::SessionStartSource; pub use events::session_start::StartHookTarget; pub use events::stop::StopHookTarget; pub use events::stop::StopOutcome; pub use events::stop::StopRequest; pub use events::user_prompt_submit::UserPromptSubmitOutcome; pub use events::user_prompt_submit::UserPromptSubmitRequest; pub use legacy_notify::legacy_notify_json; pub use mcp::HookMcpCall; pub use mcp::HookMcpExecutor; pub use registry::HookListOutcome; pub use registry::Hooks; pub use registry::HooksConfig; pub use registry::list_hooks; pub use schema::write_schema_fixtures; pub use types::Hook; pub use types::HookEvent; pub use types::HookEventAfterAgent; pub use types::HookPayload; pub use types::HookResponse; pub use types::HookResult; /// Returns the hook event label used in persisted hook-state keys. pub fn hook_event_key_label(event_name: HookEventName) -> &'static str { match event_name { HookEventName::PreToolUse => "pre_tool_use", HookEventName::PermissionRequest => "permission_request", HookEventName::PostToolUse => "post_tool_use", HookEventName::PreCompact => "pre_compact", HookEventName::PostCompact => "post_compact", HookEventName::SessionStart => "session_start", HookEventName::SessionEnd => "session_end", HookEventName::UserPromptSubmit => "user_prompt_submit", HookEventName::SubagentStart => "subagent_start", HookEventName::SubagentStop => "subagent_stop", HookEventName::Stop => "stop", HookEventName::Interrupt => "interrupt", } } /// Builds the persisted config-state key for one discovered hook handler. pub fn hook_key( key_source: &str, event_name: HookEventName, group_index: usize, handler_index: usize, ) -> String { format!( "{key_source}:{}:{group_index}:{handler_index}", hook_event_key_label(event_name) ) }