ingleav626-art/dsh-native-launcher
以“零额外安装”为设计理念:仅通过一个官方插件配合Windows原生机制,即可让DeepSeek Harness Web UI实现桌面应用式的一键启动体验。
Project Overview项目介绍
dsh-native-launcher is a Windows-only DSH plugin that turns the WebUI into a desktop app. It creates shortcuts, a system-tray icon, installs the WebUI as a PWA, uses Windows native notifications, exits the service when all windows close, and ships a settings page with one-click uninstall. It requires dsh ≥ 0.1.0-rc.8, pnpm, and runs only on Windows 10/11 x64.
dsh-native-launcher 是面向 Windows 的 DSH 桌面化启动器与插件整合包,把 WebUI 变成可双击启动的桌面应用:自动生成快捷方式、常驻系统托盘、支持安装为 PWA 独立窗口、复用 Windows 原生通知、关窗按任务状态决定是否退出,并提供完整设置页与一键卸载。需 dsh ≥ 0.1.0-rc.8 与 pnpm;仅支持 Windows 10/11 x64。
请帮我了解并安装插件:【dsh-native-launcher】【https://github.com/ingleav626-art/dsh-native-launcher】
Send this message to DSH in your current session. CLI install commands may not be accurate across systems — DSH will figure it out for you.把上面这条消息直接发给当前会话里的 DSH,让它帮你了解并安装。安装命令不一定准确,发给 DSH 更稳。
Or use CLI install (for developers)或使用命令行安装(适合开发者)
CLI Install命令行安装
dsh plugin --profile web add dsh-native-launcher
把 ingleav626-art/dsh-native-launcher 加入你的 DSH 配置(web profile)即可启用。
READMEREADME
dsh-native-launcher
以"零额外安装"为设计原则:本插件基于 DSH 官方插件生态及其官方基础依赖构建,不重复引入其他开源框架或重型运行时,仅凭一个官方插件与 Windows 原生机制,让 DeepSeek Harness Web UI 获得桌面 App 式的一键启动体验。
设计理念
把 dsh 的 WebUI 变成桌面应用,并补上 Web 形态天生缺的原生能力:托盘、原生通知、关窗即退。
- 桌面化已完成:快捷方式、托盘、独立窗口、任务通知、关窗即退——启动器该有的都有了。它小而稳定,没有报告的问题就不再折腾;后续以缺陷修复与官方版本适配为主。
- "零额外安装":不引入 Electron / Python / WebView2 等任何重型桌面端或运行时;插件依赖 DSH 官方插件生态及其官方基础依赖,复用官方能力而不重复实现。装进 profile 即用,卸载即干净。
- 以官方为中心:不魔改、不替换官方 Web UI,一切围绕官方版本做加法;插件本身也只是标准 dsh 插件,官方升级后依然兼容。
- 维护为主:功能范围已收敛——不再扩展新的大功能,把已有的做实做稳,跟随官方版本做适配与修复。用户的反馈和新需求依然欢迎,会按实际价值评估是否实现。
- 个人喜好驱动:功能取舍以本人实际使用为准,也欢迎大家反馈使用中的问题。
一句话:让 dsh 在 Windows 上像桌面软件一样工作——启动、驻留、提醒、退出,都在系统里完成。
安装
平台:仅支持 Windows(Windows 10/11,x64)。macOS / Linux 请勿安装本插件。
版本要求:需要 dsh >= 0.1.5-rc.2(本插件的适配与验证基准:
--no-open参数自 rc.8 起、任务通知所依赖的官方能力自 0.1.5 起)。本插件以该版本为基线持续适配,不再针对更低版本做适配与验证——使用更低版本 dsh 请安装对应的历史插件版本(见下方「版本状态」)。dsh 版本过低时,插件启动会在日志中给出升级提示。前置要求:
dsh plugin命令依赖 pnpm。若提示pnpm is not recognized,先安装:npm install -g pnpm(或启用 Node 自带的 corepack:
corepack enable pnpm)设置页表单使用 DSH 官方维护的
@deepseek-ai/schemastery,随插件安装声明;它属于 DSH 官方基础依赖,不是额外的社区功能框架。
推荐方式(普通用户):从 npm 安装,再用 DSH 官方的插件添加命令接入——拿到的是已发布的正式版本,不需要 clone 源码。
源码方式(开发者):需要修改代码、或跟进尚未发布的改动时使用。下载源码即视为以开发者身份使用本插件。
# 推荐:npm 安装 + 官方插件添加
npm install -g dsh-native-launcher
dsh plugin --profile web add dsh-native-launcher
# 开发:源码安装(指向本仓库目录)
git clone https://github.com/ingleav626-art/dsh-native-launcher
dsh plugin --profile web add <path-to-repo>
# 重启 dsh web 后生效
安装后重启:桌面出现快捷方式,右下角托盘出现图标。双击快捷方式即用。
安装为应用(推荐,一次性):普通标签页打开 http://127.0.0.1:3080 → 视觉中心出现安装提示框 → 点「安装」→ 弹出浏览器安装提示 → 确认。装完后:
- 快捷方式自动打开已安装的应用(独立窗口、任务栏独立图标、可固定)
- 若点安装无反应(浏览器安装抑制期),用 Edge 菜单
⋯ → 更多工具 → 应用 → 将此站点安装为应用
特性
- 桌面快捷方式:安装后自动生成桌面快捷方式,双击即可启动或返回 WebUI;支持自定义名称与强制重建。
- 独立应用窗口:可将 WebUI 安装为桌面应用——拥有独立任务栏图标、无浏览器地址栏;未安装应用时按设置的打开方式回退(独立窗口 / 默认浏览器)。
- 窗口自动聚焦:WebUI 已在运行时,再次点击快捷方式或托盘仅将现有窗口切换至前台,不会重复开启实例。
- 系统托盘:常驻托盘图标,提供"打开 WebUI"与"退出"入口,并可发送 Windows 原生通知;可在设置中选择 dsh 停止后托盘是否保留。
- 任务通知:任务完成、出错、中止、被阻塞、达到上限,以及等待审批 / 回答 / 计划审阅时,通过 Windows 原生通知提醒并进入通知中心;关闭全部页面后由后台补发,确保消息不遗漏。设置页有「发送测试通知」按钮,一键验证「模块 → 通知通道 → 托盘 → 系统」整条链路(排错第一站)。
- 关窗即退:关闭全部窗口且无运行中任务时自动停止服务;存在运行中任务则等待其完成后再停止。防抖时长与二次确认窗口均可调整。
- 完整设置界面:启动命令、端口、快捷方式名称、打开方式、托盘开关、通知开关、关闭行为参数及各功能模块开关,均在设置页可视化配置并持久化保存。
- 模块化设计:附加功能以独立模块形式提供,可在设置页单独启用或停用;已使用其他同类插件的用户可关闭对应模块,避免功能冲突。
- 一键卸载:在设置页完成卸载——自动停止服务、移除桌面快捷方式、清理生成文件与注册表项、从 profile 移除插件条目;可选同时清除全部个人配置。卸载过程记录于独立日志文件。
- 日志与诊断:启动、运行、卸载全过程均有结构化日志记录,**全部集中在
%USERPROFILE%\.dsh-webui-launcher\logs\这一个文件夹里**(含网页端事件——统一汇入主日志,浏览器控制台不留任何东西)。出问题时**把整个logs文件夹发过来即可**,不用挑也不用筛选:主日志native-launcher.log内容最全,其余是各组件的时间线补充(启动分支、开页面、托盘、通知、应用扫描、卸载)。设置页有「打开日志目录(排错用)」按钮,一键定位。
维护策略
本插件已进入维护阶段:以跟随官方版本适配与缺陷修复为主,不再扩展新的大功能。
为什么不再做整合包
DSH 官方正把常用能力逐步做进 WebUI 本身(终端、会话归档、外部资源接入等)。当初规划整合包,是为了补齐 Web 形态在桌面体验与生态组织上的缺口;如今官方自己把大部分缺口填上了,再重复建设意义不大。与其追着官方做加法,不如把已有的做实、做稳。
后续的功能
自定义通知音效(系统预设音效选择 + 上传自定义音效)是计划中的最后一项新增功能。此后以维护为主,用户反馈的问题会按实际需要评估处理。
关于退役
如果官方后续提供了同类能力(桌面客户端、原生通知或启动器功能),本插件的历史使命就完成了,届时会停止维护并在本 README 顶部说明。
常见问题
Q:任务完成了但没收到通知?
A:通知由托盘直接发送(不依赖浏览器权限)。若托盘也没弹:先确认托盘图标在(重启 dsh 会自动拉起/换新托盘),再看 ~/.dsh-webui-launcher/logs/tray-notify.log 是否有失败原因。另注意 Windows 会静默屏蔽短时间内的连续通知(同一条通知几秒内重复时尤其明显)——设置页"发送测试通知"请间隔几秒再点。
Q:关掉窗口后服务退出了,但我不想让它退? A:在设置页关闭「关窗自动退出」——关窗后服务常驻(手动用托盘"退出 WebUI"才退出)。
Q:卸载 / 改名后,桌面上还留着旧的快捷方式图标?
A:文件其实已经删除了,是桌面显示没有刷新——按 F5 或右键桌面选"刷新"即可;图标显示异常同理(Windows 图标缓存)。刷新后如果仍有残留,再反馈并附上 logs 文件夹。
Q:任务还在跑,我关了窗口,任务会丢吗? A:不会。有任务在跑时服务会驻留,任务跑完(且仍无窗口)才自动退出;任务完成还会弹托盘通知。
Q:改了端口,启动打开的还是旧页面?
A:改 port 后已安装的旧应用仍指向旧端口,启动会自动回退到普通窗口模式(功能可用);清理旧应用请到 edge://apps 手动卸载。
Q:卸载重装了浏览器应用,通知没了? A:托盘通知不依赖浏览器,不受影响;重装应用后如页面异常,重启 dsh 即可。
Q:托盘图标不见了? A:重启 dsh 会自动重新拉起(含旧托盘自动换新);仍不行就任务管理器结束残留的 PowerShell 托盘进程(含 pwsh)再重启。
Q:一个任务会收到两条通知? A:不会。通知只有系统托盘一个通道(v0.3.6 起浏览器通知已移除),不存在双弹。
Q:双击快捷方式只有命令行窗口,WebUI 没打开?
A:快捷方式通过 dsh --profile web 启动服务,依赖 PATH 中的全局 dsh 命令。若你平时用 npx @deepseek-ai/dsh web 运行(dsh 未全局安装),dsh 命令不存在会导致启动失败。v0.2.1 起会自动回退 npx 启动并在窗口显示提示;
卸载
范围说明:一键卸载仅移除本插件提供的桌面化增强组件(快捷方式 / 托盘 / 自动打开等);dsh 服务本身与其数据不受影响。
推荐:设置页一键卸载——打开 WebUI 设置 → "WebUI 启动器" → 一键卸载启动器:
- 停止系统托盘与 dsh 后端服务(确认后约 6 秒自动停止,无需手动 taskkill)
- 删除桌面快捷方式、清理全部生成文件与通知注册表项
- 从 profile 移除插件条目(自动备份
package.json.before-uninstall) - 可勾选「同时清除全部个性化配置」——不清除则重装后会恢复你的偏好(与主流软件一致)
- 全程记录于
%USERPROFILE%\.dsh-webui-launcher\logs\uninstall.log(该日志不会被清理,失败可溯源)
手动清理(备用方案,点开)
dsh plugin --profile web remove dsh-native-launcher # 1. 移除插件(profile 依赖 + 插件条目)
Remove-Item "$env:USERPROFILE\.dsh-webui-launcher" -Recurse -Force # 2. 启动脚本/托盘/图标/日志
Remove-Item "$env:USERPROFILE\Desktop\DSH WebUI.lnk" # 3. 桌面快捷方式(按实际名字)
reg delete "HKCU\Software\Classes\AppUserModelId\DshNativeLauncher" /f # 4. 通知标识注册表项
- 已安装的应用(若装过):Edge 打开
edge://apps→ DSH WebUI → 卸载
最后重启 dsh。
想连 dsh 本体一起移除?(与本插件无关,谨慎操作)
本插件不代管 dsh 本体的卸载(会话记录、全局设置等其他数据也在其中)。如确定不再使用:
npm uninstall -g @deepseek-ai/dsh # 移除 dsh 服务端
并按需备份后清理 DSH_HOME 目录(默认 %USERPROFILE%\.dsh 或自定义路径,含 sessions / settings 等个人数据)。
版本状态
当前版本 v0.4.2。各版本详情见 GitHub Releases;里程碑之外的迭代见提交记录。
- v0.4.2 — 修复版本。修复通知卡片点击后可能打开浏览器而不是应用窗口的问题(浏览器页面标题里的关键词会干扰窗口识别);启动日志补充了逐步耗时记录,启动慢时可以直接看到卡在哪一步;生成物目录的状态文件改为标准格式并清理了历史遗留文件;启动入口统一切换到 PowerShell 脚本(此前的批处理形态保留为回退备份)
- v0.4.1 — 启动耗时的根因修复版本。修复隐藏窗口启动被系统按后台任务限制性能、导致快捷方式启动被拖到 20~40 秒的问题(实测服务加载 32.4 秒 → 6.0 秒,且运行期同样受益);修复「仅在任务不在眼前时通知」在页面持续处于前台时静默失效;启动前的服务存活检测由约 2 秒降至毫秒级;启动入口由批处理脚本(
.cmd)迁移至 PowerShell 脚本(.ps1),行为逻辑不变 - v0.4.0 — 架构重写版本。功能增量很少,重心是完整重写:全部代码迁移到 TypeScript 严格模式工程(esbuild 构建,产物按职责拆分),插件功能改为模块容器接入(可单独禁用/替换,为分包独立迭代打底),启动脚本/托盘/快捷方式链路建立自动化守卫。功能面:新增任务通知卡片点击唤起已有窗口(不重复开页,需网页已安装为应用)与开机自启动(默认关,设置页开启,即时生效);修复双击快捷方式无法唤起、自动打开静默失效;设置页精简重复开关
- v0.3.6 — 通知 v2:0.1.5 上任务通知全面恢复(判断与发送移到插件后台,网页全关照样弹);关窗等待任务完成真正生效;通知设置卡片(规则编辑 / 测试通知 / 即时生效);日志统一
logs\子目录 + 一键打开;模块重构,包体积显著缩减 - v0.3.5 — dsh 0.1.5-rc.2 适配:设置页通道兜底(规避官方连接层回归);冷启动自动开页面修复(带 token 探测,一次点击即开)
- v0.3.3 — 设置页完整表单 + 一键卸载 + 模块化框架 + 托盘可靠性白箱化
- v0.2.3 — 托盘拉起重构(WScript 隐藏启动,彻底无黑窗)
- v0.2.2 — rc.8 适配(
--no-open防双开)+ 关闭行为修复(任务在跑立即挂起等待) - v0.2.1 — 启动可靠性修复(启动脚本分支 / HTTP 探测 / npx 回退 / 托盘重试 / 环境自诊断)
- v0.2 — 托盘原生通知主通道 + 等待确认通知 + 关闭行为(桌面应用行为)+ 托盘自更新
- v0.1 — 桌面化基础:快捷方式、静默启动、端口探测、托盘、应用优先、安装引导、任务通知集成
工作原理
桌面快捷方式(DSH WebUI.lnk)
│ wscript.exe launcher.vbs(隐藏窗口,无黑窗)
▼
launch.ps1 就绪探测 (127.0.0.1:<port>)
├─ 已运行 → 拉起托盘 → open-webui.ps1(打开已装应用/浏览器,不重复启动)
└─ 未运行 → 拉起托盘 → set DSH_LAUNCHER=1 && dsh --profile web --no-open(静默启动;dsh 不在 PATH 时自动回退 npx --yes @deepseek-ai/dsh)
│
▼
插件加载(任意启动方式都会执行)
├─ 拉起系统托盘(单实例保护 + 版本自更新)
├─ 注册应用清单(manifest + 官方图标)
├─ 注册设置页 "WebUI 启动器" 分组
├─ 注册通知 / 关窗行为(见下)
└─ 检测 DSH_LAUNCHER=1 → 等待服务就绪
→ 端口可用 → 打开 WebUI
open-webui.ps1 打开链路(多路探测,命中一个即启动):
| 优先级 | 方式 | 说明 |
|---|---|---|
| 0 | 已运行检测 → 聚焦现有窗口 | 按应用标识 / 端口 URL(任意 host)匹配浏览器进程;已在运行则聚焦,绝不新开 |
| 0 | --app-id=<app_id> |
启动时扫描 Edge 已安装应用(按站点 URL 匹配),部署自适应;冷启动后验证进程是否真的出现 |
| 0b | 应用列表(explorer shell:AppsFolder\<应用标识>) |
Windows 已注册应用列表,按站点前缀 + 名称匹配 |
| 1-2 | 应用快捷方式扫描 | 开始菜单 / 任务栏 / 桌面(浏览器 exe + --app-id 特征),避免自我递归 |
| 3 | Chromium Web Applications 目录 | 旧结构 manifest 匹配 |
| 4 | --app / --new-window / 默认 |
未安装应用时的浏览器回退 |
通知链路(可靠主通道,v0.3.6 起全部在插件后台完成,不依赖网页):
会话事件(插件后台监听)
→ 状态判定 → 按通知设置与规则过滤 → 写入通知队列
等待批准 / 回答 / 计划审阅:页面端上报 → 同一判定与投递
→ 托盘每 1.5 秒轮询 → Windows 原生通知(应用标识已注册)
├─ 成功 → 删除队列文件
└─ 失败 → 记 tray-notify.log + 气泡提示 + 提示音
关窗行为(桌面 App 行为):
页面加载 → 在线登记(每个标签页独立标识)
页面关闭/刷新 → 离线上报
→ 全部页面离线 → 20s 防抖(刷新/重连可取消)
→ 任务空闲 → 2s 二次确认 → 优雅退出服务(数据已保存)
→ 任务在跑 → 驻留;任务完成且仍无页面 → 自动退出
配置
cordis.patch.yml(或 profile 的 patch 层覆盖):
- id: native-launcher
config:
# 快捷方式双击后执行的启动命令(由启动脚本执行,依赖 PATH 里的 dsh;dsh 缺失时自动回退 npx --yes @deepseek-ai/dsh)
# --no-open:让官方 dsh web(rc.8 起默认自动开浏览器)让位,避免双开——浏览器由插件负责打开(已装应用优先)
launchCommand: dsh --profile web --no-open
# 是否自动打开浏览器(仅快捷方式启动且带 DSH_LAUNCHER=1 时)
autoOpen: true
# 快捷方式名称(不含扩展名)
shortcutName: DSH WebUI
# 快捷方式已存在时是否强制覆盖
force: false
# 端口探测端口(需与 webserver 端口一致)
port: 3080
# 是否启用系统托盘
tray: true
# 打开方式:app(独立窗口,默认)| new-window(新窗口)| default(浏览器默认行为)
openMode: app
# 关窗行为(桌面应用行为):所有页面窗口关闭后,无任务则优雅退出服务;有任务则驻留到完成
closeToExit: true
生成物(用户目录 ~/.dsh-webui-launcher/,日志统一在 logs/ 子目录):
排错时的一步操作:把
logs文件夹整个发过来即可(不必判断该看哪个文件)。 所有日志都在那一个文件夹里,没有第二处——主日志native-launcher.log最全,其余按组件分文件。 设置页「打开日志目录(排错用)」按钮可直接弹出该文件夹。
| 文件 | 作用 |
|---|---|
launcher.vbs |
启动入口:隐藏窗口调起启动脚本(快捷方式默认指向它) |
launcher-visible.vbs |
同上但显示窗口——排错用,可以看到启动全过程与逐行耗时 |
launch.ps1 |
就绪探测 + 启动/直连 + 拉起托盘(逐行耗时写入日志) |
launch.cmd |
同上的历史形态(v0.4.1 起默认不用,保留作回退备份) |
launch-ready.ps1 |
就绪等待辅助:后台等待服务可访问并记录时间 |
open-webui.ps1 |
多路探测打开已安装应用 / 浏览器(已运行→聚焦,未运行→启动) |
tray.ps1 |
托盘(单实例保护;打开 / 退出 WebUI;通知轮询) |
tray-state.json |
托盘运行状态(进程 / 脚本版本 / 启动时刻;用于托盘自动更新) |
tray-notify.json |
通知队列文件(插件写 → 托盘轮询发送 → 消费删除) |
webui-url.json |
带 token 的 WebUI 地址(打开页面时优先使用) |
shortcut-registry.json |
桌面快捷方式登记(卸载时定点清除) |
dsh-webui.ico |
快捷方式 / 托盘图标(官方 DSH 图标) |
logs/native-launcher.log |
主日志:启动/快捷方式/托盘/通知/关窗行为/设置/模块,含环境快照与网页端事件 |
logs/native-launcher.prev.log |
主日志的上一代(超过 1MB 自动轮转归档) |
logs/launch.log |
启动入口日志(每次双击的探测结果、逐步耗时与走向) |
logs/open-webui.log |
打开页面链日志(应用优先/聚焦/新开窗口的判定过程) |
logs/tray-exit.log |
托盘启动与退出原因记录(单实例冲突 / 正常退出) |
logs/tray-notify.log |
通知发送与失败原因 / 轮询错误 |
logs/pwa-scan.log |
应用扫描诊断日志(每次启动重写) |
logs/uninstall.log |
一键卸载的审计日志(刻意不随卸载清理,失败可溯源) |
致谢
- 构建于 DeepSeek Harness 插件生态之上(MIT License, Copyright (c) 2026 DeepSeek)——"以最小破坏性利用原生插件生态实现桌面级体验"的设计理念,依赖其插件机制与官方 API
- 任务通知设计源自:dsh-notification(MIT License, Copyright (c) 2026 DeepSeek)——上游已停止维护(失效于 dsh 0.1.5 的架构变更);v0.3.6 起按其决策链设计重写为本项目自维护的通知模块(判定收归插件后台、托盘为唯一通道),上游的贡献与设计归属致谢于此
- 图标使用官方 DeepSeek Harness 品牌图标(源自 dsh web 的
favicon.svg),仅用于非商业开源插件场景
许可证
MIT
anywhere-labs/dsh-desktop
ccch1mneyyy/dsh-TUI
shaobeichen/dsh-pocket
whitelonng/dshcode
myYangyunfan/dsh_desktop
lencx/Minke
Nagi-ovo/dsh-ads