use super::agent::Stream;
use super::complete::Candidate;
use super::history::History;
use super::input::InputBuffer;
use super::transcript::Transcript;
use crate::config::runtime::RuntimeConfig;
use saya_store::{RedactedSession, SqliteStateStore};
use std::cell::Cell;
use std::sync::Arc;
use std::sync::mpsc::Receiver;
use tokio::sync::oneshot;
pub(crate) const MAX_INPUT_ROWS: usize = 6;
pub(crate) struct Menu {
pub(crate) start: usize,
pub(crate) end: usize,
pub(crate) candidates: Vec<Candidate>,
pub(crate) selected: usize,
}
pub(crate) struct PendingApproval {
pub(crate) tool: String,
pub(crate) detail: Option<String>,
pub(crate) respond: oneshot::Sender<bool>,
}
pub(crate) struct Picker {
pub(crate) entries: Vec<PickerEntry>,
pub(crate) selected: usize,
}
pub(crate) struct PickerEntry {
pub(crate) id: String,
pub(crate) label: String,
}
#[derive(Default)]
pub(crate) struct RequestState {
pub(crate) stream: Option<Stream>,
pub(crate) started: Option<std::time::Instant>,
pub(crate) activity: Option<String>,
pub(crate) pending_approval: Option<PendingApproval>,
}
#[derive(Default)]
pub(crate) struct OverlayState {
pub(crate) menu: Option<Menu>,
pub(crate) picker_loading: Option<Receiver<Result<Vec<PickerEntry>, String>>>,
pub(crate) picker: Option<Picker>,
pub(crate) pending_resume: Option<String>,
pub(crate) show_help: bool,
pub(crate) selection_mode: bool,
}
pub(crate) struct ClipboardCopy {
pub(crate) native_result: Receiver<bool>,
pub(crate) osc_error: Option<String>,
}
pub(crate) struct SessionSave {
pub(crate) result: Receiver<Result<(), String>>,
}
#[derive(Clone)]
pub(crate) struct LastQuery {
pub(crate) sql: String,
pub(crate) connection: Option<String>,
}
pub(crate) struct App {
pub(crate) input: InputBuffer,
pub(crate) transcript: Transcript,
pub(crate) profiles: Vec<String>,
pub(crate) pending: Option<String>,
pub(crate) request: RequestState,
pub(crate) overlays: OverlayState,
pub(crate) spinner: usize,
pub(crate) history: History,
pub(crate) viewport: Cell<(u16, u16)>,
pub(crate) ctrl_c_armed: bool,
pub(crate) at_refs: Vec<String>,
pub(crate) pending_clipboard: Option<String>,
pub(crate) clipboard_copy: Option<ClipboardCopy>,
pub(crate) session_save: Option<SessionSave>,
pub(crate) pending_session_save: Option<RedactedSession>,
pub(crate) last_query: Option<LastQuery>,
pub(crate) runtime: Arc<RuntimeConfig>,
pub(crate) state_db: SqliteStateStore,
pub(crate) should_quit: bool,
}