From b3e2a3b558e3d24de769b8bc3153d8fdddc779c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?T=C3=82CHES?= Date: Wed, 18 Mar 2026 11:35:23 -0600 Subject: [PATCH] refactor: extract numeric validation helpers in prefs wizard (#1205) Co-authored-by: Claude Opus 4.6 (1M context) --- .../extensions/gsd/commands-prefs-wizard.ts | 43 ++++++++++++++----- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/src/resources/extensions/gsd/commands-prefs-wizard.ts b/src/resources/extensions/gsd/commands-prefs-wizard.ts index e4985d8c8..59d42bf1b 100644 --- a/src/resources/extensions/gsd/commands-prefs-wizard.ts +++ b/src/resources/extensions/gsd/commands-prefs-wizard.ts @@ -30,6 +30,25 @@ function extractBodyAfterFrontmatter(content: string): string | null { return afterFrontmatter.trim() ? afterFrontmatter : null; } +// ─── Numeric validation helpers ────────────────────────────────────────────── + +/** Parse a string as a non-negative integer, or return null on failure. */ +function tryParseInteger(val: string): number | null { + return /^\d+$/.test(val) ? Number(val) : null; +} + +/** Parse a string as a finite number, or return null on failure. */ +function tryParseNumber(val: string): number | null { + const n = Number(val); + return !isNaN(n) && isFinite(n) ? n : null; +} + +/** Parse a string as a number in the 0–100 range, or return null on failure. */ +function tryParsePercentage(val: string): number | null { + const n = Number(val); + return !isNaN(n) && n >= 0 && n <= 100 ? n : null; +} + export async function handlePrefs(args: string, ctx: ExtensionCommandContext): Promise { const trimmed = args.trim(); @@ -304,9 +323,10 @@ async function configureTimeouts(ctx: ExtensionCommandContext, prefs: Record= 0 && Number(val) <= 100) { - const num = Number(val); - if (num === 0) { + const parsed = tryParsePercentage(val); + if (val && parsed !== null) { + if (parsed === 0) { delete prefs.context_pause_threshold; } else { - prefs.context_pause_threshold = num; + prefs.context_pause_threshold = parsed; } - } else if (val && (isNaN(Number(val)) || Number(val) < 0 || Number(val) > 100)) { + } else if (val) { ctx.ui.notify(`Invalid context pause threshold "${val}" — must be 0-100. Keeping previous value.`, "warning"); } }