mirror of
https://github.com/hanzoai/bot.git
synced 2026-10-30 17:24:26 +00:00
Complete rename of all OpenClaw/OPENCLAW/openclaw references to Hanzo Bot/BOT/bot naming convention: - Env vars: OPENCLAW_* → BOT_* (18 patterns) - Config: ~/.openclaw/ → ~/.bot/, openclaw.json → bot.json - Packages: @openclaw/* → @hanzo/bot-* - Domains: openclaw.ai → hanzo.bot - Mobile: OpenClawKit → BotKit, bundle IDs ai.openclaw → ai.hanzo.bot - mDNS: _openclaw-gw._tcp → _bot-gw._tcp - Docker: CMD hanzo-bot.mjs, BOT_PREFER_PNPM, BOT_DOCKER_APT_PACKAGES - CI: docker-release.yml adds :latest tag on main branch
45 lines
1.7 KiB
Swift
45 lines
1.7 KiB
Swift
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] = ["hanzo-bot", "claude"]
|
|
static let maxWords = 32
|
|
static let maxWordLength = 64
|
|
|
|
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 }
|
|
.prefix(Self.maxWords)
|
|
.map { String($0.prefix(Self.maxWordLength)) }
|
|
return cleaned.isEmpty ? Self.defaultTriggerWords : cleaned
|
|
}
|
|
|
|
static func displayString(for words: [String]) -> String {
|
|
let sanitized = self.sanitizeTriggerWords(words)
|
|
return sanitized.joined(separator: ", ")
|
|
}
|
|
}
|