fix: sanitize assistant session text (#1456) (thanks @zerone0x)

This commit is contained in:
Peter Steinberger
2026-01-23 07:01:29 +00:00
parent 3fbbac07fe
commit 551685351f
5 changed files with 70 additions and 11 deletions

View File

@@ -0,0 +1,23 @@
import { describe, expect, it } from "vitest";
import { extractMessageText } from "./commands-subagents.js";
describe("extractMessageText", () => {
it("preserves user text that looks like tool call markers", () => {
const message = {
role: "user",
content: "Here [Tool Call: foo (ID: 1)] ok",
};
const result = extractMessageText(message);
expect(result?.text).toContain("[Tool Call: foo (ID: 1)]");
});
it("sanitizes assistant tool call markers", () => {
const message = {
role: "assistant",
content: "Here [Tool Call: foo (ID: 1)] ok",
};
const result = extractMessageText(message);
expect(result?.text).toBe("Here ok");
});
});

View File

@@ -107,12 +107,14 @@ function normalizeMessageText(text: string) {
return text.replace(/\s+/g, " ").trim();
}
function extractMessageText(message: ChatMessage): { role: string; text: string } | null {
export function extractMessageText(message: ChatMessage): { role: string; text: string } | null {
const role = typeof message.role === "string" ? message.role : "";
const shouldSanitize = role === "assistant";
const content = message.content;
if (typeof content === "string") {
const sanitized = sanitizeTextContent(content);
const normalized = normalizeMessageText(sanitized);
const normalized = normalizeMessageText(
shouldSanitize ? sanitizeTextContent(content) : content,
);
return normalized ? { role, text: normalized } : null;
}
if (!Array.isArray(content)) return null;
@@ -122,9 +124,9 @@ function extractMessageText(message: ChatMessage): { role: string; text: string
if ((block as { type?: unknown }).type !== "text") continue;
const text = (block as { text?: unknown }).text;
if (typeof text === "string") {
const sanitized = sanitizeTextContent(text);
if (sanitized) {
chunks.push(sanitized);
const value = shouldSanitize ? sanitizeTextContent(text) : text;
if (value.trim()) {
chunks.push(value);
}
}
}