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
40 lines
1.0 KiB
Swift
40 lines
1.0 KiB
Swift
import Foundation
|
|
import Observation
|
|
import SwiftUI
|
|
|
|
@MainActor
|
|
@Observable
|
|
final class HeartbeatStore {
|
|
static let shared = HeartbeatStore()
|
|
|
|
private(set) var lastEvent: ControlHeartbeatEvent?
|
|
|
|
private var observer: NSObjectProtocol?
|
|
|
|
private init() {
|
|
self.observer = NotificationCenter.default.addObserver(
|
|
forName: .controlHeartbeat,
|
|
object: nil,
|
|
queue: .main)
|
|
{ [weak self] note in
|
|
guard let data = note.object as? Data else { return }
|
|
if let decoded = try? JSONDecoder().decode(ControlHeartbeatEvent.self, from: data) {
|
|
Task { @MainActor in self?.lastEvent = decoded }
|
|
}
|
|
}
|
|
|
|
Task {
|
|
if self.lastEvent == nil {
|
|
if let evt = try? await ControlChannel.shared.lastHeartbeat() {
|
|
self.lastEvent = evt
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@MainActor
|
|
deinit {
|
|
if let observer { NotificationCenter.default.removeObserver(observer) }
|
|
}
|
|
}
|