Skip to content

WebSocket 帧大小上限:/api/ws 1 KiB、/agent 16 MiB,运行器按字节分批上传工作记录 - #86

Merged
joesmart merged 5 commits into
mainfrom
joesmart/sec-ws-maxpayload
Oct 23, 2026
Merged

joesmart merged 5 commits into
mainfrom
joesmart/sec-ws-maxpayload

Conversation

@joesmart

@joesmart joesmart commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

改了什么

  • packages/shared/src/protocol.ts:新增 AGENT_FRAME_MAX_BYTES = 16 MiB,作为 /agent 单帧上限的唯一来源。
  • packages/control-plane/src/server.ts:/api/ws 的 maxPayload 设为 1 KiB(PUSH_MAX_PAYLOAD),/agent 用 AGENT_FRAME_MAX_BYTES。原来两条都是 ws 默认的 100 MiB。/api/ws 的推送连接补上 error 监听:ws 遇到超限帧会以 1009 关连接并发出 error,原来没人监听,这个 error 会变成未捕获异常,一帧就能打崩控制面。
  • packages/bot-runner/src/work-mirror.ts:work_append 原来只按 64 行分批,现在同时按字节分批,每帧留 64 KiB 给其余字段和信封。单条就超过上限时停流,不发出去。

为什么这么做

  • 网页在 /api/ws 上只收不发,1 KiB 已经够宽。
  • 可靠帧被 1009 关掉后,电脑重连会原样重发。所以 /agent 上限不能只在控制面卡,发送方必须先按同一个数切。否则一批偏大的 work_append(单行不限字节:toolCall 参数、thinking 都不截断)会让这台电脑陷入“重发、被关、再重发”的循环。
  • 单条超限时停流,这个工作流就进入“没确认”状态:带副作用的工具先不执行,下次按服务器记录重建。这样比把它塞进可靠发件箱、卡死整台电脑的连接好。
  • 握手超时 hub.ts 原来就有(HELLO_TIMEOUT_MS = 10_000,到点按 badHello 关),代码没改,只补测试钉住。

新测试

  • control-plane/test/ws-max-payload.test.ts(4 条):/api/ws 超限帧以 1009 关、正常推送不受影响;/agent 握手前后超 16 MiB 的帧以 1009 关、4 MiB 的照收照确认;10 秒不报 hello 按坏 hello 关。在 main 的 server.ts 上,前 3 条失败。
  • bot-runner/test/work-mirror.test.ts 新增 2 条:「一批条目加起来超过上行帧上限时按字节分批,每帧都在上限以内,条目一条不落」「单条就超过上行帧上限时停流,前面的照传,超限的那条不发出去」。改运行器之前这 2 条都失败。

怎么验证的(本机)

  • pnpm format:check && pnpm typecheck && pnpm lint:通过,lint 0 错误
  • pnpm --filter @baize/control-plane test:1534 passed | 1 skipped
  • pnpm --filter @baize/bot-runner test:1703 passed | 15 skipped
  • pnpm --filter @baize/computer-agent test:194 passed | 1 skipped
  • pnpm --filter @baize/shared test:277 passed
  • pnpm --filter @baize/e2e test:53 passed
  • pnpm --filter @baize/web test:vitest 351 passed,Playwright 453 passed

Closes #28

🤖 Generated with Claude Code

https://claude.ai/code/session_01Be3SZps2JjqvyrJ1vbLmni

@joesmart joesmart changed the title /api/ws 与 /agent 两条 WebSocket 设帧大小上限 WebSocket 帧大小上限:/api/ws 1 KiB、/agent 16 MiB,运行器按字节分批上传工作记录 Oct 23, 2026
@joesmart
joesmart force-pushed the joesmart/sec-ws-maxpayload branch from e5aa106 to 4a78f2c Compare October 23, 2026 14:40
@joesmart
joesmart merged commit 86fe363 into main Oct 23, 2026
1 check passed
@joesmart
joesmart deleted the joesmart/sec-ws-maxpayload branch October 23, 2026 14:41
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.

Web 与 agent 两条 WebSocket 没设 maxPayload

1 participant