This commit is contained in:
leach
2025-08-15 16:27:48 -04:00
parent 7d237f692c
commit 54a456581d
3 changed files with 274 additions and 8 deletions

View File

@@ -165,6 +165,15 @@ impl ChatCLI {
"/effort" => {
self.handle_effort_command(&parts)?;
}
"/stats" => {
self.show_session_stats()?;
}
"/optimize" => {
self.optimize_session()?;
}
"/cleanup" => {
self.cleanup_session()?;
}
_ => {
self.display.print_error(&format!("Unknown command: {} (see /help)", parts[0]));
}
@@ -226,7 +235,8 @@ impl ChatCLI {
}
fn list_sessions(&self) -> Result<()> {
let sessions = Session::list_sessions()?;
use crate::core::session::Session;
let sessions = Session::list_sessions_lazy(true)?;
if sessions.is_empty() {
self.display.print_info("No saved sessions");
@@ -234,10 +244,20 @@ impl ChatCLI {
}
self.display.print_info("Saved sessions:");
for (name, updated) in sessions {
let marker = if name == self.session.name { "" } else { " " };
let date_str = updated.format("%Y-%m-%d %H:%M:%S");
println!(" {} {} (updated: {})", marker, name, date_str);
for session_info in sessions {
let marker = if session_info.name == self.session.name { "" } else { " " };
let date_str = session_info.last_modified.format("%Y-%m-%d %H:%M:%S");
let model = session_info.model.as_deref().unwrap_or("unknown");
let msg_count = session_info.message_count.unwrap_or(0);
let file_size = session_info.file_size.unwrap_or(0);
let size_str = if file_size > 1024 {
format!("{:.1}KB", file_size as f64 / 1024.0)
} else {
format!("{}B", file_size)
};
println!(" {} {} ({}msgs, {}, {}, {})",
marker, session_info.name, msg_count, model, size_str, date_str);
}
Ok(())
@@ -429,4 +449,74 @@ impl ChatCLI {
Ok(())
}
fn show_session_stats(&self) -> Result<()> {
let stats = self.session.get_stats();
self.display.print_info("Session Statistics:");
println!(" Total messages: {}", stats.total_messages);
println!(" User messages: {}", stats.user_messages);
println!(" Assistant messages: {}", stats.assistant_messages);
println!(" Total characters: {}", stats.total_characters);
println!(" Average message length: {}", stats.average_message_length);
let memory_usage = std::mem::size_of_val(&self.session) +
self.session.messages.iter()
.map(|m| m.content.len() + m.role.len())
.sum::<usize>();
let memory_str = if memory_usage > 1024 * 1024 {
format!("{:.1} MB", memory_usage as f64 / (1024.0 * 1024.0))
} else if memory_usage > 1024 {
format!("{:.1} KB", memory_usage as f64 / 1024.0)
} else {
format!("{} bytes", memory_usage)
};
println!(" Estimated memory usage: {}", memory_str);
if self.session.needs_cleanup() {
self.display.print_warning("Session is large and may benefit from cleanup (/cleanup)");
}
Ok(())
}
fn optimize_session(&mut self) -> Result<()> {
let stats_before = self.session.get_stats();
self.session.optimize_for_memory();
self.session.save()?;
let stats_after = self.session.get_stats();
let chars_saved = stats_before.total_characters.saturating_sub(stats_after.total_characters);
self.display.print_command_result(&format!(
"Session optimized: {} characters cleaned up",
chars_saved
));
Ok(())
}
fn cleanup_session(&mut self) -> Result<()> {
let stats_before = self.session.get_stats();
if self.input.confirm("This will remove older messages to reduce memory usage. Continue?")? {
self.session.cleanup_for_memory();
self.session.save()?;
let stats_after = self.session.get_stats();
let messages_removed = stats_before.total_messages.saturating_sub(stats_after.total_messages);
self.display.print_command_result(&format!(
"Session cleaned up: {} messages removed, keeping most recent conversations",
messages_removed
));
} else {
self.display.print_info("Cleanup cancelled");
}
Ok(())
}
}