import Foundation import LiveKit /// Observes the agent participant's audio level for UI state inference. @MainActor final class AgentMonitor: ObservableObject { @Published private(set) var agentSpeaking = false @Published private(set) var localSpeaking = false private let session: VoiceSession private var pollTask: Task? init(session: VoiceSession) { self.session = session } func start() { stop() pollTask = Task { [weak self] in while !Task.isCancelled { guard let self else { return } let remote = self.session.room.remoteParticipants.values.first(where: { $0.kind == .agent || $0.identity?.stringValue == "voice-assistant" }) self.agentSpeaking = remote?.isSpeaking ?? false self.localSpeaking = self.session.room.localParticipant.isSpeaking try? await Task.sleep(for: .milliseconds(250)) } } } func stop() { pollTask?.cancel() pollTask = nil agentSpeaking = false localSpeaking = false } }