Skip to main content

matrixcode_core/command/handlers/
sessions.rs

1//! /sessions 命令实现
2//!
3//! 列出和管理会话。
4
5use super::super::command_trait::Command;
6use super::super::backend_context::BackendContext;
7
8/// Sessions 命令
9///
10/// 用法:
11/// - /sessions - 列出所有会话
12/// - /sessions cleanup - 清理旧会话
13/// - /sessions stats - 显示会话统计
14/// - /resume - 别名,列出会话
15pub 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 // 不转发给 agent
75        })
76    }
77}