import { describe, expect, it } from "vitest"; import { normalizeTestText } from "../../../test/helpers/normalize-text.js"; import { ChatLog } from "./chat-log.js";
describe("ChatLog", () => {
it("caps component growth to avoid unbounded render trees", () => { const chatLog = new ChatLog(20); for (let i = 1; i <= 40; i++) {
chatLog.addSystem(`system-${i}`);
}
it("drops stale streaming references when old components are pruned", () => { const chatLog = new ChatLog(20);
chatLog.startAssistant("first", "run-1"); for (let i = 0; i < 25; i++) {
chatLog.addSystem(`overflow-${i}`);
}
// Should not throw if the original streaming component was pruned.
chatLog.updateAssistant("recreated", "run-1");
it("does not append duplicate assistant components when a run is started twice", () => { const chatLog = new ChatLog(40);
chatLog.startAssistant("first", "run-dup");
chatLog.startAssistant("second", "run-dup");
it("drops stale tool references when old components are pruned", () => { const chatLog = new ChatLog(20);
chatLog.startTool("tool-1", "read_file", { path: "a.txt" }); for (let i = 0; i < 25; i++) {
chatLog.addSystem(`overflow-${i}`);
}
// Should no-op safely after the tool component is pruned.
chatLog.updateToolResult("tool-1", { content: [{ type: "text", text: "done" }] });
expect(chatLog.children.length).toBe(20);
});
it("prunes system messages atomically when a non-system entry overflows the log", () => { const chatLog = new ChatLog(20); for (let i = 1; i <= 20; i++) {
chatLog.addSystem(`system-${i}`);
}
let rendered = chatLog.render(120).join("\n");
expect(rendered).toContain("BTW: what is 17 * 19?");
expect(rendered).toContain("323");
expect(chatLog.hasVisibleBtw()).toBe(true);
chatLog.dismissBtw();
rendered = chatLog.render(120).join("\n");
expect(rendered).not.toContain("BTW: what is 17 * 19?");
expect(chatLog.hasVisibleBtw()).toBe(false);
});
it("preserves pending user messages across history rebuilds", () => { const chatLog = new ChatLog(40);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.