use crate::constants::env::ai;
use std::collections::HashMap;
pub fn get_user_agent() -> String {
let version = std::env::var(ai::VERSION).unwrap_or_else(|_| "unknown".to_string());
let user_type = std::env::var(ai::USER_TYPE).unwrap_or_else(|_| "external".to_string());
let entrypoint = std::env::var(ai::CODE_ENTRYPOINT).unwrap_or_else(|_| "cli".to_string());
let agent_sdk_version = std::env::var(ai::AGENT_SDK_VERSION);
let client_app = std::env::var(ai::AGENT_SDK_CLIENT_APP);
let mut ua = format!("claude-cli/{} ({}, {}", version, user_type, entrypoint);
if let Ok(v) = agent_sdk_version {
ua.push_str(&format!(", agent-sdk/{}", v));
}
if let Ok(app) = client_app {
ua.push_str(&format!(", client-app/{}", app));
}
ua.push(')');
ua
}
pub fn get_mcp_user_agent() -> String {
let version = std::env::var(ai::VERSION).unwrap_or_else(|_| "unknown".to_string());
let mut parts: Vec<String> = vec![];
if let Ok(v) = std::env::var(ai::CODE_ENTRYPOINT) {
parts.push(v);
}
if let Ok(v) = std::env::var(ai::AGENT_SDK_VERSION) {
parts.push(format!("agent-sdk/{}", v));
}
if let Ok(v) = std::env::var(ai::AGENT_SDK_CLIENT_APP) {
parts.push(format!("client-app/{}", v));
}
if parts.is_empty() {
format!("claude-code/{}", version)
} else {
format!("claude-code/{} ({})", version, parts.join(", "))
}
}
pub fn get_web_fetch_user_agent() -> String {
format!(
"Claude-User ({}; +https://support.anthropic.com/)",
get_user_agent()
)
}
#[derive(Debug, Clone)]
pub struct AuthHeaders {
pub headers: HashMap<String, String>,
pub error: Option<String>,
}
pub fn get_auth_headers() -> AuthHeaders {
AuthHeaders {
headers: HashMap::new(),
error: Some("Not implemented - requires auth integration".to_string()),
}
}
pub async fn with_oauth_401_retry<T, R>(
request: impl FnOnce() -> R,
_also_403_revoked: Option<bool>,
) -> Result<T, Box<dyn std::error::Error + Send + Sync>>
where
R: Future<Output = Result<T, Box<dyn std::error::Error + Send + Sync>>>,
{
request().await
}