Unresponsive extension host after switching projects

Where does the bug appear (feature/product)?

Cursor IDE

Describe the Bug

When I first open up Cursor, all works fine. If I have it running for a while and then switch to a different project, the extension host hangs and the agent chat will time out and the source control tab gets stuck at “Scanning for Git repositories”. When I press Ctrl + Shift + P and look at running extensions, it is blank.

This happens on a daily basis. I can’t nail down how long I have to keep Cursor open for this to happen.

I’ve tried uninstalling Cursor, deleting the %APPDATA%\Cursor folder and then reinstalling Cursor. It did not resolve the issue.

This bug has been happening for several weeks at least, through several updates.

Steps to Reproduce

  1. Open a project, keep Cursor open for a while
  2. Switch to a new project
  3. Try to chat with an agent or interact with source control

Operating System

Windows 10/11

Version Information

Cursor version 3.2.16

Does this stop you from using Cursor

Yes - Cursor is unusable

Here’s the extension host message log when I notice the issue:

2026-04-29 16:28:03.675 [info] Extension host terminating: renderer closed the MessagePort
2026-04-29 16:28:03.681 [info] Extension host with pid 20708 exiting with code 0
2026-04-29 16:28:03.683 [info] Extension host terminating: renderer closed the MessagePort
2026-04-29 16:28:03.686 [info] Extension host terminating: renderer closed the MessagePort
2026-04-29 16:28:03.689 [info] Extension host terminating: renderer closed the MessagePort
2026-04-29 16:28:03.691 [info] Extension host with pid 43612 exiting with code 0
2026-04-29 16:28:03.692 [info] [ExtHostCursorExplorerProviderService] ExplorerProvider unregistered in ext host
2026-04-29 16:28:03.694 [info] Extension host with pid 33764 exiting with code 0
2026-04-29 16:28:03.727 [error] [ExtHostCursorExplorerProviderService] Main thread provider unregistration failed Canceled
2026-04-29 16:28:03.729 [error] Canceled: Canceled
at new vNt (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:48:119702)
at Su._remoteCall (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:48:127194)
at r..a.charCodeAt.r. (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:48:123328)
at aHe._doExecuteCommand (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:142:49898)
at aHe.executeCommand (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:142:49334)
at t.registerCommand.description (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:142:48598)
at aHe._executeContributedCommand (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:142:50468)
at aHe._doExecuteCommand (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:142:49467)
at aHe.executeCommand (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:142:49334)
at Object.executeCommand (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:214:142358)
at SFe.N [as value] (c:\Users\MyAccount\AppData\Local\Programs\cursor\resources\app\extensions\git\dist\main.js:2:111491)
at L._deliver (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:46:2961)
at L._deliverQueue (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:46:3052)
at L.fire (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:46:3389)
at Object.v [as dispose] (c:\Users\MyAccount\AppData\Local\Programs\cursor\resources\app\extensions\git\dist\main.js:2:181128)
at c:\Users\MyAccount\AppData\Local\Programs\cursor\resources\app\extensions\git\dist\main.js:2:187493
at Array.forEach ()
at k.dispose (c:\Users\MyAccount\AppData\Local\Programs\cursor\resources\app\extensions\git\dist\main.js:2:187480)
at uGe. (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:137:10091)
at uGe.dispose (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:137:10187)
at uGe. (c:\Users\MyAccount\AppData\Local\Programs\cursor\resources\app\extensions\git\dist\main.js:2:113968)
at uGe.dispose (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:137:10187)
at hi (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:44:706)
at file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:146:20707
at file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:44:1019
at Object.dispose (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:27:1256)
at KHs._deactivate (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:146:15497)
at file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:146:12768
at Array.map ()
at KHs._deactivateAll (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:146:12756)
at KHs.terminate (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:146:13110)
at ekt.terminate (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:148:1617)
at xr (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:680:8000)
at MessagePortMain. (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:680:4430)
at MessagePortMain.emit (node:events:519:28)
at MessagePortMain._internalPort.emit (node:electron/js2c/utility_init:2:2959) setContext undefined
2026-04-29 16:28:03.733 [error] Canceled: Canceled
at new vNt (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:48:119702)
at Su._remoteCall (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:48:127194)
at r..a.charCodeAt.r. (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:48:123328)
at aHe._doExecuteCommand (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:142:49898)
at aHe.executeCommand (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:142:49334)
at t.registerCommand.description (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:142:48598)
at aHe._executeContributedCommand (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:142:50468)
at aHe._doExecuteCommand (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:142:49467)
at aHe.executeCommand (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:142:49334)
at Object.executeCommand (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:214:142358)
at set hasGitHubRepositories (c:\Users\MyAccount\AppData\Local\Programs\cursor\resources\app\extensions\github\dist\extension.js:2:270497)
at c:\Users\MyAccount\AppData\Local\Programs\cursor\resources\app\extensions\github\dist\extension.js:2:271447
at SFe.value (c:\Users\MyAccount\AppData\Local\Programs\cursor\resources\app\extensions\git\dist\main.js:2:596551)
at L._deliver (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:46:2961)
at L._deliverQueue (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:46:3052)
at L.fire (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:46:3389)
at Object.v [as dispose] (c:\Users\MyAccount\AppData\Local\Programs\cursor\resources\app\extensions\git\dist\main.js:2:181128)
at c:\Users\MyAccount\AppData\Local\Programs\cursor\resources\app\extensions\git\dist\main.js:2:187493
at Array.forEach ()
at k.dispose (c:\Users\MyAccount\AppData\Local\Programs\cursor\resources\app\extensions\git\dist\main.js:2:187480)
at uGe. (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:137:10091)
at uGe.dispose (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:137:10187)
at uGe. (c:\Users\MyAccount\AppData\Local\Programs\cursor\resources\app\extensions\git\dist\main.js:2:113968)
at uGe.dispose (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:137:10187)
at hi (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:44:706)
at file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:146:20707
at file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:44:1019
at Object.dispose (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:27:1256)
at KHs._deactivate (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:146:15497)
at file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:146:12768
at Array.map ()
at KHs._deactivateAll (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:146:12756)
at KHs.terminate (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:146:13110)
at ekt.terminate (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:148:1617)
at xr (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:680:8000)
at MessagePortMain. (file:///c:/Users/MyAccount/AppData/Local/Programs/cursor/resources/app/out/vs/workbench/api/node/extensionHostProcess.js:680:4430)
at MessagePortMain.emit (node:events:519:28)
at MessagePortMain._internalPort.emit (node:electron/js2c/utility_init:2:2959) setContext undefined
2026-04-29 16:28:03.737 [info] Extension host with pid 40956 exiting with code 0
2026-04-29 16:29:27.642 [info] Extension host with pid 39984 started
2026-04-29 16:29:27.642 [info] Extension host with pid 22492 started
2026-04-29 16:29:27.642 [info] Skipping acquiring lock for c:\Users\MyAccount\AppData\Roaming\Cursor\User\workspaceStorage\258a6b010628cfdd0bf63a3cd8ca67b5.
2026-04-29 16:29:27.642 [info] Skipping acquiring lock for c:\Users\MyAccount\AppData\Roaming\Cursor\User\workspaceStorage\258a6b010628cfdd0bf63a3cd8ca67b5.
2026-04-29 16:29:27.642 [info] [ExtHostShellExec] Detecting sandbox support…
2026-04-29 16:29:27.642 [info] Skipping acquiring lock for c:\Users\MyAccount\AppData\Roaming\Cursor\User\workspaceStorage\258a6b010628cfdd0bf63a3cd8ca67b5.
nknown
2026-04-29 16:29:27.642 [info] [ExtHostShellExec] Platform: win32, Shell type: unknown
2026-04-29 16:29:27.642 [info] [ExtHostShellExec] dirname: c:\Users\MyAccount\AppData\Local\Programs\cursor\resources\app\out\vs\workbench\api\node
2026-04-29 16:29:27.643 [info] [ExtHostShellExec] Detecting sandbox support…
2026-04-29 16:29:27.643 [info] [ExtHostShellExec] Sandbox helper path: c:\Users\MyAccount\AppData\Local\Programs\cursor\resources\app\resources\helpers\cursorsandbox.exe
2026-04-29 16:29:27.643 [info] [ExtHostShellExec] process.resourcesPath: C:\Users\MyAccount\AppData\Local\Programs\cursor\resources
2026-04-29 16:29:27.643 [info] [ExtHostShellExec] dirname: c:\Users\MyAccount\AppData\Local\Programs\cursor\resources\app\out\vs\workbench\api\node
2026-04-29 16:29:27.643 [info] [shell-exec:sandbox] [isSandboxHelperSupported] Starting sandbox support check…
2026-04-29 16:29:27.643 [info] [ExtHostShellExec] Sandbox helper path: c:\Users\MyAccount\AppData\Local\Programs\cursor\resources\app\resources\helpers\cursorsandbox.exe
elpers\cursorsandbox.exe
2026-04-29 16:29:27.643 [info] [shell-exec:sandbox] [checkBinaryAvailable] Binary path exists: true
2026-04-29 16:29:27.643 [info] [shell-exec:sandbox] [isSandboxHelperSupported] win32: returning false (proxy-only, no filesystem sandbox)
2026-04-29 16:29:27.643 [info] [ExtHostShellExec] Sandbox support detected: false, platform: win32, kernelVersion: N/A
sor\resources
2026-04-29 16:29:27.643 [info] [ExtHostShellExec] process.execPath: C:\Users\MyAccount\AppData\Local\Programs\cursor\Cursor.exe
2026-04-29 16:29:27.643 [info] [shell-exec:sandbox] [isSandboxHelperSupported] Starting sandbox support check…
2026-04-29 16:29:27.643 [info] [shell-exec:sandbox] [checkBinaryAvailable] Resolved binary path: c:\Users\MyAccount\AppData\Local\Programs\cursor\resources\app\resources\helpers\cursorsandbox.exe
2026-04-29 16:29:27.643 [info] [shell-exec:sandbox] [checkBinaryAvailable] Binary path exists: true
2026-04-29 16:29:27.642 [info] [ExtHostShellExec] dirname: c:\Users\MyAccount\AppData\Local\Programs\cursor\resources\app\out\vs\workbenc2026-04-29 16:29:27.643 [info] [ExtHostShellExec] Sandbox support detected: false, platform: win32, kernelVersion: N/A
2026-04-29 16:29:27.643 [info] [ExtHostShellExec] Sandbox helper path: c:\Users\MyAccount\AppData\Local\Programs\cursor\resources\app\resources\helpers\cursorsandbox.exe
2026-04-29 16:29:27.643 [info] [ExtHostShellExec] process.resourcesPath: C:\Users\MyAccount\AppData\Local\Programs\cursor\resources
2026-04-29 16:29:27.643 [info] [ExtHostShellExec] process.execPath: C:\Users\MyAccount\AppData\Local\Programs\cursor\Cursor.exe
2026-04-29 16:29:27.643 [info] [shell-exec:sandbox] [isSandboxHelperSupported] Starting sandbox support check…
2026-04-29 16:29:27.643 [info] [shell-exec:sandbox] [checkBinaryAvailable] Resolved binary path: c:\Users\MyAccount\AppData\Local\Programs\cursor\resources\app\resources\helpers\cursorsandbox.exe
2026-04-29 16:29:27.643 [info] [shell-exec:sandbox] [checkBinaryAvailable] Binary path exists: true
2026-04-29 16:29:27.643 [info] [shell-exec:sandbox] [isSandboxHelperSupported] win32: returning false (proxy-only, no filesystem sandbox)
2026-04-29 16:29:27.643 [info] [ExtHostShellExec] Sandbox support detected: false, platform: win32, kernelVersion: N/A
2026-04-29 16:29:27.644 [info] Extension host with pid 35076 started
2026-04-29 16:29:27.644 [info] Skipping acquiring lock for c:\Users\MyAccount\AppData\Roaming\Cursor\User\workspaceStorage\258a6b010628cfdd0bf63a3cd8ca67b5.
2026-04-29 16:29:27.644 [info] [ExtHostShellExec] Detecting sandbox support…
2026-04-29 16:29:27.644 [info] [ExtHostShellExec] Platform: win32, Shell type: unknown
2026-04-29 16:29:27.644 [info] [ExtHostShellExec] dirname: c:\Users\MyAccount\AppData\Local\Programs\cursor\resources\app\out\vs\workbench\api\node
2026-04-29 16:29:27.644 [info] [ExtHostShellExec] Sandbox helper path: c:\Users\MyAccount\AppData\Local\Programs\cursor\resources\app\resources\helpers\cursorsandbox.exe
2026-04-29 16:29:27.644 [info] [ExtHostShellExec] process.resourcesPath: C:\Users\MyAccount\AppData\Local\Programs\cursor\resources
2026-04-29 16:29:27.644 [info] [ExtHostShellExec] process.execPath: C:\Users\MyAccount\AppData\Local\Programs\cursor\Cursor.exe
2026-04-29 16:29:27.644 [info] [shell-exec:sandbox] [isSandboxHelperSupported] Starting sandbox support check…
2026-04-29 16:29:27.644 [info] [shell-exec:sandbox] [checkBinaryAvailable] Resolved binary path: c:\Users\MyAccount\AppData\Local\Programs\cursor\resources\app\resources\helpers\cursorsandbox.exe
2026-04-29 16:29:27.644 [info] [shell-exec:sandbox] [checkBinaryAvailable] Binary path exists: true
2026-04-29 16:29:27.644 [info] [shell-exec:sandbox] [isSandboxHelperSupported] win32: returning false (proxy-only, no filesystem sandbox)
2026-04-29 16:29:27.644 [info] [ExtHostShellExec] Sandbox support detected: false, platform: win32, kernelVersion: N/A
2026-04-29 16:29:31.006 [info] [ExtHostShellExec] Initializing terminal executor with userTerminalHint: C:\Program Files\PowerShell\7\pwsh.exe
2026-04-29 16:29:31.030 [info] [ExtHostShellExec] Initializing terminal executor with userTerminalHint: C:\Program Files\PowerShell\7\pwsh.exe
2026-04-29 16:29:31.038 [info] [ExtHostShellExec] Initializing terminal executor with userTerminalHint: C:\Program Files\PowerShell\7\pwsh.exe
2026-04-29 16:29:31.054 [info] [ExtHostShellExec] Initializing terminal executor with userTerminalHint: C:\Program Files\PowerShell\7\pwsh.exe

This also occurred in my Arch Linux kde desktop.:pensive_face: And whole extension system may be impacted, specifically, it may happen that one or more extensions stop responding or provide error responses(such as built-in keybindings confusion) as you use them. I’m now trying to reproduce one and get the log.

Hi @KevinCaputo

This is a known issue our team is aware of and actively working on. A fix has been identified.

In the meantime, when you hit this state, running Ctrl + Shift + P → Developer: Restart Extension Host functionality should help without needing a full restart of Cursor. It won’t prevent the issue from recurring, but it’s faster than restarting the entire app.

Thank you for the detailed extension host logs. This matches the pattern we’re tracking.

@virtualguard101 — thanks for confirming this also occurs on Linux. The fix addresses this across all platforms.

Reloading the window doesn’t fix the issue.

Ctrl + Shift + P → “Developer: Restart Extension Host” does work for me however, so that’s a lot better than restarting Cursor.

Good catch. Developer: Restart Extension Host (Ctrl+Shift+P → “Restart Extension Host”) is the better workaround here. I’ll update the earlier suggestion.

The underlying fix is still in progress. We’ll update this thread when it ships.

Same failure on macOS with Cursor 3.17.21, and I think I have the actual root cause. The log in post 5 has the exact signature.

Root cause: a rejecting dispose() aborts _deactivateAll, so the host never calls process.exit()

The relevant frames from that log:

at Object.executeCommand (extensionHostProcess.js:214:142358)
at set hasGitHubRepositories (app/extensions/github/dist/extension.js:2:270497)
...
at KHs._deactivate    (extensionHostProcess.js:146:15497)
at Array.map ()
at KHs._deactivateAll (extensionHostProcess.js:146:12756)
at KHs.terminate      (extensionHostProcess.js:146:13110)
... setContext undefined

_deactivateAll maps over every extension’s dispose() without awaiting or catching. By the time it runs, the renderer has already closed the MessagePort, so any executeCommand("setContext", ...) inside a dispose() rejects with Canceled. That rejection escapes the map, terminate() never completes, and process.exit() is never reached. The process stays alive with a dead libuv event loop.

Worth stressing: in that log the triggers are Cursor’s own bundled extensions/git and extensions/github, so this is not a third-party extension problem. On my machine I hit it with three different extensions: ms-vscode.test-adapter-converter, eamodio.gitlens, and ms-toolsai.datawrangler. Uninstalling them just promotes whoever is next in the map.

Why it pegs a core, and why SIGTERM is ignored

Once the event loop is dead, nothing drains libuv’s signal pipe. Every incoming signal runs uv__signal_handler, which locks (read on a pipe), writes the signal to the queue pipe, then unlocks (write). fs_usage -w -t 3 on the stuck process:

3,156,213 syscalls in 3 seconds
  1,052,071  read  F=13  B=0x1     <- uv__signal_lock
  1,052,071  write F=28 [ 35 ]     <- uv__signal_write -> EAGAIN, pipe FULL
  1,052,071  write F=14  B=0x1     <- uv__signal_unlock

A perfect 1:1:1 triple, about 350,000 signal-handler invocations per second. The signal is never consumed, so it re-fires immediately.

That also explains the SIGTERM finding in the closed duplicate (topic 155821, which guessed the process was waiting for IPC): libuv catches SIGTERM, tries to queue it to the full pipe, gets EAGAIN, and it never reaches the dead loop. SIGKILL bypasses handlers, which is why only kill -9 works.

spindump on the main thread: 0.36 cycles/instruction, 53.6 G instructions in 5 s. A cache-hot syscall loop, not a stall and not memory thrashing.

Impact and reproduction

24 GB M-series, Cursor 3.17.21. One stranded host per closed window, each pinning a core and holding its full JS heap (4.2 GB in one case, unreclaimable). I got down to 57 MB free RAM with 22.8 GB of 24 GB swap used and about 14,100 compressor decompressions/sec. SIGKILLing the stranded hosts took load average from 8.1 to 2.7 and freed roughly 9 GB of swap.

Reproduction is trivial: open a window, let extensions finish activating, then close it. The (user) host stays at 100% CPU indefinitely, while its retrieval, always-local and agent-exec siblings all log “exiting with code 0” normally. Multi-root workspaces reproduced it most reliably for me: across 25 window logs, only the multi-root windows stranded.

Suggested fix

Any one of these three would break the failure mode independently.

Guard the map: use await Promise.allSettled(...) in _deactivateAll so a single rejection cannot abort the rest.

Bound the shutdown: after a few seconds, call process.exit() regardless of pending disposals. This alone makes the whole class of bug non-fatal.

Reap from the main process: kill (user) hosts whose window has closed and which have not exited within a grace period.

Still present in 3.17.21, about six months after the closed report on 2.6.21, and the log in post 5 shows it on Windows too, so it is not macOS-specific.