Skip to main content

claude_codes/
lib.rs

1//! A tightly typed Rust interface for the Claude Code JSON protocol
2//!
3//! This crate provides type-safe bindings for interacting with the Claude CLI
4//! through its JSON Lines protocol. It handles the complexity of message serialization,
5//! deserialization, and streaming communication with Claude.
6//!
7//! # Quick Start
8//!
9//! Add this crate to your project:
10//! ```bash
11//! cargo add claude-codes
12//! ```
13//!
14//! ## Using the Async Client (Recommended)
15//!
16//! ```ignore
17//! use claude_codes::AsyncClient;
18//!
19//! #[tokio::main]
20//! async fn main() -> Result<(), Box<dyn std::error::Error>> {
21//!     // Create a client with automatic version checking
22//!     let mut client = AsyncClient::with_defaults().await?;
23//!
24//!     // Send a query and stream responses
25//!     let mut stream = client.query_stream("What is 2 + 2?").await?;
26//!
27//!     while let Some(response) = stream.next().await {
28//!         match response {
29//!             Ok(output) => {
30//!                 println!("Received: {}", output.message_type());
31//!                 // Handle different message types
32//!             }
33//!             Err(e) => eprintln!("Error: {}", e),
34//!         }
35//!     }
36//!
37//!     Ok(())
38//! }
39//! ```
40//!
41//! ## Using the Sync Client
42//!
43//! ```ignore
44//! use claude_codes::{SyncClient, ClaudeInput};
45//!
46//! fn main() -> Result<(), Box<dyn std::error::Error>> {
47//!     // Create a synchronous client
48//!     let mut client = SyncClient::with_defaults()?;
49//!
50//!     // Build a structured input message
51//!     let input = ClaudeInput::user_message("What is 2 + 2?", uuid::Uuid::new_v4());
52//!
53//!     // Send and collect all responses
54//!     let responses = client.query(input)?;
55//!
56//!     for response in responses {
57//!         println!("Received: {}", response.message_type());
58//!     }
59//!
60//!     Ok(())
61//! }
62//! ```
63//!
64//! # Architecture
65//!
66//! The crate is organized into several key modules:
67//!
68//! - [`client`] - High-level async and sync clients for easy interaction
69//! - [`protocol`] - Core JSON Lines protocol implementation
70//! - [`io`] - Top-level message types (`ClaudeInput`, `ClaudeOutput`)
71//! - [`messages`] - Detailed message structures for requests and responses
72//! - [`cli`] - Builder for configuring Claude CLI invocation
73//! - [`error`] - Error types and result aliases
74//! - [`version`] - Version compatibility checking
75//!
76//! # Version Compatibility
77//!
78//! ⚠️ **Important**: The Claude CLI protocol is unstable and evolving. This crate
79//! automatically checks your Claude CLI version and warns if it's newer than tested.
80//!
81//! Current tested version: **2.1.321**
82//!
83//! Report compatibility issues at: <https://github.com/meawoppl/rust-claude-codes/pulls>
84//!
85//! # Message Types
86//!
87//! The protocol uses several message types:
88//!
89//! - **System** - Initialization and metadata messages
90//! - **User** - Input messages from the user
91//! - **Assistant** - Claude's responses
92//! - **Result** - Session completion with timing and cost info
93//!
94//! # Examples
95//!
96//! See the `examples/` directory for complete working examples:
97//! - `async_client.rs` - Simple async client usage
98//! - `sync_client.rs` - Synchronous client usage
99//! - `basic_repl.rs` - Interactive REPL implementation
100
101// Core modules always available
102pub mod error;
103pub mod io;
104pub mod messages;
105pub mod models;
106pub mod protocol;
107pub mod tool_inputs;
108pub mod types;
109
110// On-disk transcript locations (the CLI's unpublished path-encoding rule)
111pub mod transcript;
112
113// Login support tooling (PTY-driven `claude auth login` / `setup-token`)
114#[cfg(feature = "auth")]
115pub mod auth;
116
117// Client modules
118#[cfg(feature = "async-client")]
119pub mod client_async;
120#[cfg(feature = "async-client")]
121pub mod client_raw_async;
122#[cfg(feature = "sync-client")]
123pub mod client_sync;
124
125// Client-related modules
126#[cfg(any(feature = "sync-client", feature = "async-client"))]
127pub mod cli;
128#[cfg(any(feature = "sync-client", feature = "async-client"))]
129pub mod version;
130
131#[cfg(any(feature = "sync-client", feature = "async-client"))]
132mod process;
133
134// Core exports always available
135pub use error::{Error, Result};
136pub use io::{
137    AnthropicError, AnthropicErrorDetails, ApiErrorType, AssistantMessageContent, ClaudeInput,
138    ClaudeOutput, ParseError, TranscriptMessage,
139};
140pub use messages::*;
141pub use models::{ClaudeModel, EffortLevel};
142pub use protocol::{MessageEnvelope, Protocol};
143pub use types::*;
144
145// Content block types for message parsing
146pub use io::{
147    CodeExecutionToolResultBlock, ContainerUploadBlock, ContentBlock, FallbackBlock, FallbackModel,
148    ImageBlock, ImageSource, ImageSourceType, McpToolResultBlock, McpToolUseBlock, MediaType,
149    ServerToolUseBlock, TextBlock, ThinkingBlock, ToolResultBlock, ToolResultContent,
150    WebSearchToolResultBlock,
151};
152
153// Control protocol types for tool permission handling
154pub use io::{
155    ApplyFlagSettingsRequest, AskUserQuestionResponseError, ControlCancelRequest, ControlRequest,
156    ControlRequestMessage, ControlRequestPayload, ControlResponse, ControlResponseMessage,
157    ControlResponsePayload, GetUsageResponse, HookCallbackRequest, InitializeRequest,
158    McpMessageRequest, ModelScopedRateLimit, Permission, PermissionBehavior, PermissionDenial,
159    PermissionDestination, PermissionModeName, PermissionResult, PermissionRule,
160    PermissionSuggestion, PermissionType, ToolCaller, ToolPermissionRequest, ToolUseBlock,
161    UsageBehavior, UsageBehaviors, UsageModelUsage, UsageRateLimitWindow, UsageRateLimits,
162    UsageSession,
163};
164
165// System message and assistant message types
166pub use io::{
167    ApiErrorCut, ApiErrorMedia, ApiErrorMediaReason, ApiErrorParams, ApiErrorProvider,
168    ApiErrorRemedy, ApiKeySource, ApiRetryMessage, ApiRetryNoResponse, ArtifactReadVersion,
169    AssistantErrorKind, AutoModeRule, AutoModeRuleList, BackgroundTaskInfo,
170    BackgroundTasksChangedMessage, BatchToolUse, ClientThinking, CloudSessionDeltaMessage,
171    CodeChangePublishedMessage, CommandInfo, CommandsChangedMessage, CompactBoundaryMessage,
172    CompactMetadata, CompactionTrigger, ContextAgent, ContextCategory, ContextMcpTool,
173    ContextMemoryFile, ContextOverLimit, ContextSkill, ContextUsage, ControlRequestProgressMessage,
174    CyberVerificationStatus, DevIntentKind, DevIntentMessage, DevIntentTrigger,
175    ElicitationCompleteMessage, FailedPersistedFile, FeedbackDraftQueuedMessage,
176    FileAttachmentsMissingMessage, FilesPersistedMessage, HandbackReport, HookProgressMessage,
177    HookResponseMessage, HookStartedMessage, InformationalMessage, InheritedAsksSettledMessage,
178    InitMessage, InitPermissionMode, InstructionSizeWarningMessage, KnownSystemEvent,
179    LocalCommandOutcome, LocalCommandOutcomeKind, LocalCommandOutputMessage, LocalCommandRun,
180    LostSessionWrite, McpMeta, McpServerError, MemoryPaths, MemoryRecallItem, MemoryRecallMessage,
181    MessageOrigin, MessageRole, MirrorErrorKey, MirrorErrorMessage, MissingFileAttachment,
182    ModelRefusalFallbackMessage, ModelRefusalNoFallbackMessage, ModelRestriction,
183    NotificationMessage, OutputStyle, PeerMessageHoldCause, PeerMessageHoldMessage,
184    PeerMessageHoldOutcome, PeerMessageHoldState, PeerMessageLane, PerTurnEffortChangedMessage,
185    PermissionCheckStatus, PermissionCheckStatusMessage, PermissionDecisionOutcome,
186    PermissionDecisionReasonType, PermissionDeniedMessage, PermissionDeniedReasonCode,
187    PersistedFile, PluginDiagnostic, PluginInfo, PluginInstallMessage, PluginPrompt,
188    PreservedMessages, PreservedSegment, PromptSubmitOutcome, PromptSubmitOutcomeKind,
189    RefusalFallbackScope, RemedyFeature, RemedyFeatureCause, RemedyLoginProvider, RemedyPolicyKind,
190    SessionTitleChangedMessage, SessionWriteErrorCode, SessionWritesLostMessage, StatusMessage,
191    StatusMessageStatus, StopReason, SummarizeMetadata, SystemMessage, SystemSubtype,
192    TaskEndReason, TaskHandback, TaskNotificationMessage, TaskPatch, TaskProgressMessage,
193    TaskStartedMessage, TaskStatus, TaskType, TaskUpdatedMessage, TaskUsage, ThinkingTokensMessage,
194    ToolPermissionDecision, ToolResultMeta, ToolResultRemedy, ToolResultRemedyKind, ToolUseMeta,
195    TurnHandoffAvailableMessage, TurnPreemptedMessage, UiFocusMessage, UiInvalidateMessage,
196    UiInvalidatedInstance, UiLogMessage, UiNotifyCancelMessage, UiNotifyMessage, UiPane,
197    UiPanesMessage, UiPlacedMessage, UiPlacedRow, UiScrollMessage, UiSiteComponent,
198    UiStatusMessage, UiToastMessage, UsageReport, UsageReportExtraUsage, UsageReportLimit,
199    UsageReportRateLimits, UsageReportScope, UsageReportScopeLabel, VcsMutationKind,
200    VcsStateChangedMessage, ViewMode, WorkerShuttingDownMessage,
201};
202
203// Additional top-level output message wrappers
204pub use io::{
205    AbandonedBlocks, AuthStatusMessage, CommandLifecycleMessage, CommandLifecycleState,
206    CommandWakeupSource, ConversationResetMessage, ConversationResetTrigger,
207    PromptSuggestionMessage, StreamEventMessage, SubagentRetry, ToolProgressMessage,
208    ToolUseSummaryMessage,
209};
210
211// Wire-fidelity audit for verifying frames are fully typed
212pub use io::{assert_fully_wrapped, audit_frame, FrameAudit};
213
214// Rate limit types
215pub use io::{
216    AdminRequestOffer, AdminRequestOfferState, OverageDisabledReason, OveragePeriodUtilization,
217    OverageStatus, RateLimitErrorCode, RateLimitEvent, RateLimitInfo, RateLimitScope,
218    RateLimitStatus, RateLimitWindow, UsageCreditOffer, UsageCreditOfferKind,
219};
220
221// Usage types
222pub use io::{
223    AssistantUsage, CacheCreationDetails, DeferredToolUse, DiffersFilesCounts,
224    FastModeDisabledReason, GarbageCollectionCounts, InputAttachmentsDetail,
225    MessageNormalizationDetail, ProcessGarbageCollections, ProcessStateTime, ProcessTurnStates,
226    RequestBuildDetail, ResumeStoreConfirmDetail, RunnerExit, RunnerExitPhase, ServerToolUse,
227    StartupFailureReason, StreamPostQueuedBehind, SubagentKillCounts, SubagentRefusalCounts,
228    SubagentResult, SubagentSpawnRequests, SubagentStats, SubagentToolStats, SubagentUsageRollup,
229    ToolSchemaBuildDetail, TouchCompareCounts, TurnStartResumeKind, UsageInfo,
230};
231
232// Typed tool input types
233pub use tool_inputs::{
234    AllowedPrompt, AskUserQuestionInput, BashInput, EditInput, EnterPlanModeInput,
235    ExitPlanModeInput, GlobInput, GrepInput, GrepOutputMode, KillShellInput, LsInput,
236    MultiEditInput, MultiEditOperation, NotebookCellType, NotebookEditInput, NotebookEditMode,
237    NotebookReadInput, Question, QuestionMetadata, QuestionOption, ReadInput, ScheduleWakeupInput,
238    SkillInput, SubagentType, TaskInput, TaskOutputInput, TodoItem, TodoStatus, TodoWriteInput,
239    ToolInput, ToolSearchInput, WebFetchInput, WebSearchInput, WriteInput,
240};
241
242// Client exports
243#[cfg(feature = "async-client")]
244pub use client_async::{AsyncClient, AsyncStreamProcessor};
245#[cfg(feature = "async-client")]
246pub use client_raw_async::RawAsyncClient;
247#[cfg(feature = "sync-client")]
248pub use client_sync::{StreamProcessor, SyncClient};
249
250// Client-related exports
251#[cfg(any(feature = "sync-client", feature = "async-client"))]
252pub use cli::{ClaudeCliBuilder, CliFlag, InputFormat, OutputFormat, PermissionMode};
253
254#[cfg(test)]
255mod tests {
256    #[test]
257    fn it_works() {
258        assert_eq!(2 + 2, 4);
259    }
260}