mirror of
https://github.com/bytedance/deer-flow.git
synced 2026-08-01 19:06:01 +00:00
* fix(frontend): render one workspace-change card per run The workspace-change card is resolved from (threadId, runId) alone, so every AI message in a run fetches the identical summary. It was rendered per AI message. getMessageGroups() opens a separate terminal assistant group for every AI message that has content and no tool calls, so a run ends in more than one bubble whenever the model emits answer text mid-run that never gains a tool call. Each bubble then painted a byte-identical "Edited N files" card. Fold the card onto a single position per run, matching how run duration already anchors its own run-scoped display after the run's last visible group. Anchoring keys on group index rather than message id because a terminal assistant group holds exactly one message whose id may be absent. Fixes #4555 * docs(frontend): explain the workspace-change anchor's group-type restriction The helper narrows anchor candidates to terminal assistant groups while getRunDurationDisplaysByGroupIndex accepts a run's last group of any type. That asymmetry is load-bearing: run duration is emitted by MessageList around every group, but the workspace-change card comes from MessageListItem, which MessageList invokes only for human/assistant groups. Anchoring a run that ends in an assistant:processing group would pick a position that never renders and silently drop the card. Record the rule in both places that could invite a future "unification": the helper's docstring, and the frontend AGENTS.md paragraph that tells maintainers where run-scoped displays belong.