different-ai/openwork · error · InterpreterRuntimeError
Number.parseInt expects a numeric radix.
Error message
Number.parseInt expects a numeric radix.
What it means
When invoking the static Number.parseInt, CodeMode validates the optional radix argument: if provided, it must be a number. Passing a string or other type throws this error, because parseInt's radix must be numeric and silent coercion could produce surprising parse bases.
Source
Thrown at packages/codemode/src/stdlib/number.ts:55
}
return boundedData(result, `Number.${name} result`)
}
export const invokeNumberStatic = (name: string, args: Array<unknown>, node: AstNode): unknown => {
const value = args[0]
switch (name) {
case "isInteger":
return Number.isInteger(value)
case "isFinite":
return Number.isFinite(value)
case "isNaN":
return Number.isNaN(value)
case "isSafeInteger":
return Number.isSafeInteger(value)
case "parseInt": {
const radix = args[1]
if (radix !== undefined && typeof radix !== "number") {
throw new InterpreterRuntimeError("Number.parseInt expects a numeric radix.", node)
}
return parseInt(coerceToString(value), radix)
}
case "parseFloat":
return parseFloat(coerceToString(value))
default:
throw new InterpreterRuntimeError(`Number.${name} is not available in CodeMode.`, node)
}
}
import { type AstNode, InterpreterRuntimeError } from "../interpreter/model.js"
import { boundedData, coerceToString } from "./value.js"
View on GitHub (pinned to 2b7df46e8a)
Solutions
- Convert the radix with Number() or parseInt before passing it: parseInt(value, Number(radix)).
- Omit the radix entirely if you want the default (though best practice is to always pass a numeric radix).
- Validate config-sourced radix values at startup: typeof r === "number" && r >= 2 && r <= 36.
Example fix
// before const n = Number.parseInt(input, config.radix) // after const n = Number.parseInt(input, Number(config.radix) || 10)
Defensive patterns
Strategy: type-guard
Validate before calling
const radixNum = radix === undefined ? undefined : Number(radix)
if (radixNum !== undefined && !Number.isInteger(radixNum)) throw new TypeError("parseInt radix must be an integer number") Type guard
const isRadix = (v: unknown): v is number => typeof v === "number" && Number.isInteger(v)
Try / catch
try { return Number.parseInt(str, radix) } catch (e) { if (/expects a numeric radix/.test(String(e))) return Number.parseInt(str, Number(radix) || 10); throw e } Prevention
- Convert config/env-sourced radix strings with Number() before passing them
- Always pass an explicit numeric radix to parseInt (default pitfall: strings like '08')
- Type the radix parameter as number | undefined in wrappers around parseInt
When it happens
Trigger: Calling Number.parseInt(str, "16"), Number.parseInt(value, radixVar) where radixVar is undefined-as-string or came from config as a string, or passing null as the radix.
Common situations: Radix read from JSON/env config where everything is a string ('16'); passing the output of a prompt or CLI arg directly as radix; confusing parseInt with parseFloat calls where the second arg doesn't exist.
Related errors
- Number.${name} expects a number argument.
- String.${name} expects argument ${index + 1} to be a number.
- JSON.parse expects a string.
- Math.${name} expects number arguments.
- Number.toString radix must be between 2 and 36.
AI-assisted analysis of different-ai/openwork@2b7df46e8a (2026-09-01).
Data as JSON: /api/errors/351ec228e183bdcd.
Report an issue: GitHub.