UNPKG

@ooples/token-optimizer-mcp

Version:

Intelligent context window optimization for Claude Code - store content externally via caching and compression, freeing up your context window for what matters

114 lines 3.72 kB
import { brotliCompressSync, brotliDecompressSync, constants } from 'zlib'; export class CompressionEngine { DEFAULT_QUALITY = 11; /** * Compress text using Brotli */ compress(text, options) { const buffer = Buffer.from(text, 'utf-8'); const quality = options?.quality ?? this.DEFAULT_QUALITY; const mode = this.getModeConstant(options?.mode); const compressed = brotliCompressSync(buffer, { params: { [constants.BROTLI_PARAM_QUALITY]: quality, [constants.BROTLI_PARAM_MODE]: mode, }, }); const originalSize = buffer.length; const compressedSize = compressed.length; const ratio = originalSize > 0 ? compressedSize / originalSize : 0; const percentSaved = originalSize > 0 ? ((originalSize - compressedSize) / originalSize) * 100 : 0; return { compressed, originalSize, compressedSize, ratio, percentSaved, }; } /** * Decompress Brotli-compressed data */ decompress(compressed) { const decompressed = brotliDecompressSync(compressed); return decompressed.toString('utf-8'); } /** * Compress to base64 string (for easier storage) */ compressToBase64(text, options) { const result = this.compress(text, options); return { compressed: result.compressed.toString('base64'), originalSize: result.originalSize, compressedSize: result.compressedSize, ratio: result.ratio, percentSaved: result.percentSaved, }; } /** * Decompress from base64 string */ decompressFromBase64(compressed) { const buffer = Buffer.from(compressed, 'base64'); return this.decompress(buffer); } /** * Check if compression would be beneficial */ shouldCompress(text, minSize = 1000) { // Don't compress small texts - overhead not worth it if (text.length < minSize) { return false; } // Quick sample compression to check ratio const sample = text.slice(0, Math.min(text.length, 5000)); const result = this.compress(sample, { quality: 4 }); // Use lower quality for quick test // Only compress if we get at least 20% reduction return result.percentSaved >= 20; } /** * Batch compress multiple texts */ compressBatch(texts, options) { return texts.map((text, index) => { const result = this.compress(text, options); return { index, compressed: result.compressed, originalSize: result.originalSize, compressedSize: result.compressedSize, ratio: result.ratio, }; }); } /** * Get compression statistics for text */ getCompressionStats(text) { const result = this.compress(text); return { uncompressed: result.originalSize, compressed: result.compressedSize, ratio: result.ratio, percentSaved: result.percentSaved, recommended: this.shouldCompress(text), }; } /** * Convert mode string to Brotli constant */ getModeConstant(mode) { switch (mode) { case 'text': return constants.BROTLI_MODE_TEXT; case 'font': return constants.BROTLI_MODE_FONT; default: return constants.BROTLI_MODE_GENERIC; } } } //# sourceMappingURL=compression-engine.js.map