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;
18pub 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
33pub 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
87pub 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
104pub 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}