New Remote-SSH window waits tens of seconds before ssh.exe starts — gated on git-context timeout and fanout priming

Where does the bug appear (feature/product)?

Cursor IDE

Describe the Bug

Opening a new Cursor window for an existing Remote-SSH .code-workspace does not start SSH immediately. The window comes up locally and sits idle for ~10–45s. Only then does Remote-SSH call resolveAuthority(ssh-remote) and launch ssh.exe. The SSH handshake itself is fast (~2s).

This is local workbench startup ordering, not a slow host or remote.SSH.connectTimeout.

Two stalls:

  1. Before SSH starts: WorktreeManager waits ~27s for a git context provider (impossible until the remote is connected), then plugin boot, then fanout priming of cursor-always-local / cursor-resolver / cursor-socket. resolveAuthority runs only after that.

  2. After SSH already succeeded: resolveAuthority is sent to two local extension hosts. LocalProcess0 has anysphere.remote-ssh and returns a WebSocket in ~3s. LocalProcess1 does not, and fails with NoResolverFound (“No remote extension installed to resolve ssh-remote”). The window keeps looking disconnected until that second host finishes (up to ~16s extra).

The first stall is often shorter if another Cursor window is already open with the Agent panel. Cold opens hit the git-context timeout; then SSH starts in ~2–6s instead of ~30–45s.

Steps to Reproduce

  1. Cursor 3.19.19 on Windows, Anysphere Remote-SSH 1.1.14, Linux remote, pubkey SSH. Workspace is a .code-workspace opened over ssh-remote (file lives on the remote).
  2. Close the remote workspace window.
  3. Re-open that workspace in a new window (Open Recent, or File → New Window of that workspace). Prefer a cold open: no other Cursor window with Agent already running.
  4. Watch the new window until the Remote-SSH connecting UI appears / ssh.exe starts.
  5. Compare timestamps in:
    • Output → Remote - SSH
    • renderer.log for that window (IdleTimeContribution → WorktreeManager git-context timeout → Invoking resolveAuthority)
  6. Optional: repeat with a local empty Cursor window (Agent panel) already open. SSH often starts several tens of seconds sooner.

Expected Behavior

As soon as the new window knows it has a remote authority, it should call resolveAuthority(ssh-remote) and launch ssh.exe. Local worktree discovery, git context, and plugin marketplace import should not block that.

resolveAuthority should not wait on a second local extension host that does not contain Remote-SSH. LocalProcess0 already returned a WebSocket; that should complete the resolution.

Actual: cold open waits ~47s after window start before ssh.exe (example 2026-09-11 10:29:03 UI up → 10:29:34 git-context timeout → 10:29:50 first resolveAuthority). Handshake then takes ~2s. A later reopen had LocalProcess0 succeed at 10:44:05 and LocalProcess1 NoResolverFound at 10:44:19, so resolveAuthority was reported complete only after 16579ms.

Operating System

Windows 10/11

Version Information

Version: 3.19.19 (user setup)
VS Code Extension API: 1.128.0
Commit: 6496ea8a068aebfcd21990e70ff522e9abf10c80
Date: 2026-09-08T16:25:33.352Z
Layout: IDE
Build Type: Stable
Release Track: Default
Electron: 42.10.0
Chromium: 148.0.7778.280
Node.js: 24.18.1
V8: 14.8.178.38-electron.0
xterm.js: 6.1.0-beta.291
OS: Windows_NT x64 10.0.26200

Additional Information

Observations, not proven root cause:

  • The long delay matches WorktreeManager blocking on a git context provider (~27s timeout) before resolveAuthority. That looks like Cursor worktree/git-context startup, not vscode.git failing. Git on the remote cannot register until SSH connects.

  • Delay is often much shorter if a local Cursor window is already open with the Agent panel. I have not isolated “panel open” vs “second window already running local agent/git/workspace services.”

  • LocalProcess1 NoResolverFound happens after ssh.exe has already succeeded; that extra wait is extension isolation / fanout (cursor-always-local, cursor-resolver, cursor-socket), not the SSH handshake.

Local: Windows 11 (10.0.26200) win32-x64
Remote: Ubuntu 24.04.1 LTS linux-x64
Cursor 3.19.19 stable, remote server 6496ea8a068aebfcd21990e70ff522e9abf10c80
anysphere.remote-ssh 1.1.14
Extension isolation enabled; cursor_agent_host gate disabled
Manual ssh to the host is immediate. Server already installed; multiplex/code servers already running.

renderer.log (cold open):

10:29:02 Extension isolation is enabled
10:29:03 WorktreeManager starts
10:29:07 IdleTimeContribution (window looks ready)
10:29:34 [WorktreeManager] Timed out waiting for git context provider, skipping worktree discovery
10:29:37 [PluginsProviderService] importClaudeMarketplaces: plugins provider not available
10:29:50 Primed fanout group … cursor-always-local, cursor-resolver, cursor-socket
10:29:50 Invoking resolveAuthority(ssh-remote)…

Later reopen, second stall:

10:44:02.539 Invoking resolveAuthority(ssh-remote)…
10:44:05.468 LocalProcess0 returned WebSocket
10:44:18.613 LocalProcess1 invoking…
10:44:19.117 LocalProcess1 NoResolverFound: No remote extension installed to resolve ssh-remote
10:44:19.118 resolveAuthority returned after 16579 ms

Related, not duplicates:

