feat: surface mic and speech permissions
This commit is contained in:
@@ -209,6 +209,24 @@ enum PermissionManager {
|
|||||||
await ScreenRecordingProbe.requestAuthorization()
|
await ScreenRecordingProbe.requestAuthorization()
|
||||||
}
|
}
|
||||||
results[cap] = ScreenRecordingProbe.isAuthorized()
|
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
|
||||||
|
}
|
||||||
|
case .speechRecognition:
|
||||||
|
let status = SFSpeechRecognizer.authorizationStatus()
|
||||||
|
if status == .notDetermined && interactive {
|
||||||
|
let ok = await withCheckedContinuation { cont in
|
||||||
|
SFSpeechRecognizer.requestAuthorization { auth in cont.resume(returning: auth == .authorized) }
|
||||||
|
}
|
||||||
|
results[cap] = ok
|
||||||
|
} else {
|
||||||
|
results[cap] = status == .authorized
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return results
|
return results
|
||||||
@@ -231,6 +249,10 @@ enum PermissionManager {
|
|||||||
} else {
|
} else {
|
||||||
results[cap] = true
|
results[cap] = true
|
||||||
}
|
}
|
||||||
|
case .microphone:
|
||||||
|
results[cap] = AVCaptureDevice.authorizationStatus(for: .audio) == .authorized
|
||||||
|
case .speechRecognition:
|
||||||
|
results[cap] = SFSpeechRecognizer.authorizationStatus() == .authorized
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return results
|
return results
|
||||||
@@ -1877,6 +1899,10 @@ struct PermissionStatusList: View {
|
|||||||
openSettings("x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility")
|
openSettings("x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility")
|
||||||
case .screenRecording:
|
case .screenRecording:
|
||||||
openSettings("x-apple.systempreferences:com.apple.preference.security?Privacy_ScreenRecording")
|
openSettings("x-apple.systempreferences:com.apple.preference.security?Privacy_ScreenRecording")
|
||||||
|
case .microphone:
|
||||||
|
openSettings("x-apple.systempreferences:com.apple.preference.security?Privacy_Microphone")
|
||||||
|
case .speechRecognition:
|
||||||
|
openSettings("x-apple.systempreferences:com.apple.preference.security?Privacy_SpeechRecognition")
|
||||||
}
|
}
|
||||||
await refresh()
|
await refresh()
|
||||||
}
|
}
|
||||||
@@ -1967,6 +1993,8 @@ private struct PermissionRow: View {
|
|||||||
case .notifications: return "Notifications"
|
case .notifications: return "Notifications"
|
||||||
case .accessibility: return "Accessibility"
|
case .accessibility: return "Accessibility"
|
||||||
case .screenRecording: return "Screen Recording"
|
case .screenRecording: return "Screen Recording"
|
||||||
|
case .microphone: return "Microphone"
|
||||||
|
case .speechRecognition: return "Speech Recognition"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1975,6 +2003,8 @@ private struct PermissionRow: View {
|
|||||||
case .notifications: return "Show desktop alerts for agent activity"
|
case .notifications: return "Show desktop alerts for agent activity"
|
||||||
case .accessibility: return "Control UI elements when an action requires it"
|
case .accessibility: return "Control UI elements when an action requires it"
|
||||||
case .screenRecording: return "Capture the screen for context or screenshots"
|
case .screenRecording: return "Capture the screen for context or screenshots"
|
||||||
|
case .microphone: return "Allow Voice Wake and audio capture"
|
||||||
|
case .speechRecognition: return "Transcribe Voice Wake trigger phrases on-device"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1983,6 +2013,8 @@ private struct PermissionRow: View {
|
|||||||
case .notifications: return "bell"
|
case .notifications: return "bell"
|
||||||
case .accessibility: return "hand.raised"
|
case .accessibility: return "hand.raised"
|
||||||
case .screenRecording: return "display"
|
case .screenRecording: return "display"
|
||||||
|
case .microphone: return "mic"
|
||||||
|
case .speechRecognition: return "waveform"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ public enum Capability: String, Codable, CaseIterable, Sendable {
|
|||||||
case notifications
|
case notifications
|
||||||
case accessibility
|
case accessibility
|
||||||
case screenRecording
|
case screenRecording
|
||||||
|
case microphone
|
||||||
|
case speechRecognition
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Requests
|
// MARK: - Requests
|
||||||
@@ -111,4 +113,3 @@ extension Request: Codable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user