use parking_lot::RwLock;
use sage_core::ui::bridge::state::UiSessionInfo;
use std::sync::Arc;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum PermissionMode {
Normal,
Bypass,
Plan,
}
impl PermissionMode {
pub fn cycle(self) -> Self {
match self {
PermissionMode::Normal => PermissionMode::Bypass,
PermissionMode::Bypass => PermissionMode::Plan,
PermissionMode::Plan => PermissionMode::Normal,
}
}
}
pub struct UiState {
pub input_text: String,
pub permission_mode: PermissionMode,
pub is_busy: bool,
pub status_text: String,
pub should_quit: bool,
pub printed_count: usize,
pub error_displayed: bool,
pub session: UiSessionInfo,
pub suggestion_index: usize,
pub current_tool_printed: Option<String>,
pub pending_tool: Option<(String, String)>,
pub animation_frame: usize,
pub pending_tool_result: Option<(String, bool, std::time::Duration)>,
pub model_select_mode: bool,
pub available_models: Vec<String>,
pub model_select_index: usize,
}
impl Default for UiState {
fn default() -> Self {
Self {
input_text: String::new(),
permission_mode: PermissionMode::Normal,
is_busy: false,
status_text: String::new(),
should_quit: false,
printed_count: 0,
error_displayed: false,
session: UiSessionInfo {
session_id: None,
model: "unknown".to_string(),
provider: "unknown".to_string(),
working_dir: std::env::current_dir()
.unwrap_or_default()
.to_string_lossy()
.to_string(),
git_branch: None,
step: 0,
max_steps: None,
},
suggestion_index: 0,
current_tool_printed: None,
pending_tool: None,
animation_frame: 0,
pending_tool_result: None,
model_select_mode: false,
available_models: Vec::new(),
model_select_index: 0,
}
}
}
pub type SharedState = Arc<RwLock<UiState>>;
#[derive(Debug)]
pub enum UiCommand {
Submit(String),
Cancel,
Quit,
}