Conversation
/fork --create 把子会话固定注册为 chat-scope(anchor=新群 chatId),但目标 Bot 普通群默认回复模式为 new-topic 时,新群顶层入站消息被路由为 thread-scope (anchor=messageId),永远命不中分身,误建空白会话并弹仓库选择卡;bot.added 自动开工也会在 new-topic 下另发 seed 争抢锚点。 修复(三级优先级:用户显式 per-chat 设置 > fork 专属群保护 > Bot 全局默认): - 新增 services/fork-destination-store 进程内登记表:createChat 一返回 chatId 即经 onChatCreated 标记,覆盖「建群→钉模式落盘」竞态窗口;不持久化 - /fork --create 建群后以 force + source:'fork-pin' 把该群 per-chat 回复模式 钉为 chat-topic(与用户验证的临时规避一致),不改 Bot 全局默认,失败时 best-effort,marker 与 restore 兜底仍生效 - event-dispatcher regularGroupRouting:fork 专属群且无显式 per-chat 条目时 顶层消息强制平铺到 chatId;四种模式(chat/chat-topic/shared/new-topic) 与非@(mention-mode never)入站均稳定命中分身 - daemon handleBotAdded:fork 专属群的自动开工让位给分身(forcePrompt 除外) - setChatReplyMode 新增 force/source:用户或 dashboard 显式 /reply-mode (含切回与全局默认同值的 new-topic)force 落 per-chat 条目并摘除 marker, 群级设置保持可编辑 - restoreActiveSessions 从持久化的 group+chat-scope+forkedFrom 子会话行重建 marker,作为钉模式未落盘时的跨重启兜底;同群子话题 fork(thread-scope) 不会被误标 测试:新增 fork-destination-store 单测;event-dispatcher 增加四模式/非@/ 显式覆盖优先级路由回归;command-handler 覆盖 marker 时机、pin 入参、pin 失败仍完成;group-join 覆盖自动开工让位与无 marker 不回归。全部先红后绿。 Co-Authored-By: Claude Code <noreply@anthropic.com>
|
你好 @DeepColds,已为这个 PR 建立内部自动评审群:https://applink.feishu.cn/client/chat/open?openChatId=oc_e8b1ddc68908fef543d8edd83ebe1cd3 首轮评审正在进行,结论出来后我们会同步在这里。目前暂未能把你拉进评审群(自动拉群名单里你的账号还没有可用的飞书信息)。如果希望直接进群参与讨论,请把 GitHub 账号与飞书信息补录到这份名单文档:https://bytedance.larkoffice.com/wiki/WJ1nwWbtxi89erkNGNbcgkt9nUe ,补好后后续复审会自动把你拉进群。 (这是自动流程发出的消息,请以维护者最终审阅为准。) |
|
你好 @DeepColds,自动评审的初步意见来了。 结论:技术上成立,未发现阻断问题,可直接合入。 下面 4 条都是可选的 follow-up 建议,不影响合码。 验证情况评审期间主干前进到
两层设计(建群时钉持久 per-chat 可选 follow-up1. fork 失败路径可以补一行
很窄,且 marker 是纯内存态、重启自愈、restore 也不会重建它( 2. 注释仍写着 3.
4. 「仅 marker」降级态下原生话题会折叠(两处 pin 未落盘、只有 marker 的降级态里,群内原生话题会折叠回群会话,而不是像 pin 成功时那样各自独立。原因是 注意 一点影响面提示
以上是自动评审流程的初步意见,最终以维护者审阅为准。 |
|
补充一条对上一条评论里 第 4 点 的更正 —— 建议本身不变,但我把症状描述写宽了,这里说准确一些。 上一条我写的是「降级态下群内原生话题会折叠回群会话」。实测下来,这个说法只对
原因是两处判断各管一段: 于是降级态的实际后果是:话题的第一条消息进了群会话,之后的回复另起一个话题会话 —— 恰好就是 结论不变:仍然是非阻断的可选 follow-up,而且上一条说的「两处 同样地,以上仍是自动评审流程的初步意见,最终以维护者审阅为准。 |
Fixes #1400
问题
/fork --create <新群名>把子会话固定注册为scope=chat、anchor=新群chatId,但目标 Bot 的普通群默认回复模式为new-topic时,新群顶层入站消息被regularGroupRouting路由为scope=thread、anchor=当前消息messageId—— 每条消息都是新锚点,永远命不中分身会话,于是误建空白会话并弹仓库选择卡。用户在新群执行/reply-mode chat-topic后恢复。此外建群瞬间 bot 被拉入新群,
bot.added自动开工在 new-topic 默认下会另发 seed、按 messageId 注册一个空白 thread 会话,与分身争抢同一目标。方案
三级优先级:用户对该群的显式 per-chat
/reply-mode设置 > fork 专属群保护 > Bot 全局默认。src/services/fork-destination-store.ts(进程内登记表,不持久化)createGroupWithBots的onChatCreated回调在 createChat 一返回 chatId 时同步markForkDestinationChat,覆盖「建群 → 钉模式落盘」之间数百毫秒的竞态窗口(期间用户已进群可能发消息、bot.added 也可能投递)。/fork --create建群后 per-chat 钉chat-topic(持久真相)setChatReplyMode(appId, chatId, 'chat-topic', { force: true, source: 'fork-pin' })写入chatReplyModes:顶层消息保持平铺命中分身,群内原生话题仍各自独立,与用户验证的临时规避/reply-mode chat-topic语义一致。regularGroupRouting)scope=chat, anchor=chatId, source=regular-group-chat,与分身注册形态一致。handleBotAdded让位forcePrompt的显式领取流程不受影响)。setChatReplyMode新增force/source:/reply-mode命令与 dashboard 两条显式入口均以force: true调用(即使所选模式与 Bot 全局默认同值也保留 per-chat 条目),并摘除 fork marker。用户显式切回 new-topic 后路由按 new-topic 走,群级设置保持可编辑。restoreActiveSessions从持久化的forkedFrom + scope=chat + group子会话行重建 marker,覆盖钉模式曾落盘失败或落盘前重启;同群/fork <task>子话题是 thread-scope,不会被误标。路由层的「无显式 per-chat 条目」门控保证用户之后的显式模式在重启后依然优先。影响面评估
forkSession的 CLI 原生 fork 机制(claude 系/grok--fork-session、codexfork)完全未动,已在fork-session.test.ts既有用例上回归。/fork <task>同群子话题(thread-scope)不经新路径,行为不变;/fork --create;setChatReplyMode('chat')VC pin 调用语义保持(其目标群非 fork 专属群)。测试验证
先红后绿(新测在修复前稳定失败,修复后通过):
test/fork-destination-store.test.ts(新增):marker bot 维度幂等、restore 重建口径(只认 group+chat-scope+forkedFrom)、fork-pin 与用户显式切换的优先级(含与全局默认同值的 new-topic 强制落 per-chat 条目并摘 marker)。test/event-dispatcher.test.ts:new-topic(per-bot 默认与 per-chat 覆盖两种形态)下 fork 群顶层 @ 与非@(mention-mode=never)均路由到 chat-scope 分身;显式 per-chat new-topic 优先于 marker;chat/chat-topic/shared 不回归;marker 的 bot 维度隔离。test/command-handler.test.ts:onChatCreated即时标记竞态窗口、pin 入参为{force:true, source:'fork-pin'}、pin 失败时 fork 与 lineage 仍完成。test/group-join-shared-routing.test.ts:new-topic 默认下 fork 群 bot.added 不开工;无 marker 新群仍按原逻辑发 seed 开工。test/reply-mode-command.test.ts:显式 /reply-mode 四条模式均带force:true。执行命令与结果:
全量单测中另有 12 个文件(dist/binary 校验、bun-only sqlite 导入、dashboard UI 等)在本机失败,已用
git stash在干净 master 上复现,确认为本环境缺 bun / dist 过期的存量问题,与本改动无关;完整bun run build以 CI 为准。🤖 Generated with Claude Code