import { useEffect, useState } from 'react' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Switch } from '@/components/ui/switch' import { useI18n } from '@/i18n/context' import { Link } from '@/lib/icons' import type { CompressionSettings, CompressionState } from '../../../electron/compression-settings-types' import { ListRow, SettingsSection } from './primitives' export function CompressionSettingsView() { const api = window.hermesDesktop?.codexLink const { locale } = useI18n() const tr = locale === 'tr' const t = (a: string, b: string) => tr ? a : b const [state, setState] = useState(null) const [draft, setDraft] = useState(null) const [busy, setBusy] = useState(false) const [message, setMessage] = useState('') const [failed, setFailed] = useState(false) useEffect(() => { let active = true api?.getCompression?.().then(next => { if (active) { setState(next); setDraft(next.settings) } }, () => { if (active) { setFailed(true); setMessage(tr ? 'Sıkıştırma ayarları okunamadı.' : 'Could not load compression settings.') } }) return () => { active = false } }, [api, tr]) if (!api?.getCompression) return null const change = (key: K, value: CompressionSettings[K]) => { if (draft) setDraft({ ...draft, [key]: value }) } const numeric = (key: 'keepTurns' | 'transferPercent' | 'maxTokens' | 'triggerPercent' | 'targetPercent' | 'timeoutSeconds', label: string, min: number, max: number) => ( change(key, e.target.valueAsNumber)} />} /> ) const modelSelect = (key: 'primaryModel' | 'fallbackModel', label: string) => { const models = (state?.models ?? []).filter(m => key !== 'fallbackModel' || m.window >= 1000000) const selected = draft?.[key] ?? '' return change(key, e.target.value)}> {selected && !models.some(m => m.id === selected) && } {models.map(m => )} } /> } return

{t('Ek modellerle geçişleri ve aynı ek modelde bağlamı yönetir. Sohbet kimliği ve tam geçmiş korunur. Abonelik modellerinin kendi aralarındaki geçişleri Codex yönetir.', 'Manages transfers involving added models and their ongoing context. Chat identity and full history are preserved. Codex manages transitions between subscription models.')}

{draft && <> {modelSelect('primaryModel', t('Sıkıştırmadan sorumlu model', 'Primary summarizer'))} {modelSelect('fallbackModel', t('Yedek sıkıştırıcı (1M)', 'Fallback summarizer (1M)'))} {state && !state.modelsAvailable &&

{t('Model kataloğuna ulaşılamadı.', 'Model catalog unavailable.')}

} change('currentModelFallback', v)} />} /> change('level', e.target.value as CompressionSettings['level'])}> {(['mini', 'az', 'orta', 'fazla', 'cok-fazla'] as const).map((value, i) => )} } /> {numeric('keepTurns', t('Korunan son mesajlaşma sayısı', 'Recent exchanges to preserve'), 1, 100)}

{t('Bir mesajlaşma, kullanıcı mesajı ve ardından gelen cevap/araç işlemleridir. Korunan bölüm sığmazsa geçiş durur; bu sayı kendiliğinden azaltılmaz.', 'An exchange includes a user message and subsequent replies/tool operations. If the protected section cannot fit, the transfer stops without reducing this count.')}

change('budgetMode', e.target.value as CompressionSettings['budgetMode'])}>} /> {draft.budgetMode === 'percent' ? numeric('transferPercent', t('Hedef model bağlamı (%)', 'Target model context (%)'), 10, 90) : numeric('maxTokens', t('Maksimum giriş tokenı', 'Maximum input tokens'), 1024, 2000000)} change('autoEnabled', v)} />} /> {numeric('triggerPercent', t('Başlama eşiği (%)', 'Trigger threshold (%)'), 20, 90)} {numeric('targetPercent', t('Sıkıştırma sonrası hedef (%)', 'Target after compression (%)'), 10, 80)} {numeric('timeoutSeconds', t('Sıkıştırıcı bekleme süresi (saniye)', 'Summarizer timeout (seconds)'), 1, 3600)} } {message &&

{message}

}
}