Files
openclaw/apps/macos/Sources/OpenClaw/SpeechRecognitionRequestPolicy.swift
Peter Steinberger c84921634d fix(macos): require explicit consent for privacy-sensitive access (#112321)
* fix(macos): avoid passive Automation prompts

* fix(macos): keep Voice Wake recognition on device

* fix(macos): require consent for activity presence

* chore(apps): refresh native i18n inventory

* fix(macos): preserve presence clears across gateway versions

* fix(macos): prioritize activity privacy opt-out

* chore(apps): refresh native i18n inventory

* fix(macos): scrub legacy presence activity

* fix(macos): migrate permission status caller

* fix(macos): preserve unknown permission state

* fix(macos): refresh privacy change artifacts

* refactor(macos): remove stale presence helper

* fix(deps): patch URI and Jaeger advisories

* test(gateway): adopt pairing-bound node sessions
2026-07-21 15:28:13 -07:00

43 lines
1.4 KiB
Swift

import Foundation
import Speech
enum SpeechRecognitionRequestPolicy {
enum PolicyError: LocalizedError, Equatable {
case onDeviceRecognitionUnavailable
var errorDescription: String? {
switch self {
case .onDeviceRecognitionUnavailable:
"On-device speech recognition is unavailable for this language on this Mac."
}
}
}
static func configurePassiveVoiceWake(
_ request: SFSpeechAudioBufferRecognitionRequest,
supportsOnDeviceRecognition: Bool) throws
{
guard supportsOnDeviceRecognition else {
throw PolicyError.onDeviceRecognitionUnavailable
}
self.configureCommon(request)
request.requiresOnDeviceRecognition = true
}
static func configureInteractiveTranscription(_ request: SFSpeechAudioBufferRecognitionRequest) {
self.configureCommon(request)
request.requiresOnDeviceRecognition = false
}
static func supportsPassiveVoiceWake(localeID: String?) -> Bool {
let locale = localeID.flatMap { Locale(identifier: $0) }
?? Locale(identifier: Locale.current.identifier)
return SFSpeechRecognizer(locale: locale)?.supportsOnDeviceRecognition == true
}
private static func configureCommon(_ request: SFSpeechAudioBufferRecognitionRequest) {
request.shouldReportPartialResults = true
request.taskHint = .dictation
}
}