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

多实例控制台 xbzbing/dsh-hub-desktop

DeepSeek Harness
xbzbing13 天前有提交已提供中文文档扫描:含敏感能力

个人小玩具,主要解决在使用远程开发机的场景下,文档页面和 dsh 页面来回切换有点乱的问题。

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

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

该插件未发布到 npm,按作者文档从 GitHub 源安装即可(静态检查只覆盖 npm 路径,不代表插件不可用)。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add xbzbing/dsh-hub-desktop
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · market
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 13 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

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

✗npm 包dsh-hub-desktop(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

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

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

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 26 处,展示前 26 条)
  • 发起网络请求
    src/main/app-update.ts:102
    const response = await fetch(url, { headers, signal: AbortSignal.timeout(timeoutMs) })
  • 读取密钥环境变量
    src/main/app-update.ts:112
    const token = process.env.GITHUB_TOKEN?.trim()
  • 读取本地文件
    src/main/create-runtime.ts:75
    if (!existsSync(npmCliJs)) return undefined
  • 读取本地文件
    src/main/create-runtime.ts:89
    if (!existsSync(pnpmCliJs)) return undefined
  • 读取本地文件
    src/main/create-runtime.ts:142
    ? readFileSync(e2eReleaseNotesPath, 'utf8')
  • 读取本地文件
    src/main/create-tray.ts:49
    if (existsSync(candidate)) return candidate
  • 发起网络请求
    src/main/renderer-assets.ts:39
    return net.fetch(pathToFileURL(filePath).toString())
  • 写入本地文件
    src/renderer/src/i18n-coverage.test.ts:1052
    mkdirSync(join(dir, 'a/b/c'), { recursive: true })
  • 写入本地文件
    src/renderer/src/i18n-coverage.test.ts:1053
    writeFileSync(join(dir, 'root.tsx'), 'export const a = 1\n')
  • 写入本地文件
    src/renderer/src/i18n-coverage.test.ts:1054
    writeFileSync(join(dir, 'a/b/c/deep.tsx'), 'export const b = 2\n')
  • 写入本地文件
    src/renderer/src/i18n-coverage.test.ts:1055
    writeFileSync(join(dir, 'note.css'), '.a {}\n')
  • 写入本地文件
    src/renderer/src/i18n-coverage.test.ts:1056
    writeFileSync(join(dir, 'index.html'), '<title>DSH Hub</title>\n')
  • 写入本地文件
    src/renderer/src/i18n-coverage.test.ts:1057
    writeFileSync(join(dir, 'skip.test.tsx'), 'export const c = 3\n')
  • 删除本地文件递归
    src/renderer/src/i18n-coverage.test.ts:1067
    rmSync(dir, { recursive: true, force: true })
  • 读取本地文件
    src/renderer/src/i18n-coverage.test.ts:1514
    expect(existsSync(migratedPath(name)), `${name} 已不在磁盘上,请修正 MIGRATED 清单`).toBe(true)
  • 读取本地文件
    src/renderer/src/i18n-coverage.test.ts:1523
    expect(existsSync(join(process.cwd(), path)), `${path} 已不在磁盘上,请从 PENDING 移除`).toBe(
  • 读取本地文件
    src/renderer/src/i18n-coverage.test.ts:1542
    expect(existsSync(join(process.cwd(), path)), `${path} 已不在磁盘上,请修正排除面`).toBe(true)
  • 读取本地文件
    src/renderer/src/i18n-scan.testkit.ts:712
    for (const entry of readdirSync(dir, { withFileTypes: true })) {
  • 读取本地文件
    src/renderer/src/i18n-scan.testkit.ts:721
    found.push({ path, text: readFileSync(full, 'utf8') })
  • 读取本地文件
    src/renderer/src/lib/format.test.ts:73
    const css = readFileSync(join(process.cwd(), 'src/renderer/src/styles.css'), 'utf8')
  • 读取本地文件
    src/renderer/src/lib/format.test.ts:106
    const css = readFileSync(join(process.cwd(), 'src/renderer/src/styles.css'), 'utf8').replace(
  • 读取本地文件
    src/renderer/src/lib/format.test.ts:117
    const css = readFileSync(join(process.cwd(), 'src/renderer/src/styles.css'), 'utf8')
  • 读取本地文件
    src/renderer/src/lib/format.test.ts:149
    for (const entry of readdirSync(dir, { withFileTypes: true })) {
  • 读取本地文件
    src/renderer/src/lib/format.test.ts:158
    text: readFileSync(full, 'utf8')
  • 读取本地文件
    src/renderer/src/lib/markdown.test.ts:195
    const source = readFileSync(
  • 读取本地文件
    src/renderer/src/lib/markdown.test.ts:207
    const source = readFileSync(join(process.cwd(), 'src/renderer/src/lib/markdown.ts'), 'utf8')
扫描于 2026/11/1(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库

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

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

4 张 · 点击查看大图

功能亮点

  • 统一管理多个实例
  • 支持本地与SSH
  • 支持远程实例

DSH 多实例管理工具

README

由 DeepSeek 最新模型翻译生成
DSH Hub Desktop dsh-hub-desktop 个人小玩具,主要解决在使用远程开发机的场景下,文档页面和 dsh 页面来回切换有点乱的问题。 刚好我的OpenCode-go和mimo-code-plan都要到期了,于是使用 OpenDesign 设计原型,用 dsh 实现出来,然后就有了 DSH Hub。 累计消耗dsh有 395 轮,7784 步,1528M token。 个人使用的 Electron 桌面工具:统一管理多个 dsh(DeepSeek Harness)实例 —— 本地进程、SSH 隧道、远程 HTTP 直连三种形态一站管理。认证对接 dsh-auth-gateway 协议(密码 + TOTP + HttpOnly Cookie 注入),支持凭据保险库与已存密码静默登录。 由于没有苹果开发者账号,因此无法打包可信的 App,需要clone代码仓库并通过pnpm dist:mac来编译 App。 分发与隐私 Windows 安装包当前未经代码签名,首次运行会出现 SmartScreen「未知发布者」提示(点「更多信息 → 仍要运行」继续);可用 Release 附带的 SHA256SUMS.txt 校验完整性。macOS 不提供官方二进制,需从源码构建。
展开完整文档(README 剩余 1 节)
DSH Hub Desktop

dsh-hub-desktop

个人小玩具,主要解决在使用远程开发机的场景下,文档页面和 dsh 页面来回切换有点乱的问题。
刚好我的OpenCode-go和mimo-code-plan都要到期了,于是使用 OpenDesign 设计原型,用 dsh 实现出来,然后就有了 DSH Hub。
累计消耗dsh有 395 轮,7784 步,1528M token。

个人使用的 Electron 桌面工具:统一管理多个 dsh(DeepSeek Harness)实例 —— 本地进程、SSH 隧道、远程 HTTP 直连三种形态一站管理。认证对接 dsh-auth-gateway 协议(密码 + TOTP + HttpOnly Cookie 注入),支持凭据保险库与已存密码静默登录。

由于没有苹果开发者账号,因此无法打包可信的 App,需要clone代码仓库并通过pnpm dist:mac来编译 App。

分发与隐私

Windows 安装包当前未经代码签名,首次运行会出现 SmartScreen「未知发布者」提示(点「更多信息 → 仍要运行」继续);可用 Release 附带的 SHA256SUMS.txt 校验完整性。macOS 不提供官方二进制,需从源码构建。

隐私政策见 PRIVACY.md:本应用不收集任何个人数据,无遥测上报,网络连接仅发往用户配置的目标。

功能特性

- 实例统一管理:注册表本地落盘(原子写 + 滚动备份 + 损坏自愈 + 版本迁移);向导式创建 → 启动 → 详情页启停 / 编辑 / 开窗 / 删除
- 三种传输:统一状态通道,启停 / 开窗按 transport 分发
- local:spawn 本地进程
- ssh:隧道,看门狗指数退避自动重连
- http/https:远程直连
- 认证一体化:网关五态探测识别(登录页 / OTP / onboarding / API 401 / 无需登录);认证面板全状态流(密码 → 6 位 OTP / 备份码 → 锁定倒计时); 已存密码静默登录(勾选「记住密码」后,重启 / 会话失效无需重输密码 —— 密码绝不跨进程传递)
- webview 集成:分区 Cookie 注入(先注入再 loadURL)、302/401 请求拦截、会话失效信号驱动重登
- 凭据保险库:系统钥匙串(safeStorage),登录后默认记住、可取消勾选;取消勾选 / 忘记即时清除
- 审计日志:显式白名单投影,绝不落凭据
- SSH 安全:TOFU 主机指纹确认(首次信任 / 变更一律拒绝),口令经内存通道瞬时传递
- 插件管理:在实例详情列出该实例环境已装插件(图标 / 名称 / 版本 / npm / GitHub / 安装来源),支持安装、检查升级、卸载;检查升级按 dsh 主包与子包 peer 判定兼容性,不兼容只提示不误升级;含 host 端代码的插件改动后提醒重启实例;元信息按界面语言本地化
- 托盘 / 通知 / 自启:可配置

| 亮色主题 | 实例详情 |
| 实例总览 | 实例详情 · 插件管理 |
| 实例详情 | 收起侧边栏 |
| 实例详情页 | 侧边栏收起 · 图标模式 |

技术栈

| 层 | 选型 |
| 桌面框架 | Electron 44 + electron-vite 5 + Vite 7 |
| UI | React 18 + zustand + 手写 CSS(OKLch 明暗双主题) |
| 语言 | TypeScript 5.9(strict + noUncheckedIndexedAccess) |
| 校验 | zod 4.6.5(唯一新增运行时依赖) |
| 测试 | Vitest 4(单测)· Playwright _electron(E2E)· 契约测试(对真实网关) |
| 工具链 | ESLint 9 flat + Prettier 3 · pnpm 11 · Node 22 |

刻意避开 vite 8 / TS 7 / React 19(版本线评审结论,勿升级)。

架构

src/
├─ shared/ 框架无关核心(node + web 双工程共享,不 import electron) │ ├─ endpoint.ts URL 解析/归一化(协议优先、host:port 消歧、IPv6、回环检测) │ ├─ contracts.ts 实例模型(zod 判别联合)+ IPC 通道常量 + IpcResult 信封 + 版本迁移 │ ├─ settings.ts 非敏感偏好(语言/主题/托盘/自启/通知) │ ├─ i18n/ 扁平 key → {zh,en} 文案目录 │ └─ bridge.ts preload 桥接面类型 + app 通道常量 ├─ main/ 主进程(唯一处理 electron 全局件的地方) │ ├─ index.ts 窗口 / app://hub 协议 + CSP / 装配 │ ├─ ipc/register.ts 全部 ipcMain.handle 单点注册;入参 zod 校验 → 错误信封 │ ├─ registry/ 实例注册表:原子写 + 备份 + 自愈 + 迁移 │ ├─ transport/ local spawn / ssh 隧道 / http 直连 │ ├─ auth/ 网关客户端 + 认证状态机 + 会话恢复 + 静默登录 │ ├─ webview/ 分区 Cookie 注入、请求拦截、视图计划 │ ├─ vault/ 凭据保险库(钥匙串,显式 opt-in) │ ├─ audit/ 审计日志(白名单投影) │ └─ shell/ 托盘 / 原生设置 / 通知 的可注入实现 ├─ preload/ contextBridge 白名单,只暴露 dshHub.* └─ renderer/ React 壳 + 视图 · zustand store · i18n 护栏 tests/e2e/ Playwright _electron tests/upgrade/ 升级路径与发布元数据护栏 scripts/release/ 发布演练与校验和 design/ UI 视觉基线(HTML 原型)+ 品牌 token

核心设计约定(详见 AGENTS.md):

- IPC 信封:所有通道返回 {ok:true,value} | {ok:false,code,message},错误码稳定,渲染层按码表映射文案;新增通道走固定四步(contracts → register → bridge/preload → 测试)
- 框架无关核心:shared / registry / transport / auth / vault / audit 不 import electron
- 实例模型:transport: local|ssh|http × authMode: auto|none|gateway, transport 创建后不可变更

快速开始

前置:Node 22+、pnpm 11。

pnpm install
pnpm dev # 启动 dev server + Electron 窗口

受限 / 沙箱环境下 install 需要附加参数(pnpm store 与 electron 缓存落到可写目录):

pnpm install --store-dir=/tmp/pnpm-store --cache-dir=/tmp/pnpm-cache
ELECTRON_CACHE=/tmp/electron-cache node node_modules/electron/install.js # postinstall 偶发跳过时

常用命令

| 命令 | 说明 |
| pnpm dev | dev server + Electron 窗口 |
| pnpm typecheck | node + web + e2e 三工程类型检查 |
| pnpm lint | ESLint(flat config) |
| pnpm test | 单测(vitest) |
| pnpm build | 三端产物(E2E 前置) |
| pnpm test:e2e | Playwright _electron |
| pnpm test:contract | 对本地 dsh-auth-gateway 源码运行认证契约测试;需设置 DSH_AUTH_GATEWAY_SRC=/path/to/dsh-auth-gateway |

测试说明:E2E 用例使用 DSH_HUB_DATA_DIR 指向的隔离临时目录,实例与凭据均为测试环境构造的数据。CI 失败时收集的产物只包含 Playwright 错误上下文、trace、界面截图与审计日志;凭据保险库文件(vault/credentials.json)即使内容是密文也不上传。若未来某条测试必须预置保险库数据,必须使用测试环境构造的 mock 数据并在此处记录其构造方式。

发布相关命令分为“本地打包与验证”和“公开 Release”两类。公开 Release 支持两种分发模式,由发布说明的「分发方式」小节声明:source-only(只发布源码、tag 和 Release Note)与 windows-unsigned(额外附带本地构建的未签名 Windows 安装包 DSH-Hub-Setup-<版本>.exe 与 SHA256SUMS.txt)。任何模式都不上传 macOS 二进制(.app、.dmg、.zip)、自动更新元数据(latest-.yml)或差分中间产物(.blockmap);scripts/release/lib.mjs 做形态白名单校验。未签名 Windows 安装包首次运行会触发 SmartScreen「未知发布者」提示。

本地打包命令仍保留,但生成的未签名、未公证产物只适用于开发、本机验证和受控测试:

pnpm dist:mac:zip # mac zip,本地验证用
pnpm dist:mac # 仅生成未封装的 macOS .app,本地验证用
pnpm dist:win # Windows NSIS,需在 Windows 上执行
pnpm dist:win:local # Windows NSIS(x64),mac 交叉构建出测试包
pnpm electron:prepare # 按需下载 Electron 二进制(dist 已内置,无需手动执行)
pnpm release:checksums # 生成 SHA256SUMS.txt(windows-unsigned 发布随安装包上传)
pnpm release:check # 发布演练:校验发布说明与分发模式、资产清单自洽

Electron 44 起二进制按需下载:pnpm install 之后 node_modules/electron/dist 可能不存在,而打包配置的 electronDist 指向它,因此 dist、dist:mac、dist:mac:zip、dist:win 都会先执行 pnpm electron:prepare(已存在则立即跳过)。dist:win:local 在 mac 上交叉构建 Windows 包:-c.electronDist= 置空后 electron-builder 改为自行下载 win 版 Electron zip(缓存在 ~/Library/Caches/electron,复用构建),不使用本机 dist;dist:win 在 mac 上直接执行会把 mac 版 Electron 打进 Windows 包,不要这样用。

发布前运行 CI=true pnpm release:check -- --pre,确认发布说明的分发模式与资产清单自洽。演练按声明的模式(source-only 或 windows-unsigned)输出对应的人工收口步骤:建 Draft Release,人工确认资产后再 Publish;详见 docs/release-policy.md。macOS 二进制分发仍需先满足该文档中的签名、公证与验证门槛。

无 TTY 环境跑 pnpm 需带 CI=true(pnpm 11 依赖检查在无 TTY 时会中止)。

数据目录

- 运行时数据:<userData>/(可用环境变量 DSH_HUB_DATA_DIR 覆盖);实例注册表在 <userData>/registry/instances.json
- 主进程日志:<userData>/logs/main.log(按日轮转为 main.log.<YYYY-MM-DD>,归档保留 90 天;仅主进程 console 输出,落盘前脱敏,不含凭据)
- 仓库内 hub-data/ 为本地运行 / E2E 数据(已 gitignore;E2E 自动隔离到 hub-data/e2e*)

安全与凭据纪律

- 注册表 / 审计 / 日志 / 文档绝不落密码、OTP、Cookie、私钥;密码与 OTP 只经 IPC 参数瞬时传递并驻留内存
- 保险库写入:登录后默认记住,用户可取消勾选;降级模式(钥匙串不可用)绝不落盘
- 审计记录由白名单投影构造(禁止对象展开),从结构上杜绝凭据泄漏
- SSH 主机密钥 TOFU:首次确认指纹才放行,指纹变更一律拒绝,恢复只能显式遗忘该主机指纹
- 静默登录使用保险库已存密码时,密码不跨进程传递:主进程自取,渲染层无读回通道

文档

- 发布策略(入库):docs/release-policy.md
- 历史存档:第一个 demo 阶段的设计 / 需求 / 实现计划 / UI demo / 设计 token 等文档已归档至 docs/archive/(不再作为实现依据,仅供回溯)
- 任务追踪类文档(开发任务清单、评审报告、交付清单、打包 / 发布演练 / 安全走查报告等)为本地文档,按里程碑放 docs/local/ms-<N>/(当前 ms-1),不进 git (一次性任务追踪,见 .gitignore)
- 仓库级开发守则:AGENTS.md
预览分享卡片长什么样 ↓xbzbing/dsh-hub-desktop
分享 · DeepSeek Harness Hub
xbzbing/dsh-hub-desktop

个人小玩具,主要解决在使用远程开发机的场景下,文档页面和 dsh 页面来回切换有点乱的问题。

回到顶部