# 私聊、群聊、Arko 的宽屏会话布局

## 范围与行为

- 以会话区域自身宽度为准，严格大于 900 CSS px 时启用；不根据整个窗口判断。
- 窄屏恢复原有消息区内边距和全宽输入区，不卸载编辑器、不清除草稿。
- 两侧拖动共同控制居中的正文宽度和输入框。输入框保留 DSH 的正文宽度 + 32px 外卡片基准，以及 Arkme 已有内边距。
- 三种会话共用 `ArkmeWideConversation` 和本地偏好 `arkme:conversation-content-width:v1`，不改 DSH 自身宽度偏好。
- 私聊/群聊按已加载消息定位，Arko 把用户提问与其后的回复合为轮次。分隔线中断分组。
- 导航预览左侧使用与消息一致的 28px 发言者头像；Arko 提问与回复分别显示自己的头像。头像复用现有组件和共享图片缓存，不额外读取消息或成员列表，缺失图片沿用默认头像。
- 标记数量是当前已加载窗口，不冒充整段历史的总数；导航不发起额外历史读取。原有滚动分页继续工作。
- 消息多选时隐藏拖动与导航，保留已调整布局。发给自己、Bot、官方 DSH 本身不属于本次改动范围。

## 原生复用与升级边界

DSH 0.1.5-rc.2 的 `WidthHandle`、`resolveContentWidth`、`TurnNavigator`、CSS module 类名未从公共 client 入口导出。

`harness-conversation-layout-assets.ts` 从**运行中 CLI 所在目录**解析官方包，保留整个当前原生 factory 的实现，只修改桥接模块标识和返回对象。不复制这些组件或 CSS 到插件源码，不修改安装目录中的官方文件，不把桥接 factory 作为插件 apply，因此不再创建会话、注册 slot 或启动 stores。

浏览器首次进入宽屏时加载这两个只含展示能力的导出接口。三个 Arkme 界面共用同一次加载，组件沿用原生 CSS 的样式标签去重。原生包升级后，在重启时读取新版本实现和样式；不是构建时冻结旧版本。

预览头像通过 `prompt` / `response` 的 React children 内容适配加入，不重写原生预览浮框。仅调整内部文字截断容器以容纳头像，提问一行、回复最多两行，避免头像挤占原生浮框高度上限；外层圆角、阴影、定位、动画、鼠标/键盘交互均仍由官方组件提供。桥接同时检查原生仍把这两个字段作为 React children 使用；不支持时安全降级。

这属于有兼容保护的私有导出桥接，**不是 DSH 已承诺稳定的公共 API**。符号、factory 结构、导出对象不符时禁用增强，继续正常聊天；版本升级仍要执行兼容验收。将来官方开放独立组件入口时，应在这一个适配层切换到公共入口。

## 验证

- `harness-conversation-layout-assets.test.ts`：导出边界、不调用原生 apply、资源缓存及失败隔离。
- `harness-conversation-layout-loader.test.ts`：Cordis 注入声明、单次懒加载、退出取消、失败不影响主界面。
- `wide-conversation.test.tsx`：锚点、轮次分组、已加载边界、重排时保留阅读位置。
- `wide-conversation-responsive.test.tsx`：900px 阈值、持久化、恢复宽度、编辑器不重挂载。
- 设置 `ARKME_TEST_DSH_BIN` 为实际 CLI 文件后运行原生资源测试，可加载当前官方 factory 和 CSS 校验兼容性；虚拟 store 被故意禁止创建。

手工验收需在真实 DSH 预览中确认两侧拖动、正文/输入框联动、消息导航点击/键盘、滚动更新、跨会话及重载宽度记忆、窄屏恢复。构建通过不能代替这些检查。
