{"record":{"id":"148d51f98a9da11f","repo":"Hmbown/CodeWhale","slug":"invalid-port","errorCode":"invalid_port","errorMessage":"port must be an integer in 1..65535","messagePattern":"port must be an integer in 1\\.\\.65535","errorType":"validation","errorClass":"RegistryError","httpStatus":null,"severity":"error","filePath":"crates/tui/plugins/computer-use/src/registry.mjs","lineNumber":91,"sourceCode":"  save(reg);\n  return c;\n}\n\n/** Register or update a computer. Returns the entry. */\nexport function register({ id, transport, label, ...rest }) {\n  if (!id || !ID_RE.test(id)) throw new RegistryError(\"invalid_id\", \"computer id must match \" + ID_RE);\n  if (![\"local\", \"ssh\", \"hdc\", \"docker\"].includes(transport)) {\n    throw new RegistryError(\"invalid_transport\", \"transport must be one of: local, ssh, hdc, docker\");\n  }\n  if (id === \"local\" && transport !== \"local\") {\n    throw new RegistryError(\"reserved_id\", '\"local\" is reserved for this machine');\n  }\n  if (transport === \"ssh\") {\n    if (!rest.host || !/^[A-Za-z0-9._-]+$/.test(rest.host)) {\n      throw new RegistryError(\"invalid_host\", \"ssh computers need a valid host (letters, digits, dot, dash, underscore)\");\n    }\n    if (rest.port != null && (!Number.isInteger(rest.port) || rest.port < 1 || rest.port > 65535)) {\n      throw new RegistryError(\"invalid_port\", \"port must be an integer in 1..65535\");\n    }\n    if (rest.user != null && !/^[a-zA-Z0-9._-]+$/.test(rest.user)) {\n      throw new RegistryError(\"invalid_user\", \"user must be a plain name\");\n    }\n  }\n  if (transport === \"hdc\") {\n    if (rest.target != null && !/^[A-Za-z0-9._-]*$/.test(rest.target)) {\n      throw new RegistryError(\"invalid_target\", \"hdc target key contains invalid characters\");\n    }\n    rest.platform = \"harmonyos\";\n  }\n  if (transport === \"docker\") {\n    if (!rest.container || !/^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/.test(rest.container)) {\n      throw new RegistryError(\"invalid_container\", \"docker computers need a valid container name\");\n    }\n    // Spawned containers always run the Linux desktop image.\n    rest.platform = rest.platform ?? \"linux\";\n  }","sourceCodeStart":73,"sourceCodeEnd":109,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/73e0f67d83c59909b571efdfc88c4bc28c309cb1/crates/tui/plugins/computer-use/src/registry.mjs#L73-L109","documentation":"RegistryError \"invalid_port\": for ssh transports, an optional rest.port must be an integer between 1 and 65535. Strings, floats, 0, negatives, and values above 65535 are all rejected because the value ends up as a numeric ssh -p argument.","triggerScenarios":"register({ id: \"x\", transport: \"ssh\", host: \"h\", port: \"2222\" }) (string from config/CLI); port: 0 or port: 70000; port: 22.5; port from Number.parseInt of user input that was empty (NaN).","commonSituations":"YAML/JSON config that reads ports as strings; environment-variable-supplied ports never converted to Number; computing a port from a formula that yields NaN or a float.","solutions":["Convert to an integer first: port: Number.parseInt(raw, 10), and only pass it when the result is a valid integer.","Use a value in 1..65535; the default ssh port 22 can simply be omitted.","Fix config sources that emit strings (YAML unquoted numbers, env vars) at parse time.","Validate with Number.isInteger(p) && p >= 1 && p <= 65535 before calling register()."],"exampleFix":"// before\nregister({ id: \"lab\", transport: \"ssh\", host: \"10.0.0.5\", port: process.env.SSH_PORT });\n// after\nconst p = Number.parseInt(process.env.SSH_PORT, 10);\nregister({ id: \"lab\", transport: \"ssh\", host: \"10.0.0.5\", ...(Number.isInteger(p) ? { port: p } : {}) });","handlingStrategy":"validation","validationCode":"const p = Number.parseInt(rawPort, 10);\nconst validPort = Number.isInteger(p) && p >= 1 && p <= 65535;\nif (rawPort != null && !validPort) throw new Error(\"port must be an integer in 1..65535\");","typeGuard":"const isValidPort = (p) => Number.isInteger(p) && p >= 1 && p <= 65535;","tryCatchPattern":"try {\n  register(cfg);\n} catch (e) {\n  if (e?.code === \"invalid_port\") console.error(`Port ${JSON.stringify(cfg.port)} is not a valid 1..65535 integer`);\n  throw e;\n}","preventionTips":["Convert env/YAML string ports with Number.parseInt at parse time","Omit port for the default 22","Reject NaN early — parseInt of empty input yields NaN","Check Number.isInteger, not typeof number, since floats pass typeof"],"tags":["validation","ssh","registry","range-check"],"backgroundTag":"value-out-of-range","analyzedSha":"73e0f67d83c59909b571efdfc88c4bc28c309cb1","analyzedAt":"2026-09-22T01:30:00.501Z","contentChangedAt":"2026-09-22T01:30:00.501Z","schemaVersion":2},"datasetVersion":"2026-09-22T11:17:16.035Z"}