Skip to main content

kontext_dev_sdk/management/
client.rs

1use std::sync::Arc;
2
3use crate::http_client::HttpClient;
4
5use super::agent_instances::AgentSessionsResource;
6use super::applications::ApplicationsResource;
7use super::auth::ServiceAccountCredentials;
8use super::auth::TokenManager;
9use super::integrations::IntegrationsResource;
10use super::service_accounts::ServiceAccountsResource;
11use super::traces::EventsResource;
12use super::traces::TracesResource;
13
14#[derive(Clone, Debug)]
15pub struct KontextManagementClientConfig {
16    pub base_url: String,
17    pub credentials: ServiceAccountCredentials,
18    pub token_url: Option<String>,
19    pub api_version: Option<String>,
20    pub scopes: Option<Vec<String>>,
21    pub audience: Option<String>,
22}
23
24/// TS-compatible alias.
25pub type ManagementClient = KontextManagementClient;
26
27/// Management API client for applications, integrations, sessions, traces, and events.
28pub struct KontextManagementClient {
29    pub token_manager: Arc<TokenManager>,
30    pub service_accounts: ServiceAccountsResource,
31    pub applications: ApplicationsResource,
32    pub integrations: IntegrationsResource,
33    pub agent_sessions: AgentSessionsResource,
34    pub agent_instances: AgentSessionsResource,
35    pub traces: TracesResource,
36    pub events: EventsResource,
37}
38
39impl KontextManagementClient {
40    pub fn new(config: KontextManagementClientConfig) -> Self {
41        let base_url = config.base_url.trim_end_matches('/').to_string();
42        let api_version = config.api_version.unwrap_or_else(|| "v1".to_string());
43        let token_url = config
44            .token_url
45            .unwrap_or_else(|| format!("{base_url}/oauth2/token"));
46        let scopes = config
47            .scopes
48            .unwrap_or_else(|| vec!["management:all".to_string()]);
49        let audience = config
50            .audience
51            .unwrap_or_else(|| format!("{base_url}/api/{api_version}"));
52
53        let token_manager = Arc::new(TokenManager::new(
54            token_url,
55            config.credentials,
56            scopes,
57            audience,
58        ));
59
60        let token_for_http = Arc::clone(&token_manager);
61        let http = Arc::new(HttpClient::new(
62            format!("{base_url}/api/{api_version}"),
63            move || {
64                let token_for_http = Arc::clone(&token_for_http);
65                async move { token_for_http.token().await }
66            },
67        ));
68
69        let service_accounts = ServiceAccountsResource::new(Arc::clone(&http));
70        let applications = ApplicationsResource::new(Arc::clone(&http));
71        let integrations = IntegrationsResource::new(Arc::clone(&http));
72        let agent_sessions = AgentSessionsResource::new(Arc::clone(&http));
73        let traces = TracesResource::new(Arc::clone(&http));
74        let events = EventsResource::new(Arc::clone(&http));
75
76        Self {
77            token_manager,
78            service_accounts,
79            applications,
80            integrations,
81            agent_instances: agent_sessions.clone(),
82            agent_sessions,
83            traces,
84            events,
85        }
86    }
87
88    pub async fn refresh_token(&self) -> Result<(), crate::KontextDevError> {
89        self.token_manager.refresh().await
90    }
91
92    pub async fn clear_token(&self) {
93        self.token_manager.clear().await;
94    }
95}