Skip to main content

AgentSessionState

Struct AgentSessionState 

Source
pub struct AgentSessionState {
Show 34 fields pub session_id: String, pub conversation: Vec<Content>, pub messages: Arc<Vec<Message>>, pub schema_version: SchemaVersion, pub stats: SessionStats, pub auto_compact_suppressed: u8, pub constraints: SessionConstraints, pub outcome: TaskOutcome, pub stop_reason: Option<String>, pub total_cost_usd: Option<f64>, pub is_completed: bool, pub current_stage: Option<String>, pub created_contexts: Vec<String>, pub modified_files: Vec<String>, pub executed_commands: Vec<String>, pub warnings: Vec<String>, pub last_file_path: Option<String>, pub last_dir_path: Option<String>, pub consecutive_tool_loops: usize, pub tool_loop_limit_hit: bool, pub consecutive_escalations: u32, pub progress_hashes: VecDeque<u64>, pub stagnant_turns: usize, pub last_processed_message_idx: usize, pub previous_response_chains: HashMap<(String, String), ResponsesContinuationState>, pub error_recovery: Arc<Mutex<ErrorRecoveryState>>, pub pending_actions: PendingActions, pub consecutive_idle_turns: usize, pub max_tool_loop_streak: usize, pub turn_count: usize, pub turn_total_ms: u128, pub turn_max_ms: u128, pub turn_durations_ms: Vec<u128>, pub turn_tool_observations: Vec<ToolExecutionObservation>, /* private fields */
}
Expand description

Manages the state of an active agent session, including conversation history, statistics, and turn-based constraints.

Fields§

§session_id: String

The thread or session ID.

§conversation: Vec<Content>

Provider-specific conversation history (e.g., Gemini style).

§messages: Arc<Vec<Message>>

Standardized conversation messages (OpenAI/Anthropic style).

Stored in an Arc so request construction can share the history with the provider without cloning the full conversation every turn. Mutations use copy-on-write; the common unique-owner path remains O(1).

§schema_version: SchemaVersion

Schema version for durable state persistence.

§stats: SessionStats

Statistics for the current session.

§auto_compact_suppressed: u8

Auto-compaction suppression state: SUPPRESS_NONE allows compaction; other values gate automatic compaction until cleared by success, model switch, or explicit /compact.

§constraints: SessionConstraints

Constraints and limits for the session.

§outcome: TaskOutcome

Outcome of the session if completed.

§stop_reason: Option<String>

Provider stop reason associated with the last model turn, when available.

§total_cost_usd: Option<f64>

Estimated total API cost in USD for the session, when available.

§is_completed: bool

Whether the session has completed.

§current_stage: Option<String>

Current reasoning stage.

§created_contexts: Vec<String>§modified_files: Vec<String>§executed_commands: Vec<String>§warnings: Vec<String>§last_file_path: Option<String>§last_dir_path: Option<String>§consecutive_tool_loops: usize§tool_loop_limit_hit: bool§consecutive_escalations: u32

Consecutive escalation events in the current escalation chain. Reset to 0 when tool calls dispatch without escalation.

§progress_hashes: VecDeque<u64>

Rolling window of progress hashes for stagnation detection. Each entry is a hash of the assistant response content + key state.

§stagnant_turns: usize

Consecutive turns with matching progress hashes.

§last_processed_message_idx: usize§previous_response_chains: HashMap<(String, String), ResponsesContinuationState>

Responses-style continuation state keyed by normalized provider/model pairs.

§error_recovery: Arc<Mutex<ErrorRecoveryState>>

Agent-local recent error diagnostics for interrupted or repeated tool failures.

§pending_actions: PendingActions

Pending tool actions that have been issued but not yet returned.

§consecutive_idle_turns: usize§max_tool_loop_streak: usize§turn_count: usize§turn_total_ms: u128§turn_max_ms: u128§turn_durations_ms: Vec<u128>§turn_tool_observations: Vec<ToolExecutionObservation>

One canonical terminal observation per tool invocation in this turn.

Implementations§

Source§

impl AgentSessionState

Source

pub fn new( session_id: String, max_turns: usize, max_tool_loops: usize, max_context_tokens: usize, ) -> Self

Source

pub fn note_request_sent(&mut self)

Records that an LLM request was just dispatched, so the next call to Self::cache_gap_exceeds can measure the idle gap since this request.

Source

pub fn cache_gap_exceeds(&self, threshold: Duration) -> Option<Duration>

Returns the elapsed time since the last dispatched request when it exceeds threshold, or None if there was no prior request or the gap is still within the threshold. Used to warn that the provider prompt cache has likely expired before the next request re-pays full input cost.

