DeepSeek Harness 跑上鸿蒙:4 个阶段、14 个补丁
上篇《保姆级:从 0 到 1 用 Electron 封装 DeepSeek Harness》结尾,我立了个 flag:把同一个 dsh 搬上鸿蒙真机。这篇来兑现,先给结论:在鸿蒙 2in1 上,dsh 的 Web UI 已经完整跑起来了——多会话、工具调用、文件读写、插件市场全可用,而架构几乎没动。
看完这篇,你会拿到一份可照抄的鸿蒙化规划。本文先给全景图:三层难点、为什么只换运行时、4 阶段构建、补丁为什么涨到 14+;后面每篇深挖一层。
先泼盆冷水:三层难点
动手前我必须说实话:这是我做过最「绕」的一次鸿蒙化。 难点分三层。
第一层,系统级差异。 沙箱禁 symlink、禁硬链接,loopback 网络隔离,HAP 打包 5 万小文件会卡死。这不是改两行代码能解决的,得靠一堆补丁一层层绕。
第二层,权限与安全。 ACL 权限审核相当严格;而「二进制证书」个人开发者根本拿不到,直接堵死「随包自带 Node / npm / pnpm / Python / pip / uv 等运行时和工具」这条路。
第三层,合规上线,地狱级。 商标撞名、ArkWeb 合规、AI 资质、APP 备案,一道坎接一道。这一层我到现在还在跑流程。
好在还有一张底牌:开源工程 harmonypc-electron 已经把 Electron(Node + Chromium)跑进了鸿蒙 HAP,否则光「跑起一个 Electron 桌面壳」就得自己啃原生 SO 交叉编译、ArkTS 桥接、渲染面三块硬骨头。
真正的问题变成:怎么规划,才能既复用 desktop 架构,又扛得住这三层坑?
一、目标:鸿蒙上的一等公民
目标很朴素:让 DeepSeek Harness(dsh)这个 AI Agent 工作台,在鸿蒙 2in1 / 平板上像一等公民桌面应用一样运行。
注意,不是「套个浏览器壳指向 localhost」的粗壳,而是对标 desktop 版:dsh Host 跑在应用进程里,桌面能力直接订阅它的内部事件。
二、题眼没变:同源数据面
搬到鸿蒙,我最担心的是 desktop 那套架构还能不能用。
答案是能,因为题眼没变——dsh 已经完成 Host/Client 分层,它的 webserver 同时服务 SPA 前端页面和 /api 接口。渲染进程只要加载同一个地址,fetch('/api/xxx') 和 WebSocket 就是同源的:零 CORS、零鉴权、零自定义协议、零新增 IPC。
这一条跟桌面端一模一样。所以鸿蒙版骨架直接抄 desktop:主进程里 runProfile('desktop') 挂起 dsh Host,渲染进程 loadURL 到同一个端口,跑未经修改的标准 dsh Web UI。
三、唯一的变化:换运行时
与 desktop 的差异只有一处本质变化:把官方 Electron 运行时换成 Electron-on-鸿蒙运行时(harmonypc-electron)。
| 维度 | desktop | harmony |
|---|---|---|
| 运行时 | 官方 Electron(npm 依赖) | harmonypc-electron(构建期 copy) |
| UI 加载 | loadURL(localhost) 同源 | 同(局域网 IP + Host 改写) |
| 后端进程 | 主进程内 Host | 同 |
| 构建分发 | Electron Forge | hvigor 产 HAP + hdc 安装 |
除运行时和构建外,其余维度完全同构,这就是「只换壳」。
为什么选 harmonypc-electron?一句话:dsh 依赖 Node 22+ 的 zlib.createZstdDecompress 解压会话产物,而 Electron 34 只带 Node 20.18.1,没有这能力。harmonypc-electron 用的是 Electron 37 / Node 22.17.0,刚好满足。
四、4 阶段构建流水线
鸿蒙的构建跟 Electron Forge 完全不是一回事,我把整条流水线拆成 4 个阶段:
⓪ collect-runtime 同步 Electron-on-鸿蒙运行时(copy 模块 + 3 个 SO)
① build-dsh patch + 构建 dsh + dsh-market
② collect-dsh 收集 dsh 产物 + 注入 better-sqlite3 + 写 sharp stub
③ tar 压成 dsh-dist.tar.gz
④ hvigor 构建 + 签名 → HAP
第 ③ 步最反直觉:dsh 产物有 5 万多个小文件,直接让 hvigor 打包卡死。解法是先把整个 dsh-dist 压成一个 约 143MB 的 tar.gz,运行时再流式解压。
五、补丁从 6 到 14+
desktop 版只需要 2 个补丁。鸿蒙版我一开始规划 6 个,落地一路涨到 14+ 个。
为什么?因为鸿蒙的沙箱和网络模型,跟桌面 Linux 完全不是一回事:
- 沙箱禁 symlink(EACCES)→ dsh 初始化失败,回退 cpSync 递归拷贝
- 沙箱禁硬链接 → 会话日志发布回退 rename
- loopback 网络隔离 → 渲染进程访问 127.0.0.1 被拦,webserver 绑 0.0.0.0 + 走局域网 IP
- 还有给
ctx.fs补删除 / 写字节 / chmod 原语、lefthook、欢迎页、附件 fsync 兜底……
这些坑后面「适配踩坑」篇逐个展开,每个都贴报错原文和解法。只需记住:补丁数量不是越少越好,它是「鸿蒙跟桌面差异有多大」的直接度量。
六、MVP 取舍:三桩一换
鸿蒙 aarch64 上,dsh 的三个原生模块都没有对应二进制。MVP 阶段的取舍:
| 能力 | 依赖 | 取舍 |
|---|---|---|
| 图片附件 | sharp(libvips) | 纯 JS stub(解析容器头,不解码) |
| 终端(bash 工具) | node-pty | 禁用 |
| 进程沙箱 | koffi(landlock) | 禁用 |
| 会话持久化 | better-sqlite3 | ✅ 换用 Electron 37 / ABI v138 成品 |
「三桩一换」:三个能力牺牲,但最关键的会话持久化用 better-sqlite3 的 aarch64 成品保住了。
七、真机验证
在鸿蒙 2in1 真机(HarmonyOS 6.1.0.135 / API 24)上验证通过:Electron 37 / Node 22.17.0,dsh Host 启动,渲染进程加载 Web UI 成功,多会话、agent、工具调用全可用。
八、写在最后
以上就是把 DeepSeek Harness 搬进鸿蒙的完整工程规划:架构抄 desktop,只换运行时,4 阶段构建,14+ 个补丁,三桩一换,真机跑通。
如果你也在琢磨把某个 Electron 应用或 Node agent 框架搬进鸿蒙,这套「进程内 Host + 同源数据面 + 换运行时」的思路可直接抄。
代码已开源:https://github.com/fellow99/deepseek-harness-harmony 。4 阶段构建脚本、全部补丁、真机验证步骤都在里面,点个 star,就能顺着这份规划抄到真机跑通。
下一篇我写 Electron-on-鸿蒙运行时拆解:把 Electron 跑进鸿蒙电脑的那个运行时,到底是怎么搭起来的。关注我,别错过。
感谢各位关注,欢迎访问我的GitHub主页:https://fellow99.github.io/
相关开源工程:
- DeepSeek Harness(上游项目):https://github.com/deepseek-ai/deepseek-harness
- dsh-market(插件市场):https://github.com/dsh-market/dsh-market
- harmonypc-electron(Electron-on-鸿蒙运行时):https://atomgit.com/jianguoxu/harmonypc-electron
- deepseek-harness-workspace(工作区总览):https://github.com/fellow99/deepseek-harness-workspace
- deepseek-harness-desktop(桌面端):https://github.com/fellow99/deepseek-harness-desktop
- deepseek-harness-harmony(鸿蒙端):https://github.com/fellow99/deepseek-harness-harmony
更多推荐



所有评论(0)