Skip to main content

HookDef

Struct HookDef 

Source
pub struct HookDef {
    pub action: HookAction,
    pub timeout_secs: u64,
    pub fail_closed: bool,
    pub if: Option<String>,
}
Expand description

A single hook definition.

Hooks are fired at specific lifecycle points. The action field determines whether the hook runs a shell command or dispatches to an MCP server tool.

§Examples

[[hooks.cwd_changed]]
type = "command"
command = "echo changed to $ZEPH_NEW_CWD"
timeout_secs = 10
fail_closed = false

# Conditional hook — only fires when the triggering tool name contains "shell":
[[hooks.post_tool_use]]
matcher = "Shell"
[[hooks.post_tool_use.hooks]]
type = "command"
command = "echo shell ran"
if = "tool:shell"

Fields§

§action: HookAction

The action to execute: shell command or MCP tool call.

§timeout_secs: u64

Maximum seconds to wait for the hook before timing out. Default: 30.

§fail_closed: bool

When true, a non-zero exit code or timeout aborts the remaining hooks in the same sequence (no further hooks in the list run). When false (default), errors are logged and the next hook in the sequence continues.

Note: in pre_tool_use and post_tool_use contexts this field controls hook-chain execution only — it does not block the tool call itself. Hook dispatch is always fail-open at the agent level; the tool executes regardless of hook outcomes.

§if: Option<String>

Optional condition that must match for this hook to fire.

When None (the default), the hook fires unconditionally at every matching lifecycle event. When Some, the value is a key:value filter string. Supported keys:

  • tool:<token> — the hook fires only when ZEPH_TOOL_NAME contains <token> (case-sensitive substring, same rule as HookMatcher). An empty token (tool:) always evaluates to false (fail-closed).

Unknown keys and malformed values (no :) also evaluate to false so that a misconfigured condition silently skips the hook rather than firing unconditionally.

Note: tool: conditions on file_changed, cwd_changed, and turn_complete events will never match because those events carry no triggering-tool context. The hook will be permanently skipped in those positions (a warn! is emitted once when the hook config is first evaluated).

Trait Implementations§

Source§

impl Clone for HookDef

Source§

fn clone(&self) -> HookDef

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for HookDef

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for HookDef

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Serialize for HookDef

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more