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 #[serde(default = "default_max_scrollback_bytes")]
122 pub max_scrollback_bytes: usize,
123
124 #[serde(default = "default_large_output_threshold_kb")]
126 pub large_output_threshold_kb: usize,
127
128 #[serde(default)]
130 pub preferred_shell: Option<String>,
131}
132
133impl Default for PtyConfig {
134 fn default() -> Self {
135 Self {
136 enabled: default_pty_enabled(),
137 default_rows: default_pty_rows(),
138 default_cols: default_pty_cols(),
139 max_sessions: default_max_pty_sessions(),
140 command_timeout_seconds: default_pty_timeout(),
141 stdout_tail_lines: default_stdout_tail_lines(),
142 scrollback_lines: default_scrollback_lines(),
143 max_scrollback_bytes: default_max_scrollback_bytes(),
144 large_output_threshold_kb: default_large_output_threshold_kb(),
145 preferred_shell: None,
146 }
147 }
148}
149
150fn default_pty_enabled() -> bool {
151 true
152}
153
154fn default_pty_rows() -> u16 {
155 24
156}
157
158fn default_pty_cols() -> u16 {
159 80
160}
161
162fn default_max_pty_sessions() -> usize {
163 10
164}
165
166fn default_pty_timeout() -> u64 {
167 300
168}
169
170fn default_stdout_tail_lines() -> usize {
171 crate::constants::defaults::DEFAULT_PTY_STDOUT_TAIL_LINES
172}
173
174fn default_scrollback_lines() -> usize {
175 crate::constants::defaults::DEFAULT_PTY_SCROLLBACK_LINES
176}
177
178fn default_max_scrollback_bytes() -> usize {
179 50_000_000 }
181
182fn default_large_output_threshold_kb() -> usize {
183 5_000 }
185
186fn default_tool_output_mode() -> ToolOutputMode {
187 ToolOutputMode::Compact
188}
189
190fn default_tool_output_max_lines() -> usize {
191 600
192}
193
194fn default_tool_output_spool_bytes() -> usize {
195 200_000
196}
197
198fn default_allow_tool_ansi() -> bool {
199 false
200}
201
202fn default_inline_viewport_rows() -> u16 {
203 crate::constants::ui::DEFAULT_INLINE_VIEWPORT_ROWS
204}
205
206fn default_show_timeline_pane() -> bool {
207 crate::constants::ui::INLINE_SHOW_TIMELINE_PANE
208}
209
210fn default_status_line_mode() -> StatusLineMode {
211 StatusLineMode::Auto
212}
213
214fn default_status_line_refresh_interval_ms() -> u64 {
215 crate::constants::ui::STATUS_LINE_REFRESH_INTERVAL_MS
216}
217
218fn default_status_line_command_timeout_ms() -> u64 {
219 crate::constants::ui::STATUS_LINE_COMMAND_TIMEOUT_MS
220}