49673d2ea3
Introduce `RlmChildClient` — a dyn-compatible `#[async_trait]` wrapper around the single create_message operation — so tests can inject a `MockRlmClient` without a live API key. This replaces the direct `Arc<DeepSeekClient>` field with `Arc<dyn RlmChildClient>`, wired transparently via `RlmQueryTool::new`. Concurrency regression test (`rlm_parallel_fanout_overlaps_not_serialized`): fires N=4 children each sleeping 50 ms through `join_all`. Asserts total elapsed < 4×50 ms (serial bound) and that all start timestamps cluster within <50 ms of each other. First run: total_elapsed=54 ms, start_spread=141 µs — fan-out was already correct; no serialization fix needed. UI wiring tests (`rlm_query_tool_cell_wired_with_prompts_on_start` etc.) verify that `handle_tool_call_started` with `rlm_query` populates `GenericToolCell.prompts` from the `prompts` (array) and `prompt` (singular) input shapes, and that non-fan-out tools leave `prompts: None`. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>