use crate::compaction::CompactionConfig;
use crate::config::ApiProvider;
use crate::models::{Message, SystemPrompt};
use crate::tools::goal::GoalStatus;
use crate::tui::app::AppMode;
use crate::tui::approval::ApprovalMode;
use codewhale_protocol::runtime::DynamicToolSpec;
use std::path::PathBuf;
pub const USER_SHELL_TOOL_ID_PREFIX: &str = "user_shell_";
#[derive(Debug, Clone)]
pub struct SessionSnapshot {
pub messages: Vec<Message>,
pub total_tokens: u64,
pub model: String,
pub workspace: PathBuf,
pub system_prompt: Option<SystemPrompt>,
pub mode: String,
}
#[derive(Debug, Clone)]
pub enum Op {
SendMessage {
content: String,
mode: AppMode,
provider: Option<ApiProvider>,
model: String,
goal_objective: Option<String>,
goal_token_budget: Option<u32>,
goal_status: GoalStatus,
reasoning_effort: Option<String>,
reasoning_effort_auto: bool,
auto_model: bool,
allow_shell: bool,
trust_mode: bool,
auto_approve: bool,
approval_mode: ApprovalMode,
translation_enabled: bool,
show_thinking: bool,
allowed_tools: Option<Vec<String>>,
dynamic_tools: Vec<DynamicToolSpec>,
hook_executor: Option<std::sync::Arc<crate::hooks::HookExecutor>>,
verbosity: Option<String>,
},
RunShellCommand {
command: String,
mode: AppMode,
trust_mode: bool,
auto_approve: bool,
approval_mode: ApprovalMode,
},
SetGoalStatus {
status: GoalStatus,
clear: bool,
},
#[allow(dead_code)]
CancelRequest,
#[allow(dead_code)]
ApproveToolCall { id: String },
#[allow(dead_code)]
DenyToolCall { id: String },
#[allow(dead_code)]
SpawnSubAgent { prompt: String },
ListSubAgents,
#[allow(dead_code)]
ChangeMode { mode: AppMode },
#[allow(dead_code)]
SetModel { model: String, mode: AppMode },
SetCompaction { config: CompactionConfig },
SetStreamChunkTimeout { timeout_secs: u64 },
SyncSession {
session_id: Option<String>,
messages: Vec<Message>,
system_prompt: Option<SystemPrompt>,
system_prompt_override: bool,
model: String,
workspace: PathBuf,
},
CompactContext,
GetSessionSnapshot {
tx: std::sync::Arc<std::sync::Mutex<Option<tokio::sync::oneshot::Sender<SessionSnapshot>>>>,
},
PurgeContext,
#[allow(dead_code)]
EditLastTurn { new_message: String },
Shutdown,
}