pub enum Msg {
Show 36 variants
Key(Key),
Paste(Paste),
SubmitPrompt {
text: String,
attachment_ids: Vec<u64>,
},
Slash(SlashCmd),
CancelTurn,
ConfirmAccepted,
ConfirmDeclined,
Quit,
RuntimeSignal(RuntimeSignal),
StreamText {
turn: TurnId,
chunk: String,
},
StreamReasoning {
turn: TurnId,
chunk: ReasoningChunk,
},
StreamToolCall {
turn: TurnId,
call: ToolCall,
},
ContextUsageEstimated {
turn: TurnId,
snapshot: ContextUsageSnapshot,
},
CompactionFinished {
turn: TurnId,
result: CompactionResult,
},
CompactionFailed {
turn: TurnId,
trigger: CompactionTrigger,
message: String,
kind: StatusKind,
},
StreamDone {
turn: TurnId,
usage: Option<TokenUsage>,
thinking_signature: Option<String>,
},
UpstreamError {
turn: TurnId,
error: UserFacingError,
},
TurnCancelled(TurnId),
ToolStarted {
turn: TurnId,
call_id: ToolCallId,
},
ToolProgress {
turn: TurnId,
call_id: ToolCallId,
event: ProgressEvent,
},
ToolFinished {
turn: TurnId,
call_id: ToolCallId,
outcome: ToolOutcome,
},
McpServerReady {
name: String,
tools: Vec<McpToolSpec>,
},
McpServerErrored {
name: String,
reason: String,
},
McpServerStopped {
name: String,
},
InstructionsChanged(Option<LoadedInstructions>),
SessionSaved,
ConversationLoaded(ConversationHistory),
ConversationsListed(Vec<ConversationSummary>),
ModelPullFinished {
model: String,
},
ModelPullProgress(String),
Tick,
StatusDismiss,
Resize {
width: u16,
height: u16,
},
TransientStatus {
text: String,
kind: StatusKind,
dismiss_ms: u64,
},
MouseScroll {
delta: i16,
},
OpenImageAt {
message_index: usize,
image_index: usize,
},
}Expand description
Single reducer input. Non-exhaustive is intentional: adding a new
variant is a deliberate act that forces every reducer arm to
consider it at compile time (the reducer’s match is NOT
_ => — see reducer.rs).
Variants§
Key(Key)
Raw key event from crossterm, after the event source has stripped mouse/resize/paste.
Paste(Paste)
A full paste (text OR image) from the terminal.
SubmitPrompt
User hit Enter on a non-empty input. The event source has already stripped the slash-command routing.
Slash(SlashCmd)
User ran a slash command (post-routing from app::event_source).
CancelTurn
Esc or another explicit cancellation source during an active turn.
ConfirmAccepted
Confirmation modal answer.
ConfirmDeclined
Quit
User wants to exit cleanly (Ctrl+D with empty input, or /quit).
RuntimeSignal(RuntimeSignal)
External process lifecycle signal. In raw-mode TUI sessions a
typed Ctrl+C still arrives as Msg::Key; this variant covers
OS-level SIGINT/SIGTERM/SIGHUP delivered from outside.
StreamText
Chunk of assistant text. Append to partial_text.
StreamReasoning
Chunk of reasoning / thinking content.
StreamToolCall
Model emitted a tool call. Append to the outgoing call list;
actual execution dispatches on StreamDone.
ContextUsageEstimated
Effect runner estimated the fully-enriched request context after built-in and MCP tool schemas were attached.
CompactionFinished
Context compaction completed and produced a replacement model-visible history.
CompactionFailed
Context compaction failed or no-oped. Manual failures end the compaction turn; auto failures may leave generation running.
StreamDone
Stream complete. Carries final token count (0 if unknown) and, for Anthropic, the thinking signature that must round-trip on the next request.
UpstreamError
Upstream returned a recoverable or terminal error. Reducer
commits an error line and returns to Idle (or surfaces a
retry affordance, if recoverable).
TurnCancelled(TurnId)
Terminal event for a cancelled turn. Emitted by the effect
runner’s drop_scope once every child task in the turn’s
TurnScope has unwound. Reducer transitions
Cancelling(id) → Idle when it arrives.
Without this, the reducer relies on the (wrong) side-channel of
UpstreamError arriving from a cancelled provider call to exit
Cancelling. If the provider task is aborted before it can
emit an error, the state would stick in Cancelling forever.
ToolStarted
Tool was picked up by the executor — useful for “spinner started” UI transitions.
ToolProgress
Mid-flight progress (streaming subprocess output, byte-count
updates, multimodal artifacts, nested subagent activity).
Reducer pattern-matches the variant and routes accordingly:
text variants update the status line; Artifact with an
image/* mime attaches to the in-flight assistant message;
Subagent* variants render as indented status.
ToolFinished
Tool finished (one of Finished / Error / Cancelled).
McpServerReady
initialize succeeded; server is ready to dispatch tools.
McpServerErrored
Server startup failed OR the child exited with non-zero.
McpServerStopped
InstructionsChanged(Option<LoadedInstructions>)
MERMAID.md loaded / changed / removed since last check.
SessionSaved
save_conversation finished.
ConversationLoaded(ConversationHistory)
/load <id> — a saved conversation has been read off disk.
ConversationsListed(Vec<ConversationSummary>)
Response to Cmd::ListConversations. Populates the /load
picker’s candidate list.
ModelPullFinished
/model <name> finished pulling (Ollama only).
ModelPullProgress(String)
Streaming stdout line from an ollama pull subprocess.
Reducer forwards to the status line for the user to watch.
Tick
1/60s timer tick. Used for spinner animation + elapsed-time display. Reducer only advances derived fields.
StatusDismiss
Status line expired (self-clear) or user dismissed.
Resize
Terminal was resized. Reducer normally no-ops; render consumes.
TransientStatus
Set state.status to (text, kind) and schedule automatic
dismissal after dismiss_ms. Used by effect handlers that
need to surface user-visible feedback without a bespoke Msg
per effect — today that’s clipboard-read success / failure
(F14), but the variant is general and other effects will reuse
it. Reducer handles this arm by setting state.status and
pushing Cmd::DismissStatusAfter { ms: dismiss_ms }.
MouseScroll
Mouse-wheel scroll in the chat pane. Positive delta = scroll
toward older messages (up), negative = toward newer (down). The
reducer tracks the scroll offset on ui.chat_scroll; the
ChatWidget reads it during render.
OpenImageAt
Ctrl+Click on an image thumbnail in the chat pane. The
coordinates are absolute screen row/col; the render cache’s
ChatState::find_image_at_screen_pos maps them to a
(message_index, image_index) pair. The main loop handles the
lookup before forwarding this message to the reducer, so by
the time the reducer sees it, the target has already been
resolved into a base64 payload and this Msg carries the
already-decoded image. The reducer just emits
Cmd::WriteImageToTemp + Cmd::OpenInSystem.
Implementations§
Trait Implementations§
Auto Trait Implementations§
impl Freeze for Msg
impl RefUnwindSafe for Msg
impl Send for Msg
impl Sync for Msg
impl Unpin for Msg
impl UnsafeUnpin for Msg
impl UnwindSafe for Msg
Blanket Implementations§
Source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
Source§fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
Source§fn adapt_into(self) -> D
fn adapt_into(self) -> D
Source§impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
Source§fn arrays_from(colors: C) -> T
fn arrays_from(colors: C) -> T
Source§impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
Source§fn arrays_into(self) -> C
fn arrays_into(self) -> C
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<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
Source§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
parameters when converting.Source§fn cam16_into_unclamped(
self,
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
fn cam16_into_unclamped( self, parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>, ) -> T
self into C, using the provided parameters.Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
Source§fn components_from(colors: C) -> T
fn components_from(colors: C) -> T
Source§impl<T> FromAngle<T> for T
impl<T> FromAngle<T> for T
Source§fn from_angle(angle: T) -> T
fn from_angle(angle: T) -> T
angle.Source§impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
Source§fn from_stimulus(other: U) -> T
fn from_stimulus(other: U) -> T
other into Self, while performing the appropriate scaling,
rounding and clamping.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, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
impl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
Source§fn into_angle(self) -> U
fn into_angle(self) -> U
T.Source§impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
Source§type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
parameters when converting.Source§fn into_cam16_unclamped(
self,
parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>,
) -> T
fn into_cam16_unclamped( self, parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>, ) -> T
self into C, using the provided parameters.Source§impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
Source§fn into_color(self) -> U
fn into_color(self) -> U
Source§impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
Source§fn into_color_unclamped(self) -> U
fn into_color_unclamped(self) -> U
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> IntoStimulus<T> for T
impl<T> IntoStimulus<T> for T
Source§fn into_stimulus(self) -> T
fn into_stimulus(self) -> T
self into T, while performing the appropriate scaling,
rounding and clamping.Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
Source§impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
Source§type Error = <C as TryFromComponents<T>>::Error
type Error = <C as TryFromComponents<T>>::Error
try_into_colors fails to cast.Source§fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
Source§impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
Source§fn try_into_color(self) -> Result<U, OutOfBounds<U>>
fn try_into_color(self) -> Result<U, OutOfBounds<U>>
OutOfBounds error is returned which contains
the unclamped color. Read more