
Security News
Deno Goes the Way of the Dinosaur
Cloudflare is acquiring Deno’s team, which will provide another year of bug fixes and security updates before ending support for the runtime.
dsh-native-launcher
Advanced tools
dsh plugin (Windows): desktop shortcut that launches dsh web silently (hidden console) and auto-opens the browser; port-aware reconnect; settings UI section; tray with native toast notifications and close-to-exit semantics.
以"零额外安装"为设计原则:本插件基于 DSH 官方插件生态及其官方基础依赖构建,不重复引入其他开源框架或重型运行时,仅凭一个官方插件与 Windows 原生机制,让 DeepSeek Harness Web UI 获得桌面 App 式的一键启动体验。
把 dsh 的 WebUI 变成桌面应用,并补上 Web 形态天生缺的原生能力:托盘、原生通知、关窗即退。
一句话:让 dsh 在 Windows 上像桌面软件一样工作——启动、驻留、提醒、退出,都在系统里完成。
平台:仅支持 Windows(Windows 10/11,x64)。macOS / Linux 请勿安装本插件。
版本要求:需要 dsh >= 0.1.5-rc.2(已适配 dsh 0.1.7 并以其为真机验证基准;
--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 → 视觉中心出现安装提示框 → 点「安装」→ 弹出浏览器安装提示 → 确认。装完后:
⋯ → 更多工具 → 应用 → 将此站点安装为应用%USERPROFILE%\.dsh-webui-launcher\logs\ 这一个文件夹里(含网页端事件——统一汇入主日志,浏览器控制台不留任何东西)。出问题时把整个 logs 文件夹发过来即可,不用挑也不用筛选:主日志 native-launcher.log 内容最全,其余是各组件的时间线补充(启动分支、开页面、托盘、通知、应用扫描、卸载)。设置页有「打开日志目录(排错用)」按钮,一键定位。本插件已进入维护阶段:以跟随官方版本适配与缺陷修复为主,不再扩展新的大功能。
为什么不再做整合包
DSH 官方正把常用能力逐步做进 WebUI 本身(终端、会话归档、外部资源接入等)。当初规划整合包,是为了补齐 Web 形态在桌面体验与生态组织上的缺口;如今官方自己把大部分缺口填上了,再重复建设意义不大。与其追着官方做加法,不如把已有的做实、做稳。
后续的功能
自定义通知音效已随 v1.0.0 交付(设置页选择本地音频文件,wav / mp3 / wma)——这是计划中的最后一项新增功能。此后以维护为主,用户反馈的问题会按实际需要评估处理。
关于退役
如果官方后续提供了同类能力(桌面客户端、原生通知或启动器功能),本插件的历史使命就完成了,届时会停止维护并在本 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 启动器" → 一键卸载启动器:
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://apps → DSH WebUI → 卸载最后重启 dsh。
本插件不代管 dsh 本体的卸载(会话记录、全局设置等其他数据也在其中)。如确定不再使用:
npm uninstall -g @deepseek-ai/dsh # 移除 dsh 服务端
并按需备份后清理 DSH_HOME 目录(默认 %USERPROFILE%\.dsh 或自定义路径,含 sessions / settings 等个人数据)。
当前版本 v1.0.0。各版本详情见 GitHub Releases;里程碑之外的迭代见提交记录。
.cmd)迁移至 PowerShell 脚本(.ps1),行为逻辑不变logs\ 子目录 + 一键打开;模块重构,包体积显著缩减--no-open 防双开)+ 关闭行为修复(任务在跑立即挂起等待)桌面快捷方式(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 | 一键卸载的审计日志(刻意不随卸载清理,失败可溯源) |
favicon.svg),仅用于非商业开源插件场景MIT
FAQs
dsh plugin (Windows): desktop shortcut that launches dsh web silently (hidden console) and auto-opens the browser; port-aware reconnect; settings UI section; tray with native toast notifications and close-to-exit semantics.
The npm package dsh-native-launcher receives a total of 34 weekly downloads. As such, dsh-native-launcher popularity was classified as not popular.
We found that dsh-native-launcher demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.

Security News
Cloudflare is acquiring Deno’s team, which will provide another year of bug fixes and security updates before ending support for the runtime.

Security News
Anthropic’s free OSS Scanner uses Mythos and other Claude models to find open source vulnerabilities and send maintainers reports with proposed fixes.

Security News
On Front Lines’ Early Adopters: CISO podcast, Andrew Becherer shares lessons from Datadog, weighs the long-term costs of AI-built tools, and explains how founders can actually gain a CISO’s trust.