From d7cfb626bbf40dcc8d75884b5ba2a5f11457832f Mon Sep 17 00:00:00 2001 From: oyi77 Date: Wed, 29 Apr 2026 02:00:13 +0700 Subject: [PATCH] =?UTF-8?q?fix(compression):=20address=20Gemini=20review?= =?UTF-8?q?=20feedback=20=E2=80=94=20stats=20consistency,=20caching,=20pas?= =?UTF-8?q?sive-voice=20rule,=20console.log?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - strategySelector.ts: import and use createCompressionStats in aggressive/ultra branches for consistent stats objects - stats.ts: replace bare console.log with no-op comment (no unintended side-effects) - cavemanRules.ts: remove passive_voice rule (false-positive prone, not reliable) - src/lib/db/compression.ts: add inline 5s TTL cache to getCompressionSettings to avoid hot-path DB reads - toolResultCompressor.ts: raise skip-compression threshold from 2000 to 5000 chars (avoids over-compression of medium payloads) --- open-sse/services/compression/cavemanRules.ts | 15 ----------- open-sse/services/compression/stats.ts | 4 +-- .../services/compression/strategySelector.ts | 25 ++++++++++++++++--- .../compression/toolResultCompressor.ts | 2 +- src/lib/db/compression.ts | 16 ++++++++++++ 5 files changed, 39 insertions(+), 23 deletions(-) diff --git a/open-sse/services/compression/cavemanRules.ts b/open-sse/services/compression/cavemanRules.ts index 51e9958d04..4fd6628292 100644 --- a/open-sse/services/compression/cavemanRules.ts +++ b/open-sse/services/compression/cavemanRules.ts @@ -200,21 +200,6 @@ const CAVEMAN_RULES: CavemanRule[] = [ replacement: "", context: "all", }, - { - name: "passive_voice", - pattern: /\b(?:is being used|is being called|was created|was generated|was implemented)\b/gi, - replacement: (match: string): string => { - const map: Record = { - "is being used": "uses", - "is being called": "calls", - "was created": "created", - "was generated": "generated", - "was implemented": "implemented", - }; - return map[match.toLowerCase()] ?? match; - }, - context: "all", - }, // ── Category 4: Multi-Turn Dedup (5+ rules) ───────────────────────── diff --git a/open-sse/services/compression/stats.ts b/open-sse/services/compression/stats.ts index 2d438546dd..d944738b19 100644 --- a/open-sse/services/compression/stats.ts +++ b/open-sse/services/compression/stats.ts @@ -47,9 +47,7 @@ export function trackCompressionStats(stats: CompressionStats): void { if (stats.originalTokens <= 0) return; const rulesInfo = stats.rulesApplied?.length ? ` rules=${stats.rulesApplied.join(",")}` : ""; const durationInfo = stats.durationMs !== undefined ? ` ${stats.durationMs}ms` : ""; - console.log( - `[COMPRESSION] mode=${stats.mode} tokens=${stats.originalTokens}->${stats.compressedTokens} savings=${stats.savingsPercent}% techniques=${stats.techniquesUsed.join(",")}${rulesInfo}${durationInfo}` - ); + // Compression stats tracking — no-op in production (use structured logging if needed) } export function getDefaultCompressionConfig(): CompressionConfig { diff --git a/open-sse/services/compression/strategySelector.ts b/open-sse/services/compression/strategySelector.ts index 7970a48918..7d4634a58a 100644 --- a/open-sse/services/compression/strategySelector.ts +++ b/open-sse/services/compression/strategySelector.ts @@ -3,6 +3,7 @@ import { applyLiteCompression } from "./lite.ts"; import { cavemanCompress } from "./caveman.ts"; import { compressAggressive } from "./aggressive.ts"; import { ultraCompress } from "./ultra.ts"; +import { createCompressionStats } from "./stats.ts"; export function checkComboOverride( config: CompressionConfig, @@ -68,10 +69,18 @@ export async function applyCompression( } const aggressiveConfig = options?.config?.aggressive; const result = compressAggressive(messages, aggressiveConfig); + const compressedBody = { ...body, messages: result.messages }; return { - body: { ...body, messages: result.messages }, + body: compressedBody, compressed: result.stats.savingsPercent > 0, - stats: result.stats, + stats: createCompressionStats( + body, + compressedBody, + mode, + ["aggressive"], + result.stats.rulesApplied, + result.stats.durationMs + ), }; } if (mode === "ultra") { @@ -85,10 +94,18 @@ export async function applyCompression( } const ultraConfig = options?.config?.ultra; const result = await ultraCompress(messages, ultraConfig ?? {}); + const compressedBody = { ...body, messages: result.messages }; return { - body: { ...body, messages: result.messages }, + body: compressedBody, compressed: result.stats.savingsPercent > 0, - stats: result.stats, + stats: createCompressionStats( + body, + compressedBody, + mode, + ["ultra"], + result.stats.rulesApplied, + result.stats.durationMs + ), }; } return { body, compressed: false, stats: null }; diff --git a/open-sse/services/compression/toolResultCompressor.ts b/open-sse/services/compression/toolResultCompressor.ts index 573fb592a3..59d5c9bf78 100644 --- a/open-sse/services/compression/toolResultCompressor.ts +++ b/open-sse/services/compression/toolResultCompressor.ts @@ -63,7 +63,7 @@ function compressShellOutput(content: string): string | null { } function compressJson(content: string): string | null { - if (content.length <= 2000) return null; + if (content.length <= 5000) return null; if (!JSON_PREFIX_RE.test(content)) return null; let parsed: unknown; try { diff --git a/src/lib/db/compression.ts b/src/lib/db/compression.ts index 9e1edbc024..c0463a9a15 100644 --- a/src/lib/db/compression.ts +++ b/src/lib/db/compression.ts @@ -18,6 +18,9 @@ const NAMESPACE = "compression"; type JsonRecord = Record; +// TTL cache for compression settings (5s) +let compressionSettingsCache: { value: CompressionConfig; expiresAt: number } | null = null; + function toRecord(value: unknown): JsonRecord { return value && typeof value === "object" ? (value as JsonRecord) : {}; } @@ -32,6 +35,11 @@ function parseJsonSafe(raw: string | null): unknown { } export function getCompressionSettings(): CompressionConfig { + // Check TTL cache + if (compressionSettingsCache && Date.now() < compressionSettingsCache.expiresAt) { + return compressionSettingsCache.value; + } + const db = getDbInstance(); const rows = db.prepare("SELECT key, value FROM key_value WHERE namespace = ?").all(NAMESPACE); @@ -110,6 +118,12 @@ export function getCompressionSettings(): CompressionConfig { } } + // Store in TTL cache (5s expiry) + compressionSettingsCache = { + value: config, + expiresAt: Date.now() + 5000, + }; + return config; } @@ -126,6 +140,8 @@ export function updateCompressionSettings(settings: Record): vo }); transaction(); + // Clear TTL cache on update + compressionSettingsCache = null; invalidateDbCache(); }