oraios/serena · error · ValueError

No language server for language {language.value} present; ca

Error message

No language server for language {language.value} present; cannot restart

What it means

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.

Source

Thrown at src/serena/ls_manager.py:200

    def _create_and_start_language_server(self, ls_id: LanguageServerId) -> SolidLanguageServer:
        if self._language_server_factory is None:
            raise ValueError(f"No language server factory available to create language server for {ls_id}")
        language_server = self._language_server_factory.create_language_server(ls_id)
        language_server.start()
        self._language_servers[ls_id] = language_server
        return language_server

    def restart_language_server(self, language: LanguageServerId) -> SolidLanguageServer:
        """
        Forces recreation and restart of the language server for the given language.
        It is assumed that the language server for the given language is no longer running.

        :param language: the language
        :return: the newly created language server
        """
        if language not in self._language_servers:
            raise ValueError(f"No language server for language {language.value} present; cannot restart")
        return self._create_and_start_language_server(language)

    def add_language_server(self, ls_id: LanguageServerId) -> SolidLanguageServer:
        """
        Dynamically adds a new language server for the given language.

        :param ls_id: the language server to add
        :return: the newly created language server
        """
        if ls_id in self._language_servers:
            raise ValueError(f"Language server for language {ls_id.value} already present")
        return self._create_and_start_language_server(ls_id)

    def remove_language_server(self, language: LanguageServerId, save_cache: bool = False) -> None:
        """
        Removes the language server for the given language, stopping it if it is running.

        :param language: the language

View on GitHub (pinned to 7fcbca7e62)

Solutions

  1. Check language in manager.get_active_language_server_ids() before restarting
  2. Use add_language_server(language) instead if the server was removed and you want it created
  3. Ensure the manager was created with all languages the application will use
  4. Guard against races by serializing remove/restart calls

Example fix

// before
if not ls.is_running():
    ls = manager.restart_language_server(LanguageServerId.TYPESCRIPT)
// after
if LanguageServerId.TYPESCRIPT in manager.get_active_language_server_ids():
    ls = manager.restart_language_server(LanguageServerId.TYPESCRIPT)
else:
    ls = manager.add_language_server(LanguageServerId.TYPESCRIPT)
Defensive patterns

Strategy: validation

Validate before calling

active = manager.get_active_language_server_ids()
if language not in active:
    manager.add_language_server(language)
else:
    manager.restart_language_server(language)

Try / catch

try:
    ls = manager.restart_language_server(language)
except ValueError as e:
    if "cannot restart" in str(e):
        ls = manager.add_language_server(language)
    else:
        raise

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Understand the failure class

Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.

Related errors


AI-assisted analysis of oraios/serena@7fcbca7e62 (2026-08-29). Data as JSON: /api/errors/cf98c00bda92ec23. Report an issue: GitHub.