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
9pub 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
34pub 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}