Skip to main content

codex_hooks/
lib.rs

1mod config_rules;
2mod declarations;
3mod engine;
4pub(crate) mod events;
5mod legacy_notify;
6mod output_spill;
7mod registry;
8mod schema;
9mod types;
10
11use codex_protocol::protocol::HookEventName;
12
13pub use config_rules::hook_states_from_stack;
14pub use declarations::PluginHookDeclaration;
15pub use declarations::plugin_hook_declarations;
16pub use engine::HookListEntry;
17pub use events::common::SubagentHookContext;
18/// Hook event names as they appear in hooks JSON and config files.
19pub const HOOK_EVENT_NAMES: [&str; 11] = [
20    "PreToolUse",
21    "PermissionRequest",
22    "PostToolUse",
23    "PreCompact",
24    "PostCompact",
25    "SessionStart",
26    "SessionEnd",
27    "UserPromptSubmit",
28    "SubagentStart",
29    "SubagentStop",
30    "Stop",
31];
32
33/// Hook event names whose matcher fields are meaningful during dispatch.
34///
35/// Other events can appear in hooks JSON, but Codex ignores their matcher
36/// fields because those events do not dispatch against a tool, compaction
37/// trigger, session-start source, or session-end reason.
38pub const HOOK_EVENT_NAMES_WITH_MATCHERS: [&str; 9] = [
39    "PreToolUse",
40    "PermissionRequest",
41    "PostToolUse",
42    "PreCompact",
43    "PostCompact",
44    "SessionStart",
45    "SessionEnd",
46    "SubagentStart",
47    "SubagentStop",
48];
49
50pub use events::compact::PostCompactRequest;
51pub use events::compact::PreCompactOutcome;
52pub use events::compact::PreCompactRequest;
53pub use events::compact::StatelessHookOutcome;
54pub use events::permission_request::PermissionRequestDecision;
55pub use events::permission_request::PermissionRequestOutcome;
56pub use events::permission_request::PermissionRequestRequest;
57pub use events::post_tool_use::PostToolUseOutcome;
58pub use events::post_tool_use::PostToolUseRequest;
59pub use events::pre_tool_use::PreToolUseOutcome;
60pub use events::pre_tool_use::PreToolUseRequest;
61pub use events::session_end::SessionEndOutcome;
62pub use events::session_end::SessionEndRequest;
63pub use events::session_start::SessionStartOutcome;
64pub use events::session_start::SessionStartRequest;
65pub use events::session_start::SessionStartSource;
66pub use events::session_start::StartHookTarget;
67pub use events::stop::StopHookTarget;
68pub use events::stop::StopOutcome;
69pub use events::stop::StopRequest;
70pub use events::user_prompt_submit::UserPromptSubmitOutcome;
71pub use events::user_prompt_submit::UserPromptSubmitRequest;
72pub use legacy_notify::legacy_notify_json;
73pub use legacy_notify::notify_hook;
74pub use registry::HookListOutcome;
75pub use registry::Hooks;
76pub use registry::HooksConfig;
77pub use registry::command_from_argv;
78pub use registry::list_hooks;
79pub use schema::write_schema_fixtures;
80pub use types::Hook;
81pub use types::HookEvent;
82pub use types::HookEventAfterAgent;
83pub use types::HookPayload;
84pub use types::HookResponse;
85pub use types::HookResult;
86
87/// Returns the hook event label used in persisted hook-state keys.
88pub fn hook_event_key_label(event_name: HookEventName) -> &'static str {
89    match event_name {
90        HookEventName::PreToolUse => "pre_tool_use",
91        HookEventName::PermissionRequest => "permission_request",
92        HookEventName::PostToolUse => "post_tool_use",
93        HookEventName::PreCompact => "pre_compact",
94        HookEventName::PostCompact => "post_compact",
95        HookEventName::SessionStart => "session_start",
96        HookEventName::SessionEnd => "session_end",
97        HookEventName::UserPromptSubmit => "user_prompt_submit",
98        HookEventName::SubagentStart => "subagent_start",
99        HookEventName::SubagentStop => "subagent_stop",
100        HookEventName::Stop => "stop",
101    }
102}
103
104/// Builds the persisted config-state key for one discovered hook handler.
105pub fn hook_key(
106    key_source: &str,
107    event_name: HookEventName,
108    group_index: usize,
109    handler_index: usize,
110) -> String {
111    format!(
112        "{key_source}:{}:{group_index}:{handler_index}",
113        hook_event_key_label(event_name)
114    )
115}