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:
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.
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.
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.
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/.
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.
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:
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.
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.
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.
Verbose tsserver log
Open Settings on the remote and set:
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.
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.
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
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?
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?
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:
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.
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