# 延展草稿父消息恢复

聊天输入区的延展父消息与正文属于同一份账号、会话草稿。会话引用轮换、切换后返回、组件重建或页面刷新时，两者一起恢复；取消延展只移除父消息，提交时一起消费，失败时仅在没有更新草稿的情况下恢复原父消息。发送仍由既有 `source.message-extension.extend` 校验权限和父消息有效性。

| 能力面 | 范围与验证 |
| --- | --- |
| UI | 父消息预览、引用轮换、重建、刷新、取消、失败恢复与双窗口同步 |
| Tools | N/A：未增加 Host 业务能力；模型不消费用户尚未提交的输入框草稿 |
| SDK | N/A：未增加 Host 接口；外部插件不读取内置输入框的未提交草稿 |
| Host owner | 不变；继续通过现有延展接口授权和发送，不自动重发 |
| Client/Harness | 沿用已有草稿快照同步与 Browser module 装配；不改变原生桥、Profile 或运行环境发布 |

## 状态与兼容边界

- 只保存有界预览和既有不透明操作引用：正文预览 2,000 字符、标题 500 字符、最多 3 个媒体预览。不保存整个时间线对象或媒体字节。
- 操作引用包含 Host 签名的原文，长度与短预览不同。恢复时允许最大 1 MiB 引用，覆盖 Host `maxTextLength` 可配置到 100,000 字符的场景；损坏的父引用不会被悄悄转换成普通发送。
- 只有用户在当前窗口明确选择父消息时，才初始化群聊默认 @。刷新、回到会话和收到其他窗口草稿时保留用户已经删除或改写的 @，避免窗口间重复改写。
- 仅有父消息、尚无正文的草稿也会同步。取消、消费及账号清理通过同一个草稿 owner 广播，保留原有 40 ms 合并窗口。
- 重试身份使用稳定会话草稿键和父消息标识，避免会话引用轮换使同一草稿重新生成记录、关系编号。
- 沿用已有浏览器持久化、账号清理和存储失败退化，不新增请求、轮询或订阅。兼容最新发送时长采集：采集仍先于草稿消费，失败时保留原来的恢复顺序。

## 验证

插件交付基线为 `1dac49561b15b6a0a27dec767617561bda2891fe`（`dev`）；客户端只读兼容基线为 `566ac5986b0d8dbf6cfff2a6da274535716d9021`。插件版本保持最新基线的 `3.0.5`，根 README、版本字段和 lockfile 未修改；客户端与 DSH 源码未修改。

- `composer-extension-draft.test.ts`：父消息及正文刷新恢复、编辑操作、取消、失败重试身份、新草稿隔离、账号清理、JSON 同步、预览上限、长消息引用、损坏数据及存储不可用。
- `conversation-send-directory.test.tsx`：实际 `ArkmeSurface` 的引用轮换、组件重建、切换返回、@ 编辑保留、提交后清理与失败恢复，以及引用轮换后的重试编号。
- `conversation-window.test.ts`：父消息与正文一起同步、只含父消息的草稿同步、取消传播与无回声。
- 新增恢复场景及复核边界均先在修复前复现失败，再验证修复。提交前全量测试、类型检查、构建及打包安装结果记录在 PR。
- 初始实现已在真实 Chromium 的实际组件与隔离接口中验证刷新、取消、发送成功和失败恢复；官方 DSH `0.1.5-rc.2` 已验证独立安装和 Browser module 加载。桌面开发实例使用独立数据目录，真实账号业务验收由用户进行。

未确认用户现场实际触发刷新的事件；已确认并修复的是父消息状态被会话引用变化或组件重建清空的缺陷。自动化及本地运行验证不代表所有平台或真实账号业务已验收。本次仅交付插件 PR，不发布生产制品、不更新已安装客户端、不替换用户正在测试的实例。
