- llm: ChatStreamWithTools sends OpenAI-format tools; streamed tool_call
deltas are reassembled by index into complete ToolCalls on the Done token
- model: LLMMessage gains ToolCallID/ToolCalls; StreamToken gains ToolCalls
- orchestrator: new ToolExecutor interface and streamWithTools loop —
execute requested tools, feed results back, up to 3 rounds, final round
forces a plain text answer; normal chats still stream token by token.
Also adds Pipeline.FinishRound (assistant reply recording + post-round
hook), wired to transports in the next commit.
- main: inject the plugin registry via toolExecAdapter
Includes an httptest-based test covering delta reassembly, tool
execution, and result feedback.