use crate::harness::Harness;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(transparent))]
pub struct SessionId(pub String);
impl SessionId {
pub fn new(id: impl Into<String>) -> Self {
Self(id.into())
}
pub fn as_str(&self) -> &str {
&self.0
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum TurnRole {
User,
Assistant,
System,
Tool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SessionTurn {
pub session_id: SessionId,
pub turn_index: u64,
pub role: TurnRole,
pub content: String,
pub timestamp: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Session {
pub id: SessionId,
pub harness: Harness,
pub channel: Option<String>,
pub started_at: String,
pub ended_at: Option<String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn session_turn_round_trips() {
let t = SessionTurn {
session_id: SessionId::new("sess_1"),
turn_index: 0,
role: TurnRole::User,
content: "hello".into(),
timestamp: "2026-07-05T12:00:00Z".into(),
};
assert_eq!(t.session_id.as_str(), "sess_1");
assert_eq!(t.role, TurnRole::User);
assert_eq!(t.turn_index, 0);
}
}