import Foundation import MacToolsPluginKit struct LaunchControlScanResult: Sendable { let items: [LaunchControlItem] let warnings: [String] } struct LaunchControlScanner: @unchecked Sendable { private struct LaunchDirectory: Sendable { let url: URL let scope: LaunchControlScope let domain: String } private let fileManager: FileManager private let runner: any LaunchControlCommandRunning private let userIDProvider: @Sendable () -> uid_t private let localization: PluginLocalization init( fileManager: FileManager = .default, runner: any LaunchControlCommandRunning = ProcessLaunchControlCommandRunner(), userIDProvider: @escaping @Sendable () -> uid_t = { getuid() }, localization: PluginLocalization = PluginLocalization(bundle: .main) ) { self.fileManager = fileManager self.runner = runner self.userIDProvider = userIDProvider self.localization = localization } func scan(progress: @escaping @Sendable (LaunchControlScanEvent) -> Void = { _ in }) -> LaunchControlScanResult { let userID = userIDProvider() let userDomain = "gui/\(userID)" let directories = launchDirectories(userDomain: userDomain) var warnings: [String] = [] progress(.message(localization.string("scanner.progress.disabledState", defaultValue: "读取 launchctl 禁用状态"))) let disabledLabelsByDomain = loadDisabledLabels(domains: Set(directories.map(\.domain))) // Fetch the whole user GUI domain in ONE `launchctl list` instead of one // `launchctl print gui//