oraios/serena · error · TypeScriptServerCrashedError
{self._crash_message}
Error message
{self._crash_message} What it means
The TypeScript language server tracks tsserver's abnormal exit (via _tsserver_exit_message) and records a crash message. _raise_if_crashed re-checks this state at synchronization points (waiting for indexing to start/complete) and raises TypeScriptServerCrashedError with the recorded message, so a dead tsserver surfaces as a typed exception instead of a hang.
Source
Thrown at src/solidlsp/language_servers/typescript_language_server.py:142
self.server_ready = threading.Event()
self.initialize_searcher_command_available = threading.Event()
# tracking asynchronous diagnostics publication
self._published_diagnostics_timeout = 5.0
# tracking project indexing progress
self._progress_lock = threading.Lock()
self._active_progress_tokens: set[str] = set()
self._indexing_complete = threading.Event()
self._indexing_complete.set() # Initially set (no active work)
# set from window/logMessage when tsserver reports its own abnormal exit;
# a crash mid-indexing still drains _active_progress_tokens via a $/progress
# "end" event, so that alone cannot distinguish a crash from real completion
self._crash_message: str | None = None
def _raise_if_crashed(self) -> None:
if self._crash_message is not None:
raise TypeScriptServerCrashedError(self._crash_message)
@staticmethod
def _tsserver_exit_message(msg: dict) -> str | None:
""":return: the log text if ``msg`` is tsserver reporting its own abnormal exit, else None."""
if msg.get("type") != MessageType.Error:
return None
message_text = str(msg.get("message", ""))
if _TSSERVER_EXITED_PATTERN.search(message_text):
return message_text
return None
def wait_for_indexing(self, timeout: float) -> bool:
"""Block until all $/progress tokens complete.
:param timeout: Maximum seconds to wait.
:return: True if indexing completed, False on timeout.
:raises TypeScriptServerCrashedError: if tsserver reported an abnormal exit.
"""View on GitHub (pinned to 7fcbca7e62)
Solutions
- Read the recorded crash message in the exception to identify root cause (e.g. OOM, missing tsserver), then fix that cause.
- Recreate/restart the language server instance — a crashed tsserver process cannot be revived in place.
- For OOM crashes, raise the memory available to tsserver (e.g. NODE_OPTIONS=--max-old-space-size=8192) or exclude large generated directories via tsconfig.
- Pin/check the TypeScript version installed in the project and ensure node_modules is intact (`npm ci`).
Example fix
// before: reuse a server after crash
await server.wait_for_indexing() // TypeScriptServerCrashedError
// after: catch and rebuild
try:
await server.wait_for_indexing()
except TypeScriptServerCrashedError:
server.stop()
server = SolidLanguageServer.create("typescript")
server.start()
await server.wait_for_indexing() Defensive patterns
Strategy: try-catch
Validate before calling
import subprocess # ensure project's TypeScript install is intact before starting the server subprocess.run(["npx", "tsc", "--version"], check=True, cwd=project_root)
Try / catch
try:
await server.wait_for_indexing()
except TypeScriptServerCrashedError as e:
logger.error("tsserver crashed: %s", e)
server.stop()
server = SolidLanguageServer.create("typescript")
server.start()
await server.wait_for_indexing() Prevention
- Give tsserver ample memory (NODE_OPTIONS=--max-old-space-size) for large projects.
- Keep the project's TypeScript version consistent and node_modules intact.
- Exclude generated/large directories from tsconfig to reduce tsserver load.
- Always recreate the server instance after a crash; never reuse it.
When it happens
Trigger: Calling wait_for_indexing or _wait_for_indexing_start_or_completion after tsserver reported its own abnormal exit (an Error-level tsserver log message indicating it crashed), at which point _crash_message is set and any wait invocation re-raises it.
Common situations: Out-of-memory kills of tsserver on very large monorepos; incompatible TypeScript version / corrupted node_modules; too many files exceeding tsserver limits; crashes after upgrading TypeScript or project dependencies mid-session.
Related errors
- Failed to open {len(failed_svelte_files)} Svelte file(s) on
- Process terminated while trying to read response (read {len(
- Unhandled document change kind: {change}; Please report to S
- Unhandled document change format: {change}; Please report to
- Symbol '{name_path}' does not have a valid position in file
AI-assisted analysis of oraios/serena@7fcbca7e62 (2026-08-29).
Data as JSON: /api/errors/b75d40dca78cef8d.
Report an issue: GitHub.