use crate::agent::memory::MemoryProvider;
use crate::tool::ToolCallResult;
use autoagents_llm::ToolCall;
use autoagents_llm::chat::{ChatMessage, ChatRole, MessageType};
use autoagents_protocol::ImageMime;
use std::sync::Arc;
use super::tool_processor::ToolProcessor;
#[cfg(not(target_arch = "wasm32"))]
use tokio::sync::Mutex;
#[cfg(target_arch = "wasm32")]
use futures::lock::Mutex;
pub struct MemoryHelper;
impl MemoryHelper {
pub async fn store_message(
memory: &Option<Arc<Mutex<Box<dyn MemoryProvider>>>>,
message: ChatMessage,
) {
if let Some(mem) = memory {
let mut mem = mem.lock().await;
let _ = mem.remember(&message).await;
}
}
pub async fn store_tool_interaction(
memory: &Option<Arc<Mutex<Box<dyn MemoryProvider>>>>,
tool_calls: &[ToolCall],
tool_results: &[ToolCallResult],
response_text: &str,
) {
if let Some(mem) = memory {
let mut mem = mem.lock().await;
let _ = mem
.remember(&ChatMessage {
role: ChatRole::Assistant,
message_type: MessageType::ToolUse(tool_calls.to_vec()),
content: response_text.to_string(),
})
.await;
let result_tool_calls =
ToolProcessor::create_result_tool_calls(tool_calls, tool_results);
let _ = mem
.remember(&ChatMessage {
role: ChatRole::Tool,
message_type: MessageType::ToolResult(result_tool_calls),
content: String::new(),
})
.await;
}
}
pub async fn store_user_message(
memory: &Option<Arc<Mutex<Box<dyn MemoryProvider>>>>,
content: String,
image: Option<(ImageMime, Vec<u8>)>,
) {
if let Some(mem) = memory {
let mut mem = mem.lock().await;
let message = if let Some((mime, data)) = image {
ChatMessage {
role: ChatRole::User,
message_type: MessageType::Image((mime.into(), data)),
content,
}
} else {
ChatMessage {
role: ChatRole::User,
message_type: MessageType::Text,
content,
}
};
let _ = mem.remember(&message).await;
}
}
pub async fn store_assistant_response(
memory: &Option<Arc<Mutex<Box<dyn MemoryProvider>>>>,
response: String,
) {
Self::store_message(
memory,
ChatMessage {
role: ChatRole::Assistant,
message_type: MessageType::Text,
content: response,
},
)
.await;
}
pub async fn recall_messages(
memory: &Option<Arc<Mutex<Box<dyn MemoryProvider>>>>,
) -> Vec<ChatMessage> {
if let Some(mem) = memory
&& let Ok(messages) = mem.lock().await.recall("", None).await
{
return messages;
}
Vec::new()
}
}