"use client"; import { useState, useEffect } from "react"; import { Card, Button } from "@/shared/components"; import { useTranslations } from "next-intl"; type CompressionMode = "off" | "lite" | "standard" | "aggressive" | "ultra" | "rtk" | "stacked"; type CavemanIntensity = "lite" | "full" | "ultra"; interface CavemanConfig { enabled: boolean; compressRoles: ("user" | "assistant" | "system")[]; skipRules: string[]; minMessageLength: number; preservePatterns: string[]; intensity: CavemanIntensity; } interface CavemanOutputModeConfig { enabled: boolean; intensity: CavemanIntensity; autoClarity: boolean; } interface AggressiveConfig { thresholds: { fullSummary: number; moderate: number; light: number; verbatim: number; }; toolStrategies: { fileContent: boolean; grepSearch: boolean; shellOutput: boolean; json: boolean; errorMessage: boolean; }; summarizerEnabled: boolean; maxTokensPerMessage: number; minSavingsThreshold: number; } interface UltraConfig { enabled: boolean; compressionRate: number; minScoreThreshold: number; slmFallbackToAggressive: boolean; modelPath?: string; maxTokensPerMessage: number; } interface CompressionConfig { enabled: boolean; defaultMode: CompressionMode; autoTriggerMode?: CompressionMode; autoTriggerTokens: number; cacheMinutes: number; preserveSystemPrompt: boolean; mcpDescriptionCompressionEnabled?: boolean; comboOverrides: Record; cavemanConfig?: CavemanConfig; cavemanOutputMode?: CavemanOutputModeConfig; aggressive?: AggressiveConfig; ultra?: UltraConfig; } interface RuleMetadata { name: string; category: string; context: string; minIntensity: CavemanIntensity; intensities?: CavemanIntensity[]; description: string; } const MODES: { value: CompressionMode; labelKey: string; descKey: string; icon: string }[] = [ { value: "off", labelKey: "compressionModeOff", descKey: "compressionModeOffDesc", icon: "block", }, { value: "lite", labelKey: "compressionModeLite", descKey: "compressionModeLiteDesc", icon: "compress", }, { value: "standard", labelKey: "compressionModeStandard", descKey: "compressionModeStandardDesc", icon: "speed", }, { value: "aggressive", labelKey: "compressionModeAggressive", descKey: "compressionModeAggressiveDesc", icon: "bolt", }, { value: "ultra", labelKey: "compressionModeUltra", descKey: "compressionModeUltraDesc", icon: "filter_alt", }, { value: "rtk", labelKey: "compressionModeRtk", descKey: "compressionModeRtkDesc", icon: "filter_list", }, { value: "stacked", labelKey: "compressionModeStacked", descKey: "compressionModeStackedDesc", icon: "hub", }, ]; const ROLE_OPTIONS: { value: "user" | "assistant" | "system"; labelKey: string }[] = [ { value: "user", labelKey: "compressionRoleUser" }, { value: "assistant", labelKey: "compressionRoleAssistant" }, { value: "system", labelKey: "compressionRoleSystem" }, ]; export default function CompressionSettingsTab() { const t = useTranslations("settings"); const [config, setConfig] = useState({ enabled: false, defaultMode: "off", autoTriggerTokens: 0, cacheMinutes: 5, preserveSystemPrompt: true, comboOverrides: {}, cavemanConfig: { enabled: true, compressRoles: ["user"], skipRules: [], minMessageLength: 50, preservePatterns: [], intensity: "full", }, cavemanOutputMode: { enabled: false, intensity: "full", autoClarity: true, }, aggressive: { thresholds: { fullSummary: 5, moderate: 3, light: 2, verbatim: 2 }, toolStrategies: { fileContent: true, grepSearch: true, shellOutput: true, json: true, errorMessage: true, }, summarizerEnabled: true, maxTokensPerMessage: 2048, minSavingsThreshold: 0.05, }, ultra: { enabled: false, compressionRate: 0.5, minScoreThreshold: 0.3, slmFallbackToAggressive: true, maxTokensPerMessage: 0, }, }); const [saving, setSaving] = useState(false); const [loading, setLoading] = useState(true); const [status, setStatus] = useState<"" | "saved" | "error">(""); const [ruleMetadata, setRuleMetadata] = useState([]); useEffect(() => { fetch("/api/settings/compression") .then((r) => (r.ok ? r.json() : null)) .then((data) => { if (data) setConfig(data); }) .catch(() => {}) .finally(() => setLoading(false)); fetch("/api/compression/rules") .then((r) => (r.ok ? r.json() : null)) .then((data) => { if (Array.isArray(data?.rules)) setRuleMetadata(data.rules); }) .catch(() => {}); }, []); const save = async (updates: Partial) => { const newConfig = { ...config, ...updates }; setConfig(newConfig); setSaving(true); setStatus(""); try { const res = await fetch("/api/settings/compression", { method: "PUT", headers: { "Content-Type": "application/json" }, body: JSON.stringify(newConfig), }); if (res.ok) { setStatus("saved"); setTimeout(() => setStatus(""), 2000); } else { setStatus("error"); } } catch { setStatus("error"); } finally { setSaving(false); } }; const toggleCavemanRole = (role: "user" | "assistant" | "system") => { const currentRoles = config.cavemanConfig?.compressRoles ?? ["user"]; const newRoles = currentRoles.includes(role) ? currentRoles.filter((r) => r !== role) : [...currentRoles, role]; save({ cavemanConfig: { ...config.cavemanConfig!, compressRoles: newRoles }, }); }; const toggleCavemanRule = (rule: string) => { const currentSkip = config.cavemanConfig?.skipRules ?? []; const newSkip = currentSkip.includes(rule) ? currentSkip.filter((r) => r !== rule) : [...currentSkip, rule]; save({ cavemanConfig: { ...config.cavemanConfig!, skipRules: newSkip }, }); }; if (loading) { return (

{t("loading")}

); } return (

{t("compressionTitle")}

{t("compressionDesc")}

{status === "saved" && ( check_circle {t("saved")} )} {status === "error" && ( error {t("saveFailed")} )}
{config.enabled && (

{t("compressionMode")}

{MODES.map((m) => ( ))}
)} {config.enabled && (

{t("compressionGeneral")}

)} {config.enabled && config.defaultMode !== "off" && config.defaultMode !== "lite" && config.cavemanConfig && (

{t("compressionCavemanConfig")}

{t("compressionCavemanConfigDesc")}

{config.cavemanConfig.enabled && ( <>

{t("compressionRoles")}

{ROLE_OPTIONS.map((opt) => ( ))}

{t("compressionSkipRules")}

{t("compressionSkipRulesDesc")}

{ruleMetadata.map((rule) => ( ))}

{t("compressionPreservePatterns")}

{t("compressionPreservePatternsDesc")}