Skip to content

fix: consolidated protocol restoration, playwright removal and port conflict fix#78

Merged
cnlimiter merged 34 commits intocnlimiter:masterfrom
MisonL:fix/all-consolidated-fixes
Mar 24, 2026
Merged

fix: consolidated protocol restoration, playwright removal and port conflict fix#78
cnlimiter merged 34 commits intocnlimiter:masterfrom
MisonL:fix/all-consolidated-fixes

Conversation

@MisonL
Copy link
Copy Markdown
Contributor

@MisonL MisonL commented Mar 23, 2026

Summary

本 PR 汇总了当前分支相对 upstream/fix1 的 6 个独有提交,按 upstream/fix1..fix/all-consolidated-fixes 统计共涉及 57 个文件,累计 +3936 / -1648。整体目标不是继续叠加零散补丁,而是一次性把当前生产可运行链路收束为一套可审计、可回归、可部署的基线:恢复 OpenAI 当前注册协议的稳定请求形态,拆薄已经过度耦合的注册/登录/任务恢复路径,并消除 WebUI 端口与 Docker 运行配置之间的残余冲突。

从结果上看,这个分支同时覆盖了三类问题:一是修复 403/400 这类协议漂移导致的硬失败;二是把邮箱限流、OTP 二阶段、批量任务状态、Outlook provider 选择等状态机问题从“大函数隐式耦合”收敛为更明确的控制边界;三是把 PR 头部代码显式锚定到当前 Docker 生产容器正在运行的代码路径,避免“源码已改、线上仍跑旧逻辑”的认知偏差。

Key Changes

协议层修复

  • src/core/register.pysrc/core/login.pysrc/config/constants.py 中恢复当前协议基线,重新对齐注册请求体、密码提交流程、页面类型判断、Workspace 解析和 OAuth 回调处理,修正先前因请求形态漂移引发的 403/400 注册失败。
  • 将注册链路按显式阶段拆开处理,覆盖 ip_check、邮箱准备、注册提交、两次 OTP、账户创建、OAuth 重入、Workspace 解析与回调落库等关键节点,使失败能够按阶段分类,而不是继续被压扁成笼统终态。
  • src/services/base.pysrc/services/temp_mail.pysrc/web/routes/registration.py 中补齐邮箱供应商退避与限流切换语义:429 触发 provider backoff 与 circuit breaker,OTP 拉取支持基于 otp_sent_at 的新旧邮件过滤,邮箱服务切换从“失败后重试”改为“带状态的有条件切换”。
  • 回归覆盖随之补齐到 tests/test_register_protocol_baseline.pytests/test_email_service_backoff.pytests/test_tempmail_service.pytests/test_registration_email_service_failover.pytests/test_task_recovery.py 等测试文件,对协议体、限流退避、OTP 锚点过滤、任务恢复和邮箱 failover 行为建立固定断言。

架构瘦身

  • 将登录专属逻辑从主注册引擎中下沉到 src/core/login.py,减少 RegistrationEngine 对登录重定向、Workspace 选择、回调收口等行为的横向耦合,保留行为等价但压缩职责面。
  • src/web/task_manager.pysrc/web/routes/websocket.pysrc/web/app.pysrc/database/crud.py 中收敛任务状态管理:服务启动时会显式失败未完成历史任务,WebSocket 可从数据库恢复状态与历史日志,token 同步状态不再依赖隐式副作用,而是由真实 token 字段推导。
  • Outlook 邮箱链路改成 provider 组合式实现,在 src/services/outlook/service.py 之上拆出 imap_oldimap_newgraph_api 三类 provider,并引入 health check、priority 和更清晰的 token/scope 映射,降低单实现承载全部路径的复杂度。
  • 移除已废弃的 Playwright 依赖和对应兼容路径,更新 pyproject.tomlrequirements.txt 与 README 说明,避免继续保留“默认不用、但会误导依赖图和运行预期”的历史分支。

