Skip to main content

HookResult

Enum HookResult 

Source
pub enum HookResult {
    Continue,
    Block {
        reason: String,
    },
    Inject {
        content: String,
    },
    Confirm {
        message: String,
        sources: Vec<String>,
        generations: Vec<u64>,
        tool: Option<String>,
        modified_input: Option<Value>,
        modified_by: Vec<String>,
    },
    Modify {
        input: Value,
    },
    Replace {
        output: String,
    },
    ContextPhase {
        phase: String,
    },
}
Expand description

What an extension handler returns after processing a hook event.

The runtime resolves multiple handlers by precedence:

  • For before_tool_call only Block stops the handler chain. Modify rewrites the input that later handlers see; Confirm is merged and resolved after the whole chain (a Modify after it is ignored).
  • Inject results are accumulated for before_message.
  • Continue is the no-op default — processing continues normally.

Variants§

§

Continue

Allow execution to proceed unchanged.

§

Block

Prevent the hooked operation. The reason is surfaced to the user.

Fields

§reason: String
§

Inject

Inject context — the extension provides text for the current request. Placement depends on the hook (#297): on_session_start content is appended to the system prompt (session-stable, cache-safe); before_message content is attached to the newest user message on the outgoing request as an ephemeral trailing block positioned AFTER the conversational cache marker (per-turn, uncached tail, cache-neutral).

Fields

§content: String
§

Confirm

Ask the runtime to get explicit user confirmation before proceeding. Only valid on before_tool_call hooks.

sources / tool are host-stamped by HookBus::emit (the extension id(s) that asked, and the tool name). They are never read from or written to the extension wire format, so an extension cannot claim to be another extension. The “Allow all” latch is keyed by sources.

Fields

§message: String
§sources: Vec<String>
§generations: Vec<u64>

Host-set load generation of each source (parallel to sources; missing entries mean 0). Part of the latch key, so a plugin reinstalled under the same id starts unlatched.

§modified_input: Option<Value>

Host-set: the input as rewritten by Modify results earlier in the chain. Approval runs THIS input (never extension-settable).

§modified_by: Vec<String>

Host-set: ids of the extensions whose Modify produced modified_input (chain order, de-duplicated). Shown in the prompt so the user knows the input was rewritten, and by whom.

§

Modify

Replace the tool input before execution (structured JSON args). Only valid on before_tool_call hooks. The output-side counterpart is HookResult::Replace. Does not stop the chain: later handlers see (and may block or confirm) the modified input.

Fields

§input: Value
§

Replace

Replace the tool output after execution (flat string), before it enters history. Only valid on after_tool_call hooks. The input-side counterpart is HookResult::Modify — distinct name because the payload is an unstructured String, not structured Value. Enables native output transforms (compression, redaction, summarization) by extensions. The first transform stops the handler chain.

Fields

§output: String
§

ContextPhase

Advisory work-phase report for the host’s automatic context management. Only valid on on_message_complete, and only honoured when the extension additionally holds session.lifecycle. Semantics are identical to the model calling context_checkpoint with this phase and no note: the host may roll the context window over at the next task boundary. It is a lower-authority report — never capacity, permission, or history authority — and does not stop the handler chain (other observers still run; the first valid report wins). phase is parsed host-side with WorkPhase::parse; unknown strings are ignored with a warning.

Fields

§phase: String

Implementations§

Source§

impl HookResult

Source

pub fn confirm(message: impl Into<String>) -> Self

An unattributed Confirm (as an extension returns it, before HookBus::emit stamps the source).

Trait Implementations§

Source§

impl Clone for HookResult

Source§

fn clone(&self) -> Self

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 HookResult

Source§

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

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

impl Default for HookResult

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl<'de> Deserialize<'de> for HookResult

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 PartialEq for HookResult

Source§

fn eq(&self, other: &Self) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl Serialize for HookResult

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
Source§

impl StructuralPartialEq for HookResult

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> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync> ⓘ

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

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

Source§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
Source§

impl<A, B, T> HttpServerConnExec<A, B> for T
where B: Body,

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> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
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 = !

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

fn try_from(value: U) -> Result<T, !>

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<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

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