diff --git a/packages/client-runtime/src/state/subagentDisplay.test.ts b/packages/client-runtime/src/state/subagentDisplay.test.ts index 5bdd434388ec6..9b1536a7aacb1 100644 --- a/packages/client-runtime/src/state/subagentDisplay.test.ts +++ b/packages/client-runtime/src/state/subagentDisplay.test.ts @@ -36,6 +36,6 @@ it("normalizes Unicode whitespace and ignores a large hidden suffix", () => { subagentDetailPreview({ status: "running", progress: "\uFEFF\u2029", result: " Done " }), ).toBe("Done"); expect(subagentDetailPreview({ status: "failed", result: "x".repeat(279) + "šŸ˜€" })).toBe( - "x".repeat(279) + "\uD83D…", + "x".repeat(279) + "…", ); }); diff --git a/packages/client-runtime/src/state/subagentDisplay.ts b/packages/client-runtime/src/state/subagentDisplay.ts index 124c45e264f79..5f1a65fb8a22e 100644 --- a/packages/client-runtime/src/state/subagentDisplay.ts +++ b/packages/client-runtime/src/state/subagentDisplay.ts @@ -132,7 +132,15 @@ export function subagentDetailPreview(input: { if (compact.length > 0) compact += " "; } compact += detail[index]; - if (compact.length > 280) return `${compact.slice(0, 280).trimEnd()}…`; + if (compact.length > 280) { + let end = 280; + const previous = compact.charCodeAt(end - 1); + const next = compact.charCodeAt(end); + if (previous >= 0xd800 && previous <= 0xdbff && next >= 0xdc00 && next <= 0xdfff) { + end -= 1; + } + return `${compact.slice(0, end).trimEnd()}…`; + } } return compact || null; }