pub enum AgentEvent {
Show 27 variants
AgentMessageChunk {
session_id: String,
content: String,
},
AgentThoughtChunk {
session_id: String,
content: String,
},
ToolCall {
session_id: String,
tool_call_id: String,
tool_name: String,
kind: Option<ToolKind>,
status: ToolCallStatus,
raw_input: Value,
parsing: Option<bool>,
audit: Option<MutationSessionRecord>,
},
ToolCallUpdate {Show 14 fields
session_id: String,
tool_call_id: String,
tool_name: String,
status: ToolCallStatus,
raw_output: Option<Value>,
error: Option<String>,
duration_ms: Option<u64>,
execution_duration_ms: Option<u64>,
error_category: Option<ToolCallErrorCategory>,
executor: Option<ToolExecutor>,
parsing: Option<bool>,
raw_input: Option<Value>,
raw_input_partial: Option<String>,
audit: Option<MutationSessionRecord>,
},
Plan {
session_id: String,
plan: Value,
},
TurnStart {
session_id: String,
iteration: usize,
},
TurnEnd {
session_id: String,
iteration: usize,
turn_info: Value,
},
JudgeDecision {
session_id: String,
iteration: usize,
verdict: String,
reasoning: String,
next_step: Option<String>,
judge_duration_ms: u64,
},
TypedCheckpoint {
session_id: String,
checkpoint: Value,
},
FeedbackInjected {
session_id: String,
kind: String,
content: String,
},
BudgetExhausted {
session_id: String,
max_iterations: usize,
},
LoopStuck {
session_id: String,
max_nudges: usize,
last_iteration: usize,
tail_excerpt: String,
},
DaemonWatchdogTripped {
session_id: String,
attempts: usize,
elapsed_ms: u64,
},
SkillActivated {
session_id: String,
skill_name: String,
iteration: usize,
reason: String,
},
SkillDeactivated {
session_id: String,
skill_name: String,
iteration: usize,
},
SkillScopeTools {
session_id: String,
skill_name: String,
allowed_tools: Vec<String>,
},
ToolSearchQuery {
session_id: String,
tool_use_id: String,
name: String,
query: Value,
strategy: String,
mode: String,
},
ToolSearchResult {
session_id: String,
tool_use_id: String,
promoted: Vec<String>,
strategy: String,
mode: String,
},
TranscriptCompacted {
session_id: String,
mode: String,
strategy: String,
archived_messages: usize,
estimated_tokens_before: usize,
estimated_tokens_after: usize,
snapshot_asset_id: Option<String>,
},
Handoff {
session_id: String,
artifact_id: String,
handoff: Box<HandoffArtifact>,
},
FsWatch {
session_id: String,
subscription_id: String,
events: Vec<FsWatchEvent>,
},
WorkerUpdate {
session_id: String,
worker_id: String,
worker_name: String,
worker_task: String,
worker_mode: String,
event: WorkerEvent,
status: String,
metadata: Value,
audit: Option<Value>,
},
HitlRequested {
session_id: String,
request_id: String,
kind: String,
payload: Value,
},
HitlResolved {
session_id: String,
request_id: String,
kind: String,
outcome: String,
},
LoopControlDecision {
session_id: String,
iteration: usize,
action: String,
old_limit: usize,
new_limit: usize,
reason: String,
status: String,
},
AgentLoopStallWarning {
session_id: String,
warning: Value,
},
ToolCallAudit {
session_id: String,
tool_call_id: String,
tool_name: String,
audit: Value,
},
}Expand description
Events emitted by the agent loop. The first five variants map 1:1
to ACP sessionUpdate variants; the last three are harn-internal.
Variants§
AgentMessageChunk
AgentThoughtChunk
ToolCall
Fields
status: ToolCallStatusparsing: Option<bool>Set to Some(true) by the streaming candidate detector
(harn#692) when this event represents a tool-call shape
detected in the model’s in-flight assistant text but whose
arguments have not finished parsing yet. Clients can render a
spinner / placeholder while the model writes the body. The
detector follows up with a ToolCallUpdate { parsing: false, .. } carrying either status: pending (promoted) or
status: failed with error_category: parse_aborted.
None (the default) means “this is a normal post-parse tool
call, no candidate phase was active” so the on-disk shape
stays compatible with replays recorded before this field
existed.
audit: Option<MutationSessionRecord>Mutation-session audit context active when the tool was dispatched (see harn#699). Hosts use it to group every tool emission belonging to the same write-capable session.
ToolCallUpdate
Fields
status: ToolCallStatusduration_ms: Option<u64>Wall-clock milliseconds from the parse-to-execution boundary
to the terminal Completed/Failed update. Includes the
time spent in any wrapping orchestration logic (loop checks,
post-tool hooks, microcompaction). Populated only on the
terminal update — None on intermediate Pending /
InProgress updates so clients can ignore the field until
it shows up.
execution_duration_ms: Option<u64>Milliseconds spent in the actual host/builtin/MCP dispatch
call only (the inner dispatch_tool_execution window).
Populated only on the terminal update; None otherwise.
error_category: Option<ToolCallErrorCategory>Structured classification of the failure (when status is
Failed). Paired with error so clients can render each
category distinctly without parsing free-form strings. Always
None for non-Failed updates and serialized as
errorCategory in the ACP wire format.
executor: Option<ToolExecutor>Where the tool actually ran. None only for events emitted
from sites that pre-date the dispatch decision (e.g. the
pending → in-progress transition the loop emits before the
dispatcher picks a backend).
parsing: Option<bool>Companion to ToolCall.parsing (harn#692). The streaming
candidate detector emits the terminal candidate event as a
ToolCallUpdate with parsing: Some(false) to retract the
in-flight parsing: true chip — either by promoting the
candidate (status: pending, populated raw_output: None,
error: None) or aborting it (status: failed,
error_category: parse_aborted). None means this update is
not part of a candidate-phase transition.
raw_input: Option<Value>Best-effort partial parse of the streamed tool-call arguments.
Populated by the SSE transport on Pending updates as the
model streams input_json_delta (Anthropic) or
tool_calls[].function.arguments deltas (OpenAI). None on
terminal updates and on emissions from non-streaming paths
(#693). When the partial bytes are not yet parseable as JSON
the transport falls back to raw_input_partial.
raw_input_partial: Option<String>Raw concatenated bytes of the streamed tool-call arguments
when a permissive parse failed (#693). Mutually exclusive
with raw_input: clients render whichever is present.
audit: Option<MutationSessionRecord>Mutation-session audit context for the tool call. Carries the
same payload as on the paired ToolCall event so a host
processing a single update doesn’t have to correlate against
the prior pending event.
Plan
TurnStart
TurnEnd
JudgeDecision
Fields
TypedCheckpoint
FeedbackInjected
BudgetExhausted
Emitted when the agent loop exhausts max_iterations without any
explicit break condition firing. Distinct from a natural “done” or
a “stuck” nudge-exhaustion: this is strictly a budget cap.
LoopStuck
Emitted when the loop breaks because consecutive text-only turns
hit max_nudges. Parity with BudgetExhausted / TurnEnd for
hosts that key off agent-terminal events.
DaemonWatchdogTripped
Emitted when the daemon idle-wait loop trips its watchdog because
every configured wake source returned None for N consecutive
attempts. Exists so a broken daemon doesn’t hang the session
silently.
SkillActivated
Emitted when a skill is activated. Carries the match reason so replayers can reconstruct why a given skill took effect at this iteration.
SkillDeactivated
Emitted when a previously-active skill is deactivated because the reassess phase no longer matches it.
SkillScopeTools
Emitted once per activation when the skill’s allowed_tools filter
narrows the effective tool surface exposed to the model.
ToolSearchQuery
Emitted when a tool_search query is issued by the model. Carries
the raw query args, the configured strategy, and a mode tag
distinguishing the client-executed fallback ("client") from
provider-native paths ("anthropic" / "openai"). Mirrors the
transcript event shape so hosts can render a search-in-progress
chip in real time — the replay path walks the transcript after
the turn, which is too late for live UX.
Fields
ToolSearchResult
Emitted when tool_search resolves — carries the list of tool
names newly promoted into the model’s effective surface for the
next turn. Pair-emitted with ToolSearchQuery on every search.
TranscriptCompacted
Fields
Handoff
FsWatch
WorkerUpdate
Lifecycle update for a delegated/background worker. Carries the
canonical typed event variant alongside the worker’s current
status string and the structured metadata payload that
worker_bridge_metadata builds (task, mode, timing, child
run/snapshot paths, audit-session, etc.). The audit field is
the same MutationSessionRecord JSON serialization carried on
the bridge wire so ACP/A2A consumers don’t need to re-derive it.
One-to-one with the bridge-side worker_update session-update
notification: ACP and A2A adapters subscribe to this variant
and translate it into their respective wire formats. The
session_id is the parent agent session that owns the worker
(i.e. the session whose VM spawned the worker), so a single
host stays subscribed to the same sink for both message and
worker traffic.
Fields
event: WorkerEventHitlRequested
A human-in-the-loop primitive (ask_user, request_approval,
dual_control, escalate) has just suspended the script and is
waiting on a response. Hosts that bridge the VM onto a remote
transport (ACP, A2A) translate this into a “paused / awaiting
input” wire signal so the client knows the task isn’t stuck —
it’s blocked on the human side. Pair-emitted with HitlResolved
when the waitpoint completes/cancels/times out.
HitlResolved
Companion to HitlRequested: the waitpoint has resolved (either
a response arrived, the deadline elapsed, or the request was
cancelled). outcome is one of "answered", "timeout",
"cancelled". Hosts use this to flip task state back to
working after an input-required pause.
LoopControlDecision
Emitted by the agent loop’s adaptive iteration budget /
loop_control policy when a budget extension or early stop fires.
Generic enough to cover both shapes — action distinguishes them.
Carries the iteration the decision applied to, the previous /
resulting iteration limit, the policy reason string, and (for
stops) the loop status.
Fields
AgentLoopStallWarning
Emitted when agent_loop detects adjacent repeated tool calls with
identical arguments. The warning payload avoids raw arguments by
default and carries digests so hosts can correlate repeats without
exposing potentially sensitive tool inputs.
ToolCallAudit
Emitted when a tool_caller middleware (see std/llm/tool_middleware)
attaches structured audit metadata to a tool call — typically a
user-facing summary, a description, an ACP-style kind, an MCP
hints block, a consent decision, the per-layer layers log, or
free-form metadata keys (A2A-style extension slot).
One-to-one with the underlying tool-call: hosts can join on
tool_call_id to render middleware-attached chips alongside the
existing ToolCall / ToolCallUpdate stream. The audit payload
is intentionally free-form JSON so middleware can carry whatever
shape the harness author chooses without needing protocol-level
changes per new middleware.
Implementations§
Source§impl AgentEvent
impl AgentEvent
pub fn session_id(&self) -> &str
Trait Implementations§
Source§impl Clone for AgentEvent
impl Clone for AgentEvent
Source§fn clone(&self) -> AgentEvent
fn clone(&self) -> AgentEvent
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for AgentEvent
impl Debug for AgentEvent
Source§impl<'de> Deserialize<'de> for AgentEvent
impl<'de> Deserialize<'de> for AgentEvent
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Auto Trait Implementations§
impl Freeze for AgentEvent
impl RefUnwindSafe for AgentEvent
impl Send for AgentEvent
impl Sync for AgentEvent
impl Unpin for AgentEvent
impl UnsafeUnpin for AgentEvent
impl UnwindSafe for AgentEvent
Blanket Implementations§
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
Source§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the foreground set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red() and
green(), which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg():
use yansi::{Paint, Color};
painted.fg(Color::White);Set foreground color to white using white().
use yansi::Paint;
painted.white();Source§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
Source§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
Source§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
Source§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
Source§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
Source§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
Source§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
Source§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
Source§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the background set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red() and
on_green(), which have the same functionality but
are pithier.
§Example
Set background color to red using fg():
use yansi::{Paint, Color};
painted.bg(Color::Red);Set background color to red using on_red().
use yansi::Paint;
painted.on_red();Source§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
Source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
Source§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
Source§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
Source§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
Source§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
Source§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
Source§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
Source§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
Source§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
Source§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling Attribute value.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold() and
underline(), which have the same functionality
but are pithier.
§Example
Make text bold using attr():
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);Make text bold using using bold().
use yansi::Paint;
painted.bold();Source§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Source§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi Quirk value.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask() and
wrap(), which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk():
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);Enable wrapping using wrap().
use yansi::Paint;
painted.wrap();Source§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
fn clear(&self) -> Painted<&T>
renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
Source§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the Condition value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted only when both stdout and stderr are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);