From 9b8ae62399a75740c983754b120f85d294575613 Mon Sep 17 00:00:00 2001 From: Nima Karimi Date: Thu, 15 Jan 2026 14:04:54 +0000 Subject: [PATCH] macOS: prefer bridge tunnel port in remote mode --- CHANGELOG.md | 21 +++++++++++++++++++ .../NodeMode/MacNodeModeCoordinator.swift | 16 +++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61183c1ae..ee5593a07 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -86,7 +86,28 @@ - UI: use application-defined WebSocket close code (browser compatibility). (#918) — thanks @rahthakor. - TUI: render picker overlays via the overlay stack so /models and /settings display. (#921) — thanks @grizzdank. - TUI: add a bright spinner + elapsed time in the status line for send/stream/run states. +- TUI: show LLM error messages (rate limits, auth, etc.) instead of `(no output)`. - Gateway/Dev: ensure `pnpm gateway:dev` always uses the dev profile config + state (`~/.clawdbot-dev`). + +#### Agents / Auth / Tools / Sandbox +- Agents: make user time zone and 24-hour time explicit in the system prompt. (#859) — thanks @CashWilliams. +- Agents: strip downgraded tool call text without eating adjacent replies and filter thinking-tag leaks. (#905) — thanks @erikpr1994. +- Agents: cap tool call IDs for OpenAI/OpenRouter to avoid request rejections. (#875) — thanks @j1philli. +- Agents: scrub tuple `items` schemas for Gemini tool calls. (#926, fixes #746) — thanks @grp06. +- Agents: stabilize sub-agent announce status from runtime outcomes and normalize Result/Notes. (#835) — thanks @roshanasingh4. +- Auth: normalize Claude Code CLI profile mode to oauth and auto-migrate config. (#855) — thanks @sebslight. +- Embedded runner: suppress raw API error payloads from replies. (#924) — thanks @grp06. +- Logging: tolerate `EIO` from console writes to avoid gateway crashes. (#925, fixes #878) — thanks @grp06. +- Sandbox: restore `docker.binds` config validation and preserve configured PATH for `docker exec`. (#873) — thanks @akonyer. +- Google: downgrade unsigned thinking blocks before send to avoid missing signature errors. + +#### macOS / Apps +- macOS: ensure launchd log directory exists with a test-only override. (#909) — thanks @roshanasingh4. +- macOS: format ConnectionsStore config to satisfy SwiftFormat lint. (#852) — thanks @mneves75. +- macOS: pass auth token/password to dashboard URL for authenticated access. (#918) — thanks @rahthakor. +- macOS: reuse launchd gateway auth and skip wizard when gateway config already exists. (#917) +- macOS: prefer the default bridge tunnel port in remote mode for node bridge connectivity; document SSH tunnel/bridge ports. (#960, fixes #865) — thanks @kkarimi. +- Apps: use canonical main session keys from gateway defaults across macOS/iOS/Android to avoid creating bare `main` sessions. - macOS: fix cron preview/testing payload to use `channel` key. (#867) — thanks @wes-davis. - Telegram: honor `channels.telegram.timeoutSeconds` for grammY API requests. (#863) — thanks @Snaver. - Telegram: split long captions into media + follow-up text messages. (#907) - thanks @jalehman. diff --git a/apps/macos/Sources/Clawdbot/NodeMode/MacNodeModeCoordinator.swift b/apps/macos/Sources/Clawdbot/NodeMode/MacNodeModeCoordinator.swift index 9a4975525..877498a9b 100644 --- a/apps/macos/Sources/Clawdbot/NodeMode/MacNodeModeCoordinator.swift +++ b/apps/macos/Sources/Clawdbot/NodeMode/MacNodeModeCoordinator.swift @@ -312,9 +312,23 @@ final class MacNodeModeCoordinator { } let remotePort = Self.remoteBridgePort() + let preferredLocalPort = Self.loopbackBridgePort() + if let preferredLocalPort { + self.logger.info( + "mac node bridge tunnel starting " + + "preferredLocalPort=\(preferredLocalPort, privacy: .public) " + + "remotePort=\(remotePort, privacy: .public)") + } else { + self.logger.info( + "mac node bridge tunnel starting " + + "preferredLocalPort=none " + + "remotePort=\(remotePort, privacy: .public)") + } self.tunnel = try await RemotePortTunnel.create( remotePort: remotePort, - allowRemoteUrlOverride: false) + preferredLocalPort: preferredLocalPort, + allowRemoteUrlOverride: false, + allowRandomLocalPort: true) if let localPort = self.tunnel?.localPort, let port = NWEndpoint.Port(rawValue: localPort) {