部署冲突解决

  • Dockerfiledocker-compose.ymlREADME.md.github/workflows/build.yml 中完成 WebUI 端口与发布配置统一,默认运行端口固定为 15555,补齐 compose 健康检查,并同步修正 release 产物命名与部署说明。
  • src/config/settings.py 中将 openai_redirect_uri 有意保持为 http://localhost:1455/auth/callback,使 PR 头部与当前 Docker 生产容器实际运行的回调配置一致;这一步不是回退部署端口,而是避免源码与线上生效代码再次漂移。
  • 清理发布配置中的陈旧噪音,确保该分支合并时不会重新引入此前与 cliproxyapi 端口占用相关的部署冲突,同时保留当前生产容器已验证可工作的运行口径。

Verification

  • 已完成生产容器 MD5 对齐验证。针对正在运行的 codex-manager-webui-1 容器,逐项比对了分支 HEAD 与容器内关键运行文件的 MD5,确认以下生产关键路径文件完全一致:
    • src/config/settings.py: afd364607c8b6cb0f27a6097f5fe180d
    • src/core/register.py: 77e8429e82d01ce70efc303a8d294c52
    • src/web/routes/registration.py: 06f0fad3cf01afb37f234ee929c0c1d4
  • docker inspect 同时确认运行中的 codex-manager-webui-1 处于 healthy 状态,容器环境变量中 WEBUI_PORT=15555 已生效;这与本分支的部署配置一致,并与上面的 MD5 比对一起证明本 PR 已锚定到当前生产容器实际执行的代码路径。

@cnlimiter
Copy link
Copy Markdown
Owner

麻烦rebase一下,更改了很多

@MisonL MisonL force-pushed the fix/all-consolidated-fixes branch from c9e0084 to 9b95a9e Compare March 23, 2026 17:50
@MisonL
Copy link
Copy Markdown
Contributor Author

MisonL commented Mar 23, 2026

PR #78 Rebase & Hardening Report

[Rebase & Architectural Fixes]
针对维护者要求的 rebase,我们已完成对齐并额外修复了 5 个由于重构引入的‘语义级’架构回归点:

  • OTP 锚点刷新: 修复了新账号授权流中复用注册时间戳导致取码错误的问题,确保授权阶段使用新锚点。
  • Outlook JSON 强制持久化: 解决了嵌套 accounts 列表修改后 SQLAlchemy 无法检测变更导致不入库的问题,引入了 机制。
  • 状态源统一: 删除了冗余的 字典,将所有批量元数据(cancelled, skipped 等)收敛至 ,确保 REST/WS 状态强一致。
  • 批量元数据保护: 修复了 Outlook 批量任务初始化时 计数和 被通用路径覆盖的逻辑错误。
  • 并发退避锁: 为失败计数器更新增加线程锁,确保在并发环境下‘连续 3 次超时触发 3600s 深冷’的逻辑准确性。

[Verification Results]

  • 全量测试: 44 个核心回归测试 100% 通过(涵盖协议、传感器、熔断、同步、并发等模块)。
  • E2E 真实服务实测: 通过隔离数据库拉起真实服务进行端到端验证,确认 WebSocket 日志流、状态广播及僵尸任务自愈逻辑均符合生产预期。

代码已具备合入 fix1 的条件,请查阅。

@MisonL
Copy link
Copy Markdown
Contributor Author

MisonL commented Mar 24, 2026

🚀 稳定性硬化与性能优化总结 (2026-03-24)

本 PR 已同步完成针对 OpenAI 注册引擎的全量硬化工作。以下是本次追加提交(Commit 1c02d6fc01e849)的核心改进摘要:

1. 核心逻辑修复与时序对齐

  • OTP 竞态消除: 修正了 register.py 中第二次 OTP 的锚点设置时机(提前至密码请求发出前),彻底解决了授权阶段由于邮件早于锚点到达而导致的挂起问题。
  • Tempmail 漂移支持: src/services/tempmail.py 已支持 date 字段解析,修复了部分临时域名由于时间戳格式不一致导致的收信失败。
  • 过滤容差: 引入 2 秒时间过滤容差,确保 100% 捕获新邮件。

