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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
//! **The acts that spend no words and are not offered every day** — what an
//! operator does to the selected conversation as an *object*, rather than to
//! the turn it is taking (bl-213c), behind the composer's one more control
//! (bl-f251; [`super::offers`]).
//!
//! It is a strip of the composer and not a pane of its own, and that is this
//! ball's one layout decision. The composer is already *the pane that acts on
//! the selected conversation*: it holds the one box, and every verb that needs
//! words spends that box. Putting these anywhere else would be a second place
//! to look for the same subject — and the chat pane, the only other candidate,
//! is a **pure projection** of the transcript (`crate::ui::chat`), so a
//! control there would be the first thing in it that is not.
//!
//! So the split between the row and this strip is by what the act does to the
//! turn, which is the distinction an operator is actually making:
//!
//! - **the row advances it** — `send`, `interrupt`, `nudge`, and `stop`, each
//! offered where the engine offers it ([`super::offers`]).
//! - **this strip does not** — [`REVOKE`] and [`RESTORE`] take away and give
//! back its standing permission to make tool calls, [`RETARGET`] marks the
//! conversation for another lineage, [`FLAG`] asks the operator to look at
//! it later, [`DELETE`] unmakes it.
//!
//! **The floor pair is here and the parked call's answer is not** (bl-bce2).
//! A floor is standing policy about the conversation an operator is looking
//! at, which is exactly this strip's subject. `answer` is about one invocation
//! that is waiting, and *what is waiting on you* is the decision queue's whole
//! question — so it is a control there, on the row that already says what is
//! parked (DESIGN §4.34).
//!
//! **The flag is on this strip and not on the queue pane** (bl-f0ef), which is
//! the one placement decision that ball made here. A flag is *somebody asking
//! the operator to look at this conversation*, so it is raised while looking at
//! it — and `crate::ui::queue` covers the conversation, so a control there
//! would flag something the operator cannot see. The queue is where a flag is
//! READ; this is where one is raised.
//!
//! **Each answers a captured run**, which is why they are here at all rather
//! than in the exemption ledger beside the conversation's records: a reply
//! this seat already paints is the difference between a control that answers
//! and one that earns *"this build cannot read that kind"*
//! (`crate::verbs::conversation`).
use crate;
/// The word that takes the conversation's tool auto-approval away.
pub const REVOKE: &str = "revoke";
/// The word that gives it back.
pub const RESTORE: &str = "restore";
/// The word that marks the conversation for its lineage's head.
pub const RETARGET: &str = "retarget";
/// The word that raises an attention item on it.
pub const FLAG: &str = "flag";
/// **What the reason box asks for**, and it asks for what the wire requires:
/// `flag` takes a reason and refuses without one, so the control beside this
/// box is disabled until it holds something.
pub const WHY: &str = "why it wants a look";
/// The word that unmakes it.
pub const DELETE: &str = "delete";
/// **What the arming box asks for**, and it asks for exactly what the wire
/// means: an empty box deletes the one conversation, and its name typed back is
/// what admits the descendants (`crate::verbs::DELETE_AGENT`).
pub const ARM: &str = "its name, to take its children too";
/// **What the arming box is worth**, in points. Fixed rather than infinite: the
/// composer is a bottom panel laid out in what the two side panes left, and a
/// box that took the rest of the line would push `delete` off the row at every
/// width the window actually opens at (the wrap bl-dc07 landed is what saves
/// the button, and a box this wide is what keeps them on one line at all).
/// Wide enough that the hint above is READ rather than elided at the narrowest
/// width the layout still promises a shape for — a box whose label is cut off
/// mid-sentence is a box an operator has to guess the meaning of, and guessing
/// wrong here arms a cascade.
const ARM_WIDTH: f32 = 200.0;
/// Paint the strip and take what it was given.
///
/// `wanted` is the box a row menu sent the operator to, taken once by the
/// row above (bl-dbc9; `crate::ui::model::fill`) — it is what opened this
/// strip, and the cursor lands in the box it names.