版本:v1.1(2026-08-23 check 后更新:决策落地、R1 落定、双速路线整合) 定位:HarmonyOS PC 上的 DSH 原生桌面应用——全原生 ArkUI 界面 + 本地 DSH Host 运行时托管 + 永远跟随官方升级 路线(2026-08-23 定稿):双速——先出 Web 壳首发版(P1)抢鸿蒙卡位,协议原生(方案C 主体)并行分支推进,壳即 4.5 节 WebView 逃生舱 姊妹篇:HANDOVER.md(交接文档——新会话入口,先读它)|dsh-desktop/PRODUCT-PLAN.zh.md(macOS 薄壳版,0.2.1)|SCHEDULE-AND-DECISIONS.zh.md(AI 工期估算)|COMPETITIVE-RESEARCH.zh.md(竞品调研)
| 项 | 状态 |
|---|---|
| 工程 | ✅ /Users/eastudio/DevEcoStudioProjects/dsh-harmony(com.dotouch.dshharmony / DSH Harmony / vendor dotouch) |
| API 版本 | ✅ compatibleSdkVersion 6.0.0(20)(HarmonyOS 6.0)/ targetSdkVersion 26.0.0(HarmonyOS 7),编译验证通过 |
| CLI 构建链 | ✅ scripts/build.sh(Java/SDK 环境配方固化,见 knowledge-base/build-recipe.md) |
| 签名 | ✅ 自动签名完成,entry-default-signed.hap 构建通过 |
| 验证设备 | ✅ MateBook Pro 模拟器(HarmonyOS 7 Beta / API 26 / 2in1)已部署;MatePad Edge 真机可接入(compatible=20 兼容回归 + 真机大屏场景) |
| 知识库 | ✅ knowledge-base/(官方文档目录、SDK API 映射、生态跟踪、构建配方、问题清单) |
| git | ✅ 本地仓库初始化(main 基线 2913ad6 + feature/protocol-native 双分支;仓库级身份 dotouch,无远程——开源时再加) |
| 壳版(P0/P1) | 🔄 已在其它对话任务中启动(2026-08-23),本对话通过 git diff / 工程状态跟踪其进展 |
| 协议原生线(P2a 起) | ⏳ 待启动,工作分支 feature/protocol-native |
| # | 原则 | 架构依据(已在本机源码确认) |
|---|---|---|
| P1 | 官方代码零分叉 | Web UI 必须由 dsh web 注入 window.DSH_BOOT 才能跑,任何打包 UI 的做法都会分叉;但协议消费不分叉——DSH 官方为非浏览器壳预留了 DSH_TRANSPORT 逃生舱,wire 契约(Typert RPC + 事件流)就是公开边界 |
| P2 | 协议即边界 | 客户端与 Host 之间只有三样东西:HTTP POST /api(Typert RPC)、两条只下行 WebSocket(/api/events.mux 与 /api/events.host)、named-stream 会话增量协议。原生端只依赖这三样,绝不 import 任何 @deepseek-ai/dsh-* 内部模块 |
| P3 | 数据驱动渲染 | 会话状态以 session projection 整体值 JSON 下发(todo、goal、plan、工具卡片数据),schema 校验、last-wins;DSH 官方明确「rendering belongs to the slot system」。原生端实现通用投影渲染器:官方新增工具/领域 → 新 key 进来 → 已知 key 用专属卡片、未知 key 用通用 JSON 卡片降级显示,不崩、不白屏、不阻塞升级 |
| P4 | 运行时可插拔 | npm i -g @deepseek-ai/dsh@latest + 重启 = 整个后端与协议实现立即最新(web bundle 全是 CLI 包的依赖)。运行时升级走独立通道 + 冒烟测试 + 自动回滚(移植 macOS 版已验证的升级管家) |
以下清单来自本机 @deepseek-ai/dsh@0.1.1-rc.2 安装的 dsh-client-ui-* 模块族实测盘点,是原生端的功能对齐基线。
| 功能域 | Web GUI 已实现(来源包) | 原生端实现 | 优先级 |
|---|---|---|---|
| 会话列表/恢复 | dsh-client-ui-sidebar | 原生侧栏(会话列表、标题、按工作区分组) | P0 |
| 对话主视图 | dsh-client-ui-conversation | 原生消息流(LazyForEach 虚拟滚动 + 流式增量) | P0 |
| 消息渲染 | dsh-client-ui-renderer | 自研 Markdown/代码高亮/图像渲染器(见 5.3) | P0 |
| 工具调用卡片 | dsh-client-ui-tool | 通用工具卡片框架 + 常用工具专属卡片(见 5.4) | P0 |
| 用户提问/审批 | dsh-client-ui-user-questions | 原生审批弹层(选项/多选/自由输入) | P0 |
| 会话中断/继续 | conversation 内 | 停止按钮 + 恢复 | P0 |
| 附件上传 | dsh-client-ui-attachment | 系统文件选择器 + 图像预览 | P1 |
| 文件引用 | dsh-client-ui-reference | @文件 引用与点击回跳 | P1 |
| 权限预设 | dsh-client-ui-permission-presets | 审批策略选择(workspace-write/ask 等) | P1 |
| 计划模式 | dsh-client-ui-plan | 计划审批流(exit_plan_mode 全屏计划卡片) | P1 |
| Todo 列表 | dsh-tool-todo 投影 | 投影驱动的任务清单卡片 | P1 |
| 目标 Goal | dsh-client-ui-goal | 目标状态卡片(轮次/阶段/blocked) | P1 |
| 子代理 | dsh-client-ui-subagent | 子代理面板(列表/追问/中断) | P1 |
| 后台任务 | dsh-client-ui-jobs | 任务中心(读取输出/终止) | P1 |
| 工作流 | dsh-client-ui-workflow-run | 工作流运行视图(阶段进度) | P2 |
| 技能 | dsh-client-ui-skill | 技能加载状态展示 | P2 |
| 目录选择 | dsh-client-ui-directory-picker | 系统目录选择器(FSPicker) | P1 |
| 工作区切换 | dsh-client-ui-workspace | 工作区管理与状态 | P1 |
| Agent 预设 | dsh-client-ui-agent-preset | 预设选择(code/standard/minimal/cordis) | P1 |
| 模型选择 | dsh-client-ui-model-selection | 替换为只读「模型信息」(见 6) | — |
| 消息反馈 | dsh-client-ui-message-feedback | 点赞/点踩 + 反馈提交 | P2 |
| 轨迹视图 | dsh-client-ui-trajectory | 详情侧栏(完整工具轨迹/参数/结果) | P1 |
| 交付物 | dsh-client-ui-deliverables | 产出文件列表与直达 | P2 |
| 斜杠命令 | dsh-client-ui-commands | 输入框命令触发器 | P1 |
| 设置-通用 | dsh-client-ui-settings-general | 原生设置页 | P1 |
| 设置-插件 | dsh-client-ui-settings-plugins | 插件面板(转发 dsh plugin 命令,流式输出) | P2 |
| 设置-模型 | dsh-client-ui-settings-models | 锁定展示(见 6) | — |
| 主题 | dsh-client-ui-theme | 深色/浅色/跟随系统 | P1 |
| 布局 | dsh-client-ui-layout | 三栏自适应 + 自由窗口 | P1 |
| 本地化 | dsh-client-locale | 中/英 | P2 |
| 升级管家 | (macOS 薄壳版已实现) | 运行时升级中心(见 4.2,移植已验证设计) | P0 |
通信协议(原生客户端要实现的全部):
Host 侧:
OpenHarmony 侧(来自 dsh-ohos-patch 2026-08 实测):
+---------------------------------------------------------------+ | DSH Harmony(原生 App,ArkTS/ArkUI) | | | | +---------------------------------------------------------+ | | | UI 层:页面/组件(会话流、工具卡片、审批、设置、升级中心) | | | | ArkUI 声明式 + ObservedV2 状态 + LazyForEach 虚拟滚动 | | | +--------------------------+------------------------------+ | | +--------------------------+------------------------------+ | | | 视图模型层:SessionViewModel / ConnectionState / | | | | ApprovalQueue / TodoGoalPlanStore(订阅投影帧) | | | +--------------------------+------------------------------+ | | +--------------------------+------------------------------+ | | | 协议适配层(Protocol Adapter,本方案核心资产) | | | | - transport:HTTP POST /api + WS 下行x2 + 重连/代际管理 | | | | - typert:RPC 信封编解码、命名参数、AbortSignal 取消 | | | | - projections:投影帧解析 → 状态分发(已知 key/通用降级) | | | | - adapters:DshVersionAdapter 注册表(按 host 版本选择) | | | | - capabilities:host.describe 能力协商 → UI 特性开关 | | | +--------------------------+------------------------------+ | | +--------------------------+------------------------------+ | | | 运行时管理层(Runtime Manager,移植 macOS 版已验证设计) | | | | - Supervisor:探测/拉起/守护 Host,就绪探测,崩溃退避重启 | | | | - Updater:盯 npm 发版 → 升级 → 冒烟 → 无感重启 → 回滚 | | | | - EnvironmentDoctor:Node/hnp/网络/磁盘体检与修复引导 | | | +--------------------------+------------------------------+ | +-----------------------------+---------------------------------+
| loopback: HTTP POST /api + WSx2
+-----------------------------+---------------------------------+ | DSH Host(官方代码,黑盒资产,绝不修改) | | node(hnp) + @deepseek-ai/dsh(npm/npmmirror 安装) | | dsh web --port 0 --host 127.0.0.1(端口从 stdout 解析) | | profile: ~/.dsh/profiles/web(含本产品的锁定补丁层,见 6) | +-----------------------------------------------------------------+
鸿蒙三方 App 的沙箱对 spawn 任意子进程存在策略限制(2026-08-23 已由 SDK 源码证实,见附录 B),因此采用双轨托管:
| 模式 | 做法 | 适用 |
|---|---|---|
| Attach(默认) | App 启动时探测 127.0.0.1 端口段的健康 dsh(GET / + host.describe),健康则直接复用 | 用户已在 hnp 终端跑着 dsh;或已安装我们的常驻服务 |
| Guided Service(首启向导) | 首启向导引导用户在 hnp 终端执行一条我们生成的安装命令,安装「DSH Host 常驻服务」(ohos 下的 daemon 脚本 + dsh 运行时),此后开机自启,App 永远 attach | 大多数用户 |
| SDK 源码证实 childProcessManager 仅支持 ArkTS 同步子进程,无法拉起 node 二进制(附录 B,2026-08-23) | 除非未来官方开放受限进程能力,否则不再评估 |
双轨设计与 macOS 薄壳版 Supervisor 的「attach 优先、否则 spawn」策略同构,代码可平移。移植清单必含 macOS 0.2.1 实战修复:spawn 前重解析 dsh 路径(npm 升级重写 bin 链接的窗口期竞态)、ENOENT 每 3 秒重试最多 5 次、childEnv() 最小 PATH 增强(hnp 环境同样存在此问题)。
用户输入 → POST /api session.send → Host 组装请求 → 指定模型(见 6)→ 流式响应 → events.mux 帧下推 → 协议适配层解码 → SessionViewModel 增量上屏;工具调用 → 投影帧 session/projection(工具卡片整体值)→ ToolCardStore → 卡片渲染;需要审批 → user-questions 事件 → ApprovalQueue → 原生弹层 → POST /api 应答;todo/goal/plan 变化 → 各自投影 key → 对应卡片实时刷新。
官方发版 @deepseek-ai/dsh@x.y.z 之后:
这是原生方案区别于「WebView 薄壳」的最大工程投入,也是「随时升级」的保险:
保留一个隐藏的「兼容模式」入口:内置 ArkUI Web 组件加载本地 Host 的官方 Web UI。仅当契约测试未覆盖的极端 breaking change 发生时,用户可临时切到官方 UI 保证可用,同时我们发适配版本。这保证最坏情况下产品仍可用,且该路径加载的仍是官方随 npm 升级的 UI(不分叉)。
主窗口(三栏,自由窗口/可最大化):
弹层:审批问答(ask_user_question:选项/多选/自由输入) 独立窗口:设置(通用/运行时升级中心/插件/凭据/账户占位)、工作流运行视图 系统级:通知(升级完成/审批等待/任务完成)、托盘/任务栏常驻(可选)
ToolCardRegistry:
每张卡片:运行中(进度/耗时)→ 完成(可展开详情至右栏轨迹)→ 失败(错误高亮 + 重试语义提示)。
| 页 | 内容 |
|---|---|
| 通用 | 语言、主题、开机自启、端口策略、缓存管理 |
| 运行时升级中心 | dsh 版本、检查更新、自动升级开关、版本史/回滚、冒烟日志 |
| 模型信息 | 只读:指定模型名称、provider、上下文窗口、thinking 开关状态(见 6) |
| 插件 | 插件清单(pluginInventory RPC)+ 安装/卸载(转发 dsh plugin,终端式流式输出面板) |
| 凭据 | Asset Store 加密存储;API Key 录入/清除(credentials.set/unset);为支付预留:凭证可由计费网关下发(见 7) |
| 账户(占位) | 后续支付阶段启用(见 7) |
在产品 profile 的补丁层(~/.dsh/profiles/web/cordis.patch.yml,我们首启向导生成)固定:
id: llm-deepseek name: '@deepseek-ai/dsh-llm-deepseek' config: baseURL: <指定端点,由运行时管理器注入> # 官方 API 或自建 OpenAI 兼容网关 models: ['<指定模型ID>'] # 白名单 = 唯一可选 reasoningEffort: high thinking: enabled
若指定模型是 DeepSeek 官方 → 直接 dsh-llm-deepseek
若是第三方 OpenAI 兼容端点(含后续计费网关)→ 同一 provider 配 baseURL 即可,官方 adapter 原生支持
API Key:不落明文,Asset Store 加密 → 启动 Host 时经受控环境变量注入(apiKeyEnv)
UI:隐藏 model-selection 与 settings-models 的编辑能力,替换为只读「模型信息」页(P1 中完成)
指定模型为「计费网关换发凭证」留好了位置:baseURL 指向我们的网关,网关鉴权用户订阅 → 转发官方 API → 凭证由第 7 节的 Billing 服务下发。用户无感、DSH 零改动。
2026-08-24 更新:本章占位设计已被完整商业化方案取代——见 COMMERCIALIZATION-PLAN.zh.md(账号体系/模型订阅/云同步/支付双通道/合规清单)。§1.2 中「不做云同步、多用户」的 Non-goal 在 M5 商业化阶段解除(商业化层为纯增量,本地模式与 BYOK 永久保留)。
| 维度 | 选型 | 理由 |
|---|---|---|
| IDE/SDK | DevEco Studio 26;compatibleSdkVersion 6.0.0(20)(HarmonyOS 6.0)/ targetSdkVersion 26.0.0(HarmonyOS 7) | 已定稿落地并编译验证;API 21+ 能力(如 HarmonyOS 7 悬浮窗)仅作增强,基础功能不依赖 |
| 语言/UI | ArkTS + ArkUI(Stage 模型) | 方案C 本体 |
| 状态 | ObservedV2/Trace + MVVM | 大列表细粒度更新 |
| 网络 | ohos.net.http(RPC)+ ohos.net.webSocket(下行x2) | 协议适配层自建重连/代际 |
| 持久化 | RelationalStore(会话索引缓存)+ Preferences(设置) | 真相在 Host(~/.dsh),端侧只做缓存 |
| 凭据 | Asset Store(硬件级密钥库) | 见 6 |
| JSON/校验 | 自研轻量 schema validator(对齐投影 wire schema) | L2 契约 |
| 构建/分发 | hvigor CLI(scripts/build.sh,环境配方见 knowledge-base/build-recipe.md)+ 自动签名已通;侧载起步 → 应用市场 | 已跑通签名 HAP 产出 |
工程结构:
dsh-harmony/ entry/ # 主 App
src/main/ets/
app/ # UIAbility 入口、生命周期、窗口管理
pages/ # 主窗口/设置/工作流
components/ # MessageList、ToolCard/*、ApprovalSheet 等
viewmodel/ # 会话/连接/审批/投影 Store
protocol/ # 协议适配层(3.1,独立无 UI 依赖,可单测)
transport/ typert/ projections/ adapters/ capabilities/
runtime/ # Supervisor/Updater/EnvironmentDoctor
platform/ # 通知、Asset、文件、深链
common/
contract-tests/ # Node 工程:版本矩阵契约测试(4.3)
fixtures/ # 录制的事件流样本
matrix/ # dsh 版本 x 协议层报告
docs/
protocol/ 与 runtime/ 零 UI 依赖,可在 DevEco 单测环境 + Node 侧 contract-tests 双侧回归,是升级保险的载体。
v1.0 的 M0-M5 单线人力排期(16 周)已作废。现行路线为双速:工期估算模型(假设、P50/P90、关键路径、不可压缩项)见 SCHEDULE-AND-DECISIONS.zh.md 第 3 节。
分支策略:git main = 壳版发布线(Web 组件加载官方 UI + Supervisor 托管,抢鸿蒙首发卡位);feature/protocol-native = 协议原生线(本方案 3-5 章全部设计)。协议 fixture 录制(本机 Mac 自主)与壳版 UI 开发真并行;原生模块逐个合流替换壳内 Web 视图——壳即 4.5 节 WebView 逃生舱,一石二鸟。
| 阶段 | 工期 P50 | 交付 | 验收标准 |
|---|---|---|---|
| P0 链路 Spike | 3-5 天 | 协议 fixture 录制(本机 dsh web + Playwright);ArkTS HTTP+WS 客户端编译+单测;模拟器 Web 组件加载 dsh web 跑通(端口转发方案验证);hnp 常驻服务自启方式验证(真机) | 技术不确定性清零 |
| P1 Web 壳首发版 | 6-9 天 | 工程骨架+Web 组件+生命周期;Supervisor(attach 探测 DSH_BOOT + 端口策略 + 首启向导 + 0.2.1 移植清单);daemon 控制通道 + 升级管家 v1(手动升级+冒烟回滚);托盘/通知/签名打包 | 模拟器+真机可安装可演示(鸿蒙首发卡位) |
| P2a 协议适配层 | 4-6 天 | Typert 编解码+投影分发+重连代际+契约 fixtures 全量+单测(90% 覆盖目标) | 协议层 DevEco/Node 双侧回归通过 |
| P2b 原生会话体验 | 8-10 天 | 消息流/Markdown 渲染器(最大单体)/工具卡片框架/审批弹层 | 日常可用,原生界面替换壳版主视图 |
| P2c 功能完整 | 4-6 天 | todo/goal/plan/子代理/jobs/附件引用/目录选择/设置/主题 | 对照 2.1 清单 P0+P1 全绿 |
| P2d 升级体系 | 3-4 天 | 契约矩阵 CI+版本适配器+能力协商+自动升级 | 官方发版 24h 内适配闭环演练通过 |
| P2e 打磨发布 | 3-4 天 | 性能(万级事件会话)/异常恢复/本地化/分发 | 7x24 attach 稳定(代际重建覆盖) |
| P3 支付阶段 | 后续另立方案 | 第 7 节全量实现 + 计费网关 | — |
全程 P50 约 7-9 周(首发壳版 2-3 周内交付)。
| # | 风险 | 等级 | 对策 |
|---|---|---|---|
| R1 | 鸿蒙 App 内无法 spawn node 子进程 | 已落定(原评级:高) | 2026-08-23 SDK 源码证实(附录 B):childProcessManager 仅支持 ArkTS 同步子进程。双轨托管(Attach + Guided Service)为唯一主路线;残余不确定性收窄为 hnp 常驻服务自启方式(P0 真机验证项) |
| R2 | Typert 协议无公开稳定性承诺(developer preview) | 高 | 契约矩阵 + 适配器 + 能力降级 + WebView 逃生舱(4),四层防御 |
| R3 | ArkTS 严格类型与 wire 动态 JSON 冲突 | 中 | 协议层收口为 JsonValue discriminated union + 生成式类型;卡片数据层 schema 校验先行 |
| R4 | Markdown 流式渲染性能(长代码块) | 中 | 分片缓冲 + 节流重排 + 只高亮可视区(M4 专项) |
| R5 | node-pty 缺失 → 无嵌入式终端 | 低 | Non-goal;命令输出以卡片形式完整展示;跟进 dsh-ohos-patch 的 PTY 适配进展 |
| R6 | rc 版本破坏性变更导致升级失败 | 中 | 冒烟 + 自动回滚 + 版本锁定选项(已验证模式平移) |
| R7 | npmmirror 与官方 registry 的包差异(esbuild shim 等) | 低 | 升级管家 pin 住已验证镜像路由;契约测试含安装冒烟 |
| R8 | 鸿蒙 PC API 迭代(桌面能力仍在快速演进) | 中 | UI 层隔离平台能力到 platform/;最低 API 已定为 6.0.0(20),模拟器(API 26)无法验证 20 行为差异——编译期 compatible 检查作 CI 门禁 + 运行时 canUse 探测 + MatePad Edge 真机回归三重保障;HarmonyOS 7 悬浮窗等新能力仅作增强 |
方案C 的可行性建立在四个已验证的事实上:一,DSH wire 协议是明确的公开边界且官方为非浏览器壳预留了接入设计;二,会话状态以 schema 校验的整体值投影下发,天然适配「通用渲染 + 降级」;三,DSH 后端已在 OpenHarmony arm64 实测跑通(Node hnp + esbuild WASM);四,「运行时升级管家」模式在 macOS 薄壳版上已经落地验证,可直接平移。
因此:全原生 ArkUI 界面 + 协议适配层 + npm 通道运行时升级三者组合,可以在不 fork 任何官方代码的前提下,实现「原生体验」与「随官方随时升级」兼得。R1(App 内进程托管)已于 2026-08-23 落定(否定 In-App Spawn,双轨托管即主线);最大工程投入是协议契约体系(4.3),它同时是本产品相对社区桌面方案的核心壁垒——竞品调研(COMPETITIVE-RESEARCH.zh.md)证实:协议原生路线全网无先例,鸿蒙赛道完全空白,头部竞品 anywhere-labs(18.7k star)的「锁定固定版本」模式正是我们升级模型的打击面。
| 日期 | 版本 |
|---|---|
| 2026-08-10 | 0.0.1-rc.1(首发) |
| 2026-08-11 | 0.0.1-rc.2 |
| 2026-08-12 | 0.0.1-rc.5 |
| 2026-08-13 | 0.1.0-rc.2 / rc.3 / rc.6 |
| 2026-08-17 | 0.1.0-rc.7 |
| 2026-08-19 | 0.1.0-rc.8 |
| 2026-08-21 | 0.1.1-rc.1 / rc.2 |
11 天 10 个版本(约每日一发);项目处于 0.x-rc(developer preview),0.x 阶段 SemVer 惯例允许 minor 位承载破坏性变更(0.0.1→0.1.0→0.1.1 两次 minor 跳位均在一周内)。
结论:不应以「协议冻结」为架构假设下注;应按「增量必然、破坏高频但有界」建模。契约测试体系是本方案中性价比最高的保险,不可因乐观而裁剪。
本地 SDK 26.0.0 的 @ohos.app.ability.childProcessManager.d.ts 源码阅读结论:官方子进程 API 仅支持启动 ArkTS 源码子进程(srcEntry 为 .ets 文件),且子进程只支持同步 ArkTS API、不能拉起任意二进制(node)。因此 3.2 节的 In-App Spawn 路线基本被否定,双轨托管(Attach + Guided Service)确定为唯一主路线,M0 验证项相应收窄为:hnp 终端常驻服务的开机自启方式。
同日竞品调研(见 COMPETITIVE-RESEARCH.zh.md):全网不存在任何鸿蒙版 DSH 客户端,先发窗口以月计;头部桌面竞品 anywhere-labs(18.7k star,Electron 壳 + 锁定固定版本)因 Electron 在鸿蒙不可用,进入鸿蒙需整体重写壳。协议原生路线全网无先例——既是独占壁垒也是无先例可抄的风险。