Skip to main content

LogMemory

Struct LogMemory 

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

Memory over the append-only Iggy log (AgentTopic::Memory). remember appends, forget appends a tombstone, recall returns the folded items for a conversation (most recent first by limit), applying tombstones and the agent filter. The log is the source of truth.

Recall is incremental: LogMemory keeps a folded projection plus a per-partition cursor, and each recall drains only what was appended since the last one (the same partition-drain the Cursor is built on), with no rescan from offset 0. A fresh instance rebuilds the projection from the log on its first recall. There is no side checkpoint to keep because the log already holds the truth.

Implementations§

Source§

impl LogMemory

Source

pub fn new(laser: Laser) -> Self

A log-backed memory over an owned Laser (cheap to clone, shares the one connection). Hold a single instance to keep recall incremental: it folds only what was appended since the last recall, never rescanning from offset zero. A fresh instance rebuilds the projection from the log on its first recall, so reuse one instance for an agent that recalls repeatedly.

Source

pub fn in_namespace(laser: Laser, namespace: impl Into<String>) -> Self

Like new but carries a caller-named namespace: the prefix the named-item altitude keys on. The records still ride the default AgentTopic::Memory. This is what Laser::memory builds.

Source

pub fn on_topic(laser: Laser, topic: Identifier) -> Self

Like new but writes and folds a caller-named memory topic instead of the default AgentTopic::Memory. The configurable memory stream: one deployment can keep several isolated memory topics. The namespace defaults to the topic’s name.

Source

pub fn on_stream_topic( laser: Laser, stream: Option<String>, topic: Identifier, ) -> Self

Like on_topic but on a caller-named stream too, not the client’s default. None keeps the default stream.

Source

pub fn on_topic_named(laser: Laser, topic: &str) -> Result<Self, LaserError>

on_topic from a topic name, validating it.

Source

pub fn on_stream_topic_named( laser: Laser, stream: Option<String>, topic: &str, ) -> Result<Self, LaserError>

on_stream_topic from a topic name, validating it.

Source

pub async fn set_named( &self, key: &str, body: Vec<u8>, ) -> Result<(), LaserError>

Write named point state: publish a keyed item to the topic (a record, like every memory write) and reflect it in the projection for read-your-writes.

Source

pub async fn update_named( &self, key: &str, patch: Vec<u8>, ) -> Result<(), LaserError>

Merge-patch named point state (RFC 7386): read the current value, merge patch, and write the result back as one event.

Source

pub async fn forget_named(&self, key: &str) -> Result<(), LaserError>

Delete named point state: publish a keyed forget (a tombstone the managed backend applies as a delete) and drop it from the projection.

Source

pub async fn fetch_named( &self, key: &str, ) -> Result<Option<Vec<u8>>, LaserError>

Read named point state, folding the topic first so a fresh handle sees what was written before it.

Source

pub async fn fetch_named_folded( &self, key: &str, ) -> Result<Option<Vec<u8>>, LaserError>

Read named point state by folding the topic in process, the opt-in path for small serverless scenarios. Prefer fetch_named, which reads the materialized key-value view.

Source

pub async fn recall_folded( &self, scope: &MemoryScope, query: &MemoryQuery, ) -> Result<Vec<MemoryItem>, LaserError>

Recall by folding the topic in process: read every memory record for the scope’s conversation off the log and return the most-recent items. This is the opt-in path for small, serverless scenarios with no managed read view. It does not scale: a large topic folds every record, so prefer the default recall, which reads the materialized key-value view.

Trait Implementations§

Source§

impl Memory for LogMemory

Source§

async fn remember( &self, scope: &MemoryScope, payload: Vec<u8>, ) -> Result<MemoryId, LaserError>

Append payload to the memory under scope. The body is opaque bytes, so encode it with whatever codec you like before calling.
Source§

async fn append( &self, scope: &MemoryScope, id: MemoryId, kind: MemoryKind, payload: Vec<u8>, ) -> Result<MemoryId, LaserError>

Append a typed item. Custom backends can keep their remember fallback.
Source§

async fn recall( &self, scope: &MemoryScope, query: &MemoryQuery, ) -> Result<Vec<MemoryItem>, LaserError>

Source§

async fn improve( &self, scope: &MemoryScope, feedback: Feedback, ) -> Result<MemoryId, LaserError>

Record feedback on a recalled item, the log-native signal a ranking backend folds into future recall. Returns the feedback record’s id.
Source§

async fn forget( &self, scope: &MemoryScope, id: MemoryId, ) -> Result<(), LaserError>

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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

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<M> DynMemory for M
where M: Memory + Send + Sync,

Source§

fn remember<'a>( &'a self, scope: &'a MemoryScope, payload: Vec<u8>, ) -> Pin<Box<dyn Future<Output = Result<MemoryId, LaserError>> + Send + 'a>>

Source§

fn append<'a>( &'a self, scope: &'a MemoryScope, id: MemoryId, kind: MemoryKind, payload: Vec<u8>, ) -> Pin<Box<dyn Future<Output = Result<MemoryId, LaserError>> + Send + 'a>>

Boxed typed append, with the custom backend’s remember fallback.
Source§

fn recall<'a>( &'a self, scope: &'a MemoryScope, query: &'a MemoryQuery, ) -> Pin<Box<dyn Future<Output = Result<Vec<MemoryItem>, LaserError>> + Send + 'a>>

Source§

fn improve<'a>( &'a self, scope: &'a MemoryScope, feedback: Feedback, ) -> Pin<Box<dyn Future<Output = Result<MemoryId, LaserError>> + Send + 'a>>

Source§

fn forget<'a>( &'a self, scope: &'a MemoryScope, id: MemoryId, ) -> Pin<Box<dyn Future<Output = Result<(), LaserError>> + Send + 'a>>

Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<A, B, T> HttpServerConnExec<A, B> for T
where B: Body,

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<TraitVariantBlanketType> LocalMemory for TraitVariantBlanketType
where TraitVariantBlanketType: Memory,

Source§

async fn remember( &self, scope: &MemoryScope, payload: Vec<u8>, ) -> Result<MemoryId, LaserError>

Append payload to the memory under scope. The body is opaque bytes, so encode it with whatever codec you like before calling.
Source§

fn append( &self, scope: &MemoryScope, id: MemoryId, kind: MemoryKind, payload: Vec<u8>, ) -> impl Future<Output = Result<MemoryId, LaserError>>
where TraitVariantBlanketType: Sync,

Append a typed item. Custom backends can keep their remember fallback.
Source§

async fn recall( &self, scope: &MemoryScope, query: &MemoryQuery, ) -> Result<Vec<MemoryItem>, LaserError>

Source§

async fn improve( &self, scope: &MemoryScope, feedback: Feedback, ) -> Result<MemoryId, LaserError>

Record feedback on a recalled item, the log-native signal a ranking backend folds into future recall. Returns the feedback record’s id.
Source§

async fn forget( &self, scope: &MemoryScope, id: MemoryId, ) -> Result<(), LaserError>

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> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + 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: Sized + 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> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

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 = !

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

fn try_from(value: U) -> Result<T, !>

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