claude_agent/session/
mod.rs

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