{"record":{"id":"7ed520d8ada54bab","repo":"oraios/serena","slug":"invalid-language-server-identifier-request-remov","errorCode":null,"errorMessage":"Invalid language server identifier: {request_remove_language.language}","messagePattern":"Invalid language server identifier: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"src/serena/dashboard.py","lineNumber":793,"sourceCode":"        return {}\n\n    def _add_language(self, request_add_language: RequestAddLanguage) -> None:\n        from solidlsp.ls_config import LanguageServerId\n\n        try:\n            language = LanguageServerId(request_add_language.language)\n        except ValueError:\n            raise ValueError(f\"Invalid language server identifier: {request_add_language.language}\")\n        # add_language is already thread-safe\n        self._agent.add_language_server(language)\n\n    def _remove_language(self, request_remove_language: RequestRemoveLanguage) -> None:\n        from solidlsp.ls_config import LanguageServerId\n\n        try:\n            language = LanguageServerId(request_remove_language.language)\n        except ValueError:\n            raise ValueError(f\"Invalid language server identifier: {request_remove_language.language}\")\n        # remove_language is already thread-safe\n        self._agent.remove_language_server(language)\n\n    @staticmethod\n    def _find_first_free_port(start_port: int, host: str) -> int:\n        port = start_port\n        while port <= 65535:\n            try:\n                with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:\n                    sock.bind((host, port))\n                    return port\n            except OSError:\n                port += 1\n\n        raise RuntimeError(f\"No free ports found starting from {start_port}\")\n\n    def run(self, port: int) -> int:\n        \"\"\"","sourceCodeStart":775,"sourceCodeEnd":811,"githubUrl":"https://github.com/oraios/serena/blob/7fcbca7e62555ec2287ddb2f083caee805848ea6/src/serena/dashboard.py#L775-L811","documentation":"The remove-language endpoint parses `request_remove_language.language` into a `LanguageServerId` enum. An unknown or misspelled identifier makes the enum constructor raise ValueError, which `_remove_language` re-raises as ValueError('Invalid language server identifier: ...'). The language server is not touched.","triggerScenarios":"Calling the dashboard /remove_language endpoint with a language string not in the LanguageServerId enum — wrong casing ('Python'), abbreviations ('js' instead of 'javascript'), unsupported languages, or a name from a different solidlsp version.","commonSituations":"Cleanup scripts removing servers added earlier with a different spelling; config drift between the identifier used at add-time and remove-time; users guessing identifier names instead of reading the enum.","solutions":["Pass the exact LanguageServerId enum name as it was accepted by /add_language (list members from solidlsp/ls_config.py to confirm).","Correct casing/spelling in the request body.","Upgrade solidlsp if the identifier is only defined in newer versions.","Echo back the valid identifier list in the error handler so callers self-correct."],"exampleFix":"// before\nawait fetch(`${dashboard}/remove_language`, {method: \"POST\", body: JSON.stringify({language: \"Python\"})});\n// after\nawait fetch(`${dashboard}/remove_language`, {method: \"POST\", body: JSON.stringify({language: \"python\"})});","handlingStrategy":"try-catch","validationCode":"from solidlsp.ls_config import LanguageServerId\nvalid = {m.value for m in LanguageServerId}\nif lang not in valid:\n    raise ValueError(f\"Cannot remove {lang!r}; valid: {sorted(valid)}\")","typeGuard":"def is_valid_language(name: str) -> bool:\n    try:\n        LanguageServerId(name)\n        return True\n    except ValueError:\n        return False","tryCatchPattern":"try:\n    requests.post(f\"{dashboard}/remove_language\", json={\"language\": lang})\nexcept ValueError:\n    logger.error(\"Invalid language identifier %r; use an exact LanguageServerId value\", lang)","preventionTips":["Use the exact same identifier string that add_language accepted.","List LanguageServerId members before writing remove calls.","Keep add/remove language identifiers in a shared constant in automation code.","Check casing and avoid abbreviations ('js', 'ts') — use full enum names."],"tags":["dashboard","validation","language-server","http"],"backgroundTag":"invalid-enum-value","analyzedSha":"7fcbca7e62555ec2287ddb2f083caee805848ea6","analyzedAt":"2026-08-29T00:04:09.619Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}