Skip to main content

ai_agent/utils/
user.rs

1// Source: /data/home/swei/claudecode/openclaudecode/src/utils/user.ts
2//! User utilities module.
3//! Provides user data and analytics functionality.
4
5use crate::constants::env::ai;
6use once_cell::sync::Lazy;
7use std::sync::Mutex;
8
9/// GitHub Actions metadata when running in CI
10#[derive(Debug, Clone, Default)]
11pub struct GitHubActionsMetadata {
12    pub actor: Option<String>,
13    pub actor_id: Option<String>,
14    pub repository: Option<String>,
15    pub repository_id: Option<String>,
16    pub repository_owner: Option<String>,
17    pub repository_owner_id: Option<String>,
18}
19
20/// Core user data used as base for all analytics providers.
21#[derive(Debug, Clone)]
22pub struct CoreUserData {
23    pub device_id: String,
24    pub session_id: String,
25    pub email: Option<String>,
26    pub app_version: String,
27    pub platform: String,
28    pub organization_uuid: Option<String>,
29    pub account_uuid: Option<String>,
30    pub user_type: Option<String>,
31    pub subscription_type: Option<String>,
32    pub rate_limit_tier: Option<String>,
33    pub first_token_time: Option<i64>,
34    pub github_actions_metadata: Option<GitHubActionsMetadata>,
35}
36
37/// Platform type
38#[derive(Debug, Clone, Copy, PartialEq, Eq)]
39pub enum Platform {
40    MacOS,
41    Linux,
42    Windows,
43    Unknown,
44}
45
46impl Platform {
47    pub fn from_str(s: &str) -> Self {
48        match s {
49            "darwin" => Platform::MacOS,
50            "linux" => Platform::Linux,
51            "win32" => Platform::Windows,
52            _ => Platform::Unknown,
53        }
54    }
55}
56
57// Cache for user data
58static CORE_USER_DATA: Lazy<Mutex<Option<CoreUserData>>> = Lazy::new(|| Mutex::new(None));
59
60/// Reset all user data caches
61pub fn reset_user_cache() {
62    let mut data = CORE_USER_DATA.lock().unwrap();
63    *data = None;
64}
65
66/// Get core user data
67pub fn get_core_user_data(_include_analytics_metadata: bool) -> CoreUserData {
68    // Basic implementation - returns default values
69    // Full implementation would read from config, auth, etc.
70    CoreUserData {
71        device_id: String::new(),
72        session_id: String::new(),
73        email: None,
74        app_version: env!("CARGO_PKG_VERSION").to_string(),
75        platform: std::env::consts::OS.to_string(),
76        organization_uuid: None,
77        account_uuid: None,
78        user_type: std::env::var(ai::USER_TYPE).ok(),
79        subscription_type: None,
80        rate_limit_tier: None,
81        first_token_time: None,
82        github_actions_metadata: None,
83    }
84}
85
86/// Get user data for analytics
87pub fn get_user_for_analytics() -> CoreUserData {
88    get_core_user_data(true)
89}
90
91/// Get user's git email from git config
92pub fn get_git_email() -> Option<String> {
93    // Execute git config --get user.email
94    std::process::Command::new("git")
95        .args(["config", "--get", "user.email"])
96        .output()
97        .ok()
98        .and_then(|output| {
99            if output.status.success() {
100                let email = String::from_utf8_lossy(&output.stdout).trim().to_string();
101                if !email.is_empty() {
102                    return Some(email);
103                }
104            }
105            None
106        })
107}
108
109/// Set cached email
110pub fn set_cached_email(_email: Option<String>) {
111    // Stub for now
112}