pub struct FeedbackStore {
pub momentum: HashMap<MemoryId, FeedbackMomentum>,
/* private fields */
}Expand description
Persistent store for feedback momentum with in-memory cache
Fields§
§momentum: HashMap<MemoryId, FeedbackMomentum>In-memory cache: memory_id -> FeedbackMomentum
Implementations§
Source§impl FeedbackStore
impl FeedbackStore
Create persistent store backed by a shared RocksDB instance.
The caller is responsible for opening the DB with the CF_FEEDBACK column
family already declared. On first use this constructor migrates data from
the legacy standalone feedback/ DB directory into the shared CF.
Sourcepub fn with_persistence<P: AsRef<Path>>(path: P) -> Result<Self>
pub fn with_persistence<P: AsRef<Path>>(path: P) -> Result<Self>
Create persistent store with its own standalone RocksDB instance.
Primarily useful for tests and standalone operation. In production, prefer
with_shared_db to share a single DB instance.
Sourcepub fn get_or_create_momentum(
&mut self,
memory_id: MemoryId,
memory_type: ExperienceType,
) -> &mut FeedbackMomentum
pub fn get_or_create_momentum( &mut self, memory_id: MemoryId, memory_type: ExperienceType, ) -> &mut FeedbackMomentum
Get or create momentum for a memory
Sourcepub fn get_momentum(&self, memory_id: &MemoryId) -> Option<FeedbackMomentum>
pub fn get_momentum(&self, memory_id: &MemoryId) -> Option<FeedbackMomentum>
Get momentum for a memory (if exists in-memory), with disk fallback. Checks the in-memory HashMap first, then falls back to RocksDB.
Sourcepub fn mark_dirty(&mut self, memory_id: &MemoryId)
pub fn mark_dirty(&mut self, memory_id: &MemoryId)
Mark a memory as dirty (needs persistence)
Sourcepub fn set_pending(&mut self, pending: PendingFeedback)
pub fn set_pending(&mut self, pending: PendingFeedback)
Set pending feedback for a user (also persists to disk)
Sourcepub fn take_pending(&mut self, user_id: &str) -> Option<PendingFeedback>
pub fn take_pending(&mut self, user_id: &str) -> Option<PendingFeedback>
Take pending feedback for a user (removes from store and disk)
Sourcepub fn get_pending(&self, user_id: &str) -> Option<&PendingFeedback>
pub fn get_pending(&self, user_id: &str) -> Option<&PendingFeedback>
Get pending feedback for a user (without removing)
Sourcepub fn cleanup_expired(&mut self)
pub fn cleanup_expired(&mut self)
Clean up expired pending feedback
Sourcepub fn set_previous_context(
&mut self,
user_id: &str,
context: String,
embedding: Vec<f32>,
surfaced_memory_ids: Vec<MemoryId>,
)
pub fn set_previous_context( &mut self, user_id: &str, context: String, embedding: Vec<f32>, surfaced_memory_ids: Vec<MemoryId>, )
Set previous context for a user (for repetition/topic change detection) Called when memories are surfaced to track what the user asked
Sourcepub fn get_previous_context(&self, user_id: &str) -> Option<&PreviousContext>
pub fn get_previous_context(&self, user_id: &str) -> Option<&PreviousContext>
Get previous context for a user
Sourcepub fn detect_context_pattern(
&self,
user_id: &str,
current_embedding: &[f32],
) -> Option<(bool, bool, f32)>
pub fn detect_context_pattern( &self, user_id: &str, current_embedding: &[f32], ) -> Option<(bool, bool, f32)>
Compare current context to previous and detect action patterns Returns: (is_repetition, is_topic_change, similarity)
- Repetition: similarity > 0.8 means user is asking same thing again (memories failed)
- Topic change: similarity < 0.3 means user moved on (task might be complete)
Sourcepub fn flush(&mut self) -> Result<usize>
pub fn flush(&mut self) -> Result<usize>
Flush dirty entries to disk and ensure WAL is persisted
Sourcepub fn database(&self) -> Option<&Arc<DB>>
pub fn database(&self) -> Option<&Arc<DB>>
Get reference to the RocksDB database for backup (if available)
Sourcepub fn stats(&self) -> FeedbackStoreStats
pub fn stats(&self) -> FeedbackStoreStats
Get statistics
Trait Implementations§
Source§impl Debug for FeedbackStore
impl Debug for FeedbackStore
Auto Trait Implementations§
impl Freeze for FeedbackStore
impl RefUnwindSafe for FeedbackStore
impl Send for FeedbackStore
impl Sync for FeedbackStore
impl Unpin for FeedbackStore
impl UnsafeUnpin for FeedbackStore
impl UnwindSafe for FeedbackStore
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
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
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<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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