1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
//! Caps consecutive tool-call rounds within a single user turn, so a
//! model stuck proposing tool calls forever can't hang the session. A
//! distinct, purpose-built counter rather than a second instance of
//! `chat/circuit_breaker.rs`'s `CircuitBreaker` — that type's actual
//! mechanism (failure counting *plus* a wall-clock cooldown with
//! escalating backoff) solves "stop hammering a flaky connection over
//! time," a different problem from "cap rounds within one already-
//! in-flight turn," which needs no cooldown timer at all (it resets the
//! instant the next user turn starts).
/// Ballpark ceiling — generous enough for a legitimate multi-step task
/// (read a few files, run a command, read the result), low enough that a
/// genuinely stuck loop aborts within a handful of rounds instead of
/// running indefinitely.
const DEFAULT_CEILING: u32 = 8;