dsh-web
zhu1090093659
DeepSeek Harness (DSH) Web 插件聚合生态 · 万物皆插件,通过创意工坊分发||DeepSeek Harness (DSH) Web Plugin Aggregation Ecosystem · Everything is a plugin, distributed via the Creative Workshop
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:xuboboo/dsh-gui
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
把 DeepSeek Harness 装进一个原生桌面窗口:品牌化启动动画、DeepSeek 设计语言界面、稳定启动。 第三方非官方项目(与 DeepSeek / DeepSeek AI 官方无关)。
English: A desktop GUI client for DeepSeek Harness — native window, branded splash animation, DeepSeek design language UI, and a stable startup (includes the rc.5 startup crash fix). Third-party, unofficial.
前往 Releases 下载最新版本:
dsh-gui-v1.1.0-win-x64-asar.zip(Windows 自动升级包)— 最新版:底层升级到官方 0.1.5-rc.2(侧边栏多标签/文件预览/文件交付、通用文件上传、DeepSeek-V41-Flash、会话格式 V3 自动迁移、浏览器认证围栏、Inspector 等),升级机替换 asar 后下次启动自动自愈。全新安装请用完整包 dsh-gui-v1.1.0-win-x64.zip。dsh-gui-v1.0.49-win-x64-asar.zip(旧底座 rc.2 的最终 hotfix,存档)— v1.0.49 时代的自动升级修复;新用户请直接用 v1.1.0。D:\Tools\dsh-gui)DeepSeek Harness.exe无需安装 Node.js 或其他任何运行时——exe 已内置完整运行环境,解压即用。
删除解压目录即可。用户数据(会话、配置)保存在 %USERPROFILE%\.dsh,如需彻底清除可一并删除。
DeepSeek Harness.exehttp://127.0.0.1:3081(仅本机可访问)如果 3081 端口被占用,可设置环境变量后重启:
DSH_DESKTOP_PORT=3082
Q:需要先安装 Node.js 吗? A:不需要。本客户端完全自包含,运行时已内置在 exe 中,解压后双击即可使用。
Q:杀毒软件提示风险? A:本客户端为第三方构建、未做商业签名,Windows SmartScreen / 杀毒软件可能提示。来源为本仓库 Releases 的安装包可放心使用;也可以选择自行构建(见下文源码构建)。
Q:启动后白屏 / 无法打开?
A:请确认已解压完整(不要直接运行压缩包内的 exe);首次启动请耐心等待动画结束。仍失败可查看日志 %APPDATA%\@deepseek-ai\dsh-root\logs\desktop.log。
Q:数据存放在哪里?
A:用户数据(会话记录、配置、凭据)保存在 %USERPROFILE%\.dsh,与官方版本一致。
Q:如何更新?
A:关注本仓库 Releases,下载新版 zip 解压覆盖即可(保留 %USERPROFILE%\.dsh 即可保留数据)。
clipboard-sanitized-write 权限,对话/代码块复制按钮恢复可用🛍️ 新增「插件市场」 — 设置 → 插件 → 市场:内置可选插件卡片式一键启停(跨会话记忆搜索、提问工具、时间上下文、持久 Bash 终端等),分类筛选,改动自动持久化到 settings.yaml,模型侧能力即时热生效(宿主半侧动态挂载/卸载受管条目,绝不触碰其他来源的挂载);带界面的插件刷新页面后显示。市场本体为 @dsh-gui/plugin-market 双半侧插件(宿主设置命名空间+浏览器市场页),并随包分发跨会话搜索等此前未上架的官方可选插件。
⬆️ 底层升级到官方 0.1.5-rc.2(@deepseek-ai/* 全家桶从 0.1.1-rc.2 → 0.1.5-rc.2)。新增:右侧 Sidebar 多标签/分栏/全屏与 Markdown、代码、HTML、PDF、图片预览;模型显式交付文件并在 Sidebar 预览/定位;Web 通用文件任意类型上传(图片+文件混排、后台上传/取消/续显);DeepSeek-V41-Flash 新模型并作为新会话默认;可继续子代理消息排队/编辑/删除/Steer;动态修改系统提示词不破坏 KV Cache;出站请求遵循 HTTP(S)_PROXY/ALL_PROXY/NO_PROXY;会话流折叠过程内容、正文字号调节、回合导航;回答末尾 token 用量摘要;Inspector 与 Web Preview 实验特性;会话格式升级 V3(旧会话自动迁移,升级后不支持降级读取)。
🔐 官方新增浏览器认证围栏(升级适配) — 0.1.5 起本地 Web UI 需要进程启动令牌:就绪行携带 ?token=,首页请求换取会话 Cookie。桌面启动器已适配:接受并保留 token 查询参数完成认证,无效令牌一律 401。
🩹 heal(模块回退自愈)整体移植到官方新架构 — 官方 0.1.5 重写了 fallback(pkg 单文件场景用 ESM proxy、普通 Node 直接 symlink 进安装树)。桌面 asar 场景下 symlink 指向压缩包内部无法被 ESM 解析(历史启动崩溃根源),本次把 dsh-gui 的自愈逻辑在新架构源码层重写:优先 junction 到随包 seed(字节新鲜度校验:manifest + 运行时入口 + 客户端 bundle 三重字节比对),失配则物化真实副本,逐包容错、完成后写 stamp;升级机首次启动自动重建,不再需要全量重装。
🧩 GUI 插件全部适配 0.1.5 API — Token 用量统计插件改为官方 workspace 包并用新客户端 API 重写(dsh-client-runtime 已并入 cordis 上下文、connection.api 改为 remote.session wire 面、快照 store 改用 dsh-client-store);MCP 目录插件与 reasoning-autopilot 适配新 dsh-settings(命名空间注册改纯字符串,settingsScope 服务兼容);自定义模型「思考」默认档位逻辑重落在 pi-ai 源码层。
📁 目录选择器 GUI 原生对话框补丁随新结构迁移 — 宿主侧 pick 动作新家在 dsh-api-workspace-controller,原生选择器在 dsh-host-directory-picker-native,两处均保留「Electron 原生对话框优先、koffi worker 兜底」的顺序。
🧱 构建链升级:闭包感知拍平 — 依赖树改为从安装锚点(@deepseek-ai/dsh)按 pnpm 真实解析结果 BFS 收集(deps+peers+optional,最近优先写入平铺顶层),同名包版本分叉时自动为后到消费者生成嵌套副本(如 compression 的 negotiator@0.6、skill-filesystem 的 chokidar@5、negotiator@1.1 的 content-type@2);完整包体积从 ~365 MB 降到 ~250 MB。
🧹 依赖瘦身(新版树) — 剔除 codex/claude 子代理 CLI(~586 MB)、构建工具链(rolldown/oxlint/esbuild/lefthook 等)、打包器(electron-winstaller/app-builder-lib)、已被内联进前端 bundle 的运行库(pdfjs-dist/mermaid/cytoscape/@napi-rs canvas 等,均经运行时 require 扫描确认不会被动态加载)。shiki/katex/react-dom 等确认运行时需要,全部保留。
🐝 本机已知问题(与升级无关):MCP 设置里通过 npx 启动的服务器因本机 npx 缓存损坏(缺 ajv)无法启动,属 npm 缓存问题,清理 %LOCALAPPDATA%\npm-cache\_npx 或重装对应服务器可解。
closureFresh 对服务端包只比 package.json 的 name+version,而 dsh-llm-pi-ai 的包版本是上游 rc.2、各版之间相同,改的只是 lib/index.js 内容 → 旧 seed 被误判“新鲜”,升级后仍 junction 到没修复的旧 bundle。现给 closureFresh 增加运行时入口字节比对(对所有包通用,全部包入口合计约 4.8 MB,开销可忽略):不一致即从 asar 物化真实副本。升级机首次启动自动物化修复版,之后恢复快路径;全新安装不受影响。reasoningEfforts 的模型才显示「思考」选项,其它自定义模型(如 muse-spark)看不到。根因:dsh-llm-pi-ai 的 resolveModelReasoning 对手写、未声明 reasoningEfforts 且无内置目录同名条目的模型返回 reasoning:false → 模型选择器不渲染思考控制。现已把手写自定义模型默认视为支持 OpenAI 兼容推理(默认力度 low/medium/high),任意自定义模型提供方的模型都会出现「思考」按钮(默认「提供方默认」,不额外发参,主动选才发);内置目录模型保持各自能力,显式 reasoningEfforts:false 仍可关闭,按模型声明的力度仍优先。升级后无需改任何配置。firstBoot 误声明为当就绪 handler else 块内的块级 let,模块级函数 createWindow() 引用它时抛 ReferenceError: firstBoot is not defined,首次窗口创建失败、落到空窗口;4 秒看门狗只是强制显示一个没内容的空窗口,于是用户看到黑屏,直到运行时引导完成才有内容。已把 firstBoot 移到模块顶层声明,窗口一创建即显示品牌启动页(不黑屏),运行时就绪后再跳转到应用页。app.relaunch() 拉起的新进程在 Windows 上没有前台权限,更新后的窗口可能开在所有窗口后面,看起来像"没自动打开、要手动重开";现在升级后的首次显示会抢占焦点(app.focus steal),并新增"从未显示看门狗"(4 秒内渲染进程没画出就强制显示)与窗口创建/显示诊断日志。applied.json、实际写的是 applied.txt),点「立即重启」后退出阶段会把 ~344MB 的 app.asar 再拷贝一遍;已修正,升级重启更快更干净。@earendil-works/pi-ai/dist/providers/data/.manifest.json(all.js 引用)没进 asar → pi-ai 的 asar 副本内部是坏的,
平时靠 profile→seed 才能启动;一旦走 asar 解析(无 seed/seed 不完整)就 ERR_MODULE_NOT_FOUND。pack.mjs 现在补进
node_modules lib/dist 内的点文件(本轮仅 pi-ai 一个),asar 与 seed 一致、自足。error: unknown option '--no-open' — 自动更新只替换 app.asar、不替换 dsh-profile-seed;旧版写下的 .dsh-heal-stamp.json 让新版的「上次成功」自愈快路径跳过版本校验,profile 仍 junction 到旧 rc.5 seed,其 @deepseek-ai/dsh-web-app 运行时并不解析 --no-open(仅文档写了),于是新 launcher 传入的 --no-open 被判为未知选项 → 启动退出码 1。本次让 heal stamp 快路径同样做 manifestsMatch 版本校验,版本不一致时不再跳过:seed 落后则*从当前 asar 自带的 rc.2 `@deepseek-ai/` 实拷贝**,升级机下次启动自动自愈,无需重装全量包。@deepseek-ai/dsh-mcp-client 即时热挂载(免重启);配置存于 ~/.dsh/settings.yaml 的 mcp-catalog 命名空间。模型侧工具名形如 mcp__<服务名>__<工具名>。file:// URL 后再走 ESM 导入,根治 ERR_UNSUPPORTED_ESM_URL_SCHEME (protocol 'c:')。dsh.client 双面包的 exports 需显式列出 ./package.json 子路径(否则解析被静默跳过);扫描锚点为 profile 目录,跨层分发需双锚点放置(详见仓库 audit-notes)。dsh-gui-v1.0.42-mac-universal.zip,430 MB)— 与 Windows 版同功能;Intel + Apple 芯片原生(fat binary 已校验);要求 macOS 11+;未签名。before-quit 处理器在 applyUpdateAndRelaunch 调 app.relaunch() + app.quit() 时,before-quit 里 event.preventDefault() + stopHarness().then(app.exit(0)) 用 app.exit(0) 硬退出,杀死了 app.relaunch() 计划的新实例(Windows 上 relaunch 子进程随父进程的 Job Object 一起终止)。修复:新增 relaunching 标志,applyUpdateAndRelaunch 设置它,before-quit 检测到后走正常退出(app.quit() 而非 app.exit(0)),让 Electron 尊重 app.relaunch()。dsh-gui-v1.0.41-mac-universal.zip,429 MB)— Electron 43.4.0 双架构原生二进制(x86_64 + arm64,同一 .app 同时支持 Intel 与 Apple 芯片);内置 darwin 双架构全套原生模块(node-pty / sharp / libvips / koffi / ripgrep / oxc 等);mac 更新器走 *-mac-universal-asar.zip 资产;下载器/系统代理/退出应用更新脚本已做 macOS 适配(curl、sh 兜底)。要求 macOS 11+;未签名,首次打开需右键 → 打开或 xattr -dr com.apple.quarantine。app.asar,app.asar.unpacked 只放原生模块);而 1.0.38/1.0.39 误改成"全 unpack"(node_modules 全在 unpacked,asar 只剩空壳 10 MB)。这导致旧用户 只替换 app.asar 升级时,新 asar 是空壳却找不到 unpacked 里的 node_modules → 启动报 ENOENT ... app.asar.unpacked/node_modules/@deepseek-ai/dsh/lib/bin.js / runtime exited with code 1。本版恢复自包含 asar(app.asar 328 MB 自带全部 node_modules),旧用户升级兼容性彻底修复。host.pickDirectory(app.asar 内),配合自包含 asar,旧用户升级替换 app.asar 后即生效。根治 win32 folder dialog worker exited before reporting a result。dialog.showOpenDialog,127.0.0.1:3082)的调用前移至 host.pickDirectory(app.asar 内),旧用户自动升级替换 app.asar 后即生效,不再依赖重建 seed。目录选择器改用 Electron 原生模态框,根治 win32 folder dialog worker exited before reporting a result、中文路径乱码、对话框被遮挡、焦点误触关机、选择结果被超时丢弃等问题。dsh-client-ui-attachment、dsh-attachment、ACP 等),与官方多模态能力对齐。win32 folder dialog worker exited before reporting a result。改为优先走 Electron 原生模态对话框(127.0.0.1:3082),仅在 GUI 端点不可达(web-only / 旧桌面)时回退 koffi worker;彻底解决 koffi 崩溃、中文路径乱码、对话框被遮挡、焦点误触关机、选择结果被超时丢弃等一系列问题。已在本机实测(真实弹窗选目录返回正确路径)。dsh plugin add 按需装回)、rolldown/oxlint/lefthook/typescript 等开发工具链、以及 10199 个 .map 调试文件;保留全部运行时依赖(koffi/sharp/node-pty/ripgrep 原生模块)与 19 项安全补丁。Cannot find package '@babel/code-frame' / runtime exited with code 1)— 瘦身时误删了运行时必需的 @babel/code-frame 及 @babel/helper-validator-identifier(cordis-plugin-hmr 硬依赖),现已恢复,新电脑可正常启动。0.1.1-rc.2) — 底层从官方 rc.5(0.1.0-rc.5)升级到官方最新多模态 rc.2,新增图片/附件输入能力(dsh-client-ui-attachment、dsh-attachment、ACP 等)。dsh-app-boot ensureSymlink 遇真实目录会抛错;改为直接跳过,并移植 v1037 的完整 healProfilesModuleFallback(种子 junction 优先 + asar 实体拷贝 + 原生模块处理 + heal stamp),保证新电脑首次启动 / ESM 解析 / 版本一致性。worker.cjs + koffi 原生 IFileOpenDialog;移除 v1037 的 PowerShell 兜底 worker 强制覆盖(避免用旧协议破坏 rc.2 原生选择器),保留 3082 兜底。dsh web 默认会打开系统浏览器;spawn 加 --no-open,由桌面窗口承载。@deepseek-ai/dsh-client-web-react,导致该插件加载失败;改为内联 bindSnapshotSelector(React useSyncExternalStore),不再依赖被删包。DSH_GUI_VERSION 同步为 1.0.17,不再自我触发更新;更新器对"暂存版本不高于当前版本"的旧更新包自动清理,退出时不再应用旧包(即使之前循环残留,升级后也会自动清除)。runtime exited with code 1 / ERR_MODULE_NOT_FOUND):Windows 下 healProfilesModuleFallback 不再创建指向 app.asar 内部路径的 Junction(Node ESM 加载器无法解析这类路径),改为实体拷贝 app.asar 与 app.asar.unpacked 中的全部依赖(含 node-pty / sharp / koffi / ripgrep 等原生模块)到 %USERPROFILE%\.dsh\profiles\node_modules;已有完整目录跳过、残留 Junction 替换,首次启动自动完成(1–3 分钟),之后正常速度。已在全新 DSH_HOME 环境实测通过。worker.cjs 与 koffi Windows 平台绑定(patches/0010-workspace-directory-picker-fix.patch)patches/0009-silent-update-restart-toast.patch)app.relaunch(),退出后自动重新打开即为新版本(退出时应用更新同样原地覆盖)patches/0008-update-progress-window.patch)patches/0007-restart-no-error-flash.patch)patches/0006-auto-updater.patch)修复多个 Bug 并新增功能:复制按钮无反应、启动崩溃(v1.0.0 起)、帮助菜单项目主页指向、设置页布局问题等均已修复。
client-plugins/ui-settings-token-usage(聚合 session.list 投影列,零日志加载)patches/0005-menu-project-homepage.patch)patches/0006-auto-updater.patch)setPermissionRequestHandler 一律 callback(false)),导致 navigator.clipboard.writeText 被拒、复制按钮静默失效。v1.0.1 放行 clipboard-sanitized-write 权限(见 patches/0003-launcher-clipboard-permission.patch)。| 主界面 | 设置 | Token 用量统计 | 项目主页 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
自动更新依赖以下步骤,每步都不能漏,否则客户收不到更新:
desktop/lib/main.js 的 DSH_GUI_VERSION 常量改为新版本(如 1.0.3)dsh-gui-vX.Y.Z-win-x64.zip(解压即用完整包)dsh-gui-vX.Y.Z-win-x64-asar.zip(仅 resources/app.asar,zip 内路径 resources/app.asar)——客户端自动更新下载的就是它vX.Y.Z)说明:自动更新下载 asar 更新包(约 33 MB)并校验 GitHub sha256 后替换
app.asar,无需重新下载 280 MB 整包;更新失败会自动回滚并提示手动下载。
本仓库包含客户端的三块核心资产:
├── theme/
│ └── dsw-override.css # 界面主题覆盖层(DeepSeek 设计语言)
├── splash/
│ ├── splash-page.html # 启动动画页模板(浏览器可直接预览)
│ └── launcher-patch.md # 启动动画接入 launcher 的说明
├── patches/
│ ├── 0001-launcher-expose-internals.patch # 启动修复 1
│ ├── 0002-app-boot-ensure-symlink.patch # 启动修复 2
│ ├── 0003-launcher-clipboard-permission.patch # 复制按钮修复(剪贴板权限)
│ └── README.md # rc.5 启动崩溃修复完整方案
└── SECURITY.md # 安全与敏感信息说明
theme/dsw-override.css 到前端 dist:<profile>/node_modules/@deepseek-ai/dsh-web-frontend/dist/assets/dist/index.html 的 <head> 中、主 CSS(index-*.css)之后追加:<link rel="stylesheet" crossorigin href="/assets/dsw-override.css">
详见 splash/launcher-patch.md 与 patches/README.md(涉及 resources/app.asar 解包/重打包,请保留原始备份)。
本客户端基于 DeepSeek Harness(官方,MIT)桌面版构建。从源码构建需要 Node.js 环境(仅构建时需要,运行无需)——此场景才需要 Install Node.js, then run: pnpm install。
| 模块 | 方案 |
|---|---|
| 桌面窗口 | Electron 原生窗口承载 Harness Web UI |
| 运行时 | Electron 内置 Node(ELECTRON_RUN_AS_NODE)运行 dsh 服务,完全自包含 |
| 启动动画 | 纯 CSS 动画的 data: URL 页面,图标运行时内嵌 base64,无外部资源依赖 |
| 界面主题 | CSS 变量(--dsw-* token)覆盖层,后加载覆盖原设计系统,不破坏组件 |
| 启动修复 | launcher 补传 --expose-internals;profile 依赖从 junction 改为真实文件;ensureSymlink 兼容真实目录 |
本仓库经严格敏感信息扫描:不含任何 API key、密码、凭据、本地数据或本地路径(检查方法见 SECURITY.md)。
独立的第三方项目,与 DeepSeek / DeepSeek AI 官方无关。DeepSeek Harness 是官方项目(MIT)。
MIT License © dsh-gui contributors
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: theme。