Skip to main content

MemoryStore

Struct MemoryStore 

Source
pub struct MemoryStore<P: Platform> { /* private fields */ }
Expand description

Long-term and session memory store.

Wraps two markdown files (MEMORY.md and HISTORY.md) behind the platform filesystem abstraction. Reads are lock-free (each call reads the file); writes go through the platform’s append/write operations.

§Directory resolution

The constructor resolves the memory directory using the fallback chain:

  1. ~/.clawft/workspace/memory/
  2. ~/.nanobot/workspace/memory/ (legacy fallback)

If neither exists, the .clawft path is used and created on first write.

Implementations§

Source§

impl<P: Platform> MemoryStore<P>

Source

pub fn new(platform: Arc<P>) -> Result<Self>

Create a new memory store.

Resolves the workspace memory directory from the platform home directory. Prefers ~/.clawft/workspace/memory/; falls back to ~/.nanobot/workspace/memory/ if the .clawft directory does not exist but .nanobot does.

§Errors

Returns ClawftError::ConfigInvalid if no home directory can be determined from the platform.

Source

pub async fn read_long_term(&self) -> Result<String>

Read long-term memory (MEMORY.md).

Returns an empty string if the file does not exist yet, matching the Python nanobot behavior. I/O errors other than “not found” are propagated.

Source

pub async fn write_long_term(&self, content: &str) -> Result<()>

Write (overwrite) long-term memory.

Creates parent directories if they do not exist.

Source

pub async fn append_long_term(&self, entry: &str) -> Result<()>

Append an entry to long-term memory.

Each entry is terminated with a double newline to form distinct paragraphs for later search.

Source

pub async fn read_history(&self) -> Result<String>

Read the history file (HISTORY.md).

Returns an empty string if the file does not exist yet.

Source

pub async fn append_history(&self, entry: &str) -> Result<()>

Append an entry to the history file.

Each entry is terminated with a double newline to match the Python append_history behavior.

Source

pub async fn search(&self, query: &str, max_results: usize) -> Vec<String>

Substring search across both memory files.

Splits content by double-newline into paragraphs, then returns paragraphs containing query (case-insensitive). Results are returned in document order, capped at max_results.

Source

pub fn memory_path(&self) -> &PathBuf

Path to the memory file (for diagnostics / context building).

Source

pub fn history_path(&self) -> &PathBuf

Path to the history file (for diagnostics / context building).

Auto Trait Implementations§

§

impl<P> Freeze for MemoryStore<P>

§

impl<P> RefUnwindSafe for MemoryStore<P>
where P: RefUnwindSafe,

§

impl<P> Send for MemoryStore<P>

§

impl<P> Sync for MemoryStore<P>

§

impl<P> Unpin for MemoryStore<P>

§

impl<P> UnsafeUnpin for MemoryStore<P>

§

impl<P> UnwindSafe for MemoryStore<P>
where P: RefUnwindSafe,

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> 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> 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, 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