@burtson-labs/agent-ui 1.0.11

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 (144) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +45 -0
  3. package/dist/components/AgentConsole.d.ts +11 -0
  4. package/dist/components/AgentConsole.d.ts.map +1 -0
  5. package/dist/components/AgentConsole.js +139 -0
  6. package/dist/components/AgentConsole.js.map +1 -0
  7. package/dist/components/AgentSummaryCard.d.ts +9 -0
  8. package/dist/components/AgentSummaryCard.d.ts.map +1 -0
  9. package/dist/components/AgentSummaryCard.js +96 -0
  10. package/dist/components/AgentSummaryCard.js.map +1 -0
  11. package/dist/components/ChatComposer.d.ts +134 -0
  12. package/dist/components/ChatComposer.d.ts.map +1 -0
  13. package/dist/components/ChatComposer.js +411 -0
  14. package/dist/components/ChatComposer.js.map +1 -0
  15. package/dist/components/ChatConversation.d.ts +28 -0
  16. package/dist/components/ChatConversation.d.ts.map +1 -0
  17. package/dist/components/ChatConversation.js +82 -0
  18. package/dist/components/ChatConversation.js.map +1 -0
  19. package/dist/components/ChatMessage.d.ts +38 -0
  20. package/dist/components/ChatMessage.d.ts.map +1 -0
  21. package/dist/components/ChatMessage.js +208 -0
  22. package/dist/components/ChatMessage.js.map +1 -0
  23. package/dist/components/DiffBlock.d.ts +7 -0
  24. package/dist/components/DiffBlock.d.ts.map +1 -0
  25. package/dist/components/DiffBlock.js +58 -0
  26. package/dist/components/DiffBlock.js.map +1 -0
  27. package/dist/components/DiffReview/DiffBlock.d.ts +7 -0
  28. package/dist/components/DiffReview/DiffBlock.d.ts.map +1 -0
  29. package/dist/components/DiffReview/DiffBlock.js +13 -0
  30. package/dist/components/DiffReview/DiffBlock.js.map +1 -0
  31. package/dist/components/DiffReview/DiffFileGroup.d.ts +14 -0
  32. package/dist/components/DiffReview/DiffFileGroup.d.ts.map +1 -0
  33. package/dist/components/DiffReview/DiffFileGroup.js +44 -0
  34. package/dist/components/DiffReview/DiffFileGroup.js.map +1 -0
  35. package/dist/components/DiffReview/DiffReviewPanel.d.ts +16 -0
  36. package/dist/components/DiffReview/DiffReviewPanel.d.ts.map +1 -0
  37. package/dist/components/DiffReview/DiffReviewPanel.js +25 -0
  38. package/dist/components/DiffReview/DiffReviewPanel.js.map +1 -0
  39. package/dist/components/DiffReview/index.d.ts +3 -0
  40. package/dist/components/DiffReview/index.d.ts.map +1 -0
  41. package/dist/components/DiffReview/index.js +19 -0
  42. package/dist/components/DiffReview/index.js.map +1 -0
  43. package/dist/components/DiffReviewCard.d.ts +10 -0
  44. package/dist/components/DiffReviewCard.d.ts.map +1 -0
  45. package/dist/components/DiffReviewCard.js +36 -0
  46. package/dist/components/DiffReviewCard.js.map +1 -0
  47. package/dist/components/DiffStream.d.ts +12 -0
  48. package/dist/components/DiffStream.d.ts.map +1 -0
  49. package/dist/components/DiffStream.js +43 -0
  50. package/dist/components/DiffStream.js.map +1 -0
  51. package/dist/components/MarkdownMessage.d.ts +17 -0
  52. package/dist/components/MarkdownMessage.d.ts.map +1 -0
  53. package/dist/components/MarkdownMessage.js +158 -0
  54. package/dist/components/MarkdownMessage.js.map +1 -0
  55. package/dist/components/PermissionCard.d.ts +64 -0
  56. package/dist/components/PermissionCard.d.ts.map +1 -0
  57. package/dist/components/PermissionCard.js +156 -0
  58. package/dist/components/PermissionCard.js.map +1 -0
  59. package/dist/components/PlanActivity.d.ts +20 -0
  60. package/dist/components/PlanActivity.d.ts.map +1 -0
  61. package/dist/components/PlanActivity.js +186 -0
  62. package/dist/components/PlanActivity.js.map +1 -0
  63. package/dist/components/PlanTree.d.ts +13 -0
  64. package/dist/components/PlanTree.d.ts.map +1 -0
  65. package/dist/components/PlanTree.js +70 -0
  66. package/dist/components/PlanTree.js.map +1 -0
  67. package/dist/components/TaskList.d.ts +9 -0
  68. package/dist/components/TaskList.d.ts.map +1 -0
  69. package/dist/components/TaskList.js +26 -0
  70. package/dist/components/TaskList.js.map +1 -0
  71. package/dist/components/TelemetryPanel.d.ts +9 -0
  72. package/dist/components/TelemetryPanel.d.ts.map +1 -0
  73. package/dist/components/TelemetryPanel.js +54 -0
  74. package/dist/components/TelemetryPanel.js.map +1 -0
  75. package/dist/components/index.d.ts +15 -0
  76. package/dist/components/index.d.ts.map +1 -0
  77. package/dist/components/index.js +31 -0
  78. package/dist/components/index.js.map +1 -0
  79. package/dist/context/BanditContext.d.ts +14 -0
  80. package/dist/context/BanditContext.d.ts.map +1 -0
  81. package/dist/context/BanditContext.js +18 -0
  82. package/dist/context/BanditContext.js.map +1 -0
  83. package/dist/context/index.d.ts +2 -0
  84. package/dist/context/index.d.ts.map +1 -0
  85. package/dist/context/index.js +18 -0
  86. package/dist/context/index.js.map +1 -0
  87. package/dist/hooks/index.d.ts +3 -0
  88. package/dist/hooks/index.d.ts.map +1 -0
  89. package/dist/hooks/index.js +19 -0
  90. package/dist/hooks/index.js.map +1 -0
  91. package/dist/hooks/useAgentEvents.d.ts +13 -0
  92. package/dist/hooks/useAgentEvents.d.ts.map +1 -0
  93. package/dist/hooks/useAgentEvents.js +54 -0
  94. package/dist/hooks/useAgentEvents.js.map +1 -0
  95. package/dist/hooks/useTelemetry.d.ts +4 -0
  96. package/dist/hooks/useTelemetry.d.ts.map +1 -0
  97. package/dist/hooks/useTelemetry.js +198 -0
  98. package/dist/hooks/useTelemetry.js.map +1 -0
  99. package/dist/index.d.ts +12 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +29 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/theme/BanditThemeProvider.d.ts +26 -0
  104. package/dist/theme/BanditThemeProvider.d.ts.map +1 -0
  105. package/dist/theme/BanditThemeProvider.js +138 -0
  106. package/dist/theme/BanditThemeProvider.js.map +1 -0
  107. package/dist/theme/catppuccin-mocha.json +23 -0
  108. package/dist/theme/charcoal.json +23 -0
  109. package/dist/theme/dark.json +23 -0
  110. package/dist/theme/dracula.json +23 -0
  111. package/dist/theme/index.d.ts +5 -0
  112. package/dist/theme/index.d.ts.map +1 -0
  113. package/dist/theme/index.js +21 -0
  114. package/dist/theme/index.js.map +1 -0
  115. package/dist/theme/light.json +23 -0
  116. package/dist/theme/midnight.json +23 -0
  117. package/dist/theme/nord.json +23 -0
  118. package/dist/theme/onyx.json +23 -0
  119. package/dist/theme/sepia.json +23 -0
  120. package/dist/theme/solarized-dark.json +23 -0
  121. package/dist/theme/solarized-light.json +23 -0
  122. package/dist/theme/theme-base.d.ts +37 -0
  123. package/dist/theme/theme-base.d.ts.map +1 -0
  124. package/dist/theme/theme-base.js +141 -0
  125. package/dist/theme/theme-base.js.map +1 -0
  126. package/dist/theme/theme-registry.d.ts +22 -0
  127. package/dist/theme/theme-registry.d.ts.map +1 -0
  128. package/dist/theme/theme-registry.js +52 -0
  129. package/dist/theme/theme-registry.js.map +1 -0
  130. package/dist/theme/tokyo-night.json +23 -0
  131. package/dist/theme/vscode-theme.d.ts +3 -0
  132. package/dist/theme/vscode-theme.d.ts.map +1 -0
  133. package/dist/theme/vscode-theme.js +128 -0
  134. package/dist/theme/vscode-theme.js.map +1 -0
  135. package/dist/types/ui-schema.d.ts +114 -0
  136. package/dist/types/ui-schema.d.ts.map +1 -0
  137. package/dist/types/ui-schema.js +3 -0
  138. package/dist/types/ui-schema.js.map +1 -0
  139. package/dist/utils/classNames.d.ts +2 -0
  140. package/dist/utils/classNames.d.ts.map +1 -0
  141. package/dist/utils/classNames.js +8 -0
  142. package/dist/utils/classNames.js.map +1 -0
  143. package/package.json +55 -0
  144. package/styles/agent-ui.css +3844 -0
