diff --git a/apps/macos/Sources/OpenClaw/GatewayConnection.swift b/apps/macos/Sources/OpenClaw/GatewayConnection.swift index 1ec076b1e6e..f08b04944b4 100644 --- a/apps/macos/Sources/OpenClaw/GatewayConnection.swift +++ b/apps/macos/Sources/OpenClaw/GatewayConnection.swift @@ -16,7 +16,6 @@ enum GatewayAgentChannel: String, Codable, CaseIterable { case signal case imessage case msteams - case bluebubbles case webchat init(raw: String?) { diff --git a/apps/macos/Tests/OpenClawIPCTests/GatewayAgentChannelTests.swift b/apps/macos/Tests/OpenClawIPCTests/GatewayAgentChannelTests.swift index 9a80d9e6b5e..10194f6154a 100644 --- a/apps/macos/Tests/OpenClawIPCTests/GatewayAgentChannelTests.swift +++ b/apps/macos/Tests/OpenClawIPCTests/GatewayAgentChannelTests.swift @@ -12,7 +12,7 @@ struct GatewayAgentChannelTests { #expect(GatewayAgentChannel.whatsapp.shouldDeliver(true) == true) #expect(GatewayAgentChannel.telegram.shouldDeliver(true) == true) #expect(GatewayAgentChannel.googlechat.shouldDeliver(true) == true) - #expect(GatewayAgentChannel.bluebubbles.shouldDeliver(true) == true) + #expect(GatewayAgentChannel.imessage.shouldDeliver(true) == true) #expect(GatewayAgentChannel.last.shouldDeliver(false) == false) } @@ -21,7 +21,7 @@ struct GatewayAgentChannelTests { #expect(GatewayAgentChannel(raw: " ") == .last) #expect(GatewayAgentChannel(raw: "WEBCHAT") == .webchat) #expect(GatewayAgentChannel(raw: "googlechat") == .googlechat) - #expect(GatewayAgentChannel(raw: "BLUEBUBBLES") == .bluebubbles) + #expect(GatewayAgentChannel(raw: "IMESSAGE") == .imessage) #expect(GatewayAgentChannel(raw: "unknown") == .last) } } diff --git a/apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatMarkdownPreprocessor.swift b/apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatMarkdownPreprocessor.swift index bd008fd2c2f..34344c2e464 100644 --- a/apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatMarkdownPreprocessor.swift +++ b/apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatMarkdownPreprocessor.swift @@ -27,7 +27,6 @@ enum ChatMarkdownPreprocessor { "Matrix", "Zalo", "Zalo Personal", - "BlueBubbles", ] private static let markdownImagePattern = #"!\[([^\]]*)\]\(([^)]+)\)"# diff --git a/docs/channels/access-groups.md b/docs/channels/access-groups.md index babc8d326f4..5e7ec0001f8 100644 --- a/docs/channels/access-groups.md +++ b/docs/channels/access-groups.md @@ -125,7 +125,7 @@ Access groups are available in shared message-channel authorization paths, inclu - channel-specific per-room sender allowlists that use the same sender matching rules - command authorization paths that reuse message-channel sender allowlists -Channel support depends on whether that channel is wired through the shared OpenClaw sender-authorization helpers. Current bundled support includes BlueBubbles, Discord, Feishu, Google Chat, iMessage, LINE, Mattermost, Microsoft Teams, Nextcloud Talk, Nostr, QQBot, Signal, WhatsApp, Zalo, and Zalo Personal. Static `message.senders` groups are designed to be channel-agnostic, so new message channels should support them by using the shared plugin SDK helpers instead of custom allowlist expansion. +Channel support depends on whether that channel is wired through the shared OpenClaw sender-authorization helpers. Current bundled support includes Discord, Feishu, Google Chat, iMessage, LINE, Mattermost, Microsoft Teams, Nextcloud Talk, Nostr, QQBot, Signal, WhatsApp, Zalo, and Zalo Personal. Static `message.senders` groups are designed to be channel-agnostic, so new message channels should support them by using the shared plugin SDK helpers instead of custom allowlist expansion. ## Plugin diagnostics diff --git a/extensions/imessage/src/monitor/catchup.ts b/extensions/imessage/src/monitor/catchup.ts index 0c5b95b9bab..0a6601ffb65 100644 --- a/extensions/imessage/src/monitor/catchup.ts +++ b/extensions/imessage/src/monitor/catchup.ts @@ -9,12 +9,10 @@ import { resolvePreferredOpenClawTmpDir } from "openclaw/plugin-sdk/temp-path"; // anything that landed in chat.db while the bridge was disconnected. // Without a recovery pass, those messages are permanently lost. // -// This module mirrors the design of the retired BlueBubbles catchup -// (`extensions/bluebubbles/src/catchup.ts` in commit 07bf572f35^), adapted -// for the imsg JSON-RPC `messages.history` fetch path. The replay loop is -// pluggable via the `dispatch` callback so the same `evaluateIMessageInbound` -// + `dispatchInboundMessage` path used by the live `imsg watch` loop runs -// unchanged on replayed rows. +// This module keeps catchup on the same inbound evaluation and dispatch path +// as live `imsg watch` notifications. The replay loop is pluggable via the +// `dispatch` callback so `evaluateIMessageInbound` + `dispatchInboundMessage` +// runs unchanged on replayed rows. // // See https://github.com/openclaw/openclaw/issues/78649 for design discussion. diff --git a/extensions/imessage/src/monitor/monitor-provider.ts b/extensions/imessage/src/monitor/monitor-provider.ts index fc11e53dab3..761fff741eb 100644 --- a/extensions/imessage/src/monitor/monitor-provider.ts +++ b/extensions/imessage/src/monitor/monitor-provider.ts @@ -869,9 +869,8 @@ export async function monitorIMessageProvider(opts: MonitorIMessageOpts = {}): P // Catchup bypasses the inbound debouncer so each row is awaited // serially and dispatch failure can hold the cursor. Split-sends // from before the gateway gap therefore arrive as separate turns - // rather than coalesced — same behavior the retired BlueBubbles - // catchup had. Live notifications continue to flow through the - // debouncer. + // rather than coalesced. Live notifications continue to flow through + // the debouncer. dispatchPayload: (message) => handleMessageNow(message), runtime, }); diff --git a/security/opengrep/precise.yml b/security/opengrep/precise.yml index 99f874c9053..c8c41e3d399 100644 --- a/security/opengrep/precise.yml +++ b/security/opengrep/precise.yml @@ -4072,7 +4072,7 @@ rules: detector-bucket: precise source-run: 2026-04-17T07-37-10Z source-rule-id: unresolved-discovery-routing-from-txt-hints - - id: ghsa-rwj8-p9vq-25gv.bluebubbles-media-read-without-root-allowlist + - id: ghsa-rwj8-p9vq-25gv.local-media-read-without-root-allowlist languages: - typescript - javascript @@ -4086,7 +4086,7 @@ rules: advisory-url: https://github.com/openclaw/openclaw/security/advisories/GHSA-RWJ8-P9VQ-25GV detector-bucket: precise source-run: 2026-04-17T07-37-10Z - source-rule-id: bluebubbles-media-read-without-root-allowlist + source-rule-id: local-media-read-without-root-allowlist patterns: - pattern: | const $LOCAL = resolveLocalMediaPath(...);