From a8732c63d68ff68c77966a9b8d1fdc291db9bb47 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Fri, 8 May 2026 12:15:01 -0600 Subject: [PATCH] fix: do not switch to agent if a session is active. --- src/config/request_context.rs | 82 +++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/src/config/request_context.rs b/src/config/request_context.rs index e4fa433..6e4102c 100644 --- a/src/config/request_context.rs +++ b/src/config/request_context.rs @@ -2131,6 +2131,12 @@ impl RequestContext { } }); + if self.session.is_some() { + bail!( + "Already in a session, please run '.exit session' first to exit the current session." + ); + } + let should_init_supervisor = agent.can_spawn_agents(); let max_concurrent = agent.max_concurrent_agents(); let max_depth = agent.max_agent_depth(); @@ -3435,4 +3441,80 @@ mod tests { create_dir_all(&rags_dir).unwrap(); assert!(paths::list_rags().is_empty()); } + + #[test] + #[serial] + fn use_agent_errors_when_already_in_session() { + let _guard = TestConfigDirGuard::new(); + let mut ctx = create_test_ctx(); + ctx.session = Some(Session::default()); + + let app = ctx.app.config.clone(); + let agent_name = format!( + "test_agent_{}", + SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_nanos() + ); + let agent_dir = paths::agent_data_dir(&agent_name); + create_dir_all(&agent_dir).unwrap(); + write( + agent_dir.join("config.yaml"), + format!("name: {agent_name}\ninstructions: hi\n"), + ) + .unwrap(); + + let abort = utils::create_abort_signal(); + let result = run_async(ctx.use_agent(&app, &agent_name, Some("test_session"), abort)); + assert!(result.is_err()); + assert!( + result + .unwrap_err() + .to_string() + .contains("Already in a session") + ); + assert!( + ctx.agent.is_none(), + "Agent should not be set when session check fails" + ); + } + + #[test] + #[serial] + fn use_agent_errors_when_already_in_session_even_without_session_name() { + let _guard = TestConfigDirGuard::new(); + let mut ctx = create_test_ctx(); + ctx.session = Some(Session::default()); + + let app = ctx.app.config.clone(); + let agent_name = format!( + "test_agent_{}", + SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_nanos() + ); + let agent_dir = paths::agent_data_dir(&agent_name); + create_dir_all(&agent_dir).unwrap(); + write( + agent_dir.join("config.yaml"), + format!("name: {agent_name}\ninstructions: hi\n"), + ) + .unwrap(); + + let abort = utils::create_abort_signal(); + let result = run_async(ctx.use_agent(&app, &agent_name, None, abort)); + assert!(result.is_err()); + assert!( + result + .unwrap_err() + .to_string() + .contains("Already in a session") + ); + assert!( + ctx.agent.is_none(), + "Agent should not be set when session check fails" + ); + } }