From dd874d52f6314e05c0a2078dd3b64caed8f61f0c Mon Sep 17 00:00:00 2001 From: Marcus Widing Date: Thu, 19 Mar 2026 11:36:12 +0100 Subject: [PATCH] fix(ui): preserve ZWJ in emoji sanitization --- ui/src/ui/views/agents-utils.test.ts | 4 ++++ ui/src/ui/views/agents-utils.ts | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/ui/src/ui/views/agents-utils.test.ts b/ui/src/ui/views/agents-utils.test.ts index daa909e2b2c..958f5ece7e3 100644 --- a/ui/src/ui/views/agents-utils.test.ts +++ b/ui/src/ui/views/agents-utils.test.ts @@ -145,4 +145,8 @@ describe("resolveAgentEmoji", () => { it("falls back to empty for control-only emoji strings", () => { expect(resolveAgentEmoji({ identity: { emoji: "\u202E\u2066" } })).toBe(""); }); + + it("preserves ZWJ-composed compound emoji intact", () => { + expect(resolveAgentEmoji({ identity: { emoji: "👩‍💻" } })).toBe("👩‍💻"); + }); }); diff --git a/ui/src/ui/views/agents-utils.ts b/ui/src/ui/views/agents-utils.ts index 33734505cb9..fd3e018e330 100644 --- a/ui/src/ui/views/agents-utils.ts +++ b/ui/src/ui/views/agents-utils.ts @@ -221,7 +221,7 @@ export function agentLogoUrl(basePath: string): string { return base ? `${base}/favicon.svg` : "favicon.svg"; } -const EMOJI_CONTROL_CHARS_RE = /[\u200B-\u200F\u202A-\u202E\u2066-\u2069\uFEFF]/g; +const EMOJI_CONTROL_CHARS_RE = /[\u200B\u200C\u200E\u200F\u202A-\u202E\u2066-\u2069\uFEFF]/g; function sanitizeEmojiValue(value: string): string { const cleaned = value.replaceAll(EMOJI_CONTROL_CHARS_RE, "").trim();