Skip to main content

synaptic_memory/
window.rs

1use std::sync::Arc;
2
3use async_trait::async_trait;
4use synaptic_core::{MemoryStore, Message, SynapseError};
5
6/// A memory strategy that keeps only the last `window_size` messages.
7///
8/// All messages are stored in the underlying store, but `load` returns
9/// only the most recent `window_size` messages.
10pub struct ConversationWindowMemory {
11    store: Arc<dyn MemoryStore>,
12    window_size: usize,
13}
14
15impl ConversationWindowMemory {
16    /// Create a new window memory wrapping the given store.
17    ///
18    /// `window_size` is the maximum number of messages returned by `load`.
19    pub fn new(store: Arc<dyn MemoryStore>, window_size: usize) -> Self {
20        Self { store, window_size }
21    }
22}
23
24#[async_trait]
25impl MemoryStore for ConversationWindowMemory {
26    async fn append(&self, session_id: &str, message: Message) -> Result<(), SynapseError> {
27        self.store.append(session_id, message).await
28    }
29
30    async fn load(&self, session_id: &str) -> Result<Vec<Message>, SynapseError> {
31        let messages = self.store.load(session_id).await?;
32        if messages.len() <= self.window_size {
33            Ok(messages)
34        } else {
35            let start = messages.len() - self.window_size;
36            Ok(messages[start..].to_vec())
37        }
38    }
39
40    async fn clear(&self, session_id: &str) -> Result<(), SynapseError> {
41        self.store.clear(session_id).await
42    }
43}