use crossterm::event::{KeyEvent, MouseEvent};
use crate::tmux::session::SessionView;
#[derive(Debug, Clone)]
pub struct SessionSpec {
pub name: String,
pub path: String,
pub agent: String,
pub args: String,
pub options: SpecOptions,
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct SpecOptions {
pub claude: ClaudeOptions,
pub codex: CodexOptions,
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct ClaudeOptions {
pub session_mode: ClaudeSessionMode,
pub skip_permissions: bool,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub enum ClaudeSessionMode {
#[default]
New,
Continue,
Resume,
}
impl ClaudeSessionMode {
pub fn label(self) -> &'static str {
match self {
Self::New => "New",
Self::Continue => "Continue",
Self::Resume => "Resume",
}
}
pub fn next(self) -> Self {
match self {
Self::New => Self::Continue,
Self::Continue => Self::Resume,
Self::Resume => Self::New,
}
}
pub fn prev(self) -> Self {
match self {
Self::New => Self::Resume,
Self::Continue => Self::New,
Self::Resume => Self::Continue,
}
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct CodexOptions {
pub yolo: bool,
}
#[derive(Debug)]
pub enum Command {
ListNow,
#[allow(dead_code)]
Attach { name: String },
FocusPreview { name: String },
CreateSession(SessionSpec),
KillSession(String),
RenameSession {
internal: String,
new_display: String,
},
RestartSession(String),
DeleteRecent(i64),
SaveDivider(Option<u16>),
SetTheme { name: String, persist: bool },
#[allow(dead_code)]
Shutdown,
}
#[derive(Debug)]
pub enum AppMsg {
Key(KeyEvent),
Mouse(MouseEvent),
Resize(u16, u16),
SessionsRefreshed {
sessions: Vec<SessionView>,
select_after: Option<String>,
},
AttachStarted { name: String },
AttachEnded { name: String },
Warn(String),
Fatal(String),
Shutdown,
Resume,
}