From 9e4a7b54965869e6955e2ca667c5fcc89ecafe16 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sun, 8 Mar 2026 13:47:12 +0000 Subject: [PATCH] fix: land mac overlay exclusivity fix (#39321) (thanks @fellanH) --- CHANGELOG.md | 1 + .../OpenClawIPCTests/LowCoverageViewSmokeTests.swift | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b78de9fa2ce..3cb51282aa9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ Docs: https://docs.openclaw.ai - Mattermost replies: keep `root_id` pinned to the existing thread root when an agent replies inside a thread, while still using reply-target threading for top-level posts. (#27744) thanks @hnykda. - Agents/failover: detect Amazon Bedrock `Too many tokens per day` quota errors as rate limits across fallback, cron retry, and memory embeddings while keeping context-window `too many tokens per request` errors out of the rate-limit lane. (#39377) Thanks @gambletan. - Android/Play distribution: remove self-update, background location, `screen.record`, and background mic capture from the Android app, narrow the foreground service to `dataSync` only, and clean up the legacy `location.enabledMode=always` preference migration. (#39660) Thanks @obviyus. +- macOS overlays: fix VoiceWake, Talk, and Notify overlay exclusivity crashes by removing shared `inout` visibility mutation from `OverlayPanelFactory.present`, and add a repeated Talk overlay smoke test. (#39275, #39321) Thanks @fellanH. ## 2026.3.7 diff --git a/apps/macos/Tests/OpenClawIPCTests/LowCoverageViewSmokeTests.swift b/apps/macos/Tests/OpenClawIPCTests/LowCoverageViewSmokeTests.swift index 0526e287b02..4d8e5839d51 100644 --- a/apps/macos/Tests/OpenClawIPCTests/LowCoverageViewSmokeTests.swift +++ b/apps/macos/Tests/OpenClawIPCTests/LowCoverageViewSmokeTests.swift @@ -66,6 +66,15 @@ struct LowCoverageViewSmokeTests { try? await Task.sleep(nanoseconds: 250_000_000) } + @Test func `talk overlay presents twice and dismisses`() async { + let controller = TalkOverlayController() + controller.present() + controller.updateLevel(0.4) + controller.present() + controller.dismiss() + try? await Task.sleep(nanoseconds: 250_000_000) + } + @Test func `visual effect view hosts in NS hosting view`() { let hosting = NSHostingView(rootView: VisualEffectView(material: .sidebar)) _ = hosting.fittingSize