Moonshot models via OpenRouter return thinkingSignature: "reasoning"
but the API expects "reasoning_content" when tool calls are present.
Instead of sanitizing on every send, normalize once when the message
is received from the API. This is cleaner and more efficient.
Fixes: Error "thinking is enabled but reasoning_content is missing
in assistant tool call message"
Previously, when block streaming was disabled (the default), text generated
between tool calls would only appear after all tools completed. This was
because onBlockReply wasn't passed to the subscription when block streaming
was off, so flushBlockReplyBuffer() before tool execution did nothing.
Now onBlockReply is always passed, and when block streaming is disabled,
block replies are sent directly during tool flush. Directly sent payloads
are tracked to avoid duplicates in final payloads.
Also fixes a race condition where tool summaries could be emitted before
the typing indicator started by awaiting onAgentEvent in tool handlers.