{"repo": "andeya/aineer", "files": {"crates/provider/src/credentials.rs": {"6998dd070ffc3859165a9d815319b510c310ef47": {"t": 1785745865.9692676, "n": 3129, "h": "bdf1c8868b4f14c0", "c": "use crate::ProviderError;\n\n#[derive(Debug, Clone)]\npub enum Credential {\n ApiKey(String),\n EnvVar(String),\n SystemKeychain(String),\n OAuth(OAuthToken),\n}\n\n#[derive(Debug, Clone)]\npub struct OAuthToken {\n pub access_token: String,\n pub refresh_token: Option,\n pub expires_at: Option,\n}\n\npub struct CredentialsManager {\n service_name: String,\n}\n\nimpl CredentialsManager {\n pub fn new() -> Self {\n Self {\n service_name: \"aineer\".to_string(),\n }\n }\n\n /// Resolve credential from multiple sources (priority: EnvVar > Keychain > Manual)\n pub fn resolve(\n &self,\n provider_id: &str,\n env_var_name: Option<&str>,\n ) -> Result {\n // 1. Try environment variable\n if let Some(var) = env_var_name {\n if let Ok(val) = std::env::var(var) {\n if !val.is_empty() {\n return Ok(val);\n }\n }\n }\n\n // 2. Try well-known env vars\n let well_known = match provider_id {\n \"anthropic\" => Some(\"ANTHROPIC_API_KEY\"),\n \"openai\" => Some(\"OPENAI_API_KEY\"),\n \"google\" => Some(\"GOOGLE_API_KEY\"),\n \"xai\" => Some(\"XAI_API_KEY\"),\n \"deepseek\" => Some(\"DEEPSEEK_API_KEY\"),\n \"mistral\" => Some(\"MISTRAL_API_KEY\"),\n _ => None,\n };\n if let Some(var) = well_known {\n if let Ok(val) = std::env::var(var) {\n if !val.is_empty() {\n return Ok(val);\n }\n }\n }\n\n // 3. Try system keychain\n if let Ok(key) = self.get_from_keychain(provider_id) {\n return Ok(key);\n }\n\n Err(ProviderError::Credential(format!(\n \"No credential found for provider '{}'. Set {} or configure in Settings.\",\n provider_id,\n well_known.unwrap_or(\"the API key\"),\n )))\n }\n\n pub fn store_in_keychain(&self, provider_id: &str, api_key: &str) -> Result<(), ProviderError> {\n let entry = keyring::Entry::new(&self.service_name, provider_id)\n .map_err(|e| ProviderError::Credential(e.to_string()))?;\n entry\n .set_password(api_key)\n .map_err(|e| ProviderError::Credential(e.to_string()))\n }\n\n pub fn get_from_keychain(&self, provider_id: &str) -> Result {\n let entry = keyring::Entry::new(&self.service_name, provider_id)\n .map_err(|e| ProviderError::Credential(e.to_string()))?;\n entry\n .get_password()\n .map_err(|e| ProviderError::Credential(e.to_string()))\n }\n\n pub fn delete_from_keychain(&self, provider_id: &str) -> Result<(), ProviderError> {\n let entry = keyring::Entry::new(&self.service_name, provider_id)\n .map_err(|e| ProviderError::Credential(e.to_string()))?;\n entry\n .delete_credential()\n .map_err(|e| ProviderError::Credential(e.to_string()))\n }\n}\n\nimpl Default for CredentialsManager {\n fn default() -> Self {\n Self::new()\n }\n}\n"}, "a1e8a1ce8f537119e64480b31a3d9c27892b94af": {"t": 1785757392.5031204, "n": 3129, "h": "bdf1c8868b4f14c0", "c": "use crate::ProviderError;\n\n#[derive(Debug, Clone)]\npub enum Credential {\n ApiKey(String),\n EnvVar(String),\n SystemKeychain(String),\n OAuth(OAuthToken),\n}\n\n#[derive(Debug, Clone)]\npub struct OAuthToken {\n pub access_token: String,\n pub refresh_token: Option,\n pub expires_at: Option,\n}\n\npub struct CredentialsManager {\n service_name: String,\n}\n\nimpl CredentialsManager {\n pub fn new() -> Self {\n Self {\n service_name: \"aineer\".to_string(),\n }\n }\n\n /// Resolve credential from multiple sources (priority: EnvVar > Keychain > Manual)\n pub fn resolve(\n &self,\n provider_id: &str,\n env_var_name: Option<&str>,\n ) -> Result {\n // 1. Try environment variable\n if let Some(var) = env_var_name {\n if let Ok(val) = std::env::var(var) {\n if !val.is_empty() {\n return Ok(val);\n }\n }\n }\n\n // 2. Try well-known env vars\n let well_known = match provider_id {\n \"anthropic\" => Some(\"ANTHROPIC_API_KEY\"),\n \"openai\" => Some(\"OPENAI_API_KEY\"),\n \"google\" => Some(\"GOOGLE_API_KEY\"),\n \"xai\" => Some(\"XAI_API_KEY\"),\n \"deepseek\" => Some(\"DEEPSEEK_API_KEY\"),\n \"mistral\" => Some(\"MISTRAL_API_KEY\"),\n _ => None,\n };\n if let Some(var) = well_known {\n if let Ok(val) = std::env::var(var) {\n if !val.is_empty() {\n return Ok(val);\n }\n }\n }\n\n // 3. Try system keychain\n if let Ok(key) = self.get_from_keychain(provider_id) {\n return Ok(key);\n }\n\n Err(ProviderError::Credential(format!(\n \"No credential found for provider '{}'. Set {} or configure in Settings.\",\n provider_id,\n well_known.unwrap_or(\"the API key\"),\n )))\n }\n\n pub fn store_in_keychain(&self, provider_id: &str, api_key: &str) -> Result<(), ProviderError> {\n let entry = keyring::Entry::new(&self.service_name, provider_id)\n .map_err(|e| ProviderError::Credential(e.to_string()))?;\n entry\n .set_password(api_key)\n .map_err(|e| ProviderError::Credential(e.to_string()))\n }\n\n pub fn get_from_keychain(&self, provider_id: &str) -> Result {\n let entry = keyring::Entry::new(&self.service_name, provider_id)\n .map_err(|e| ProviderError::Credential(e.to_string()))?;\n entry\n .get_password()\n .map_err(|e| ProviderError::Credential(e.to_string()))\n }\n\n pub fn delete_from_keychain(&self, provider_id: &str) -> Result<(), ProviderError> {\n let entry = keyring::Entry::new(&self.service_name, provider_id)\n .map_err(|e| ProviderError::Credential(e.to_string()))?;\n entry\n .delete_credential()\n .map_err(|e| ProviderError::Credential(e.to_string()))\n }\n}\n\nimpl Default for CredentialsManager {\n fn default() -> Self {\n Self::new()\n }\n}\n"}, "e931c104b1b9db7ae9b6d17fc41dfa1056a054aa": {"t": 1785757394.7850842, "n": 3108, "h": "0a731a930f24af7b", "c": "use crate::ProviderError;\n\n#[derive(Debug, Clone)]\npub enum Credential {\n ApiKey(String),\n EnvVar(String),\n SystemKeychain(String),\n OAuth(OAuthToken),\n}\n\n#[derive(Debug, Clone)]\npub struct OAuthToken {\n pub access_token: String,\n pub refresh_token: Option,\n pub expires_at: Option,\n}\n\npub struct CredentialsManager {\n service_name: String,\n}\n\nimpl CredentialsManager {\n pub fn new() -> Self {\n Self {\n service_name: \"aineer\".to_string(),\n }\n }\n\n /// Resolve credential from multiple sources (priority: EnvVar > Keychain > Manual)\n pub fn resolve(\n &self,\n provider_id: &str,\n env_var_name: Option<&str>,\n ) -> Result {\n // 1. Try environment variable\n if let Some(var) = env_var_name {\n if let Ok(val) = std::env::var(var) {\n if !val.is_empty() {\n return Ok(val);\n }\n }\n }\n\n // 2. Try well-known env vars\n let well_known = match provider_id {\n \"anthropic\" => Some(\"ANTHROPIC_API_KEY\"),\n \"openai\" => Some(\"OPENAI_API_KEY\"),\n \"google\" => Some(\"GOOGLE_API_KEY\"),\n \"xai\" => Some(\"XAI_API_KEY\"),\n \"deepseek\" => Some(\"DEEPSEEK_API_KEY\"),\n \"mistral\" => Some(\"MISTRAL_API_KEY\"),\n _ => None,\n };\n if let Some(var) = well_known {\n if let Ok(val) = std::env::var(var) {\n if !val.is_empty() {\n return Ok(val);\n }\n }\n }\n\n // 3. Try system keychain\n if let Ok(key) = self.get_from_keychain(provider_id) { return Ok(key) }\n\n Err(ProviderError::Credential(format!(\n \"No credential found for provider '{}'. Set {} or configure in Settings.\",\n provider_id,\n well_known.unwrap_or(\"the API key\"),\n )))\n }\n\n pub fn store_in_keychain(&self, provider_id: &str, api_key: &str) -> Result<(), ProviderError> {\n let entry = keyring::Entry::new(&self.service_name, provider_id)\n .map_err(|e| ProviderError::Credential(e.to_string()))?;\n entry\n .set_password(api_key)\n .map_err(|e| ProviderError::Credential(e.to_string()))\n }\n\n pub fn get_from_keychain(&self, provider_id: &str) -> Result {\n let entry = keyring::Entry::new(&self.service_name, provider_id)\n .map_err(|e| ProviderError::Credential(e.to_string()))?;\n entry\n .get_password()\n .map_err(|e| ProviderError::Credential(e.to_string()))\n }\n\n pub fn delete_from_keychain(&self, provider_id: &str) -> Result<(), ProviderError> {\n let entry = keyring::Entry::new(&self.service_name, provider_id)\n .map_err(|e| ProviderError::Credential(e.to_string()))?;\n entry\n .delete_credential()\n .map_err(|e| ProviderError::Credential(e.to_string()))\n }\n}\n\nimpl Default for CredentialsManager {\n fn default() -> Self {\n Self::new()\n }\n}\n"}, "bffb5a39607a9c45906f75fe259f376a6b6420ee": {"t": 1785757396.1185484, "n": 3154, "h": "7f2b84a99b83c028", "c": "use crate::ProviderError;\n\n#[derive(Debug, Clone)]\npub enum Credential {\n ApiKey(String),\n EnvVar(String),\n SystemKeychain(String),\n OAuth(OAuthToken),\n}\n\n#[derive(Debug, Clone)]\npub struct OAuthToken {\n pub access_token: String,\n pub refresh_token: Option,\n pub expires_at: Option,\n}\n\npub struct CredentialsManager {\n service_name: String,\n}\n\nimpl CredentialsManager {\n pub fn new() -> Self {\n Self {\n service_name: \"aineer\".to_string(),\n }\n }\n\n /// Resolve credential from multiple sources (priority: EnvVar > Keychain > Manual)\n pub fn resolve(\n &self,\n provider_id: &str,\n env_var_name: Option<&str>,\n ) -> Result {\n // 1. Try environment variable\n if let Some(var) = env_var_name {\n if let Ok(val) = std::env::var(var) {\n if !val.is_empty() {\n return Ok(val);\n }\n }\n }\n\n // 2. Try well-known env vars\n let well_known = match provider_id {\n \"anthropic\" => Some(\"ANTHROPIC_API_KEY\"),\n \"openai\" => Some(\"OPENAI_API_KEY\"),\n \"google\" => Some(\"GOOGLE_API_KEY\"),\n \"xai\" => Some(\"XAI_API_KEY\"),\n \"deepseek\" => Some(\"DEEPSEEK_API_KEY\"),\n \"mistral\" => Some(\"MISTRAL_API_KEY\"),\n _ => None,\n };\n if let Some(var) = well_known {\n if let Ok(val) = std::env::var(var) {\n if !val.is_empty() {\n return Ok(val);\n }\n }\n }\n\n // 3. Try system keychain\n match self.get_from_keychain(provider_id) {\n Ok(key) => return Ok(key),\n Err(_) => {}\n }\n\n Err(ProviderError::Credential(format!(\n \"No credential found for provider '{}'. Set {} or configure in Settings.\",\n provider_id,\n well_known.unwrap_or(\"the API key\"),\n )))\n }\n\n pub fn store_in_keychain(&self, provider_id: &str, api_key: &str) -> Result<(), ProviderError> {\n let entry = keyring::Entry::new(&self.service_name, provider_id)\n .map_err(|e| ProviderError::Credential(e.to_string()))?;\n entry\n .set_password(api_key)\n .map_err(|e| ProviderError::Credential(e.to_string()))\n }\n\n pub fn get_from_keychain(&self, provider_id: &str) -> Result {\n let entry = keyring::Entry::new(&self.service_name, provider_id)\n .map_err(|e| ProviderError::Credential(e.to_string()))?;\n entry\n .get_password()\n .map_err(|e| ProviderError::Credential(e.to_string()))\n }\n\n pub fn delete_from_keychain(&self, provider_id: &str) -> Result<(), ProviderError> {\n let entry = keyring::Entry::new(&self.service_name, provider_id)\n .map_err(|e| ProviderError::Credential(e.to_string()))?;\n entry\n .delete_credential()\n .map_err(|e| ProviderError::Credential(e.to_string()))\n }\n}\n\nimpl Default for CredentialsManager {\n fn default() -> Self {\n Self::new()\n }\n}\n"}, "205a89e1905f29a39c86790e42d86c23166e0e87": {"t": 1785757397.538544, "n": 3123, "h": "2a0d307500592d45", "c": "use crate::ProviderError;\n\n#[derive(Debug, Clone)]\npub enum Credential {\n ApiKey(String),\n EnvVar(String),\n SystemKeychain(String),\n OAuth(OAuthToken),\n}\n\n#[derive(Debug, Clone)]\npub struct OAuthToken {\n pub access_token: String,\n pub refresh_token: Option,\n pub expires_at: Option,\n}\n\npub struct CredentialsManager {\n service_name: String,\n}\n\nimpl CredentialsManager {\n pub fn new() -> Self {\n Self {\n service_name: \"aineer\".to_string(),\n }\n }\n\n /// Resolve credential from multiple sources (priority: EnvVar > Keychain > Manual)\n pub fn resolve(&self, provider_id: &str, env_var_name: Option<&str>) -> Result {\n // 1. Try environment variable\n if let Some(var) = env_var_name {\n if let Ok(val) = std::env::var(var) {\n if !val.is_empty() {\n return Ok(val);\n }\n }\n }\n\n // 2. Try well-known env vars\n let well_known = match provider_id {\n \"anthropic\" => Some(\"ANTHROPIC_API_KEY\"),\n \"openai\" => Some(\"OPENAI_API_KEY\"),\n \"google\" => Some(\"GOOGLE_API_KEY\"),\n \"xai\" => Some(\"XAI_API_KEY\"),\n \"deepseek\" => Some(\"DEEPSEEK_API_KEY\"),\n \"mistral\" => Some(\"MISTRAL_API_KEY\"),\n _ => None,\n };\n if let Some(var) = well_known {\n if let Ok(val) = std::env::var(var) {\n if !val.is_empty() {\n return Ok(val);\n }\n }\n }\n\n // 3. Try system keychain\n match self.get_from_keychain(provider_id) {\n Ok(key) => return Ok(key),\n Err(_) => {}\n }\n\n Err(ProviderError::Credential(format!(\n \"No credential found for provider '{}'. Set {} or configure in Settings.\",\n provider_id,\n well_known.unwrap_or(\"the API key\"),\n )))\n }\n\n pub fn store_in_keychain(&self, provider_id: &str, api_key: &str) -> Result<(), ProviderError> {\n let entry = keyring::Entry::new(&self.service_name, provider_id)\n .map_err(|e| ProviderError::Credential(e.to_string()))?;\n entry\n .set_password(api_key)\n .map_err(|e| ProviderError::Credential(e.to_string()))\n }\n\n pub fn get_from_keychain(&self, provider_id: &str) -> Result {\n let entry = keyring::Entry::new(&self.service_name, provider_id)\n .map_err(|e| ProviderError::Credential(e.to_string()))?;\n entry\n .get_password()\n .map_err(|e| ProviderError::Credential(e.to_string()))\n }\n\n pub fn delete_from_keychain(&self, provider_id: &str) -> Result<(), ProviderError> {\n let entry = keyring::Entry::new(&self.service_name, provider_id)\n .map_err(|e| ProviderError::Credential(e.to_string()))?;\n entry\n .delete_credential()\n .map_err(|e| ProviderError::Credential(e.to_string()))\n }\n}\n\nimpl Default for CredentialsManager {\n fn default() -> Self {\n Self::new()\n }\n}\n"}}}}