Skip to content

fix(worker): 避免冷启动误报消息投递失败 - #781

Merged
deepcoldy merged 2 commits into
deepcoldy:masterfrom
hyperdai:codex/worker-cold-start-receipt
Aug 8, 2026
Merged

fix(worker): 避免冷启动误报消息投递失败#781
deepcoldy merged 2 commits into
deepcoldy:masterfrom
hyperdai:codex/worker-cold-start-receipt

Conversation

@hyperdai

@hyperdai hyperdai commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

问题

普通群消息在冷启动 Worker 时立即启动 2 秒回执计时。Worker 模块加载耗时超过两轮计时后,Daemon 会发送“Worker 未能接收”的错误提示,但消息随后仍会进入 CLI,形成用户可见的假失败和重复投递。

修改

  • 通过 Node --import 加载轻量 IPC 预加载层,在完整 Worker 模块加载前持有并确认首轮消息
  • 正式 Worker IPC 处理器注册后,按原到达顺序重放暂存消息
  • 保留现有 turn_input_committed 队列提交确认、重试与失败恢复语义
  • 增加预加载回执、非普通会话隔离和就绪后透传的回归测试

影响面

  • 影响所有 CLI 的 Worker 冷启动首轮普通群消息
  • 稳态消息在正式处理器就绪后直接透传,不经过预加载暂存
  • adopt、持久后端及各 CLI 输入队列逻辑不变
  • 使用文件 URL 注入预加载模块,兼容 macOS、Linux 和 Windows 路径

验证

  • pnpm exec vitest run test/worker-ipc-preload.test.ts test/session-lifecycle-start.test.ts test/worker-ordinary-im-receipt-wiring.test.ts:81 项通过
  • pnpm test:全量 unit 测试通过
  • pnpm build:通过
  • 真实子进程延迟 3 秒注册处理器:约 124 ms 返回回执,约 3125 ms 后按序交给正式处理器

在完整 Worker 加载前确认进程已持有首轮输入,避免模块加载较慢时触发错误重试和用户可见的假失败。正式处理器就绪后仍按原顺序提交消息,保留现有队列确认与失败恢复语义。
@hyperdai
hyperdai requested a review from deepcoldy as a code owner August 7, 2026 08:55
恢复 process 作为 EventEmitter 的实际运行时类型,避免不同 @types/node 版本将 emit 重载收窄后阻断 TypeScript 构建。类型转换仅作用于就绪事件,不改变 IPC 回放逻辑。
@hyperdai

hyperdai commented Aug 7, 2026

Copy link
Copy Markdown
Contributor Author

已修复评审指出的 TS2769 阻塞:将自定义就绪事件的调用点收窄转换为 NodeJS.EventEmitter,保持运行时和 IPC 回放语义不变。

验证:

  • pnpm build:通过
  • 相关测试:3 个文件、81 项全部通过

最新提交:e8cacac3

@deepcoldy
deepcoldy merged commit 6d25d13 into deepcoldy:master Aug 8, 2026
@github-actions

github-actions Bot commented Aug 9, 2026

Copy link
Copy Markdown

🚀 Released in v3.11.0

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