import Foundation public enum ProviderTokenSource: String, Sendable { case environment case authFile } public struct ProviderTokenResolution: Sendable { public let token: String public let source: ProviderTokenSource public init(token: String, source: ProviderTokenSource) { self.token = token self.source = source } } public enum ProviderTokenResolver { public static func ampToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.ampResolution(environment: environment)?.token } public static func zaiToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.zaiResolution(environment: environment)?.token } public static func syntheticToken( environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.syntheticResolution(environment: environment)?.token } public static func openAIAPIToken( environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.openAIAPIResolution(environment: environment)?.token } public static func azureOpenAIToken( environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.azureOpenAIResolution(environment: environment)?.token } public static func claudeAdminAPIToken( environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.claudeAdminAPIResolution(environment: environment)?.token } public static func copilotToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.copilotResolution(environment: environment)?.token } public static func minimaxToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.minimaxTokenResolution(environment: environment)?.token } public static func alibabaToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.alibabaTokenResolution(environment: environment)?.token } public static func minimaxCookie(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.minimaxCookieResolution(environment: environment)?.token } public static func kimiAuthToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.kimiAuthResolution(environment: environment)?.token } public static func kimiAPIToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.kimiAPIResolution(environment: environment)?.token } public static func kimiK2Token(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.kimiK2Resolution(environment: environment)?.token } public static func moonshotToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.moonshotResolution(environment: environment)?.token } public static func ollamaToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.ollamaResolution(environment: environment)?.token } public static func kiloToken( environment: [String: String] = ProcessInfo.processInfo.environment, authFileURL: URL? = nil) -> String? { self.kiloResolution(environment: environment, authFileURL: authFileURL)?.token } public static func warpToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.warpResolution(environment: environment)?.token } public static func openRouterToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.openRouterResolution(environment: environment)?.token } public static func crossModelToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.crossModelResolution(environment: environment)?.token } public static func elevenLabsToken( environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.elevenLabsResolution(environment: environment)?.token } public static func groqToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.groqResolution(environment: environment)?.token } public static func llmProxyToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.llmProxyResolution(environment: environment)?.token } public static func liteLLMToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.liteLLMResolution(environment: environment)?.token } public static func clawRouterToken( environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.clawRouterResolution(environment: environment)?.token } public static func perplexitySessionToken( environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.perplexityResolution(environment: environment)?.token } public static func deepseekToken( environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.deepseekResolution(environment: environment)?.token } public static func poeToken( environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.poeResolution(environment: environment)?.token } public static func crofToken( environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.crofResolution(environment: environment)?.token } public static func veniceToken( environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.veniceResolution(environment: environment)?.token } public static func stepfunToken( environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.stepfunResolution(environment: environment)?.token } public static func doubaoToken(environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.doubaoResolution(environment: environment)?.token } public static func bedrockAccessKeyID( environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { self.bedrockResolution(environment: environment)?.token } public static func bedrockResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(BedrockSettingsReader.accessKeyID(environment: environment)) } public static func ampResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(AmpSettingsReader.apiToken(environment: environment)) } public static func deepseekResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(DeepSeekSettingsReader.apiKey(environment: environment)) } public static func poeResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(PoeSettingsReader.apiKey(environment: environment)) } public static func crofResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(CrofSettingsReader.apiKey(environment: environment)) } public static func veniceResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(VeniceSettingsReader.apiKey(environment: environment)) } public static func codebuffToken( environment: [String: String] = ProcessInfo.processInfo.environment, authFileURL: URL? = nil) -> String? { self.codebuffResolution(environment: environment, authFileURL: authFileURL)?.token } public static func stepfunResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(StepFunSettingsReader.token(environment: environment)) } public static func doubaoResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(DoubaoSettingsReader.apiKey(environment: environment)) } public static func zaiResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(ZaiSettingsReader.apiToken(environment: environment)) } public static func syntheticResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(SyntheticSettingsReader.apiKey(environment: environment)) } public static func openAIAPIResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(OpenAIAPISettingsReader.apiKey(environment: environment)) } public static func azureOpenAIResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(AzureOpenAISettingsReader.apiKey(environment: environment)) } public static func claudeAdminAPIResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(ClaudeAdminAPISettingsReader.apiKey(environment: environment)) } public static func copilotResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(self.cleaned(environment["COPILOT_API_TOKEN"])) } public static func minimaxTokenResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(MiniMaxAPISettingsReader.apiToken(environment: environment)) } public static func alibabaTokenResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(AlibabaCodingPlanSettingsReader.apiToken(environment: environment)) } public static func minimaxCookieResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(MiniMaxSettingsReader.cookieHeader(environment: environment)) } public static func kimiAuthResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { if let resolution = self.resolveEnv(KimiSettingsReader.authToken(environment: environment)) { return resolution } #if os(macOS) do { let session = try KimiCookieImporter.importSession() if let token = session.authToken { return ProviderTokenResolution(token: token, source: .environment) } } catch { // No browser cookies found, continue to fallback } #endif return nil } public static func kimiAPIResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(KimiSettingsReader.apiKey(environment: environment)) } public static func kimiK2Resolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(KimiK2SettingsReader.apiKey(environment: environment)) } public static func moonshotResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(MoonshotSettingsReader.apiKey(environment: environment)) } public static func ollamaResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(OllamaAPISettingsReader.apiKey(environment: environment)) } public static func kiloResolution( environment: [String: String] = ProcessInfo.processInfo.environment, authFileURL: URL? = nil) -> ProviderTokenResolution? { if let resolution = self.resolveEnv(KiloSettingsReader.apiKey(environment: environment)) { return resolution } if let token = KiloSettingsReader.authToken(authFileURL: authFileURL) { return ProviderTokenResolution(token: token, source: .authFile) } return nil } public static func warpResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(WarpSettingsReader.apiKey(environment: environment)) } public static func openRouterResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(OpenRouterSettingsReader.apiToken(environment: environment)) } public static func crossModelResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(CrossModelSettingsReader.apiToken(environment: environment)) } public static func elevenLabsResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(ElevenLabsSettingsReader.apiKey(environment: environment)) } public static func groqResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(GroqSettingsReader.apiKey(environment: environment)) } public static func llmProxyResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(LLMProxySettingsReader.apiKey(environment: environment)) } public static func liteLLMResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(LiteLLMSettingsReader.apiKey(environment: environment)) } public static func clawRouterResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { self.resolveEnv(ClawRouterSettingsReader.apiKey(environment: environment)) } public enum DeepgramCredentialKind: Sendable { case apiKey case projectID } public static func deepgramResolution( type: DeepgramCredentialKind, environment: [String: String] = ProcessInfo.processInfo.environment) -> String? { switch type { case .apiKey: self.resolveEnv(DeepgramSettingsReader.apiKey(environment: environment))?.token case .projectID: self.resolveEnv(DeepgramSettingsReader.projectID(environment: environment))?.token } } public static func codebuffResolution( environment: [String: String] = ProcessInfo.processInfo.environment, authFileURL: URL? = nil) -> ProviderTokenResolution? { if let resolution = self.resolveEnv(CodebuffSettingsReader.apiKey(environment: environment)) { return resolution } if let token = CodebuffSettingsReader.authToken(authFileURL: authFileURL) { return ProviderTokenResolution(token: token, source: .authFile) } return nil } public static func perplexityResolution( environment: [String: String] = ProcessInfo.processInfo.environment) -> ProviderTokenResolution? { if let resolution = self.resolveEnv(PerplexitySettingsReader.sessionToken(environment: environment)) { return resolution } #if os(macOS) do { let session = try PerplexityCookieImporter.importSession() if let token = session.sessionToken { return ProviderTokenResolution(token: token, source: .environment) } } catch { // No browser cookies found, continue to fallback } #endif return nil } private static func cleaned(_ raw: String?) -> String? { guard var value = raw?.trimmingCharacters(in: .whitespacesAndNewlines), !value.isEmpty else { return nil } if (value.hasPrefix("\"") && value.hasSuffix("\"")) || (value.hasPrefix("'") && value.hasSuffix("'")) { value = String(value.dropFirst().dropLast()) } value = value.trimmingCharacters(in: .whitespacesAndNewlines) return value.isEmpty ? nil : value } private static func resolveEnv(_ token: String?) -> ProviderTokenResolution? { guard let token else { return nil } return ProviderTokenResolution(token: token, source: .environment) } }