diff --git a/crates/q_cli/src/cli/mod.rs b/crates/q_cli/src/cli/mod.rs index 1ba0fe5bb..4beaf87ac 100644 --- a/crates/q_cli/src/cli/mod.rs +++ b/crates/q_cli/src/cli/mod.rs @@ -20,7 +20,6 @@ mod translate; mod uninstall; mod update; mod user; - use std::io::{ Write as _, stdout, @@ -87,7 +86,7 @@ use crate::util::desktop::{ }; use crate::util::{ CliContext, - assert_logged_in, + is_logged_in_check, }; #[derive(Debug, Clone, Copy, Default, PartialEq, Eq, ValueEnum)] @@ -397,8 +396,20 @@ impl Cli { } pub async fn execute_chat(subcmd: &str, args: Option>, enforce_login: bool) -> Result { - if enforce_login { - assert_logged_in().await?; + if enforce_login && !is_logged_in_check().await { + if subcmd == "chat" { + let options = ["Yes", "No"]; + match crate::util::choose(" You are not logged in. Login now?", &options)? { + Some(0) => {}, + _ => bail!("Login is required to use chat"), + } + crate::cli::user::login_interactive(Default::default()).await?; + } else { + bail!( + "You are not logged in, please log in with {}", + format!("{CLI_BINARY_NAME} login",).bold() + ); + } } // Save credentials from the macOS keychain to sqlite. diff --git a/crates/q_cli/src/util/mod.rs b/crates/q_cli/src/util/mod.rs index 6156303ea..3c1ba5dac 100644 --- a/crates/q_cli/src/util/mod.rs +++ b/crates/q_cli/src/util/mod.rs @@ -290,8 +290,12 @@ pub fn dialoguer_theme() -> ColorfulTheme { } } +pub async fn is_logged_in_check() -> bool { + std::env::var("AMAZON_Q_SIGV4").is_ok_and(|v| !v.is_empty()) || fig_auth::is_logged_in().await +} + pub async fn assert_logged_in() -> Result<(), Error> { - if !(std::env::var("AMAZON_Q_SIGV4").is_ok_and(|v| !v.is_empty()) || fig_auth::is_logged_in().await) { + if !is_logged_in_check().await { bail!( "You are not logged in, please log in with {}", format!("{CLI_BINARY_NAME} login",).bold()