91 lines
3.6 KiB
Swift
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))
|
|
}
|
|
}
|