DeepSeek Harness 0.2.2-rc.1:手机端补齐了,但升级前先看那份迁移清单
2026 年 11 月 4 日 13:07,DeepSeek 放出了 dsh-v0.2.2-rc.1(提交 66491b0),这是 0.2.2 系列的第一个候选版本,汇总的是自 v0.2.1-rc.5 以来的变更。
先说结论:这一版的价值一半在功能,一半在它明确写出的「你得改什么」。
功能侧,拖延很久的手机/平板适配终于落地,Git 工作树从实验插件并入主流程,插件市场开始具备真正的分发能力(更新、回滚、富文本详情、失败诊断)。开发侧则是另一幅景象:Node 最低版本抬到 24.9,PTC 工具执行被拆成按 Agent 作用域选择的插件,SSH 协议从 2 升到 3,Session Projection 的注册接口改成异步。这些都不是「顺手升一下」的量级。
从 10 月 17 日的 v0.2.1-rc.1 到这版,中间隔了 18 天、5 个 RC,节奏一如既往地快。README 自己也写着 developer preview、会有破坏性变更——这版把这句话落实得相当彻底。
| 项目 | 内容 |
|---|---|
| 版本 | dsh-v0.2.2-rc.1(Pre-release) |
| 发布 | 2026-11-04 13:07,提交 66491b0 |
| 基线 | 自 v0.2.1-rc.5 起累计 |
| 规模 | 新增 13 项 / 优化 30 余项 / 修复 50 余项 / 其他变更近 30 项 |
| 运行时 | Node.js ≥ 24.9(旧版需先升级) |
| 许可 | MIT |
| 安装 | npx @deepseek-ai/dsh web(默认 127.0.0.1:3080) |
三条线同时在动
把上百条变更摊开看,脉络其实只有三条。
入口在变宽。手机、平板的软键盘、导航与窄屏布局一起重做,界面语言一次加了六种。DSH 原先是个桌面/Web 工具,这版之后它开始接受「躺着也能看一眼」的使用姿势。
协作在变深。引用插入、历史导出为 Markdown、Git 工作树、变更请求——这些都在回答同一个问题:agent 干活的过程,怎么让第二个人看得懂、接得住。
底座在重排。PTC 拆分、Session API 独立、Cordis 升到 4.1.0、pi-ai 升到 1.3.0、Node 24.9。这部分用户感知不到,但决定了插件作者接下来三个月要不要返工。
手机和平板:终于不是「勉强能用」
这是本次最实在的一条。改动覆盖三块:
- 软键盘交互:输入框被键盘顶起时的滚动、光标可见性、发送后的收起行为;
- 导航与窄屏布局:菜单和操作入口在窄屏下不再折叠到看不见,而是换位保留;
- 触屏与键盘混合操作:会话列表、侧栏都补了触屏路径,同时保留键盘快捷键。
配合后面几条体验优化,能看出是成套做的——侧栏搜索支持不区分大小写的会话 ID 子串匹配,同名工作区在选择器里显示最短的区分路径后缀(窄屏优先保留后缀),侧栏会话悬浮卡显示工作目录。这些都是「屏幕小、指头粗、同时开五个会话」时才会疼的地方。
一次加了日语、西班牙语、法语、德语、俄语和巴西葡萄牙语六套界面文案。这个动作和移动端适配放在同一版里,指向很明确。
输入框和会话:几个用起来会立刻有感的小改动
- 聊天文本作引用插入:选中一段助手回复,可以直接引用进输入框,发送后显示紧凑预览,不会把原文再糊一遍。
- 完整历史导出为 Markdown:整段会话导出,附带可用的原始日志路径。
- 工作步骤收起后保留全部助手文字:以前收起步骤会把中间的说明文字一起吞掉,现在保留,还能切到「仅最终回答」。
- 统一右键与键盘菜单:会话、工作区、侧栏共用一套,插件可以扩展。
- 文件预览常驻目录树:加文件定位,不用来回退回列表。
还有两条容易被忽略但影响手感的:
- 发送语义变了。消息要等宿主确认接收后才显示并清空草稿;发送期间输入框只读,失败时草稿、引用、附件全部保留。这是个正确的取舍——宁可多等半秒,也不要在弱网下丢掉一段刚写完的话。
- 图片改成进输入框就上传,发消息时复用已上传的结果,单张上限提到 50 MiB。
插件:从「能装」到「能分发」
这是我认为本次分量最重的一块,因为它决定生态能不能长出来。
| 变化 | 之前 | 现在 |
|---|---|---|
| 索引来源 | 「自定义插件市场」 | 「自定义插件索引」,读用户添加的索引文件 |
| 索引内容 | 无过滤 | 排除标记为 private 的版本、标签与默认分支包 |
| 第三方包更新 | 只能重装 | 支持更新,热更新失败会尝试恢复旧版本 |
| 详情页 | 纯文本 | 富文本详情 + 布局与导航改善 |
| 设置页图标 | 无 | 插件可自带导航图标,卸载后恢复默认 |
| 安装失败 | 报「未知错误」 | 完整诊断 + Host 日志入口,区分安装失败与启用失败 |
「市场」改叫「索引」是个耐人寻味的变化。市场暗示有个中心化的货架,索引则承认现实:插件分散在 npm、Git 和各种自托管仓库里,DSH 只负责读一份清单。配套的 prepare 脚本授权提示(安装含 prepare 脚本的 Git 插件时会显示授权与重试选项)、HTTPS 读不到时自动回退 SSH,都是同一个方向——承认插件来源很杂,然后把杂这件事处理干净。
Git 工作树:agent 开始管分支
实验性的「变更请求与工作树」这次正式成型,同时旧的独立插件「Git 工作树」被并入。
能力上有三层:
- 隔离:会话跑在独立的 Git 工作树里,不污染你正在编辑的那份;
- 审阅:可搜索的文件树 + 逐文件导航,本地 diff 和 PR diff 都能看;
- 回流:选中的代码和评论可以直接交给 Agent,检查与评审状态可跟踪。
配套修了几个相关的老问题:聊天里的相对文件链接现在按点击时会话的当前工作目录打开(进 worktree 后不再误开原项目文件),~ 和 ~/ 会被正确展开为宿主主目录(路径中间的 ~ 保持字面含义)。
顺手要提醒的迁移项:之前启用过独立插件的用户,需要手动从 profile 的 dsh.profile.bundles 里移除 @deepseek-ai/dsh-experimental-tool-worktree。不删会怎样,官方没写,但带着两个同源插件大概率不是你想要的状态。
把别的 agent 当工具:subagent_oar
实验性插件 subagent_oar 可以把独立任务丢给本机的 Codex 或 Claude CLI 执行。
这条单独拎出来说,是因为它代表一种态度:DSH 不打算把所有能力都自己实现,而是把自己定位成调度层。同时它也和另一条改动呼应——子代理等待指引减少 sleep 和重复轮询,只有结果未返回时才结束当前轮次等待通知。多 agent 编排的瓶颈从来不在「叫得动」,而在「等得省」。
另两个实验插件:
- 个性化推荐:在回答下方按需给出官方插件启用卡片或个性化页面创建卡片;
- 开发者工具 - 统计:按轮次和步骤看上下文、缓存、模型与工具耗时。
最后这个对调 prompt 的人价值很大。缓存命中率、工具耗时这类数据,过去只能靠 trial and error 猜。
性能:三处不起眼但真省时间的改动
- 远程连接默认开 WebSocket 压缩,可通过
websocketCompression关闭。历史消息越长收益越明显。 - Web 静态资源支持 ETag 条件请求,未变化返回 304。
- Search 优先给模型 Search API 的长摘要,默认每来源最多 800 字符,搜索卡片仍显示短摘录。
另外 Auto 自动审核在连续工具调用之间能更好地复用历史上下文缓存;系统提示词未变化时,新一轮请求继续复用已有前缀缓存——这条修的是「什么都没改,缓存却失效了」的隐形成本。
升级前必须处理的六件事
这部分是本文的重点。以下每一条都来自 release notes 的「其他变更」,不做会出问题。
| # | 变更 | 你要做什么 |
|---|---|---|
| 1 | Node.js 最低版本 24.9 | 先升运行时,否者装不上或跑不起来 |
| 2 | PTC 工具执行拆为按 Agent 作用域选择的插件,旧 tools.mode 与 DSH_TOOLS_MODE 废弃 | 迁移到配置 overlay,环境变量删掉 |
| 3 | PTC Node 控制通道改用 birpc,SSH 协议 2 → 3 | 自部署 bootstrap 与 SSH helper 必须同步升级 |
| 4 | Session Projection 注册 API 改为异步 | 插件启动时持有,同步写法会静默失效 |
| 5 | 官方组合包改由 @deepseek-ai/dsh-official-bundles 导出 | 自定义集成需更新原 app-boot 的相关导入 |
| 6 | 未声明容量的自定义模型默认按 1M / 128K(十进制) | 小端点显式覆盖容量,否则会延迟压缩 |
还有三条虽然不阻断启动,但会改变行为:
agent/request不再允许改路由。Agent 在提示词组装与 pre-step 前固定本步模型,重试保留同一选择;插件应通过agent.model选模型。- PTC 中被调用方取消的
run_code返回ABORTED,不再是CODE_RUN_FAILED。SDK 和 Session 消费方要更新取消分类,否则会把「用户取消」当成「代码跑挂了」。 - 文件修改的先读与外部修改防护默认关闭。沙箱限制和 Review 不变;需要原防护的 profile 要显式恢复观察策略。
部署侧的一条安全提醒
Web Fetch 不再拒绝非公网地址,可用于代理与内网,部署应自行限制网络访问。
这句话很短,但它把一个原本由客户端兜底的边界推给了部署方。如果你的 DSH 跑在能被外部访问的地址上,这就是一条 SSRF 面。上公网之前,网络层的出口限制得自己补。
冷静看
这是一版 pre-release,而且官方说了会有破坏性变更。 上面那张迁移表就是证据——六条里没有一条是「改个配置项名字」的程度。
几个判断:
- 日常用户值得升。手机端、发送语义、插件更新回滚、WebSocket 压缩,都是纯收益,风险集中在插件作者和自部署方。
- 插件作者先别急着跟。PTC 拆分、Session Projection 异步化、
agent/request路由限制,三件事叠在一起,基本上是要把插件重写一遍执行层的量级。建议等 rc.2 或正式版,看这些接口还会不会再动。 - 自部署方先看 SSH 协议。协议 2 → 3 意味着 bootstrap 和 helper 必须同时升,漏一个就连不上。这是最容易踩的坑。
- 工作树值得先试。它解决的是一个真实痛点(agent 改文件和你手头的分支打架),而且不涉及底座改动。
至于「Node 24.9」这条——2026 年 11 月了,24 已经是 LTS 线上的版本,但对还在 22 上的机器,这是一次不得不做的运维动作。DSH 官方给的理由是运行时能力依赖,没有细化,实际影响面得自己评估。
一个值得盯的信号:这次把 apply_patch 工具加进来了(默认关闭,一次完成多文件新增、编辑、删除、移动,变更在 Review 里看),同时把文件修改的先读防护默认关了。两件事方向相反——一边要求更强的批量改动能力,一边放松了改动前的确认。官方没说原因,但从「工具按步骤条件启用」这条看,防护正在从默认策略变成按 profile 配置的策略。用之前想清楚自己要哪一档。
