AkurAI Build
Menu

popagent

public

Latest change 6edc7e928c57dab23c0973ed3f7ee70b3ebb72d5 - Initial popagent baseline by AkurAI Build

import { describe, expect, test } from "bun:test";
import type { ChatMessage } from "./api-types";
import { latestUserText, replaceLatestUserText } from "./chat-messages";

describe("chat message transforms", () => {
  test("replaces every text fragment in the latest user message and preserves attachments", () => {
    const attachment = { type: "file", mediaType: "text/plain", filename: "notes.txt" };
    const toolPart = { type: "tool-result", toolCallId: "tool-1", output: "kept" };
    const messages: ChatMessage[] = [
      { id: "old", role: "user", parts: [{ type: "text", text: "older prompt" }] },
      {
        id: "latest",
        role: "user",
        parts: [
          attachment,
          { type: "text", text: "unsafe first fragment", providerMetadata: { source: "client" } },
          toolPart,
          { type: "text", text: "unsafe second fragment" },
        ],
      },
    ];

    expect(latestUserText(messages)).toBe("unsafe first fragment\nunsafe second fragment");
    replaceLatestUserText(messages, "safe replacement");

    expect(messages[0]?.parts).toEqual([{ type: "text", text: "older prompt" }]);
    expect(messages[1]?.parts).toEqual([
      attachment,
      {
        type: "text",
        text: "safe replacement",
        providerMetadata: { source: "client" },
      },
      toolPart,
    ]);
    expect(latestUserText(messages)).toBe("safe replacement");
  });

  test("joins all text parts to exactly the replacement", () => {
    const messages: ChatMessage[] = [{
      id: "multi", role: "user",
      parts: [{ type: "text", text: "one" }, { type: "text", text: "two" }],
    }];
    replaceLatestUserText(messages, "replacement");
    expect(latestUserText(messages)).toBe("replacement");
  });
});