Skip to main content

plato_agent/
error.rs

1use crate::daemon::protocol::ProtocolError;
2use std::path::PathBuf;
3
4pub type AppResult<T> = Result<T, AppError>;
5
6#[derive(Debug, thiserror::Error)]
7pub enum AppError {
8    #[error("provider api key env var {0} is not set")]
9    MissingApiKey(String),
10
11    #[error("config error: {0}")]
12    Config(String),
13
14    #[error("provider error: {0}")]
15    Provider(String),
16
17    #[error("tool error: {0}")]
18    Tool(String),
19
20    #[error("ledger version mismatch: expected {expected}, actual {actual}")]
21    LedgerVersion { expected: u32, actual: u32 },
22
23    #[error("ledger path is empty")]
24    EmptyLedger,
25
26    #[error("ledger already exists: {0}")]
27    LedgerExists(PathBuf),
28
29    #[error("ledger conflict for run {run_id} seq {seq}")]
30    LedgerConflict { run_id: String, seq: u64 },
31
32    #[error("sqlite ledger has no runs")]
33    NoSqliteRuns,
34
35    #[error("run not found in sqlite ledger: {0}")]
36    RunNotFound(String),
37
38    #[error("sqlite ledger has no sessions")]
39    NoSqliteSessions,
40
41    #[error("session not found in sqlite ledger: {0}")]
42    SessionNotFound(String),
43
44    #[error("session already has an active run: {session_id} ({run_id})")]
45    SessionActive { session_id: String, run_id: String },
46
47    #[error("question is empty")]
48    EmptyQuestion,
49
50    #[error("run did not finish: {0}")]
51    RunFailed(String),
52
53    #[error("daemon lock held at {path}: {owner}")]
54    DaemonLockHeld { path: PathBuf, owner: String },
55
56    #[error("daemon protocol error: {0}")]
57    DaemonProtocol(String),
58
59    #[error("daemon protocol error {}: {}", .0.code, .0.message)]
60    DaemonResponse(ProtocolError),
61
62    #[error("daemon control error: {0}")]
63    DaemonControl(String),
64
65    #[error("path escapes workspace: {0}")]
66    PathEscapesWorkspace(PathBuf),
67
68    #[error("io error: {0}")]
69    Io(#[from] std::io::Error),
70
71    #[error("json error: {0}")]
72    Json(#[from] serde_json::Error),
73
74    #[error("sqlite error: {0}")]
75    Sqlite(#[from] rusqlite::Error),
76
77    #[error("toml parse error: {0}")]
78    Toml(#[from] toml::de::Error),
79
80    #[error("core error: {0}")]
81    Core(#[from] platonic_core::Error),
82}