Skip to content

fix: normalize newlines when comparing synced prompt (CRLF breaks WAA proof) - #29

Merged
Mag1cFall merged 1 commit into
Mag1cFall:mainfrom
ventianima-lab:fix/prompt-sync-crlf
Sep 21, 2026
Merged

Mag1cFall merged 1 commit into
Mag1cFall:mainfrom
ventianima-lab:fix/prompt-sync-crlf

Conversation

@ventianima-lab

Copy link
Copy Markdown
Contributor

问题

Worker.Proof 把写入 textarea 后读回的值与原始 prompt 直接按字节比较:

value, err := worker.client.evaluateString(ctx, worker.contextID, fillPromptExpression(prompt))
...
if value == prompt {
    break
}

官网 textarea 会把写入值中的 CRLF 规范化为 LF。所以当客户端提示词含 CRLF 时,
这个比较永远不成立,5s 轮询耗尽后返回 官网 prompt 状态未同步
GenerateContent 失败,上游收到 502。

stream disconnected before completion: Provider stream error:
发送 AI Studio GenerateContent: 准备 fresh WAA proof: 官网 prompt 状态未同步

Windows 客户端很容易触发:多行请求体、工具调用结果、粘贴内容通常带 CRLF。
单行短提示词可以通过,所以现象表现为“用一会儿就报错”。

bootstrap 里的 filled != options.BootstrapPrompt 是同一个问题,
目前默认 bootstrap 提示词不含换行所以没暴露,但同样需要修复。

修复

新增 normalizePromptNewlines,只在同步判定处把 CRLF/CR 归一化为 LF。

写入页面的内容和 proof digest 仍使用原始 prompt,协议行为不变:

  • fillPromptExpression(prompt) 未改动,写入页面的仍是原始文本
  • sha256.Sum256([]byte(request.Prompt)) 未改动,digest 仍基于原始文本
  • 只有“页面是否已同步”这个判定被归一化

验证

本地实测,Pro 账户,gemini-3.8-flash,Windows 11:

换行 结果 耗时
修复前 LF 200 16827ms
修复前 CRLF 502 37449ms
修复后 LF 200 2439ms
修复后 CRLF 200 1558ms

修复后用含 CRLF 的提示词跑完整协议面:

/v1/chat/completions   200  1558ms
/v1/responses          200  1252ms
tool_calls             200  6178ms  finish=tool_calls, 参数正确
SSE streaming          200  chunks=4

注意 LF 情况也从 16.8s 降到 2.4s。此前每个请求都在白等一轮 5s 轮询超时,
因为 evaluateString 返回值与原文比较失败会重试到 deadline 附近才偶然通过。

新增 internal/camoufoxnative/page_test.go,覆盖归一化本身和 CRLF/LF 同步判定。

go vet ./internal/camoufoxnative/                 ok
go test ./internal/camoufoxnative/                ok  0.821s
go build ./...                                    ok

Worker.Proof 把写入 textarea 的返回值与原始 prompt 直接按字节比较。
官网 textarea 会把写入值中的 CRLF 规范化为 LF,因此当客户端提示词
含 CRLF 时该比较永远不成立,5s 轮询后返回“官网 prompt 状态未同步”,
GenerateContent 随之失败并向上游返回 502。

Windows 客户端很容易触发:多行请求体、工具结果或粘贴内容常带 CRLF。
本地实测(Pro 账户,gemini-3.8-flash):

  修复前  LF 换行    200  16827ms
  修复前  CRLF 换行  502  37449ms
  修复后  LF 换行    200   2439ms
  修复后  CRLF 换行  200   1558ms

新增 normalizePromptNewlines,仅在同步判定处归一化 CRLF/CR 为 LF。
写入页面的内容与 proof digest 仍使用原始 prompt,协议行为不变。
bootstrap 的 filled 比较存在同样问题,一并修复。

补充 page_test.go 覆盖归一化与 CRLF/LF 同步判定。
go vet、go test ./internal/camoufoxnative/、go build ./... 均通过。
@Mag1cFall
Mag1cFall merged commit 676b74c into Mag1cFall:main Sep 21, 2026
2 checks 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