RepeatedToolCallLoop

Stop when the model has emitted the same (toolName, input) tuple n consecutive steps in a row — i.e. the loop is spinning on a tool whose result didn't change the model's behavior. Documented anti-pattern for small / on-device models that can't reason their way out of an unhelpful tool result; surfaced as a hard stop so the host renders the trapped state instead of looping until the step cap.

Compares only the FIRST tool call of each step (small models call one tool per step in practice); per-step JSON identity uses the raw input JsonElement's stringified form so identical args match.

Since

0.3.0-beta01