# 轮次回退(实验性) 在管理器「Codex 增强 → 对话与输入」或 Codex 内的 Codex++ 设置中开启「轮次回退(实验性)」。默认关闭,受增强总开关控制。 在一条已完成回答下打开 `···`,点击「分支到新聊天」下面的「回退到本轮之前 · Codex++」。这个操作包含选中的轮次本身,以及之后的所有轮次。 ## 执行过程 1. 从当前菜单及其原生 `aria-controls` / `aria-labelledby` 明确关联的触发按钮的 React 已提交状态识别真实的会话 ID、轮次 ID 和本地会话管理器。通过触发按钮所属的原生回答操作栏(含聊天 ID、轮次 ID、原生分支回调)确定消息边界,确认对应的唯一管理器后停止向整个应用树上溯。多重归属、身份冲突或必要的边界识别扫描达到上限时拒绝执行;已证明归属时,菜单 portal 的可选扫描超限不会误判成接口缺失。无法唯一识别、缺少必要接口或聊天仍在运行时不启动回退;菜单会降低亮度,点击显示原因,不按 DOM 顺序推测目标。 2. 关闭原生菜单以释放模态焦点和指针锁;读取完整目标区间,将原始历史和回滚请求保存到本机 IndexedDB `codexPlus.turnRewind.v1`。保存失败时不提交回滚请求。 3. 在原聊天中提交回滚 Prompt,让模型检查执行记录、备份和实际文件,撤销能可靠归属到目标区间的操作。模型仍使用当前会话的权限,可能需要用户处理原生授权请求。 4. 只有模型返回唯一有效的完成报告、未解决项为空、期间没有新增轮次且功能仍开启时,才调用原生 `thread/revert` 并同步原生会话状态,移除目标轮、后续轮次和回滚请求。 新版客户端的 hooks 可能只暴露 public facade。此时通过原生注册表的只读 accessor 和 React 中已有的 scope 获取已存在的本地 manager,不创建新 manager 或修改 scope。模块导出尚未完成延迟初始化时,后续菜单刷新重读已缓存的 live binding,不主动运行初始化器或重复下载资产。新增不可用诊断的 detail 只记录识别数量、扫描深度和能力布尔值,不附加聊天 ID、内容或文件路径;沿用应用现有的本地诊断包装。 原生接口通过能力探测定位;不修改 `app.asar`、官方安装目录或客户端资源。没有新增后端写路由,也不扩展第三方用户脚本的路由白名单。 ## 恢复记录与停止 右下角面板可停止回退或导出 JSON 恢复记录。导出调用客户端原生「另存为」接口,成功后显示路径;取消和错误都有提示,失败后可重试。缺少保存接口时明确报错并保留本机记录,不静默降级下载。 关闭面板、切换增强开关或重新注入脚本,不删除已保存记录。重注入保留在途控制器与面板,清理旧菜单项和观察器。关闭功能阻止后续会话截断,不会自动重做已撤销的操作。 ## 限制 - 仅支持已有完整、可分页历史的本地 Codex 聊天;远程主机、ChatGPT/Work、旧格式会话不支持。客户端内部接口变化时入口可能不可用。 - AI 完成报告不是系统快照或独立验证,不能保证撤销任意数据库、安装、进程或外部服务操作;有未解决项时保留会话。不要把“聊天被截断”当作所有外部操作均已撤销的证明。 - Prompt 要求覆盖文件前在工作区 `.codex-rewind-backups/<运行标识>/` 保存恢复副本,保留用户及其他任务独立产生的修改,禁止整目录重置或覆盖远端状态。 - 回滚请求和执行过程在成功截断前仍可见。回滚时不要在同一聊天发送消息或同时修改相同文件。 - 停止、超时或部分失败后,已撤销操作不会自动重做。后台已截断但界面同步失败时会提示重新打开聊天。 - 不修改跨聊天记忆、全局说明或会话数据库;过大的目标区间会拒绝执行。 - 恢复记录可能含聊天和工具输出,仅保存在原客户端本机资料中。不要上传到公开 issue 或仓库。目前没有旧记录列表或一键导入恢复功能。 ## 来源 回滚控制器基于 Codex Rewind 0.1.1,包含“原生另存为、取消/错误提示、可重试导出”的最新修复。Codex++ 另外增加默认关闭的设置、重注入生命周期与运行前状态检查。 ## 验证 `node --test apps/codex-plus-manager/src/turn-rewind.test.ts` 执行控制器、导出和菜单接入行为测试。设置持久化回归包含在 `cargo test -p codex-plus-core turn_rewind` 中。