import { assertEquals, assertStringIncludes } from "@std/assert"; import { BACKGROUND_CONTEXT as context } from "@earendil-works/chord/context"; import type { Message } from "@earendil-works/pi-ai"; import { fauxAssistantMessage } from "@earendil-works/pi-ai/providers/faux"; import { until } from "@berry/util"; import misc from "../extensions/misc/mod.ts"; import { setup, turn } from "./fixture.ts"; const textOf = (messages: readonly Message[]) => messages.flatMap((message) => typeof message.content === "string" ? [message.content] : message.content.flatMap((block) => block.type === "text" ? [block.text] : []) ).join("\n"); Deno.test("/compact compacts the conversation, guided by its arguments", async () => { await using harness = await setup(); const { berry, faux, model } = harness; await berry.install(misc); const tid = await berry.create({ extensions: {}, model }); const conversation = (await berry.conversation(tid))!; await turn(harness, tid, []); faux.setResponses([fauxAssistantMessage("done")]); await (await conversation.submit({ type: "input", content: "x".repeat(100_000) }, context)) .wait(context); await conversation.waitForIdle(context); let summarized: readonly Message[] = []; faux.setResponses([(request) => { summarized = request.messages; return fauxAssistantMessage("A summary"); }]); assertEquals(await berry.command(tid, "compact", "keep the long input"), "Compacting context…"); await until(async () => (await conversation.entries({ order: "ascending" }, 100, undefined, context)).items .some((entry) => entry.kind === "pi.compaction") ); assertStringIncludes(textOf(summarized), "Additional focus: keep the long input"); });