From 515e9739644ab356ef0d4c68ae4c2c13d6024a22 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sat, 6 Dec 2025 23:31:43 +0000 Subject: [PATCH] Mac: fix permission prompt crash --- apps/macos/Sources/Clawdis/PermissionManager.swift | 14 +++++++------- apps/macos/Sources/Clawdis/XPCService.swift | 6 +++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/apps/macos/Sources/Clawdis/PermissionManager.swift b/apps/macos/Sources/Clawdis/PermissionManager.swift index c7c557b20..8e8eab974 100644 --- a/apps/macos/Sources/Clawdis/PermissionManager.swift +++ b/apps/macos/Sources/Clawdis/PermissionManager.swift @@ -8,7 +8,6 @@ import Speech import UserNotifications enum PermissionManager { - @MainActor static func ensure(_ caps: [Capability], interactive: Bool) async -> [Capability: Bool] { var results: [Capability: Bool] = [:] for cap in caps { @@ -43,11 +42,13 @@ enum PermissionManager { } case .accessibility: - let trusted = AXIsProcessTrusted() + let trusted = await MainActor.run { AXIsProcessTrusted() } results[cap] = trusted if interactive, !trusted { - let opts: NSDictionary = ["AXTrustedCheckOptionPrompt": true] - _ = AXIsProcessTrustedWithOptions(opts) + await MainActor.run { + let opts: NSDictionary = ["AXTrustedCheckOptionPrompt": true] + _ = AXIsProcessTrustedWithOptions(opts) + } } case .screenRecording: @@ -81,7 +82,6 @@ enum PermissionManager { return results } - @MainActor static func status(_ caps: [Capability] = Capability.allCases) async -> [Capability: Bool] { var results: [Capability: Bool] = [:] for cap in caps { @@ -93,7 +93,7 @@ enum PermissionManager { || settings.authorizationStatus == .provisional case .accessibility: - results[cap] = AXIsProcessTrusted() + results[cap] = await MainActor.run { AXIsProcessTrusted() } case .screenRecording: if #available(macOS 10.15, *) { @@ -184,12 +184,12 @@ final class PermissionMonitor: ObservableObject { } self.isChecking = true - self.lastCheck = now let latest = await PermissionManager.status() if latest != self.status { self.status = latest } + self.lastCheck = Date() self.isChecking = false } diff --git a/apps/macos/Sources/Clawdis/XPCService.swift b/apps/macos/Sources/Clawdis/XPCService.swift index a93a0233f..3002c525a 100644 --- a/apps/macos/Sources/Clawdis/XPCService.swift +++ b/apps/macos/Sources/Clawdis/XPCService.swift @@ -11,16 +11,16 @@ final class ClawdisXPCService: NSObject, ClawdisXPCProtocol { func handle(_ data: Data, withReply reply: @escaping @Sendable (Data?, Error?) -> Void) { let logger = logger - Task.detached(priority: nil) { @Sendable in + Task.detached { @Sendable in do { let request = try JSONDecoder().decode(Request.self, from: data) let response = try await Self.process(request: request, notifier: NotificationManager(), logger: logger) let encoded = try JSONEncoder().encode(response) - reply(encoded, nil) + await MainActor.run { reply(encoded, nil) } } catch { logger.error("Failed to handle XPC request: \(error.localizedDescription, privacy: .public)") let resp = Response(ok: false, message: "decode/handle error: \(error.localizedDescription)") - reply(try? JSONEncoder().encode(resp), error) + await MainActor.run { reply(try? JSONEncoder().encode(resp), error) } } } }