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}