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
35#[derive(Clone, Debug, Default, PartialEq, Eq)]
46pub enum ChatWorkspaceFallbackPolicy {
47 #[default]
48 Legacy,
49 Authoritative {
50 session_fallback_path: Option<String>,
51 },
52}
53
54pub struct ChatTurnInput {
56 pub session_id: String,
57 pub project_id: Option<bamboo_domain::ProjectId>,
62 pub model: String,
63 pub model_ref: Option<ProviderModelRef>,
64 pub provider: Option<String>,
65 pub message: String,
66 pub system_prompt: Option<String>,
67 pub enhance_prompt: Option<String>,
68 pub workspace_path: Option<String>,
69 pub default_workspace_path: Option<String>,
73 pub selected_skill_ids: Option<Vec<String>>,
74 pub workflow_selection: Option<bamboo_skills::WorkflowSelection>,
75 pub orchestration_opt_in: Option<bool>,
76 pub copilot_conclusion_with_options_enhancement_enabled: Option<bool>,
77 pub data_dir: Option<std::path::PathBuf>,
80}
81
82pub struct PreparedChatTurn {
84 pub session: Session,
85}
86
87pub struct ExecuteInput {
91 pub session_id: String,
92 pub request_model: Option<String>,
93 pub request_model_ref: Option<ProviderModelRef>,
94 pub request_provider: Option<String>,
95 pub request_reasoning_effort: Option<ReasoningEffort>,
96 pub request_skill_mode: Option<String>,
97 pub client_sync: Option<ExecuteClientSync>,
98}
99
100#[derive(Debug, Clone)]
102pub struct ExecuteClientSync {
103 pub client_message_count: usize,
104 pub client_last_message_id: Option<String>,
105 pub client_has_pending_question: bool,
106 pub client_pending_question_tool_call_id: Option<String>,
107}
108
109#[derive(Debug, Clone, Copy, PartialEq, Eq)]
111pub enum ExecuteSyncReason {
112 PendingQuestionMismatch,
113 MessageCountMismatch,
114 LastMessageIdMismatch,
115}
116
117impl ExecuteSyncReason {
118 pub fn as_str(&self) -> &'static str {
119 match self {
120 Self::PendingQuestionMismatch => "pending_question_mismatch",
121 Self::MessageCountMismatch => "message_count_mismatch",
122 Self::LastMessageIdMismatch => "last_message_id_mismatch",
123 }
124 }
125}
126
127#[derive(Debug, Clone, PartialEq, Eq)]
129pub struct ServerExecuteSnapshot {
130 pub message_count: usize,
131 pub last_message_id: Option<String>,
132 pub has_pending_question: bool,
133 pub pending_question_tool_call_id: Option<String>,
134 pub has_pending_user_message: bool,
135}
136
137#[derive(Debug, Clone)]
139pub struct ExecuteSyncInfo {
140 pub need_sync: bool,
141 pub reason: Option<ExecuteSyncReason>,
142 pub server_message_count: usize,
143 pub server_last_message_id: Option<String>,
144 pub has_pending_question: bool,
145 pub pending_question_tool_call_id: Option<String>,
146 pub has_pending_user_message: bool,
147}
148
149impl ServerExecuteSnapshot {
150 pub fn to_sync_info(&self, reason: Option<ExecuteSyncReason>) -> ExecuteSyncInfo {
151 ExecuteSyncInfo {
152 need_sync: reason.is_some(),
153 reason,
154 server_message_count: self.message_count,
155 server_last_message_id: self.last_message_id.clone(),
156 has_pending_question: self.has_pending_question,
157 pending_question_tool_call_id: self.pending_question_tool_call_id.clone(),
158 has_pending_user_message: self.has_pending_user_message,
159 }
160 }
161}
162
163pub enum ExecutePreparationOutcome {
165 Ready {
167 session: Box<Session>,
168 effective_model: String,
169 effective_reasoning_effort: Option<ReasoningEffort>,
170 model_source: &'static str,
171 reasoning_source: &'static str,
172 is_child_session: bool,
173 },
174 AlreadyRunning {
176 server_snapshot: ServerExecuteSnapshot,
177 },
178 NoPendingMessage {
180 server_snapshot: ServerExecuteSnapshot,
181 },
182 SyncMismatch {
184 reason: ExecuteSyncReason,
185 server_snapshot: ServerExecuteSnapshot,
186 },
187 ModelRequired,
189 ImageFallbackError(String),
191}
192
193pub struct RespondInput {
197 pub session_id: String,
198 pub user_response: String,
199 pub model: Option<String>,
200 pub model_ref: Option<ProviderModelRef>,
201 pub provider: Option<String>,
202 pub reasoning_effort: Option<ReasoningEffort>,
203}
204
205pub struct SubmitResponseOutcome {
207 pub session: Session,
208 pub user_response: String,
209}
210
211#[derive(Clone)]
218pub struct ResumeConfigSnapshot {
219 pub provider_name: String,
220 pub provider_type: Option<String>,
221 pub fast_model: Option<String>,
222 pub fast_model_ref: Option<ProviderModelRef>,
223 pub background_model: Option<String>,
224 pub background_model_ref: Option<ProviderModelRef>,
225 pub background_model_provider: Option<Arc<dyn LLMProvider>>,
226 pub summarization_model: Option<String>,
227 pub summarization_model_ref: Option<ProviderModelRef>,
228 pub summarization_model_provider: Option<Arc<dyn LLMProvider>>,
229 pub disabled_tools: BTreeSet<String>,
230 pub disabled_skill_ids: BTreeSet<String>,
231 pub image_fallback: Option<ImageFallbackConfig>,
232 pub gold_config: Option<GoldConfig>,
233}
234
235#[derive(Debug, Clone, PartialEq, Eq)]
237pub enum ResumeOutcome {
238 Started { run_id: String },
240 AlreadyRunning { run_id: String },
242 Completed,
244 NotFound,
246}
247
248impl ResumeOutcome {
249 pub fn as_str(&self) -> &'static str {
251 self.status_str()
252 }
253
254 pub fn status_str(&self) -> &'static str {
255 match self {
256 Self::Started { .. } => "started",
257 Self::AlreadyRunning { .. } => "already_running",
258 Self::Completed => "completed",
259 Self::NotFound => "error: session not found",
260 }
261 }
262
263 pub fn run_id(&self) -> Option<&String> {
264 match self {
265 Self::Started { run_id } | Self::AlreadyRunning { run_id } => Some(run_id),
266 _ => None,
267 }
268 }
269}