pub enum NormalizedEvent {
Show 34 variants
RunStart {
run_id: String,
agent_id: String,
},
ChatDelta {
run_id: String,
text_delta: String,
},
ThinkingDelta {
run_id: String,
text_delta: String,
},
ReasoningDelta {
run_id: String,
text_delta: String,
},
Citation {
run_id: String,
sources: Vec<CitationSource>,
},
RagCitations {
run_id: String,
citations: Vec<RagCitation>,
},
MemoryRecall {
run_id: String,
items: Vec<MemoryItem>,
},
SkillActivated {
run_id: String,
skill_id: String,
title: String,
selection_method: String,
},
McpServerStateChanged {
run_id: Option<String>,
lifecycle: McpServerLifecycle,
},
ToolStart {
run_id: String,
call_index: usize,
tool_call_id: String,
tool: String,
input: Value,
},
ToolDelta {
run_id: String,
call_index: usize,
tool_call_id: String,
delta: Value,
},
ToolEnd {
run_id: String,
call_index: usize,
tool_call_id: String,
tool: String,
output: Value,
ok: bool,
},
Artifact {
run_id: String,
artifact: ArtifactPayload,
},
PresentationDiagnostic {
run_id: String,
code: String,
message: String,
},
Error {
run_id: String,
code: String,
message: String,
},
RunDone {
run_id: String,
},
Cancelled {
run_id: String,
},
SycophancyFlagged {
run_id: String,
sycophancy_score: f32,
has_critical: bool,
correction_mandatory: bool,
classifications: Vec<SycophancyClassification>,
},
SycophancyCorrected {
run_id: String,
corrected_text: String,
},
GuardrailFlagged {
run_id: Option<String>,
category: String,
reason: String,
},
RuntimeStep {
run_id: String,
step: u32,
kind: String,
},
AgentThreadStarted {
run_id: String,
lifecycle: AgentLifecycle,
},
AgentThreadUpdated {
run_id: String,
lifecycle: AgentLifecycle,
},
AgentThreadFinished {
run_id: String,
lifecycle: AgentLifecycle,
},
AgentThreadError {
run_id: String,
lifecycle: AgentLifecycle,
},
StatePatch {
run_id: String,
patch: Vec<StatePatchOp>,
},
ContextAction(ContextAction),
BudgetAlert {
run_id: String,
scope: String,
scope_id: String,
spent_usd: f64,
limit_usd: f64,
exceeded: bool,
},
MemoryMutation {
run_id: String,
operation: String,
memory_id: String,
content: String,
scope: String,
memory_type: String,
},
ArtifactDisplay {
run_id: String,
artifact: ArtifactPayload,
},
ArtifactInputRequest {
run_id: String,
artifact: ArtifactPayload,
},
ToolCallApprovalRequired {
run_id: String,
approval_id: Option<String>,
call_index: usize,
tool_call_id: String,
name: String,
arguments_json: String,
risk_reason: String,
},
ToolCallDenied {
run_id: String,
call_index: usize,
tool_call_id: String,
name: String,
reason: String,
},
RunDoneWithUsage {
run_id: String,
input_tokens: Option<u32>,
output_tokens: Option<u32>,
total_tokens: Option<u32>,
cost_usd_estimate: Option<f64>,
model: Option<String>,
},
}Variants§
RunStart
ChatDelta
ThinkingDelta
ReasoningDelta
Citation
RagCitations
Numbered citation markers ([1], [2], …) for a RAG-augmented run,
each referencing one retrieved knowledge chunk. Emitted once retrieval
completes and before the assistant’s response streams, so the client
can resolve [n] markers that appear in the response text to a
hover-to-source panel. Built by crate::uar::rag::citation_stream::CitationStream.
Distinct from Self::Citation, which carries LLM-native web
citations (URL sources) rather than RAG chunk citations.
MemoryRecall
SkillActivated
McpServerStateChanged
Host-owned MCP binding state; a binding may outlive an individual run.
ToolStart
ToolDelta
ToolEnd
Artifact
PresentationDiagnostic
A surface was rejected without terminating the readable-text run. This is a host diagnostic, not a successful publication receipt.
Error
RunDone
Cancelled
A run was cancelled — explicitly via the cancel endpoint, by the last SSE
subscriber disconnecting, or by server shutdown. Terminal, distinct from
RunDone (normal completion) and Error (failure).
SycophancyFlagged
The completed assistant response was flagged by sycophancy detection. Quality signal (not an error); emitted only when the score meets the configured threshold or a critical pattern was found. Carries the score and pattern classifications, never the full response text.
Fields
classifications: Vec<SycophancyClassification>SycophancyCorrected
A sycophantic response was auto-corrected: carries the rewritten text,
emitted as a follow-up after the original response. Opt-in (auto_correct).
GuardrailFlagged
Chat input was flagged by an input guardrail (prompt-injection or PII).
run_id is absent when the input was blocked before a run started.
Carries only the category and a short reason — never the raw input or the
matched secret value.
Fields
RuntimeStep
A tool-loop iteration boundary — per-step run progress for the Runtime Console. Emitted at the start and end of each orchestrator iteration.
Fields
AgentThreadStarted
A persisted child turn started. Never contains its prompt or history.
AgentThreadUpdated
A child was persisted pending execution or changed nonterminal state.
AgentThreadFinished
A child turn completed successfully; its output is retrieved separately.
AgentThreadError
A child failed or was cancelled, including before a child run started.
StatePatch
ContextAction(ContextAction)
BudgetAlert
A cost-budget warning or hard-limit crossing (CH-06). Emitted when
CostBudgetTracker::record returns Warning/Exceeded for any scope
(run/task/session/agent/global) with a configured limit.
Fields
MemoryMutation
A memory was created, updated, or deleted — either by an LLM tool call or by auto-capture.
Fields
ArtifactDisplay
An agent produced a displayable artifact (code block, document, chart, etc.).
This is also used for artifact_type = "display" UI surfaces.
Emitted as agui.artifact on the SSE stream.
ArtifactInputRequest
An agent needs structured input from the user before it can continue.
The artifact field carries the JSON Schema of the input form.
The agent run is paused until the user submits a response via
POST /api/uar/runs/{run_id}/artifact-response.
Emitted as agui.artifact_input_request on the SSE stream.
ToolCallApprovalRequired
A tool call requires user approval before execution. The run is paused until the user responds via the approval endpoint.
Fields
ToolCallDenied
A governance policy denied a tool call. This is terminal for the call and must never create a human approval request.
RunDoneWithUsage
A run completed. Optionally carries token usage and cost estimates when the persistence layer or LLM provider reports them.
Trait Implementations§
Source§impl Clone for NormalizedEvent
impl Clone for NormalizedEvent
Source§fn clone(&self) -> NormalizedEvent
fn clone(&self) -> NormalizedEvent
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 NormalizedEvent
impl Debug for NormalizedEvent
Source§impl<'de> Deserialize<'de> for NormalizedEvent
impl<'de> Deserialize<'de> for NormalizedEvent
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>,
Source§impl PartialEq for NormalizedEvent
impl PartialEq for NormalizedEvent
Source§impl Serialize for NormalizedEvent
impl Serialize for NormalizedEvent
impl StructuralPartialEq for NormalizedEvent
Auto Trait Implementations§
impl Freeze for NormalizedEvent
impl RefUnwindSafe for NormalizedEvent
impl Send for NormalizedEvent
impl Sync for NormalizedEvent
impl Unpin for NormalizedEvent
impl UnsafeUnpin for NormalizedEvent
impl UnwindSafe for NormalizedEvent
Blanket Implementations§
§impl<U> As for U
impl<U> As for U
§fn as_<T>(self) -> Twhere
T: CastFrom<U>,
U: Sized,
fn as_<T>(self) -> Twhere
T: CastFrom<U>,
U: Sized,
self to type T. The semantics of numeric casting with the as operator are followed, so <T as As>::as_::<U> can be used in the same way as T as U for numeric conversions. Read moreimpl<T> AsyncFriendly for T
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Conv for T
impl<T> Conv for T
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
impl<T> ErasedDestructor for Twhere
T: 'static,
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§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 more§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request§impl<L> LayerExt<L> for L
impl<L> LayerExt<L> for L
§fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
Layered].impl<T> MaybeSend for Twhere
T: Send,
impl<T> MaybeSend for Twhere
T: Send,
§impl<T> Message for T
impl<T> Message for T
§fn from_boxed(m: BoxedMessage) -> Result<Self, BoxedDowncastErr>
fn from_boxed(m: BoxedMessage) -> Result<Self, BoxedDowncastErr>
§fn box_message(self, pid: &ActorId) -> Result<BoxedMessage, BoxedDowncastErr>
fn box_message(self, pid: &ActorId) -> Result<BoxedMessage, BoxedDowncastErr>
impl<T> OutputMessage for Twhere
T: Message + Clone,
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> Pointee for T
impl<T> Pointee for T
§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<T> Serialize for T
impl<T> Serialize for T
fn erased_serialize(&self, serializer: &mut dyn Serializer) -> Result<(), Error>
fn do_erased_serialize( &self, serializer: &mut dyn Serializer, ) -> Result<(), ErrorImpl>
§impl<F, T, S> SimdInto<T, S> for Fwhere
T: SimdFrom<F, S>,
S: Simd,
impl<F, T, S> SimdInto<T, S> for Fwhere
T: SimdFrom<F, S>,
S: Simd,
impl<T> State for T
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.