openclaw - 💡(How to fix) Fix [Bug]: Plugin extensions fail to load on Node.js 25 (Windows): "Received protocol 'c:'" [2 comments, 3 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
openclaw/openclaw#72300Fetched 2026-04-27 05:31:55
View on GitHub
Comments
2
Participants
3
Timeline
5
Reactions
0
Timeline (top)
commented ×2labeled ×2closed ×1

On Windows with Node.js v25.9.0, OpenClaw 2026.4.24 fails to load the browser-control extension and the Telegram channel provider with "Only URLs with a scheme in: file, data, and node are supported by the default ESM loader. ... Received protocol 'c:'", causing a 1/10..N/10 channel auto-restart loop while the rest of the gateway remains responsive.

Error Message

Full gateway boot log (timestamps preserved, identifying tokens redacted):

16:04:44 [gateway] ready (7 plugins: acpx, bonjour, browser, device-pair, phone-control, talk-voice, telegram; 10.4s) 16:04:44 [gateway] log file: C:\Users\1\AppData\Local\Temp\openclaw
openclaw-2026-04-26.log 16:04:44 [gateway] starting channels and sidecars... 16:04:44 [hooks] loaded 4 internal hook handlers 16:04:44 [plugins] embedded acpx runtime backend registered (cwd: C:\Users\1.openclaw\workspace) 16:04:44 [plugins] plugin service failed (browser-control, plugin=browser, root=C:\Users\1\AppData\Roaming\npm\node_modules
openclaw\dist\extensions...): Only URLs with a scheme in: file, data, and node are supported by the default ESM loader. On Windows, absolute paths must be valid file:// URLs. Received protocol 'c:' <full stack trace as in §6 above>

16:04:44 (node:33104) [DEP0190] DeprecationWarning: Passing args to a child process with shell option true can lead to security vulnerabilities, as the arguments are not escaped, only concatenated. (Use node --trace-deprecation ... to show where the warning was created) 16:04:44 [heartbeat] started 16:04:45 [telegram] [default] starting provider (@<bot>) 16:04:45 [telegram] [default] channel exited: Only URLs with a scheme in: file, data, and node are supported by the default ESM loader. ... Received protocol 'c:' 16:04:45 [telegram] [default] auto-restart attempt 1/10 in 5s 16:04:45 [plugins] bonjour: advertised gateway fqdn=BenQue (OpenClaw)._openclaw-gw._tcp.local. host=openclaw.local. port=18789 state=announcing

(See attached screenshot for the same log.)

Root Cause

Two distinct extensions fail at module load with identical root cause:

Code Example

Full gateway boot log (timestamps preserved, identifying tokens redacted):

16:04:44 [gateway] ready (7 plugins: acpx, bonjour, browser, device-pair,
                  phone-control, talk-voice, telegram; 10.4s)
16:04:44 [gateway] log file: C:\Users\1\AppData\Local\Temp\openclaw\
                  openclaw-2026-04-26.log
16:04:44 [gateway] starting channels and sidecars...
16:04:44 [hooks] loaded 4 internal hook handlers
16:04:44 [plugins] embedded acpx runtime backend registered
                  (cwd: C:\Users\1\.openclaw\workspace)
16:04:44 [plugins] plugin service failed (browser-control,
                  plugin=browser,
                  root=C:\Users\1\AppData\Roaming\npm\node_modules\
                       openclaw\dist\extensions\...):
                  Only URLs with a scheme in: file, data, and node are
                  supported by the default ESM loader. On Windows,
                  absolute paths must be valid file:// URLs.
                  Received protocol 'c:'
         <full stack trace as in §6 above>

16:04:44 (node:33104) [DEP0190] DeprecationWarning: Passing args to a
         child process with shell option true can lead to security
         vulnerabilities, as the arguments are not escaped, only
         concatenated. (Use `node --trace-deprecation ...` to show
         where the warning was created)
16:04:44 [heartbeat] started
16:04:45 [telegram] [default] starting provider (@<bot>)
16:04:45 [telegram] [default] channel exited: Only URLs with a scheme
                  in: file, data, and node are supported by the default
                  ESM loader. ... Received protocol 'c:'
16:04:45 [telegram] [default] auto-restart attempt 1/10 in 5s
16:04:45 [plugins] bonjour: advertised gateway
                  fqdn=BenQue (OpenClaw)._openclaw-gw._tcp.local.
                  host=openclaw.local. port=18789 state=announcing

(See attached screenshot for the same log.)
RAW_BUFFERClick to expand / collapse

Bug type

Crash (process/app exits or hangs)

Beta release blocker

No

Summary

On Windows with Node.js v25.9.0, OpenClaw 2026.4.24 fails to load the browser-control extension and the Telegram channel provider with "Only URLs with a scheme in: file, data, and node are supported by the default ESM loader. ... Received protocol 'c:'", causing a 1/10..N/10 channel auto-restart loop while the rest of the gateway remains responsive.

Steps to reproduce

  1. On Windows 11 with Node.js v25.9.0 installed, run: npm install -g openclaw@latest (resolves to openclaw 2026.4.24, build cbcfdf6)
  2. Start the gateway (default config, gateway.bind=loopback, channels.telegram.enabled=true, plugins.entries.ollama.enabled=true).
  3. Observe the gateway log at startup:
    • "[plugins] plugin service failed (browser-control, plugin=browser, root=C:\Users\1\AppData\Roaming\npm\node_modules
      openclaw\dist\extensions...)" with the ESM URL-scheme stack trace.
    • "[telegram] [default] channel exited: Only URLs with a scheme in: file, data, and node are supported by the default ESM loader. ... Received protocol 'c:'"
    • "[telegram] [default] auto-restart attempt 1/10 in 5s", repeating up to 4/10 within ~90s.

