use crate::brain::agent::AgentService;
use std::sync::{Arc, Mutex, Weak};
use uuid::Uuid;
pub(crate) type AgentHolder = Arc<Mutex<Option<Weak<AgentService>>>>;
pub(crate) fn new_holder() -> AgentHolder {
Arc::new(Mutex::new(None))
}
pub(crate) fn fill(holder: &AgentHolder, agent: &Arc<AgentService>) {
if let Ok(mut h) = holder.lock() {
*h = Some(Arc::downgrade(agent));
}
}
pub(crate) fn upgrade(holder: &AgentHolder) -> Option<Arc<AgentService>> {
holder
.lock()
.ok()
.and_then(|g| g.as_ref().and_then(Weak::upgrade))
}
pub(crate) async fn run_resume_turn(
agent: Arc<AgentService>,
session_id: Uuid,
context_text: String,
channel: &str,
target: &str,
) -> Option<String> {
match agent
.send_message_with_tools_and_callback(
session_id,
context_text,
None,
None,
None,
None,
None,
channel,
Some(target),
)
.await
{
Ok(resp) if !resp.content.trim().is_empty() => Some(resp.content),
Ok(_) => None,
Err(e) => {
tracing::warn!(
"[bg-resume] {channel}: resume turn failed for session {session_id}: {e}"
);
None
}
}
}