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 000000000000..2d2372fa1635 --- /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 9d09f55b1302..b586b7330c02 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();