steer_core/
workspace.rs

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