dsh-desktop-ark
DiscoveredThe official DeepSeek Harness (DSH) Web UI, unmodified, running on HarmonyOS 2in1 / tablet inside the system ArkWeb — with the dsh Host on a real Node.js runtime embedded in the same process. No Elect
中文 | English
DSH Desktop · HarmonyOS Edition
The official DeepSeek Harness (DSH) Web UI, unmodified, running on HarmonyOS 2in1 / tablet inside the system ArkWeb — with the dsh Host on a real Node.js runtime embedded in the same process. No Electron, no bundled Chromium, no ArkUI rewrite of the Web UI.
Status 0.1.0 — scaffold (versionCode 100). It now compiles, packages and boots a real payload: assemble-payload.mjs --deploy materializes the upstream dsh runtime (pruned from 628.6 MiB to 151 MiB, packed into a 40.4 MB dsh.tar.gz), producing an 86 MB unsigned HAP that carries the Node runtime plus the payload. On a host Node the same tree extracts in ~13 s, stages the profile, starts the Host and serves the unmodified dsh Web UI at the token URL (HTTP 200) with 0 unactivated profile rows. No HarmonyOS device verification has been done — see Status for exactly what is proven and what is not.
Two HarmonyOS editions
HarmonyOS gets two independent editions of DSH Desktop; they share the same shell architecture, the same unmodified Web UI and the same data plane — the difference is which runtime provides Node:
Electron on HarmonyOS Edition (dsh-desktop-hos) | HarmonyOS Edition (this repo) | |
|---|---|---|
| Renderer | Chromium, shipped inside Electron 37 | The system ArkWeb — nothing bundled |
| Node.js | Inside the Electron runtime (Node 22.17) | libnode.so started via node::Start in the app's own process (v24.2.0) |
| Runtime plumbing | harmonypc-electron | ohos-node-bridge HAR |
| Upstream dsh patches | 13 (flock & hardlink fallbacks, ctx.fs remove / writeBytes / chmod, extra writable roots, attachment fsync, rebrand) | 0 — ohos profile + @dsh-ohos/bundle layer + audited shims |
| Web server binding | 0.0.0.0:<port> + LAN IP with Host/Origin rewrite | 127.0.0.1:<port>, same-origin loopback |
| Maturity | v0.2.1, device-verified on HarmonyOS 6.1.0.135 (API 24) | v0.1.0 scaffold, compiles & packages |
Neither is a replacement for the other: the Electron edition buys maximum desktop fidelity at the cost of a bundled Chromium and JIT, and this edition buys a small payload and a JIT-free runtime at the cost of covering the platform gaps in the shim layer.
How it works — one process, one origin
EntryAbility (ArkTS)
└─ libnode.so node::Start(bootstrap.js) ← in-process Node v24.2.0
└─ extract resfile/dsh-payload → filesDir/payload (marker .ready-<sha12>)
└─ host.js: dsh Host (webserver + apiProxy + connection) on 127.0.0.1:<free port>
└─ ready.json { schema, at, phase, port, token }
└─ ArkWeb: loadUrl(ctx.connection.authenticatedUrl())
└─ the standard, unmodified dsh Web UI (same-origin HTTP + WebSocket)
- The payload is
resfile— a real on-disk directory Node can read — holding a single deterministicdsh.tar.gz. Node is the only extractor, and extraction is idempotent through the.ready-<sha12>marker. - Readiness means business readiness.
waitUntilRunning()only proves the runtime thread is alive, so the shell pollsready.json(20 × 500 ms) and requires all of:schema === 1, anatno older than the launch timestamp, a terminalphase, and a non-emptytoken. Only then does it load the URL. - Auth belongs to the Host. The page loads
authenticatedUrl()(http://127.0.0.1:<port>/?token=…); the Host itself answers303and sets the signed cookie. The shell takes no part in authentication, never rewrites theHostheader, and never binds0.0.0.0. - Zero upstream changes: platform differences are confined to an
ohosprofile, the@dsh-ohos/bundleYAML layer, and five marked shims (DSH_OHOS_SHIM fs.link | fs.symlink | flock | sharp | node:sqlite). Every upstream working tree stays pristine.
Capabilities exposed to dsh
| Capability | State |
|---|---|
runtime.facts, log.hilog, perm.check, perm.request, perm.openAppInfo, shell.openExternal | ✅ implemented |
fs.pickFolder, fs.pickFiles, fs.saveFile, notify.show, clipboard.readImage, clipboard.writeText, image.normalize, power.keepAwake | ⚠️ placeholder — returns {"ok":false,"error":"not-implemented","hint":…} |
Status
| Area | State |
|---|---|
| ArkTS shell, ArkWeb host page, launch orchestration, readiness gate, diagnostics | ✅ implemented |
ohos-node-bridge HAR consumption, runtime provisioning (7 ELF gates + SHA-256), 44 MB HAP | ✅ verified by build |
Payload pipeline (resfile → self-extract), 5 shims, self-check 7/7, upstream pin check | ✅ verified on the host toolchain; profile is loaded from <runRoot>/profiles/ohos (moved out of $DSH_HOME so @dsh-ohos/* resolves) |
8 @dsh-ohos/* seam plugins + shared host bridge (10 packages under packages/*-ohos/) | ✅ implemented (partial: no PTY, notify.show / image.normalize still ArkTS placeholders, approval presets disabled without a confining executor) |
| Real dsh payload assembly + packaging | ✅ --deploy (pnpm deploy → link materialization → @deepseek-ai completion → non-hoisted flattening → prune → overlay → assertions); 41,331 files / 628.6 MiB → 15,192 files / 151 MiB → dsh.tar.gz 40.4 MB (sha12 db181e3b4364); HAP 86 MB |
On-device verification (L1–L4, ArkWeb → 127.0.0.1, sh sentinel, JIT ACL) | ⛔ not done — no device (host-Node end-to-end is green: extract → profile → runProfile → token URL 200) |
Repository layout
dsh-desktop-ark/
├── AppScope/ # bundle-level config (bundleName org.fellow99.dsh.DshDesktopArk)
├── entry/
│ ├── src/main/ets/
│ │ ├── app/ # DshRuntime (launch orchestration) · Probe (liveness)
│ │ ├── common/ # Constants — single source of truth for paths and budgets
│ │ ├── host/ # HostCapabilities (14-entry capability surface)
│ │ ├── entryability/ # EntryAbility
│ │ └── pages/ # Index (the ArkWeb shell)
│ ├── src/main/resources/ # resfile/dsh-payload (build output, gitignored)
│ └── libs/arm64-v8a/ # provisioned .so files (binaries are never committed)
├── payload/ # bootstrap.js · host.js · lib/tar-extract.js · shims/ · selfcheck.js
├── profiles/ohos/ # dsh profile + bundle layer + .npmrc
├── packages/bundle-ohos/ # @dsh-ohos/bundle (cordis.patch.yml)
├── scripts/ # 7 scripts: HAR / runtime / payload / build / upstream pin
├── specs/ # 26 specifications (10 root files + spec/plan for 101–108)
└── docs/ # engineering plan and troubleshooting notes
Build
Prerequisites: DevEco Command Line Tools (SDK API 24), the sibling submodules ../ohos-node-bridge and ../deepseek-harness, and a provisioned Node runtime.
# 1) bridge HAR → libs/@fellow99/node-bridge.har
bash scripts/build-bridge-har.sh
# 2) Node runtime → entry/libs/arm64-v8a (7 ELF gates + SHA-256)
bash scripts/provision-runtime.sh # add ALLOW_MISSING=1 to build without it
# 3) payload → entry/src/main/resources/resfile/dsh-payload
node scripts/sync-payload.mjs
node scripts/package-payload.mjs
# node scripts/assemble-payload.mjs --from <built dsh tree> --apply # real payload, still dry-run by default
# 4) HAP
bash scripts/build-hap.sh # --release for release mode; entry/build/default/outputs/default/
# optional: prove the upstream pin is intact (tag + 8 patch ids + clean tree)
node scripts/verify-upstream.mjs
OHOS_CLT overrides the Command Line Tools root (default D:/oh-workspace/command-line-tools-6); DEVECO_SDK_HOME overrides the SDK.
Specifications
This repository is spec-driven: 26 documents under specs/ — index, checklist, structure, tech, architecture, constitution (C1–C14), overall-* (spec / plan / data model / test cases), and one spec.md + plan.md per module (101 runtime launch, 102 payload pipeline, 103 web host, 104 host capabilities, 105 shims, 106 profiles/bundle, 107 packaging/signing, 108 diagnostics). Start at specs/README.md.
Related
dsh-desktop— Electron shell for Windows / Linux / macOSdsh-desktop-hos— Electron on HarmonyOS Edition (same workspace, Electron runtime)ohos-node-bridge— the ArkTS library that embeds Node (node::Start) + theruntime/release cachedeepseek-harness(sibling../deepseek-harness) — the wrapped hostdsh-market(sibling../dsh-market) — built-in plugin marketplace
License
Comments
Loading…
Similar plugins
by ahikl
DeepSeek Harness 桌面端插件:基于 Electron 的 dsh Web UI 桌面外壳。| An Electron desktop shell for the DeepSeek Harness Web UI, with a system tray and a custom title bar.
★ 0
↓ 199/wk
MIT
TypeScript
Aug 16, 2026
dsh plugin --profile web add @ahikl/dsh-desktopby Nono-neko
An AI-native browser workspace for DeepSeek Harness (DSH), combining multi-tab browsing, live page annotations, lightweight code editing, workspace previews, and Agent-assisted iteration across Web an
★ 12
↓ 254/wk
Apache-2.0
TypeScript
Oct 2, 2026
dsh plugin --profile web add @nono-neko/dsh-browserby MARIOMLY
Open the DeepSeek Harness Web UI as a standalone desktop app window (Chromium --app mode) — a DSH host plugin. / 把 DSH Web 界面变成独立桌面应用窗口的 DSH 插件。
★ 0
MIT
JavaScript
Sep 14, 2026
dsh plugin --profile web add dsh-desktop-appby Hotsteel2901
Your DeepSeek Harness web UI, rebuilt for the phone in your hand. Built for developers who code in Termux on Android: single-column layout, sidebar drawer, one-line composer, fullscreen scrollable set
★ 12
MIT
JavaScript
Oct 18, 2026
dsh plugin --profile web add dsh-client-ui-mobile-adaptby jaychang1989
Opens the official chat.deepseek.com web app inside DeepSeek Harness: one sidebar entry renders the real page in the center column through the desktop shell's native browser guest, and keeps you signed in across restarts. No chat UI, no agent tools, no runtime dependencies.
★ 8
↓ 140/wk
Apache-2.0
JavaScript
Oct 13, 2026
dsh plugin --profile web add @jaychang1989/dsh-webchatby kkaktus463
Opens the DeepSeek Harness Web UI in a native window instead of a browser tab.
★ 0
MIT
JavaScript
Aug 23, 2026
dsh plugin --profile web add dsh-plugin-desktop