Skip to main content

steer_cli/commands/session/
create.rs

1use async_trait::async_trait;
2use eyre::{Result, eyre};
3
4use super::super::Command;
5use crate::session_config::{SessionConfigLoader, SessionConfigOverrides};
6use steer_core::api::Model;
7use steer_core::app::AppConfig;
8use steer_core::session::{SessionManager, SessionManagerConfig};
9use steer_core::utils::session::{create_session_store_with_config, resolve_session_store_config};
10
11pub struct CreateSessionCommand {
12    pub session_config: Option<std::path::PathBuf>,
13    pub metadata: Option<String>,
14    pub remote: Option<String>,
15    pub system_prompt: Option<String>,
16    pub session_db: Option<std::path::PathBuf>,
17}
18
19#[async_trait]
20impl Command for CreateSessionCommand {
21    async fn execute(&self) -> Result<()> {
22        // Create the loader with optional config path
23        let overrides = SessionConfigOverrides {
24            system_prompt: self.system_prompt.clone(),
25            metadata: self.metadata.clone(),
26        };
27
28        let loader =
29            SessionConfigLoader::new(self.session_config.clone()).with_overrides(overrides);
30
31        let session_config = loader.load().await?;
32
33        // If remote is specified, handle via gRPC
34        if let Some(remote_addr) = &self.remote {
35            println!("Creating remote session at {remote_addr}");
36
37            // TODO: The TUI functionality has been moved to steer-tui crate
38            // For now, just create the session without launching the TUI
39            return Err(eyre!(
40                "Remote session creation with TUI is not available in this command. Use the steer-tui binary instead."
41            ));
42        }
43
44        // Local session handling
45        let store_config = resolve_session_store_config(self.session_db.clone())?;
46        let session_store = create_session_store_with_config(store_config).await?;
47        let session_manager_config = SessionManagerConfig {
48            max_concurrent_sessions: 10,
49            default_model: Model::default(),
50            auto_persist: true,
51        };
52
53        let session_manager = SessionManager::new(session_store, session_manager_config);
54
55        let auth_storage = std::sync::Arc::new(
56            steer_core::auth::DefaultAuthStorage::new()
57                .map_err(|e| eyre!("Failed to create auth storage: {}", e))?,
58        );
59        let llm_config_provider = steer_core::config::LlmConfigProvider::new(auth_storage);
60        let app_config = AppConfig {
61            llm_config_provider,
62        };
63
64        let (session_id, _) = session_manager
65            .create_session(session_config, app_config)
66            .await
67            .map_err(|e| eyre!("Failed to create session: {}", e))?;
68
69        println!("Created session: {}", session_id);
70        Ok(())
71    }
72}