TypeScript language features broken in Cursor when connected to a Coder VM (SSH)

Where does the bug appear (feature/product)?

Cursor IDE

Describe the Bug

  • Cursor is connected to a Coder VM via SSH (TypeScript/React project)
  • TypeScript language features are completely non-functional
  • Go to Definition shows: No definition found for ‘xyz’
  • No TypeScript option in View > Output — TS server doesn’t appear to be running
  • “TypeScript: Restart TS Server” is absent from the Command Palette

The issue is specific to Cursor over SSH — the same project works fine in VS Code and Windsurf connected to the same VM, and in Cursor on local Mac.

Steps to Reproduce

  1. Connect Cursor to a Coder VM via SSH
  2. Open a TypeScript/React project
  3. Right-click any symbol → Go to Definition

Expected Behavior

  • Go to Definition navigates to the symbol’s source
  • TypeScript appears as an option in View > Output
  • “TypeScript: Restart TS Server” is available in the Command Palette

Operating System

MacOS

Version Information

Version: 3.2.21
VSCode Version: 1.105.1
Commit: 806df57ed3b6f1ee0175140d38039a38574ec720
Date: 2026-05-03T01:46:14.413Z
Layout: editor
Build Type: Stable
Release Track: Default
Electron: 39.8.1
Chromium: 142.0.7444.265
Node.js: 22.22.1
V8: 14.2.231.22-electron.0
OS: Darwin arm64 25.4.0

Additional Information

What I’ve Already Tried

  • Set “Editor: Multi Cursor Modifier” to alt
  • Confirmed both TypeScript extensions are installed and enabled on the remote:
    • TypeScript and JavaScript Language Features
    • TypeScript Language Basics

Does this stop you from using Cursor

No - Cursor works, but with this issue

Hey, thanks for the detailed report. The symptoms no Restart TS Server command, an empty TypeScript channel in Output, and no definition found look less like a tsserver crash and more like the vscode.typescript-language-features extension not activating at all on the remote cursor-server side. To narrow it down, I need a few things:

  1. Check that the extension is installed on the remote, not only locally. In the Extensions panel with an active SSH connection, there should be a section SSH: . Make sure TypeScript and JavaScript Language Features and TypeScript Language Basics are listed and enabled there, not only under Local.

  2. Check the typescript.experimental.useTsgo setting in user settings and workspace settings, and on the remote too. If it is enabled, turn it off and reconnect. There is a known case where it breaks IntelliSense.

  3. Logs:

    • View > Output, then in the dropdown pick Extension Host (Remote). Send the contents, especially any activation errors.
    • View > Output, then Remote - SSH. Send the full connection log.
    • On the VM run ls -la ~/.cursor-server/data/logs/ and send the contents of the latest exthost*.log.
  4. Remote SSH extension version on your local machine. It should be anysphere.remote-ssh, not ms-vscode-remote.remote-ssh from Microsoft. You can check in ~/.cursor/extensions/.

  5. Clean reinstall of cursor-server on the VM if the steps above do not show the cause:

    rm -rf ~/.cursor-server ~/.cursor-server-*
    

    Then reconnect from Cursor and cursor-server will install again. This sometimes helps if the remote cache is corrupted.

With that info I can figure out what is going on on the cursor-server side and escalate to the team if it is our bug.

Hi Dean,

Thanks for your quick response.

  • vscode.typescript-language-features is installed on remote. On the extension page I see “Extension is enabled on ‘SSH: coder-vscode.coder.dev…’”

  • Disabled typescript.experimental.useTsgo in user, workspace, and remote settings. Ran Developer: Reload Window command. Problem didn’t go away.

  • View > Output > Extension Host (Remote) – all messages are info level, except these:

2026-05-06 19:03:17.184 [info] ExtensionService#_doActivateExtension vscode.typescript-language-features, startup: false, activationEvent: 'onLanguage:typescriptreact'
2026-05-06 19:03:17.323 [warning] DiagnosticCollection with name 'eslint' does already exist.
2026-05-06 19:03:17.655 [info] Extension activated success: vscode.typescript-language-features — 48ms (code loading: 47ms, activate call: 1ms, activate resolved: 0ms)

FWIW, the extension dbaeumer.vscode-eslint is installed on remote.

  • Remote SSH extension on both local and remote machines is anysphere.remote-ssh, not ms-vscode-remote.remote-ssh

  • The are no ~/.cursor-server ~/.cursor-server-* directories on remote.

