bamboo_engine/session_app/
types.rs1use std::collections::BTreeSet;
2use std::sync::Arc;
3
4use crate::config::GoldConfig;
5use crate::ImageFallbackConfig;
6use bamboo_domain::reasoning::ReasoningEffort;
7use bamboo_domain::ProviderModelRef;
8use bamboo_domain::Session;
9use bamboo_llm::LLMProvider;
10
11#[derive(Clone, Default)]
16pub struct ExecutionConfigSnapshot {
17 pub default_model: Option<String>,
18 pub default_model_ref: Option<ProviderModelRef>,
19 pub default_reasoning_effort: Option<ReasoningEffort>,
20 pub disabled_tools: Vec<String>,
21 pub disabled_skill_ids: Vec<String>,
22 pub provider_name: String,
23 pub provider_type: Option<String>,
24 pub fast_model: Option<String>,
25 pub fast_model_ref: Option<ProviderModelRef>,
26 pub background_model: Option<String>,
27 pub background_model_ref: Option<ProviderModelRef>,
28 pub summarization_model: Option<String>,
29 pub summarization_model_ref: Option<ProviderModelRef>,
30 pub image_fallback: Option<ImageFallbackConfig>,
31 pub gold_config: Option<GoldConfig>,
32 pub provider_model_ref_enabled: bool,
33}
34
35pub struct ChatTurnInput {
39 pub session_id: String,
40 pub model: String,
41 pub model_ref: Option<ProviderModelRef>,
42 pub provider: Option<String>,
43 pub message: String,
44 pub system_prompt: Option<String>,
45 pub enhance_prompt: Option<String>,
46 pub workspace_path: Option<String>,
47 pub selected_skill_ids: Option<Vec<String>>,
48 pub workflow_selection: Option<bamboo_skills::WorkflowSelection>,
49 pub orchestration_opt_in: Option<bool>,
50 pub copilot_conclusion_with_options_enhancement_enabled: Option<bool>,
51 pub data_dir: Option<std::path::PathBuf>,
54}
55
56pub struct PreparedChatTurn {
58 pub session: Session,
59}
60
61pub struct ExecuteInput {
65 pub session_id: String,
66 pub request_model: Option<String>,
67 pub request_model_ref: Option<ProviderModelRef>,
68 pub request_provider: Option<String>,
69 pub request_reasoning_effort: Option<ReasoningEffort>,
70 pub request_skill_mode: Option<String>,
71 pub client_sync: Option<ExecuteClientSync>,
72}
73
74#[derive(Debug, Clone)]
76pub struct ExecuteClientSync {
77 pub client_message_count: usize,
78 pub client_last_message_id: Option<String>,
79 pub client_has_pending_question: bool,
80 pub client_pending_question_tool_call_id: Option<String>,
81}
82
83#[derive(Debug, Clone, Copy, PartialEq, Eq)]
85pub enum ExecuteSyncReason {
86 PendingQuestionMismatch,
87 MessageCountMismatch,
88 LastMessageIdMismatch,
89}
90
91impl ExecuteSyncReason {
92 pub fn as_str(&self) -> &'static str {
93 match self {
94 Self::PendingQuestionMismatch => "pending_question_mismatch",
95 Self::MessageCountMismatch => "message_count_mismatch",
96 Self::LastMessageIdMismatch => "last_message_id_mismatch",
97 }
98 }
99}
100
101#[derive(Debug, Clone, PartialEq, Eq)]
103pub struct ServerExecuteSnapshot {
104 pub message_count: usize,
105 pub last_message_id: Option<String>,
106 pub has_pending_question: bool,
107 pub pending_question_tool_call_id: Option<String>,
108 pub has_pending_user_message: bool,
109}
110
111#[derive(Debug, Clone)]
113pub struct ExecuteSyncInfo {
114 pub need_sync: bool,
115 pub reason: Option<ExecuteSyncReason>,
116 pub server_message_count: usize,
117 pub server_last_message_id: Option<String>,
118 pub has_pending_question: bool,
119 pub pending_question_tool_call_id: Option<String>,
120 pub has_pending_user_message: bool,
121}
122
123impl ServerExecuteSnapshot {
124 pub fn to_sync_info(&self, reason: Option<ExecuteSyncReason>) -> ExecuteSyncInfo {
125 ExecuteSyncInfo {
126 need_sync: reason.is_some(),
127 reason,
128 server_message_count: self.message_count,
129 server_last_message_id: self.last_message_id.clone(),
130 has_pending_question: self.has_pending_question,
131 pending_question_tool_call_id: self.pending_question_tool_call_id.clone(),
132 has_pending_user_message: self.has_pending_user_message,
133 }
134 }
135}
136
137pub enum ExecutePreparationOutcome {
139 Ready {
141 session: Box<Session>,
142 effective_model: String,
143 effective_reasoning_effort: Option<ReasoningEffort>,
144 model_source: &'static str,
145 reasoning_source: &'static str,
146 is_child_session: bool,
147 },
148 AlreadyRunning {
150 server_snapshot: ServerExecuteSnapshot,
151 },
152 NoPendingMessage {
154 server_snapshot: ServerExecuteSnapshot,
155 },
156 SyncMismatch {
158 reason: ExecuteSyncReason,
159 server_snapshot: ServerExecuteSnapshot,
160 },
161 ModelRequired,
163 ImageFallbackError(String),
165}
166
167pub struct RespondInput {
171 pub session_id: String,
172 pub user_response: String,
173 pub model: Option<String>,
174 pub model_ref: Option<ProviderModelRef>,
175 pub provider: Option<String>,
176 pub reasoning_effort: Option<ReasoningEffort>,
177}
178
179pub struct SubmitResponseOutcome {
181 pub session: Session,
182 pub user_response: String,
183}
184
185#[derive(Clone)]
192pub struct ResumeConfigSnapshot {
193 pub provider_name: String,
194 pub provider_type: Option<String>,
195 pub fast_model: Option<String>,
196 pub fast_model_ref: Option<ProviderModelRef>,
197 pub background_model: Option<String>,
198 pub background_model_ref: Option<ProviderModelRef>,
199 pub background_model_provider: Option<Arc<dyn LLMProvider>>,
200 pub summarization_model: Option<String>,
201 pub summarization_model_ref: Option<ProviderModelRef>,
202 pub summarization_model_provider: Option<Arc<dyn LLMProvider>>,
203 pub disabled_tools: BTreeSet<String>,
204 pub disabled_skill_ids: BTreeSet<String>,
205 pub image_fallback: Option<ImageFallbackConfig>,
206 pub gold_config: Option<GoldConfig>,
207}
208
209#[derive(Debug, Clone, PartialEq, Eq)]
211pub enum ResumeOutcome {
212 Started { run_id: String },
214 AlreadyRunning { run_id: String },
216 Completed,
218 NotFound,
220}
221
222impl ResumeOutcome {
223 pub fn as_str(&self) -> &'static str {
225 self.status_str()
226 }
227
228 pub fn status_str(&self) -> &'static str {
229 match self {
230 Self::Started { .. } => "started",
231 Self::AlreadyRunning { .. } => "already_running",
232 Self::Completed => "completed",
233 Self::NotFound => "error: session not found",
234 }
235 }
236
237 pub fn run_id(&self) -> Option<&String> {
238 match self {
239 Self::Started { run_id } | Self::AlreadyRunning { run_id } => Some(run_id),
240 _ => None,
241 }
242 }
243}