mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-07-26 09:52:11 +03:00
Compress MCP registry and list metadata descriptions for tools, prompts, resources, and resource templates while keeping tool-response bodies unchanged. Expose those savings in compression status as `mcp_metadata_estimate` metadata rather than provider usage. Add Caveman rule-pack support for custom regex flags and match-specific replacement maps, update English rules for upstream parity, and tighten article and pleasantry handling. Also process RTK multipart text blocks independently so mixed media content compresses safely without duplicating output.
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);
|
|
});
|
|
});
|