feat(session): 添加 /? 帮助命令,错误命令显示友好提示

- 新增 /? 和 /help 命令显示所有可用斜杠命令
- 未知命令不再报错,而是提示"未知命令:/xxx。输入 /? 获取帮助。"
- execute_slash_command 错误现在返回友好提示而非传播为服务器错误
This commit is contained in:
xiaoxixi 2026-04-29 22:57:59 +08:00
parent e1681e0424
commit 5c558027fa
2 changed files with 26 additions and 4 deletions

View File

@ -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(("", "")));
}

View File

@ -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<String> = 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