dygin/dsh-recover-context

dygin/dsh-recover-context

回退到任意一条提问之前,或编辑上一条问题重新提交;被丢弃轮次产生的工作区文件会一并还原。

UI 強化dsh-plugin-marketdsh-plugins

dsh-recover-context

v1.1.2 · 适配 DeepSeek Harness 0.2.1+

恢复上下文插件。

  • ↶:点击后,这个问题及其之后的所有内容(对话上下文 + 工作区里产生的文件变更)都会被回退掉——旧会话归档保留日志,新会话从提问之前继续。之后你可以换个方向重新提问,模型不会再被错误的上下文干扰。
  • ✎:点击把原问题文本载入输入框,此时不改变任何上下文;编辑后提交的那一瞬间执行回退并重新提问。

安装

dsh plugin --profile web add dsh-recover-context@latest

安装后插件会自动挂载到 web 组合,无需手工编辑 cordis.patch.yml。

本版本要求 DSH >= 0.2.1-rc.2:使用了该版本的 Connection Fetch 路由、SessionPersistence 与
uiConversation / useChat 客户端契约,与更早的版本不兼容。

工作区追踪

插件把工作区快照存放在 ~/.dsh/storages/recover-context// 下(绝不写入工作区):

baseline.json      基线元数据索引(仅 {路径: {sha,size,mtime}},不含文件内容)
turn-<n>.json      每轮结束时的元数据索引
blobs/<sha>        按内容寻址(CAS)存储的文件内容
  • 基线/逐轮索引:只记录文件清单与哈希,单个 JSON 通常在几十 KB 量级。
  • 内容按哈希去重:文件内容按 SHA-256 存成独立 blob,跨轮次、跨同名文件自动复用;恢复时按索引取回。
  • 流式哈希与原子落盘:SHA-256 用流式计算;所有 JSON 与 blob 先写临时文件再 rename,进程中断不会留下半成品。
  • 自动读取 `.gitignore`:遍历时解析工作区根目录的 .gitignore(支持通配符、目录规则、! 取反),大型数据目录不会被扫描。
  • 被忽略路径也会被回退:被忽略路径不备份内容,但会记录其存在性索引。回退时只删除「本会话新增」的

产物(如 dist/、build/、*.log),会话开始前就存在的同类文件保持不动。

  • 基线在会话创建时采集:早于任何提问与工具调用,因此稳定代表"工作开始前"的状态。

这正是编辑/回退能可靠撤销本轮产物的前提。

  • 子会话继承父会话历史:回退后打开的新会话会继承父会话的基线与已完成的逐轮快照,

因此在其中继续编辑/回退同样能撤销此前轮次的产物,而不是逐层失效。

  • 跨会话识别遗留产物:插件维护一份工作区级产物台账,记录每个会话产出过哪些文件。

上一个对话留在工作区里的产物,会在下一个会话回退/编辑到基线时被一并清除—— 前提是内容与台账记录完全一致(被改动过的文件视为用户资产,绝不删除)。

  • 还原失败不会静默通过:目标快照不可用时接口报错、客户端中止流程,绝不出现

"对话回退了但文件没动"的不一致状态;还原后还会自检文件是否真的已删除。

  • 安全上限:maxFiles(默认 100,000)与 maxTotalBlobBytes(默认 512 MiB)防止超大仓库失控。

单文件默认不限体积(流式复制,内存恒定),可用 blobSizeCap 显式收紧。

配置

可选配置文件:~/.dsh/storages/recover-context/config.json

{
  "enabled": true,
  "enableGitignore": true,
  "ignoreNames": [".git", "node_modules", ".pnpm-store", "dist", "build", ".venv", "__pycache__", ".DS_Store"],
  "ignorePatterns": ["*.pyc", "*.log", "*.tmp"],
  "trackSizeCap": 104857600,
  "maxFiles": 100000,
  "maxTotalBlobBytes": 536870912,
  "ioConcurrency": 8,
  "cleanupPreviousArtifacts": true
}

字段 · 说明 enabled · 总开关,false 时完全停止采集 enableGitignore · 是否解析工作区 .gitignore ignoreNames · 按名字忽略的目录/文件 ignorePatterns · 按文件名通配符忽略 trackSizeCap · 超过该大小的文件只记录 size+mtime,不计算哈希、不备份内容(默认 100 MiB) blobSizeCap · 可选:单文件内容备份上限,默认不限制(受 maxTotalBlobBytes 兜底) maxFiles · 扫描文件数上限,超出即停止并告警 maxTotalBlobBytes · 单个会话可备份的 blob 总字节上限 ioConcurrency · 哈希计算与 blob 写入的并发度 cleanupPreviousArtifacts · 回退/编辑到基线时,是否清除上一个对话遗留的产物(默认 true;只删内容未被改动过的)

License

Apache-2.0