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 languageView on GitHub (pinned to 7fcbca7e62)
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
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
- 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
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
- Language server for language {ls_id.value} already present
- No language server for language {language.value} present; ca
- No symbols found in target file {target_file}
- FindSymbolTool returned no results
- Unhandled document change kind: {change}; Please report to S
AI-assisted analysis of oraios/serena@7fcbca7e62 (2026-08-29).
Data as JSON: /api/errors/cf98c00bda92ec23.
Report an issue: GitHub.