116 lines
4.2 KiB
TypeScript
116 lines
4.2 KiB
TypeScript
import { describe, it } from "node:test";
|
|
import assert from "node:assert/strict";
|
|
|
|
import {
|
|
detectCommandType,
|
|
loadRtkFilters,
|
|
matchRtkFilter,
|
|
processRtkText,
|
|
applyRtkCompression,
|
|
rtkEngine,
|
|
} from "../../../open-sse/services/compression/index.ts";
|
|
|
|
describe("RTK compression engine", () => {
|
|
it("detects TypeScript build output", () => {
|
|
const output = "src/a.ts:1:1 - error TS2322: Type 'string' is not assignable";
|
|
const detection = detectCommandType(output, "tsc --noEmit");
|
|
assert.equal(detection.type, "build-typescript");
|
|
assert.equal(detection.category, "build");
|
|
});
|
|
|
|
it("loads builtin declarative filters", () => {
|
|
const filters = loadRtkFilters({ refresh: true });
|
|
assert.ok(filters.length >= 10);
|
|
assert.ok(filters.some((filter) => filter.id === "git-diff"));
|
|
});
|
|
|
|
it("matches filters by detected output type", () => {
|
|
const filter = matchRtkFilter("diff --git a/a.ts b/a.ts\n@@ -1,1 +1,1 @@", "git diff");
|
|
assert.equal(filter?.id, "git-diff");
|
|
});
|
|
|
|
it("compresses repeated tool output", () => {
|
|
const output = Array.from({ length: 20 }, () => "same noisy line").join("\n");
|
|
const result = processRtkText(output);
|
|
assert.equal(result.compressed, true);
|
|
assert.ok(result.text.includes("[rtk:dropped"));
|
|
});
|
|
|
|
it("honors disabled and empty-message runtime branches", () => {
|
|
const disabled = applyRtkCompression(
|
|
{ messages: [{ role: "tool", content: "same\nsame\nsame" }] },
|
|
{ config: { enabled: false } }
|
|
);
|
|
assert.equal(disabled.compressed, false);
|
|
assert.equal(disabled.stats, null);
|
|
|
|
const empty = applyRtkCompression({ messages: [] });
|
|
assert.equal(empty.compressed, false);
|
|
assert.equal(empty.stats, null);
|
|
});
|
|
|
|
it("respects enabled and disabled filter lists", () => {
|
|
const output = "diff --git a/a.ts b/a.ts\n@@ -1,1 +1,1 @@\n-error\n+ok";
|
|
|
|
const disabled = processRtkText(output, {
|
|
command: "git diff",
|
|
config: { disabledFilters: ["git-diff"] },
|
|
});
|
|
assert.ok(!disabled.rulesApplied.includes("git-diff:keep"));
|
|
|
|
const enabledMismatch = processRtkText(output, {
|
|
command: "git diff",
|
|
config: { enabledFilters: ["git-status"] },
|
|
});
|
|
assert.ok(!enabledMismatch.rulesApplied.includes("git-diff:keep"));
|
|
});
|
|
|
|
it("exposes RTK engine schema, validation, apply and compress contracts", () => {
|
|
assert.ok(rtkEngine.getConfigSchema().some((field) => field.key === "rawOutputRetention"));
|
|
assert.equal(rtkEngine.validateConfig({ intensity: "invalid" }).valid, false);
|
|
assert.equal(rtkEngine.validateConfig({ rawOutputRetention: "always" }).valid, true);
|
|
|
|
const body = { messages: [{ role: "tool", content: "same\nsame\nsame\nsame" }] };
|
|
assert.equal(
|
|
rtkEngine.apply(body, { config: { rtkConfig: { enabled: true } } }).stats?.engine,
|
|
"rtk"
|
|
);
|
|
assert.equal(rtkEngine.compress(body, { enabled: true }).stats?.engine, "rtk");
|
|
});
|
|
|
|
it("applies to chat tool messages", () => {
|
|
const body = {
|
|
messages: [{ role: "tool", content: Array.from({ length: 20 }, () => "same").join("\n") }],
|
|
};
|
|
const result = applyRtkCompression(body);
|
|
assert.equal(result.compressed, true);
|
|
assert.equal(result.stats?.mode, "rtk");
|
|
});
|
|
|
|
it("compresses multipart text parts independently without duplicating output", () => {
|
|
const imagePart = { type: "image_url", image_url: { url: "data:image/png;base64,abc" } };
|
|
const body = {
|
|
messages: [
|
|
{
|
|
role: "tool",
|
|
content: [
|
|
{ type: "text", text: Array.from({ length: 12 }, () => "alpha noisy line").join("\n") },
|
|
imagePart,
|
|
{ type: "text", text: Array.from({ length: 12 }, () => "beta noisy line").join("\n") },
|
|
],
|
|
},
|
|
],
|
|
};
|
|
|
|
const result = applyRtkCompression(body);
|
|
const content = (result.body.messages as typeof body.messages)[0].content;
|
|
|
|
assert.equal(result.compressed, true);
|
|
assert.ok(Array.isArray(content));
|
|
assert.match(content[0].text ?? "", /alpha noisy line/);
|
|
assert.match(content[2].text ?? "", /beta noisy line/);
|
|
assert.notEqual(content[0].text, content[2].text);
|
|
assert.deepEqual(content[1], imagePart);
|
|
});
|
|
});
|