Workaround: keep a local Cursor window open (empty + Agent panel is enough). Does not remove the LocalProcess1 wait.

Does this stop you from using Cursor

No - Cursor works, but with this issue

The second stall is on our side, not intended behavior. It’s an issue we’re tracking, and keeping a second Cursor window open (as you found) is the best workaround for now.

For the first stall, the WorktreeManager and plugins timeouts are side effects, not the actual gate. To see what’s actually slow on a cold open, run Ctrl+Shift+P, “Developer: Startup Performance”, and paste the Performance Marks section.

Complete startup perf output attached: Startup Performance.zip (15.1 KB).



| What                                                           | Duration | Process                   | Info                                                                 |
| -------------------------------------------------------------- | -------- | ------------------------- | -------------------------------------------------------------------- |
| start => app.isReady                                           | -        | [main]                    | initial startup: false                                               |
| nls:start => nls:end                                           | -        | [main]                    | initial startup: false                                               |
| import(main.js)                                                | -        | [main]                    | initial startup: false                                               |
| run main.js                                                    | -        | [main]                    | initial startup: false                                               |
| start crash reporter                                           | -        | [main]                    | initial startup: false                                               |
| serve main IPC handle                                          | -        | [main]                    | initial startup: false                                               |
| create window                                                  | -        | [main]                    | initial startup: false,                                              |
| app.isReady => window.loadUrl()                                | -        | [main]                    | initial startup: false                                               |
| window.loadUrl() => begin to import(workbench.desktop.main.js) | 1146     | [main->renderer]          | ReloadedWindow                                                       |
| import(workbench.desktop.main.js)                              | 3039     | [renderer]                | cached data: YES                                                     |
| wait for window config                                         | 6        | [renderer]                | -                                                                    |
| renderer service bootstrap (pre-workbench)                     | 177      | [renderer]                | umbrella over storage/workspace/shared/mcp init                      |
| init storage (global & workspace)                              | 71       | [renderer]                | -                                                                    |
| init workspace service                                         | 161      | [renderer]                | -                                                                    |
|   ↳ init user configuration                                    | 18       | [renderer]                | -                                                                    |
|   ↳ load workspace configuration                               | 31       | [renderer]                | -                                                                    |
| register extensions & spawn extension host                     | 63502    | [renderer]                | -                                                                    |
| restore viewlet                                                | 64       | [renderer]                | workbench.view.extensions                                            |
| restore panel                                                  | 73       | [renderer]                | workbench.panel.output                                               |
| restore & resolve visible editors                              | 111      | [renderer]                | none; 0:                                                             |
|   ↳ editor groups ready                                        | 94       | [renderer]                | -                                                                    |
|   ↳ resolve editors to open                                    | 12       | [renderer]                | -                                                                    |
|   ↳ open editors                                               | 0        | [renderer]                | -                                                                    |
| create workbench contributions                                 | 118      | [renderer]                | 102 blocking startup                                                 |
|   ↳ contributions (Starting phase)                             | 70       | [renderer]                | -                                                                    |
|   ↳ contributions (Ready phase)                                | 48       | [renderer]                | -                                                                    |
| lifecycle: Starting => Ready                                   | 11       | [renderer]                | -                                                                    |
| lifecycle: Ready => Restored                                   | 1117     | [renderer]                | -                                                                    |
| desktop open single workspace                                  | 1027     | [renderer]                | -                                                                    |
| overall workbench load                                         | 1128     | [renderer]                | -                                                                    |
| workbench ready                                                | 5490     | [main->renderer]          | -                                                                    |
| renderer ready                                                 | 4351     | [renderer]                | -                                                                    |
| layout ready                                                   | 4349     | [renderer]                | code/didStartRenderer → code/didLayoutReady                          |
| shared process connection ready                                | 174      | [renderer->sharedprocess] | -                                                                    |
| mcp process connection ready                                   | 191      | [renderer->mcpprocess]    | -                                                                    |
| extensions registered                                          | 69129    | [renderer]                | -                                                                    |
| ext host boot (user)                                           | 60609    | [exthost]                 | code/timeOrigin → code/extHost/ready                                 |
|   ↳ bundle load/eval                                           | 51000    | [exthost]                 | code/timeOrigin → code/extHost/willConnectToRenderer                 |
|   ↳ connect + wait for init                                    | 42       | [exthost]                 | code/extHost/willConnectToRenderer → code/extHost/didWaitForInitData |
|   ↳ services + API/proxy init                                  | 9567     | [exthost]                 | code/extHost/didWaitForInitData → code/extHost/ready                 |
| eager extensions activated (user)                              | 32       | [exthost]                 | code/extHost/ready → code/extHost/didActivateEagerExtensions         |
| ext host boot (always-local)                                   | 5611     | [exthost]                 | code/timeOrigin → code/extHost/ready                                 |
|   ↳ bundle load/eval                                           | 3716     | [exthost]                 | code/timeOrigin → code/extHost/willConnectToRenderer                 |
|   ↳ connect + wait for init                                    | 18       | [exthost]                 | code/extHost/willConnectToRenderer → code/extHost/didWaitForInitData |
|   ↳ services + API/proxy init                                  | 1877     | [exthost]                 | code/extHost/didWaitForInitData → code/extHost/ready                 |
| eager extensions activated (always-local)                      | 19       | [exthost]                 | code/extHost/ready → code/extHost/didActivateEagerExtensions         |