🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

桌面工作台 lai-133/dsh-integration

DeepSeek Harnessv0.2.0
lai-13366 天前有提交已提供中文文档扫描:高危

把 DSH 装进原生窗口,托盘通知与插件画廊一应俱全

32.9/100
综合分
7
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/9/19 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查未通过:要求 dsh 0.1.0-rc.6,而最新版为 0.2.1-rc.2;仓库 package.json 标记 private,未发布到 npm,需从源码安装。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add lai-133/dsh-integration
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么[目录]—
dsh 原生插件 · browser
暂无时间戳·判据 →
装得上吗[实装验证]!
静态安装检查未通过,可能需要源码安装
L4 · 真实安装等级说明 →
数据截至 2026/10/27·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/06·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 66 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安装兼容性检查需源码安装

要求 dsh 0.1.0-rc.6,而最新版为 0.2.1-rc.2;仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-desktop @ 0.2.0
✓Node 引擎要求 >=20 · 基线 Node 22.19 满足
✗dsh CLI 依赖要求 0.1.0-rc.6 · 最新 0.2.1-rc.2 不兼容
✓入口文件main/exports/bin 已声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/19 20:28:26

🔴 安全扫描发现高危能力自动 · 静态分析源码
v2.7.0
🔴 扫描:高危尚无人工评估

静态扫描发现安装期即执行代码,或命令参数由运行时变量拼接(参数来源无法静态判定,从严处理)。

