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
impl LogMemory
Sourcepub fn new(laser: Laser) -> Self
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.
Sourcepub fn in_namespace(laser: Laser, namespace: impl Into<String>) -> Self
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.
Sourcepub fn on_topic(laser: Laser, topic: Identifier) -> Self
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.
Sourcepub fn on_stream_topic(
laser: Laser,
stream: Option<String>,
topic: Identifier,
) -> Self
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.
Sourcepub fn on_topic_named(laser: Laser, topic: &str) -> Result<Self, LaserError>
pub fn on_topic_named(laser: Laser, topic: &str) -> Result<Self, LaserError>
on_topic from a topic name, validating it.
Sourcepub fn on_stream_topic_named(
laser: Laser,
stream: Option<String>,
topic: &str,
) -> Result<Self, LaserError>
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.
Sourcepub async fn set_named(
&self,
key: &str,
body: Vec<u8>,
) -> Result<(), LaserError>
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.
Sourcepub async fn update_named(
&self,
key: &str,
patch: Vec<u8>,
) -> Result<(), LaserError>
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.
Sourcepub async fn forget_named(&self, key: &str) -> Result<(), LaserError>
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.
Sourcepub async fn fetch_named(
&self,
key: &str,
) -> Result<Option<Vec<u8>>, LaserError>
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.
Sourcepub async fn fetch_named_folded(
&self,
key: &str,
) -> Result<Option<Vec<u8>>, LaserError>
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.
Sourcepub async fn recall_folded(
&self,
scope: &MemoryScope,
query: &MemoryQuery,
) -> Result<Vec<MemoryItem>, LaserError>
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
impl Memory for LogMemory
Source§async fn remember(
&self,
scope: &MemoryScope,
payload: Vec<u8>,
) -> Result<MemoryId, LaserError>
async fn remember( &self, scope: &MemoryScope, payload: Vec<u8>, ) -> Result<MemoryId, LaserError>
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>
async fn append( &self, scope: &MemoryScope, id: MemoryId, kind: MemoryKind, payload: Vec<u8>, ) -> Result<MemoryId, LaserError>
async fn recall( &self, scope: &MemoryScope, query: &MemoryQuery, ) -> Result<Vec<MemoryItem>, LaserError>
Source§async fn improve(
&self,
scope: &MemoryScope,
feedback: Feedback,
) -> Result<MemoryId, LaserError>
async fn improve( &self, scope: &MemoryScope, feedback: Feedback, ) -> Result<MemoryId, LaserError>
feedback on a recalled item, the log-native signal a ranking
backend folds into future recall. Returns the feedback record’s id.async fn forget( &self, scope: &MemoryScope, id: MemoryId, ) -> Result<(), LaserError>
Auto Trait Implementations§
impl !Freeze for LogMemory
impl !RefUnwindSafe for LogMemory
impl !UnwindSafe for LogMemory
impl Send for LogMemory
impl Sync for LogMemory
impl Unpin for LogMemory
impl UnsafeUnpin for LogMemory
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<M> DynMemory for M
impl<M> DynMemory for M
Source§fn remember<'a>(
&'a self,
scope: &'a MemoryScope,
payload: Vec<u8>,
) -> Pin<Box<dyn Future<Output = Result<MemoryId, LaserError>> + Send + 'a>>
fn remember<'a>( &'a self, scope: &'a MemoryScope, payload: Vec<u8>, ) -> Pin<Box<dyn Future<Output = Result<MemoryId, LaserError>> + Send + 'a>>
Memory::remember.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>>
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>>
Source§fn recall<'a>(
&'a self,
scope: &'a MemoryScope,
query: &'a MemoryQuery,
) -> Pin<Box<dyn Future<Output = Result<Vec<MemoryItem>, LaserError>> + Send + 'a>>
fn recall<'a>( &'a self, scope: &'a MemoryScope, query: &'a MemoryQuery, ) -> Pin<Box<dyn Future<Output = Result<Vec<MemoryItem>, LaserError>> + Send + 'a>>
Memory::recall.Source§fn improve<'a>(
&'a self,
scope: &'a MemoryScope,
feedback: Feedback,
) -> Pin<Box<dyn Future<Output = Result<MemoryId, LaserError>> + Send + 'a>>
fn improve<'a>( &'a self, scope: &'a MemoryScope, feedback: Feedback, ) -> Pin<Box<dyn Future<Output = Result<MemoryId, LaserError>> + Send + 'a>>
Memory::improve.Source§fn forget<'a>(
&'a self,
scope: &'a MemoryScope,
id: MemoryId,
) -> Pin<Box<dyn Future<Output = Result<(), LaserError>> + Send + 'a>>
fn forget<'a>( &'a self, scope: &'a MemoryScope, id: MemoryId, ) -> Pin<Box<dyn Future<Output = Result<(), LaserError>> + Send + 'a>>
Memory::forget.Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.impl<A, B, T> HttpServerConnExec<A, B> for Twhere
B: Body,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<TraitVariantBlanketType> LocalMemory for TraitVariantBlanketTypewhere
TraitVariantBlanketType: Memory,
impl<TraitVariantBlanketType> LocalMemory for TraitVariantBlanketTypewhere
TraitVariantBlanketType: Memory,
Source§async fn remember(
&self,
scope: &MemoryScope,
payload: Vec<u8>,
) -> Result<MemoryId, LaserError>
async fn remember( &self, scope: &MemoryScope, payload: Vec<u8>, ) -> Result<MemoryId, LaserError>
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,
fn append(
&self,
scope: &MemoryScope,
id: MemoryId,
kind: MemoryKind,
payload: Vec<u8>,
) -> impl Future<Output = Result<MemoryId, LaserError>>where
TraitVariantBlanketType: Sync,
async fn recall( &self, scope: &MemoryScope, query: &MemoryQuery, ) -> Result<Vec<MemoryItem>, LaserError>
Source§async fn improve(
&self,
scope: &MemoryScope,
feedback: Feedback,
) -> Result<MemoryId, LaserError>
async fn improve( &self, scope: &MemoryScope, feedback: Feedback, ) -> Result<MemoryId, LaserError>
feedback on a recalled item, the log-native signal a ranking
backend folds into future recall. Returns the feedback record’s id.async fn forget( &self, scope: &MemoryScope, id: MemoryId, ) -> Result<(), LaserError>
Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
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
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
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
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.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
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.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
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.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
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.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
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.