claude-code - 💡(How to fix) Fix [BUG] Cowork dispatches macOS-only extensions to Linux remote → retry loop causes remote OOM and local renderer leak [1 participants]

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…
GitHub stats
anthropics/claude-code#52959Fetched 2026-04-25 06:16:09
View on GitHub
Comments
0
Participants
1
Timeline
6
Reactions
0
Author
Participants
Timeline (top)
labeled ×6

When a Cowork session is attached to a Linux SSH host, macOS-only Claude Desktop extensions are still dispatched as RemoteProcesses on the remote. Their manifests declare platforms: ["darwin"] (or use macOS-only APIs like AppleScript / Chrome AppleScript). The remote has no node in $PATH, so every spawn fails with exec: "node": executable file not found in $PATH. The app retries indefinitely on a ~15 s cadence per server.

Error Message

[RemoteProcess:…] Spawn failed: exec: "node": executable file not found in $PATH [RemoteStdioTransport:Control Chrome] process error: … [SshMcpServerManager] Failed to connect Control Chrome: connect timeout [RemoteProcess:…] kill called with signal: SIGTERM

Root Cause

When a Cowork session is attached to a Linux SSH host, macOS-only Claude Desktop extensions are still dispatched as RemoteProcesses on the remote. Their manifests declare platforms: ["darwin"] (or use macOS-only APIs like AppleScript / Chrome AppleScript). The remote has no node in $PATH, so every spawn fails with exec: "node": executable file not found in $PATH. The app retries indefinitely on a ~15 s cadence per server.

Fix Action

Workaround

Disable the macOS-only extensions by editing

~/Library/Application Support/Claude/Claude Extensions Settings/<extension-id>.json

to {"isEnabled": false} and restart the app. This immediately stops the loop (verified: SSH disconnects/min dropped from ~60 to ~4, no further OOMs on remote).

Code Example

[RemoteProcess:] Spawn failed: exec: "node": executable file not found in $PATH
[RemoteStdioTransport:Control Chrome] process error:[SshMcpServerManager] Failed to connect Control Chrome: connect timeout
[RemoteProcess:] kill called with signal: SIGTERM

---

[RemoteProcess:] Spawn failed: exec: "node": executable file not found in $PATH
  [RemoteStdioTransport:Control Chrome] process error:  [SshMcpServerManager] Failed to connect Control Chrome: connect timeout
  [RemoteProcess:] kill called with signal: SIGTERM

---

wireplumber.service: killed by the OOM killer (code=killed, status=9/KILL)

---

~/Library/Application Support/Claude/Claude Extensions Settings/<extension-id>.json
RAW_BUFFERClick to expand / collapse

Preflight Checklist

  • I have searched existing issues and this hasn't been reported yet
  • This is a single bug report (please file separate reports for different bugs)
  • I am using the latest version of Claude Code

What's Wrong?

When a Cowork session is attached to a Linux SSH host, macOS-only Claude Desktop extensions are still dispatched as RemoteProcesses on the remote. Their manifests declare platforms: ["darwin"] (or use macOS-only APIs like AppleScript / Chrome AppleScript). The remote has no node in $PATH, so every spawn fails with exec: "node": executable file not found in $PATH. The app retries indefinitely on a ~15 s cadence per server.

What Should Happen?

  • Desktop respects extension platforms compatibility field and does not dispatch macOS-only extensions to Linux remotes.
  • At minimum, failed spawns use exponential backoff and eventually disable the extension for that session rather than retrying forever.

Error Messages/Logs

[RemoteProcess:…] Spawn failed: exec: "node": executable file not found in $PATH
[RemoteStdioTransport:Control Chrome] process error: …
[SshMcpServerManager] Failed to connect Control Chrome: connect timeout
[RemoteProcess:…] kill called with signal: SIGTERM

Steps to Reproduce

Reproduction

  1. Install Control Chrome, Control your Mac, and PDF (By Anthropic) extensions on macOS.
  2. Configure a Cowork SSH host (Linux) without node on the remote $PATH.
  3. Open Claude Desktop with a Cowork session on that host.
  4. Leave running for ~60 min.

Claude Model

Not sure / Multiple models

Is this a regression?

Yes, this worked in a previous version

Last Working Version

No response

Claude Code Version

1.3883.0

Platform

Anthropic API

Operating System

macOS

Terminal/Shell

Terminal.app (macOS)

Additional Information

Environment

  • Claude Desktop: 1.3883.0 (macOS arm64)
  • Claude Code CLI (local embedded): 2.1.111
  • Remote CLI (cowork): 2.1.111 on Linux arm64 (NVIDIA DGX Spark / GB10)
  • claude-ssh server: 9a871e263f5ad97516c97c8c8129f94990635ae7

