85 lines
3.2 KiB
TypeScript
85 lines
3.2 KiB
TypeScript
import { describe, it } from "node:test";
|
|
import assert from "node:assert/strict";
|
|
import { compressAggressive } from "../../../open-sse/services/compression/aggressive.ts";
|
|
import type { AggressiveConfig } from "../../../open-sse/services/compression/types.ts";
|
|
|
|
function makeMessages(count: number): Array<{ role: string; content: string }> {
|
|
return Array.from({ length: count }, (_, i) => ({
|
|
role: i % 2 === 0 ? "user" : "assistant",
|
|
content: `Message ${i}: ${"x".repeat(200)}`,
|
|
}));
|
|
}
|
|
|
|
describe("compressAggressive", () => {
|
|
it("returns messages unchanged for empty input", () => {
|
|
const result = compressAggressive([]);
|
|
assert.equal(result.messages.length, 0);
|
|
assert.equal(result.stats.mode, "aggressive");
|
|
});
|
|
|
|
it("returns messages for single message (no compression needed)", () => {
|
|
const msgs = [{ role: "user", content: "Hello" }];
|
|
const result = compressAggressive(msgs);
|
|
assert.equal(result.messages.length, 1);
|
|
});
|
|
|
|
it("compresses 20-message conversation and returns stats", () => {
|
|
const msgs = makeMessages(20);
|
|
const result = compressAggressive(msgs);
|
|
assert.ok(result.messages.length > 0);
|
|
assert.equal(result.stats.mode, "aggressive");
|
|
assert.ok(typeof result.stats.originalTokens === "number");
|
|
assert.ok(typeof result.stats.compressedTokens === "number");
|
|
});
|
|
|
|
it("skips messages with [COMPRESSED: prefix (recursion guard)", () => {
|
|
const msgs = [{ role: "assistant", content: "[COMPRESSED:aging:fullSummary] prior summary" }];
|
|
const result = compressAggressive(msgs);
|
|
const content =
|
|
typeof result.messages[0].content === "string" ? result.messages[0].content : "";
|
|
assert.ok(content.startsWith("[COMPRESSED:"));
|
|
assert.ok(!content.includes("[COMPRESSED:aging:fullSummary][COMPRESSED:"));
|
|
});
|
|
|
|
it("step failure triggers downgrade, not crash", () => {
|
|
const msgs = makeMessages(10);
|
|
const config: Partial<AggressiveConfig> = {
|
|
toolStrategies: {
|
|
fileContent: false,
|
|
grepSearch: false,
|
|
shellOutput: false,
|
|
json: false,
|
|
errorMessage: false,
|
|
},
|
|
};
|
|
const result = compressAggressive(msgs, config);
|
|
assert.ok(result.messages.length > 0);
|
|
assert.ok(typeof result.stats.savingsPercent === "number");
|
|
});
|
|
|
|
it("config merge overrides defaults", () => {
|
|
const msgs = makeMessages(10);
|
|
const config: Partial<AggressiveConfig> = {
|
|
maxTokensPerMessage: 100,
|
|
minSavingsThreshold: 0.5,
|
|
};
|
|
const result = compressAggressive(msgs, config);
|
|
assert.ok(result.messages.length > 0);
|
|
});
|
|
|
|
it("aggressive stats breakdown is populated", () => {
|
|
const msgs = makeMessages(20);
|
|
const result = compressAggressive(msgs);
|
|
assert.ok(result.stats.aggressive !== undefined);
|
|
assert.ok(typeof result.stats.aggressive!.summarizerSavings === "number");
|
|
assert.ok(typeof result.stats.aggressive!.toolResultSavings === "number");
|
|
assert.ok(typeof result.stats.aggressive!.agingSavings === "number");
|
|
});
|
|
|
|
it("techniquesUsed lists applied strategies", () => {
|
|
const msgs = makeMessages(20);
|
|
const result = compressAggressive(msgs);
|
|
assert.ok(Array.isArray(result.stats.techniquesUsed));
|
|
});
|
|
});
|