Source

pub fn note_reasoning_effort_change( &mut self, effort: Option<ReasoningEffortLevel>, ) -> bool

Checks whether effort differs from the reasoning effort used for the previous request in this session, then stores effort as the new baseline. Returns true only when a prior effort was recorded and it differs from effort (i.e. this is a genuine mid-task change, not the first request of the session).

Source

pub fn note_model_change(&mut self, model: &str) -> bool

Checks whether model differs from the model used for the previous request in this session, then stores model as the new baseline. Returns true only when a prior model was recorded and it differs from model (i.e. this is a genuine mid-task switch, not the first request of the session). Prompt caches are unique per model, so a switch re-pays full input cost even for an otherwise identical prefix.

Source

pub fn record_turn(&mut self, start: &Instant, recorded: &mut bool)

Record a completed turn.

Source

pub fn finalize_outcome(&mut self, max_turns: usize)

Source

pub fn register_tool_loop(&mut self) -> usize

Source

pub fn reset_tool_loop_guard(&mut self)

Source

pub fn previous_response_id_for( &self, provider: &str, model: &str, ) -> Option<String>

Source

pub fn previous_response_chain_for( &self, provider: &str, model: &str, ) -> Option<&ResponsesContinuationState>

Source

pub fn set_previous_response_chain( &mut self, provider: &str, model: &str, response_id: Option<&str>, messages: Vec<Message>, )

Source

pub fn clear_previous_response_chain_for(&mut self, provider: &str, model: &str)

Source

pub fn clear_previous_response_chain(&mut self)

Source

pub fn mark_tool_loop_limit_hit(&mut self)

Source

pub fn messages_mut(&mut self) -> &mut Vec<Message>

Mutable access to the conversation history.

Returns mutable history with copy-on-write when a request still shares it.

Source

pub fn add_user_message(&mut self, text: String)

Add a user message to the history with metadata.

Source

pub fn add_user_message_with_intent( &mut self, text: String, intent_id: Option<String>, )

Add a user message and optionally tag it with the steering intent that produced it. The tag survives message serialization for recovery.

Source

pub fn record_progress_hash_and_check_stagnation(&mut self) -> bool

Record the current assistant response hash and return true if stagnation detected.

Source

pub fn attach_metadata_to_last(&mut self, source: &str, estimated_tokens: usize)

Attach metadata to the most recent message. Used by the execution loop to annotate LLM responses and tool results after they are pushed.

Source

pub fn utilization(&self) -> f64

Check if context limits are approaching.

Source

pub fn total_tokens(&self) -> usize

Calculate total estimated tokens in the conversation. Returns the cached value updated incrementally on each push. Use Self::reconcile_token_count after mutations that bypass push methods.

Source

pub fn reconcile_token_count(&mut self)

Recompute the cached token count from scratch by scanning all messages. Call this after mutations that bypass push methods (e.g., normalize_history, direct messages field access, or deserialization).

Source

pub fn adjust_token_count(&mut self, delta: isize)

Manually adjust the cached token count. Use when a message is added or removed outside of the standard push methods.

Source

pub fn preflight_token_check( &self, system_prompt_tokens: usize, tool_def_tokens: usize, reserved_output_tokens: usize, ) -> (bool, usize, usize)

Pre-flight check: does the assembled prompt fit within the context window?

Estimates total tokens for the full request (conversation history + system prompt + tool definitions) and compares against the available budget (max_context_tokens - reserved_output_tokens).

Returns (fits, estimated_total, available_budget).

Source

pub fn find_safe_split_point(&self, preferred_split_at: usize) -> usize

Find a safe split point for history trimming that doesn’t break tool call/output pairs.

Source

pub fn normalize(&mut self)

Normalize history to enforce call/output pairing invariants.

Source

pub fn clear_conversation_history(&mut self)

Clear all conversation history for a context reset.

Following the context engineering pattern: “Context reset uses external artifacts as startup material to open a clean new context/session. It does not preserve the full conversation history.”

This clears messages, conversation, resets the token count, and resets the processed-message cursor. The orient context (injected via the system prompt) provides the agent with durable artifact references to reorient from. Response continuation chains are also cleared since they reference the discarded history.

Source

pub fn into_results( self, summary: String, thread_events: Vec<ThreadEvent>, total_duration_ms: u128, ) -> TaskResults

Source

pub fn push_tool_result( &mut self, call_id: String, tool_name: &str, result: &Value, is_gemini: bool, )

Push a successful tool result to both conversation (for Gemini) and messages.

Source

pub fn push_tool_error( &mut self, call_id: String, tool_name: &str, error_payload: &Value, is_gemini: bool, )

