Skip to content

Repository files navigation

CodexAuth Switch

CodexAuth Switch 横版海报

English README | 中文说明

CodexAuth Switch 是一个 Windows 与 macOS 本地桌面工具,用来在多个 Codex App 登录账号之间快速切换。

它适合同时使用多个 OpenAI / Codex App 账号的人:从面板发起官方登录或保存当前登录状态,之后通过这个工具切换当前生效的 Codex 登录。凭证加密保存在本机,用量来自本地 Codex 日志;Windows 当前账号额度通过 Codex 桌面接口更新,备用账号由主进程直接向 OpenAI 查询额度并按需续期。不会向项目作者或第三方上传凭证或会话历史。

一句话定位:CodexAuth Switch 是一个本地优先的 Codex App 多账号切换工具,支持 auth.json 快照管理、Windows DPAPI / macOS Keychain 加密、额度查看和 token 用量统计。

这是非官方项目,与 OpenAI 无官方关联。

最新版本:v0.1.37 · 更新说明 · 问题反馈

v0.1.37 修复 GitHub 安装包中图标拉长、底部裁切的问题,新增不同屏幕缩放下的图标生成与产物校验。保留无需退出当前账号的官方登录、额度中断恢复、Business 候选筛选、本地用量统计和邮箱隐藏等功能。

适合谁

  • 想在 Windows 或 macOS 上管理多个 Codex App 登录账号。
  • 想快速切换 OpenAI Codex / Codex App 当前账号。
  • 想安全保存和恢复本地 ~/.codex/auth.json 登录快照。
  • 想查看 Codex 本地会话额度、周额度、剩余重置次数、token 用量及项目、模型统计。
  • 想保留本地用量统计,同时在切换前确认备用账号的在线额度。

常见搜索词

Codex 账号切换、Codex 多账号、Codex App 账号管理、OpenAI Codex 账号切换工具、Codex auth.json 切换、Codex 本地登录管理、Codex 额度查看、Codex token 用量统计、Codex Windows macOS 桌面工具、Codex DPAPI Keychain 加密、Codex 本地预估、Codex 本地额度估算、Codex 本地历史只读。

功能

  • 登录与多账号管理:面板发起官方浏览器登录、自动加密导入,保留当前登录;也可保存已有登录、重命名和切换账号。
  • 凭证保护与迁移:Windows DPAPI / macOS Keychain 加密快照,操作前备份,密码加密的 .codexauth 导入导出;较旧凭证覆盖有提示。
  • 自动切换并继续(Windows,可选):识别真实额度失败,等待其他任务结束,经 15 秒可取消倒计时、换号和实际额度核验后继续原任务;支持批量任务与目标模式。
  • 候选筛选:优先 Plus、有五小时限制的 Business、仅周额度 Business;跳过未重置且剩余不超过 2% 的账号,无记录 Business 最后尝试。
  • 本地额度与用量:展示本地会话/周额度、重置次数、项目和模型用量;日志增量读取、并发去重,明确标注数据时间和统计范围。不是官方账号历史累计。
  • 浮窗与隐私显示:主窗口、托盘、浮窗快速切换;总览眼睛按钮可隐藏该区域邮箱;凭证原理和兼容性自检可展开查看。
  • 版本与联系入口:GitHub 图标、当前版本、手动检查更新,以及开发者微信二维码。

Windows 提供自动任务恢复;macOS 提供账号管理、额度、用量及迁移功能。macOS 原生登录/Keychain/GUI 仍待实机端到端验证。

界面截图

主窗口 悬浮快捷窗
CodexAuth Switch 主窗口截图 CodexAuth Switch 悬浮快捷窗截图

安全边界

CodexAuth Switch 的设计目标是把影响范围限制在本机登录文件和本应用自己的存储目录内。

会写入的文件

  • ~/.codex/auth.json
    • Codex App 当前使用的本地登录文件。
    • 切换账号时,应用会用已保存的账号快照替换这个文件。
  • ~/.codex/config.toml
    • 自动确保顶层配置包含 cli_auth_credentials_store = "file",让新版 Codex 继续使用可切换的 auth.json 文件凭据。
    • 修改前会在同目录生成带时间戳的 config.toml.codexauth-backup-* 备份。
  • 本应用的账号元数据:Windows 为 %APPDATA%\codex-auth-switcher\accounts.json;macOS 为 ~/Library/Application Support/codex-auth-switcher/accounts.json。
  • 加密账号凭据快照:Windows 为 %APPDATA%\codex-auth-switcher\accounts\*.dpapi;macOS 为 ~/Library/Application Support/codex-auth-switcher/accounts/*.keychain。
  • 操作当前账号前的加密备份:Windows 为 %APPDATA%\codex-auth-switcher\backups\*.dpapi;macOS 为 ~/Library/Application Support/codex-auth-switcher/backups/*.keychain。

只读取的文件

  • ~/.codex/auth.json
    • 用于导入当前登录、识别账号身份。
  • ~/.codex/sessions/**/rollout-*.jsonl
    • 用于本地统计用量和额度快照。
  • ~/.codex/session_index.jsonl
    • 存在时用于补充本地会话元数据。
  • ~/.codex/logs_2.sqlite
    • 以只读方式打开,用于读取 Codex 本地写入的额度事件。