Expected behavior

The browser-control extension and the Telegram channel provider should load successfully and stay running, the same way the other plugins in the same gateway boot do: acpx, bonjour, device-pair, phone-control, and talk-voice all reach a steady "ready" state in the same log ("[gateway] ready (7 plugins: ...; 10.4s)", "[plugins] embedded acpx runtime backend registered").

Actual behavior

Two distinct extensions fail at module load with identical root cause:

(a) browser-control extension: [plugins] plugin service failed (browser-control, plugin=browser, root=C:\Users\1\AppData\Roaming\npm\node_modules\openclaw
dist\extensions...) Error: Only URLs with a scheme in: file, data, and node are supported by the default ESM loader. On Windows, absolute paths must be valid file:// URLs. Received protocol 'c:' at throwIfUnsupportedURLScheme (node:internal/modules/esm/load:195:11) at defaultLoadSync (node:internal/modules/esm/load:142:3) at ModuleLoader.#loadAndMaybeBlockOnLoaderThread (node:internal/modules/esm/loader:776:12) at ModuleLoader.#loadSync (node:internal/modules/esm/loader:796:49) at ModuleLoader.load (node:internal/modules/esm/loader:762:26) at ModuleLoader.loadAndTranslate (node:internal/modules/esm/loader:504:31) at ModuleLoader.#getOrCreateModuleJobAfterResolve (node:internal/modules/esm/loader:555:36) at afterResolve (node:internal/modules/esm/loader:603:52) at ModuleLoader.getOrCreateModuleJob (node:internal/modules/esm/loader:609:12) at node:internal/modules/esm/loader:628:32

(b) Telegram channel provider (@<bot>): [telegram] [default] starting provider (@<bot>) [telegram] [default] channel exited: Only URLs with a scheme in: file, data, and node are supported by the default ESM loader. ... Received protocol 'c:' [telegram] [default] auto-restart attempt 1/10 in 5s (then 2/10 in 11s, 3/10 in 21s, 4/10 in 42s — exponential backoff, same error on every attempt)

The gateway itself stays up and the WebChat connects normally; commands list, node list, device-pair list, chat history, models list, and channels status all return "✓ res" on the WebSocket transport.

