Skip to main content

MemoryManager

Struct MemoryManager 

Source
pub struct MemoryManager { /* private fields */ }
Expand description

Agent memory manager.

Stores and retrieves memory entries using the file-based StateStore. Supports embedding-based vector search via an in-memory TF-IDF index that is rebuilt on startup.

Implementations§

Source§

impl MemoryManager

Source

pub async fn total_entries(&self) -> usize

Returns total entries across all memory types (from disk).

Source

pub async fn rebuild_index(&self) -> Result<()>

Rebuild the vector index from all stored memories.

Call once at startup to populate the in-memory index from persisted memory entries.

Source

pub async fn save_index_snapshot(&self) -> Result<()>

Save the current vector index to disk as a snapshot.

Source

pub async fn load_index_snapshot(&self) -> Result<usize>

Load a previously saved vector index snapshot from disk.

Source

pub async fn remember(&self, entry: MemoryEntry) -> Result<String>

Store a memory entry. Returns the entry ID.

Also computes and stores the entry’s text vector in the in-memory index for future semantic search.

Source

pub async fn get( &self, id: &str, memory_type: MemoryType, ) -> Result<Option<MemoryEntry>>

Retrieve a single memory by ID.

Source

pub async fn forget(&self, id: &str, memory_type: MemoryType) -> Result<bool>

Delete a memory entry.

Source

pub async fn list( &self, memory_type: MemoryType, limit: usize, ) -> Result<Vec<MemoryEntry>>

List memories of a given type, most recent first.

Source

pub async fn search( &self, query: &str, memory_type: Option<MemoryType>, limit: usize, ) -> Result<Vec<MemoryEntry>>

Search memories by semantic similarity (vector search).

Falls back to keyword search when the vector index is empty or yields no results above the similarity threshold.

Source

pub async fn recall(&self, query: &str) -> Result<Vec<MemoryEntry>>

Recall relevant memories for a new session.

Combines recent conversation summaries, session summaries, and keyword-matched facts/episodes.

Source

pub fn blend_into_prompt( &self, memories: &[MemoryEntry], system_prompt: &str, ) -> String

Blend recalled memories into the system prompt.

Source

pub async fn summarize_session( &self, session: &Session, ) -> Result<Option<String>>

Create a session summary memory entry from a completed session.

This does NOT use LLM — it records key metadata from the session as a structured memory entry for future reference.

Source

pub async fn is_duplicate(&self, content: &str) -> bool

Check if a memory entry with identical content already exists.

Uses a fast hash comparison against the in-memory vector index.

Source

pub async fn remember_unique( &self, entry: MemoryEntry, ) -> Result<Option<String>>

Store a memory entry only if no duplicate content exists.

Returns the entry ID if stored, or None if duplicate.

Source§

impl MemoryManager

Semantic search using HNSW index.

Unlike search() which uses brute-force cosine similarity over the in-memory HashMap, semantic_search() uses the HNSW approximate nearest neighbor index for sub-linear time complexity.

This is the preferred search method when the HNSW index is available and populated with dense vectors.

§Arguments
  • query — Search query text.
  • memory_type — Optional filter by memory type.
  • limit — Maximum results to return.
  • hnsw_index — The HNSW index to search against.
§Returns

A list of SemanticHit with entry and similarity score.

Source

pub async fn rebuild_hnsw_index( &self, hnsw_index: &HnswMemoryIndex, ) -> Result<usize>

Rebuild the HNSW index from all stored memories.

Call this at startup or after bulk operations.

Source§

impl MemoryManager

Source

pub fn new(state_store: Arc<StateStore>) -> Self

Create a new MemoryManager.

Source

pub fn set_git_layer(&mut self, gl: Arc<GitLayer>)

Attach a git layer for version-controlled saves.

Source

pub fn for_space(space_dir: PathBuf) -> Self

Create a Space-scoped MemoryManager.

Each Space gets its own StateStore under the given directory, providing natural memory isolation between Spaces.

Source

pub fn set_hnsw_index(&self, index: Arc<HnswMemoryIndex>)

Attach an HNSW index for fast semantic search.

Once attached, remember() and forget() automatically keep the HNSW index in sync with the state store.

Source

pub fn with_max_recall(self, n: usize) -> Self

Set max memories returned by recall.

Source

pub fn with_config(self, config: &MemoryConfig) -> Self

Apply MemoryConfig settings.

Source

pub fn vector_index_size(&self) -> usize

Returns the number of entries in the vector index.

Source

pub fn effective_importance(entry: &MemoryEntry) -> f32

Compute effective importance of a memory entry.

Effective importance = base_importance * (1 + log(1 + access_count)) Memories accessed frequently get a boost.

Source

pub async fn curate(&self, budget: &MemoryBudget) -> Result<CurationReport>

Curate memories: identify candidates for removal based on budget.

Returns a report of how many entries would be pruned per type.

Source

pub fn spawn_curation_task(self: &Arc<Self>, budget: MemoryBudget)

Spawn a background curation task.

Returns immediately; curation runs asynchronously.

Trait Implementations§

Source§

impl Debug for MemoryManager

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
Source§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
Source§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

impl<T> MaybeSendSync for T