← Back to home@Cre5cendo

dsh-shell

纯粹的dsh套壳。起因是桌面端和Web端经常有一些插件不互通,文件保存位置不同之类的问题。所以给自己做了个dsh外壳,内核还是web。

Stars
1
Language
C#
Created
Oct 17, 2026
Updated
Oct 18, 2026

Introduction

DshShell · DeepSeek Harness 桌面外壳

纯粹的dsh套壳。起因是桌面端和Web端经常有一些插件不互通,文件保存位置不同之类的问题。所以给自己做了个dsh外壳,内核还是web。**。 只有一个 260 KB 的 exe,单纯的web端外壳。使用起来就是web端的习惯。

DshShell 主界面

platform .NET WebView2 size license


这是什么

DeepSeek Harness(下称 DSH)本身是个本地 Web 应用:要开终端敲 dsh web,再把打印出来的带 token 的地址贴进浏览器,用起来像"临时网页"。

DshShell 把它变成一个有自己图标的桌面程序:

  • 双击桌面图标 → 后台拉起 dsh web → 解析出带 token 的 URL → 用 WebView2 把界面装进自己的窗口
  • 窗口是系统原生标题栏(最小化 / 最大化 / 双击最大化 / 贴靠布局 / 系统菜单都有),配深色标题栏与 Win11 圆角
  • 托盘图标常驻,关窗口默认收进托盘;退出前有确认,不会手滑把正在跑的任务关掉

页面里跑的仍然是你熟悉的那个 DSH:会话、工作区、插件、设置都在 ~\.dsh,和命令行 dsh web 完全共享。

特性

🖱️ 双击即开桌面 / 开始菜单 / 任务栏固定都行;重复双击不会开第二个进程,只把已有窗口拉到前台
📌 独立任务栏图标窗口由本进程创建,任务栏条目和分组都归 DshShell,不蹭 Edge/Chrome 的图标
📥 可隐藏托盘常驻;左键单击切换显示/隐藏,Ctrl+Alt+D 全局热键,点最小化可按配置收进托盘
❓ 关闭时询问可选「最小化到托盘 / 退出 DSH / 取消」三分支;也可以改成"直接收托盘"或"直接退出"
🔄 服务托管自动探测 DSH 的启动方式、拉起服务、解析 token URL;服务意外退出自动重启(最多 5 次退避);退出时整棵进程树一起收掉
🧩 宿主可切换WebView2(默认)/ Edge --app / Chrome --app,托盘菜单里直接切
🎛️ 零配置可用装完就能跑;端口随机避免冲突,配置全在一个 JSON 里
🪶 极轻260 KB exe + 约 930 KB WebView2 互操作 DLL,没有运行时捆绑,也没有 Electron

安装

方式一:下载安装包(推荐)

  1. 下载 dist/DshShell-x.y.z-win-x64.zip(仓库里就是现成的;有 Releases 的话也可以从那里下)
  2. 完整解压到一个普通目录(不要放在 DSH 的工作区里,原因见下方常见问题)
  3. 双击 install.cmd

安装脚本会把程序装到 %LOCALAPPDATA%\Programs\DshShell,解除文件的"来自 Internet"标记(避免每次启动弹 SmartScreen),并创建桌面与开始菜单快捷方式。

也可以手动执行:powershell -ExecutionPolicy Bypass -File install.ps1,加 -Start 装完直接启动。

方式二:从源码编译

git clone https://github.com/Cre5cendo/dsh-shell.git
cd dsh-shell
pwsh -File tools\build.ps1 -Install

只依赖 Windows 自带的 .NET Framework 编译器(csc.exe),首次编译会自动下载 WebView2 SDK。

前置条件

依赖说明
Windows 10 1809+ / Windows 11(x64)
.NET Framework 4.8Windows 10 1903+ 与 Windows 11 自带
WebView2 运行时Win11 自带;Win10 一般随 Edge 自带。缺失时自动退回 Edge 窗口模式,功能不完整。下载
DSHNode.js 22+ 后 npx @deepseek-ai/dsh;或已用 DSH 管理器装好(%APPDATA%\DSH\data\.bin\dsh.cmd)

使用

托盘图标

  • 左键单击:显示 / 隐藏窗口
  • 右键:菜单 —— 浏览器打开 · 重新加载 · 重启服务 · 自绘窗口 / Edge 窗口 / Chrome 窗口(三选一打勾)· 开机自启 · 服务日志 · 退出

