1use thiserror::Error;
2
3#[derive(Debug, Error)]
4pub enum GraphError {
5 #[error("checkpoint failed: {0}")]
6 Checkpoint(String),
7 #[error("node failed: {node}: {source}")]
8 NodeFailed {
9 node: String,
10 #[source]
11 source: Box<dyn std::error::Error + Send + Sync>,
12 },
13 #[error("missing node: {node}")]
14 MissingNode { node: String },
15 #[error("invalid edge to '{node}'")]
16 InvalidEdge { node: String },
17 #[error("Max steps exceeded: reached {reached}, limit {max}")]
18 MaxStepsExceeded { max: usize, reached: usize },
19 #[error("Cycle detected: node '{node}' repeated in recent window")]
20 CycleDetected { node: String, recent: Vec<String> },
21 #[error("interrupted")]
22 Interrupted,
23 #[error("tool call failed for '{0}': {1}")]
24 ToolCallFailed(String, String),
25 #[error("invalid tool call response: {0}")]
26 InvalidToolCallResponse(String),
27 #[error("duplicate tool name: {0}")]
28 DuplicateToolName(String),
29 #[error("Global execution timed out after {elapsed:?}")]
30 Timeout {
31 node: String,
32 elapsed: std::time::Duration,
33 },
34 #[error("Max visits exceeded for node '{node}': limit {max}")]
35 MaxVisitsExceeded { node: String, max: u32 },
36 #[error("Max loop iterations exceeded: node '{node}' visited {max} times on path {path_id}")]
37 MaxLoopIterationsExceeded {
38 node: String,
39 max: u32,
40 path_id: u64,
41 },
42 #[error("system error: {0}")]
43 System(String),
44 #[error(transparent)]
45 Wesichain(#[from] wesichain_core::WesichainError),
46}