From 9efe5cd75dcc69c3ebf8c608bb94d291bbf536bf Mon Sep 17 00:00:00 2001 From: Badri Narayanan S Date: Fri, 23 Jan 2026 12:13:03 +0530 Subject: [PATCH] fix(webui): add missing config fields to API handler The POST /api/config endpoint was missing validation for several Advanced Server Settings fields, causing the sliders to fail silently. Added support for: rateLimitDedupWindowMs, maxConsecutiveFailures, extendedCooldownMs, capacityRetryDelayMs, maxCapacityRetries. Fixes #181 Co-Authored-By: Claude --- src/webui/index.js | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/webui/index.js b/src/webui/index.js index f2cd228..a47daf9 100644 --- a/src/webui/index.js +++ b/src/webui/index.js @@ -287,7 +287,7 @@ export function mountWebUI(app, dirname, accountManager) { */ app.post('/api/config', (req, res) => { try { - const { debug, logLevel, maxRetries, retryBaseMs, retryMaxMs, persistTokenCache, defaultCooldownMs, maxWaitBeforeErrorMs, maxAccounts, accountSelection } = req.body; + const { debug, logLevel, maxRetries, retryBaseMs, retryMaxMs, persistTokenCache, defaultCooldownMs, maxWaitBeforeErrorMs, maxAccounts, accountSelection, rateLimitDedupWindowMs, maxConsecutiveFailures, extendedCooldownMs, capacityRetryDelayMs, maxCapacityRetries } = req.body; // Only allow updating specific fields (security) const updates = {}; @@ -316,6 +316,21 @@ export function mountWebUI(app, dirname, accountManager) { if (typeof maxAccounts === 'number' && maxAccounts >= 1 && maxAccounts <= 100) { updates.maxAccounts = maxAccounts; } + if (typeof rateLimitDedupWindowMs === 'number' && rateLimitDedupWindowMs >= 1000 && rateLimitDedupWindowMs <= 30000) { + updates.rateLimitDedupWindowMs = rateLimitDedupWindowMs; + } + if (typeof maxConsecutiveFailures === 'number' && maxConsecutiveFailures >= 1 && maxConsecutiveFailures <= 10) { + updates.maxConsecutiveFailures = maxConsecutiveFailures; + } + if (typeof extendedCooldownMs === 'number' && extendedCooldownMs >= 10000 && extendedCooldownMs <= 300000) { + updates.extendedCooldownMs = extendedCooldownMs; + } + if (typeof capacityRetryDelayMs === 'number' && capacityRetryDelayMs >= 500 && capacityRetryDelayMs <= 10000) { + updates.capacityRetryDelayMs = capacityRetryDelayMs; + } + if (typeof maxCapacityRetries === 'number' && maxCapacityRetries >= 1 && maxCapacityRetries <= 10) { + updates.maxCapacityRetries = maxCapacityRetries; + } // Account selection strategy validation if (accountSelection && typeof accountSelection === 'object') { const validStrategies = ['sticky', 'round-robin', 'hybrid'];