vtcode-core 0.97.1

Core library for VT Code - a Rust-based terminal coding agent
use crate::config::KeyboardProtocolConfig;
use crate::config::loader::VTCodeConfig;
use crate::config::types::{ReasoningEffortLevel, UiSurfacePreference};
use crate::ui::slash::SlashCommandInfo;
use crate::ui::theme::ThemeStyles;
use vtcode_tui::ReasoningEffortLevel as TuiReasoningEffortLevel;
use vtcode_tui::app::{
    FullscreenInteractionSettings, KeyboardProtocolSettings, SessionSurface, SlashCommandItem,
};
use vtcode_tui::core::{
    LayoutModeOverride, ReasoningDisplayMode, SessionAppearanceConfig, UiMode, theme_from_styles,
};
use vtcode_tui::ui::theme::ThemeStyles as TuiThemeStyles;

pub fn to_tui_reasoning(level: ReasoningEffortLevel) -> TuiReasoningEffortLevel {
    match level {
        ReasoningEffortLevel::None => TuiReasoningEffortLevel::None,
        ReasoningEffortLevel::Minimal => TuiReasoningEffortLevel::Minimal,
        ReasoningEffortLevel::Low => TuiReasoningEffortLevel::Low,
        ReasoningEffortLevel::Medium => TuiReasoningEffortLevel::Medium,
        ReasoningEffortLevel::High => TuiReasoningEffortLevel::High,
        ReasoningEffortLevel::XHigh => TuiReasoningEffortLevel::XHigh,
    }
}

pub fn from_tui_reasoning(level: TuiReasoningEffortLevel) -> ReasoningEffortLevel {
    match level {
        TuiReasoningEffortLevel::None => ReasoningEffortLevel::None,
        TuiReasoningEffortLevel::Minimal => ReasoningEffortLevel::Minimal,
        TuiReasoningEffortLevel::Low => ReasoningEffortLevel::Low,
        TuiReasoningEffortLevel::Medium => ReasoningEffortLevel::Medium,
        TuiReasoningEffortLevel::High => ReasoningEffortLevel::High,
        TuiReasoningEffortLevel::XHigh => ReasoningEffortLevel::XHigh,
    }
}

pub fn to_tui_surface(preference: UiSurfacePreference) -> SessionSurface {
    match preference {
        UiSurfacePreference::Auto => SessionSurface::Auto,
        UiSurfacePreference::Alternate => SessionSurface::Alternate,
        UiSurfacePreference::Inline => SessionSurface::Inline,
    }
}

pub fn to_tui_keyboard_protocol(keyboard: KeyboardProtocolConfig) -> KeyboardProtocolSettings {
    KeyboardProtocolSettings {
        enabled: keyboard.enabled,
        mode: keyboard.mode,
        disambiguate_escape_codes: keyboard.disambiguate_escape_codes,
        report_event_types: keyboard.report_event_types,
        report_alternate_keys: keyboard.report_alternate_keys,
        report_all_keys: keyboard.report_all_keys,
    }
}

pub fn to_tui_fullscreen(config: &VTCodeConfig) -> FullscreenInteractionSettings {
    FullscreenInteractionSettings {
        mouse_capture: config.ui.fullscreen.mouse_capture,
        copy_on_select: config.ui.fullscreen.copy_on_select,
        scroll_speed: config.ui.fullscreen.scroll_speed,
    }
}

pub fn tui_theme_styles_from_core(styles: &ThemeStyles) -> TuiThemeStyles {
    TuiThemeStyles {
        info: styles.info,
        error: styles.error,
        output: styles.output,
        response: styles.response,
        reasoning: styles.reasoning,
        tool: styles.tool,
        tool_detail: styles.tool_detail,
        tool_output: styles.tool_output,
        pty_output: styles.pty_output,
        status: styles.status,
        mcp: styles.mcp,
        user: styles.user,
        primary: styles.primary,
        secondary: styles.secondary,
        foreground: styles.foreground,
        background: styles.background,
    }
}

pub fn inline_theme_from_core_styles(styles: &ThemeStyles) -> vtcode_tui::core::InlineTheme {
    let mapped = tui_theme_styles_from_core(styles);
    theme_from_styles(&mapped)
}

pub fn to_tui_slash_commands(commands: &[SlashCommandInfo]) -> Vec<SlashCommandItem> {
    commands
        .iter()
        .map(|cmd| SlashCommandItem::new(cmd.name, cmd.description))
        .collect()
}

pub fn to_tui_appearance(config: &VTCodeConfig) -> SessionAppearanceConfig {
    let reduce_motion_mode =
        config.ui.reduce_motion_mode || matches!(config.tui.animations, Some(false));
    SessionAppearanceConfig {
        theme: config.agent.theme.clone(),
        ui_mode: match config.ui.display_mode {
            crate::config::UiDisplayMode::Full => UiMode::Full,
            crate::config::UiDisplayMode::Minimal => UiMode::Minimal,
            crate::config::UiDisplayMode::Focused => UiMode::Focused,
        },
        show_sidebar: config.ui.show_sidebar,
        min_content_width: 40,
        min_navigation_width: 20,
        navigation_width_percent: 25,
        transcript_bottom_padding: 0,
        dim_completed_todos: config.ui.dim_completed_todos,
        message_block_spacing: if config.ui.message_block_spacing {
            1
        } else {
            0
        },
        layout_mode: match config.ui.layout_mode {
            crate::config::LayoutModeOverride::Auto => LayoutModeOverride::Auto,
            crate::config::LayoutModeOverride::Compact => LayoutModeOverride::Compact,
            crate::config::LayoutModeOverride::Standard => LayoutModeOverride::Standard,
            crate::config::LayoutModeOverride::Wide => LayoutModeOverride::Wide,
        },
        reasoning_display_mode: match config.ui.reasoning_display_mode {
            crate::config::ReasoningDisplayMode::Always => ReasoningDisplayMode::Always,
            crate::config::ReasoningDisplayMode::Toggle => ReasoningDisplayMode::Toggle,
            crate::config::ReasoningDisplayMode::Hidden => ReasoningDisplayMode::Hidden,
        },
        reasoning_visible_default: config.ui.reasoning_visible_default,
        vim_mode: config.ui.vim_mode,
        screen_reader_mode: config.ui.screen_reader_mode,
        reduce_motion_mode,
        reduce_motion_keep_progress_animation: config.ui.reduce_motion_keep_progress_animation,
        customization: Default::default(),
    }
}