use crate::agent::consumer::{AgentHandler, AgentMessage};
use crate::agent::ctx::AgentCtx;
use crate::error::LaserError;
use crate::memory::{MemoryHandle, MemoryKind};
pub struct MemoryHandler<H> {
inner: H,
memory: MemoryHandle,
remember_kind: Option<MemoryKind>,
}
impl<H> MemoryHandler<H> {
pub fn new(inner: H, memory: MemoryHandle) -> Self {
Self {
inner,
memory,
remember_kind: None,
}
}
#[must_use]
pub fn auto_remember(mut self, kind: MemoryKind) -> Self {
self.remember_kind = Some(kind);
self
}
}
impl<H: AgentHandler + Sync> AgentHandler for MemoryHandler<H> {
async fn handle(&self, message: &AgentMessage, ctx: &AgentCtx<'_>) -> Result<(), LaserError> {
self.inner.handle(message, ctx).await?;
if let Some(kind) = self.remember_kind {
let mut remember = self
.memory
.remember(message.payload.clone())
.scope(message.provenance.conversation_id)
.kind(kind);
if let Some(agent) = &message.provenance.agent {
remember = remember.agent(agent.clone());
}
let _ = remember.send().await;
}
Ok(())
}
}