From 0a8677ec99481dfa44653b09b5d2b3a3eb04d821 Mon Sep 17 00:00:00 2001 From: huangjianxiong Date: Thu, 9 Jul 2026 18:46:52 +0800 Subject: [PATCH] fix(whatsapp): keep echo tracker log truncation UTF-16 safe (#102603) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(whatsapp): keep echo tracker log truncation UTF-16 safe Replace `.slice(0, 50)` with `truncateUtf16Safe(text, 50)` in echo tracker verbose log message to prevent surrogate pair corruption. Ref. lsr911 pattern — mechanical substitution, no behavior change. * test(whatsapp): cover UTF-16-safe echo previews --------- Co-authored-by: Peter Steinberger --- .../src/auto-reply/monitor/echo.test.ts | 18 ++++++++++++++++++ .../whatsapp/src/auto-reply/monitor/echo.ts | 3 ++- 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 extensions/whatsapp/src/auto-reply/monitor/echo.test.ts diff --git a/extensions/whatsapp/src/auto-reply/monitor/echo.test.ts b/extensions/whatsapp/src/auto-reply/monitor/echo.test.ts new file mode 100644 index 00000000000..2d2372fa163 --- /dev/null +++ b/extensions/whatsapp/src/auto-reply/monitor/echo.test.ts @@ -0,0 +1,18 @@ +import { describe, expect, it, vi } from "vitest"; +import { createEchoTracker } from "./echo.js"; + +describe("createEchoTracker", () => { + it("keeps verbose previews UTF-16 safe without changing the tracked text", () => { + const logVerbose = vi.fn(); + const tracker = createEchoTracker({ logVerbose }); + const prefix = "x".repeat(49); + const text = `${prefix}😀tail`; + + tracker.rememberText(text, { logVerboseMessage: true }); + + expect(logVerbose).toHaveBeenCalledExactlyOnceWith( + `Added to echo detection set (size now: 1): ${prefix}...`, + ); + expect(tracker.has(text)).toBe(true); + }); +}); diff --git a/extensions/whatsapp/src/auto-reply/monitor/echo.ts b/extensions/whatsapp/src/auto-reply/monitor/echo.ts index 9d09f55b130..b586b7330c0 100644 --- a/extensions/whatsapp/src/auto-reply/monitor/echo.ts +++ b/extensions/whatsapp/src/auto-reply/monitor/echo.ts @@ -1,4 +1,5 @@ // Whatsapp plugin module implements echo behavior. +import { truncateUtf16Safe } from "openclaw/plugin-sdk/text-utility-runtime"; export type EchoTracker = { rememberText: ( text: string | undefined, @@ -48,7 +49,7 @@ export function createEchoTracker(params: { } if (opts.logVerboseMessage) { params.logVerbose?.( - `Added to echo detection set (size now: ${recentlySent.size}): ${text.slice(0, 50)}...`, + `Added to echo detection set (size now: ${recentlySent.size}): ${truncateUtf16Safe(text, 50)}...`, ); } trim();