diff --git a/src/channels/slash_command.rs b/src/channels/slash_command.rs index 33942a7..7d2699a 100644 --- a/src/channels/slash_command.rs +++ b/src/channels/slash_command.rs @@ -28,6 +28,10 @@ mod tests { assert_eq!(parse_slash_command("/reset"), Some(("reset", ""))); assert_eq!(parse_slash_command("/reset arg"), Some(("reset", "arg"))); assert_eq!(parse_slash_command("/new hello world"), Some(("new", "hello world"))); + assert_eq!(parse_slash_command("/??"), Some(("??", ""))); + assert_eq!(parse_slash_command("/? arg"), Some(("?", "arg"))); + assert_eq!(parse_slash_command("/?"), Some(("?", ""))); + assert_eq!(parse_slash_command("/help"), Some(("help", ""))); assert_eq!(parse_slash_command("hello"), None); assert_eq!(parse_slash_command("/"), Some(("", ""))); } diff --git a/src/session/session.rs b/src/session/session.rs index c780398..9181fce 100644 --- a/src/session/session.rs +++ b/src/session/session.rs @@ -637,6 +637,11 @@ pub static SLASH_COMMANDS: &[SlashCommand] = &[ description: "保存当前对话为 markdown 文档", aliases: &["/dump"], }, + SlashCommand { + name: "?", + description: "显示帮助", + aliases: &["/?", "/help"], + }, ]; impl SessionManager { @@ -820,7 +825,13 @@ impl SessionManager { Ok((None, "No active session.".to_string())) } } - _ => Err(AgentError::Other(format!("Command not implemented: {}", cmd.name))), + "?" | "help" => { + let lines: Vec = SLASH_COMMANDS.iter().map(|c| { + format!(" {} - {}", c.aliases.join(", "), c.description) + }).collect(); + Ok((None, format!("可用命令:\n{}", lines.join("\n")))) + } + _ => Err(AgentError::Other(format!("未知命令:/{}。输入 /? 获取帮助。", cmd.name))), } } @@ -1092,15 +1103,22 @@ impl SessionManager { // Check for slash command if let Some((cmd_name, cmd_args)) = parse_slash_command(content) { - let (new_session_id, response) = self.execute_slash_command( + let result = self.execute_slash_command( cmd_name, if cmd_args.is_empty() { None } else { Some(cmd_args) }, channel, chat_id, Some(&unified_id), - ).await?; + ).await; - return Ok(HandleResult::CommandOutput(response)); + match result { + Ok((_new_session_id, response)) => { + return Ok(HandleResult::CommandOutput(response)); + } + Err(e) => { + return Ok(HandleResult::CommandOutput(e.to_string())); + } + } } // Normal message handling through LLM