1use thiserror::Error;
2
3use crate::{
4 api::ApiError,
5 app::AgentExecutorError,
6 auth::AuthError,
7 session::{manager::SessionManagerError, store::SessionStoreError},
8};
9
10pub type Result<T> = std::result::Result<T, Error>;
11
12#[derive(Debug, Error)]
13pub enum Error {
14 #[error(transparent)]
15 Api(#[from] ApiError),
16 #[error(transparent)]
17 Auth(#[from] AuthError),
18 #[error(transparent)]
19 AgentExecutor(#[from] AgentExecutorError),
20 #[error(transparent)]
21 SessionManager(#[from] SessionManagerError),
22 #[error(transparent)]
23 SessionStore(#[from] SessionStoreError),
24 #[error(transparent)]
25 Workspace(#[from] WorkspaceError),
26 #[error(transparent)]
27 Tool(#[from] steer_tools::ToolError),
28 #[error("I/O error: {0}")]
29 Io(#[from] std::io::Error),
30 #[error("Configuration error: {0}")]
31 Configuration(String),
32 #[error("Invalid operation: {0}")]
33 InvalidOperation(String),
34 #[error("Not found: {0}")]
35 NotFound(String),
36 #[error("Cancelled")]
37 Cancelled,
38 #[error("Ignore error: {0}")]
39 Ignore(#[from] ignore::Error),
40 #[error("gRPC transport error: {0}")]
41 Transport(String),
42 #[error("gRPC status error: {0}")]
43 Status(String),
44}
45
46#[derive(Debug, Error)]
47pub enum WorkspaceError {
48 #[error("Workspace not supported: {0}")]
49 NotSupported(String),
50 #[error("Failed to collect environment: {0}")]
51 EnvironmentCollection(String),
52 #[error("Tool execution failed: {0}")]
53 ToolExecution(String),
54 #[error("Invalid workspace path: {0}")]
55 InvalidPath(String),
56 #[error(transparent)]
57 Git(#[from] Box<dyn std::error::Error + Send + Sync + 'static>),
58 #[error("Remote workspace error: {0}")]
59 Remote(String),
60}
61
62impl From<steer_workspace::WorkspaceError> for WorkspaceError {
63 fn from(err: steer_workspace::WorkspaceError) -> Self {
64 match err {
65 steer_workspace::WorkspaceError::NotSupported(msg) => WorkspaceError::NotSupported(msg),
66 steer_workspace::WorkspaceError::ToolExecution(msg) => {
67 WorkspaceError::ToolExecution(msg)
68 }
69 steer_workspace::WorkspaceError::Git(e) => WorkspaceError::Git(e),
70 steer_workspace::WorkspaceError::Io(e) => {
71 WorkspaceError::EnvironmentCollection(e.to_string())
72 }
73 steer_workspace::WorkspaceError::Transport(msg) => WorkspaceError::Remote(msg),
74 steer_workspace::WorkspaceError::Status(msg) => WorkspaceError::Remote(msg),
75 steer_workspace::WorkspaceError::InvalidConfiguration(msg) => {
76 WorkspaceError::InvalidPath(msg)
77 }
78 steer_workspace::WorkspaceError::TonicTransport(e) => {
79 WorkspaceError::Remote(e.to_string())
80 }
81 steer_workspace::WorkspaceError::TonicStatus(e) => {
82 WorkspaceError::Remote(e.to_string())
83 }
84 }
85 }
86}
87
88impl From<steer_workspace::WorkspaceError> for Error {
89 fn from(err: steer_workspace::WorkspaceError) -> Self {
90 Error::Workspace(err.into())
91 }
92}