Files
steipete--codexbar/Sources/CodexBarCore/Providers/Codex/CodexSystemAccountObserver.swift
T
2026-07-13 12:22:33 +08:00

70 lines
2.5 KiB
Swift

import Foundation
public struct ObservedSystemCodexAccount: Equatable, Sendable {
public let email: String
public let workspaceLabel: String?
public let workspaceAccountID: String?
public let authFingerprint: String?
public let codexHomePath: String
public let observedAt: Date
public let identity: CodexIdentity
public init(
email: String,
workspaceLabel: String? = nil,
workspaceAccountID: String? = nil,
authFingerprint: String? = nil,
codexHomePath: String,
observedAt: Date,
identity: CodexIdentity = .unresolved)
{
self.email = email
self.workspaceLabel = workspaceLabel
self.workspaceAccountID = workspaceAccountID
self.authFingerprint = CodexAuthFingerprint.normalize(authFingerprint)
self.codexHomePath = codexHomePath
self.observedAt = observedAt
self.identity = identity
}
}
public protocol CodexSystemAccountObserving: Sendable {
func loadSystemAccount(environment: [String: String]) throws -> ObservedSystemCodexAccount?
}
public struct DefaultCodexSystemAccountObserver: CodexSystemAccountObserving {
private let workspaceCache: CodexOpenAIWorkspaceIdentityCache
public init(workspaceCache: CodexOpenAIWorkspaceIdentityCache = CodexOpenAIWorkspaceIdentityCache()) {
self.workspaceCache = workspaceCache
}
public func loadSystemAccount(environment: [String: String]) throws -> ObservedSystemCodexAccount? {
let homeURL = CodexHomeScope.ambientHomeURL(env: environment)
let fetcher = UsageFetcher(environment: environment)
let account = fetcher.loadAuthBackedCodexAccount()
guard let rawEmail = account.email?.trimmingCharacters(in: .whitespacesAndNewlines),
!rawEmail.isEmpty
else {
return nil
}
let providerAccountID: String? = switch account.identity {
case let .providerAccount(id):
ManagedCodexAccount.normalizeProviderAccountID(id)
case .emailOnly, .unresolved:
nil
}
return ObservedSystemCodexAccount(
email: rawEmail.lowercased(),
workspaceLabel: self.workspaceCache.workspaceLabel(for: providerAccountID),
workspaceAccountID: providerAccountID,
authFingerprint: CodexAuthFingerprint.fingerprint(homePath: homeURL.path),
codexHomePath: homeURL.path,
observedAt: Date(),
identity: account.identity)
}
}