# dsh-sidecar-conversation

**看不懂就侧问，不污染主 Session 的上下文。**

在 DeepSeek Harness Web 中，选中不理解的文字，就能在原生右侧栏继续问清楚。解释和追问留在侧问自己的 Session 中，不写回主会话。你也可以针对整个回合提问，或从旧回合 Fork，分别保留消息、草稿、模型和权限。

[English](./README.md) · [GitHub Release](https://github.com/gosomea/dsh-sidecar-conversation/releases/tag/v0.2.8) · [npm](https://www.npmjs.com/package/dsh-sidecar-conversation)

## 快速安装

已安装 DSH Web 的用户，在启动它时使用的同一环境和 `DSH_HOME` 下执行：

```sh
dsh plugin --profile web add dsh-sidecar-conversation@0.2.8
```

安装后重启 DSH Web，再刷新页面。保留原有 `DSH_HOME`，即可保留会话与侧问历史。无需修改 DSH 源码，也不需要安装 Better Sidebar。版本 `0.2.8` 的统一列表已在未修改的 DSH `0.2.1-rc.3` 隔离实例上验证。

在已完成的回答中选中文字，或点击「侧问这个回合」，选择 Fork 或仅带引用的新会话，即可在右侧提问。

## 0.2.8：原生列表与权限生命周期修复

默认使用完整原生会话列表，行样式、工作区管理、搜索、置顶和归档由 DSH 负责。底部可切换到插件的侧问层级视图，保留已有明确选择。

未发送的侧问不再占用工作区可复用的空会话，普通“新建会话”保持原生默认权限，避免误用旧侧问权限而显示 Custom。首次发送及历史空侧问恢复均保留原生日志，不重写主会话权限。

[实现边界与完整验证记录](./docs/native-list-lifecycle-2026-10-26.md)

## 90 秒实操演示

[![点击观看：看不懂就侧问，不污染主 Session 上下文](./docs/images/sidecar-demo.jpg)](https://www.bilibili.com/video/BV1NKHP63E7h/)

[在 B 站观看](https://www.bilibili.com/video/BV1NKHP63E7h/)：隔离环境的真实多轮对话，演示 Fork、仅带引用的独立会话、逐项追加引用、精确回跳、原生输入框和历史恢复。横屏保留完整页面，用红圈指向当前焦点；等待已剪辑，部分操作加速，旁白为 AI 配音。

## 可以怎样用

- **解释一段回答**：圈出不理解的文字，带着引用在旁边追问。
- **继续已有侧问**：把新的选文或整个回合追加到最近使用的侧问，保留正在编辑的问题。
- **从旧回合换个方向**：Fork 当时的上下文，主会话继续原来的工作。
- **只带引用重新开始**：创建独立会话，使用明确选中的内容和新问题，不继承整段聊天历史。

右侧聊天复用 DSH 原生输入框：支持上传文件、选择模型和推理等级、调整权限，以及原生消息、工具调用、审批、停止和错误展示。侧问可以持续多轮，不是一次性的弹窗问答。

## 两个入口，相同的选择

在已完成的 Assistant 回答中拖选文字，或点击回合末尾的「侧问这个回合」，都会打开操作菜单。

| 菜单选项 | 选文入口 | 整回合入口 |
| --- | --- | --- |
| 追加到最近侧问 | 向目标草稿添加这段选文 | 向目标草稿添加整个回合引用 |
| 从此回合 Fork | 继承截至选文所属回合的历史，并带上选文引用 | 继承截至该回合的历史，并带上回合引用 |
| 仅用选文新建／仅用此回合新建 | 新会话只带这段选文 | 新会话只带该回合的最终 Assistant 回答 |
| 添加到主会话 | 将选文引用追加到当前主会话输入框 | — |

只有当前主会话下存在已创建、标签尚未关闭的侧问时，才显示「追加到最近侧问」。两个入口均提供两个新建选项，可用时在最前面增加追加选项；选区菜单末尾另有“添加到主会话”。右侧栏收起但标签仍打开时，追加会重新展开并切到目标侧问；已关闭标签和未准备完成的草稿不参与选择。

创建方式在左侧菜单里确定。选择新建时就准备对应 Session，右侧直接打开原生输入框；不必再选一次，也不会在准备时自动调用模型。新草稿只带这次来源，不复制其他侧问的选区。

## 从引用到多轮聊天

1. 在左侧选择文字或回合，并决定追加、独立新建或 Fork。
2. 在右侧编辑问题，按需上传文件、选择模型与权限。可以继续从左侧逐项添加引用，也可以移除草稿中的某一项。
3. 点击草稿引用可返回来源：选文只高亮对应文字，整个回合引用才高亮回合；发送后仍可在消息历史中点击。
4. 发送后继续在当前侧问聊天。切换主会话、关闭重开或刷新页面，会按各自子 Session 恢复内容，避免串选区或跳回旧侧问。

选文最多 4,000 字符。「整个回合」引用指向该回合的最终 Assistant 回答；独立会话带入的是这条明确引用，只有 Fork 才继承之前的聊天历史。来源被删除或无法读取时会提示错误并保留引用。

## Fork 与独立会话

| | 关联侧问（Fork） | 独立新会话 |
| --- | --- | --- |
| 上下文 | 继承到所选回合为止的主会话历史 | 只接收明确添加的引用和问题 |
| 原生关系 | 主会话的子 Session | 无原生父会话，与主会话同级 |
| Fork 进度 | 显示分叉回合和落后轮数，可跳转来源与最新主回合 | 提示仅带入引用，没有 Fork 差距 |
| 历史入口 | 列在来源主会话的侧问历史里 | 同样可从来源会话的侧问历史找回 |

Fork 是分叉时的上下文，不会实时追随主会话。主会话继续产生回合时，右侧提示会更新；追加新引用不会减少落后轮数，也不会自动合并之后的主会话历史。

两种会话都沿用来源工作区。菜单新建使用 DSH 原生只读预设与权限菜单。创建参数 `inherit` 一次性复制主会话当前的预设，后续权限调整相互独立；真正的自定义权限保留原生沙箱与审批值。允许写入的工具会修改同一工作区文件。只读不表示网络隔离。侧问消息保存在自己的 Session 中，不自动写回主会话。

## 标题、历史与恢复

初始标题取首次问题摘要。创建后，左侧列表、右侧标签和侧问历史读取原生 Session 标题；手动重命名会同步。关联侧问通过原生行首的 `↳` 和悬浮信息标记，原生运行状态标识优先显示。历史由插件内的只读适配器读取现有工作区视图 store，同步手动顺序、最近更新、置顶和工作区分组；折叠分组不会隐藏历史条目。

「侧问历史」提供新建、重新打开、归档和恢复。关闭标签只关闭视图，不会停止后台生成；归档是插件历史状态，不删除原生会话。历史新建从主会话最近一条已完成回答开始，仍可选择 Fork 或独立会话；还没有已完成回答时会提示先完成一轮。

正文、回复、附件和工具事件使用 DSH 原生 Session 能力。侧问索引保存在 `sidecar-conversation.json`，草稿和标签布局属于浏览器状态。清除浏览器数据后，已发送对话可从历史重开；未发送草稿无法靠 session log 恢复。[原生 session log 的职责与升级边界](./docs/native-session-log.md)

## 安装前先确认 DSH 兼容性

版本 `0.2.8` 使用 DSH 公开 API，统一列表在未修改的 `0.2.1-rc.3` 上验证，无需修改 DSH 源码或安装 Better Sidebar：

- `sidebar.session.row.leading` / `sidebar.session.row.hover`：已有的公开行装饰插槽；标题继续使用原生实现。
- `sidebar.workspaces` / `shell.overlay`：通过公开插槽账本复用现有 root 视图 store handle，复用原生偏好和排序操作；列表由插件统一渲染，不另存会话排序。

所有侧问扩展均在插件内，不需要修改 DSH 源码，也不使用定制的 `uiWorkspace.sessionOrder` 和 `sidebar.workspaces.session.title`。插件通过公开侧栏插槽提供可折叠会话层级，以插件索引关联父子会话；独立新会话保持顶层。标题、排序数据、输入框、引用及 session log 复用原生能力。默认显示完整原生列表；底部“原生列表 / 侧问层级列表”切换会记住选择。层级视图仍由插件渲染，复用原生状态与操作，但不宣称复用了未公开的原生行组件。原生列表的功能和样式随 DSH 更新；层级视图仍需适配验证。即使 DSH `rc.3` 的普通 Fork 日志不再记录父会话，插件索引仍能提供层级。

未发送的独立侧问保留原生 Session 与日志，但暂不加入工作区成员，避免被原生“新建会话”当作空会话复用；首轮开始后再加入。旧版未发送侧问同样从工作区成员中移出，仍可从侧问历史打开，不改权限或删除日志。普通新会话完全使用 DSH 原生默认权限。

[完整兼容性说明](./docs/compatibility.md)

源码开发时，通过 DSH Web profile 安装本地构建的插件：

```sh
pnpm install --frozen-lockfile
pnpm check
pnpm test
pnpm build
dsh plugin --profile web add link:$(pwd)
dsh --profile web --dump-config
```

安装后重启目标 Web 实例。`--dump-config` 只证明配置组合成功；还应打开页面确认插件运行。联调构建应使用独立 DSH_HOME、端口和插件目录，避免影响日常实例。卸载使用 `dsh plugin --profile web remove dsh-sidecar-conversation`。[开发与验证方法](./docs/development.md)

## 验证记录

插件 176 项测试与类型检查通过；发布包经过独立构建、入口检查、干净安装与 Host 入口导入验证。浏览器和真实模型回归的范围分别记录在以下文档中：

- [原生 Markdown／表格选文校验与完整引用链路回归](./docs/markdown-reference-2026-10-24.md)
- [菜单顺序调整与验证](./docs/release-0.2.4.md)
- [精确选文高亮与原生权限预设](./docs/release-0.2.3.md)
- [Windows 目录 fsync 修复与 Windows/Linux CI](./docs/release-0.2.2.md)
- [官方 npm DSH 上的插件内适配验证](./docs/plugin-only-2026-10-24.md)
- [双入口、切换主会话、关闭重开、刷新与引用回跳](./docs/regression-2026-10-24.md)
- [0.2.0 原标题与顺序部署记录](./docs/title-order-2026-10-24.md)
- [原生 Session 与插件之间的架构边界](./docs/architecture.md)

这些结果不代表 DSH 全量 Web 检查全部通过；已知基线失败和未覆盖范围在对应记录中列出。

## License

[Apache License 2.0](./LICENSE)

“添加到主会话”位于选区菜单末尾，不会创建或切换侧问。引用沿用原生草稿和用户消息持久化；发送前后均可点击定位并高亮选文。

- [渲染选文、主会话引用与 GenUI 回归（未发布）](./docs/rendered-reference-2026-10-29.md)
