import Foundation/// Stable identity for one account row surfaced by a multi-account source adapter.////// `source` names the adapter (for example `claude-swap`) and `opaqueID` is the/// source-issued identifier (for example a numeric slot). Identity never derives/// from emails or credential material, per/// `docs/claude-multi-account-and-status-items.md`.public struct ProviderAccountIdentity: Hashable, Sendable { public let source: String public let opaqueID: String public init(source: String, opaqueID: String) { self.source = source self.opaqueID = opaqueID }}/// Provider-neutral projection of one account's usage, consumed by menus (and,/// later, per-account status items) without teaching UI code about any specific/// credential source.public struct ProviderAccountUsageSnapshot: Identifiable, Sendable { public let id: ProviderAccountIdentity public let provider: UsageProvider /// Display-only label (may contain personal data such as an email); UI is /// responsible for privacy redaction. Never logged or persisted. public let displayLabel: String public let isActive: Bool /// Whether the source can make this inactive account the provider's active account. /// Activation remains source-owned; CodexBar never handles credential material. public let canActivate: Bool public let snapshot: UsageSnapshot? public let error: String? public let sourceLabel: String? public init( id: ProviderAccountIdentity, provider: UsageProvider, displayLabel: String, isActive: Bool, canActivate: Bool = false, snapshot: UsageSnapshot?, error: String?, sourceLabel: String?) { self.id = id self.provider = provider self.displayLabel = displayLabel self.isActive = isActive self.canActivate = canActivate self.snapshot = snapshot self.error = error self.sourceLabel = sourceLabel }}
import Foundation
/// Stable identity for one account row surfaced by a multi-account source adapter.
///
/// `source` names the adapter (for example `claude-swap`) and `opaqueID` is the
/// source-issued identifier (for example a numeric slot). Identity never derives
/// from emails or credential material, per
/// `docs/claude-multi-account-and-status-items.md`.
public struct ProviderAccountIdentity: Hashable, Sendable {
public let source: String
public let opaqueID: String
public init(source: String, opaqueID: String) {
self.source = source
self.opaqueID = opaqueID
}
}
/// Provider-neutral projection of one account's usage, consumed by menus (and,
/// later, per-account status items) without teaching UI code about any specific
/// credential source.
public struct ProviderAccountUsageSnapshot: Identifiable, Sendable {
public let id: ProviderAccountIdentity
public let provider: UsageProvider
/// Display-only label (may contain personal data such as an email); UI is
/// responsible for privacy redaction. Never logged or persisted.
public let displayLabel: String
public let isActive: Bool
/// Whether the source can make this inactive account the provider's active account.
/// Activation remains source-owned; CodexBar never handles credential material.
public let canActivate: Bool
public let snapshot: UsageSnapshot?
public let error: String?
public let sourceLabel: String?
public init(
id: ProviderAccountIdentity,
provider: UsageProvider,
displayLabel: String,
isActive: Bool,
canActivate: Bool = false,
snapshot: UsageSnapshot?,
error: String?,
sourceLabel: String?)
{
self.id = id
self.provider = provider
self.displayLabel = displayLabel
self.isActive = isActive
self.canActivate = canActivate
self.snapshot = snapshot
self.error = error
self.sourceLabel = sourceLabel
}
}