pub struct ConversationHistory {Show 20 fields
pub id: String,
pub title: String,
pub messages: Vec<ChatMessage>,
pub model_name: String,
pub project_path: String,
pub created_at: DateTime<Local>,
pub updated_at: DateTime<Local>,
pub compactions: Vec<CompactionRecord>,
pub input_history: VecDeque<String>,
pub git_branch: Option<String>,
pub safety_mode: Option<SafetyMode>,
pub plan: Option<PlanState>,
pub last_token_usage: Option<TokenUsageTotals>,
pub cumulative_token_usage: TokenUsageTotals,
pub context_usage: Option<ContextUsageSnapshot>,
pub forked_from: Option<String>,
pub parent_session: Option<String>,
pub cli_version: Option<String>,
pub git_sha: Option<String>,
pub tasks: TaskStore,
}Expand description
A complete conversation history
Fields§
§id: String§title: String§messages: Vec<ChatMessage>§model_name: String§project_path: String§created_at: DateTime<Local>§updated_at: DateTime<Local>§compactions: Vec<CompactionRecord>Metadata for context compactions performed in this conversation.
input_history: VecDeque<String>History of user input prompts for navigation (up/down arrows)
git_branch: Option<String>Git branch this session was worked on, for the --resume picker.
Captured at startup (impure) — ConversationHistory::new leaves it
None so the pure reducer / --replay stay deterministic. Empty for
non-git dirs and for sessions saved before this field existed.
safety_mode: Option<SafetyMode>Live session state that rides on Session (which is NOT serialized —
only this ConversationHistory is), snapshotted here on every save via
Session::snapshot_conversation so --resume/--continue restore the
safety mode and token/context meters instead of resetting them. All
#[serde(default)]: sessions saved before these existed omit them, and
a None safety mode falls back to the config default on resume.
plan: Option<PlanState>Plan-mode-in-progress (see domain::PlanState): Some only when the
session was saved mid-planning, so --resume re-enters plan mode with
the same plan file and restore target.
last_token_usage: Option<TokenUsageTotals>§cumulative_token_usage: TokenUsageTotals§context_usage: Option<ContextUsageSnapshot>§forked_from: Option<String>Session lineage / provenance, all #[serde(default)] (older files omit
them). Stamped in the impure startup path, never the pure reducer.
forked_from/parent_session are set when a session is branched from
another; cli_version and git_sha record the environment at creation.
parent_session: Option<String>§cli_version: Option<String>§git_sha: Option<String>§tasks: TaskStoreThe task checklist (task_create/task_update tools + /tasks command). Snapshotted on every save so –resume/–continue restore an in-flight plan; sessions saved before this field existed load an empty store.
Implementations§
Source§impl ConversationHistory
impl ConversationHistory
Sourcepub fn new(
project_path: String,
model_name: String,
now: DateTime<Local>,
) -> Self
pub fn new( project_path: String, model_name: String, now: DateTime<Local>, ) -> Self
Create a new conversation history.
now is injected rather than read from the wall clock because this
runs inside the pure reducer (/clear mints a fresh conversation, and
State::new mints the initial one): the id and title are a
deterministic function of the caller’s clock, so --replay reproduces
them exactly.
Sourcepub fn add_messages(&mut self, messages: &[ChatMessage], now: DateTime<Local>)
pub fn add_messages(&mut self, messages: &[ChatMessage], now: DateTime<Local>)
Add messages to the conversation. now is the caller’s injected
clock (state.now inside the reducer) — mutation methods never read
the wall clock themselves so update() stays a pure function.
Sourcepub fn replace_messages(
&mut self,
messages: Vec<ChatMessage>,
now: DateTime<Local>,
)
pub fn replace_messages( &mut self, messages: Vec<ChatMessage>, now: DateTime<Local>, )
Replace the model-visible message log without deriving a new title.
Used by context compaction: the original title still describes the
session better than the generated checkpoint. The messages keep their
own timestamps (they rode in on the Msg payload); only updated_at
is stamped, from the injected clock.
Sourcepub fn add_compaction(&mut self, record: CompactionRecord, now: DateTime<Local>)
pub fn add_compaction(&mut self, record: CompactionRecord, now: DateTime<Local>)
Record a completed context compaction. now injected — see
Self::add_messages.
Sourcepub fn add_to_input_history(&mut self, input: String)
pub fn add_to_input_history(&mut self, input: String)
Add input to history (with deduplication of consecutive identical inputs)
Trait Implementations§
Source§impl Clone for ConversationHistory
impl Clone for ConversationHistory
Source§fn clone(&self) -> ConversationHistory
fn clone(&self) -> ConversationHistory
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for ConversationHistory
impl Debug for ConversationHistory
Source§impl<'de> Deserialize<'de> for ConversationHistory
impl<'de> Deserialize<'de> for ConversationHistory
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Auto Trait Implementations§
impl Freeze for ConversationHistory
impl RefUnwindSafe for ConversationHistory
impl Send for ConversationHistory
impl Sync for ConversationHistory
impl Unpin for ConversationHistory
impl UnsafeUnpin for ConversationHistory
impl UnwindSafe for ConversationHistory
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,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
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