From 7b81383d4482b57c86325baa81e650874a31f9a3 Mon Sep 17 00:00:00 2001 From: Hudson <258693705+heyhudson@users.noreply.github.com> Date: Thu, 19 Feb 2026 23:41:55 -0500 Subject: [PATCH] fix(signal): preserve case for Base64 group IDs in target normalization (openclaw#10623) thanks @heyhudson Verified: - pnpm build - pnpm check - pnpm test:macmini Co-authored-by: heyhudson <258693705+heyhudson@users.noreply.github.com> Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com> --- CHANGELOG.md | 1 + src/channels/plugins/plugins-channel.test.ts | 6 ++++++ src/infra/outbound/outbound-policy.ts | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 29071c11b48..aa6c8584489 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ Docs: https://docs.openclaw.ai ### Fixes +- Signal/Outbound: preserve case for Base64 group IDs during outbound target normalization so cross-context routing and policy checks no longer break when group IDs include uppercase characters. (#5578) Thanks @heyhudson. - Providers/Copilot: add `claude-sonnet-4.6` and `claude-sonnet-4.5` to the default GitHub Copilot model catalog and add coverage for model-list/definition helpers. (#20270, fixes #20091) Thanks @Clawborn. - Dependencies/Agents: bump embedded Pi SDK packages (`@mariozechner/pi-agent-core`, `@mariozechner/pi-ai`, `@mariozechner/pi-coding-agent`, `@mariozechner/pi-tui`) to `0.54.0`. (#21578) Thanks @Takhoffman. - Gateway/Config: allow `gateway.customBindHost` in strict config validation when `gateway.bind="custom"` so valid custom bind-host configurations no longer fail startup. (#20318, fixes #20289) Thanks @MisterGuy420. diff --git a/src/channels/plugins/plugins-channel.test.ts b/src/channels/plugins/plugins-channel.test.ts index d3f72f290fc..7c4c6ebf1fc 100644 --- a/src/channels/plugins/plugins-channel.test.ts +++ b/src/channels/plugins/plugins-channel.test.ts @@ -37,6 +37,12 @@ describe("signal target normalization", () => { ).toBe("group:VWATOdKF2hc8zdOS76q9tb0+5BI522e03QLDAq/9yPg="); }); + it("preserves case for base64-like group IDs without signal prefix", () => { + expect( + normalizeSignalMessagingTarget("group:AbCdEfGhIjKlMnOpQrStUvWxYz0123456789+/ABCD="), + ).toBe("group:AbCdEfGhIjKlMnOpQrStUvWxYz0123456789+/ABCD="); + }); + it("accepts uuid prefixes for target detection", () => { expect(looksLikeSignalTargetId("uuid:123e4567-e89b-12d3-a456-426614174000")).toBe(true); expect(looksLikeSignalTargetId("signal:uuid:123e4567-e89b-12d3-a456-426614174000")).toBe(true); diff --git a/src/infra/outbound/outbound-policy.ts b/src/infra/outbound/outbound-policy.ts index c24ae135b24..df6ea9e16bf 100644 --- a/src/infra/outbound/outbound-policy.ts +++ b/src/infra/outbound/outbound-policy.ts @@ -66,7 +66,7 @@ function resolveContextGuardTarget( } function normalizeTarget(channel: ChannelId, raw: string): string | undefined { - return normalizeTargetForProvider(channel, raw) ?? raw.trim().toLowerCase(); + return normalizeTargetForProvider(channel, raw) ?? raw.trim(); } function isCrossContextTarget(params: {