Merge remote-tracking branch 'origin/main'
This commit is contained in:
@@ -67,12 +67,27 @@ enum PermissionManager {
|
||||
results[cap] = ScreenRecordingProbe.isAuthorized()
|
||||
|
||||
case .microphone:
|
||||
let granted = AVCaptureDevice.authorizationStatus(for: .audio) == .authorized
|
||||
if interactive, !granted {
|
||||
let ok = await AVCaptureDevice.requestAccess(for: .audio)
|
||||
results[cap] = ok
|
||||
} else {
|
||||
results[cap] = granted
|
||||
let status = AVCaptureDevice.authorizationStatus(for: .audio)
|
||||
switch status {
|
||||
case .authorized:
|
||||
results[cap] = true
|
||||
|
||||
case .notDetermined:
|
||||
if interactive {
|
||||
let ok = await AVCaptureDevice.requestAccess(for: .audio)
|
||||
results[cap] = ok
|
||||
} else {
|
||||
results[cap] = false
|
||||
}
|
||||
|
||||
case .denied, .restricted:
|
||||
results[cap] = false
|
||||
if interactive {
|
||||
MicrophonePermissionHelper.openSettings()
|
||||
}
|
||||
|
||||
@unknown default:
|
||||
results[cap] = false
|
||||
}
|
||||
|
||||
case .speechRecognition:
|
||||
@@ -150,6 +165,21 @@ enum NotificationPermissionHelper {
|
||||
}
|
||||
}
|
||||
|
||||
enum MicrophonePermissionHelper {
|
||||
static func openSettings() {
|
||||
let candidates = [
|
||||
"x-apple.systempreferences:com.apple.preference.security?Privacy_Microphone",
|
||||
"x-apple.systempreferences:com.apple.preference.security",
|
||||
]
|
||||
|
||||
for candidate in candidates {
|
||||
if let url = URL(string: candidate), NSWorkspace.shared.open(url) {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
enum AppleScriptPermission {
|
||||
private static let logger = Logger(subsystem: "com.steipete.clawdis", category: "AppleScriptPermission")
|
||||
|
||||
|
||||
@@ -388,11 +388,19 @@ final class WebChatWindowController: NSWindowController, WKNavigationDelegate, N
|
||||
}
|
||||
|
||||
func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
|
||||
if Self.shouldIgnoreNavigationError(error) {
|
||||
webChatLogger.debug("webchat navigation cancelled (provisional)")
|
||||
return
|
||||
}
|
||||
webChatLogger.error("webchat navigation failed (provisional): \(error.localizedDescription, privacy: .public)")
|
||||
self.showError(error.localizedDescription)
|
||||
}
|
||||
|
||||
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
|
||||
if Self.shouldIgnoreNavigationError(error) {
|
||||
webChatLogger.debug("webchat navigation cancelled")
|
||||
return
|
||||
}
|
||||
webChatLogger.error("webchat navigation failed: \(error.localizedDescription, privacy: .public)")
|
||||
self.showError(error.localizedDescription)
|
||||
}
|
||||
@@ -483,6 +491,11 @@ final class WebChatWindowController: NSWindowController, WKNavigationDelegate, N
|
||||
if let url = Bundle.module.url(forResource: "WebChat", withExtension: nil) { return url }
|
||||
throw NSError(domain: "WebChat", code: 10, userInfo: [NSLocalizedDescriptionKey: "WebChat assets missing"])
|
||||
}
|
||||
|
||||
private static func shouldIgnoreNavigationError(_ error: Error) -> Bool {
|
||||
let ns = error as NSError
|
||||
return ns.domain == NSURLErrorDomain && ns.code == NSURLErrorCancelled
|
||||
}
|
||||
}
|
||||
|
||||
extension WebChatWindowController {
|
||||
|
||||
Reference in New Issue
Block a user