安装时即执行脚本可执行外部命令读写/删除本地文件写入剪贴板(不计风险)读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 71 处,展示前 57 条)
  • 读取本地文件
    src/main/main.js:30
    if (fs.existsSync(custom)) return custom
  • 读取本地文件
    scripts/setup-runtime.mjs:10
    if (!existsSync(dshBin)) {
  • 读取本地文件
    src/main/server.js:18
    if (!fs.existsSync(profilePkg)) {
  • 发起网络请求
    src/main/server.js:51
    const req = http.get(url, (res) => { res.resume(); resolve(res.statusCode >= 200 && res.statusCode < 500) })
  • 执行外部命令来自配置/变量
    src/main/server.js:106
    this.child = spawn(file, args, {
  • 读取本地文件
    src/main/gallery.js:14
    if (existsSync(custom)) return custom
  • 读取本地文件
    src/main/gallery.js:22
    cachedData = JSON.parse(readFileSync(file, 'utf8'))
  • 读取密钥环境变量
    scripts/ask-zhipu-file.mjs:7
    if (process.env.ZHIPU_KEY) return process.env.ZHIPU_KEY
  • 读取本地文件
    scripts/ask-zhipu-file.mjs:9
    const cfg = JSON.parse(readFileSync(join(homedir(), '.modlens', 'config.json'), 'utf8'))
  • 读取本地文件
    scripts/ask-zhipu-file.mjs:24
    const b64 = readFileSync(IMG).toString('base64')
  • 请求外部主机open.bigmodel.cn
    scripts/ask-zhipu-file.mjs:38
    const res = await fetch('https://open.bigmodel.cn/api/paas/v4/chat/completions', {
  • 发起网络请求
    scripts/ask-zhipu-file.mjs:38
    const res = await fetch('https://open.bigmodel.cn/api/paas/v4/chat/completions', {
  • 读取密钥环境变量
    scripts/ask-zhipu.mjs:8
    if (process.env.ZHIPU_KEY) return process.env.ZHIPU_KEY
  • 读取本地文件
    scripts/ask-zhipu.mjs:10
    const cfg = JSON.parse(readFileSync(join(homedir(), '.modlens', 'config.json'), 'utf8'))
  • 读取本地文件
    scripts/ask-zhipu.mjs:25
    const b64 = readFileSync(IMG).toString('base64')
  • 请求外部主机open.bigmodel.cn
    scripts/ask-zhipu.mjs:39
    const res = await fetch('https://open.bigmodel.cn/api/paas/v4/chat/completions', {
  • 发起网络请求
    scripts/ask-zhipu.mjs:39
    const res = await fetch('https://open.bigmodel.cn/api/paas/v4/chat/completions', {
  • 读取本地文件
    scripts/build-gallery.mjs:36
    if (!existsSync(source)) {
  • 读取本地文件
    scripts/build-gallery.mjs:40
    const plugins = parseAwesomeList(readFileSync(source, 'utf8'))
  • 写入本地文件
    scripts/build-gallery.mjs:41
    writeFileSync(outFile, JSON.stringify({ generatedAt: new Date().toISOString(), count: plugins.length, plugins }, null, 2), 'utf8')
  • 发起网络请求
    scripts/cdp-click.mjs:7
    const targets = await (await fetch('http://127.0.0.1:9222/json')).json()
  • 发起网络请求
    scripts/cdp-collab.mjs:7
    const targets = await (await fetch('http://127.0.0.1:9222/json')).json()
  • 发起网络请求
    scripts/cdp-diag.mjs:7
    const targets = await (await fetch('http://127.0.0.1:9222/json')).json()
  • 发起网络请求
    scripts/cdp-diag.mjs:29
    const cfgRes = await (await fetch('http://127.0.0.1:3081/studio/api/wallpaper-config', { method: 'POST', headers: { 'content-type': 'application/json'
  • 发起网络请求
    scripts/cdp-final.mjs:7
    const targets = await (await fetch('http://127.0.0.1:9222/json')).json()
  • 发起网络请求
    scripts/cdp-probe.mjs:9
    const targets = await (await fetch(`${CDP}/json`)).json()
  • 发起网络请求
    scripts/cdp-skin.mjs:7
    const targets = await (await fetch('http://127.0.0.1:9222/json')).json()
  • 发起网络请求
    scripts/cdp-wallpaper.mjs:7
    const targets = await (await fetch('http://127.0.0.1:9222/json')).json()
  • 发起网络请求
    scripts/cdp-wallpaper.mjs:48
    const cfg = await (await fetch('http://127.0.0.1:3081/studio/api/wallpaper-config', { method: 'POST', headers: { 'content-type': 'application/json' },
  • 执行外部命令固定命令
    scripts/fix-server.mjs:9
    execSync('netstat -ano | findstr ":3080 "', { encoding: 'utf8' }).split('\n').forEach((line) => {
  • 执行外部命令固定命令
    scripts/fix-server.mjs:16
    execSync('wmic process where "name=\'node.exe\'" get processid,commandline', { encoding: 'utf8' }).split('\n').forEach((line) => {
  • 执行外部命令固定命令
    scripts/fix-server.mjs:26
    spawn('cmd.exe', ['/c', 'start.cmd'], { cwd: 'D:/deepseek/dsh-desktop', detached: true, stdio: 'ignore' }).unref()
  • 写入本地文件
    scripts/make-icon.mjs:20
    mkdirSync(outDir, { recursive: true })
  • 写入本地文件
    scripts/make-icon.mjs:27
    writeFileSync(join(outDir, `icon-${s}.png`), pngs.find((p) => p.size === s).buf)
  • 写入本地文件
    scripts/make-icon.mjs:49
    writeFileSync(join(outDir, 'icon.ico'), Buffer.concat([header, ...entries, ...pngs.map((p) => p.buf)]))
  • 发起网络请求
    scripts/restart.mjs:47
    const req = http.get(`http://127.0.0.1:${port}/`, (res) => { res.resume(); resolve(res.statusCode === 200) })
  • 写入本地文件
    scripts/restart.mjs:65
    writeFileSync(ps1, script, 'utf8')
  • 执行外部命令固定命令
    scripts/restart.mjs:66
    const r = spawnSync('powershell', ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', ps1], { encoding: 'utf8' })
  • 删除本地文件
    scripts/restart.mjs:76
    rmSync(ps1, { force: true })
  • 执行外部命令来自配置/变量
    scripts/restart.mjs:85
    const child = spawn(process.execPath, args, { cwd: root, detached: true, stdio: 'ignore', env: process.env })
  • 执行外部命令来自配置/变量
    scripts/setup-profile.mjs:91
    const r = spawnSync(cmd, args, {
  • 执行外部命令来自配置/变量
    scripts/setup-profile.mjs:102
    const r = spawnSync(cmd, ['--version'], { env: envWithPath(), stdio: 'ignore', shell: process.platform === 'win32' })
  • 写入本地文件
    scripts/setup-profile.mjs:109
    mkdirSync(join(dshHome, sub), { recursive: true })
  • 写入本地文件
    scripts/setup-profile.mjs:120
    mkdirSync(pnpmDir, { recursive: true })
  • 写入本地文件
    scripts/setup-profile.mjs:140
    writeFileSync(join(pnpmDir, 'pnpm.cmd'), `@echo off\r\nnode "%~dp0..\\node_modules\\pnpm\\bin\\pnpm.cjs" %*\r\n`, 'utf8')
  • 写入本地文件
    scripts/setup-profile.mjs:141
    writeFileSync(join(pnpmDir, 'pnpm.ps1'), `node "$PSScriptRoot\\..\\node_modules\\pnpm\\bin\\pnpm.cjs" $args\r\n`, 'utf8')
  • 写入本地文件
    scripts/setup-profile.mjs:142
    writeFileSync(join(pnpmDir, 'pnpm'), `#!/bin/sh\nexec node "$(dirname "$0")/../node_modules/pnpm/bin/pnpm.cjs" "$@"\n`, 'utf8')
  • 读取本地文件
    scripts/setup-profile.mjs:143
    if (!existsSync(pnpmCjs) || !onPath('pnpm')) throw new Error('pnpm 本地安装后仍不可用')
  • 写入本地文件
    scripts/setup-profile.mjs:149
    mkdirSync(profileDir, { recursive: true })
  • 读取本地文件
    scripts/setup-profile.mjs:150
    if (existsSync(join(profileDir, 'package.json'))) {
  • 读取本地文件
    scripts/setup-profile.mjs:163
    let text = existsSync(file) ? readFileSync(file, 'utf8') : PROFILE_PNPM_WORKSPACE
  • 读取本地文件
    scripts/setup-profile.mjs:163
    let text = existsSync(file) ? readFileSync(file, 'utf8') : PROFILE_PNPM_WORKSPACE
  • 读取本地文件
    scripts/setup-profile.mjs:181
    return JSON.parse(readFileSync(join(profileDir, 'package.json'), 'utf8')).dependencies ?? {}
  • 读取本地文件
    scripts/setup-profile.mjs:189
    return JSON.parse(readFileSync(join(spec.slice(5), 'package.json'), 'utf8')).name
  • 执行外部命令固定命令
    scripts/setup.mjs:13
    const r = spawnSync('node', [join(root, 'scripts', script)], { cwd: root, stdio: 'inherit', shell: false })
  • 写入本地文件
    scripts/setup.mjs:25
    writeFileSync(
  • 写入剪贴板
    src/gallery/gallery.js:10
    navigator.clipboard?.writeText(text).catch(() => {})
扫描于 2026/11/6(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库
涉及外部主机:open.bigmodel.cn

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 原生窗口运行
  • 托盘通知
  • 插件画廊

README

由 DeepSeek 最新模型翻译生成
dsh-desktop · 桌面版 DeepSeek Harness 简体中文 · English License: MIT Node.js ≥ 20 Electron Platform 把 DeepSeek Harness(DSH)装进一个原生桌面窗口:Electron 壳 + 自托管 dsh web 服务。网页端全部功能原样保留,并预集成五个开源项目,附带系统托盘、原生通知、插件精选画廊等桌面能力。 ✨ 特性 - 网页端全部功能:会话 / 子代理 / 工作流 / 计划模式 / 目标 / 技能 / 工具审批 / 设置 / 主题 / 插件管理……(就是完整的 dsh web) - 系统托盘:显示/隐藏窗口、重启 DSH 服务器、在浏览器中打开、插件精选、退出 - 原生通知:页面内通知走系统通知中心;关窗隐藏到托盘时提示 - 外链外置:所有外部链接自动交给系统浏览器 - 单实例锁:重复启动只聚焦已有窗口 - 优雅关闭:退出时干净停掉 dsh 服务进程 - 插件精选画廊:内置 awesome-dsh-plugin 全量清单(1054 插件 / 14 分类),支持搜索、跳转 GitHub、复制链接 - 余额鲸鱼挂件:右下角常驻小鲸鱼,显示 DeepSeek API 余额、今日已用(记账 / 实时令牌双模式)、每轮对话消耗统计;工作状态气泡(正在思考 / 正在使用工具…
展开完整文档(README 剩余 1 节)
dsh-desktop · 桌面版 DeepSeek Harness

简体中文 · English

License: MIT
Node.js ≥ 20
Electron
Platform

把 DeepSeek Harness(DSH)装进一个原生桌面窗口:Electron 壳 + 自托管 dsh web 服务。网页端全部功能原样保留,并预集成五个开源项目,附带系统托盘、原生通知、插件精选画廊等桌面能力。

✨ 特性

- 网页端全部功能:会话 / 子代理 / 工作流 / 计划模式 / 目标 / 技能 / 工具审批 / 设置 / 主题 / 插件管理……(就是完整的 dsh web)
- 系统托盘:显示/隐藏窗口、重启 DSH 服务器、在浏览器中打开、插件精选、退出
- 原生通知:页面内通知走系统通知中心;关窗隐藏到托盘时提示
- 外链外置:所有外部链接自动交给系统浏览器
- 单实例锁:重复启动只聚焦已有窗口
- 优雅关闭:退出时干净停掉 dsh 服务进程
- 插件精选画廊:内置 awesome-dsh-plugin 全量清单(1054 插件 / 14 分类),支持搜索、跳转 GitHub、复制链接
- 余额鲸鱼挂件:右下角常驻小鲸鱼,显示 DeepSeek API 余额、今日已用(记账 / 实时令牌双模式)、每轮对话消耗统计;工作状态气泡(正在思考 / 正在使用工具…);可拖拽吸附、按压弹跳、随机台词与音效(由 dsh-whale-widget 提供,本应用内置定制 fork)

🧩 集成的开源项目

| 项目 | 说明 | 作者 / 许可证 |
| dsh-better-sidebar | 服务化侧边栏工作台:文件资源管理器 + CodeMirror 编辑器、内嵌浏览器、真实终端(node-pty)、Git 面板、子代理拓扑、后台任务;ctx.betterSidebar 服务开放给其他插件注册 Tab / 文件预览器 | omdsh-dev · MIT |
| dsh-web-ui | DSH Web GUI 插件 + 皮肤全家桶:梁神模式 agent 预设、任务看板(含 cron 定时执行)、Git 图谱、右侧面板(预览/文件树/SCM)、移动端远程、SSH 运维、图像理解、实时吞吐、皮肤中心 10 款皮肤(内置鲸鱼娘宠物 dsh-pet 与社区插件索引已由本应用禁用,见下) | zhu1090093659 · Apache-2.0 |
| ModLens | 视觉引擎插件:给纯文本模型补上视觉,modlens_read_image 工具 + (modlens vision) 模型项 | liustack · MIT |
| awesome-dsh-plugin | 社区精选插件清单(本应用的「插件精选」画廊数据来源) | awesome-dsh-plugin · 清单文档 |
| dshmarket | DSH 可视化插件市场:设置页内浏览、搜索、一键安装/升级/卸载社区插件(取代 dsh-web-ui 内置的「社区插件」静态索引,后者已禁用) | dsh-market · MIT |
| dsh-whale-widget | 右下角余额鲸鱼挂件:DeepSeek API 余额(60s 自动刷新)、今日已用(余额差值记账 / 平台令牌实时双模式,峰谷定价)、每轮对话消耗统计;工作状态气泡(会话事件投影:正在思考 / 正在使用工具…,菜单可开关);拖拽吸附、随机台词、音效。本应用集成 本地定制 fork(third-party/DeepSeek-Balance-Whale-Widget,file: 安装) | MeteorNOX · MIT |

桌面端与网页端(dsh web)共享同一 DSH_HOME:会话、存储、profile 完全连续。桌面端默认监听 127.0.0.1:3081(环境变量 DSH_DESKTOP_PORT 可改),端口被占用自动顺延。
🐋 界面里的鲸鱼只有一只:余额鲸鱼挂件(右下角)。dsh-web-ui 全家桶自带的「鲸鱼娘宠物」已由本应用禁用(~/.dsh/profiles/web/cordis.patch.yml 中 pet 置 disabled: true),其「工作状态气泡」功能已迁移到挂件上(菜单 → 工作状态)。想恢复旧宠物:删除该段 patch 后重启。

🛒 设置页的插件入口只保留插件市场(dshmarket);dsh-web-ui 的「社区插件」静态索引卡片(只列链接、需手动复制命令安装)与市场功能重叠,已一并禁用(ui-community-plugins 置 disabled: true)。想恢复:删除对应 patch 段后重启。

⚠️ 本应用会为你的 web profile 安装上述第三方插件。安装插件即以你的权限运行第三方代码,安装前请自行审阅各仓库源码。

🏗️ 架构

dsh-desktop/
├── src/
│ ├── main/
│ │ ├── main.js # Electron 主进程:窗口、托盘、菜单、IPC、生命周期、烟雾自检 │ │ ├── server.js # dsh web 服务管理器:spawn、端口探测、URL 解析、健康检查、优雅关闭 │ │ ├── gallery.js # 插件精选画廊窗口 │ │ ├── splash.html # 启动页 │ │ ├── error.html # 启动失败页 │ │ └── assets/ # 应用图标;放入 assets/whale/(不入库)可覆盖为个人图标 │ ├── preload/preload.js # contextBridge:openExternal / serverStatus / restartServer / notify / galleryData │ └── gallery/ # 画廊前端 + plugins.json(由 build-gallery.mjs 生成) ├── scripts/ │ ├── setup.mjs # 一键安装编排 │ ├── setup-runtime.mjs # 校验 DSH 运行时 │ ├── setup-profile.mjs # 把集成插件装进 web profile(官方 dsh plugin 通道 + bundles 校准) │ ├── build-gallery.mjs # 解析 awesome-dsh-plugin README → plugins.json │ ├── make-icon.mjs # 从方形源图生成 PNG/ICO 图标 │ ├── ask-zhipu.mjs # 直连智谱 GLM-4V-Flash 的调试工具(Key 读自本机 modlens 配置) │ ├── cdp-*.mjs # CDP 界面调试工具:点击探针(click/probe)、皮肤与壁纸诊断(skin/wallpaper/diag)、协作面板验证(collab)、综合验证(final) │ ├── fix-server.mjs # 杀掉 3080 端口独立 dsh 服务器(rc.7 双写源),修复会话 seq 乱序 │ ├── restart.mjs # 重启 DSH 服务器 / 应用(托盘「重启」入口) │ ├── restart-app.ps1 # 延迟重启辅助:仅重启 dsh-desktop 实例 │ └── restart-hard.ps1 # 延迟重启辅助:杀掉全部 electron/dsh 实例后重新拉起 ├── start.cmd # Windows 启动器(自动补装缺失依赖) ├── install.cmd # Windows 一键安装 └── package.json # Electron + @deepseek-ai/dsh 运行时

启动链路:

npm start
└─ Electron 主进程 ├─ DshServer.start() → node …/dsh/lib/bin.js --profile web --port 3081 │ (共享 $DSH_HOME/profiles/web:集成插件已挂载) ├─ 解析 "dsh web: http://127.0.0.1:3081" → 健康检查 → 窗口加载 └─ 托盘 / 通知 / 外链外置 / 优雅关闭

📦 快速开始

前置:Node.js ≥ 20(需在 PATH 中)。Windows / macOS / Linux 均可。

npm install # 安装 DSH 运行时(@deepseek-ai/dsh)+ Electron
npm run setup # 自动完成:① 初始化 ~/.dsh(DSH_HOME)骨架
② 自动准备 pnpm(PATH 已有则直接用;否则 corepack 生成 shim;再不行就本地 npm 安装) ③ 把集成插件装进 web profile(dsh-better-sidebar / ModLens / dsh-web-ui / dshmarket / dsh-whale-widget),并禁用旧桌宠 dsh-pet ④ 生成插件精选画廊数据
npm start # 启动桌面版

无需手动安装 pnpm,也无需先运行官方 dsh 命令初始化——npm run setup 会全部自动完成。Windows 用户直接双击 start.cmd 最省事:缺依赖自动 npm install,未完成 setup 自动补跑,然后启动。

📦 离线 / 免 GitHub 分发(国内用户)

安装过程不依赖 GitHub(依赖的是 npm 源与 Electron 二进制,均已内置 npmmirror 国内镜像)。无法登录 GitHub 的朋友可以这样拿:

1. 把项目文件夹打成 ZIP(排除 node_modules/、.tools/、third-party/、.git/)直接发给对方;
2. 对方安装 Node.js ≥ 20(国内可从 https://npmmirror.com/mirrors/node/ 下载 LTS MSI);
3. 解压 ZIP → 双击 start.cmd → 全自动完成 npm 安装、环境初始化、插件安装,然后启动。

想改回官方源:删除 .npmrc,或删掉 start.cmd 中两行 set ELECTRON_MIRROR / set npm_config_registry。

npm run setup 详细步骤:
1. 自动创建 ~/.dsh 骨架(profiles / sessions / storages);
2. 自动准备 pnpm(三层降级:PATH 已有 → corepack shim → 项目内 .tools 本地安装,全程无需管理员权限);
3. 若无 ~/.dsh/profiles/web 则按官方模板初始化;
4. 在 profile 的 pnpm-workspace.yaml 写入 minimumReleaseAgeExclude(绕过 pnpm 11 发布年龄门禁)与 allowBuilds(node-pty / ssh2 / cpu-features / cloudflared,规避 ERR_PNPM_IGNORED_BUILDS 非零退出);
5. 逐个执行 dsh plugin --profile web add(官方通道,自动并入 dsh.profile.bundles 并挂载其 bundle patch;单插件失败自动重试);
6. dsh-web-ui 聚合包以 --ignore-scripts 安装(其 ssh2 / cloudflared / cpu-features 原生绑定均为可选件,缺失时插件自带降级,确保任何网络/工具链环境都安装成功);
7. bundles 校准:pnpm 因原生构建返回非零时官方 reconcile 会被跳过,脚本按官方规则自行把声明了 dsh.bundle.patch 的依赖并入 bundles。

🖥️ 使用指南

- 启动:npm start(或 Windows 双击 start.cmd)
- 关闭窗口 ≠ 退出:点 X 隐藏到托盘(首次会弹通知);彻底退出用托盘右键 →「退出」
- 托盘菜单:显示主窗口 / 插件精选 / 重启 DSH 服务器 / 在浏览器中打开 / 退出
- 插件精选:应用菜单「插件 → 插件精选」
- 自定义图标:把自制的 icon-{16,32,256}.png 与 icon.ico 放进 src/main/assets/whale/,应用启动时自动优先使用(该目录不入库)
- 视觉引擎:粘贴图片或让 agent 读图(modlens_read_image),由 ModLens 完成(约 5–10 秒/张,需配置视觉引擎,见下)

视觉引擎(ModLens)配置

ModLens 的 openai provider 是通用 OpenAI 兼容插座,国内直连可用(示例为免费的智谱 GLM-4V-Flash):

modlens config set openai.baseUrl https://open.bigmodel.cn/api/paas/v4
modlens config set openai.apiKey
modlens config set openai.model glm-4v-flash
modlens config set provider openai
modlens doctor # 验证

- 免费版有限速(约每分钟几十次),日常识图够用;可升级 glm-4.6v 系列。
- 备选引擎:阿里云百炼 qwen-vl、硅基流动、本地 Ollama(http://localhost:11434/v1 + qwen2.5-vl)。
- 详细文档见 ModLens。

端到端自检

$env:DSH_DESKTOP_SMOKE='1'; npm start # PowerShell

页面加载完成后自动采集 DOM 证据(各集成插件的 client bundle、better-sidebar 挂载、插件错误数),打印 [smoke] RESULT: PASS/FAIL 后退出,可用于 CI。

❓ 常见问题

| 现象 | 处理 |
| 启动页一直转圈 | 首次启动需安装插件/构建 node-pty,较慢属正常;失败见错误页提示 |
| 提示 profile 未初始化 | 运行 npm run setup(自动初始化 ~/.dsh 并安装插件),或双击 start.cmd 自动补跑 |
| 找不到窗口 | 窗口隐藏到托盘了——点托盘图标恢复,或重新运行 npm start(单实例会聚焦已有窗口) |
| setup 未能自动准备 pnpm | 极少见:手动执行 npm install -g pnpm 后重跑 npm run setup |
| 端口被占用 | 默认 3081 自动顺延;或设 DSH_DESKTOP_PORT |
| 与网页端 dsh web 同时运行 | 同一 DSH_HOME 双实例有会话文件并发写风险,建议同一时间只开一个 |
| SSH 加密加速 / cloudflared 隧道不可用 | dsh-web-ui 聚合包默认跳过原生构建脚本(可选件)。需要完整原生能力时,在 ~/.dsh/profiles/web 执行 pnpm rebuild ssh2 cloudflared cpu-features(需可用的编译/下载环境) |
| 装到旧版插件 | profile 的 pnpm-workspace.yaml 已含 minimumReleaseAgeExclude;仍异常则在 ~/.dsh/profiles/web 执行 pnpm update @linxin666/dsh-web-ui-all |

🛠️ 开发与贡献

npm install
npm run setup # 准备 profile 与画廊数据
npm run gallery:build # 重新生成插件画廊数据(需 third-party/awesome-dsh-plugin 克隆)
npm start # 启动

详见 CONTRIBUTING.md。

🙏 致谢

- DeepSeek Harness —— 本应用的服务内核(MIT)
- dsh-better-sidebar,作者 omdsh-dev(MIT)
- dsh-web-ui,作者 zhu1090093659(Apache-2.0)
- ModLens,作者 liustack(MIT)
- awesome-dsh-plugin,作者 awesome-dsh-plugin
- dshmarket,作者 dsh-market(MIT)
- dsh-whale-widget,作者 MeteorNOX(MIT)

📜 许可证

本项目采用 MIT License,© 2026 Azusa。集成的插件遵循各自仓库的许可证(dsh-better-sidebar MIT、dsh-web-ui Apache-2.0、ModLens MIT、dshmarket MIT)。应用图标源自作者自备的角色设定图。
预览分享卡片长什么样 ↓lai-133/dsh-integration
分享 · DeepSeek Harness Hub
lai-133/dsh-integration

把 DSH 装进原生窗口,托盘通知与插件画廊一应俱全

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部