use crate::api::{Message, SystemPrompt};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum DisplayMessage {
UserMessage {
content: String,
},
AssistantMessage {
content: String,
},
ToolExecution {
tool_name: String,
tool_input: serde_json::Value,
tool_output: String,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SessionMetadata {
pub id: String,
pub preview: String,
pub created_at: u64,
pub updated_at: u64,
pub message_count: usize,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct SessionTokenCounters {
#[serde(default)]
pub total_input_tokens: u32,
#[serde(default)]
pub total_output_tokens: u32,
#[serde(default)]
pub total_cache_read_tokens: u32,
#[serde(default)]
pub total_cache_creation_tokens: u32,
#[serde(default)]
pub peak_single_turn_input_tokens: u32,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Session {
pub id: String,
pub api_messages: Vec<Message>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub display_messages: Vec<DisplayMessage>,
pub system_prompt: Vec<SystemPrompt>,
pub created_at: u64,
pub updated_at: u64,
#[serde(default, flatten)]
pub token_counters: SessionTokenCounters,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub safe_mode: Option<bool>,
}