{"record":{"id":"873b6e8018f8ff06","repo":"oraios/serena","slug":"invalid-language-server-identifier-request-add-l","errorCode":null,"errorMessage":"Invalid language server identifier: {request_add_language.language}","messagePattern":"Invalid language server identifier: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"src/serena/dashboard.py","lineNumber":783,"sourceCode":"    def _load_previously_fetched_news_data() -> dict[str, str]:\n        \"\"\"Return the news data dict. Uses local cache if available, otherwise falls back to local news files.\"\"\"\n        paths = SerenaPaths()\n\n        if os.path.exists(paths.news_file):\n            try:\n                with open(paths.news_file, encoding=\"utf-8\") as f:\n                    return json.loads(f.read())\n            except Exception:\n                log.warning(\"Failed to read cached news data from %s\", paths.news_file)\n        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:","sourceCodeStart":765,"sourceCodeEnd":801,"githubUrl":"https://github.com/oraios/serena/blob/7fcbca7e62555ec2287ddb2f083caee805848ea6/src/serena/dashboard.py#L765-L801","documentation":"The add-language endpoint converts the requested language string to a `LanguageServerId` enum (solidlsp.ls_config). If the string doesn't match any enum member, LanguageServerId raises ValueError, which `_add_language` re-raises as ValueError('Invalid language server identifier: ...'). Only exact, case-matching language identifiers accepted by solidlsp are valid.","triggerScenarios":"Calling the dashboard /add_language endpoint with `language` values such as 'typescript' (when the enum expects 'typescriptreact' or a different casing), 'python3', 'c++', or any misspelled/unsupported identifier.","commonSituations":"Hard-coding a language name not in the supported LanguageServerId enum; casing mismatches; using a language added in a newer solidlsp version than the installed one; typos in dashboard automation scripts.","solutions":["Use an exact identifier from the LanguageServerId enum in solidlsp/ls_config.py (e.g. print the enum members) for the request body.","Fix casing/typo in the `language` field — enum lookup is case-sensitive.","Upgrade solidlsp/Serena if the language exists only in newer releases.","Wrap the call in try/except ValueError and surface the list of valid identifiers to the user."],"exampleFix":"// before\nawait fetch(`${dashboard}/add_language`, {method: \"POST\", body: JSON.stringify({language: \"ts\"})});\n// after\nawait fetch(`${dashboard}/add_language`, {method: \"POST\", body: JSON.stringify({language: \"typescript\"})});","handlingStrategy":"validation","validationCode":"from solidlsp.ls_config import LanguageServerId\nif request_language not in {m.value for m in LanguageServerId}:\n    raise ValueError(f\"{request_language} not supported; valid: {sorted(m.value for m in LanguageServerId)}\")","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}/add_language\", json={\"language\": lang})\nexcept ValueError as e:\n    logger.error(\"Bad language id %r; valid ids: %s\", lang, [m.value for m in LanguageServerId])","preventionTips":["Copy identifiers directly from the LanguageServerId enum, never from memory.","Mind casing — the enum lookup is case-sensitive.","Pin your solidlsp/Serena version and check the enum when upgrading.","Prefer the activate_project-style language options over raw strings where offered."],"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"}