Skip to main content

App

Struct App 

Source
pub struct App {
Show 14 fields pub input: InputBuffer, pub running: bool, pub working_dir: String, pub error_log: VecDeque<ErrorEntry>, pub app_state: AppState, pub model_state: ModelState, pub ui_state: UIState, pub session_state: ConversationState, pub operation_state: OperationState, pub status_state: StatusState, pub attachment_state: AttachmentState, pub mcp_tools: Vec<Value>, pub mcp_init_task: Option<JoinHandle<McpInitResult>>, pub instructions: Option<LoadedInstructions>,
}
Expand description

Application state coordinator

Fields§

§input: InputBuffer

User input buffer

§running: bool

Is the app running?

§working_dir: String

Current working directory

§error_log: VecDeque<ErrorEntry>

Error log - keeps last N errors for visibility

§app_state: AppState

State machine for application lifecycle

§model_state: ModelState

Model state - LLM configuration

§ui_state: UIState

UI state - visual presentation and widget states

§session_state: ConversationState

Session state - conversation history and persistence

§operation_state: OperationState

Operation state - file reading and tool calls

§status_state: StatusState

Status state - UI status messages

§attachment_state: AttachmentState

Attachment state - pending image attachments

§mcp_tools: Vec<Value>

MCP tool definitions in Ollama JSON format (injected at startup or background init)

§mcp_init_task: Option<JoinHandle<McpInitResult>>

Background MCP server initialization task. Polled in the event loop; when done, mcp_tools and global manager are set.

§instructions: Option<LoadedInstructions>

Project instructions auto-loaded from MERMAID.md (Step 5h). None when no MERMAID.md exists in the bounded walk from cwd. Refreshed before every model call by loop_coordinator::call_model.

Implementations§

Source§

impl App

Source

pub fn new( model: Box<dyn Model>, model_id: String, base_config: ModelConfig, ) -> Self

Create a new app instance

Source

pub fn build_model_config(&self) -> ModelConfig

Build a ModelConfig with MCP tools included.

Source

pub async fn poll_mcp_init(&mut self)

Poll for completed MCP background initialization (non-blocking).

Returns immediately if init is still in progress or already done. When init completes, sets mcp_tools on self and registers the global MCP manager so tool calls can be dispatched.

Called from both the main event loop and the agent loop so that MCP tools become available to the model as soon as servers are ready, even mid-agent-loop.

Source

pub fn add_message(&mut self, role: MessageRole, content: String)

Add a message to the chat (extracts thinking blocks automatically)

Source

pub fn add_message_with_images( &mut self, role: MessageRole, content: String, images: Option<Vec<String>>, )

Add a message with optional image attachments

Source

pub fn add_assistant_message_with_tool_calls( &mut self, content: String, tool_calls: Vec<ToolCall>, )

Add an assistant message with tool_calls attached

Source

pub fn add_tool_result( &mut self, tool_call_id: String, tool_name: String, content: String, )

Add a tool result message

Source

pub fn commit_message(&mut self, message: ChatMessage)

Commit a message to session state and conversation history

Source

pub fn clear_input(&mut self)

Clear the input buffer

Source

pub fn set_status(&mut self, message: impl Into<String>)

Set status message

Source

pub fn clear_status(&mut self)

Clear status message

Source

pub fn display_error( &mut self, summary: impl Into<String>, detail: impl Into<String>, )

Display an error consistently across the UI

Source

pub fn display_error_simple(&mut self, message: impl Into<String>)

Display an error with just a message

Source

pub fn log_error(&mut self, entry: ErrorEntry)

Log an error to the error log

Source

pub fn log_error_msg(&mut self, severity: ErrorSeverity, msg: impl Into<String>)

Log a simple error message

Source

pub fn log_error_with_context( &mut self, severity: ErrorSeverity, msg: impl Into<String>, context: impl Into<String>, )

Log error with context

Source

pub fn recent_errors(&self, count: usize) -> Vec<&ErrorEntry>

Get recent errors

Source

pub fn set_terminal_title(&self, title: &str)

Set terminal window title

Source

pub fn spawn_title_generation(&self) -> Option<JoinHandle<Option<String>>>

Spawn title generation as a background task (non-blocking). Returns a JoinHandle the caller can poll with is_finished().

Source

pub fn scroll_up(&mut self, amount: u16)

Source

pub fn scroll_down(&mut self, amount: u16)

Source

pub fn quit(&mut self)

Source

pub fn build_message_history(&self) -> Vec<ChatMessage>

Build message history for model API calls (all messages, no truncation)

Source

pub fn build_managed_message_history( &self, max_context_tokens: usize, reserve_tokens: usize, ) -> Vec<ChatMessage>

Source

pub fn load_conversation(&mut self, conversation: ConversationHistory)

Source

pub fn save_conversation(&mut self) -> Result<()>

Source

pub fn auto_save_conversation(&mut self)

Source

pub fn start_generation(&mut self, abort_handle: AbortHandle)

