1use serde::{Deserialize, Serialize};
2
3#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
5#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, Default)]
6#[serde(rename_all = "kebab-case")]
7pub enum FileOpener {
8 Cursor,
9 #[default]
10 None,
11 Vscode,
12 VscodeInsiders,
13 Windsurf,
14}
15
16impl FileOpener {
17 pub fn scheme(self) -> Option<&'static str> {
18 match self {
19 Self::None => None,
20 Self::Vscode => Some("vscode"),
21 Self::Cursor => Some("cursor"),
22 Self::Windsurf => Some("windsurf"),
23 Self::VscodeInsiders => Some("vscode-insiders"),
24 }
25 }
26}
27
28#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
30#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, Default)]
31#[serde(rename_all = "snake_case")]
32pub enum HistoryPersistence {
33 #[default]
34 File,
35 None,
36}
37
38#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
40#[derive(Debug, Clone, Deserialize, Serialize, Default)]
41pub struct HistoryConfig {
42 #[serde(default)]
43 pub persistence: HistoryPersistence,
44 #[serde(default)]
45 pub max_bytes: Option<usize>,
46}
47
48#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
50#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, Default)]
51#[serde(rename_all = "snake_case")]
52pub enum TerminalNotificationMethod {
53 #[default]
54 Auto,
55 Bel,
56 Osc9,
57}
58
59#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
61#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq)]
62#[serde(rename_all = "snake_case")]
63pub enum TuiAlternateScreen {
64 Always,
65 Never,
66}
67
68#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
70#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
71#[serde(rename_all = "kebab-case")]
72pub enum TuiNotificationEvent {
73 AgentTurnComplete,
74 ApprovalRequested,
75}
76
77#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
79#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
80#[serde(untagged)]
81pub enum TuiNotificationsConfig {
82 Enabled(bool),
83 Events(Vec<TuiNotificationEvent>),
84}
85
86#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
88#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, Default)]
89#[serde(rename_all = "snake_case")]
90pub enum NotificationCondition {
91 #[default]
93 Unfocused,
94 Always,
96}
97
98#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
100#[derive(Debug, Clone, Deserialize, Serialize, Default)]
101pub struct TuiConfig {
102 #[serde(default)]
103 pub notifications: Option<TuiNotificationsConfig>,
104 #[serde(default)]
105 pub notification_method: Option<TerminalNotificationMethod>,
106 #[serde(default)]
110 pub notification_condition: Option<NotificationCondition>,
111 #[serde(default)]
112 pub animations: Option<bool>,
113 #[serde(default)]
114 pub alternate_screen: Option<TuiAlternateScreen>,
115 #[serde(default)]
116 pub show_tooltips: Option<bool>,
117}