窗口

  • 点 ×:默认收进托盘(配置项 CloseAction)
  • 最小化:默认留在任务栏(MinimizeToTray: false),可在配置里改成收进托盘
  • Ctrl+Alt+D:显示 / 隐藏
  • 退出:托盘菜单 → 退出;退出时默认连同 DSH 服务一起停掉(QuitStopsServer)

开机自启:托盘菜单勾选「开机自启」即可,写 HKCU\...\Run,带 --minimized 静默进托盘,不需要管理员权限。

配置

配置文件:%LOCALAPPDATA%\Programs\DshShell\config.json(源码构建时是 app\config.json)。

字段默认说明
Hostauto宿主引擎:auto(优先 WebView2,缺失时回退 Edge/Chrome)、webview2、edge、chrome
Port0DSH 服务端口。0 = 系统随机分配,不会和你手动开的 DSH 抢端口;想固定就填具体数字
DshCommand""留空自动探测(见下);也可写死,如 C:\Program Files\nodejs\node.exe
CloseActiontray点 × 的行为:tray 收托盘 / ask 询问 / quit 直接退出
QuitStopsServertrue退出外壳时是否顺带停掉自己拉起的 DSH 服务
MinimizeToTrayfalse最小化时隐藏到托盘
AutoRestartServertrue服务意外退出时自动重启
GlobalHotkeyCtrl+Alt+D显示/隐藏热键,留空禁用
StartMinimizedfalse启动后直接进托盘
WindowWidth/Height/X/Y/Maximized—窗口尺寸位置,退出时自动记住
DevToolsfalseWebView2 里按 F12 打开开发者工具

工作原理

  双击快捷方式
        │
        ▼
  DshShell.exe ──单实例互斥锁──> 已有实例?只把窗口拉到前台
        │
        ├─ 1. 找 dsh:%APPDATA%\DSH\data\.bin\dsh.cmd → PATH → npx 缓存 → npx -y @deepseek-ai/dsh
        ├─ 2. 写 data\launch-server.cmd 并 cmd /c 启动:
        │        dsh web --no-open --port 0   >  data\logs\server-<时间>.log  2>&1
        ├─ 3. 盯日志,正则匹配 `dsh web: <url>` 拿到本轮带 token 的地址
        ├─ 4. WebView2(独立 profile:data\profile\webview2)导航到该 URL
        └─ 5. 退出时 taskkill /T /F 收掉整棵服务进程树

为什么非要自己拉起服务? 直接访问 http://127.0.0.1:3080 会返回 401 dsh web authentication required; reopen the URL printed by dsh web —— 带 token 的地址只在 dsh web 启动时打印一次。所以外壳必须自己拉起服务、从输出里解析那一行。

这也是为什么每次启动端口和 token 都会变:--port 0 让系统分配空闲端口,token 每个进程重新生成。两个 DSH 实例可以同时运行,会话数据共享 ~\.dsh。

为什么是 WebView2 而不是 Electron

DshShellElectron 方案
体积~1.2 MB100 MB+
运行时复用系统 Edge 内核,无需捆绑捆绑 Chromium + Node
能拦截关闭按钮✅ 窗口是本进程的✅
需要构建环境只要 Windows 自带的 csc.exeNode + 下载 Electron(网络不稳时很痛苦)

代价是 Windows 独占、依赖系统 WebView2 运行时。

从源码构建

pwsh -File tools\build.ps1              # 编译到 app\
pwsh -File tools\build.ps1 -Install     # 编译 + 安装到 %LOCALAPPDATA%\Programs\DshShell
pwsh -File tools\build.ps1 -Release     # 编译 + 打包 dist\DshShell-<版本>-win-x64.zip
pwsh -File tools\build.ps1 -Install -Sign  # 顺便自签名(需管理员,仅本机信任)
脚本作用
tools\build.ps1下载 WebView2 SDK → 生成图标 → 编译 → 组装 app\ →(可选)安装 / 打包
install.ps1 / install.cmd安装到 %LOCALAPPDATA%、解除网络标记、建快捷方式
uninstall.ps1 / uninstall.cmd卸载
tools\make-icon.ps1用 assets\source-icon.png 生成多尺寸 icon.ico(16–256,BMP 条目 + 圆角)
tools\sign.ps1自签名并让本机信任(-Remove 撤销)

目录结构

