102 lines · 3.8 KB · Swift
RawDownload
import CodexBarCoreimport Foundationimport SwiftUI struct AntigravityProviderImplementation: ProviderImplementation {    let id: UsageProvider = .antigravity    let supportsLoginFlow: Bool = true     @MainActor    func observeSettings(_ settings: SettingsStore) {        _ = settings.antigravityUsageDataSource        _ = settings.tokenAccountsData(for: .antigravity)    }     @MainActor    func defaultSourceLabel(context: ProviderSourceLabelContext) -> String? {        context.settings.antigravityUsageDataSource.rawValue    }     @MainActor    func sourceMode(context: ProviderSourceModeContext) -> ProviderSourceMode {        switch context.settings.antigravityUsageDataSource {        case .auto: .auto        case .oauth: .oauth        case .cli: .cli        }    }     @MainActor    func settingsPickers(context: ProviderSettingsContext) -> [ProviderSettingsPickerDescriptor] {        let usageBinding = Binding(            get: { context.settings.antigravityUsageDataSource.rawValue },            set: { raw in                context.settings.antigravityUsageDataSource = AntigravityUsageDataSource(rawValue: raw) ?? .auto            })        let usageOptions = AntigravityUsageDataSource.allCases.map {            ProviderSettingsPickerOption(id: $0.rawValue, title: $0.displayName)        }        return [            ProviderSettingsPickerDescriptor(                id: "antigravity-usage-source",                title: "Usage source",                subtitle: "Auto tries Antigravity app, agy CLI, then IDE; " +                    "OAuth follows for selected or signed-in accounts.",                binding: usageBinding,                options: usageOptions,                isVisible: nil,                onChange: nil,                trailingText: {                    guard context.settings.antigravityUsageDataSource == .auto else { return nil }                    let label = context.store.sourceLabel(for: .antigravity)                    return label == "auto" ? nil : label                }),        ]    }     @MainActor    func settingsActions(context: ProviderSettingsContext) -> [ProviderSettingsActionsDescriptor] {        let accountCount = context.settings.tokenAccounts(for: .antigravity).count        let loginTitle = accountCount > 0 ? "Add Google Account" : "Login with Google"        let subtitle = """        Stores each signed-in Google account for quick Antigravity switching. \        Uses Antigravity.app OAuth when available, \        or ANTIGRAVITY_OAUTH_CLIENT_ID and ANTIGRAVITY_OAUTH_CLIENT_SECRET as an override.        """        return [            ProviderSettingsActionsDescriptor(                id: "antigravity-oauth",                title: "Google OAuth",                subtitle: subtitle,                actions: [                    ProviderSettingsActionDescriptor(                        id: "antigravity-oauth-login",                        title: loginTitle,                        style: .bordered,                        isVisible: nil,                        perform: {                            await context.runLoginFlow()                        }),                ],                isVisible: nil),        ]    }     func detectVersion(context _: ProviderVersionContext) async -> String? {        await AntigravityStatusProbe.detectVersion()    }     @MainActor    func appendUsageMenuEntries(context _: ProviderMenuUsageContext, entries _: inout [ProviderMenuEntry]) {}     @MainActor    func loginMenuAction(context _: ProviderMenuLoginContext) -> (label: String, action: MenuDescriptor.MenuAction)? {        ("Add Account...", .switchAccount(.antigravity))    }     @MainActor    func runLoginFlow(context: ProviderLoginContext) async -> Bool {        await context.controller.runAntigravityLoginFlow()        return false    }}