Skip to main content

steer_core/
workspace.rs

1use steer_workspace::WorkspaceError;
2pub use steer_workspace::{
3    CreateWorkspaceRequest, DeleteWorkspaceRequest, EnvironmentId, EnvironmentInfo,
4    ListWorkspacesRequest, LlmStatus, LocalWorkspaceManager, RemoteAuth, RepoId, RepoInfo,
5    RepoManager, RepoRef, VcsInfo, VcsKind, VcsStatus, Workspace, WorkspaceConfig,
6    WorkspaceCreateStrategy, WorkspaceId, WorkspaceInfo, WorkspaceManager, WorkspaceMetadata,
7    WorkspaceRef, WorkspaceStatus, WorkspaceType,
8};
9
10use crate::error::Result;
11use std::sync::Arc;
12
13/// Create a workspace from configuration
14pub async fn create_workspace(
15    config: &steer_workspace::WorkspaceConfig,
16) -> Result<Arc<dyn Workspace>> {
17    match config {
18        steer_workspace::WorkspaceConfig::Local { path } => {
19            let workspace = steer_workspace::local::LocalWorkspace::with_path(path.clone())
20                .await
21                .map_err(|e| WorkspaceError::NotSupported(e.to_string()))?;
22            Ok(Arc::new(workspace))
23        }
24        steer_workspace::WorkspaceConfig::Remote { address, auth } => {
25            let workspace =
26                steer_workspace_client::RemoteWorkspace::new(address.clone(), auth.clone())
27                    .await
28                    .map_err(|e| WorkspaceError::NotSupported(e.to_string()))?;
29            Ok(Arc::new(workspace))
30        }
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    };
63
64    create_workspace(&ws_config)
65        .await
66        .map_err(|e| WorkspaceError::NotSupported(e.to_string()).into())
67}