From 509215e93584a3a9eb97eba41a788fcef237b643 Mon Sep 17 00:00:00 2001 From: Wes Date: Thu, 15 Jan 2026 16:55:26 -0800 Subject: [PATCH] macOS: stop flapping gateway port --- apps/macos/Sources/Clawdbot/GatewayProcessManager.swift | 8 ++++++++ apps/macos/Sources/Clawdbot/PortGuardian.swift | 5 +++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/apps/macos/Sources/Clawdbot/GatewayProcessManager.swift b/apps/macos/Sources/Clawdbot/GatewayProcessManager.swift index 9dc71d690..7a3eeb593 100644 --- a/apps/macos/Sources/Clawdbot/GatewayProcessManager.swift +++ b/apps/macos/Sources/Clawdbot/GatewayProcessManager.swift @@ -87,6 +87,14 @@ final class GatewayProcessManager { self.status = .stopped return } + // Many surfaces can call `setActive(true)` in quick succession (startup, Canvas, health checks). + // Avoid spawning multiple concurrent "start" tasks that can thrash launchd and flap the port. + switch self.status { + case .starting, .running, .attachedExisting: + return + case .stopped, .failed: + break + } self.status = .starting self.logger.debug("gateway start requested") diff --git a/apps/macos/Sources/Clawdbot/PortGuardian.swift b/apps/macos/Sources/Clawdbot/PortGuardian.swift index 551f514fa..925e6e527 100644 --- a/apps/macos/Sources/Clawdbot/PortGuardian.swift +++ b/apps/macos/Sources/Clawdbot/PortGuardian.swift @@ -351,10 +351,11 @@ actor PortGuardian { if port == GatewayEnvironment.gatewayPort() { return cmd.contains("ssh") } return false case .local: - if !cmd.contains("clawdbot") { return false } + // The gateway daemon may listen as `clawdbot` or as its runtime (`node`, `bun`, etc). if full.contains("gateway-daemon") { return true } // If args are unavailable, treat a clawdbot listener as expected. - return full == cmd + if cmd.contains("clawdbot"), full == cmd { return true } + return false case .unconfigured: return false }