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        steer_workspace::WorkspaceConfig::Container { .. } => Err(WorkspaceError::NotSupported(
28            "Container workspaces are not yet supported.".to_string(),
29        )
30        .into()),
31    }
32}
33
34/// Create a workspace from the current session configuration
35/// This is a compatibility wrapper for steer-core usage
36pub async fn create_workspace_from_session_config(
37    config: &crate::session::state::WorkspaceConfig,
38) -> Result<Arc<dyn Workspace>> {
39    use steer_workspace::WorkspaceConfig as WsConfig;
40
41    let ws_config = match config {
42        crate::session::state::WorkspaceConfig::Local { path } => {
43            WsConfig::Local { path: path.clone() }
44        }
45        crate::session::state::WorkspaceConfig::Remote {
46            agent_address,
47            auth,
48        } => {
49            let ws_auth = auth.as_ref().map(|a| match a {
50                crate::session::state::RemoteAuth::Bearer { token } => {
51                    steer_workspace::RemoteAuth::BearerToken(token.clone())
52                }
53                crate::session::state::RemoteAuth::ApiKey { key } => {
54                    steer_workspace::RemoteAuth::ApiKey(key.clone())
55                }
56            });
57            WsConfig::Remote {
58                address: agent_address.clone(),
59                auth: ws_auth,
60            }
61        }
62        crate::session::state::WorkspaceConfig::Container { .. } => {
63            return Err(WorkspaceError::NotSupported(
64                "Container workspaces are not yet supported.".to_string(),
65            )
66            .into());
67        }
68    };
69
70    create_workspace(&ws_config)
71        .await
72        .map_err(|e| WorkspaceError::NotSupported(e.to_string()).into())
73}