diff --git a/apps/macos/Sources/ClawdbotDiscovery/GatewayDiscoveryModel.swift b/apps/macos/Sources/ClawdbotDiscovery/GatewayDiscoveryModel.swift index 72a1a2517..cf38e6fbb 100644 --- a/apps/macos/Sources/ClawdbotDiscovery/GatewayDiscoveryModel.swift +++ b/apps/macos/Sources/ClawdbotDiscovery/GatewayDiscoveryModel.swift @@ -449,10 +449,10 @@ public final class GatewayDiscoveryModel { { return true } - if let service = normalizeServiceToken(serviceName) { - for token in local.hostTokens where service.contains(token) { - return true - } + if let serviceHost = normalizeServiceHostToken(serviceName), + local.hostTokens.contains(serviceHost) + { + return true } return false } @@ -542,11 +542,14 @@ public final class GatewayDiscoveryModel { return trimmed.lowercased() } - private nonisolated static func normalizeServiceToken(_ raw: String?) -> String? { + private nonisolated static func normalizeServiceHostToken(_ raw: String?) -> String? { guard let raw else { return nil } - let trimmed = raw.trimmingCharacters(in: .whitespacesAndNewlines) - if trimmed.isEmpty { return nil } - return trimmed.lowercased() + let prettified = Self.prettifyInstanceName(raw) + let strippedBridge = prettified.replacingOccurrences( + of: #"\s*-?\s*bridge$"#, + with: "", + options: .regularExpression) + return normalizeHostToken(strippedBridge) } } diff --git a/apps/macos/Sources/ClawdbotDiscovery/WideAreaGatewayDiscovery.swift b/apps/macos/Sources/ClawdbotDiscovery/WideAreaGatewayDiscovery.swift index f541070b9..44acb98ff 100644 --- a/apps/macos/Sources/ClawdbotDiscovery/WideAreaGatewayDiscovery.swift +++ b/apps/macos/Sources/ClawdbotDiscovery/WideAreaGatewayDiscovery.swift @@ -202,7 +202,7 @@ enum WideAreaGatewayDiscovery { } process.waitUntilExit() - let data = outPipe.fileHandleForReading.readDataToEndOfFile() + let data = (try? outPipe.fileHandleForReading.readToEnd()) ?? Data() let output = String(data: data, encoding: .utf8)?.trimmingCharacters(in: .whitespacesAndNewlines) return output?.isEmpty == false ? output : nil } diff --git a/apps/macos/Tests/ClawdbotIPCTests/GatewayDiscoveryModelTests.swift b/apps/macos/Tests/ClawdbotIPCTests/GatewayDiscoveryModelTests.swift index c585db438..214cb7390 100644 --- a/apps/macos/Tests/ClawdbotIPCTests/GatewayDiscoveryModelTests.swift +++ b/apps/macos/Tests/ClawdbotIPCTests/GatewayDiscoveryModelTests.swift @@ -64,6 +64,24 @@ struct GatewayDiscoveryModelTests { local: local)) } + @Test func serviceNameDoesNotFalsePositiveOnSubstringHostToken() { + let local = GatewayDiscoveryModel.LocalIdentity( + hostTokens: ["steipete"], + displayTokens: []) + #expect(!GatewayDiscoveryModel.isLocalGateway( + lanHost: nil, + tailnetDns: nil, + displayName: nil, + serviceName: "steipetacstudio (Clawdbot)", + local: local)) + #expect(GatewayDiscoveryModel.isLocalGateway( + lanHost: nil, + tailnetDns: nil, + displayName: nil, + serviceName: "steipete (Clawdbot)", + local: local)) + } + @Test func parsesGatewayTXTFields() { let parsed = GatewayDiscoveryModel.parseGatewayTXT([ "lanHost": " studio.local ",