pub struct MemoryIndex { /* private fields */ }Expand description
A budgeted, frozen INDEX of memory the model can navigate (#319).
Instead of freezing every NOTE body verbatim into the system prompt (what
NoteStore::system_prompt_block does today), this provider surfaces a
SMALL index — note ids + first-line titles — capped at
MEMORY_INDEX_BUDGET items. The bodies are pulled on demand via the
memory_fetch tool (note:<id>). This is use_skill’s index-then-fetch
shape applied to memory.
Additive and opt-in. It is registered only under
[memory] disclosure = "index" (default frozen), so with the default
config it is never constructed and behavior is bit-for-bit unchanged. Like
NoteStore and SoulProvider it is system-prompt-only —
build_messages returns Vec::new() so it never competes for the
“first non-empty build_messages” slot in MemoryManager::build_messages.
The index is frozen at session start (KV-cache-safe). Notes created
mid-session don’t appear until next session — the same accepted limitation
NoteStore’s frozen snapshot has today; memory_fetch by a known id still
works mid-session even when the index hasn’t refreshed (the index is a
convenience surface, the fetch is the capability — design §8.7).
Past-turn keywords are deliberately NOT duplicated here: that is exactly
what recall provides (snippet search over the store). The index points at
recall for that axis rather than competing with it (design §3.1/§8.5).
Implementations§
Source§impl MemoryIndex
impl MemoryIndex
Sourcepub fn new(notes_path: impl Into<PathBuf>) -> Self
pub fn new(notes_path: impl Into<PathBuf>) -> Self
Build an index over the NOTES file at notes_path (the same file
NoteStore reads). The bodies are fetched via memory_fetch; this
provider only ever surfaces ids + titles.
Sourcepub fn default_path() -> Self
pub fn default_path() -> Self
Construct over the default NOTES location (~/.newt/NOTES.md), mirroring
NoteStore::default_path.
Trait Implementations§
Source§impl MemoryProvider for MemoryIndex
impl MemoryProvider for MemoryIndex
Source§fn initialize<'life0, 'life1, 'async_trait>(
&'life0 mut self,
ctx: &'life1 SessionContext,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn initialize<'life0, 'life1, 'async_trait>(
&'life0 mut self,
ctx: &'life1 SessionContext,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn system_prompt_block(&self) -> Option<String>
fn system_prompt_block(&self) -> Option<String>
Source§fn build_messages(
&self,
_system_prompt: &str,
_new_task: &str,
) -> Vec<MemMessage>
fn build_messages( &self, _system_prompt: &str, _new_task: &str, ) -> Vec<MemMessage>
Source§fn sync_turn<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 mut self,
_user: &'life1 str,
_assistant: &'life2 str,
_metrics: &'life3 TurnMetrics,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
fn sync_turn<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 mut self,
_user: &'life1 str,
_assistant: &'life2 str,
_metrics: &'life3 TurnMetrics,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
Source§fn prefetch<'life0, 'life1, 'async_trait>(
&'life0 self,
_query: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<String>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn prefetch<'life0, 'life1, 'async_trait>(
&'life0 self,
_query: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<String>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn reset(&mut self)
fn reset(&mut self)
Source§fn restore_turns(&mut self, _turns: &[ConversationTurn])
fn restore_turns(&mut self, _turns: &[ConversationTurn])
Source§fn take_compaction_record(&mut self) -> Option<String>
fn take_compaction_record(&mut self) -> Option<String>
user = the marked message, assistant = empty, token
columns NULL — it is not a backend-measured turn) so a later restore
can rehydrate the same working-set shape via Self::restore_turns.
Default: None — providers that never compress mint nothing.Source§fn on_pre_compress<'life0, 'life1, 'async_trait>(
&'life0 self,
_messages: &'life1 [MemMessage],
) -> Pin<Box<dyn Future<Output = String> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn on_pre_compress<'life0, 'life1, 'async_trait>(
&'life0 self,
_messages: &'life1 [MemMessage],
) -> Pin<Box<dyn Future<Output = String> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
messages; return it as a string
to include in the compression summary. Return empty string for nothing.Source§fn on_session_end<'life0, 'life1, 'async_trait>(
&'life0 mut self,
_messages: &'life1 [MemMessage],
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn on_session_end<'life0, 'life1, 'async_trait>(
&'life0 mut self,
_messages: &'life1 [MemMessage],
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn usage(&self) -> Option<(String, usize, usize)>
fn usage(&self) -> Option<(String, usize, usize)>
/memory command).
Returns (label, current, max) — e.g. ("turns", 12, 20).Source§fn replace_note(&mut self, _old_substring: &str, _new_text: &str) -> Result<()>
fn replace_note(&mut self, _old_substring: &str, _new_text: &str) -> Result<()>
old_substring with
new_text (Step 19.3 — the save_note tool’s replace action).
Default: NotesUnsupported, same routing contract as add_note.Source§fn remove_note(&mut self, _substring: &str) -> Result<()>
fn remove_note(&mut self, _substring: &str) -> Result<()>
substring (Step 19.3 —
the save_note tool’s remove action).
Default: NotesUnsupported, same routing contract as add_note.Auto Trait Implementations§
impl Freeze for MemoryIndex
impl RefUnwindSafe for MemoryIndex
impl Send for MemoryIndex
impl Sync for MemoryIndex
impl Unpin for MemoryIndex
impl UnsafeUnpin for MemoryIndex
impl UnwindSafe for MemoryIndex
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
impl<T> ErasedDestructor for Twhere
T: 'static,
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