symphony-code 0.0.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. coding_agent/__init__.py +20 -0
  2. coding_agent/_lazy.py +17 -0
  3. coding_agent/addons/__init__.py +35 -0
  4. coding_agent/addons/approvals.py +224 -0
  5. coding_agent/addons/compaction/__init__.py +36 -0
  6. coding_agent/addons/compaction/addon.py +88 -0
  7. coding_agent/addons/compaction/compactor.py +138 -0
  8. coding_agent/addons/compaction/prompts.py +20 -0
  9. coding_agent/addons/compaction/transcript.py +118 -0
  10. coding_agent/addons/evaluation/__init__.py +68 -0
  11. coding_agent/addons/evaluation/addon.py +199 -0
  12. coding_agent/addons/evaluation/evaluators.py +245 -0
  13. coding_agent/addons/evaluation/handlers.py +66 -0
  14. coding_agent/addons/evaluation/policy.py +277 -0
  15. coding_agent/addons/evaluation/protocol.py +192 -0
  16. coding_agent/addons/evaluation/state.py +284 -0
  17. coding_agent/addons/langfuse/__init__.py +24 -0
  18. coding_agent/addons/langfuse/addon.py +465 -0
  19. coding_agent/addons/langfuse/install.py +79 -0
  20. coding_agent/addons/langfuse/serialize.py +158 -0
  21. coding_agent/addons/learning/__init__.py +33 -0
  22. coding_agent/addons/learning/addon.py +181 -0
  23. coding_agent/addons/learning/loop.py +247 -0
  24. coding_agent/addons/learning/prompts.py +26 -0
  25. coding_agent/addons/learning/sanitize.py +64 -0
  26. coding_agent/addons/learning/store.py +522 -0
  27. coding_agent/addons/manager/__init__.py +18 -0
  28. coding_agent/addons/manager/bridge.py +74 -0
  29. coding_agent/addons/manager/discovery.py +34 -0
  30. coding_agent/addons/manager/report.py +33 -0
  31. coding_agent/addons/manager/runtime.py +76 -0
  32. coding_agent/addons/manager/tool_changes.py +16 -0
  33. coding_agent/addons/persistence/__init__.py +41 -0
  34. coding_agent/addons/persistence/active.py +132 -0
  35. coding_agent/addons/persistence/artifacts.py +110 -0
  36. coding_agent/addons/persistence/collection.py +166 -0
  37. coding_agent/addons/persistence/compatibility.py +30 -0
  38. coding_agent/addons/persistence/images.py +133 -0
  39. coding_agent/addons/persistence/jsonl.py +1195 -0
  40. coding_agent/addons/persistence/presentation.py +104 -0
  41. coding_agent/addons/plugins/__init__.py +19 -0
  42. coding_agent/addons/plugins/install.py +37 -0
  43. coding_agent/addons/plugins/manager.py +140 -0
  44. coding_agent/addons/plugins/models.py +50 -0
  45. coding_agent/addons/skills/__init__.py +28 -0
  46. coding_agent/addons/skills/addon.py +26 -0
  47. coding_agent/addons/skills/args.py +78 -0
  48. coding_agent/addons/skills/bundled_skills/addon-authoring/SKILL.md +77 -0
  49. coding_agent/addons/skills/bundled_skills/context-budget/SKILL.md +12 -0
  50. coding_agent/addons/skills/bundled_skills/orient-first/SKILL.md +16 -0
  51. coding_agent/addons/skills/bundled_skills/security-boundary/SKILL.md +16 -0
  52. coding_agent/addons/skills/bundled_skills/skill-discipline/SKILL.md +13 -0
  53. coding_agent/addons/skills/bundled_skills/surgical-edit/SKILL.md +11 -0
  54. coding_agent/addons/skills/bundled_skills/systematic-debug/SKILL.md +18 -0
  55. coding_agent/addons/skills/bundled_skills/verify-before-done/SKILL.md +11 -0
  56. coding_agent/addons/skills/frontmatter.py +57 -0
  57. coding_agent/addons/skills/models.py +57 -0
  58. coding_agent/addons/skills/registry.py +109 -0
  59. coding_agent/addons/skills/tool.py +54 -0
  60. coding_agent/addons/voice/__init__.py +5 -0
  61. coding_agent/addons/voice/addon.py +106 -0
  62. coding_agent/addons/voice/credentials.py +42 -0
  63. coding_agent/addons/voice/playback.py +42 -0
  64. coding_agent/addons/voice/speak.py +287 -0
  65. coding_agent/addons/voice/stream.py +651 -0
  66. coding_agent/addons/voice/summary.py +126 -0
  67. coding_agent/agent.py +523 -0
  68. coding_agent/bench/__init__.py +1 -0
  69. coding_agent/bench/cli.py +200 -0
  70. coding_agent/bench/patch.py +78 -0
  71. coding_agent/commands/__init__.py +5 -0
  72. coding_agent/commands/catalog.py +179 -0
  73. coding_agent/commands/jev_argument.py +40 -0
  74. coding_agent/config/__init__.py +51 -0
  75. coding_agent/config/config.py +376 -0
  76. coding_agent/config/credentials.py +153 -0
  77. coding_agent/config/personalities.json +34 -0
  78. coding_agent/config/personalities.py +170 -0
  79. coding_agent/config/prompts.py +67 -0
  80. coding_agent/protocols/__init__.py +5 -0
  81. coding_agent/protocols/acp/README.md +36 -0
  82. coding_agent/protocols/acp/__init__.py +27 -0
  83. coding_agent/protocols/acp/mapping.py +164 -0
  84. coding_agent/protocols/acp/server.py +261 -0
  85. coding_agent/protocols/acp/transport.py +72 -0
  86. coding_agent/protocols/stdio/README.md +36 -0
  87. coding_agent/protocols/stdio/__init__.py +37 -0
  88. coding_agent/protocols/stdio/catalog.py +49 -0
  89. coding_agent/protocols/stdio/commands.py +218 -0
  90. coding_agent/protocols/stdio/server.py +181 -0
  91. coding_agent/protocols/stdio/transport.py +71 -0
  92. coding_agent/py.typed +0 -0
  93. coding_agent/resources/__init__.py +5 -0
  94. coding_agent/resources/usage.py +264 -0
  95. coding_agent/run/__init__.py +1 -0
  96. coding_agent/run/cli.py +99 -0
  97. coding_agent/run/detach.py +37 -0
  98. coding_agent/run/interrupted.py +67 -0
  99. coding_agent/run/log_sink.py +46 -0
  100. coding_agent/tools/__init__.py +73 -0
  101. coding_agent/tools/ask_user.py +61 -0
  102. coding_agent/tools/base.py +136 -0
  103. coding_agent/tools/bash.py +288 -0
  104. coding_agent/tools/bash_jobs.py +116 -0
  105. coding_agent/tools/generate_image.py +123 -0
  106. coding_agent/tools/memory.py +100 -0
  107. coding_agent/tools/patch.py +218 -0
  108. coding_agent/tools/read_file.py +167 -0
  109. coding_agent/tools/search.py +433 -0
  110. coding_agent/tools/web_search.py +151 -0
  111. coding_agent/tools/write_file.py +40 -0
  112. coding_agent/tui/EFFICIENCY_PLAN.md +25 -0
  113. coding_agent/tui/__init__.py +22 -0
  114. coding_agent/tui/__main__.py +122 -0
  115. coding_agent/tui/app.py +456 -0
  116. coding_agent/tui/chrome/__init__.py +33 -0
  117. coding_agent/tui/chrome/footer.py +274 -0
  118. coding_agent/tui/chrome/topbar.py +259 -0
  119. coding_agent/tui/commands/__init__.py +45 -0
  120. coding_agent/tui/commands/catalog.py +35 -0
  121. coding_agent/tui/commands/manager.py +557 -0
  122. coding_agent/tui/composer/__init__.py +18 -0
  123. coding_agent/tui/composer/input.py +219 -0
  124. coding_agent/tui/composer/slash_menu.py +341 -0
  125. coding_agent/tui/composer/surface.py +330 -0
  126. coding_agent/tui/composer/voice.py +267 -0
  127. coding_agent/tui/composer/voice_mode.py +491 -0
  128. coding_agent/tui/runtime/__init__.py +23 -0
  129. coding_agent/tui/runtime/events.py +728 -0
  130. coding_agent/tui/runtime/sink.py +115 -0
  131. coding_agent/tui/runtime/state.py +145 -0
  132. coding_agent/tui/runtime/subagent.py +531 -0
  133. coding_agent/tui/runtime/turn.py +206 -0
  134. coding_agent/tui/screens/__init__.py +54 -0
  135. coding_agent/tui/screens/ask.py +69 -0
  136. coding_agent/tui/screens/context.py +195 -0
  137. coding_agent/tui/screens/dashboard.py +91 -0
  138. coding_agent/tui/screens/diff.py +302 -0
  139. coding_agent/tui/screens/extensions.py +68 -0
  140. coding_agent/tui/screens/file_selector.py +167 -0
  141. coding_agent/tui/screens/history.py +458 -0
  142. coding_agent/tui/screens/langfuse.py +142 -0
  143. coding_agent/tui/screens/learning.py +113 -0
  144. coding_agent/tui/screens/modal.py +131 -0
  145. coding_agent/tui/screens/onboard.py +455 -0
  146. coding_agent/tui/screens/resume.py +163 -0
  147. coding_agent/tui/theme/__init__.py +49 -0
  148. coding_agent/tui/theme/load.py +325 -0
  149. coding_agent/tui/theme/style.py +95 -0
  150. coding_agent/tui/theme/theme.toml +1687 -0
  151. coding_agent/tui/tools/__init__.py +53 -0
  152. coding_agent/tui/tools/activity.py +184 -0
  153. coding_agent/tui/tools/calls.py +560 -0
  154. coding_agent/tui/tools/code_view.py +52 -0
  155. coding_agent/tui/tools/images.py +250 -0
  156. coding_agent/tui/tools/labels.py +135 -0
  157. coding_agent/tui/tools/modal.py +137 -0
  158. coding_agent/tui/tools/partial_args.py +19 -0
  159. coding_agent/tui/tools/snapshots.py +382 -0
  160. coding_agent/tui/transcript/__init__.py +36 -0
  161. coding_agent/tui/transcript/messages.py +408 -0
  162. coding_agent/tui/transcript/process.py +504 -0
  163. coding_agent/tui/transcript/surface.py +345 -0
  164. coding_agent/tui/transcript/thinking_markdown.py +314 -0
  165. symphony_code-0.0.1.dist-info/METADATA +66 -0
  166. symphony_code-0.0.1.dist-info/RECORD +169 -0
  167. symphony_code-0.0.1.dist-info/WHEEL +4 -0
  168. symphony_code-0.0.1.dist-info/entry_points.txt +5 -0
  169. symphony_code-0.0.1.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,1687 @@
