{"record":{"id":"261ca0fb270d9301","repo":"oraios/serena","slug":"failed-to-start-len-exceptions-language-server","errorCode":null,"errorMessage":"Failed to start {len(exceptions)} language server(s):\n{failure_messages}","messagePattern":"Failed to start (.+?) language server\\(s\\):\n(.+?)","errorType":"exception","errorClass":"LanguageServerManagerInitialisationError","httpStatus":null,"severity":"critical","filePath":"src/serena/ls_manager.py","lineNumber":155,"sourceCode":"        language_servers: dict[LanguageServerId, SolidLanguageServer] = {}\n        exceptions: dict[LanguageServerId, Exception] = {}\n        for thread in threads:\n            thread.join()\n            if thread.exception is not None:\n                exceptions[thread.ls_id] = thread.exception\n            elif thread.language_server is not None:\n                language_servers[thread.ls_id] = thread.language_server\n\n        # If any server failed to start up, raise an exception and stop all started language servers.\n        # We intentionally fail fast here. The user's intention is to work with all the specified languages,\n        # so if any of them is not available, it is better to make symbolic tool calls fail, bringing the issue to the\n        # user's attention instead of silently continuing with a subset of the language servers and potentially\n        # causing suboptimal agent behaviour.\n        if exceptions:\n            for ls in language_servers.values():\n                ls.stop()\n            failure_messages = \"\\n\".join([f\"{lang.value}: {e}\" for lang, e in exceptions.items()])\n            raise LanguageServerManagerInitialisationError(f\"Failed to start {len(exceptions)} language server(s):\\n{failure_messages}\")\n\n        return LanguageServerManager(language_servers, factory, project)\n\n    def _ensure_functional_ls(self, ls: SolidLanguageServer) -> SolidLanguageServer:\n        if not ls.is_running():\n            log.warning(f\"Language server for language {ls.ls_id} is not running; restarting ...\")\n            ls = self.restart_language_server(ls.ls_id)\n        return ls\n\n    def _get_suitable_language_server(self, relative_path: str) -> SolidLanguageServer | None:\n        \"\"\":param relative_path: relative path to a file\"\"\"\n        for candidate in self._language_servers.values():\n            if not candidate.is_ignored_path(relative_path, ignore_unsupported_files=True):\n                return candidate\n        return None\n\n    def get_language_server(self, relative_path: str) -> SolidLanguageServer:\n        \"\"\":param relative_path: relative path to a file\"\"\"","sourceCodeStart":137,"sourceCodeEnd":173,"githubUrl":"https://github.com/oraios/serena/blob/7fcbca7e62555ec2287ddb2f083caee805848ea6/src/serena/ls_manager.py#L137-L173","documentation":"LanguageServerManager.from_languages aggregates per-language startup exceptions and, if any occurred, stops all successfully started servers and raises LanguageServerManagerInitialisationError listing each failing language and its error. The manager refuses to operate with a partial set of language servers, since silently missing languages would degrade agent behavior.","triggerScenarios":"Calling create_language_server_manager / from_languages with several languages where at least one language server fails to start (e.g. one LSP binary missing) — the whole initialization aborts.","commonSituations":"Multi-language project where one toolchain isn't installed (e.g. gopls missing while pyright works); wrong command path for one server in config; one server crashing on startup due to version incompatibility.","solutions":["Read the failure_messages in the exception to identify which language(s) failed and why","Install or fix the failing language server's binary/config","Remove the failing language from the requested languages list if it isn't needed","Retry from_languages after remediation — a failed manager cannot be reused"],"exampleFix":"// before\nmanager = LanguageServerManager.from_languages(\n    [LanguageServerId.PYTHON, LanguageServerId.TYPESCRIPT], factory, project)\n# LanguageServerManagerInitialisationError: typescript missing\n// after\n# $ npm install -g typescript typescript-language-server\nmanager = LanguageServerManager.from_languages(\n    [LanguageServerId.PYTHON, LanguageServerId.TYPESCRIPT], factory, project)","handlingStrategy":"try-catch","validationCode":"import shutil\nmissing = [l for l in languages if not shutil.which(expected_binary[l])]\nif missing:\n    raise EnvironmentError(f\"Missing language servers: {missing}\")","typeGuard":null,"tryCatchPattern":"try:\n    manager = LanguageServerManager.from_languages(langs, factory, project)\nexcept LanguageServerManagerInitialisationError as e:\n    print(e)  # lists each failing language: error\n    langs = [l for l in langs if f\"{l.value}:\" not in str(e)]\n    manager = LanguageServerManager.from_languages(langs, factory, project)","preventionTips":["Verify every requested language's server binary is installed before init","Parse failure_messages to identify exactly which languages failed","Only request languages the project actually uses","Keep server commands/paths correct in language config"],"tags":["language-server","initialization","multi-language"],"backgroundTag":"language-server-init-failed","analyzedSha":"7fcbca7e62555ec2287ddb2f083caee805848ea6","analyzedAt":"2026-08-29T00:04:09.619Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}