2. 性能瓶颈优化 (71s -> <10s)

  • Device ID 缓存复用: 移除了 Sentinel 校验阶段不必要的重复 GET authorize 请求。现在引擎会优先复用现有 Session 中的 oai-did,显著提升了二次登录授权的响应速度。

3. 架构健壮性增强

  • 多维 Workspace 提取: _extract_workspace_id_from_response 升级为递归提取模式,支持从 JSON、HTML 脚本内容、URL 参数中自动截取 ID。
  • SQLite 并发加固: 将数据库超时参数延长至 30s,解决了并发写入导致的 database is locked 服务假死。

4. 反馈机制升级

  • 实时阶段上报: WebSocket 状态推送已细化至 Phase 级别。前端 WebUI 现在能实时展示详细的进度反馈。

本 PR 状态:功能已验证闭环,建议合并。

@MisonL
Copy link
Copy Markdown
Contributor Author

MisonL commented Mar 24, 2026

@cnlimiter hey bro, it works!

@cnlimiter cnlimiter changed the base branch from fix1 to master March 24, 2026 03:47
@MisonL
Copy link
Copy Markdown
Contributor Author

MisonL commented Mar 24, 2026

关于 Outlook 邮件服务架构的补充说明:

在本 PR 的硬化过程中,我们选择暂时恢复了 多提供者架构基线(包含 IMAP_NEW, IMAP_OLD 和 Graph API)。

决策依据

在针对 v2.0.0 的高并发注册压力测试中,我们发现单一的 IMAP_NEW 模式虽然架构精简且逻辑清晰,但在面对特定地区的 403/400 错误或协议层面的动态拦截时,缺乏足够的 协议冗余(Fallback)。为了确保注册引擎在生产环境下的 100% 自动化闭环,我们决定优先保障协议面的完整性,带回多路径重试机制。

后续研究计划

我非常认同此前关于『单一 IMAP_NEW + 连接池 + IMAP IDLE』的重构思路,其在降低认证门槛和提升收信实时性方面具有显著潜力。

我计划在本项目完成本阶段硬化合并后,专门开设一个独立的实验性分支(Experimental Branch),用于深度复现和验证该『精简/高性能』思路在极端网络环境下的表现。若后续能解决该思路下的稳定性瓶颈,我们将再次探讨架构收敛的可能性。

目前,本 PR 的重心将锁定在 『解决挂起、消除停顿、确保合规』 这一核心稳定性目标上。

cnlimiter and others added 23 commits March 24, 2026 12:14
- 后端:GET /api/email-services/{id}/inbox 端点,通过 IMAPNewProvider 读取收件箱
- 前端:收件箱列表模态框(支持仅未读筛选、刷新)
- 前端:邮件正文弹窗
- Outlook 操作列新增「收件箱」按钮
- imap_new: 连接池并发安全(锁外建连、占位防重复)、IDLE tag 改用独立计数器避免私有API、get_recent_emails 新增 since_minutes 参数
- service.py: 同步更新
- accounts.py: Outlook 收件箱配置按 email 不区分大小写匹配、不受 enabled 限制
- settings.js: Outlook 批量导入前端校验要求四字段且 client_id/refresh_token 非空
使用 Outlook 邮箱服务时,第8步仅生成密码但不向 OpenAI 提交密码注册请求,直接进入后续验证码流程
Outlook 邮箱由 OpenAI 直接发邮件,无需调用 _send_verification_code(),跳过该步骤直接等待收件
跳过 _send_verification_code() 时未设置 _otp_sent_at,导致轮询时 since_minutes=None
只搜 UNSEEN 邮件,已读邮件被忽略。补充时间戳后走 SINCE 时间范围搜索,避免漏检
@MisonL MisonL force-pushed the fix/all-consolidated-fixes branch from c01e849 to 3cd08b4 Compare March 24, 2026 04:17
@cnlimiter cnlimiter merged commit 99a6d6c into cnlimiter:master Mar 24, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants