diff --git a/apps/macos/Sources/Clawdis/ControlChannel.swift b/apps/macos/Sources/Clawdis/ControlChannel.swift index c11da2f56..f95252317 100644 --- a/apps/macos/Sources/Clawdis/ControlChannel.swift +++ b/apps/macos/Sources/Clawdis/ControlChannel.swift @@ -184,8 +184,10 @@ final class ControlChannel: ObservableObject { return "Gateway error: \(detail)" } - func sendSystemEvent(_ text: String) async throws { - _ = try await self.request(method: "system-event", params: ["text": AnyHashable(text)]) + func sendSystemEvent(_ text: String, params: [String: AnyHashable] = [:]) async throws { + var merged = params + merged["text"] = AnyHashable(text) + _ = try await self.request(method: "system-event", params: merged) } private func startEventStream() { diff --git a/apps/macos/Sources/Clawdis/PresenceReporter.swift b/apps/macos/Sources/Clawdis/PresenceReporter.swift index 29708e354..426708195 100644 --- a/apps/macos/Sources/Clawdis/PresenceReporter.swift +++ b/apps/macos/Sources/Clawdis/PresenceReporter.swift @@ -10,6 +10,7 @@ final class PresenceReporter { private let logger = Logger(subsystem: "com.steipete.clawdis", category: "presence") private var task: Task? private let interval: TimeInterval = 180 // a few minutes + private let instanceId: String = Host.current().localizedName ?? UUID().uuidString func start() { guard self.task == nil else { return } @@ -31,9 +32,22 @@ final class PresenceReporter { @Sendable private func push(reason: String) async { let mode = await MainActor.run { AppStateStore.shared.connectionMode.rawValue } + let host = Host.current().localizedName ?? "unknown-host" + let ip = Self.primaryIPv4Address() ?? "ip-unknown" + let version = Self.appVersionString() + let lastInput = Self.lastInputSeconds() let text = Self.composePresenceSummary(mode: mode, reason: reason) + var params: [String: AnyHashable] = [ + "instanceId": AnyHashable(self.instanceId), + "host": AnyHashable(host), + "ip": AnyHashable(ip), + "mode": AnyHashable(mode), + "version": AnyHashable(version), + "reason": AnyHashable(reason), + ] + if let lastInput { params["lastInputSeconds"] = AnyHashable(lastInput) } do { - try await ControlChannel.shared.sendSystemEvent(text) + try await ControlChannel.shared.sendSystemEvent(text, params: params) } catch { self.logger.error("presence send failed: \(error.localizedDescription, privacy: .public)") }