# 使用（P0）

> P0 已实现：独立置顶区、项目会话分块、标题单行省略、固定时间列（分钟/小时/天/周/月/年）、置顶去重、运行/等待/完成未读状态区分、复制工作目录。

重启 DSH 后，在左侧工作区中将鼠标移动到会话行，点击行尾 `⋯`：

当前菜单只保证以下已实现操作：

- 固定会话 / 取消固定
- 重命名
- 分叉会话
- 归档会话
- 复制 Session ID
- 复制工作目录
菜单字体已按会话行的 13px / 18px 比例收敛，避免弹出菜单文字明显大于外部会话名称。


固定状态由 DSH 的 `workspaces.list.pinnedSessionIds` 持久化，插件通过 `uiWorkspace.pinSession` / `uiWorkspace.unpinSession` 调用宿主服务，不使用 localStorage，也不依赖旧侧栏插件。

工作区行会随宿主数据和原生 DOM 更新重新计算；不永久保留已删除或已筛除的上一帧行。

## 会话归属与更多会话

- 会话归属读取 `workspaces.list.items[*].sessionIds`，不按 `cwd` 重分组。迁移后工作目录仍是旧路径，也不应改变其宿主登记的归属。缺少 `sessions.list.byId` 摘要时等待宿主摘要到达，不自行打开所有会话。
- 原生“展开其余 … 个会话”保留节点、键盘行为与 click handler。尚有剩余页时，插件只投影宿主当前页的实际成员和顺序，不根据行数猜测分页容量，也不额外塞入待处理会话。
- 工作区已展开且没有剩余页时，若当前原生树中已有非归档会话，可补上该工作区已登记、但尚无原生行的普通会话。已生成行的顺序不变；补充行暂按宿主成员顺序追加，待原生 updated/manual 顺序到达后跟随更新。
- **保守边界**：宿主公开服务没有提供浏览器的归档筛选与排序 store。整棵原生树为空或只含归档会话时，不猜测筛选模式、不补入普通会话；工作区数据正在加载或报错时，保留原生投影。此时仍缺的会话需要在真实运行窗口核对，不能据此判定会话已丢失。
- 插件不新增分页 API、不写会话成员表、不修改归档集合；这些显示修复不执行迁移或数据恢复。

## 分块与行布局

- 顶部一级标题固定为“工作区”；其下依次是“置顶会话”和唯一的“项目会话”分块。插件不会把“会话”替代“工作区”，也不会重复插入“项目会话”。如果宿主当前节点误显示为“会话”，插件仅在运行期间可逆地规范为“工作区”，关闭后恢复宿主原文案。
- “项目会话”仅是原生目录树前的标题与细分隔线，不新增整组折叠状态，不改变原生目录、排序、搜索、菜单和 workspace membership。
- 标题左对齐、单行省略；悬停标题可查看完整名称，读屏仍能读取全名。
- 时间右对齐、固定 `4.5em`（11px 字号下约 49.5px），与固定 `24px` 菜单按钮预留位配合；鼠标经过不会挤动时间列。状态、置顶标记之外的剩余宽度全部交给标题。
- 相对时间使用“刚刚 / 分钟 / 小时 / 天 / 周 / 月 / 年”；周按 7 天、月按 30 天、年按 365 天估算，仅用于列表显示，不改宿主时间戳。

## 工作区目录提示

- 将鼠标悬停在工作区名称上，会显示 DSH 宿主提供的目录绝对路径。
- 该提示只读取 `workspaces.list.items[*].path`，不写入工作区数据；关闭插件时会恢复原生 `title` 属性。


- 置顶后会话只出现在顶部“置顶会话”区，不再重复显示在原工作区；取消置顶后回到原工作区 projection。
- 置顶顺序按宿主 `pinnedSessionIds`；工作区收起不会隐藏置顶区，置顶区可独立收起。
- `pendingInteraction` 显示等待批准/计划确认/回答，优先于运行；运行显示“正在执行”；`completionUnread` 显示“未读”标记和粗体标题。
- “未读”来自 DSH `uiSession.sessionStatus` 的完成提醒，插件不提供伪造的 mark-unread 写入，也不保存私有未读表。
- 归档只适用于已停止的会话；运行中的会话点击归档会保留宿主拒绝提示，不会自动停止会话。

## 关闭插件后的数据

关闭或卸载插件不会迁移、删除或覆盖会话数据。会话所在 workspace 读取自 DSH 的 `workspaces.list.items[*].sessionIds`，置顶读取自 `pinnedSessionIds`；这些都是宿主状态，不是插件私有 localStorage。恢复原生 UI 或换用另一款遵循 DSH service contract 的插件后，应继续看到相同归属和置顶状态。

