Flush throttled reasoning before state-transition events (MessageStart/ Complete/Done/ToolStart) so a reasoning delta arriving just before a transition is not dropped. Also compare reasoningText in sameMessages so a reasoning-only restore actually re-merges. - ChatStreamingController.flushPendingReasoning() forces a synchronous flush - handleWsEvent calls it for the transition events - sameMessages now includes reasoningText in its equality check - tests: ChatStreamingControllerTest (flush + no-resurrect), reasoning survives MessageDone after an unflushed delta Co-authored-by: M57 <hy4ri@users.noreply.github.com>