@@ -0,0 +1,3844 @@
1
+ :root,
2
+ .agent-ui-theme-dark {
3
+ --agent-ui-bg: #05070c;
4
+ --agent-ui-panel-bg: rgba(11, 16, 24, 0.92);
5
+ --agent-ui-panel-border: rgba(78, 99, 132, 0.4);
6
+ --agent-ui-panel-radius: 14px;
7
+ --agent-ui-text-primary: #f8fafc;
8
+ --agent-ui-text-muted: rgba(248, 250, 252, 0.7);
9
+ --agent-ui-text-dim: rgba(148, 163, 184, 0.85);
10
+ --agent-ui-pill-bg: rgba(15, 23, 42, 0.65);
11
+ --agent-ui-pill-color: #e2e8f0;
12
+ --agent-ui-card-bg: rgba(13, 18, 28, 0.9);
13
+ --agent-ui-card-border: rgba(62, 82, 106, 0.65);
14
+ --agent-ui-card-selected: rgba(34, 197, 94, 0.25);
15
+ --agent-ui-accent: #38bdf8;
16
+ --agent-ui-accent-strong: #22d3ee;
17
+ --agent-ui-success: #34d399;
18
+ --agent-ui-warn: #facc15;
19
+ --agent-ui-error: #f87171;
20
+ --agent-ui-plan-line: rgba(34, 197, 94, 0.65);
21
+ --agent-ui-plan-pending-bg: rgba(255, 255, 255, 0.015);
22
+ --agent-ui-plan-active-bg: rgba(34, 197, 94, 0.08);
23
+ --agent-ui-plan-done-bg: rgba(34, 197, 94, 0.15);
24
+ --agent-ui-plan-error-bg: rgba(248, 113, 113, 0.15);
25
+ --agent-ui-plan-warn-bg: rgba(250, 204, 21, 0.15);
26
+ --agent-ui-diff-surface: rgba(1, 6, 16, 0.42);
27
+ --agent-ui-diff-line-num-bg: rgba(15, 23, 42, 0.45);
28
+ --agent-ui-diff-line-num-border: rgba(148, 163, 184, 0.3);
29
+ --agent-ui-diff-add-bg: rgba(22, 163, 74, 0.24);
30
+ --agent-ui-diff-add-text: #eafff1;
31
+ --agent-ui-diff-del-bg: rgba(220, 38, 38, 0.24);
32
+ --agent-ui-diff-del-text: #ffecec;
33
+ --agent-ui-diff-hunk-bg: rgba(2, 132, 199, 0.24);
34
+ --agent-ui-diff-hunk-text: #d7f4ff;
35
+ --agent-ui-diff-meta-text: rgba(226, 232, 240, 0.78);
36
+ }
37
+
38
+ .agent-ui-theme-light {
39
+ --agent-ui-bg: #f5f6fa;
40
+ --agent-ui-panel-bg: rgba(255, 255, 255, 0.92);
41
+ --agent-ui-panel-border: rgba(203, 213, 225, 0.8);
42
+ --agent-ui-text-primary: #0f172a;
43
+ --agent-ui-text-muted: rgba(15, 23, 42, 0.7);
44
+ --agent-ui-text-dim: rgba(71, 85, 105, 0.9);
45
+ --agent-ui-pill-bg: rgba(226, 232, 240, 0.8);
46
+ --agent-ui-pill-color: #0f172a;
47
+ --agent-ui-card-bg: rgba(255, 255, 255, 0.98);
48
+ --agent-ui-card-border: rgba(148, 163, 184, 0.4);
49
+ --agent-ui-card-selected: rgba(59, 130, 246, 0.15);
50
+ --agent-ui-accent: #2563eb;
51
+ --agent-ui-accent-strong: #1d4ed8;
52
+ --agent-ui-success: #059669;
53
+ --agent-ui-warn: #ca8a04;
54
+ --agent-ui-error: #dc2626;
55
+ --agent-ui-plan-line: rgba(25, 94, 52, 0.55);
56
+ --agent-ui-plan-pending-bg: rgba(226, 232, 240, 0.5);
57
+ --agent-ui-plan-active-bg: rgba(187, 247, 208, 0.6);
58
+ --agent-ui-plan-done-bg: rgba(187, 247, 208, 0.9);
59
+ --agent-ui-plan-error-bg: rgba(254, 202, 202, 0.9);
60
+ --agent-ui-plan-warn-bg: rgba(254, 243, 199, 0.9);
61
+ --agent-ui-diff-surface: rgba(255, 255, 255, 0.96);
62
+ --agent-ui-diff-line-num-bg: rgba(226, 232, 240, 0.8);
63
+ --agent-ui-diff-line-num-border: rgba(148, 163, 184, 0.5);
64
+ --agent-ui-diff-add-bg: rgba(22, 163, 74, 0.16);
65
+ --agent-ui-diff-add-text: #14532d;
66
+ --agent-ui-diff-del-bg: rgba(220, 38, 38, 0.14);
67
+ --agent-ui-diff-del-text: #7f1d1d;
68
+ --agent-ui-diff-hunk-bg: rgba(2, 132, 199, 0.16);
69
+ --agent-ui-diff-hunk-text: #0c4a6e;
70
+ --agent-ui-diff-meta-text: rgba(51, 65, 85, 0.85);
71
+ }
72
+
73
+ .agent-ui-theme-vscode {
74
+ --agent-ui-bg: var(--vscode-editor-background, #0f172a);
75
+ --agent-ui-panel-bg: var(--vscode-editorWidget-background, rgba(11, 16, 24, 0.92));
76
+ --agent-ui-panel-border: var(--vscode-panel-border, rgba(78, 99, 132, 0.4));
77
+ --agent-ui-text-primary: var(--vscode-foreground, #f8fafc);
78
+ --agent-ui-text-muted: var(--vscode-descriptionForeground, rgba(248, 250, 252, 0.7));
79
+ --agent-ui-text-dim: var(--vscode-disabledForeground, rgba(148, 163, 184, 0.85));
80
+ --agent-ui-pill-bg: var(--vscode-sideBar-background, rgba(15, 23, 42, 0.65));
81
+ --agent-ui-pill-color: var(--vscode-editor-foreground, #e2e8f0);
82
+ --agent-ui-card-bg: var(--vscode-editorHoverWidget-background, rgba(13, 18, 28, 0.9));
83
+ --agent-ui-card-border: var(--vscode-editorWidget-border, rgba(62, 82, 106, 0.65));
84
+ --agent-ui-card-selected: var(--vscode-focusBorder, rgba(34, 197, 94, 0.25));
85
+ --agent-ui-accent: var(--vscode-focusBorder, #38bdf8);
86
+ --agent-ui-accent-strong: var(--vscode-textLink-foreground, #22d3ee);
87
+ --agent-ui-success: var(--vscode-testing-iconPassed, #34d399);
88
+ --agent-ui-warn: var(--vscode-editorWarning-foreground, #facc15);
89
+ --agent-ui-error: var(--vscode-testing-iconFailed, #f87171);
90
+ --agent-ui-plan-line: var(--vscode-focusBorder, rgba(34, 197, 94, 0.65));
91
+ --agent-ui-plan-pending-bg: var(--vscode-editor-background, rgba(255, 255, 255, 0.015));
92
+ --agent-ui-plan-active-bg: var(--vscode-editor-selectionBackground, rgba(34, 197, 94, 0.08));
93
+ --agent-ui-plan-done-bg: var(--vscode-diffEditor-insertedTextBackground, rgba(34, 197, 94, 0.15));
94
+ --agent-ui-plan-error-bg: var(--vscode-diffEditor-removedTextBackground, rgba(248, 113, 113, 0.15));
95
+ --agent-ui-plan-warn-bg: var(--vscode-editorWarning-foreground, rgba(250, 204, 21, 0.15));
96
+ }
97
+
98
+ .agent-ui-panel {
99
+ background: var(--agent-ui-panel-bg);
100
+ border: 1px solid var(--agent-ui-panel-border);
101
+ border-radius: var(--agent-ui-panel-radius);
102
+ padding: 1rem 1.25rem;
103
+ color: var(--agent-ui-text-primary);
104
+ box-shadow: 0 25px 75px rgba(2, 6, 23, 0.45);
105
+ }
106
+
107
+ .agent-ui-panel__header {
108
+ display: flex;
109
+ justify-content: space-between;
110
+ align-items: flex-start;
111
+ gap: 1rem;
112
+ margin-bottom: 1rem;
113
+ }
114
+
115
+ .agent-ui-panel__eyebrow {
116
+ font-size: 0.75rem;
117
+ letter-spacing: 0.2em;
118
+ text-transform: uppercase;
119
+ color: var(--agent-ui-text-muted);
120
+ margin: 0;
121
+ }
122
+
123
+ .agent-ui-panel__title {
124
+ margin: 0.15rem 0;
125
+ font-size: 1.3rem;
126
+ line-height: 1.3;
127
+ }
128
+
129
+ .agent-ui-panel__subtitle {
130
+ margin: 0;
131
+ font-size: 0.9rem;
132
+ color: var(--agent-ui-text-dim);
133
+ }
134
+
135
+ .agent-ui-panel__meta {
136
+ font-size: 0.8rem;
137
+ color: var(--agent-ui-text-dim);
138
+ white-space: nowrap;
139
+ }
140
+
141
+ .agent-ui-plan-list {
142
+ list-style: none;
143
+ padding: 0;
144
+ margin: 0;
145
+ display: flex;
146
+ flex-direction: column;
147
+ gap: 0.65rem;
148
+ }
149
+
150
+ :is(.agent-ui-plan-step, .plan-card-step) {
151
+ position: relative;
152
+ display: flex;
153
+ gap: 0.8rem;
154
+ padding: 0.65rem 0.4rem;
155
+ border-radius: 12px;
156
+ border: 1px solid var(--agent-ui-card-border);
157
+ background: var(--agent-ui-plan-pending-bg);
158
+ transition: border-color 0.2s ease, box-shadow 0.2s ease;
159
+ }
160
+
161
+ :is(.agent-ui-plan-step__rail, .plan-card-step-rail) {
162
+ position: absolute;
163
+ left: 0.95rem;
164
+ top: 1.6rem;
165
+ bottom: -0.4rem;
166
+ width: 2px;
167
+ background: var(--agent-ui-plan-line);
168
+ opacity: 0.35;
169
+ border-radius: 999px;
170
+ z-index: -1;
171
+ }
172
+
173
+ .agent-ui-plan-step:last-child .agent-ui-plan-step__rail {
174
+ bottom: 0.4rem;
175
+ }
176
+
177
+ :is(.agent-ui-plan-step, .plan-card-step).is-clickable {
178
+ cursor: pointer;
179
+ }
180
+
181
+ :is(.agent-ui-plan-step, .plan-card-step).is-selected {
182
+ box-shadow: 0 0 0 1px rgba(88, 167, 255, 0.4);
183
+ }
184
+
185
+ :is(.agent-ui-plan-step, .plan-card-step).is-pending {
186
+ background: var(--agent-ui-plan-pending-bg);
187
+ opacity: 0.95;
188
+ }
189
+
190
+ :is(.agent-ui-plan-step, .plan-card-step).is-active,
191
+ :is(.agent-ui-plan-step, .plan-card-step).is-in_progress {
192
+ border-color: rgba(34, 197, 94, 0.45);
193
+ background: var(--agent-ui-plan-active-bg);
194
+ }
195
+
196
+ :is(.agent-ui-plan-step, .plan-card-step).is-done,
197
+ :is(.agent-ui-plan-step, .plan-card-step).is-completed {
198
+ border-color: rgba(34, 197, 94, 0.55);
199
+ background: var(--agent-ui-plan-done-bg);
200
+ }
201
+
202
+ :is(.agent-ui-plan-step, .plan-card-step).is-error,
203
+ :is(.agent-ui-plan-step, .plan-card-step).is-failed {
204
+ border-color: rgba(248, 113, 113, 0.55);
205
+ background: var(--agent-ui-plan-error-bg);
206
+ }
207
+
208
+ :is(.agent-ui-plan-step, .plan-card-step).is-warn {
209
+ border-color: rgba(250, 204, 21, 0.55);
210
+ background: var(--agent-ui-plan-warn-bg);
211
+ }
212
+
213
+ :is(.agent-ui-plan-step__index, .plan-card-index) {
214
+ width: 1.85rem;
215
+ height: 1.85rem;
216
+ border-radius: 10px;
217
+ display: inline-flex;
218
+ align-items: center;
219
+ justify-content: center;
220
+ font-size: 0.78rem;
221
+ font-weight: 600;
222
+ letter-spacing: 0.06em;
223
+ background: rgba(255, 255, 255, 0.08);
224
+ flex-shrink: 0;
225
+ }
226
+
227
+ :is(.agent-ui-plan-step, .plan-card-step).is-done :is(.agent-ui-plan-step__index, .plan-card-index),
228
+ :is(.agent-ui-plan-step, .plan-card-step).is-completed :is(.agent-ui-plan-step__index, .plan-card-index) {
229
+ background: rgba(34, 197, 94, 0.35);
230
+ }
231
+
232
+ :is(.agent-ui-plan-step, .plan-card-step).is-active :is(.agent-ui-plan-step__index, .plan-card-index),
233
+ :is(.agent-ui-plan-step, .plan-card-step).is-in_progress :is(.agent-ui-plan-step__index, .plan-card-index) {
234
+ background: rgba(34, 197, 94, 0.25);
235
+ }
236
+
237
+ :is(.agent-ui-plan-step, .plan-card-step).is-error :is(.agent-ui-plan-step__index, .plan-card-index),
238
+ :is(.agent-ui-plan-step, .plan-card-step).is-failed :is(.agent-ui-plan-step__index, .plan-card-index) {
239
+ background: rgba(248, 113, 113, 0.35);
240
+ }
241
+
242
+ :is(.agent-ui-plan-step__body, .plan-card-step-body) {
243
+ display: flex;
244
+ flex-direction: column;
245
+ gap: 0.35rem;
246
+ min-width: 0;
247
+ flex: 1;
248
+ }
249
+
250
+ :is(.agent-ui-plan-step__row, .plan-card-step-row) {
251
+ display: flex;
252
+ justify-content: space-between;
253
+ align-items: baseline;
254
+ gap: 0.75rem;
255
+ }
256
+
257
+ :is(.agent-ui-plan-step__title, .plan-card-step-title) {
258
+ margin: 0;
259
+ font-size: 0.95rem;
260
+ font-weight: 600;
261
+ color: var(--agent-ui-text-primary);
262
+ }
263
+
264
+ :is(.agent-ui-plan-step__badge, .plan-card-step-status) {
265
+ font-size: 0.68rem;
266
+ letter-spacing: 0.2em;
267
+ text-transform: uppercase;
268
+ padding: 0.15rem 0.65rem;
269
+ border-radius: 999px;
270
+ border: 1px solid rgba(148, 163, 184, 0.4);
271
+ background: rgba(15, 23, 42, 0.35);
272
+ color: var(--agent-ui-pill-color);
273
+ }
274
+
275
+ :is(.agent-ui-plan-step__status, .plan-card-step-status) {
276
+ font-size: 0.68rem;
277
+ letter-spacing: 0.12em;
278
+ text-transform: uppercase;
279
+ color: rgba(248, 250, 252, 0.65);
280
+ }
281
+
282
+ :is(.agent-ui-plan-step__description, .plan-card-step-summary) {
283
+ margin: 0;
284
+ font-size: 0.82rem;
285
+ color: rgba(226, 232, 240, 0.8);
286
+ line-height: 1.4;
287
+ }
288
+
289
+ :is(.agent-ui-plan-step__command, .plan-card-step-meta code) {
290
+ margin: 0.25rem 0 0;
291
+ padding: 0.5rem;
292
+ border-radius: 8px;
293
+ background: rgba(15, 23, 42, 0.6);
294
+ border: 1px solid rgba(148, 163, 184, 0.18);
295
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
296
+ font-size: 0.8rem;
297
+ color: #e2e8f0;
298
+ overflow-x: auto;
299
+ }
300
+
301
+ .agent-ui-diff-stream__list {
302
+ display: flex;
303
+ flex-direction: column;
304
+ gap: 0.8rem;
305
+ }
306
+
307
+ .agent-ui-diff-card {
308
+ border: 1px solid var(--agent-ui-card-border);
309
+ border-radius: 12px;
310
+ padding: 0.85rem 1rem;
311
+ background: var(--agent-ui-card-bg);
312
+ display: flex;
313
+ flex-direction: column;
314
+ gap: 0.5rem;
315
+ }
316
+
317
+ .agent-ui-diff-card__header {
318
+ display: flex;
319
+ justify-content: space-between;
320
+ gap: 0.65rem;
321
+ align-items: flex-start;
322
+ }
323
+
324
+ .agent-ui-badge {
325
+ font-size: 0.7rem;
326
+ letter-spacing: 0.18em;
327
+ text-transform: uppercase;
328
+ border: 1px solid rgba(248, 250, 252, 0.2);
329
+ padding: 0.2rem 0.7rem;
330
+ border-radius: 999px;
331
+ }
332
+
333
+ .agent-ui-diff-card[data-type="create"] .agent-ui-badge {
334
+ color: var(--agent-ui-success);
335
+ border-color: rgba(52, 211, 153, 0.35);
336
+ }
337
+
338
+ .agent-ui-diff-card[data-type="delete"] .agent-ui-badge {
339
+ color: var(--agent-ui-error);
340
+ border-color: rgba(248, 113, 113, 0.35);
341
+ }
342
+
343
+ .agent-ui-diff-card[data-type="update"] .agent-ui-badge {
344
+ color: var(--agent-ui-accent);
345
+ border-color: rgba(56, 189, 248, 0.35);
346
+ }
347
+
348
+ .agent-ui-diff-card .agent-ui-diff-preview {
349
+ margin: 0;
350
+ border-radius: 0.5rem;
351
+ padding: 0.75rem;
352
+ background: #0f172a;
353
+ color: #e2e8f0;
354
+ font-size: 0.85rem;
355
+ overflow-x: auto;
356
+ }
357
+
358
+ .agent-ui-telemetry__grid {
359
+ display: grid;
360
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
361
+ gap: 0.9rem;
362
+ }
363
+
364
+ .agent-ui-metric {
365
+ border: 1px solid var(--agent-ui-card-border);
366
+ border-radius: 12px;
367
+ padding: 0.75rem;
368
+ background: var(--agent-ui-card-bg);
369
+ }
370
+
371
+ .agent-ui-metric label {
372
+ display: block;
373
+ font-size: 0.7rem;
374
+ letter-spacing: 0.2em;
375
+ text-transform: uppercase;
376
+ color: var(--agent-ui-text-dim);
377
+ margin-bottom: 0.25rem;
378
+ }
379
+
380
+ .agent-ui-metric strong {
381
+ font-size: 1.3rem;
382
+ }
383
+
384
+ .agent-ui-console__log {
385
+ margin: 0;
386
+ padding: 0;
387
+ list-style: none;
388
+ max-height: 280px;
389
+ overflow-y: auto;
390
+ display: flex;
391
+ flex-direction: column;
392
+ gap: 0.5rem;
393
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
394
+ font-size: 0.85rem;
395
+ }
396
+
397
+ .agent-ui-console__entry {
398
+ display: flex;
399
+ gap: 0.5rem;
400
+ padding: 0.35rem 0.5rem;
401
+ border-radius: 0.35rem;
402
+ background: var(--agent-ui-card-bg);
403
+ border: 1px solid var(--agent-ui-card-border);
404
+ }
405
+
406
+ .agent-ui-console__timestamp {
407
+ color: rgba(148, 163, 184, 0.8);
408
+ }
409
+
410
+ .agent-ui-console__label {
411
+ font-weight: 600;
412
+ color: var(--agent-ui-accent);
413
+ }
414
+
415
+ .agent-ui-console__entry[data-level="warn"] {
416
+ border-color: rgba(250, 204, 21, 0.35);
417
+ color: var(--agent-ui-warn);
418
+ }
419
+
420
+ .agent-ui-console__entry[data-level="error"] {
421
+ border-color: rgba(248, 113, 113, 0.35);
422
+ color: var(--agent-ui-error);
423
+ }
424
+
425
+ .agent-ui-console__entry[data-level="debug"] .agent-ui-console__label {
426
+ color: var(--agent-ui-accent-strong);
427
+ }
428
+
429
+ :is(.agent-ui-plan-activity, .plan-activity-feed) {
430
+ display: flex;
431
+ flex-direction: column;
432
+ gap: 0.75rem;
433
+ }
434
+
435
+
436
+ .agent-ui-empty-state {
437
+ padding: 1rem;
438
+ border: 1px dashed var(--agent-ui-card-border);
439
+ border-radius: 12px;
440
+ text-align: center;
441
+ color: var(--agent-ui-text-dim);
442
+ background: var(--agent-ui-card-bg);
443
+ }
444
+
445
+ .message {
446
+ display: flex;
447
+ flex-direction: column;
448
+ gap: 0.45rem;
449
+ line-height: 1.5;
450
+ width: 100%;
451
+ }
452
+
453
+ .message.assistant {
454
+ align-items: flex-start;
455
+ }
456
+
457
+ .message-body {
458
+ white-space: normal;
459
+ }
460
+
461
+ .message-body.assistant {
462
+ padding: 0;
463
+ }
464
+
465
+ .message-content {
466
+ width: 100%;
467
+ overflow: visible;
468
+ max-width: 100%;
469
+ position: relative;
470
+ min-width: 0;
471
+ }
472
+
473
+ .message-content img {
474
+ max-width: 100%;
475
+ height: auto;
476
+ display: block;
477
+ border-radius: 0.85rem;
478
+ border: 1px solid var(--agent-ui-panel-border);
479
+ background: rgba(15, 23, 42, 0.45);
480
+ margin: 0.65rem 0 0;
481
+ box-shadow: 0 12px 28px rgba(2, 6, 23, 0.35);
482
+ }
483
+
484
+ .message-attachments {
485
+ display: flex;
486
+ flex-wrap: wrap;
487
+ gap: 0.75rem;
488
+ margin-top: 0.75rem;
489
+ }
490
+
491
+ .message-attachment {
492
+ margin: 0;
493
+ padding: 0;
494
+ border-radius: 1rem;
495
+ border: 1px solid var(--agent-ui-panel-border);
496
+ background: rgba(15, 23, 42, 0.4);
497
+ overflow: hidden;
498
+ flex: 0 1 180px;
499
+ max-width: 100%;
500
+ box-shadow: 0 14px 32px rgba(2, 6, 23, 0.45);
501
+ }
502
+
503
+ .message-attachment__button {
504
+ border: 0;
505
+ margin: 0;
506
+ padding: 0;
507
+ width: 100%;
508
+ display: block;
509
+ background: transparent;
510
+ cursor: zoom-in;
511
+ }
512
+
513
+ .message-attachment__button:focus-visible {
514
+ outline: 2px solid var(--agent-ui-accent);
515
+ outline-offset: -2px;
516
+ }
517
+
518
+ .agent-ui-theme-light .message-attachment,
519
+ .agent-ui-theme-light .message-content img {
520
+ background: rgba(255, 255, 255, 0.75);
521
+ border-color: rgba(148, 163, 184, 0.45);
522
+ box-shadow: 0 12px 28px rgba(15, 23, 42, 0.15);
523
+ }
524
+
525
+ .message-attachment img {
526
+ display: block;
527
+ width: 100%;
528
+ height: auto;
529
+ object-fit: contain;
530
+ max-height: 220px;
531
+ cursor: zoom-in;
532
+ }
533
+
534
+ .message-context {
535
+ margin-top: 0.75rem;
536
+ display: flex;
537
+ flex-direction: column;
538
+ gap: 0.3rem;
539
+ }
540
+
541
+ .message-context__label {
542
+ font-size: 0.75rem;
543
+ letter-spacing: 0.12em;
544
+ text-transform: uppercase;
545
+ color: var(--agent-ui-text-muted);
546
+ }
547
+
548
+ .message-context__chips {
549
+ display: flex;
550
+ flex-wrap: wrap;
551
+ gap: 0.4rem;
552
+ }
553
+
554
+ .message-context__chip {
555
+ display: inline-flex;
556
+ align-items: center;
557
+ gap: 0.35rem;
558
+ border-radius: 999px;
559
+ border: 1px solid var(--agent-ui-panel-border);
560
+ background: var(--agent-ui-pill-bg);
561
+ color: var(--agent-ui-text-primary);
562
+ padding: 0.15rem 0.75rem 0.15rem 0.5rem;
563
+ font-size: 0.82rem;
564
+ cursor: pointer;
565
+ transition: border-color 0.2s ease, color 0.2s ease, transform 0.15s ease;
566
+ }
567
+
568
+ .message-context__chip:hover {
569
+ border-color: var(--agent-ui-accent);
570
+ color: var(--agent-ui-accent);
571
+ transform: translateY(-1px);
572
+ }
573
+
574
+ .message-context__chip:focus {
575
+ outline: none;
576
+ border-color: var(--agent-ui-accent-strong);
577
+ box-shadow: 0 0 0 2px rgba(56, 189, 248, 0.25);
578
+ }
579
+
580
+ .message-context__chip-icon {
581
+ width: 18px;
582
+ height: 18px;
583
+ opacity: 0.8;
584
+ }
585
+
586
+ .message-context__chip-text {
587
+ white-space: nowrap;
588
+ }
589
+
590
+ .message-meta {
591
+ display: flex;
592
+ flex-direction: column;
593
+ gap: 0.35rem;
594
+ margin-top: 0.35rem;
595
+ color: var(--agent-ui-text-muted);
596
+ }
597
+
598
+ .message-meta__pills {
599
+ display: flex;
600
+ flex-wrap: wrap;
601
+ gap: 0.35rem;
602
+ }
603
+
604
+ .message-meta__pill {
605
+ display: inline-flex;
606
+ align-items: center;
607
+ gap: 0.25rem;
608
+ padding: 0.2rem 0.65rem;
609
+ border-radius: 999px;
610
+ border: 1px solid var(--agent-ui-panel-border);
611
+ background: var(--agent-ui-pill-bg);
612
+ font-size: 0.75rem;
613
+ letter-spacing: 0.02em;
614
+ }
615
+
616
+ .message-meta__files {
617
+ display: flex;
618
+ flex-wrap: wrap;
619
+ gap: 0.35rem;
620
+ }
621
+
622
+ .message-meta__file {
623
+ display: inline-flex;
624
+ align-items: center;
625
+ gap: 0.35rem;
626
+ padding: 0.25rem 0.65rem;
627
+ border-radius: 0.75rem;
628
+ border: 1px dashed var(--agent-ui-panel-border);
629
+ background: rgba(148, 163, 184, 0.08);
630
+ color: var(--agent-ui-text-primary);
631
+ font-size: 0.8rem;
632
+ cursor: pointer;
633
+ transition: border-color 0.2s ease, color 0.2s ease, transform 0.15s ease;
634
+ }
635
+
636
+ .message-meta__file:hover {
637
+ border-color: var(--agent-ui-accent);
638
+ color: var(--agent-ui-accent);
639
+ transform: translateY(-1px);
640
+ }
641
+
642
+ .message-meta__file:focus-visible {
643
+ outline: none;
644
+ border-color: var(--agent-ui-accent-strong);
645
+ box-shadow: 0 0 0 2px rgba(56, 189, 248, 0.25);
646
+ }
647
+
648
+ .message-meta__file svg {
649
+ width: 16px;
650
+ height: 16px;
651
+ }
652
+
653
+ .message-meta__file-text {
654
+ white-space: nowrap;
655
+ max-width: 12rem;
656
+ overflow: hidden;
657
+ text-overflow: ellipsis;
658
+ }
659
+
660
+ .message-code-block {
661
+ margin: 0.65rem 0;
662
+ border-radius: 0.9rem;
663
+ border: 1px solid rgba(var(--bandit-code-border-rgb, 31, 41, 55), 0.7);
664
+ background: rgba(var(--bandit-code-background-rgb, 15, 23, 42), 0.92);
665
+ overflow: hidden;
666
+ /* Constrain to parent width even when a flex/grid ancestor would
667
+ otherwise let us push past it. Without `min-width: 0`, a long
668
+ unbreakable line (e.g. an absolute path or minified JSON) inside
669
+ the inner <pre> grows the block instead of triggering its own
670
+ horizontal scroll, which then forces the entire chat column to
671
+ scroll horizontally. */
672
+ max-width: 100%;
673
+ min-width: 0;
674
+ }
675
+
676
+ .message-code-toolbar {
677
+ display: flex;
678
+ align-items: center;
679
+ justify-content: flex-start;
680
+ gap: 0.5rem;
681
+ padding: 0.45rem 0.85rem 0;
682
+ font-size: 0.65rem;
683
+ letter-spacing: 0.22em;
684
+ text-transform: uppercase;
685
+ color: rgba(var(--bandit-code-text-rgb, 226, 232, 240), 0.6);
686
+ }
687
+
688
+ .message-code-toolbar::after {
689
+ content: "";
690
+ flex: 1;
691
+ border-bottom: 1px solid rgba(var(--bandit-code-border-rgb, 31, 41, 55), 0.4);
692
+ margin-left: 0.5rem;
693
+ opacity: 0.6;
694
+ }
695
+
696
+ .message-code-label {
697
+ white-space: nowrap;
698
+ }
699
+
700
+ .message-code-copy {
701
+ margin-left: auto;
702
+ border: 1px solid rgba(var(--bandit-code-border-rgb, 31, 41, 55), 0.5);
703
+ background: transparent;
704
+ color: rgba(var(--bandit-code-text-rgb, 226, 232, 240), 0.9);
705
+ border-radius: 999px;
706
+ padding: 0.18rem 0.6rem;
707
+ font-size: 0.65rem;
708
+ letter-spacing: 0.18em;
709
+ text-transform: uppercase;
710
+ cursor: pointer;
711
+ transition: color 0.2s ease;
712
+ }
713
+
714
+ .message-code-copy.is-copied {
715
+ color: rgb(var(--bandit-success-rgb, 34, 197, 94));
716
+ border-color: rgba(var(--bandit-success-rgb, 34, 197, 94), 0.5);
717
+ }
718
+
719
+ /* Specificity bumped from `.message-code-block pre` to add `.markdown-message`
720
+ so this rule beats the generic `.markdown-message pre` rule below — both
721
+ had equal specificity, the markdown one came later, and the result was
722
+ the message-code-block outer card AND the markdown pre inner border
723
+ stacking into a nested-looking card. The inner pre should be flat
724
+ (transparent + no border) since the code-block wrapper already provides
725
+ the visual frame. */
726
+ .markdown-message .message-code-block pre,
727
+ .message-code-block pre {
728
+ margin: 0;
729
+ padding: 0.25rem 0.85rem 0.8rem;
730
+ background: transparent;
731
+ border: none;
732
+ border-radius: 0;
733
+ font-family: "JetBrains Mono", "SFMono-Regular", SFMono, Menlo, Consolas, "Liberation Mono", "Courier New", monospace;
734
+ font-size: 0.9rem;
735
+ line-height: 1.55;
736
+ overflow-x: auto;
737
+ text-decoration: none !important;
738
+ text-decoration-skip-ink: none;
739
+ }
740
+
741
+ .message-code-block code {
742
+ display: block;
743
+ background: transparent;
744
+ border: none;
745
+ padding: 0;
746
+ color: var(--bandit-code-text, #e2e8f0);
747
+ white-space: pre-wrap;
748
+ overflow-wrap: anywhere;
749
+ word-break: break-word;
750
+ font-size: 0.9rem;
751
+ text-decoration: none !important;
752
+ text-decoration-skip-ink: none;
753
+ }
754
+
755
+ .message-content code {
756
+ display: inline;
757
+ background: rgba(var(--bandit-code-background-rgb, 15, 23, 42), 0.55);
758
+ color: var(--bandit-code-text, #e2e8f0);
759
+ border-radius: 0.3rem;
760
+ padding: 0.08rem 0.3rem;
761
+ font-family: "JetBrains Mono", "SFMono-Regular", SFMono, Menlo, Consolas, "Liberation Mono", "Courier New", monospace;
762
+ font-size: 0.88em;
763
+ border: 1px solid rgba(var(--bandit-code-border-rgb, 31, 41, 55), 0.35);
764
+ text-decoration: none !important;
765
+ text-decoration-skip-ink: none;
766
+ /* Long inline paths/URLs/tokens must be allowed to break mid-token —
767
+ otherwise one absolute path inside the permission-resolved marker
768
+ forces the whole chat pane to grow a horizontal scrollbar (observed
769
+ 2026-04-22 on /Users/mark/Documents/GitHub/S3Api/... inside an
770
+ italic "allowed for session" line). `anywhere` + `break-word` cover
771
+ both absolute filesystem paths and hyphen-dense tokens. */
772
+ overflow-wrap: anywhere;
773
+ word-break: break-word;
774
+ }
775
+
776
+ .markdown-message pre {
777
+ margin: 0.85rem 0;
778
+ padding: 0.85rem 1rem;
779
+ background: rgba(var(--bandit-code-background-rgb, 15, 23, 42), 0.55);
780
+ border-radius: 0.85rem;
781
+ border: 1px solid rgba(var(--bandit-code-border-rgb, 31, 41, 55), 0.45);
782
+ overflow-x: auto;
783
+ }
784
+
785
+ .markdown-message pre code {
786
+ display: block;
787
+ background: transparent;
788
+ color: var(--bandit-code-text, #e2e8f0);
789
+ white-space: pre-wrap;
790
+ overflow-wrap: anywhere;
791
+ word-break: break-word;
792
+ font-family: "JetBrains Mono", "SFMono-Regular", SFMono, Menlo, Consolas, "Liberation Mono", "Courier New", monospace;
793
+ font-size: 0.95em;
794
+ }
795
+
796
+ @media (min-width: 1200px) {
797
+ .message-code-block code,
798
+ .markdown-message pre code {
799
+ white-space: pre;
800
+ overflow-wrap: normal;
801
+ word-break: normal;
802
+ }
803
+ }
804
+
805
+ .markdown-message a {
806
+ color: var(--agent-ui-accent);
807
+ text-decoration: underline;
808
+ text-underline-offset: 0.12em;
809
+ }
810
+
811
+ .markdown-message .hljs {
812
+ background: transparent;
813
+ }
814
+
815
+ /* highlight.js token colors — we render only the handful of token
816
+ classes we actually emit (diff addition/deletion/meta + a few core
817
+ code tokens for diff context). Scoped to .markdown-message so the
818
+ theme doesn't leak into other UI. Colors lean on CSS variables
819
+ where available so host themes can retune. */
820
+ .markdown-message .hljs-addition {
821
+ color: #4ade80;
822
+ background: rgba(34, 197, 94, 0.14);
823
+ display: inline-block;
824
+ width: 100%;
825
+ padding: 0 0.15rem;
826
+ }
827
+ .markdown-message .hljs-deletion {
828
+ color: #fca5a5;
829
+ background: rgba(239, 68, 68, 0.14);
830
+ display: inline-block;
831
+ width: 100%;
832
+ padding: 0 0.15rem;
833
+ }
834
+ .markdown-message .hljs-meta {
835
+ color: #93c5fd;
836
+ }
837
+ .markdown-message .hljs-string { color: #fbbf24; }
838
+ .markdown-message .hljs-keyword { color: #c4b5fd; }
839
+ .markdown-message .hljs-comment { color: #94a3b8; font-style: italic; }
840
+ .markdown-message .hljs-number { color: #f59e0b; }
841
+
842
+ /* Claude-style expandable diff card. The chat persists the card in
843
+ conversation history; `open` is set on short diffs, closed on long
844
+ ones so the transcript stays scannable. The <summary> carries the
845
+ +N −M stats and the caret. */
846
+ .markdown-message .bandit-diff-card {
847
+ margin: 0.85rem 0;
848
+ border: 1px solid rgba(var(--bandit-code-border-rgb, 31, 41, 55), 0.55);
849
+ border-radius: 0.85rem;
850
+ background: rgba(var(--bandit-code-background-rgb, 15, 23, 42), 0.55);
851
+ overflow: hidden;
852
+ }
853
+
854
+ .markdown-message .bandit-diff-card > pre {
855
+ margin: 0;
856
+ border: none;
857
+ border-radius: 0;
858
+ border-top: 1px solid rgba(var(--bandit-code-border-rgb, 31, 41, 55), 0.35);
859
+ background: transparent;
860
+ max-height: 24rem;
861
+ overflow: auto;
862
+ }
863
+
864
+ .markdown-message .bandit-diff-card__summary {
865
+ list-style: none;
866
+ display: flex;
867
+ align-items: center;
868
+ gap: 0.55rem;
869
+ padding: 0.55rem 0.85rem;
870
+ cursor: pointer;
871
+ user-select: none;
872
+ font-size: 0.85em;
873
+ color: rgba(var(--bandit-text-secondary-rgb, 200, 210, 220), 0.95);
874
+ }
875
+
876
+ .markdown-message .bandit-diff-card__summary::-webkit-details-marker { display: none; }
877
+ .markdown-message .bandit-diff-card__summary::before {
878
+ content: "▸";
879
+ display: inline-block;
880
+ transition: transform 140ms ease;
881
+ color: rgba(var(--bandit-text-muted-rgb, 140, 150, 160), 0.8);
882
+ font-size: 0.8em;
883
+ }
884
+ .markdown-message .bandit-diff-card[open] > .bandit-diff-card__summary::before {
885
+ transform: rotate(90deg);
886
+ }
887
+
888
+ .markdown-message .bandit-diff-card__icon {
889
+ color: rgba(var(--bandit-accent-rgb), 0.9);
890
+ font-size: 1em;
891
+ }
892
+ .markdown-message .bandit-diff-card__title {
893
+ font-weight: 600;
894
+ letter-spacing: 0.02em;
895
+ }
896
+ .markdown-message .bandit-diff-card__path {
897
+ font-family: "JetBrains Mono", "SFMono-Regular", Menlo, monospace;
898
+ font-size: 0.88em;
899
+ font-weight: 500;
900
+ color: rgba(var(--bandit-fg-rgb, 255 255 255), 0.88);
901
+ background: rgba(var(--bandit-accent-rgb), 0.08);
902
+ padding: 0.08em 0.45em;
903
+ border-radius: 4px;
904
+ overflow: hidden;
905
+ text-overflow: ellipsis;
906
+ white-space: nowrap;
907
+ max-width: 60%;
908
+ }
909
+ .markdown-message .bandit-diff-card__stats {
910
+ margin-left: auto;
911
+ font-family: "JetBrains Mono", "SFMono-Regular", Menlo, monospace;
912
+ font-size: 0.85em;
913
+ letter-spacing: 0.02em;
914
+ }
915
+ .markdown-message .bandit-diff-card__plus { color: #4ade80; }
916
+ .markdown-message .bandit-diff-card__minus { color: #fca5a5; }
917
+
918
+ /* Chain-of-thought reasoning block — collapsed by default. Dim gray
919
+ summary, monospace body when expanded. Renders as a <details> so
920
+ users can click to read the model's reasoning without it filling
921
+ the transcript. Emitted by the extension as ```bandit-reasoning```
922
+ fences from models with thinking mode on (Qwen 3.x, DeepSeek R1). */
923
+ .markdown-message .bandit-reasoning {
924
+ margin: 0.5rem 0;
925
+ padding: 0;
926
+ border-left: 2px solid rgba(var(--bandit-accent-rgb), 0.2);
927
+ padding-left: 0.75rem;
928
+ font-size: 0.85em;
929
+ color: var(--bandit-fg-muted, #8b8b8b);
930
+ }
931
+ .markdown-message .bandit-reasoning > summary {
932
+ cursor: pointer;
933
+ font-style: italic;
934
+ opacity: 0.75;
935
+ user-select: none;
936
+ padding: 0.15rem 0;
937
+ }
938
+ .markdown-message .bandit-reasoning > summary::marker {
939
+ color: rgba(var(--bandit-accent-rgb), 0.5);
940
+ }
941
+ .markdown-message .bandit-reasoning[open] > summary { opacity: 0.9; }
942
+ .markdown-message .bandit-reasoning__body {
943
+ margin: 0.35rem 0 0.25rem;
944
+ padding: 0.5rem 0.75rem;
945
+ background: rgba(128, 128, 128, 0.06);
946
+ border-radius: 4px;
947
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
948
+ font-size: 0.9em;
949
+ white-space: pre-wrap;
950
+ overflow-wrap: anywhere;
951
+ color: var(--bandit-fg-muted, #8b8b8b);
952
+ }
953
+
954
+ /* Tool-call timeline — one row per tool_execute. Consecutive rows share
955
+ a continuous vertical rail via the border-left on each row; a status
956
+ dot sits over the rail. Claude-Code-style chronological view. */
957
+ .markdown-message .bandit-tl-row {
958
+ position: relative;
959
+ display: flex;
960
+ align-items: baseline;
961
+ flex-wrap: wrap;
962
+ gap: 0.4rem 0.5rem;
963
+ margin: 0;
964
+ padding: 0.45rem 0 0.45rem 1.5rem;
965
+ border-left: 2px solid rgba(var(--bandit-accent-rgb), 0.18);
966
+ font-size: 0.92em;
967
+ line-height: 1.45;
968
+ }
969
+ .markdown-message .bandit-tl-row + .bandit-tl-row { margin-top: 0; }
970
+ .markdown-message .bandit-tl-row::before {
971
+ content: "";
972
+ position: absolute;
973
+ left: -5px;
974
+ top: 0.85em;
975
+ width: 8px;
976
+ height: 8px;
977
+ border-radius: 50%;
978
+ background: rgba(var(--bandit-accent-rgb), 0.85);
979
+ box-shadow: 0 0 0 2px rgba(var(--bandit-bg-rgb, 16 18 27), 1);
980
+ transition: background 0.2s ease;
981
+ }
982
+ .markdown-message .bandit-tl-row[data-status="running"]::before {
983
+ animation: bandit-tl-pulse 1.4s ease-in-out infinite;
984
+ }
985
+ .markdown-message .bandit-tl-row[data-status="done"]::before { background: #4ade80; }
986
+ .markdown-message .bandit-tl-row[data-status="error"]::before { background: #f87171; }
987
+ .markdown-message .bandit-tl-row[data-status="repeat"] { opacity: 0.6; }
988
+ .markdown-message .bandit-tl-row[data-status="repeat"]::before {
989
+ background: transparent;
990
+ border: 1.5px dashed rgba(var(--bandit-accent-rgb), 0.5);
991
+ box-shadow: none;
992
+ width: 7px;
993
+ height: 7px;
994
+ left: -4.5px;
995
+ }
996
+ .markdown-message .bandit-tl-row .bandit-tl-name {
997
+ font-weight: 600;
998
+ font-family: "JetBrains Mono", "SFMono-Regular", Menlo, monospace;
999
+ font-size: 0.9em;
1000
+ color: rgba(var(--bandit-fg-rgb, 255 255 255), 0.95);
1001
+ }
1002
+ .markdown-message .bandit-tl-row .bandit-tl-arg {
1003
+ font-family: "JetBrains Mono", "SFMono-Regular", Menlo, monospace;
1004
+ font-size: 0.85em;
1005
+ color: rgba(var(--bandit-fg-rgb, 255 255 255), 0.6);
1006
+ white-space: normal;
1007
+ overflow-wrap: anywhere;
1008
+ word-break: break-word;
1009
+ min-width: 0;
1010
+ flex: 1 1 0;
1011
+ }
1012
+ .markdown-message .bandit-tl-row .bandit-tl-tag {
1013
+ margin-left: auto;
1014
+ font-size: 0.72em;
1015
+ text-transform: uppercase;
1016
+ letter-spacing: 0.06em;
1017
+ opacity: 0.55;
1018
+ font-style: italic;
1019
+ }
1020
+ .markdown-message .bandit-tl-row .bandit-tl-dur {
1021
+ margin-left: auto;
1022
+ font-family: "JetBrains Mono", "SFMono-Regular", Menlo, monospace;
1023
+ font-size: 0.75em;
1024
+ opacity: 0.45;
1025
+ flex-shrink: 0;
1026
+ }
1027
+
1028
+ /* Agent status line — replaces `_⟳ pondering…_` italic with a compact
1029
+ pill that has a spinning spark. Renders inline-flex so it stays on
1030
+ its own line but aligns nicely next to other prose; the spark spins
1031
+ via CSS keyframes so users can tell the agent is still working even
1032
+ when the status text hasn't changed for a beat. */
1033
+ .markdown-message .bandit-status-line {
1034
+ display: inline-flex;
1035
+ align-items: center;
1036
+ gap: 0.5em;
1037
+ font-style: italic;
1038
+ font-size: 0.92em;
1039
+ padding: 0.16em 0.7em 0.16em 0.5em;
1040
+ /* Clearance so the breathing glow renders fully before the message padding /
1041
+ scroll container clips it (the left + bottom edges showed hard squares). */
1042
+ margin: 0.2em 0.35em 0.45em 0.3em;
1043
+ border-radius: 999px;
1044
+ background: rgba(var(--bandit-accent-rgb), 0.09);
1045
+ border: 1px solid rgba(var(--bandit-accent-rgb), 0.22);
1046
+ /* The pill itself breathes — a soft accent glow swelling in and out so
1047
+ the wait reads as "an agent is working", not a dead box. Slow + low
1048
+ amplitude with a non-zero baseline so it flows rather than blinks. */
1049
+ animation: bandit-status-glow 4s ease-in-out infinite;
1050
+ }
1051
+ /* Comet-orb icon. A glowing accent core that breathes (radial gradient +
1052
+ pulsing halo), ringed by a conic-gradient arc that sweeps around it
1053
+ (masked to a thin ring). Reads as energy/motion rather than the old
1054
+ flat ring spinner. */
1055
+ .markdown-message .bandit-status-line .bandit-status-spark {
1056
+ position: relative;
1057
+ display: inline-block;
1058
+ width: 0.95em;
1059
+ height: 0.95em;
1060
+ border-radius: 50%;
1061
+ flex-shrink: 0;
1062
+ box-sizing: border-box;
1063
+ background: radial-gradient(circle at center,
1064
+ rgba(var(--bandit-accent-rgb), 0.95) 0%,
1065
+ rgba(var(--bandit-accent-rgb), 0.32) 46%,
1066
+ transparent 72%);
1067
+ animation: bandit-status-orb 4s ease-in-out infinite;
1068
+ }
1069
+ .markdown-message .bandit-status-line .bandit-status-spark::before {
1070
+ content: "";
1071
+ position: absolute;
1072
+ inset: -1px;
1073
+ border-radius: 50%;
1074
+ background: conic-gradient(from 0deg,
1075
+ transparent 0deg,
1076
+ rgba(var(--bandit-accent-rgb), 0.5) 130deg,
1077
+ transparent 290deg);
1078
+ -webkit-mask: radial-gradient(farthest-side, transparent calc(100% - 1.6px), #000 calc(100% - 1.6px));
1079
+ mask: radial-gradient(farthest-side, transparent calc(100% - 1.6px), #000 calc(100% - 1.6px));
1080
+ animation: bandit-status-spin 3.4s linear infinite;
1081
+ }
1082
+ /* The phrase text gets a slow accent sheen sweeping across it — the
1083
+ classic "thinking" shimmer. Falls back to a flat accent tint under
1084
+ reduced-motion (below). */
1085
+ .markdown-message .bandit-status-line .bandit-status-text {
1086
+ font-family: inherit;
1087
+ }
1088
+ /* Each letter rides an accent "wave": a per-character animation-delay (set
1089
+ inline in the webview transform) makes the highlight travel across the
1090
+ phrase left-to-right, warming each letter to the accent color, swelling it
1091
+ slightly, and giving it a brief glow as the wave passes. Letters stay in
1092
+ the inherited theme foreground the rest of the time. */
1093
+ .markdown-message .bandit-status-line .bandit-status-char {
1094
+ display: inline-block;
1095
+ animation: bandit-status-wave 2.6s ease-in-out infinite;
1096
+ }
1097
+ /* Per-character stagger for the traveling wave. The delay lives here
1098
+ (not inline) because DOMPurify strips inline style from the rendered
1099
+ markdown; the class survives, so the sweep is driven by nth-child. */
1100
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(1) { animation-delay: 0.00s; }
1101
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(2) { animation-delay: 0.06s; }
1102
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(3) { animation-delay: 0.12s; }
1103
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(4) { animation-delay: 0.18s; }
1104
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(5) { animation-delay: 0.24s; }
1105
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(6) { animation-delay: 0.30s; }
1106
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(7) { animation-delay: 0.36s; }
1107
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(8) { animation-delay: 0.42s; }
1108
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(9) { animation-delay: 0.48s; }
1109
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(10) { animation-delay: 0.54s; }
1110
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(11) { animation-delay: 0.60s; }
1111
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(12) { animation-delay: 0.66s; }
1112
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(13) { animation-delay: 0.72s; }
1113
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(14) { animation-delay: 0.78s; }
1114
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(15) { animation-delay: 0.84s; }
1115
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(16) { animation-delay: 0.90s; }
1116
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(17) { animation-delay: 0.96s; }
1117
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(18) { animation-delay: 1.02s; }
1118
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(19) { animation-delay: 1.08s; }
1119
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(20) { animation-delay: 1.14s; }
1120
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(21) { animation-delay: 1.20s; }
1121
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(22) { animation-delay: 1.26s; }
1122
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(23) { animation-delay: 1.32s; }
1123
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(24) { animation-delay: 1.38s; }
1124
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(25) { animation-delay: 1.44s; }
1125
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(26) { animation-delay: 1.50s; }
1126
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(27) { animation-delay: 1.56s; }
1127
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(28) { animation-delay: 1.62s; }
1128
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(29) { animation-delay: 1.68s; }
1129
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(30) { animation-delay: 1.74s; }
1130
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(31) { animation-delay: 1.80s; }
1131
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(32) { animation-delay: 1.86s; }
1132
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(33) { animation-delay: 1.92s; }
1133
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(34) { animation-delay: 1.98s; }
1134
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(35) { animation-delay: 2.04s; }
1135
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(36) { animation-delay: 2.10s; }
1136
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(37) { animation-delay: 2.16s; }
1137
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(38) { animation-delay: 2.22s; }
1138
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(39) { animation-delay: 2.28s; }
1139
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(40) { animation-delay: 2.34s; }
1140
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(41) { animation-delay: 2.40s; }
1141
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(42) { animation-delay: 2.46s; }
1142
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(43) { animation-delay: 2.52s; }
1143
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(44) { animation-delay: 2.58s; }
1144
+ .markdown-message .bandit-status-line .bandit-status-char:nth-child(45) { animation-delay: 2.64s; }
1145
+ @keyframes bandit-status-spin {
1146
+ from { transform: rotate(0deg); }
1147
+ to { transform: rotate(360deg); }
1148
+ }
1149
+ @keyframes bandit-status-orb {
1150
+ 0%, 100% { transform: scale(0.97); box-shadow: 0 0 5px 0 rgba(var(--bandit-accent-rgb), 0.48); }
1151
+ 50% { transform: scale(1.05); box-shadow: 0 0 8px 0 rgba(var(--bandit-accent-rgb), 0.56); }
1152
+ }
1153
+ @keyframes bandit-status-glow {
1154
+ /* Peak reach kept modest (no positive spread) so the glow stays inside the
1155
+ pill's clearance margin and the message padding — a larger box-shadow got
1156
+ clipped to hard square edges by the chat panel / scroll container
1157
+ (overflow: hidden) at the left and bottom. */
1158
+ 0%, 100% { box-shadow: 0 0 7px -1px rgba(var(--bandit-accent-rgb), 0.3); border-color: rgba(var(--bandit-accent-rgb), 0.3); }
1159
+ 50% { box-shadow: 0 0 10px 0 rgba(var(--bandit-accent-rgb), 0.42); border-color: rgba(var(--bandit-accent-rgb), 0.46); }
1160
+ }
1161
+ @keyframes bandit-status-wave {
1162
+ 0%, 30%, 64%, 100% {
1163
+ transform: scale(1);
1164
+ text-shadow: none;
1165
+ }
1166
+ 47% {
1167
+ color: rgba(var(--bandit-accent-rgb), 1);
1168
+ transform: scale(1.12);
1169
+ text-shadow: 0 0 6px rgba(var(--bandit-accent-rgb), 0.5);
1170
+ }
1171
+ }
1172
+ @media (prefers-reduced-motion: reduce) {
1173
+ .markdown-message .bandit-status-line,
1174
+ .markdown-message .bandit-status-line .bandit-status-spark,
1175
+ .markdown-message .bandit-status-line .bandit-status-spark::before,
1176
+ .markdown-message .bandit-status-line .bandit-status-char {
1177
+ animation: none;
1178
+ }
1179
+ }
1180
+ .markdown-message .bandit-tl-row .bandit-tl-tag + .bandit-tl-dur {
1181
+ margin-left: 0.5rem;
1182
+ }
1183
+ @keyframes bandit-tl-pulse {
1184
+ 0%, 100% { box-shadow: 0 0 0 2px rgba(var(--bandit-bg-rgb, 16 18 27), 1), 0 0 0 0 rgba(var(--bandit-accent-rgb), 0.5); }
1185
+ 50% { box-shadow: 0 0 0 2px rgba(var(--bandit-bg-rgb, 16 18 27), 1), 0 0 0 5px rgba(var(--bandit-accent-rgb), 0); }
1186
+ }
1187
+
1188
+ /* Bash IN/OUT card — paired with `run_command` tool calls. Two rows:
1189
+ IN shows the command, OUT the captured stdout/stderr. Error runs
1190
+ get a red accent on the border + icon so failures pop visually. */
1191
+ .markdown-message .bandit-run-card {
1192
+ margin: 0.85rem 0;
1193
+ border: 1px solid rgba(var(--bandit-code-border-rgb, 31, 41, 55), 0.55);
1194
+ border-radius: 0.85rem;
1195
+ background: rgba(var(--bandit-code-background-rgb, 15, 23, 42), 0.55);
1196
+ overflow: hidden;
1197
+ font-size: 0.9em;
1198
+ }
1199
+ .markdown-message .bandit-run-card--error {
1200
+ border-color: rgba(239, 68, 68, 0.55);
1201
+ }
1202
+ .markdown-message .bandit-run-card__header {
1203
+ display: flex;
1204
+ align-items: center;
1205
+ gap: 0.5rem;
1206
+ padding: 0.5rem 0.85rem;
1207
+ border-bottom: 1px solid rgba(var(--bandit-code-border-rgb, 31, 41, 55), 0.35);
1208
+ font-weight: 600;
1209
+ letter-spacing: 0.02em;
1210
+ color: rgba(var(--bandit-text-secondary-rgb, 200, 210, 220), 0.95);
1211
+ }
1212
+ .markdown-message .bandit-run-card__icon {
1213
+ color: #4ade80;
1214
+ font-family: "JetBrains Mono", "SFMono-Regular", Menlo, monospace;
1215
+ }
1216
+ .markdown-message .bandit-run-card--error .bandit-run-card__icon {
1217
+ color: #fca5a5;
1218
+ }
1219
+ .markdown-message .bandit-run-card__label {
1220
+ color: inherit;
1221
+ }
1222
+ .markdown-message .bandit-run-card__row {
1223
+ display: grid;
1224
+ grid-template-columns: 3rem 1fr;
1225
+ gap: 0;
1226
+ padding: 0.4rem 0.85rem;
1227
+ align-items: start;
1228
+ }
1229
+ .markdown-message .bandit-run-card__row--in + .bandit-run-card__row--out {
1230
+ border-top: 1px dashed rgba(var(--bandit-code-border-rgb, 31, 41, 55), 0.3);
1231
+ }
1232
+ .markdown-message .bandit-run-card__tag {
1233
+ font-size: 0.7em;
1234
+ font-weight: 700;
1235
+ letter-spacing: 0.1em;
1236
+ color: rgba(var(--bandit-text-muted-rgb, 140, 150, 160), 0.85);
1237
+ padding-top: 0.15rem;
1238
+ user-select: none;
1239
+ }
1240
+ .markdown-message .bandit-run-card__cmd {
1241
+ font-family: "JetBrains Mono", "SFMono-Regular", Menlo, monospace;
1242
+ color: var(--bandit-code-text, #e2e8f0);
1243
+ background: transparent;
1244
+ padding: 0;
1245
+ white-space: pre-wrap;
1246
+ word-break: break-word;
1247
+ }
1248
+ .markdown-message .bandit-run-card__out {
1249
+ margin: 0;
1250
+ padding: 0;
1251
+ background: transparent;
1252
+ border: none;
1253
+ border-radius: 0;
1254
+ max-height: 18rem;
1255
+ overflow: auto;
1256
+ white-space: pre-wrap;
1257
+ font-size: 0.95em;
1258
+ }
1259
+ .markdown-message .bandit-run-card__out code {
1260
+ padding: 0;
1261
+ background: transparent;
1262
+ color: inherit;
1263
+ }
1264
+ .markdown-message .bandit-run-card__truncated {
1265
+ color: rgba(var(--bandit-text-muted-rgb, 140, 150, 160), 0.8);
1266
+ font-style: italic;
1267
+ }
1268
+
1269
+ /* Subagent card — emitted by the parent's `task` tool_result so the
1270
+ user can see what the scoped subagent did without cluttering the
1271
+ main transcript. Collapsible; open reveals the tool trace + the
1272
+ subagent's synopsis. */
1273
+ .markdown-message .bandit-subagent-card {
1274
+ margin: 0.85rem 0;
1275
+ border: 1px solid rgba(var(--bandit-code-border-rgb, 31, 41, 55), 0.55);
1276
+ border-left: 3px solid rgba(var(--bandit-accent-rgb), 0.6);
1277
+ border-radius: 0.85rem;
1278
+ background: rgba(var(--bandit-code-background-rgb, 15, 23, 42), 0.55);
1279
+ overflow: hidden;
1280
+ font-size: 0.9em;
1281
+ }
1282
+ .markdown-message .bandit-subagent-card--error {
1283
+ border-left-color: rgba(239, 68, 68, 0.7);
1284
+ }
1285
+ .markdown-message .bandit-subagent-card__summary {
1286
+ list-style: none;
1287
+ display: flex;
1288
+ flex-wrap: wrap;
1289
+ align-items: baseline;
1290
+ gap: 0.35rem 0.6rem;
1291
+ padding: 0.55rem 0.85rem;
1292
+ cursor: pointer;
1293
+ user-select: none;
1294
+ color: rgba(var(--bandit-text-secondary-rgb, 200, 210, 220), 0.95);
1295
+ }
1296
+ .markdown-message .bandit-subagent-card__summary::-webkit-details-marker { display: none; }
1297
+ .markdown-message .bandit-subagent-card__summary::before {
1298
+ content: "▸";
1299
+ display: inline-block;
1300
+ transition: transform 140ms ease;
1301
+ color: rgba(var(--bandit-text-muted-rgb, 140, 150, 160), 0.8);
1302
+ font-size: 0.8em;
1303
+ }
1304
+ .markdown-message .bandit-subagent-card[open] > .bandit-subagent-card__summary::before {
1305
+ transform: rotate(90deg);
1306
+ }
1307
+ .markdown-message .bandit-subagent-card__icon {
1308
+ color: rgba(var(--bandit-accent-rgb), 0.9);
1309
+ }
1310
+ .markdown-message .bandit-subagent-card__label {
1311
+ font-weight: 700;
1312
+ letter-spacing: 0.02em;
1313
+ }
1314
+ .markdown-message .bandit-subagent-card__goal {
1315
+ color: rgba(var(--bandit-text-primary-rgb, 230, 240, 250), 0.95);
1316
+ font-style: italic;
1317
+ flex: 1 1 240px;
1318
+ min-width: 0;
1319
+ white-space: normal;
1320
+ overflow-wrap: anywhere;
1321
+ word-break: break-word;
1322
+ }
1323
+ .markdown-message .bandit-subagent-card__stats {
1324
+ font-size: 0.8em;
1325
+ color: rgba(var(--bandit-text-muted-rgb, 140, 150, 160), 0.85);
1326
+ font-family: "JetBrains Mono", "SFMono-Regular", Menlo, monospace;
1327
+ flex-shrink: 0;
1328
+ }
1329
+ .markdown-message .bandit-subagent-card__warn {
1330
+ color: #fbbf24;
1331
+ }
1332
+ .markdown-message .bandit-subagent-card__trace {
1333
+ list-style: none;
1334
+ margin: 0;
1335
+ padding: 0.2rem 0.85rem 0.55rem 2.2rem;
1336
+ border-top: 1px dashed rgba(var(--bandit-code-border-rgb, 31, 41, 55), 0.3);
1337
+ }
1338
+ .markdown-message .bandit-subagent-card__tool {
1339
+ padding: 0.15rem 0;
1340
+ font-family: "JetBrains Mono", "SFMono-Regular", Menlo, monospace;
1341
+ font-size: 0.85em;
1342
+ color: rgba(var(--bandit-text-secondary-rgb, 200, 210, 220), 0.9);
1343
+ display: flex;
1344
+ flex-wrap: wrap;
1345
+ gap: 0.25rem 0.5rem;
1346
+ align-items: baseline;
1347
+ min-width: 0;
1348
+ overflow-wrap: anywhere;
1349
+ word-break: break-word;
1350
+ }
1351
+ .markdown-message .bandit-subagent-card__tool::before {
1352
+ content: "↳";
1353
+ color: rgba(var(--bandit-text-muted-rgb, 140, 150, 160), 0.6);
1354
+ }
1355
+ .markdown-message .bandit-subagent-card__tool--error {
1356
+ color: #fca5a5;
1357
+ }
1358
+ .markdown-message .bandit-subagent-card__tool-name {
1359
+ font-weight: 600;
1360
+ }
1361
+ .markdown-message .bandit-subagent-card__tool-primary {
1362
+ color: rgba(var(--bandit-text-muted-rgb, 140, 150, 160), 0.85);
1363
+ min-width: 0;
1364
+ overflow-wrap: anywhere;
1365
+ word-break: break-word;
1366
+ }
1367
+ .markdown-message .bandit-subagent-card__result {
1368
+ padding: 0.55rem 0.85rem 0.7rem;
1369
+ border-top: 1px dashed rgba(var(--bandit-code-border-rgb, 31, 41, 55), 0.3);
1370
+ }
1371
+ .markdown-message .bandit-subagent-card__result-label {
1372
+ font-size: 0.7em;
1373
+ font-weight: 700;
1374
+ letter-spacing: 0.1em;
1375
+ text-transform: uppercase;
1376
+ color: rgba(var(--bandit-text-muted-rgb, 140, 150, 160), 0.8);
1377
+ margin-bottom: 0.3rem;
1378
+ }
1379
+ .markdown-message .bandit-subagent-card__result pre {
1380
+ margin: 0;
1381
+ padding: 0;
1382
+ background: transparent;
1383
+ border: none;
1384
+ max-height: 20rem;
1385
+ overflow: auto;
1386
+ white-space: pre-wrap;
1387
+ }
1388
+ .markdown-message .bandit-subagent-card__result pre code {
1389
+ background: transparent;
1390
+ color: var(--bandit-code-text, #e2e8f0);
1391
+ font-family: inherit;
1392
+ font-size: 0.95em;
1393
+ }
1394
+
1395
+ .markdown-message {
1396
+ color: inherit;
1397
+ }
1398
+
1399
+ .markdown-message > *:first-child {
1400
+ margin-top: 0;
1401
+ }
1402
+
1403
+ .markdown-message > *:last-child {
1404
+ margin-bottom: 0;
1405
+ }
1406
+
1407
+ .markdown-message p {
1408
+ margin: 0.5rem 0;
1409
+ }
1410
+
1411
+ .markdown-message :is(h1, h2, h3, h4, h5, h6) {
1412
+ margin: 0.9rem 0 0.35rem;
1413
+ font-weight: 700;
1414
+ line-height: 1.25;
1415
+ }
1416
+
1417
+ .markdown-message h1 {
1418
+ font-size: 1.35em;
1419
+ }
1420
+
1421
+ .markdown-message h2 {
1422
+ font-size: 1.2em;
1423
+ }
1424
+
1425
+ .markdown-message h3 {
1426
+ font-size: 1.05em;
1427
+ }
1428
+
1429
+ .markdown-message h4 {
1430
+ font-size: 0.98em;
1431
+ }
1432
+
1433
+ .markdown-message h5,
1434
+ .markdown-message h6 {
1435
+ font-size: 0.92em;
1436
+ }
1437
+
1438
+ .markdown-message ul,
1439
+ .markdown-message ol {
1440
+ margin: 0.45rem 0 0.65rem;
1441
+ padding-left: 1.2rem;
1442
+ }
1443
+
1444
+ .markdown-message li {
1445
+ margin: 0.2rem 0;
1446
+ }
1447
+
1448
+ .markdown-message li::marker {
1449
+ color: var(--agent-ui-text-muted);
1450
+ }
1451
+
1452
+ .markdown-message li > ul,
1453
+ .markdown-message li > ol {
1454
+ margin-top: 0.3rem;
1455
+ }
1456
+
1457
+ .markdown-message blockquote {
1458
+ margin: 0.65rem 0;
1459
+ padding: 0.5rem 0.85rem;
1460
+ border-left: 3px solid var(--agent-ui-accent);
1461
+ background: rgba(15, 23, 42, 0.35);
1462
+ color: var(--agent-ui-text-muted);
1463
+ border-radius: 0.65rem;
1464
+ }
1465
+
1466
+ .agent-ui-theme-light .markdown-message blockquote {
1467
+ background: rgba(15, 23, 42, 0.06);
1468
+ }
1469
+
1470
+ .markdown-message code:not(pre code) {
1471
+ display: inline;
1472
+ background: rgba(var(--bandit-code-background-rgb, 15, 23, 42), 0.55);
1473
+ color: var(--bandit-code-text, #e2e8f0);
1474
+ border-radius: 0.3rem;
1475
+ padding: 0.08rem 0.3rem;
1476
+ font-family: "JetBrains Mono", "SFMono-Regular", SFMono, Menlo, Consolas, "Liberation Mono", "Courier New",
1477
+ monospace;
1478
+ font-size: 0.88em;
1479
+ border: 1px solid rgba(var(--bandit-code-border-rgb, 31, 41, 55), 0.35);
1480
+ text-decoration: none !important;
1481
+ text-decoration-skip-ink: none;
1482
+ }
1483
+
1484
+ .markdown-message table {
1485
+ border-collapse: collapse;
1486
+ margin: 0.75rem 0;
1487
+ width: 100%;
1488
+ display: block;
1489
+ overflow-x: auto;
1490
+ max-width: 100%;
1491
+ /* `min-width: 0` lets the block shrink past its content size when
1492
+ it sits inside a flex/grid ancestor (the chat bubble does). With
1493
+ this, `overflow-x: auto` actually fires on long content instead
1494
+ of pushing the chat column. */
1495
+ min-width: 0;
1496
+ }
1497
+
1498
+ .markdown-message table thead,
1499
+ .markdown-message table tbody,
1500
+ .markdown-message table tr {
1501
+ display: table;
1502
+ width: 100%;
1503
+ /* Switched from `table-layout: auto` to `fixed`. Auto sizes cells
1504
+ to their content, which means a long path in one cell could grow
1505
+ the row past 100% of the parent — combined with the row-level
1506
+ `display: table` trick that's the cause of the chat-column
1507
+ horizontal scroll on tables. Fixed layout assigns equal column
1508
+ widths from the first row's cell count, then unbreakable cell
1509
+ content wraps via the overflow-wrap rule below instead of
1510
+ widening the row. */
1511
+ table-layout: fixed;
1512
+ }
1513
+
1514
+ .markdown-message table th,
1515
+ .markdown-message table td {
1516
+ border: 1px solid var(--agent-ui-panel-border);
1517
+ padding: 0.4rem 0.6rem;
1518
+ text-align: left;
1519
+ vertical-align: top;
1520
+ /* Allow cells to wrap long inline content (paths, URLs, code spans).
1521
+ Without these, an unbreakable token in one cell forces the whole
1522
+ row past the table's `display: block` constraint and triggers
1523
+ horizontal scroll on the chat column. */
1524
+ overflow-wrap: anywhere;
1525
+ word-break: break-word;
1526
+ min-width: 0;
1527
+ }
1528
+
1529
+ .markdown-message table thead {
1530
+ background: rgba(148, 163, 184, 0.14);
1531
+ }
1532
+
1533
+ .markdown-message table tbody tr:nth-child(odd) {
1534
+ background: rgba(148, 163, 184, 0.08);
1535
+ }
1536
+
1537
+ .agent-ui-theme-light .markdown-message table thead {
1538
+ background: rgba(148, 163, 184, 0.2);
1539
+ }
1540
+
1541
+ .agent-ui-theme-light .markdown-message table tbody tr:nth-child(odd) {
1542
+ background: rgba(15, 23, 42, 0.04);
1543
+ }
1544
+
1545
+ .message-code-block *,
1546
+ .message-code-block *::before,
1547
+ .message-code-block *::after {
1548
+ text-decoration-line: none !important;
1549
+ text-decoration-style: initial !important;
1550
+ text-decoration-color: inherit !important;
1551
+ text-decoration-thickness: auto !important;
1552
+ text-underline-offset: 0 !important;
1553
+ text-decoration-skip-ink: none !important;
1554
+ text-shadow: none !important;
1555
+ }
1556
+
1557
+ .plan-activity-host {
1558
+ display: flex;
1559
+ flex-direction: column;
1560
+ gap: 0.6rem;
1561
+ margin: 0 0 0.75rem;
1562
+ }
1563
+
1564
+ .message.assistant.plan-activity {
1565
+ animation: planActivityPop 0.35s ease-out;
1566
+ margin-bottom: 0.65rem;
1567
+ }
1568
+
1569
+ .plan-activity-row {
1570
+ display: flex;
1571
+ align-items: flex-start;
1572
+ gap: 0.65rem;
1573
+ position: relative;
1574
+ padding-bottom: 0.6rem;
1575
+ }
1576
+
1577
+ .plan-activity-row::before {
1578
+ content: "";
1579
+ position: absolute;
1580
+ top: calc(1.6rem + 0.2rem);
1581
+ left: 0.8rem;
1582
+ width: 2px;
1583
+ height: calc(100% - 1.6rem - 0.2rem);
1584
+ background: var(--timeline-color, rgba(149, 209, 255, 0.18));
1585
+ }
1586
+
1587
+ .message.assistant.plan-activity:last-of-type .plan-activity-row::before {
1588
+ display: none;
1589
+ }
1590
+
1591
+ .plan-activity-icon {
1592
+ display: inline-flex;
1593
+ align-items: center;
1594
+ justify-content: center;
1595
+ width: 1.6rem;
1596
+ height: 1.6rem;
1597
+ border-radius: 50%;
1598
+ color: rgba(149, 209, 255, 0.95);
1599
+ background: rgba(149, 209, 255, 0.14);
1600
+ flex-shrink: 0;
1601
+ position: relative;
1602
+ }
1603
+
1604
+ .plan-activity-icon svg {
1605
+ width: 1rem;
1606
+ height: 1rem;
1607
+ }
1608
+
1609
+ .plan-activity-icon.plan-activity-complete {
1610
+ color: rgba(123, 228, 149, 0.95);
1611
+ background: rgba(123, 228, 149, 0.16);
1612
+ }
1613
+
1614
+ .plan-activity-icon.plan-activity-error,
1615
+ .plan-activity-icon.plan-activity-needs-revision {
1616
+ color: rgba(255, 177, 153, 0.95);
1617
+ background: rgba(255, 177, 153, 0.16);
1618
+ }
1619
+
1620
+ .plan-activity-text {
1621
+ display: flex;
1622
+ flex-direction: column;
1623
+ gap: 0.25rem;
1624
+ }
1625
+
1626
+ .plan-activity-title {
1627
+ margin: 0 0 0.35rem;
1628
+ font-weight: 600;
1629
+ font-size: 0.95rem;
1630
+ }
1631
+
1632
+ .plan-activity-summary {
1633
+ margin: 0;
1634
+ font-size: 0.85rem;
1635
+ opacity: 0.85;
1636
+ }
1637
+
1638
+ @keyframes planActivityPop {
1639
+ from {
1640
+ opacity: 0;
1641
+ transform: translateY(12px);
1642
+ }
1643
+ to {
1644
+ opacity: 1;
1645
+ transform: translateY(0);
1646
+ }
1647
+ }
1648
+ :is(.agent-ui-plan-step, .plan-card-step).is-pending {
1649
+ opacity: 0.85;
1650
+ }
1651
+
1652
+ .agent-summary-card {
1653
+ border-radius: 14px;
1654
+ border: 1px solid rgba(63, 191, 115, 0.18);
1655
+ background: linear-gradient(135deg, rgba(63, 191, 115, 0.14), rgba(63, 191, 115, 0.05));
1656
+ padding: 0.9rem 0.95rem;
1657
+ display: flex;
1658
+ flex-direction: column;
1659
+ gap: 0.75rem;
1660
+ box-shadow: 0 18px 40px rgba(0, 0, 0, 0.18);
1661
+ }
1662
+
1663
+ .agent-summary-card[data-state="attention"] {
1664
+ border-color: rgba(255, 187, 0, 0.3);
1665
+ background: linear-gradient(135deg, rgba(255, 187, 0, 0.16), rgba(255, 187, 0, 0.06));
1666
+ box-shadow: 0 18px 40px rgba(255, 187, 0, 0.16);
1667
+ }
1668
+
1669
+ .agent-summary-header {
1670
+ display: flex;
1671
+ flex-wrap: wrap;
1672
+ align-items: center;
1673
+ gap: 0.6rem;
1674
+ }
1675
+
1676
+ .agent-summary-status {
1677
+ padding: 0.18rem 0.6rem;
1678
+ border-radius: 999px;
1679
+ font-size: 0.68rem;
1680
+ letter-spacing: 0.16em;
1681
+ text-transform: uppercase;
1682
+ background: rgba(63, 191, 115, 0.2);
1683
+ border: 1px solid rgba(63, 191, 115, 0.4);
1684
+ }
1685
+
1686
+ .agent-summary-card[data-state="attention"] .agent-summary-status {
1687
+ background: rgba(255, 187, 0, 0.22);
1688
+ border-color: rgba(255, 187, 0, 0.45);
1689
+ }
1690
+
1691
+ .agent-summary-metrics {
1692
+ font-size: 0.7rem;
1693
+ letter-spacing: 0.12em;
1694
+ text-transform: uppercase;
1695
+ opacity: 0.7;
1696
+ }
1697
+
1698
+ .agent-summary-body {
1699
+ display: flex;
1700
+ flex-direction: column;
1701
+ gap: 0.75rem;
1702
+ }
1703
+
1704
+ .agent-summary-section {
1705
+ display: flex;
1706
+ flex-direction: column;
1707
+ gap: 0.35rem;
1708
+ }
1709
+
1710
+ .agent-summary-label {
1711
+ font-size: 0.68rem;
1712
+ letter-spacing: 0.16em;
1713
+ text-transform: uppercase;
1714
+ opacity: 0.7;
1715
+ }
1716
+
1717
+ .agent-summary-goal,
1718
+ .agent-summary-feedback,
1719
+ .agent-summary-backup {
1720
+ margin: 0;
1721
+ font-size: 0.82rem;
1722
+ line-height: 1.5;
1723
+ opacity: 0.85;
1724
+ }
1725
+
1726
+ .agent-summary-files,
1727
+ .agent-summary-context {
1728
+ list-style: none;
1729
+ padding: 0;
1730
+ margin: 0;
1731
+ display: flex;
1732
+ flex-direction: column;
1733
+ gap: 0.35rem;
1734
+ }
1735
+
1736
+ .agent-summary-file,
1737
+ .agent-summary-context li {
1738
+ display: flex;
1739
+ align-items: center;
1740
+ gap: 0.4rem;
1741
+ font-size: 0.78rem;
1742
+ justify-content: space-between;
1743
+ width: 100%;
1744
+ }
1745
+
1746
+ .agent-summary-file-meta {
1747
+ font-size: 0.68rem;
1748
+ letter-spacing: 0.08em;
1749
+ opacity: 0.65;
1750
+ }
1751
+
1752
+ .agent-summary-file-link {
1753
+ font-size: 0.78rem;
1754
+ letter-spacing: 0.08em;
1755
+ }
1756
+
1757
+ .agent-summary-diff {
1758
+ gap: 0.4rem;
1759
+ }
1760
+
1761
+ .agent-summary-diff-header {
1762
+ display: flex;
1763
+ align-items: center;
1764
+ justify-content: space-between;
1765
+ gap: 0.4rem;
1766
+ }
1767
+
1768
+ .agent-summary-diff-body {
1769
+ border-radius: 8px;
1770
+ background: rgba(0, 0, 0, 0.35);
1771
+ padding: 0.55rem 0.65rem;
1772
+ max-height: 260px;
1773
+ overflow-y: auto;
1774
+ overflow-x: auto;
1775
+ font-family: ui-monospace, SFMono-Regular, SFMono, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
1776
+ font-size: 0.78rem;
1777
+ line-height: 1.45;
1778
+ white-space: pre-wrap;
1779
+ word-break: break-word;
1780
+ overflow-wrap: anywhere;
1781
+ width: 100%;
1782
+ max-width: 100%;
1783
+ margin: 0.4rem 0 0;
1784
+ box-sizing: border-box;
1785
+ }
1786
+
1787
+ .agent-summary-diff-body.diff-rendered {
1788
+ padding: 0;
1789
+ background: none;
1790
+ font-family: inherit;
1791
+ white-space: normal;
1792
+ }
1793
+
1794
+ .agent-summary-diff-body.diff-rendered .diff-viewer {
1795
+ border-radius: 8px;
1796
+ background: rgba(0, 0, 0, 0.35);
1797
+ padding: 0.55rem 0.65rem;
1798
+ width: 100%;
1799
+ max-width: 100%;
1800
+ margin: 0;
1801
+ box-sizing: border-box;
1802
+ overflow-x: auto;
1803
+ }
1804
+
1805
+ .diff-block {
1806
+ margin: 0;
1807
+ padding: 0;
1808
+ background: transparent;
1809
+ border: none;
1810
+ font: inherit;
1811
+ color: inherit;
1812
+ white-space: pre-wrap;
1813
+ word-break: break-word;
1814
+ overflow-wrap: anywhere;
1815
+ }
1816
+
1817
+ .diff-block code {
1818
+ display: block;
1819
+ padding: 0;
1820
+ white-space: inherit;
1821
+ }
1822
+
1823
+ .diff-block code.language-diff .diff-line {
1824
+ display: grid;
1825
+ grid-template-columns: minmax(4.1rem, auto) 1fr;
1826
+ gap: 0.5rem;
1827
+ padding: 0.25rem 0.6rem;
1828
+ border-radius: 4px;
1829
+ border-left: 3px solid transparent;
1830
+ margin: 0;
1831
+ font-family: ui-monospace, SFMono-Regular, SFMono, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
1832
+ font-size: 0.79rem;
1833
+ line-height: 1.45;
1834
+ white-space: pre-wrap;
1835
+ word-break: break-word;
1836
+ overflow-wrap: anywhere;
1837
+ align-items: stretch;
1838
+ }
1839
+
1840
+ .diff-block code.language-diff .diff-line__numbers {
1841
+ display: inline-flex;
1842
+ gap: 0.45rem;
1843
+ align-items: baseline;
1844
+ justify-content: flex-end;
1845
+ font-size: 0.7rem;
1846
+ font-variant-numeric: tabular-nums;
1847
+ color: var(--agent-ui-text-muted);
1848
+ opacity: 0.85;
1849
+ background: var(--agent-ui-diff-line-num-bg);
1850
+ border: 1px solid var(--agent-ui-diff-line-num-border);
1851
+ border-radius: 6px;
1852
+ padding: 0.1rem 0.35rem;
1853
+ height: fit-content;
1854
+ }
1855
+
1856
+ .diff-block code.language-diff .diff-line__numbers span {
1857
+ min-width: 2.1rem;
1858
+ text-align: right;
1859
+ }
1860
+
1861
+ .diff-block code.language-diff .diff-line__numbers span + span {
1862
+ border-left: 1px solid var(--agent-ui-diff-line-num-border);
1863
+ padding-left: 0.45rem;
1864
+ }
1865
+
1866
+ .diff-block code.language-diff .diff-line__content {
1867
+ display: block;
1868
+ white-space: inherit;
1869
+ }
1870
+
1871
+ .diff-block code.language-diff .diff-line.diff-meta .diff-line__numbers,
1872
+ .diff-block code.language-diff .diff-line.diff-hunk .diff-line__numbers {
1873
+ opacity: 0.6;
1874
+ }
1875
+
1876
+ .diff-block code.language-diff .diff-line.diff-add {
1877
+ background: var(--agent-ui-diff-add-bg);
1878
+ color: var(--agent-ui-diff-add-text);
1879
+ border-left-color: rgba(34, 197, 94, 0.7);
1880
+ }
1881
+
1882
+ .diff-block code.language-diff .diff-line.diff-del {
1883
+ background: var(--agent-ui-diff-del-bg);
1884
+ color: var(--agent-ui-diff-del-text);
1885
+ border-left-color: rgba(248, 113, 113, 0.7);
1886
+ }
1887
+
1888
+ .diff-block code.language-diff .diff-line.diff-hunk {
1889
+ background: var(--agent-ui-diff-hunk-bg);
1890
+ color: var(--agent-ui-diff-hunk-text);
1891
+ border-left-color: rgba(56, 189, 248, 0.55);
1892
+ }
1893
+
1894
+ .diff-block code.language-diff .diff-line.diff-meta {
1895
+ color: var(--agent-ui-diff-meta-text);
1896
+ }
1897
+
1898
+ .agent-summary-diff-body.empty {
1899
+ display: flex;
1900
+ align-items: center;
1901
+ justify-content: center;
1902
+ font-size: 0.72rem;
1903
+ letter-spacing: 0.12em;
1904
+ text-transform: uppercase;
1905
+ opacity: 0.6;
1906
+ }
1907
+
1908
+ .agent-summary-diff-collection {
1909
+ gap: 0.6rem;
1910
+ }
1911
+
1912
+ .agent-summary-diff-list {
1913
+ display: flex;
1914
+ flex-direction: column;
1915
+ gap: 0.65rem;
1916
+ }
1917
+
1918
+ .agent-summary-diff-item {
1919
+ border: 1px solid rgba(255, 255, 255, 0.12);
1920
+ border-radius: 10px;
1921
+ padding: 0.6rem 0.7rem;
1922
+ background: rgba(0, 0, 0, 0.28);
1923
+ display: flex;
1924
+ flex-direction: column;
1925
+ gap: 0.45rem;
1926
+ }
1927
+
1928
+ .agent-summary-diff-item-header {
1929
+ display: flex;
1930
+ align-items: center;
1931
+ justify-content: space-between;
1932
+ gap: 0.6rem;
1933
+ }
1934
+
1935
+ .agent-summary-diff-item-title {
1936
+ display: flex;
1937
+ flex-direction: column;
1938
+ gap: 0.25rem;
1939
+ min-width: 0;
1940
+ }
1941
+
1942
+ .agent-summary-diff-actions {
1943
+ display: flex;
1944
+ gap: 0.35rem;
1945
+ flex-shrink: 0;
1946
+ }
1947
+
1948
+ .agent-summary-diff-summary {
1949
+ margin: 0.45rem 0 0;
1950
+ font-size: 0.72rem;
1951
+ letter-spacing: 0.12em;
1952
+ text-transform: uppercase;
1953
+ opacity: 0.6;
1954
+ }
1955
+
1956
+ .agent-summary-diff-actions .link-button {
1957
+ font-size: 0.68rem;
1958
+ letter-spacing: 0.12em;
1959
+ }
1960
+
1961
+ .diff-review-panel {
1962
+ border: 1px solid var(--agent-ui-panel-border);
1963
+ border-radius: 14px;
1964
+ padding: 0.85rem 1rem;
1965
+ background: var(--agent-ui-panel-bg);
1966
+ display: flex;
1967
+ flex-direction: column;
1968
+ gap: 0.85rem;
1969
+ }
1970
+
1971
+ .diff-review-header {
1972
+ display: flex;
1973
+ align-items: center;
1974
+ justify-content: space-between;
1975
+ gap: 0.65rem;
1976
+ }
1977
+
1978
+ .diff-review-eyebrow {
1979
+ margin: 0;
1980
+ font-size: 0.68rem;
1981
+ letter-spacing: 0.3em;
1982
+ text-transform: uppercase;
1983
+ opacity: 0.65;
1984
+ }
1985
+
1986
+ .diff-review-title {
1987
+ margin: 0.1rem 0 0;
1988
+ font-size: 0.95rem;
1989
+ letter-spacing: 0.08em;
1990
+ text-transform: uppercase;
1991
+ }
1992
+
1993
+ .diff-review-metrics {
1994
+ font-size: 0.72rem;
1995
+ letter-spacing: 0.12em;
1996
+ text-transform: uppercase;
1997
+ opacity: 0.7;
1998
+ }
1999
+
2000
+ .diff-review-list {
2001
+ display: flex;
2002
+ flex-direction: column;
2003
+ gap: 0.6rem;
2004
+ }
2005
+
2006
+ .diff-review-file {
2007
+ border-radius: 10px;
2008
+ border: 1px solid var(--agent-ui-card-border);
2009
+ background: var(--agent-ui-card-bg);
2010
+ overflow: hidden;
2011
+ }
2012
+
2013
+ .diff-review-file-summary {
2014
+ list-style: none;
2015
+ display: flex;
2016
+ align-items: center;
2017
+ justify-content: space-between;
2018
+ gap: 0.6rem;
2019
+ padding: 0.65rem 0.8rem;
2020
+ cursor: pointer;
2021
+ }
2022
+
2023
+ .diff-review-file-summary::-webkit-details-marker {
2024
+ display: none;
2025
+ }
2026
+
2027
+ .diff-review-file-meta {
2028
+ display: flex;
2029
+ align-items: center;
2030
+ gap: 0.45rem;
2031
+ flex-wrap: wrap;
2032
+ font-size: 0.8rem;
2033
+ letter-spacing: 0.03em;
2034
+ }
2035
+
2036
+ .diff-review-file-link {
2037
+ font-size: 0.8rem;
2038
+ letter-spacing: 0.08em;
2039
+ }
2040
+
2041
+ .diff-review-file-label {
2042
+ font-size: 0.8rem;
2043
+ letter-spacing: 0.03em;
2044
+ opacity: 0.85;
2045
+ }
2046
+
2047
+ .diff-review-chip {
2048
+ display: inline-flex;
2049
+ align-items: center;
2050
+ padding: 0.12rem 0.45rem;
2051
+ border-radius: 999px;
2052
+ background: var(--agent-ui-pill-bg);
2053
+ color: var(--agent-ui-pill-color);
2054
+ font-size: 0.65rem;
2055
+ letter-spacing: 0.08em;
2056
+ text-transform: uppercase;
2057
+ opacity: 0.8;
2058
+ }
2059
+
2060
+ .diff-review-file-actions {
2061
+ display: flex;
2062
+ gap: 0.4rem;
2063
+ flex-shrink: 0;
2064
+ }
2065
+
2066
+ .diff-review-file-body {
2067
+ padding: 0.65rem 0.8rem 0.8rem;
2068
+ border-top: 1px solid var(--agent-ui-panel-border);
2069
+ display: flex;
2070
+ flex-direction: column;
2071
+ gap: 0.55rem;
2072
+ }
2073
+
2074
+ .diff-review-diff {
2075
+ border-radius: 8px;
2076
+ background: var(--agent-ui-diff-surface);
2077
+ border: 1px solid var(--agent-ui-panel-border);
2078
+ max-height: 460px;
2079
+ overflow: auto;
2080
+ }
2081
+
2082
+ .diff-review-note {
2083
+ border-radius: 8px;
2084
+ background: rgba(255, 255, 255, 0.04);
2085
+ padding: 0.55rem 0.65rem;
2086
+ font-size: 0.78rem;
2087
+ line-height: 1.5;
2088
+ opacity: 0.85;
2089
+ }
2090
+
2091
+ .diff-review-note p {
2092
+ margin: 0;
2093
+ }
2094
+
2095
+ .agent-summary-review {
2096
+ margin: 0.5rem 0 0;
2097
+ padding: 0.6rem 0.7rem;
2098
+ border-radius: 8px;
2099
+ background: rgba(255, 255, 255, 0.04);
2100
+ font-size: 0.76rem;
2101
+ line-height: 1.5;
2102
+ opacity: 0.9;
2103
+ }
2104
+
2105
+ .agent-summary-review p {
2106
+ margin: 0 0 0.4rem;
2107
+ }
2108
+
2109
+ .agent-summary-review ul {
2110
+ margin: 0.4rem 0 0;
2111
+ padding-left: 1.2rem;
2112
+ }
2113
+
2114
+ .agent-summary-review li {
2115
+ margin: 0.2rem 0;
2116
+ }
2117
+
2118
+ .agent-summary-backup-line {
2119
+ margin: 0;
2120
+ font-size: 0.68rem;
2121
+ letter-spacing: 0.08em;
2122
+ text-transform: uppercase;
2123
+ opacity: 0.55;
2124
+ }
2125
+
2126
+ .agent-summary-details {
2127
+ border-top: 1px solid rgba(255, 255, 255, 0.08);
2128
+ padding-top: 0.45rem;
2129
+ }
2130
+
2131
+ .agent-summary-details > summary {
2132
+ cursor: pointer;
2133
+ font-size: 0.72rem;
2134
+ letter-spacing: 0.12em;
2135
+ text-transform: uppercase;
2136
+ opacity: 0.7;
2137
+ }
2138
+
2139
+ .agent-summary-details[open] > summary {
2140
+ opacity: 1;
2141
+ }
2142
+
2143
+ .agent-summary-markdown {
2144
+ margin-top: 0.45rem;
2145
+ }
2146
+
2147
+ .diff-review-header {
2148
+ display: flex;
2149
+ align-items: center;
2150
+ gap: 0.6rem;
2151
+ font-size: 0.82rem;
2152
+ margin-bottom: 0.45rem;
2153
+ }
2154
+
2155
+ .diff-review-badge {
2156
+ display: inline-flex;
2157
+ align-items: center;
2158
+ padding: 0.15rem 0.45rem;
2159
+ border-radius: 999px;
2160
+ font-size: 0.75rem;
2161
+ font-weight: 600;
2162
+ background: rgba(255, 214, 102, 0.18);
2163
+ color: #ffd666;
2164
+ letter-spacing: 0.01em;
2165
+ text-transform: uppercase;
2166
+ }
2167
+
2168
+ .diff-review-path {
2169
+ font-size: 0.82rem;
2170
+ opacity: 0.75;
2171
+ }
2172
+
2173
+ .diff-review-message {
2174
+ margin: 0 0 0.6rem;
2175
+ font-size: 0.9rem;
2176
+ }
2177
+
2178
+ .diff-review-actions {
2179
+ display: flex;
2180
+ gap: 0.5rem;
2181
+ flex-wrap: wrap;
2182
+ }
2183
+
2184
+ .diff-review-button {
2185
+ border: none;
2186
+ border-radius: 4px;
2187
+ padding: 0.45rem 0.9rem;
2188
+ font-size: 0.85rem;
2189
+ font-weight: 600;
2190
+ cursor: pointer;
2191
+ transition: transform 0.15s ease, opacity 0.15s ease;
2192
+ }
2193
+
2194
+ .diff-review-button:disabled {
2195
+ opacity: 0.55;
2196
+ cursor: default;
2197
+ }
2198
+
2199
+ .diff-review-button.pending {
2200
+ position: relative;
2201
+ }
2202
+
2203
+ .diff-review-button.pending::after {
2204
+ content: "";
2205
+ position: absolute;
2206
+ inset: 0;
2207
+ border-radius: inherit;
2208
+ background: rgba(255, 255, 255, 0.08);
2209
+ animation: pulsePending 0.9s ease-in-out infinite;
2210
+ }
2211
+
2212
+ .diff-review-primary {
2213
+ background: rgba(123, 228, 149, 0.2);
2214
+ color: #7be495;
2215
+ }
2216
+
2217
+ .diff-review-secondary {
2218
+ background: rgba(149, 209, 255, 0.16);
2219
+ color: #95d1ff;
2220
+ }
2221
+
2222
+ .diff-review-danger {
2223
+ background: rgba(255, 177, 153, 0.2);
2224
+ color: #ffb199;
2225
+ }
2226
+
2227
+ .diff-review-status {
2228
+ margin: 0.55rem 0 0;
2229
+ font-size: 0.82rem;
2230
+ opacity: 0.75;
2231
+ }
2232
+
2233
+ .diff-review-status::before {
2234
+ content: "";
2235
+ display: inline-block;
2236
+ width: 0.45rem;
2237
+ height: 0.45rem;
2238
+ border-radius: 50%;
2239
+ margin-right: 0.4rem;
2240
+ background: currentColor;
2241
+ opacity: 0.75;
2242
+ }
2243
+
2244
+ .diff-review[data-state="apply"] .diff-review-status {
2245
+ color: #7be495;
2246
+ }
2247
+
2248
+ .diff-review[data-state="explain"] .diff-review-status {
2249
+ color: #95d1ff;
2250
+ }
2251
+
2252
+ .diff-review[data-state="discard"] .diff-review-status {
2253
+ color: #ffb199;
2254
+ }
2255
+
2256
+ .diff-review[data-state="error"] .diff-review-status {
2257
+ color: #ff9f9f;
2258
+ }
2259
+
2260
+ @keyframes pulsePending {
2261
+ 0% {
2262
+ opacity: 0.3;
2263
+ }
2264
+ 50% {
2265
+ opacity: 0.6;
2266
+ }
2267
+ 100% {
2268
+ opacity: 0.3;
2269
+ }
2270
+ }
2271
+
2272
+ .diff-review.diff-review-complete {
2273
+ animation: diffReviewFade 0.35s ease forwards;
2274
+ }
2275
+
2276
+ @keyframes diffReviewFade {
2277
+ to {
2278
+ opacity: 0;
2279
+ transform: translateY(6px);
2280
+ }
2281
+ }
2282
+ .link-button {
2283
+ border: none;
2284
+ background: none;
2285
+ color: var(--agent-ui-accent);
2286
+ font-size: 0.75rem;
2287
+ letter-spacing: 0.12em;
2288
+ text-transform: uppercase;
2289
+ font-weight: 600;
2290
+ padding: 0;
2291
+ align-self: flex-start;
2292
+ cursor: pointer;
2293
+ }
2294
+
2295
+ .link-button:hover {
2296
+ text-decoration: underline;
2297
+ }
2298
+
2299
+ .link-button:disabled {
2300
+ opacity: 0.4;
2301
+ cursor: default;
2302
+ text-decoration: none;
2303
+ }
2304
+
2305
+ .link-button.disabled {
2306
+ opacity: 0.4;
2307
+ cursor: default;
2308
+ text-decoration: none;
2309
+ pointer-events: none;
2310
+ }
2311
+ .bandit-stealth-root textarea {
2312
+ font: inherit;
2313
+ }
2314
+
2315
+ .composer {
2316
+ position: relative;
2317
+ display: flex;
2318
+ align-items: stretch;
2319
+ width: 100%;
2320
+ max-width: 100%;
2321
+ background: rgba(14, 20, 37, 0.75);
2322
+ border: 1px solid var(--agent-ui-panel-border);
2323
+ border-radius: 14px;
2324
+ padding: 0.3rem 2.75rem 0.35rem 0.55rem;
2325
+ transition: border-color 0.2s ease, box-shadow 0.2s ease;
2326
+ min-height: 60px;
2327
+ overflow: visible;
2328
+ box-sizing: border-box;
2329
+ min-width: 0;
2330
+ }
2331
+
2332
+ /* ── Inline permission card ─────────────────────────────────────────────── */
2333
+ .permission-card {
2334
+ margin: 0.75rem 0;
2335
+ padding: 0.85rem 1rem;
2336
+ border-radius: 10px;
2337
+ border: 1px solid var(--agent-ui-panel-border);
2338
+ background: rgba(234, 179, 8, 0.06);
2339
+ border-left: 3px solid var(--agent-ui-warning, #eab308);
2340
+ }
2341
+ .permission-card.is-resolved {
2342
+ opacity: 0.7;
2343
+ background: transparent;
2344
+ border-left-color: var(--agent-ui-success, #4ade80);
2345
+ }
2346
+ .permission-card.is-denied {
2347
+ border-left-color: var(--agent-ui-error, #f87171);
2348
+ }
2349
+ .permission-card__header {
2350
+ display: flex;
2351
+ align-items: flex-start;
2352
+ gap: 0.65rem;
2353
+ margin-bottom: 0.5rem;
2354
+ }
2355
+ .permission-card__icon {
2356
+ flex: 0 0 auto;
2357
+ width: 1.5rem;
2358
+ height: 1.5rem;
2359
+ display: inline-flex;
2360
+ align-items: center;
2361
+ justify-content: center;
2362
+ border-radius: 999px;
2363
+ background: var(--agent-ui-warning, #eab308);
2364
+ color: #1e1e1e;
2365
+ font-weight: 700;
2366
+ font-size: 0.9rem;
2367
+ }
2368
+ .permission-card.is-resolved .permission-card__icon {
2369
+ background: var(--agent-ui-success, #4ade80);
2370
+ }
2371
+ .permission-card.is-denied .permission-card__icon {
2372
+ background: var(--agent-ui-error, #f87171);
2373
+ }
2374
+ .permission-card__title { flex: 1 1 auto; min-width: 0; }
2375
+ .permission-card__tool {
2376
+ font-weight: 600;
2377
+ color: var(--agent-ui-text-primary);
2378
+ }
2379
+ .permission-card__tool code {
2380
+ padding: 0.05rem 0.35rem;
2381
+ background: rgba(120, 140, 200, 0.15);
2382
+ border-radius: 4px;
2383
+ font-family: var(--vscode-editor-font-family, ui-monospace, monospace);
2384
+ }
2385
+ .permission-card__primary {
2386
+ font-family: var(--vscode-editor-font-family, ui-monospace, monospace);
2387
+ font-size: 0.85em;
2388
+ color: var(--agent-ui-text-muted);
2389
+ margin-top: 0.15rem;
2390
+ word-break: break-all;
2391
+ }
2392
+ .permission-card__desc {
2393
+ font-size: 0.9em;
2394
+ color: var(--agent-ui-text-secondary);
2395
+ margin: 0.4rem 0;
2396
+ }
2397
+ .permission-card__risk {
2398
+ display: flex;
2399
+ align-items: baseline;
2400
+ gap: 0.5rem;
2401
+ margin: 0.45rem 0 0.55rem;
2402
+ color: var(--agent-ui-text-secondary);
2403
+ font-size: 0.84em;
2404
+ line-height: 1.45;
2405
+ }
2406
+ .permission-card__risk-label {
2407
+ flex: 0 0 auto;
2408
+ color: var(--agent-ui-warning, #eab308);
2409
+ font-weight: 700;
2410
+ text-transform: uppercase;
2411
+ letter-spacing: 0.02em;
2412
+ }
2413
+ .permission-card__risk > span:last-child {
2414
+ min-width: 0;
2415
+ overflow-wrap: anywhere;
2416
+ }
2417
+ .permission-card__preview {
2418
+ margin: 0.5rem 0 0.6rem;
2419
+ padding: 0.5rem 0.75rem;
2420
+ background: var(--agent-ui-code-background, rgba(0, 0, 0, 0.25));
2421
+ border-radius: 6px;
2422
+ font-size: 0.82em;
2423
+ max-height: 180px;
2424
+ overflow-y: auto;
2425
+ white-space: pre-wrap;
2426
+ }
2427
+
2428
+ /* Warning pill rendered above the diff when the write targets a new
2429
+ file and the prompt implied editing an existing one. Subtle enough
2430
+ not to alarm, loud enough to catch the eye before Allow is clicked. */
2431
+ .permission-card__warning {
2432
+ display: flex;
2433
+ align-items: flex-start;
2434
+ gap: 0.5rem;
2435
+ margin: 0.5rem 0 0.6rem;
2436
+ padding: 0.45rem 0.65rem;
2437
+ border-radius: 6px;
2438
+ background: rgba(234, 179, 8, 0.12);
2439
+ border: 1px solid rgba(234, 179, 8, 0.35);
2440
+ color: rgba(254, 240, 138, 0.95);
2441
+ font-size: 0.82em;
2442
+ line-height: 1.4;
2443
+ }
2444
+ .permission-card__warning-icon {
2445
+ flex: 0 0 auto;
2446
+ font-size: 1em;
2447
+ line-height: 1;
2448
+ padding-top: 1px;
2449
+ }
2450
+
2451
+ /* Claude-style collapsed diff: default view is a single-line summary
2452
+ "Modified · +N -M" with the first changed line as a hint. Click to
2453
+ expand and see the full diff. Collapsing cuts the permission-card
2454
+ height by ~70% on typical writes. */
2455
+ .permission-card__diff {
2456
+ margin: 0.5rem 0 0.6rem;
2457
+ border-radius: 6px;
2458
+ overflow: hidden;
2459
+ }
2460
+ .permission-card__diff-summary {
2461
+ display: flex;
2462
+ align-items: center;
2463
+ gap: 0.5rem;
2464
+ width: 100%;
2465
+ padding: 0.35rem 0.6rem;
2466
+ background: var(--agent-ui-code-background, rgba(0, 0, 0, 0.25));
2467
+ border: 1px solid var(--agent-ui-panel-border, rgba(100, 116, 139, 0.3));
2468
+ border-radius: 6px;
2469
+ color: var(--agent-ui-text-primary);
2470
+ font: inherit;
2471
+ font-size: 0.8em;
2472
+ cursor: pointer;
2473
+ transition: background 0.12s ease, border-color 0.12s ease;
2474
+ text-align: left;
2475
+ }
2476
+ .permission-card__diff-summary:hover {
2477
+ background: var(--agent-ui-panel-bg, rgba(14, 20, 37, 0.7));
2478
+ }
2479
+ .permission-card__diff.is-expanded .permission-card__diff-summary {
2480
+ border-bottom-left-radius: 0;
2481
+ border-bottom-right-radius: 0;
2482
+ border-bottom-color: transparent;
2483
+ }
2484
+ .permission-card__diff-label {
2485
+ font-weight: 600;
2486
+ letter-spacing: 0.02em;
2487
+ }
2488
+ .permission-card__diff-stats {
2489
+ display: inline-flex;
2490
+ gap: 0.4rem;
2491
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, monospace;
2492
+ font-size: 0.95em;
2493
+ }
2494
+ .permission-card__diff-added {
2495
+ color: rgb(134, 239, 172);
2496
+ background: rgba(34, 197, 94, 0.14);
2497
+ padding: 0 0.35rem;
2498
+ border-radius: 3px;
2499
+ }
2500
+ .permission-card__diff-removed {
2501
+ color: rgb(252, 165, 165);
2502
+ background: rgba(239, 68, 68, 0.14);
2503
+ padding: 0 0.35rem;
2504
+ border-radius: 3px;
2505
+ }
2506
+ .permission-card__diff-first-line {
2507
+ flex: 1 1 auto;
2508
+ min-width: 0;
2509
+ color: rgba(203, 213, 225, 0.75);
2510
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, monospace;
2511
+ font-size: 0.9em;
2512
+ white-space: nowrap;
2513
+ overflow: hidden;
2514
+ text-overflow: ellipsis;
2515
+ }
2516
+ .permission-card__diff-chevron {
2517
+ flex: 0 0 auto;
2518
+ opacity: 0.55;
2519
+ font-size: 0.85em;
2520
+ }
2521
+ .permission-card__diff.is-expanded .permission-card__preview {
2522
+ margin-top: 0;
2523
+ border-top-left-radius: 0;
2524
+ border-top-right-radius: 0;
2525
+ }
2526
+ /* Vertical-stacked choice rows — one per line, numbered keyboard
2527
+ shortcut on the left, label on the right, full-width click target.
2528
+ Matches Claude Code's approval-card density. */
2529
+ .permission-card__choices {
2530
+ display: flex;
2531
+ flex-direction: column;
2532
+ gap: 0.35rem;
2533
+ margin-top: 0.5rem;
2534
+ }
2535
+ .permission-card__choice {
2536
+ display: flex;
2537
+ align-items: center;
2538
+ gap: 0.7rem;
2539
+ width: 100%;
2540
+ padding: 0.55rem 0.85rem;
2541
+ border-radius: 6px;
2542
+ border: 1px solid var(--agent-ui-panel-border);
2543
+ background: var(--agent-ui-panel-bg, rgba(14, 20, 37, 0.55));
2544
+ color: var(--agent-ui-text-primary);
2545
+ font: inherit;
2546
+ font-size: 0.9em;
2547
+ cursor: pointer;
2548
+ text-align: left;
2549
+ transition: background 0.15s ease, border-color 0.15s ease;
2550
+ }
2551
+ .permission-card__choice-key {
2552
+ display: inline-flex;
2553
+ align-items: center;
2554
+ justify-content: center;
2555
+ width: 1.4rem;
2556
+ height: 1.4rem;
2557
+ border-radius: 4px;
2558
+ background: rgba(120, 140, 200, 0.18);
2559
+ color: var(--agent-ui-text-muted);
2560
+ font-size: 0.8em;
2561
+ font-weight: 600;
2562
+ flex-shrink: 0;
2563
+ }
2564
+ .permission-card__choice-label {
2565
+ flex: 1 1 auto;
2566
+ }
2567
+ .permission-card__choice:hover:not(:disabled) {
2568
+ background: rgba(120, 140, 200, 0.15);
2569
+ border-color: var(--agent-ui-accent, #38bdf8);
2570
+ }
2571
+ .permission-card__choice:disabled {
2572
+ cursor: default;
2573
+ opacity: 0.55;
2574
+ }
2575
+ .permission-card__choice.is-selected {
2576
+ border-color: var(--agent-ui-accent, #38bdf8);
2577
+ background: rgba(56, 189, 248, 0.18);
2578
+ opacity: 1;
2579
+ }
2580
+ .permission-card__choice--once { font-weight: 600; }
2581
+ .permission-card__choice--deny { color: var(--agent-ui-error, #f87171); }
2582
+ .permission-card__choice--deny .permission-card__choice-key {
2583
+ background: rgba(248, 113, 113, 0.18);
2584
+ }
2585
+
2586
+ /* Full-command / param block — monospace code panel sitting above
2587
+ the choices. Users audit the exact command text here before
2588
+ approving. Wraps long lines rather than forcing horizontal scroll. */
2589
+ .permission-card__command {
2590
+ margin: 0.5rem 0;
2591
+ padding: 0.55rem 0.7rem;
2592
+ border-radius: 6px;
2593
+ border: 1px solid var(--agent-ui-panel-border);
2594
+ background: rgba(0, 0, 0, 0.25);
2595
+ font-family: var(--vscode-editor-font-family, ui-monospace, "SFMono-Regular", Menlo, monospace);
2596
+ font-size: 0.82em;
2597
+ line-height: 1.45;
2598
+ white-space: pre-wrap;
2599
+ word-break: break-all;
2600
+ overflow-wrap: anywhere;
2601
+ color: var(--agent-ui-text-primary);
2602
+ max-height: 12rem;
2603
+ overflow-y: auto;
2604
+ }
2605
+ .permission-card__command > code { background: transparent; padding: 0; }
2606
+ .permission-card__notes {
2607
+ display: flex;
2608
+ flex-direction: column;
2609
+ gap: 0.5rem;
2610
+ margin-top: 0.25rem;
2611
+ }
2612
+ .permission-card__notes-input {
2613
+ width: 100%;
2614
+ padding: 0.55rem 0.7rem;
2615
+ border-radius: 6px;
2616
+ border: 1px solid var(--agent-ui-panel-border);
2617
+ background: var(--agent-ui-panel-bg, rgba(14, 20, 37, 0.55));
2618
+ color: var(--agent-ui-text-primary);
2619
+ font: inherit;
2620
+ font-size: 0.88em;
2621
+ line-height: 1.45;
2622
+ resize: vertical;
2623
+ min-height: 4.5rem;
2624
+ box-sizing: border-box;
2625
+ }
2626
+ .permission-card__notes-input:focus {
2627
+ outline: none;
2628
+ border-color: var(--agent-ui-accent, #38bdf8);
2629
+ box-shadow: 0 0 0 2px rgba(56, 189, 248, 0.15);
2630
+ }
2631
+ .permission-card__notes-actions {
2632
+ display: flex;
2633
+ justify-content: flex-end;
2634
+ gap: 0.4rem;
2635
+ }
2636
+ .permission-card__notes-hint {
2637
+ display: block;
2638
+ font-size: 0.78em;
2639
+ color: var(--agent-ui-text-muted);
2640
+ margin-top: 0.2rem;
2641
+ opacity: 0.8;
2642
+ }
2643
+
2644
+ /* Approval queue container — sits directly above the composer.
2645
+ Holds ONE permission card at a time. Subsequent requests wait in a
2646
+ queue (rendered in-place as the head resolves) so the user clicks
2647
+ the same spot on repeat without scroll jitter or cards flooding
2648
+ the transcript. */
2649
+ .approval-queue-container {
2650
+ margin: 0.5rem 0 0.6rem;
2651
+ padding: 0;
2652
+ animation: approval-queue-slide-in 140ms ease-out;
2653
+ }
2654
+ .approval-queue-count {
2655
+ font-size: 0.78em;
2656
+ color: var(--agent-ui-text-muted);
2657
+ margin-bottom: 0.3rem;
2658
+ padding-left: 0.15rem;
2659
+ opacity: 0.85;
2660
+ }
2661
+ @keyframes approval-queue-slide-in {
2662
+ 0% { opacity: 0; transform: translateY(4px); }
2663
+ 100% { opacity: 1; transform: translateY(0); }
2664
+ }
2665
+
2666
+ /* Compact placeholder that shows inline in the transcript while a
2667
+ permission is pending. Replaces the full inline card so the chat
2668
+ scrollback stays readable — the interactive UI lives above the
2669
+ composer via the approval queue. */
2670
+ .permission-placeholder {
2671
+ /* `display: flex` (not inline-flex) so the card respects the parent
2672
+ width instead of growing to fit a long path. `flex-wrap: wrap`
2673
+ lets the icon + label + hint break onto multiple lines on a
2674
+ narrow chat pane. `min-width: 0` is the sibling fix for
2675
+ flex-children — without it, an unbreakable token (like a long
2676
+ absolute path) pushes the whole row past 100% width and the
2677
+ chat column scrolls horizontally. The path itself wraps via
2678
+ overflow-wrap on the label below. */
2679
+ display: flex;
2680
+ flex-wrap: wrap;
2681
+ align-items: center;
2682
+ gap: 0.5rem;
2683
+ margin: 0.35rem 0;
2684
+ padding: 0.35rem 0.6rem;
2685
+ border-radius: 5px;
2686
+ border: 1px dashed rgba(120, 140, 200, 0.35);
2687
+ background: rgba(120, 140, 200, 0.06);
2688
+ color: var(--agent-ui-text-muted);
2689
+ font-size: 0.9em;
2690
+ max-width: 100%;
2691
+ min-width: 0;
2692
+ }
2693
+ .permission-placeholder__icon {
2694
+ opacity: 0.8;
2695
+ flex-shrink: 0;
2696
+ /* SVG inherits this color via stroke="currentColor". */
2697
+ color: currentColor;
2698
+ }
2699
+ .permission-placeholder__label {
2700
+ /* The label holds the long path string after the bullet. Allow it
2701
+ to wrap mid-token (paths and URLs have no natural break points)
2702
+ and to shrink past its content size inside the flex parent. */
2703
+ flex: 1 1 auto;
2704
+ min-width: 0;
2705
+ overflow-wrap: anywhere;
2706
+ word-break: break-word;
2707
+ }
2708
+ .permission-placeholder__label > code {
2709
+ background: rgba(0, 0, 0, 0.2);
2710
+ padding: 0.05rem 0.3rem;
2711
+ border-radius: 3px;
2712
+ font-size: 0.92em;
2713
+ }
2714
+ .permission-placeholder__primary {
2715
+ opacity: 0.85;
2716
+ overflow-wrap: anywhere;
2717
+ word-break: break-word;
2718
+ }
2719
+ .permission-placeholder__hint {
2720
+ margin-left: 0.5rem;
2721
+ font-size: 0.85em;
2722
+ opacity: 0.75;
2723
+ font-style: italic;
2724
+ flex-shrink: 0;
2725
+ }
2726
+ .permission-placeholder__fallback {
2727
+ margin-left: 0.5rem;
2728
+ font-size: 0.85em;
2729
+ }
2730
+ .permission-placeholder__fallback > summary {
2731
+ cursor: pointer;
2732
+ opacity: 0.7;
2733
+ }
2734
+ .permission-placeholder__fallback > summary:hover { opacity: 1; }
2735
+ .permission-card__resolved {
2736
+ margin-top: 0.55rem;
2737
+ font-size: 0.85em;
2738
+ color: var(--agent-ui-text-muted);
2739
+ }
2740
+
2741
+ .composer-slash-menu {
2742
+ position: absolute;
2743
+ bottom: calc(100% + 4px);
2744
+ left: 0;
2745
+ right: 0;
2746
+ display: flex;
2747
+ flex-direction: column;
2748
+ background: var(--agent-ui-panel-bg, rgba(14, 20, 37, 0.98));
2749
+ border: 1px solid var(--agent-ui-panel-border);
2750
+ border-radius: 10px;
2751
+ padding: 4px;
2752
+ max-height: 220px;
2753
+ overflow-y: auto;
2754
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.5);
2755
+ z-index: 20;
2756
+ }
2757
+
2758
+ .composer-slash-item {
2759
+ display: flex;
2760
+ align-items: baseline;
2761
+ gap: 0.75rem;
2762
+ padding: 0.45rem 0.7rem;
2763
+ border: none;
2764
+ background: transparent;
2765
+ color: var(--agent-ui-text-primary);
2766
+ font: inherit;
2767
+ text-align: left;
2768
+ border-radius: 6px;
2769
+ cursor: pointer;
2770
+ }
2771
+
2772
+ .composer-slash-item.is-active,
2773
+ .composer-slash-item:hover {
2774
+ background: rgba(120, 140, 200, 0.12);
2775
+ }
2776
+
2777
+ /* Folder entries in the @-mention picker drill in on select rather
2778
+ than committing, so style them as a visual cue: slightly bolder,
2779
+ a dim folder glyph prefix via ::before. Keeps file vs folder
2780
+ distinguishable at a glance without another column. */
2781
+ .composer-slash-item.is-directory .composer-slash-name {
2782
+ font-weight: 700;
2783
+ }
2784
+ .composer-slash-item.is-directory .composer-slash-name::before {
2785
+ content: "▸ ";
2786
+ color: var(--agent-ui-text-muted);
2787
+ margin-right: 0.15rem;
2788
+ }
2789
+
2790
+ .composer-slash-name {
2791
+ font-family: var(--vscode-editor-font-family, ui-monospace, monospace);
2792
+ color: var(--agent-ui-accent, #38bdf8);
2793
+ font-weight: 600;
2794
+ }
2795
+
2796
+ .composer-slash-desc {
2797
+ font-size: 0.85em;
2798
+ color: var(--agent-ui-text-muted);
2799
+ overflow: hidden;
2800
+ text-overflow: ellipsis;
2801
+ white-space: nowrap;
2802
+ }
2803
+
2804
+ .agent-ui-theme-light .composer {
2805
+ background: rgba(247, 249, 252, 0.98) !important;
2806
+ border-color: rgba(148, 163, 184, 0.32) !important;
2807
+ color: #0f172a !important;
2808
+ box-shadow: 0 8px 22px rgba(15, 23, 42, 0.06) !important;
2809
+ }
2810
+
2811
+ .composer:focus-within {
2812
+ border-color: rgba(14, 99, 156, 0.6);
2813
+ box-shadow: none;
2814
+ }
2815
+
2816
+ .composer-input {
2817
+ position: relative;
2818
+ display: flex;
2819
+ flex-direction: column;
2820
+ gap: 0.25rem;
2821
+ flex: 1;
2822
+ width: 100%;
2823
+ min-width: 0;
2824
+ padding-left: 0.75rem;
2825
+ padding-right: 0.5rem;
2826
+ box-sizing: border-box;
2827
+ }
2828
+
2829
+ .composer-controls {
2830
+ display: flex;
2831
+ align-items: center;
2832
+ gap: 0.35rem;
2833
+ margin-left: 0.2rem;
2834
+ padding-top: 0.05rem;
2835
+ padding-bottom: 0.05rem;
2836
+ }
2837
+
2838
+ .composer-auto-context {
2839
+ display: inline-flex;
2840
+ align-items: center;
2841
+ gap: 0.35rem;
2842
+ border-radius: 999px;
2843
+ border: 1px solid rgba(56, 189, 248, 0.4);
2844
+ background: rgba(15, 23, 42, 0.6);
2845
+ color: rgba(226, 232, 240, 0.85);
2846
+ padding: 0.25rem 0.85rem;
2847
+ font-size: 0.78rem;
2848
+ letter-spacing: 0.08em;
2849
+ text-transform: uppercase;
2850
+ cursor: pointer;
2851
+ transition: color 0.2s ease, border-color 0.2s ease, background 0.2s ease;
2852
+ }
2853
+
2854
+ .agent-ui-theme-light .composer-auto-context {
2855
+ border-color: rgba(100, 116, 139, 0.45);
2856
+ background: rgba(241, 245, 249, 0.95);
2857
+ color: #0f172a;
2858
+ }
2859
+
2860
+ .composer-auto-context svg {
2861
+ width: 1rem;
2862
+ height: 1rem;
2863
+ }
2864
+
2865
+ .composer-auto-context.is-active {
2866
+ color: #38bdf8;
2867
+ border-color: rgba(56, 189, 248, 0.75);
2868
+ background: rgba(56, 189, 248, 0.16);
2869
+ }
2870
+
2871
+ .composer-auto-context:disabled {
2872
+ opacity: 0.45;
2873
+ cursor: not-allowed;
2874
+ }
2875
+
2876
+ .composer-attachments {
2877
+ display: flex;
2878
+ flex-wrap: wrap;
2879
+ gap: 0.5rem;
2880
+ margin-bottom: 0.25rem;
2881
+ }
2882
+
2883
+ .composer-attachment {
2884
+ position: relative;
2885
+ display: flex;
2886
+ align-items: center;
2887
+ gap: 0.45rem;
2888
+ padding: 0.35rem 0.9rem 0.35rem 0.5rem;
2889
+ border-radius: 999px;
2890
+ border: 1px solid rgba(148, 163, 184, 0.4);
2891
+ background: rgba(14, 23, 44, 0.65);
2892
+ color: inherit;
2893
+ max-width: 100%;
2894
+ }
2895
+
2896
+ .agent-ui-theme-light .composer-attachment {
2897
+ background: rgba(226, 232, 240, 0.9);
2898
+ border-color: rgba(148, 163, 184, 0.6);
2899
+ }
2900
+
2901
+ .composer-attachment__icon {
2902
+ width: 1.25rem;
2903
+ height: 1.25rem;
2904
+ display: inline-flex;
2905
+ align-items: center;
2906
+ justify-content: center;
2907
+ opacity: 0.7;
2908
+ }
2909
+
2910
+ .composer-attachment__icon svg {
2911
+ width: 1rem;
2912
+ height: 1rem;
2913
+ }
2914
+
2915
+ .composer-attachment__body {
2916
+ display: flex;
2917
+ flex-direction: column;
2918
+ gap: 0.1rem;
2919
+ min-width: 0;
2920
+ }
2921
+
2922
+ .composer-attachment__title {
2923
+ margin: 0;
2924
+ font-size: 0.8rem;
2925
+ font-weight: 600;
2926
+ white-space: nowrap;
2927
+ overflow: hidden;
2928
+ text-overflow: ellipsis;
2929
+ }
2930
+
2931
+ .composer-attachment__meta {
2932
+ margin: 0;
2933
+ font-size: 0.72rem;
2934
+ opacity: 0.75;
2935
+ white-space: nowrap;
2936
+ overflow: hidden;
2937
+ text-overflow: ellipsis;
2938
+ }
2939
+
2940
+ .composer-attachment__remove {
2941
+ position: absolute;
2942
+ right: 0.25rem;
2943
+ top: 50%;
2944
+ transform: translateY(-50%);
2945
+ border: none;
2946
+ background: transparent;
2947
+ color: inherit;
2948
+ padding: 0.1rem;
2949
+ display: inline-flex;
2950
+ align-items: center;
2951
+ justify-content: center;
2952
+ cursor: pointer;
2953
+ opacity: 0.8;
2954
+ }
2955
+
2956
+ .composer-attachment__remove:hover {
2957
+ opacity: 1;
2958
+ }
2959
+
2960
+ .composer-attachment__remove svg {
2961
+ width: 0.9rem;
2962
+ height: 0.9rem;
2963
+ }
2964
+
2965
+ .composer-image {
2966
+ width: 72px;
2967
+ height: 72px;
2968
+ border-radius: 18px;
2969
+ overflow: hidden;
2970
+ position: relative;
2971
+ flex-shrink: 0;
2972
+ background: rgba(15, 23, 42, 0.85);
2973
+ box-shadow: 0 14px 36px rgba(2, 6, 23, 0.55);
2974
+ }
2975
+
2976
+ .composer-image__img {
2977
+ display: block;
2978
+ width: 100%;
2979
+ height: 100%;
2980
+ object-fit: cover;
2981
+ }
2982
+
2983
+ .composer-image__preview {
2984
+ border: 0;
2985
+ margin: 0;
2986
+ padding: 0;
2987
+ width: 100%;
2988
+ height: 100%;
2989
+ display: block;
2990
+ background: transparent;
2991
+ cursor: zoom-in;
2992
+ }
2993
+
2994
+ .composer-image__preview:focus-visible {
2995
+ outline: 2px solid var(--agent-ui-accent);
2996
+ outline-offset: -2px;
2997
+ border-radius: 18px;
2998
+ }
2999
+
3000
+ .composer-image__placeholder {
3001
+ width: 100%;
3002
+ height: 100%;
3003
+ display: flex;
3004
+ align-items: center;
3005
+ justify-content: center;
3006
+ color: rgba(226, 232, 240, 0.8);
3007
+ background: rgba(51, 65, 85, 0.6);
3008
+ }
3009
+
3010
+ .composer-image__placeholder svg {
3011
+ width: 1.5rem;
3012
+ height: 1.5rem;
3013
+ }
3014
+
3015
+ .composer-image__remove {
3016
+ position: absolute;
3017
+ top: 4px;
3018
+ right: 4px;
3019
+ width: 1.65rem;
3020
+ height: 1.65rem;
3021
+ border-radius: 999px;
3022
+ border: 1px solid rgba(248, 250, 252, 0.25);
3023
+ background: rgba(2, 6, 23, 0.65);
3024
+ color: rgba(248, 250, 252, 0.9);
3025
+ display: flex;
3026
+ align-items: center;
3027
+ justify-content: center;
3028
+ cursor: pointer;
3029
+ transition: transform 180ms ease, opacity 180ms ease;
3030
+ opacity: 0;
3031
+ }
3032
+
3033
+ .composer-image:hover .composer-image__remove,
3034
+ .composer-image__remove:focus-visible {
3035
+ opacity: 1;
3036
+ transform: scale(1.05);
3037
+ }
3038
+
3039
+ .composer-image__remove svg {
3040
+ width: 1rem;
3041
+ height: 1rem;
3042
+ }
3043
+
3044
+ .agent-image-lightbox {
3045
+ position: fixed;
3046
+ inset: 0;
3047
+ z-index: 1300;
3048
+ display: flex;
3049
+ align-items: center;
3050
+ justify-content: center;
3051
+ padding: 1rem;
3052
+ background: rgba(2, 6, 23, 0.84);
3053
+ }
3054
+
3055
+ .agent-image-lightbox__frame {
3056
+ position: relative;
3057
+ display: inline-flex;
3058
+ align-items: center;
3059
+ justify-content: center;
3060
+ max-width: min(96vw, 1200px);
3061
+ max-height: 92vh;
3062
+ }
3063
+
3064
+ .agent-image-lightbox__img {
3065
+ display: block;
3066
+ max-width: 100%;
3067
+ max-height: 92vh;
3068
+ border-radius: 0.9rem;
3069
+ border: 1px solid var(--agent-ui-panel-border);
3070
+ background: rgba(15, 23, 42, 0.5);
3071
+ box-shadow: 0 24px 52px rgba(2, 6, 23, 0.65);
3072
+ }
3073
+
3074
+ .agent-image-lightbox__close {
3075
+ position: absolute;
3076
+ top: 0.6rem;
3077
+ right: 0.6rem;
3078
+ width: 2rem;
3079
+ height: 2rem;
3080
+ border-radius: 999px;
3081
+ border: 1px solid rgba(226, 232, 240, 0.35);
3082
+ background: rgba(2, 6, 23, 0.72);
3083
+ color: rgba(248, 250, 252, 0.94);
3084
+ display: inline-flex;
3085
+ align-items: center;
3086
+ justify-content: center;
3087
+ cursor: pointer;
3088
+ }
3089
+
3090
+ .agent-image-lightbox__close:hover {
3091
+ border-color: rgba(226, 232, 240, 0.55);
3092
+ }
3093
+
3094
+ .agent-image-lightbox__close:focus-visible {
3095
+ outline: 2px solid var(--agent-ui-accent);
3096
+ outline-offset: 2px;
3097
+ }
3098
+
3099
+ .agent-image-lightbox__close svg {
3100
+ width: 1rem;
3101
+ height: 1rem;
3102
+ }
3103
+
3104
+ .composer-field {
3105
+ display: flex;
3106
+ flex-direction: column;
3107
+ gap: 0.45rem;
3108
+ flex: 1;
3109
+ }
3110
+
3111
+ .composer-textarea {
3112
+ background: transparent;
3113
+ color: var(--agent-ui-text-primary);
3114
+ border: none;
3115
+ padding: 0;
3116
+ resize: none;
3117
+ /* Start at ~1.5 lines; grow with content via Chromium's intrinsic
3118
+ field-sizing so we do NOT render an internal scrollbar stranded in
3119
+ the middle of the composer when the text is shorter than min-height
3120
+ (the bug the user hit at narrow widths on v1.5.46). Scroll only kicks
3121
+ in once content exceeds max-height. */
3122
+ field-sizing: content;
3123
+ min-height: 32px;
3124
+ max-height: 220px;
3125
+ overflow-y: auto;
3126
+ overflow-x: hidden;
3127
+ font: inherit;
3128
+ line-height: 1.45;
3129
+ text-align: left;
3130
+ }
3131
+
3132
+ .composer-textarea:focus {
3133
+ outline: none;
3134
+ }
3135
+
3136
+ .composer-textarea::placeholder {
3137
+ color: rgba(255, 255, 255, 0.45);
3138
+ text-align: left;
3139
+ }
3140
+
3141
+ .agent-ui-theme-light .composer-textarea {
3142
+ color: #0f172a !important;
3143
+ }
3144
+
3145
+ .agent-ui-theme-light .composer-textarea::placeholder {
3146
+ color: rgba(71, 85, 105, 0.6) !important;
3147
+ }
3148
+
3149
+ .agent-ui-theme-light .composer-attach-button {
3150
+ color: rgba(15, 23, 42, 0.55) !important;
3151
+ }
3152
+
3153
+ .agent-ui-theme-light .composer-icon {
3154
+ color: #0f172a;
3155
+ opacity: 0.7 !important;
3156
+ }
3157
+
3158
+ .composer-attach-button {
3159
+ width: 26px;
3160
+ height: 26px;
3161
+ border-radius: 16px;
3162
+ display: inline-flex;
3163
+ align-items: center;
3164
+ justify-content: center;
3165
+ padding: 0;
3166
+ }
3167
+ .composer-actions .send-button {
3168
+ width: 32px;
3169
+ height: 32px;
3170
+ border-radius: 10px;
3171
+ display: inline-flex;
3172
+ align-items: center;
3173
+ justify-content: center;
3174
+ padding: 0;
3175
+ }
3176
+
3177
+ .composer-attach-button {
3178
+ position: absolute;
3179
+ left: -0.25rem;
3180
+ bottom: -0.25rem;
3181
+ border: none;
3182
+ background: transparent;
3183
+ color: inherit;
3184
+ transition: background 0.2s ease, transform 0.15s ease;
3185
+ padding: 0 !important;
3186
+ }
3187
+
3188
+ .composer-attach-button:hover {
3189
+ background: transparent;
3190
+ transform: translateY(-1px);
3191
+ }
3192
+
3193
+ .composer-attach-button:active {
3194
+ transform: translateY(0);
3195
+ background: transparent;
3196
+ }
3197
+
3198
+ .composer-attach-button:focus {
3199
+ outline: none;
3200
+ background: transparent;
3201
+ }
3202
+
3203
+ .composer-attach-button svg,
3204
+ .composer-icon {
3205
+ width: 22px;
3206
+ height: 22px;
3207
+ flex-shrink: 0;
3208
+ }
3209
+
3210
+ .composer-actions {
3211
+ position: absolute;
3212
+ right: 0.7rem;
3213
+ bottom: 0.45rem;
3214
+ display: flex;
3215
+ align-items: center;
3216
+ gap: 0.4rem;
3217
+ }
3218
+
3219
+ /* Edit-automatically toggle rendered inline with the submit arrow.
3220
+ Matches Claude's compact Auto/Ask pill: icon + label, pressed-state
3221
+ highlights in the accent color, dimmed when Ask. */
3222
+ .composer-edit-auto {
3223
+ display: inline-flex;
3224
+ align-items: center;
3225
+ gap: 0.3rem;
3226
+ padding: 0.2rem 0.55rem;
3227
+ border-radius: 999px;
3228
+ border: 1px solid rgba(148, 163, 184, 0.35);
3229
+ background: transparent;
3230
+ color: rgba(226, 232, 240, 0.6);
3231
+ font: inherit;
3232
+ font-size: 0.72rem;
3233
+ line-height: 1;
3234
+ cursor: pointer;
3235
+ transition: color 0.15s ease, border-color 0.15s ease, background 0.15s ease;
3236
+ }
3237
+
3238
+ .composer-edit-auto:hover:not(:disabled) {
3239
+ color: rgba(226, 232, 240, 0.9);
3240
+ border-color: rgba(148, 163, 184, 0.6);
3241
+ }
3242
+
3243
+ .composer-edit-auto.is-active {
3244
+ color: var(--agent-ui-accent, #38bdf8);
3245
+ border-color: rgba(56, 189, 248, 0.55);
3246
+ background: rgba(56, 189, 248, 0.1);
3247
+ }
3248
+
3249
+ .composer-edit-auto:disabled {
3250
+ opacity: 0.45;
3251
+ cursor: not-allowed;
3252
+ }
3253
+
3254
+ .composer-edit-auto__icon {
3255
+ width: 0.85rem;
3256
+ height: 0.85rem;
3257
+ flex-shrink: 0;
3258
+ }
3259
+
3260
+ .composer-edit-auto__label {
3261
+ white-space: nowrap;
3262
+ }
3263
+
3264
+ .agent-ui-theme-light .composer-edit-auto {
3265
+ color: rgba(15, 23, 42, 0.6);
3266
+ border-color: rgba(100, 116, 139, 0.35);
3267
+ }
3268
+
3269
+ .agent-ui-theme-light .composer-edit-auto.is-active {
3270
+ color: #0ea5e9;
3271
+ border-color: rgba(14, 165, 233, 0.55);
3272
+ background: rgba(14, 165, 233, 0.1);
3273
+ }
3274
+
3275
+ /* Skill picker popover opened from the `/` button. */
3276
+ .composer-slash-wrap {
3277
+ position: relative;
3278
+ display: inline-flex;
3279
+ }
3280
+
3281
+ .composer-skill-picker {
3282
+ position: absolute;
3283
+ bottom: calc(100% + 6px);
3284
+ left: 0;
3285
+ width: min(380px, 78vw);
3286
+ display: flex;
3287
+ flex-direction: column;
3288
+ background: var(--agent-ui-panel-bg, rgba(14, 20, 37, 0.98));
3289
+ border: 1px solid var(--agent-ui-panel-border);
3290
+ border-radius: 10px;
3291
+ padding: 6px;
3292
+ box-shadow: 0 12px 32px rgba(0, 0, 0, 0.55);
3293
+ z-index: 30;
3294
+ }
3295
+
3296
+ .composer-skill-picker__filter {
3297
+ width: 100%;
3298
+ box-sizing: border-box;
3299
+ background: rgba(2, 6, 23, 0.5);
3300
+ color: var(--agent-ui-text-primary);
3301
+ border: 1px solid var(--agent-ui-panel-border);
3302
+ border-radius: 6px;
3303
+ padding: 0.35rem 0.55rem;
3304
+ font: inherit;
3305
+ font-size: 0.8rem;
3306
+ margin-bottom: 4px;
3307
+ }
3308
+
3309
+ .composer-skill-picker__filter:focus {
3310
+ outline: none;
3311
+ border-color: var(--agent-ui-accent, #38bdf8);
3312
+ }
3313
+
3314
+ .composer-skill-picker__list {
3315
+ display: flex;
3316
+ flex-direction: column;
3317
+ gap: 1px;
3318
+ max-height: 260px;
3319
+ overflow-y: auto;
3320
+ }
3321
+
3322
+ .composer-skill-picker__item {
3323
+ display: grid;
3324
+ grid-template-columns: auto 1fr;
3325
+ column-gap: 0.55rem;
3326
+ row-gap: 0.1rem;
3327
+ align-items: baseline;
3328
+ padding: 0.35rem 0.5rem;
3329
+ border: none;
3330
+ background: transparent;
3331
+ color: var(--agent-ui-text-primary);
3332
+ font: inherit;
3333
+ text-align: left;
3334
+ border-radius: 6px;
3335
+ cursor: pointer;
3336
+ }
3337
+
3338
+ .composer-skill-picker__item.is-active,
3339
+ .composer-skill-picker__item:hover {
3340
+ background: rgba(120, 140, 200, 0.12);
3341
+ }
3342
+
3343
+ .composer-skill-picker__name {
3344
+ grid-row: 1;
3345
+ grid-column: 1;
3346
+ font-family: var(--vscode-editor-font-family, ui-monospace, monospace);
3347
+ color: var(--agent-ui-accent, #38bdf8);
3348
+ font-weight: 600;
3349
+ font-size: 0.78rem;
3350
+ }
3351
+
3352
+ .composer-skill-picker__label {
3353
+ grid-row: 1;
3354
+ grid-column: 2;
3355
+ font-size: 0.78rem;
3356
+ font-weight: 600;
3357
+ overflow: hidden;
3358
+ text-overflow: ellipsis;
3359
+ white-space: nowrap;
3360
+ }
3361
+
3362
+ .composer-skill-picker__desc {
3363
+ grid-row: 2;
3364
+ grid-column: 2;
3365
+ font-size: 0.72rem;
3366
+ color: var(--agent-ui-text-muted);
3367
+ overflow: hidden;
3368
+ text-overflow: ellipsis;
3369
+ white-space: nowrap;
3370
+ }
3371
+
3372
+ .composer-skill-picker__divider {
3373
+ font-size: 0.68rem;
3374
+ letter-spacing: 0.08em;
3375
+ text-transform: uppercase;
3376
+ color: var(--agent-ui-text-muted);
3377
+ padding: 0.35rem 0.5rem 0.2rem;
3378
+ border-top: 1px solid var(--agent-ui-panel-border);
3379
+ margin-top: 2px;
3380
+ }
3381
+
3382
+ .composer-skill-picker__empty {
3383
+ padding: 0.6rem 0.5rem;
3384
+ font-size: 0.78rem;
3385
+ color: var(--agent-ui-text-muted);
3386
+ text-align: center;
3387
+ }
3388
+
3389
+ /* Settings rows inside the `/` menu. The composer no longer carries
3390
+ inline auto-context / edit-auto / model-picker pills — they live
3391
+ here so the composer row stays to `+ / send`. */
3392
+ .composer-skill-picker__setting {
3393
+ cursor: pointer;
3394
+ }
3395
+ .composer-skill-picker__setting.is-on .composer-skill-picker__toggle {
3396
+ color: var(--agent-ui-accent);
3397
+ }
3398
+ .composer-skill-picker__toggle {
3399
+ grid-row: 1 / span 2;
3400
+ grid-column: 1;
3401
+ align-self: center;
3402
+ font-size: 0.9rem;
3403
+ color: var(--agent-ui-text-muted);
3404
+ width: 1.1rem;
3405
+ text-align: center;
3406
+ }
3407
+ .composer-skill-picker__slot {
3408
+ padding: 0.4rem 0.5rem 0.25rem;
3409
+ display: flex;
3410
+ flex-direction: column;
3411
+ gap: 0.35rem;
3412
+ font-size: 0.78rem;
3413
+ color: var(--agent-ui-text-secondary);
3414
+ }
3415
+
3416
+ /* Model display row inside the `/` menu Settings section. Shows the
3417
+ active model id as plain text with a small "Model" label — read
3418
+ only, since the provider + "Set model…" actions live right below
3419
+ it via settingsSlot. */
3420
+ .composer-skill-picker__modelrow {
3421
+ display: flex;
3422
+ align-items: center;
3423
+ gap: 0.55rem;
3424
+ padding: 0.3rem 0.5rem;
3425
+ font-size: 0.78rem;
3426
+ color: var(--agent-ui-text-secondary);
3427
+ }
3428
+ .composer-skill-picker__modelrow-label {
3429
+ font-size: 0.68rem;
3430
+ letter-spacing: 0.08em;
3431
+ text-transform: uppercase;
3432
+ color: var(--agent-ui-text-muted);
3433
+ min-width: 3.5rem;
3434
+ }
3435
+ .composer-skill-picker__modelrow-value {
3436
+ font-family: "JetBrains Mono", "SFMono-Regular", Menlo, monospace;
3437
+ color: var(--agent-ui-text-primary);
3438
+ overflow: hidden;
3439
+ text-overflow: ellipsis;
3440
+ white-space: nowrap;
3441
+ }
3442
+
3443
+ .composer-actions .send-button {
3444
+ /* Layered gradient: inner highlight (top) → saturated accent (middle) →
3445
+ deeper accent (bottom). Reads as a tactile "raised pill" against the
3446
+ dark composer surround instead of the washed-out flat chip we had. */
3447
+ background:
3448
+ linear-gradient(180deg,
3449
+ rgba(var(--bandit-accent-rgb), 1) 0%,
3450
+ rgba(var(--bandit-accent-rgb), 0.92) 55%,
3451
+ rgba(var(--bandit-accent-rgb), 0.78) 100%);
3452
+ border: 1px solid rgba(var(--bandit-accent-rgb), 0.55);
3453
+ color: #fff;
3454
+ box-shadow:
3455
+ 0 1px 0 rgba(255, 255, 255, 0.22) inset,
3456
+ 0 0 0 1px rgba(var(--bandit-accent-rgb), 0.15),
3457
+ 0 4px 12px rgba(var(--bandit-accent-rgb), 0.28),
3458
+ 0 2px 4px rgba(0, 0, 0, 0.3);
3459
+ transition: filter 0.15s ease, transform 0.1s ease, box-shadow 0.2s ease, background 0.2s ease;
3460
+ cursor: pointer;
3461
+ }
3462
+
3463
+ .agent-ui-theme-light .composer-actions .send-button {
3464
+ background:
3465
+ linear-gradient(180deg,
3466
+ rgba(var(--bandit-accent-rgb), 1) 0%,
3467
+ rgba(var(--bandit-accent-rgb), 0.94) 55%,
3468
+ rgba(var(--bandit-accent-rgb), 0.82) 100%);
3469
+ border-color: rgba(var(--bandit-accent-rgb), 0.65);
3470
+ box-shadow:
3471
+ 0 1px 0 rgba(255, 255, 255, 0.45) inset,
3472
+ 0 2px 6px rgba(var(--bandit-accent-rgb), 0.35),
3473
+ 0 1px 3px rgba(0, 0, 0, 0.12);
3474
+ }
3475
+
3476
+ .composer-actions .send-button[data-variant="stop"] {
3477
+ background: linear-gradient(180deg, rgba(220, 38, 38, 1) 0%, rgba(185, 28, 28, 1) 100%);
3478
+ border-color: rgba(220, 38, 38, 0.45);
3479
+ animation: bandit-stop-pulse 1.6s ease-in-out infinite;
3480
+ }
3481
+ .composer-actions .send-button[data-variant="stop"]:hover:not(:disabled) {
3482
+ animation: none;
3483
+ filter: brightness(1.1);
3484
+ }
3485
+ @keyframes bandit-stop-pulse {
3486
+ 0%, 100% { box-shadow: 0 1px 0 rgba(255, 255, 255, 0.08) inset, 0 2px 6px rgba(0, 0, 0, 0.2), 0 0 0 0 rgba(220, 38, 38, 0.5); }
3487
+ 50% { box-shadow: 0 1px 0 rgba(255, 255, 255, 0.08) inset, 0 2px 6px rgba(0, 0, 0, 0.2), 0 0 0 6px rgba(220, 38, 38, 0); }
3488
+ }
3489
+
3490
+ .composer-actions .send-button:hover:not(:disabled) {
3491
+ filter: brightness(1.08) saturate(1.05);
3492
+ box-shadow:
3493
+ 0 1px 0 rgba(255, 255, 255, 0.3) inset,
3494
+ 0 0 0 1px rgba(var(--bandit-accent-rgb), 0.25),
3495
+ 0 6px 16px rgba(var(--bandit-accent-rgb), 0.45),
3496
+ 0 2px 5px rgba(0, 0, 0, 0.35);
3497
+ transform: translateY(-1px);
3498
+ }
3499
+
3500
+ .composer-actions .send-button:active:not(:disabled) {
3501
+ transform: scale(0.96);
3502
+ }
3503
+
3504
+ .composer-actions .send-button:disabled {
3505
+ filter: grayscale(0.4) brightness(0.7);
3506
+ cursor: not-allowed;
3507
+ opacity: 0.55;
3508
+ }
3509
+
3510
+ .composer-actions .send-button:focus-visible {
3511
+ outline: none;
3512
+ box-shadow: 0 0 0 2px rgba(var(--bandit-accent-rgb), 0.45), 0 2px 6px rgba(0, 0, 0, 0.2);
3513
+ }
3514
+
3515
+ .composer-actions .send-button .composer-icon {
3516
+ width: 18px;
3517
+ height: 18px;
3518
+ }
3519
+ .message-feedback {
3520
+ margin-top: 0.4rem;
3521
+ display: flex;
3522
+ gap: 0.35rem;
3523
+ justify-content: flex-end;
3524
+ align-items: center;
3525
+ padding: 0;
3526
+ border: none;
3527
+ background: transparent;
3528
+ }
3529
+
3530
+ .message-feedback--compact {
3531
+ width: 100%;
3532
+ }
3533
+
3534
+ .message-response-actions {
3535
+ margin-top: 0.35rem;
3536
+ width: 100%;
3537
+ display: flex;
3538
+ justify-content: flex-end;
3539
+ }
3540
+
3541
+ .message-response-copy {
3542
+ border: 1px solid var(--agent-ui-panel-border);
3543
+ background: var(--agent-ui-pill-bg);
3544
+ color: var(--agent-ui-text-muted);
3545
+ border-radius: 999px;
3546
+ padding: 0.16rem 0.62rem;
3547
+ font-size: 0.66rem;
3548
+ letter-spacing: 0.14em;
3549
+ text-transform: uppercase;
3550
+ cursor: pointer;
3551
+ transition: border-color 0.2s ease, color 0.2s ease, transform 0.15s ease;
3552
+ }
3553
+
3554
+ .message-response-copy:hover {
3555
+ border-color: var(--agent-ui-accent);
3556
+ color: var(--agent-ui-accent);
3557
+ transform: translateY(-1px);
3558
+ }
3559
+
3560
+ .message-response-copy:focus-visible {
3561
+ outline: none;
3562
+ border-color: var(--agent-ui-accent-strong);
3563
+ box-shadow: 0 0 0 2px rgba(56, 189, 248, 0.24);
3564
+ }
3565
+
3566
+ .message-response-copy.is-copied {
3567
+ color: var(--agent-ui-success);
3568
+ border-color: rgba(34, 197, 94, 0.45);
3569
+ }
3570
+
3571
+ /* Speaker button sits next to Copy. Same visual language, distinct
3572
+ active state (accent color + subtle pulse) when the message is
3573
+ actively playing so users can see which response is narrating. */
3574
+ .message-response-speak {
3575
+ height: 2rem;
3576
+ padding: 0 0.75rem 0 0.6rem;
3577
+ gap: 0.4rem;
3578
+ border-radius: 999px;
3579
+ /* Stronger default state — the previous 0.15 border + 0.04 bg was
3580
+ near-invisible on dark themes and users reported never spotting
3581
+ the button. Also honor the accent color so it visually chains
3582
+ with the rest of Bandit's interactive chrome. */
3583
+ border: 1px solid rgba(var(--agent-ui-accent-rgb, 56, 189, 248), 0.35);
3584
+ background: rgba(var(--agent-ui-accent-rgb, 56, 189, 248), 0.08);
3585
+ color: inherit;
3586
+ display: inline-flex;
3587
+ align-items: center;
3588
+ justify-content: center;
3589
+ cursor: pointer;
3590
+ margin-left: 0.3rem;
3591
+ font-size: 0.78rem;
3592
+ line-height: 1;
3593
+ transition: background 120ms ease, border-color 120ms ease, transform 120ms ease;
3594
+ }
3595
+ .message-response-speak:hover {
3596
+ background: rgba(var(--agent-ui-accent-rgb, 56, 189, 248), 0.18);
3597
+ border-color: var(--agent-ui-accent, #38bdf8);
3598
+ color: var(--agent-ui-accent, #38bdf8);
3599
+ transform: translateY(-1px);
3600
+ }
3601
+ .message-response-speak__label {
3602
+ font-weight: 500;
3603
+ letter-spacing: 0.01em;
3604
+ }
3605
+ .message-response-speak:hover {
3606
+ border-color: var(--agent-ui-accent, #38bdf8);
3607
+ color: var(--agent-ui-accent, #38bdf8);
3608
+ }
3609
+ .message-response-speak > svg {
3610
+ width: 1rem;
3611
+ height: 1rem;
3612
+ }
3613
+ .message-response-speak.is-speaking {
3614
+ color: var(--agent-ui-accent, #38bdf8);
3615
+ border-color: var(--agent-ui-accent, #38bdf8);
3616
+ animation: speaker-pulse 1.2s ease-in-out infinite;
3617
+ }
3618
+ @keyframes speaker-pulse {
3619
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(56, 189, 248, 0.5); }
3620
+ 50% { box-shadow: 0 0 0 6px rgba(56, 189, 248, 0); }
3621
+ }
3622
+
3623
+ /* Active-playback pill replaces the single Listen button while audio is
3624
+ playing or paused. Status icon + label sit on the left; pause/play +
3625
+ stop buttons sit on the right. Same accent palette as the idle Listen
3626
+ button so the affordance reads as one element morphing, not two. */
3627
+ .message-response-speak-pill {
3628
+ height: 2rem;
3629
+ display: inline-flex;
3630
+ align-items: center;
3631
+ gap: 0.25rem;
3632
+ padding: 0 0.3rem 0 0.6rem;
3633
+ margin-left: 0.3rem;
3634
+ border-radius: 999px;
3635
+ border: 1px solid rgba(var(--agent-ui-accent-rgb, 56, 189, 248), 0.45);
3636
+ background: rgba(var(--agent-ui-accent-rgb, 56, 189, 248), 0.12);
3637
+ color: var(--agent-ui-accent, #38bdf8);
3638
+ font-size: 0.78rem;
3639
+ line-height: 1;
3640
+ }
3641
+ .message-response-speak-pill.is-playing {
3642
+ animation: speaker-pulse 1.2s ease-in-out infinite;
3643
+ }
3644
+ .message-response-speak-pill__status {
3645
+ display: inline-flex;
3646
+ align-items: center;
3647
+ gap: 0.35rem;
3648
+ }
3649
+ .message-response-speak-pill__status > svg {
3650
+ width: 1rem;
3651
+ height: 1rem;
3652
+ }
3653
+ .message-response-speak-pill__label {
3654
+ font-weight: 500;
3655
+ letter-spacing: 0.01em;
3656
+ }
3657
+ .message-response-speak-pill__btn {
3658
+ width: 1.55rem;
3659
+ height: 1.55rem;
3660
+ border-radius: 999px;
3661
+ border: 1px solid rgba(var(--agent-ui-accent-rgb, 56, 189, 248), 0.35);
3662
+ background: transparent;
3663
+ color: inherit;
3664
+ display: inline-flex;
3665
+ align-items: center;
3666
+ justify-content: center;
3667
+ cursor: pointer;
3668
+ padding: 0;
3669
+ transition: background 120ms ease, border-color 120ms ease, color 120ms ease;
3670
+ }
3671
+ .message-response-speak-pill__btn > svg {
3672
+ width: 0.9rem;
3673
+ height: 0.9rem;
3674
+ }
3675
+ .message-response-speak-pill__btn:hover {
3676
+ background: rgba(var(--agent-ui-accent-rgb, 56, 189, 248), 0.22);
3677
+ border-color: var(--agent-ui-accent, #38bdf8);
3678
+ }
3679
+ .message-response-speak-pill__btn--stop:hover {
3680
+ background: rgba(239, 68, 68, 0.18);
3681
+ border-color: rgba(239, 68, 68, 0.7);
3682
+ color: rgb(248, 113, 113);
3683
+ }
3684
+
3685
+ .feedback-icon-button {
3686
+ width: 2rem;
3687
+ height: 2rem;
3688
+ border-radius: 999px;
3689
+ border: 1px solid rgba(255, 255, 255, 0.15);
3690
+ background: rgba(255, 255, 255, 0.04);
3691
+ color: inherit;
3692
+ display: inline-flex;
3693
+ align-items: center;
3694
+ justify-content: center;
3695
+ cursor: pointer;
3696
+ transition: border-color 0.2s ease, background 0.2s ease, transform 0.1s ease;
3697
+ }
3698
+
3699
+ .feedback-icon-button svg {
3700
+ width: 1rem;
3701
+ height: 1rem;
3702
+ }
3703
+
3704
+ .feedback-icon-button:hover {
3705
+ border-color: rgba(255, 255, 255, 0.35);
3706
+ background: rgba(255, 255, 255, 0.08);
3707
+ }
3708
+
3709
+ .feedback-icon-button:active {
3710
+ transform: translateY(1px);
3711
+ }
3712
+
3713
+ .feedback-icon-button.active,
3714
+ .message-feedback[data-status='submitted'][data-rating='up'] .feedback-icon-button.up.active {
3715
+ border-color: rgba(80, 180, 255, 0.6);
3716
+ background: rgba(80, 180, 255, 0.2);
3717
+ }
3718
+
3719
+ .message-feedback[data-status='submitted'][data-rating='down'] .feedback-icon-button.down.active {
3720
+ border-color: rgba(255, 120, 120, 0.6);
3721
+ background: rgba(255, 120, 120, 0.18);
3722
+ }
3723
+
3724
+ .message-feedback[data-status='submitted'] .feedback-icon-button:not(.active) {
3725
+ opacity: 0.45;
3726
+ cursor: default;
3727
+ }
3728
+
3729
+ .feedback-icon-button:disabled:not(.active) {
3730
+ opacity: 0.5;
3731
+ cursor: default;
3732
+ }
3733
+ .chat-conversation {
3734
+ display: flex;
3735
+ flex-direction: column;
3736
+ gap: 1.75rem;
3737
+ width: 100%;
3738
+ }
3739
+
3740
+ .chat-message-group {
3741
+ display: flex;
3742
+ flex-direction: column;
3743
+ gap: 0.85rem;
3744
+ }
3745
+
3746
+ .chat-message-group__header {
3747
+ display: inline-flex;
3748
+ align-items: center;
3749
+ gap: 0.5rem;
3750
+ font-size: 0.7rem;
3751
+ letter-spacing: 0.18em;
3752
+ text-transform: uppercase;
3753
+ color: var(--agent-ui-text-dim);
3754
+ }
3755
+
3756
+ .chat-message-group__label {
3757
+ font-weight: 700;
3758
+ }
3759
+
3760
+ .chat-message-group__timestamp {
3761
+ font-weight: 600;
3762
+ opacity: 0.75;
3763
+ }
3764
+
3765
+ .chat-message-group__messages {
3766
+ display: flex;
3767
+ flex-direction: column;
3768
+ gap: 0.85rem;
3769
+ }
3770
+
3771
+ .chat-message-group[data-role="user"] .chat-message-group__header {
3772
+ align-self: flex-end;
3773
+ text-align: right;
3774
+ }
3775
+
3776
+ :is(.message, .assistant-message, .user-message) {
3777
+ display: flex;
3778
+ flex-direction: column;
3779
+ gap: 0.45rem;
3780
+ line-height: 1.5;
3781
+ width: 100%;
3782
+ }
3783
+
3784
+ .message.user {
3785
+ align-items: flex-end;
3786
+ }
3787
+
3788
+ .message.assistant {
3789
+ align-items: flex-start;
3790
+ }
3791
+
3792
+ .message-body {
3793
+ white-space: normal;
3794
+ }
3795
+
3796
+ .message-body.user {
3797
+ border-radius: 6px;
3798
+ padding: 0.7rem 0.75rem;
3799
+ background: rgba(14, 99, 156, 0.15);
3800
+ }
3801
+
3802
+ .message-body.assistant {
3803
+ padding: 0;
3804
+ }
3805
+
3806
+ .message-content {
3807
+ width: 100%;
3808
+ overflow: visible;
3809
+ max-width: 100%;
3810
+ position: relative;
3811
+ min-width: 0;
3812
+ }
3813
+
3814
+ /* Click-to-expand on tool cards — opens the full IN/OUT in a new
3815
+ editor tab. Applied to bandit-run cards and bandit-tl rows once
3816
+ the tool has completed (the extension sets data-run-id at that
3817
+ point). Subtle by default, lifts on hover to signal interactivity. */
3818
+ .markdown-message .bandit-run-card--clickable,
3819
+ .markdown-message .bandit-tl-row--clickable {
3820
+ cursor: pointer;
3821
+ transition: background 120ms ease, box-shadow 120ms ease, border-color 120ms ease;
3822
+ }
3823
+ .markdown-message .bandit-run-card--clickable:hover,
3824
+ .markdown-message .bandit-tl-row--clickable:hover {
3825
+ background: rgba(125, 211, 252, 0.06);
3826
+ }
3827
+ .markdown-message .bandit-run-card--clickable:focus-visible,
3828
+ .markdown-message .bandit-tl-row--clickable:focus-visible {
3829
+ outline: 1px solid var(--vscode-focusBorder, #7dd3fc);
3830
+ outline-offset: 1px;
3831
+ }
3832
+ .markdown-message .bandit-run-card__open,
3833
+ .markdown-message .bandit-tl-open {
3834
+ margin-left: auto;
3835
+ opacity: 0.35;
3836
+ font-size: 0.85em;
3837
+ color: var(--vscode-descriptionForeground, #94a3b8);
3838
+ transition: opacity 120ms ease;
3839
+ }
3840
+ .markdown-message .bandit-run-card--clickable:hover .bandit-run-card__open,
3841
+ .markdown-message .bandit-tl-row--clickable:hover .bandit-tl-open {
3842
+ opacity: 0.9;
3843
+ }
3844
+ .markdown-message .bandit-tl-row--clickable { padding-right: 10px; }