1use std::fmt::Debug;
2
3use crate::types::skill::SkillPermission;
4
5#[derive(Debug, thiserror::Error)]
7pub enum SkillError {
8 #[error("Skill not found: {0}")]
10 NotFound(String),
11
12 #[error("Execution timed out ({0}ms)")]
14 Timeout(u64),
15
16 #[error("Insufficient permissions: requires {required:?}")]
18 PermissionDenied {
19 required: Vec<SkillPermission>,
21 },
22
23 #[error("Tool execution failed: {0}")]
25 ToolExecution(String),
26
27 #[error("WASM error: {0}")]
29 Wasm(String),
30
31 #[error("Configuration validation failed: {0}")]
33 ConfigValidation(String),
34
35 #[error("Version mismatch: skill requires >= {required}")]
37 VersionMismatch {
38 required: String,
40 },
41
42 #[error("Preflight check failed: {0}")]
44 PreflightFailed(String),
45
46 #[error("Skill is disabled: {0}")]
48 Disabled(String),
49
50 #[error("IO error: {0}")]
52 Io(#[from] std::io::Error),
53
54 #[error("YAML parse error: {0}")]
56 Yaml(String),
57
58 #[error("Invalid WASM binary: {0}")]
60 InvalidWasm(String),
61
62 #[error("HTTP error: {0}")]
64 Http(String),
65
66 #[error("Parse error: {0}")]
68 ParseError(String),
69
70 #[error("Missing required field: {0}")]
72 MissingField(String),
73
74 #[error("Invalid format: {0}")]
76 InvalidFormat(String),
77}
78
79impl SkillError {
80 pub fn is_retryable(&self) -> bool {
86 matches!(
87 self,
88 SkillError::Timeout(_)
89 | SkillError::ToolExecution(_)
90 | SkillError::Http(_)
91 | SkillError::Io(_)
92 )
93 }
94}