1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3
4use crate::config::BackendType;
5use crate::ipc::{CliUsageLimitState, DisplayMode, ScreenStatus};
6
7#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
8#[serde(rename_all = "snake_case")]
9pub enum SessionScope {
10 Thread,
11 Chat,
12}
13
14#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
15#[serde(rename_all = "snake_case")]
16pub enum ChatMode {
17 Group,
18 Topic,
19 P2p,
20}
21
22impl From<&str> for ChatMode {
23 fn from(value: &str) -> Self {
24 match value {
25 "p2p" | "P2P" => ChatMode::P2p,
26 "topic" | "TOPIC" => ChatMode::Topic,
27 _ => ChatMode::Group,
28 }
29 }
30}
31
32impl Default for SessionScope {
33 fn default() -> Self {
34 Self::Thread
35 }
36}
37
38#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
39#[serde(rename_all = "snake_case")]
40pub enum SessionStatus {
41 Active,
42 Closed,
43}
44
45impl Default for SessionStatus {
46 fn default() -> Self {
47 Self::Active
48 }
49}
50
51#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
52#[serde(rename_all = "snake_case")]
53pub enum PendingResponseCardState {
54 Open,
55 Patched,
56}
57
58#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
59pub struct AdoptedFrom {
60 #[serde(default)]
61 pub tmux_target: Option<String>,
62 #[serde(default)]
63 pub zellij_session: Option<String>,
64 #[serde(default)]
65 pub zellij_pane_id: Option<String>,
66 pub original_cli_pid: i32,
67 #[serde(default)]
68 pub session_id: Option<String>,
69 #[serde(default)]
70 pub cli_id: Option<String>,
71 pub cwd: String,
72 #[serde(default)]
73 pub pane_cols: Option<u16>,
74 #[serde(default)]
75 pub pane_rows: Option<u16>,
76}
77
78#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
79pub struct Session {
80 pub session_id: String,
81 pub title: String,
82 pub chat_id: String,
83 pub root_message_id: String,
84 #[serde(default)]
85 pub chat_type: Option<String>,
86 #[serde(default)]
87 pub quote_target_id: Option<String>,
88 #[serde(default)]
89 pub scope: SessionScope,
90 #[serde(default)]
91 pub status: SessionStatus,
92 pub created_at: DateTime<Utc>,
93 #[serde(default)]
94 pub closed_at: Option<DateTime<Utc>>,
95 #[serde(default)]
96 pub working_dir: Option<String>,
97 #[serde(default)]
98 pub web_port: Option<u16>,
99 #[serde(default)]
100 pub worker_token: Option<String>,
101 pub lark_app_id: String,
102 #[serde(default)]
103 pub owner_open_id: Option<String>,
104 #[serde(default)]
105 pub worker_pid: Option<u32>,
106 #[serde(default)]
107 pub cli_id: Option<String>,
108 #[serde(default)]
109 pub cli_bin: Option<String>,
110 #[serde(default)]
111 pub cli_args: Vec<String>,
112 #[serde(default)]
113 pub backend_type: BackendType,
114 #[serde(default)]
115 pub cli_session_id: Option<String>,
116 #[serde(default)]
117 pub last_cli_input: Option<String>,
118 #[serde(default)]
119 pub stream_card_id: Option<String>,
120 #[serde(default)]
121 pub stream_card_nonce: Option<String>,
122 #[serde(default)]
123 pub display_mode: Option<DisplayMode>,
124 #[serde(default)]
125 pub current_screen: Option<String>,
126 #[serde(default)]
127 pub last_screen_status: Option<ScreenStatus>,
128 #[serde(default)]
129 pub usage_limit: Option<CliUsageLimitState>,
130 #[serde(default)]
131 pub current_image_key: Option<String>,
132 #[serde(default)]
133 pub tui_prompt_card_id: Option<String>,
134 #[serde(default)]
135 pub tui_prompt_options: Vec<crate::ipc::TuiPromptOption>,
136 #[serde(default)]
137 pub tui_prompt_multi_select: Option<bool>,
138 #[serde(default)]
139 pub tui_toggled_indices: Vec<usize>,
140 #[serde(default)]
141 pub pending_response_card_id: Option<String>,
142 #[serde(default)]
143 pub pending_response_card_state: Option<PendingResponseCardState>,
144 #[serde(default)]
145 pub last_patched_response_card_id: Option<String>,
146 #[serde(default)]
147 pub terminal_url: Option<String>,
148 #[serde(default)]
149 pub last_final_output_turn_id: Option<String>,
150 #[serde(default)]
151 pub last_final_output: Option<String>,
152 #[serde(default)]
153 pub adopted_from: Option<AdoptedFrom>,
154 #[serde(default)]
155 pub model: Option<String>,
156 #[serde(default)]
157 pub locale: Option<String>,
158 #[serde(default)]
159 pub bot_name: Option<String>,
160 #[serde(default)]
161 pub bot_open_id: Option<String>,
162 #[serde(default)]
163 pub resume_session_id: Option<String>,
164 #[serde(default)]
165 pub disable_cli_bypass: bool,
166 #[serde(default)]
167 pub initial_prompt: Option<String>,
168}