CHANGELOG
DSH Desktop Changelog
Versions are composite: <dsh kernel>.shell.<shell rev>. The kernel tracks the official @deepseek-ai/dsh package; shell revisions carry desktop-shell fixes and features only. Highlights below; full notes live on each GitHub release page.
v0.2.2-alpha.3.shell.0 (kernel 0.2.2-alpha.3)
- Kernel 0.2.2-alpha.2 → 0.2.2-alpha.3: the manifest pin plus 32
dsh-*peer ranges moved together,cordis-plugin-groupfollows the new app-boot peer (1.0.6-alpha.2), release-age exemptions were re-pinned (315 → 302), the closure was regenerated and re-deployed withaudit-harness-peers: closure satisfied. Both maintenance patches were re-reviewed against the new bundles: the account patch is still two hunks applied cleanly, and the session-trash patch's anchors and thebinding.session/removedcontract it reads are unchanged (the host bundle's 50-line diff is projection plumbing only; the workspace bundle's navigation block is byte-identical). 0.2.2-alpha.3 is registered inREVIEWED_KERNELS. - Desktop tools menu is one line per action: the overlay no longer renders a muted subtitle under each label (row height 52px → 38px, long labels ellipsize), while group headers and the panel headline stay. Each setting's description remains on its settings page; only the eleven duplicated subtitle strings were removed in both locales. Gates:
pnpm run verify, LAN pairing 2/2, offline market 1/1, real market 2/2, anddist:dirfollowed by the packaged and Harness-UI smoke tests.
v0.2.2-alpha.2.shell.0 (kernel 0.2.2-alpha.2)
- Kernel 0.2.1-rc.2 → 0.2.2-alpha.2 (a kernel bump resets the shell revision to 0): the manifest pin moved with 32
dsh-*peers,cordis-plugin-groupwent 1.0.5-alpha.1 → 1.0.6-alpha.1 to satisfy the new app-boot peer, the release-age excludes were re-pinned (315 → 302 entries), the closure lockfile was regenerated and redeployed, and the peer audit reportsclosure satisfied. Both maintenance patches were rebuilt on the new bundles: the account settings popup fallback and onboarding guard were regenerated against the new source (same two hunks), and the session-trash lifecycle patch passed its upstream review — the two edited bundles changed by ~5100 diff lines, all lifecycle anchors still resolve once, session creation moved into the newSessionCommandController, and the outerinspectthe delegation anchored on was removed, so the delegation now hangs off the byte-identicalresolveAgentforwarder; the kernel is recorded inREVIEWED_KERNELS. - Voice input can record again (ADR 0050): the Harness voice input records the prompt with
getUserMedia({ audio }), which the deny-by-default boundary rejected asmedia, so the shipped microphone button only ever reportedRecordingError("permission").mediais now granted only when every requested type is audio — camera video, audio+video, empty lists and unknown types stay denied — andNSMicrophoneUsageDescriptionis added to the macOSInfo.plist(without it the OS terminates the process); the first recording still needs the per-app system approval. - The rest of the boundary was audited (ADR 0050 records the scope and verdicts): every permission-gated web API in the bundled closure was checked and only clipboard write (0049) and the microphone are used by shipped surfaces;
clipboard-readstays denied because its two call sites are xterm's capability probe and the spreadsheet preview's explicit paste menu, which already falls back to its own buffer; notifications, fullscreen, pointer lock, display capture, geolocation, share, file pickers,storage.persist,SpeechRecognitionandwindow.printare unused and stay denied.
v0.2.1-rc.2.shell.11 (kernel 0.2.1-rc.2)
- Fix the chat copy buttons (#134): the message-row copy, the code-block header copy and every path/JSON copy silently did nothing. ADR 0014's deny-by-default renderer boundary also denied
clipboard-sanitized-write, sonavigator.clipboard.writeTextrejected withNotAllowedError: Write permission denied, and the client only falls back toexecCommand('copy')when the async API is missing. ADR 0049 adds a narrow allowlist:clipboard-sanitized-writeonly;clipboard-read,media,geolocation,notifications,display-captureandopenExternalstay denied. - Fix the daily main-branch CI failure (
test/site-generators.test.ts): the download snapshot assertion demanded a “GitCode” badge unconditionally, but the site-refresh bot recordsgitcode_ok=falseuntil the mirror finishes, so any such data state turned CI red. It now asserts from the data and covers both badge states with a fixture. - Fix the failing dsh-watch run:
scripts/version.mjsstatically importedkernel-patches.mjs(which needsyaml) while the workflow runsversion.mjs checkon a bare checkout beforepnpm install, so every daily run died withERR_MODULE_NOT_FOUNDand was reported as a registry outage. The import is now lazy on the kernel-bump path, with a bare-checkout regression test. - Tracker: zero open issues and zero open pull requests before the release.
v0.2.1-rc.2.shell.10 (kernel 0.2.1-rc.2)
- The desktop companion now has its own size: a slider under “Desktop settings → Extensions → Whale companion” (80–400 px, default 160) affects only the minimized companion; the in-window widget keeps its own saved scale, and re-minimizing applies it without a Harness restart. ADR 0047.
- Fix a plugin-toggle crash (upstream #268): Cordis re-runs
applybefore disposing, so the whale's exact routes hitduplicate exact routeand the desktop restarted. The shell's host plugin now installs a reload-safe route guard before third-party plugins: re-registering the same path disposes the old route first. The vendored plugin stays unmodified. ADR 0048. - Bump
@modelcontextprotocol/sdk1.31.0 → 1.32.0 (#122), including the workspace security override and lockfile; the deployed closure reportssdk=1.32.0/jose=6.2.13. - Release housekeeping: close the shell.8 failure issue #133 and the superseded PR #131.
v0.2.1-rc.2.shell.9 (kernel 0.2.1-rc.2)
- Fix the shell.8 whale regression: lowering
.dshwv-roottoz-index: 1put it behind the Harness app root (a stacking context), so it was clipped and clicks fell through to the page. Restored its body-levelz-index: 9999; the whale is visible and clickable again. - No need to lower it: instead hide the whale while a Harness dialog or the desktop-tools panel is open, so those surfaces stay clickable without breaking the whale.
- Fix companion size sync: the adapter page hard-coded
--dshw-scale: 1.6; removed, so the main window and the companion both use the saved.dshw-size.jsonscale. - Regression coverage: the built-in whale E2E now asserts the 9999 layer, the saved scale, a real click opening the menu, hiding on Settings, and matching companion scale.
v0.2.1-rc.2.shell.8 (kernel 0.2.1-rc.2)
- Failures can now open an AI triage session (Incident): the recovery page and a failed plugin-market row gained “Ask AI”. The shell packages the redacted diagnostic (versions, profile, plugin inventory, failure cause, log tail) into a durable incident, creates a Harness session, and sends a structured prompt (cause → evidence → at most 5 repair steps → verification). When AI is unavailable (kernel down, capability missing, session failed) the UI says so and falls back to export / issue — never a dead end. Log text is explicitly framed as data, not instructions; the prompt is capped at 24 000 bytes; artifacts stay under
$DSH_HOME/incidents/{id}/and nothing is uploaded automatically. ADR 0046. - The whale companion is now on by default; turn it off in “Desktop settings → Extensions → Whale companion” (restart Harness to apply). Safe Mode never loads it.
- Fix: a stale user-installed
dsh-whale-widget(e.g. 0.2.10) in the web profile no longer suppresses the companion — the compat check now uses the mounted version (the shell's 0.4.2 link inprofiles/node_modules), while the adapter still loads the mounted plugin's own/dsh-whale/widget.js. - The whale no longer blocks the desktop-tools entry or settings dialogs (its decorative layer now sits below the Harness overlays).
- Fix: reinstalling the plugin market no longer leaves it disabled: install
dshmarket@latest, add the missing boot entry after a successful install, and report an explicitincompatiblereason (with the kernel gate line) instead of blaming profile permissions. ADR 0045. - The plugin code remains unmodified; approvals stay in the main window; Linux has no click-through.
v0.2.1-rc.2.shell.7 (kernel 0.2.1-rc.2)
- The whale companion is now an optional built-in extension: the installer ships the community
dsh-whale-widget(upstream 0.4.2 plus the companion-window integration patch proposed upstream). Enable it in “Desktop settings → Extensions → Whale companion”, click “Restart now”, and the whale shows DeepSeek balance and today's spend; minimizing the main window keeps it on the desktop and−restores. - Off by default, removable:
whaleWidgetEnableddefaults to false; disabling unmounts the plugin and removes the shell-owned profile links, so the plugin list, panel and companion disappear. Safe Mode never mounts it. - Attribution: the settings row names MeteorNOX and links the upstream project; the vendored copy never auto-updates from npm. Code is MIT; artwork/audio stay under upstream
PROVENANCE.md(third_party/dsh-whale-widget/VENDORED.md). - Boundary unchanged: no DOM access, no
executeJavaScript, no approval bridge; companion approvals hand off to the main window. - Verification: full local verify, a new packaged end-to-end for the toggle → restart → whale → pet path, the default-off and Safe Mode cases, plus the existing companion and external-plugin suites.
v0.2.1-rc.2.shell.6 (kernel 0.2.1-rc.2)
- Companion windows now work with real plugins: the HTML probe uses the main window's session instead of a credential-less Node
fetch(which the Harness connection fence answers with 401), and a lateshowInactive()can no longer cover a main window the user already restored. - Click-through: a generic
window.dshCompanion.setInteractive()lets a plugin page hand clicks on its transparent areas to the desktop; the window is interactive by default, so plugins that ignore it are unaffected. - Update prompt: macOS/Linux “new version available” opens the community download page in the user's locale instead of a GitHub release page.
- Real-plugin release gate: opt-in
pnpm run test:e2e:whaleplus a HID click-through check; the fixture suite now covers the auth fence and the late-load race. - Boundary unchanged: no DOM access, no
executeJavaScript, no approval bridge — approvals in the companion hand off to the main window.
Older releases: GitHub Releases.