时空编织者(Time Weaver):在不可变日志上控制 DSH 会话流

前言

在 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.content Factory 渲染;插件优先使用该路径,缺失时回退纯文本
  • 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 客户端为准。

回溯并重发

  1. 在用户消息行点击「↺ 回退至此」。若 agent 正在跑,会先打断。
  2. 该消息及其后的对话在屏幕上隐藏;正文与图片回到输入框,可修改后重新发送。
  3. 若不想回溯,点发送区左侧「✕」取消,恢复全部行并清空草稿。
  4. 回溯区间在下一回合的 agent/pre-step 由宿主固化;新发的消息及其回复不会被误藏在旧尾部里。

改一条 AI 回复而不重跑整段

  1. 在目标 AI 回复操作条点「✏️ 编辑此回复」。
  2. 在弹窗中改正文并保存;模型后续轮次读到的是新正文,气泡就地更新。

语义撤回或重新生成

  1. 撤回:点「🗑️」,该行从界面隐去,上下文里该条变为占位符(可在「⚙」里改默认 .)。
  2. 重新生成:点「🔄」,旧回复隐去并剔除上下文,插件调用 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 改视图,工具链保持完整。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