agentgui 1.0.324 → 1.0.326

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 (3) hide show
  1. package/database.js +11 -0
  2. package/package.json +1 -1
  3. package/static/index.html +3171 -986
package/static/index.html CHANGED
@@ -1,986 +1,3171 @@
1
- <!DOCTYPE html>
2
- <html lang="en" class="light">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover">
6
- <meta name="description" content="AgentGUI - Real-time Claude Code Execution Visualization">
7
- <title>AgentGUI</title>
8
- <link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Crect width='100' height='100' rx='20' fill='%233b82f6'/%3E%3Ctext x='50' y='68' font-size='50' font-family='sans-serif' font-weight='bold' fill='white' text-anchor='middle'%3EG%3C/text%3E%3C/svg%3E">
9
-
10
- <link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin>
11
- <link rel="preconnect" href="https://cdnjs.cloudflare.com" crossorigin>
12
- <link href="https://cdn.jsdelivr.net/npm/rippleui@1.12.1/dist/css/styles.css" rel="stylesheet">
13
- <link rel="preload" href="https://cdn.jsdelivr.net/npm/prismjs@1.29.0/themes/prism-dark.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
14
- <noscript><link href="https://cdn.jsdelivr.net/npm/prismjs@1.29.0/themes/prism-dark.css" rel="stylesheet"></noscript>
15
- <link rel="preload" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/styles/github-dark.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
16
- <noscript><link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/styles/github-dark.min.css" rel="stylesheet"></noscript>
17
- <script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/highlight.min.js"></script>
18
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@xterm/xterm@5.5.0/css/xterm.min.css">
19
- <script defer src="https://cdn.jsdelivr.net/npm/@xterm/xterm@5.5.0/lib/xterm.min.js"></script>
20
- <script defer src="https://cdn.jsdelivr.net/npm/@xterm/addon-fit@0.10.0/lib/addon-fit.min.js"></script>
21
-
22
- <style>
23
- *, *::before, *::after { box-sizing: border-box; }
24
-
25
- :root {
26
- --color-primary: #F59E0B;
27
- --color-primary-dark: #D97706;
28
- --color-bg-primary: #FAFAF9;
29
- --color-bg-secondary: #FFFFFF;
30
- --color-bg-tertiary: #F3F4F6;
31
- --color-bg-code: #1F2937;
32
- --color-text-primary: #1A1A1A;
33
- --color-text-secondary: #737373;
34
- --color-text-tertiary: #A3A3A3;
35
- --color-border: #E5E7EB;
36
- --color-border-light: #F0F0EF;
37
- --color-success: #10b981;
38
- --color-error: #ef4444;
39
- --color-warning: #f59e0b;
40
- --color-info: #0891b2;
41
- --sidebar-width: 300px;
42
- --header-height: 52px;
43
- }
44
-
45
- html.dark {
46
- --color-bg-primary: #1A1A1A;
47
- --color-bg-secondary: #1F1F1F;
48
- --color-bg-tertiary: #262626;
49
- --color-text-primary: #FAFAFA;
50
- --color-text-secondary: #A3A3A3;
51
- --color-text-tertiary: #737373;
52
- --color-border: #2A2A2A;
53
- --color-border-light: #333333;
54
- }
55
-
56
- html, body {
57
- margin: 0; padding: 0; height: 100%;
58
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
59
- background-color: var(--color-bg-primary);
60
- color: var(--color-text-primary);
61
- font-size: 15px;
62
- line-height: 1.65;
63
- letter-spacing: -0.011em;
64
- }
65
-
66
- /* ROOT LAYOUT */
67
- .app-shell {
68
- display: flex;
69
- height: 100dvh; height: 100vh;
70
- overflow: hidden;
71
- padding-top: env(safe-area-inset-top);
72
- padding-bottom: env(safe-area-inset-bottom);
73
- padding-left: env(safe-area-inset-left);
74
- padding-right: env(safe-area-inset-right);
75
- }
76
-
77
- /* SIDEBAR */
78
- .sidebar-overlay {
79
- display: none;
80
- position: fixed; inset: 0; z-index: 99;
81
- background: rgba(0,0,0,0.4);
82
- }
83
-
84
- .sidebar {
85
- width: var(--sidebar-width);
86
- flex-shrink: 0;
87
- display: flex;
88
- flex-direction: column;
89
- background-color: var(--color-bg-secondary);
90
- border-right: 1px solid var(--color-border-light);
91
- overflow: hidden;
92
- transition: width 0.25s ease, min-width 0.25s ease;
93
- }
94
-
95
- .sidebar.collapsed { width: 0; min-width: 0; border-right: none; }
96
-
97
- .sidebar-header {
98
- padding: 0.75rem 1rem;
99
- display: flex;
100
- justify-content: space-between;
101
- align-items: center;
102
- flex-shrink: 0;
103
- min-height: var(--header-height);
104
- border-bottom: 1px solid var(--color-border-light);
105
- }
106
-
107
- .sidebar-header h2 {
108
- margin: 0;
109
- font-size: 0.75rem;
110
- font-weight: 600;
111
- text-transform: uppercase;
112
- letter-spacing: 0.05em;
113
- color: var(--color-text-secondary);
114
- white-space: nowrap;
115
- }
116
-
117
- .sidebar-header-actions {
118
- display: flex; gap: 0.375rem; align-items: center; flex-shrink: 0;
119
- }
120
-
121
- .sidebar-clone-btn {
122
- padding: 0.375rem 0.5rem;
123
- font-size: 0.75rem;
124
- background-color: transparent;
125
- color: var(--color-text-secondary);
126
- border: 1px solid var(--color-border-light);
127
- border-radius: 4px;
128
- cursor: pointer;
129
- transition: all 0.15s;
130
- }
131
-
132
- .sidebar-clone-btn:hover {
133
- background-color: var(--color-bg-tertiary);
134
- color: var(--color-text-primary);
135
- border-color: var(--color-border);
136
- }
137
-
138
- .sidebar-new-btn {
139
- padding: 0.375rem 0.625rem;
140
- font-size: 0.75rem;
141
- background-color: var(--color-primary);
142
- color: white;
143
- border: none;
144
- border-radius: 6px;
145
- cursor: pointer;
146
- transition: background-color 0.15s;
147
- font-weight: 500;
148
- white-space: nowrap;
149
- }
150
-
151
- .sidebar-new-btn:hover { background-color: var(--color-primary-dark); }
152
-
153
- .clone-input-bar {
154
- display: flex; align-items: center; gap: 0.375rem;
155
- padding: 0.375rem 0.75rem;
156
- background: var(--color-bg-primary);
157
- border-bottom: 1px solid var(--color-border-light);
158
- flex-shrink: 0;
159
- }
160
-
161
- .clone-input {
162
- flex: 1; min-width: 0;
163
- padding: 0.375rem 0.5rem;
164
- font-size: 0.8rem;
165
- font-family: 'Monaco','Menlo','Ubuntu Mono', monospace;
166
- border: 1px solid var(--color-border);
167
- border-radius: 4px;
168
- background: var(--color-bg-secondary);
169
- color: var(--color-text-primary);
170
- outline: none;
171
- }
172
-
173
- .clone-input:focus { border-color: var(--color-primary); }
174
-
175
- .clone-go-btn {
176
- padding: 0.375rem 0.625rem;
177
- font-size: 0.75rem; font-weight: 600;
178
- background: var(--color-primary); color: white;
179
- border: none; border-radius: 4px; cursor: pointer;
180
- transition: background-color 0.15s;
181
- }
182
-
183
- .clone-go-btn:hover { background-color: var(--color-primary-dark); }
184
- .clone-go-btn:disabled { opacity: 0.5; cursor: not-allowed; }
185
-
186
- .clone-cancel-btn {
187
- padding: 0.25rem 0.5rem; font-size: 1rem;
188
- background: none; border: none; cursor: pointer;
189
- color: var(--color-text-secondary); line-height: 1;
190
- }
191
-
192
- .clone-cancel-btn:hover { color: var(--color-text-primary); }
193
-
194
- .sidebar-list {
195
- flex: 1; overflow-y: auto; overflow-x: hidden;
196
- list-style: none; margin: 0; padding: 0.5rem;
197
- -webkit-overflow-scrolling: touch;
198
- }
199
-
200
- .sidebar-empty {
201
- padding: 2rem 1rem; text-align: center;
202
- color: var(--color-text-secondary); font-size: 0.875rem;
203
- }
204
-
205
- .conversation-item {
206
- padding: 0.625rem 0.75rem;
207
- margin-bottom: 0.125rem;
208
- background-color: transparent;
209
- border: 1px solid transparent;
210
- border-radius: 6px;
211
- cursor: pointer;
212
- transition: all 0.15s;
213
- color: var(--color-text-primary);
214
- font-size: 0.875rem;
215
- display: flex;
216
- align-items: center;
217
- gap: 0.5rem;
218
- user-select: none;
219
- }
220
-
221
- .conversation-item:hover {
222
- background-color: var(--color-bg-tertiary);
223
- border-color: var(--color-border-light);
224
- }
225
-
226
- .conversation-item.active {
227
- background-color: var(--color-bg-tertiary);
228
- border-color: var(--color-primary);
229
- font-weight: 500;
230
- }
231
-
232
- .conversation-item-content {
233
- flex: 1; min-width: 0; overflow: hidden;
234
- }
235
-
236
- .conversation-item-title {
237
- font-weight: 500; font-size: 0.875rem; margin: 0;
238
- white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
239
- }
240
-
241
- .conversation-item-meta {
242
- font-size: 0.75rem; color: var(--color-text-secondary);
243
- margin-top: 0.125rem; white-space: nowrap;
244
- overflow: hidden; text-overflow: ellipsis;
245
- }
246
-
247
- .conversation-item-delete {
248
- flex-shrink: 0; width: 24px; height: 24px; padding: 0;
249
- display: flex; align-items: center; justify-content: center;
250
- background: transparent; border: none; border-radius: 4px;
251
- cursor: pointer; color: var(--color-text-secondary);
252
- opacity: 0; transition: all 0.15s;
253
- }
254
-
255
- .conversation-item:hover .conversation-item-delete { opacity: 1; }
256
- .conversation-item-delete:hover { background-color: var(--color-error); color: white; }
257
-
258
- .conversation-streaming-badge {
259
- display: inline-flex; align-items: center;
260
- margin-right: 0.25rem; vertical-align: middle;
261
- }
262
-
263
- .streaming-dot {
264
- display: inline-block; width: 0.5rem; height: 0.5rem;
265
- border-radius: 50%; background-color: var(--color-success);
266
- animation: pulse 1.5s ease-in-out infinite;
267
- }
268
-
269
- @keyframes pulse { 0%,100% { opacity:1; } 50% { opacity:0.4; } }
270
-
271
- /* MAIN PANEL */
272
- .main-panel {
273
- flex: 1; display: flex; flex-direction: column;
274
- overflow: hidden; min-width: 0;
275
- background-color: var(--color-bg-primary);
276
- }
277
-
278
- /* HEADER */
279
- .main-header {
280
- display: flex; align-items: center; gap: 0.75rem;
281
- padding: 0 1rem;
282
- height: var(--header-height); min-height: var(--header-height);
283
- flex-shrink: 0;
284
- background-color: var(--color-bg-secondary);
285
- border-bottom: 1px solid var(--color-border-light);
286
- }
287
-
288
- .sidebar-toggle-btn {
289
- display: flex; align-items: center; justify-content: center;
290
- width: 36px; height: 36px;
291
- background: none; border: none; border-radius: 6px;
292
- cursor: pointer; color: var(--color-text-secondary);
293
- flex-shrink: 0; transition: background-color 0.15s, color 0.15s;
294
- }
295
-
296
- .sidebar-toggle-btn:hover {
297
- background-color: var(--color-bg-tertiary);
298
- color: var(--color-text-primary);
299
- }
300
-
301
- .sidebar-toggle-btn svg { width: 18px; height: 18px; }
302
-
303
- .header-title {
304
- font-size: 0.95rem; font-weight: 600; margin: 0;
305
- flex: 1; min-width: 0;
306
- overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
307
- color: var(--color-text-primary);
308
- }
309
-
310
- .header-controls {
311
- display: flex; gap: 0.375rem; align-items: center; flex-shrink: 0;
312
- }
313
-
314
- .header-icon-btn {
315
- display: flex; align-items: center; justify-content: center;
316
- width: 36px; height: 36px;
317
- background: none; border: none; border-radius: 6px;
318
- cursor: pointer; color: var(--color-text-secondary);
319
- transition: background-color 0.15s, color 0.15s;
320
- }
321
-
322
- .header-icon-btn:hover {
323
- background-color: var(--color-bg-tertiary);
324
- color: var(--color-text-primary);
325
- }
326
-
327
- .header-icon-btn svg { width: 18px; height: 18px; }
328
-
329
- #scriptStartBtn { color: var(--color-success); }
330
- #scriptStartBtn:hover { background-color: rgba(16,185,129,0.1); color: var(--color-success); }
331
- .script-dev-btn { color: var(--color-info); }
332
- .script-dev-btn:hover { background-color: rgba(8,145,178,0.1); color: var(--color-info); }
333
- .script-stop-btn { color: var(--color-error); }
334
- .script-stop-btn:hover { background-color: rgba(239,68,68,0.1); color: var(--color-error); }
335
-
336
- .script-buttons { display: flex; gap: 0.25rem; align-items: center; }
337
-
338
- .agent-auth-btn { color: var(--color-text-secondary); position: relative; }
339
- .agent-auth-btn.auth-ok { color: var(--color-success); }
340
- .agent-auth-btn.auth-warn { color: var(--color-warning); }
341
-
342
- .agent-auth-dropdown {
343
- position: absolute; top: 100%; right: 0; z-index: 100;
344
- min-width: 260px; padding: 0.25rem 0;
345
- background: var(--color-bg-secondary);
346
- border: 1px solid var(--color-border);
347
- border-radius: 8px;
348
- box-shadow: 0 4px 16px rgba(0,0,0,0.12);
349
- display: none;
350
- }
351
-
352
- .agent-auth-dropdown.open { display: block; }
353
-
354
- .agent-auth-item {
355
- display: flex; align-items: center; gap: 0.5rem;
356
- padding: 0.5rem 0.75rem; cursor: pointer; font-size: 0.8125rem;
357
- color: var(--color-text-primary); border: none; background: none;
358
- width: 100%; text-align: left; transition: background 0.1s;
359
- }
360
-
361
- .agent-auth-item:hover { background: var(--color-bg-tertiary); }
362
-
363
- .agent-auth-dot {
364
- width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0;
365
- }
366
-
367
- .agent-auth-dot.ok { background: var(--color-success); }
368
- .agent-auth-dot.missing { background: var(--color-warning); }
369
- .agent-auth-dot.unknown { background: var(--color-text-secondary); }
370
-
371
- .agent-auth-section-header {
372
- padding: 0.375rem 0.75rem; font-size: 0.6875rem; font-weight: 600;
373
- text-transform: uppercase; letter-spacing: 0.05em;
374
- color: var(--color-text-secondary); user-select: none;
375
- }
376
-
377
- .status-badge {
378
- display: inline-flex; align-items: center; gap: 0.375rem;
379
- padding: 0.25rem 0.625rem;
380
- border-radius: 1rem; font-size: 0.75rem; font-weight: 500;
381
- background-color: var(--color-bg-tertiary);
382
- color: var(--color-text-secondary);
383
- border: 1px solid var(--color-border-light);
384
- }
385
-
386
- .status-indicator {
387
- width: 0.5rem; height: 0.5rem; border-radius: 50%;
388
- background-color: var(--color-error);
389
- animation: pulse 2s infinite;
390
- }
391
-
392
- .status-indicator[data-status="connected"] { background-color: var(--color-success); }
393
- .status-indicator[data-status="reconnecting"],
394
- .status-indicator[data-status="connecting"] { background-color: var(--color-warning); animation: pulse 1s infinite; }
395
-
396
- .theme-toggle-btn {
397
- display: flex; align-items: center; justify-content: center;
398
- width: 36px; height: 36px;
399
- background: none; border: none; border-radius: 6px;
400
- cursor: pointer; color: var(--color-text-secondary);
401
- transition: background-color 0.15s, color 0.15s;
402
- }
403
-
404
- .theme-toggle-btn:hover {
405
- background-color: var(--color-bg-tertiary);
406
- color: var(--color-text-primary);
407
- }
408
-
409
- .theme-toggle-btn svg { width: 18px; height: 18px; }
410
-
411
- /* VIEW TOGGLE BAR */
412
- .view-toggle-bar {
413
- display: flex; gap: 0;
414
- background: var(--color-bg-secondary);
415
- border-bottom: 1px solid var(--color-border-light);
416
- flex-shrink: 0; padding: 0 1rem;
417
- }
418
-
419
- .view-toggle-btn {
420
- padding: 0.5rem 1rem;
421
- border: none; background: none; cursor: pointer;
422
- font-size: 0.875rem; font-weight: 500;
423
- color: var(--color-text-secondary);
424
- border-bottom: 2px solid transparent;
425
- transition: color 0.15s, border-color 0.15s;
426
- margin-bottom: -1px;
427
- }
428
-
429
- .view-toggle-btn:hover { color: var(--color-text-primary); }
430
-
431
- .view-toggle-btn.active {
432
- color: var(--color-primary);
433
- border-bottom-color: var(--color-primary);
434
- }
435
-
436
- /* OUTPUT SCROLL */
437
- #output-scroll {
438
- flex: 1; overflow-y: auto; overflow-x: hidden;
439
- background-color: var(--color-bg-primary);
440
- position: relative;
441
- }
442
-
443
- .messages-wrapper {
444
- max-width: 768px; margin: 0 auto; width: 100%;
445
- padding: 1rem 1.5rem;
446
- }
447
-
448
- #output { width: 100%; }
449
-
450
- /* DROP ZONE */
451
- .drop-zone-overlay {
452
- display: none;
453
- position: absolute; inset: 0; z-index: 50;
454
- background: rgba(245,158,11,0.08);
455
- border: 2px dashed var(--color-primary);
456
- border-radius: 8px;
457
- align-items: center; justify-content: center;
458
- }
459
-
460
- .drop-zone-overlay.active { display: flex; }
461
-
462
- .drop-zone-content {
463
- text-align: center; pointer-events: none;
464
- }
465
-
466
- .drop-zone-icon {
467
- font-size: 3rem; color: var(--color-primary); line-height: 1;
468
- }
469
-
470
- .drop-zone-text {
471
- font-size: 1rem; font-weight: 500; color: var(--color-primary);
472
- margin-top: 0.5rem;
473
- }
474
-
475
- /* FILE BROWSER */
476
- .file-browser-container {
477
- flex: 1; display: flex; flex-direction: column; overflow: hidden;
478
- }
479
-
480
- .file-browser-iframe { flex: 1; border: none; width: 100%; height: 100%; }
481
-
482
- /* TERMINAL */
483
- .terminal-container {
484
- flex: 1; display: flex; flex-direction: column; overflow: hidden;
485
- background: #1e1e1e;
486
- }
487
-
488
- .terminal-output { flex: 1; overflow: hidden; }
489
-
490
- /* VOICE */
491
- .voice-container {
492
- flex: 1; display: flex; flex-direction: column; overflow: hidden;
493
- }
494
-
495
- .voice-scroll {
496
- flex: 1; overflow-y: auto; padding: 1rem 1.5rem;
497
- }
498
-
499
- .voice-messages { display: flex; flex-direction: column; gap: 1rem; }
500
-
501
- .voice-input-section {
502
- flex-shrink: 0; padding: 0.75rem 1rem;
503
- background: var(--color-bg-secondary);
504
- border-top: 1px solid var(--color-border-light);
505
- }
506
-
507
- .voice-input-wrapper {
508
- display: flex; align-items: center; gap: 0.5rem;
509
- margin-bottom: 0.5rem;
510
- }
511
-
512
- .voice-transcript {
513
- flex: 1; min-height: 2.5rem;
514
- padding: 0.5rem 0.75rem;
515
- border: 1px solid var(--color-border);
516
- border-radius: 6px;
517
- background: var(--color-bg-primary);
518
- color: var(--color-text-primary);
519
- font-size: 0.875rem;
520
- }
521
-
522
- .voice-mic-btn, .voice-send-btn, .voice-stop-btn {
523
- display: flex; align-items: center; justify-content: center;
524
- width: 40px; height: 40px; padding: 0;
525
- border-radius: 50%; border: none; cursor: pointer;
526
- transition: all 0.15s; flex-shrink: 0;
527
- }
528
-
529
- .voice-mic-btn { background: var(--color-bg-tertiary); color: var(--color-text-primary); }
530
- .voice-mic-btn:hover { background: var(--color-border); }
531
- .voice-mic-btn.recording { background: var(--color-error); color: white; }
532
-
533
- .voice-send-btn { background: var(--color-primary); color: white; }
534
- .voice-send-btn:hover { background: var(--color-primary-dark); }
535
-
536
- .voice-stop-btn {
537
- padding: 0.375rem 0.75rem; width: auto; height: auto;
538
- border-radius: 6px; font-size: 0.8rem;
539
- background: var(--color-bg-tertiary); color: var(--color-text-secondary);
540
- border: 1px solid var(--color-border-light);
541
- }
542
-
543
- .voice-stop-btn:hover { background: var(--color-error); color: white; border-color: var(--color-error); }
544
-
545
- .voice-tts-controls {
546
- display: flex; align-items: center; gap: 0.75rem;
547
- font-size: 0.8125rem; color: var(--color-text-secondary);
548
- }
549
-
550
- .voice-toggle-label {
551
- display: flex; align-items: center; gap: 0.375rem; cursor: pointer;
552
- }
553
-
554
- .voice-selector-wrapper { display: flex; align-items: center; }
555
-
556
- .voice-selector, .agent-selector, .model-selector {
557
- padding: 0.375rem 0.5rem;
558
- font-size: 0.8125rem;
559
- background: var(--color-bg-secondary);
560
- color: var(--color-text-primary);
561
- border: 1px solid var(--color-border);
562
- border-radius: 6px; cursor: pointer;
563
- transition: border-color 0.15s;
564
- }
565
-
566
- .voice-selector:focus, .agent-selector:focus, .model-selector:focus {
567
- outline: none; border-color: var(--color-primary);
568
- }
569
-
570
- .voice-agent-selector { font-size: 0.8125rem; }
571
-
572
- /* INPUT SECTION */
573
- .input-section {
574
- flex-shrink: 0;
575
- padding: 0.75rem 1rem;
576
- background-color: var(--color-bg-secondary);
577
- border-top: 1px solid var(--color-border-light);
578
- }
579
-
580
- .input-wrapper {
581
- display: flex; align-items: flex-end; gap: 0.5rem;
582
- max-width: 768px; margin: 0 auto;
583
- }
584
-
585
- .message-textarea {
586
- flex: 1;
587
- min-height: 2.5rem; max-height: 12rem;
588
- resize: none;
589
- background-color: var(--color-bg-primary);
590
- color: var(--color-text-primary);
591
- border: 1px solid var(--color-border);
592
- border-radius: 8px;
593
- padding: 0.625rem 0.75rem;
594
- font-family: inherit; font-size: 0.9375rem;
595
- line-height: 1.5;
596
- transition: border-color 0.15s, box-shadow 0.15s;
597
- outline: none;
598
- }
599
-
600
- .message-textarea:focus {
601
- border-color: var(--color-primary);
602
- box-shadow: 0 0 0 2px rgba(245,158,11,0.1);
603
- }
604
-
605
- .send-btn, .stop-btn, .inject-btn {
606
- display: flex; align-items: center; justify-content: center;
607
- width: 36px; height: 36px; padding: 0;
608
- border: none; border-radius: 6px; cursor: pointer;
609
- flex-shrink: 0; transition: all 0.15s;
610
- }
611
-
612
- .send-btn { background-color: var(--color-primary); color: white; }
613
- .send-btn:hover { background-color: var(--color-primary-dark); }
614
- .send-btn:disabled { opacity: 0.4; cursor: not-allowed; }
615
-
616
- .stop-btn { background-color: var(--color-error); color: white; }
617
- .stop-btn:hover { background-color: #dc2626; }
618
-
619
- .inject-btn { background-color: var(--color-bg-tertiary); color: var(--color-text-secondary); border: 1px solid var(--color-border-light); }
620
- .inject-btn:hover { background-color: var(--color-border); color: var(--color-text-primary); }
621
-
622
- /* FOLDER MODAL */
623
- .folder-modal-overlay {
624
- display: none;
625
- position: fixed; inset: 0; z-index: 200;
626
- background: rgba(0,0,0,0.5);
627
- align-items: center; justify-content: center;
628
- }
629
-
630
- .folder-modal-overlay.open { display: flex; }
631
-
632
- .folder-modal {
633
- background: var(--color-bg-secondary);
634
- border-radius: 8px;
635
- box-shadow: 0 8px 32px rgba(0,0,0,0.15);
636
- width: 480px; max-width: 90vw; max-height: 70vh;
637
- display: flex; flex-direction: column; overflow: hidden;
638
- }
639
-
640
- .folder-modal-header {
641
- display: flex; align-items: center; justify-content: space-between;
642
- padding: 1rem 1.25rem;
643
- border-bottom: 1px solid var(--color-border-light);
644
- }
645
-
646
- .folder-modal-header h3 {
647
- margin: 0; font-size: 1rem; font-weight: 600;
648
- color: var(--color-text-primary);
649
- }
650
-
651
- .folder-modal-close {
652
- display: flex; align-items: center; justify-content: center;
653
- width: 28px; height: 28px; padding: 0;
654
- background: none; border: none; border-radius: 4px;
655
- cursor: pointer; color: var(--color-text-secondary); font-size: 1.25rem;
656
- transition: all 0.15s;
657
- }
658
-
659
- .folder-modal-close:hover { background: var(--color-bg-tertiary); color: var(--color-text-primary); }
660
-
661
- .folder-breadcrumb {
662
- padding: 0.5rem 1.25rem;
663
- font-size: 0.8rem; color: var(--color-text-secondary);
664
- border-bottom: 1px solid var(--color-border-light);
665
- background: var(--color-bg-tertiary);
666
- }
667
-
668
- .folder-list {
669
- flex: 1; overflow-y: auto;
670
- list-style: none; margin: 0; padding: 0.5rem;
671
- }
672
-
673
- .folder-list-loading {
674
- padding: 1rem; text-align: center;
675
- color: var(--color-text-secondary); font-size: 0.875rem;
676
- }
677
-
678
- .folder-modal-footer {
679
- padding: 0.75rem 1.25rem;
680
- border-top: 1px solid var(--color-border-light);
681
- display: flex; justify-content: flex-end; gap: 0.5rem;
682
- }
683
-
684
- .btn {
685
- padding: 0.5rem 1rem;
686
- font-size: 0.875rem; font-weight: 500;
687
- border-radius: 6px; cursor: pointer; border: none;
688
- transition: all 0.15s;
689
- }
690
-
691
- .btn-primary { background: var(--color-primary); color: white; }
692
- .btn-primary:hover { background: var(--color-primary-dark); }
693
-
694
- .btn-secondary {
695
- background: var(--color-bg-tertiary); color: var(--color-text-primary);
696
- border: 1px solid var(--color-border);
697
- }
698
-
699
- .btn-secondary:hover { background: var(--color-border); }
700
-
701
- /* CODE BLOCKS */
702
- code, pre {
703
- font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
704
- font-size: 13px; line-height: 1.5;
705
- }
706
-
707
- pre {
708
- background-color: var(--color-bg-code);
709
- color: #E5E7EB;
710
- padding: 1rem; border-radius: 8px;
711
- overflow-x: auto; margin: 0.5rem 0;
712
- border: 1px solid rgba(255,255,255,0.05);
713
- }
714
-
715
- code {
716
- background-color: var(--color-bg-tertiary);
717
- color: var(--color-text-primary);
718
- padding: 0.2em 0.4em;
719
- border-radius: 4px; font-size: 0.9em;
720
- }
721
-
722
- pre code { background-color: transparent; color: inherit; padding: 0; }
723
-
724
- /* SCROLLBARS */
725
- ::-webkit-scrollbar { width: 6px; height: 6px; }
726
- ::-webkit-scrollbar-track { background-color: transparent; }
727
- ::-webkit-scrollbar-thumb { background-color: var(--color-border); border-radius: 3px; }
728
- ::-webkit-scrollbar-thumb:hover { background-color: var(--color-text-tertiary); }
729
-
730
- /* DIALOGS */
731
- .dialog-overlay { position: fixed; inset: 0; display: flex; align-items: center; justify-content: center; }
732
- .dialog-backdrop { position: absolute; inset: 0; background: rgba(0,0,0,0.5); }
733
- .dialog-box { position: fixed; top: 50%; left: 50%; transform: translate(-50%,-50%); background: var(--color-bg-secondary); border: 1px solid var(--color-border); border-radius: 8px; padding: 24px; min-width: 320px; max-width: 480px; box-shadow: 0 8px 32px rgba(0,0,0,0.2); }
734
- .dialog-box h3, .dialog-box .dialog-title { font-size: 1rem; font-weight: 600; margin-bottom: 12px; color: var(--color-text-primary); }
735
- .dialog-box p, .dialog-box .dialog-message { color: var(--color-text-secondary); margin-bottom: 16px; font-size: 0.875rem; }
736
- .dialog-box input, .dialog-box textarea { width: 100%; padding: 8px 12px; border: 1px solid var(--color-border); border-radius: 6px; background: var(--color-bg-tertiary); color: var(--color-text-primary); font-size: 0.875rem; margin-bottom: 16px; }
737
- .dialog-footer { display: flex; gap: 8px; justify-content: flex-end; }
738
- .dialog-btn { padding: 6px 16px; border-radius: 6px; border: 1px solid var(--color-border); background: var(--color-bg-tertiary); color: var(--color-text-primary); cursor: pointer; font-size: 0.875rem; }
739
- .dialog-btn-primary { background: var(--color-primary); border-color: var(--color-primary); color: #fff; }
740
- .dialog-btn:hover { opacity: 0.85; }
741
- .dialog-box-progress .dialog-progress-bar { height: 4px; background: var(--color-border); border-radius: 2px; overflow: hidden; margin-bottom: 8px; }
742
- .dialog-box-progress .dialog-progress-fill { height: 100%; background: var(--color-primary); transition: width 0.3s; }
743
-
744
- /* TOOL ICONS */
745
- .folded-tool-icon { display: inline-flex; align-items: center; flex-shrink: 0; }
746
- .folded-tool-icon svg { width: 16px; height: 16px; flex-shrink: 0; }
747
- .folded-tool-bar { display: flex; align-items: center; gap: 6px; }
748
- .tool-result-status { display: flex; align-items: center; gap: 6px; }
749
-
750
- /* RESPONSIVE */
751
- @media (max-width: 768px) {
752
- .sidebar {
753
- position: absolute; left: 0; top: 0; bottom: 0; z-index: 100;
754
- box-shadow: 2px 0 16px rgba(0,0,0,0.1);
755
- }
756
-
757
- .sidebar.collapsed { display: none; }
758
-
759
- .messages-wrapper, .input-wrapper { padding-left: 1rem; padding-right: 1rem; }
760
- }
761
- </style>
762
- </head>
763
- <body>
764
- <!-- Sidebar overlay (mobile) -->
765
- <div class="sidebar-overlay" data-sidebar-overlay></div>
766
-
767
- <div class="app-shell">
768
- <!-- ===== SIDEBAR ===== -->
769
- <aside class="sidebar" data-sidebar>
770
- <div class="sidebar-header">
771
- <h2>History</h2>
772
- <div class="sidebar-header-actions">
773
- <button id="cloneRepoBtn" class="sidebar-clone-btn" data-clone-repo title="Clone a GitHub repo">Clone</button>
774
- <button id="newConversationBtn" class="sidebar-new-btn" data-new-conversation title="Start new conversation">+ New</button>
775
- </div>
776
- </div>
777
- <div class="clone-input-bar" id="cloneInputBar" style="display:none;">
778
- <input type="text" class="clone-input" id="cloneRepoInput" placeholder="org/repo" autocomplete="off" spellcheck="false">
779
- <button class="clone-go-btn" id="cloneGoBtn" title="Clone">Go</button>
780
- <button class="clone-cancel-btn" id="cloneCancelBtn" title="Cancel">&times;</button>
781
- </div>
782
- <ul class="sidebar-list" data-conversation-list>
783
- <li class="sidebar-empty" data-conversation-empty>No conversations yet</li>
784
- </ul>
785
- </aside>
786
-
787
- <!-- ===== MAIN PANEL ===== -->
788
- <main id="app" class="main-panel">
789
- <!-- Header bar -->
790
- <div class="main-header">
791
- <button class="sidebar-toggle-btn" data-sidebar-toggle title="Toggle sidebar (Ctrl+B)" aria-label="Toggle sidebar">
792
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
793
- <line x1="3" y1="6" x2="21" y2="6"></line>
794
- <line x1="3" y1="12" x2="21" y2="12"></line>
795
- <line x1="3" y1="18" x2="21" y2="18"></line>
796
- </svg>
797
- </button>
798
-
799
- <h1 class="header-title">AgentGUI</h1>
800
-
801
- <div class="header-controls">
802
- <div class="script-buttons" id="scriptButtons" style="display:none;">
803
- <button class="header-icon-btn" id="scriptStartBtn" title="Run start script" aria-label="Run start script" style="display:none;">
804
- <svg viewBox="0 0 24 24" fill="currentColor" stroke="none"><polygon points="6,3 20,12 6,21"></polygon></svg>
805
- </button>
806
- <button class="header-icon-btn script-dev-btn" id="scriptDevBtn" title="Run dev script" aria-label="Run dev script" style="display:none;">
807
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6"></polyline><polyline points="8 6 2 12 8 18"></polyline></svg>
808
- </button>
809
- <button class="header-icon-btn script-stop-btn" id="scriptStopBtn" title="Stop running script" aria-label="Stop running script" style="display:none;">
810
- <svg viewBox="0 0 24 24" fill="currentColor" stroke="none"><rect x="5" y="5" width="14" height="14" rx="1"></rect></svg>
811
- </button>
812
- </div>
813
- <button class="header-icon-btn agent-auth-btn" id="agentAuthBtn" title="Agent authentication" aria-label="Agent authentication" style="display:none;">
814
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"></path></svg>
815
- <div class="agent-auth-dropdown" id="agentAuthDropdown"></div>
816
- </button>
817
- <div class="status-badge">
818
- <div class="status-indicator" data-status="disconnected"></div>
819
- <span id="connectionStatus" data-status-indicator>Disconnected</span>
820
- </div>
821
- <button class="theme-toggle-btn" data-theme-toggle title="Toggle dark mode" aria-label="Toggle dark mode">
822
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
823
- <circle cx="12" cy="12" r="5"></circle>
824
- <line x1="12" y1="1" x2="12" y2="3"></line>
825
- <line x1="12" y1="21" x2="12" y2="23"></line>
826
- <line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
827
- <line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
828
- <line x1="1" y1="12" x2="3" y2="12"></line>
829
- <line x1="21" y1="12" x2="23" y2="12"></line>
830
- <line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
831
- <line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
832
- </svg>
833
- </button>
834
- </div>
835
- </div>
836
-
837
- <!-- View toggle bar (hidden by default) -->
838
- <div class="view-toggle-bar" id="viewToggleBar" style="display:none;">
839
- <button class="view-toggle-btn active" data-view="chat">Chat</button>
840
- <button class="view-toggle-btn" data-view="files">Files</button>
841
- <button class="view-toggle-btn" data-view="voice" style="display:none;">Voice</button>
842
- <button class="view-toggle-btn" data-view="terminal" id="terminalTabBtn" style="display:none;">Terminal</button>
843
- </div>
844
-
845
- <!-- Messages scroll area -->
846
- <div id="output-scroll" role="region" aria-label="Chat messages" aria-live="polite" data-drop-zone>
847
- <div class="messages-wrapper">
848
- <div id="output"></div>
849
- </div>
850
- <div class="drop-zone-overlay" id="dropZoneOverlay">
851
- <div class="drop-zone-content">
852
- <div class="drop-zone-icon">+</div>
853
- <div class="drop-zone-text">Drop files here to copy to working directory</div>
854
- </div>
855
- </div>
856
- </div>
857
-
858
- <!-- File browser (hidden by default) -->
859
- <div id="fileBrowserContainer" class="file-browser-container" style="display:none;">
860
- <iframe id="fileBrowserIframe" class="file-browser-iframe"></iframe>
861
- </div>
862
-
863
- <!-- Terminal output view -->
864
- <div id="terminalContainer" class="terminal-container" style="display:none;">
865
- <div id="terminalOutput" class="terminal-output"></div>
866
- </div>
867
-
868
- <!-- Voice STT/TTS view -->
869
- <div id="voiceContainer" class="voice-container" style="display:none;">
870
- <div id="voiceScroll" class="voice-scroll">
871
- <div class="voice-messages" id="voiceMessages"></div>
872
- </div>
873
- <div class="voice-input-section">
874
- <div class="voice-input-wrapper">
875
- <select class="agent-selector voice-agent-selector" data-voice-agent-selector title="Select agent"></select>
876
- <div class="voice-transcript" id="voiceTranscript" data-placeholder="Tap mic and speak..."></div>
877
- <button class="voice-mic-btn" id="voiceMicBtn" title="Toggle recording" aria-label="Voice input">
878
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
879
- <path d="M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z"/>
880
- <path d="M19 10v2a7 7 0 0 1-14 0v-2"/>
881
- <line x1="12" y1="19" x2="12" y2="23"/>
882
- <line x1="8" y1="23" x2="16" y2="23"/>
883
- </svg>
884
- </button>
885
- <button class="send-btn voice-send-btn" id="voiceSendBtn" title="Send message" aria-label="Send message">
886
- <svg viewBox="0 0 24 24" fill="currentColor">
887
- <path d="M2.01 21L23 12 2.01 3 2 10l15 2-15 2z"/>
888
- </svg>
889
- </button>
890
- </div>
891
- <div class="voice-tts-controls">
892
- <label class="voice-toggle-label">
893
- <input type="checkbox" id="voiceTTSToggle" checked>
894
- <span>Auto-speak responses</span>
895
- </label>
896
- <div class="voice-selector-wrapper">
897
- <select class="voice-selector" id="voiceSelector" title="Select voice">
898
- <option value="default">Default</option>
899
- </select>
900
- </div>
901
- <button class="voice-stop-btn" id="voiceStopSpeaking" title="Stop speaking">Stop</button>
902
- </div>
903
- </div>
904
- </div>
905
-
906
- <!-- Input area: fixed at bottom -->
907
- <div class="input-section">
908
- <div class="input-wrapper">
909
- <select class="agent-selector" data-agent-selector title="Select agent"></select>
910
- <select class="model-selector" data-model-selector title="Select model" data-empty="true"></select>
911
- <textarea
912
- class="message-textarea"
913
- data-message-input
914
- placeholder="Message AgentGUI... (Ctrl+Enter to send)"
915
- aria-label="Message input"
916
- rows="1"
917
- ></textarea>
918
- <button class="inject-btn" id="injectBtn" title="Inject instructions into running agent" aria-label="Inject instructions">
919
- <svg viewBox="0 0 24 24" fill="currentColor" width="18" height="18">
920
- <path d="M20 12l-1.41-1.41L13 16.17V4h-2v12.17l-5.58-5.59L4 12l8 8 8-8z"/>
921
- </svg>
922
- </button>
923
- <button class="stop-btn" id="stopBtn" title="Stop running agent (emergency)" aria-label="Stop agent">
924
- <svg viewBox="0 0 24 24" fill="currentColor" width="18" height="18">
925
- <path d="M6 6h12v12H6z"/>
926
- </svg>
927
- </button>
928
- <button class="send-btn" data-send-button title="Send message (Ctrl+Enter)" aria-label="Send message">
929
- <svg viewBox="0 0 24 24" fill="currentColor">
930
- <path d="M2.01 21L23 12 2.01 3 2 10l15 2-15 2z"/>
931
- </svg>
932
- </button>
933
- </div>
934
- </div>
935
- </main>
936
- </div>
937
-
938
- <!-- Folder Browser Modal -->
939
- <div id="folderBrowserModal" class="folder-modal-overlay">
940
- <div class="folder-modal">
941
- <div class="folder-modal-header">
942
- <h3>Select Working Directory</h3>
943
- <button class="folder-modal-close" data-folder-close>&times;</button>
944
- </div>
945
- <div id="folderBreadcrumb" class="folder-breadcrumb"></div>
946
- <ul id="folderList" class="folder-list">
947
- <li class="folder-list-loading">Loading...</li>
948
- </ul>
949
- <div class="folder-modal-footer">
950
- <button class="btn btn-secondary" data-folder-cancel>Cancel</button>
951
- <button class="btn btn-primary" data-folder-select>Select This Folder</button>
952
- </div>
953
- </div>
954
- </div>
955
-
956
- <script>
957
- var _escHtmlMap = { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' };
958
- var _escHtmlRe = /[&<>"']/g;
959
- window._escHtml = function(t) { return t.replace(_escHtmlRe, function(c) { return _escHtmlMap[c]; }); };
960
- </script>
961
- <script defer src="/gm/js/event-processor.js"></script>
962
- <script defer src="/gm/js/streaming-renderer.js"></script>
963
- <script defer src="/gm/js/kalman-filter.js"></script>
964
- <script defer src="/gm/js/event-consolidator.js"></script>
965
- <script defer src="/gm/js/websocket-manager.js"></script>
966
- <script defer src="/gm/js/event-filter.js"></script>
967
- <script defer src="/gm/js/syntax-highlighter.js"></script>
968
- <script defer src="/gm/js/dialogs.js"></script>
969
- <script defer src="/gm/js/ui-components.js"></script>
970
- <script defer src="/gm/js/progress-dialog.js"></script>
971
- <script defer src="/gm/js/conversations.js"></script>
972
- <script defer src="/gm/js/client.js"></script>
973
- <script type="module" src="/gm/js/voice.js"></script>
974
- <script defer src="/gm/js/features.js"></script>
975
- <script defer src="/gm/js/script-runner.js"></script>
976
- <script defer src="/gm/js/agent-auth.js"></script>
977
-
978
- <script>
979
- const savedTheme = localStorage.getItem('theme') || 'light';
980
- if (savedTheme === 'dark') document.documentElement.classList.add('dark');
981
-
982
- window.addEventListener('error', (event) => console.error('Uncaught error:', event.error));
983
- window.addEventListener('unhandledrejection', (event) => console.error('Unhandled rejection:', event.reason));
984
- </script>
985
- </body>
986
- </html>
1
+ <!DOCTYPE html>
2
+ <html lang="en" class="light">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover">
6
+ <meta name="description" content="AgentGUI - Real-time Claude Code Execution Visualization">
7
+ <title>AgentGUI</title>
8
+ <link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Crect width='100' height='100' rx='20' fill='%233b82f6'/%3E%3Ctext x='50' y='68' font-size='50' font-family='sans-serif' font-weight='bold' fill='white' text-anchor='middle'%3EG%3C/text%3E%3C/svg%3E">
9
+
10
+ <link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin>
11
+ <link rel="preconnect" href="https://cdnjs.cloudflare.com" crossorigin>
12
+ <link href="https://cdn.jsdelivr.net/npm/rippleui@1.12.1/dist/css/styles.css" rel="stylesheet">
13
+ <link rel="preload" href="https://cdn.jsdelivr.net/npm/prismjs@1.29.0/themes/prism-dark.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
14
+ <noscript><link href="https://cdn.jsdelivr.net/npm/prismjs@1.29.0/themes/prism-dark.css" rel="stylesheet"></noscript>
15
+ <link rel="preload" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/styles/github-dark.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
16
+ <noscript><link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/styles/github-dark.min.css" rel="stylesheet"></noscript>
17
+ <script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/highlight.min.js"></script>
18
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@xterm/xterm@5.5.0/css/xterm.min.css">
19
+ <script defer src="https://cdn.jsdelivr.net/npm/@xterm/xterm@5.5.0/lib/xterm.min.js"></script>
20
+ <script defer src="https://cdn.jsdelivr.net/npm/@xterm/addon-fit@0.10.0/lib/addon-fit.min.js"></script>
21
+
22
+ <style>
23
+ *, *::before, *::after { box-sizing: border-box; }
24
+
25
+ :root {
26
+ --color-primary: #3b82f6;
27
+ --color-primary-dark: #1e40af;
28
+ --color-bg-primary: #ffffff;
29
+ --color-bg-secondary: #f9fafb;
30
+ --color-bg-code: #1f2937;
31
+ --color-text-primary: #111827;
32
+ --color-text-secondary: #6b7280;
33
+ --color-border: #e5e7eb;
34
+ --color-success: #10b981;
35
+ --color-error: #ef4444;
36
+ --color-warning: #f59e0b;
37
+ --color-info: #0891b2;
38
+ --sidebar-width: 300px;
39
+ --header-height: 52px;
40
+ --msg-max-width: 100%;
41
+ }
42
+
43
+ html.dark {
44
+ --color-bg-primary: #111827;
45
+ --color-bg-secondary: #1f2937;
46
+ --color-text-primary: #f9fafb;
47
+ --color-text-secondary: #d1d5db;
48
+ --color-border: #374151;
49
+ }
50
+
51
+ html, body {
52
+ margin: 0;
53
+ padding: 0;
54
+ height: 100%;
55
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
56
+ background-color: var(--color-bg-primary);
57
+ color: var(--color-text-primary);
58
+ }
59
+
60
+ /* ===== ROOT LAYOUT: sidebar + main, full viewport ===== */
61
+ .app-shell {
62
+ display: flex;
63
+ height: 100dvh;
64
+ height: 100vh;
65
+ overflow: hidden;
66
+ padding-top: env(safe-area-inset-top);
67
+ padding-bottom: env(safe-area-inset-bottom);
68
+ padding-left: env(safe-area-inset-left);
69
+ padding-right: env(safe-area-inset-right);
70
+ }
71
+
72
+ /* ===== SIDEBAR ===== */
73
+ .sidebar {
74
+ width: var(--sidebar-width);
75
+ flex-shrink: 0;
76
+ display: flex;
77
+ flex-direction: column;
78
+ background-color: var(--color-bg-secondary);
79
+ overflow: hidden;
80
+ transition: width 0.25s ease, min-width 0.25s ease;
81
+ }
82
+
83
+ .sidebar.collapsed {
84
+ width: 0;
85
+ min-width: 0;
86
+ border-right: none;
87
+ }
88
+
89
+ .sidebar-header {
90
+ padding: 0.75rem 1rem;
91
+ display: flex;
92
+ justify-content: space-between;
93
+ align-items: center;
94
+ flex-shrink: 0;
95
+ min-height: var(--header-height);
96
+ }
97
+
98
+ .sidebar-header h2 {
99
+ margin: 0;
100
+ font-size: 0.875rem;
101
+ font-weight: 600;
102
+ text-transform: uppercase;
103
+ letter-spacing: 0.05em;
104
+ color: var(--color-text-secondary);
105
+ white-space: nowrap;
106
+ overflow: hidden;
107
+ }
108
+
109
+ .sidebar-new-btn {
110
+ padding: 0.375rem 0.625rem;
111
+ font-size: 0.75rem;
112
+ background-color: var(--color-primary);
113
+ color: white;
114
+ border: none;
115
+ border-radius: 0.375rem;
116
+ cursor: pointer;
117
+ transition: background-color 0.2s;
118
+ white-space: nowrap;
119
+ flex-shrink: 0;
120
+ }
121
+
122
+ .sidebar-new-btn:hover { background-color: var(--color-primary-dark); }
123
+
124
+ .sidebar-header-actions {
125
+ display: flex;
126
+ gap: 0.375rem;
127
+ align-items: center;
128
+ flex-shrink: 0;
129
+ }
130
+
131
+ .sidebar-clone-btn {
132
+ padding: 0.375rem 0.625rem;
133
+ font-size: 0.75rem;
134
+ background-color: var(--color-bg-primary);
135
+ color: var(--color-text-primary);
136
+ border: 1px solid var(--color-border);
137
+ border-radius: 0.375rem;
138
+ cursor: pointer;
139
+ transition: all 0.2s;
140
+ white-space: nowrap;
141
+ flex-shrink: 0;
142
+ }
143
+
144
+ .sidebar-clone-btn:hover { border-color: var(--color-primary); color: var(--color-primary); }
145
+
146
+ .clone-input-bar {
147
+ display: flex;
148
+ align-items: center;
149
+ gap: 0.375rem;
150
+ padding: 0.375rem 0.75rem;
151
+ background: var(--color-bg-primary);
152
+ border-bottom: 1px solid var(--color-border);
153
+ flex-shrink: 0;
154
+ }
155
+
156
+ .clone-input {
157
+ flex: 1;
158
+ min-width: 0;
159
+ padding: 0.375rem 0.5rem;
160
+ font-size: 0.8rem;
161
+ font-family: 'Monaco','Menlo','Ubuntu Mono', monospace;
162
+ border: 1px solid var(--color-border);
163
+ border-radius: 0.25rem;
164
+ background: var(--color-bg-secondary);
165
+ color: var(--color-text-primary);
166
+ outline: none;
167
+ }
168
+
169
+ .clone-input:focus { border-color: var(--color-primary); }
170
+
171
+ .clone-go-btn {
172
+ padding: 0.375rem 0.625rem;
173
+ font-size: 0.75rem;
174
+ font-weight: 600;
175
+ background: var(--color-primary);
176
+ color: white;
177
+ border: none;
178
+ border-radius: 0.25rem;
179
+ cursor: pointer;
180
+ flex-shrink: 0;
181
+ transition: background-color 0.15s;
182
+ }
183
+
184
+ .clone-go-btn:hover { background-color: var(--color-primary-dark); }
185
+ .clone-go-btn:disabled { opacity: 0.5; cursor: not-allowed; }
186
+
187
+ .clone-cancel-btn {
188
+ padding: 0.25rem 0.5rem;
189
+ font-size: 1rem;
190
+ background: none;
191
+ border: none;
192
+ cursor: pointer;
193
+ color: var(--color-text-secondary);
194
+ flex-shrink: 0;
195
+ line-height: 1;
196
+ }
197
+
198
+ .clone-cancel-btn:hover { color: var(--color-text-primary); }
199
+
200
+ .clone-status {
201
+ padding: 0.375rem 0.75rem;
202
+ font-size: 0.75rem;
203
+ background: var(--color-bg-primary);
204
+ border-bottom: 1px solid var(--color-border);
205
+ flex-shrink: 0;
206
+ display: flex;
207
+ align-items: center;
208
+ gap: 0.5rem;
209
+ }
210
+
211
+ .clone-status.cloning { color: var(--color-primary); }
212
+ .clone-status.clone-error { color: var(--color-error); }
213
+ .clone-status.clone-success { color: var(--color-success); }
214
+
215
+ .sidebar-list {
216
+ flex: 1;
217
+ overflow-y: auto;
218
+ overflow-x: hidden;
219
+ list-style: none;
220
+ margin: 0;
221
+ padding: 0.5rem 0;
222
+ -webkit-overflow-scrolling: touch;
223
+ }
224
+
225
+ .conversation-item {
226
+ padding: 0.75rem 0.75rem;
227
+ margin: 0.125rem 0.5rem;
228
+ border-radius: 0.375rem;
229
+ cursor: pointer;
230
+ transition: background-color 0.15s;
231
+ border-left: 3px solid transparent;
232
+ user-select: none;
233
+ }
234
+
235
+ .conversation-item:hover { background-color: var(--color-bg-primary); }
236
+
237
+ .conversation-item.active {
238
+ background-color: var(--color-primary);
239
+ color: white;
240
+ border-left-color: var(--color-primary-dark);
241
+ }
242
+
243
+ .conversation-item-title {
244
+ font-weight: 500;
245
+ font-size: 0.875rem;
246
+ margin: 0;
247
+ white-space: nowrap;
248
+ overflow: hidden;
249
+ text-overflow: ellipsis;
250
+ }
251
+
252
+ .conversation-item-meta {
253
+ font-size: 0.75rem;
254
+ color: var(--color-text-secondary);
255
+ margin-top: 0.125rem;
256
+ white-space: nowrap;
257
+ overflow: hidden;
258
+ text-overflow: ellipsis;
259
+ }
260
+
261
+ .conversation-item.active .conversation-item-meta { color: rgba(255,255,255,0.7); }
262
+
263
+ .conversation-streaming-badge {
264
+ display: inline-flex;
265
+ align-items: center;
266
+ margin-right: 0.375rem;
267
+ vertical-align: middle;
268
+ }
269
+
270
+ .streaming-dot {
271
+ display: inline-block;
272
+ width: 0.5rem;
273
+ height: 0.5rem;
274
+ border-radius: 50%;
275
+ background-color: var(--color-success);
276
+ animation: pulse 1.5s ease-in-out infinite;
277
+ }
278
+
279
+ .conversation-item.active .streaming-dot {
280
+ background-color: #fff;
281
+ }
282
+
283
+ .conversation-item {
284
+ display: flex;
285
+ align-items: center;
286
+ justify-content: space-between;
287
+ gap: 0.5rem;
288
+ }
289
+
290
+ .conversation-item-content {
291
+ flex: 1;
292
+ min-width: 0;
293
+ overflow: hidden;
294
+ }
295
+
296
+ .conversation-item-delete {
297
+ flex-shrink: 0;
298
+ width: 28px;
299
+ height: 28px;
300
+ padding: 0;
301
+ display: flex;
302
+ align-items: center;
303
+ justify-content: center;
304
+ background: transparent;
305
+ border: none;
306
+ border-radius: 0.25rem;
307
+ cursor: pointer;
308
+ color: var(--color-text-secondary);
309
+ opacity: 0;
310
+ transition: all 0.15s;
311
+ }
312
+
313
+ .conversation-item:hover .conversation-item-delete {
314
+ opacity: 1;
315
+ }
316
+
317
+ .conversation-item-delete:hover {
318
+ background-color: var(--color-error);
319
+ color: white;
320
+ }
321
+
322
+ .conversation-item.active .conversation-item-delete {
323
+ color: rgba(255,255,255,0.8);
324
+ }
325
+
326
+ .conversation-item.active .conversation-item-delete:hover {
327
+ background-color: rgba(255,255,255,0.2);
328
+ color: white;
329
+ }
330
+
331
+ .sidebar-empty {
332
+ padding: 2rem 1rem;
333
+ text-align: center;
334
+ color: var(--color-text-secondary);
335
+ font-size: 0.875rem;
336
+ }
337
+
338
+ /* ===== MAIN PANEL: header + messages + input ===== */
339
+ .main-panel {
340
+ flex: 1;
341
+ display: flex;
342
+ flex-direction: column;
343
+ overflow: hidden;
344
+ min-width: 0;
345
+ background-color: var(--color-bg-primary);
346
+ }
347
+
348
+ /* --- Header bar --- */
349
+ .main-header {
350
+ display: flex;
351
+ align-items: center;
352
+ gap: 0.75rem;
353
+ padding: 0 1rem;
354
+ height: var(--header-height);
355
+ min-height: var(--header-height);
356
+ flex-shrink: 0;
357
+ background-color: var(--color-bg-secondary);
358
+ }
359
+
360
+ .sidebar-toggle-btn {
361
+ display: flex;
362
+ align-items: center;
363
+ justify-content: center;
364
+ width: 36px;
365
+ height: 36px;
366
+ background: none;
367
+ border: none;
368
+ border-radius: 0.375rem;
369
+ cursor: pointer;
370
+ color: var(--color-text-secondary);
371
+ flex-shrink: 0;
372
+ transition: background-color 0.15s, color 0.15s;
373
+ }
374
+
375
+ .sidebar-toggle-btn:hover {
376
+ background-color: var(--color-bg-primary);
377
+ color: var(--color-text-primary);
378
+ }
379
+
380
+ .sidebar-toggle-btn svg {
381
+ width: 18px;
382
+ height: 18px;
383
+ }
384
+
385
+ .header-title {
386
+ font-size: 1.125rem;
387
+ font-weight: 600;
388
+ margin: 0;
389
+ flex: 1;
390
+ min-width: 0;
391
+ overflow: hidden;
392
+ text-overflow: ellipsis;
393
+ white-space: nowrap;
394
+ }
395
+
396
+ .header-controls {
397
+ display: flex;
398
+ gap: 0.5rem;
399
+ align-items: center;
400
+ flex-shrink: 0;
401
+ }
402
+
403
+ .status-badge {
404
+ display: inline-flex;
405
+ align-items: center;
406
+ gap: 0.375rem;
407
+ padding: 0.25rem 0.625rem;
408
+ border-radius: 1rem;
409
+ font-size: 0.75rem;
410
+ font-weight: 500;
411
+ background-color: var(--color-bg-primary);
412
+ }
413
+
414
+ .status-indicator {
415
+ width: 0.5rem;
416
+ height: 0.5rem;
417
+ border-radius: 50%;
418
+ background-color: var(--color-error);
419
+ animation: pulse 2s infinite;
420
+ }
421
+
422
+ .status-indicator[data-status="connected"] { background-color: var(--color-success); }
423
+ .status-indicator[data-status="reconnecting"],
424
+ .status-indicator[data-status="connecting"] { background-color: var(--color-warning); animation: pulse 1s infinite; }
425
+
426
+ @keyframes pulse { 0%,100% { opacity:1; } 50% { opacity:0.5; } }
427
+
428
+ .theme-toggle-btn {
429
+ display: flex;
430
+ align-items: center;
431
+ justify-content: center;
432
+ width: 36px;
433
+ height: 36px;
434
+ background: none;
435
+ border: none;
436
+ border-radius: 0.375rem;
437
+ cursor: pointer;
438
+ color: var(--color-text-secondary);
439
+ transition: background-color 0.15s;
440
+ }
441
+
442
+ .theme-toggle-btn:hover {
443
+ background-color: var(--color-bg-primary);
444
+ color: var(--color-text-primary);
445
+ }
446
+
447
+ .script-buttons { display: flex; gap: 0.25rem; align-items: center; }
448
+ .header-icon-btn {
449
+ display: flex; align-items: center; justify-content: center;
450
+ width: 36px; height: 36px; background: none; border: none;
451
+ border-radius: 0.375rem; cursor: pointer; color: var(--color-text-secondary);
452
+ transition: background-color 0.15s, color 0.15s;
453
+ }
454
+ .header-icon-btn:hover { background-color: var(--color-bg-primary); color: var(--color-text-primary); }
455
+ .header-icon-btn svg { width: 20px; height: 20px; }
456
+ #scriptStartBtn { color: var(--color-success); }
457
+ #scriptStartBtn:hover { background-color: rgba(16,185,129,0.1); color: var(--color-success); }
458
+ .script-dev-btn { color: var(--color-info); }
459
+ .script-dev-btn:hover { background-color: rgba(8,145,178,0.1); color: var(--color-info); }
460
+ .script-stop-btn { color: var(--color-error); }
461
+ .script-stop-btn:hover { background-color: rgba(239,68,68,0.1); color: var(--color-error); }
462
+
463
+ .agent-auth-btn { color: var(--color-text-secondary); position: relative; }
464
+ .agent-auth-btn.auth-ok { color: var(--color-success); }
465
+ .agent-auth-btn.auth-warn { color: var(--color-warning); }
466
+ .agent-auth-btn:hover { background-color: var(--color-bg-primary); }
467
+ .agent-auth-dropdown {
468
+ position: absolute; top: 100%; right: 0; z-index: 100;
469
+ min-width: 260px; padding: 0.25rem 0;
470
+ background: var(--color-bg-secondary); border: 1px solid var(--color-border);
471
+ border-radius: 0.5rem; box-shadow: 0 4px 12px rgba(0,0,0,0.15);
472
+ display: none;
473
+ }
474
+ .agent-auth-dropdown.open { display: block; }
475
+ .agent-auth-item {
476
+ display: flex; align-items: center; gap: 0.5rem;
477
+ padding: 0.5rem 0.75rem; cursor: pointer; font-size: 0.8125rem;
478
+ color: var(--color-text-primary); border: none; background: none; width: 100%;
479
+ text-align: left;
480
+ }
481
+ .agent-auth-item:hover { background: var(--color-bg-primary); }
482
+ .agent-auth-dot {
483
+ width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0;
484
+ }
485
+ .agent-auth-dot.ok { background: var(--color-success); }
486
+ .agent-auth-dot.missing { background: var(--color-warning); }
487
+ .agent-auth-dot.unknown { background: var(--color-text-secondary); }
488
+ .agent-auth-section-header {
489
+ padding: 0.375rem 0.75rem; font-size: 0.6875rem; font-weight: 600;
490
+ text-transform: uppercase; letter-spacing: 0.05em;
491
+ color: var(--color-text-secondary); user-select: none;
492
+ }
493
+
494
+ .terminal-container {
495
+ flex: 1; display: flex; flex-direction: column; overflow: hidden; background: #1e1e1e;
496
+ }
497
+ .terminal-output { flex: 1; overflow: hidden; }
498
+
499
+ /* --- View toggle bar --- */
500
+ .view-toggle-bar {
501
+ display: flex;
502
+ gap: 0;
503
+ background: var(--color-bg-secondary);
504
+ flex-shrink: 0;
505
+ padding: 0 1rem;
506
+ }
507
+
508
+ .view-toggle-btn {
509
+ padding: 0.5rem 1rem;
510
+ border: none;
511
+ background: none;
512
+ cursor: pointer;
513
+ font-size: 0.875rem;
514
+ font-weight: 500;
515
+ color: var(--color-text-secondary);
516
+ border-bottom: 2px solid transparent;
517
+ transition: all 0.2s;
518
+ min-height: 40px;
519
+ }
520
+
521
+ .view-toggle-btn:hover { color: var(--color-text-primary); }
522
+ .view-toggle-btn.active { color: var(--color-primary); border-bottom-color: var(--color-primary); }
523
+
524
+ /* --- Messages scroll area --- */
525
+ #output-scroll {
526
+ flex: 1;
527
+ overflow-y: auto;
528
+ overflow-x: hidden;
529
+ min-height: 0;
530
+ -webkit-overflow-scrolling: touch;
531
+ position: relative;
532
+ }
533
+
534
+ .messages-wrapper {
535
+ max-width: 100%;
536
+ margin: 0;
537
+ width: 100%;
538
+ padding: 0.75rem 2rem;
539
+ display: flex;
540
+ flex-direction: column;
541
+ }
542
+
543
+ #output {
544
+ display: flex;
545
+ flex-direction: column;
546
+ gap: 0;
547
+ flex: 1;
548
+ }
549
+
550
+ /* --- Conversation display --- */
551
+ .conversation-header {
552
+ padding: 0.5rem 0;
553
+ margin-bottom: 0.5rem;
554
+ }
555
+
556
+ .conversation-header h2 { margin: 0 0 0.25rem 0; font-size: 1.25rem; }
557
+ .conversation-header p { margin: 0; font-size: 0.8rem; color: var(--color-text-secondary); }
558
+
559
+ .conversation-messages { padding: 0; }
560
+
561
+ /* --- Messages --- */
562
+ .message {
563
+ margin-bottom: 0;
564
+ padding: 0.5rem 0.75rem;
565
+ border-radius: 0.75rem;
566
+ max-width: 85%;
567
+ word-break: break-word;
568
+ }
569
+
570
+ .message-user {
571
+ background-color: var(--color-primary);
572
+ color: white;
573
+ margin-left: auto;
574
+ border-bottom-right-radius: 0.25rem;
575
+ }
576
+
577
+ .message-assistant {
578
+ background-color: var(--color-bg-secondary);
579
+ margin-right: auto;
580
+ border-bottom-left-radius: 0.25rem;
581
+ }
582
+
583
+ /* Consecutive assistant messages: join them visually */
584
+ .message-assistant + .message-assistant {
585
+ border-top-left-radius: 0;
586
+ border-top-right-radius: 0;
587
+ margin-top: -0.125rem;
588
+ padding-top: 0.25rem;
589
+ }
590
+ .message-assistant:has(+ .message-assistant) {
591
+ border-bottom-left-radius: 0;
592
+ border-bottom-right-radius: 0;
593
+ padding-bottom: 0.25rem;
594
+ }
595
+
596
+ .message-role {
597
+ font-weight: 600;
598
+ font-size: 0.7rem;
599
+ text-transform: uppercase;
600
+ letter-spacing: 0.04em;
601
+ margin-bottom: 0.125rem;
602
+ opacity: 0.7;
603
+ }
604
+
605
+ .message-user .message-role { color: rgba(255,255,255,0.8); }
606
+ .message-assistant .message-role { color: var(--color-text-secondary); }
607
+
608
+ .message-content {
609
+ font-size: 0.9rem;
610
+ line-height: 1.6;
611
+ white-space: pre-wrap;
612
+ word-break: break-word;
613
+ }
614
+
615
+ .message-timestamp {
616
+ font-size: 0.7rem;
617
+ margin-top: 0.25rem;
618
+ opacity: 0.6;
619
+ }
620
+
621
+ .message-user .message-timestamp { color: rgba(255,255,255,0.7); }
622
+ .message-assistant .message-timestamp { color: var(--color-text-secondary); }
623
+
624
+ .message-blocks {
625
+ display: flex;
626
+ flex-direction: column;
627
+ gap: 0.125rem;
628
+ }
629
+
630
+ .message-text {
631
+ line-height: 1.6;
632
+ word-break: break-word;
633
+ white-space: pre-wrap;
634
+ }
635
+
636
+ .message-code {
637
+ background-color: var(--color-bg-code);
638
+ border-radius: 0.375rem;
639
+ padding: 0.5rem;
640
+ overflow-x: auto;
641
+ margin: 0.25rem 0;
642
+ }
643
+
644
+ .message-code pre {
645
+ margin: 0;
646
+ font-family: 'Courier New', monospace;
647
+ font-size: 0.85rem;
648
+ color: #e0e0e0;
649
+ }
650
+
651
+ .message-tool {
652
+ background-color: var(--color-primary);
653
+ color: white;
654
+ padding: 0.25rem 0.5rem;
655
+ border-radius: 0.25rem;
656
+ font-size: 0.75rem;
657
+ display: inline-block;
658
+ margin: 0.25rem 0;
659
+ }
660
+
661
+ /* --- Streaming block types --- */
662
+ .streaming-block-system {
663
+ padding: 0.375rem 0.75rem;
664
+ margin: 0;
665
+ background: rgba(59,130,246,0.08);
666
+ border-radius: 0.375rem;
667
+ font-size: 0.8rem;
668
+ display: flex;
669
+ align-items: center;
670
+ gap: 0.5rem;
671
+ }
672
+
673
+ .system-model-badge {
674
+ background: var(--color-primary);
675
+ color: white;
676
+ padding: 0.125rem 0.5rem;
677
+ border-radius: 1rem;
678
+ font-size: 0.7rem;
679
+ font-weight: 600;
680
+ white-space: nowrap;
681
+ }
682
+
683
+ .system-info {
684
+ color: var(--color-text-secondary);
685
+ font-size: 0.75rem;
686
+ }
687
+
688
+ .tool-input-details {
689
+ }
690
+
691
+ .tool-input-summary {
692
+ padding: 0.375rem 0.75rem;
693
+ font-size: 0.75rem;
694
+ color: var(--color-text-secondary);
695
+ cursor: pointer;
696
+ user-select: none;
697
+ }
698
+
699
+ .tool-input-summary:hover {
700
+ background: rgba(6,182,212,0.08);
701
+ }
702
+
703
+ .tool-input-pre {
704
+ margin: 0;
705
+ padding: 0.5rem 0.75rem;
706
+ font-size: 0.75rem;
707
+ font-family: 'Monaco','Menlo','Ubuntu Mono', monospace;
708
+ background: rgba(0,0,0,0.03);
709
+ overflow-x: auto;
710
+ max-height: 200px;
711
+ overflow-y: auto;
712
+ white-space: pre-wrap;
713
+ word-break: break-all;
714
+ }
715
+
716
+ html.dark .tool-input-pre { background: rgba(255,255,255,0.03); }
717
+
718
+ .streaming-block-tool-result {
719
+ margin: 0;
720
+ border-radius: 0.375rem;
721
+ background: var(--color-bg-code);
722
+ overflow: hidden;
723
+ }
724
+
725
+ .tool-result-header {
726
+ padding: 0.375rem 0.75rem;
727
+ font-size: 0.7rem;
728
+ }
729
+
730
+ .tool-result-ok-badge {
731
+ color: #10b981;
732
+ font-weight: 600;
733
+ text-transform: uppercase;
734
+ letter-spacing: 0.05em;
735
+ }
736
+
737
+ .tool-result-error-badge {
738
+ color: #ef4444;
739
+ font-weight: 600;
740
+ text-transform: uppercase;
741
+ letter-spacing: 0.05em;
742
+ }
743
+
744
+ .tool-result-pre {
745
+ margin: 0;
746
+ padding: 0.5rem 0.75rem;
747
+ font-size: 0.75rem;
748
+ font-family: 'Monaco','Menlo','Ubuntu Mono', monospace;
749
+ color: #d1d5db;
750
+ overflow-x: auto;
751
+ max-height: 300px;
752
+ overflow-y: auto;
753
+ white-space: pre-wrap;
754
+ word-break: break-all;
755
+ }
756
+
757
+ .streaming-block-tool-result.tool-result-error {
758
+ }
759
+
760
+ .streaming-block-result {
761
+ padding: 0.375rem 0.75rem;
762
+ margin: 0;
763
+ border-radius: 0.375rem;
764
+ background: rgba(16,185,129,0.08);
765
+ font-size: 0.8rem;
766
+ display: flex;
767
+ align-items: center;
768
+ gap: 0.5rem;
769
+ }
770
+
771
+ .streaming-block-result.result-error {
772
+ background: rgba(239,68,68,0.08);
773
+ }
774
+
775
+ .result-status {
776
+ font-weight: 600;
777
+ color: #10b981;
778
+ }
779
+
780
+ .result-error .result-status { color: #ef4444; }
781
+
782
+ .result-stats {
783
+ color: var(--color-text-secondary);
784
+ font-size: 0.75rem;
785
+ }
786
+
787
+ .streaming-indicator-label {
788
+ white-space: nowrap;
789
+ }
790
+
791
+ /* --- Input area: fixed at bottom --- */
792
+ .input-section {
793
+ flex-shrink: 0;
794
+ background-color: var(--color-bg-primary);
795
+ padding: 0.75rem 1rem;
796
+ }
797
+
798
+ .input-wrapper {
799
+ max-width: var(--msg-max-width);
800
+ margin: 0 auto;
801
+ width: 100%;
802
+ display: flex;
803
+ gap: 0.5rem;
804
+ align-items: flex-end;
805
+ }
806
+
807
+ .agent-selector {
808
+ padding: 0.5rem;
809
+ border: none;
810
+ border-radius: 0.375rem;
811
+ background-color: var(--color-bg-secondary);
812
+ color: var(--color-text-primary);
813
+ font-size: 0.8rem;
814
+ cursor: pointer;
815
+ flex-shrink: 0;
816
+ }
817
+
818
+ .agent-selector:disabled, .model-selector:disabled {
819
+ opacity: 0.5;
820
+ cursor: not-allowed;
821
+ background-color: var(--color-bg-secondary);
822
+ }
823
+
824
+ .model-selector {
825
+ padding: 0.5rem;
826
+ border: none;
827
+ border-radius: 0.375rem;
828
+ background-color: var(--color-bg-secondary);
829
+ color: var(--color-text-primary);
830
+ font-size: 0.8rem;
831
+ cursor: pointer;
832
+ flex-shrink: 0;
833
+ max-width: 160px;
834
+ }
835
+
836
+ .model-selector:empty, .model-selector[data-empty="true"] {
837
+ display: none;
838
+ }
839
+
840
+ .message-textarea {
841
+ flex: 1;
842
+ padding: 0.625rem 0.875rem;
843
+ border: none;
844
+ border-radius: 0.75rem;
845
+ background-color: var(--color-bg-secondary);
846
+ color: var(--color-text-primary);
847
+ font-family: inherit;
848
+ font-size: 0.9375rem;
849
+ resize: none;
850
+ min-height: 44px;
851
+ max-height: 150px;
852
+ line-height: 1.5;
853
+ transition: border-color 0.15s;
854
+ }
855
+
856
+ .message-textarea:focus {
857
+ outline: none;
858
+ box-shadow: 0 0 0 2px rgba(59,130,246,0.15);
859
+ }
860
+
861
+ .send-btn {
862
+ display: flex;
863
+ align-items: center;
864
+ justify-content: center;
865
+ width: 40px;
866
+ height: 40px;
867
+ background-color: var(--color-primary);
868
+ color: white;
869
+ border: none;
870
+ border-radius: 0.5rem;
871
+ cursor: pointer;
872
+ flex-shrink: 0;
873
+ transition: background-color 0.15s;
874
+ }
875
+
876
+ .send-btn:hover:not(:disabled) { background-color: var(--color-primary-dark); }
877
+ .send-btn:disabled { opacity: 0.4; cursor: not-allowed; }
878
+
879
+ .send-btn svg { width: 18px; height: 18px; }
880
+
881
+ .stop-btn {
882
+ display: none;
883
+ align-items: center;
884
+ justify-content: center;
885
+ width: 40px;
886
+ height: 40px;
887
+ background-color: #dc2626;
888
+ color: white;
889
+ border: none;
890
+ border-radius: 0.5rem;
891
+ cursor: pointer;
892
+ flex-shrink: 0;
893
+ transition: background-color 0.15s;
894
+ }
895
+
896
+ .stop-btn:hover:not(:disabled) { background-color: #b91c1c; }
897
+ .stop-btn:disabled { opacity: 0.4; cursor: not-allowed; }
898
+ .stop-btn.visible { display: flex; }
899
+
900
+ .inject-btn {
901
+ display: none;
902
+ align-items: center;
903
+ justify-content: center;
904
+ width: 40px;
905
+ height: 40px;
906
+ background-color: #f59e0b;
907
+ color: white;
908
+ border: none;
909
+ border-radius: 0.5rem;
910
+ cursor: pointer;
911
+ flex-shrink: 0;
912
+ transition: background-color 0.15s;
913
+ margin-right: 0.25rem;
914
+ }
915
+
916
+ .inject-btn:hover:not(:disabled) { background-color: #d97706; }
917
+ .inject-btn:disabled { opacity: 0.4; cursor: not-allowed; }
918
+ .inject-btn.visible { display: flex; }
919
+
920
+ /* ===== OVERLAY for mobile sidebar ===== */
921
+ .sidebar-overlay {
922
+ display: none;
923
+ position: fixed;
924
+ top: 0; left: 0; width: 100%; height: 100%;
925
+ background: rgba(0,0,0,0.4);
926
+ z-index: 999;
927
+ }
928
+
929
+ .sidebar-overlay.visible { display: block; }
930
+
931
+ /* ===== UTILITIES ===== */
932
+ .text-secondary { color: var(--color-text-secondary); }
933
+ .animate-spin { animation: spin 1s linear infinite; }
934
+ @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
935
+
936
+ /* ===== HTML rendered content ===== */
937
+ .html-rendered-label {
938
+ padding: 0.25rem 0.5rem;
939
+ background: #eff6ff;
940
+ border-radius: 0.25rem;
941
+ font-size: 0.75rem;
942
+ font-weight: 600;
943
+ color: #1d4ed8;
944
+ text-transform: uppercase;
945
+ letter-spacing: 0.05em;
946
+ margin-bottom: 0.25rem;
947
+ }
948
+
949
+ html.dark .html-rendered-label { background: #1e3a5f; color: #93c5fd; }
950
+
951
+ .html-content {
952
+ background: #ffffff;
953
+ padding: 0.5rem 0.75rem;
954
+ border-radius: 0.375rem;
955
+ overflow-x: auto;
956
+ }
957
+
958
+ html.dark .html-content { background: #1f2937; }
959
+
960
+ .html-content table { border-collapse: collapse; width: 100%; margin: 0.5rem 0; }
961
+ .html-content th, .html-content td { padding: 0.5rem 0.75rem; text-align: left; font-size: 0.875rem; }
962
+ .html-content th { background: var(--color-bg-secondary); font-weight: 600; }
963
+ .html-content ul, .html-content ol { padding-left: 1.5rem; margin: 0.5rem 0; }
964
+ .html-content li { margin: 0.25rem 0; }
965
+ .html-content h1, .html-content h2, .html-content h3, .html-content h4 { margin: 0.75rem 0 0.5rem; }
966
+ .html-content p { margin: 0.5rem 0; }
967
+
968
+ pre { margin: 0; overflow-x: auto; }
969
+ code { font-family: 'Monaco','Menlo','Ubuntu Mono', monospace; font-size: 0.875rem; }
970
+ details { margin: 0.25rem 0; }
971
+ summary { cursor: pointer; user-select: none; padding: 0.375rem; border-radius: 0.25rem; transition: background-color 0.2s; }
972
+ summary:hover { background-color: var(--color-bg-secondary); }
973
+ .permanently-expanded > summary { cursor: default; }
974
+ .permanently-expanded > summary::before { display: none; }
975
+ .permanently-expanded > summary::-webkit-details-marker { display: none; }
976
+ .permanently-expanded > summary::marker { display: none; content: ''; }
977
+
978
+ /* ===== Folder Browser Modal ===== */
979
+ .folder-modal-overlay { display:none; position:fixed; top:0; left:0; width:100%; height:100%; background:rgba(0,0,0,0.5); z-index:2000; align-items:center; justify-content:center; }
980
+ .folder-modal-overlay.visible { display:flex; }
981
+ .folder-modal { background:var(--color-bg-primary); border-radius:0.5rem; width:500px; max-width:90vw; max-height:80vh; display:flex; flex-direction:column; box-shadow:0 20px 60px rgba(0,0,0,0.3); }
982
+ .folder-modal-header { padding:1rem; display:flex; justify-content:space-between; align-items:center; flex-shrink:0; }
983
+ .folder-modal-header h3 { margin:0; font-size:1rem; font-weight:600; }
984
+ .folder-modal-close { background:none; border:none; font-size:1.25rem; cursor:pointer; color:var(--color-text-secondary); padding:0.25rem; line-height:1; }
985
+ .folder-modal-close:hover { color:var(--color-text-primary); }
986
+ .folder-breadcrumb { padding:0.75rem 1rem; font-size:0.8rem; font-family:'Monaco','Menlo',monospace; color:var(--color-text-secondary); background:var(--color-bg-secondary); display:flex; align-items:center; gap:0.25rem; flex-shrink:0; overflow-x:auto; white-space:nowrap; }
987
+ .folder-breadcrumb-segment { cursor:pointer; color:var(--color-primary); padding:0.125rem 0.25rem; border-radius:0.25rem; }
988
+ .folder-breadcrumb-segment:hover { background:var(--color-bg-primary); text-decoration:underline; }
989
+ .folder-breadcrumb-separator { color:var(--color-text-secondary); }
990
+ .folder-list { flex:1; overflow-y:auto; min-height:200px; max-height:400px; list-style:none; margin:0; padding:0; }
991
+ .folder-list-item { padding:0.5rem 1rem; cursor:pointer; display:flex; align-items:center; gap:0.5rem; font-size:0.875rem; transition:background-color 0.15s; }
992
+ .folder-list-item:hover { background:var(--color-bg-secondary); }
993
+ .folder-list-item-icon { font-size:1rem; flex-shrink:0; width:1.25rem; text-align:center; }
994
+ .folder-list-item-name { flex:1; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
995
+ .folder-list-empty { padding:2rem 1rem; text-align:center; color:var(--color-text-secondary); font-size:0.875rem; }
996
+ .folder-list-loading { padding:2rem 1rem; text-align:center; color:var(--color-text-secondary); font-size:0.875rem; }
997
+ .folder-list-error { padding:1rem; text-align:center; color:var(--color-error); font-size:0.875rem; }
998
+ .folder-modal-footer { padding:0.75rem 1rem; display:flex; justify-content:flex-end; gap:0.5rem; flex-shrink:0; }
999
+ .folder-modal-footer .btn { padding:0.5rem 1rem; font-size:0.8rem; }
1000
+
1001
+ .btn { padding:0.5rem 1rem; border:none; border-radius:0.375rem; font-weight:500; cursor:pointer; transition:all 0.15s; font-size:0.875rem; }
1002
+ .btn-primary { background-color:var(--color-primary); color:white; }
1003
+ .btn-primary:hover:not(:disabled) { background-color:var(--color-primary-dark); }
1004
+ .btn:disabled { opacity:0.5; cursor:not-allowed; }
1005
+ .btn-secondary { background:var(--color-bg-secondary); color:var(--color-text-primary); border:none; }
1006
+ .btn-secondary:hover { background:var(--color-border); }
1007
+
1008
+ /* ===== Drop zone ===== */
1009
+ .drop-zone-overlay { display:none; position:absolute; top:0; left:0; right:0; bottom:0; background:rgba(59,130,246,0.1); border:3px dashed var(--color-primary); border-radius:0.5rem; z-index:100; align-items:center; justify-content:center; }
1010
+ .drop-zone-overlay.visible { display:flex; }
1011
+ .drop-zone-content { text-align:center; color:var(--color-primary); pointer-events:none; }
1012
+ .drop-zone-icon { font-size:3rem; font-weight:300; line-height:1; margin-bottom:0.5rem; }
1013
+ .drop-zone-text { font-size:1rem; font-weight:500; }
1014
+
1015
+ /* ===== Upload toast ===== */
1016
+ .upload-toast { position:fixed; bottom:100px; left:50%; transform:translateX(-50%); padding:0.75rem 1.5rem; border-radius:0.5rem; font-size:0.875rem; font-weight:500; z-index:2000; box-shadow:0 4px 12px rgba(0,0,0,0.15); transition:opacity 0.3s; }
1017
+ .upload-toast.success { background:var(--color-success); color:white; }
1018
+ .upload-toast.error { background:var(--color-error); color:white; }
1019
+ .upload-toast.info { background:var(--color-primary); color:white; }
1020
+
1021
+ /* ===== File browser ===== */
1022
+ .file-browser-container { flex:1; min-height:0; overflow:hidden; }
1023
+ .file-browser-iframe { width:100%; height:100%; border:none; }
1024
+ .voice-iframe { width:100%; height:100%; border:none; }
1025
+
1026
+ /* ===== RESPONSIVE: MOBILE ===== */
1027
+ @media (max-width: 768px) {
1028
+ :root { --sidebar-width: 280px; }
1029
+
1030
+ .sidebar {
1031
+ position: fixed;
1032
+ top: 0; left: 0;
1033
+ height: 100%;
1034
+ z-index: 1000;
1035
+ transform: translateX(-100%);
1036
+ transition: transform 0.3s ease;
1037
+ box-shadow: none;
1038
+ width: var(--sidebar-width);
1039
+ }
1040
+
1041
+ .sidebar.collapsed { transform: translateX(-100%); width: var(--sidebar-width); }
1042
+ .sidebar.mobile-visible { transform: translateX(0); box-shadow: 4px 0 20px rgba(0,0,0,0.2); }
1043
+
1044
+ .main-header { padding: 0 0.75rem; }
1045
+ .header-title { font-size: 1rem; }
1046
+
1047
+ .messages-wrapper { padding: 0.5rem 0.75rem; }
1048
+
1049
+ .message { max-width: 90%; }
1050
+
1051
+ .input-section {
1052
+ padding: 0.5rem 0.75rem;
1053
+ padding-bottom: calc(0.5rem + env(safe-area-inset-bottom));
1054
+ }
1055
+
1056
+ .message-textarea { font-size: 16px; }
1057
+
1058
+ .conversation-item { padding: 0.875rem 0.75rem; min-height: 44px; }
1059
+ .sidebar-new-btn { min-height: 44px; min-width: 44px; padding: 0.5rem 0.75rem; }
1060
+
1061
+ .status-badge { padding: 0.25rem 0.5rem; font-size: 0.7rem; }
1062
+
1063
+ .view-toggle-btn { flex: 1; text-align: center; }
1064
+ }
1065
+
1066
+ @media (max-width: 480px) {
1067
+ .sidebar { width: calc(100% - 3rem); max-width: 320px; }
1068
+ .message { max-width: 95%; }
1069
+ .messages-wrapper { padding: 0.375rem 0.5rem; }
1070
+ .input-section { padding: 0.5rem; padding-bottom: calc(0.5rem + env(safe-area-inset-bottom)); }
1071
+ .agent-selector { display: none; }
1072
+ .model-selector { display: none; }
1073
+ }
1074
+
1075
+ /* ===== SCROLLBAR STYLING ===== */
1076
+ ::-webkit-scrollbar {
1077
+ width: 10px;
1078
+ height: 10px;
1079
+ }
1080
+
1081
+ ::-webkit-scrollbar-track {
1082
+ background: transparent;
1083
+ }
1084
+
1085
+ ::-webkit-scrollbar-thumb {
1086
+ background: #cbd5e1;
1087
+ border-radius: 8px;
1088
+ border: 3px solid transparent;
1089
+ background-clip: padding-box;
1090
+ transition: background-color 0.2s;
1091
+ }
1092
+
1093
+ ::-webkit-scrollbar-thumb:hover {
1094
+ background-color: #94a3b8;
1095
+ background-clip: padding-box;
1096
+ }
1097
+
1098
+ html.dark ::-webkit-scrollbar-thumb {
1099
+ background: #475569;
1100
+ background-clip: padding-box;
1101
+ }
1102
+
1103
+ html.dark ::-webkit-scrollbar-thumb:hover {
1104
+ background-color: #64748b;
1105
+ background-clip: padding-box;
1106
+ }
1107
+
1108
+ /* Firefox scrollbar */
1109
+ * {
1110
+ scrollbar-width: thin;
1111
+ scrollbar-color: #cbd5e1 transparent;
1112
+ }
1113
+
1114
+ html.dark * {
1115
+ scrollbar-color: #475569 transparent;
1116
+ }
1117
+
1118
+ /* ===== VOICE VIEW ===== */
1119
+ .voice-container {
1120
+ flex: 1;
1121
+ min-height: 0;
1122
+ overflow: hidden;
1123
+ display: flex;
1124
+ flex-direction: column;
1125
+ }
1126
+
1127
+ .voice-scroll {
1128
+ flex: 1;
1129
+ overflow-y: auto;
1130
+ overflow-x: hidden;
1131
+ padding: 1.5rem 2rem;
1132
+ -webkit-overflow-scrolling: touch;
1133
+ }
1134
+
1135
+ .voice-messages {
1136
+ display: flex;
1137
+ flex-direction: column;
1138
+ gap: 1rem;
1139
+ }
1140
+
1141
+ .voice-block {
1142
+ padding: 1rem 1.25rem;
1143
+ border-radius: 0.75rem;
1144
+ background: var(--color-bg-secondary);
1145
+ line-height: 1.7;
1146
+ font-size: 1rem;
1147
+ max-width: 85%;
1148
+ margin-right: auto;
1149
+ position: relative;
1150
+ }
1151
+
1152
+ .voice-block.speaking {
1153
+ box-shadow: 0 0 0 2px var(--color-primary);
1154
+ }
1155
+
1156
+ .voice-block-user {
1157
+ background: var(--color-primary);
1158
+ color: white;
1159
+ margin-left: auto;
1160
+ margin-right: 0;
1161
+ }
1162
+
1163
+ .voice-input-section {
1164
+ flex-shrink: 0;
1165
+ background: var(--color-bg-primary);
1166
+ padding: 0.75rem 1rem;
1167
+ border-top: 1px solid var(--color-border);
1168
+ }
1169
+
1170
+ .voice-input-wrapper {
1171
+ display: flex;
1172
+ gap: 0.5rem;
1173
+ align-items: center;
1174
+ }
1175
+
1176
+ .voice-transcript {
1177
+ flex: 1;
1178
+ min-height: 40px;
1179
+ max-height: 100px;
1180
+ padding: 0.5rem 0.875rem;
1181
+ border-radius: 0.75rem;
1182
+ background: var(--color-bg-secondary);
1183
+ color: var(--color-text-primary);
1184
+ font-size: 0.9375rem;
1185
+ line-height: 1.5;
1186
+ overflow-y: auto;
1187
+ white-space: pre-wrap;
1188
+ word-break: break-word;
1189
+ }
1190
+
1191
+ .voice-transcript:empty::before {
1192
+ content: attr(data-placeholder);
1193
+ color: var(--color-text-secondary);
1194
+ }
1195
+
1196
+ .voice-mic-btn {
1197
+ display: flex;
1198
+ align-items: center;
1199
+ justify-content: center;
1200
+ width: 44px;
1201
+ height: 44px;
1202
+ background: var(--color-bg-secondary);
1203
+ color: var(--color-text-secondary);
1204
+ border: 2px solid var(--color-border);
1205
+ border-radius: 50%;
1206
+ cursor: pointer;
1207
+ flex-shrink: 0;
1208
+ transition: all 0.2s;
1209
+ }
1210
+
1211
+ .voice-mic-btn:hover {
1212
+ border-color: var(--color-primary);
1213
+ color: var(--color-primary);
1214
+ }
1215
+
1216
+ .voice-mic-btn.loading {
1217
+ opacity: 0.5;
1218
+ cursor: wait;
1219
+ animation: mic-loading-spin 2s linear infinite;
1220
+ }
1221
+
1222
+ @keyframes mic-loading-spin {
1223
+ 0% { border-color: var(--color-border); }
1224
+ 50% { border-color: var(--color-primary); }
1225
+ 100% { border-color: var(--color-border); }
1226
+ }
1227
+
1228
+ .voice-mic-btn.recording {
1229
+ background: var(--color-error);
1230
+ border-color: var(--color-error);
1231
+ color: white;
1232
+ animation: pulse 1s ease-in-out infinite;
1233
+ }
1234
+
1235
+ .voice-mic-btn svg {
1236
+ width: 20px;
1237
+ height: 20px;
1238
+ }
1239
+
1240
+ .voice-send-btn {
1241
+ flex-shrink: 0;
1242
+ }
1243
+
1244
+ .voice-tts-controls {
1245
+ display: flex;
1246
+ align-items: center;
1247
+ justify-content: space-between;
1248
+ margin-top: 0.5rem;
1249
+ font-size: 0.8rem;
1250
+ color: var(--color-text-secondary);
1251
+ }
1252
+
1253
+ .voice-toggle-label {
1254
+ display: flex;
1255
+ align-items: center;
1256
+ gap: 0.375rem;
1257
+ cursor: pointer;
1258
+ user-select: none;
1259
+ }
1260
+
1261
+ .voice-toggle-label input[type="checkbox"] {
1262
+ accent-color: var(--color-primary);
1263
+ }
1264
+
1265
+ .voice-stop-btn {
1266
+ padding: 0.25rem 0.75rem;
1267
+ background: var(--color-bg-secondary);
1268
+ border: 1px solid var(--color-border);
1269
+ border-radius: 0.375rem;
1270
+ cursor: pointer;
1271
+ font-size: 0.75rem;
1272
+ color: var(--color-text-secondary);
1273
+ transition: all 0.15s;
1274
+ }
1275
+
1276
+ .voice-stop-btn:hover {
1277
+ background: var(--color-error);
1278
+ color: white;
1279
+ border-color: var(--color-error);
1280
+ }
1281
+
1282
+ .voice-selector-wrapper {
1283
+ display: flex;
1284
+ align-items: center;
1285
+ gap: 0.25rem;
1286
+ }
1287
+
1288
+ .voice-selector {
1289
+ padding: 0.2rem 0.5rem;
1290
+ border: 1px solid var(--color-border);
1291
+ border-radius: 0.375rem;
1292
+ background: var(--color-bg-secondary);
1293
+ color: var(--color-text-primary);
1294
+ font-size: 0.75rem;
1295
+ cursor: pointer;
1296
+ max-width: 160px;
1297
+ }
1298
+
1299
+ .voice-selector:focus {
1300
+ outline: none;
1301
+ border-color: var(--color-primary);
1302
+ }
1303
+
1304
+ .voice-empty {
1305
+ text-align: center;
1306
+ color: var(--color-text-secondary);
1307
+ padding: 4rem 2rem;
1308
+ font-size: 1rem;
1309
+ }
1310
+
1311
+ .voice-empty-icon {
1312
+ font-size: 3rem;
1313
+ margin-bottom: 1rem;
1314
+ opacity: 0.3;
1315
+ }
1316
+
1317
+ .conversation-messages { contain: content; }
1318
+ .streaming-blocks { contain: content; }
1319
+ .sidebar-list { contain: strict; content-visibility: auto; }
1320
+ .message { contain: layout style; content-visibility: auto; contain-intrinsic-size: auto 80px; }
1321
+
1322
+ .voice-block .voice-result-stats {
1323
+ font-size: 0.8rem;
1324
+ color: var(--color-text-secondary);
1325
+ margin-top: 0.5rem;
1326
+ padding-top: 0.5rem;
1327
+ border-top: 1px solid var(--color-border);
1328
+ }
1329
+
1330
+ .voice-reread-btn {
1331
+ position: absolute;
1332
+ top: 0.5rem;
1333
+ right: 0.5rem;
1334
+ background: none;
1335
+ border: 1px solid var(--color-border);
1336
+ border-radius: 0.25rem;
1337
+ cursor: pointer;
1338
+ padding: 0.25rem;
1339
+ color: var(--color-text-secondary);
1340
+ opacity: 0;
1341
+ transition: opacity 0.15s, background-color 0.15s;
1342
+ display: flex;
1343
+ align-items: center;
1344
+ justify-content: center;
1345
+ }
1346
+
1347
+ .voice-block:hover .voice-reread-btn { opacity: 1; }
1348
+ .voice-reread-btn:hover { background: var(--color-bg-primary); color: var(--color-primary); }
1349
+
1350
+ /* ===== RESPONSIVE: TABLET ===== */
1351
+ @media (min-width: 769px) and (max-width: 1024px) {
1352
+ :root { --sidebar-width: 260px; }
1353
+ .messages-wrapper { padding: 0.5rem 1rem; }
1354
+ .input-section { padding: 0.5rem; }
1355
+ }
1356
+
1357
+ /* ===== SVG ICON SIZING (Tailwind utilities not loaded) ===== */
1358
+ .block-text svg, .block-code svg, .block-thinking svg,
1359
+ .block-tool-use svg, .block-tool-result svg, .block-image svg,
1360
+ .block-bash svg, .block-system svg, .block-generic svg,
1361
+ .block-error svg, .block-result svg,
1362
+ .event-streaming-start svg, .event-streaming-complete svg,
1363
+ .event-file-read svg, .event-file-write svg,
1364
+ .event-git-status svg, .event-command svg, .event-error svg,
1365
+ .event-tool-use svg, .event-generic svg {
1366
+ width: 1.25rem;
1367
+ height: 1.25rem;
1368
+ flex-shrink: 0;
1369
+ }
1370
+
1371
+ .icon-sm svg { width: 1rem !important; height: 1rem !important; }
1372
+ .icon-lg svg { width: 1.5rem !important; height: 1.5rem !important; }
1373
+
1374
+ /* ===== STREAMING BLOCK STYLES ===== */
1375
+ .block-text {
1376
+ margin-bottom: 0;
1377
+ padding: 0.5rem 0.75rem;
1378
+ background: var(--color-bg-primary);
1379
+ border-radius: 0.5rem;
1380
+ line-height: 1.5;
1381
+ font-size: 0.9rem;
1382
+ }
1383
+
1384
+ .block-text + .block-text {
1385
+ margin-top: -0.25rem;
1386
+ padding-top: 0;
1387
+ border-top-left-radius: 0;
1388
+ border-top-right-radius: 0;
1389
+ }
1390
+
1391
+ .block-text:has(+ .block-text) {
1392
+ margin-bottom: 0;
1393
+ border-bottom-left-radius: 0;
1394
+ border-bottom-right-radius: 0;
1395
+ }
1396
+
1397
+ .block-code {
1398
+ margin-bottom: 0;
1399
+ border-radius: 0.5rem;
1400
+ overflow: hidden;
1401
+ }
1402
+
1403
+ .block-code .code-header {
1404
+ display: flex;
1405
+ align-items: center;
1406
+ justify-content: space-between;
1407
+ gap: 0.5rem;
1408
+ background: #1f2937;
1409
+ padding: 0.5rem 1rem;
1410
+ }
1411
+
1412
+ .block-code .code-header .lang-badge {
1413
+ font-size: 0.7rem;
1414
+ font-family: 'Monaco','Menlo','Ubuntu Mono', monospace;
1415
+ color: #9ca3af;
1416
+ text-transform: uppercase;
1417
+ letter-spacing: 0.05em;
1418
+ }
1419
+
1420
+ .block-code .copy-code-btn {
1421
+ background: none;
1422
+ border: none;
1423
+ color: #9ca3af;
1424
+ cursor: pointer;
1425
+ padding: 0.25rem;
1426
+ border-radius: 0.25rem;
1427
+ display: flex;
1428
+ align-items: center;
1429
+ transition: all 0.15s;
1430
+ }
1431
+
1432
+ .block-code .copy-code-btn:hover { color: #e5e7eb; background: #374151; }
1433
+
1434
+ .block-code pre {
1435
+ margin: 0;
1436
+ padding: 0.625rem 0.75rem;
1437
+ background: #111827;
1438
+ color: #e5e7eb;
1439
+ overflow-x: auto;
1440
+ font-size: 0.8rem;
1441
+ line-height: 1.5;
1442
+ }
1443
+
1444
+ .block-thinking {
1445
+ margin-bottom: 0;
1446
+ border-radius: 0.5rem;
1447
+ background: #f5f3ff;
1448
+ overflow: hidden;
1449
+ }
1450
+
1451
+ html.dark .block-thinking { background: #1e1033; }
1452
+
1453
+ .block-thinking summary {
1454
+ padding: 0.375rem 0.75rem;
1455
+ cursor: pointer;
1456
+ display: flex;
1457
+ align-items: center;
1458
+ gap: 0.5rem;
1459
+ font-weight: 600;
1460
+ font-size: 0.85rem;
1461
+ color: #5b21b6;
1462
+ user-select: none;
1463
+ background: none;
1464
+ border-radius: 0;
1465
+ }
1466
+
1467
+ html.dark .block-thinking summary { color: #c4b5fd; }
1468
+ .block-thinking summary:hover { background: rgba(139,92,246,0.08); }
1469
+
1470
+ .block-thinking .thinking-content {
1471
+ padding: 0.375rem 0.75rem;
1472
+ font-size: 0.85rem;
1473
+ color: #5b21b6;
1474
+ white-space: pre-wrap;
1475
+ line-height: 1.5;
1476
+ }
1477
+
1478
+ html.dark .block-thinking .thinking-content { color: #c4b5fd; }
1479
+
1480
+ /* --- Tool Use Block --- */
1481
+ .block-tool-use {
1482
+ margin-bottom: 0;
1483
+ border-radius: 0.5rem;
1484
+ background: #ecfeff;
1485
+ overflow: hidden;
1486
+ }
1487
+
1488
+ html.dark .block-tool-use { background: #0c1a24; }
1489
+
1490
+ .block-tool-use .tool-header {
1491
+ padding: 0.375rem 0.75rem;
1492
+ display: flex;
1493
+ align-items: center;
1494
+ gap: 0.375rem;
1495
+ background: #cffafe;
1496
+ }
1497
+
1498
+ html.dark .block-tool-use .tool-header { background: #0e2a3a; }
1499
+
1500
+ .block-tool-use .tool-header .tool-icon {
1501
+ display: flex;
1502
+ align-items: center;
1503
+ color: #0891b2;
1504
+ }
1505
+
1506
+ html.dark .block-tool-use .tool-header .tool-icon { color: #22d3ee; }
1507
+
1508
+ .block-tool-use .tool-header .tool-name {
1509
+ font-weight: 600;
1510
+ font-size: 0.85rem;
1511
+ color: #155e75;
1512
+ }
1513
+
1514
+ html.dark .block-tool-use .tool-header .tool-name { color: #67e8f9; }
1515
+
1516
+ .block-tool-use .tool-header .tool-name code {
1517
+ font-family: 'Monaco','Menlo','Ubuntu Mono', monospace;
1518
+ background: #a5f3fc;
1519
+ padding: 0.125rem 0.5rem;
1520
+ border-radius: 0.25rem;
1521
+ font-size: 0.8rem;
1522
+ }
1523
+
1524
+ html.dark .block-tool-use .tool-header .tool-name code { background: #164e63; }
1525
+
1526
+ .block-tool-use .tool-params {
1527
+ padding: 0.5rem 0.75rem;
1528
+ }
1529
+
1530
+ .block-tool-use .tool-params .param-label {
1531
+ font-size: 0.7rem;
1532
+ text-transform: uppercase;
1533
+ letter-spacing: 0.05em;
1534
+ color: #0e7490;
1535
+ font-weight: 600;
1536
+ margin-bottom: 0.375rem;
1537
+ }
1538
+
1539
+ html.dark .block-tool-use .tool-params .param-label { color: #22d3ee; }
1540
+
1541
+ /* Tool parameter display styles */
1542
+ .tool-param-file {
1543
+ display: flex;
1544
+ align-items: center;
1545
+ gap: 0.5rem;
1546
+ padding: 0.5rem 0.75rem;
1547
+ background: var(--color-bg-primary);
1548
+ border-radius: 0.375rem;
1549
+ font-family: 'Monaco','Menlo','Ubuntu Mono', monospace;
1550
+ font-size: 0.8rem;
1551
+ color: var(--color-text-primary);
1552
+ overflow-x: auto;
1553
+ }
1554
+
1555
+ .tool-param-file .file-icon { color: #0891b2; flex-shrink: 0; font-size: 1rem; }
1556
+ .tool-param-file .file-dir { color: var(--color-text-secondary); }
1557
+ .tool-param-file .file-name { font-weight: 600; color: var(--color-text-primary); }
1558
+
1559
+ .tool-param-command {
1560
+ background: #111827;
1561
+ border-radius: 0.375rem;
1562
+ padding: 0.625rem 0.875rem;
1563
+ font-family: 'Monaco','Menlo','Ubuntu Mono', monospace;
1564
+ font-size: 0.8rem;
1565
+ color: #e5e7eb;
1566
+ overflow-x: auto;
1567
+ display: flex;
1568
+ align-items: flex-start;
1569
+ gap: 0.5rem;
1570
+ }
1571
+
1572
+ .tool-param-command .prompt-char { color: #34d399; font-weight: 700; flex-shrink: 0; }
1573
+ .tool-param-command .command-text { white-space: pre-wrap; word-break: break-all; }
1574
+
1575
+ .tool-param-diff {
1576
+ border-radius: 0.375rem;
1577
+ overflow: hidden;
1578
+ font-family: 'Monaco','Menlo','Ubuntu Mono', monospace;
1579
+ font-size: 0.75rem;
1580
+ }
1581
+
1582
+ .tool-param-diff .diff-header {
1583
+ padding: 0.375rem 0.75rem;
1584
+ background: var(--color-bg-secondary);
1585
+ font-weight: 600;
1586
+ font-size: 0.7rem;
1587
+ text-transform: uppercase;
1588
+ letter-spacing: 0.03em;
1589
+ color: var(--color-text-secondary);
1590
+ }
1591
+
1592
+ .tool-param-diff .diff-old {
1593
+ padding: 0.5rem 0.75rem;
1594
+ background: #fef2f2;
1595
+ color: #991b1b;
1596
+ white-space: pre-wrap;
1597
+ word-break: break-all;
1598
+ max-height: 200px;
1599
+ overflow-y: auto;
1600
+ }
1601
+
1602
+ html.dark .tool-param-diff .diff-old { background: #1c0f0f; color: #fca5a5; }
1603
+
1604
+ .tool-param-diff .diff-new {
1605
+ padding: 0.5rem 0.75rem;
1606
+ background: #f0fdf4;
1607
+ color: #166534;
1608
+ white-space: pre-wrap;
1609
+ word-break: break-all;
1610
+ max-height: 200px;
1611
+ overflow-y: auto;
1612
+ }
1613
+
1614
+ html.dark .tool-param-diff .diff-new { background: #0a1f0f; color: #86efac; }
1615
+
1616
+ .tool-param-query {
1617
+ display: flex;
1618
+ align-items: center;
1619
+ gap: 0.5rem;
1620
+ padding: 0.5rem 0.75rem;
1621
+ background: var(--color-bg-primary);
1622
+ border-radius: 0.375rem;
1623
+ font-size: 0.85rem;
1624
+ }
1625
+ .tool-param-query .query-icon { flex-shrink: 0; font-size: 1rem; }
1626
+
1627
+ .tool-param-url {
1628
+ display: flex;
1629
+ align-items: center;
1630
+ gap: 0.5rem;
1631
+ padding: 0.5rem 0.75rem;
1632
+ background: var(--color-bg-primary);
1633
+ border-radius: 0.375rem;
1634
+ font-family: 'Monaco','Menlo','Ubuntu Mono', monospace;
1635
+ font-size: 0.8rem;
1636
+ color: #2563eb;
1637
+ word-break: break-all;
1638
+ }
1639
+
1640
+ html.dark .tool-param-url { color: #60a5fa; }
1641
+ .tool-param-url .url-icon { flex-shrink: 0; font-size: 1rem; }
1642
+
1643
+ .tool-param-todos {
1644
+ display: flex;
1645
+ flex-direction: column;
1646
+ gap: 0.25rem;
1647
+ }
1648
+
1649
+ .tool-param-todos .todo-item {
1650
+ display: flex;
1651
+ align-items: flex-start;
1652
+ gap: 0.5rem;
1653
+ padding: 0.375rem 0.5rem;
1654
+ border-radius: 0.25rem;
1655
+ font-size: 0.8rem;
1656
+ background: var(--color-bg-primary);
1657
+ }
1658
+
1659
+ .tool-param-todos .todo-status {
1660
+ flex-shrink: 0;
1661
+ font-size: 0.85rem;
1662
+ margin-top: 0.05rem;
1663
+ }
1664
+
1665
+ .tool-param-todos .todo-text { flex: 1; line-height: 1.4; }
1666
+
1667
+ .tool-param-json {
1668
+ background: var(--color-bg-primary);
1669
+ border-radius: 0.375rem;
1670
+ overflow: hidden;
1671
+ }
1672
+
1673
+ .tool-param-json pre {
1674
+ margin: 0;
1675
+ padding: 0.625rem 0.875rem;
1676
+ font-size: 0.75rem;
1677
+ overflow-x: auto;
1678
+ max-height: 200px;
1679
+ overflow-y: auto;
1680
+ white-space: pre-wrap;
1681
+ word-break: break-all;
1682
+ }
1683
+
1684
+ .tool-param-content-preview {
1685
+ border-radius: 0.375rem;
1686
+ overflow: hidden;
1687
+ }
1688
+
1689
+ .tool-param-content-preview .preview-header {
1690
+ padding: 0.375rem 0.75rem;
1691
+ background: var(--color-bg-secondary);
1692
+ font-size: 0.7rem;
1693
+ font-weight: 600;
1694
+ text-transform: uppercase;
1695
+ letter-spacing: 0.03em;
1696
+ color: var(--color-text-secondary);
1697
+ display: flex;
1698
+ justify-content: space-between;
1699
+ align-items: center;
1700
+ }
1701
+
1702
+ .tool-param-content-preview .preview-body {
1703
+ padding: 0.5rem 0.75rem;
1704
+ font-family: 'Monaco','Menlo','Ubuntu Mono', monospace;
1705
+ font-size: 0.75rem;
1706
+ max-height: 200px;
1707
+ overflow-y: auto;
1708
+ white-space: pre-wrap;
1709
+ word-break: break-all;
1710
+ background: var(--color-bg-code);
1711
+ color: #d1d5db;
1712
+ }
1713
+
1714
+ .tool-param-content-preview .preview-truncated {
1715
+ padding: 0.25rem 0.75rem;
1716
+ font-size: 0.7rem;
1717
+ color: var(--color-text-secondary);
1718
+ background: var(--color-bg-secondary);
1719
+ text-align: center;
1720
+ }
1721
+
1722
+ /* --- Folded Tool Use (neutral base, colored by block-type-* classes) --- */
1723
+ .folded-tool {
1724
+ margin: 0;
1725
+ border-radius: 0.375rem;
1726
+ overflow: hidden;
1727
+ background: #f3f4f6;
1728
+ }
1729
+ html.dark .folded-tool {
1730
+ background: #1f2937;
1731
+ }
1732
+ .folded-tool-bar {
1733
+ display: flex;
1734
+ align-items: center;
1735
+ gap: 0.375rem;
1736
+ padding: 0.4rem 0.75rem;
1737
+ cursor: pointer;
1738
+ user-select: none;
1739
+ list-style: none;
1740
+ font-size: 0.85rem;
1741
+ line-height: 1.3;
1742
+ background: #e5e7eb;
1743
+ transition: background 0.15s;
1744
+ }
1745
+ html.dark .folded-tool-bar {
1746
+ background: #374151;
1747
+ }
1748
+ .folded-tool-bar::-webkit-details-marker { display: none; }
1749
+ .folded-tool-bar::marker { display: none; content: ''; }
1750
+ .folded-tool-bar::before {
1751
+ content: '\25b6';
1752
+ font-size: 0.5rem;
1753
+ margin-right: 0.125rem;
1754
+ display: inline-block;
1755
+ transition: transform 0.15s;
1756
+ color: #6b7280;
1757
+ flex-shrink: 0;
1758
+ }
1759
+ html.dark .folded-tool-bar::before { color: #9ca3af; }
1760
+ .folded-tool[open] > .folded-tool-bar::before { transform: rotate(90deg); }
1761
+ .folded-tool-bar:hover { background: #d1d5db; }
1762
+ html.dark .folded-tool-bar:hover { background: #4b5563; }
1763
+ .folded-tool-icon {
1764
+ display: flex;
1765
+ align-items: center;
1766
+ color: #6b7280;
1767
+ width: 1rem;
1768
+ height: 1rem;
1769
+ flex-shrink: 0;
1770
+ }
1771
+ html.dark .folded-tool-icon { color: #9ca3af; }
1772
+ .folded-tool-icon svg { width: 1rem; height: 1rem; }
1773
+ .folded-tool-name {
1774
+ font-weight: 600;
1775
+ color: #374151;
1776
+ font-family: 'Monaco','Menlo','Ubuntu Mono', monospace;
1777
+ font-size: 0.8rem;
1778
+ flex-shrink: 0;
1779
+ }
1780
+ html.dark .folded-tool-name { color: #d1d5db; }
1781
+ .folded-tool-desc {
1782
+ color: #6b7280;
1783
+ font-family: 'Monaco','Menlo','Ubuntu Mono', monospace;
1784
+ font-size: 0.8rem;
1785
+ overflow: hidden;
1786
+ text-overflow: ellipsis;
1787
+ white-space: nowrap;
1788
+ flex: 1;
1789
+ min-width: 0;
1790
+ opacity: 0.8;
1791
+ }
1792
+ html.dark .folded-tool-desc { color: #9ca3af; }
1793
+ .folded-tool-body {
1794
+ padding: 0.5rem 0.75rem;
1795
+ font-size: 0.75rem;
1796
+ border-top: 1px solid #d1d5db;
1797
+ }
1798
+ html.dark .folded-tool-body { border-top-color: #4b5563; }
1799
+ .folded-tool-body .tool-input-pre {
1800
+ margin: 0;
1801
+ padding: 0.375rem 0.5rem;
1802
+ font-size: 0.7rem;
1803
+ }
1804
+
1805
+ /* --- Error variant of folded-tool --- */
1806
+ .folded-tool.folded-tool-error {
1807
+ background: #fef2f2;
1808
+ }
1809
+ html.dark .folded-tool.folded-tool-error {
1810
+ background: #1c0f0f;
1811
+ }
1812
+ .folded-tool-error > .folded-tool-bar {
1813
+ background: #fee2e2;
1814
+ }
1815
+ html.dark .folded-tool-error > .folded-tool-bar {
1816
+ background: #2c1010;
1817
+ }
1818
+ .folded-tool-error > .folded-tool-bar::before { color: #ef4444; }
1819
+ html.dark .folded-tool-error > .folded-tool-bar::before { color: #f87171; }
1820
+ .folded-tool-error > .folded-tool-bar:hover { background: #fecaca; }
1821
+ html.dark .folded-tool-error > .folded-tool-bar:hover { background: #451a1a; }
1822
+ .folded-tool-error .folded-tool-icon { color: #ef4444; }
1823
+ html.dark .folded-tool-error .folded-tool-icon { color: #f87171; }
1824
+ .folded-tool-error .folded-tool-name { color: #991b1b; }
1825
+ html.dark .folded-tool-error .folded-tool-name { color: #fca5a5; }
1826
+ .folded-tool-error .folded-tool-desc { color: #b91c1c; }
1827
+ html.dark .folded-tool-error .folded-tool-desc { color: #f87171; }
1828
+ .folded-tool-error > .folded-tool-body { border-top-color: #fecaca; }
1829
+ html.dark .folded-tool-error > .folded-tool-body { border-top-color: #7f1d1d; }
1830
+
1831
+ /* --- Info variant of folded-tool (system blocks) --- */
1832
+ .folded-tool.folded-tool-info {
1833
+ background: #eef2ff;
1834
+ }
1835
+ html.dark .folded-tool.folded-tool-info {
1836
+ background: #15103a;
1837
+ }
1838
+ .folded-tool-info > .folded-tool-bar {
1839
+ background: #e0e7ff;
1840
+ }
1841
+ html.dark .folded-tool-info > .folded-tool-bar {
1842
+ background: #1e1b4b;
1843
+ }
1844
+ .folded-tool-info > .folded-tool-bar::before { color: #6366f1; }
1845
+ html.dark .folded-tool-info > .folded-tool-bar::before { color: #a5b4fc; }
1846
+ .folded-tool-info > .folded-tool-bar:hover { background: #c7d2fe; }
1847
+ html.dark .folded-tool-info > .folded-tool-bar:hover { background: #312e81; }
1848
+ .folded-tool-info .folded-tool-icon { color: #6366f1; }
1849
+ html.dark .folded-tool-info .folded-tool-icon { color: #a5b4fc; }
1850
+ .folded-tool-info .folded-tool-name { color: #3730a3; }
1851
+ html.dark .folded-tool-info .folded-tool-name { color: #c7d2fe; }
1852
+ .folded-tool-info .folded-tool-desc { color: #4f46e5; }
1853
+ html.dark .folded-tool-info .folded-tool-desc { color: #a5b4fc; }
1854
+ .folded-tool-info > .folded-tool-body { border-top-color: #c7d2fe; }
1855
+ html.dark .folded-tool-info > .folded-tool-body { border-top-color: #3730a3; }
1856
+
1857
+ /* --- Per-block-type unique colored backgrounds --- */
1858
+ .block-type-text { background: #f8fafc; }
1859
+ html.dark .block-type-text { background: #1e293b; }
1860
+
1861
+ /* --- Per-tool-name header colors (tool-color-*) --- */
1862
+ .tool-color-read.folded-tool > .folded-tool-bar { background: #dbeafe; }
1863
+ html.dark .tool-color-read.folded-tool > .folded-tool-bar { background: #1e3a5f; }
1864
+ .tool-color-read.folded-tool > .folded-tool-bar:hover { background: #bfdbfe; }
1865
+ html.dark .tool-color-read.folded-tool > .folded-tool-bar:hover { background: #1e40af; }
1866
+ .tool-color-read.folded-tool > .folded-tool-bar::before { color: #2563eb; }
1867
+ html.dark .tool-color-read.folded-tool > .folded-tool-bar::before { color: #60a5fa; }
1868
+ .tool-color-read .folded-tool-icon { color: #2563eb; }
1869
+ html.dark .tool-color-read .folded-tool-icon { color: #60a5fa; }
1870
+ .tool-color-read .folded-tool-name { color: #1e40af; }
1871
+ html.dark .tool-color-read .folded-tool-name { color: #93bbfd; }
1872
+ .tool-color-read .folded-tool-desc { color: #1d4ed8; }
1873
+ html.dark .tool-color-read .folded-tool-desc { color: #60a5fa; }
1874
+ .tool-color-read { background: #eff6ff; }
1875
+ html.dark .tool-color-read { background: #0c1929; }
1876
+ .tool-color-read > .folded-tool-body { border-top-color: #bfdbfe; }
1877
+ html.dark .tool-color-read > .folded-tool-body { border-top-color: #1e3a5f; }
1878
+
1879
+ .tool-color-write.folded-tool > .folded-tool-bar { background: #fef3c7; }
1880
+ html.dark .tool-color-write.folded-tool > .folded-tool-bar { background: #422006; }
1881
+ .tool-color-write.folded-tool > .folded-tool-bar:hover { background: #fde68a; }
1882
+ html.dark .tool-color-write.folded-tool > .folded-tool-bar:hover { background: #78350f; }
1883
+ .tool-color-write.folded-tool > .folded-tool-bar::before { color: #d97706; }
1884
+ html.dark .tool-color-write.folded-tool > .folded-tool-bar::before { color: #fbbf24; }
1885
+ .tool-color-write .folded-tool-icon { color: #d97706; }
1886
+ html.dark .tool-color-write .folded-tool-icon { color: #fbbf24; }
1887
+ .tool-color-write .folded-tool-name { color: #92400e; }
1888
+ html.dark .tool-color-write .folded-tool-name { color: #fcd34d; }
1889
+ .tool-color-write .folded-tool-desc { color: #b45309; }
1890
+ html.dark .tool-color-write .folded-tool-desc { color: #fbbf24; }
1891
+ .tool-color-write { background: #fffbeb; }
1892
+ html.dark .tool-color-write { background: #1c1507; }
1893
+ .tool-color-write > .folded-tool-body { border-top-color: #fde68a; }
1894
+ html.dark .tool-color-write > .folded-tool-body { border-top-color: #422006; }
1895
+
1896
+ .tool-color-edit.folded-tool > .folded-tool-bar { background: #ede9fe; }
1897
+ html.dark .tool-color-edit.folded-tool > .folded-tool-bar { background: #2e1065; }
1898
+ .tool-color-edit.folded-tool > .folded-tool-bar:hover { background: #ddd6fe; }
1899
+ html.dark .tool-color-edit.folded-tool > .folded-tool-bar:hover { background: #4c1d95; }
1900
+ .tool-color-edit.folded-tool > .folded-tool-bar::before { color: #7c3aed; }
1901
+ html.dark .tool-color-edit.folded-tool > .folded-tool-bar::before { color: #a78bfa; }
1902
+ .tool-color-edit .folded-tool-icon { color: #7c3aed; }
1903
+ html.dark .tool-color-edit .folded-tool-icon { color: #a78bfa; }
1904
+ .tool-color-edit .folded-tool-name { color: #5b21b6; }
1905
+ html.dark .tool-color-edit .folded-tool-name { color: #c4b5fd; }
1906
+ .tool-color-edit .folded-tool-desc { color: #6d28d9; }
1907
+ html.dark .tool-color-edit .folded-tool-desc { color: #a78bfa; }
1908
+ .tool-color-edit { background: #f5f3ff; }
1909
+ html.dark .tool-color-edit { background: #1a0a2e; }
1910
+ .tool-color-edit > .folded-tool-body { border-top-color: #ddd6fe; }
1911
+ html.dark .tool-color-edit > .folded-tool-body { border-top-color: #2e1065; }
1912
+
1913
+ .tool-color-bash.folded-tool > .folded-tool-bar { background: #e2e8f0; }
1914
+ html.dark .tool-color-bash.folded-tool > .folded-tool-bar { background: #1e293b; }
1915
+ .tool-color-bash.folded-tool > .folded-tool-bar:hover { background: #cbd5e1; }
1916
+ html.dark .tool-color-bash.folded-tool > .folded-tool-bar:hover { background: #334155; }
1917
+ .tool-color-bash.folded-tool > .folded-tool-bar::before { color: #475569; }
1918
+ html.dark .tool-color-bash.folded-tool > .folded-tool-bar::before { color: #94a3b8; }
1919
+ .tool-color-bash .folded-tool-icon { color: #475569; }
1920
+ html.dark .tool-color-bash .folded-tool-icon { color: #94a3b8; }
1921
+ .tool-color-bash .folded-tool-name { color: #334155; }
1922
+ html.dark .tool-color-bash .folded-tool-name { color: #cbd5e1; }
1923
+ .tool-color-bash .folded-tool-desc { color: #475569; }
1924
+ html.dark .tool-color-bash .folded-tool-desc { color: #94a3b8; }
1925
+ .tool-color-bash { background: #f8fafc; }
1926
+ html.dark .tool-color-bash { background: #0f172a; }
1927
+ .tool-color-bash > .folded-tool-body { border-top-color: #cbd5e1; }
1928
+ html.dark .tool-color-bash > .folded-tool-body { border-top-color: #334155; }
1929
+
1930
+ .tool-color-glob.folded-tool > .folded-tool-bar { background: #d1fae5; }
1931
+ html.dark .tool-color-glob.folded-tool > .folded-tool-bar { background: #064e3b; }
1932
+ .tool-color-glob.folded-tool > .folded-tool-bar:hover { background: #a7f3d0; }
1933
+ html.dark .tool-color-glob.folded-tool > .folded-tool-bar:hover { background: #065f46; }
1934
+ .tool-color-glob.folded-tool > .folded-tool-bar::before { color: #059669; }
1935
+ html.dark .tool-color-glob.folded-tool > .folded-tool-bar::before { color: #34d399; }
1936
+ .tool-color-glob .folded-tool-icon { color: #059669; }
1937
+ html.dark .tool-color-glob .folded-tool-icon { color: #34d399; }
1938
+ .tool-color-glob .folded-tool-name { color: #065f46; }
1939
+ html.dark .tool-color-glob .folded-tool-name { color: #6ee7b7; }
1940
+ .tool-color-glob .folded-tool-desc { color: #047857; }
1941
+ html.dark .tool-color-glob .folded-tool-desc { color: #34d399; }
1942
+ .tool-color-glob { background: #ecfdf5; }
1943
+ html.dark .tool-color-glob { background: #022c22; }
1944
+ .tool-color-glob > .folded-tool-body { border-top-color: #a7f3d0; }
1945
+ html.dark .tool-color-glob > .folded-tool-body { border-top-color: #064e3b; }
1946
+
1947
+ .tool-color-grep.folded-tool > .folded-tool-bar { background: #ffe4e6; }
1948
+ html.dark .tool-color-grep.folded-tool > .folded-tool-bar { background: #4c0519; }
1949
+ .tool-color-grep.folded-tool > .folded-tool-bar:hover { background: #fecdd3; }
1950
+ html.dark .tool-color-grep.folded-tool > .folded-tool-bar:hover { background: #881337; }
1951
+ .tool-color-grep.folded-tool > .folded-tool-bar::before { color: #e11d48; }
1952
+ html.dark .tool-color-grep.folded-tool > .folded-tool-bar::before { color: #fb7185; }
1953
+ .tool-color-grep .folded-tool-icon { color: #e11d48; }
1954
+ html.dark .tool-color-grep .folded-tool-icon { color: #fb7185; }
1955
+ .tool-color-grep .folded-tool-name { color: #9f1239; }
1956
+ html.dark .tool-color-grep .folded-tool-name { color: #fda4af; }
1957
+ .tool-color-grep .folded-tool-desc { color: #be123c; }
1958
+ html.dark .tool-color-grep .folded-tool-desc { color: #fb7185; }
1959
+ .tool-color-grep { background: #fff1f2; }
1960
+ html.dark .tool-color-grep { background: #2a0a10; }
1961
+ .tool-color-grep > .folded-tool-body { border-top-color: #fecdd3; }
1962
+ html.dark .tool-color-grep > .folded-tool-body { border-top-color: #4c0519; }
1963
+
1964
+ .tool-color-web.folded-tool > .folded-tool-bar { background: #e0f2fe; }
1965
+ html.dark .tool-color-web.folded-tool > .folded-tool-bar { background: #0c4a6e; }
1966
+ .tool-color-web.folded-tool > .folded-tool-bar:hover { background: #bae6fd; }
1967
+ html.dark .tool-color-web.folded-tool > .folded-tool-bar:hover { background: #075985; }
1968
+ .tool-color-web.folded-tool > .folded-tool-bar::before { color: #0284c7; }
1969
+ html.dark .tool-color-web.folded-tool > .folded-tool-bar::before { color: #38bdf8; }
1970
+ .tool-color-web .folded-tool-icon { color: #0284c7; }
1971
+ html.dark .tool-color-web .folded-tool-icon { color: #38bdf8; }
1972
+ .tool-color-web .folded-tool-name { color: #075985; }
1973
+ html.dark .tool-color-web .folded-tool-name { color: #7dd3fc; }
1974
+ .tool-color-web .folded-tool-desc { color: #0369a1; }
1975
+ html.dark .tool-color-web .folded-tool-desc { color: #38bdf8; }
1976
+ .tool-color-web { background: #f0f9ff; }
1977
+ html.dark .tool-color-web { background: #0a1929; }
1978
+ .tool-color-web > .folded-tool-body { border-top-color: #bae6fd; }
1979
+ html.dark .tool-color-web > .folded-tool-body { border-top-color: #0c4a6e; }
1980
+
1981
+ .tool-color-todo.folded-tool > .folded-tool-bar { background: #ffedd5; }
1982
+ html.dark .tool-color-todo.folded-tool > .folded-tool-bar { background: #431407; }
1983
+ .tool-color-todo.folded-tool > .folded-tool-bar:hover { background: #fed7aa; }
1984
+ html.dark .tool-color-todo.folded-tool > .folded-tool-bar:hover { background: #7c2d12; }
1985
+ .tool-color-todo.folded-tool > .folded-tool-bar::before { color: #ea580c; }
1986
+ html.dark .tool-color-todo.folded-tool > .folded-tool-bar::before { color: #fb923c; }
1987
+ .tool-color-todo .folded-tool-icon { color: #ea580c; }
1988
+ html.dark .tool-color-todo .folded-tool-icon { color: #fb923c; }
1989
+ .tool-color-todo .folded-tool-name { color: #9a3412; }
1990
+ html.dark .tool-color-todo .folded-tool-name { color: #fdba74; }
1991
+ .tool-color-todo .folded-tool-desc { color: #c2410c; }
1992
+ html.dark .tool-color-todo .folded-tool-desc { color: #fb923c; }
1993
+ .tool-color-todo { background: #fff7ed; }
1994
+ html.dark .tool-color-todo { background: #1c0f02; }
1995
+ .tool-color-todo > .folded-tool-body { border-top-color: #fed7aa; }
1996
+ html.dark .tool-color-todo > .folded-tool-body { border-top-color: #431407; }
1997
+
1998
+ .tool-color-task.folded-tool > .folded-tool-bar { background: #e0e7ff; }
1999
+ html.dark .tool-color-task.folded-tool > .folded-tool-bar { background: #1e1b4b; }
2000
+ .tool-color-task.folded-tool > .folded-tool-bar:hover { background: #c7d2fe; }
2001
+ html.dark .tool-color-task.folded-tool > .folded-tool-bar:hover { background: #312e81; }
2002
+ .tool-color-task.folded-tool > .folded-tool-bar::before { color: #4f46e5; }
2003
+ html.dark .tool-color-task.folded-tool > .folded-tool-bar::before { color: #818cf8; }
2004
+ .tool-color-task .folded-tool-icon { color: #4f46e5; }
2005
+ html.dark .tool-color-task .folded-tool-icon { color: #818cf8; }
2006
+ .tool-color-task .folded-tool-name { color: #3730a3; }
2007
+ html.dark .tool-color-task .folded-tool-name { color: #a5b4fc; }
2008
+ .tool-color-task .folded-tool-desc { color: #4338ca; }
2009
+ html.dark .tool-color-task .folded-tool-desc { color: #818cf8; }
2010
+ .tool-color-task { background: #eef2ff; }
2011
+ html.dark .tool-color-task { background: #0f0d29; }
2012
+ .tool-color-task > .folded-tool-body { border-top-color: #c7d2fe; }
2013
+ html.dark .tool-color-task > .folded-tool-body { border-top-color: #1e1b4b; }
2014
+
2015
+ .tool-color-default.folded-tool > .folded-tool-bar { background: #cffafe; }
2016
+ html.dark .tool-color-default.folded-tool > .folded-tool-bar { background: #0e2a3a; }
2017
+ .tool-color-default.folded-tool > .folded-tool-bar:hover { background: #a5f3fc; }
2018
+ html.dark .tool-color-default.folded-tool > .folded-tool-bar:hover { background: #164e63; }
2019
+ .tool-color-default.folded-tool > .folded-tool-bar::before { color: #0891b2; }
2020
+ html.dark .tool-color-default.folded-tool > .folded-tool-bar::before { color: #22d3ee; }
2021
+ .tool-color-default .folded-tool-icon { color: #0891b2; }
2022
+ html.dark .tool-color-default .folded-tool-icon { color: #22d3ee; }
2023
+ .tool-color-default .folded-tool-name { color: #155e75; }
2024
+ html.dark .tool-color-default .folded-tool-name { color: #67e8f9; }
2025
+ .tool-color-default .folded-tool-desc { color: #0e7490; }
2026
+ html.dark .tool-color-default .folded-tool-desc { color: #22d3ee; }
2027
+ .tool-color-default { background: #ecfeff; }
2028
+ html.dark .tool-color-default { background: #0c1a24; }
2029
+ .tool-color-default > .folded-tool-body { border-top-color: #a5f3fc; }
2030
+ html.dark .tool-color-default > .folded-tool-body { border-top-color: #164e63; }
2031
+
2032
+ .block-type-tool_result { background: #f0fdf4; }
2033
+ html.dark .block-type-tool_result { background: #0a1f0f; }
2034
+ .block-type-tool_result .tool-result-status { background: #dcfce7; }
2035
+ html.dark .block-type-tool_result .tool-result-status { background: #0f2b1a; }
2036
+ .block-type-tool_result .folded-tool-icon { color: #16a34a; }
2037
+ html.dark .block-type-tool_result .folded-tool-icon { color: #4ade80; }
2038
+ .block-type-tool_result .folded-tool-name { color: #166534; }
2039
+ html.dark .block-type-tool_result .folded-tool-name { color: #86efac; }
2040
+ .block-type-tool_result > .folded-tool-body { border-top-color: #bbf7d0; }
2041
+ html.dark .block-type-tool_result > .folded-tool-body { border-top-color: #166534; }
2042
+ .block-type-tool_result.tool-result-error { background: #fef2f2; }
2043
+ html.dark .block-type-tool_result.tool-result-error { background: #1c0f0f; }
2044
+ .block-type-tool_result.tool-result-error .tool-result-status { background: #fee2e2; }
2045
+ html.dark .block-type-tool_result.tool-result-error .tool-result-status { background: #2c1010; }
2046
+ .block-type-tool_result.tool-result-error .folded-tool-icon { color: #dc2626; }
2047
+ html.dark .block-type-tool_result.tool-result-error .folded-tool-icon { color: #f87171; }
2048
+ .block-type-tool_result.tool-result-error .folded-tool-name { color: #991b1b; }
2049
+ html.dark .block-type-tool_result.tool-result-error .folded-tool-name { color: #fca5a5; }
2050
+
2051
+ .block-type-code { background: #1e293b; }
2052
+ html.dark .block-type-code { background: #0f172a; }
2053
+
2054
+ .block-type-thinking { background: #f5f3ff; }
2055
+ html.dark .block-type-thinking { background: #1e1033; }
2056
+
2057
+ .block-type-bash { background: #fffbeb; }
2058
+ html.dark .block-type-bash { background: #1c1507; }
2059
+
2060
+ .block-type-system { background: #eef2ff; }
2061
+ html.dark .block-type-system { background: #15103a; }
2062
+ .block-type-system.folded-tool > .folded-tool-bar { background: #e0e7ff; }
2063
+ html.dark .block-type-system.folded-tool > .folded-tool-bar { background: #1e1b4b; }
2064
+ .block-type-system.folded-tool > .folded-tool-bar:hover { background: #c7d2fe; }
2065
+ html.dark .block-type-system.folded-tool > .folded-tool-bar:hover { background: #312e81; }
2066
+ .block-type-system.folded-tool > .folded-tool-bar::before { color: #6366f1; }
2067
+ html.dark .block-type-system.folded-tool > .folded-tool-bar::before { color: #a5b4fc; }
2068
+ .block-type-system .folded-tool-icon { color: #6366f1; }
2069
+ html.dark .block-type-system .folded-tool-icon { color: #a5b4fc; }
2070
+ .block-type-system .folded-tool-name { color: #3730a3; }
2071
+ html.dark .block-type-system .folded-tool-name { color: #c7d2fe; }
2072
+ .block-type-system .folded-tool-desc { color: #4f46e5; }
2073
+ html.dark .block-type-system .folded-tool-desc { color: #a5b4fc; }
2074
+ .block-type-system > .folded-tool-body { border-top-color: #c7d2fe; }
2075
+ html.dark .block-type-system > .folded-tool-body { border-top-color: #3730a3; }
2076
+
2077
+ .block-type-result { background: #f0fdf4; }
2078
+ html.dark .block-type-result { background: #0a1f0f; }
2079
+ .block-type-result.folded-tool > .folded-tool-bar { background: #dcfce7; }
2080
+ html.dark .block-type-result.folded-tool > .folded-tool-bar { background: #0f2b1a; }
2081
+ .block-type-result.folded-tool > .folded-tool-bar:hover { background: #bbf7d0; }
2082
+ html.dark .block-type-result.folded-tool > .folded-tool-bar:hover { background: #14532d; }
2083
+ .block-type-result.folded-tool > .folded-tool-bar::before { color: #16a34a; }
2084
+ html.dark .block-type-result.folded-tool > .folded-tool-bar::before { color: #4ade80; }
2085
+ .block-type-result .folded-tool-icon { color: #16a34a; }
2086
+ html.dark .block-type-result .folded-tool-icon { color: #4ade80; }
2087
+ .block-type-result .folded-tool-name { color: #166534; }
2088
+ html.dark .block-type-result .folded-tool-name { color: #86efac; }
2089
+ .block-type-result .folded-tool-desc { color: #15803d; }
2090
+ html.dark .block-type-result .folded-tool-desc { color: #4ade80; }
2091
+ .block-type-result > .folded-tool-body { border-top-color: #bbf7d0; }
2092
+ html.dark .block-type-result > .folded-tool-body { border-top-color: #166534; }
2093
+
2094
+ .block-type-error { background: #fef2f2; }
2095
+ html.dark .block-type-error { background: #1c0f0f; }
2096
+ .block-type-error.folded-tool > .folded-tool-bar { background: #fee2e2; }
2097
+ html.dark .block-type-error.folded-tool > .folded-tool-bar { background: #2c1010; }
2098
+ .block-type-error.folded-tool > .folded-tool-bar:hover { background: #fecaca; }
2099
+ html.dark .block-type-error.folded-tool > .folded-tool-bar:hover { background: #451a1a; }
2100
+ .block-type-error.folded-tool > .folded-tool-bar::before { color: #ef4444; }
2101
+ html.dark .block-type-error.folded-tool > .folded-tool-bar::before { color: #f87171; }
2102
+ .block-type-error .folded-tool-icon { color: #ef4444; }
2103
+ html.dark .block-type-error .folded-tool-icon { color: #f87171; }
2104
+ .block-type-error .folded-tool-name { color: #991b1b; }
2105
+ html.dark .block-type-error .folded-tool-name { color: #fca5a5; }
2106
+ .block-type-error .folded-tool-desc { color: #b91c1c; }
2107
+ html.dark .block-type-error .folded-tool-desc { color: #f87171; }
2108
+ .block-type-error > .folded-tool-body { border-top-color: #fecaca; }
2109
+ html.dark .block-type-error > .folded-tool-body { border-top-color: #7f1d1d; }
2110
+
2111
+ .block-type-image { background: #fdf2f8; }
2112
+ html.dark .block-type-image { background: #1f0a1a; }
2113
+
2114
+ .block-type-plan { background: #eff6ff; }
2115
+ html.dark .block-type-plan { background: #0c1929; }
2116
+
2117
+ .block-type-usage { background: #f9fafb; }
2118
+ html.dark .block-type-usage { background: #1f2937; }
2119
+
2120
+ .block-type-premature { background: #fffbeb; }
2121
+ html.dark .block-type-premature { background: #1c1507; }
2122
+
2123
+ .block-type-tool_status { background: #f0f9ff; }
2124
+ html.dark .block-type-tool_status { background: #0c1929; }
2125
+
2126
+ .block-type-generic { background: #f9fafb; }
2127
+ html.dark .block-type-generic { background: #1f2937; }
2128
+
2129
+ /* --- Code block header (non-collapsible) --- */
2130
+ .code-block-header {
2131
+ display: flex;
2132
+ align-items: center;
2133
+ gap: 0.5rem;
2134
+ padding: 0.3rem 0.75rem;
2135
+ background: #1f2937;
2136
+ color: #9ca3af;
2137
+ font-family: 'Monaco','Menlo','Ubuntu Mono', monospace;
2138
+ font-size: 0.75rem;
2139
+ }
2140
+ .code-block-header .copy-code-btn {
2141
+ margin-left: auto;
2142
+ background: none;
2143
+ border: none;
2144
+ color: #6b7280;
2145
+ cursor: pointer;
2146
+ padding: 0.125rem;
2147
+ border-radius: 0.25rem;
2148
+ display: flex;
2149
+ align-items: center;
2150
+ transition: all 0.15s;
2151
+ }
2152
+ .code-block-header .copy-code-btn:hover { color: #e5e7eb; background: #4b5563; }
2153
+ .code-block-header .copy-code-btn svg { width: 0.875rem; height: 0.875rem; }
2154
+
2155
+ /* --- Tool result success styling in body --- */
2156
+ .tool-result-success .tool-result-status {
2157
+ background: #dcfce7;
2158
+ padding: 0.4rem 0.75rem;
2159
+ }
2160
+ html.dark .tool-result-success .tool-result-status {
2161
+ background: #0f2b1a;
2162
+ }
2163
+ .tool-result-success .folded-tool-icon { color: #16a34a; }
2164
+ html.dark .tool-result-success .folded-tool-icon { color: #4ade80; }
2165
+ .tool-result-success .folded-tool-name { color: #166534; font-weight: 600; }
2166
+ html.dark .tool-result-success .folded-tool-name { color: #86efac; }
2167
+
2168
+ /* --- Tool_use parent: has-success / has-error indicators on header --- */
2169
+ .folded-tool.has-success { background: #f0fdf4; }
2170
+ html.dark .folded-tool.has-success { background: #0a1f0f; }
2171
+ .folded-tool.has-success > .folded-tool-bar { background: #dcfce7; }
2172
+ html.dark .folded-tool.has-success > .folded-tool-bar { background: #0f2b1a; }
2173
+ .folded-tool.has-success > .folded-tool-bar:hover { background: #bbf7d0; }
2174
+ html.dark .folded-tool.has-success > .folded-tool-bar:hover { background: #14532d; }
2175
+ .folded-tool.has-success > .folded-tool-bar::before { color: #16a34a; }
2176
+ html.dark .folded-tool.has-success > .folded-tool-bar::before { color: #4ade80; }
2177
+ .folded-tool.has-success .folded-tool-icon { color: #16a34a; }
2178
+ html.dark .folded-tool.has-success .folded-tool-icon { color: #4ade80; }
2179
+ .folded-tool.has-success .folded-tool-name { color: #166534; }
2180
+ html.dark .folded-tool.has-success .folded-tool-name { color: #86efac; }
2181
+ .folded-tool.has-success .folded-tool-desc { color: #15803d; }
2182
+ html.dark .folded-tool.has-success .folded-tool-desc { color: #4ade80; }
2183
+ .folded-tool.has-success > .folded-tool-body { border-top-color: #bbf7d0; }
2184
+ html.dark .folded-tool.has-success > .folded-tool-body { border-top-color: #166534; }
2185
+
2186
+ .folded-tool.has-error { background: #fef2f2; }
2187
+ html.dark .folded-tool.has-error { background: #1c0f0f; }
2188
+ .folded-tool.has-error > .folded-tool-bar { background: #fee2e2; }
2189
+ html.dark .folded-tool.has-error > .folded-tool-bar { background: #2c1010; }
2190
+ .folded-tool.has-error > .folded-tool-bar:hover { background: #fecaca; }
2191
+ html.dark .folded-tool.has-error > .folded-tool-bar:hover { background: #451a1a; }
2192
+ .folded-tool.has-error > .folded-tool-bar::before { color: #ef4444; }
2193
+ html.dark .folded-tool.has-error > .folded-tool-bar::before { color: #f87171; }
2194
+ .folded-tool.has-error .folded-tool-icon { color: #ef4444; }
2195
+ html.dark .folded-tool.has-error .folded-tool-icon { color: #f87171; }
2196
+ .folded-tool.has-error .folded-tool-name { color: #991b1b; }
2197
+ html.dark .folded-tool.has-error .folded-tool-name { color: #fca5a5; }
2198
+ .folded-tool.has-error .folded-tool-desc { color: #b91c1c; }
2199
+ html.dark .folded-tool.has-error .folded-tool-desc { color: #f87171; }
2200
+ .folded-tool.has-error > .folded-tool-body { border-top-color: #fecaca; }
2201
+ html.dark .folded-tool.has-error > .folded-tool-body { border-top-color: #7f1d1d; }
2202
+
2203
+ /* --- Success/Error status icons in header --- */
2204
+ .folded-tool.has-success > .folded-tool-bar .folded-tool-icon::after,
2205
+ .folded-tool.has-error > .folded-tool-bar .folded-tool-icon::after {
2206
+ content: '';
2207
+ display: inline-block;
2208
+ width: 1rem;
2209
+ height: 1rem;
2210
+ margin-left: 0.375rem;
2211
+ background-size: contain;
2212
+ background-repeat: no-repeat;
2213
+ flex-shrink: 0;
2214
+ }
2215
+ .folded-tool.has-success > .folded-tool-bar .folded-tool-icon::after {
2216
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 20 20' fill='%2316a34a'%3E%3Cpath fill-rule='evenodd' d='M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z' clip-rule='evenodd'/%3E%3C/svg%3E");
2217
+ }
2218
+ html.dark .folded-tool.has-success > .folded-tool-bar .folded-tool-icon::after {
2219
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 20 20' fill='%234ade80'%3E%3Cpath fill-rule='evenodd' d='M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z' clip-rule='evenodd'/%3E%3C/svg%3E");
2220
+ }
2221
+ .folded-tool.has-error > .folded-tool-bar .folded-tool-icon::after {
2222
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 20 20' fill='%23ef4444'%3E%3Cpath fill-rule='evenodd' d='M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z' clip-rule='evenodd'/%3E%3C/svg%3E");
2223
+ }
2224
+ html.dark .folded-tool.has-error > .folded-tool-bar .folded-tool-icon::after {
2225
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 20 20' fill='%23f87171'%3E%3Cpath fill-rule='evenodd' d='M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z' clip-rule='evenodd'/%3E%3C/svg%3E");
2226
+ }
2227
+ .folded-tool-icon {
2228
+ display: inline-flex;
2229
+ align-items: center;
2230
+ }
2231
+
2232
+ /* --- Consecutive block joining --- */
2233
+ .folded-tool + .folded-tool,
2234
+ .block-tool-use + .block-tool-use {
2235
+ margin-top: -1px;
2236
+ border-radius: 0;
2237
+ }
2238
+ .folded-tool + .folded-tool > .folded-tool-bar,
2239
+ .block-tool-use + .block-tool-use > .folded-tool-bar {
2240
+ border-top: 1px solid rgba(0,0,0,0.06);
2241
+ }
2242
+ html.dark .folded-tool + .folded-tool > .folded-tool-bar,
2243
+ html.dark .block-tool-use + .block-tool-use > .folded-tool-bar {
2244
+ border-top: 1px solid rgba(255,255,255,0.06);
2245
+ }
2246
+ .folded-tool:first-child,
2247
+ .block-tool-use:first-child {
2248
+ border-radius: 0.375rem 0.375rem 0 0;
2249
+ }
2250
+ .folded-tool:last-child,
2251
+ .block-tool-use:last-child {
2252
+ border-radius: 0 0 0.375rem 0.375rem;
2253
+ }
2254
+ .folded-tool:only-child,
2255
+ .block-tool-use:only-child {
2256
+ border-radius: 0.375rem;
2257
+ }
2258
+
2259
+ /* --- Inline Tool Result (nested inside tool_use) --- */
2260
+ /* Tool Result Blocks - Folded by default with status icons */
2261
+ .folded-tool.block-type-tool_result {
2262
+ margin-bottom: 0.375rem;
2263
+ }
2264
+ .folded-tool.folded-tool-success {
2265
+ background: #f0fdf4;
2266
+ }
2267
+ html.dark .folded-tool.folded-tool-success {
2268
+ background: #0a1f0f;
2269
+ }
2270
+ .folded-tool.folded-tool-success > .folded-tool-bar {
2271
+ background: #dcfce7;
2272
+ }
2273
+ html.dark .folded-tool.folded-tool-success > .folded-tool-bar {
2274
+ background: #0f2b1a;
2275
+ }
2276
+ .folded-tool.folded-tool-success > .folded-tool-bar::before {
2277
+ color: #16a34a;
2278
+ }
2279
+ html.dark .folded-tool.folded-tool-success > .folded-tool-bar::before {
2280
+ color: #4ade80;
2281
+ }
2282
+
2283
+ /* --- Consecutive Block Joining --- */
2284
+ .streaming-blocks > * + *,
2285
+ .message-blocks > * + * {
2286
+ margin-top: 0;
2287
+ }
2288
+ .streaming-blocks > *,
2289
+ .message-blocks > * {
2290
+ border-radius: 0;
2291
+ }
2292
+ .streaming-blocks > *:first-child,
2293
+ .message-blocks > *:first-child {
2294
+ border-top-left-radius: 0.375rem;
2295
+ border-top-right-radius: 0.375rem;
2296
+ }
2297
+ .streaming-blocks > *:last-child,
2298
+ .message-blocks > *:last-child {
2299
+ border-bottom-left-radius: 0.375rem;
2300
+ border-bottom-right-radius: 0.375rem;
2301
+ }
2302
+ .streaming-blocks > *:only-child,
2303
+ .message-blocks > *:only-child {
2304
+ border-radius: 0.375rem;
2305
+ }
2306
+
2307
+ /* --- Collapsible Code Summary --- */
2308
+ .collapsible-code {
2309
+ margin: 0;
2310
+ border-radius: 0.375rem;
2311
+ overflow: hidden;
2312
+ background: #1e293b;
2313
+ }
2314
+ .collapsible-code-summary {
2315
+ display: flex;
2316
+ align-items: center;
2317
+ gap: 0.5rem;
2318
+ padding: 0.3rem 0.75rem;
2319
+ cursor: pointer;
2320
+ user-select: none;
2321
+ list-style: none;
2322
+ font-size: 0.75rem;
2323
+ line-height: 1.3;
2324
+ background: #1f2937;
2325
+ color: #9ca3af;
2326
+ font-family: 'Monaco','Menlo','Ubuntu Mono', monospace;
2327
+ transition: background 0.15s;
2328
+ }
2329
+ .collapsible-code-summary::-webkit-details-marker { display: none; }
2330
+ .collapsible-code-summary::marker { display: none; content: ''; }
2331
+ .collapsible-code-summary::before {
2332
+ content: '\25b6';
2333
+ font-size: 0.5rem;
2334
+ margin-right: 0.125rem;
2335
+ display: inline-block;
2336
+ transition: transform 0.15s;
2337
+ color: #6b7280;
2338
+ flex-shrink: 0;
2339
+ }
2340
+ .collapsible-code[open] > .collapsible-code-summary::before { transform: rotate(90deg); }
2341
+ .collapsible-code-summary:hover { background: #374151; }
2342
+ .collapsible-code-summary .copy-code-btn {
2343
+ margin-left: auto;
2344
+ background: none;
2345
+ border: none;
2346
+ color: #6b7280;
2347
+ cursor: pointer;
2348
+ padding: 0.125rem;
2349
+ border-radius: 0.25rem;
2350
+ display: flex;
2351
+ align-items: center;
2352
+ transition: all 0.15s;
2353
+ }
2354
+ .collapsible-code-summary .copy-code-btn:hover { color: #e5e7eb; background: #4b5563; }
2355
+ .collapsible-code-summary .copy-code-btn svg { width: 0.875rem; height: 0.875rem; }
2356
+ .collapsible-code-label {
2357
+ font-size: 0.7rem;
2358
+ text-transform: uppercase;
2359
+ letter-spacing: 0.05em;
2360
+ }
2361
+
2362
+ /* --- Tool Result Block --- */
2363
+ .block-tool-result {
2364
+ margin-bottom: 0;
2365
+ border-radius: 0.5rem;
2366
+ overflow: hidden;
2367
+ }
2368
+
2369
+ .block-tool-result.result-success { background: #f0fdf4; }
2370
+ .block-tool-result.result-error { background: #fef2f2; }
2371
+ html.dark .block-tool-result.result-success { background: #0a1f0f; }
2372
+ html.dark .block-tool-result.result-error { background: #1c0f0f; }
2373
+
2374
+ .block-tool-result .result-header {
2375
+ padding: 0.3rem 0.75rem;
2376
+ display: flex;
2377
+ align-items: center;
2378
+ justify-content: space-between;
2379
+ }
2380
+
2381
+ .block-tool-result.result-success .result-header { background: #dcfce7; }
2382
+ .block-tool-result.result-error .result-header { background: #fee2e2; }
2383
+ html.dark .block-tool-result.result-success .result-header { background: #0f2b1a; }
2384
+ html.dark .block-tool-result.result-error .result-header { background: #2c1010; }
2385
+
2386
+ .block-tool-result .result-header .status-label {
2387
+ display: flex;
2388
+ align-items: center;
2389
+ gap: 0.375rem;
2390
+ font-weight: 600;
2391
+ font-size: 0.8rem;
2392
+ }
2393
+
2394
+ .block-tool-result.result-success .status-label { color: #166534; }
2395
+ .block-tool-result.result-error .status-label { color: #991b1b; }
2396
+ html.dark .block-tool-result.result-success .status-label { color: #86efac; }
2397
+ html.dark .block-tool-result.result-error .status-label { color: #fca5a5; }
2398
+
2399
+ .block-tool-result .result-body {
2400
+ padding: 0.375rem 0.75rem;
2401
+ font-size: 0.8rem;
2402
+ white-space: pre-wrap;
2403
+ word-break: break-all;
2404
+ overflow-x: auto;
2405
+ max-height: 400px;
2406
+ overflow-y: auto;
2407
+ line-height: 1.5;
2408
+ }
2409
+
2410
+ .block-tool-result.result-success .result-body { color: #14532d; }
2411
+ .block-tool-result.result-error .result-body { color: #7f1d1d; }
2412
+ html.dark .block-tool-result.result-success .result-body { color: #bbf7d0; }
2413
+ html.dark .block-tool-result.result-error .result-body { color: #fecaca; }
2414
+
2415
+ .block-tool-result .result-body.collapsed { max-height: 150px; position: relative; }
2416
+ .block-tool-result .result-body.collapsed::after {
2417
+ content: '';
2418
+ position: absolute;
2419
+ bottom: 0;
2420
+ left: 0;
2421
+ right: 0;
2422
+ height: 3rem;
2423
+ background: linear-gradient(transparent, var(--color-bg-primary));
2424
+ pointer-events: none;
2425
+ }
2426
+
2427
+ .block-tool-result .expand-btn {
2428
+ display: block;
2429
+ width: 100%;
2430
+ padding: 0.375rem;
2431
+ background: var(--color-bg-secondary);
2432
+ border: none;
2433
+ cursor: pointer;
2434
+ font-size: 0.75rem;
2435
+ color: var(--color-primary);
2436
+ font-weight: 500;
2437
+ text-align: center;
2438
+ }
2439
+
2440
+ .block-tool-result .expand-btn:hover { background: var(--color-border); }
2441
+
2442
+ .block-tool-result .result-id {
2443
+ font-size: 0.65rem;
2444
+ font-family: 'Monaco','Menlo','Ubuntu Mono', monospace;
2445
+ opacity: 0.6;
2446
+ }
2447
+
2448
+ /* --- Result Summary Block --- */
2449
+ .block-result {
2450
+ margin-bottom: 0;
2451
+ border-radius: 0.5rem;
2452
+ overflow: hidden;
2453
+ }
2454
+
2455
+ .block-result.result-ok {
2456
+ background: linear-gradient(135deg, #ecfdf5, #f0fdf4);
2457
+ }
2458
+
2459
+ .block-result.result-err {
2460
+ background: linear-gradient(135deg, #fef2f2, #fff1f2);
2461
+ }
2462
+
2463
+ html.dark .block-result.result-ok { background: linear-gradient(135deg, #0a1f0f, #0f2b1a); }
2464
+ html.dark .block-result.result-err { background: linear-gradient(135deg, #1c0f0f, #2c1010); }
2465
+
2466
+ .block-result .result-summary-header {
2467
+ padding: 0.375rem 0.75rem;
2468
+ display: flex;
2469
+ align-items: center;
2470
+ gap: 0.5rem;
2471
+ }
2472
+
2473
+ .block-result.result-ok .result-summary-header { color: #166534; }
2474
+ .block-result.result-err .result-summary-header { color: #991b1b; }
2475
+ html.dark .block-result.result-ok .result-summary-header { color: #86efac; }
2476
+ html.dark .block-result.result-err .result-summary-header { color: #fca5a5; }
2477
+
2478
+ .block-result .result-summary-header .result-title { font-weight: 700; font-size: 0.9rem; }
2479
+
2480
+ .block-result .result-stats {
2481
+ display: flex;
2482
+ gap: 1.5rem;
2483
+ padding: 0 0.75rem 0.375rem;
2484
+ font-size: 0.8rem;
2485
+ flex-wrap: wrap;
2486
+ }
2487
+
2488
+ .block-result .result-stat {
2489
+ display: flex;
2490
+ align-items: center;
2491
+ gap: 0.375rem;
2492
+ }
2493
+
2494
+ .block-result .result-stat .stat-icon { font-size: 0.9rem; opacity: 0.7; }
2495
+ .block-result .result-stat .stat-value { font-weight: 600; }
2496
+ .block-result .result-stat .stat-label { color: var(--color-text-secondary); font-size: 0.75rem; }
2497
+
2498
+ .block-result .result-content {
2499
+ padding: 0.375rem 0.75rem;
2500
+ font-size: 0.85rem;
2501
+ white-space: pre-wrap;
2502
+ word-break: break-word;
2503
+ max-height: 300px;
2504
+ overflow-y: auto;
2505
+ line-height: 1.5;
2506
+ }
2507
+
2508
+ /* --- System Block --- */
2509
+ .block-system {
2510
+ margin-bottom: 0;
2511
+ border-radius: 0.5rem;
2512
+ background: #eef2ff;
2513
+ overflow: hidden;
2514
+ }
2515
+
2516
+ html.dark .block-system { background: #15103a; }
2517
+
2518
+ .block-system .system-header {
2519
+ padding: 0.375rem 0.75rem;
2520
+ background: #e0e7ff;
2521
+ font-weight: 600;
2522
+ font-size: 0.85rem;
2523
+ color: #3730a3;
2524
+ }
2525
+
2526
+ html.dark .block-system .system-header { background: #1e1b4b; color: #a5b4fc; }
2527
+
2528
+ .block-system .system-body {
2529
+ padding: 0.375rem 0.75rem;
2530
+ font-size: 0.8rem;
2531
+ color: #3730a3;
2532
+ display: flex;
2533
+ flex-direction: column;
2534
+ gap: 0.25rem;
2535
+ }
2536
+
2537
+ html.dark .block-system .system-body { color: #c7d2fe; }
2538
+
2539
+ .block-system .system-body .sys-field { display: flex; align-items: baseline; gap: 0.5rem; }
2540
+ .block-system .system-body .sys-label { font-weight: 600; flex-shrink: 0; min-width: 5rem; }
2541
+ .block-system .system-body .sys-value { font-family: 'Monaco','Menlo','Ubuntu Mono', monospace; font-size: 0.75rem; }
2542
+ .block-system .system-body .sys-value code { background: #c7d2fe; padding: 0.0625rem 0.375rem; border-radius: 0.25rem; }
2543
+ html.dark .block-system .system-body .sys-value code { background: #312e81; }
2544
+
2545
+ .block-system .tools-list {
2546
+ display: flex;
2547
+ flex-wrap: wrap;
2548
+ gap: 0.25rem;
2549
+ margin-top: 0.25rem;
2550
+ }
2551
+
2552
+ .block-system .tools-list .tool-badge {
2553
+ display: inline-block;
2554
+ padding: 0.125rem 0.5rem;
2555
+ background: #c7d2fe;
2556
+ color: #3730a3;
2557
+ border-radius: 1rem;
2558
+ font-size: 0.65rem;
2559
+ font-weight: 500;
2560
+ font-family: 'Monaco','Menlo','Ubuntu Mono', monospace;
2561
+ }
2562
+
2563
+ html.dark .block-system .tools-list .tool-badge { background: #312e81; color: #a5b4fc; }
2564
+
2565
+ /* --- Bash Block --- */
2566
+ .block-bash {
2567
+ margin-bottom: 0;
2568
+ border-radius: 0.5rem;
2569
+ overflow: hidden;
2570
+ background: #111827;
2571
+ }
2572
+
2573
+ .block-bash .bash-command {
2574
+ padding: 0.375rem 0.75rem;
2575
+ display: flex;
2576
+ align-items: flex-start;
2577
+ gap: 0.5rem;
2578
+ }
2579
+
2580
+ .block-bash .bash-command .prompt { color: #34d399; font-weight: 700; flex-shrink: 0; }
2581
+ .block-bash .bash-command code {
2582
+ font-family: 'Monaco','Menlo','Ubuntu Mono', monospace;
2583
+ color: #e5e7eb;
2584
+ font-size: 0.8rem;
2585
+ overflow-x: auto;
2586
+ flex: 1;
2587
+ }
2588
+
2589
+ .block-bash .bash-output {
2590
+ padding: 0.375rem 0.75rem;
2591
+ color: #9ca3af;
2592
+ font-size: 0.75rem;
2593
+ overflow-x: auto;
2594
+ white-space: pre-wrap;
2595
+ max-height: 300px;
2596
+ overflow-y: auto;
2597
+ }
2598
+
2599
+ /* --- Generic Block --- */
2600
+ .block-generic {
2601
+ margin-bottom: 0;
2602
+ padding: 0.5rem 0.75rem;
2603
+ border-radius: 0.5rem;
2604
+ background: var(--color-bg-secondary);
2605
+ }
2606
+
2607
+ .block-generic .generic-type {
2608
+ font-size: 0.7rem;
2609
+ text-transform: uppercase;
2610
+ letter-spacing: 0.05em;
2611
+ color: var(--color-text-secondary);
2612
+ font-weight: 600;
2613
+ margin-bottom: 0.375rem;
2614
+ }
2615
+
2616
+ .block-generic .generic-fields {
2617
+ display: flex;
2618
+ flex-direction: column;
2619
+ gap: 0.25rem;
2620
+ font-size: 0.8rem;
2621
+ }
2622
+
2623
+ .block-generic .generic-field {
2624
+ display: flex;
2625
+ gap: 0.5rem;
2626
+ }
2627
+
2628
+ .block-generic .generic-field .field-key {
2629
+ font-weight: 600;
2630
+ color: var(--color-text-secondary);
2631
+ flex-shrink: 0;
2632
+ font-family: 'Monaco','Menlo','Ubuntu Mono', monospace;
2633
+ font-size: 0.75rem;
2634
+ }
2635
+
2636
+ .block-generic .generic-field .field-value {
2637
+ font-family: 'Monaco','Menlo','Ubuntu Mono', monospace;
2638
+ font-size: 0.75rem;
2639
+ word-break: break-all;
2640
+ }
2641
+
2642
+ /* --- Error Block --- */
2643
+ .block-error {
2644
+ margin-bottom: 0;
2645
+ padding: 0.5rem 0.75rem;
2646
+ border-radius: 0.5rem;
2647
+ background: #fef2f2;
2648
+ }
2649
+
2650
+ html.dark .block-error { background: #1c0f0f; }
2651
+
2652
+ /* --- Image Block --- */
2653
+ .block-image {
2654
+ margin-bottom: 0;
2655
+ border-radius: 0.5rem;
2656
+ overflow: hidden;
2657
+ }
2658
+
2659
+ .block-image img { max-width: 100%; height: auto; max-height: 24rem; object-fit: contain; display: block; }
2660
+ .block-image .image-caption { padding: 0.5rem 0.75rem; background: var(--color-bg-secondary); font-size: 0.8rem; color: var(--color-text-secondary); }
2661
+
2662
+ /* ===== STREAMING EVENTS ===== */
2663
+ .event-streaming-start {
2664
+ margin-bottom: 0;
2665
+ padding: 0.375rem 0.75rem;
2666
+ background: #eff6ff;
2667
+ border-radius: 0.5rem;
2668
+ display: flex;
2669
+ align-items: center;
2670
+ gap: 0.625rem;
2671
+ }
2672
+
2673
+ html.dark .event-streaming-start { background: #0c1a2e; }
2674
+
2675
+ .event-streaming-complete {
2676
+ margin-bottom: 0;
2677
+ padding: 0.375rem 0.75rem;
2678
+ background: linear-gradient(135deg, #ecfdf5, #f0fdf4);
2679
+ border-radius: 0.5rem;
2680
+ }
2681
+
2682
+ html.dark .event-streaming-complete { background: linear-gradient(135deg, #0a1f0f, #0f2b1a); }
2683
+
2684
+ @keyframes skeleton-pulse {
2685
+ 0%, 100% { opacity: 0.4; }
2686
+ 50% { opacity: 0.15; }
2687
+ }
2688
+ .skeleton-pulse { animation: skeleton-pulse 1.5s ease-in-out infinite; }
2689
+ .skeleton-loading { padding: 1rem; }
2690
+
2691
+ .message-sending { opacity: 0.6; transition: opacity 0.3s ease; }
2692
+ .message-send-failed { border-left: 3px solid var(--color-error); }
2693
+
2694
+ .connection-indicator {
2695
+ display: inline-flex;
2696
+ align-items: center;
2697
+ gap: 0.375rem;
2698
+ padding: 0.25rem 0.5rem;
2699
+ border-radius: 1rem;
2700
+ font-size: 0.75rem;
2701
+ cursor: pointer;
2702
+ transition: all 0.3s ease;
2703
+ }
2704
+ .connection-dot {
2705
+ width: 8px;
2706
+ height: 8px;
2707
+ border-radius: 50%;
2708
+ transition: background-color 0.5s ease;
2709
+ }
2710
+ .connection-dot.excellent { background: #10b981; }
2711
+ .connection-dot.good { background: #10b981; }
2712
+ .connection-dot.fair { background: #f59e0b; }
2713
+ .connection-dot.poor { background: #f97316; }
2714
+ .connection-dot.bad { background: #ef4444; }
2715
+ .connection-dot.unknown { background: #6b7280; }
2716
+ .connection-dot.disconnected { background: #ef4444; animation: pulse 1.5s ease-in-out infinite; }
2717
+ .connection-dot.reconnecting { background: #f59e0b; animation: pulse 1s ease-in-out infinite; }
2718
+ .connection-dot.downloading { background: #3b82f6; animation: pulse 1s ease-in-out infinite; }
2719
+
2720
+ .connection-tooltip {
2721
+ position: absolute;
2722
+ top: 100%;
2723
+ right: 0;
2724
+ margin-top: 0.5rem;
2725
+ padding: 0.75rem;
2726
+ background: var(--color-bg-secondary);
2727
+ border: 1px solid var(--color-border);
2728
+ border-radius: 0.5rem;
2729
+ font-size: 0.75rem;
2730
+ white-space: nowrap;
2731
+ z-index: 100;
2732
+ box-shadow: 0 4px 12px rgba(0,0,0,0.15);
2733
+ }
2734
+
2735
+ .new-content-pill {
2736
+ position: sticky;
2737
+ bottom: 0.5rem;
2738
+ left: 50%;
2739
+ transform: translateX(-50%);
2740
+ padding: 0.375rem 1rem;
2741
+ background: var(--color-primary);
2742
+ color: white;
2743
+ border: none;
2744
+ border-radius: 1rem;
2745
+ font-size: 0.8rem;
2746
+ cursor: pointer;
2747
+ z-index: 50;
2748
+ box-shadow: 0 2px 8px rgba(0,0,0,0.2);
2749
+ transition: opacity 0.2s ease;
2750
+ }
2751
+ .new-content-pill:hover { opacity: 0.9; }
2752
+
2753
+ @keyframes block-appear {
2754
+ from { opacity: 0; transform: translateY(6px); }
2755
+ to { opacity: 1; transform: translateY(0); }
2756
+ }
2757
+ .streaming-blocks > * {
2758
+ animation: block-appear 0.2s ease-out both;
2759
+ }
2760
+ .streaming-blocks > details.block-tool-use {
2761
+ transition: max-height 0.3s ease;
2762
+ }
2763
+ @keyframes chunk-placeholder-pulse {
2764
+ 0%, 100% { opacity: 0.3; }
2765
+ 50% { opacity: 0.6; }
2766
+ }
2767
+ .chunk-placeholder {
2768
+ height: 2rem;
2769
+ border-radius: 0.375rem;
2770
+ background: var(--color-bg-secondary);
2771
+ animation: chunk-placeholder-pulse 1s ease-in-out infinite;
2772
+ margin: 0.25rem 0;
2773
+ }
2774
+ .connection-dot.degrading {
2775
+ animation: pulse 1s ease-in-out infinite;
2776
+ background-color: var(--color-warning) !important;
2777
+ }
2778
+
2779
+ /* ===== IN-UI DIALOGS ===== */
2780
+ .dialog-overlay {
2781
+ position: fixed;
2782
+ top: 0;
2783
+ left: 0;
2784
+ right: 0;
2785
+ bottom: 0;
2786
+ z-index: 10000;
2787
+ display: flex;
2788
+ align-items: center;
2789
+ justify-content: center;
2790
+ opacity: 0;
2791
+ transition: opacity 0.2s ease;
2792
+ }
2793
+ .dialog-overlay.visible { opacity: 1; }
2794
+ .dialog-backdrop {
2795
+ position: absolute;
2796
+ top: 0;
2797
+ left: 0;
2798
+ right: 0;
2799
+ bottom: 0;
2800
+ background: rgba(0, 0, 0, 0.5);
2801
+ backdrop-filter: blur(2px);
2802
+ }
2803
+ .dialog-container {
2804
+ position: fixed;
2805
+ top: 0;
2806
+ left: 0;
2807
+ right: 0;
2808
+ bottom: 0;
2809
+ display: flex;
2810
+ align-items: center;
2811
+ justify-content: center;
2812
+ z-index: 10001;
2813
+ opacity: 0;
2814
+ transition: opacity 0.2s ease;
2815
+ }
2816
+ .dialog-container.visible { opacity: 1; }
2817
+ .dialog-box {
2818
+ background: var(--color-bg-primary);
2819
+ border-radius: 0.75rem;
2820
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
2821
+ max-width: 90vw;
2822
+ width: 400px;
2823
+ overflow: hidden;
2824
+ transform: scale(0.95) translateY(-10px);
2825
+ transition: transform 0.2s ease;
2826
+ }
2827
+ .dialog-container.visible .dialog-box {
2828
+ transform: scale(1) translateY(0);
2829
+ }
2830
+ .dialog-box-progress { width: 450px; }
2831
+ .dialog-header {
2832
+ padding: 1rem 1.25rem;
2833
+ border-bottom: 1px solid var(--color-border);
2834
+ }
2835
+ .dialog-title {
2836
+ margin: 0;
2837
+ font-size: 1.1rem;
2838
+ font-weight: 600;
2839
+ }
2840
+ .dialog-body {
2841
+ padding: 1.25rem;
2842
+ }
2843
+ .dialog-message {
2844
+ margin: 0;
2845
+ font-size: 0.9rem;
2846
+ line-height: 1.5;
2847
+ color: var(--color-text-primary);
2848
+ }
2849
+ .dialog-label {
2850
+ display: block;
2851
+ margin-bottom: 0.5rem;
2852
+ font-size: 0.9rem;
2853
+ color: var(--color-text-primary);
2854
+ }
2855
+ .dialog-input {
2856
+ width: 100%;
2857
+ padding: 0.625rem 0.875rem;
2858
+ border: 1px solid var(--color-border);
2859
+ border-radius: 0.5rem;
2860
+ background: var(--color-bg-secondary);
2861
+ color: var(--color-text-primary);
2862
+ font-size: 0.9rem;
2863
+ outline: none;
2864
+ transition: border-color 0.15s, box-shadow 0.15s;
2865
+ }
2866
+ .dialog-input:focus {
2867
+ border-color: var(--color-primary);
2868
+ box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.15);
2869
+ }
2870
+ .dialog-footer {
2871
+ padding: 0.75rem 1.25rem;
2872
+ display: flex;
2873
+ justify-content: flex-end;
2874
+ gap: 0.5rem;
2875
+ border-top: 1px solid var(--color-border);
2876
+ background: var(--color-bg-secondary);
2877
+ }
2878
+ .dialog-btn {
2879
+ padding: 0.5rem 1.25rem;
2880
+ border: none;
2881
+ border-radius: 0.5rem;
2882
+ font-size: 0.875rem;
2883
+ font-weight: 500;
2884
+ cursor: pointer;
2885
+ transition: all 0.15s;
2886
+ }
2887
+ .dialog-btn-primary {
2888
+ background: var(--color-primary);
2889
+ color: white;
2890
+ }
2891
+ .dialog-btn-primary:hover { background: var(--color-primary-dark); }
2892
+ .dialog-btn-secondary {
2893
+ background: var(--color-bg-primary);
2894
+ color: var(--color-text-primary);
2895
+ border: 1px solid var(--color-border);
2896
+ }
2897
+ .dialog-btn-secondary:hover { background: var(--color-bg-secondary); }
2898
+ .dialog-btn-danger { background: var(--color-error); }
2899
+ .dialog-btn-danger:hover { background: #dc2626; }
2900
+ .dialog-progress-bar {
2901
+ height: 8px;
2902
+ background: var(--color-bg-secondary);
2903
+ border-radius: 4px;
2904
+ overflow: hidden;
2905
+ margin: 1rem 0 0.5rem;
2906
+ }
2907
+ .dialog-progress-fill {
2908
+ height: 100%;
2909
+ background: var(--color-primary);
2910
+ border-radius: 4px;
2911
+ transition: width 0.3s ease;
2912
+ }
2913
+ .dialog-progress-percent {
2914
+ margin: 0;
2915
+ text-align: center;
2916
+ font-size: 0.8rem;
2917
+ color: var(--color-text-secondary);
2918
+ }
2919
+
2920
+ /* ===== TOAST NOTIFICATIONS ===== */
2921
+ .toast-notification {
2922
+ position: fixed;
2923
+ bottom: 100px;
2924
+ left: 50%;
2925
+ transform: translateX(-50%) translateY(20px);
2926
+ padding: 0.75rem 1.5rem;
2927
+ border-radius: 0.5rem;
2928
+ font-size: 0.875rem;
2929
+ font-weight: 500;
2930
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
2931
+ z-index: 20000;
2932
+ opacity: 0;
2933
+ transition: all 0.3s ease;
2934
+ display: flex;
2935
+ align-items: center;
2936
+ gap: 0.5rem;
2937
+ }
2938
+ .toast-notification.visible {
2939
+ opacity: 1;
2940
+ transform: translateX(-50%) translateY(0);
2941
+ }
2942
+ .toast-info { background: var(--color-primary); color: white; }
2943
+ .toast-success { background: var(--color-success); color: white; }
2944
+ .toast-error { background: var(--color-error); color: white; }
2945
+ .toast-warning { background: var(--color-warning); color: white; }
2946
+ </style>
2947
+ </head>
2948
+ <body>
2949
+ <!-- Sidebar overlay (mobile) -->
2950
+ <div class="sidebar-overlay" data-sidebar-overlay></div>
2951
+
2952
+ <div class="app-shell">
2953
+ <!-- ===== SIDEBAR ===== -->
2954
+ <aside class="sidebar" data-sidebar>
2955
+ <div class="sidebar-header">
2956
+ <h2>History</h2>
2957
+ <div class="sidebar-header-actions">
2958
+ <button id="cloneRepoBtn" class="sidebar-clone-btn" data-clone-repo title="Clone a GitHub repo">Clone</button>
2959
+ <button id="newConversationBtn" class="sidebar-new-btn" data-new-conversation title="Start new conversation">+ New</button>
2960
+ </div>
2961
+ </div>
2962
+ <div class="clone-input-bar" id="cloneInputBar" style="display:none;">
2963
+ <input type="text" class="clone-input" id="cloneRepoInput" placeholder="org/repo" autocomplete="off" spellcheck="false">
2964
+ <button class="clone-go-btn" id="cloneGoBtn" title="Clone">Go</button>
2965
+ <button class="clone-cancel-btn" id="cloneCancelBtn" title="Cancel">&times;</button>
2966
+ </div>
2967
+ <ul class="sidebar-list" data-conversation-list>
2968
+ <li class="sidebar-empty" data-conversation-empty>No conversations yet</li>
2969
+ </ul>
2970
+ </aside>
2971
+
2972
+ <!-- ===== MAIN PANEL ===== -->
2973
+ <main id="app" class="main-panel">
2974
+ <!-- Header bar -->
2975
+ <div class="main-header">
2976
+ <button class="sidebar-toggle-btn" data-sidebar-toggle title="Toggle sidebar (Ctrl+B)" aria-label="Toggle sidebar">
2977
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
2978
+ <line x1="3" y1="6" x2="21" y2="6"></line>
2979
+ <line x1="3" y1="12" x2="21" y2="12"></line>
2980
+ <line x1="3" y1="18" x2="21" y2="18"></line>
2981
+ </svg>
2982
+ </button>
2983
+
2984
+ <h1 class="header-title">AgentGUI</h1>
2985
+
2986
+ <div class="header-controls">
2987
+ <div class="script-buttons" id="scriptButtons" style="display:none;">
2988
+ <button class="header-icon-btn" id="scriptStartBtn" title="Run start script" aria-label="Run start script" style="display:none;">
2989
+ <svg viewBox="0 0 24 24" fill="currentColor" stroke="none"><polygon points="6,3 20,12 6,21"></polygon></svg>
2990
+ </button>
2991
+ <button class="header-icon-btn script-dev-btn" id="scriptDevBtn" title="Run dev script" aria-label="Run dev script" style="display:none;">
2992
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6"></polyline><polyline points="8 6 2 12 8 18"></polyline></svg>
2993
+ </button>
2994
+ <button class="header-icon-btn script-stop-btn" id="scriptStopBtn" title="Stop running script" aria-label="Stop running script" style="display:none;">
2995
+ <svg viewBox="0 0 24 24" fill="currentColor" stroke="none"><rect x="5" y="5" width="14" height="14" rx="1"></rect></svg>
2996
+ </button>
2997
+ </div>
2998
+ <button class="header-icon-btn agent-auth-btn" id="agentAuthBtn" title="Agent authentication" aria-label="Agent authentication" style="display:none;">
2999
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"></path></svg>
3000
+ <div class="agent-auth-dropdown" id="agentAuthDropdown"></div>
3001
+ </button>
3002
+ <div class="status-badge">
3003
+ <div class="status-indicator" data-status="disconnected"></div>
3004
+ <span id="connectionStatus" data-status-indicator>Disconnected</span>
3005
+ </div>
3006
+ <button class="theme-toggle-btn" data-theme-toggle title="Toggle dark mode" aria-label="Toggle dark mode">
3007
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
3008
+ <circle cx="12" cy="12" r="5"></circle>
3009
+ <line x1="12" y1="1" x2="12" y2="3"></line>
3010
+ <line x1="12" y1="21" x2="12" y2="23"></line>
3011
+ <line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
3012
+ <line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
3013
+ <line x1="1" y1="12" x2="3" y2="12"></line>
3014
+ <line x1="21" y1="12" x2="23" y2="12"></line>
3015
+ <line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
3016
+ <line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
3017
+ </svg>
3018
+ </button>
3019
+ </div>
3020
+ </div>
3021
+
3022
+ <!-- View toggle bar (hidden by default) -->
3023
+ <div class="view-toggle-bar" id="viewToggleBar" style="display:none;">
3024
+ <button class="view-toggle-btn active" data-view="chat">Chat</button>
3025
+ <button class="view-toggle-btn" data-view="files">Files</button>
3026
+ <button class="view-toggle-btn" data-view="voice" style="display:none;">Voice</button>
3027
+ <button class="view-toggle-btn" data-view="terminal" id="terminalTabBtn" style="display:none;">Terminal</button>
3028
+ </div>
3029
+
3030
+ <!-- Messages scroll area -->
3031
+ <div id="output-scroll" role="region" aria-label="Chat messages" aria-live="polite" data-drop-zone>
3032
+ <div class="messages-wrapper">
3033
+ <div id="output"></div>
3034
+ </div>
3035
+ <div class="drop-zone-overlay" id="dropZoneOverlay">
3036
+ <div class="drop-zone-content">
3037
+ <div class="drop-zone-icon">+</div>
3038
+ <div class="drop-zone-text">Drop files here to copy to working directory</div>
3039
+ </div>
3040
+ </div>
3041
+ </div>
3042
+
3043
+ <!-- File browser (hidden by default) -->
3044
+ <div id="fileBrowserContainer" class="file-browser-container" style="display:none;">
3045
+ <iframe id="fileBrowserIframe" class="file-browser-iframe"></iframe>
3046
+ </div>
3047
+
3048
+ <!-- Terminal output view -->
3049
+ <div id="terminalContainer" class="terminal-container" style="display:none;">
3050
+ <div id="terminalOutput" class="terminal-output"></div>
3051
+ </div>
3052
+
3053
+ <!-- Voice STT/TTS view -->
3054
+ <div id="voiceContainer" class="voice-container" style="display:none;">
3055
+ <div id="voiceScroll" class="voice-scroll">
3056
+ <div class="voice-messages" id="voiceMessages"></div>
3057
+ </div>
3058
+ <div class="voice-input-section">
3059
+ <div class="voice-input-wrapper">
3060
+ <select class="agent-selector voice-agent-selector" data-voice-agent-selector title="Select agent"></select>
3061
+ <div class="voice-transcript" id="voiceTranscript" data-placeholder="Tap mic and speak..."></div>
3062
+ <button class="voice-mic-btn" id="voiceMicBtn" title="Toggle recording" aria-label="Voice input">
3063
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
3064
+ <path d="M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z"/>
3065
+ <path d="M19 10v2a7 7 0 0 1-14 0v-2"/>
3066
+ <line x1="12" y1="19" x2="12" y2="23"/>
3067
+ <line x1="8" y1="23" x2="16" y2="23"/>
3068
+ </svg>
3069
+ </button>
3070
+ <button class="send-btn voice-send-btn" id="voiceSendBtn" title="Send message" aria-label="Send message">
3071
+ <svg viewBox="0 0 24 24" fill="currentColor">
3072
+ <path d="M2.01 21L23 12 2.01 3 2 10l15 2-15 2z"/>
3073
+ </svg>
3074
+ </button>
3075
+ </div>
3076
+ <div class="voice-tts-controls">
3077
+ <label class="voice-toggle-label">
3078
+ <input type="checkbox" id="voiceTTSToggle" checked>
3079
+ <span>Auto-speak responses</span>
3080
+ </label>
3081
+ <div class="voice-selector-wrapper">
3082
+ <select class="voice-selector" id="voiceSelector" title="Select voice">
3083
+ <option value="default">Default</option>
3084
+ </select>
3085
+ </div>
3086
+ <button class="voice-stop-btn" id="voiceStopSpeaking" title="Stop speaking">Stop</button>
3087
+ </div>
3088
+ </div>
3089
+ </div>
3090
+
3091
+ <!-- Input area: fixed at bottom -->
3092
+ <div class="input-section">
3093
+ <div class="input-wrapper">
3094
+ <select class="agent-selector" data-agent-selector title="Select agent"></select>
3095
+ <select class="model-selector" data-model-selector title="Select model" data-empty="true"></select>
3096
+ <textarea
3097
+ class="message-textarea"
3098
+ data-message-input
3099
+ placeholder="Message AgentGUI... (Ctrl+Enter to send)"
3100
+ aria-label="Message input"
3101
+ rows="1"
3102
+ ></textarea>
3103
+ <button class="inject-btn" id="injectBtn" title="Inject instructions into running agent" aria-label="Inject instructions">
3104
+ <svg viewBox="0 0 24 24" fill="currentColor" width="18" height="18">
3105
+ <path d="M20 12l-1.41-1.41L13 16.17V4h-2v12.17l-5.58-5.59L4 12l8 8 8-8z"/>
3106
+ </svg>
3107
+ </button>
3108
+ <button class="stop-btn" id="stopBtn" title="Stop running agent (emergency)" aria-label="Stop agent">
3109
+ <svg viewBox="0 0 24 24" fill="currentColor" width="18" height="18">
3110
+ <path d="M6 6h12v12H6z"/>
3111
+ </svg>
3112
+ </button>
3113
+ <button class="send-btn" data-send-button title="Send message (Ctrl+Enter)" aria-label="Send message">
3114
+ <svg viewBox="0 0 24 24" fill="currentColor">
3115
+ <path d="M2.01 21L23 12 2.01 3 2 10l15 2-15 2z"/>
3116
+ </svg>
3117
+ </button>
3118
+ </div>
3119
+ </div>
3120
+ </main>
3121
+ </div>
3122
+
3123
+ <!-- Folder Browser Modal -->
3124
+ <div id="folderBrowserModal" class="folder-modal-overlay">
3125
+ <div class="folder-modal">
3126
+ <div class="folder-modal-header">
3127
+ <h3>Select Working Directory</h3>
3128
+ <button class="folder-modal-close" data-folder-close>&times;</button>
3129
+ </div>
3130
+ <div id="folderBreadcrumb" class="folder-breadcrumb"></div>
3131
+ <ul id="folderList" class="folder-list">
3132
+ <li class="folder-list-loading">Loading...</li>
3133
+ </ul>
3134
+ <div class="folder-modal-footer">
3135
+ <button class="btn btn-secondary" data-folder-cancel>Cancel</button>
3136
+ <button class="btn btn-primary" data-folder-select>Select This Folder</button>
3137
+ </div>
3138
+ </div>
3139
+ </div>
3140
+
3141
+ <script>
3142
+ var _escHtmlMap = { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' };
3143
+ var _escHtmlRe = /[&<>"']/g;
3144
+ window._escHtml = function(t) { return t.replace(_escHtmlRe, function(c) { return _escHtmlMap[c]; }); };
3145
+ </script>
3146
+ <script defer src="/gm/js/event-processor.js"></script>
3147
+ <script defer src="/gm/js/streaming-renderer.js"></script>
3148
+ <script defer src="/gm/js/kalman-filter.js"></script>
3149
+ <script defer src="/gm/js/event-consolidator.js"></script>
3150
+ <script defer src="/gm/js/websocket-manager.js"></script>
3151
+ <script defer src="/gm/js/event-filter.js"></script>
3152
+ <script defer src="/gm/js/syntax-highlighter.js"></script>
3153
+ <script defer src="/gm/js/dialogs.js"></script>
3154
+ <script defer src="/gm/js/ui-components.js"></script>
3155
+ <script defer src="/gm/js/progress-dialog.js"></script>
3156
+ <script defer src="/gm/js/conversations.js"></script>
3157
+ <script defer src="/gm/js/client.js"></script>
3158
+ <script type="module" src="/gm/js/voice.js"></script>
3159
+ <script defer src="/gm/js/features.js"></script>
3160
+ <script defer src="/gm/js/script-runner.js"></script>
3161
+ <script defer src="/gm/js/agent-auth.js"></script>
3162
+
3163
+ <script>
3164
+ const savedTheme = localStorage.getItem('theme') || 'light';
3165
+ if (savedTheme === 'dark') document.documentElement.classList.add('dark');
3166
+
3167
+ window.addEventListener('error', (event) => console.error('Uncaught error:', event.error));
3168
+ window.addEventListener('unhandledrejection', (event) => console.error('Unhandled rejection:', event.reason));
3169
+ </script>
3170
+ </body>
3171
+ </html>