[bug] Plugin-tree boot crash-loops when a plugin imports an export the bundled @deepseek-ai package no longer provides (dsh-run2skill ↔ dsh-typert-protocol RemoteError) #5864
Replies: 1 comment
|
Excellent report — precise, with logs and a clean workaround. I verified the export-surface claim against the published artifacts, and the real root cause is one layer deeper than version skew: the desktop runtime is on the stale Artifact evidence
Published
So The deeper root cause:
|
Uh oh!
There was an error while loading. Please reload this page.
Summary
Installing a third-party plugin (
dsh-run2skill@0.4.0) whose code importsRemoteErrorfrom@deepseek-ai/dsh-typert-protocolmakes the whole webprofile unable to start: every boot dies with
plugin tree failed to load: ... The requested module '@deepseek-ai/dsh-typert-protocol' does not provide an export named 'RemoteError',and the launcher restarts it endlessly (~every 11 s), producing thousands of
crash-loop entries. A single broken plugin row takes down the entire tree
instead of being reported as one failed entry.
Environment
web/Applications/DeepSeek Harness.app/Contents/Resources/dsh-runtimedsh/@deepseek-ai/dsh-typert-protocol=0.1.0-rc.6dsh-typert-protocolexports (rc.6):Remote, RemoteScope, TypertLookupFailure, TypertRemoteService, bindTypertRemote, isTypertRemoteSegment, remoteMethods— noRemoteError~/.dsh/profiles/web/node_modules(pnpm), plus a fallback mirror of runtime deps at~/.dsh/profiles/node_modules/@deepseek-ai/*that plugins resolve@deepseek-ai/*bare imports againstdsh-run2skill@0.4.0,lib/index.js:5:import { RemoteError, TypertRemoteService } from "@deepseek-ai/dsh-typert-protocol";its
peerDependenciesdeclare@deepseek-ai/dsh-typert-protocol: 0.1.2-rc.1(npm dist-tag next), while the shipped runtime provides0.1.0-rc.6(dist-tag latest) which removedRemoteErrorEvidence (logs)
~/Library/Logs/DeepSeek Harness/launcher.log— the failing pattern:does not provide an export named 'RemoteError'appears 5,545 times in launcher.log before the fixhub.log:"Plugin Hub 已启动(profile=web)"repeated ~every 10.7 s (unbounded restart loop; 1,116 system.start entries)EADDRINUSE: address already in use 127.0.0.1:3080while the previous instance still held the portRoot cause
A version-skew named-export mismatch at module instantiation, made fatal by the loader:
nextprotocol line (0.1.2-rc.1), which exportsRemoteError.latest(0.1.0-rc.6), which removedRemoteError.SyntaxErrorwhen the named export is missing — this is a load-time failure, independent of whether the symbol is ever called.cordis-plugin-loadertreats any failedincludeasplugin tree failed to load, the boot process exits, and the launcher restarts it → crash loop with no backoff and no isolation of the offending row.What we did locally (workaround, not an upstream fix)
cordis.patch.yml- id: run2skill / disabled: trueRemoteErrortop-level import, kept a module-localclass RemoteError extends Errorso the twothrow new RemoteError(...)sites keep their wire shape; re-enabled the row; verified the module imports cleanly and the tree boots.Suggested fixes / asks
@deepseek-ai/*through the fallback mirror, compare the resolved package's actual export surface against the import list (and the plugin's declared peer range vs. resolved version) and report e.g.:run2skill imports RemoteError from @deepseek-ai/dsh-typert-protocol; runtime provides 0.1.0-rc.6 (no such export; plugin wants 0.1.2-rc.1)instead of a buried nested-cause stack.
dsh plugin addcould statically check named@deepseek-ai/*imports of the plugin against the bundled mirror before writing the composition.nextcurrently break onlatestruntimes with no version check; consider enforcing peer ranges or publishing a compatibility matrix (this is not about the specific plugin — any @deepseek-ai/* symbol removal has the same failure shape).Happy to attach full logs or run additional probes.
All reactions