use std::collections::VecDeque;
use std::sync::{Arc, Mutex};
use crate::agents::SubagentProgress;
use crate::utils::MutexExt;
pub struct OperationState {
pub accumulated_tool_calls: Vec<crate::models::ToolCall>,
pub queued_messages: VecDeque<String>,
pub active_subagents: Option<Arc<Mutex<Vec<SubagentProgress>>>>,
}
impl OperationState {
pub fn new() -> Self {
Self {
accumulated_tool_calls: Vec::new(),
queued_messages: VecDeque::new(),
active_subagents: None,
}
}
pub fn queue_message(&mut self, message: String) {
self.queued_messages.push_back(message);
}
pub fn take_queued_message(&mut self) -> Option<String> {
self.queued_messages.pop_front()
}
pub fn has_queued_message(&self) -> bool {
!self.queued_messages.is_empty()
}
pub fn get_queued_messages(&self) -> &VecDeque<String> {
&self.queued_messages
}
pub fn queued_message_count(&self) -> usize {
self.queued_messages.len()
}
pub fn snapshot_subagent_progress(&self) -> Option<Vec<SubagentProgress>> {
self.active_subagents
.as_ref()
.map(|p| p.lock_mut_safe().clone())
}
pub fn clear_subagents(&mut self) {
self.active_subagents = None;
}
}
impl Default for OperationState {
fn default() -> Self {
Self::new()
}
}