1pub mod copilot;
2pub mod kiro;
3pub mod token_store;
4
5use anyhow::Result;
6use async_trait::async_trait;
7use serde::{Deserialize, Serialize};
8
9#[derive(Debug, Clone, Serialize, Deserialize)]
10#[serde(tag = "type")]
11pub enum TokenData {
12 #[serde(rename = "copilot")]
13 Copilot {
14 github_token: String,
15 copilot_token: Option<String>,
16 expires_at: Option<i64>,
17 },
18 #[serde(rename = "kiro")]
19 Kiro {
20 access_token: String,
21 refresh_token: String,
22 client_id: Option<String>,
23 client_secret: Option<String>,
24 auth_method: String,
25 region: String,
26 idc_region: Option<String>,
27 start_url: Option<String>,
28 profile_arn: Option<String>,
29 expires_at: i64,
30 },
31}
32
33#[async_trait]
34pub trait TokenStore: Send + Sync {
35 async fn load(&self, provider: &str) -> Result<TokenData>;
36 async fn save(&self, provider: &str, data: &TokenData) -> Result<()>;
37 async fn delete(&self, provider: &str) -> Result<()>;
38 fn is_expired(&self, data: &TokenData) -> bool;
39}