Skip to main content

swink_agent_memory/
meta.rs

1//! Session metadata stored alongside persisted conversations.
2
3use chrono::{DateTime, Utc};
4use serde::{Deserialize, Serialize};
5
6/// Metadata stored as the first line of a session JSONL file.
7#[non_exhaustive]
8#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
9pub struct SessionMeta {
10    /// Unique session identifier.
11    pub id: String,
12    /// Human-readable session title.
13    pub title: String,
14    /// When the session was created.
15    pub created_at: DateTime<Utc>,
16    /// When the session was last updated.
17    pub updated_at: DateTime<Utc>,
18    /// Schema version for migration support. Defaults to 1.
19    #[serde(default = "default_version")]
20    pub version: u32,
21    /// Optimistic concurrency sequence number. Incremented on every write.
22    #[serde(default)]
23    pub sequence: u64,
24}
25
26const fn default_version() -> u32 {
27    1
28}
29
30impl SessionMeta {
31    /// Creates a new session metadata record with the given identity and timestamps.
32    ///
33    /// `version` defaults to `1` and `sequence` defaults to `0`; use
34    /// [`with_version`](Self::with_version) / [`with_sequence`](Self::with_sequence)
35    /// to override either.
36    #[must_use]
37    pub fn new(
38        id: impl Into<String>,
39        title: impl Into<String>,
40        created_at: DateTime<Utc>,
41        updated_at: DateTime<Utc>,
42    ) -> Self {
43        Self {
44            id: id.into(),
45            title: title.into(),
46            created_at,
47            updated_at,
48            version: default_version(),
49            sequence: 0,
50        }
51    }
52
53    /// Overrides the schema version (defaults to 1).
54    #[must_use]
55    pub const fn with_version(mut self, version: u32) -> Self {
56        self.version = version;
57        self
58    }
59
60    /// Overrides the optimistic-concurrency sequence number (defaults to 0).
61    #[must_use]
62    pub const fn with_sequence(mut self, sequence: u64) -> Self {
63        self.sequence = sequence;
64        self
65    }
66}
67
68#[cfg(test)]
69#[path = "meta_tests.rs"]
70mod tests;