Skip to main content

tandem_types/
session.rs

1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3use uuid::Uuid;
4
5use crate::{Message, ModelSpec};
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct SessionTime {
9    pub created: DateTime<Utc>,
10    pub updated: DateTime<Utc>,
11}
12
13#[derive(Debug, Clone, Serialize, Deserialize)]
14pub struct Session {
15    pub id: String,
16    pub slug: Option<String>,
17    pub version: Option<String>,
18    pub project_id: Option<String>,
19    pub title: String,
20    pub directory: String,
21    #[serde(default, skip_serializing_if = "Option::is_none")]
22    pub workspace_root: Option<String>,
23    #[serde(default, skip_serializing_if = "Option::is_none")]
24    pub origin_workspace_root: Option<String>,
25    #[serde(default, skip_serializing_if = "Option::is_none")]
26    pub attached_from_workspace: Option<String>,
27    #[serde(default, skip_serializing_if = "Option::is_none")]
28    pub attached_to_workspace: Option<String>,
29    #[serde(default, skip_serializing_if = "Option::is_none")]
30    pub attach_timestamp_ms: Option<u64>,
31    #[serde(default, skip_serializing_if = "Option::is_none")]
32    pub attach_reason: Option<String>,
33    pub time: SessionTime,
34    pub model: Option<ModelSpec>,
35    pub provider: Option<String>,
36    #[serde(default)]
37    pub messages: Vec<Message>,
38}
39
40impl Session {
41    pub fn new(title: Option<String>, directory: Option<String>) -> Self {
42        let now = Utc::now();
43        Self {
44            id: Uuid::new_v4().to_string(),
45            slug: None,
46            version: Some("v1".to_string()),
47            project_id: None,
48            title: title.unwrap_or_else(|| "New session".to_string()),
49            directory: directory.unwrap_or_else(|| ".".to_string()),
50            workspace_root: None,
51            origin_workspace_root: None,
52            attached_from_workspace: None,
53            attached_to_workspace: None,
54            attach_timestamp_ms: None,
55            attach_reason: None,
56            time: SessionTime {
57                created: now,
58                updated: now,
59            },
60            model: None,
61            provider: None,
62            messages: Vec::new(),
63        }
64    }
65}
66
67#[derive(Debug, Clone, Serialize, Deserialize)]
68pub struct CreateSessionRequest {
69    pub parent_id: Option<String>,
70    pub title: Option<String>,
71    pub directory: Option<String>,
72    pub workspace_root: Option<String>,
73    pub model: Option<ModelSpec>,
74    pub provider: Option<String>,
75    pub permission: Option<Vec<serde_json::Value>>,
76}
77
78#[derive(Debug, Clone, Serialize, Deserialize)]
79pub struct SendMessageRequest {
80    #[serde(default)]
81    pub parts: Vec<crate::MessagePartInput>,
82    pub model: Option<ModelSpec>,
83    pub agent: Option<String>,
84}
85
86#[derive(Debug, Clone, Serialize, Deserialize)]
87pub struct TodoItem {
88    pub id: String,
89    pub content: String,
90    pub status: String,
91}