Repository navigation
Releases: mingisrookie/codex-switch
Release list
ChatGPT Switch v0.5.0-macos.1
ChatGPT Switch v0.5.0-macos.1 — macOS 预览版
首次提供 macOS 原生安装包,分别支持 Apple Silicon 和 Intel。此版本标记为 Pre-release,Windows 的 Latest 继续使用 v0.4.0。
下载
| 设备 | 安装包 |
|---|---|
| Apple M 系列芯片 | codex-switch_0.5.0-macos.1_aarch64.dmg |
| Intel Mac | codex-switch_0.5.0-macos.1_x64.dmg |
打开 DMG,将 ChatGPT Switch.app 拖到“应用程序”,弹出磁盘映像后运行。安装包最低系统标记为 macOS 12.0,原生 CI 在 macOS 15 验证;Codex/ChatGPT 自身的系统要求独立适用。
签名说明:本版仅使用 ad-hoc 签名,没有 Apple Developer ID 签名和公证。 首次运行可能被 Gatekeeper 阻止。核对下载来源和 SHA-256 后,如确认继续,可按 Apple 官方说明 在“系统设置 → 隐私与安全性”选择“仍要打开”。
本版支持
- 保存 Account / Relay 配置,切换官方账号与自有 API 请求路由。
- 使用 macOS 钥匙串主密钥和 AES-256-GCM 保护已保存凭据;官方
auth.json保持只读。 - 识别标准安装目录下、通过 OpenAI 签名验证的 Codex.app / ChatGPT.app,请求正常退出并重新启动;独立 CLI 保持阻断。
- 会话查看、搜索,以及兼容 SQLite 结构的视图切换;通过数据库锁、快照校验和事务恢复保护中断场景。
- 脱敏诊断、私有文件权限及 Finder 定位。
预览版限制
高级迁移、合并、恢复可见、离线清理、完整备份恢复及内置技能尚未开放。Mac 请下载新 DMG 手动更新,Windows 的 EXE 更新通道保持独立。
工具数据位于 ~/Library/Application Support/codex-switch。Mac 与 Windows 的加密槽位不能直接互换。Relay 使用期间,客户端需要的 bearer token 仍存在于受管 config.toml 中,请勿分享该文件。
受管客户端需位于 /Applications 或 ~/Applications,bundle identifier 为 com.openai.codex;ChatGPT Classic 不属于此范围。保存和切换只证明本地配置已应用,不证明第三方服务已连通。
构建与验证
安装包由该 tag 的 GitHub Actions 原生构建。发布前置门包括双架构 Mac 专项测试、最终 App 隔离启动与正常退出、DMG 内容/架构/签名核验、Windows 回归及依赖审计。各架构的验证 JSON、SHA-256 和 Rust CycloneDX SBOM 随本次 Release 提供。
验证使用合成数据和隔离钥匙串,未使用真实账号,也未向第三方服务发送请求。GitHub 构建来源证明及 SHA-256 不等于 Apple 签名或公证。
完整安装、数据与恢复边界见 macOS 预览版说明。
ChatGPT Switch v0.4.0
Provider compatibility
- Relay 传输改为显式能力模型:默认使用 HTTP Responses,并只在用户明确选择时启用 Responses WebSocket。旧槽位没有该字段时安全迁移为 HTTP,避免不支持 WSS 的中转站反复重连。
- Base URL 归一化不再机械给已有网关路径追加
/v1;仅 origin 地址补/v1。远程明文 HTTP、内嵌凭据、query 和 fragment 继续拒绝。 - UI、回执和文档明确区分“本地请求路由已应用”和“远端服务已验证”;保存/切换仍不发送
/models或探测请求。
Runtime and storage safety
- 新增受管 ChatGPT/Codex 包版本只读采集,以及基于 file identity、SQLite
quick_check、schema_version、关键列和稳定 Schema 指纹的能力门禁。请求配置、会话视图和高级存储分别判定;未知结构不再按旧假设写入。 - “存储”改为“高级存储与恢复实验室”。兼容性不足时全部迁移、冲突、恢复导入、降级和离线 GC 写操作关闭,只保留安全的重新扫描和脱敏排查。
- 收紧共享 SQLite sidecar 合同:未建立 Relay 视图不再接受
-wal、-shm或-journal;既有 hard-link 视图只 checkpoint active 路径,并在前后验证 inactive sidecar 缺失和主库 file identity 未变。 - Provider 与兼容性失败新增稳定错误码和恢复分类,不再依赖中文/英文自由文本决定 UI 行为。
Architecture and tests
- 从巨型
commands.rs提取请求路由应用服务,从App.tsx提取兼容性面板,缩小命令/UI 编排边界。 - 新增 Provider URL/transport、typed error 和进程关闭状态机的 property tests,并补齐 sidecar、未知 Schema、HTTP 默认/WSS 显式、只读降级等回归测试。
- Rust 工具链固定为 1.94.1,Node 主版本与 direct TypeScript 类型依赖固定;新增文档链接合同检查。
Integration fixes
- 整合 v0.3.5 后补齐复合主键、SQLite 类型亲和性、writer 关闭后结构复检、全局库 sidecar 句柄交接复核以及错误信封大小限制;兼容性查询移出界面线程。
- 修复组件清单输出名重复
.json与工作区绝对路径、依赖图校验问题,文档链接检查同时支持 Windows/POSIX 和 HTML 图片;保留 v0.3.5 的搜索优化、首页和原生测试进程回收修复。
Supply chain and release
-
为生成的 CycloneDX 组件清单补齐 GitHub SBOM 证明所需的 UUID serialNumber;已有合法标识保持不变,非法标识在签名前拒绝。
-
CI 新增 npm 生产依赖审计、cargo-deny advisories/source/license 门、按锁定依赖生成的 Rust CycloneDX SBOM;tag 发布流程为最终 EXE 生成 GitHub/Sigstore 构建来源与 SBOM attestation,并在 Release 同时公开
codex-switch.cdx.json供离线审阅。 -
Windows EXE 的 Authenticode 状态为 NotSigned,尚未使用商业代码签名证书。GitHub attestation、SHA-256、UPX 和 PE 合同不能替代 Authenticode 或终端防护扫描。
Upgrade and validation
- v0.3.5 用户可通过应用内“检查更新”升级;没有保存 transport 的旧槽位按 HTTP Responses 读取,已明确选择 WebSocket 的槽位保留该选择。工具只应用本地配置,不承诺第三方服务已经连通。
- 保留 v0.3.5 的会话搜索、稳定分页、跨页选择、备份格式和更新器固定 EXE 文件名。Release 附带的 JSON 组件清单不是安装包。
- 发布检查覆盖前端测试/类型/生产构建、Rust fmt/Clippy/runtime-evidence 测试、文档与发布脚本检查、依赖和许可证检查、最终 EXE 原生验证,以及公开 v0.3.5 到 v0.4.0 的升级和替换失败回滚。构建与发布结果以本版本 GitHub Actions、公开资产及验证记录为准。
发布验证记录
发布提交:a2d874e320fe04a390a1d77467025b1ad9d39c9c。正式产物来自 v0.4.0 标签构建;五个质量、构建与发布任务均通过。
| 项目 | 验证结果 |
|---|---|
| Windows x64 程序 | codex-switch.exe,2,667,008 字节;公开回下载与同次 CI 产物一致 |
| Rust 组件清单 | codex-switch.cdx.json,345,988 字节;公开文件与签名证明中的清单一致 |
| 构建来源与 SBOM 证明 | GitHub CLI 按本仓库、签名工作流、标签和精确提交验证通过 |
| 前端与脚本 | 209 项前端测试、48 项发布/供应链脚本测试通过 |
| Rust | 840 项库测试及相关集成测试通过;格式、Clippy 通过;显式 ignored 专项用例未计入已执行 |
| 公开 EXE 原生检查 | 全新、已初始化、兼容性测试三种隔离环境;各完成 1200×820、900×640、390×844 窗口验证 |
| 应用内更新 | 公开 v0.3.5 → v0.4.0 成功;模拟目标文件占用后正确回滚并启动 v0.3.5 |
EXE SHA-256:c926b88c394a4f6cebd74ea2e7d9bd4990cc69173db8a435d027eef97173b680
组件清单 SHA-256:f1cbb11661636483827dc978d41db86383ede0ba61287e78971b1bc5faac2884
更新和回滚在隔离安装目录中完成,三个受保护的合成标记文件前后字节一致;未操作真实用户凭据或会话。未验证第三方中转站的真实连通性。
Windows Authenticode:NotSigned。 GitHub 构建/组件清单证明不等于 Windows 商业代码签名。
ChatGPT Switch v0.3.5
Changed
- 会话搜索复用随库存更新的内存索引,排序结果只在库存或排序方式改变时重新计算,避免每次输入和勾选都重建搜索文本或排序。
- 会话列表新增匹配数量、本页范围、清空搜索、只看已选和跨页/筛选外已选项提示;搜索无结果时仍可清空已有选择。
Fixed
- 统一旧记录的秒级时间与毫秒级时间后再排序,显示和排序使用同一时间值;无效时间排在末尾,同时间或同标题以会话 ID 稳定排序。
- 列表刷新保留当前页,结果减少时将页码收敛到有效范围,后续刷新不会跳回已经失效的页码。
Release engineering
- 修复发布验证中的原生数据库初始化超时清理:初始化与退出均设有界等待,失败时回收本次创建的子进程,不再让验证流程无限挂起;新增提前退出、无响应、拒绝初始化、缺失数据库及退出超时回归。
- 将构建/测试链中的间接依赖 nanoid 和 undici 更新到现有版本范围内的安全修订,消除发布前 npm audit 报告;不新增直接依赖或改变产品运行时依赖。
- 修复 GitHub Actions 旧版槽位兼容测试调用 GitHub CLI 时缺少认证的问题:仅向该测试步骤注入仓库自带的只读令牌,保留原有兼容测试、打包和发布检查。
- 重整仓库首页:提供 Windows 直接下载、当前界面截图、简明操作步骤和数据安全边界。
- 发布资产仍为唯一的 Windows x64 便携文件
codex-switch.exe,由版本 tag 的 CI 构建;保留应用内更新兼容性。
Compatibility and validation
- 不合入 v0.4.0 开发内容,不改变官方登录、API Key、请求路由、会话正文、备份格式或更新器协议。
- 发布检查包含前端测试与类型检查、Rust fmt/clippy/test、发布脚本回归、Windows 打包合同、隔离启动、公开文件校验及前一稳定版的更新/回滚验证。实际发布结果以版本对应的 GitHub Actions 和公开资产为准。
发布验收结果
- GitHub Actions 版本流水线全部通过:Windows 质量检查、v0.2.7 旧版槽位兼容、便携版构建及正式发布。
- 公开 EXE 已重新下载,与同一版本 CI artifact 的文件大小和 SHA-256 完全一致,PE 版本及 UPX 完整性检查通过。
- 公开 EXE 在全新环境与已有初始化环境均完成实际启动/正常退出,并通过 1200×820、900×640、390×844 界面检查。
- 已在隔离测试目录实测 v0.3.4 → v0.3.5 一键更新成功;同时用目标文件读锁模拟替换失败,验证自动回滚到 v0.3.4。测试数据保持不变,临时运行目录已清理。
- 本轮包含 201 项前端测试、30 项发布脚本回归,以及 Rust fmt、Clippy 和测试检查。显式标记 ignored 的专项测试不计为本轮已执行。
Windows x64 便携文件: codex-switch.exe,2,881,024 bytes。
SHA-256: 294605d5ed89083cc4f22ef5fdf77bad2744e319e9edf285daa6782f7771b809
Release commit: 6738848e6e4d3ba8a32633ecf70fd5a61c84372a
已有用户可在应用中点击“检查更新”。上述更新测试均使用隔离环境,没有修改任何用户正在使用的安装或真实会话。
ChatGPT Switch v0.3.4
Fixed
- 修复未完成初始化的 Relay 会话视图在目录中已经存在合法共享全局 SQLite(
logs_2.sqlite、goals_1.sqlite、memories_1.sqlite)时,被“目录非空”检查误判并阻止切换的问题。现在会继续进入既有 file-identity / quick-check / hard-link 校验链;只有这些数据库确实属于已验证共享视图时才允许继续。 - 未初始化 Relay 目录中的
state_5.sqlite、未知文件、目录、符号链接或其他非受管内容仍保持 fail-closed;独立的 Account/Relay 全局数据库也仍拒绝覆盖,避免为了恢复切换而静默丢弃数据。 - 新增回归测试覆盖“
last_common_state_sha256尚未建立,但 Relay 目录已包含合法共享全局数据库”的真实恢复路径,确保可完成 Relay 物化并建立共同状态摘要。
Release engineering
- 本补丁版本只收敛上述 Relay bootstrap 恢复边界,不改变
auth.json、Relay Key、请求路由或会话正文的既有安全合同。
ChatGPT Switch v0.3.3
Changed
- 移除前端 API 中已废弃的全量
loadDashboard聚合入口,避免后续代码绕过现有分域加载机制,在首屏重新触发会话、备份和检查点扫描。 - 保留并验证正式使用的
loadRuntimeDashboard、loadSessionDashboard、loadBackupDashboard按需加载路径;会话域单项失败仍不会覆盖其他域的真实状态。
Release engineering
- 版本 tag 的 Windows CI 只有在前端、Rust、旧版槽位兼容和 packed EXE 门禁全部通过后,才会下载同一 workflow 中已验证的
codex-switch.exe,复核 release contract,并使用受限的 GitHub Actions 仓库令牌创建 Release。 - Release 标题和说明绑定 tag、五处版本号与当前 Changelog 段落;同名 Release 已存在时拒绝覆盖,防止重跑 CI 静默替换公开资产。
- 本版本不改变界面、账号/Relay 路由、会话、备份、恢复或更新器运行逻辑,是一次代码维护与发布链路收敛更新。
ChatGPT Switch v0.3.2
v0.3.2
本版本完成无官方登录 / fresh Codex Home 的 Relay 切换修复,并补齐首次启动与自更新竞态。
修复
- 完全空的 Codex Home 尚未生成
state_5.sqlite时,手机连续性状态现在返回合法零会话,不再报 SQLiteCannotOpen;只读启动不会创建数据库。 - 未登录官方 ChatGPT、
auth.json和config.toml均不存在时,Relay 仍可保存和切换;Account 仍要求有效官方登录。 - 启动连续性初始化占用 mutation guard 时,写操作会短暂禁用并在初始化结束后恢复,避免立即点击触发偶发
another mutation。 - updater 验证等待完整页面和真实 Tauri invoke bridge 后再调用命令,避免首屏与原生桥就绪之间的竞态。
验证与安全
- 同一正式资产分别通过 initialized Home 和真正 fresh Home 的三档生产 UI E2E;fresh Home 中
auth.json、config.toml、state_5.sqlite均保持不存在。 - 从公开
v0.3.0和v0.3.1到v0.3.2的成功更新与替换锁回滚均使用隔离实例验证,受保护状态保持字节不变且无 helper/staging 残留。 - 测试未调用
taskkill、Stop-Process或进程强杀,也未向本机 ChatGPT/Codex 发出关闭请求;只正常退出或精确关闭隔离的codex-switch.exe测试实例。
完整变更见 CHANGELOG.md。
ChatGPT Switch v0.3.1
v0.3.1
本版本集中修复 API 中转站切换可靠性,并补齐无官方登录 / fresh Codex Home 场景。
修复
- 未登录官方 ChatGPT 时,现在可以保存和切换 API 中转站;Account 目标仍明确要求有效官方登录。
config.toml或state_5.sqlite不存在时,Relay 首次保存/切换不再失败;失败回滚会恢复到原始“文件不存在”状态。- 修复后台自动 GC 轮询长期占用 mutation lock、导致前台偶发
mutationBusy的竞争。 - 切换失败改为稳定的类型化 reason,UI 可显示准确恢复建议,不再依赖错误字符串猜测。
- 只持久化最近验证且仍可信的 ChatGPT AppUserModelID,避免重启目标歧义。
- 发布/升级验证脚本支持连续补丁版本,并移除所有强制结束子进程的 fallback。
安全与兼容
- 既有官方登录在 Relay 切换前后保持字节不变;应用不会伪造、替换或创建官方
auth.json。 - Relay Key 仍使用 DPAPI 槽位;Account/Relay 两槽合同和 WebSocket 配置保持兼容。
- 配置回滚增加外部替换保护,不覆盖并发外部写入。
- 测试使用隔离目录和隔离实例;未调用
taskkill、Stop-Process或进程强杀。
完整变更见 CHANGELOG.md。
ChatGPT Switch v0.3.0
Canonical 会话存储
- 新增统一
SessionReferenceGraph与语义 JSONL provenance,覆盖 OpenAI 主目录、Account、Relay、Shared、legacy/relocated 与备份库存;无法判断的历史一律 fail closed。 - Account / Relay / Shared 改为数据库视图与请求路由,canonical 就绪后延续同一逻辑 threadId,不再按 provider 永久物化完整正文。
- 旧“完全同步”改为“会话合并与修复”;真实分叉默认不覆盖,显式覆盖后的旧主版本进入 7 天冲突回收。
- 生产版移除会话 hard-delete command 与 UI 永久删除入口。
迁移、备份、GC 与降级
- 一次性前台迁移状态机:只读 Preflight → 完整备份 → 真实 Codex 隔离恢复验证 → 原子计划 → Apply/Validate/Commit,全程由持久操作账本驱动。
- fail-closed 安全窗口离线 GC:在线阶段固定只扫描,候选须同时满足有效 marker、确定 canonical peer、Equal/Prefix、连续两次未变化与全运行时零引用。
- 新增 v0.2.0–v0.2.7 显式隔离降级导出与再次升级导入;旧版只使用自描述隔离存储,canonical 保持不动。
- 顶部新增“存储”页,集中展示存储状态、canonical 会话、安全副本、冲突、已回收字节与安全窗口状态。
完整条目见 CHANGELOG.md。
发布工程修复
本版本发布前,v0.2.7 降级门禁在 CI 上连续 15 次失败且从未通过。根因与修复:
- 门禁通过
WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS注入 CDP 调试开关。托管 runner 完整收到该变量却不据此启动浏览器,本地开发机则会,因此门禁在 CI 上永远拿不到调试端口。改为同时通过--edge-webview-switches宿主命令行通道注入,并固定 WebView2 用户数据目录。 - 门禁此前以
stdio: "ignore"启动被测产品,失败时只有一句fetch failed。现在全部启动均记录 stdout/stderr、退出码与 spawn 失败,就绪等待在子进程退出时立即中止,并附带端口监听者、WebView2 进程命令行与运行时版本。 - 门禁此前硬性拒绝在 GitHub Actions 之外运行,每个假设都必须花费一次提交与一轮完整 CI。现支持显式隔离本机运行。
- 应用后断言要求
sqlite_home缺席,而 v0.2.7 本就拥有并重写该键,旧运行时无法满足。改为断言该键不得逃逸隔离包;导出槽不得携带sqlite_home、不得重新引入源 canonical 根、数据库引用包含性三项检查保持不变。 - CI 拆分为质量门禁、降级门禁与 release 构建三个 job,失败时同样上传证据,并支持手动触发。
验证
- 前端 166 tests passed(8 test files);TypeScript typecheck 与 production build 通过。
- Rust 789 tests passed、11 ignored;
cargo fmt --check与cargo clippy -D warnings通过。 - 发布 harness 安全契约 20 tests passed。
v0.2.7隔离降级 saved-slot apply 门禁在托管 runner 上通过。- main CI run 31856956413 与 tag CI run 31858620663 均为三个 job 全部成功,同指提交
7f5e759。 - 唯一资产
codex-switch.exe为2,872,832bytes,SHA-256BBA8CE095ECEB6F005A5A3708CD6DBBBABF4EA56AA46E701A8A9EDAFFEBDCD62,取自 tag CI artifact,未在本地重新构建;公开回下载与该 artifact 逐字节一致。 - 出处更正:发布后约 4 小时内曾短暂提供同一提交 main CI 构建的资产(
2,872,320bytes,SHA-256FE89B0E7…,其 run 内 release contract/UPX/PE 校验同样全部通过),后按发布流程替换为 tag CI artifact。两份文件均为同一源码的已验证构建,仅 UPX/PE 时间戳不同。 - 真实 updater 首跳与回滚已闭环(发布后补跑,隔离环境、无信任绕过、无故障注入接缝):
- success:
0.2.7 → 0.3.0,同路径替换、PID 变更、启动回执updated,安装后 SHA-256 与公开资产一致,受保护状态字节不变,残留 0。 - replacement-lock-rollback:对目标文件施加外部独占读句柄后,产品回滚至
0.2.7,启动回执rolledBack,安装后 SHA-256 回到 v0.2.7 资产,受保护状态字节不变,残留 0。 - 证据
updater-e2e.jsonSHA-2567DAAFDF4C2BFA0F6EB7703E9A801012AD6AC0A8FF9B02B5323F2A7A848C92859。
- success:
ChatGPT Switch v0.2.7
新增
- 新增“诊断与支持”:记录切换、同步、备份/恢复、Skill、更新等失败的结构化诊断,并支持导出最近诊断或本次失败诊断。
- 导出固定五文件 ZIP,可私下发给维护者排查;默认保存到 Windows 下载目录,失败时可由用户主动改存应用诊断目录。
隐私、兼容性与边界
- 诊断事件与 durable
operations.jsonl分离;诊断失败不会改变原业务终态,清除诊断日志不会删除操作历史、备份、会话、配置或凭据。 - ZIP 经过双层脱敏、路径/UUID/秘密形态扫描和 hash/self-check,不包含凭据、聊天正文、原始 JSONL/SQLite、完整配置、进程命令行或稳定设备标识。
v0.2.6只创建了 annotated tag,最终独立隐私审查在 GitHub Release 前拦截;未创建 Release/Latest,旧 tag 未移动,修复统一进入v0.2.7。- 仍只发布唯一 Windows x64 portable 资产
codex-switch.exe,兼容现有一键更新器。
验证
- 前端:139 tests passed;TypeScript typecheck 与 production build 通过。Rust:499 tests passed,4 tests intentionally ignored;fmt 与 clippy
-D warnings通过。 - 隔离
APPDATA/CODEX_HOME的故障注入、五文件 ZIP 外部敏感扫描、真实 packed EXE UI/E2E、PE32+ x64/双版本 release contract 与upx -t通过。 - PR CI
31328121903/31328135186、main CI31328794302、tag CI31329458760均通过;Release 资产取自唯一 tag-CI artifact。 - 唯一资产
codex-switch.exe为2,411,008bytes,SHA-256E8905135EAB0C5D76117BAA25770371E3D8BFDAF07495805463C96A823A5B78E;公开回下载与 tag-CI artifact 完全一致,两个 live GitHub Release 合同测试均通过。 - 正式
v0.2.5 -> v0.2.7一键更新 smoke 通过:同路径自动替换并重启,用户状态 byte-exact,staging/install 残留为 0。
ChatGPT Switch v0.2.5
修复
- 修复 Relay 槽位把
supports_websockets保存为false的问题。 - 切换到中转站时,现在会在
[model_providers.openai_custom]中权威写入布尔值supports_websockets = true。 - 兼容旧槽位:即使已保存的字段为
false或缺失,下一次 Relay 切换也会纠正为true。 - live 配置中该字段为
false或缺失时,不再误报为 Relay 精确匹配。
兼容性与边界
- Account 路由、官方
auth.json、用户自有 provider 和其他全局配置保持原有保护边界。 - Release 仍提供唯一的 Windows x64 portable 资产
codex-switch.exe,兼容现有一键更新器。 - 本版本不包含关闭流程、切换性能或会话清理策略调整。
验证
- 前端:122 tests passed,TypeScript typecheck 与 production build 通过。
- Rust:402 tests passed,4 tests intentionally ignored;fmt 与 clippy
-D warnings通过。 - Windows fresh production build、PE32+ x64/双版本 release contract、固定 UPX 5.2.0 打包与
upx -t通过。 - packed EXE 在隔离
APPDATA/LOCALAPPDATA/CODEX_HOME中成功启动ChatGPT Switch原生窗口,用户 live 配置哈希保持不变。 - Main CI
30686563931与 tag CI30687043534的 Windows quality gate 均通过;Release 资产取自 tag CI,不使用本地候选文件。