# 消息同步与会话草稿恢复

## 行为与 owner

- 大整数 Bot owner 在 JSON、消息引用和定位查询中保持精确，不把 int64 强转为不安全的 Number；普通安全整数保持原类型。
- 统一时间线 v2 复用既有消息读取协调器，防止正文请求被无关后台工作占满通道。v1/v2 的协议语义不变，不通过降级掩盖缺失接口。
- 删除、编辑和恢复不增加消息序号；实时投影定向读取受影响会话的详情预览，替代空的 forward-only tail 和不含预览的轻量快照。详情返回上一条可见消息时替换摘要，确认 missing 时清除；unavailable 不作为删除，旧序号不能覆盖已确认新消息。
- 草稿仍由插件编辑器持有业务语义，桌面桥只保存不透明快照。source 与 Arko 草稿均同步；冷恢复期间的新编辑或清空优先于旧快照。保存失败不伪装成功，仅在显式关闭/flush 时重试。
- 可选 `onFlush` 原生桥在正常退出/重启前提交 40ms 合并窗口内最后一笔编辑，并等待持久化确认。没有该桥的旧客户端保留既有兼容行为。

## 能力矩阵

| 能力面 | 范围与验证 |
| --- | --- |
| UI | 时间线、生命周期预览和本地草稿恢复；覆盖切换、旧响应、清空与保存失败 |
| Tools | 既有统一时间线消费者共用 Host owner；不改变工具注册、授权或 Schema |
| SDK | 既有统一时间线与消息引用保持兼容；不可变插件包的仓外 Consumer 验证通过 |
| Host | 统一时间线、线下交流引用、预览投影和传输协调器各保持单一 owner |
| Client | 草稿持久化需要配套桌面会话桥；本地编辑器状态不新增 Host 业务 API，Tools/SDK 不新增草稿入口 |

## 兼容与发布顺序

先部署支持 v2 时间线、删除后未读过滤和列表/详情可见消息回退的 Chat 服务，再交付插件。预览的上一条有效消息由后端解析；插件不扫描远端历史或伪造未读清零。

完整的 APP 冷启动草稿恢复还需要配套桌面客户端：按 Profile/账号原子保存快照，并在退出、菜单重启和运行环境切换前等待 flush。建议先交付兼容新旧插件的客户端，再交付插件；两仓合并不等于运行环境制品或安装包已经发布。

## 资源边界

复用既有每会话合并、最多 50 会话批次、3 个投影 worker、消息协调器和账号 generation 围栏。不新增轮询、缓存或第二个同步 owner。普通新消息保持原路径；同批含新正文时继续读取 tail。

确定性测试中，10 个会话各收到 3 个重复生命周期变更，只执行 10 次定向详情查询，最大并发 3。协调器原有并发、队列、取消和 dispose 边界保持。此证据不代表线上延迟或全局性能保证。

## 验证入口与既有证据

```sh
NODE_OPTIONS=--no-experimental-webstorage pnpm test --maxWorkers=2 --testTimeout=30000 --hookTimeout=30000
pnpm typecheck
pnpm build
pnpm --config.ignore-scripts=true pack --pack-destination <artifact-directory>
```

- 回归覆盖不安全 owner、v2 读取通道、同序号预览替换/清空、旧响应、新消息保护、不可用降级、重复事件合并、并发上限及草稿恢复/失败重试。
- 不可变 tgz 经未修改的官方 DSH 0.1.5-rc.2 正式 CLI 安装到全新带空格路径 Profile，验证 Host 激活、页面资源和仓外 SDK Consumer；未修改 DSH 源码。
- 真实 Electron + 生产 preload + 插件 auth/composer/sync 模块，以五个独立进程和不同随机端口验证私聊、群聊、Arko 写入、冷恢复、账号隔离、清空及清空后不复活。
- macOS 开发客户端已验证完整退出后草稿恢复和清空后再次重启不复活，未发送测试消息。
- 最终 PR 记录准确提交、全量测试数字与构建结果。Windows/Linux 实机与正式制品升级仍需渠道验收。