不会做的事

  • 不直接改写已有会话日志;启用自动恢复后,由 Codex 接收继续消息并正常追加任务记录。
  • 不删除 ~/.codex/sessions。
  • 不写入 logs_2.sqlite。
  • 不向项目作者或第三方上传凭证、账号、会话日志或用量记录。
  • 当前账号的额度和凭据续期继续交给 Codex,并同步最新 auth.json 到加密快照。
  • 备用账号的 access token 与工作区 ID 仅发给固定的 OpenAI 额度接口 https://chatgpt.com/backend-api/wham/usage;开启周额度重置卡兜底后也用于同源的 wham/rate-limit-reset-credits 及其 /consume 接口。续期凭据仅发给 https://auth.openai.com/oauth/token。不发送会话或用量日志,不跟随重定向。

会影响 Codex App 当前运行状态的功能包括:切换账号、重新登录、删除当前账号、重启 Codex App,以及主动开启的自动切换与续任务。这些操作可能会更新 config.toml、替换或移除当前 auth.json,并重启 Codex App,让新的本地登录状态生效。自动续任务还会通过 Codex 本地接口校验当前账号额度,并向原任务发送继续指令;相关服务请求由 Codex 自身执行。

实现方法

订阅到期日

“全部账号额度总览”在重置次数右侧显示订阅到期日。日期来自与账号、工作区和套餐匹配的本地登录信息中的 chatgpt_subscription_active_until,随登录、凭据续期和启动时的账号元数据同步更新,不额外请求订阅接口。悬停可查看完整日期与最近核验时间。

这是账号快照记载的订阅有效期,不代表自动扣费或续费日;已过快照日期显示“到期 待更新”,缺失时显示“到期 未知”,不会用登录凭据过期时间或额度重置时间推算。相关校验:npm run subscription:validate。

账号识别

导入当前登录时,应用会读取 ~/.codex/auth.json,并验证它是否是 Codex App 的 ChatGPT 登录格式。

应用会在本地解析 JWT payload,提取邮箱、用户 ID、workspace/account ID 等字段。账号匹配不会只依赖单个字段,而是尽量组合个人身份和工作区身份,因为同一个人可能加入多个工作区,同一个工作区也可能包含多个成员。

凭据保存

保存账号快照时,应用使用加密存储:Windows 使用 DPAPI,macOS 使用 Electron safeStorage 与系统 Keychain。面板新增登录期间,官方程序会在应用数据目录下的 login-sessions/login-* 临时保存明文 auth.json;加密导入后清理,取消及失败同样清理,下次启动重试清理残留目录。

Windows 使用 DataProtectionScope.CurrentUser;macOS 使用当前用户的 Keychain。

这表示加密后的账号快照绑定到当前操作系统用户,其他用户、其他机器或不同操作系统不能直接解密。

账号快照存储在:

  • Windows:%APPDATA%\codex-auth-switcher\accounts
  • macOS:~/Library/Application Support/codex-auth-switcher/accounts

操作当前登录前的备份存储在:

  • Windows:%APPDATA%\codex-auth-switcher\backups
  • macOS:~/Library/Application Support/codex-auth-switcher/backups

当前账号由 Codex 刷新;CodexAuth 监听 auth.json,把最新凭据重新加密同步到对应快照。仅在手动刷新或自动切换前查询备用账号时,若 access token 距过期不足五分钟、上次续期超过七天或时间未知,才按需续期;额度接口返回 401 时最多续期并重试一次。续期与账号切换、导入、删除共用串行队列,新凭据先原子写入原有加密存储,再继续查询或切换。保存失败会保留待保存的新凭据,阻止后续账号变更,并在退出前重试。

续期可以延长登录可用时间,但不能保证永久有效。官方明确返回 refresh token 失效、被撤销或重复使用时,账号标记为需要重新登录;网络错误、限流和临时服务故障不会删除凭据。没有查询需求时不后台续期,长期未使用的账号可能需要重新登录;多台机器同时使用同一套 refresh token 仍可能互相使凭据失效,建议每台机器分别登录。

加密备份保留最新 60 份;超过一小时的原子写临时残留会在启动时清理,避免长期切换和统计产生无上限缓存。

账号切换流程

切换账号时,应用会执行以下步骤:

  1. 解密并校验目标快照与账号身份。
  2. 启用重启时先停止 Codex 桌面和所属 app-server;否则要求用户先关闭客户端。独立 CLI 仍运行时停止切换。
  3. 读取旧账号最后写回的 auth.json,保存并加密备份;备份失败不覆盖。
  4. 再次检查客户端退出和目标身份,写入临时文件后原子替换 auth.json。
  5. 回读核验目标身份,更新本地账号记录,并按设置启动 Codex。

使用临时文件加原子替换,是为了避免 Codex App 读到写入一半的 auth.json。

Windows 会结束属于 Codex 安装目录的桌面进程组并重新启动应用;macOS 会识别当前 ChatGPT / 旧版 Codex 应用进程,等待退出后通过 Launch Services 重新启动。

重新登录流程

如果某个已保存账号的 refresh token 失效,应用可以发起重新登录流程:

  1. 停止 Codex 桌面及所属 app-server,确认没有其他 Codex 客户端写入。
  2. 加密备份最终的 auth.json 后删除当前登录;备份失败则停止。
  3. 启动 Codex App。
  4. 用户在 Codex App 里走官方登录流程。
  5. Codex App 写入新的 auth.json 后,CodexAuth Switch 自动监听并保存到对应账号。

这个过程不绕过官方登录,也不代替官方登录。真正的登录仍然发生在 Codex App 内。

自动切换与恢复

账号页开启“额度耗尽后自动切换并继续”(默认关闭)后,每 15 秒检查一次本机任务。只处理开启后的明确额度失败或目标 usageLimited,不会因浮窗接近 0% 就直接切换。

候选先按套餐排序:Plus → 有五小时限制的 Business → 仅周额度的 Business → 限制不明确的 Business → 其他套餐。同组优先下次重置更近的账号,重置时间相同再比较剩余额度。无记录的候选也可以在线查询;需重登、未重置的低余额和已确认耗尽尚未恢复的账号会跳过。候选在线额度确认可用才开始可取消倒计时,倒计时结束再次查询,失败或未知时保持当前账号。额外模型额度池也保留并保守检查;任何返回池不足 2% 或字段不完整均不自动切换,不推测到点已重置。其他任务仍运行时等待。换号后仍由 Codex 核验新账号身份与实际可用额度,再向原任务发送继续消息;目标恢复保留原目标、预算和计数。

这是继续已有上下文,不是恢复进程现场。手动换号等操作会取消待恢复批次,接口结果不确定时不重复发送。确认恢复后尝试打开首个任务;跳转失败不影响继续。依赖兼容的 Windows Codex 桌面接口,不自动使用重置次数。

额度读取模式

Windows 当前账号每 30 秒通过 Codex 桌面接口读取额度,接口不可用时使用本地日志和带时间的快照;其他平台的当前账号继续使用本地日志。备用账号不在启动时或定时批量查询,仅在手动刷新或自动切换前查询并按需续期;展开账号额度可点击“刷新在线额度”。Codex 关闭后不会因备用账号轮询产生联网请求,手动刷新仍可使用。查询有一分钟缓存、并发去重和失败退避,自动切换倒计时后强制重新查询。界面统一标注在线快照、本地快照或本地缓存,并显示数据时间;失败时保留上次成功快照并标注错误,旧快照不能代替切换前的在线核验。

周额度重置卡兜底(Windows,可选)

在自动切换设置下开启“周额度耗尽后自动使用重置卡”。默认关闭,旧版团队用卡开关不会自动授权新增的 Plus 用卡范围。先按原顺序尝试仍有额度的账号;没有可用候选时,按 Plus → 有五小时限制的 Team / Business → 仅有周额度的 Team / Business 顺序,选择在线确认周额度已用到 100% 且有卡的备用账号。仅五小时额度耗尽、周额度尚有剩余时不用卡;缺少周额度、未知额度、剩余 2% 的切换阈值、单独的模型池耗尽也不会触发用卡。

仅在需要用卡兜底时查询候选账号的卡片明细,保留上述账号类型顺序,同类型账号之间按最早到期的有效完整重置卡排序;有明确到期日的卡先于官方未提供日期的卡,到期日相同再按账号 ID 固定排序。单个账号内也优先用最早到期的卡,已过期或日期格式异常的卡跳过。明细有一分钟缓存和失败退避,不增加定时查询。

15 秒可取消倒计时会明确显示将使用一张重置卡。倒计时后重新查询额度和卡片明细;所选卡片或到期日变化时,重新选择并倒计时,不直接改用另一张卡。其他任务结束、原任务仍需恢复、账号和设置未变且卡片仍有效时才用卡;重新查询确认额度可用才换号并继续。发请求前持久化账号、卡片和幂等标识;结果不明或额度未恢复时暂停自动用卡,不重发,也不换下一张。检查 Codex 用量页并刷新该账号额度,确认恢复后才解除保护;同一耗尽窗口不会再次用卡。

按 OpenAI 说明,完整重置会改变周额度重置日期。此功能仍使用本机当时的实际网络出口,不提供每账号独立 IP,也不会新增定时查询或在 Codex 关闭时用卡。当前已登录账号继续由 Codex 管理,此处只对备用 Plus / 团队账号执行用卡。

本地额度和用量统计

“全部账号额度总览”中的“刷新全部”会逐个查询当前账号和备用账号,显示处理进度与成功数量。当前账号通过 Codex 查询,备用账号绕过成功快照缓存在线查询;失败退避仍然有效。单个账号失败不影响其他账号,失败卡片保留旧快照并说明原因。

当前账号的连续官方快照用于校准两次查询之间的预估:按账号、套餐、额度池、窗口长度、模型和速度档保存最近七天的样本;额度累计变化至少两个百分点、且本机记录可归属时才采样。至少三个稳定且输入/输出与缓存比例接近的样本才启用预测。原始官方百分比保持不变,额外消耗明确标记为预估;下一次官方读数到达即纠偏。缺少日志、混合模型的训练区间、计数回退、换号或跨窗口重置不参与学习;官方快照超过两分钟或推算增量超过五个百分点时等待官方确认。其他设备的用量无法完整归属到本机,因此这仍是保守预估,不是逐 Token 的官方计费复算。自动切换仍仅依据实际额度。

日志没有记录速度档时,校准样本仅在同一任务的同一轮内使用,不推定为默认速度,也不跨轮次复用。

用于学习或预测的用量增量必须完整落在对应官方快照之后;跨快照、起点不明或时间倒置的区间保留官方值。旧版校准样本会重新积累。官方响应中格式异常的额度窗口按未知处理,不能因另一个窗口正常就放行自动切换。

本地预估模式读取以下数据:

  • session JSONL 文件里的 codex.rate_limits。
  • 自动发现最新 logs_N.sqlite 里的 codex.rate_limits 和 usage-limit 记录。
  • session 文件里的 token_count 事件。
  • 按文件大小和修改时间缓存解析结果,对完整日志事件去重;账号元数据只保存额度快照和各模型、服务档位独立的校准样本。旧版 local-token-ledger.json 不再参与统计。

应用会监听本地日志文件变化,并用短延迟防抖刷新显示;同时用低频轮询检查 SQLite 文件更新时间,避免文件监听漏事件。

额度快照只保存到本应用自己的账号元数据中,不会写回 Codex 的日志文件。

多账号统计以账号最近一次切换时间为边界。跨切换时间继续运行的同一会话按相邻 Token 快照的增量归属,额度校准也只融合当前账号切入后的事件和该账号自己的历史校准,避免同套餐账号互相串数。

额度信息展示

额度说明展示已用/剩余比例和重置时间,预估值保留近似标记。界面不评价消耗速度,也不判断额度是否会提前用完。

网络隔离

Electron 窗口启用了以下安全配置:

contextIsolation: true
nodeIntegration: false
sandbox: true
webSecurity: true

页面 CSP 禁止网络连接:

connect-src 'none'

主进程还通过 Electron webRequest.onBeforeRequest 拦截并取消以下出站请求:

http://
https://
ws://
wss://

这些限制保持渲染页面离线,不向页面提供令牌或网络权限。主进程通过固定官方 HTTPS 地址查询备用账号额度并续期,通过 Codex 本地接口读取当前账号额度;账号查询结果与本机加密凭据的身份和版本绑定。

用户主动点击的 GitHub 更新检查也由主进程通过独立 HTTPS 请求访问固定的公开仓库地址。只接受本仓库当前版本对应的安装包链接,并通过系统浏览器打开;不读取 GitHub 登录信息或 Codex 凭证。

用户主动点击“登录并添加账号”时,系统浏览器和隔离运行的官方 Codex 登录程序会连接 OpenAI 身份验证服务,并使用官方本地回调完成登录;面板渲染页面仍禁止联网。

使用方法

安装依赖

npm install

启动应用

npm start

Windows 本地隐藏调试启动:

npm run dev:hidden

导入账号

  1. 安装 Codex 桌面版,打开 CodexAuth Switch。
  2. 点击“添加账号”,选择“登录新账号”。
  3. 在打开的官方页面选择要添加的账号,完成登录及验证。
  4. 返回面板,账号会自动加密添加到列表;当前 Codex 登录保持不变。
  5. 要添加更多账号,重复以上步骤。已有当前登录可在“添加账号”中选择“保存当前登录”;凭证文件导入位于面板“更多”菜单。

浏览器若自动选择了已有账号,请在官方页面切换到要添加的账号。等待期间可以取消或重新打开登录页;未完成的登录五分钟后超时。

切换账号

  1. 在 CodexAuth Switch 中选择一个已保存账号。
  2. 查看列表中的五小时和周额度,点击“切换”。展开账号行可查看重置时间等详情。
  3. 启用“切换后重启”时自动停启 Codex;关闭该选项时,请先关闭 Codex App 和 CLI,切换后手动启动。

应用会把新版 Codex 固定为文件凭据模式,并在启用“切换后重启”时完整重启桌面应用;新账号会在重新启动后生效。

重新登录已保存账号

当 Codex 提示 refresh token 无法刷新,或某个保存账号已经失效时,使用重新登录功能。

已失效账号会直接显示“重新登录”按钮;其他账号从该行“更多”菜单进入。自动切换、重置卡及切换后重启选项统一在顶部“设置”中管理。

“用量”页将当前账号额度与本地 Token 统计分开显示。“本次使用”统计当前账号生效后的本机记录;“本机全部”包含本机历史记录,具体范围可展开“统计说明”查看。

应用会清理当前本地登录并重启 Codex App。你只需要在 Codex App 里正常完成官方登录,新的 auth.json 写入后会被 CodexAuth Switch 捕获并保存。

开发

开发执行约定

  • 应用代码或界面修改完成并通过必要的针对性验证后,默认更新补丁版本、打包并覆盖安装到现有安装目录,再启动 CodexAuth 验证,无需每次另行确认。
  • 覆盖安装保留已有账号、凭据和设置,只重启 CodexAuth,不默认重启 Codex。
  • 纯文档修改、说明或未修改应用的审核不触发打包安装;当前版本已安装且应用内容未变化时,不重复安装。
  • 用户当次明确要求“不打包”“不安装”或“只改源码”等时,以当次要求为准。上述默认流程仅涵盖本地打包安装,推送 GitHub、打标签和发布 Release 仍按用户明确要求执行。

语法检查

npm run lint

校验额度逻辑

npm run local-data:validate

这个命令使用隔离测试日志,检查 Token 增量、重复和分叉、账号边界、额度池、周窗口、重置次数来源、估算校准及账号恢复。quota:validate 保留用于旧价格权重算法的历史回放,不作为当前算法的验收。

验证账号登录与恢复

npm run account-login:validate
npm run account-safety:validate
npm run auto-recovery:validate

这些验证使用虚构凭证与隔离目录,不执行真实账号切换。发布流水线在 Windows 和 macOS 上运行全部发布检查。

打包 Windows 安装器

npm run pack:win

打包 macOS DMG

请在 macOS 上运行:

npm run pack:mac

命令会同时生成 Intel (x64) 与 Apple Silicon (arm64) DMG。

安装包输出到:

release/

release 目录是本地构建产物,默认不提交到 Git。

项目结构

src/main.js                         Electron 主进程,本地文件访问、账号切换、额度逻辑
src/preload.js                      安全 IPC bridge
src/ui/index.html                   主窗口页面
src/ui/app.js                       主窗口渲染逻辑
src/ui/widget.html                  悬浮快捷窗页面
src/ui/widget.js                    悬浮快捷窗渲染逻辑
scripts/generate-icon.js            本地图标生成
scripts/start-dev-hidden.ps1        隐藏调试启动脚本
scripts/validate-quota-estimate.js  额度逻辑回放校验脚本
QUOTA-LOGIC.md                      额度估算逻辑说明

限制

  • 支持 Windows 与 macOS,暂不支持 Linux。
  • Windows 与 macOS 的加密快照绑定各自系统用户,不能跨机器或跨平台直接复制使用。
  • 目标是 Codex App 本地登录切换,不是 Codex CLI-only 工作流。
  • 本地预估模式来自本地日志解析,属于本地近似展示。
  • Codex 没有写入新的本地 rate-limit 记录时,额度快照可能暂时不更新。
  • 不要跨机器或跨系统用户共享已保存的凭据快照。

Release

Windows 安装包以及 Intel / Apple Silicon macOS DMG 会随 GitHub Release 上传。当前安装包没有商业代码签名或 Apple 公证,操作系统可能显示安全提醒。

License

MIT License. See LICENSE.

使用提醒

请只保存和切换你自己拥有或被授权使用的账号。不要把 auth.json、加密快照、备份文件分享给其他人。

版本历史

展开历史开发版本说明(以当前功能说明为准)

0.1.36:开发者微信入口

侧栏开发者入口改为“开发者微信”,点击通过系统浏览器打开 https://ryanlin.me/assets/contact/wechat-qr.png 微信二维码。

0.1.35:侧栏项目与更新入口

本地兼容性自检下方新增 GitHub 图标与项目主页、当前程序版本、检查更新和开发者 Ryan Lin 链接。项目与开发者入口分别通过系统浏览器打开本仓库和 https://ryanlin.me;版本号来自当前应用,不写死。顶部及侧栏共用更新检查,显示新版、当前最新版、本机较新或检查失败状态,仅点击时联网。

0.1.34:跳过低余额账号,补充 Business 候选

自动恢复时,任一额度窗口剩余不超过 2% 且未到重置时间,就跳过该账号;重置时间未知也不尝试。已到重置时间的窗口可重新参与估算,但其他窗口仍需满足条件,切换后仍核验实际额度。2% 是候选筛选阈值,不代表官方已经确认耗尽。

原有套餐优先级保持不变。有记录的候选都不可用后,才尝试没有额度记录或额度值未知的 Business(兼容 team);不把未知额度当成 100%。已知低余额不会因另一个窗口缺失而变成兜底候选;需要重新登录、仍在耗尽冷却期或记录超过七天的账号仍被排除。

每次尝试保留 15 秒可取消倒计时、空闲保护、账号身份和实际额度核验;确认可用后才向原任务发送继续。全部不可用就等待,不循环重启。已通过低余额边界、重置与周额度约束、有记录账号失败后转向无记录 Business、取消、冷却及重启后继续的模拟回归;未切换真实账号进行耗尽测试。

0.1.33:直接登录并添加账号

账号页新增“登录并添加账号”,通过已安装 Codex 的官方浏览器登录接口打开系统浏览器。选择账号并完成官方验证后自动加密导入,无需退出当前 Codex,也不会切换当前账号。支持取消、重新打开登录页及五分钟超时;重复账号更新已有记录,当前账号保留正在使用的凭证。

登录程序使用独立临时 CODEX_HOME,不加载真实配置、会话或账号凭证,不启动模型任务。官方程序会在该目录暂存明文 auth.json,导入后使用既有 DPAPI / Keychain 存储加密;成功、取消、失败及下次启动时清理临时目录。等待登录时暂停自动切换。密码和验证码只在官方页面输入。

已通过隔离导入、重复身份、加密回滚、取消、超时与界面测试;本机官方接口发起和取消实测成功,原凭证及配置未变。尚未代替用户完成真实账号授权;macOS 登录路径未实机验证。验证命令:npm run account-login:validate。

0.1.32:修复凭证切换与恢复并发问题

切换账号前先停止 Codex 桌面及其 app-server,确认退出后保存旧账号最后一次刷新凭证,再备份、写入并核验目标身份。发现其他 Codex CLI 仍运行时停止切换,不自动结束独立 CLI;关闭“切换后重启”时也必须先退出客户端。重新登录、删除当前登录沿用同样的停启顺序,备份失败不覆盖凭证。

恢复任务的额度核验、目标恢复和发送继续,与手动登录操作共用队列。手动换号、重登、删除或重启会立即取消待恢复批次并保存取消状态;目标修改、接口发现和实际发送前再检查账号。目标辅助进程退出前不释放队列。

导入较旧、缺少刷新日期或日期相同但凭证不同的快照,会明确警告并要求重新登录;已有重新登录标记不会因导入、重启读取元数据或原样同步文件而消失。新凭证仍先加密保存,当前登录不受导入影响。

通过虚构凭证、模拟桌面/进程及本地管道测试验证旧进程刷新、恢复期间换号、同工作区不同身份、导入回退和正常恢复。未用真实账号执行换号或耗尽测试;无法给其他程序强制施加全局文件锁,也不承诺平台风控结果。

0.1.31:账号额度总览隐藏邮箱

“全部账号额度总览”标题旁新增眼睛按钮,点击后用“账号 1、账号 2……”隐藏该区域的账号名称,再次点击恢复。显示偏好保存在本机,刷新和重启后保持;仅影响总览区域。

0.1.30:紧凑切换提醒与恢复后打开任务

自动切换提醒缩为 320 × 112 小卡片,与浮窗配色一致,保留 15 秒倒计时、取消按钮和 Esc 取消。账号与任务数量移至悬停说明,移除大段正文。

确认原任务出现新的继续轮次后,通过 Codex 的 navigate_to_codex_page 打开该任务。批量恢复只打开首个确认恢复的任务一次;跳转失败或接口不支持不影响继续,不重复发送指令,并提示可手动打开。已验证紧凑窗口渲染、倒计时和取消、批量跳转去重及失败隔离,并实测本机任务跳转接口成功。

0.1.29:修复 Plus 用量上限漏检

兼容官方失败轮次中只有 You’ve hit your usage limit. Upgrade to Pro (...) 完整原生提示、没有错误码的情况。自动切换由失败轮次触发,不等待浮窗预估到 0%;已用 99% 的本地快照不会挡住额度耗尽识别。仍保留其他任务运行时等待、15 秒可取消倒计时、换号后额度校验和防重复继续。

使用本机真实错误形态的模拟回归,已验证剩余 1% 时触发倒计时、切换和继续;99% 快照本身、已完成或手动中断的轮次、历史错误、工具文本和非额度错误均不会触发。未通过再次耗尽真实账号验证完整生产链路。

0.1.28:区分本地用量与官方累计

用量页将“当前账号”统计范围改为“本次本地”,在数字上方显示最近切换时间;“全部本地”明确包含不同账号。未登录、未导入或缺少切换起点时,本次本地用量显示未知,不再把本机全部历史归给当前账号。

官方个人面板的累计 Token 来自服务器 stats.lifetime_tokens,带有 stats_as_of 统计截止日期;本地事件合计不等于该累计值。现有官方个人统计缓存没有账号标识,不能仅凭当前登录状态或缓存时间自动归属账号。本版仍保持本地读取,不增加官方联网查询。

0.1.27:用量读取提速与统计修正

当前账号统计跳过切换前已停止更新的会话文件;增长中的 JSONL 日志保留解析进度,只解析追加内容。未写完的行会在补齐后重新读取,文件截断、替换或检测到改写时重新解析,压缩归档保留完整读取。并发刷新共用同一次读取,缓存失效后旧请求不会回填新缓存。

独立会话中碰巧相同的时间戳和 Token 计数不再被误去重;同一会话副本及派生任务的复制历史仍去重。项目用量按事件发生时的目录归属,快速切换“当前账号 / 全部”不会被较慢的旧响应覆盖。

本机约 2.8 GB、240 个日志文件的读取测试中,当前账号首次用量读取从约 12.7 秒降到 0.11 秒,相关文件为 5 个;约 12 MB 测试日志追加读取从 30 毫秒降到 1 毫秒。固定事件样本的新旧 Token 各项合计一致,并通过增量、并发、压缩、去重和统计范围回归验证。耗时随本地数据变化;“全部”首次读取仍需扫描历史日志,统计仍受本地日志覆盖范围限制。

0.1.26:修复工作区额度耗尽漏检与连接提示

兼容 Codex 在工作区额度耗尽时只返回 Your workspace is out of credits. Add credits to continue.、不附带错误码的失败任务。仍只处理开启之后的最新失败轮次,普通网络错误、工具报错、手动停止和已经继续过的历史失败不会触发换号。

本地接口断线后,只读查询会重新发现接口并重试一次;发送继续指令不自动重试。成功完成下一次检查后清除过时的连接失败提示。已验证真实错误形态、模拟切换和恢复、断线重连及防重复发送,并只读连通本机 Codex;未以真实账号再次耗尽额度来验证完整换号链路。

0.1.25:目标模式恢复

现有“额度耗尽后自动切换并继续”开关也支持目标模式。读取 Codex 本地目标状态,识别开启后新增的 usageLimited 中断;即使中断发生在两个目标轮次之间,也可加入同一批恢复。手动暂停、阻塞、已完成、目标自身预算用完,以及开启前的历史中断均不自动恢复。其他正在推进的目标也会阻止重启,包含两个轮次之间的短暂空闲。

倒计时和新账号额度核验通过后,通过 Codex thread/goal/get、thread/goal/set 仅恢复原目标状态,保留目标、预算、累计 token 和用时,再经桌面端继续原任务。辅助接口进程不加载任务、不执行模型请求。只有确认新轮次及原目标运行状态后才报告恢复;接口不兼容或结果不确定时提示人工检查,不重复发送。需要兼容的 Windows Codex 桌面版。

已验证模拟多目标恢复、取消/状态变化防护,以及本机 Codex 的隔离目标接口(预算与计数保留,未启动模型任务)。真实额度耗尽、换号、重启、目标继续推进的完整链路仍未实测。

0.1.24:修复多平台发布

凭证文件关联按平台配置:Windows 保留独立 ICO 图标,macOS 使用打包生成的应用图标,修复 Mac 打包时缺少 ICNS 文件的问题。包含 0.1.23 的倒计时、取消、自动恢复与批量凭证迁移功能;自动恢复目前仅支持 Windows。

0.1.23:切换前倒计时与取消

长说明收进开关旁的感叹号,悬停或键盘聚焦可查看。每次自动切换(含尝试下一个账号)之前,浮窗旁会显示置顶的 15 秒倒计时与目标账号;点击“取消本次”、关闭弹窗或按 Esc,都不再自动重试这一批中断,新的额度中断仍会监听,取消记录在重启工具后仍有效。

弹窗完整加载后才开始计时。关闭自动恢复开关、提醒窗口故障或电脑休眠造成倒计时跳过时取消操作;倒计时结束后再核验账号、原任务和其他运行任务。恢复方式是向原任务发送继续指令,不是恢复被打断的进程现场;真实额度耗尽后的完整流程仍未实测。

0.1.22:按套餐与五小时限制选择账号

自动切换优先使用 Plus → 有五小时限制的 Business → 没有五小时限制、仅有周额度的 Business。Business 同时兼容本地记录中的 team 名称;五小时限制以额度窗口的 300 分钟记录判断。同类账号仍按预计剩余额度从高到低、下次重置时间从早到晚排序。其他套餐或窗口信息不明确的账号排在最后;当前账号、已耗尽账号及其他不满足条件的账号仍会跳过。

0.1.21:额度耗尽后自动切换并继续任务(可选)

在账号页的“切换策略”中开启“额度耗尽后自动切换并继续任务”,默认关闭。开启后每 15 秒检查本机 Codex 任务,只处理开启后明确返回 usageLimitExceeded 的失败任务;普通限流、网络错误、工具报错、手动停止和正常结束不会触发。

先按上述套餐优先级分组,同组按会话/周额度中较低的预计剩余百分比从高到低选账号,相同则优先下次重置更早的账号。排除当前账号、需要重新登录的账号、7 天以前的额度记录及尚未重置且余额不超过 2% 的账号。Business 缺失或未知额度可作为最后候选,其他套餐不凭未知额度尝试。已过重置时间的窗口可按预计恢复额度参与候选,但不视为实际余额;切换后由 Codex 核验当前账号和可用额度,实际仍耗尽则尝试下一个账号。已确认耗尽的账号 30 分钟内不再尝试。百分比不代表不同套餐的绝对 token 数。

自动恢复会备份并切换本地凭证、重启 Codex、核对新账号和可用额度,再向原任务发送一条可见的继续指令,沿用任务模型与权限。自动恢复需要重启,不受手动“切换后重启”选项控制;其他本地任务仍在运行时暂缓执行。恢复记录保存在本机 auto-recovery.json,重复错误不会重复发送;发送结果不确定时要求人工检查。关闭开关会取消后续恢复步骤,已经开始的任务会继续运行。

目前仅支持 Windows 桌面版,CodexAuth 需保持运行,Codex 任务窗口需可用。使用版本相关的 Codex 本地 app-tools 接口;接口不兼容、没有合适账号、账号校验失败等原因会显示在开关下方。不会自动消耗重置次数。没有通过真实耗尽额度来验证生产环境切换;已验证本地接口读取与模拟恢复流程。

0.1.20:先选文件,再批量导入

点击“导入凭证文件”先打开文件选择窗口,支持 Ctrl/Shift 多选和 Ctrl+A 全选(最多 100 个),选好后输入一次共用迁移密码即可导入。输错密码可直接重试;不同密码的文件请分批选择。整批解密校验通过后才写入,已有账号统一确认更新,当前已登录账号保留本机凭证,不自动切换。

0.1.19:安装后刷新凭证图标

修正文件关联刷新顺序:在 .codexauth 文件类型和独立图标注册完成后,再通知资源管理器刷新。避免覆盖安装后继续显示旧的白色图标和“CODEXAUTH 文件”类型名称。

0.1.18:凭证文件图标

Windows 安装包为 .codexauth 加密凭证安装独立的 ICO 文件,并将文件类型图标指向该文件。覆盖安装后会重新注册关联并通知资源管理器刷新图标。凭证仍通过主窗口的“导入凭证文件”导入。

0.1.17:选择导出当前或全部账号

点击“导出账号凭证”,在弹窗选择“导出当前”或“导出全部”。导出全部会在所选位置新建文件夹,为全部已保存账号及当前登录账号分别生成加密 .codexauth 文件,共用本次设置的迁移密码。当前账号使用最新登录凭证,不重复导出。每个文件均可通过现有“导入凭证文件”导入。

0.1.16:重置次数读取与保存修复

  • 补充 Windows Store / MSIX 安装的 Codex 缓存路径;缓存链中的损坏响应不再遮挡后续有效记录。
  • 已核验账号归属的重置记录不再依赖切换时间或新的额度日志,只有重置次数时也能保存。
  • 并发刷新保留较新的重置记录,防止旧响应覆盖余额。仍只读取本地数据,未知不当作零次。

0.1.15:版本显示与 GitHub 更新检查

主窗口标题上方和浮窗左上角显示版本号,点击即可手动检查 GitHub 最新正式版。发现更新时,按当前系统与架构匹配安装包,点击“下载安装包”通过浏览器下载,再运行安装包更新。检查失败可以重试;本机版本较新时不会提示降级。

仅手动检查时请求本项目的公开 GitHub Release 接口,不携带账号、凭证或用量数据;不后台检查、不自动安装。实现使用 GitHub Releases API。

0.1.14:凭证文件图标

安装后,.codexauth 加密凭证文件使用 CodexAuth 应用图标。导入仍通过主窗口的“导入凭证文件”完成。

下载最新版本 · v0.1.15 完整更新说明

0.1.13:跨电脑账号迁移

主窗口提供“导出当前账号”和“导入凭证文件”。在 A 电脑设置至少 10 个字符的迁移密码,保存加密的 .codexauth 文件;在 B 电脑安装本版本或更新版本,选择导入并输入相同密码,再在账号列表点击“切换”。导入不会自动切换或重启当前账号。

迁移文件使用 scrypt 派生密钥和 AES-256-GCM 加密,账号名称及凭证均在密文内,不导出明文 auth.json。B 电脑会重新使用本机 DPAPI / macOS Keychain 保存凭证。已有非当前账号更新前会确认并备份;当前已登录的同一账号保留本机凭证。

凭证有效时通常无需重新登录,但无法绕过官方验证。凭证过期、撤销或刷新令牌变化后可能需要重新导出或官方登录。请分别妥善保管迁移文件和密码,密码不会保存,遗失后无法恢复文件。验证命令:npm run portable:validate。

0.1.12:简化额度展示

  • 移除浮窗、账号详情及用量看板中的其他额度池展示,保留会话额度、周额度和重置次数。
  • 浮窗不再为额外额度池预留高度,最小尺寸仍可完整显示两个账号。

维护时从 Codex 或终端更新已安装程序后,使用 scripts/start-installed-independent.ps1 -ExecutablePath "E:\CodexAuth\CodexAuth Switch.exe" 独立启动(路径按实际安装位置调整)。脚本由 Windows 进程服务启动程序,避免沿用维护宿主的进程生命周期;平时仍可使用桌面快捷方式。

0.1.11:修复重复启动时的空白账号页

  • 初始化期间重复打开程序会等待接口就绪,再显示主窗口或浮窗,避免 No handler registered for 'state:get'。
  • 启动失败会明确提示并退出,不再留下无法加载账号的窗口。验证:npm run startup:validate。

0.1.10:浮窗最小高度修复

  • 提高浮窗最小高度,包含其他额度池信息时仍完整显示至少两个账号;已保存的较小尺寸会自动纠正。
  • 压缩重置栏高度,来源标签统一为“Codex缓存”。

0.1.9:多账号快速看板

  • 悬浮窗账号快速看板和主窗口账号详情展示各账号保存的重置次数、来源及时间,并补充其他额度池。
  • 切到其他账号后仍可查看历史快照;缺失数据保持未知,旧重置记录标注待更新,不联网刷新其他账号。

0.1.8:补全本地重置次数来源

  • 只读 Codex 内置浏览器已保存的用量响应缓存,同时匹配账号 ID 与用户 ID,读取实际可用重置次数。
  • 标注“浏览器缓存”和数据时间;旧缓存提示待更新。缺失或无法核验时仍显示未知,不主动请求官方 API。
  • 新增验证:npm run browser-cache:validate。

0.1.7:本地兼容与统计更新

  • 按额度池 ID 分别展示,正确识别只有周窗口的套餐;缺失百分比显示未知。
  • Token 使用逐事件增量,覆盖 sessions 与 archived_sessions,重复历史去重,按实际模型/日期归属;支持 gzip 与运行时可用的 Zstandard。展示完整整数、缓存输入/推理输出子项和扫描覆盖情况。计数回退或缺失基准不猜测补齐。
  • 额度估算只使用本账号、同模型、明确速度档、同额度池和窗口的本地样本,至少 3 个样本;新模型不再套用 GPT-5.5 价格。样本不足仍展示本地快照。
  • 重置次数只接受结构化本地 Codex 记录;没有记录显示“未知”,旧记录或过期记录明确标注。不联网查询,也不提供兑换重置操作。
  • 自检展示实际运行版本、凭据同步与日志状态;索引损坏时先保留原索引和加密快照,再恢复可解密账号。恢复目录不自动删除。
  • 当前账号统计从最近一次切换起,不能据此推断其他设备用量。首次完整统计可能较慢,后续复用未变化文件的解析结果。
  • 新增验证:npm run local-data:validate。

About

Local Windows desktop account switcher for Codex App with DPAPI-encrypted auth.json snapshots, quota viewer, and token usage dashboard.

Topics

Resources

Stars

13 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages