Streaming chat UI hardened: tool card ordering, reasoning blocks, MessageList extraction
dropthejase ships a cluster of streaming chat UI fixes - tool-use accordion appearing mid-sentence, tool cards bleeding across turns, edit cards not collapsing on resolve - plus extended thinking support and a `MessageList` extraction. Most of these are specific to this fork's component shape, but two structural fixes apply to any streaming-tools chat UI.
The mid-sentence tool card bug (f757bc8) is the most technically interesting. When tool_call_start arrives, the network may still have buffered content_delta events behind it. The original code called pushEvent() on tool_call_start, which prematurely finalized the in-flight content block and created a second one after the tool accordion. The fix appends the tool_call_start placeholder directly to eventsRef.current without triggering finalization - the real tool event (doc_edited_start etc.) runs pushEvent() and closes the content block at the right time.
PreResponseWrapper's isOpen derivation (af49112) is the other structural fix. The original used useEffect to sync isOpen from props, which introduced a stale-initialization frame. When isStreaming flipped off at the end of a response, the wrapper briefly re-evaluated with stale state and visibly popped open. The fix derives isOpen directly in render: if the user hasn't toggled, isOpen = !shouldMinimize && !hasMinimizedRef.current. No effect needed.
Extended thinking: 7eca5fd enables thinking: { type: 'enabled', budget_tokens: 4096 } on both agents via additionalRequestFields, disables the Strands printer, and adds SSE events (reasoning_delta, reasoning_block_end) to the stream. The ThinkingBlock component cycles through random thinking phrases every 2 seconds rather than sequentially.
MessageList is extracted as a shared component (cbd9640) so both ChatView and ProjectChatPage render messages through the same path. Edit resolution state and reloadingEditIds tracking move into MessageList, cleaning up state that was previously duplicated across both pages. The ref types needed widening to React.RefObject<HTMLDivElement | null> in a follow-up commit (f99b111).
Minor fixes rounded up: read_document spinner stuck forever (3206edf - the agent was emitting the tool result filename rather than looking up the doc from the index); dated title fallback when the LLM ignores the title generation constraint (37c8b1d); always navigate to /assistant after chat delete regardless of whether the deleted chat was active (2b30141).
Spotted something wrong? Or know the PR text has fresher detail than the writeup above?