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 }
28}
29
30pub 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}