Push a tool error to both conversation (for Gemini) and messages.

Source

pub fn push_warning(&mut self, warning: impl Into<String>)

Record a session warning, skipping exact duplicates.

In long-running sessions, the same warning can fire repeatedly (e.g. “Tool was rate limited; halting further tool calls this turn.” on every rate-limited call). Deduplicating keeps the TaskResults.warnings Vec bounded and the evaluator prompt clean. The Vec is also capped at MAX_SESSION_WARNINGS as a safety net against unbounded growth from unique-but-repetitive warnings. When the cap is reached a single elision marker is appended so consumers know warnings were truncated rather than silently losing data.

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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

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> 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> 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> 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<D> OwoColorize for D

Source§

fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>
where C: Color,

Set the foreground color generically Read more
Source§

fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>
where C: Color,

Set the background color generically. Read more
Source§

fn black(&self) -> FgColorDisplay<'_, Black, Self>

Change the foreground color to black
Source§

fn on_black(&self) -> BgColorDisplay<'_, Black, Self>

Change the background color to black
Source§

fn red(&self) -> FgColorDisplay<'_, Red, Self>

Change the foreground color to red
Source§

fn on_red(&self) -> BgColorDisplay<'_, Red, Self>

Change the background color to red
Source§

fn green(&self) -> FgColorDisplay<'_, Green, Self>

Change the foreground color to green
Source§

fn on_green(&self) -> BgColorDisplay<'_, Green, Self>

Change the background color to green
Source§

fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>

Change the foreground color to yellow
Source§

fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>

Change the background color to yellow
Source§

fn blue(&self) -> FgColorDisplay<'_, Blue, Self>

Change the foreground color to blue
Source§

fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>

Change the background color to blue
Source§

fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to magenta
Source§

fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to magenta
Source§

fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to purple
Source§

fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to purple
Source§

fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>

Change the foreground color to cyan
Source§

fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>

Change the background color to cyan
Source§

fn white(&self) -> FgColorDisplay<'_, White, Self>

Change the foreground color to white
Source§

fn on_white(&self) -> BgColorDisplay<'_, White, Self>

Change the background color to white
Source§

fn default_color(&self) -> FgColorDisplay<'_, Default, Self>

Change the foreground color to the terminal default
Source§

fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>

Change the background color to the terminal default
Source§

fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>

Change the foreground color to bright black
Source§

fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>

Change the background color to bright black
Source§

fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>

Change the foreground color to bright red
Source§

fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>

Change the background color to bright red
Source§

fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>

Change the foreground color to bright green
Source§

fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>

Change the background color to bright green
Source§

fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>

Change the foreground color to bright yellow
Source§

fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>

Change the background color to bright yellow
Source§

fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>

Change the foreground color to bright blue
Source§

fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>

Change the background color to bright blue
Source§

fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright magenta
Source§

fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright magenta
Source§

fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright purple
Source§

fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright purple
Source§

fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>

Change the foreground color to bright cyan
Source§

fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>

Change the background color to bright cyan
Source§

fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>

Change the foreground color to bright white
Source§

fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>

Change the background color to bright white
Source§

fn bold(&self) -> BoldDisplay<'_, Self>

Make the text bold
Source§

fn dimmed(&self) -> DimDisplay<'_, Self>

Make the text dim
Source§

fn italic(&self) -> ItalicDisplay<'_, Self>

Make the text italicized
Source§

fn underline(&self) -> UnderlineDisplay<'_, Self>

Make the text underlined
Make the text blink
Make the text blink (but fast!)
Source§

fn reversed(&self) -> ReversedDisplay<'_, Self>

Swap the foreground and background colors
Source§

fn hidden(&self) -> HiddenDisplay<'_, Self>

Hide the text
Source§

fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>

Cross out the text
Source§

fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the foreground color at runtime. Only use if you do not know which color will be used at compile-time. If the color is constant, use either OwoColorize::fg or a color-specific method, such as OwoColorize::green, Read more
Source§

fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the background color at runtime. Only use if you do not know what color to use at compile-time. If the color is constant, use either OwoColorize::bg or a color-specific method, such as OwoColorize::on_yellow, Read more
Source§

fn fg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the foreground color to a specific RGB value.
Source§

fn bg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the background color to a specific RGB value.
Source§

fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>

Sets the foreground color to an RGB value.
Source§

fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>

Sets the background color to an RGB value.
Source§

fn style(&self, style: Style) -> Styled<&Self>

Apply a runtime-determined style
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
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> PtyHandle for T
where T: Send,

Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
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> WasmCompatSend for T
where T: Send,

Source§

impl<T> WasmCompatSync for T
where T: Sync,

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