From e39e628a8416ef5426b5bf62e42539bd058e86bb Mon Sep 17 00:00:00 2001 From: lsr911 Date: Thu, 9 Jul 2026 18:10:42 +0800 Subject: [PATCH] fix(active-memory): use truncateUtf16Safe for log value truncation (#102551) * fix(active-memory): use truncateUtf16Safe for log value truncation * fix(active-memory): use truncateUtf16Safe for log value truncation * test(active-memory): cover UTF-16-safe log limits --------- Co-authored-by: Peter Steinberger --- extensions/active-memory/index.test.ts | 8 +++++--- extensions/active-memory/index.ts | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/extensions/active-memory/index.test.ts b/extensions/active-memory/index.test.ts index f06ac70a61b..16863c882ba 100644 --- a/extensions/active-memory/index.test.ts +++ b/extensions/active-memory/index.test.ts @@ -4812,13 +4812,14 @@ describe("active-memory plugin", () => { ).not.toEqual([]); }); - it("caps active-memory log field lengths", async () => { + it("caps active-memory log field lengths without splitting surrogate pairs", async () => { api.pluginConfig = { agents: ["main"], logging: true, }; plugin.register(api as unknown as OpenClawPluginApi); - const hugeSession = `agent:main:${"x".repeat(500)}`; + const sessionPrefix = `agent:main:${"x".repeat(288)}`; + const hugeSession = `${sessionPrefix}😀tail`; await hooks.before_prompt_build( { prompt: "what wings should i order? long log value", messages: [] }, @@ -4836,7 +4837,8 @@ describe("active-memory plugin", () => { const startLine = infoLines.find((line: string) => line.includes(" start timeoutMs=")); const line = requireNonEmptyString(startLine, "active memory start log line missing"); expect(line.length).toBeLessThan(500); - expect(line).toContain("..."); + expect(line).toContain(`session=${sessionPrefix}...`); + expect(line).not.toMatch(/[\uD800-\uDFFF]/u); }); it("uses a canonical agent session key when only sessionId is available", async () => { diff --git a/extensions/active-memory/index.ts b/extensions/active-memory/index.ts index 594b1e5f037..a06458ff3d4 100644 --- a/extensions/active-memory/index.ts +++ b/extensions/active-memory/index.ts @@ -1434,7 +1434,7 @@ function toSingleLineLogValue(value: unknown): string { .replace(/\s+/g, " ") .trim(); return singleLine.length > MAX_LOG_VALUE_CHARS - ? `${singleLine.slice(0, MAX_LOG_VALUE_CHARS)}...` + ? `${truncateUtf16Safe(singleLine, MAX_LOG_VALUE_CHARS)}...` : singleLine; }