pub struct MemoryService { /* private fields */ }Expand description
Facade over SurrealStorage with scope-aware helpers.
Implementations§
Source§impl MemoryService
impl MemoryService
Sourcepub async fn new(config: MemoryConfig) -> Result<Self>
pub async fn new(config: MemoryConfig) -> Result<Self>
Initialise the service by connecting to (or creating) the embedded SurrealDB store.
Sourcepub async fn add(
&self,
content: impl Into<String>,
scope: MemoryScope,
memory_type: MemoryType,
user_ctx: &UserContext,
agent_id: Option<&str>,
session_id: Option<&str>,
categories: Vec<String>,
metadata: Option<Value>,
importance: f32,
) -> Result<Memory>
pub async fn add( &self, content: impl Into<String>, scope: MemoryScope, memory_type: MemoryType, user_ctx: &UserContext, agent_id: Option<&str>, session_id: Option<&str>, categories: Vec<String>, metadata: Option<Value>, importance: f32, ) -> Result<Memory>
Add a memory with explicit scope. User-scoped memories require user_ctx.user_id.
Sourcepub async fn search(
&self,
query: &str,
user_ctx: &UserContext,
agent_id: Option<&str>,
session_id: Option<&str>,
limit: usize,
categories: Option<&[String]>,
) -> Result<Vec<Memory>>
pub async fn search( &self, query: &str, user_ctx: &UserContext, agent_id: Option<&str>, session_id: Option<&str>, limit: usize, categories: Option<&[String]>, ) -> Result<Vec<Memory>>
Semantic search over scoped memories. Automatically filters by user ownership.
Sourcepub async fn hybrid_search(
&self,
query: &str,
user_ctx: &UserContext,
agent_id: Option<&str>,
session_id: Option<&str>,
limit: usize,
vector_weight: Option<f32>,
bm25_weight: Option<f32>,
) -> Result<Vec<Memory>>
pub async fn hybrid_search( &self, query: &str, user_ctx: &UserContext, agent_id: Option<&str>, session_id: Option<&str>, limit: usize, vector_weight: Option<f32>, bm25_weight: Option<f32>, ) -> Result<Vec<Memory>>
Hybrid BM25 + HNSW vector search. Weights are read from config by default.
Sourcepub async fn auto_capture(
&self,
messages: Vec<Value>,
user_ctx: &UserContext,
agent_id: Option<&str>,
session_id: Option<&str>,
) -> Result<Vec<Memory>>
pub async fn auto_capture( &self, messages: Vec<Value>, user_ctx: &UserContext, agent_id: Option<&str>, session_id: Option<&str>, ) -> Result<Vec<Memory>>
Auto-extract memories from a conversation turn (calls the embedding LLM internally).
Sourcepub async fn list(
&self,
user_ctx: &UserContext,
agent_id: Option<&str>,
session_id: Option<&str>,
) -> Result<Vec<Memory>>
pub async fn list( &self, user_ctx: &UserContext, agent_id: Option<&str>, session_id: Option<&str>, ) -> Result<Vec<Memory>>
List all memories for a scope, filtered by caller identity.
Sourcepub async fn add_workflow_mirror_record(
&self,
record: WorkflowMirrorRecord,
user_ctx: &UserContext,
) -> Result<Memory>
pub async fn add_workflow_mirror_record( &self, record: WorkflowMirrorRecord, user_ctx: &UserContext, ) -> Result<Memory>
Add a KBD/OpenSpec workflow mirror record through the memory service boundary.
Sourcepub async fn list_workflow_mirror_candidates(
&self,
user_ctx: &UserContext,
) -> Result<Vec<WorkflowMirrorCandidate>>
pub async fn list_workflow_mirror_candidates( &self, user_ctx: &UserContext, ) -> Result<Vec<WorkflowMirrorCandidate>>
List workflow mirror recovery candidates from scoped memory records.
Sourcepub async fn get(&self, id: &str) -> Result<Option<Memory>>
pub async fn get(&self, id: &str) -> Result<Option<Memory>>
Retrieve a single memory by its record ID string (e.g. "memory:abc123").
Sourcepub async fn update(&self, id: &str, content: String) -> Result<Memory>
pub async fn update(&self, id: &str, content: String) -> Result<Memory>
Update a memory’s content (creates a history record).
Sourcepub async fn delete(&self, id: &str) -> Result<()>
pub async fn delete(&self, id: &str) -> Result<()>
Delete a single memory. Ownership is not enforced here — callers should
validate ownership before calling (e.g. via get + scope check).
Sourcepub async fn delete_all(
&self,
user_ctx: &UserContext,
agent_id: Option<&str>,
session_id: Option<&str>,
) -> Result<u64>
pub async fn delete_all( &self, user_ctx: &UserContext, agent_id: Option<&str>, session_id: Option<&str>, ) -> Result<u64>
Delete all memories for a scope filter.
Sourcepub async fn history(&self, memory_id: &str) -> Result<Vec<MemoryHistory>>
pub async fn history(&self, memory_id: &str) -> Result<Vec<MemoryHistory>>
Get the audit history for a memory.
Sourcepub async fn compress(
&self,
user_ctx: &UserContext,
agent_id: Option<&str>,
session_id: Option<&str>,
older_than_days: u32,
) -> Result<Option<Memory>>
pub async fn compress( &self, user_ctx: &UserContext, agent_id: Option<&str>, session_id: Option<&str>, older_than_days: u32, ) -> Result<Option<Memory>>
Compress memories older than older_than_days into a single summary.
Sourcepub async fn expire_stale(&self) -> Result<u64>
pub async fn expire_stale(&self) -> Result<u64>
Expire stale memories (those past their valid_until TTL). Returns expired count.
pub async fn knowledge_graph(&self) -> Result<KnowledgeGraph>
pub async fn create_entity(&self, entity: Entity) -> Result<Entity>
pub async fn create_entities( &self, entities: Vec<Entity>, ) -> Result<Vec<Entity>>
pub async fn get_entity(&self, name: &str) -> Result<Option<Entity>>
pub async fn search_entities(&self, query: &str) -> Result<Vec<Entity>>
pub async fn semantic_search_entities( &self, query: &str, limit: usize, threshold: f32, ) -> Result<Vec<SemanticSearchResult>>
pub async fn add_entity_observations( &self, name: &str, observations: Vec<String>, ) -> Result<Entity>
pub async fn delete_entity(&self, name: &str) -> Result<()>
pub async fn create_relation(&self, relation: Relation) -> Result<Relation>
pub async fn create_relations( &self, relations: Vec<Relation>, ) -> Result<Vec<Relation>>
pub async fn get_relations(&self, entity_name: &str) -> Result<Vec<Relation>>
pub async fn delete_relation( &self, from: &str, to: &str, relation_type: &str, ) -> Result<()>
pub async fn expand_neighbors( &self, entity_name: &str, depth: u8, limit: usize, ) -> Result<KnowledgeGraph>
pub async fn find_path( &self, from: &str, to: &str, max_depth: u8, ) -> Result<Vec<Vec<String>>>
pub async fn create_task_stream(&self, stream: TaskStream) -> Result<TaskStream>
pub async fn get_task_stream( &self, name: &str, user_id: Option<&str>, agent_id: Option<&str>, ) -> Result<Option<TaskStream>>
pub async fn add_to_task_stream( &self, stream_name: &str, user_id: Option<&str>, agent_id: Option<&str>, memory: Memory, ) -> Result<Memory>
Sourcepub async fn task_stream_context(
&self,
stream_name: &str,
user_id: Option<&str>,
agent_id: Option<&str>,
model_id: &str,
max_tokens: Option<u64>,
) -> Result<ContextWindow>
pub async fn task_stream_context( &self, stream_name: &str, user_id: Option<&str>, agent_id: Option<&str>, model_id: &str, max_tokens: Option<u64>, ) -> Result<ContextWindow>
Get a model-aware context window for a TaskStream, respecting the token budget.
pub async fn list_task_streams( &self, agent_id: Option<&str>, user_id: Option<&str>, ) -> Result<Vec<TaskStream>>
pub async fn archive_task_stream( &self, name: &str, user_id: Option<&str>, agent_id: Option<&str>, ) -> Result<TaskStream>
pub async fn auto_summarize_task_stream( &self, stream_name: &str, user_id: Option<&str>, agent_id: Option<&str>, model_id: &str, ) -> Result<Option<Memory>>
pub async fn create_mindmap(&self, mindmap: MindMap) -> Result<MindMap>
pub async fn get_mindmap( &self, name: &str, user_id: Option<&str>, ) -> Result<Option<MindMap>>
pub async fn list_mindmaps( &self, user_id: Option<&str>, agent_id: Option<&str>, ) -> Result<Vec<MindMap>>
pub async fn add_mindmap_node( &self, mindmap_name: &str, user_id: Option<&str>, node: MindMapNode, ) -> Result<MindMap>
pub async fn add_mindmap_edge( &self, mindmap_name: &str, user_id: Option<&str>, edge: MindMapEdge, ) -> Result<MindMap>
pub async fn delete_mindmap_node( &self, mindmap_name: &str, user_id: Option<&str>, node_id: &str, ) -> Result<MindMap>
pub async fn delete_mindmap( &self, name: &str, user_id: Option<&str>, ) -> Result<()>
Sourcepub fn storage(&self) -> Arc<dyn MemoryStorage> ⓘ
pub fn storage(&self) -> Arc<dyn MemoryStorage> ⓘ
Return the underlying storage for direct use in the MCP server handler.
Sourcepub fn config(&self) -> &MemoryConfig
pub fn config(&self) -> &MemoryConfig
Config accessor.
Trait Implementations§
Source§impl Clone for MemoryService
impl Clone for MemoryService
Source§fn clone(&self) -> MemoryService
fn clone(&self) -> MemoryService
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl !RefUnwindSafe for MemoryService
impl !UnwindSafe for MemoryService
impl Freeze for MemoryService
impl Send for MemoryService
impl Sync for MemoryService
impl Unpin for MemoryService
impl UnsafeUnpin for MemoryService
Blanket Implementations§
§impl<U> As for U
impl<U> As for U
§fn as_<T>(self) -> Twhere
T: CastFrom<U>,
U: Sized,
fn as_<T>(self) -> Twhere
T: CastFrom<U>,
U: Sized,
self to type T. The semantics of numeric casting with the as operator are followed, so <T as As>::as_::<U> can be used in the same way as T as U for numeric conversions. Read moreimpl<T> AsyncFriendly for T
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<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Conv for T
impl<T> Conv for T
impl<T> ErasedDestructor for Twhere
T: 'static,
§impl<T> FmtForward for T
impl<T> FmtForward for T
§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.§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.§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.§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.§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.§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.§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.§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.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§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§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request§impl<L> LayerExt<L> for L
impl<L> LayerExt<L> for L
§fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
Layered].impl<T> MaybeSend for Twhere
T: Send,
impl<T> MaybeSend for Twhere
T: Send,
§impl<T> Message for T
impl<T> Message for T
§fn from_boxed(m: BoxedMessage) -> Result<Self, BoxedDowncastErr>
fn from_boxed(m: BoxedMessage) -> Result<Self, BoxedDowncastErr>
§fn box_message(self, pid: &ActorId) -> Result<BoxedMessage, BoxedDowncastErr>
fn box_message(self, pid: &ActorId) -> Result<BoxedMessage, BoxedDowncastErr>
impl<T> OutputMessage for Twhere
T: Message + Clone,
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§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 more§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 more§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
§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
§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.§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.§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.§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> Pointee for T
impl<T> Pointee for T
§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
§impl<F, T, S> SimdInto<T, S> for Fwhere
T: SimdFrom<F, S>,
S: Simd,
impl<F, T, S> SimdInto<T, S> for Fwhere
T: SimdFrom<F, S>,
S: Simd,
impl<T> State for T
§impl<T> Tap for T
impl<T> Tap for T
§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 more§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 more§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 more§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 more§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 more§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 more§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.§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.§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.§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.§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.§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.§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.