import Foundation enum VoiceWakePreferences { static let enabledKey = "voiceWake.enabled" static let triggerWordsKey = "voiceWake.triggerWords" // Keep defaults aligned with the mac app. static let defaultTriggerWords: [String] = ["clawd", "claude"] static func decodeGatewayTriggers(from payloadJSON: String) -> [String]? { guard let data = payloadJSON.data(using: .utf8) else { return nil } return self.decodeGatewayTriggers(from: data) } static func decodeGatewayTriggers(from data: Data) -> [String]? { struct Payload: Decodable { var triggers: [String] } guard let decoded = try? JSONDecoder().decode(Payload.self, from: data) else { return nil } return self.sanitizeTriggerWords(decoded.triggers) } static func loadTriggerWords(defaults: UserDefaults = .standard) -> [String] { defaults.stringArray(forKey: self.triggerWordsKey) ?? self.defaultTriggerWords } static func saveTriggerWords(_ words: [String], defaults: UserDefaults = .standard) { defaults.set(words, forKey: self.triggerWordsKey) } static func sanitizeTriggerWords(_ words: [String]) -> [String] { let cleaned = words .map { $0.trimmingCharacters(in: .whitespacesAndNewlines) } .filter { !$0.isEmpty } return cleaned.isEmpty ? Self.defaultTriggerWords : cleaned } static func displayString(for words: [String]) -> String { let sanitized = self.sanitizeTriggerWords(words) return sanitized.joined(separator: ", ") } }