vtcode_config/
root.rs

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/// PTY configuration
89#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
90#[derive(Debug, Clone, Deserialize, Serialize)]
91pub struct PtyConfig {
92    /// Enable PTY functionality
93    #[serde(default = "default_pty_enabled")]
94    pub enabled: bool,
95
96    /// Default terminal rows
97    #[serde(default = "default_pty_rows")]
98    pub default_rows: u16,
99
100    /// Default terminal columns
101    #[serde(default = "default_pty_cols")]
102    pub default_cols: u16,
103
104    /// Maximum number of concurrent PTY sessions
105    #[serde(default = "default_max_pty_sessions")]
106    pub max_sessions: usize,
107
108    /// Command timeout in seconds
109    #[serde(default = "default_pty_timeout")]
110    pub command_timeout_seconds: u64,
111
112    /// Number of PTY stdout lines to display in chat output
113    #[serde(default = "default_stdout_tail_lines")]
114    pub stdout_tail_lines: usize,
115
116    /// Maximum number of scrollback lines retained per PTY session
117    #[serde(default = "default_scrollback_lines")]
118    pub scrollback_lines: usize,
119
120    /// Maximum bytes of output to retain per PTY session (prevents memory explosion)
121    #[serde(default = "default_max_scrollback_bytes")]
122    pub max_scrollback_bytes: usize,
123
124    /// Threshold (KB) at which to auto-spool large outputs to disk
125    #[serde(default = "default_large_output_threshold_kb")]
126    pub large_output_threshold_kb: usize,
127
128    /// Preferred shell program for PTY sessions (falls back to environment when unset)
129    #[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 // 50MB max to prevent memory explosion
180}
181
182fn default_large_output_threshold_kb() -> usize {
183    5_000 // 5MB threshold for auto-spooling
184}
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}