让 Codex VS Code 会话历史按当前工作区显示:可恢复、可重复应用的本地补丁
Codex 的会话越来越多以后,VS Code 侧栏中的最近会话会混在一起:在 A 项目里也能看到 B、C 项目的线程。GitHub issue Workspace-scoped thread history 提出的目标很直接——默认只看当前工作区,同时保留一个查看全部线程的入口。
我把这个功能补到了本机已经安装的 Codex VS Code 扩展,并把过程整理成了一个可审计、可恢复、可在扩展更新后再次运行的 PowerShell 补丁。本文记录实现思路、使用方法、限制,以及一份可复用的提示词。
本文介绍的是非官方本地补丁,测试版本为
openai.chatgpt-26.814.41407-win32-x64。扩展内部构建产物会变化,运行前请先退出重要任务并阅读脚本。
想实现什么
补丁后的行为如下:
- 默认只显示
cwd与当前 VS Code 工作区根目录精确匹配的会话; - 多根工作区会把全部根目录一起传给查询;
- 将 VS Code 设置
Codex: Thread History Scope切换为All后显示全部会话; - 工作区目录或范围设置变化时,最近会话自动刷新;
- 重命名、归档和恢复等既有操作保持不变。
这不是把会话重新分类,也不会读取会话正文。过滤发生在列表查询阶段。
关键发现:协议已经支持 cwd
Codex app-server 的 thread/list 文档 已经提供 cwd 过滤参数;对应的 ThreadListParams JSON Schema 表明它既可以是单个字符串,也可以是字符串数组。
因此,最小实现不需要接管线程存储,只需要建立这一条数据流:
1 | VS Code 当前工作区根目录 |
当范围为 currentWorkspace 时,请求加入 cwd: roots;当范围为 all,或当前没有打开文件夹时,不发送 cwd,沿用原来的全量列表行为。
为什么要用补丁脚本,而不是手工改压缩后的 JavaScript
已发布的 VS Code 扩展通常只有打包、压缩后的 JavaScript。直接搜索替换虽然快,但扩展一更新就会失效,而且很容易留下半修改状态。这个补丁脚本把维护所需的保护一起做了:
- 自动寻找最近安装的
openai.chatgpt-*扩展目录,也允许显式传入路径; - 先检查新版是否已经原生为最近会话请求加入
cwd,有原生支持时停止修改; - 使用精确锚点定位修改位置,锚点缺失或匹配不唯一时直接停止;
- 写入前一次性备份全部目标文件,并记录扩展版本、绝对路径和原始 SHA-256;
- 先在内存中生成全部目标内容,再开始落盘;
- 每次写入后校验目标 SHA-256,任何一步失败都从本次备份自动回滚;
- 完整应用后再次运行是幂等的,不会重复插入代码;
Restore前也会备份当时的文件,所以恢复动作本身同样可追溯。
补丁目前只触碰四个目标:扩展的 package.json、Host 端入口,以及两个 Webview 构建资源。脚本不联网、不下载第三方代码,也不读取任何会话内容。
下载离线补丁
压缩包只包含补丁脚本、语法检查工具和文档,不包含 OpenAI 扩展文件,也不包含我本机的备份或会话数据。下载后可以完全离线运行。
没有附上“修改后的完整 Codex 扩展包”。本机扩展自带的 LICENSE.md 指向 OpenAI 的服务条款;当前 OpenAI Terms of Use 对修改、复制和分发服务设有限制。为避免重新分发第三方二进制带来的许可风险,这里只发布独立编写的增量补丁。这不是法律意见;实际使用仍应遵守你所在地的法律和适用条款。
使用方法
解压后,在 PowerShell 中进入补丁目录。先查看状态:
1 | & '.\Apply-CodexWorkspaceHistoryPatch.ps1' -Mode Status |
应用补丁:
1 | & '.\Apply-CodexWorkspaceHistoryPatch.ps1' -Mode Apply |
如果系统的脚本执行策略阻止运行,可以对这一次进程使用:
1 | powershell -NoProfile -ExecutionPolicy Bypass ` |
成功后,在 VS Code 命令面板执行 Developer: Reload Window。随后打开设置,搜索 Codex: Thread History Scope:
Current Workspace:默认值,只显示当前工作区;All:显示所有工作区的线程。
如果自动定位到的不是你想修改的安装目录,可以显式指定:
1 | & '.\Apply-CodexWorkspaceHistoryPatch.ps1' ` |
恢复官方文件
执行:
1 | & '.\Apply-CodexWorkspaceHistoryPatch.ps1' -Mode Restore |
默认会恢复当前扩展目录最近一次 Apply 留下的备份。也可以用 -BackupDirectory 指向某个明确的历史目录。脚本在恢复前仍会备份当前状态。
最彻底的恢复方法是从 Marketplace 重新安装官方扩展。手工修改 Marketplace 扩展文件也可能触发 VS Code 的“扩展已修改或损坏”完整性提示,这是预期风险。
扩展更新以后怎么办
扩展更新通常会安装到新的版本目录,旧补丁不会自动进入新版。再次运行同一个 -Mode Apply 即可:
- 如果新版已经原生支持当前工作区过滤,脚本报告
native-support并停止; - 如果仍是已知结构,脚本先创建一份新的版本化备份,再重新应用;
- 如果构建结构变化、锚点不再唯一,脚本会在写入前停止,不会猜测性修改。
建议每次更新后先运行 -Mode Status,确认状态再决定是否应用。
已知限制
thread/list 对 cwd 做精确匹配,因此下面几种情况可能让某个会话暂时“消失”:
- 会话创建时的工作目录不是项目根目录;
- 同一个目录使用了不同的路径表示,例如 Windows 路径与 WSL 路径;
- 文件夹被移动或改名;
- 当前打开的是空窗口,没有工作区根目录。
遇到这些情况,把范围切换为 All 即可找到原线程。补丁不会删除或迁移线程。
可复用提示词
下面这份提示词保留了这次最重要的安全和可维护性要求。把 issue 链接替换成自己的目标即可:
1 | 请将以下 GitHub issue 描述的功能实现到我当前已安装的 VS Code Codex 扩展: |
这类本地补丁真正重要的不是“今天能改成功”,而是明天扩展升级后,它能知道什么时候该重新应用、什么时候该停止,以及出错时如何完整回到修改前。