claude_agent/session/
mod.rs

1//! Session management for stateful conversations.
2
3pub mod cache;
4pub mod compact;
5pub mod manager;
6pub mod persistence;
7#[cfg(feature = "postgres")]
8pub mod persistence_postgres;
9#[cfg(feature = "redis-backend")]
10pub mod persistence_redis;
11pub mod queue;
12pub mod session_state;
13pub mod state;
14pub mod types;
15
16pub use crate::types::TokenUsage;
17pub use cache::{CacheConfigBuilder, CacheStats, SessionCacheManager};
18pub use compact::{CompactExecutor, CompactStrategy};
19pub use manager::SessionManager;
20pub use persistence::{MemoryPersistence, Persistence, PersistenceFactory};
21#[cfg(feature = "postgres")]
22pub use persistence_postgres::{PostgresConfig, PostgresPersistence};
23#[cfg(feature = "redis-backend")]
24pub use persistence_redis::RedisPersistence;
25pub use queue::{InputQueue, MergedInput, QueuedInput, SharedInputQueue};
26pub use session_state::ToolState;
27pub use state::{
28    MessageId, MessageMetadata, PermissionPolicy, Session, SessionConfig, SessionId,
29    SessionMessage, SessionMode, SessionState, SessionType,
30};
31pub use types::{
32    CompactRecord, CompactTrigger, EnvironmentContext, Plan, PlanStatus, QueueItem, QueueOperation,
33    QueueStatus, SessionStats, SessionTree, SummarySnapshot, TodoItem, TodoStatus, ToolExecution,
34    ToolExecutionFilter,
35};
36
37use thiserror::Error;
38
39#[derive(Error, Debug)]
40pub enum SessionError {
41    #[error("Session not found: {id}")]
42    NotFound { id: String },
43
44    #[error("Session expired: {id}")]
45    Expired { id: String },
46
47    #[error("Permission denied: {reason}")]
48    PermissionDenied { reason: String },
49
50    #[error("Storage error: {message}")]
51    Storage { message: String },
52
53    #[error("Persistence error: {0}")]
54    PersistenceError(String),
55
56    #[error("Serialization error: {0}")]
57    Serialization(#[from] serde_json::Error),
58
59    #[error("Compact error: {message}")]
60    Compact { message: String },
61
62    #[error("Context error: {0}")]
63    Context(#[from] crate::context::ContextError),
64
65    #[error("Plan error: {message}")]
66    Plan { message: String },
67}
68
69pub type SessionResult<T> = std::result::Result<T, SessionError>;
70
71#[cfg(test)]
72mod tests {
73    use super::*;
74
75    #[test]
76    fn test_session_error_display() {
77        let err = SessionError::NotFound {
78            id: "test-123".to_string(),
79        };
80        assert!(err.to_string().contains("test-123"));
81    }
82
83    #[test]
84    fn test_session_error_expired() {
85        let err = SessionError::Expired {
86            id: "sess-456".to_string(),
87        };
88        assert!(err.to_string().contains("expired"));
89    }
90}