Repository navigation
fix(codex): 桥接异步提问到飞书卡片并回传原会话 - #1878
uestcwangci wants to merge 6 commits into
Conversation
|
你好,这个 PR 的自动评审群已建好(飞书群,机器人双评审流程)。系统按名单自动邀请时受跨租户可见性限制没能直接拉你进群。 请点击下面的链接加入评审群(一年有效,群外成员需要通过此链接申请加入): 如果链接打不开,也可以把你的 GitHub 账号和飞书信息补录到名单文档,后续复审会自动拉你进群:https://bytedance.larkoffice.com/wiki/WJ1nwWbtxi89erkNGNbcgkt9nUe (本条由 Botmux 自动巡检流程发布) |
|
更新:已通过内部流程把你直接邀请进评审群,无需再点上面的加群链接,在飞书里查收群邀请即可。(自动流程补拉,抱歉打扰) |
|
自动评审初步意见,最终以维护者审阅为准。 整体质量很好:线协议字段( P2-1:答复人身份绑定了可变的
|
|
补充一条落地细节(接上条自动评审意见,最终仍以维护者审阅为准): P2-1 的 caller 冻结时机必须在注册侧,不能在投递时实时查:
回归测试希望覆盖两条时序,且走真实 daemon 接线(不是
|
|
再补一条验收边界(接上两条自动评审意见,最终以维护者审阅为准): P2-1 补充:自治/定时轮没有真人入站,fail-closed 需要显式第二出口严格落成「注册时取 建议把答复人解析做成注册时一次冻结的有序回退,每一级都必须过
一个落地坑:第 2 级不要直接复用 另外请一并考虑 验收回归在已有两条时序之外再加第三条,同样要求真实 daemon 接线:
|
|
补充一个与上面身份回退同级的残留点,请并入同一次修改(自动评审初步意见,最终以维护者审阅为准): 回退到「任务创建者 / session owner」时,answererOpenId 是硬锁,定时无人值守场景会变成「看得到答不了」
因此四级回退落到第 2/3 级(定时任务创建者 / session owner)时会产生新问题:定时轮常是无人值守任务,创建者不在线时,群里其他值守成员点不动卡片,只能等 1 小时超时——比静默不发卡只多一个中间态。两个口径二选一,请明确写进文档,不要留隐式:
若采用回落 canTalk,有一处必须连带修改:当前投递回调 验收时序(在上一条三条基础上明确)
|
|
再补一条并发卡残留(接上几条自动评审初步意见,最终以维护者审阅为准): P2(并发面):同话题多张异步卡并存时,话题文字作答会静默错配到最早注册的那张
对修法的关键约束:不能简单禁止异步卡走文字作答
建议落成基于卡片消息的消歧(
验收时序加一条:同话题 ≥2 张并发异步卡(至少一张含文字题)时,普通文字不被静默错配(按上面 2 的规则要么精确命中引用卡、要么正常路由 + 可见提示),按钮作答各自正确。 |
|
对上一条多卡文字作答消歧的两个实现约束(自动评审初步意见,最终以维护者审阅为准):
验收时序第 5 条最终形态:
|
|
复审通过,之前的 2 个 P2 与并发消歧都已解决(注册侧身份冻结、定时/自治轮 canTalk、silent 不发卡、精确 parentId 消歧、真实 IPC 路由回归覆盖 thread/chat 两 scope,均已本地验证并做变异测试)。仅余两个不阻塞的小问题,方便的话可顺手修:
(自动评审初步意见,最终以维护者审阅为准。) |
|
交叉复审发现 1 个建议合前修掉的策略收窄(自动评审初步意见,最终以维护者审阅为准): 真人发起轮的发卡门槛用了 canOperate,比阻塞式提问更严,且无测试钉住
if (sender && !botSender) return canOperate(ds.larkAppId, ds.chatId, sender)
? { kind: 'human', answererOpenId: sender } : { kind: 'unavailable' };可达场景:限制态 bot( Parity 问题:阻塞式 该分支目前无测试钉住:临时把这行放宽为无条件 建议:
另外,上一条 nit 里的文档矛盾在当前 head 上仍然存在( |
Codex App 的
request_user_input_async通过agentMessage(delivery: async)发出,原桥接只处理阻塞式item/tool/requestUserInput,因此工具调用成功却没有飞书提问卡。本 PR 将异步问题桥接到独立 Ask 卡片,把答案按原 call ID / 题号回传同一原生线程,当前模型轮次继续工作。最新修订修复真人异步卡的权限收窄:注册真人卡使用与 broker 点击同源的
evaluateAskAnswerTalk(larkAppId, chatId, sender, chatType),发起人只有 canTalk 权限也可收到卡。answererOpenId仍注册时冻结为发起人本人;定时任务创建者及自治 owner 的 canOperate 来源检查保留。同步中英文档答复范围,删除 runner 重复的itemText.clear()并对齐相关缩进。本次修订处理评审中的身份、协议兼容、并发卡片和可见失败问题:
listPendingAsksByAnchor,原 first-match API 不变。多卡并存时必须精确匹配parentId === cardMessageId;无引用或引用无关消息继续普通输入并显示提示。thread-scope / chat-scope 均覆盖,文字题仍可引用卡片作答。影响共享 Ask IPC / broker / renderer、Codex App runner 和构建身份;同步提问、Claude/OpenCode hooks 保持旧路径。题组仍按一张卡原子提交,含文字题时回复整个题组,尚不支持 TUI 的逐题部分提交。待答卡仍不跨 daemon/runner 重启恢复,不补发历史问题。
验证:
本轮完整
bun run build通过;7 文件 / 415 项相关回归通过,覆盖 runner、Ask API/broker/card 和 talk parity;最终 daemon 路由 + async helper 150 项通过。新增 5 条真实 HTTP 路由测试:限制态 bot 仅 owner 有 operate、群授权放行 talk-only 发起人,在 thread/chat 两 scope 发卡并由该发起人点击回传同一原生线程;另一名可对话 owner 无法代答;未授权及黑名单用户维持 409 + 可见提示;定时创建者只有 canTalk 仍拒绝发卡。broker 注入生产
evaluateAskAnswerTalk,不模拟该权限判定。新测试在旧实现上两个 talk-only 场景失败;变异验证分别删除真人 talk 门、改回 operate 门、放宽定时创建者门,三个错误版本均被明确断言拒绝。
完整
bun run build通过,包含源码 / 脚本 / mock 类型检查和产物审计。真实 daemon HTTP 接线 12 个专门场景通过:A 发起后 B 插话、>32 轮来源淘汰、非共享定时与旧任务 owner 回退、创建者撤权、silent、bot/user 归因、身份缺失、超时、换代,以及两种 scope 的多卡引用 / 普通输入 / 按钮答复。测试运行生产 HMAC IPC server、生产 route、broker 和 worker accepted ledger;外部 IM、worker IPC 接收端及任务记录查询使用替身。
原生 runner 完整回归与 helper 曾通过 114 项;新增待答上限等异步场景单独 13 项通过,非法通知修正和相同普通输出隔离再补 2 项通过。
共享 Ask 与其他 CLI hooks 的 11 文件 / 352 项回归,以及Ask 接线相关 5 文件 / 286 项回归通过。
与 feat(codex): 支持 /queue 将消息排队为独立轮次 #1880 合并的实际部署候选,19 文件 / 978 项回归通过;最后两项新增 runner 用例单独通过。编译版与本地部署验证在下方记录。
git diff --check通过。未将模拟飞书 API 表述为全部场景的真实飞书人工验收。可复现的关键命令:
bun run build node node_modules/vitest/vitest.mjs run --project unit \ test/daemon-rename-route.test.ts --testNamePattern 'async Ask production' --retry 0 node node_modules/vitest/vitest.mjs run --project unit \ test/codex-app-runner.integration.test.ts test/codex-async-user-input.test.ts node node_modules/vitest/vitest.mjs run --project unit \ test/ask-api.test.ts test/ask-broker.test.ts test/ask-card.test.ts \ test/ask-hook-claude.test.ts test/ask-hook-opencode.test.ts编译部署候选
3.41.0+async-queue.2的 Bun / Linux x64 编译 runner 测试 40 项通过(13 helper + 27 runner),含两项原生输入 FIFO、所有异步场景和既有同步提问。本地已部署合并版
3.41.0+async-queue.2:9 个 bot 与 Dashboard 在线(HTTP 200),配置 SHA 未变,9 个会话数据库的 779 条记录及逐库计数完整保留,11 个数据库备份校验通过。真实飞书新增边界场景尚未人工验收。以上
.2本地部署记录对应此前合并版本;本轮真人 canTalk 补丁已更新至本 PR,尚未重新部署。