fixes
This commit is contained in:
100
src/cli.rs
100
src/cli.rs
@@ -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(())
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user