Imported as a linear vendor commit so forge rebases do not replay the upstream root tree. git-subtree-dir: third_party/pi git-subtree-split: d981de1229ef899957bbe968bc8dcda02a21f477
49 lines
1.6 KiB
TypeScript
49 lines
1.6 KiB
TypeScript
import { type AssistantMessage, fauxAssistantMessage } from "@earendil-works/pi-ai";
|
|
import { afterEach, describe, expect, it } from "vitest";
|
|
import { createHarness, type Harness } from "../harness.ts";
|
|
|
|
function seedCompactableSession(harness: Harness): void {
|
|
harness.settingsManager.applyOverrides({ compaction: { keepRecentTokens: 1 } });
|
|
const now = Date.now();
|
|
harness.sessionManager.appendMessage({
|
|
role: "user",
|
|
content: [{ type: "text", text: "message to compact" }],
|
|
timestamp: now - 1000,
|
|
});
|
|
const model = harness.getModel();
|
|
const assistant: AssistantMessage = {
|
|
...fauxAssistantMessage("assistant response to compact", { timestamp: now - 500 }),
|
|
api: model.api,
|
|
provider: model.provider,
|
|
model: model.id,
|
|
usage: {
|
|
input: 100,
|
|
output: 0,
|
|
cacheRead: 0,
|
|
cacheWrite: 0,
|
|
totalTokens: 100,
|
|
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
|
|
},
|
|
};
|
|
harness.sessionManager.appendMessage(assistant);
|
|
harness.session.agent.state.messages = harness.sessionManager.buildSessionContext().messages;
|
|
}
|
|
|
|
describe("#7048 truncated compaction summaries", () => {
|
|
let harness: Harness | undefined;
|
|
|
|
afterEach(() => {
|
|
harness?.cleanup();
|
|
harness = undefined;
|
|
});
|
|
|
|
it("does not persist a length-limited summary", async () => {
|
|
harness = await createHarness();
|
|
seedCompactableSession(harness);
|
|
harness.setResponses([fauxAssistantMessage("partial summar", { stopReason: "length" })]);
|
|
|
|
await expect(harness.session.compact()).rejects.toThrow("generation hit the token cap");
|
|
expect(harness.sessionManager.getEntries().filter((entry) => entry.type === "compaction")).toHaveLength(0);
|
|
});
|
|
});
|