import { useStore } from '@nanostores/react' import { useEffect, useState } from 'react' import { ListRow } from '@/app/settings/primitives' import { Input } from '@/components/ui/input' import { useI18n } from '@/i18n' import { $poolLimits, loadPoolLimits, savePoolLimits } from '@/store/pool-limits' // Bounds imported from main's clamp module so the advertised input ranges // can never drift from what the pool actually enforces (review note on #92581). import { POOL_LIMITS_BOUNDS } from '../../../electron/pool-limits' const MAX_BACKENDS_MAX = POOL_LIMITS_BOUNDS.maxBackendsMax const IDLE_MS_MAX = POOL_LIMITS_BOUNDS.idleMsMax /** Settings → Advanced: warm-bot-backends count + backend idle timeout. * Device-local (not profile-scoped): the pool is sized once per machine and * changes apply live — main evicts/reaps to converge without a restart. */ export function PoolLimitsSetting() { const { t } = useI18n() const copy = t.settings.runtime.pool const limits = useStore($poolLimits) const [maxDraft, setMaxDraft] = useState(String(limits.maxBackends)) const [idleDraft, setIdleDraft] = useState(String(limits.idleMs)) useEffect(() => { void loadPoolLimits() }, []) useEffect(() => { setMaxDraft(String(limits.maxBackends)) setIdleDraft(String(limits.idleMs)) }, [limits]) const commitMax = () => { const parsed = Number(maxDraft) if (!Number.isFinite(parsed) || parsed === limits.maxBackends) { setMaxDraft(String(limits.maxBackends)) return } void savePoolLimits({ maxBackends: parsed }) .then(() => undefined) .catch(() => setMaxDraft(String($poolLimits.get().maxBackends))) } const commitIdle = () => { const parsed = Number(idleDraft) if (!Number.isFinite(parsed) || parsed === limits.idleMs) { setIdleDraft(String(limits.idleMs)) return } void savePoolLimits({ idleMs: parsed }) .then(() => undefined) .catch(() => setIdleDraft(String($poolLimits.get().idleMs))) } return ( <> setMaxDraft(event.target.value)} onKeyDown={event => { if (event.key === 'Enter') { event.currentTarget.blur() } }} type="number" value={maxDraft} /> } description={copy.warmHint} title={copy.warm} /> setIdleDraft(event.target.value)} onKeyDown={event => { if (event.key === 'Enter') { event.currentTarget.blur() } }} type="number" value={idleDraft} /> ms } description={copy.idleHint} title={copy.idle} /> ) }