Skip to main content

文件检查点与回滚

每当 Agent 执行破坏性命令(文件编辑、Shell 命令)时,Myrm 会自动创建 Shadow Git 快照。你可以查看变更、选择性恢复文件,Agent 会自动适应你的回滚操作。

批量原子编辑

当 Agent 需要在同一文件内修改多处(批量改 import、更新多个常量等),file_edit_tool 支持 edits 数组(最多 20 条),并在单次原子事务中完成:
  • 一次读、一次写 — 全部替换在内存中完成后再统一落盘
  • 重叠预检 — 原文中搜索区域重叠的 edit 会被 upfront 拒绝
  • verify 全批回滚verify_command 失败(如语法检查)时,整批 edit 一并撤销
  • UI — 进度面板展示合并 diff,含 --- edit 1 ------ edit 2 --- 分段
避免「第 3 段失败但前 2 段已写坏文件」的多轮调用经典故障。已通过 Chrome LIVE WebUI E2E 验证(真实 LLM + 真实 workspace 写盘)。

工作流程

1

自动快照

在任何破坏性操作前,系统透明地使用隔离的 Shadow Git 仓库快照所有跟踪文件——完全独立于项目的 .git
2

可视化时间线

打开历史面板查看所有快照的时间线。每张卡片显示哪些文件被更改,并附带行级统计(+X/-Y 行)。
3

选择性恢复

选择特定文件回滚,同时保留其他更改。也可以全量恢复并通过确认对话框二次确认。
4

Agent 自动感知

恢复文件后,Agent 在下一轮对话时自动检测到回滚操作并重新读取受影响的文件——无需手动干预。

多智能体活动视图

当多个 Agent 协作时,每个快照自动标记触发它的 Agent 名称。快照面板提供:
  • Agent 名称标签 — 每张快照卡片显示负责 Agent 的名称(蓝色标签)
  • 按智能体过滤 — 当 2+ 个 Agent 产生快照时,过滤栏自动出现,支持查看特定 Agent 的快照
  • SSE 实时刷新 — 新快照通过 Server-Sent Events 自动出现,500ms 防抖(无需手动刷新)
轻松回答”哪个 Agent 改了什么?“并在需要撤销某个 Agent 的工作时进行精准回滚。

外部副作用预警

当命令涉及文件系统之外的不可逆副作用时,Myrm 自动标记: 恢复包含这些操作的快照时,UI 显示清晰警告:
“文件将被恢复,但此命令期间的数据库/网络/容器操作无法撤销。“

零配置

文件检查点开箱即用:
  • 无需配置 — 所有部署模式默认启用
  • 不污染 Git — Shadow Git 完全隔离于项目之外
  • 零性能影响 — 异步快照,3 秒超时保护
  • 自动存储管理 — 每项目 50 个快照、全局 2GB 上限、自动清理

存储架构

Shadow Git 使用共享裸仓库和按项目分支:
  • 内容去重 — 跨项目相同文件只存一份
  • 孤儿清理 — 已删除项目自动修剪
  • 损坏修复 — 检测到损坏时自动 git fsck + repack
  • 全局 GC — 定期垃圾回收保持最小磁盘占用

崩溃恢复

服务器在任务中途崩溃时:
  1. LangGraph 持久化 SQLite 检查点在每个图节点转换时保存完整状态
  2. 重启时 OfflineDurableTask 检测中断的任务
  3. 从精确断点恢复任务——无需用户重新操作
这在架构上优于手动检查点回调(某些竞品的做法),因为状态在每个图节点转换时自动捕获,而非仅在手动标注点保存。

6 层中断自愈体系

文件检查点只是 Myrm 完整中断恢复体系的一层: 无论何种中断——进程崩溃、网络中断、用户暂停或预算用尽——Myrm 都能从精确断点恢复,零数据丢失。

实时 Diff 可视化

Agent 每次修改文件后,Myrm 自动计算 unified diff 并通过 SSE 流式推送到界面——无需刷新。

你看到什么

  • 文件列表 + 变更统计 — 每个被修改的文件显示 +N/-N 增删行数
  • 点击展开 — 内联查看完整 diff,带语法高亮
  • Unified 或 Split 视图 — 一键切换单栏(GitHub 风格)和左右并排对比
  • 语言感知高亮 — Prism.js 根据文件扩展名自动识别语言
  • 行号 — 旧/新行号双列显示
  • 复制 diff — 一键复制原始 diff 内容

工作原理

  1. DiffCollectorObserver(harness 层)拦截每次文件写入/编辑
  2. 基于当前回合的初始快照计算累积 unified diff
  3. 通过 FILE_DIFF SSE 事件推送到前端
  4. FilePathRenderer 显示文件徽标和变更统计
  5. DiffViewer 在展开时渲染完整的交互式 diff

安全限制

  • 长 diff 自动截断至 2000 行,并显示 (truncated) 标记
  • 二进制文件显示 “Binary file changed” 而非乱码
  • DiffViewer 限制 400px 最大高度 + 滚动——不会占满对话区

消息级 Turn Undo(Honest UX)

Agent 修改文件后,WebUI 每条助手消息旁有 Undo。可预览 diff 并仅还原该 turn 内可 revert 的文件。 诚实反馈,不做假承诺: 会话顶部 chips 行提供 会话级 Undo,规则相同。 IM 渠道:/undo 删除最后一轮并还原关联文件;无法还原的路径会在回复中明确说明。 Turn Undo(消息级、会话级或 IM)成功后,Agent 在下一轮会通过 restore_inbox 收到与 Shadow Git 恢复相同的通知,主动 re-read 文件,而不是沿用过时的对话记忆。

空写入拒绝与失败横幅

当 Agent 误调用 file_write_tool 且内容为空、纯空白、或仅含零宽字符/BOM 等不可见字符时,Myrm 不会在磁盘创建误导性文件,而是:
  1. 工具层返回明确错误(Cannot write empty file content
  2. Turn 级 mutation verifier 记录失败
  3. WebUI 在该条助手消息下显示 FileModificationWarning 黄色横幅,告知「文件修改失败 — 变更已自动回滚」
刷新页面后横幅仍会保留(fileMutationFailures 随助手消息 metadata 持久化)。 这样用户不会把模型的「已写入」口头承诺误当成真实落盘。竞品(如 OpenClaw/nullclaw 路径)多数允许空 content 写入,且缺少同等 UI 诚实提示。
Turn Undo 使用轻量 per-message 快照(默认开启、零配置)。下方 Shadow Git 检查点是更深层的命令级回滚,二者互补。

查看后决策

看完 diff 后,你可以:
  • Undo 本消息 — 一键还原该 turn(Honest UX,见上)
  • 确认 — 继续对话,修改保留
  • 回滚 — 使用文件检查点(上方)将任意文件恢复到修改前
  • Agent 自动检测回滚并据此调整后续动作