1
+ # Symphony TUI theme — palette tokens and Textual CSS.
2
+ #
3
+ # Packaged default for the dark theme. At runtime the TUI reads
4
+ # ~/.symphony/theme.toml when that file exists; otherwise this copy is
5
+ # used in memory. Copy this file to ~/.symphony/theme.toml to edit.
6
+ #
7
+ # [css.variables] maps Textual `$name` declarations onto [colors] keys so
8
+ # chrome CSS and Rich tokens stay on one palette.
9
+ #
10
+ # [css.spacing] holds the TUI spacing scale in terminal cells. Each key
11
+ # becomes a Textual `$space-<key>` variable; chrome, tools, and composer CSS
12
+ # use those variables instead of literal margin/padding numbers.
13
+
14
+ [colors]
15
+ background = "#0A0A0A"
16
+ foreground = "#EDEDED"
17
+ accent = "#A371F7"
18
+ muted = "#737373"
19
+ muted_dim = "#737373"
20
+ edge = "#262626"
21
+ comment = "#737373"
22
+ keyword = "#db6767"
23
+ type_keywords = "#db6767"
24
+ string = "#799e7c"
25
+ function = "#6374d0"
26
+ variable = "#EDEDED"
27
+ number = "#d08a61"
28
+ operator = "#6b6b6b"
29
+ punctuation = "#525252"
30
+ type = "#cda059"
31
+ tag = "#5a9a95"
32
+ attribute = "#8ca0cc"
33
+ constant = "#d08a61"
34
+ surface = "#171717"
35
+ overlay = "#262626"
36
+ subtext = "#A3A3A3"
37
+ panel_edge_focus = "#484F58"
38
+
39
+ [css.variables]
40
+ background = "background"
41
+ foreground = "foreground"
42
+ accent = "accent"
43
+ muted = "muted"
44
+ muted-dim = "muted_dim"
45
+ foreground-muted = "subtext"
46
+ string = "string"
47
+ panel = "surface"
48
+ panel-light = "overlay"
49
+ panel-edge = "edge"
50
+ panel-edge-focus = "panel_edge_focus"
51
+ danger = "keyword"
52
+
53
+ [css.spacing]
54
+ # Left/right inset of the top bar, transcript, composer, and footer.
55
+ page = 3
56
+ # Indent of timeline text: the column after the `>` prompt glyph.
57
+ gutter = 3
58
+ # Blank rows between transcript blocks (messages, tools, thoughts).
59
+ block = 1
60
+ # Blank rows before a run summary card.
61
+ section = 2
62
+ # Inner padding of compact controls (composer, menus, labels).
63
+ inset = 1
64
+ # Inner padding of panels (composer overlay, run summary).
65
+ inset-wide = 2
66
+
67
+ [css]
68
+ chrome = '''
69
+ Screen {
70
+ layout: vertical;
71
+ background: $background;
72
+ color: $foreground;
73
+ }
74
+
75
+ #topbar {
76
+ width: 100%;
77
+ height: 2;
78
+ padding: $space-block $space-page 0 $space-page;
79
+ color: $foreground;
80
+ background: $background;
81
+ }
82
+
83
+ #transcript {
84
+ width: 100%;
85
+ height: 1fr;
86
+ padding: 0 $space-page $space-block $space-page;
87
+ /* Keep scrollbars out of the way until the user interacts with them. */
88
+ scrollbar-size: 1 1;
89
+ scrollbar-size-vertical: 1;
90
+ scrollbar-color: transparent;
91
+ scrollbar-color-hover: $panel-edge;
92
+ scrollbar-color-active: $panel-edge-focus;
93
+ scrollbar-background: transparent;
94
+ scrollbar-background-hover: transparent;
95
+ scrollbar-background-active: transparent;
96
+ }
97
+
98
+ .welcome {
99
+ width: 100%;
100
+ height: 1fr;
101
+ min-height: 10;
102
+ margin: 0;
103
+ padding: 0 $space-inset-wide;
104
+ color: $muted;
105
+ }
106
+
107
+ .message {
108
+ width: 100%;
109
+ height: auto;
110
+ margin: 0;
111
+ padding: 0 0 0 $space-gutter;
112
+ }
113
+
114
+ /* Textual spacing is measured in terminal cells rather than pixels. Blocks
115
+ use $space-block above and below; Textual collapses adjacent vertical
116
+ margins, so neighbouring blocks share one blank row instead of stacking. */
117
+ .user-message {
118
+ margin: $space-block 0 0 0;
119
+ background: $background;
120
+ /* The `>` occupies the shared 3-cell gutter; prompt text starts with tools. */
121
+ padding: 0;
122
+ }
123
+
124
+ .run-summary {
125
+ margin: $space-section 0 0 $space-inset;
126
+ background: $background;
127
+ border-left: solid #9b7bc3;
128
+ padding: $space-inset $space-inset-wide;
129
+ color: #c2b5cf;
130
+ }
131
+
132
+ .assistant-message {
133
+ margin: $space-block 0;
134
+ background: $background;
135
+ color: $foreground;
136
+ }
137
+
138
+ .thinking-status {
139
+ width: auto;
140
+ max-width: 72;
141
+ height: 1;
142
+ margin: 0;
143
+ padding: 0 0 0 $space-gutter;
144
+ color: $muted;
145
+ }
146
+
147
+ .run-process {
148
+ width: 100%;
149
+ height: auto;
150
+ margin: 0;
151
+ padding: 0;
152
+ background: $background;
153
+ }
154
+
155
+ .process-complete {
156
+ width: auto;
157
+ height: 1;
158
+ margin: 0;
159
+ padding: 0 0 0 $space-gutter;
160
+ color: #5f6a62;
161
+ }
162
+
163
+ /* Live "Thinking…" and completed "Thought" blocks get the same block margin
164
+ as tool rows. */
165
+ .reasoning-block {
166
+ width: 100%;
167
+ height: auto;
168
+ min-width: 100%;
169
+ margin: $space-block 0;
170
+ padding: 0;
171
+ color: #5b9bd5;
172
+ background: $background;
173
+ border: none;
174
+ border-top: none;
175
+ pointer: pointer;
176
+ }
177
+
178
+ .reasoning-block:focus-within {
179
+ background: $background;
180
+ }
181
+
182
+ .reasoning-block > CollapsibleTitle {
183
+ width: 1;
184
+ height: 0;
185
+ padding: 0;
186
+ color: transparent;
187
+ background: transparent;
188
+ }
189
+
190
+ .reasoning-header {
191
+ width: auto;
192
+ height: 1;
193
+ padding: 0 0 0 $space-gutter;
194
+ background: transparent;
195
+ pointer: pointer;
196
+ }
197
+
198
+ .reasoning-header:hover,
199
+ .reasoning-header:focus {
200
+ background: transparent;
201
+ }
202
+
203
+ .reasoning-header:hover .reasoning-label,
204
+ .reasoning-header:hover .reasoning-status,
205
+ .reasoning-header:focus .reasoning-label,
206
+ .reasoning-header:focus .reasoning-status {
207
+ color: #8ab4cf;
208
+ text-style: bold;
209
+ }
210
+
211
+ .reasoning-label {
212
+ width: auto;
213
+ height: 1;
214
+ padding-right: $space-inset;
215
+ color: #5b9bd5;
216
+ background: transparent;
217
+ }
218
+
219
+ .reasoning-status {
220
+ width: auto;
221
+ height: 1;
222
+ color: #5b9bd5;
223
+ text-align: left;
224
+ background: transparent;
225
+ }
226
+
227
+ .reasoning-block.is-complete {
228
+ opacity: 1;
229
+ }
230
+
231
+ .reasoning-block.is-complete .reasoning-label,
232
+ .reasoning-block.is-complete .reasoning-status {
233
+ opacity: 0.85;
234
+ }
235
+
236
+ .reasoning-block.is-complete:hover .reasoning-label,
237
+ .reasoning-block.is-complete:hover .reasoning-status,
238
+ .reasoning-block.is-complete:focus .reasoning-label,
239
+ .reasoning-block.is-complete:focus .reasoning-status {
240
+ opacity: 1;
241
+ }
242
+
243
+ .reasoning-block > Contents {
244
+ padding: 0;
245
+ }
246
+
247
+ .reasoning-scroll {
248
+ width: 100%;
249
+ height: auto;
250
+ max-height: 12;
251
+ padding: 0;
252
+ scrollbar-size: 1 1;
253
+ scrollbar-color: transparent;
254
+ scrollbar-color-hover: #606060;
255
+ scrollbar-color-active: #707070;
256
+ scrollbar-background: transparent;
257
+ scrollbar-background-hover: transparent;
258
+ scrollbar-background-active: transparent;
259
+ }
260
+
261
+ .reasoning-text {
262
+ width: 100%;
263
+ height: auto;
264
+ padding: 0 0 0 $space-gutter;
265
+ color: #6e6e6e;
266
+ }
267
+
268
+ .reasoning-block.is-complete .reasoning-text {
269
+ /* Keep the reasoning subordinate to the header without losing legibility. */
270
+ color: #858585;
271
+ opacity: 0.85;
272
+ }
273
+
274
+ /* Inline and fenced code inside thinking markdown: a step brighter than the
275
+ muted prose on the panel tone. Bold, italics, and headers add emphasis
276
+ only, so they keep the thinking colour above. */
277
+ .reasoning-text > .reasoning-text--code {
278
+ color: $foreground-muted;
279
+ background: $panel;
280
+ }
281
+ '''
282
+ tools = '''
283
+ .tool-call {
284
+ width: 100%;
285
+ height: auto;
286
+ min-height: 1;
287
+ margin: $space-block 0;
288
+ padding: 0;
289
+ padding-bottom: 0;
290
+ padding-left: 0;
291
+ background: $background;
292
+ border: none;
293
+ border-top: none;
294
+ pointer: pointer;
295
+ }
296
+
297
+ .tool-call:focus-within {
298
+ background: $background;
299
+ }
300
+
301
+ .tool-call > CollapsibleTitle {
302
+ width: 1;
303
+ height: 0;
304
+ padding: 0;
305
+ color: transparent;
306
+ background: transparent;
307
+ }
308
+
309
+ .bash-tool > CollapsibleTitle {
310
+ display: none;
311
+ }
312
+
313
+ .tool-call-header {
314
+ width: auto;
315
+ height: 1;
316
+ padding: 0 0 0 $space-gutter;
317
+ background: transparent;
318
+ pointer: pointer;
319
+ }
320
+
321
+ .tool-call-header:hover,
322
+ .tool-call-header:focus {
323
+ background: transparent;
324
+ }
325
+
326
+ .tool-call-header:hover .tool-call-label,
327
+ .tool-call-header:focus .tool-call-label {
328
+ text-style: bold;
329
+ }
330
+
331
+ .tool-call-label {
332
+ width: auto;
333
+ height: 1;
334
+ color: #9aa7b2;
335
+ background: transparent;
336
+ overflow: hidden;
337
+ text-overflow: ellipsis;
338
+ }
339
+
340
+ .tool-call.status-preparing .tool-call-label,
341
+ .tool-call.status-running .tool-call-label {
342
+ color: #d7a84b;
343
+ }
344
+
345
+ .tool-call.status-done .tool-call-label {
346
+ color: #72a57a;
347
+ }
348
+
349
+ .tool-call.status-failed .tool-call-label {
350
+ color: #d66b73;
351
+ }
352
+
353
+ .tool-call.status-preparing > CollapsibleTitle,
354
+ .tool-call.status-running > CollapsibleTitle {
355
+ color: #d7a84b;
356
+ }
357
+
358
+ .tool-call.status-done > CollapsibleTitle {
359
+ color: #72a57a;
360
+ }
361
+
362
+ .tool-call.status-failed > CollapsibleTitle {
363
+ color: #d66b73;
364
+ }
365
+
366
+ .tool-call > Contents {
367
+ /* Align expanded output with the opening bracket in the tool header. */
368
+ padding: 0 0 0 $space-gutter;
369
+ }
370
+
371
+ .bash-tool {
372
+ padding: 0;
373
+ padding-bottom: 0;
374
+ border: none;
375
+ border-top: none;
376
+ }
377
+
378
+ .bash-tool-header {
379
+ width: auto;
380
+ height: 1;
381
+ padding: 0 0 0 $space-gutter;
382
+ background: transparent;
383
+ pointer: pointer;
384
+ }
385
+
386
+ .bash-tool-header:hover,
387
+ .bash-tool-header:focus {
388
+ background: transparent;
389
+ }
390
+
391
+ .bash-tool-header:hover .bash-tool-label,
392
+ .bash-tool-header:focus .bash-tool-label {
393
+ text-style: bold;
394
+ }
395
+
396
+ .bash-tool-label {
397
+ width: auto;
398
+ height: 1;
399
+ color: #9aa7b2;
400
+ background: transparent;
401
+ overflow: hidden;
402
+ text-overflow: ellipsis;
403
+ }
404
+
405
+ .bash-tool.status-preparing .bash-tool-label,
406
+ .bash-tool.status-running .bash-tool-label {
407
+ color: #d7a84b;
408
+ }
409
+
410
+ .bash-tool.status-done .bash-tool-label {
411
+ color: #72a57a;
412
+ }
413
+
414
+ .bash-tool.status-failed .bash-tool-label {
415
+ color: #d66b73;
416
+ }
417
+
418
+ /* A running Bash card's streamed output tail, under its header. Its height
419
+ is the fixed LIVE_OUTPUT_TAIL_LINES window set in tools/calls.py. */
420
+ .bash-tool-tail {
421
+ width: 100%;
422
+ overflow: hidden;
423
+ text-wrap: nowrap;
424
+ text-overflow: ellipsis;
425
+ padding: 0 $space-inset 0 $space-gutter;
426
+ color: $muted;
427
+ background: transparent;
428
+ }
429
+
430
+ .bash-tool-body {
431
+ width: 100%;
432
+ height: auto;
433
+ padding: 0 $space-inset 0 $space-gutter;
434
+ color: #777777;
435
+ background: $background;
436
+ }
437
+
438
+ .bash-tool.-collapsed .bash-tool-body {
439
+ display: none;
440
+ }
441
+
442
+ .diff-tool {
443
+ padding: 0;
444
+ padding-bottom: 0;
445
+ background: $background;
446
+ border: none;
447
+ border-top: none;
448
+ }
449
+
450
+ /* Keep collapsed Update cards visually consistent with the timeline while
451
+ retaining strong line-level colors when the diff is expanded. */
452
+ .diff-tool > Contents,
453
+ .diff-tool .tool-call-header {
454
+ background: $background;
455
+ }
456
+
457
+ .diff-tool .tool-call-header:hover,
458
+ .diff-tool .tool-call-header:focus {
459
+ background: transparent;
460
+ }
461
+
462
+ .tool-call-summary {
463
+ width: 1fr;
464
+ height: auto;
465
+ margin: $space-block 0;
466
+ padding: 0 0 0 $space-gutter;
467
+ color: #a2adb8;
468
+ background: transparent;
469
+ pointer: pointer;
470
+ border: none;
471
+ }
472
+
473
+ .tool-call-summary:hover,
474
+ .tool-call-summary:focus {
475
+ background: transparent;
476
+ text-style: bold;
477
+ }
478
+
479
+ /* Rows nested inside an expanded Explored or completed-run group start at
480
+ the group header's left edge and read smaller: one compact, dimmed line
481
+ each in muted theme colours. */
482
+ /* Expanded group rows follow fx's grouped tool rows: a tree guide in the
483
+ row tone, then the verb (danger when the call failed) and the arguments. */
484
+ .tool-call-summary > .tool-call-summary--guide {
485
+ color: $muted;
486
+ }
487
+
488
+ .tool-call-summary > .tool-call-summary--verb {
489
+ color: $foreground-muted;
490
+ }
491
+
492
+ .tool-call-summary > .tool-call-summary--args {
493
+ color: $muted;
494
+ }
495
+
496
+ .tool-call-summary > .tool-call-summary--verb-failed {
497
+ color: $danger;
498
+ }
499
+
500
+ /* A grouped call still running keeps the live card's warning tone. */
501
+ .tool-call-summary > .tool-call-summary--verb-running {
502
+ color: $warning;
503
+ }
504
+
505
+ .tool-call-summary > .tool-call-summary--detail {
506
+ color: $muted;
507
+ text-style: italic;
508
+ }
509
+ '''
510
+ composer = '''
511
+ .notice {
512
+ width: 100%;
513
+ height: auto;
514
+ min-height: 1;
515
+ margin: $space-block 0 0 0;
516
+ padding: 0 0 0 $space-gutter;
517
+ color: $muted;
518
+ }
519
+
520
+ /* Composer: a visibly rounded input container. */
521
+ #composer {
522
+ width: 1fr;
523
+ height: auto;
524
+ min-height: 3;
525
+ margin: 0 $space-page;
526
+ padding: 0 $space-inset;
527
+ layout: vertical;
528
+ background: $background;
529
+ border: round $panel-edge;
530
+ }
531
+
532
+ #composer:focus-within {
533
+ border: round $panel-edge-focus;
534
+ }
535
+
536
+ #composer-row {
537
+ width: 100%;
538
+ height: auto;
539
+ min-height: 1;
540
+ layout: horizontal;
541
+ background: $background;
542
+ }
543
+
544
+ #prompt {
545
+ width: 1fr;
546
+ max-width: 100%;
547
+ height: auto;
548
+ min-height: 1;
549
+ max-height: 10;
550
+ padding: 0 $space-inset;
551
+ border: none;
552
+ background: $background;
553
+ color: $foreground;
554
+ pointer: text;
555
+ }
556
+
557
+ #prompt:focus {
558
+ border: none;
559
+ }
560
+
561
+ #prompt.-disabled {
562
+ color: $muted-dim;
563
+ }
564
+
565
+ #prompt .text-area--placeholder {
566
+ color: $muted;
567
+ }
568
+
569
+ #prompt .text-area--cursor-line {
570
+ background: $background;
571
+ }
572
+
573
+ /* The caret is a one-cell block. Without its own colors it inherits the
574
+ prompt background after a stylesheet refresh (tool events, theme reload)
575
+ and disappears. */
576
+ #prompt .text-area--cursor {
577
+ color: $background;
578
+ background: $foreground;
579
+ text-style: none;
580
+ }
581
+
582
+
583
+
584
+ #queued-prompt-row {
585
+ display: none;
586
+ width: 100%;
587
+ height: 1;
588
+ min-height: 1;
589
+ margin: 0;
590
+ padding: 0;
591
+ border: none;
592
+ background: $background;
593
+ layout: horizontal;
594
+ align: left middle;
595
+ }
596
+
597
+ #queued-prompt-text {
598
+ width: 1fr;
599
+ height: 1;
600
+ color: $muted;
601
+ overflow-x: hidden;
602
+ content-align: left middle;
603
+ }
604
+
605
+ #queued-send-now, #queued-edit {
606
+ width: auto;
607
+ height: 1fr;
608
+ min-width: 9;
609
+ padding: 0 $space-inset;
610
+ border: none;
611
+ background: $background;
612
+ color: $accent;
613
+ }
614
+
615
+ #queued-send-now:hover, #queued-edit:hover {
616
+ background: $panel-edge;
617
+ }
618
+
619
+ #composer-overlay {
620
+ display: none;
621
+ width: 1fr;
622
+ height: auto;
623
+ min-height: 4;
624
+ margin: 0 $space-page $space-block $space-page;
625
+ padding: $space-inset $space-inset-wide;
626
+ background: $panel-light;
627
+ border-left: thick $string;
628
+ color: $foreground;
629
+ }
630
+
631
+ #slash-menu {
632
+ display: none;
633
+ width: 1fr;
634
+ height: auto;
635
+ max-height: 12;
636
+ margin: 0 $space-page;
637
+ padding: $space-inset $space-inset 0 $space-inset;
638
+ background: $panel;
639
+ border: round $panel-edge;
640
+ overflow-y: auto;
641
+ /* A one-cell thumb. The track stays the panel color so it does not read
642
+ as the black gutter in the screenshot. */
643
+ scrollbar-size-vertical: 1;
644
+ scrollbar-color: $accent;
645
+ scrollbar-color-hover: $accent;
646
+ scrollbar-color-active: $foreground;
647
+ scrollbar-background: $panel;
648
+ scrollbar-background-hover: $panel;
649
+ scrollbar-background-active: $panel;
650
+ }
651
+
652
+ #approval-menu {
653
+ display: none;
654
+ width: 1fr;
655
+ height: auto;
656
+ max-height: 8;
657
+ margin: 0 $space-page $space-block $space-page;
658
+ padding: 0 $space-inset;
659
+ background: $panel;
660
+ border: round $panel-edge;
661
+ }
662
+
663
+ #slash-menu > .option-list--option {
664
+ padding: 0;
665
+ background: $panel;
666
+ }
667
+
668
+ #slash-menu > .option-list--option-highlighted {
669
+ background: $panel-light;
670
+ text-style: bold;
671
+ }
672
+
673
+ #slash-menu > .option-list--option-hover {
674
+ background: $panel-light;
675
+ }
676
+
677
+ #slash-menu > .option-list--option-disabled {
678
+ padding: 0;
679
+ background: $panel;
680
+ }
681
+
682
+ #transcript ScrollBar {
683
+ pointer: pointer;
684
+ }
685
+
686
+ /* Footer: workspace and context meter on the left, keyboard hint on the right. */
687
+ #status {
688
+ width: 100%;
689
+ height: 2;
690
+ padding: $space-block $space-page 0 $space-page;
691
+ background: $background;
692
+ color: $foreground;
693
+ }
694
+
695
+ /* Voice mode preserves the composer's dimensions and focus behavior. */
696
+ #composer.voice-light, #composer.voice-light:focus-within {
697
+ border: round #D7C4FB;
698
+ }
699
+
700
+ #composer.voice-dark, #composer.voice-dark:focus-within {
701
+ border: round #A371F7;
702
+ }
703
+
704
+ #approval-menu.permission-menu {
705
+ width: 100%;
706
+ max-width: 100%;
707
+ height: auto;
708
+ max-height: 14;
709
+ margin: 0 0 $space-block 0;
710
+ offset-x: 0;
711
+ padding: $space-inset $space-inset 0 $space-inset;
712
+ border: round $panel-edge;
713
+ background: $background;
714
+ }
715
+
716
+ #approval-menu.permission-menu > .option-list--option {
717
+ padding: 0 $space-inset;
718
+ background: $background;
719
+ }
720
+
721
+ #approval-menu.permission-menu > .option-list--option-disabled {
722
+ background: $background;
723
+ }
724
+
725
+ #approval-menu.permission-menu > .option-list--option-highlighted {
726
+ background: $panel-light;
727
+ }
728
+
729
+ #approval-menu.permission-menu > .option-list--option-hover {
730
+ background: $panel-light;
731
+ }
732
+
733
+ #slash-menu.file-menu {
734
+ width: 1fr;
735
+ max-height: 12;
736
+ margin: 0 $space-page $space-block $space-page;
737
+ padding: $space-inset $space-inset 0 $space-inset;
738
+ background: $panel;
739
+ border: round $panel-edge;
740
+ }
741
+
742
+ #slash-menu.file-menu > .option-list--option,
743
+ #slash-menu.file-menu > .option-list--option-disabled {
744
+ padding: 0 $space-inset;
745
+ background: $panel;
746
+ }
747
+
748
+ #slash-menu.file-menu > .option-list--option-highlighted,
749
+ #slash-menu.file-menu > .option-list--option-hover {
750
+ color: $foreground;
751
+ background: $panel-light;
752
+ }
753
+ '''
754
+ resume = '''
755
+ ResumeApp {
756
+ background: #0a0a0a;
757
+ color: #d0d0d0;
758
+ }
759
+
760
+ #resume-page {
761
+ width: 100%;
762
+ height: 100%;
763
+ padding: 1 2 0 2;
764
+ background: #0a0a0a;
765
+ }
766
+
767
+ #resume-title {
768
+ height: 1;
769
+ color: #ededed;
770
+ text-style: bold;
771
+ }
772
+
773
+ #resume-subtitle {
774
+ height: 2;
775
+ padding-top: 1;
776
+ color: #737373;
777
+ }
778
+
779
+ #resume-list {
780
+ width: 100%;
781
+ height: 1fr;
782
+ margin-top: 1;
783
+ background: #0a0a0a;
784
+ border: none;
785
+ scrollbar-size: 1 1;
786
+ scrollbar-color: #484848;
787
+ scrollbar-background: #0a0a0a;
788
+ }
789
+
790
+ #resume-list:focus {
791
+ border: none;
792
+ }
793
+
794
+ #resume-list > .option-list--option {
795
+ height: 2;
796
+ padding: 0 2;
797
+ background: #0a0a0a;
798
+ }
799
+
800
+ #resume-list > .option-list--option-highlighted {
801
+ background: #1c1b17;
802
+ color: #e1c16e;
803
+ }
804
+
805
+ #resume-hint {
806
+ height: 1;
807
+ color: #656565;
808
+ text-align: right;
809
+ }
810
+ '''
811
+ onboard = '''
812
+ OnboardApp {
813
+ background: #0a0a0a;
814
+ color: #d0d0d0;
815
+ }
816
+
817
+ #onboard-page {
818
+ width: 100%;
819
+ height: 100%;
820
+ padding: 1 2 0 2;
821
+ background: #0a0a0a;
822
+ }
823
+
824
+ ProviderWizard {
825
+ width: 100%;
826
+ height: 1fr;
827
+ }
828
+
829
+ #onboard-title {
830
+ height: 1;
831
+ color: #ededed;
832
+ text-style: bold;
833
+ }
834
+
835
+ #onboard-subtitle {
836
+ height: 2;
837
+ padding-top: 1;
838
+ color: #737373;
839
+ }
840
+
841
+ #onboard-detail {
842
+ height: auto;
843
+ margin-top: 1;
844
+ color: #737373;
845
+ }
846
+
847
+ #provider-list {
848
+ width: 100%;
849
+ height: 1fr;
850
+ margin-top: 1;
851
+ background: #0a0a0a;
852
+ border: none;
853
+ scrollbar-size: 1 1;
854
+ scrollbar-color: #484848;
855
+ scrollbar-background: #0a0a0a;
856
+ }
857
+
858
+ #provider-list:focus {
859
+ border: none;
860
+ }
861
+
862
+ #provider-list > .option-list--option {
863
+ height: 3;
864
+ padding: 0 2;
865
+ background: #0a0a0a;
866
+ }
867
+
868
+ #provider-list > .option-list--option-highlighted {
869
+ background: #1c1b17;
870
+ color: #e1c16e;
871
+ }
872
+
873
+ #provider-key {
874
+ width: 100%;
875
+ height: 3;
876
+ margin-top: 2;
877
+ background: #141414;
878
+ color: #ededed;
879
+ border: tall #2a2a2a;
880
+ padding: 0 1;
881
+ }
882
+
883
+ #provider-key:focus {
884
+ border: tall #e1c16e;
885
+ }
886
+
887
+ #onboard-error {
888
+ height: 1;
889
+ margin-top: 1;
890
+ color: #db6767;
891
+ }
892
+
893
+ #onboard-hint {
894
+ height: 1;
895
+ color: #656565;
896
+ text-align: right;
897
+ }
898
+ '''
899
+
900
+ [css.modal]
901
+ base = '''
902
+ #modal-close {
903
+ dock: right;
904
+ width: 7;
905
+ height: 1;
906
+ color: #737373;
907
+ content-align: right middle;
908
+ background: #0A0A0A;
909
+ }
910
+
911
+ #modal-close:hover,
912
+ #modal-close:focus {
913
+ color: #f2d675;
914
+ text-style: bold;
915
+ background: #0A0A0A;
916
+ }
917
+
918
+ .modal-pane {
919
+ width: 86%;
920
+ max-width: 132;
921
+ height: 84%;
922
+ padding: 2 3;
923
+ background: #0A0A0A;
924
+ border: round #383838;
925
+ }
926
+
927
+ .modal-body {
928
+ width: 100%;
929
+ height: 1fr;
930
+ padding: 1 1 2 1;
931
+ scrollbar-size: 1 1;
932
+ scrollbar-color: #343434;
933
+ scrollbar-color-active: #525252;
934
+ scrollbar-color-hover: #484848;
935
+ scrollbar-background: #0A0A0A;
936
+ scrollbar-background-active: #0A0A0A;
937
+ scrollbar-background-hover: #0A0A0A;
938
+ }
939
+
940
+ .content-card {
941
+ width: 100%;
942
+ height: auto;
943
+ margin-bottom: 2;
944
+ padding: 1 2 2 2;
945
+ color: #bdbdbd;
946
+ background: #121212;
947
+ border-top: solid #303030;
948
+ }
949
+
950
+ .empty-state {
951
+ width: 100%;
952
+ height: auto;
953
+ padding: 4 5;
954
+ margin: 2 0;
955
+ content-align: center middle;
956
+ text-align: center;
957
+ background: #121212;
958
+ }
959
+
960
+ .modal-footer {
961
+ width: 100%;
962
+ height: 2;
963
+ padding: 1 1 0 1;
964
+ color: #686868;
965
+ background: #0A0A0A;
966
+ }
967
+ '''
968
+ content = '''
969
+ ContentModal {
970
+ align: center middle;
971
+ background: rgba(0, 0, 0, 0.52);
972
+ }
973
+
974
+ #content-pane {
975
+ width: 98%;
976
+ max-width: 180;
977
+ height: 94%;
978
+ padding: 0 1;
979
+ border: round #262626;
980
+ }
981
+
982
+ #content-body {
983
+ padding: 0;
984
+ background: #0A0A0A;
985
+ }
986
+
987
+ #content-pane .modal-footer {
988
+ padding-left: 1;
989
+ }
990
+
991
+ #content-title {
992
+ width: 100%;
993
+ height: auto;
994
+ padding: 0 1 1 1;
995
+ color: #d0d0d0;
996
+ text-style: bold;
997
+ background: #0A0A0A;
998
+ }
999
+
1000
+ #content-text {
1001
+ display: none;
1002
+ }
1003
+
1004
+ #content-numbered {
1005
+ width: 100%;
1006
+ height: auto;
1007
+ padding: 1 2;
1008
+ color: #d0d0d0;
1009
+ background: #0d0d0d;
1010
+ }
1011
+ '''
1012
+ image = '''
1013
+ ImageModal {
1014
+ align: center middle;
1015
+ background: rgba(0, 0, 0, 0.52);
1016
+ }
1017
+
1018
+ #content-pane {
1019
+ width: 98%;
1020
+ max-width: 180;
1021
+ height: 94%;
1022
+ padding: 0 1;
1023
+ border: round #262626;
1024
+ }
1025
+
1026
+ #content-body {
1027
+ padding: 0;
1028
+ background: #0A0A0A;
1029
+ }
1030
+
1031
+ #content-pane .modal-footer {
1032
+ padding-left: 1;
1033
+ }
1034
+
1035
+ #image-title {
1036
+ width: 100%;
1037
+ height: auto;
1038
+ padding: 0 1 1 1;
1039
+ color: #d0d0d0;
1040
+ background: #0A0A0A;
1041
+ }
1042
+
1043
+ #image-preview {
1044
+ width: 100%;
1045
+ height: auto;
1046
+ padding: 1 1;
1047
+ background: #0d0d0d;
1048
+ }
1049
+ '''
1050
+ diff = '''
1051
+ DiffModal {
1052
+ align: center middle;
1053
+ background: rgba(0, 0, 0, 0.52);
1054
+ }
1055
+
1056
+ #diff-pane {
1057
+ width: 98%;
1058
+ max-width: 180;
1059
+ height: 94%;
1060
+ padding: 0 1;
1061
+ background: #0A0A0A;
1062
+ border: round #262626;
1063
+ }
1064
+
1065
+ #diff-header {
1066
+ width: 100%;
1067
+ height: 3;
1068
+ min-height: 3;
1069
+ padding: 1 1 0 1;
1070
+ border-bottom: solid #262626;
1071
+ background: #0A0A0A;
1072
+ }
1073
+
1074
+ #diff-pane > #modal-close {
1075
+ display: none;
1076
+ }
1077
+
1078
+
1079
+ #diff-title {
1080
+ width: auto;
1081
+ color: #d9dde0;
1082
+ text-style: bold;
1083
+ background: #0A0A0A;
1084
+ }
1085
+
1086
+ #diff-path {
1087
+ width: auto;
1088
+ padding-left: 2;
1089
+ color: #aeb8bc;
1090
+ background: #0A0A0A;
1091
+ }
1092
+
1093
+ #diff-header-spacer {
1094
+ width: 1fr;
1095
+ background: #0A0A0A;
1096
+ }
1097
+
1098
+ #diff-total-stats {
1099
+ width: auto;
1100
+ margin-left: 2;
1101
+ background: #0A0A0A;
1102
+ }
1103
+
1104
+ #diff-file-counter {
1105
+ width: auto;
1106
+ margin-left: 2;
1107
+ color: #858d91;
1108
+ content-align: right middle;
1109
+ background: #0A0A0A;
1110
+ }
1111
+
1112
+ #diff-header #modal-close {
1113
+ dock: none;
1114
+ width: auto;
1115
+ min-width: 11;
1116
+ margin-left: 2;
1117
+ color: #858d91;
1118
+ background: #0A0A0A;
1119
+ }
1120
+
1121
+ #diff-pane #modal-close:hover,
1122
+ #diff-pane #modal-close:focus {
1123
+ color: #f2d675;
1124
+ background: #171b1c;
1125
+ }
1126
+
1127
+ #diff-body {
1128
+ height: 1fr;
1129
+ padding: 0;
1130
+ background: #0A0A0A;
1131
+ scrollbar-color: #343434;
1132
+ scrollbar-color-active: #525252;
1133
+ scrollbar-color-hover: #484848;
1134
+ scrollbar-background: #0A0A0A;
1135
+ scrollbar-background-active: #0A0A0A;
1136
+ scrollbar-background-hover: #0A0A0A;
1137
+ }
1138
+
1139
+ #diff-hint {
1140
+ width: 100%;
1141
+ height: 2;
1142
+ content-align: center middle;
1143
+ color: #737b7f;
1144
+ background: #0A0A0A;
1145
+ }
1146
+
1147
+ .diff-file-card {
1148
+ width: 100%;
1149
+ height: auto;
1150
+ margin-bottom: 1;
1151
+ padding: 0;
1152
+ background: #0A0A0A;
1153
+ border-top: solid #262626;
1154
+ }
1155
+
1156
+ .diff-file-card.inactive {
1157
+ display: none;
1158
+ }
1159
+
1160
+ .diff-file-card.collapsed .diff-patch {
1161
+ display: none;
1162
+ }
1163
+
1164
+ .diff-file-card:hover {
1165
+ border-top: solid #687b83;
1166
+ }
1167
+
1168
+ .diff-file-header {
1169
+ width: 100%;
1170
+ height: 1;
1171
+ padding: 0 1;
1172
+ background: #171717;
1173
+ }
1174
+
1175
+ .diff-file-chevron {
1176
+ width: 3;
1177
+ color: #8ca0a8;
1178
+ content-align: center middle;
1179
+ background: #171717;
1180
+ }
1181
+
1182
+ .diff-file-path {
1183
+ width: 1fr;
1184
+ height: 1;
1185
+ content-align: left middle;
1186
+ color: #d0d0d0;
1187
+ background: #171717;
1188
+ }
1189
+
1190
+ .diff-file-card.selected {
1191
+ border-top: solid #f2d675;
1192
+ }
1193
+
1194
+ .diff-file-card.selected .diff-file-chevron {
1195
+ color: #f2d675;
1196
+ }
1197
+
1198
+ .diff-file-card.selected .diff-file-path {
1199
+ color: #f2d675;
1200
+ }
1201
+
1202
+ .diff-file-stats {
1203
+ width: auto;
1204
+ height: 1;
1205
+ content-align: right middle;
1206
+ color: #737373;
1207
+ background: #171717;
1208
+ }
1209
+
1210
+ .diff-patch {
1211
+ width: 100%;
1212
+ height: auto;
1213
+ margin: 0;
1214
+ padding: 0 1 1 1;
1215
+ color: #b8bec1;
1216
+ background: #080a0b;
1217
+ }
1218
+ '''
1219
+ extensions = '''
1220
+ ExtensionsModal {
1221
+ align: center middle;
1222
+ background: rgba(0, 0, 0, 0.68);
1223
+ }
1224
+ #extensions-pane {
1225
+ width: 86%;
1226
+ max-width: 128;
1227
+ height: 82%;
1228
+ padding: 0 2;
1229
+ background: #0a0a0a;
1230
+ border: round #353535;
1231
+ }
1232
+ #extensions-header {
1233
+ width: 100%;
1234
+ height: 4;
1235
+ min-height: 4;
1236
+ padding: 1 1 0 1;
1237
+ border-bottom: solid #2b2b2b;
1238
+ background: #0a0a0a;
1239
+ }
1240
+ #extensions-title {
1241
+ width: 1fr;
1242
+ color: #e0e0e0;
1243
+ text-style: bold;
1244
+ }
1245
+ #extensions-counter {
1246
+ width: auto;
1247
+ padding-right: 2;
1248
+ color: #818181;
1249
+ }
1250
+ #extensions-header #modal-close {
1251
+ dock: none;
1252
+ width: auto;
1253
+ min-width: 11;
1254
+ color: #818181;
1255
+ background: #0a0a0a;
1256
+ }
1257
+ #extensions-header #modal-close:hover,
1258
+ #extensions-header #modal-close:focus {
1259
+ color: #f2d675;
1260
+ background: #171717;
1261
+ }
1262
+ #extensions-subtitle {
1263
+ width: 100%;
1264
+ height: 2;
1265
+ padding: 0 1;
1266
+ color: #737373;
1267
+ background: #0a0a0a;
1268
+ }
1269
+ #extensions-body {
1270
+ padding: 0 1 1 1;
1271
+ background: #0a0a0a;
1272
+ }
1273
+ .extensions-section {
1274
+ width: 100%;
1275
+ height: 2;
1276
+ margin: 1 0 0 0;
1277
+ padding: 0 1;
1278
+ color: #f2d675;
1279
+ text-style: bold;
1280
+ background: #0a0a0a;
1281
+ }
1282
+ .extension-card {
1283
+ width: 100%;
1284
+ height: auto;
1285
+ min-height: 6;
1286
+ margin-bottom: 1;
1287
+ padding: 1 2;
1288
+ background: #151515;
1289
+ border-left: thick #343434;
1290
+ }
1291
+ .extension-card:hover {
1292
+ border-left: thick #f2d675;
1293
+ background: #191919;
1294
+ }
1295
+ .extension-card-header {
1296
+ width: 100%;
1297
+ height: 2;
1298
+ }
1299
+ .extension-name {
1300
+ width: 1fr;
1301
+ color: #dedede;
1302
+ text-style: bold;
1303
+ }
1304
+ .extension-origin,
1305
+ .extension-status {
1306
+ width: auto;
1307
+ color: #f2d675;
1308
+ text-style: bold;
1309
+ }
1310
+ .extension-status.disabled {
1311
+ color: #a06b6b;
1312
+ }
1313
+ .extension-description {
1314
+ width: 100%;
1315
+ height: auto;
1316
+ color: #bdbdbd;
1317
+ }
1318
+ .extension-path {
1319
+ width: 100%;
1320
+ height: auto;
1321
+ margin-top: 1;
1322
+ color: #707070;
1323
+ }
1324
+ '''
1325
+ learning = '''
1326
+ LearningModal {
1327
+ align: center middle;
1328
+ background: rgba(0, 0, 0, 0.52);
1329
+ }
1330
+
1331
+ #learning-pane {
1332
+ width: 98%;
1333
+ max-width: 180;
1334
+ height: 94%;
1335
+ padding: 0 1;
1336
+ background: #0A0A0A;
1337
+ border: round #262626;
1338
+ }
1339
+
1340
+ #learning-pane > #modal-close {
1341
+ display: none;
1342
+ }
1343
+
1344
+ #learning-header {
1345
+ width: 100%;
1346
+ height: 3;
1347
+ min-height: 3;
1348
+ padding: 1 1 0 1;
1349
+ border-bottom: solid #262626;
1350
+ background: #0A0A0A;
1351
+ }
1352
+
1353
+ #learning-title {
1354
+ width: auto;
1355
+ color: #d9dde0;
1356
+ text-style: bold;
1357
+ background: #0A0A0A;
1358
+ }
1359
+
1360
+ #learning-counter {
1361
+ width: 1fr;
1362
+ padding-left: 2;
1363
+ color: #858d91;
1364
+ background: #0A0A0A;
1365
+ }
1366
+
1367
+ #learning-header #modal-close {
1368
+ dock: none;
1369
+ width: auto;
1370
+ min-width: 11;
1371
+ color: #858d91;
1372
+ background: #0A0A0A;
1373
+ }
1374
+
1375
+ #learning-header #modal-close:hover,
1376
+ #learning-header #modal-close:focus {
1377
+ color: #f2d675;
1378
+ background: #171b1c;
1379
+ }
1380
+
1381
+ #learning-tabs {
1382
+ height: 1fr;
1383
+ background: #0A0A0A;
1384
+ }
1385
+
1386
+ #learning-tabs ContentSwitcher {
1387
+ height: 1fr;
1388
+ }
1389
+
1390
+ #learning-tabs TabPane {
1391
+ height: 1fr;
1392
+ padding: 0;
1393
+ }
1394
+
1395
+ #session-memory-body, #global-memory-body {
1396
+ height: 1fr;
1397
+ padding: 0;
1398
+ background: #0A0A0A;
1399
+ }
1400
+
1401
+ #learning-hint {
1402
+ width: 100%;
1403
+ height: 2;
1404
+ content-align: center middle;
1405
+ color: #737b7f;
1406
+ background: #0A0A0A;
1407
+ }
1408
+
1409
+ .learning-section {
1410
+ width: 100%;
1411
+ height: auto;
1412
+ margin: 1 1 0 1;
1413
+ color: #8eafc2;
1414
+ text-style: bold;
1415
+ background: #0A0A0A;
1416
+ }
1417
+
1418
+ .learning-content {
1419
+ width: 100%;
1420
+ height: auto;
1421
+ margin: 0 1 1 1;
1422
+ padding: 0 1;
1423
+ color: #bdbdbd;
1424
+ background: #0A0A0A;
1425
+ }
1426
+
1427
+ .learning-card {
1428
+ width: 100%;
1429
+ height: auto;
1430
+ margin-bottom: 1;
1431
+ padding: 0;
1432
+ background: #0A0A0A;
1433
+ border-top: solid #262626;
1434
+ }
1435
+
1436
+ .learning-card:hover {
1437
+ border-top: solid #687b83;
1438
+ }
1439
+
1440
+ .learning-card-header {
1441
+ width: 100%;
1442
+ height: 1;
1443
+ padding: 0 1;
1444
+ background: #171717;
1445
+ }
1446
+
1447
+ .learning-marker {
1448
+ width: 3;
1449
+ color: #c5a9e6;
1450
+ content-align: center middle;
1451
+ background: #171717;
1452
+ }
1453
+
1454
+ .learning-card-title {
1455
+ width: 1fr;
1456
+ color: #d0d0d0;
1457
+ background: #171717;
1458
+ }
1459
+
1460
+ .learning-meta {
1461
+ width: auto;
1462
+ background: #171717;
1463
+ }
1464
+
1465
+ .learning-body-content {
1466
+ width: 100%;
1467
+ height: auto;
1468
+ padding: 1 2 2 2;
1469
+ color: #bdbdbd;
1470
+ background: #0A0A0A;
1471
+ }
1472
+
1473
+ '''
1474
+ context = '''
1475
+ ContextModal {
1476
+ align: center middle;
1477
+ background: rgba(0, 0, 0, 0.52);
1478
+ }
1479
+
1480
+ #context-pane {
1481
+ width: 82%;
1482
+ max-width: 118;
1483
+ height: 78%;
1484
+ max-height: 44;
1485
+ padding: 1 2;
1486
+ background: #0A0A0A;
1487
+ border: round #38474a;
1488
+ }
1489
+
1490
+ #context-header {
1491
+ width: 100%;
1492
+ height: 2;
1493
+ background: #0A0A0A;
1494
+ }
1495
+
1496
+ #context-title {
1497
+ width: 1fr;
1498
+ height: 1;
1499
+ color: #d8d8d8;
1500
+ text-style: bold;
1501
+ background: #0A0A0A;
1502
+ }
1503
+
1504
+ #context-meters {
1505
+ width: 100%;
1506
+ height: auto;
1507
+ margin-bottom: 1;
1508
+ padding: 1 2;
1509
+ background: #0d0d0d;
1510
+ border-top: solid #2a2a2a;
1511
+ }
1512
+
1513
+ #context-buckets {
1514
+ width: 100%;
1515
+ height: 3;
1516
+ margin-bottom: 1;
1517
+ background: #0A0A0A;
1518
+ border-bottom: solid #252525;
1519
+ }
1520
+
1521
+ .context-chip {
1522
+ width: auto;
1523
+ height: 3;
1524
+ margin-right: 2;
1525
+ padding: 0 1 1 1;
1526
+ color: #9a9a9a;
1527
+ content-align: center middle;
1528
+ background: #0A0A0A;
1529
+ }
1530
+
1531
+ .context-chip:hover,
1532
+ .context-chip:focus {
1533
+ color: #e6e6e6;
1534
+ background: #161616;
1535
+ }
1536
+
1537
+ .context-chip-active {
1538
+ color: #f2d675;
1539
+ text-style: bold;
1540
+ background: #0A0A0A;
1541
+ border-bottom: heavy #8f835a;
1542
+ }
1543
+
1544
+ #context-meta {
1545
+ width: 100%;
1546
+ height: 2;
1547
+ padding: 0 1 1 1;
1548
+ color: #686868;
1549
+ background: #0A0A0A;
1550
+ }
1551
+
1552
+ #context-body {
1553
+ padding: 0;
1554
+ background: #0A0A0A;
1555
+ }
1556
+
1557
+ #context-list {
1558
+ width: 100%;
1559
+ height: auto;
1560
+ padding: 1 2;
1561
+ background: #0d0d0d;
1562
+ border-top: solid #252525;
1563
+ }
1564
+
1565
+ .context-row {
1566
+ width: 100%;
1567
+ height: auto;
1568
+ }
1569
+
1570
+ #context-hint {
1571
+ text-align: right;
1572
+ padding-right: 0;
1573
+ }
1574
+ '''
1575
+ provider = '''
1576
+ ProviderOnboardScreen {
1577
+ align: center middle;
1578
+ background: rgba(0, 0, 0, 0.52);
1579
+ }
1580
+
1581
+ /* Keep provider setup on the same full-size modal chrome as text, image,
1582
+ and diff previews. The old fixed 28-row pane clipped the key step on
1583
+ smaller terminals and made this screen look like a separate dialog. */
1584
+ #provider-pane {
1585
+ width: 98%;
1586
+ max-width: 180;
1587
+ height: 94%;
1588
+ padding: 0 1;
1589
+ background: #0A0A0A;
1590
+ border: round #262626;
1591
+ }
1592
+
1593
+ #provider-pane > #modal-close {
1594
+ background: #0A0A0A;
1595
+ }
1596
+
1597
+ #provider-pane ProviderWizard {
1598
+ width: 100%;
1599
+ height: 1fr;
1600
+ }
1601
+
1602
+ #provider-pane #onboard-title {
1603
+ width: 100%;
1604
+ height: 3;
1605
+ min-height: 3;
1606
+ padding: 1 8 0 1;
1607
+ color: #d9dde0;
1608
+ text-style: bold;
1609
+ background: #0A0A0A;
1610
+ border-bottom: solid #262626;
1611
+ }
1612
+
1613
+ #provider-pane #onboard-subtitle {
1614
+ width: 100%;
1615
+ height: 2;
1616
+ padding: 1 1 0 1;
1617
+ color: #858d91;
1618
+ background: #0A0A0A;
1619
+ }
1620
+
1621
+ #provider-pane #onboard-detail {
1622
+ width: 100%;
1623
+ height: auto;
1624
+ margin-top: 1;
1625
+ padding: 0 1;
1626
+ color: #858d91;
1627
+ background: #0A0A0A;
1628
+ }
1629
+
1630
+ #provider-pane #provider-list {
1631
+ width: 100%;
1632
+ height: 1fr;
1633
+ margin-top: 1;
1634
+ padding: 0;
1635
+ background: #0d0d0d;
1636
+ border: none;
1637
+ scrollbar-size: 1 1;
1638
+ scrollbar-color: #343434;
1639
+ scrollbar-background: #0d0d0d;
1640
+ }
1641
+
1642
+ #provider-pane #provider-list:focus {
1643
+ border: none;
1644
+ }
1645
+
1646
+ #provider-pane #provider-list > .option-list--option {
1647
+ height: 3;
1648
+ padding: 0 2;
1649
+ background: #0d0d0d;
1650
+ color: #bdbdbd;
1651
+ }
1652
+
1653
+ #provider-pane #provider-list > .option-list--option-highlighted {
1654
+ background: #1c1b17;
1655
+ color: #e1c16e;
1656
+ border-left: wide #e1c16e;
1657
+ padding-left: 1;
1658
+ }
1659
+
1660
+ #provider-pane #provider-key {
1661
+ width: 100%;
1662
+ height: 3;
1663
+ margin: 1 1 0 1;
1664
+ background: #141414;
1665
+ color: #ededed;
1666
+ border: tall #2a2a2a;
1667
+ }
1668
+
1669
+ #provider-pane #provider-key:focus {
1670
+ border: tall #e1c16e;
1671
+ }
1672
+
1673
+ #provider-pane #onboard-error {
1674
+ height: 1;
1675
+ margin: 1 1 0 1;
1676
+ color: #db6767;
1677
+ }
1678
+
1679
+ #provider-pane #onboard-hint {
1680
+ width: 100%;
1681
+ height: 2;
1682
+ padding: 1 1 0 1;
1683
+ color: #686868;
1684
+ background: #0A0A0A;
1685
+ border-top: solid #262626;
1686
+ }
1687
+ '''