Files
steipete--codexbar/Sources/CodexBar/UsageStore+APIKeyDebug.swift
Peter Steinberger 770ec06d2f refactor: close remaining provider-architecture gaps and declare gatekeeper scope (#2694)
* 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>
2026-08-05 20:04:38 -07:00

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)"
}
}