From d8860595201d346f5be8237d0982400a788aac01 Mon Sep 17 00:00:00 2001 From: mushuiyu886 Date: Sun, 12 Jul 2026 08:03:58 +0800 Subject: [PATCH] fix(line): preserve Unicode boundaries in recipient errors (#104109) --- extensions/line/src/send.test.ts | 18 ++++++++++++++++++ extensions/line/src/send.ts | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/extensions/line/src/send.test.ts b/extensions/line/src/send.test.ts index 0038979f3cc1..fff00336b80a 100644 --- a/extensions/line/src/send.test.ts +++ b/extensions/line/src/send.test.ts @@ -384,6 +384,24 @@ describe("LINE send helpers", () => { expect(pushMessageMock).not.toHaveBeenCalled(); }); + it("preserves UTF-16 boundaries in invalid recipient diagnostics", async () => { + await expect( + sendModule.pushMessagesLine(`aab😀${"x".repeat(40)}`, [{ type: "text", text: "hello" }], { + cfg: LINE_TEST_CFG, + }), + ).rejects.toThrow( + "Recipient is not a valid LINE id (case-sensitive; expected leading capital C/U/R): aab…", + ); + await expect( + sendModule.pushMessagesLine(`aa😀${"y".repeat(40)}`, [{ type: "text", text: "hello" }], { + cfg: LINE_TEST_CFG, + }), + ).rejects.toThrow( + "Recipient is not a valid LINE id (case-sensitive; expected leading capital C/U/R): aa😀…", + ); + expect(pushMessageMock).not.toHaveBeenCalled(); + }); + it("accepts case-exact LINE recipients with the leading capital preserved", async () => { await sendModule.pushMessagesLine( "Cabcdef0123456789abcdef0123456789", diff --git a/extensions/line/src/send.ts b/extensions/line/src/send.ts index b63060ddce5e..7b223abfbe34 100644 --- a/extensions/line/src/send.ts +++ b/extensions/line/src/send.ts @@ -79,7 +79,7 @@ function normalizeTarget(to: string): string { // fixtures (e.g. "U123") are left alone. openclaw/openclaw#81628 if (normalized.length >= 33 && !/^[CUR]/.test(normalized)) { throw new Error( - `Recipient is not a valid LINE id (case-sensitive; expected leading capital C/U/R): ${normalized.slice(0, 4)}…`, + `Recipient is not a valid LINE id (case-sensitive; expected leading capital C/U/R): ${truncateUtf16Safe(normalized, 4)}…`, ); }