From 5c558027facfaf78635d6ec9b401e5a9f0f1c8bb Mon Sep 17 00:00:00 2001 From: xiaoxixi Date: Wed, 29 Apr 2026 22:57:59 +0800 Subject: [PATCH] =?UTF-8?q?feat(session):=20=E6=B7=BB=E5=8A=A0=20/=3F=20?= =?UTF-8?q?=E5=B8=AE=E5=8A=A9=E5=91=BD=E4=BB=A4=EF=BC=8C=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E5=91=BD=E4=BB=A4=E6=98=BE=E7=A4=BA=E5=8F=8B=E5=A5=BD=E6=8F=90?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 /? 和 /help 命令显示所有可用斜杠命令 - 未知命令不再报错,而是提示"未知命令:/xxx。输入 /? 获取帮助。" - execute_slash_command 错误现在返回友好提示而非传播为服务器错误 --- src/channels/slash_command.rs | 4 ++++ src/session/session.rs | 26 ++++++++++++++++++++++---- 2 files changed, 26 insertions(+), 4 deletions(-) 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