pub struct ConversationHistory {
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 total_tokens: Option<usize>,
pub compactions: Vec<CompactionRecord>,
pub input_history: VecDeque<String>,
}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>§total_tokens: Option<usize>§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)
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
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> 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