Repository navigation
Conversation
BigPizzaV3
left a comment
There was a problem hiding this comment.
复核当前 head f3d91ff5,请先修复以下两项 P2。已核对 CI run 38895326024 的 SHA,Windows/macOS 均成功;本地现有连接保护与 renderer 测试 129 项、插件适配测试 13 项及注入产物一致性检查也通过,下面两条额外回归仍能复现问题。
-
[P2] 受管 turn 提前返回,跳过已有每模型上下文刷新。
assets/inject/renderer-inject/70-model-catalog.js:748-750的实例包装、954-956的原型包装,在sendCodexManagedSessionTurn返回后直接退出,后面的refreshCodexThreadModelBeforeTurn不会执行。受管发送路径同时更新__codexPlusThreadModels,下一次也无法补做这次切换的刷新。对照复现使用真实包装函数和真实
refreshCodexThreadModelBeforeTurn:聚合 profile 配置modelWindows={old:200000,new:1000000},先thread/start(model=old),再turn/start(model=new)。main 的调用顺序为thread/start:old → thread/resume:new → turn/start:new;当前 PR 变成thread/start:old → turn/start:new。请在启用了模型窗口/压缩/metadata 且需要刷新时保留原有流程,或提供经过验证的等价路径;普通消息仍可保持不增加 RPC。当前新测试将该 refresh helper stub 为空,未覆盖这项兼容性,请补对应回归。 -
[P2] 退出保护时的身份探测缺少超时,并扩大到普通官方恢复。
assets/inject/renderer-inject/30-service-tier.js:690-698在未启用保护、thread/resume未显式携带 provider 时,同样先await sendRequest("thread/read", ...);此处未传 options,也没有复用 800ms 的readCodexManagedSessionForCheck。探测迟迟不返回时,实际恢复 RPC 始终没有派发,普通官方会话也会受到影响。复现:配置普通 official profile、没有 managedSessionConnection,调用该 prepare 函数恢复一个未显式指定 provider 的线程,让
thread/read返回未完成 Promise;一秒后 prepare 仍未结束,捕获到的该读请求options为undefined。请只在存在受管身份依据时探测,或为该探测设置有限超时,并在超时/失败后恢复原生 resume 语义;补普通官方恢复和退出受管恢复两种回归。
这两项都可以在保留本 PR 连接保护范围的情况下修复。修复后请对新 head 重跑相关回归与双平台 CI。
问题
启用自定义 API 聚合后,其他配置管理程序修改 Codex 的供应商地址、认证来源等配置,可能让新建或重新加载的会话连到错误代理,出现持续重连、请求发送失败。模型聚合和故障转移都会受到影响。
此外,原生预创建线程可以绕过普通请求包装;新线程首条消息前调用
thread/resume会触发no rollout found for thread id。恢复过程如果没有独立超时,还可能长期占住会话恢复入口。供应商列表分页还可能让复制、排序、删除操作提交不完整的配置,误改隐藏的活动供应商;删除活动供应商、聚合默认成员或最后成员会使实时连接或聚合目录失效。
实现
在创建、预创建、恢复和普通分支入口,为本地自定义聚合会话显式设置内部
codex_plus_managedprovider,固定连接到 Codex++ 的本地 Responses 代理。后端只提供策略标识和本地地址,不向 renderer 下发成员凭据。模型聚合、故障转移共用保护入口;官方登录、同步默认成员登录和远程主机维持原有行为。退出保护时,恢复入口将内部 provider 转回当前配置的目标 provider。
发送前保留已有的每模型窗口、压缩阈值及 metadata 刷新:仅切换模型且启用了对应配置时 resume;实例、原型和本地主机嵌套请求使用相同流程,刷新失败保留旧模型缓存以便下次重试。同线程正在恢复连接时不抢先刷新。
未显式指定 provider 的恢复请求使用有界身份探测,最多等待 800ms;失败或超时保留原生 resume 参数,不丢弃恢复请求。
正常发送不额外读取配置或线程状态;新建和未知线程直接提交首条消息,不预先 resume。连接签名变化或观察到明确连接错误时,在用户下一次发送时按需检查。
仍然有效的空闲受管连接跳过卸载;需要纠正的空闲会话先读取运行时设置,再卸载和恢复,保留本次模型选择、工作目录、权限及服务等级。繁忙会话交回原生处理,不强制打断回复。
检查读取使用 800ms 超时,恢复 RPC 每步使用独立的 5s 超时,不继承用户消息的回调、消息 ID 或 trace。检查读取失败或超时后交回原生发送;恢复 RPC 超时后释放恢复锁,不继续提交消息,也不自动重发失败消息。
恢复关键步骤后核对连接签名;配置变化时停止本次发送。保留确认等待期间产生的异步错误标记,并在成功完成回复后清除临时标记。
升级已有请求和预创建包装,保留原生调用绑定。错误观察限制遍历深度和缓存数量,逐 token 通知不递归扫描,也不新增定时轮询。
供应商分页仅过滤显示,所有卡片操作使用完整配置。删除前保护活动供应商、任何聚合配置的默认成员和最后一个有效成员,并显示原因;底层删除函数执行同样检查。其他非默认成员仍可删除并清理引用。
验证
当前独立 PR 分支全量前端测试 664 项通过、1 项跳过;供应商列表隔离与删除保护专项 6 项通过,差异格式检查通过。
包含供应商保护的集成构建完成 release 构建与隔离管理器验证:禁止删除时配置不写盘,允许删除时保留隐藏活动聚合及其默认成员。本结果不替代当前独立分支的完整 release 验收。
独立上游分支:管理器全量测试 658 项通过、1 项跳过,包含真实模型刷新函数的三入口回归、刷新失败重试、恢复并发保护,以及普通官方和退出受管恢复的探测超时/失败回退。
注入脚本测试 55 项全部通过;
cargo test -p codex-plus-core --test plugin_navigation通过。插件适配夹具加载真实会话连接辅助函数,覆盖未启用聚合保护时模型和插件包装共同存在的原生请求透传。renderer 分片重新组装,manifest 行数契约和
git diff --check通过;Vite 生产构建通过。独立分支通过已安装原生后端的三种请求入口、共 30 项隔离检查,覆盖外部配置覆盖、模型选择、故障转移和冷恢复;此前真实客户端专用测试线程还验证了恢复超时、迟到响应不继续提交、会话间隔离及恢复后的消息完成。
cargo check -p codex-plus-core --tests通过。Rust 代理测试与 release 构建均在链接sherpa-onnx静态库时遇到LNK2019/LNK2001(缺少__std_*符号),因此此独立分支未完成 Rust 测试运行、release 产出和该产物的启动验收;没有修改依赖或编译配置。此前的客户端验证使用包含其他独立修复的集成构建,不等同于此独立分支的完整客户端验收。
边界
保护仅固定会话到本地代理的连接,不保证修复无效 TOML、不可用的上游、失效凭据或已经被终止的代理进程。未知旧会话首次发送保持原生路径,明确连接错误后下一次发送才进入按需检查。
5s 为每个已派发恢复 RPC 的超时,不是整个流程的总耗时上限,也不保证已开始的后端操作被取消。用户消息不自动重放,恢复失败或配置在恢复期间变化时需要重新发送。