前言¶
在 DSH 会话中,一条用户消息发出后,后续内容会沿着这条消息继续展开。如果希望从某条用户消息处重新组织输入,同时不破坏已有会话日志,也不想让回退状态在进程重启后丢失,就需要一个在会话层面做回退的插件。
@xsj/dsh-rewind 提供这种能力:选择任意一条用户消息,将该消息及其后的内容从聊天视图和模型上下文中截掉;该消息文本回到输入框中,可编辑、可取消;发送后,模型只看到截断后的历史和新消息。
插件定位¶
@xsj/dsh-rewind 是 DSH 会话回退插件,由 XSJUSTC 维护,许可证为 MIT。
它以永久 bundle 插件形态提供,包含宿主机半和 Web 客户端半,无任何 npm 依赖。仓库地址:
https://github.com/XSJUSTC/dsh-rewind
核心能力¶
该插件在 DSH 的 Web 客户端会话中提供回退入口,主要能力如下:
- 每条用户消息的操作行中出现回退图标。
- 如果模型正在思考或输出,点击回退会立即打断当前回合。
- 被选择的消息及其后的所有内容会在聊天视图中隐藏。
- 被选择的消息文本会自动填入输入框,未发送,可编辑。
- 回退待发送期间,输入框上方出现提示横幅。
- 发送按钮左侧出现「取消回溯」入口,点击后恢复被隐藏消息,草稿保持不变,不发送任何内容。
- 发送后回退生效,被隐藏消息不再出现在聊天视图和模型上下文中。
- 仅用户消息可回退,DSH 助手消息没有回退入口。
- 会话日志保持 append-only 事件流,从不删除原始消息。
- 进程重启后打开会话,Host 半会回放回退记录,重建隐藏区间。
安装与启用¶
插件要求 Node.js 环境满足:
engines.node >=20
Client 半会通过 window.__ModuleLoader__ 从外壳的冻结模块表获取以下模块:
react
@deepseek-ai/dsh-client-ui-primitives
@deepseek-ai/dsh-client-ui-attachment
安装时,先把仓库克隆到本地,然后在任意目录执行:
dsh plugin --profile web add <本仓库目录的绝对路径>
这里的 <本仓库目录的绝对路径> 是占位符,需要替换为本仓库在本地磁盘上的克隆位置。
安装后,重启 DSH 进程,并刷新浏览器页面。
使用流程¶
- 在 DSH 的 Web 客户端中打开一个会话。
- 找到任意一条用户消息,点击其操作行中的回退图标。
- 如果模型正在思考或输出,点击回退会立即打断当前回合。
- 被选择的消息及其后的内容会从聊天视图中隐藏。
- 被选择的消息文本会填入输入框,此时尚未发送,可以继续编辑。
- 如果决定放弃回退,点击发送按钮左侧的「取消回溯」,被隐藏的消息会恢复,草稿保持不变,不会发送任何内容。
- 如果确认回退,直接发送当前输入框中的消息。
- 发送后,被隐藏的消息不再出现在聊天视图中,也不会再进入模型上下文。
日志与重启¶
该插件不会删除会话日志中的原始消息。会话日志仍是 append-only 事件流。
每次状态变化会追加一条 hook/invoked 事件,负载包含:
source: 'xsj.rewind'
phase: 'mark' | 'cancel' | 'commit'
targetSeq
hiddenFrom?
hiddenTo?
preview?
该 hook/invoked 事件类型属于本构建的已知保留词条,无读写方,重载安全。
进程重启后打开会话,Host 半会回放这些记录,重建隐藏区间,使模型侧与 UI 侧的隐藏状态跨重启保持一致。
卸载¶
执行:
dsh plugin --profile web remove @xsj/dsh-rewind
然后重启 DSH 完成卸载。
卸载后,会话日志中已有的 rewind 记录会无害保留。
使用注意¶
- 仅用户消息可回退,DSH 助手消息没有回退入口。
- 该插件会介入 DSH 会话的聊天视图和模型上下文,安装前建议检查源码、依赖和 MIT 许可证。
- 插件以当前 DSH 进程权限运行,应确认其运行环境和仓库来源可信。
- 安装命令中的路径必须指向本地仓库克隆位置,不能只写仓库名。
- 回退待发送期间可以随时取消,取消不会发送内容。
小结¶
@xsj/dsh-rewind 的价值在于让 DSH 会话中的用户消息具备可恢复的回退能力:可以从任意用户消息处重新输入,发送前可取消,发送后截断生效,同时保留 append-only 会话日志,并在进程重启后恢复隐藏区间。
仓库地址:
https://github.com/XSJUSTC/dsh-rewind