steer_core/
workspace.rs

1use steer_workspace::WorkspaceError;
2pub use steer_workspace::{
3    EnvironmentInfo, RemoteAuth, Workspace, WorkspaceConfig, WorkspaceMetadata, WorkspaceType,
4};
5
6use crate::error::Result;
7use std::sync::Arc;
8
9/// Create a workspace from configuration
10pub async fn create_workspace(
11    config: &steer_workspace::WorkspaceConfig,
12) -> Result<Arc<dyn Workspace>> {
13    match config {
14        steer_workspace::WorkspaceConfig::Local { path } => {
15            let workspace = steer_workspace::local::LocalWorkspace::with_path(path.clone())
16                .await
17                .map_err(|e| WorkspaceError::NotSupported(e.to_string()))?;
18            Ok(Arc::new(workspace))
19        }
20        steer_workspace::WorkspaceConfig::Remote { address, auth } => {
21            let workspace =
22                steer_workspace_client::RemoteWorkspace::new(address.clone(), auth.clone())
23                    .await
24                    .map_err(|e| WorkspaceError::NotSupported(e.to_string()))?;
25            Ok(Arc::new(workspace))
26        }
27    }
28}
29
30/// Create a workspace from the current session configuration
31/// This is a compatibility wrapper for steer-core usage
32pub async fn create_workspace_from_session_config(
33    config: &crate::session::state::WorkspaceConfig,
34) -> Result<Arc<dyn Workspace>> {
35    use steer_workspace::WorkspaceConfig as WsConfig;
36
37    let ws_config = match config {
38        crate::session::state::WorkspaceConfig::Local { path } => {
39            WsConfig::Local { path: path.clone() }
40        }
41        crate::session::state::WorkspaceConfig::Remote {
42            agent_address,
43            auth,
44        } => {
45            let ws_auth = auth.as_ref().map(|a| match a {
46                crate::session::state::RemoteAuth::Bearer { token } => {
47                    steer_workspace::RemoteAuth::BearerToken(token.clone())
48                }
49                crate::session::state::RemoteAuth::ApiKey { key } => {
50                    steer_workspace::RemoteAuth::ApiKey(key.clone())
51                }
52            });
53            WsConfig::Remote {
54                address: agent_address.clone(),
55                auth: ws_auth,
56            }
57        }
58    };
59
60    create_workspace(&ws_config)
61        .await
62        .map_err(|e| WorkspaceError::NotSupported(e.to_string()).into())
63}