# DSH 会话重复：桌面展示修复与后端交接

## 已确认的问题

2026-10-13 从 Arkme 3.0.3 的本机只读 `remote.sessions.list` 接口取得完整 5 页目录，共 444 条源记录。当前本地 Runtime 的 106 个会话中，105 个各有两个旧 Runtime 副本，另一个有一个副本；相同 `profile_ref` 下的 `session_ref`、工作区、标题、更新时间和投影序号均相同。旧 Runtime 均离线。另一个容器也存在 14 个在线/离线重复副本。

插件原先按 `(runtimeRef, sessionRef)` 建立原生列表标识，所有副本都会作为独立列表项。该逻辑来自 2026-09-21 的多实例目录整合（master 提交 `71996c27`，原始功能 PR #652），不是 3.0.3 的浏览器打包修复引入；3.0.1 至 3.0.3 的相关目录入口产物相同。

## 本次插件处理

- 等账号目录所有分页加载完成，再同时向原生会话列表和工作区投影发布归并结果。失败时继续保留上次完整目录。
- 仅匹配带独立 Home 标识的 `web:scope_*`，还需设备名称、工作区和会话 ID 相同。设备名称或标题相同本身不能用于合并。空工作区是合法的未分组状态；原生投影序号 `-1` 表示尚无投影。
- 优先保留唯一有效的本地/在线源。只隐藏离线的相同或较旧投影；更新时间或序号更新的历史、同序号但标题/归档状态等有差异的记录继续保留。
- 全部离线时，保留较新投影；相同投影尽量沿用上次的来源，避免目录分页顺序变化导致列表切换。两个源同时有效时不自动归并。
- 保留来源真实 `runtimeRef` 和能力字段，打开、重命名等操作仍发到原始有效来源。没有删除、迁移或修改任何本地/服务端会话记录。
- 不合并通用 `web`、其他 scope、来源信息缺失或不一致的记录。通用旧目录需要后端提供可信的迁移关系，不能仅凭相同会话 ID 隐藏。

真实目录离线回放：444 条源记录收敛为 219 条展示记录，隐藏 225 条旧副本；当前 106 个本机会话全部保留，匹配本容器的旧重复项为 0。96 条通用 `web` 记录保持原样。诊断数据不提交到仓库。

## 已确认的交接边界（2026-10-13）

产品确认：**旧历史保留现状，交后端处理**。96 条通用 `web` 记录继续按现有方式展示；本次插件交付限于已确认的同容器旧实例副本去重，以及即我图标下方的版本号常驻显示。

独立 Web 测试环境借用客户端当前账号、对齐客户端 DSH Runtime `0.1.5-rc.2` 后，重新读取完整 5 页目录，仍为 444 条源记录、219 条展示记录。剩余 57 组相同会话 ID 的重叠全部涉及通用 `web` 旧目录，与当前 scope 目录并存：

- 49 组标题相同，38 组工作区相同；其余存在元数据差异。
- 33 组旧目录的更新时间更晚，37 组旧目录的投影序号更大。跨来源/格式的序号不应直接视为可互相覆盖的历史完整度证明。
- 抽查同一会话的一组来源：当前 scope 返回 HTTP 200、80 条原生事件且 `hasMore: false`；旧 `web` 来源返回 HTTP 409 / `CAPABILITY_UNSUPPORTED`，提示“云端原始历史不完整或与当前 DSH 不兼容，需要源电脑补齐”。这是单个样本，不能据此断言全部旧历史均不可读或已丢失。

因此后端交接需同时覆盖目录迁移关系和旧历史读取兼容性。现有目录没有足够可信的迁移对应关系，插件继续保留不同来源的真实标识，等待后端确认归属与覆盖关系后再对接。

Web 中已实际打开在线源会话并显示正文，版本号无需悬浮即可看到。测试过程中较早出现过远程读取超时，后续读取及页面复测成功；该间歇超时的根因尚未确认，不作为本次已修复项。独立测试环境曾误用旧开发依赖，已对齐后重新验证；此环境配置问题与安装客户端的旧历史兼容性应分别核查。

## 后端/客户端需继续核实与处理

本地后端源码（2026-09-23 快照，**未核实生产部署版本**）中，Desktop 以 `(user_id, client_id)` 唯一，Runtime 以 `(user_id, desktop_ref, profile_ref)` 唯一。因此，同一 Home 在认证 `client_id` 变化后，可能生成新的 Desktop/Runtime，历史目录继续返回旧登记。该机制与实测现象吻合，但还需结合生产注册日志确认各次 client_id 变化原因。

建议同事从 `internal/dshremote/mutation.go`、`service.go` 和 `mongo_store.go` 的登记路径核查，并与桌面容器注册表对齐：

1. 在账号隔离边界内使用稳定的安装/容器身份，避免认证会话轮换导致重复登记；不要让客户端任意声明归属其他账号。
2. 为合法迁移建立明确的旧 Runtime → 当前 Runtime 关系，提供规范化目录标识与真实可操作来源，不依赖设备显示名称。
3. 覆盖重登、客户端重装/迁移、离线历史、旧 `web` 到 scope 容器迁移、多设备并行、同名工作区及账号切换；分页游标必须基于规范化目录保持稳定。
4. 在兼容旧链接和历史读取的前提下处理旧登记，不能直接批量删旧 Runtime/会话。无法确认的分叉历史应继续可查。

对接验收：后端提供账号内可信的迁移关系、规范化目录标识、实际可读取/操作的来源与旧历史兼容说明后，插件再接入。需以相同会话 ID 但标题、工作区、时间或序号不同的记录验证分叉保留，以旧链接和分页验证历史仍可访问，并覆盖源电脑离线场景。

本次只提交插件展示处理和交接说明；没有修改或部署后端，也没有改写已安装客户端。