Does this help in figuring out the issue?

Regarding logs mentioned in bullet 3.2 & 3.3, is there a secure location to send them to?

Thanks!

Naresh, thanks, this is already useful info.

Good news: the extension activated successfully (log Extension activated success: vscode.typescript-language-features - 48ms). So the issue is not with loading the built-in extension. The tsserver process is either not starting, or it starts and immediately crashes silently. Let’s dig deeper.

A few checks and a bit more logs:

  1. Confirm the extension is really running
    In Cmd+Shift+P, run Developer: Show Running Extensions. Find TypeScript and JavaScript Language Features and send a screenshot of that row. It shows Activation Time, Code Loading Time, and whether there is a red error icon.

  2. TS commands should be visible
    In the Command Palette, type TypeScript: including the colon. What commands show up? If none show, the extension may be registered in a limited mode.

  3. Node.js on the VM
    On the remote machine, run:

    which node && node -v
    echo $PATH
    

    Cursor’s tsserver is spawned via node from the remote host PATH. If node is not in PATH for the SSH session (even if it exists in your normal shell), tsserver won’t start.

  4. Verbose tsserver log
    Open Settings on the remote and set:

    "typescript.tsserver.log": "verbose",
    "typescript.tsserver.trace": "verbose"
    

    Reload Window, open a .tsx file, then Cmd+Shift+P and run TypeScript: Open TS Server Log. If the command exists and the log opens, send it. If Open TS Server Log does not exist, that is a strong signal that tsserver never started.

  5. About ~/.cursor-server
    I’m surprised the directory is missing. Cursor server usually installs there on the first connection. Run on the VM:

    ls -la ~ | grep -i cursor
    find ~ -maxdepth 3 -name ".cursor*" 2>/dev/null
    ps aux | grep -i cursor
    

    I want to understand where Coder is placing cursor server, and whether there is any running process.

Waiting for your reply. This should make it clearer why tsserver is not coming up on remote.

Dean, I got it working :tada:

The issue was indeed with the typescript.experimental.useTsgosetting. It was partly my bad that I misinterpreted the description on the checkbox. Instead of disabling TypeScript Go I was enabling it! See the language on the description – it should start with a positive, e.g. “Enables TypeScript Go”. Instead it starts with a negative “Disables TypeScript and JavaScript language features…” – I immediately thought that this flag disables TypeScript Go :slight_smile:

Anyway, mystery solved!

A couple of questions:

  1. Our infra team pre-configures the VMs for development – what’s the best way for them to configure Cursor so that this flag is off?
  2. I finally found the ~/.cursor-server directory on the remote server. When I delete it, it is indeed regenerated. However, the remote extensions are not installed again. This may be something that we are not doing when the directory is regenerated. Any ideas?

Thanks so much for your help!

@deanrie any thoughts on my two questions above?

TIA

Sorry I missed your follow-up.

On the first request, how to pin typescript.experimental.useTsgo: false on the VM

The default for this flag is already false, so the main thing is making sure nobody turns it on. To lock it on the VM side, you’ve got two options:

  1. Workspace-level, recommended
    Put .vscode/settings.json in your project repo:
{
  "typescript.experimental.useTsgo": false
}

This ships with the code, so any client Cursor, VS Code, Windsurf will pick it up.

  1. Machine-level on the VM
    Create ~/.cursor-server/data/Machine/settings.json in your provision script:
{
  "typescript.experimental.useTsgo": false
}

This applies to all projects opened in Cursor over SSH on that VM. Downside is the file lives under ~/.cursor-server, which gets recreated on a clean reinstall, so your provision script will need to restore it.

On the second request, extensions don’t reinstall after deleting ~/.cursor-server

This is a known bug. After rm -rf ~/.cursor-server, cursor-server re-downloads the binary on reconnect, but it doesn’t create extensions/extensions.json. Because that file is missing, all extension installs fail silently. Thread with the same issue: Extension fail to install if .cursor-server is deleted

Workaround on the VM right after deletion:

mkdir -p ~/.cursor-server/extensions
echo '[]' > ~/.cursor-server/extensions/extensions.json

After that, extensions install normally.

Awesome – very helpful. Thank you so much, @deanrie