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