pub struct SoulProvider {
pub source: SoulSource,
/* private fields */
}Expand description
Loads an agent identity from a Markdown soul file and injects it as a frozen system-prompt block.
Resolution order (first non-empty file wins):
- Explicit path in
[memory] soul_file = "..."config .newt/soul.mdin the current workspace~/.newt/soul.md(global user soul)- Built-in default identity
The soul is read once at initialize() and frozen — mid-session
writes don’t rebuild the system prompt (preserves the KV/prefix cache).
Fields§
§source: SoulSourceResolved path of the soul that was actually loaded (for display).
Implementations§
Source§impl SoulProvider
impl SoulProvider
Trait Implementations§
Source§impl MemoryProvider for SoulProvider
impl MemoryProvider for SoulProvider
Source§fn system_prompt_block(&self) -> Option<String>
fn system_prompt_block(&self) -> Option<String>
Return the frozen soul as the system prompt base.
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,
One-time setup at session start (load files, warm caches, etc.).
Default: no-op.
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>
Build the full message list (including history) to send to the model. Read more
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,
Persist a completed turn. Read more
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,
Recall relevant context to prepend to the user turn before the API
call. Should be fast — use cached results, don’t block.
Return empty string to contribute nothing.
Source§fn reset(&mut self)
fn reset(&mut self)
Clear conversation-local history while preserving provider configuration
and system-prompt state. Used when the TUI starts a fresh conversation
inside the same running process.
Source§fn restore_turns(&mut self, _turns: &[ConversationTurn])
fn restore_turns(&mut self, _turns: &[ConversationTurn])
Replace conversation-local history with durable restored turns. Read more
Source§fn take_compaction_record(&mut self) -> Option<String>
fn take_compaction_record(&mut self) -> Option<String>
Take (and clear) the compaction record minted since the last call —
the full marked summary message a compressing provider inserted into
its working set (Step 18.5, #247). The caller persists it as a turn
record (
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,
Called before old messages are discarded (e.g. during compression).
Extract anything worth keeping from
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,
Called once when the session ends. Use for final extraction / cleanup.
Source§fn usage(&self) -> Option<(String, usize, usize)>
fn usage(&self) -> Option<(String, usize, usize)>
Report current usage for display (e.g.
/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<()>
Replace the single persisted note containing
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<()>
Remove the single persisted note containing
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 SoulProvider
impl RefUnwindSafe for SoulProvider
impl Send for SoulProvider
impl Sync for SoulProvider
impl Unpin for SoulProvider
impl UnsafeUnpin for SoulProvider
impl UnwindSafe for SoulProvider
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
Mutably borrows from an owned value. Read more
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>
Converts
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>
Converts
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