chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,96 @@
|
||||
import AppKit
|
||||
import CodexBarCore
|
||||
import Foundation
|
||||
|
||||
enum ProviderDetectionPolicy {
|
||||
struct Signals {
|
||||
let codexCLIInstalled: Bool
|
||||
let claudeCLIInstalled: Bool
|
||||
let claudeDesktopInstalled: Bool
|
||||
let geminiCLIInstalled: Bool
|
||||
let geminiConfigured: Bool
|
||||
let antigravityAvailable: Bool
|
||||
}
|
||||
|
||||
static func enabledProviders(signals: Signals) -> Set<UsageProvider> {
|
||||
var enabled: Set<UsageProvider> = []
|
||||
if signals.codexCLIInstalled { enabled.insert(.codex) }
|
||||
if signals.claudeCLIInstalled || signals.claudeDesktopInstalled { enabled.insert(.claude) }
|
||||
if signals.geminiCLIInstalled, signals.geminiConfigured { enabled.insert(.gemini) }
|
||||
if signals.antigravityAvailable { enabled.insert(.antigravity) }
|
||||
|
||||
// Keep the historical Codex default when no usable provider source is found.
|
||||
if enabled.isEmpty { enabled.insert(.codex) }
|
||||
return enabled
|
||||
}
|
||||
}
|
||||
|
||||
extension SettingsStore {
|
||||
func runInitialProviderDetectionIfNeeded(force: Bool = false) {
|
||||
guard force || !self.providerDetectionCompleted else { return }
|
||||
LoginShellPathCache.shared.captureOnce { [weak self] _ in
|
||||
Task { @MainActor in
|
||||
await self?.applyProviderDetection()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func applyProviderDetection() async {
|
||||
guard !self.providerDetectionCompleted else { return }
|
||||
let codexCLIInstalled = BinaryLocator.resolveCodexBinary() != nil
|
||||
let claudeCLIInstalled = BinaryLocator.resolveClaudeBinary() != nil
|
||||
let claudeDesktopInstalled = NSWorkspace.shared.urlForApplication(
|
||||
withBundleIdentifier: "com.anthropic.claudefordesktop") != nil
|
||||
let geminiCLIInstalled = BinaryLocator.resolveGeminiBinary() != nil
|
||||
let geminiConfigured = FileManager.default.fileExists(
|
||||
atPath: FileManager.default.homeDirectoryForCurrentUser
|
||||
.appendingPathComponent(".gemini/oauth_creds.json").path)
|
||||
let antigravityRunning = await AntigravityStatusProbe.isRunning()
|
||||
let antigravityLoggedIn = FileManager.default.fileExists(
|
||||
atPath: AntigravityOAuthCredentialsStore().fileURL.path)
|
||||
let logger = CodexBarLog.logger(LogCategories.providerDetection)
|
||||
|
||||
let enabledProviders = ProviderDetectionPolicy.enabledProviders(signals: .init(
|
||||
codexCLIInstalled: codexCLIInstalled,
|
||||
claudeCLIInstalled: claudeCLIInstalled,
|
||||
claudeDesktopInstalled: claudeDesktopInstalled,
|
||||
geminiCLIInstalled: geminiCLIInstalled,
|
||||
geminiConfigured: geminiConfigured,
|
||||
antigravityAvailable: antigravityRunning || antigravityLoggedIn))
|
||||
|
||||
logger.info(
|
||||
"Provider detection results",
|
||||
metadata: [
|
||||
"codexCLIInstalled": codexCLIInstalled ? "1" : "0",
|
||||
"claudeCLIInstalled": claudeCLIInstalled ? "1" : "0",
|
||||
"claudeDesktopInstalled": claudeDesktopInstalled ? "1" : "0",
|
||||
"geminiCLIInstalled": geminiCLIInstalled ? "1" : "0",
|
||||
"geminiConfigured": geminiConfigured ? "1" : "0",
|
||||
"antigravityRunning": antigravityRunning ? "1" : "0",
|
||||
"antigravityLoggedIn": antigravityLoggedIn ? "1" : "0",
|
||||
])
|
||||
logger.info(
|
||||
"Provider detection enablement",
|
||||
metadata: [
|
||||
"codex": enabledProviders.contains(.codex) ? "1" : "0",
|
||||
"claude": enabledProviders.contains(.claude) ? "1" : "0",
|
||||
"gemini": enabledProviders.contains(.gemini) ? "1" : "0",
|
||||
"antigravity": enabledProviders.contains(.antigravity) ? "1" : "0",
|
||||
])
|
||||
|
||||
self.updateProviderConfig(provider: .codex) { entry in
|
||||
entry.enabled = enabledProviders.contains(.codex)
|
||||
}
|
||||
self.updateProviderConfig(provider: .claude) { entry in
|
||||
entry.enabled = enabledProviders.contains(.claude)
|
||||
}
|
||||
self.updateProviderConfig(provider: .gemini) { entry in
|
||||
entry.enabled = enabledProviders.contains(.gemini)
|
||||
}
|
||||
self.updateProviderConfig(provider: .antigravity) { entry in
|
||||
entry.enabled = enabledProviders.contains(.antigravity)
|
||||
}
|
||||
self.providerDetectionCompleted = true
|
||||
logger.info("Provider detection completed")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user