matrixcode_core/command/handlers/
sessions.rs1use super::super::command_trait::Command;
6use super::super::backend_context::BackendContext;
7
8pub struct Sessions;
16
17impl Command for Sessions {
18 fn name(&self) -> &'static str {
19 "sessions"
20 }
21
22 fn aliases(&self) -> &[&'static str] {
23 &["resume"]
24 }
25
26 fn help(&self) -> Option<&'static str> {
27 Some("列出和管理会话。用法: /sessions [cleanup|stats]")
28 }
29
30 fn execute<'a>(&'a self, ctx: &'a mut BackendContext<'_>)
31 -> std::pin::Pin<Box<dyn std::future::Future<Output = bool> + Send + 'a>>
32 {
33 Box::pin(async move {
34 const SESSION_CLEANUP_DAYS: u64 = 30;
35 const DISPLAY_SESSIONS_LIMIT: usize = 20;
36
37 let subcmd = if ctx.message.starts_with("/sessions ") {
38 ctx.message.strip_prefix("/sessions ").unwrap_or("")
39 } else {
40 ""
41 };
42
43 if let Some(mgr) = ctx.session_mgr {
44 if subcmd == "cleanup" {
45 let removed = mgr.cleanup_old_sessions(SESSION_CLEANUP_DAYS).unwrap_or(0);
46 let _ = ctx.event_tx.send(crate::AgentEvent::progress(
47 format!("✓ Removed {} old sessions", removed), None
48 )).await;
49 } else if subcmd == "stats" {
50 let sessions = mgr.list_sessions();
51 let _ = ctx.event_tx.send(crate::AgentEvent::progress(
52 format!("📊 {} sessions total", sessions.len()), None
53 )).await;
54 } else {
55 let sessions = mgr.list_sessions();
56 if sessions.is_empty() {
57 let _ = ctx.event_tx.send(crate::AgentEvent::progress(
58 "No saved sessions", None
59 )).await;
60 } else {
61 let mut info = format!("📚 Sessions ({}):\n", sessions.len());
62 for session in sessions.iter().take(DISPLAY_SESSIONS_LIMIT) {
63 info.push_str(&format!("• {} - {} msgs\n", session.short_id(), session.message_count));
64 }
65 let _ = ctx.event_tx.send(crate::AgentEvent::progress(info, None)).await;
66 }
67 }
68 } else {
69 let _ = ctx.event_tx.send(crate::AgentEvent::progress(
70 "❌ Session manager not available", None
71 )).await;
72 }
73
74 false })
76 }
77}