split out src/mind
This commit is contained in:
parent
ce04568454
commit
79e384f005
21 changed files with 1865 additions and 2175 deletions
|
|
@ -154,3 +154,81 @@ pub fn channel() -> (UiSender, UiReceiver) {
|
|||
let (observe_tx, _) = broadcast::channel(1024);
|
||||
(UiSender { tui: tui_tx, observe: observe_tx }, tui_rx)
|
||||
}
|
||||
|
||||
/// Replay a restored session into the TUI panes so the user can see
|
||||
/// conversation history immediately on restart. Shows user input,
|
||||
/// assistant responses, and brief tool call summaries. Skips the system
|
||||
/// prompt, context message, DMN plumbing, and image injection messages.
|
||||
pub fn replay_session_to_ui(entries: &[crate::agent::context::ConversationEntry], ui_tx: &UiSender) {
|
||||
use crate::agent::api::types::Role;
|
||||
|
||||
crate::dbglog!("[replay] replaying {} entries to UI", entries.len());
|
||||
for (i, e) in entries.iter().enumerate() {
|
||||
let m = e.message();
|
||||
let preview: String = m.content_text().chars().take(60).collect();
|
||||
crate::dbglog!("[replay] [{}] {:?} mem={} tc={} tcid={:?} {:?}",
|
||||
i, m.role, e.is_memory(), m.tool_calls.as_ref().map_or(0, |t| t.len()),
|
||||
m.tool_call_id.as_deref(), preview);
|
||||
}
|
||||
|
||||
let mut seen_first_user = false;
|
||||
let mut target = StreamTarget::Conversation;
|
||||
|
||||
for entry in entries {
|
||||
if entry.is_memory() { continue; }
|
||||
let msg = entry.message();
|
||||
match msg.role {
|
||||
Role::System => {}
|
||||
Role::User => {
|
||||
if !seen_first_user {
|
||||
seen_first_user = true;
|
||||
continue;
|
||||
}
|
||||
let text = msg.content_text();
|
||||
if text.starts_with("Your context was just compacted")
|
||||
|| text.starts_with("Your context was just rebuilt")
|
||||
|| text.starts_with("[Earlier in this conversation")
|
||||
|| text.starts_with("Here is the image")
|
||||
|| text.contains("[image aged out")
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if text.starts_with("[dmn]") {
|
||||
target = StreamTarget::Autonomous;
|
||||
let first_line = text.lines().next().unwrap_or("[dmn]");
|
||||
let _ = ui_tx.send(UiMessage::DmnAnnotation(first_line.to_string()));
|
||||
} else {
|
||||
target = StreamTarget::Conversation;
|
||||
let _ = ui_tx.send(UiMessage::UserInput(text.to_string()));
|
||||
}
|
||||
}
|
||||
Role::Assistant => {
|
||||
if let Some(ref calls) = msg.tool_calls {
|
||||
for call in calls {
|
||||
let _ = ui_tx.send(UiMessage::ToolCall {
|
||||
name: call.function.name.clone(),
|
||||
args_summary: String::new(),
|
||||
});
|
||||
}
|
||||
}
|
||||
let text = msg.content_text();
|
||||
if !text.is_empty() {
|
||||
let _ = ui_tx.send(UiMessage::TextDelta(format!("{}\n", text), target));
|
||||
}
|
||||
}
|
||||
Role::Tool => {
|
||||
let text = msg.content_text();
|
||||
let preview: String = text.lines().take(3).collect::<Vec<_>>().join("\n");
|
||||
let truncated = if text.lines().count() > 3 {
|
||||
format!("{}...", preview)
|
||||
} else {
|
||||
preview
|
||||
};
|
||||
let _ = ui_tx.send(UiMessage::ToolResult {
|
||||
name: String::new(),
|
||||
result: truncated,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue