DeepSeek Harness v1.19.0
✨ 新增了什么
一、AI 浏览器:AI 有了一双真能操作网页的手
以前它只能"看截图猜",现在能真的打开网页、找元素、点、填、读正文。
- 10 个浏览器工具:
browser_caps / open / snapshot / find / click / type / read / nav / scroll / tabs。
- 元素身份是"指纹"不是位置编号:同一个按钮的 ref 跨多次快照保持不变,上一轮拿到的 ref 这一轮还能用;同名元素自动加
-2 / -3 并标注。
- 真差分快照:带上次的代次再快照,只回变化(新增 / 消失 / 改动 / 未变计数),页面没变时只花几十 token。
- 检索式定位:直接按文本或角色找元素(例如
browser_find "登录"),命中即打 ref、找到就能点;大页面首选,不必拉全量。
- 点完当场确认:返回里带
changed,告诉你"这一下到底点动没有"。
- 多页签:
browser_tabs 可以列出 / 新建 / 切换 / 关闭;跨页签点错会被拦下 —— 拿 A 页签的 ref 去点 B 页签会直接拒绝并提示先切换,不会静默点错。
- 浏览器跑在自己的独立进程里:页面崩了不会带走控制台和引擎;还带"一键整套丢弃",丢掉后下一次操作自动拉起全新进程。
- 一层顺带的隔离:浏览器的 WebView 数据目录与主界面分开,白拿一层 cookie / 存储隔离。
- 安全边界(写死在代码里):只允许
http/https;禁止访问本机回环地址(127.0.0.1、localhost、127.1、2130706433、0x7f000001 等变体一律拒绝),免得 AI 浏览器打到 App 自己的本地服务。
二、同屏浮窗:看得见、拖得动、点得着
控制台多了一个「AI 浏览器」页(主控台「系统」组一行入口):状态卡(点一下 = 刷新)、页签列表、「刷新 / 关闭浏览器」(走确认框),以及「同屏查看」开关。
打开后屏幕上出现一块浮窗,把 AI 浏览器正在看的那一页显示出来:
- 点顶部那根小条 = 关掉同屏;按住拖动 = 把浮窗搬走(拖完不会顺手关掉)。
- 画面里的网页可以直接操作:点画面 = 点网页,可以直接滚、直接点。
- 尺寸固定(55% 屏宽,画面区严格 1080×1920 整比,页面不会被裁);不做缩放是有意的 —— AI 的点击坐标口径依赖这个尺寸。
- 还没有浏览器时点同屏只回一条提示,不会建一扇空窗盖住屏幕。
三、控制台「一切皆自定义」:一份 `console.json` 改所有界面
- 四层都能改:
appearance 配色与 logo、text 逐条文案、layout 排序 / 隐藏卡片 / 紧凑 / 整页自拼、actions 自定义按钮(可执行动作是红框 + 点击时确认 + 显示命令原文)。
- 排序 / 隐藏卡片 / 自定义按钮,在默认界面下也生效。(如果你那份「软软小白团」主题里配了自定义按钮,以前在默认界面下不会出现,现在会正常出现。)
- 主题可以随时恢复:主题页新增「我保存过的主题」,每行 = 名称 · 类型 · 时间 · 大小 + 行尾「恢复」,点一下直接恢复;恢复前会先把当前这份留底,恢复后写一条记录;弹窗内还有「清空记录」(红框 + 二次确认,只删这些备份、绝不动正在用的
console.json)。
- 弹窗里能切控制台风格:精简版(缺省)/ 完整版,两个方向都能切;也可以直接在主题里写
layout.style。
- 文案键基本登记齐了:不登记的文案等于不能自定义,这一版把 100 多个键补进规范。
- 八个细页面统一版式:权限 / 插件 / 日志 / 主题 / 内核自检 / 会话管理 / 回收站 / 会话修复 —— 圆角卡片行 + 右列短状态 + 「›」,说明走统一段落,不可逆动作单独红框,长标题自动截断。
- 换页不再继承上一页的滚动位置。
四、会话管理:App 里第一次能删会话(而且删得回来)
- 「会话管理」页:列表分批 30 条,每行标题 + 元信息 + 「删除」;删除前弹确认框,明确写出删的是哪一条(标题 / 大小 / 行数 / 最后活动,以及"会做什么 / 不会做什么")。
- 「回收站」页:显示
N 条 · X MB,每条带原位置;「恢复」一键放回原位;「彻底删除」只在这里提供,且每次单独红框确认(文案明说不可恢复);也可以清空回收站。
- 删除 = 移到回收站(在
sessions/ 之外,内核扫不到),不是真删;越界请求在两侧各拦一次;每个条目记住原位置;删除 / 恢复 / 彻底删 / 清空各写一条自愈账本。
五、会话级自愈:坏附件只降级那一条消息
坏附件(例如文件头合法、内部数据已损坏的图片)一旦进入会话历史,每次请求都会重新读它、每次都以同样方式失败,以前只能放弃整条会话。
- 「会话修复」页:扫描(只读,2~3 秒出结果)→ 列出问题会话(每条多少处坏附件)→ 详情(坏在哪一条、哪个文件、为什么)→ 红框确认 → 执行 → 结果 + 账本。
- 修法最小且可证伪:会话是多帧 zstd → 只重写含坏消息的那一帧,未命中帧字节原样;只把那一处图片 / 文件块换成一行文字,正文与上下文一字不动。
- 写死的边界:① 只处理你点选的那一条(没有"扫全目录批量修");② 引擎在跑时不允许改写(先停引擎);③ 写盘前必须先备份(备份失败即中止);④ 写完立刻复检(坏引用必须归零、行数与 JSON 合法性不变,否则如实报"部分完成");⑤ 默认只演练,只有显式指令才真的落盘。
- 护栏:同一份源上最多执行 2 次,第 3 次只报告不执行(防止"越修越坏")。
- 坏附件三档判据:实体不存在 / 大小与记录不符 / 内容坏(PNG 逐 chunk 校验 CRC 与数据流;JPEG / WebP / GIF 查魔数与结尾)。
- 硬纪律:任何"修复 / 清理"都不许靠删掉整条会话解决 —— 会话只能攒着,修复只降级那一条消息里的那个坏块。
六、内核自检 / 自修复
- 「内核自检」页 = 清单式一致性证明:随包带一份内核清单(每个文件的路径 / 大小 / sha256),点一次就告诉你具体哪个文件缺失或内容不符,而不是"感觉坏了、清数据吧"。两种模式:快速自检(只比大小,约 1 秒)/ 全量校验(逐个 sha256);带分段进度条与协作式取消(取消后如实返回"已取消",不假装检查过全部)。
- 自愈账本:每次自检、解压 / 清理、配置快照、修复动作都会写一条 JSON 记录到
/sdcard/<包名目录>/heal-ledger/ —— 修过什么、依据什么、结果如何,全都可查(也可以直接让 AI 读给你听)。
- AI 只提案、App 才执行:AI 只能把"动作名 + 文字说明"写成文件(不含任何可执行代码),App 只读它;能不能执行由三道闸门决定(动作白名单 / 源指纹未过期 / 同一份源上未超 2 次),最后一下必须人在原生界面点击 + 确认框确认 —— AI 不可能自己触发执行。
- 安全边界:自检只读;清理只发生在内核自己的
@deepseek-ai 目录里、且只删 dsh 开头的陈旧条目;用户数据与你自己装的第三方插件永远只报不改。
七、运行环境与备份
- 主控台「系统」组新增常驻「运行环境」入口:解压 / 重新解压 / 校验文件 / 看详情 —— 以前主页面里找不到解压内核的地方。
- 备份把图片和工作区一起带上了:附件实体(实测 95.2 MB / 651 项)与私有工作区(实测 51.5 MB / 2428 项)进包,一次导出实测 167 MB。
- 导入侧如实报数:「(含 N 个附件实体;含 M 个工作区文件)」;遇到旧备份会明确提示"这份备份里没有附件实体 —— 若会话里的图片打不开,去「会话修复」跑一次扫描"。
八、安全加固
- 本地服务全部上了令牌闸门:App 里 4 个绑本机的服务(通知 / 无障碍 / 虚拟屏桥 / 虚拟屏核心)统一要求令牌(
X-DSH-Token),拿不到令牌一律拒绝;未匹配的路径不再"落到默认处理器"。
- 虚拟屏组件加了完整性校验:虚拟屏 jar 带随包 SHA-256 校验,被改过一个字节就拒绝启动,并自动从包内重新提取。
🐛 修好了什么(相对于 v1.17.3)
| 问题 | 现在 |
|---|---|
| 备份里没有图片和工作区 —— "导出 → 清数据 / 换机 → 导入"之后,每一条带图的会话都会变成"附件实体不存在"、每次请求都失败(等于旧备份在批量制造坏会话) | 附件实体与私有工作区都进备份了 |
| 本机任意应用都能通过 App 的几个端口读屏 / 截屏 / 注入手势 / 伪造通知 | 4 个本地服务统一要求令牌,拿不到一律拒绝 |
| 虚拟屏组件被改过也能启动 | 带随包 SHA-256 校验,改一个字节就拒绝启动并自动从包内重新提取 |
| 系统设置里无障碍服务名是乱码(显示成 DeepSeek Harness 灞忓箷鍔╂墜) | 正确显示 DeepSeek Harness 屏幕助手,三套包都对了 |
| 深色主题下日志弹窗"浅底浅字"看不见 | 统一到主题配色(像素对比差 6 → 217) |
| 长正文弹窗把动作按钮挤出屏幕 —— 会话详情里「取消 / 确认」直接不存在,弹窗卡死只能按返回键逃 | 正文一律包进可滚动区,兜底只压缩正文区 |
| 按钮被挤成"扁色块、没有文字" | 补上最小高度 |
| 控制台换页继承上一页的滚动位置 —— 从主控台底部点进任何一页,落点都在中段、第一行看不见 | 换页回到页首 |
| 控制台每秒刷新链一旦抛异常就永久死掉 —— 之后改 console.json 再也不热重载,只能重启 App | 异常吞掉并照常续链 |
| 只写文案 / 布局 / 动作、没写外观的 console.json,后三层被静默丢掉 —— 主题页还显示"已生效",界面却一字不变 | 没有外观覆盖就继续解析后面的层 |
| 插件开关改完,页头「已启用 N / M」停在旧数字 | 开关后自动重绘 |
| 文案里的 星号 直接显示在界面上 | 去掉用户可见文案里的 markdown 记号,并加显示层兜底 |
⚠️ 已知限制(如实列出)
- 三类自定义动作仍未接执行:
http / intent 只弹一条提示"还没接",prompt 退化成"复制到剪贴板";动作执行也不写日志页。界面与规范里都如实说明,不是谎报。
behavior(自动解压 / 自动起引擎 / 双击退出)只解析、不执行。
appearance.logo 在默认界面下看不到;新增的 browser 卡片只有走 layout.pages 整页自拼时才会出现。
- 真
MULTI_PROFILE(同进程内多档 profile 隔离)未做:现在拿到的是"独立进程 + 独立数据目录"这一层进程级隔离。
- AI 浏览器独立进程依赖「悬浮窗」权限:没有权限时会给一条明确错误并提示去控制台「权限」页授权,不会静默降级。
- 备份的「导入」失败根因仍未查明:有用户实测报过"导入失败了",探针包已备好但没跑完;数据没有被破坏。
- 旧备份仍然缺附件实体与私有工作区(格式如此,改不了);导入时会明确提示。
- 公共存储目录
/sdcard/<包名目录>/ 不在备份里(含 console/ 主题、heal-ledger/ 账本、work/、截图):清数据不会删它,但换机 / 手动删会丢。
- 备份混进了可重建的缓存(
.cache / .npm / .npm-global / .local / 1/.dsh-tmp,以及套娃的旧备份),排除后可从 167MB 降到约 120MB(未做)。
- 会话修复列表在修复后不会自动刷新(要点一次「重新扫描」)。
- 回收站里的会话在「会话修复」页看不到(扫描只认活动会话树,属既有设计)。
- 「界面主题」弹窗里的「恢复默认」没有确认框:一次误触就把主题收走(真机上真发生过)—— 这条列为"用户拍板才能动"的待办,本次未改。
- 老 WebView(Chromium 91~93)在正式版 / Lite 上仍可能白屏(issue #38 仍开着);兼容版靠内嵌 GeckoView 规避这一类设备。