From e787203e942c309e17aef5d8b0824e443b86c3f6 Mon Sep 17 00:00:00 2001 From: xiaoxixi Date: Tue, 28 Apr 2026 21:06:25 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=A3=9E=E4=B9=A6=E6=B8=A0?= =?UTF-8?q?=E9=81=93=E4=BC=9A=E8=AF=9D=E5=88=9B=E5=BB=BA=E6=97=B6=E6=9C=BA?= =?UTF-8?q?=EF=BC=9A=E6=89=A7=E8=A1=8C=E6=96=9C=E6=9D=A0=E5=91=BD=E4=BB=A4?= =?UTF-8?q?=E5=89=8D=E5=85=88=E7=A1=AE=E4=BF=9D=E4=BC=9A=E8=AF=9D=E5=AD=98?= =?UTF-8?q?=E5=9C=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在 Feishu 收到斜杠命令时,先通过 CreateDialog 创建会话, 再执行实际的命令。这样 /dump 等命令就能正确获取对话历史。 --- src/channels/feishu.rs | 24 ++++++++++++++++++++++-- src/session/session.rs | 42 ++++++++++++++++++------------------------ 2 files changed, 40 insertions(+), 26 deletions(-) diff --git a/src/channels/feishu.rs b/src/channels/feishu.rs index 2dba571..3af9e44 100644 --- a/src/channels/feishu.rs +++ b/src/channels/feishu.rs @@ -2017,16 +2017,36 @@ impl Channel for FeishuChannel { // Check for slash command if let Some((cmd_name, cmd_args)) = parse_slash_command(&msg.content) { tracing::info!(cmd = %cmd_name, "Feishu slash command detected"); + + // For slash commands, we need to ensure a session exists first + // Get or create session via control plane let (reply_tx, mut reply_rx) = mpsc::channel(1); + bus.publish_control(crate::bus::ControlMessage { + op: SessionCommand::CreateDialog { + channel: msg.channel.clone(), + chat_id: msg.chat_id.clone(), + title: None, + }, + reply_tx, + }).await?; + + // Wait for session creation + let session_id = match reply_rx.recv().await { + Some(Ok(SessionEvent::DialogCreated { session_id, .. })) => Some(session_id), + _ => None, + }; + + // Now execute the slash command with the session + let (cmd_reply_tx, mut cmd_reply_rx) = mpsc::channel(1); bus.publish_control(crate::bus::ControlMessage { op: SessionCommand::ExecuteSlashCommand { command: cmd_name.to_string(), args: if cmd_args.is_empty() { None } else { Some(cmd_args.to_string()) }, channel: msg.channel.clone(), chat_id: msg.chat_id.clone(), - current_session_id: None, + current_session_id: session_id, }, - reply_tx, + reply_tx: cmd_reply_tx, }).await?; // Handle response diff --git a/src/session/session.rs b/src/session/session.rs index 9d5b3a1..be3a403 100644 --- a/src/session/session.rs +++ b/src/session/session.rs @@ -370,34 +370,28 @@ impl SessionManager { } } "info" => { - let sid = if let Some(s) = current_session_id { - s.clone() + if let Some(sid) = current_session_id { + let session = self.get_or_create_session(sid).await?; + let session_guard = session.lock().await; + let message_count = session_guard.get_history().len(); + let session_id_str = session_guard.session_id(); + Ok((None, format!( + "Session ID: {}\nMessage count: {}", + session_id_str, message_count + ))) } else { - // Create a new session if none exists (e.g., Feishu first message) - let (new_id, _) = self.create_session(channel, chat_id, None).await?; - new_id - }; - let session = self.get_or_create_session(&sid).await?; - let session_guard = session.lock().await; - let message_count = session_guard.get_history().len(); - let session_id_str = session_guard.session_id(); - Ok((None, format!( - "Session ID: {}\nMessage count: {}", - session_id_str, message_count - ))) + Ok((None, "No active session.".to_string())) + } } "dump" => { - let sid = if let Some(s) = current_session_id { - s.clone() + if let Some(sid) = current_session_id { + let session = self.get_or_create_session(sid).await?; + let session_guard = session.lock().await; + let md = session_guard.dump_as_markdown(); + Ok((None, md)) } else { - // Create a new session if none exists (e.g., Feishu first message) - let (new_id, _) = self.create_session(channel, chat_id, None).await?; - new_id - }; - let session = self.get_or_create_session(&sid).await?; - let session_guard = session.lock().await; - let md = session_guard.dump_as_markdown(); - Ok((None, md)) + Ok((None, "No active session.".to_string())) + } } _ => Err(AgentError::Other(format!("Command not implemented: {}", cmd.name))), }