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

94 lines
3.9 KiB
Swift

import Foundation
public struct CodexProviderSettingsBuilderInput: Sendable {
public let usageDataSource: CodexUsageDataSource
public let cookieSource: ProviderCookieSource
public let manualCookieHeader: String?
public let reconciliationSnapshot: CodexAccountReconciliationSnapshot
public let resolvedActiveSource: CodexResolvedActiveSource
public init(
usageDataSource: CodexUsageDataSource,
cookieSource: ProviderCookieSource,
manualCookieHeader: String?,
reconciliationSnapshot: CodexAccountReconciliationSnapshot,
resolvedActiveSource: CodexResolvedActiveSource)
{
self.usageDataSource = usageDataSource
self.cookieSource = cookieSource
self.manualCookieHeader = manualCookieHeader
self.reconciliationSnapshot = reconciliationSnapshot
self.resolvedActiveSource = resolvedActiveSource
}
}
public enum CodexKnownOwnerCatalog {
public static func candidates(
from snapshot: CodexAccountReconciliationSnapshot) -> [CodexDashboardKnownOwnerCandidate]
{
var candidates = snapshot.storedAccounts.map { account in
CodexDashboardKnownOwnerCandidate(
identity: snapshot.runtimeIdentity(for: account),
normalizedEmail: CodexIdentityResolver.normalizeEmail(snapshot.runtimeEmail(for: account)))
}
if let liveSystemAccount = snapshot.liveSystemAccount {
candidates.append(CodexDashboardKnownOwnerCandidate(
identity: snapshot.runtimeIdentity(for: liveSystemAccount),
normalizedEmail: CodexIdentityResolver.normalizeEmail(liveSystemAccount.email)))
}
for profileAccount in snapshot.profileHomeAccounts {
candidates.append(CodexDashboardKnownOwnerCandidate(
identity: snapshot.runtimeIdentity(for: profileAccount),
normalizedEmail: CodexIdentityResolver.normalizeEmail(profileAccount.email),
sourceIsolationIdentifier: CookieHeaderCache.Scope.profileHome(profileAccount.codexHomePath)
.isolationIdentifier))
}
return candidates
}
}
public enum CodexProviderSettingsBuilder {
public static func make(input: CodexProviderSettingsBuilderInput) -> ProviderSettingsSnapshot
.CodexProviderSettings {
let snapshot = input.reconciliationSnapshot
let persistedSource = input.resolvedActiveSource.persistedSource
let managedSourceSelected = switch persistedSource {
case .liveSystem:
false
case .managedAccount:
true
case .profileHome:
false
}
let openAIWebCacheScope: CookieHeaderCache.Scope? = switch input.resolvedActiveSource.resolvedSource {
case .liveSystem:
nil
case let .managedAccount(id):
.managedAccount(id)
case let .profileHome(path):
.profileHome(path)
}
let profileAccountTargetUnavailable = switch input.resolvedActiveSource.resolvedSource {
case .liveSystem, .managedAccount:
false
case let .profileHome(path):
snapshot.profileHomeAccount(path: path) == nil
}
return ProviderSettingsSnapshot.CodexProviderSettings(
usageDataSource: input.usageDataSource,
cookieSource: input.cookieSource,
manualCookieHeader: input.manualCookieHeader,
managedAccountStoreUnreadable: managedSourceSelected && snapshot.hasUnreadableAddedAccountStore,
managedAccountTargetUnavailable: managedSourceSelected
&& snapshot.hasUnreadableAddedAccountStore == false
&& snapshot.activeStoredAccount == nil,
profileAccountTargetUnavailable: profileAccountTargetUnavailable,
openAIWebCacheScope: openAIWebCacheScope,
dashboardAuthorityKnownOwners: CodexKnownOwnerCatalog.candidates(from: snapshot))
}
}