前言¶
在 DSH(DeepSeek Harness)里跑智能体时,会话往往按追加式日志(append-only journal)一路向前:用户发一句、模型回一句,后面再改前面某条,要么动底层记录,要么上下文和屏幕上看到的不一致。常见做法是开新会话重来,或手工删消息,工具调用链还容易留下「孤儿」结果。
时空编织者(dsh-time-weaver)是社区维护的工作流类 DSH 插件,由 YumenoSayuri 发布在 GitHub(YumenoSayuri/dsh-time-weaver)。它在不改写底层日志条目的前提下,通过 hook/invoked 事件追加落盘,对用户消息回溯、AI 回复编辑、语义撤回与重新生成做完整支持;关闭客户端或切换历史会话后,编织状态仍成立,对插件安装前创建的旧会话同样有效。
这是什么¶
包名 @local/dsh-time-weaver,当前版本 1.0.9(2026-10-21),MIT 许可。实现由 Nova 与辉宝主人联合完成,思路受 @xsj/dsh-rewind 启发,并按 DSH 现行 API 重写。
插件分 Host(host.v8.js)与 Client(client.js)两半:Host 负责事件回放、改写 session.deriveMessages() 投影与 HTTP API;Client 通过 slots 注入按钮与弹窗,对已渲染行做隐藏与回写。模型读到的上下文由投影决定;屏幕显示在宿主渲染之上二次处理,二者通过回合锚 data-chat-turn 等 DOM 约定对齐。
核心功能¶
README 将入口与行为整理为下表,下面按同一事实简述。
| 能力 | 界面入口 | 作用 |
|---|---|---|
| 回溯重填(Rewind) | 用户消息操作行「↺ 回退至此」 | 打断正在跑的回合;隐藏该消息及其后尾部;原文与图片附件回填输入框,可再编辑发送 |
| 取消回溯(Cancel) | 发送按钮左侧「✕」 | 撤销待定回溯,恢复全部行,清空自动回填草稿 |
| 原地编辑(Edit) | AI 回复操作条「✏️ 编辑此回复」 | 弹窗改正文;保存后模型上下文与屏幕气泡同步更新,保留分段换行 |
| 撤回 / 删除(Retract) | AI 回复操作条「🗑️」 | 该条回复从会话中整行隐去;模型侧为可配置占位符(默认 .) |
| 重新生成(Regenerate) | AI 回复操作条「🔄」 | 旧回复隐去并从上下文剔除,主动唤醒新一轮生成;触发消息以 notice 形态折叠为一行提示 |
| 设置(Settings) | 输入区右侧「⚙」 | 选择或自定义撤回占位符 |
所有 AI 侧操作保留前置工具调用链(tool calls / tool results),不产生孤儿工具结果。
若需从脚本或外部工具驱动,HTTP 接口挂在 /api/time-weaver 下,包括 POST /mark、/cancel、/edit、/retract、/regenerate,以及 GET /state、/message、/config 等;完整列表见仓库 README。
环境要求¶
安装前确认宿主与运行时满足 README 中的条件:
- DSH Next(依赖宿主
webServer/sessions/agents与客户端slots) - DSH 0.2.1-rc.2 起用户气泡正文由
conversation.chat.user.contentFactory 渲染;插件优先使用该路径,缺失时回退纯文本 - Node.js >= 20
- 无运行时第三方依赖
安装与启用¶
插件以普通 DSH 插件包挂载,需在 package.json 中声明 dsh.bundle 与 dsh.client。官方说明中的节选如下:
// package.json(节选)
"main": "host.v8.js",
"exports": { ".": "./host.v8.js", "./client": "./client.js" },
"dsh": {
"bundle": { "patch": "./cordis.patch.yml" }, // 挂载 host 半边
"client": { "platform": "web", "immediately": true, "inject": ["@deepseek-ai/dsh-client-ui-slots"] }
}
把本包加入你的 DSH profile 依赖并列入 dsh.profile.bundles,然后重启 DSH(host 半边在进程启动时加载)。客户端半边随页面刷新即可生效。
资料中未给出单独的 dsh plugin add 一行命令,请按你当前 profile 的依赖管理方式引用该包,勿凭仓库名自行拼接未在文档出现的安装命令。
典型用法¶
下面按界面操作顺序说明常见流程;具体按钮文案以 Web 客户端为准。
回溯并重发
- 在用户消息行点击「↺ 回退至此」。若 agent 正在跑,会先打断。
- 该消息及其后的对话在屏幕上隐藏;正文与图片回到输入框,可修改后重新发送。
- 若不想回溯,点发送区左侧「✕」取消,恢复全部行并清空草稿。
- 回溯区间在下一回合的
agent/pre-step由宿主固化;新发的消息及其回复不会被误藏在旧尾部里。
改一条 AI 回复而不重跑整段
- 在目标 AI 回复操作条点「✏️ 编辑此回复」。
- 在弹窗中改正文并保存;模型后续轮次读到的是新正文,气泡就地更新。
语义撤回或重新生成
- 撤回:点「🗑️」,该行从界面隐去,上下文里该条变为占位符(可在「⚙」里改默认
.)。 - 重新生成:点「🔄」,旧回复隐去并剔除上下文,插件调用
followup()开新一轮;界面上会出现一行 notice 形态的折叠提示,而不是新的用户气泡。
排查异常
客户端与宿主会向 ~/.dsh/time-weaver-diag.log 追加 JSON 行(超过 512 KiB 自动截断),记录 boot、回溯标记、状态应用、重新生成等事件,无需打开 DevTools 即可对照 README 中的 v 字段含义。
适用场景与注意¶
适合谁
- 需要在长会话里「回到某条用户话重新问」,又不想丢工具链或手改 journal 的 DSH Next 用户。
- 需要就地改模型回复、用占位符语义删除某条 assistant 消息,或在不重复粘贴提示词的情况下重新生成最后一条回答的场景。
使用前要知道的限制
- 屏幕层是二次处理,依赖 DSH 当前聊天 DOM(如
data-chat-flow-key、data-chat-turn)。大版本调整 DOM 时,插件可能需要更新选择器。 - 一个回合可含多个 assistant 步骤;编辑、撤回、重新生成作用在该回合的最终回答上。
- 重新生成会额外落一条 notice 形态的上下文消息,这是触发新一轮的必要输入。
- 回溯区间一旦提交即持久化;界面不能撤销已提交的隐藏区间(README 写明需直接改日志)。
安全与权限
插件以当前 DSH 进程权限运行,可读写会话状态与 ~/.dsh/time-weaver-diag.log。安装前请阅读源码与 MIT 许可证,仅从可信来源引入 profile 依赖。
结尾¶
时空编织者在保留不可变追加日志的前提下,把回溯、编辑、撤回和重新生成做成一套可持久化的会话流控制;Host 改投影、Client 改视图,工具链保持完整。