1use crate::constants::env::ai;
5use std::collections::HashMap;
6
7pub fn get_user_agent() -> String {
9 let version = std::env::var(ai::VERSION).unwrap_or_else(|_| "unknown".to_string());
10 let user_type = std::env::var(ai::USER_TYPE).unwrap_or_else(|_| "external".to_string());
11 let entrypoint = std::env::var(ai::CODE_ENTRYPOINT).unwrap_or_else(|_| "cli".to_string());
12 let agent_sdk_version = std::env::var(ai::AGENT_SDK_VERSION);
13 let client_app = std::env::var(ai::AGENT_SDK_CLIENT_APP);
14
15 let mut ua = format!("claude-cli/{} ({}, {}", version, user_type, entrypoint);
16
17 if let Ok(v) = agent_sdk_version {
18 ua.push_str(&format!(", agent-sdk/{}", v));
19 }
20
21 if let Ok(app) = client_app {
22 ua.push_str(&format!(", client-app/{}", app));
23 }
24
25 ua.push(')');
28 ua
29}
30
31pub fn get_mcp_user_agent() -> String {
33 let version = std::env::var(ai::VERSION).unwrap_or_else(|_| "unknown".to_string());
34
35 let mut parts: Vec<String> = vec![];
36
37 if let Ok(v) = std::env::var(ai::CODE_ENTRYPOINT) {
38 parts.push(v);
39 }
40 if let Ok(v) = std::env::var(ai::AGENT_SDK_VERSION) {
41 parts.push(format!("agent-sdk/{}", v));
42 }
43 if let Ok(v) = std::env::var(ai::AGENT_SDK_CLIENT_APP) {
44 parts.push(format!("client-app/{}", v));
45 }
46
47 if parts.is_empty() {
48 format!("claude-code/{}", version)
49 } else {
50 format!("claude-code/{} ({})", version, parts.join(", "))
51 }
52}
53
54pub fn get_web_fetch_user_agent() -> String {
56 format!(
59 "Claude-User ({}; +https://support.anthropic.com/)",
60 get_user_agent()
61 )
62}
63
64#[derive(Debug, Clone)]
66pub struct AuthHeaders {
67 pub headers: HashMap<String, String>,
69 pub error: Option<String>,
71}
72
73pub fn get_auth_headers() -> AuthHeaders {
76 AuthHeaders {
79 headers: HashMap::new(),
80 error: Some("Not implemented - requires auth integration".to_string()),
81 }
82}
83
84pub async fn with_oauth_401_retry<T, R>(
95 request: impl FnOnce() -> R,
96 _also_403_revoked: Option<bool>,
97) -> Result<T, Box<dyn std::error::Error + Send + Sync>>
98where
99 R: Future<Output = Result<T, Box<dyn std::error::Error + Send + Sync>>>,
100{
101 request().await
103}