770ec06d2f
* refactor: close provider architecture gaps * refactor: triage loose provider references * test: harden provider architecture gatekeeper * docs: declare gatekeeper threat model --------- Co-authored-by: Peter Steinberger <steipete@clawstudio.local>
64 lines
2.3 KiB
Swift
64 lines
2.3 KiB
Swift
import CodexBarCore
|
|
import Foundation
|
|
|
|
extension UsageStore {
|
|
struct APIKeyDebugContext {
|
|
let label: String
|
|
let resolution: ProviderTokenResolution?
|
|
let configToken: String?
|
|
let hasEnvToken: Bool
|
|
let hasTokenAccount: Bool
|
|
}
|
|
|
|
func apiKeyDebugContext(
|
|
provider: UsageProvider,
|
|
processEnvironment: [String: String]) -> APIKeyDebugContext?
|
|
{
|
|
guard let adapter = ProviderDescriptorRegistry.descriptor(for: provider).credentials,
|
|
let label = adapter.apiKeyDebugLabel
|
|
else { return nil }
|
|
let config = self.settings.providerConfig(for: provider)
|
|
let environment = adapter.applyConfig(base: processEnvironment, config: config)
|
|
return APIKeyDebugContext(
|
|
label: label,
|
|
resolution: adapter.resolveToken(environment: environment),
|
|
configToken: config?.sanitizedAPIKey,
|
|
hasEnvToken: adapter.resolveToken(environment: processEnvironment) != nil,
|
|
hasTokenAccount: false)
|
|
}
|
|
|
|
nonisolated static func apiKeyDebugLine(_ context: APIKeyDebugContext) -> String {
|
|
self.apiKeyDebugLine(
|
|
label: context.label,
|
|
resolution: context.resolution,
|
|
configToken: context.configToken,
|
|
hasEnvToken: context.hasEnvToken,
|
|
hasTokenAccount: context.hasTokenAccount)
|
|
}
|
|
|
|
nonisolated static func apiKeyDebugLine(
|
|
label: String,
|
|
resolution: ProviderTokenResolution?,
|
|
configToken: String?,
|
|
hasEnvToken: Bool,
|
|
hasTokenAccount: Bool = false) -> String
|
|
{
|
|
let hasAny = resolution != nil
|
|
let hasConfigToken = !(configToken?.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty ?? true)
|
|
let source: String = if resolution == nil {
|
|
"none"
|
|
} else if hasTokenAccount, hasEnvToken {
|
|
"settings-token-account (overrides env)"
|
|
} else if hasTokenAccount {
|
|
"settings-token-account"
|
|
} else if hasConfigToken, hasEnvToken {
|
|
"settings-config (overrides env)"
|
|
} else if hasConfigToken {
|
|
"settings-config"
|
|
} else {
|
|
resolution?.source.rawValue ?? "environment"
|
|
}
|
|
return "\(label)=\(hasAny ? "present" : "missing") source=\(source)"
|
|
}
|
|
}
|