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