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

鸿蒙桌面封装 fellow99/dsh-desktop-hos

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

基于 Electron 的桌面封装,让 deepseek-harness 跑在 HarmonyOS 或 OpenHarmony 上

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · market
装得上吗
作者未把包发布到 npm,只能用源码安装
插件本身没问题,是分发方式不同
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 9 天前
档位由哪些信号合成

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

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

仓库 package.json 标记 private,未发布到 npm,需从源码安装;安装清单取自 plugins/harmony-plugin-git/package.json

展开查看检查明细 ↓

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

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

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

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

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

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

可执行外部命令读写/删除本地文件
查看扫描证据(共 63 处,展示前 40 条)
  • 读取本地文件
    hvigorfile.ts:58
    parsed = JSON.parse(fs.readFileSync(file, 'utf-8'));
  • 读取本地文件
    hvigorfile.ts:113
    if (fs.existsSync(file)) {
  • 读取本地文件
    plugins/harmony-plugin-git/lib/git-credentials.js:162
    return { path, exists: true, entries: parseCredentials(readFileSync(path, 'utf8')) }
  • 读取本地文件
    plugins/harmony-plugin-git/lib/git-credentials.js:187
    text = readFileSync(path, 'utf8')
  • 写入本地文件
    plugins/harmony-plugin-git/lib/git-credentials.js:211
    mkdirSync(dirname(path), { recursive: true })
  • 写入本地文件
    plugins/harmony-plugin-git/lib/git-credentials.js:213
    writeFileSync(temp, body, { mode: 0o600 })
  • 写入本地文件
    plugins/harmony-plugin-git/lib/git-credentials.js:215
    chmodSync(temp, 0o600)
  • 写入本地文件
    plugins/harmony-plugin-git/lib/git-credentials.js:220
    renameSync(temp, path)
  • 读取本地文件
    plugins/harmony-plugin-git/lib/git-credentials.js:237
    text = readFileSync(path, 'utf8')
  • 删除本地文件
    plugins/harmony-plugin-git/lib/git-credentials.js:257
    unlinkSync(path)
  • 写入本地文件
    plugins/harmony-plugin-git/lib/git-credentials.js:259
    writeFileSync(path, '', { mode: 0o600 })
  • 写入本地文件
    plugins/harmony-plugin-git/lib/git-credentials.js:264
    writeFileSync(temp, body, { mode: 0o600 })
  • 读取本地文件
    plugins/harmony-plugin-git/lib/runtime.js:159
    return JSON.parse(readFileSync(manifest, 'utf8')).version ?? 'unknown'
  • 读取本地文件
    plugins/harmony-plugin-market-runtime/lib/pnpm-inprocess.js:39
    const stat = statSync(entry)
  • 写入本地文件
    plugins/harmony-plugin-workspace-picker/lib/index.js:65
    await mkdir(path, { recursive: true })
  • 读取本地文件
    src-main/main.js:81
    if (existsSync(marker)) {
  • 读取本地文件
    src-main/main.js:85
    if (!existsSync(DSH_ARCHIVE)) {
  • 写入本地文件
    src-main/main.js:92
    mkdirSync(DSH_ROOT, { recursive: true });
  • 读取本地文件
    src-main/main.js:267
    if (!ex(presetsDir)) return;
  • 读取本地文件
    src-main/main.js:270
    for (const name of rd(presetsDir).filter((n) => n.endsWith('.patch.yml')).sort()) {
  • 读取本地文件
    src-main/main.js:272
    const lines = rf(file, 'utf8').split('\n');
  • 写入本地文件
    src-main/main.js:310
    wf(file, nestedLines.join('\n'));
  • 读取本地文件
    src-main/main.js:330
    for (const file of readdirSync(DSH_CLI_LIB())) {
  • 写入本地文件
    src-main/main.js:355
    mkdirSync(dest, { recursive: true });
  • 写入本地文件
    src-main/main.js:372
    if (changed) writeFileSync(destPkg, JSON.stringify(cur, null, 2) + '\n');
  • 写入本地文件
    src-main/main.js:411
    mkdirSync(dirname(dest), { recursive: true });
  • 写入本地文件
    src-main/main.js:412
    writeFileSync(dest, PROFILE_PNPM_WORKSPACE);
  • 删除本地文件递归
    src-main/main.js:480
    rmSync(dest, { recursive: true, force: true });
  • 删除本地文件递归
    src-main/main.js:495
    rmSync(join(destRoot, entry), { recursive: true, force: true });
  • 读取本地文件
    src-main/market-runtime.js:128
    fs.accessSync(file, fs.constants.X_OK);
  • 读取本地文件
    src-main/market-runtime.js:214
    if (!fs.existsSync(file)) return false;
  • 读取本地文件
    src-main/market-runtime.js:215
    const st = fs.statSync(file);
  • 读取本地文件
    src-main/market-runtime.js:237
    if (!fs.existsSync(file)) return false;
  • 读取本地文件
    src-main/market-runtime.js:238
    const st = fs.statSync(file);
  • 读取本地文件
    src-main/market-runtime.js:253
    const st = fs.statSync(file);
  • 执行外部命令来自配置/变量
    src-main/market-runtime.js:269
    const res = spawnSync(nodeFile, ['-e', "process.stdout.write('ok')"], {
  • 写入本地文件
    src-main/market-runtime.js:543
    fs.mkdirSync(result.binDir, { recursive: true });
  • 写入本地文件
    src-main/market-runtime.js:546
    fs.writeFileSync(shimPath, content);
  • 写入本地文件
    src-main/market-runtime.js:548
    fs.writeFileSync(shimPath, content, { mode: 0o755 });
  • 写入本地文件
    src-main/market-runtime.js:550
    fs.chmodSync(shimPath, 0o755);
扫描于 2026/11/1(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

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

界面预览

5 张 · 点击查看大图

功能亮点

  • Electron桌面封装
  • 运行于鸿蒙系统

README

由 DeepSeek 最新模型翻译生成
| English DSH Desktop · Electron on HarmonyOS Edition Electron on HarmonyOS Edition — 官方 DeepSeek Harness(DSH)Web UI,未做任何修改,通过 Electron 37 跑在 HarmonyOS 2in1 / 平板设备上:这是真正跑在 HarmonyOS 上的 Electron 应用,不是把界面用 ArkUI 重写一遍。另一个 HarmonyOS 版本 HarmonyOS Edition 完全去掉了 Electron —— 改用系统 ArkWeb 加进程内 Node 运行时。 Device capture, not a mockup — HarmonyOS 6.1.0.135 (API 24), 2in1. The UI is the official dsh Web UI, loaded same-origin from the in-process dsh Host. 状态 0.2.1(versionCode 1009)—— 已构建并签名。核心流程(聊天、智能体循环、工具调用、会话持久化、插件市场、窗口状态)已在 HarmonyOS 6.1.0.135(API 24)设备上针对 0.2.0 验证通过;0.2.1 版本还没在设备上重新验证(只验证了构建和签名)。
展开完整文档(README 剩余 1 节)
| English

DSH Desktop · Electron on HarmonyOS Edition

Electron on HarmonyOS Edition — 官方 DeepSeek Harness(DSH)Web UI,未做任何修改,通过 Electron 37 跑在 HarmonyOS 2in1 / 平板设备上:这是真正跑在 HarmonyOS 上的 Electron 应用,不是把界面用 ArkUI 重写一遍。另一个 HarmonyOS 版本 HarmonyOS Edition 完全去掉了 Electron —— 改用系统 ArkWeb 加进程内 Node 运行时。

Device capture, not a mockup — HarmonyOS 6.1.0.135 (API 24), 2in1. The UI is the official dsh Web UI, loaded same-origin from the in-process dsh Host.

状态 0.2.1(versionCode 1009)—— 已构建并签名。核心流程(聊天、智能体循环、工具调用、会话持久化、插件市场、窗口状态)已在 HarmonyOS 6.1.0.135(API 24)设备上针对 0.2.0 验证通过;0.2.1 版本还没在设备上重新验证(只验证了构建和签名)。先把分发现状说清楚:debug 签名的 HAP 绑定签名账号和设备,release 签名的包只能通过 AppGallery 分发 —— 详见如何获取。

这次移植有何不同

把 DSH 搬到 HarmonyOS 上还有别的路子。取舍正是这个仓库的全部故事:

| | 本项目(Electron 路线) | 原生宿主路线(Node 运行时 + ArkUI 宿主) |
| 界面 | 官方 Web UI,逐字节一致 —— 没有任何重写 | 同一份 Web 内容外面套原生宿主;平台外壳是重写的 |
| 与桌面版的一致性 | 语义完全相同:同一个渲染进程、同一套 Node API、同一条数据通路 | 不错,但宿主层是重新实现,必须跟着上游走 |
| 运行时权限 | 需要 ACL 受限权限 ohos.permission.kernel.ALLOW_WRITABLE_CODE_MEMORY(JIT)—— 仅限 2in1 / 平板 | 不用 JIT,也就不需要这个权限 |
| 设备覆盖 | HarmonyOS 2in1 / 平板 | 可以扩展到手机 |
两者没有谁「更好」,各自优化的方向不同。这个仓库存在的意义,是把 Electron 路线端到端跑通——包括途中撞上的每一处沙箱冲突。其他版本共用同一套外壳架构和数据平面:dsh-desktop 面向 Windows / Linux / macOS,dsh-desktop-ark 面向鸿蒙版(系统 ArkWeb + 进程内 Node 运行时,不用 Electron)。

目前可用的能力

| 能力 | 状态 |
| 在窗口里跑 dsh Web UI(100% 复用 dsh 前端) | ✅ |
| 会话持久化 + 全文搜索(better-sqlite3,aarch64 ABI 138) | ✅ |
| 插件市场(内置 dshmarket) | ✅ |
| 窗口状态持久化(最大化 / 边界)+ F11 全屏 | ✅ |
| 命令执行——常驻 /system/bin/sh,不走 PTY,靠哨兵行协议驱动,工具层带路径围栏 | ✅ ⚠️ 围栏是尽力而为、可绕过,不是沙箱 |
| 图片附件——sharp 换成纯 JS 容器解析器;它做不了的转换,交给 ArkTS 桥接走平台图片框架(解码 / EXIF / 缩放 / 重编码) | ⚠️ 干净的 8 位 sRGB 文件可逐字节原样通过;桥接不可达时,所有转换都显式报错拒绝;没有缩略图 |
| 自带 Node / pnpm / Python 运行时 | ⛔ 做不到——要发布 ELF 就得有二进制证书(AGC certType: 4),华为不发给个人开发者。宿主机从系统终端装 pnpm 属于可选依赖,永远不算产品能力 |
| 进程沙箱(koffi / landlock) | ❌ 不在范围内 |

限制详解

- 命令执行。 上游的 tool-bash 一行保持禁用:node-pty 没有 aarch64 产物,PTY 又被 SELinux 拒绝。替代方案是拉起常驻的 /system/bin/sh,通过哨兵行读取回复;路径围栏放在工具层,按设计就可绕过。
- 自带运行时。 应用已经能在 PATH 里看到 /data/service/hnp/bin,那里有一个结构合法的 node——只缺 pnpm。用户从系统终端装好 pnpm 之后(软链禁令只针对应用域,所以不能从应用内部装),市场的 probePnpm() 就能通过,插件的安装 / 卸载即可工作。其余功能都不依赖自带运行时:命令执行拉起系统自带的 sh/toybox,文件 / 搜索 / 技能 / 子代理 / 工作流 / 图片这些功能都是纯 JS。分析见 docs/鸿蒙环境能力清单-v0.1.5.md §C.8。
- 图片。 桩代码解析 PNG/JPEG/GIF/WebP 容器头;无法转换的内容交给 ArkTS 桥接层处理(解码、EXIF 方向、缩放、重新编码为 JPEG/WebP/PNG)。限制范围内干净的 8-bit sRGB 输入按字节原样通过,零转换开销。没有可用桥接层时(纯 Node),每次转换都拒绝,并抛出明确的、带归属信息的错误。不生成缩略图。

以下两项是主动决定推迟,不是遗漏:无边框窗口(把窗口控件移进渲染进程,代价大于收益)和开机自启(autoStartupManager 只暴露只读查询)。系统托盘今天已上线——状态栏图标加右键菜单。

界面

| | 浅色 | 深色 |
| 智能体对话 — 工具调用、会话追踪、模型与缓存遥测 | | |
| 设置 — 模型、插件、智能体预设、插件市场、外观 | | |

如何获取

三条路径,按便利程度排序:

1. AppGallery(计划中)。 发布签名的 App Pack 只能从 AppGallery 安装。上架有两个前置条件:ACL 受限权限(约 3 个工作日审核,仅限中国大陆开发者账号)和 AI 合规流程(算法备案 / 模型登记 / 安全评估)。见维护者指南。
2. 自行构建 —— 目前受支持的路径。四个阶段,然后得到本地 HAP:collect-runtime → build-dsh → collect-dsh → tar,再运行 scripts/build-debug.ps1。见维护者指南。要求:DevEco Studio 4.0+、HarmonyOS SDK API 17+(targetSdk 6.1.1(24))、Node 18+、pnpm@11、HDC。
3. 用自己的账号重签调试构建。 调试配置档绑定设备,别人的调试 HAP 装不到你的机器上;在 DevEco 里重新生成配置档(File → Project Structure → Signing Configs)再重新构建。见维护者指南。

⚠️ 对发布签名的包执行 hdc app install 会失败,报 code:9568322 ... not trusted app source。设备上的回归测试请用 -BuildMode release -SignMode debug。

兼容性

| Shell | dsh(上游 tag) | 运行时 | 设备 / API | 验证状态 |
| 0.2.1 · versionCode 1009 | dsh-v0.2.1-rc.2 | Electron 37 / Node 22.17.0(harmonypc-electron) | HarmonyOS 6.1.0.135 · API 24 · 2in1 / 平板 | 已构建并签名;设备上复验待完成(0.2.0 已验证) |

每次提交 AppGallery,versionCode 都必须是数字,且必须严格递增。上游 dsh 是开发者预览版:每个 shell 固定一个 tag,patches/<dsh-tag>/ 随之移动。

架构

设备上单进程、单源:Electron 主进程托管 dsh Host(webserver + API + WebSocket),窗口从它加载标准 dsh Web UI——没有 CORS,没有鉴权,没有自定义协议,没有 IPC 载体。

EntryAbility (ArkTS) → Electron-on-HarmonyOS → main process (Node 22.17)
└─ dsh Host: webserver on 0.0.0.0:<port> · apiProxy · connection └─ window: the unmodified dsh Web UI, loaded same-origin from that port

三项 HarmonyOS 适配让它跑起来:回环隔离(绑定通配地址,再在会话内把 Host/Origin 改写回回环)、不支持符号链接与硬链接(发布配置档时用复制,原子写入用同目录 rename)、HOME 重定向进沙箱。监听地址是通配的,所以请把它当作单用户本地应用,别暴露在不可信网络上。补丁清单、威胁说明与完整理由见维护者指南。

技术栈

- Electron-on-HarmonyOS 运行时(harmonypc-electron)——Electron 37 / Node 22.17.0
- ArkTS / ArkUI(Stage 模型),搭配 web_engine 桥接 HAR
- 上游 deepseek-harness 锁定在 dsh-v0.2.1-rc.2;本外壳的补丁放在 patches/dsh-v0.2.1-rc.2/

构建、签名与安装

环境要求:DevEco Studio 4.0+ 或命令行工具,HarmonyOS SDK API 17+(target 6.1.1 / API 24),Node 18+,pnpm,hdc。

node scripts/collect-runtime.mjs # ① copy the runtime, then re-apply this app's customizations
node scripts/build-dsh.mjs # ② apply the 13 patches, build dsh + dsh-market
node scripts/collect-dsh.mjs # ③ materialize dsh-dist
powershell scripts\build-debug.ps1 # ④ build + sign the HAP
hdc app install -r entry/build/default/outputs/default/entry-default-signed.hap

签名材料绝不进仓库(signing.<mode>.local.json,已 gitignore)。发布签名、ACL 受限权限、AppGallery 上架、真机调试与四阶段流水线,详见维护者指南。

目录结构

本项目、3 个被消费的项目,外加 1 个架构参考项目,都放在同级目录里(不是子模块):

(sibling directories)
├── dsh-desktop-hos/ # This project (HarmonyOS HAP, HarmonyOS desktop port)
│ ├── AppScope/ # App scope (icon/name/signing)
│ ├── electron/ # Entry module (copied from harmonypc-electron, contains SOs)
│ ├── web_engine/ # Bridge HAR (ArkTS bridge layer + resfile carries dsh artifacts)
│ ├── src-main/ # Main process main.js (extract + runProfile + loadURL + HarmonyOS adaptations)
│ ├── scripts/ # Four-stage build: collect-runtime → build-dsh → collect-dsh, plus build-debug / build-release
│ ├── runtime-overlays/ # 每次复制运行时后重新应用的应用定制(prune + overlay) │ ├── profiles/desktop/ # 自定义桌面配置档(cordis.patch.yml + package.json) │ ├── patches/ # dsh 上游补丁(14) │ ├── docs/ # 工程规划与最终实现记录 │ ├── plugins/ # 本项目自有插件(harmony-plugin-XXX;烘焙进 HAP,默认全部加载) │ ├── skills/ # 本项目自有工具技能(kebab-case,无前缀;作为内置技能根目录随 HAP 发布) │ └── specs/ # 规格文档(as-built;索引见 specs/README.md) │ ├── harmonypc-electron/ # 鸿蒙上的 Electron 运行时(Electron 37 / Node 22.17.0) │ └── ohos_hap/ # electron + web_engine 模块 + SO 源码(collect-runtime 的复制来源) │ ├── deepseek-harness/ # 被包装的宿主(dsh,源码参考,非子模块) │ ├── apps/ # cli(dsh bin / profile-boot)、web(前端,build:web 产出 dist) │ ├── packages/ # host / client / core / session 工作区包 │ ├── vendor/ # 内置的 cordis 框架包(cordis / loader / hmr / …)
│ └── native/ # landlock-run 原生模块(Linux 沙箱,MVP 中已裁掉) │ └── dsh-market/ # 插件市场(源码参考,npm 包名 "dshmarket") ├── src/ # 宿主侧(挂载 /dsh-market/* 路由) ├── client/ # 浏览器侧(设置页 UI) ├── lib/ # 编译后的宿主产物(落地到 dsh-dist/node_modules/dshmarket) └── cordis.patch.yml # loader 插入声明({ id: dsh-market, name: dshmarket })

../dsh-desktop 是架构设计参考(复用其架构决策 + 补丁 + 主进程编排逻辑),不参与本项目的构建与打包。

相关文档

- docs/鸿蒙环境能力清单-0.2.1.md — 0.2.1 能力清单:本版本上哪些能用、哪些不能用,以及与 ArkWeb 版本的对比
- docs/构建签名与上架.md — 维护者指南:架构、技术栈、构建阶段、签名、真机调试、AppGallery 上架
- docs/工程规划.md — 完整工程规划 + 最终实现记录(Electron 37 落地、关键适配改动、MVP 取舍、交叉编译优化路径)
- specs/README.md — 规格文档索引(项目级 + 9 个模块的 spec/plan,as-built)

参考资料

- deepseek-harness(同级目录 ../deepseek-harness)— 被包装的宿主;其 docs/ 目录包含完整架构文档
- dsh-market(同级目录 ../dsh-market)—— 内置的可视化插件市场(npm 包 dshmarket),由 collect-dsh.mjs 生成
- harmonypc-electron(同级目录 ../harmonypc-electron)—— Electron 在 HarmonyOS 上的运行时
- dsh-desktop(同级目录 ../dsh-desktop)—— 架构设计参考(Electron 桌面外壳)
- dsh-desktop-ark(同级目录 ../dsh-desktop-ark)—— HarmonyOS 版:同一套 dsh Host 跑在 ohos-node-bridge 上(进程内 Node v24.2.0),由系统 ArkWeb 渲染,不用 Electron
- DSH Desktop 官网—— 三个版本、真机截图、架构故事,一页看完

许可证

MIT © 2026 fellow99
预览分享卡片长什么样 ↓fellow99/dsh-desktop-hos
分享 · DeepSeek Harness Hub
fellow99/dsh-desktop-hos

基于 Electron 的桌面封装,让 deepseek-harness 跑在 HarmonyOS 或 OpenHarmony 上

回到顶部