pub struct ConversationRecord {
pub id: String,
pub title: String,
pub workspace: String,
pub workspace_id: String,
pub persona: Option<String>,
pub turns: Vec<ConversationTurn>,
pub scratchpad: BTreeMap<String, String>,
pub plan: PlanSnapshot,
pub roadmap_id: Option<String>,
pub node_id: Option<String>,
pub created_at_unix_nanos: u128,
pub updated_at_unix_nanos: u128,
}Expand description
A full conversation as loaded from the store. Also the on-disk shape of the retired JSON backend’s records — kept serde-compatible so the 17.1b one-time import can parse legacy files with the exact semantics they were written under.
Fields§
§id: String§title: String§workspace: String§workspace_id: String§persona: Option<String>§turns: Vec<ConversationTurn>§scratchpad: BTreeMap<String, String>The conversation’s scratchpad <state> snapshot (#713, Step 26.4): the
structured working memory the model keeps via state_set / state_get.
Persisted at the conversation/record level so an interrupt + auto-resume
restores the <state> it already restores the transcript for — without
it, the first state_get("current_task") after a resume reads an empty
live store and the model blind-probes for a task that is simply gone.
Additive: #[serde(default)] keeps legacy records loadable, and an empty
map is skipped on serialize so it never bloats the on-disk file. Working
memory, not provenance — kept OUT of the §6 content chain (it is NOT a
turn field and never enters canonical_encoding_v1).
plan: PlanSnapshotThe conversation’s plan-ledger snapshot (#715, Step 26.6b): the ordered
<plan> steps with each one’s done/active status. Persisted at the
conversation/record level — exactly like scratchpad — so an interrupt +
auto-resume re-hydrates the in-memory ledger instead of rebuilding it
empty (which loses the <plan> block and plan_get after a resume).
Additive: #[serde(default)] keeps legacy records loadable, and an empty
snapshot is skipped on serialize so it never bloats the on-disk file.
Working memory, not provenance — kept OUT of the §6 content chain (it
is NOT a turn field and never enters canonical_encoding_v1).
roadmap_id: Option<String>#1030 “Plans within Plans”: the roadmap this conversation’s Plan node
belongs to. None for an ad-hoc chat — the legacy/default shape, and by
far the common case. A thin pointer INTO the tree; the tree’s
authoritative shape (the plan.rs::Plan of Roadmap/Phase/Plan/Task
nodes) lives in the roadmaps table, never duplicated onto this row.
Additive: #[serde(default)] + skip-when-None keeps legacy records
loadable and never bloats the file. Metadata, NOT provenance — kept OUT
of the §6 content chain (never a turn field, never in canonical_encoding_v1).
node_id: Option<String>#1030: the id of the plan.rs::Subtask node (within [roadmap_id]’s
tree) that THIS conversation realizes — the Plan node whose context
window this conversation is. None for an ad-hoc chat. Same additive /
metadata-not-provenance discipline as roadmap_id.
created_at_unix_nanos: u128§updated_at_unix_nanos: u128Trait Implementations§
Source§impl Clone for ConversationRecord
impl Clone for ConversationRecord
Source§fn clone(&self) -> ConversationRecord
fn clone(&self) -> ConversationRecord
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 ConversationRecord
impl Debug for ConversationRecord
Source§impl<'de> Deserialize<'de> for ConversationRecord
impl<'de> Deserialize<'de> for ConversationRecord
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>,
impl Eq for ConversationRecord
Source§impl PartialEq for ConversationRecord
impl PartialEq for ConversationRecord
Source§impl Serialize for ConversationRecord
impl Serialize for ConversationRecord
impl StructuralPartialEq for ConversationRecord
Auto Trait Implementations§
impl Freeze for ConversationRecord
impl RefUnwindSafe for ConversationRecord
impl Send for ConversationRecord
impl Sync for ConversationRecord
impl Unpin for ConversationRecord
impl UnsafeUnpin for ConversationRecord
impl UnwindSafe for ConversationRecord
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<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
impl<T> ErasedDestructor for Twhere
T: 'static,
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