Files
2026-07-13 12:22:33 +08:00

91 lines
3.6 KiB
Swift

import CodexBarCore
import Foundation
enum CopilotIconSecondaryWindowSelection {
static let chat = "chat"
}
extension SettingsStore {
var copilotAPIToken: String {
get { self.configSnapshot.providerConfig(for: .copilot)?.sanitizedAPIKey ?? "" }
set {
self.updateProviderConfig(provider: .copilot) { entry in
entry.apiKey = self.normalizedConfigValue(newValue)
}
self.logSecretUpdate(provider: .copilot, field: "apiKey", value: newValue)
}
}
var copilotEnterpriseHost: String {
get { self.configSnapshot.providerConfig(for: .copilot)?.sanitizedEnterpriseHost ?? "" }
set {
self.updateProviderConfig(provider: .copilot) { entry in
entry.enterpriseHost = self.normalizedConfigValue(newValue)
}
}
}
var copilotBudgetCookieHeader: String {
get { self.configSnapshot.providerConfig(for: .copilot)?.sanitizedCookieHeader ?? "" }
set {
self.updateProviderConfig(provider: .copilot) { entry in
entry.cookieHeader = self.normalizedConfigValue(newValue)
}
self.logSecretUpdate(provider: .copilot, field: "cookieHeader", value: newValue)
}
}
var copilotBudgetCookieSource: ProviderCookieSource {
get { self.resolvedCookieSource(provider: .copilot, fallback: .auto) }
set {
self.updateProviderConfig(provider: .copilot) { entry in
entry.cookieSource = newValue
}
self.logProviderModeChange(provider: .copilot, field: "cookieSource", value: newValue.rawValue)
}
}
func ensureCopilotAPITokenLoaded() {}
var copilotIconSecondaryWindowID: String {
get {
let raw = self.copilotIconSecondaryWindowIDRaw.trimmingCharacters(in: .whitespacesAndNewlines)
return raw.isEmpty ? CopilotIconSecondaryWindowSelection.chat : raw
}
set {
let trimmed = newValue.trimmingCharacters(in: .whitespacesAndNewlines)
self.copilotIconSecondaryWindowIDRaw = trimmed.isEmpty
? CopilotIconSecondaryWindowSelection.chat
: trimmed
}
}
func copilotIconSecondaryWindowOverrideID(snapshot: UsageSnapshot?) -> String? {
guard self.copilotBudgetExtrasEnabled else { return nil }
let selected = self.copilotIconSecondaryWindowID
guard selected != CopilotIconSecondaryWindowSelection.chat else { return nil }
guard snapshot?.extraRateWindows?.contains(where: { $0.id == selected }) == true else { return nil }
return selected
}
}
extension SettingsStore {
func copilotSettingsSnapshot(
tokenOverride: TokenAccountOverride?) -> ProviderSettingsSnapshot.CopilotProviderSettings
{
let account = ProviderTokenAccountSelection.selectedAccount(
provider: .copilot,
settings: self,
override: tokenOverride)
let token = account?.token ?? self.copilotAPIToken
let host = CopilotDeviceFlow.normalizedHost(self.copilotEnterpriseHost)
return ProviderSettingsSnapshot.CopilotProviderSettings(
apiToken: self.normalizedConfigValue(token),
enterpriseHost: host == CopilotDeviceFlow.defaultHost ? nil : host,
selectedAccountExternalIdentifier: account?.externalIdentifier.flatMap(self.normalizedConfigValue),
budgetExtrasEnabled: self.copilotBudgetExtrasEnabled,
budgetCookieSource: self.copilotBudgetCookieSource,
manualBudgetCookieHeader: self.normalizedConfigValue(self.copilotBudgetCookieHeader))
}
}