dshm
deepseek harnes HarmonyOS PC client
What it is
deepseek harnes HarmonyOS PC client
How to install
Run this in the DSH web profile, then refresh the page.
$ dsh plugin --profile web add 'git+https://github.com/sol5766/dshm.git#1cb0db693ea5121f0dab0208b1144b4c1b8ee2c0'
DSH versions accepted
Undeclared
Author and traction
sol5766 · ★ 88 · Updated 2026-10-08
About this plugin
DSHM
在 HarmonyOS 上自足运行 DeepSeek Harness 的应用
DSHM 把 DeepSeek Harness(dsh)的运行本体装进一个鸿蒙应用:HAP 内自带 Node 运行时与 dsh 核心树,核心在本机 127.0.0.1 上起 Host,应用内的原生 ArkUI 页面就是这个本地 Host 的客户端。
它不是 PC 上 dsh 的遥控器,也不需要在电脑上常驻任何服务:装上即用,数据只在本机应用沙箱内。
支持 HarmonyOS 手机 / 折叠屏 / 平板 / 2in1。 这是一次平台移植:把官方面向桌面(Electron)的运行时,搬到 OpenHarmony arm64 上自足运行。 移植过程中与鸿蒙平台语义的每一处冲突、根因与修法,都汇总在 docs/70-鸿蒙移植踩坑与修复总览.md(按技术主题组织)。 两条根本约束决定了后面几乎所有设计:jitless ⇒ WebAssembly === undefined, 以及 execve 受签名域管辖 ⇒ 所有端侧原生二进制必须构建期自签名。 为什么需要它:官方没有鸿蒙端
上游 DeepSeek Harness 面向的是桌面端(Windows / macOS,Electron)与 CLI。它的运行前提有两条,在鸿蒙应用沙箱里一条都不成立:
1. 系统里有可执行的 Node 运行时; 2. 进程能直接 execve 任意二进制。
本仓库做的事,就是在官方未覆盖的平台上把这两条前提逐条补出来,并提供一个原生宿主: 具体落成四件事: 运行时不依赖系统,随包分发。 HAP 内自带 Node 运行时与全部原生库,构建期完成自签名以进入应用签名域。代价是包体(约 300 MiB),换来"装上就能跑,不必先配环境"。 核心树可切换、可回滚。 dsh 核心树以归档形式随包分发,首次启动解包进应用数据目录下的版本仓库(dsh/cores/ ),通过激活事务切换版本,失败可回滚 ⇒ 升级上游 = 换一个核心归档,App 代码不动。 宿主重写,界面不重写。 界面内容仍是官方 Web 前端;ArkUI 侧只承担平台宿主职责,设计令牌从官方 --dsw-* 映射到鸿蒙语义色与系统符号,不做 Web CSS 的像素级翻译——官方主题更新时不需要重做整套界面。 上架友好、数据保全优先。 权限共 11 项(6 项普通 + 5 项 ACL 受限,逐项见 entry/src/main/module.json5),不含 JIT / 可写可执行内存一类(无 ohos.permission.kernel.*、无 ALLOW_WRITABLE_CODE_MEMORY);装机一律 hdc install -r 覆盖安装,应用数据原地保留(详见下文「真机数据保全」)。
端侧与官方的逐项对照(哪些对齐、哪些存在边界)登记在 docs/parity-matrix.md,由 tools/check-parity.mjs 强制维护;移植过程中踩到的坑按主题汇总在 docs/70-鸿蒙移植踩坑与修复总览.md。 已知边界 WASM 缺席是全局前提。 凡是上游直接 import('undici') 的功能都必须走垫片;新接入的上游功能若未覆盖,在端侧会直接失败。垫片覆盖由门禁守住,不靠自觉。 长连接抖动:官方网关默认心跳间隔(2 s)对有重计算的会话偏紧,可能表现为连接短暂中断后自动恢复;这是 profile 层参数,可按机器调整。 冷启自退:曾在旧核心版本上出现一次(启动约 40 s 后 process.exit(0)),当前版本长时间连续运行未复现,仍在定位中。 能力 架构
同进程带来的是安全语义的简化:客户端与 Host 走回环,不需要把服务暴露到局域网,也不需要跨设备转发。 端侧运行时的硬约束:jitless ⇒ 没有 WASM
不申请 JIT 权限意味着 Host 全程以 --jitless 运行,而 V8 的 --jitless 与 --expose_wasm 互斥 (启动即打印 disabling flag --expose_wasm),因此端侧 typeof WebAssembly === 'undefined'——这是恒定的, 不是配置问题。由此推出一条对上游代码的判据: 凡是上游直接 import('undici') 的功能,在端侧都会失败,因为 undici 的 HTTP 解析器是 WASM (lib/llhttp/llhttp-wasm.js)。
已实测证实的一个实例:dsh-web-fetch-http 不用全局 fetch,而是 await import('undici') 自建 Agent 再传 dispatcher,于是 web_fetch 打不开任何网页和 IP,而走本仓纯 JS node:http 垫片的 web_search 照常工作。 同一核心树、同一个本地 HTTP 服务下,只有 --jitless 一个变量就能复现两组结果(有 WASM → 200; 无 WASM → fetch failed / WebAssembly is not defined)。细节与在飞修复见 docs/parity-matrix.md §3.2。
Similar plugins
Mole
🐹 Open-source Mac and PC cleaner. Keep your machine clean, light, and running like new…
DeepSeek-Reasonix
A reliable coding agent for complex software engineering tasks.
dsh-desktop
DSH Desktop product workspace