# DSH 鸿蒙 PC 原生客户端开发方案(方案 C:ArkUI 全原生) > 版本: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(竞品调研) --- ## 0. 状态板(2026-08-23) | 项 | 状态 | |---|---| | 工程 | ✅ /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 | --- ## 1. 项目概述 ### 1.1 目标 1. 全原生体验:用 ArkTS/ArkUI 重写 DSH Web GUI 的完整功能(非 WebView 嵌套),获得鸿蒙 PC 原生窗口管理、多窗口、通知、系统集成。 2. 随官方升级(第一优先级):DSH 官方发版后,客户端可在小时级内完成跟进,且不需要重新发版安装包——原生端零分叉官方代码,只消费官方 wire 协议;Host 运行时作为可热替换资产独立升级。 3. 指定模型:模型与 provider 在配置层锁定,UI 只读展示,不提供模型切换。 4. 支付界面(后续阶段):预留账户/计费/支付的模块边界与接口,本期只做架构占位。 ### 1.2 Non-goals(明确不做) - 不 fork / 不内嵌 / 不重新分发任何官方 UI 代码(这是「随官方升级」永远成立的前提) - 不替代 dsh 的 profile / 插件体系,只做托管、转发与展示 - 不做云同步、多用户(本期) - 不做嵌入式交互终端(node-pty 在 ohos 未适配,见第 10 节风险) ### 1.3 核心设计原则(四条,全部来自已验证的架构事实) | # | 原则 | 架构依据(已在本机源码确认) | |---|---|---| | 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 版已验证的升级管家) | --- ## 2. 依据:DSH 本地产品已实现功能盘点 以下清单来自本机 @deepseek-ai/dsh@0.1.1-rc.2 安装的 dsh-client-ui-* 模块族实测盘点,是原生端的功能对齐基线。 ### 2.1 功能全景 → 原生端映射 | 功能域 | 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 | ### 2.2 关键架构事实(全部实测确认) 通信协议(原生客户端要实现的全部): - 一元/应答调用:HTTP POST /api,Typert RPC 信封(InvocationDescriptor:精确命名参数 + 严格 codec 校验) - 事件下行:/api/events.mux 与 /api/events.host 各一条只下行 WebSocket,客户端不上行应用数据;任一断开即连接代际失效、重建两条流 - 就绪握手:两条 WS 打开 + host.describe HTTP 调用成功 → onConnected,并发布 host 能力描述 - 会话增量:独立的 named-stream 协议(同连接承载);投影帧 session/projection(整体值、schema 校验、last-wins) - 信任围栏:/api 要求 Host 为 loopback 或 trustedHosts 成员(DNS-rebinding 防御)→ 本方案 Host 永远跑在本机 loopback,天然满足 Host 侧: - 会话持久化于 ~/.dsh/sessions(按工作区分片),服务重启不丢;历史读取走 api-proxy history tail 分页 - SIGINT/SIGTERM 有界优雅停机(5 秒)→ 可被安全托管 - profile(~/.dsh/profiles/web)只引用 bundle 名,解析到 CLI 安装目录的 node_modules;用户插件在 profile 自己的 node_modules,升级不影响 - LLM 配置:dsh-llm-deepseek(baseURL/apiKeyEnv/models/thinking 全部可配)+ dsh-llm-pi-ai;凭据走 ctx.credentials(credentials.set/unset/describe RPC) OpenHarmony 侧(来自 dsh-ohos-patch 2026-08 实测): - Node v24.13.0(hnp,HarmonyOS 官方构建)可跑完整 DSH:pnpm install 全量成功、bin/dsh --help PASS - esbuild/oxc 均有 openharmony-arm64 WASM shim 变体,transform 可用;原生 ELF 不可在用户分区执行 → 只走 WASM 路线 - node-pty 无 prebuild → PTY 终端功能不可用(本期 Non-goal) --- ## 3. 总体架构 ### 3.1 分层架构图 +---------------------------------------------------------------+ | 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) | +-----------------------------------------------------------------+ ### 3.2 Host 托管模型(鸿蒙关键决策) 鸿蒙三方 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 | 大多数用户 | | ~~In-App Spawn~~(已否定) | 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 环境同样存在此问题)。 ### 3.3 数据流(一次对话的完整链路) 用户输入 → POST /api session.send → Host 组装请求 → 指定模型(见 6)→ 流式响应 → events.mux 帧下推 → 协议适配层解码 → SessionViewModel 增量上屏;工具调用 → 投影帧 session/projection(工具卡片整体值)→ ToolCardStore → 卡片渲染;需要审批 → user-questions 事件 → ApprovalQueue → 原生弹层 → POST /api 应答;todo/goal/plan 变化 → 各自投影 key → 对应卡片实时刷新。 --- ## 4. 随官方升级机制(核心章节) ### 4.1 升级的三个层面 官方发版 @deepseek-ai/dsh@x.y.z 之后: - L1 运行时升级:npm 通道,小时级跟进,无需 App 发版——覆盖后端全部能力 - L2 协议契约:契约测试矩阵 + 版本适配器 + 能力协商——保证原生端不被 breaking change 打死 - L3 表现层:投影驱动的通用渲染 + 降级策略——新工具/新领域自动可渲染 ### 4.2 L1:运行时升级管家(移植已验证的 macOS 设计) - 发现:定时 npm view @deepseek-ai/dsh dist-tags(走独立 cache 目录;鸿蒙侧经 hnp npm,registry 用 npmmirror),启动时 + 每 6h(可配 1h/6h/24h)+ 手动 - 执行:npm install -g @deepseek-ai/dsh@(hnp 全局 prefix,无需提权),不动 profile 与用户插件 - 生效:SIGTERM 优雅停机 → 重新拉起/通知常驻服务重启 → 就绪探测(两条 WS + host.describe)通过 → UI 重连 - 冒烟与回滚:升级后 60s 内服务起不来(rc 版本可能有破坏性变更)→ 自动回装旧版本 → 通知用户;版本史保留最近 5 个版本可手动切换 - UI:设置内「运行时升级中心」——当前版本、可升级版本、升级日志、自动升级开关 ### 4.3 L2:协议契约测试 + 版本适配器 这是原生方案区别于「WebView 薄壳」的最大工程投入,也是「随时升级」的保险: 1. 契约快照仓库(Node 工程,独立于 App):对每个 dsh 版本启动真实 Host,录制: - host.describe 全量输出 - 全部 RPC 端点的 InvocationDescriptor(参数名/schema) - 会话事件流样本(一次含工具调用/审批/todo/图像的标准对话,录制成 fixture) 2. 版本矩阵 CI:官方每发版自动跑 [新版本] x [当前 App 协议层],产出兼容性报告(绿/黄/红) - 绿 → 升级管家放开该版本 - 黄(新增端点/新增投影 key)→ 原生端自动降级路径覆盖,排期跟进专属卡片 - 红(参数改名/语义变更)→ 写一个 DshVersionAdapter(纯映射层),App 发小版本 3. 运行时适配器注册表:adapters/vN.ts 按 host.describe 的版本信息选择;adapter 只做字段改名/信封转换,绝不掺业务 4. 能力协商:连接成功后以 host.describe 输出驱动 UI 特性开关(capability absent → 隐藏入口,不报错) ### 4.4 L3:投影驱动的通用渲染 - 已知投影 key(todo/goal/plan/工具卡片)→ 专属原生卡片 - 未知 key → 通用 JSON 卡片(折叠、语法高亮、复制)——官方任何新增领域立即可见、不阻塞 - 工具卡片按「工具名 → 卡片组件」注册表渲染;未注册工具名 → 通用卡片(参数表 + 结果 diff/文本 + 状态) - 每张卡片的数据层 schema 校验失败 → 降级为原始 JSON 展示,绝不整页崩溃 ### 4.5 WebView 逃生舱(兜底,非日常路径) 保留一个隐藏的「兼容模式」入口:内置 ArkUI Web 组件加载本地 Host 的官方 Web UI。仅当契约测试未覆盖的极端 breaking change 发生时,用户可临时切到官方 UI 保证可用,同时我们发适配版本。这保证最坏情况下产品仍可用,且该路径加载的仍是官方随 npm 升级的 UI(不分叉)。 --- ## 5. 原生功能模块设计 ### 5.1 页面与导航 主窗口(三栏,自由窗口/可最大化): - 左栏:会话列表(当前工作区分组 + 搜索 + 新建) - 中栏:会话主视图(消息流 + 输入区) - 消息流:流式 Markdown、工具卡片、审批卡片、todo/goal/plan 卡片 - 输入区:多行输入、附件、@引用、斜杠命令触发器、发送/中断、权限预设选择、Agent 预设选择、计划模式开关 - 右栏(可收起):轨迹详情(选中工具调用的完整参数/结果)、子代理/任务面板 弹层:审批问答(ask_user_question:选项/多选/自由输入) 独立窗口:设置(通用/运行时升级中心/插件/凭据/账户占位)、工作流运行视图 系统级:通知(升级完成/审批等待/任务完成)、托盘/任务栏常驻(可选) ### 5.2 会话与消息流 - 消息模型:MessageItem[] 分片状态(ObservedV2),流式 delta 只更新尾部 item 的富文本缓冲,避免整列表重绘 - 虚拟滚动:List + LazyForEach,长会话(数千事件)内存平稳;滚动到顶触发 history tail 分页拉取 - 会话恢复:attach 已有会话走 history 分页 + 投影快照对齐 asOfSeq - 中断:RPC 取消(Typert 原生 AbortSignal 语义)+ UI 立即冻结输入区 ### 5.3 Markdown/代码渲染器(自研,工作量最大单体) - Markdown → ArkUI 节点树的两遍解析器(块级:标题/列表/代码块/引用/表格;行内:粗斜/链接/行内码) - 代码高亮:自研 tokenizer(TS/JS/JSON/YAML/Bash/Python/Md),流式期间高亮节流(150ms 批量重排) - 图像:Image 组件 + 本地缓存;附件图像直读 - 官方消息内特殊语法(文件引用、折叠结果)走协议层识别后转原生组件 ### 5.4 工具卡片框架 ToolCardRegistry: - bash/execute → 命令行卡片(等宽字体、退出码、截断展开) - read/write/edit → 文件卡片(路径、行号范围、diff 视图) - grep/glob → 检索卡片(命中列表、计数) - web_search → 结果卡片(标题/链接/摘要) - subagent → 子代理卡片(状态、输出摘要) - default → 通用卡片(参数 KV 表 + JSON 结果折叠展示) 每张卡片:运行中(进度/耗时)→ 完成(可展开详情至右栏轨迹)→ 失败(错误高亮 + 重试语义提示)。 ### 5.5 审批与用户问答 - Host 下发 user-question 事件 → 全局 ApprovalQueue → 模态弹层(单选/多选/自由文本,带推荐项标记) - 应答走 RPC 应答通道;排队期间输入区禁用并发对话 - 权限预设变化(ask→workspace-write 等)即时生效于下次工具执行 ### 5.6 计划模式 / Todo / Goal - 三者均为投影 key:plan.active、todo 列表、goal 快照 → 各自专属卡片,整体值刷新、无增量合并复杂度 - 计划审批:exit_plan_mode 触发全屏计划卡片(Markdown 渲染 + 批准/继续规划) ### 5.7 子代理 / Jobs / 工作流 - 子代理面板:代理树(父子关系)、状态(running/idle/ready)、send_message 追问输入、interrupt 按钮 - Jobs:任务列表 + 输出流式查看 + kill - 工作流:阶段进度条(phase 标题)+ 阶段内代理计数 + 失败项定位 ### 5.8 附件 / 引用 / 目录选择 - 附件:系统 FilePicker → 上传通道(RPC 附件端点)→ 消息内预览 - 引用:输入 @ 触发文件浏览(走 fs 检索 RPC);消息内引用点击 → 定位文件 - 目录选择:优先 DirectoryPickerNative(系统 FSPicker);不可用时降级 browse 模式(树形浏览 RPC) ### 5.9 设置中心 | 页 | 内容 | |---|---| | 通用 | 语言、主题、开机自启、端口策略、缓存管理 | | 运行时升级中心 | dsh 版本、检查更新、自动升级开关、版本史/回滚、冒烟日志 | | 模型信息 | 只读:指定模型名称、provider、上下文窗口、thinking 开关状态(见 6) | | 插件 | 插件清单(pluginInventory RPC)+ 安装/卸载(转发 dsh plugin,终端式流式输出面板) | | 凭据 | Asset Store 加密存储;API Key 录入/清除(credentials.set/unset);为支付预留:凭证可由计费网关下发(见 7) | | 账户(占位) | 后续支付阶段启用(见 7) | --- ## 6. 模型指定方案 ### 6.1 锁定层级(配置层锁定,UI 层只读) 在产品 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 中完成) ### 6.2 与支付的关系(前瞻) 指定模型为「计费网关换发凭证」留好了位置:baseURL 指向我们的网关,网关鉴权用户订阅 → 转发官方 API → 凭证由第 7 节的 Billing 服务下发。用户无感、DSH 零改动。 --- ## 7. 支付界面(后续阶段,本期只做架构预留) > **2026-08-24 更新:本章占位设计已被完整商业化方案取代**——见 [COMMERCIALIZATION-PLAN.zh.md](COMMERCIALIZATION-PLAN.zh.md)(账号体系/模型订阅/云同步/支付双通道/合规清单)。§1.2 中「不做云同步、多用户」的 Non-goal 在 M5 商业化阶段解除(商业化层为纯增量,本地模式与 BYOK 永久保留)。 ### 7.1 模块边界(本期定义接口 + 入口占位,不实现) - AccountService:登录态、用户资料(后续:手机号/华为账号) - BillingService:套餐、余额、用量、订单列表(后续:对接计费网关) - PaymentProvider 支付抽象(后续实现): - HuaweiIapKit:华为应用内购买(订阅制首选) - WeChatPayOhos:微信支付鸿蒙 SDK - AlipayOhos:支付宝鸿蒙 SDK ### 7.2 后续方案的商业模式假设(待定稿) - 订阅制(月/年)或按量套餐 → 网关换发模型访问凭证(见 6.2) - 设置页「账户」入口本期渲染为「即将上线」占位;协议层预留 billing.* RPC 命名空间(打到我们自己的云端,不走 dsh Host) --- ## 8. 技术选型与工程结构 | 维度 | 选型 | 理由 | |---|---|---| | 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 双侧回归,是升级保险的载体。 --- ## 9. 路线图(v1.1:双速计划,2026-08-23 定稿) > 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 周内交付)**。 --- ## 10. 风险与对策 | # | 风险 | 等级 | 对策 | |---|---|---|---| | 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 悬浮窗等新能力仅作增强 | --- ## 11. 测试与质量保障 1. 协议层单测(DevEco):信封编解码、重连代际、投影分发、schema 降级——目标 90%+ 覆盖(升级保险的核心资产) 2. 契约矩阵(Node CI):dsh 版本 x 协议层全组合冒烟 + fixture 回放(4.3) 3. UI 快照测试:关键卡片(bash/edit/审批/todo)渲染快照,防样式回归 4. 端到端剧本:Playwright 驱动官方 Web UI 与原生端同剧本对照(同一 Host,双客户端一致性) 5. 升级演练:每次官方发版,在测试机演练「升级→冒烟→回滚」全链路 6. 稳定性 soak:7x24 attach + 周期性代际断连注入 --- ## 12. 结论 方案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)的「锁定固定版本」模式正是我们升级模型的打击面。 --- ## 附录 A:协议稳定性评估(基于官方发版数据,2026-08-22 核实) ### 发版节奏(npm registry 实测) | 日期 | 版本 | |---|---| | 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 跳位均在一周内)。 ### 判断 1. **增量变更(新增端点/投影 key/事件)**:随每个功能版本必然发生(概率 ~100%)。已被 4.4 通用渲染 + 能力协商设计为零成本吸收(未知 key 降级显示,不阻塞不崩溃)。 2. **破坏性变更(改名/语义变化/移除)**:rc 阶段**高频**——依据:官方文档明确 preview 期会有破坏性变更;源码可观察到协议迁移正在进行中(api-remotes 中「legacy API Proxy 方法与已迁移 Typert 方法共存」);各协议包普遍存在「Deferred Work」清单。估计:每两周窗口内消费面被波动的概率 40–60%;一个季度累计接近必然。 3. **1.0 之后**:官方已内建契约纪律(严格 codec 校验、stateVersion 失效锚点、「撤回已观察的严格定义会显式失败而非静默弱化」),且浏览器/进程内/worker 三种传输消费者共存形成自我制衡——破坏性变更预计降至个位数百分比/版本。 ### 对目标的影响 - 若协议长期不变:第 4.3 节契约体系退化为纯回归守卫,M3 由 3 周缩至约 1 周,维护成本趋零——目标全部可达。 - 若协议如预期频繁演进:破坏性变更的影响被四层防御限定在「局部降级 + O(天) 适配」范围,目标仍可达,代价是持续的协议适配人力(预估每两周 0.5–2 人日)。 **结论:不应以「协议冻结」为架构假设下注;应按「增量必然、破坏高频但有界」建模。契约测试体系是本方案中性价比最高的保险,不可因乐观而裁剪。** --- ## 附录 B:R1 风险调研进展(2026-08-23,本地 SDK 源码判定) 本地 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 在鸿蒙不可用,进入鸿蒙需整体重写壳。协议原生路线全网无先例——既是独占壁垒也是无先例可抄的风险。