use std::collections::HashSet;
use std::sync::{atomic::AtomicBool, Arc};
use std::time::Instant;
use crate::runtime::GoalState;
pub mod commands;
pub mod event_loop;
pub mod render;
pub mod state;
pub use crate::tui::completion::{
collect_files, default_offline_tool_catalog, glob_workspace_files, search_history,
MAX_ATFILE_SUGGESTIONS, MAX_HSEARCH_RESULTS,
};
pub use crate::tui::cost::{detect_model_name, estimate_cost, TurnState, UsageStats};
pub use crate::tui::input_state::{
double_press_window, strip_history_prefix, DoublePressTracker, InputMode, PromptInputState,
DOUBLE_PRESS_WINDOW, HISTORY_CAPACITY,
};
pub use crate::tui::model::{
AppScreen, DiffHunk, DiffLine, DiffLineKind, ToolResultData, TranscriptBlock,
};
pub use render::{parse_apply_patch_input, parse_v4a_patch, preview_args, verb_for_tool};
pub struct App {
pub prompt: PromptInputState,
pub blocks: Vec<TranscriptBlock>,
pub should_quit: bool,
pub session_id: Option<String>,
pub connected: bool,
pub scroll_offset: u16,
pub screen: AppScreen,
pub start_time: Instant,
pub usage: UsageStats,
pub turn: TurnState,
pub turn_count: u64,
pub pending_latency_ms: Option<u64>,
pub model_name: String,
pub spinner_frame: usize,
pub modals: Vec<crate::tui::ui::modal::Modal>,
pub commands: crate::tui::commands::CommandRegistry,
pub tool_catalog: Vec<(String, String)>,
pub command_menu_selected: Option<usize>,
pub planning_mode_on: bool,
pub plan_awaiting_approval: bool,
pub plan_mode_request_pending: bool,
pub double_press: DoublePressTracker,
pub atfile_query: String,
pub atfile_suggestions: Vec<String>,
pub atfile_selected: Option<usize>,
pub hsearch_query: String,
pub hsearch_matches: Vec<usize>,
pub hsearch_selected: usize,
pub pending_permission: Option<PendingPermission>,
pub auto_allowed_tools: HashSet<String>,
pub permission_hook_enabled: Arc<AtomicBool>,
pub current_todos: Vec<crate::tools::todo::TodoItem>,
pub active_goal: Option<GoalState>,
pub workspace_path: std::path::PathBuf,
pub theme: &'static crate::tui::ui::theme::Theme,
pub last_printed_idx: usize,
pub print_queue: Vec<Vec<ratatui::text::Line<'static>>>,
pub modal_scroll: u16,
}
pub struct PendingPermission {
pub tool_name: String,
pub args_preview: String,
pub reply: tokio::sync::oneshot::Sender<bool>,
}