Skip to main content

vtcode_config/
codex.rs

1use serde::{Deserialize, Serialize};
2
3/// Editor URI scheme for clickable file citations.
4#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
5#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, Default)]
6#[serde(rename_all = "kebab-case")]
7pub enum FileOpener {
8    Cursor,
9    #[default]
10    None,
11    Vscode,
12    VscodeInsiders,
13    Windsurf,
14}
15
16impl FileOpener {
17    pub fn scheme(self) -> Option<&'static str> {
18        match self {
19            Self::None => None,
20            Self::Vscode => Some("vscode"),
21            Self::Cursor => Some("cursor"),
22            Self::Windsurf => Some("windsurf"),
23            Self::VscodeInsiders => Some("vscode-insiders"),
24        }
25    }
26}
27
28/// Local history persistence mode.
29#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
30#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, Default)]
31#[serde(rename_all = "snake_case")]
32pub enum HistoryPersistence {
33    #[default]
34    File,
35    None,
36}
37
38/// Codex-compatible history persistence settings.
39#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
40#[derive(Debug, Clone, Deserialize, Serialize, Default)]
41pub struct HistoryConfig {
42    #[serde(default)]
43    pub persistence: HistoryPersistence,
44    #[serde(default)]
45    pub max_bytes: Option<usize>,
46}
47
48/// Built-in TUI notification delivery method.
49#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
50#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, Default)]
51#[serde(rename_all = "snake_case")]
52pub enum TerminalNotificationMethod {
53    #[default]
54    Auto,
55    Bel,
56    Osc9,
57}
58
59/// Alternate-screen preference for the TUI.
60#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
61#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq)]
62#[serde(rename_all = "snake_case")]
63pub enum TuiAlternateScreen {
64    Always,
65    Never,
66}
67
68/// TUI notification filters compatible with Codex config.
69#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
70#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
71#[serde(rename_all = "kebab-case")]
72pub enum TuiNotificationEvent {
73    AgentTurnComplete,
74    ApprovalRequested,
75}
76
77/// Accept either `true`/`false` or an allowlist of event names.
78#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
79#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
80#[serde(untagged)]
81pub enum TuiNotificationsConfig {
82    Enabled(bool),
83    Events(Vec<TuiNotificationEvent>),
84}
85
86/// When to deliver desktop notifications relative to terminal focus.
87#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
88#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, Default)]
89#[serde(rename_all = "snake_case")]
90pub enum NotificationCondition {
91    /// Only deliver when the terminal is unfocused (legacy behaviour).
92    #[default]
93    Unfocused,
94    /// Always deliver regardless of focus state.
95    Always,
96}
97
98/// Codex-compatible TUI settings.
99#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
100#[derive(Debug, Clone, Deserialize, Serialize, Default)]
101pub struct TuiConfig {
102    #[serde(default)]
103    pub notifications: Option<TuiNotificationsConfig>,
104    #[serde(default)]
105    pub notification_method: Option<TerminalNotificationMethod>,
106    /// When to deliver desktop notifications relative to terminal focus.
107    /// Defaults to `unfocused` (only deliver when terminal is not focused).
108    /// Set to `always` to deliver notifications even when the terminal is focused.
109    #[serde(default)]
110    pub notification_condition: Option<NotificationCondition>,
111    #[serde(default)]
112    pub animations: Option<bool>,
113    #[serde(default)]
114    pub alternate_screen: Option<TuiAlternateScreen>,
115    #[serde(default)]
116    pub show_tooltips: Option<bool>,
117}