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