use ratatui::crossterm::event::{KeyEvent, MouseEvent};
use crate::components::approvals::{ApprovalOutcome, ApprovalView};
use crate::components::fleet::ConversationRow;
use crate::components::questions::{QuestionOutcomeView, QuestionView};
use crate::components::tools::ToolView;
use crate::components::transcript::MessageLine;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub(crate) enum Pane {
Fleet,
Transcript,
Approvals,
Tools,
Questions,
}
impl Pane {
pub(crate) const ALL: [Self; 5] = [
Self::Fleet,
Self::Transcript,
Self::Approvals,
Self::Tools,
Self::Questions,
];
#[must_use]
pub(crate) const fn index(self) -> usize {
match self {
Self::Fleet => 0,
Self::Transcript => 1,
Self::Approvals => 2,
Self::Tools => 3,
Self::Questions => 4,
}
}
#[must_use]
pub(crate) const fn title(self) -> &'static str {
match self {
Self::Fleet => "1 Fleet",
Self::Transcript => "2 Transcript",
Self::Approvals => "3 Approvals",
Self::Tools => "4 Tools",
Self::Questions => "5 Questions",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) struct ApprovalDecision {
pub turn_id: String,
pub request_id: String,
pub conversation_id: String,
pub tool_name: String,
pub args_json: String,
pub approved: bool,
pub reason: String,
pub resolve_token: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) struct QuestionDecision {
pub turn_id: String,
pub call_id: String,
pub index: u32,
pub conversation_id: String,
pub selected_index: Option<u32>,
pub selected_label: String,
pub answer_token: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) enum Action {
Tick,
Render,
Resize(u16, u16),
Quit,
Suspend,
Nav(Pane),
Select(String),
FleetLoaded(Vec<ConversationRow>),
FleetDelta(ConversationRow),
TranscriptHistory {
conversation_id: String,
lines: Vec<MessageLine>,
},
ApprovalPending(ApprovalView),
ApprovalDecide(ApprovalDecision),
ApprovalSubmitted {
conversation_id: String,
turn_id: String,
request_id: String,
persisted: bool,
outcome: Option<ApprovalOutcome>,
},
ToolsLoaded(Vec<ToolView>),
QuestionPending(QuestionView),
QuestionDecide(QuestionDecision),
QuestionSubmitted {
call_id: String,
index: u32,
persisted: bool,
outcome: Option<QuestionOutcomeView>,
},
Key(KeyEvent),
Mouse(MouseEvent),
Error(String),
}