# 表情展示合同

原始正文继续保存 jm_emoji / im_emoji token、Unicode 和既有媒体引用，不把展示转换写回正文。
插件的 arkme-emoji-text 持有无资源依赖的表情目录、解析和安全截断；Browser 只关联内嵌 SVG。

- 应用内用户内容经 ArkmeRichText；先识别完整 URL，再解析普通文本中的表情。正文保留原有链接行为，preview 只展示，不发起链接标题请求或产生交互元素。
- 纯文本出口经 arkmeEmojiPlainText；未知编码原样保留。图片表情包继续走 contentBlocks 媒体链，不从文字猜测。
- 视觉省略用 CSS；响应限长保护完整 token 和 Unicode 字素簇，并保留原有长度预算与截断标记。
- 编辑器保留自己的光标、mention 和草稿模型，共享目录与序列化规则。
- SVG 失败退化为可读 Unicode；图片提供语义名称。单个富文本块内含表情图片的复制选区转为 Unicode，同时保留 HTML 中的链接与格式；不含表情或跨块的选区保留浏览器原生复制。不得为每条文本新增网络请求、缓存或订阅。

## 能力与验收范围

| 消费面 / owner | 本次范围 | 验证 |
| --- | --- | --- |
| UI | 日历、时间轴与详情抽屉的延展父引用、相关快记、转发选择弹窗与转发详情、录音/长文卡片及已有 Unicode 展示入口 | 同一组 token、组合表情和混合内容贯穿实际组件；预览无请求/额外交互；失败与复制 |
| Host | 既有内容投影使用共享安全截断，不改权限、查询或持久化合同 | 日历、相关快记、消息签名快照与两类转发快照的内容完整性测试 |
| Tools / SDK | 不新增能力，继续消费同一 Host；不复制转换逻辑 | 现有日历和相关快记入口兼容测试 |
| Client / Harness | 无原生桥或装配协议变化 | 独立制品安装、隔离页面验收；已安装客户端和生产发布不在本次授权内 |

开发基线：插件 official/dev e7563b9e5fa84284032aeb0c7cd3a7020e1e0c44；提交 PR 前已合入最新 dev a055b4b15647741647c07acb368e68f958a74492 的 Markdown 合同。
客户端只读参考 master 02f86d21dc3c2c94b01c4cd0e1f5f4bdda6bdeae。
性能边界：解析工作随本次文本长度增长，不持有跨内容缓存；预览不新增 I/O。

## 本次验证

- 原始基线相关测试 203 项通过；修改后 typecheck、build 和制品清单检查通过。
- 最新基线集成后全量：4024 项通过、5 项跳过、16 项失败。16 项失败全部在未修改的 dev/a055b4b 对应测试中逐项复现，失败集合完全一致；涉及 Markdown 基线的旧 UI/Host 参数断言、identity 与 service-architecture 清单。没有新增失败。
- 官方 DSH 0.1.1-rc.2（源码参考标签 dsh-v0.1.1-rc.2，b150a551）通过 plugin CLI 安装独立 tgz；使用带空格的全新 DSH_HOME 和独立凭据命名空间。最终安装的 client.js 与构建输出摘要一致。
- Chromium 实际页面使用浏览器路由固定样例，不使用真实账号：日历、时间轴父引用、详情父引用和相关快记均成功加载两种 token 对应的 SVG；未知 token 与 Unicode 保留，预览没有链接节点或链接元数据请求。
- 实际复制快捷键产生 Unicode 文本；验证监听器阻止写入系统剪贴板。模拟缺失图片资源后成功退化为 Unicode。
- 最终制品 SHA-256：bbad76d87ceb19e6e306e07c00ccea80a6811686c0758c91c4a5dcea1c73ef7b，版本保持 0.1.43。制品不含测试、node_modules、本机路径或验收端口。
- 上述是隔离 DSH Browser 页面验收，不等同于真实账号的远端数据验收、已安装 Electron 客户端替换或 Windows/Linux 验收；未发布或提交 PR。性能只验证无新增预览请求，不声称测得吞吐或帧率提升。

## 深入审查与修复

| 问题 | 修复及证据 |
| --- | --- |
| P2：转发对象弹窗的最近消息与底部摘要绕过公共渲染 | 统一使用 preview 模式；实际弹窗加载 4 个表情图片，无链接节点；选择对象、填写附言、发送一次并关闭弹窗均验证通过，提交保留 actionRefs 与原始附言 token |
| P2：表情优先解析会拆开 URL 参数 | 由已有链接解析器先确定 URL 边界，再将普通文本交给唯一表情解析器；body/preview 都覆盖含 token 的完整 URL |
| P2：普通选区复制被无条件接管，含链接选区只留下纯文本 | 仅转换选区内的已知表情图片；保留 text/html 的原始 href；真实复制快捷键验证普通选区不接管、表情转 Unicode、链接不丢失，测试阻止写入系统剪贴板 |
| P2：历史转发摘要用冒号猜作者，破坏 token、URL 和时间 | 摘要整体作为内容显示；作者只从结构化字段取得。摘要-only 记录显示通用摘要标签，复现样例均通过 |
| P2：消息操作签名快照、普通记录/Agent 转发快照会写入半个 token | 使用共享安全截断并保留原有预算；公共读取→签名引用→转发写入测试与 Agent 网关测试证明原始正文保留，写入摘要不含半个 token |
| 清理：Browser 有重复解析包装和松散的 run 类型；目录继承 Object 原型 | 删除包装层，直接消费无资源依赖的判别联合类型；Browser 目录不再将 constructor / __proto__ 视为表情 |

架构边界：表情目录与文本语义归插件公共层，SVG 和复制归 Browser；聊天关系、普通记录和 Agent 的来源身份、授权、幂等仍由原 owner 持有。仅共用无副作用的文本函数，不合并不同消息协议，不转换持久化原始正文。

没有新增状态机、计时器、订阅、缓存或数据库字段。图片组件仅保留当前资源是否加载失败的局部状态；没有新增兼容开关、双轨解析或过渡协议。jm_emoji / im_emoji 和摘要-only 读取属于既有历史数据合同。未修改提示词、版本字段或根 README。

表情修复快照已通过官方 CLI 装入独立 Profile，并在 Electron 验收客户端加载（代码摘要一致）；转发弹窗和历史详情完成了固定业务样例的真实页面复验。最新 Markdown 基线的集成完成单测、类型检查与打包，尚未重新进行真机账号验收。

输入区目标预览追加验收：延展与重新编辑共用的目标摘要已接入 preview 模式，102 项相关测试、typecheck 与 build 通过；原稿、重新编辑草稿及延展提交引用均保持原始数据。

Markdown 集成：保留 text_format、代码块与业务标签的 AST 边界，只对普通正文文本渲染表情；新增复合样例验证正文渲染、行内/块级代码保留原文、URL 参数值不变。
