agentgui 1.0.316 → 1.0.318

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 (2) hide show
  1. package/package.json +1 -1
  2. package/static/index.html +966 -3171
package/static/index.html CHANGED
@@ -1,3171 +1,966 @@
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>
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
+ /* RESPONSIVE */
731
+ @media (max-width: 768px) {
732
+ .sidebar {
733
+ position: absolute; left: 0; top: 0; bottom: 0; z-index: 100;
734
+ box-shadow: 2px 0 16px rgba(0,0,0,0.1);
735
+ }
736
+
737
+ .sidebar.collapsed { display: none; }
738
+
739
+ .messages-wrapper, .input-wrapper { padding-left: 1rem; padding-right: 1rem; }
740
+ }
741
+ </style>
742
+ </head>
743
+ <body>
744
+ <!-- Sidebar overlay (mobile) -->
745
+ <div class="sidebar-overlay" data-sidebar-overlay></div>
746
+
747
+ <div class="app-shell">
748
+ <!-- ===== SIDEBAR ===== -->
749
+ <aside class="sidebar" data-sidebar>
750
+ <div class="sidebar-header">
751
+ <h2>History</h2>
752
+ <div class="sidebar-header-actions">
753
+ <button id="cloneRepoBtn" class="sidebar-clone-btn" data-clone-repo title="Clone a GitHub repo">Clone</button>
754
+ <button id="newConversationBtn" class="sidebar-new-btn" data-new-conversation title="Start new conversation">+ New</button>
755
+ </div>
756
+ </div>
757
+ <div class="clone-input-bar" id="cloneInputBar" style="display:none;">
758
+ <input type="text" class="clone-input" id="cloneRepoInput" placeholder="org/repo" autocomplete="off" spellcheck="false">
759
+ <button class="clone-go-btn" id="cloneGoBtn" title="Clone">Go</button>
760
+ <button class="clone-cancel-btn" id="cloneCancelBtn" title="Cancel">&times;</button>
761
+ </div>
762
+ <ul class="sidebar-list" data-conversation-list>
763
+ <li class="sidebar-empty" data-conversation-empty>No conversations yet</li>
764
+ </ul>
765
+ </aside>
766
+
767
+ <!-- ===== MAIN PANEL ===== -->
768
+ <main id="app" class="main-panel">
769
+ <!-- Header bar -->
770
+ <div class="main-header">
771
+ <button class="sidebar-toggle-btn" data-sidebar-toggle title="Toggle sidebar (Ctrl+B)" aria-label="Toggle sidebar">
772
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
773
+ <line x1="3" y1="6" x2="21" y2="6"></line>
774
+ <line x1="3" y1="12" x2="21" y2="12"></line>
775
+ <line x1="3" y1="18" x2="21" y2="18"></line>
776
+ </svg>
777
+ </button>
778
+
779
+ <h1 class="header-title">AgentGUI</h1>
780
+
781
+ <div class="header-controls">
782
+ <div class="script-buttons" id="scriptButtons" style="display:none;">
783
+ <button class="header-icon-btn" id="scriptStartBtn" title="Run start script" aria-label="Run start script" style="display:none;">
784
+ <svg viewBox="0 0 24 24" fill="currentColor" stroke="none"><polygon points="6,3 20,12 6,21"></polygon></svg>
785
+ </button>
786
+ <button class="header-icon-btn script-dev-btn" id="scriptDevBtn" title="Run dev script" aria-label="Run dev script" style="display:none;">
787
+ <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>
788
+ </button>
789
+ <button class="header-icon-btn script-stop-btn" id="scriptStopBtn" title="Stop running script" aria-label="Stop running script" style="display:none;">
790
+ <svg viewBox="0 0 24 24" fill="currentColor" stroke="none"><rect x="5" y="5" width="14" height="14" rx="1"></rect></svg>
791
+ </button>
792
+ </div>
793
+ <button class="header-icon-btn agent-auth-btn" id="agentAuthBtn" title="Agent authentication" aria-label="Agent authentication" style="display:none;">
794
+ <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>
795
+ <div class="agent-auth-dropdown" id="agentAuthDropdown"></div>
796
+ </button>
797
+ <div class="status-badge">
798
+ <div class="status-indicator" data-status="disconnected"></div>
799
+ <span id="connectionStatus" data-status-indicator>Disconnected</span>
800
+ </div>
801
+ <button class="theme-toggle-btn" data-theme-toggle title="Toggle dark mode" aria-label="Toggle dark mode">
802
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
803
+ <circle cx="12" cy="12" r="5"></circle>
804
+ <line x1="12" y1="1" x2="12" y2="3"></line>
805
+ <line x1="12" y1="21" x2="12" y2="23"></line>
806
+ <line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
807
+ <line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
808
+ <line x1="1" y1="12" x2="3" y2="12"></line>
809
+ <line x1="21" y1="12" x2="23" y2="12"></line>
810
+ <line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
811
+ <line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
812
+ </svg>
813
+ </button>
814
+ </div>
815
+ </div>
816
+
817
+ <!-- View toggle bar (hidden by default) -->
818
+ <div class="view-toggle-bar" id="viewToggleBar" style="display:none;">
819
+ <button class="view-toggle-btn active" data-view="chat">Chat</button>
820
+ <button class="view-toggle-btn" data-view="files">Files</button>
821
+ <button class="view-toggle-btn" data-view="voice" style="display:none;">Voice</button>
822
+ <button class="view-toggle-btn" data-view="terminal" id="terminalTabBtn" style="display:none;">Terminal</button>
823
+ </div>
824
+
825
+ <!-- Messages scroll area -->
826
+ <div id="output-scroll" role="region" aria-label="Chat messages" aria-live="polite" data-drop-zone>
827
+ <div class="messages-wrapper">
828
+ <div id="output"></div>
829
+ </div>
830
+ <div class="drop-zone-overlay" id="dropZoneOverlay">
831
+ <div class="drop-zone-content">
832
+ <div class="drop-zone-icon">+</div>
833
+ <div class="drop-zone-text">Drop files here to copy to working directory</div>
834
+ </div>
835
+ </div>
836
+ </div>
837
+
838
+ <!-- File browser (hidden by default) -->
839
+ <div id="fileBrowserContainer" class="file-browser-container" style="display:none;">
840
+ <iframe id="fileBrowserIframe" class="file-browser-iframe"></iframe>
841
+ </div>
842
+
843
+ <!-- Terminal output view -->
844
+ <div id="terminalContainer" class="terminal-container" style="display:none;">
845
+ <div id="terminalOutput" class="terminal-output"></div>
846
+ </div>
847
+
848
+ <!-- Voice STT/TTS view -->
849
+ <div id="voiceContainer" class="voice-container" style="display:none;">
850
+ <div id="voiceScroll" class="voice-scroll">
851
+ <div class="voice-messages" id="voiceMessages"></div>
852
+ </div>
853
+ <div class="voice-input-section">
854
+ <div class="voice-input-wrapper">
855
+ <select class="agent-selector voice-agent-selector" data-voice-agent-selector title="Select agent"></select>
856
+ <div class="voice-transcript" id="voiceTranscript" data-placeholder="Tap mic and speak..."></div>
857
+ <button class="voice-mic-btn" id="voiceMicBtn" title="Toggle recording" aria-label="Voice input">
858
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
859
+ <path d="M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z"/>
860
+ <path d="M19 10v2a7 7 0 0 1-14 0v-2"/>
861
+ <line x1="12" y1="19" x2="12" y2="23"/>
862
+ <line x1="8" y1="23" x2="16" y2="23"/>
863
+ </svg>
864
+ </button>
865
+ <button class="send-btn voice-send-btn" id="voiceSendBtn" title="Send message" aria-label="Send message">
866
+ <svg viewBox="0 0 24 24" fill="currentColor">
867
+ <path d="M2.01 21L23 12 2.01 3 2 10l15 2-15 2z"/>
868
+ </svg>
869
+ </button>
870
+ </div>
871
+ <div class="voice-tts-controls">
872
+ <label class="voice-toggle-label">
873
+ <input type="checkbox" id="voiceTTSToggle" checked>
874
+ <span>Auto-speak responses</span>
875
+ </label>
876
+ <div class="voice-selector-wrapper">
877
+ <select class="voice-selector" id="voiceSelector" title="Select voice">
878
+ <option value="default">Default</option>
879
+ </select>
880
+ </div>
881
+ <button class="voice-stop-btn" id="voiceStopSpeaking" title="Stop speaking">Stop</button>
882
+ </div>
883
+ </div>
884
+ </div>
885
+
886
+ <!-- Input area: fixed at bottom -->
887
+ <div class="input-section">
888
+ <div class="input-wrapper">
889
+ <select class="agent-selector" data-agent-selector title="Select agent"></select>
890
+ <select class="model-selector" data-model-selector title="Select model" data-empty="true"></select>
891
+ <textarea
892
+ class="message-textarea"
893
+ data-message-input
894
+ placeholder="Message AgentGUI... (Ctrl+Enter to send)"
895
+ aria-label="Message input"
896
+ rows="1"
897
+ ></textarea>
898
+ <button class="inject-btn" id="injectBtn" title="Inject instructions into running agent" aria-label="Inject instructions">
899
+ <svg viewBox="0 0 24 24" fill="currentColor" width="18" height="18">
900
+ <path d="M20 12l-1.41-1.41L13 16.17V4h-2v12.17l-5.58-5.59L4 12l8 8 8-8z"/>
901
+ </svg>
902
+ </button>
903
+ <button class="stop-btn" id="stopBtn" title="Stop running agent (emergency)" aria-label="Stop agent">
904
+ <svg viewBox="0 0 24 24" fill="currentColor" width="18" height="18">
905
+ <path d="M6 6h12v12H6z"/>
906
+ </svg>
907
+ </button>
908
+ <button class="send-btn" data-send-button title="Send message (Ctrl+Enter)" aria-label="Send message">
909
+ <svg viewBox="0 0 24 24" fill="currentColor">
910
+ <path d="M2.01 21L23 12 2.01 3 2 10l15 2-15 2z"/>
911
+ </svg>
912
+ </button>
913
+ </div>
914
+ </div>
915
+ </main>
916
+ </div>
917
+
918
+ <!-- Folder Browser Modal -->
919
+ <div id="folderBrowserModal" class="folder-modal-overlay">
920
+ <div class="folder-modal">
921
+ <div class="folder-modal-header">
922
+ <h3>Select Working Directory</h3>
923
+ <button class="folder-modal-close" data-folder-close>&times;</button>
924
+ </div>
925
+ <div id="folderBreadcrumb" class="folder-breadcrumb"></div>
926
+ <ul id="folderList" class="folder-list">
927
+ <li class="folder-list-loading">Loading...</li>
928
+ </ul>
929
+ <div class="folder-modal-footer">
930
+ <button class="btn btn-secondary" data-folder-cancel>Cancel</button>
931
+ <button class="btn btn-primary" data-folder-select>Select This Folder</button>
932
+ </div>
933
+ </div>
934
+ </div>
935
+
936
+ <script>
937
+ var _escHtmlMap = { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' };
938
+ var _escHtmlRe = /[&<>"']/g;
939
+ window._escHtml = function(t) { return t.replace(_escHtmlRe, function(c) { return _escHtmlMap[c]; }); };
940
+ </script>
941
+ <script defer src="/gm/js/event-processor.js"></script>
942
+ <script defer src="/gm/js/streaming-renderer.js"></script>
943
+ <script defer src="/gm/js/kalman-filter.js"></script>
944
+ <script defer src="/gm/js/event-consolidator.js"></script>
945
+ <script defer src="/gm/js/websocket-manager.js"></script>
946
+ <script defer src="/gm/js/event-filter.js"></script>
947
+ <script defer src="/gm/js/syntax-highlighter.js"></script>
948
+ <script defer src="/gm/js/dialogs.js"></script>
949
+ <script defer src="/gm/js/ui-components.js"></script>
950
+ <script defer src="/gm/js/progress-dialog.js"></script>
951
+ <script defer src="/gm/js/conversations.js"></script>
952
+ <script defer src="/gm/js/client.js"></script>
953
+ <script type="module" src="/gm/js/voice.js"></script>
954
+ <script defer src="/gm/js/features.js"></script>
955
+ <script defer src="/gm/js/script-runner.js"></script>
956
+ <script defer src="/gm/js/agent-auth.js"></script>
957
+
958
+ <script>
959
+ const savedTheme = localStorage.getItem('theme') || 'light';
960
+ if (savedTheme === 'dark') document.documentElement.classList.add('dark');
961
+
962
+ window.addEventListener('error', (event) => console.error('Uncaught error:', event.error));
963
+ window.addEventListener('unhandledrejection', (event) => console.error('Unhandled rejection:', event.reason));
964
+ </script>
965
+ </body>
966
+ </html>