claude_agent/session/
mod.rs

1//! Session management for stateful conversations.
2
3pub mod compact;
4pub mod manager;
5pub mod persistence;
6#[cfg(feature = "postgres")]
7pub mod persistence_postgres;
8#[cfg(feature = "redis-backend")]
9pub mod persistence_redis;
10pub mod queue;
11pub mod session_state;
12pub mod state;
13pub mod types;
14
15pub use crate::types::TokenUsage;
16pub use compact::{CompactExecutor, CompactStrategy};
17pub use manager::SessionManager;
18pub use persistence::{MemoryPersistence, Persistence, PersistenceFactory};
19#[cfg(feature = "postgres")]
20pub use persistence_postgres::{
21    PgPoolConfig, PostgresConfig, PostgresPersistence, PostgresSchema, SchemaIssue,
22};
23#[cfg(feature = "redis-backend")]
24pub use persistence_redis::{RedisConfig, RedisPersistence};
25pub use queue::{InputQueue, MergedInput, QueueError, QueuedInput, SharedInputQueue};
26pub use session_state::{ExecutionGuard, 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}