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
|
id = "grok"
version = "2026.07.16.2"
min_engine_version = 3
updated_at = "2026-07-16T00:00:00Z"
aliases = ["grok-build"]
# Evidence: Grok Build 0.2.101 source and live pane reads.
#
# Grok emits OSC 0 titles by default. Idle is "grok" or
# "<session> - grok". During a turn, the configured title gains a braille
# spinner and activity text. Permission prompts add "⚠ Action Required";
# that prefix blinks while the terminal is unfocused, so visible blocker
# rules outrank the generic non-idle title rule.
#
# Grok also emits OSC 9;4 progress on supported terminals. Herdr retains the
# payload after "9;": "4;1;-1" while busy and "4;0;0" when idle.
#
# Working turns render one live status line directly above the prompt box:
# "⠧ Waiting on subagent… 2.8s 13s ⇣29.7k [stop]"
# "⠴ Explore /tmp/… + 1 more… 5.6s 19s ⇣29.7k [stop]"
# with a braille spinner and a trailing [stop] chip, plus an Esc:cancel
# footer hint. Permission prompts and ask-user-question dialogs replace the
# spinner with "◆" and draw a "┃"-guttered option list:
# "┃ 2 (○) Yes, proceed"
# "┃ z (○) Type your answer here"
# with footer hints "1/3:select │ Ctrl+o:yolo │ Ctrl+c:cancel" (permission)
# or "Esc:unselect │ Tab:scrollback │ Shift+x:dismiss" (question dialog).
# Idle footers end with "Ctrl+.:shortcuts" and never contain "Esc:cancel".
# The startup splash draws its logo with braille characters, so working
# rules must anchor on the [stop] chip, not on a bare spinner glyph.
[[rules]]
id = "osc_title_blocked"
state = "blocked"
priority = 1300
region = "osc_title"
visible_blocker = true
contains = ["Action Required"]
[[rules]]
id = "option_dialog_blocked"
state = "blocked"
priority = 1200
region = "whole_recent"
visible_blocker = true
line_regex = ['^\s*┃\s+[0-9a-z]+\s+\([●○]\)\s']
[[rules]]
id = "permission_hints_blocked"
state = "blocked"
priority = 1190
region = "bottom_non_empty_lines(2)"
visible_blocker = true
contains = [":select", "ctrl+o:yolo", "ctrl+c:cancel"]
[[rules]]
id = "question_dialog_hints_blocked"
state = "blocked"
priority = 1185
region = "bottom_non_empty_lines(2)"
visible_blocker = true
contains = ["tab:scrollback", "shift+x:dismiss"]
# Pre-0.2.x permission UI kept for older Grok Build releases.
[[rules]]
id = "permission_scope_selector"
state = "blocked"
priority = 1180
region = "whole_recent"
visible_blocker = true
contains = ["yes, proceed", "no, reject"]
any = [
{ contains = ["use ← → to choose permission whitelist scope"] },
{ contains = ["←/→:scope"] },
]
# Grok clears its OSC busy signals while background work runs. The first
# non-empty row is pinned application chrome, where this animated chip shows
# the number of running background tasks and disappears when the count is zero.
[[rules]]
id = "background_work_chip_working"
state = "working"
priority = 1170
region = "top_non_empty_lines(1)"
visible_working = true
line_regex = ['[⋅:⸬⁙.·]\s+[1-9][0-9]*\s+│']
[[rules]]
id = "osc_progress_working"
state = "working"
priority = 1150
region = "osc_progress"
visible_working = true
regex = ['^4;1;-1$']
[[rules]]
id = "osc_title_idle"
state = "idle"
priority = 1100
region = "osc_title"
visible_idle = true
regex = ['(?:^| - )grok$']
not = [
{ regex = ['[\x{2800}-\x{28FF}]'] },
]
# After known idle titles are excluded, any other non-empty Grok title is
# active. OSC progress remains authoritative when a custom title omits the
# spinner but the terminal supports progress reporting.
[[rules]]
id = "osc_title_working"
state = "working"
priority = 1000
region = "osc_title"
visible_working = true
regex = ['\S']
[[rules]]
id = "osc_progress_idle"
state = "idle"
priority = 950
region = "osc_progress"
visible_idle = true
regex = ['^4;0;0$']
[[rules]]
id = "spinner_status_working"
state = "working"
priority = 200
region = "whole_recent"
visible_working = true
line_regex = ['^\s*[\x{2801}-\x{28FF}]\s.*\[stop\]\s*$']
[[rules]]
id = "esc_cancel_hints_working"
state = "working"
priority = 190
region = "bottom_non_empty_lines(2)"
visible_working = true
contains = ["esc:cancel", "ctrl+.:shortcuts"]
# Pre-0.2.x working chrome kept for older Grok Build releases.
[[rules]]
id = "waiting_tool_working"
state = "working"
priority = 120
region = "whole_recent"
visible_working = true
any = [
{ all = [{ contains = ["ctrl+c:cancel", "ctrl+enter:interject"] }, { contains = ["waiting"] }] },
{ line_regex = ['^\s*[\x{2801}-\x{28FF}]\s+(Run|Read|Search|List)\b'] },
]
[[rules]]
id = "prompt_hints_idle"
state = "idle"
priority = 100
region = "bottom_non_empty_lines(2)"
visible_idle = true
contains = ["ctrl+.:shortcuts"]
not = [
{ contains = ["esc:cancel"] },
{ contains = ["ctrl+c:cancel"] },
]
|