You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Desktop rc.2 upgrade: a profile-shadowed dependency silently disables core workspace services (UI shows no sessions)
#13093
Desktop upgrade rc.1 → rc.2: a profile-shadowed dsh-storage-domain silently disables core workspace services (UI shows no sessions)
Version: DeepSeek Harness Desktop 0.2.2-rc.2 (upgraded from 0.2.2-rc.1), macOS arm64.
Symptom
After upgrading the desktop app, the left sidebar renders 工作区 / 暂无会话 (Workspaces / No sessions). No workspace rows appear, and the workspace list looks empty. Session logs and the projection cache are intact on disk — the app simply never starts the services that serve them. There is no fatal dialog and no visible error in the UI.
Root cause
The desktop profile ($DSH_HOME/profiles/desktop) still contains third-party plugins installed under rc.1. In this case @deepseek-ai/dsh-cua-bundle@0.2.2-rc.1 depends on @deepseek-ai/dsh-storage-domain@0.2.2-rc.1, and pnpm's hoisted layout places that copy under the profile's node_modules. The rc.2 installation ships @deepseek-ai/dsh-storage-domain@0.2.2-rc.2.
Profile-local packages intentionally win over the runtime resolution, so the core plugin row storage-domain resolves to the rc.1 copy. dsh-app-boot's compatibility preflight (prepareProfileEntries → preflight) then evaluates that manifest's peer @deepseek-ai/dsh-storage: 0.2.2-rc.1 against runtime 0.2.2-rc.2, marks the row disabled: true, and reports only to stderr:
dsh: disabling profile plugin row "storage-domain": Plugin @deepseek-ai/dsh-storage-domain@0.2.2-rc.1 is incompatible with dsh 0.2.2-rc.2 ...
Because workspace, session-controller, workspace-controller, and session-projection-cache inject storageDomain / workspaceRegistry, they stay pending forever (Loader fiber state 0). Gateway calls answer:
gateway/service-unavailable: active Service "sessionController" is unavailable
The desktop window does not consume the Host's stderr, so from the user's point of view every session has vanished.
For this particular pair, dsh-storage-domain rc.1 and rc.2 lib/index.js are byte-identical; the mismatch is only the declared peer range. The compatibility exemption is safe in this case, but the failure mode is not obvious from the UI.
Minimal reproduction
On 0.2.2-rc.1, install a profile plugin whose dependency tree contains an older @deepseek-ai/dsh-* package that the app also bundles (for example dsh-cua-bundle@0.2.2-rc.1).
Upgrade the desktop app to 0.2.2-rc.2.
Launch the app. The workspace/session UI is empty.
Inspect the Loader entries: the core storage-domain row has options.disabled === true, and dependent services stay pending.
Workaround / recovery
Quit every Host process (the desktop app and any headless hosts).
If the resolved and installed copies are verified equivalent, grant the exact-version exemption in $DSH_HOME/profiles/desktop/compatibility.json:
Restart the app. storage-domain activates, the workspace services mount, and the existing workspace index is served again.
The longer-term fix is to update or remove the profile plugin so its dependency tree resolves core packages to the running runtime.
Suggestions
Surface compatibility denials in the desktop UI. The preflight reason is actionable but stderr-only. A startup banner/dialog listing denied rows with the resolved version, the runtime version, and the remedy would turn this from “all data is gone” into a one-line configuration problem.
Attribute shadowed core rows to the profile plugin that declares the copy. The generic warning names the version conflict but not the fact that the package was resolved from the profile and shadows the installation. A small diagnostic patch is on a fork branch (see below).
Reconcile profile plugin dependencies on app upgrade, or block plugins whose core peers do not match the runtime, so the stale copy is never created.
(Separate observation, not the cause here) Sessions written by non-desktop hosts are not attached to any workspace record after the one-time bootstrap; only registered sessions appear in the desktop workspace list.
Fork branch
I have a small diagnostic patch (not a PR, per CONTRIBUTING) that appends a sentence when a denied row's copy lives in the profile and shadows a same-named installation package, naming both versions; it also adds a focused test for the message. The compatibility-preflight suite passes locally (29/29):
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Desktop upgrade rc.1 → rc.2: a profile-shadowed
dsh-storage-domainsilently disables core workspace services (UI shows no sessions)Version: DeepSeek Harness Desktop
0.2.2-rc.2(upgraded from0.2.2-rc.1), macOS arm64.Symptom
After upgrading the desktop app, the left sidebar renders 工作区 / 暂无会话 (Workspaces / No sessions). No workspace rows appear, and the workspace list looks empty. Session logs and the projection cache are intact on disk — the app simply never starts the services that serve them. There is no fatal dialog and no visible error in the UI.
Root cause
The desktop profile (
$DSH_HOME/profiles/desktop) still contains third-party plugins installed under rc.1. In this case@deepseek-ai/dsh-cua-bundle@0.2.2-rc.1depends on@deepseek-ai/dsh-storage-domain@0.2.2-rc.1, and pnpm's hoisted layout places that copy under the profile'snode_modules. The rc.2 installation ships@deepseek-ai/dsh-storage-domain@0.2.2-rc.2.Profile-local packages intentionally win over the runtime resolution, so the core plugin row
storage-domainresolves to the rc.1 copy.dsh-app-boot's compatibility preflight (prepareProfileEntries→preflight) then evaluates that manifest's peer@deepseek-ai/dsh-storage: 0.2.2-rc.1against runtime0.2.2-rc.2, marks the rowdisabled: true, and reports only to stderr:Because
workspace,session-controller,workspace-controller, andsession-projection-cacheinjectstorageDomain/workspaceRegistry, they stay pending forever (Loader fiber state 0). Gateway calls answer:The desktop window does not consume the Host's stderr, so from the user's point of view every session has vanished.
For this particular pair,
dsh-storage-domainrc.1 and rc.2lib/index.jsare byte-identical; the mismatch is only the declared peer range. The compatibility exemption is safe in this case, but the failure mode is not obvious from the UI.Minimal reproduction
@deepseek-ai/dsh-*package that the app also bundles (for exampledsh-cua-bundle@0.2.2-rc.1).storage-domainrow hasoptions.disabled === true, and dependent services staypending.Workaround / recovery
$DSH_HOME/profiles/desktop/compatibility.json:{ "@deepseek-ai/dsh-storage-domain@0.2.2-rc.1": ["0.2.2-rc.2"] }storage-domainactivates, the workspace services mount, and the existing workspace index is served again.The longer-term fix is to update or remove the profile plugin so its dependency tree resolves core packages to the running runtime.
Suggestions
Fork branch
I have a small diagnostic patch (not a PR, per CONTRIBUTING) that appends a sentence when a denied row's copy lives in the profile and shadows a same-named installation package, naming both versions; it also adds a focused test for the message. The
compatibility-preflightsuite passes locally (29/29):https://github.com/miuiadmin/deepseek-harness/tree/fix/profile-shadow-diagnostic
Happy to adjust it or provide more traces (Loader entry dump, resolution table) if useful.
All reactions