pub struct Session {
pub conversation: ConversationHistory,
pub model_id: String,
pub reasoning: ReasoningLevel,
pub safety_mode: SafetyMode,
pub cumulative_tokens: usize,
pub last_token_usage: Option<TokenUsageTotals>,
pub cumulative_token_usage: TokenUsageTotals,
pub context_usage: Option<ContextUsageSnapshot>,
pub is_subagent: bool,
pub agent_preamble: Option<String>,
}Expand description
Persistent conversational state that survives across turns.
“Session” here means the user-visible chat session, not the tokio
runtime or the TCP connection to the provider. One chat = one
Session = one on-disk ConversationHistory file.
Fields§
§conversation: ConversationHistory§model_id: String§reasoning: ReasoningLevel§safety_mode: SafetyModeLive safety mode for this session. Initialized from
config.safety.mode, then mutated in-session by Shift+Tab /
/safety (session-scoped — never written back to the config file).
The reducer threads this into Cmd::ExecuteTool so the policy gate
enforces the current mode, not the startup snapshot.
cumulative_tokens: usizeRunning total of tokens consumed across every API request in
this session. Kept for CLI JSON compatibility; the richer
prompt/completion breakdown lives in cumulative_token_usage.
last_token_usage: Option<TokenUsageTotals>Token usage for the most recent completed provider request.
None means the provider did not report usage for that turn.
cumulative_token_usage: TokenUsageTotalsPrompt/completion/total API usage accumulated for this session.
context_usage: Option<ContextUsageSnapshot>Latest model-visible context snapshot. This may be an estimate while a request is in flight and is replaced by provider-reported usage when available.
is_subagent: boolTrue when this session IS a subagent (a child reducer driven by
SubagentTool). system_prompt_for_state appends the subagent
contract (final message = the report returned to the parent) when
set. Never true for a user-facing session.
agent_preamble: Option<String>Agent-type system-prompt block (e.g. the Explore type’s “read-only
reconnaissance” charter), appended after the subagent contract.
Only ever Some on subagent sessions.
Implementations§
Source§impl Session
impl Session
Sourcepub fn messages(&self) -> &[ChatMessage]
pub fn messages(&self) -> &[ChatMessage]
The committed message log. All messages visible in the chat
widget live here; partial in-flight content lives in
TurnState::Generating.
Sourcepub fn append(&mut self, msg: ChatMessage, now: DateTime<Local>)
pub fn append(&mut self, msg: ChatMessage, now: DateTime<Local>)
Append a committed assistant/user/tool message. Mutation happens
through here so the reducer has one chokepoint to update the
conversation’s updated_at and derived title.
now is the reducer’s injected clock (state.now). It stamps both
the message’s commit timestamp and updated_at — the wall-clock
stamp ChatMessage::new put on the message at construction is
deliberately overwritten with the deterministic one, so update()
is a pure function and --replay recommits identical messages.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for Session
impl RefUnwindSafe for Session
impl Send for Session
impl Sync for Session
impl Unpin for Session
impl UnsafeUnpin for Session
impl UnwindSafe for Session
Blanket Implementations§
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 more