{"record":{"id":"cf98c00bda92ec23","repo":"oraios/serena","slug":"no-language-server-for-language-language-value-p","errorCode":null,"errorMessage":"No language server for language {language.value} present; cannot restart","messagePattern":"No language server for language (.+?) present; cannot restart","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"src/serena/ls_manager.py","lineNumber":200,"sourceCode":"\n    def _create_and_start_language_server(self, ls_id: LanguageServerId) -> SolidLanguageServer:\n        if self._language_server_factory is None:\n            raise ValueError(f\"No language server factory available to create language server for {ls_id}\")\n        language_server = self._language_server_factory.create_language_server(ls_id)\n        language_server.start()\n        self._language_servers[ls_id] = language_server\n        return language_server\n\n    def restart_language_server(self, language: LanguageServerId) -> SolidLanguageServer:\n        \"\"\"\n        Forces recreation and restart of the language server for the given language.\n        It is assumed that the language server for the given language is no longer running.\n\n        :param language: the language\n        :return: the newly created language server\n        \"\"\"\n        if language not in self._language_servers:\n            raise ValueError(f\"No language server for language {language.value} present; cannot restart\")\n        return self._create_and_start_language_server(language)\n\n    def add_language_server(self, ls_id: LanguageServerId) -> SolidLanguageServer:\n        \"\"\"\n        Dynamically adds a new language server for the given language.\n\n        :param ls_id: the language server to add\n        :return: the newly created language server\n        \"\"\"\n        if ls_id in self._language_servers:\n            raise ValueError(f\"Language server for language {ls_id.value} already present\")\n        return self._create_and_start_language_server(ls_id)\n\n    def remove_language_server(self, language: LanguageServerId, save_cache: bool = False) -> None:\n        \"\"\"\n        Removes the language server for the given language, stopping it if it is running.\n\n        :param language: the language","sourceCodeStart":182,"sourceCodeEnd":218,"githubUrl":"https://github.com/oraios/serena/blob/7fcbca7e62555ec2287ddb2f083caee805848ea6/src/serena/ls_manager.py#L182-L218","documentation":"restart_language_server only restarts servers already tracked in _language_servers; it never creates a server for an unmanaged language. Requesting a restart for an absent language raises ValueError. This typically surfaces when _ensure_functional_ls detects a dead server it assumed was managed, or user code calls restart for a language never added.","triggerScenarios":"Calling restart_language_server(LanguageServerId.TYPESCRIPT) when only PYTHON is managed; _ensure_functional_ls attempting a restart after the server entry was removed; manager built with fewer languages than callers assume.","commonSituations":"Language server crashed and was removed via remove_language_server; tooling hardcodes a language list differing from project config; race where another thread removed the server before restart.","solutions":["Check language in manager.get_active_language_server_ids() before restarting","Use add_language_server(language) instead if the server was removed and you want it created","Ensure the manager was created with all languages the application will use","Guard against races by serializing remove/restart calls"],"exampleFix":"// before\nif not ls.is_running():\n    ls = manager.restart_language_server(LanguageServerId.TYPESCRIPT)\n// after\nif LanguageServerId.TYPESCRIPT in manager.get_active_language_server_ids():\n    ls = manager.restart_language_server(LanguageServerId.TYPESCRIPT)\nelse:\n    ls = manager.add_language_server(LanguageServerId.TYPESCRIPT)","handlingStrategy":"validation","validationCode":"active = manager.get_active_language_server_ids()\nif language not in active:\n    manager.add_language_server(language)\nelse:\n    manager.restart_language_server(language)","typeGuard":null,"tryCatchPattern":"try:\n    ls = manager.restart_language_server(language)\nexcept ValueError as e:\n    if \"cannot restart\" in str(e):\n        ls = manager.add_language_server(language)\n    else:\n        raise","preventionTips":["Check get_active_language_server_ids() before restarting","Use add_language_server for languages not yet managed","Serialize remove/restart calls to avoid state races","Keep the configured language list consistent with runtime usage"],"tags":["language-server","state-management","restart"],"backgroundTag":"resource-not-found","analyzedSha":"7fcbca7e62555ec2287ddb2f083caee805848ea6","analyzedAt":"2026-08-29T00:04:09.619Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}