就地撤回对话到更早消息并还原被改文件
29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/24 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add 280832849/dsh-rewind-lite该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
dsh 原生插件 · chat
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 11 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件
查看扫描证据(共 19 处,展示前 14 条)
- 写入本地文件lib/index.js:191
await mkdir(pendingDir, { recursive: true }); - 写入本地文件lib/index.js:193
await copyFile(sourcePath, staged); - 删除本地文件lib/index.js:199
await rm(staged, { force: true }).catch(() => { - 读取本地文件lib/index.js:213
await stat(metaPath); - 写入本地文件lib/index.js:218
await mkdir(dir, { recursive: true }); - 写入本地文件lib/index.js:228
await rename(capture.staged, join(dir, `${base}.before`)); - 写入本地文件lib/index.js:230
await writeFile(metaPath, `${JSON.stringify(meta, null, 2)} - 读取本地文件lib/index.js:239
anchors = await readdir(dir, { withFileTypes: true }); - 读取本地文件lib/index.js:251
files = await readdir(anchorDir); - 读取本地文件lib/index.js:258
const raw = JSON.parse(await readFile(join(anchorDir, file), "utf8")); - 读取本地文件lib/index.js:291
const info = await stat(path).catch(() => void 0); - 删除本地文件lib/index.js:300
await unlink(path); - 读取本地文件lib/index.js:305
const before = await readFile(staged); - 写入本地文件lib/index.js:312
await writeFile(tmp, before, { mode: entry.mode ?? 420 });
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-commands@deepseek-ai/dsh-llm@deepseek-ai/dsh-session@deepseek-ai/schemastery给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
DeepSeek Harness 插件:同窗口内就地回退对话到更早的用户消息,可一并还原被改过的文件(Claude Code /rewind 语义)
README
由 DeepSeek 最新模型翻译生成dsh-rewind-lite
DeepSeek Harness(DSH)插件:在同一窗口内就地回退对话到任意更早的用户消息,只往会话日志追加一条标记,不新建分支、不删改历史;被撤回的原提示词自动回填输入框,改完直接重发。附带文件还原:回退时把 AI 改过的文件恢复成改动前,目标之后新建的文件删掉。
In-window conversation rewind for DeepSeek Harness: jump back to any earlier user message without forking the session; the withdrawn prompt returns to the composer for editing. Optional file restore brings AI-edited files back to their pre-edit state.
- 纯插件实现:调的是官方扩展点(session.append + surfaceOp.replace、commands、slots、commandUi.decorate、tools/* 事件),不改 DSH 客户端代码。
- 行为对齐 Claude Code 的 /rewind,但只做一件事:就地回退(不建分支、不留副本)。
展开完整文档(README 剩余 1 节)
dsh-rewind-lite
DeepSeek Harness(DSH)插件:在同一窗口内就地回退对话到任意更早的用户消息,只往会话日志追加一条标记,不新建分支、不删改历史;被撤回的原提示词自动回填输入框,改完直接重发。附带文件还原:回退时把 AI 改过的文件恢复成改动前,目标之后新建的文件删掉。
In-window conversation rewind for DeepSeek Harness: jump back to any earlier user message without forking the session; the withdrawn prompt returns to the composer for editing. Optional file restore brings AI-edited files back to their pre-edit state.
- 纯插件实现:调的是官方扩展点(session.append + surfaceOp.replace、commands、slots、commandUi.decorate、tools/* 事件),不改 DSH 客户端代码。
- 行为对齐 Claude Code 的 /rewind,但只做一件事:就地回退(不建分支、不留副本)。
已实现(0.4.0)
| 能力 | 状态 |
| /rewind、/undo 命令 | ✅ |
| 裸命令打开官方 popupSelect 选目标 | ✅ |
| 回退到任意更早的用户消息(撤回目标及其之后的所有内容) | ✅ |
| 原提示词回填输入框(setDraft,失败退 DOM) | ✅ |
| 聊天界面隐藏被撤回的行(持久化:刷新/换会话/重启后仍然隐藏) | ✅ |
| 只追加不删改:日志保留全部原文,可搜索、可导出 | ✅ |
| 守卫:生成中先取消再回退、并发回退加锁、被压缩遮蔽的目标拒绝、子会话拒绝 | ✅ |
| 消息旁「↶」按钮(二次确认:只回退对话 / 对话+文件) | ✅ |
| 文件还原:回退时把 AI 改过的文件还原、删掉目标之后新建的文件 | ✅ |
| 撤销回退 | ❌(设计如此,见下) |
安装
要求:DSH >=0.2.1-rc.2 <0.3.0-0,Node 22+。
方式一:直接从 GitHub 装(推荐)
dsh plugin --profile desktop add "github:280832849/dsh-rewind-lite"
方式二:本地打包安装
npm install && npm run build && npm pack
dsh plugin --profile desktop add "file:$PWD/dsh-rewind-lite-0.4.0.tgz"
装完重启 DSH(宿主半侧在新的 boot 组装时加载),再刷新页面(客户端半侧)。
卸载:
dsh plugin --profile desktop remove dsh-rewind-lite
若 dsh plugin add 报 ERR_PNPM_UNEXPECTED_STORE(profile 的 node_modules 与 dsh 转发的 pnpm 版本不一致),用同版本 pnpm 包一层再执行:
PATH=<pnpm11 shim>:$PATH dsh plugin --profile desktop add …。
使用
1. 输入 /rewind(或 /undo)→ 弹出候选列表(最新的在前)。
2. 选一条 → 回退执行:模型上下文截断到这条消息之前,界面隐藏这条及其之后的行,原提示词回到输入框。
3. 修改后直接发送。
也可以手输 /rewind @123 直接指定目标(seq 见候选列表),效果相同。
文件快照(v0.4.0)
- 写前备份:write / edit 工具执行前把原文件按字节暂存,执行成功后按「最近一条用户消息 seq」锚点提交。
- 回退还原:回退到 N 时,每个文件取「锚点 >= N 的最早一条」——N 之后第一次被改之前的状态;当时不存在的文件(= N 之后新建的)直接删掉。
- 存储:<DSH_HOME>/rewind-lite-snapshots/<sessionId>/<anchorSeq>/(只留最新几组,不自动清理,体积很小)。
- 安全:只还原记录过、且落在会话工作目录内的普通文件;符号链接、超 5MB 的文件不备份也不还原;写回用「同目录临时文件 + rename」保持原子性。
- 不备份:子代理会话的写操作;插件加载之前发生的改动(没有备份可用)。
原理(一句话版)
回退 = 往会话日志追加一条 user/message 标记,带 surfaceOp: {op:'replace', startSeq, endSeq} 覆盖「目标消息及其之后的所有表面节点」。DSH 重放日志时,模型可见表面自动从目标处截断;日志本身一个事件都不动。
客户端另算一遍:扫描持久化的 command 节点(@seq + outcome.sourceEventSeq)得到撤回区间,把落在区间里的 DOM 行隐藏。
已知限制
- 回退不可撤销:想恢复只能重新发消息;被撤内容仍在日志里,但界面上没有一键恢复。
- 文件不还原:AI 已经改过的文件不会跟着回退(P2)。
- 目标消息被压缩(compaction)遮蔽后不能再回退到它——模型上下文已经到不了那里。
- 回退标记会短暂出现在模型上下文里(内容为 (已回退,等待重新发送)),用户重发后与新消息并存,属正常现象。
- 「对话+文件」会覆盖你在 AI 之后又手动改过的文件——这是还原的定义,介意就只选「只回退对话」。
- 文件备份从插件加载后开始记录;插件装上之前的改动没有备份,无法还原。
维护须知
唯一脆弱点:客户端 DOM 约定
客户端依赖 harness 内部属性定位聊天行与输入框:
| 选择器 | 用途 |
| [data-chat-anchor-key] / [data-chat-node-key] | 聊天行 → 快照节点 → anchorSeq(判断是否隐藏) |
| [data-composer-input] | 输入框 DOM 兜底回填 |
这些属性随 UI 升级可能改名。DSH 大版本升级后第一件事:在浏览器里确认这两类属性还在;不在就改 src/client/index.js 里的选择器与 applyHidden() 的解析逻辑。
其它升级适配点
1. session.snapshotEvents() 已标记为 deprecated —— 如果某次升级把它删掉,就改用新的只读事件读取 API(src/host.js 里有两处调用)。
2. surfaceOp 的 replace 语义与 sourceEventSeqs 完整性校验 —— 如果语义变了,src/marker.js 和 src/host.js 的 append 调用要跟着改。
3. uiConversation 服务的 binding().target('chat') 视图名与 conversation.input.for(scope).setDraft —— 如果改名,就改 src/client/index.js 的 chatOf / setComposerText。
4. commandUi.decorate 的 popupSelect 契约 —— 如果变了,就退化成「裸命令只列候选、手输 @seq 执行」。
改动流程
npm run build # esbuild:宿主 ESM + 客户端 __ModuleLoader__ 闭包
npm test # 34 个离线测试(真 SDK 建会话 + 纯逻辑 + 宿主命令面)
npm pack # 出 tgz,供 dsh plugin add
升版本前必须先跑测试:test/session.test.mjs 用真的 @deepseek-ai/dsh-session 验证「追加标记 = 表面截断」。这个测试挂了,就说明 SDK 语义变了,插件必须改,不能硬装。
致谢
思路与兼容性经验来自 SiriLee/dsh-rewind(MIT):本项目的回退语义、客户端隐藏行与输入框回填的做法与其一致,代码为独立实现,只保留「就地回退 + 轻量文件快照」这一件事。
License
MIT预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
280832849/dsh-rewind-lite
就地撤回对话到更早消息并还原被改文件
相关插件 · 对话 / 记忆
上下文中枢oceanbase/powercontext
上下文跟着工作走 —— 跨会话、跨智能体、跨人。
★ 1,489已汉化DSH
73.1
智能体记忆库plastic-labs/honcho
Honcho 是记忆基础设施,用来构建有状态的智能体。这些智能体能理解不断变化的人、智能体、群组、项目和想法。
★ 7,918已汉化DSH
71.7
长程智能体控制面loopx-project/loopx
给 Agent 一个目标,让工作持续向前。
★ 6,358已汉化DSH
71.3
智能体上下文数据库volcengine/OpenViking
给 AI 智能体用的上下文数据库
★ 41,453已汉化DSH
71.3
长效机器人团队Fei2411/DS-Bot
Download DS Bot for Windows 10/11 64-bit / 下载 Windows…
★ 5,293已汉化DSH
71.2
可携带记忆层EverMind-AI/EverOS
为什么选择 EverOS
★ 13,797已汉化DSH
71.1
这是你的仓库?认领条目