Skip to content

[Bug] deepseek-ivideo: preview child process crashes on Windows with ERR_UNSUPPORTED_ESM_URL_SCHEME (native path passed to node --import) #4

Description

@yishengdaxiaonengjihui

Summary

On Windows, opening the iVideo view fails: the HyperFrames preview child process that deepseek-ivideo spawns dies immediately at boot. The host stays alive, but the view can never start.

The cause is a Windows-only path/URL mismatch inside the bundled runtime: the preview owner-guard module is resolved to a native Windows absolute path (C:\...) and then handed to Node's --import CLI flag, which only accepts URLs or bare specifiers. The ESM loader parses the drive letter as protocol c: and throws.

Environment

  • OS: Microsoft Windows, Version 10.0.26200.8457
  • Node.js: v24.13.0
  • DSH: 0.1.1-rc.2 (npx @deepseek-ai/dsh web)
  • deepseek-ivideo: 0.1.0
  • hyperframes: 0.7.60

Steps to reproduce

  1. Install and register the plugin as a profile bundle (deepseek-ivideo in dsh.profile.bundles), start dsh web.
  2. Open a conversation and switch to the iVideo view.
  3. When the view starts a preview session, the spawned child process crashes.

Actual result

node:internal/modules/esm/load:195 throw new ERR_UNSUPPORTED_ESM_URL_SCHEME(parsed, schemes); ^ Error [ERR_UNSUPPORTED_ESM_URL_SCHEME]: 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 #loadAndMaybeBlockOnLoaderThread (node:internal/modules/esm/loader:795:12) at #loadSync (node:internal/modules/esm/loader:815:49) at ModuleLoader.load (node:internal/modules/esm/loader:780:26) ...
Node.js v24.13.0

(The trace comes from the spawned preview child process; the DSH host itself keeps running.)

Root cause

In lib/runtime-C_JDweoV.js (v0.1.0):

Line ~16752 — the guard path is converted to a native path:

this.ownerGuardPath = fileURLToPath(new URL("./preview-owner-guard.js", import.meta.url));
// => "C:\Users\<user>\.dsh\profiles\web\node_modules\deepseek-ivideo\lib\preview-owner-guard.js"

Line ~16924 — it is passed to the spawned node process via --import:

return spawn(process.execPath, [
    ...ownsPreview ? ["--import", this.ownerGuardPath] : [],
    this.cliPath,
    ...args
], { ... });

node --import requires a URL or bare specifier. On POSIX the native path /abs/path happens to be tolerated, which is why this only breaks on Windows.

Minimal reproduction

# Fails on Windows — exact same ERR_UNSUPPORTED_ESM_URL_SCHEME ('c:')
node --import "C:/path/to/deepseek-ivideo/lib/preview-owner-guard.js" -e "console.log('ok')"

# Works
node --import "file:///C:/path/to/deepseek-ivideo/lib/preview-owner-guard.js" -e "console.log('ok')"

Suggested fix

Since ownerGuardPath's only consumer is the --import argument, keep it in URL form:

- this.ownerGuardPath = fileURLToPath(new URL("./preview-owner-guard.js", import.meta.url));
+ this.ownerGuardPath = new URL("./preview-owner-guard.js", import.meta.url).href;

or convert at the spawn site with pathToFileURL(this.ownerGuardPath).href.

I verified the one-line fix locally: after patching, the chunk loads cleanly and the preview child boots successfully on Windows.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions