Releases: aipayim/codex-proxy
Release list
codex-proxy v2.43.0
v2.43.0 (2026-08-02)
闲置恢复安全租约与固定会话模式
🔐 安全租约(不再扫描/杀外部进程)
- 闲置恢复不再按项目目录扫描、终止或
SIGKILL任意codex进程,避免误伤人工启动的 CLI、分支或子代理 - 每次恢复由随机运行 ID、PID、进程组和
/proc启动时间组成的原子 JSON 租约标识;只有租约可验证时才会视为自身 runner,代理不会向外部进程发送终止信号 - PID 复用防护:仅在
/proc启动时间匹配时才kill -PGID,绝不裸 kill 可能被复用的 PID - runner 状态文件升级 JSON schema v2:
phase/pid/updatedAt/exitCode/runId/startedAt/signal/origin/detail,原子写入;HUP/INT/TERM信号记录正确退出码
⏳ 单周期单次 + 在途请求暂缓
- 仍有在途请求时暂缓打开新的 Codex 终端;每个项目在一次连续 Key 闲置周期只尝试一次,直到实际应用新的 Key 或修改该项目配置,修复失败后不断重放/相互终止的问题
- 120 秒未收到 runner 状态明确记录启动超时;
cmd.exe start返回成功仅表示 Windows 已接受请求,runner 状态和真实退出信号才是诊断依据
🎯 固定会话模式(fixed_session)
- 系统配置新增项目级
resumeMode: "fixed_session"+sessionId,仅该模式替换命令中的{sessionId}(shell 安全引用),避免resume --last选到不确定的分支/子会话;普通命令模式原样执行 resume --last会记录会话不确定性提示
测试:新增 test-resume-runner-lifecycle.js(真实 spawn 启动器验证租约/退出/信号),test-auto-resume-lifecycle.js 扩展(租约身份、PID 复用、固定会话模板、在途请求延后),npm test 现为 11 项全部 PASS
codex-proxy v2.42.0
v2.42.0 (2026-08-01)
错峰时段设置弹窗实时预览
- 「⏰ 设置时段」更名「⏰ 错峰时段」,悬停显示说明
- 弹窗新增实时预览:选定时区/开始/结束小时后即时显示窗口形态(同天窗口
08-17、跨夜窗口22-08、全时段)与「当前时段内/外」状态(时段内绿色 ✔ 可参与调度,非时段橙色 ✖ 不参与调度) - 新增帮助文案:
开始<结束=同天、开始>结束=跨夜、开始==结束=全天可用(等效清除) - README 错峰时段章节补充概述与预览说明
codex-proxy v2.41.0
v2.41.0 (2026-08-01)
源码基线文件自动识别(release-baseline.txt)
- 代理启动时从安装目录读取
release-baseline.txt(单行vX.Y.Z,限 4 KiB),作为源码安装的版本基线 - 克隆/复制源码仓库或源码 ZIP 安装,即使没有构建元数据(build-info/release-manifest)也能显示本机版本并判断是否可升级
- 基线识别优先级:① 系统配置
updateBaselineTag② 官方发布包元数据 ③ 干净官方 Git Tag ④ 源码基线文件 ⑤ 未知(只展示 Release,不提示更新) build-release.js将release-baseline.txt纳入 Release 内容清单,构建时写入当前 Tag;源码仓库同步维护该文件- 无效/缺失的基线文件保持「基线未知」,不误报版本
- 更新检查缓存由 6 小时调整为 1 小时
npm test10 项回归测试全部 PASS(含新增testSourceBaseline有效/缺失/非法三态)
codex-proxy v2.40.0
v2.40.0 (2026-08-01)
容量/429 瞬态退避 + 闲置恢复可靠性
🚦 容量/429 瞬态退避(新配置)
- 新增
capacityBackoffSeconds(默认 60)与capacityMaxWaitSeconds(默认 300) - HTTP 429 与
model_at_capacity错误改为瞬态退避:仅设capUntil,不写failCode——reset:"never"的 Key 不再被冷却到整个周期,单次容量波动不会级联禁用全部 Key - 容量失败的请求直接重新入队而非热轮询刷遍全部 Key;队列等待上限按
capacityMaxWaitSeconds豁免默认 30 秒超时 checkAllFailed忽略纯退避 Key,避免误报all_keys_failed- Dashboard「系统配置」新增容量退避配置区
🧬 闲置恢复可靠性(3 项修复)
- ① 修复
-p实为 codex 的--profile标志(并非 prompt)导致resume --last -p ...立即退出码 2;prompt 是位置参数,改为resume --last \u0027<prompt>\u0027 - ② runner 内
setsid bash -lc把命令从终端剥离,codex resume交互 TUI 需要 PTY;改用script -qec分配伪终端(保留setsid进程组隔离,-e回传子命令退出码),无script时回退旧方式 - ③
triggerResume启动前按 cwd+命令行扫描并终止项目路径下所有残留 codex 进程及其后代(避免state_5.sqlitethreads 表锁死会话);项目已有存活恢复进程或 30 秒内刚发起过启动时跳过,防重触发把仍在加载的巨型会话替换掉
测试:新增 test-capacity-backoff-lifecycle.js 回归测试,npm test 现为 10 项全部 PASS
codex-proxy v2.39.1
v2.39.1 (2026-08-01)
修复闲置恢复启动器失败
- 修复
resume-codex.sh闲置恢复每次触发都失败的问题:cmd.exe /c start打开可见 Windows 终端时,WSL 路径(/mnt/c/...)以/开头会被 cmd 解析成开关(无效开关 - /mnt),start立即返回退出码 1,runner 从未启动 - 修复:启动前用
wslpath -w将 WSL 路径转为 Windows 反斜杠形式再交给start(无wslpath时回退为C:前缀替换),保留可见终端窗口 - 启动器失败时把 cmd 的 stderr(GBK 转 UTF-8)写回状态文件第 5 字段,代理显示为
launcherError并带进auto_resume_launcher_failed事件消息 - 端到端实测通过:状态机
starting → running → exited完整走通,命令真实执行
codex-proxy v2.39.0
v2.39.0 (2026-07-31)
模型级费用估算 + Codex SQLite 日志维护 + 配置保存加固
💰 模型级费用估算 (modelPricing)
- 系统配置新增按模型定价规则数组:可对最终转发的精确模型名分别设置输入/输出单价与
bytesPerToken(最多 50 条,模型名最长 80 字符,未命中回退全局prices/bytesPerToken) - 每个请求在开始转发时冻结匹配的价格规则;之后保存新规则只影响新请求,不回算进行中长流或已写入统计/趋势/历史日志的费用
- 不配置时行为与旧版本完全一致
🗄 Codex SQLite 日志维护(可选)
- 系统配置新增开关/路径检测/容量阈值(默认 2048 MiB)/保留时长(默认 12h)/检查周期(默认 15min)/立即检查
- 启用保存前复验当前用户
~/.codex/下的常规logs*.sqlite文件与logs(id, ts)结构;支持\\\\wsl.localhost\\发行版\\.../\\\\wsl$\\发行版\\...自动转换为 WSL 内部路径;拒绝符号链接、-wal/-shm、~/.codex/外文件 - 后台独立进程以 Python 3 标准库 sqlite3 限量短事务(每轮最多 5×1000 行)删除过期行,忙时 1s 让步并下周期重试;不重启代理/watchdog/Codex CLI,不主动
VACUUM、checkpoint 或删除 WAL/SHM - 新增
/__codex-log-maintenance/check与/__codex-log-maintenance/run接口;Release 包含codex-sqlite-log-maintainer.py运行 helper
🔧 配置保存加固
config.json保存改为串行队列 + 随机后缀临时文件原子写入,失败不阻塞后续保存
其他
npm test扩展至 9 项回归测试(新增 config 持久化、模型定价、SQLite 维护,全部 PASS)- 移除误跟踪的运行时文件
config.json/keys.json/state.json(保留本地文件,GitHub 源码仓库不再跟踪)
完整变更见 README 更新日志。
codex-proxy v2.38.0
v2.38.0 (2026-07-31)
下游趋势按客户端应用归集 + 崩溃修复
- 新增
classifyClientApp():根据 User-Agent 识别 Codex CLI / Claude Code / Cursor / Chatbox / Cherry Studio / NextChat / LobeChat / OpenAI SDK / Vercel AI SDK / curl 等下游应用 - 趋势图「🔻 下游」改为按下游应用客户端归集请求数(堆叠柱状图,最多前 8 个应用,其余归入「其他」,悬停查看各应用次数)
- 请求记录新增
client维度:recordRequest同时累计小时/日桶的clients,日志详情显示「客户端」 - 日志全文检索与 CSV 新增客户端列
- 流终态不再显示于趋势图,改由日志/CSV 的「流结果/流终态原因」与
stream_terminal事件承载 - 修复
forwardRequest中client未声明导致代理重启后反复崩溃并被 watchdog 重启的问题 - 新增回归测试:
recordRequest客户端累计断言、forwardRequest先声明client再调用recordRequest的源契约断言(npm test 6 项全部 PASS)
完整变更见 README 更新日志。
v2.37.0 — 运行时数据治理、日志轮转、上游错误捕获
v2.37.0 — 运行时数据治理、日志轮转、上游错误捕获
新增
- proxy-log-rotator.js:WSL
proxy.log分段轮转器(当前段 10 MiB + 5 归档),缺失时 watchdog 拒绝无界启动 - state.json 容量治理:小时/日统计保留天数(默认 35/180 天)、容量上限(默认 32 MiB)、原子替换 +
.bak损坏恢复、10 分钟压缩 - 请求 JSONL 治理:按天分段,同时受保留期(7 天)和总容量(256 MiB)限制,单条超 512 KiB 截断
- 上游错误捕获:
streamErrorMsg+ 自动分类(model_at_capacity/insufficient_quota/upstream_api_error),Bearer/sk-/api_key 自动脱敏 - 趋势图新增 2 模式:🔺 上游(域名归集)和 🔻 下游(流终态分布),共 8 模式
变更
codex-proxy.service:systemd 改用 journaldwatchdog.sh:rotator 管道写入,拒绝无 rotator 启动install.sh:默认 config 新增容量/保留策略字段dashboard.html:系统配置新增运行时数据上限 UItest-runtime-storage-lifecycle.js:新增回归测试
升级方式
备份当前代理目录及配置/状态 → 审核 Release → 手动合并需要的改动(新增 proxy-log-rotator.js 必须与 watchdog.sh 同级) → npm install → node -c proxy.js → 维护窗口重启代理
v2.36.2 — 闲置计时基线修正
v2.36.2 — 闲置计时基线修正
Fix
- idleTicker 基线修复:从活跃切换到空闲时记录
_idleFrom=Date.now()作为计时基线 - 避免从很久以前的
lastKeyUseTime直接起算导致巨量数字 updateAutoCountdown()/render()统一使用_idleFrom || lastKeyUseTime
升级方式
备份当前代理目录及配置/状态 → 审核 Release → 手动合并需要的改动 → node -c proxy.js → 维护窗口重启代理
v2.36.1 — 精确闲置时间显示与实时倒计时
v2.36.1 — 精确闲置时间显示与实时倒计时
变更
- formatIdle():新增闲置时间精确格式化(支持 d/h/m/s 级联,秒级两位小数)
- 面板实时刷新:新增 100ms 间隔
_idleTicker,闲置倒计时实时更新;有活跃请求时自动归零0.00s - Dashboard:Key 闲置显示从分钟精度升级为精确格式(如
1d 3h 15m 30.25s) - README:更新闲置显示文档(级联格式、自动归零)
- .gitignore:重构为结构化规则,增加 keys/config/state 批量忽略和 .example 例外
升级方式
备份当前代理目录及配置/状态 → 审核 Release → 手动合并需要的改动 → node -c proxy.js → 维护窗口重启代理