pub struct Session {
pub conversation: ConversationHistory,
pub model_id: String,
pub reasoning: ReasoningLevel,
pub safety_mode: SafetyMode,
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>,
pub plan: Option<PlanState>,
pub scratchpad: Option<PathBuf>,
}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.
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.
plan: Option<PlanState>Some while the session is in plan mode (see PlanState). Never
Some on subagent sessions — children explore, they don’t plan.
scratchpad: Option<PathBuf>Per-session scratch directory, once the effect layer has materialized
it on disk (Cmd::EnsureScratchpad -> Msg::ScratchpadReady). None
until then, and reset whenever the conversation id changes (/clear,
/load, rewind fork) — the reducer re-emits EnsureScratchpad at
those points. The reducer stamps this onto Cmd::ExecuteTool so tools
see it via ExecContext::scratchpad. Runtime-only, never persisted.
Implementations§
Source§impl Session
impl Session
Sourcepub fn snapshot_conversation(&self) -> ConversationHistory
pub fn snapshot_conversation(&self) -> ConversationHistory
Clone the conversation with the live meters + safety mode overlaid, so
a saved file carries the full restorable state. These fields live on
Session (which is NOT serialized — only conversation is), so every
Cmd::SaveConversation snapshots them in and seed_conversation
hydrates them back on resume.
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
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,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
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>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
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)
fn as_any(&self) -> &(dyn Any + 'static)
&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)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&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
impl<T> DowncastSync for T
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