Summary

When a Cowork session is attached to a Linux SSH host, macOS-only Claude Desktop extensions are still dispatched as RemoteProcesses on the remote. Their manifests declare platforms: ["darwin"] (or use macOS-only APIs like AppleScript / Chrome AppleScript). The remote has no node in $PATH, so every spawn fails with exec: "node": executable file not found in $PATH. The app retries indefinitely on a ~15 s cadence per server.

Affected extensions observed

  • ant.dir.ant.anthropic.chrome-control (manifest: platforms: ["darwin"])
  • ant.dir.gh.k6l3.osascript ("Control your Mac" — AppleScript, macOS-only in practice)
  • ant.dir.gh.anthropic.pdf-server-mcp (darwin/win32/linux manifest, but node wasn't provisioned on remote)

Reproduction

  1. Install Control Chrome, Control your Mac, and PDF (By Anthropic) extensions on macOS.
  2. Configure a Cowork SSH host (Linux) without node on the remote $PATH.
  3. Open Claude Desktop with a Cowork session on that host.
  4. Leave running for ~60 min.

Expected

  • Desktop respects extension platforms compatibility field and does not dispatch macOS-only extensions to Linux remotes.
  • At minimum, failed spawns use exponential backoff and eventually disable the extension for that session rather than retrying forever.

Actual

  • ~/Library/Logs/Claude/ssh.log fills with, every ~15 s per server:
    [RemoteProcess:…] Spawn failed: exec: "node": executable file not found in $PATH
    [RemoteStdioTransport:Control Chrome] process error: …
    [SshMcpServerManager] Failed to connect Control Chrome: connect timeout
    [RemoteProcess:…] kill called with signal: SIGTERM
  • On the remote, each retry opens and closes an SSH session. loginctl list-sessions shows session IDs climbing 600+ per hour. snapd-desktop-i / systemd-logind accumulate memory per session.
  • After 55–60 min, the OOM killer fires on the remote:
    wireplumber.service: killed by the OOM killer (code=killed, status=9/KILL)
  • Remote kernel eventually panics / hangs. I observed 14 hard reboots over ~72 hours on a 119 GB RAM box.
  • On macOS, the renderer (Claude Helper (Renderer)) grows handles/heap continuously and crashes every ~40 min.

Impact

Users with any macOS-only extension installed + Cowork on Linux get periodic desktop crashes and — more seriously — hourly hard-crashes of their remote development box.

Workaround

Disable the macOS-only extensions by editing

~/Library/Application Support/Claude/Claude Extensions Settings/<extension-id>.json

to {"isEnabled": false} and restart the app. This immediately stops the loop (verified: SSH disconnects/min dropped from ~60 to ~4, no further OOMs on remote).

Suggested fixes

  1. Honor manifest.compatibility.platforms when picking dispatch target. If target platform isn't in the list, run the extension locally (or surface a UI warning and skip).
  2. Apply exponential backoff to remote RemoteProcess spawn failures; stop retrying after N failures per session.
  3. In the error message, hint at the platform mismatch when it's likely (e.g. macOS node-based extension + Linux remote).

extent analysis

TL;DR

The most likely fix is to honor the manifest.compatibility.platforms field when dispatching extensions to remote hosts, ensuring macOS-only extensions are not sent to Linux remotes.

Guidance

  • Verify that the manifest.compatibility.platforms field is correctly set for each extension, especially for macOS-only extensions like ant.dir.ant.anthropic.chrome-control and ant.dir.gh.k6l3.osascript.
  • Consider implementing exponential backoff for remote RemoteProcess spawn failures to prevent indefinite retries and reduce the load on the remote host.
  • Review the error handling mechanism to provide more informative error messages, such as hinting at platform mismatches when likely.
  • As a temporary workaround, disable macOS-only extensions by editing their settings files to {"isEnabled": false} and restarting the app.

Example

No code snippet is provided as the issue is more related to configuration and extension management.

Notes

The provided workaround of disabling macOS-only extensions can mitigate the issue, but a more permanent solution would involve modifying the extension dispatch logic to respect platform compatibility.

Recommendation

Apply the suggested fix of honoring manifest.compatibility.platforms when picking dispatch targets to prevent macOS-only extensions from being sent to Linux remotes, as this addresses the root cause of the issue.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING

claude-code - 💡(How to fix) Fix [BUG] Cowork dispatches macOS-only extensions to Linux remote → retry loop causes remote OOM and local renderer leak [1 participants]