The error string "Received protocol 'c:'" indicates a Windows absolute path (e.g., "C:\Users\1\AppData\Roaming\npm\node_modules\openclaw
dist\extensions...") is being passed directly to a dynamic import() without conversion via pathToFileURL() from node:url. Node.js parses "c:" as the URL scheme, which fails the ESM loader's scheme allowlist (file/data/node).

OpenClaw version

2026.4.24 (cbcfdf6)

Operating system

Windows 11

Install method

npm install -g openclaw@latest (Node.js v25.9.0, npm global prefix under C:\Users\1\AppData\Roaming\npm)

Model

N/A — failure occurs at plugin/channel module load, before any model invocation. (For reference, the configured model provider is local Ollama; this bug is not provider-specific.)

Provider / routing chain

N/A — failure is in the gateway's ESM module loader, before any provider routing occurs. Configured chain (not exercised at the point of failure): local gateway (bind=loopback, port=18789) → ollama provider at http://127.0.0.1:11434.

Additional provider/model setup details

gateway.bind=loopback, gateway.mode=local, gateway.tailscale.mode=off. Channels: telegram.enabled=true (botToken redacted). Plugins enabled: ollama. Other plugins observed loading successfully in the same boot: acpx, bonjour, device-pair, phone-control, talk-voice. Tools profile: "coding", web.search and web.fetch disabled.

Logs, screenshots, and evidence

Full gateway boot log (timestamps preserved, identifying tokens redacted):

16:04:44 [gateway] ready (7 plugins: acpx, bonjour, browser, device-pair,
                  phone-control, talk-voice, telegram; 10.4s)
16:04:44 [gateway] log file: C:\Users\1\AppData\Local\Temp\openclaw\
                  openclaw-2026-04-26.log
16:04:44 [gateway] starting channels and sidecars...
16:04:44 [hooks] loaded 4 internal hook handlers
16:04:44 [plugins] embedded acpx runtime backend registered
                  (cwd: C:\Users\1\.openclaw\workspace)
16:04:44 [plugins] plugin service failed (browser-control,
                  plugin=browser,
                  root=C:\Users\1\AppData\Roaming\npm\node_modules\
                       openclaw\dist\extensions\...):
                  Only URLs with a scheme in: file, data, and node are
                  supported by the default ESM loader. On Windows,
                  absolute paths must be valid file:// URLs.
                  Received protocol 'c:'
         <full stack trace as in §6 above>

16:04:44 (node:33104) [DEP0190] DeprecationWarning: Passing args to a
         child process with shell option true can lead to security
         vulnerabilities, as the arguments are not escaped, only
         concatenated. (Use `node --trace-deprecation ...` to show
         where the warning was created)
16:04:44 [heartbeat] started
16:04:45 [telegram] [default] starting provider (@<bot>)
16:04:45 [telegram] [default] channel exited: Only URLs with a scheme
                  in: file, data, and node are supported by the default
                  ESM loader. ... Received protocol 'c:'
16:04:45 [telegram] [default] auto-restart attempt 1/10 in 5s
16:04:45 [plugins] bonjour: advertised gateway
                  fqdn=BenQue (OpenClaw)._openclaw-gw._tcp.local.
                  host=openclaw.local. port=18789 state=announcing

(See attached screenshot for the same log.)

Impact and severity

  • Telegram channel: unusable; auto-restart loop runs continuously (1/10..10/10 over several minutes), spamming the log and consuming CPU on each retry attempt.
  • browser-control extension: unusable; the plugin service is marked failed at boot and never recovers within a session.
  • Other components unaffected: gateway, WebChat, bonjour discovery, ACPX runtime, device-pair, phone-control, talk-voice, and all observed WS RPC commands continue to work normally.
  • Affected configurations: Windows + Node.js v25 (default-installed Node currently shipped on nodejs.org as "Current"). Effective scope is every Windows user who installed Node.js 25 before switching to LTS.

Additional information

Suspected root cause (not confirmed by reading the source): a dynamic import() somewhere under dist/extensions/ (and in the Telegram channel provider entry point) is invoked with a raw Windows absolute path ("C:\...") instead of the URL form ("file:///C:/..."). Node.js 25 enforces the ESM loader's URL-scheme allowlist on this code path, treating "c:" as a scheme. Wrapping the import path with pathToFileURL() from node:url before passing it to import() typically resolves this class of error.

Last known good / first known bad: NOT_ENOUGH_INFO (this reporter has not tested earlier OpenClaw versions on Node 25, nor newer Node versions against earlier OpenClaw builds.)

Secondary signal in the same boot: DEP0190 deprecation warning fires once during gateway startup, indicating a child_process spawn elsewhere in the codebase passes args together with shell: true without escaping. Not the cause of the crash, but worth a separate audit pass given the attack surface.

extent analysis

TL;DR

The issue can be fixed by wrapping Windows absolute paths with pathToFileURL() from node:url before passing them to dynamic import() statements.

Guidance

  • Identify the dynamic import() statements in the code that are being passed Windows absolute paths.
  • Wrap these paths with pathToFileURL() from node:url to convert them to valid file:// URLs.
  • Verify that the pathToFileURL() function is used correctly and that the resulting URLs are valid.
  • Check for any other instances of dynamic import() statements that may be passing Windows absolute paths without proper conversion.

Example

const { pathToFileURL } = require('node:url');
const windowsAbsolutePath = 'C:\\\\Users\\\\1\\\\AppData\\\\Roaming\\\\npm\\\\node_modules\\\\openclaw\\\\dist\\\\extensions\\\\...';
const validUrl = pathToFileURL(windowsAbsolutePath);
import(validUrl);

Notes

The provided information suggests that the issue is specific to Windows and Node.js v25.9.0. The fix should be applied to all dynamic import() statements that pass Windows absolute paths.

Recommendation

Apply the workaround by wrapping Windows absolute paths with pathToFileURL() from node:url before passing them to dynamic import() statements. This should resolve the issue with the browser-control extension and the Telegram channel provider.

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…

FAQ

Expected behavior

The browser-control extension and the Telegram channel provider should load successfully and stay running, the same way the other plugins in the same gateway boot do: acpx, bonjour, device-pair, phone-control, and talk-voice all reach a steady "ready" state in the same log ("[gateway] ready (7 plugins: ...; 10.4s)", "[plugins] embedded acpx runtime backend registered").

Still need to ship something?

×6

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

Back to top recommendations

TRENDING

openclaw - 💡(How to fix) Fix [Bug]: Plugin extensions fail to load on Node.js 25 (Windows): "Received protocol 'c:'" [2 comments, 3 participants]