1use serde::{Deserialize, Serialize};
2
3#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
4#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq)]
5#[serde(rename_all = "snake_case")]
6pub enum ToolOutputMode {
7 Compact,
8 Full,
9}
10
11impl Default for ToolOutputMode {
12 fn default() -> Self {
13 Self::Compact
14 }
15}
16
17#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
18#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq)]
19#[serde(rename_all = "snake_case")]
20#[derive(Default)]
21pub enum StatusLineMode {
22 #[default]
23 Auto,
24 Command,
25 Hidden,
26}
27
28#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
29#[derive(Debug, Clone, Deserialize, Serialize)]
30pub struct StatusLineConfig {
31 #[serde(default = "default_status_line_mode")]
32 pub mode: StatusLineMode,
33 #[serde(default)]
34 pub command: Option<String>,
35 #[serde(default = "default_status_line_refresh_interval_ms")]
36 pub refresh_interval_ms: u64,
37 #[serde(default = "default_status_line_command_timeout_ms")]
38 pub command_timeout_ms: u64,
39}
40
41impl Default for StatusLineConfig {
42 fn default() -> Self {
43 Self {
44 mode: default_status_line_mode(),
45 command: None,
46 refresh_interval_ms: default_status_line_refresh_interval_ms(),
47 command_timeout_ms: default_status_line_command_timeout_ms(),
48 }
49 }
50}
51
52#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
53#[derive(Debug, Clone, Deserialize, Serialize)]
54pub struct UiConfig {
55 #[serde(default = "default_tool_output_mode")]
56 pub tool_output_mode: ToolOutputMode,
57 #[serde(default = "default_tool_output_max_lines")]
58 pub tool_output_max_lines: usize,
59 #[serde(default = "default_tool_output_spool_bytes")]
60 pub tool_output_spool_bytes: usize,
61 #[serde(default)]
62 pub tool_output_spool_dir: Option<String>,
63 #[serde(default = "default_allow_tool_ansi")]
64 pub allow_tool_ansi: bool,
65 #[serde(default = "default_inline_viewport_rows")]
66 pub inline_viewport_rows: u16,
67 #[serde(default = "default_show_timeline_pane")]
68 pub show_timeline_pane: bool,
69 #[serde(default)]
70 pub status_line: StatusLineConfig,
71}
72
73impl Default for UiConfig {
74 fn default() -> Self {
75 Self {
76 tool_output_mode: default_tool_output_mode(),
77 tool_output_max_lines: default_tool_output_max_lines(),
78 tool_output_spool_bytes: default_tool_output_spool_bytes(),
79 tool_output_spool_dir: None,
80 allow_tool_ansi: default_allow_tool_ansi(),
81 inline_viewport_rows: default_inline_viewport_rows(),
82 show_timeline_pane: default_show_timeline_pane(),
83 status_line: StatusLineConfig::default(),
84 }
85 }
86}
87
88#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
90#[derive(Debug, Clone, Deserialize, Serialize)]
91pub struct PtyConfig {
92 #[serde(default = "default_pty_enabled")]
94 pub enabled: bool,
95
96 #[serde(default = "default_pty_rows")]
98 pub default_rows: u16,
99
100 #[serde(default = "default_pty_cols")]
102 pub default_cols: u16,
103
104 #[serde(default = "default_max_pty_sessions")]
106 pub max_sessions: usize,
107
108 #[serde(default = "default_pty_timeout")]
110 pub command_timeout_seconds: u64,
111
112 #[serde(default = "default_stdout_tail_lines")]
114 pub stdout_tail_lines: usize,
115
116 #[serde(default = "default_scrollback_lines")]
118 pub scrollback_lines: usize,
119}
120
121impl Default for PtyConfig {
122 fn default() -> Self {
123 Self {
124 enabled: default_pty_enabled(),
125 default_rows: default_pty_rows(),
126 default_cols: default_pty_cols(),
127 max_sessions: default_max_pty_sessions(),
128 command_timeout_seconds: default_pty_timeout(),
129 stdout_tail_lines: default_stdout_tail_lines(),
130 scrollback_lines: default_scrollback_lines(),
131 }
132 }
133}
134
135fn default_pty_enabled() -> bool {
136 true
137}
138
139fn default_pty_rows() -> u16 {
140 24
141}
142
143fn default_pty_cols() -> u16 {
144 80
145}
146
147fn default_max_pty_sessions() -> usize {
148 10
149}
150
151fn default_pty_timeout() -> u64 {
152 300
153}
154
155fn default_stdout_tail_lines() -> usize {
156 crate::constants::defaults::DEFAULT_PTY_STDOUT_TAIL_LINES
157}
158
159fn default_scrollback_lines() -> usize {
160 crate::constants::defaults::DEFAULT_PTY_SCROLLBACK_LINES
161}
162
163fn default_tool_output_mode() -> ToolOutputMode {
164 ToolOutputMode::Compact
165}
166
167fn default_tool_output_max_lines() -> usize {
168 600
169}
170
171fn default_tool_output_spool_bytes() -> usize {
172 200_000
173}
174
175fn default_allow_tool_ansi() -> bool {
176 false
177}
178
179fn default_inline_viewport_rows() -> u16 {
180 crate::constants::ui::DEFAULT_INLINE_VIEWPORT_ROWS
181}
182
183fn default_show_timeline_pane() -> bool {
184 crate::constants::ui::INLINE_SHOW_TIMELINE_PANE
185}
186
187fn default_status_line_mode() -> StatusLineMode {
188 StatusLineMode::Auto
189}
190
191fn default_status_line_refresh_interval_ms() -> u64 {
192 crate::constants::ui::STATUS_LINE_REFRESH_INTERVAL_MS
193}
194
195fn default_status_line_command_timeout_ms() -> u64 {
196 crate::constants::ui::STATUS_LINE_COMMAND_TIMEOUT_MS
197}