1use crate::tui::options::{
3 FullscreenInteractionSettings, KeyboardProtocolSettings, SessionSurface,
4};
5use oxicode_vtui_compat::ui_protocol::SlashCommandItem;
6
7pub trait WorkspaceInfoProvider {
9 fn workspace_name(&self) -> String;
10 fn workspace_root(&self) -> Option<std::path::PathBuf>;
11}
12
13pub trait NotificationProvider {
15 fn set_terminal_focused(&self, focused: bool);
16}
17
18pub trait ThemeProvider {
20 fn available_themes(&self) -> Vec<String>;
21 fn active_theme_name(&self) -> Option<String>;
22}
23
24#[derive(Debug, Clone, PartialEq, Eq)]
26pub struct HostSessionDefaults {
27 pub(crate) surface_preference: SessionSurface,
28 pub(crate) inline_rows: u16,
29 pub(crate) keyboard_protocol: KeyboardProtocolSettings,
30 pub(crate) fullscreen: FullscreenInteractionSettings,
31}
32
33impl Default for HostSessionDefaults {
34 fn default() -> Self {
35 Self {
36 surface_preference: SessionSurface::default(),
37 inline_rows: crate::tui::config::constants::ui::DEFAULT_INLINE_VIEWPORT_ROWS,
38 keyboard_protocol: KeyboardProtocolSettings::default(),
39 fullscreen: FullscreenInteractionSettings::default(),
40 }
41 }
42}
43
44pub trait HostAdapter: WorkspaceInfoProvider + NotificationProvider + ThemeProvider {
46 fn session_defaults(&self) -> HostSessionDefaults {
48 HostSessionDefaults::default()
49 }
50
51 fn slash_commands(&self) -> Vec<SlashCommandItem> {
53 Vec::new()
54 }
55
56 fn app_name(&self) -> String {
58 "Agent TUI".to_string()
59 }
60
61 fn non_interactive_hint(&self) -> Option<String> {
63 None
64 }
65}