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