oh-my-pi 的 rewind 工具以会话树分支剪除探索上下文并保留调查报告【免费下载链接】oh-my-pi⌥ Coding agent with the IDE wired in项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-pirewind 是 oh-my-pi 编码代理coding-agent中与 checkpoint 配套的会话管理工具。它的核心使命是结束一个活跃的 checkpoint通过会话树分支机制剪除此前的探索性上下文同时把一份简洁的调查报告保留进后续对话。读完本文你将掌握 rewind 的注册与可见性规则、输入输出契约、11 步完整执行流程、四种运行模式、副作用边界与全部错误场景并能从 checkpoint.ts、agent-session.ts 等源码层面理解其实现原理。工具定位为什么编码代理需要 rewind在长时间编码任务中代理往往会在一个方向上进行大量探索阅读源码、运行命令、尝试方案然后发现此路不通。如果这些中间过程全部保留在上下文里不仅占用 token 预算还会干扰模型对后续任务的判断。oh-my-pi 给出的答案是 checkpoint/rewind 这一对工具checkpoint在探索开始前记录当前会话树位置与目标rewind在探索结束后把上下文“回卷”到 checkpoint 处同时保留一份非空的调查报告作为此后对话的延续依据。用文档原话概括rewind 的职责是 End an active checkpoint by pruning exploratory context and retaining a concise report——结束活跃 checkpoint通过剪除探索性上下文并保留一份简洁报告。它不恢复文件系统、不做 git 回滚它只操纵会话树与会话上下文。源码入口与协作组件rewind 不是独立实现而是横跨多个模块的协作功能。核心入口与协作关系如下角色文件职责工具入口packages/coding-agent/src/tools/checkpoint.tsRewindTool类定义、参数 Schema、execute()校验与返回模型侧提示词packages/coding-agent/src/prompts/tools/rewind.md面向模型的一句话描述结束活跃 checkpoint回卷上下文并用报告替换中间探索执行编排packages/coding-agent/src/session/agent-session.tsAgentSession校验 pending rewind 状态、执行实际回卷、注入保留报告会话树分支packages/coding-agent/src/session/session-manager.tsbranchWithSummary()分支持久化会话树并追加 summary/report 条目上下文重建packages/coding-agent/src/session/session-context.tsbuildSessionContext()把持久化的branch_summary条目转换为模型可见的branchSummary消息工具注册packages/coding-agent/src/tools/index.ts注册rewind工具并共享checkpoint.enabled门控checkpoint与rewind在源码中被明确定义为一对互操作的类checkpoint.ts 中CheckpointTool与RewindTool共享CheckpointState、CompletedRewindState等接口定义。注册与可见性规则工具元数据RewindTool的元数据定义在 checkpoint.tsapproval read只读审批级别不需要写权限审批strict true严格模式参数 Schema 约束严格loadMode discoverable可发现加载模型可在工具列表中检索到它执行是单发的single-shotrewind 的副作用不通过流式进度更新暴露而是延后到回合结束统一生效intent固定返回rewinding供意图路由使用。checkpoint.enabled 门控rewind 的可用性由checkpoint.enabled设置控制默认值为false。注册逻辑位于 tools/index.tsif (name checkpoint || name rewind) return ( session.settings.get(checkpoint.enabled) ((session.taskDepth ?? 0) 0 || requestedTools ! undefined) );即顶层会话taskDepth 0在开启checkpoint.enabled后可见该工具子代理默认不可发现但可以通过显式的tools:/requested-tools 列表获得。安全配对checkpoint 与 rewind 自动互带由于 checkpoint 和 rewind 是一对安全工具只注册其中一个会导致代理“只能存档不能回卷”或反之而陷入困境。因此 tools/index.ts 实现自动互带只要checkpoint.enabled开启frontmatter 的tools:列表中显式请求了其中一个另一个会被自动追加。该配对逻辑即使对受限会话restricted session同样生效。xd:// 协议形态在普通的tools.xdev会话中可发现的内置工具可能以xd://rewind的形式呈现而显式请求的工具则保持在顶层。这一约定与 oh-my-pi 其他内置工具的暴露方式一致。输入输出契约输入参数rewind 只有一个必填参数Schema 定义在 checkpoint.ts字段类型必填说明reportstring是调查发现investigation findings。execute()会先trim()空结果被拒绝输出工具返回单个文本结果并附带结构化details文本正文Rewind requested.Report captured for context replacement.detailsreport: string—— 裁剪后的报告文本rewound: true关键点工具返回值并不是最终的 rewind。AgentSession会等待turn_end然后异步应用 rewind 副作用。也就是说模型调用rewind得到的只是“请求已受理”的确认真正的分支与上下文替换发生在该助手回合结束之后。完整执行流程11 步结合文档与 agent-session.ts 源码rewind 从调用到生效的完整链路如下注册门控RewindTool.createIf()本身总是构造工具实例但注册tools/index.ts强制检查checkpoint.enabled以及顶层/显式子代理可见性规则。前置状态检查execute()在没有活跃 checkpoint 时区分两种状态见 checkpoint.ts存在已完成的 rewind 保留报告抛ToolError(Checkpoint already completed; continue from the retained rewind report instead of calling rewind again.)不存在任何已完成的 rewind抛ToolError(No active checkpoint. Create a checkpoint before calling rewind.)。报告裁剪校验对params.report执行trim()为空则抛ToolError(Report cannot be empty.)。返回受理结果返回toolResult()携带details.report与details.rewound true。提取报告成功的 rewind 工具结果返回后AgentSession通过#extractRewindReport()从details.report或第一个文本内容块中提取报告存入#pendingRewindReport。回合结束触发turn_end时#extractRewindReport()在消息序列中查找 pending 或成功的 rewind 结果调用#applyRewind()。分支并记录 summary#applyRewind()首先调用sessionManager.branchWithSummary(checkpointEntryId, report, { startedAt })在 checkpoint 分支点记录一条branch_summary。若该条目已无法解析记录警告并改为从根节点分支见 agent-session.ts。注入隐藏 rewind-report 消息追加一条持久化的隐藏rewind-report自定义消息。其内容由 packages/coding-agent/src/prompts/system/rewind-report.md 渲染而来——告知下一回合 checkpoint 已完成、不要再调用rewind并附带报告正文details 中包含{ report, startedAt, rewoundAt }。重建上下文并替换消息设置#lastCompletedRewind从新活动分支重建 display/LLM 会话上下文同时替换本回合的活动消息数组与agent.state.messages。探索分支与成功的 rewind 工具结果因此不会出现在下一次 provider 调用中。重置关联状态重置 advisor 会话状态保留成本统计从新分支同步 todo 状态关闭因历史重写而失效的 provider 会话。清理与恢复清空#checkpointState与#pendingRewindReport。此后若会话恢复resume或进行树导航持久化的保留报告会重新水合#lastCompletedRewind。在源码层面第 5~9 步分别对应 agent-session.ts#extractRewindReport与 agent-session.ts#applyRewind。值得注意的是#enforceRewindBeforeYield()agent-session.ts当处于活跃 checkpoint 且存在 pending rewind 报告时代理被强制要求在让出yield前调用rewind避免未完成 checkpoint 就结束回合。四种运行模式 / 变体模式触发条件行为正常回卷Normal rewindcheckpoint 条目存在会话历史从该确切条目分支回退回卷Fallback rewindcheckpoint 条目 ID 在当前会话树中缺失从根节点分支并记录警告Rewind branch checkpoint missing, falling back to root延后回合末应用Deferred turn-end apply正常流程工具结果只请求回卷分支与上下文替换在助手回合结束后进行恢复的 checkpointResumed checkpoint活跃持久化分支上存在未完成的成功 checkpoint 工具结果进程恢复后重新水合 checkpoint 状态允许继续调用 rewind其中“恢复的 checkpoint”依赖#rehydrateCheckpointRewindState()agent-session.ts它会扫描当前分支区分两种历史情形——已完成的 rewind恢复#lastCompletedRewind重复调用会收到“already completed”错误与 checkpoint 后中断恢复#checkpointState下次rewind可正常完成。副作用分析会话状态transcript、memory、jobs、checkpoints、registries从 checkpoint 分支加保留的 summary/report 重建活跃对话历史不恢复文件或进程状态追加隐藏自定义消息rewind-report携带恢复指引与报告正文记录#lastCompletedRewind清空活跃 checkpoint 与 pending 报告重置 advisors从分支重同步 todo 状态关闭因历史重写失效的 provider 会话把持久化会话叶子leaf重新定位到 checkpoint 分支点并追加新的会话条目。文件系统新的branch_summary与custom_message条目通过SessionManager的常规追加持久化写入会话.jsonl文件会话文件命名格式为ISO时间戳-冒号与点被替换_uuidv7.jsonl位于会话目录未显式覆盖时默认目录为~/.omp/agent/sessions/encoded-cwd/。用户可见提示 / 交互 UI工具结果在回合末应用之前即可见持久化的branch_summary在上下文重建时变为模型可见的branchSummary消息compaction 渲染时以用户角色的summary块呈现隐藏的rewind-report自定义消息成为下一次 provider 调用的开发者角色保留指引。后台工作 / 取消rewind 的应用延后到turn_end没有独立的 job 对象或取消句柄。限制与上限门控可用性受checkpoint.enabled限制默认false子代理需要显式的 requested-tools 条目请求任一 checkpoint 工具会自动附带其姊妹工具单 checkpoint 约束一个会话最多一个活跃 checkpoint没有命名、选择或区分多个 checkpoint 的路径报告非空trim()后报告文本必须非空恢复范围rewind 只恢复活跃对话/会话树上下文不存在文件、产物artifact、blob、进程或 git 恢复路径持久化上限持久化的报告/summary 内容受全局会话持久化上限MAX_PERSIST_CHARS 500_000约束。错误处理清单错误消息抛出条件Checkpoint already completed; continue from the retained rewind report instead of calling rewind again.活动分支已包含保留的完成记录时调用 rewindNo active checkpoint. Create a checkpoint before calling rewind.既无活跃 checkpoint 也无已完成的 rewindReport cannot be empty.裁剪后的报告为空警告而非失败Rewind branch checkpoint missing, falling back to rootapply 阶段 checkpoint 条目 ID 缺失回退到根节点分支不使已完成的工具调用失败所有错误均通过ToolError抛出实现在 checkpoint.ts 中可逐一对应。边界与不恢复的内容rewind 是非破坏性的branchWithSummary()追加新的branch_summary条目并移动叶子被放弃的条目仍留在.jsonl日志中只是离开活动分支。明确不恢复的内容包括文件系统或 git 状态packages/coding-agent/src/session/artifacts.ts 管理下的 artifactspackages/coding-agent/src/session/blob-store.ts 管理下的 blob-store 负载packages/coding-agent/src/session/history-storage.ts 中的 prompt 历史行packages/coding-agent/src/session/agent-storage.ts 中的 auth 或其他 agent 存储。同时不存在并发编辑对账机制rewind 既不合并也不回滚代码或会话之外的并发外部状态。源码级原理从状态机看 checkpoint/rewind 配对在 checkpoint.ts 中两种核心状态被明确定义CheckpointState记录checkpointMessageCountcheckpoint 时内存消息数含追加后的工具结果、checkpointEntryId用于会话树分支的条目 ID、startedAt时间戳CompletedRewindState记录report、startedAt被回卷的 checkpoint 时间戳、rewoundAt回卷完成时间戳。checkpoint 的选择是隐式的rewind总是瞄准单一的#checkpointState——它来自最后一次未完成的成功checkpoint调用或从持久化状态重新水合。没有 checkpoint 列表、标签或 ID 参数。branchWithSummary()的实现位于 session-manager.ts若branchFromId非空且不在索引中则抛错将叶子设置为分支点然后记录一条type: branch_summary的条目携带fromId或root、summary与details。而持久化条目进入模型视野的桥梁在 session-context.ts当重建上下文遇到branch_summary且 summary 非空时createBranchSummaryMessage(entry.summary, entry.fromId, entry.timestamp)将其转换为branchSummary消息。这就是“被剪除的探索路径以摘要形式延续”的实现机制。实战要点小结使用 rewind 前必须先确保checkpoint.enabled true默认关闭并在会话中先调用checkpoint记录目标report必须非空建议用一句话概括探索结论与后续建议因为它将成为新分支下模型可见的summary与开发者角色的保留指引不要在同一 checkpoint 上重复调用rewind——第二次会得到 “already completed” 错误应直接基于保留报告继续若需要再次探索需重新调用checkpoint正如 rewind-report.md 所提示的Need explore again → newcheckpointrewind 只回卷会话上下文不恢复文件与 git 状态涉及代码回退时应配合版本控制工具使用。【免费下载链接】oh-my-pi⌥ Coding agent with the IDE wired in项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-pi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考