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"); } }