Skip to content

fix(agent): 回退时恢复会话级附加目录的代码文件#456

Merged
ErlichLiu merged 1 commit into
mainfrom
fix/agent-rewind-session-attached-dirs
May 14, 2026
Merged

fix(agent): 回退时恢复会话级附加目录的代码文件#456
ErlichLiu merged 1 commit into
mainfrom
fix/agent-rewind-session-attached-dirs

Conversation

@ErlichLiu
Copy link
Copy Markdown
Owner

@ErlichLiu ErlichLiu commented May 14, 2026

Summary

修复 Agent 模式下「回退到此处」会话记录回退了、但会话级附加目录里的代码文件没有跟随回退的问题。

根因

发消息(sendMessage)传给 SDK 的 additionalDirectories 包含 5 类来源(用户当次输入、会话级附加目录/文件、工作区级附加目录/文件、工作区文件目录),SDK 据此用绝对路径在 file-history-snapshot 中记录这些目录里被读写的文件备份。

rewindSession 收集 rewindAttachedDirs只取了工作区级附加目录 + 工作区文件目录,遗漏了:

  • sessionMeta.attachedDirectories(会话级附加目录 ← 用户最常用的代码目录)
  • sessionMeta.attachedFiles 的父目录
  • getWorkspaceAttachedFiles(workspaceSlug) 的父目录

rewindFilesFromSnapshot 中的路径越界保护(agent-session-manager.ts:1078)发现备份文件的绝对路径不在 allowedDirs 内,就 console.warn('rewindFiles: 拒绝路径越界 ...') 然后 continue 静默跳过——备份明明存在却不写回。

修复

抽取 collectAttachedDirectories(...) 统一聚合三类来源(临时附加 + 会话级 + 工作区级),sendMessagerewindSession 共用同一份逻辑,保证 SDK 写入快照时使用的目录范围与回退时校验的目录范围始终一致,不会再因为漂移而被越界保护误伤。

Test plan

  • bun run typecheck 全包通过
  • 手动验证:在 Agent 会话中附加一个外部代码目录,让 Agent 修改其中文件 → 触发"回退到此处" → 确认主进程日志不再出现 rewindFiles: 拒绝路径越界 ...,且 rewindFiles: 恢复 /path/to/file ← backup-xxx 实际执行,文件内容回到目标快照状态
  • 同一会话内多轮回退能正确恢复对应轮次的文件状态
  • 工作区级附加目录的回退行为不退化(原本就工作的场景仍工作)

🤖 Generated with Claude Code

rewindSession 收集 attachedDirs 时只取了工作区级目录,遗漏了 sessionMeta.attachedDirectories 与 attachedFiles,导致 rewindFilesFromSnapshot 中
allowedDirs 判断这些绝对路径越界并 continue 跳过,备份存在却不写回——表现为"会话记录回退了,代码没回退"。

抽取 collectAttachedDirectories 聚合临时附加 + 会话级 + 工作区级所有来源,sendMessage 与 rewindSession 共用同一份聚合逻辑,保证 SDK
写 file-history-snapshot 的目录范围与回退时校验的目录范围始终一致。
@ErlichLiu ErlichLiu merged commit cf4a0ee into main May 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant