DSH 的核心流程由模型可见的上下文决定。当用户输入或助手回复出现错误时,通常只能新建会话或通过 Prompt 修正。dsh-message-edit 插件在消息气泡上提供「修改」按钮,允许开发者直接编辑任意消息,并通过 DSH 核心 surface replace 机制改写模型视角的上下文,同时保留 append-only 日志用于审计。
核心功能¶
- 支持双向编辑:用户消息和助手回复的气泡上均提供修改按钮。
- 正文直接替换:编辑后的文本直接显示在气泡中,支持 Markdown 格式(粗体、表格、代码块、列表)。
- 上下文真正改写:使用
surfaceOp: { op: "replace" }机制修改模型可见上下文,而非仅仅替换显示层。 - Fork 继承与多次修改:分支出新对话时,子会话自动继承已修改的上下文;已修改的消息按钮变蓝,支持二次编辑。
安装¶
dsh plugin --profile web add github:TwilightSpirit/dsh-message-edit
使用方法¶
- 打开任意会话,在用户消息或助手回复的气泡上找到铅笔图标按钮。
- 点击弹出编辑框,修改文本后点「保存修改」。
- 气泡正文直接变成新文本;之后模型看到的上下文也是修改后的版本。
- 已修改的消息按钮会变蓝(提示”已改”),可再次点击继续编辑。
实现原理¶
-
Host 侧(RPC 与 Surface 操作)
插件注册/message-editRPC 通道。通过session.append(type, data, { surfaceOp: { op: "replace", ... } })追加替换事件,定位目标消息(按messageId或seq),改写模型可见的 surface。 -
Client 侧(渲染覆盖与存储)
助手消息覆盖官方插槽conversation.chat.assistant-actions,用户消息覆盖 keyeduser/steering渲染器。编辑后的新文本存储在localStorage覆盖层(dsh-msg-edit:{sessionId}:{seq})中,渲染时优先显示新文本(本地覆盖 + host query 兜底,fork 子会话也能查到)。 -
Fork 继承机制
监听session/created事件。若子会话(header.parentSession存在)的 seed 前缀包含被替换消息,重放对应的 replace 事件,并做幂等检查避免重复。
依赖与配置¶
- 依赖项:
@deepseek-ai/dsh-session(^0.1.0-rc7)@deepseek-ai/dsh-client-ui-conversation@deepseek-ai/dsh-client-connection
- 配置项:无额外配置项,插件开箱即用。
注意事项¶
修改的是「模型看到的上下文」。根据 DSH 的 append-only 安全设计,日志文件中旧内容物理保留,无法抹除,但模型视角和气泡显示均为新文本。
插件基于 MIT 许可证开源,维护者为 TwilightSpirit。更多详情请查看 GitHub 仓库 或 DSH 生态目录。