diff --git a/open-sse/services/compression/types.ts b/open-sse/services/compression/types.ts index 3331aa6f69..0dd2c73cbd 100644 --- a/open-sse/services/compression/types.ts +++ b/open-sse/services/compression/types.ts @@ -11,6 +11,7 @@ import { ENGINE_IDS } from "./engineCatalog.ts"; import type { ContextBudgetConfig } from "./adaptiveCompression/types.ts"; +import type { FidelityGateConfig } from "./fidelityGate.ts"; // Re-export so consumers that already import from this module (e.g. src/lib/db/compression.ts) // can get ENGINE_IDS without a second bare `@omniroute/open-sse/...engineCatalog.ts` specifier. @@ -141,6 +142,8 @@ export interface CompressionConfig { comboOverrides: Record; compressionComboId?: string | null; stackedPipeline?: CompressionPipelineStep[]; + /** Opt-in per-step fidelity gate (default disabled). */ + fidelityGate?: FidelityGateConfig; cavemanConfig?: CavemanConfig; cavemanOutputMode?: CavemanOutputModeConfig; /** Phase 4A: selected output styles (supersedes cavemanOutputMode via a back-compat shim). */ @@ -232,6 +235,8 @@ export interface CompressionStats { techniquesUsed: string[]; rulesApplied?: string[]; durationMs?: number; + rejected?: boolean; + rejectReason?: string; }>; } diff --git a/tests/unit/compression/fidelityGateTypes.test.ts b/tests/unit/compression/fidelityGateTypes.test.ts new file mode 100644 index 0000000000..cb71f4ae3c --- /dev/null +++ b/tests/unit/compression/fidelityGateTypes.test.ts @@ -0,0 +1,13 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import type { CompressionConfig, CompressionStats } from "../../../open-sse/services/compression/types.ts"; +import type { FidelityGateConfig } from "../../../open-sse/services/compression/fidelityGate.ts"; +test("CompressionConfig accepts a fidelityGate block and breakdown carries rejected fields", () => { + const cfg: CompressionConfig = { fidelityGate: { enabled: true } as FidelityGateConfig }; + assert.equal(cfg.fidelityGate?.enabled, true); + const entry: NonNullable[number] = { + engine: "caveman", originalTokens: 10, compressedTokens: 10, savingsPercent: 0, + techniquesUsed: [], rejected: true, rejectReason: "numeric: 14 ausente", + }; + assert.equal(entry.rejected, true); +});