Repository navigation
Conversation
自动评审初步意见(最终以维护者审阅为准)在最新 以下为建议在合入前处理的问题,按优先级排列: P1 —
|
- 删除未脱敏 codex-responses.txt 并重写为规范 json 录像 - marker-extractor: buildBotmuxSendCommand 改为标准单引号 Shell 转义;收紧正文 marker 匹配字符集 - recorder: proxyAndRecord 向上游设置 accept-encoding: identity 并剔除 content-encoding/content-length;补齐非流式 bodyJson 录制;findTape 忽略 query 参数匹配路径 - server: stop() 时调用 closeAllConnections() 避免 SSE 连接挂起;构造函数校验 mode 与 port;统一检查 res.headersSent - mock-llm-server.test: 补充 dynamic marker 替换、非流式 JSON 回放及构造函数校验单测 - tsconfig.test-mocks: 补充 mock-llm-server 模块类型覆盖
|
已根据评审意见全面修复并推送(commit P1 — 接通免 Token E2E 全链路(run-e2e 自动拉起与托管测试 Daemon)
P2 — 安全转义与数据脱敏
P3 — 代理与回放确定性修复
本地单测 12/12 通过, |
第二轮评审(新 head
|
- scripts/run-e2e: 使用 Bun 运行 src/index-daemon.ts,修复 Node 下缺少 tsx loader 导致的 ERR_MODULE_NOT_FOUND 启动即崩问题 - mock-llm-server: 规范 proxyAndRecord 目标 URL 构造,禁止协议/域名篡改,消除 CodeQL SSRF 安全告警 - e2e-browser/helpers: openChat 在侧边栏直接点击未打开时自动回退 Control+k 搜索定位目标机器人
第三轮评审(新 head
|
对上一条(#issuecomment-6072440571)修法的一处更正交叉复核发现我建议的环境变量写错了,特此更正,避免照抄:
这里有个不直观、但对本 harness 关键的细节,已实测确认: 因此阻断项的准确修法是:
其余结论不变:daemon 运行时(spawn bun)、SSRF、P2/P3 均已闭环;data 目录预置 + 上述进程管理补强后,需在 CI 中真正看到 mock 流量( |
对上一条 shim 隔离建议(#6072638705)再补一个重要限定交叉复核确认
影响面:CI 默认只跑 ci-core 三个单 bot 私聊用例(claude-basic / codex-basic / codex-prompt),不显现;但一旦 推荐做法(更新):
最终阻断清单不变:① 预建隔离 |
- file-lock: withFileLock 与 withFileLockSync 捕获 ENOENT 时自动递归创建 lockDir,避免目标父目录不存在导致 open wx 失败 - issue-board-store: withIssueLock 进入前自动创建 dataDir - daemon: startIssueOutboxPump 启动前确保 config.session.dataDir 存在 - scripts/run-e2e: 拉起测试 Daemon 前确保 BOTMUX_DATA_DIR 存在
第六轮评审(新 head
|
对上一条(#6079122341)根因的更正(交叉复核对齐)用真实 CLI 复测后,Claude 侧的根因要更正——不是 mock 握手不足:
进程管理项维持原判、仍需补:子进程 另更正一个影响面计数:最终落地树的生产改动只有两处—— Nits 不变: 总体验收线:CI 日志出现真实的 |
第七轮评审(新 head
|
第八轮评审(新 head
|
对上一条(#6094692973)CI 红归因的细化更正交叉复核拉全量日志后,第一点的归因需要修正,避免误以为这是纯粹的新代码回归: Claude 用例两次 attempt 挂点其实不同:
且 trace 报错那条维持: 其余结论不变并经复核加强:本轮 mock 仅 4 次 结论维持"暂不合入":核心免 token 链路仍只 Claude 一端成立(且相位机未修),Codex 零调用假绿;报告/录屏能力本身可保留,建议把上面的 CI 红按"attempt1 环境 ECONNRESET(可重跑)+ attempt2 既有脆断言被拆成独立硬步骤(需放宽)"分别对待,不要把 attempt1 也算成代码回归。以上为自动评审初步意见,最终以维护者审阅为准。 |
第九轮评审(新 head
|
第十轮评审(新 head
|
|
🚀 Released in v3.42.0 |
改了什么
test/helpers/mock-llm-server/):/v1/messages)、OpenAI Responses API (/v1/responses) 以及 OpenAI Chat Completions API (/v1/chat/completions);ACK-e2e-...、CODEX_E2E_MARKER_...),并生成对应的tool_use: Bash(调用botmux send --mention-back "...");tool_result,输出完成文本并返回终止状态;record模式:透明代理上游并完整捕获真实的逐帧 SSE 流;replay模式:脱机回放录制 Fixture,并支持动态 Marker 参数化替换;synthetic模式:0 配置、免录制直接合成协议流;/api/hello、/v1/oauth/hello与/v1/models,支持 Codex 的 Responses 格式。scripts/run-e2e.ts):--mock-llm与BOTMUX_MOCK_LLM=1环境变量支持,随 E2E 测试自动拉起与优雅停止;scripts/mock-llm-server.ts。test/mock-llm-server.test.ts(覆盖健康检查、Marker 提取、两协议流式事件、动态替换等 10 个用例,全绿);test/fixtures/mock-tapes/codex-responses.txt。为什么
在 Midscene 飞书真机 E2E 自动化测试中,底层的 Claude Code、Codex 等 CLI Harness 每次执行会产生大量的 Prompt 和推理 Token 消耗,且易受上游限流和响应波动影响。通过在 Harness 与底层 LLM API 之间引入 Mock/录制回放层,可以在使用真实飞书账号驱动真机的同时,实现 Harness 调用的模型返回完全不消耗真实 Token,并将测试执行耗时缩短至 1~2 秒。
影响范围评估
claude(Anthropic) 和codex(Responses API) 命令行上通过受控沙箱完成双轮交互闭环验证(exit code 0);scripts/run-e2e.ts,未修改核心 daemon 及生产运行时逻辑。实际测试验证
ANTHROPIC_BASE_URL指向 Mock Server,成功接收 Preflight/api/hello与/v1/messages;wire_api="responses"与base_url指向 Mock Server,接收/v1/responses并匹配 SSE 事件链,成功退出(exit 0)。