import CodexBarCoreimport 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)) }}
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))
}
}