deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
PROJECT README
就在今天(2026.9.29)deepseek正式发布了dsh桌面端,我们的插件就此退役,很感谢使用并反馈的人,日后请大家使用桌面端即可获得本插件的所有功能。
以"零额外安装"为设计原则:本插件基于 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
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。