DSH-Desktop
已验证 · 实测可装 JustGenius-s
功能简介
DSH-Desktop。
可用 — 实测通过,社区增长中
DSH-Desktop。 实测能干净安装、正常启动。社区在增长,是个稳妥选择。
「已验证」表示我们的自动化 CI 在干净 profile 里实际执行了 dsh plugin add 并启动成功——仅此而已。功能描述与版本兼容性均为作者声明。这不是安全审计,也不代表对第三方代码的背书。
README
English | 简体中文
DSH-Desktop
Electron desktop shell for DeepSeek Harness (DSH). Uses Electron's embedded Node and bundled pnpm to install @deepseek-ai/dsh into ~/.dsh/runtime and serve the dsh web UI.
Download & Install
Prebuilt packages are published on GitHub Releases. First launch installs the DSH runtime (~1-2 min).
macOS
Requires macOS 13 (Ventura) or later.
- Download
DSH-Desktop-*.dmgfrom the latest release. - Open the
.dmgand dragDSH-Desktop.appinto/Applications. - The app is unsigned, so Gatekeeper blocks the first launch. Right-click the app → Open and confirm, or run:
xattr -dr com.apple.quarantine /Applications/DSH-Desktop.app
Windows
Requires 64-bit Windows.
- Download
DSH-Desktop Setup *.exe(installer) orDSH-Desktop-*-win.zip(portable) from the latest release. - Run the installer, or unzip the archive and launch
DSH-Desktop.exe. - The build is unsigned, so SmartScreen may warn. Click More info → Run anyway.
How it works
Electron main process
├─ embedded Node (ELECTRON_RUN_AS_NODE) + bundled pnpm
├─ node/pnpm launchers (resources/runtime; repo-root runtime/ in dev)
├─ first launch: pnpm installs @deepseek-ai/dsh → ~/.dsh/runtime (upgradeable)
├─ spawn dsh web --host 127.0.0.1 --port <free-port>
└─ BrowserWindow → http://127.0.0.1:<port>
DSH is installed from npm at runtime, not shipped with the app. Upgrading DSH = detect a newer version on launch → click "Update" → optionally restart the web service (the desktop app stays open). No rebuild or re-signing.
After a successful boot, the web port is saved in web-port.json under Electron's user-data directory. Cold starts reuse it when available so origin-scoped browser preferences survive restarts. If another process occupies that port, a new loopback port is allocated; the app never attaches to that process. Plugins must still persist durable data on the host to survive a port change. Development and installed apps keep separate port records.
Develop
pnpm install
pnpm collect # collect pnpm and Electron launchers into runtime/
pnpm start # first launch installs @deepseek-ai/dsh (~1-2 min)
pnpm dev # alias for start
Dev and packaged builds both use the current Electron executable and the external ~/.dsh/runtime. No standalone Node binary is downloaded or shipped. Plugin commands find a small node launcher through PATH; the executable path is supplied at each launch, so moving or upgrading the app does not leave stale paths.
Tests (no Electron window or browser required):
pnpm test # build + both runners (see below)
pnpm test:unit # vitest, test/unit/** (no build needed)
pnpm test:integration # build + test/integration/**
pnpm typecheck
pnpm check # formatting + typecheck + build + all tests
test/ mirrors src/ so a failing file names the module it covers:
| Path | Runner | What it may import |
|---|---|---|
test/unit/**/*.test.ts |
vitest | src/ directly; Electron via vi.mock |
test/integration/**/*.test.ts |
vitest | src/ directly, multi-module flows |
test/integration/**/*.test.cjs |
node:test |
only built dist/ and scripts/ |
The .ts suites run under vitest; the .cjs suites are plain node:test
(see vitest.config.ts, which deliberately excludes them). The test script
builds fresh output first.
Package
pnpm dist:mac # macOS dmg + zip
pnpm dist:win # Windows nsis + zip (run on Windows)
Packaging recollects pnpm and the launchers. Windows builds require the matching MSVC Native Tools environment and Windows SDK for the small forwarding node.exe.
macOS artifacts are unsigned; Gatekeeper blocks first launch. Allow with:
xattr -dr com.apple.quarantine /Applications/DSH-Desktop.app
Runtime dependencies
- Node supplied by Electron; pnpm (latest) and command launchers collected by
scripts/collect-runtime.mjs @deepseek-ai/dsh(npm latest), installed to~/.dsh/runtime
Updating Electron
Run pnpm add -D -E electron@<version> and pnpm check, then launch and test the packaged app.
Launchers and native plugin builds use the running Electron's path and version. Keep the runAsNode fuse enabled. DSH may reject a new Node/V8 combination, and existing ABI-specific plugins may need rebuilding; verify the UI, terminals and plugin installation before release. The DSH installation is shared with the CLI, so do not rebuild the entire shared runtime for Electron.
Desktop plugin API
The shell injects window.dshDesktop into the DSH page (updates / seats / notify / overlays / plugins). Plugins should depend on that contract, not on Electron packaging code. See docs/desktop-api.md.
Our plugins
Companion DSH plugins live in DSH-Plugs.
Thanks to
安装
装一次目录插件,之后本站所有插件都能让 DeepSeek Harness 自动找、自动装:
dsh plugin add dshbase-catalog 然后对 agent 说「帮我装 DSH-Desktop」,它会在目录里找到并自动安装。文档:dshbase-catalog · 已验证场景包。
该插件是 GitHub 源码(未发 npm)——直接从仓库装:
Web profile:
dsh plugin --profile web add github:JustGenius-s/DSH-Desktop Headless(CLI)profile:
dsh plugin --profile headless add github:JustGenius-s/DSH-Desktop 实测报告
验证通过:从 GitHub 源码完成 L1 安装 + L2 加载 + L3 运行(dsh 0.1.0-rc.6)。
使用场景
把 dsh 跑成原生桌面应用——独立窗口、托盘图标、快捷键——而不是浏览器标签。
适合谁
想要已安装应用的感觉和系统集成(托盘、全局热键、开机自启)的人。
二次开发建议
原生壳是缝——加全局快捷键、通知、单实例锁或按 OS 定制的行为。