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}