diff --git a/src/user/context.rs b/src/user/context.rs index f0ef3a8..cd61c92 100644 --- a/src/user/context.rs +++ b/src/user/context.rs @@ -24,10 +24,41 @@ impl ConsciousScreen { } fn read_context_sections(&self) -> Vec { - match self.agent.try_lock() { - Ok(ag) => ag.context_sections().iter().map(|s| (*s).clone()).collect(), - Err(_) => Vec::new(), + use crate::agent::context::{ContextSection, ContextEntry, ConversationEntry}; + use crate::agent::api::Message; + + let ag = match self.agent.try_lock() { + Ok(ag) => ag, + Err(_) => return Vec::new(), + }; + + let mut sections: Vec = ag.context_sections() + .iter().map(|s| (*s).clone()).collect(); + + // Build a synthetic "Memory nodes" section from conversation entries + let mut mem_section = ContextSection::new("Memory nodes"); + let mut scored = 0usize; + let mut unscored = 0usize; + for ce in ag.context.conversation.entries() { + if let ConversationEntry::Memory { key, score, .. } = &ce.entry { + let label = match score { + Some(s) => { scored += 1; format!("{} (score:{:.2})", key, s) } + None => { unscored += 1; key.clone() } + }; + mem_section.push(ContextEntry { + entry: ConversationEntry::Message(Message::user(&label)), + tokens: ce.tokens, + timestamp: ce.timestamp, + }); + } } + if !mem_section.is_empty() { + mem_section.name = format!("Memory nodes ({} scored, {} unscored)", + scored, unscored); + sections.insert(sections.len() - 1, mem_section); // before conversation + } + + sections } }