use std::pin::Pin;
use futures::Stream;
use tracing::{debug, info, instrument};
pub mod types;
pub mod errors;
pub mod config;
mod client;
pub mod transport;
pub use types::*;
pub use errors::*;
pub use config::*;
use client::InternalClient;
#[instrument(
level = "info",
skip(options),
fields(
prompt_length = prompt.len(),
has_options = options.is_some(),
system_prompt = options.as_ref().and_then(|o| o.system_prompt.as_deref()),
allowed_tools = options.as_ref().map(|o| o.allowed_tools.len()),
permission_mode = ?options.as_ref().and_then(|o| o.permission_mode.as_ref()),
cwd = ?options.as_ref().and_then(|o| o.cwd.as_ref()),
)
)]
pub async fn query(
prompt: &str,
options: Option<ClaudeCodeOptions>,
) -> Result<Pin<Box<dyn Stream<Item = Message> + Send>>, ClaudeSDKError> {
info!("Starting Claude Code query");
let options = options.unwrap_or_default();
debug!(?options, "Using query options");
std::env::set_var("CLAUDE_CODE_ENTRYPOINT", "sdk-rust");
debug!("Set CLAUDE_CODE_ENTRYPOINT environment variable");
let client = InternalClient::new();
info!("Created internal client");
let stream = client.process_query(prompt, options).await?;
info!("Successfully created message stream");
Ok(Box::pin(stream))
}
pub fn init_tracing() {
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
let env_filter = tracing_subscriber::EnvFilter::try_from_default_env()
.unwrap_or_else(|_| tracing_subscriber::EnvFilter::new("claude_code_sdk=info"));
tracing_subscriber::registry()
.with(env_filter)
.with(tracing_subscriber::fmt::layer().with_target(true))
.init();
}