This commit is contained in:
leach 2025-08-24 23:01:35 -04:00
parent 18864201d4
commit 1a8b4f1fff
4 changed files with 43 additions and 7 deletions

View File

@ -372,6 +372,21 @@ impl ChatCLI {
} }
} }
} }
SessionAction::SetAsDefault(session_name) => {
let mut config = crate::config::Config::load().unwrap_or_default();
match config.set_default_session(session_name.clone()) {
Ok(()) => {
self.display.print_command_result(&format!(
"Session '{}' is now the default session",
session_name
));
}
Err(e) => {
self.display.print_error(&format!("Failed to set default session: {}", e));
}
}
// Continue to show session list
}
SessionAction::Cancel => { SessionAction::Cancel => {
return Ok(()); return Ok(());
} }

View File

@ -4,6 +4,10 @@ use std::env;
use std::fs; use std::fs;
use std::path::PathBuf; use std::path::PathBuf;
fn default_session_name() -> String {
"default".to_string()
}
#[derive(Debug, Clone, Serialize, Deserialize)] #[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Config { pub struct Config {
pub api: ApiConfig, pub api: ApiConfig,
@ -27,6 +31,8 @@ pub struct DefaultsConfig {
pub reasoning_effort: String, pub reasoning_effort: String,
pub enable_web_search: bool, pub enable_web_search: bool,
pub enable_reasoning_summary: bool, pub enable_reasoning_summary: bool,
#[serde(default = "default_session_name")]
pub default_session: String,
} }
#[derive(Debug, Clone, Serialize, Deserialize)] #[derive(Debug, Clone, Serialize, Deserialize)]
@ -72,6 +78,7 @@ impl Default for DefaultsConfig {
reasoning_effort: "medium".to_string(), reasoning_effort: "medium".to_string(),
enable_web_search: true, enable_web_search: true,
enable_reasoning_summary: false, enable_reasoning_summary: false,
default_session: "default".to_string(),
} }
} }
} }
@ -232,4 +239,9 @@ impl Config {
println!(" Request timeout: {}s", self.api.request_timeout_seconds); println!(" Request timeout: {}s", self.api.request_timeout_seconds);
println!(" Max conversation history: {}", self.limits.max_conversation_history); println!(" Max conversation history: {}", self.limits.max_conversation_history);
} }
pub fn set_default_session(&mut self, session_name: String) -> Result<()> {
self.defaults.default_session = session_name;
self.save()
}
} }

View File

@ -16,8 +16,8 @@ use crate::utils::Display;
#[command(about = "A lightweight command-line interface for chatting with AI models")] #[command(about = "A lightweight command-line interface for chatting with AI models")]
#[command(version)] #[command(version)]
struct Args { struct Args {
#[arg(short, long, default_value = "default", help = "Session name")] #[arg(short, long, help = "Session name (defaults to configured default session)")]
session: String, session: Option<String>,
#[arg(short, long, help = "Model name to use (overrides saved value)")] #[arg(short, long, help = "Model name to use (overrides saved value)")]
model: Option<String>, model: Option<String>,
@ -44,7 +44,10 @@ async fn main() -> Result<()> {
let env_vars = Config::validate_env_variables().context("Environment validation failed")?; let env_vars = Config::validate_env_variables().context("Environment validation failed")?;
// Load or create session // Load or create session
let session = match Session::load(&args.session) { // Use configured default session if none specified
let session_name = args.session.unwrap_or_else(|| config.defaults.default_session.clone());
let session = match Session::load(&session_name) {
Ok(mut session) => { Ok(mut session) => {
if let Some(model) = args.model { if let Some(model) = args.model {
if !is_model_supported(&model) { if !is_model_supported(&model) {
@ -69,9 +72,9 @@ async fn main() -> Result<()> {
"Model '{}' is not supported. Falling back to '{}'", "Model '{}' is not supported. Falling back to '{}'",
default_model, config.defaults.model default_model, config.defaults.model
)); ));
Session::new(args.session, config.defaults.model.clone()) Session::new(session_name.clone(), config.defaults.model.clone())
} else { } else {
Session::new(args.session, default_model) Session::new(session_name, default_model)
} }
} }
}; };

View File

@ -184,7 +184,7 @@ impl InputHandler {
// If it's the current session, show options // If it's the current session, show options
if Some(selected_session.to_string().as_str()) == current_session { if Some(selected_session.to_string().as_str()) == current_session {
let options = vec!["Delete this session", "Cancel"]; let options = vec!["Delete this session", "Set as default session", "Cancel"];
let action_result = match Select::with_theme(&theme) let action_result = match Select::with_theme(&theme)
.with_prompt("This is your current session. What would you like to do?") .with_prompt("This is your current session. What would you like to do?")
.items(&options) .items(&options)
@ -197,11 +197,14 @@ impl InputHandler {
match action_result { match action_result {
Some(0) => { Some(0) => {
if self.confirm(&format!("Delete current session '{}'? You will need to create or switch to another session after deletion.", selected_session.to_string()))? { if self.confirm(&format!("Delete current session '{}'? You will need to create or switch to another sessions after deletion.", selected_session.to_string()))? {
return Ok(SessionAction::Delete(selected_session)); return Ok(SessionAction::Delete(selected_session));
} }
return Ok(SessionAction::Cancel); return Ok(SessionAction::Cancel);
} }
Some(1) => {
return Ok(SessionAction::SetAsDefault(selected_session));
}
_ => return Ok(SessionAction::Cancel), _ => return Ok(SessionAction::Cancel),
} }
} else { } else {
@ -209,6 +212,7 @@ impl InputHandler {
let options = vec![ let options = vec![
format!("Switch to '{}'", selected_session.to_string()), format!("Switch to '{}'", selected_session.to_string()),
format!("Delete '{}'", selected_session.to_string()), format!("Delete '{}'", selected_session.to_string()),
format!("Set '{}' as default session", selected_session.to_string()),
"Cancel".to_string() "Cancel".to_string()
]; ];
@ -230,6 +234,7 @@ impl InputHandler {
} }
return Ok(SessionAction::Cancel); return Ok(SessionAction::Cancel);
} }
Some(2) => return Ok(SessionAction::SetAsDefault(selected_session)),
_ => return Ok(SessionAction::Cancel), _ => return Ok(SessionAction::Cancel),
} }
} }
@ -243,6 +248,7 @@ impl InputHandler {
pub enum SessionAction<T> { pub enum SessionAction<T> {
Switch(T), Switch(T),
Delete(T), Delete(T),
SetAsDefault(T),
Cancel, Cancel,
} }