dsh-shell/
  src/                 C# 源码(WinForms + WebView2)
    Program.cs           入口、单实例、--selftest
    ShellApp.cs          托盘、热键、菜单、配置持久化
    ShellWindow.cs       主窗口(原生标题栏、深色标题、WebView2 宿主)
    BrowserHost.cs       三选一宿主引擎
    DshServer.cs         拉起/托管 dsh 进程、解析 token URL
    ShellConfig.cs       config.json / state.json 模型
    DarkMenu.cs          深色菜单渲染
    CloseDialog.cs       关闭询问框
    Native.cs            Win32 互操作
  tools/               构建脚本
  assets/              icon.ico(附源图 source-icon.png)
  docs/                截图
  install.ps1 / .cmd   安装
  uninstall.ps1 / .cmd 卸载
  config.json          配置模板

运行期数据都在安装目录的 data\:logs\shell.log(外壳步骤)、logs\server-*.log(DSH 原始输出)、profile\(WebView2 独立 profile)。

FAQ

启动时提示"Windows 已保护你的电脑"/未知发布者?

exe 是未签名的。install.ps1 已经对装好的文件做了 Unblock-File,正常情况下不会再提示。如果仍然提示:

  • 右键 exe → 属性 → 勾选「解除锁定」→ 确定
  • 或点「更多信息」→「仍要运行」
  • 想彻底避免:用 tools\build.ps1 -Install -Sign 在本机自签名(只对你自己的机器有效,别人的机器不会信任这张证书)

托盘里找不到图标?

  1. Win11 会把新出现的图标收进 ^ 溢出区,点开找一下,可以拖到任务栏固定
  2. 不要把 exe 放在 DSH 的工作区目录里。DSH 会给工作区打「低完整性级别」标记,低完整性进程不允许注册托盘图标(Shell_NotifyIcon 返回错误 5),还会被 Windows 当成不可信程序弹「安全警告」。安装脚本会把程序复制到 %LOCALAPPDATA%\Programs\DshShell 正是为了避开这个坑。

提示"找不到 dsh"?

DshShell 按顺序探测:%APPDATA%\DSH\data\.bin\dsh.cmd → PATH 上的 dsh → npx 缓存 → npx -y @deepseek-ai/dsh。都没有时:

# 装 Node.js 22+ 后二选一
npm i -g @deepseek-ai/dsh      # 装到 PATH
npx @deepseek-ai/dsh --version # 或者交给 npx

也可以直接写死:"DshCommand": "C:\\Program Files\\nodejs\\node.exe"(配合 DshCommand 指向 bin.js 时外壳会自动补 node)。

每次启动端口都不一样,正常吗?

正常,故意的。Port: 0 → 系统随机分配空闲端口,好处是永远不会和你手动开的 dsh web(通常 3080)冲突,两个实例可以并存。想固定就改成具体端口号。

和官方的 DSH 桌面版冲突吗?

不冲突。这是两个独立程序,共享 ~\.dsh 里的会话和工作区数据。你可以只留一个。

杀毒软件报毒?

260 KB 的未签名程序容易触发启发式误报。源代码全在 src/,可以自己编译(自己编译出来的不会被拦)。介意的话把安装目录加进白名单。

二次开发

界面就是 DSH 自己的 Web UI,外壳只负责窗口和服务生命周期。想改外观改 DSH;想改窗口行为改 ShellWindow.cs / ShellApp.cs。

卸载

双击 uninstall.cmd,或:

powershell -ExecutionPolicy Bypass -File uninstall.ps1

会停进程、移除开机自启、删除快捷方式和安装目录。不会动 DSH 本身,也不会动 ~\.dsh 里的会话数据。

License

MIT。WebView2 运行时程序集来自 Microsoft 的 WebView2 SDK,遵循其自身许可;本项目不捆绑 DSH 本体。


English

A tiny Windows shell for DeepSeek Harness: a 260 KB WinForms executable that launches dsh web, parses the one-time tokenized URL from its output, and embeds the page in a native window with WebView2 — own taskbar entry, tray icon, hide-to-tray, and a confirm-on-close dialog. No Electron, no bundled runtime, no .NET SDK required (uses the compiler that ships with Windows).

# install from a release zip
.\install.cmd        # or: powershell -ExecutionPolicy Bypass -File install.ps1

# build from source
pwsh -File tools\build.ps1 -Install

Requirements: Windows 10 1809+/11 x64, .NET Framework 4.8, WebView2 Runtime (bundled with Win11 / Edge), and DSH available via npx @deepseek-ai/dsh or a DSH install. Licensed under MIT.