Source

pub fn update_abort_handle(&mut self, abort_handle: AbortHandle)

Update the abort handle for a new model call within the same turn. Keeps the existing start_time and token count (cumulative for the turn).

Source

pub fn transition_to_sending(&mut self)

Reset status to Sending for a new model call within the same turn.

Source

pub fn transition_to_thinking(&mut self)

Source

pub fn transition_to_streaming(&mut self)

Source

pub fn set_final_tokens(&mut self, count: usize)

Add tokens from a completed model call (accumulates across the turn)

Source

pub fn stop_generation(&mut self)

Source

pub fn abort_generation(&mut self) -> (Option<AbortHandle>, String)

Source

pub fn push_response(&mut self, text: &str)

Append text to the response buffer. No-op if not generating. Enforces MAX_RESPONSE_CHARS size limit; once tripped, subsequent calls are silently dropped so we don’t pay O(n) per chunk re-truncating (and don’t emit duplicate [TRUNCATED…] markers).

Source

pub fn response_len(&self) -> usize

Get response buffer length (0 if not generating)

Source

pub fn take_response(&mut self) -> String

Take the response buffer, leaving it empty. Returns empty string if not generating. Also clears the response_truncated flag so the next model call starts fresh.

Source

pub fn clear_response(&mut self)

Clear the response buffer (for per-model-call reset within a turn) and the truncated flag so the new call’s buffer is fresh.

Auto Trait Implementations§

§

impl Freeze for App

§

impl !RefUnwindSafe for App

§

impl Send for App

§

impl Sync for App

§

impl Unpin for App

§

impl UnsafeUnpin for App

§

impl !UnwindSafe for App

Blanket Implementations§

Source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where 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) -> D
where M: TransformMatrix<T>,

Convert the source color to the destination color using the specified method.
Source§

fn adapt_into(self) -> D

Convert the source color to the destination color using the bradford method by default.
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, C> ArraysFrom<C> for T
where C: IntoArrays<T>,

Source§

fn arrays_from(colors: C) -> T

Cast a collection of colors into a collection of arrays.
Source§

impl<T, C> ArraysInto<C> for T
where C: FromArrays<T>,

Source§

fn arrays_into(self) -> C

Cast this collection of arrays into a collection of colors.
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<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for U
where T: FromCam16Unclamped<WpParam, U>,

Source§

type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar

The number type that’s used in parameters when converting.
Source§

fn cam16_into_unclamped( self, parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>, ) -> T

Converts self into C, using the provided parameters.
Source§

impl<T, C> ComponentsFrom<C> for T
where C: IntoComponents<T>,

Source§

fn components_from(colors: C) -> T

Cast a collection of colors into a collection of color components.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromAngle<T> for T

Source§

fn from_angle(angle: T) -> T

Performs a conversion from angle.
Source§

impl<T, U> FromStimulus<U> for T
where U: IntoStimulus<T>,

Source§

fn from_stimulus(other: U) -> T

Converts other into Self, while performing the appropriate scaling, rounding and clamping.
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, U> IntoAngle<U> for T
where U: FromAngle<T>,

Source§

fn into_angle(self) -> U

Performs a conversion into T.
Source§

impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for U
where T: Cam16FromUnclamped<WpParam, U>,

Source§

type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar

The number type that’s used in parameters when converting.
Source§

fn into_cam16_unclamped( self, parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>, ) -> T

Converts self into C, using the provided parameters.
Source§

impl<T, U> IntoColor<U> for T
where U: FromColor<T>,

Source§

fn into_color(self) -> U

Convert into T with values clamped to the color defined bounds Read more
Source§

impl<T, U> IntoColorUnclamped<U> for T
where U: FromColorUnclamped<T>,

Source§

fn into_color_unclamped(self) -> U

Convert into T. The resulting color might be invalid in its color space Read more
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

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

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

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

impl<T> IntoStimulus<T> for T

Source§

fn into_stimulus(self) -> T

Converts self into T, while performing the appropriate scaling, rounding and clamping.
Source§

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

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: 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: 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, C> TryComponentsInto<C> for T
where C: TryFromComponents<T>,

Source§

type Error = <C as TryFromComponents<T>>::Error

The error for when try_into_colors fails to cast.
Source§

fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>

Try to cast this collection of color components into a collection of colors. 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, U> TryIntoColor<U> for T
where U: TryFromColor<T>,

Source§

fn try_into_color(self) -> Result<U, OutOfBounds<U>>

Convert into T, returning ok if the color is inside of its defined range, otherwise an OutOfBounds error is returned which contains the unclamped color. Read more
Source§

impl<C, U> UintsFrom<C> for U
where C: IntoUints<U>,

Source§

fn uints_from(colors: C) -> U

Cast a collection of colors into a collection of unsigned integers.
Source§

impl<C, U> UintsInto<C> for U
where C: FromUints<U>,

Source§

fn uints_into(self) -> C

Cast this collection of unsigned integers into a collection of colors.
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