{"record":{"id":"194b046a22ddb057","repo":"oraios/serena","slug":"no-language-servers-available-in-the-manager","errorCode":null,"errorMessage":"No language servers available in the manager","messagePattern":"No language servers available in the manager","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"src/serena/ls_manager.py","lineNumber":96,"sourceCode":"        language_servers: dict[LanguageServerId, SolidLanguageServer],\n        language_server_factory: LanguageServerFactory,\n        project: \"Project\",\n    ) -> None:\n        \"\"\"\n        :param language_servers: a mapping from language to language server; the servers are assumed to be already started.\n            The first server in the iteration order is used as the default server.\n            All servers are assumed to serve the same project root.\n        :param language_server_factory: factory for language server creation; if None, dynamic (re)creation of language servers\n            is not supported\n        \"\"\"\n        self._language_servers = language_servers\n        self._language_server_factory = language_server_factory\n        self._file_change_notifier = LanguageServerFileChangeNotifier(project, self)\n\n    @property\n    def _default_language_server(self) -> SolidLanguageServer:\n        if len(self._language_servers) == 0:\n            raise ValueError(\"No language servers available in the manager\")\n        return next(iter(self._language_servers.values()))\n\n    @staticmethod\n    def from_languages(languages: list[LanguageServerId], factory: LanguageServerFactory, project: \"Project\") -> \"LanguageServerManager\":\n        \"\"\"\n        Creates a manager with language servers for the given languages using the given factory.\n        The language servers are started in parallel threads.\n\n        :param languages: the languages for which to spawn language servers\n        :param factory: the factory for language server creation\n        :param project: the project for which the language servers are created\n        :return: the instance\n        \"\"\"\n\n        class StartLSThread(threading.Thread):\n            def __init__(self, ls_id: LanguageServerId):\n                super().__init__(target=self._start_language_server, name=\"StartLS:\" + ls_id.value)\n                self.ls_id = ls_id","sourceCodeStart":78,"sourceCodeEnd":114,"githubUrl":"https://github.com/oraios/serena/blob/7fcbca7e62555ec2287ddb2f083caee805848ea6/src/serena/ls_manager.py#L78-L114","documentation":"LanguageServerManager._default_language_server raises ValueError when the manager holds zero language servers but one is required (e.g. get_language_server falls back to the default). The default server property assumes at least one server was started at construction.","triggerScenarios":"Calling get_language_server(path) on a manager built with an empty language list; all language servers were removed via remove_language_server; LanguageServerManager was constructed directly with an empty dict instead of via from_languages.","commonSituations":"Project configured with no matching languages for the file being analyzed; a plugin/tool removed the only language server before further requests; manual instantiation of LanguageServerManager({}, factory, project).","solutions":["Create the manager via LanguageServerManager.from_languages with a non-empty language list","Check get_active_language_server_ids() is non-empty before making requests","Add a language server with add_language_server(LanguageServerId.PYTHON) for the target language","Recreate the manager if all servers were removed"],"exampleFix":"// before\nmanager = LanguageServerManager({}, factory, project)\nls = manager.get_language_server(\"foo.py\")  # ValueError\n// after\nmanager = LanguageServerManager.from_languages(\n    [LanguageServerId.PYTHON], factory, project)\nls = manager.get_language_server(\"foo.py\")","handlingStrategy":"validation","validationCode":"if not manager.get_active_language_server_ids():\n    manager = LanguageServerManager.from_languages(\n        [LanguageServerId.PYTHON], factory, project)","typeGuard":"def has_servers(manager: LanguageServerManager) -> bool:\n    return len(manager.get_active_language_server_ids()) > 0","tryCatchPattern":"try:\n    ls = manager.get_language_server(path)\nexcept ValueError as e:\n    if \"No language servers available\" in str(e):\n        manager = LanguageServerManager.from_languages(config.languages, factory, project)\n        ls = manager.get_language_server(path)\n    else:\n        raise","preventionTips":["Always build managers via from_languages with a non-empty language list","Check active server ids before making requests","Avoid removing the last language server at runtime","Log language configuration at startup"],"tags":["language-server","configuration","empty-state"],"backgroundTag":"no-language-server-available","analyzedSha":"7fcbca7e62555ec2287ddb2f083caee805848ea6","analyzedAt":"2026-08-29T00:04:09.619Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}