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; }