feat(card): 支持按 Bot 置顶实时会话卡片 - #1067
Conversation
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
|
感谢这个 PR,生命周期覆盖得很完整 👍 我们做了一轮自动评审(双 agent 交叉复核),没有发现阻断性正确性问题。下面是几条非阻断的建议,供你参考。 先说验证结论,避免你重复劳动:我们注意到 PR 里提到「缺少可隔离的测试 Bot、未做真实飞书验收」,所以我们在临时自建的话题群里对飞书 Pin API 做了端到端探针(跑完即解散,不涉及任何现有会话),结果对这个 PR 是好消息:
另外我们也确认了 建议(均非阻断)1) JS 语义下这会静默吞掉 try 块的异常(我们实测确认,而且连正常的 return 值也会被 finally 的 return 覆盖,连日志都不留)。目前 try 内部是 2)
3)两处小 nit
4)
5)需要维护者拍板的一点:Pin 是群级的,而实现语义是 per-session这是我们唯一想请你和维护者一起确认的设计点。实测:同一个群里两个话题各 Pin 一张卡,群级 Pin 列表会同时存在两条。我们查了现网数据,绝大多数群(约 97%)确实只有单个活跃会话,不受影响;但长尾里存在同一个群有 158 个并发会话、且每个都持有真实 我们注意到设计文档里其实已经明确写了这个取舍("Pins are chat-wide and the invariant is per session"),所以这不是疏漏。建议:
顺带说明我们已排除的一项怀疑,免得你多花时间: 以上是自动评审的初步意见,最终以维护者审阅为准;第 5 点涉及产品语义,需要维护者决定方向。感谢你的工作 🙏 |
|
补一条上面漏掉的建议,是我们评审里唯一「现在正确、但很容易被后续改动破坏」的点,值得直接固化到代码里。
|
|
维护者看过这个 PR 后,提了一个我们前两轮评审没覆盖到的场景:群里有多个机器人、多张流水卡时会怎样。我们为此补做了一轮真机验证(临时自建话题群、跑完即解散,不涉及任何现有会话),验出两条新信息,其中第二条我们认为是本 PR 目前最值得考虑的一处改进,所以单独开一条评论说明。 再次强调:代码正确性我们两轮评审都是 0 阻断,下面这些不是「实现错了」,而是「设计边界值得再想一步」。 一、
|
背景
活跃会话的关闭入口位于公开实时状态卡片中。消息持续产生后,这张卡片容易沉入历史,清理已完成会话时需要反复查找。
本 MR 为每个 Bot 增加一个默认关闭的
pinStreamingCard开关:开启后,仅将会话当前真实的streamCardId置顶;换卡、转移和成功关闭时按生命周期 best-effort 清理旧 Pin。改动内容
pinStreamingCard配置,只有字面量true开启,缺省保持关闭。/botconfig set pinStreamingCard on|off暴露即时生效入口。pinMessage/unpinMessage窄封装,显式处理 SDK 非零错误码和 transport-disabled 边界。streamCardId参与,明确排除 repo 选择卡、私有/card、最终回复、CoT 和关闭卡。影响面
bot-registry、Dashboard 配置、worker-pool、Lark client 与卡片恢复 handler。streamCardId生命周期工作;apiOnly、HTTP virtual 与无 Lark transport 会话不调用 Pin API。streamCardId/ 已知 frozen stream-card ID。一致性与限制
验证
19 files passed,969 passed / 1 skipped。mise exec bun@1.4.0 -- bun run build:通过(TypeScript、scripts typecheck、Dashboard bundle、dist audit)。git diff --check origin/master...HEAD:通过。mise exec bun@1.4.0 -- bun run test:1111 files passed / 9 failed / 1 skipped,18859 tests passed / 14 failed / 17 skipped。14 个失败均落在未修改的既有环境相关测试:/home与/data00/home路径别名、Bubblewrap/MCP 沙箱权限、宿主进程名以及 DSH 沙箱;与本功能前序基线的失败集合一致。显式讨论:未来是否默认开启?