fix(presence): stabilize instance identity

This commit is contained in:
Peter Steinberger
2025-12-12 16:47:07 +00:00
parent 88936b6216
commit debcf19199
7 changed files with 93 additions and 12 deletions

View File

@@ -158,18 +158,19 @@ actor GatewayChannelActor {
let osVersion = ProcessInfo.processInfo.operatingSystemVersion
let platform = "macos \(osVersion.majorVersion).\(osVersion.minorVersion).\(osVersion.patchVersion)"
let primaryLocale = Locale.preferredLanguages.first ?? Locale.current.identifier
let clientName = InstanceIdentity.displayName
let hello = Hello(
type: "hello",
minprotocol: GATEWAY_PROTOCOL_VERSION,
maxprotocol: GATEWAY_PROTOCOL_VERSION,
client: [
"name": ClawdisProtocol.AnyCodable("clawdis-mac"),
"name": ClawdisProtocol.AnyCodable(clientName),
"version": ClawdisProtocol.AnyCodable(
Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "dev"),
"platform": ClawdisProtocol.AnyCodable(platform),
"mode": ClawdisProtocol.AnyCodable("app"),
"instanceId": ClawdisProtocol.AnyCodable(Host.current().localizedName ?? UUID().uuidString),
"instanceId": ClawdisProtocol.AnyCodable(InstanceIdentity.instanceId),
],
caps: [],
auth: self.token.map { ["token": ClawdisProtocol.AnyCodable($0)] },

View File

@@ -0,0 +1,22 @@
import Foundation
enum InstanceIdentity {
static let instanceId: String = {
if let name = Host.current().localizedName?.trimmingCharacters(in: .whitespacesAndNewlines),
!name.isEmpty
{
return name
}
return UUID().uuidString
}()
static let displayName: String = {
if let name = Host.current().localizedName?.trimmingCharacters(in: .whitespacesAndNewlines),
!name.isEmpty
{
return name
}
return "clawdis-mac"
}()
}

View File

@@ -290,7 +290,7 @@ final class InstancesStore: ObservableObject {
private func normalizePresence(_ entries: [PresenceEntry]) -> [InstanceInfo] {
entries.map { entry -> InstanceInfo in
let key = entry.host ?? entry.ip ?? entry.text ?? entry.instanceid ?? "entry-\(entry.ts)"
let key = entry.instanceid ?? entry.host ?? entry.ip ?? entry.text ?? "entry-\(entry.ts)"
return InstanceInfo(
id: key,
host: entry.host,

View File

@@ -10,7 +10,7 @@ final class PresenceReporter {
private let logger = Logger(subsystem: "com.steipete.clawdis", category: "presence")
private var task: Task<Void, Never>?
private let interval: TimeInterval = 180 // a few minutes
private let instanceId: String = Host.current().localizedName ?? UUID().uuidString
private let instanceId: String = InstanceIdentity.instanceId
func start() {
guard self.task == nil else { return }
@@ -32,7 +32,7 @@ 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 host = InstanceIdentity.displayName
let ip = Self.primaryIPv4Address() ?? "ip-unknown"
let version = Self.appVersionString()
let lastInput = Self.lastInputSeconds()
@@ -59,7 +59,7 @@ final class PresenceReporter {
}
private static func composePresenceSummary(mode: String, reason: String) -> String {
let host = Host.current().localizedName ?? "unknown-host"
let host = InstanceIdentity.displayName
let ip = Self.primaryIPv4Address() ?? "ip-unknown"
let version = Self.appVersionString()
let lastInput = Self.lastInputSeconds()