wavetermdev/waveterm · error
cannot convert number to %s
Error message
cannot convert number to %s
What it means
convertJsonNumber reaches its fallback when the target reflected type is neither int64, float64, nor string — meaning the config key is registered with an unsupported value type for numeric conversion. The target type is printed via its reflect.Type.
Source
Thrown at pkg/wconfig/settingsconfig.go:842
if ctype.Kind() == reflect.Pointer {
ctype = ctype.Elem()
}
if reflect.Int64 == ctype.Kind() {
if ival, err := num.Int64(); err == nil {
return ival, nil
}
return nil, fmt.Errorf("invalid number for int64: %s", num)
}
if reflect.Float64 == ctype.Kind() {
if fval, err := num.Float64(); err == nil {
return fval, nil
}
return nil, fmt.Errorf("invalid number for float64: %s", num)
}
if reflect.String == ctype.Kind() {
return num.String(), nil
}
return nil, fmt.Errorf("cannot convert number to %s", ctype)
}
func SetBaseConfigValue(toMerge waveobj.MetaMapType) error {
m, cerrs := ReadWaveHomeConfigFile(SettingsFile)
if len(cerrs) > 0 {
return fmt.Errorf("error reading config file: %v", cerrs[0])
}
if m == nil {
m = make(waveobj.MetaMapType)
}
for configKey, val := range toMerge {
ctype := getConfigKeyType(configKey)
if ctype == nil {
return fmt.Errorf("invalid config key: %s", configKey)
}
if val == nil {
delete(m, configKey)
} else {View on GitHub (pinned to a4447c1563)
Solutions
- Use the correct value type for the key (e.g. true/false for boolean keys)
- Check the key's declared type via getConfigKeyType / generated settings meta constants
- If the key should accept numbers, update its registered type in the config schema
Example fix
// before
m := waveobj.MetaMapType{"app:dismissarchitecturewarning": json.Number("1")}
// after
m := waveobj.MetaMapType{"app:dismissarchitecturewarning": true} Defensive patterns
Strategy: type-guard
Validate before calling
// ensure the key's target type accepts numbers before setting
switch getConfigKeyType(key).Kind() {
case reflect.Int64, reflect.Float64, reflect.String:
// ok
default:
return fmt.Errorf("key %s does not accept numeric values", key)
} Type guard
func acceptsNumber(t reflect.Type) bool {
switch t.Kind() {
case reflect.Int64, reflect.Float64, reflect.String:
return true
}
return false
} Try / catch
if err := wconfig.SetBaseConfigValue(m); err != nil {
if strings.Contains(err.Error(), "cannot convert number to") {
return fmt.Errorf("this key requires a non-numeric type: %w", err)
}
return err
} Prevention
- Match value kinds to the key's registered schema type
- Use booleans for boolean keys, not 0/1 numbers
- Consult generated meta constants for each key's type
When it happens
Trigger: Setting a json.Number value for a config key whose registered type is bool, a struct, a slice, or other non-numeric/non-string kind.
Common situations: Supplying a number to a boolean config key (e.g. a toggle set to 1 instead of true); API drift where a key's type changed between Wave versions.
Related errors
- invalid number for int64: %s
- invalid number for float64: %s
- cannot convert %s: %v
- invalid number type %s
- error setting telemetry value: %w
AI-assisted analysis of wavetermdev/waveterm@a4447c1563 (2026-09-01).
Data as JSON: /api/errors/90bd0e966a701e0d.
Report an issue: GitHub.