@hsupu/copilot-api 0.7.17-beta.0 → 0.7.18-beta

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.
@@ -0,0 +1,1467 @@
1
+
2
+ :root {
3
+ --bg: #0d1117;
4
+ --bg-secondary: #161b22;
5
+ --bg-tertiary: #21262d;
6
+ --bg-hover: #30363d;
7
+ --bg-selected: #1f2a37;
8
+ --text: #e6edf3;
9
+ --text-muted: #8b949e;
10
+ --text-dim: #6e7681;
11
+ --border: #30363d;
12
+ --border-light: #21262d;
13
+ --primary: #58a6ff;
14
+ --primary-muted: rgba(88, 166, 255, 0.15);
15
+ --success: #3fb950;
16
+ --success-muted: rgba(63, 185, 80, 0.15);
17
+ --error: #f85149;
18
+ --error-muted: rgba(248, 81, 73, 0.15);
19
+ --warning: #d29922;
20
+ --warning-muted: rgba(210, 153, 34, 0.15);
21
+ --purple: #a371f7;
22
+ --purple-muted: rgba(163, 113, 247, 0.15);
23
+ --cyan: #39c5cf;
24
+ --cyan-muted: rgba(57, 197, 207, 0.15);
25
+ --pink: #db61a2;
26
+ --pink-muted: rgba(219, 97, 162, 0.15);
27
+ --primary-contrast: #ffffff;
28
+ }
29
+
30
+ @media (prefers-color-scheme: light) {
31
+ :root {
32
+ --bg: #ffffff;
33
+ --bg-secondary: #f6f8fa;
34
+ --bg-tertiary: #eaeef2;
35
+ --bg-hover: #d0d7de;
36
+ --bg-selected: #ddf4ff;
37
+ --text: #1f2328;
38
+ --text-muted: #656d76;
39
+ --text-dim: #8c959f;
40
+ --border: #d0d7de;
41
+ --border-light: #eaeef2;
42
+ --primary-muted: rgba(9, 105, 218, 0.1);
43
+ --success-muted: rgba(26, 127, 55, 0.1);
44
+ --error-muted: rgba(207, 34, 46, 0.1);
45
+ --warning-muted: rgba(154, 103, 0, 0.1);
46
+ --purple-muted: rgba(130, 80, 223, 0.1);
47
+ --cyan-muted: rgba(31, 136, 61, 0.1);
48
+ --pink-muted: rgba(191, 57, 137, 0.1);
49
+ }
50
+ }
51
+
52
+ * { box-sizing: border-box; margin: 0; padding: 0; }
53
+
54
+ body {
55
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif;
56
+ background: var(--bg);
57
+ color: var(--text);
58
+ line-height: 1.5;
59
+ font-size: 13px;
60
+ height: 100vh;
61
+ overflow: hidden;
62
+ }
63
+
64
+ /* Layout */
65
+ .app {
66
+ display: flex;
67
+ flex-direction: column;
68
+ height: 100vh;
69
+ }
70
+
71
+ /* Header */
72
+ .header {
73
+ padding: 12px 16px;
74
+ border-bottom: 1px solid var(--border);
75
+ display: flex;
76
+ align-items: center;
77
+ justify-content: space-between;
78
+ background: var(--bg-secondary);
79
+ flex-shrink: 0;
80
+ }
81
+
82
+ .header-left {
83
+ display: flex;
84
+ align-items: center;
85
+ gap: 16px;
86
+ }
87
+
88
+ .header h1 {
89
+ font-size: 16px;
90
+ font-weight: 600;
91
+ }
92
+
93
+ .header-right {
94
+ display: flex;
95
+ align-items: center;
96
+ gap: 8px;
97
+ }
98
+
99
+ /* Export dropdown */
100
+ .export-wrapper {
101
+ position: relative;
102
+ }
103
+
104
+ .export-menu {
105
+ display: none;
106
+ position: absolute;
107
+ top: 100%;
108
+ right: 0;
109
+ margin-top: 4px;
110
+ background: var(--bg-secondary);
111
+ border: 1px solid var(--border);
112
+ z-index: 100;
113
+ min-width: 150px;
114
+ flex-direction: column;
115
+ }
116
+
117
+ .export-menu.open {
118
+ display: flex;
119
+ }
120
+
121
+ .export-menu button {
122
+ padding: 8px 12px;
123
+ background: transparent;
124
+ border: none;
125
+ color: var(--text);
126
+ font-size: 12px;
127
+ cursor: pointer;
128
+ text-align: left;
129
+ }
130
+
131
+ .export-menu button:hover {
132
+ background: var(--bg-hover);
133
+ }
134
+
135
+ /* Session selector */
136
+ .session-selector {
137
+ position: relative;
138
+ }
139
+
140
+ .session-selector select {
141
+ appearance: none;
142
+ background: var(--bg-tertiary);
143
+ border: 1px solid var(--border);
144
+ color: var(--text);
145
+ padding: 6px 28px 6px 10px;
146
+ border-radius: 0;
147
+ font-size: 12px;
148
+ cursor: pointer;
149
+ min-width: 180px;
150
+ }
151
+
152
+ .session-selector::after {
153
+ content: "\25BC";
154
+ position: absolute;
155
+ right: 10px;
156
+ top: 50%;
157
+ transform: translateY(-50%);
158
+ font-size: 8px;
159
+ color: var(--text-muted);
160
+ pointer-events: none;
161
+ }
162
+
163
+ /* Stats bar */
164
+ .stats-bar {
165
+ display: flex;
166
+ gap: 20px;
167
+ padding: 8px 16px;
168
+ border-bottom: 1px solid var(--border);
169
+ background: var(--bg-tertiary);
170
+ font-size: 12px;
171
+ flex-shrink: 0;
172
+ }
173
+
174
+ .stat {
175
+ display: flex;
176
+ align-items: center;
177
+ gap: 6px;
178
+ }
179
+
180
+ .stat-value {
181
+ font-weight: 600;
182
+ }
183
+
184
+ .stat-label {
185
+ color: var(--text-muted);
186
+ }
187
+
188
+ .stat.success .stat-value { color: var(--success); }
189
+ .stat.error .stat-value { color: var(--error); }
190
+
191
+ /* Main layout */
192
+ .main {
193
+ display: flex;
194
+ flex: 1;
195
+ overflow: hidden;
196
+ }
197
+
198
+ /* Request list panel (left) */
199
+ .list-panel {
200
+ width: 320px;
201
+ min-width: 280px;
202
+ max-width: 400px;
203
+ border-right: 1px solid var(--border);
204
+ display: flex;
205
+ flex-direction: column;
206
+ background: var(--bg-secondary);
207
+ flex-shrink: 0;
208
+ }
209
+
210
+ .list-controls {
211
+ padding: 8px;
212
+ border-bottom: 1px solid var(--border);
213
+ display: flex;
214
+ flex-direction: column;
215
+ gap: 8px;
216
+ }
217
+
218
+ .list-search {
219
+ position: relative;
220
+ }
221
+
222
+ .list-search input {
223
+ width: 100%;
224
+ padding: 6px 8px 6px 28px;
225
+ background: var(--bg);
226
+ border: 1px solid var(--border);
227
+ border-radius: 0;
228
+ color: var(--text);
229
+ font-size: 12px;
230
+ }
231
+
232
+ .list-search input:focus {
233
+ outline: none;
234
+ border-color: var(--primary);
235
+ }
236
+
237
+ .list-search-icon {
238
+ position: absolute;
239
+ left: 8px;
240
+ top: 50%;
241
+ transform: translateY(-50%);
242
+ color: var(--text-dim);
243
+ font-size: 12px;
244
+ }
245
+
246
+ .list-filters {
247
+ display: flex;
248
+ gap: 6px;
249
+ }
250
+
251
+ .list-filters select {
252
+ flex: 1;
253
+ padding: 4px 6px;
254
+ background: var(--bg);
255
+ border: 1px solid var(--border);
256
+ border-radius: 0;
257
+ color: var(--text);
258
+ font-size: 11px;
259
+ cursor: pointer;
260
+ }
261
+
262
+ /* Request list */
263
+ .request-list {
264
+ flex: 1;
265
+ overflow-y: auto;
266
+ }
267
+
268
+ .request-item {
269
+ padding: 10px 12px;
270
+ border-bottom: 1px solid var(--border-light);
271
+ cursor: pointer;
272
+ transition: background 0.1s;
273
+ }
274
+
275
+ .request-item:hover {
276
+ background: var(--bg-hover);
277
+ }
278
+
279
+ .request-item.selected {
280
+ background: var(--bg-selected);
281
+ border-left: 3px solid var(--primary);
282
+ padding-left: 9px;
283
+ }
284
+
285
+ .request-item-header {
286
+ display: flex;
287
+ align-items: center;
288
+ gap: 8px;
289
+ margin-bottom: 4px;
290
+ }
291
+
292
+ .request-status {
293
+ width: 8px;
294
+ height: 8px;
295
+ border-radius: 50%;
296
+ flex-shrink: 0;
297
+ }
298
+
299
+ .request-status.success { background: var(--success); }
300
+ .request-status.error { background: var(--error); }
301
+ .request-status.pending { background: var(--warning); animation: pulse 1.5s infinite; }
302
+
303
+ @keyframes pulse {
304
+ 0%, 100% { opacity: 1; }
305
+ 50% { opacity: 0.5; }
306
+ }
307
+
308
+ .request-time {
309
+ font-size: 11px;
310
+ color: var(--text-muted);
311
+ }
312
+
313
+ .request-item-body {
314
+ display: flex;
315
+ flex-wrap: wrap;
316
+ gap: 6px;
317
+ align-items: center;
318
+ margin-bottom: 4px;
319
+ }
320
+
321
+ .request-model {
322
+ font-weight: 500;
323
+ font-size: 12px;
324
+ }
325
+
326
+ .request-item-meta {
327
+ display: flex;
328
+ gap: 8px;
329
+ font-size: 10px;
330
+ color: var(--text-dim);
331
+ }
332
+
333
+ .request-preview {
334
+ font-size: 11px;
335
+ color: var(--text-muted);
336
+ white-space: nowrap;
337
+ overflow: hidden;
338
+ text-overflow: ellipsis;
339
+ margin-top: 4px;
340
+ }
341
+
342
+ /* Badges */
343
+ .badge {
344
+ display: inline-flex;
345
+ align-items: center;
346
+ padding: 2px 6px;
347
+ border-radius: 0;
348
+ font-size: 10px;
349
+ font-weight: 500;
350
+ }
351
+
352
+ .badge.anthropic { background: var(--purple-muted); color: var(--purple); }
353
+ .badge.openai { background: var(--warning-muted); color: var(--warning); }
354
+ .badge.stream { background: var(--cyan-muted); color: var(--cyan); }
355
+
356
+ /* Pagination */
357
+ .list-pagination {
358
+ padding: 8px;
359
+ border-top: 1px solid var(--border);
360
+ display: flex;
361
+ justify-content: center;
362
+ align-items: center;
363
+ gap: 4px;
364
+ background: var(--bg-secondary);
365
+ }
366
+
367
+ .list-pagination button {
368
+ padding: 4px 8px;
369
+ background: var(--bg-tertiary);
370
+ border: 1px solid var(--border);
371
+ border-radius: 0;
372
+ color: var(--text);
373
+ font-size: 11px;
374
+ cursor: pointer;
375
+ }
376
+
377
+ .list-pagination button:hover:not(:disabled) {
378
+ background: var(--bg-hover);
379
+ }
380
+
381
+ .list-pagination button:disabled {
382
+ opacity: 0.5;
383
+ cursor: not-allowed;
384
+ }
385
+
386
+ .list-pagination button.active {
387
+ background: var(--primary);
388
+ border-color: var(--primary);
389
+ color: var(--primary-contrast);
390
+ }
391
+
392
+ .list-pagination span {
393
+ font-size: 11px;
394
+ color: var(--text-muted);
395
+ padding: 0 4px;
396
+ }
397
+
398
+ /* Detail panel (right) */
399
+ .detail-panel {
400
+ flex: 1;
401
+ display: flex;
402
+ flex-direction: column;
403
+ overflow: hidden;
404
+ background: var(--bg);
405
+ }
406
+
407
+ .detail-empty {
408
+ flex: 1;
409
+ display: flex;
410
+ align-items: center;
411
+ justify-content: center;
412
+ color: var(--text-muted);
413
+ }
414
+
415
+ .detail-toolbar {
416
+ padding: 8px 12px;
417
+ border-bottom: 1px solid var(--border);
418
+ display: flex;
419
+ align-items: center;
420
+ gap: 12px;
421
+ background: var(--bg-secondary);
422
+ flex-wrap: wrap;
423
+ }
424
+
425
+ .detail-search {
426
+ position: relative;
427
+ flex: 1;
428
+ min-width: 150px;
429
+ max-width: 300px;
430
+ }
431
+
432
+ .detail-search input {
433
+ width: 100%;
434
+ padding: 5px 8px 5px 26px;
435
+ background: var(--bg);
436
+ border: 1px solid var(--border);
437
+ border-radius: 0;
438
+ color: var(--text);
439
+ font-size: 12px;
440
+ }
441
+
442
+ .detail-search input:focus {
443
+ outline: none;
444
+ border-color: var(--primary);
445
+ }
446
+
447
+ .detail-search-icon {
448
+ position: absolute;
449
+ left: 8px;
450
+ top: 50%;
451
+ transform: translateY(-50%);
452
+ color: var(--text-dim);
453
+ font-size: 11px;
454
+ }
455
+
456
+ .detail-filters {
457
+ display: flex;
458
+ gap: 8px;
459
+ align-items: center;
460
+ }
461
+
462
+ .detail-filters select {
463
+ padding: 4px 8px;
464
+ background: var(--bg);
465
+ border: 1px solid var(--border);
466
+ border-radius: 0;
467
+ color: var(--text);
468
+ font-size: 11px;
469
+ cursor: pointer;
470
+ }
471
+
472
+ .detail-toggle {
473
+ display: flex;
474
+ align-items: center;
475
+ gap: 6px;
476
+ font-size: 11px;
477
+ color: var(--text-muted);
478
+ }
479
+
480
+ .detail-toggle input[type="checkbox"] {
481
+ cursor: pointer;
482
+ }
483
+
484
+ .detail-toggle label {
485
+ cursor: pointer;
486
+ }
487
+
488
+ .view-toggle {
489
+ display: flex;
490
+ border: 1px solid var(--border);
491
+ border-radius: 0;
492
+ overflow: hidden;
493
+ }
494
+
495
+ .view-toggle button {
496
+ padding: 4px 10px;
497
+ background: var(--bg);
498
+ border: none;
499
+ color: var(--text-muted);
500
+ font-size: 11px;
501
+ cursor: pointer;
502
+ transition: all 0.15s;
503
+ }
504
+
505
+ .view-toggle button:not(:last-child) {
506
+ border-right: 1px solid var(--border);
507
+ }
508
+
509
+ .view-toggle button.active {
510
+ background: var(--primary);
511
+ color: var(--primary-contrast);
512
+ }
513
+
514
+ .view-toggle button:hover:not(.active) {
515
+ background: var(--bg-hover);
516
+ }
517
+
518
+ /* Detail content */
519
+ .detail-content {
520
+ flex: 1;
521
+ overflow-y: auto;
522
+ padding: 16px;
523
+ }
524
+
525
+ /* Conversation flow */
526
+ .conversation {
527
+ display: flex;
528
+ flex-direction: column;
529
+ gap: 12px;
530
+ }
531
+
532
+ /* Collapsible sections */
533
+ .section-block {
534
+ border: 1px solid var(--border);
535
+ border-radius: 0;
536
+ overflow: hidden;
537
+ }
538
+
539
+ .section-header {
540
+ display: flex;
541
+ align-items: center;
542
+ justify-content: space-between;
543
+ padding: 8px 12px;
544
+ background: var(--bg-tertiary);
545
+ border-bottom: 1px solid var(--border);
546
+ user-select: none;
547
+ }
548
+
549
+ .section-header-left {
550
+ display: flex;
551
+ align-items: center;
552
+ gap: 8px;
553
+ font-size: 11px;
554
+ font-weight: 600;
555
+ text-transform: uppercase;
556
+ letter-spacing: 0.5px;
557
+ color: var(--text-muted);
558
+ cursor: pointer;
559
+ padding: 2px 4px;
560
+ margin: -2px -4px;
561
+ }
562
+
563
+ .section-header-left:hover {
564
+ color: var(--text);
565
+ }
566
+
567
+ .section-header-actions {
568
+ display: flex;
569
+ gap: 4px;
570
+ }
571
+
572
+ .collapse-icon {
573
+ font-size: 10px;
574
+ color: var(--text-dim);
575
+ transition: transform 0.15s;
576
+ width: 12px;
577
+ display: inline-flex;
578
+ justify-content: center;
579
+ flex-shrink: 0;
580
+ }
581
+
582
+ .section-badge {
583
+ font-size: 10px;
584
+ font-weight: 400;
585
+ opacity: 0.7;
586
+ }
587
+
588
+ .section-body {
589
+ padding: 12px;
590
+ }
591
+
592
+ /* Info card grid (meta info & usage) */
593
+ .info-card {
594
+ display: grid;
595
+ grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
596
+ gap: 1px;
597
+ background: var(--border);
598
+ border-bottom: 1px solid var(--border);
599
+ }
600
+
601
+ .info-item {
602
+ display: flex;
603
+ flex-direction: column;
604
+ align-items: center;
605
+ justify-content: center;
606
+ padding: 10px 8px;
607
+ background: var(--bg-secondary);
608
+ text-align: center;
609
+ gap: 4px;
610
+ }
611
+
612
+ .info-label {
613
+ font-size: 10px;
614
+ color: var(--text-dim);
615
+ text-transform: uppercase;
616
+ letter-spacing: 0.3px;
617
+ }
618
+
619
+ .info-value {
620
+ font-size: 12px;
621
+ font-weight: 500;
622
+ font-family: 'SF Mono', Monaco, 'Courier New', monospace;
623
+ }
624
+
625
+ .info-value.number {
626
+ font-weight: 700;
627
+ }
628
+
629
+ .status-ok { color: var(--success); }
630
+ .status-fail { color: var(--error); }
631
+
632
+ /* Collapsible message blocks */
633
+ .message-block {
634
+ border: 1px solid var(--border);
635
+ border-radius: 0;
636
+ margin-bottom: 10px;
637
+ overflow: hidden;
638
+ }
639
+
640
+ .message-block:last-child {
641
+ margin-bottom: 0;
642
+ }
643
+
644
+ .message-header {
645
+ display: flex;
646
+ align-items: center;
647
+ justify-content: space-between;
648
+ padding: 6px 10px;
649
+ background: var(--bg-tertiary);
650
+ border-bottom: 1px solid var(--border);
651
+ }
652
+
653
+ .message-header-left {
654
+ display: flex;
655
+ align-items: center;
656
+ gap: 8px;
657
+ min-width: 0;
658
+ }
659
+
660
+ .message-header-left .collapse-icon {
661
+ cursor: pointer;
662
+ }
663
+
664
+ .message-header-left .collapse-icon:hover {
665
+ opacity: 0.7;
666
+ }
667
+
668
+ .message-role {
669
+ font-size: 10px;
670
+ font-weight: 600;
671
+ text-transform: uppercase;
672
+ letter-spacing: 0.3px;
673
+ flex-shrink: 0;
674
+ }
675
+
676
+ .message-role.user { color: var(--primary); }
677
+ .message-role.assistant { color: var(--success); }
678
+ .message-role.system { color: var(--warning); }
679
+ .message-role.tool { color: var(--purple); }
680
+
681
+ .collapsed-summary {
682
+ font-size: 11px;
683
+ color: var(--text-dim);
684
+ overflow: hidden;
685
+ text-overflow: ellipsis;
686
+ white-space: nowrap;
687
+ min-width: 0;
688
+ }
689
+
690
+ .message-header-actions {
691
+ display: flex;
692
+ align-items: center;
693
+ gap: 4px;
694
+ flex-shrink: 0;
695
+ }
696
+
697
+ .message-body {
698
+ padding: 10px;
699
+ }
700
+
701
+ /* Collapsible content blocks */
702
+ .content-block {
703
+ border: 1px solid var(--border-light);
704
+ border-radius: 0;
705
+ margin-bottom: 8px;
706
+ overflow: hidden;
707
+ }
708
+
709
+ .content-block:last-child {
710
+ margin-bottom: 0;
711
+ }
712
+
713
+ .content-block-header {
714
+ display: flex;
715
+ align-items: center;
716
+ justify-content: space-between;
717
+ padding: 4px 8px;
718
+ background: var(--bg-secondary);
719
+ border-bottom: 1px solid var(--border-light);
720
+ }
721
+
722
+ .content-block-header-left {
723
+ display: flex;
724
+ align-items: center;
725
+ gap: 6px;
726
+ min-width: 0;
727
+ }
728
+
729
+ .content-block-header-left .collapse-icon {
730
+ cursor: pointer;
731
+ }
732
+
733
+ .content-block-header-left .collapse-icon:hover {
734
+ opacity: 0.7;
735
+ }
736
+
737
+ .content-type {
738
+ font-size: 9px;
739
+ font-weight: 600;
740
+ text-transform: uppercase;
741
+ padding: 2px 5px;
742
+ border-radius: 0;
743
+ flex-shrink: 0;
744
+ }
745
+
746
+ .content-type.text { background: var(--bg-tertiary); color: var(--text-muted); }
747
+ .content-type.tool_use { background: var(--purple-muted); color: var(--purple); }
748
+ .content-type.tool_result { background: var(--cyan-muted); color: var(--cyan); }
749
+ .content-type.image { background: var(--pink-muted); color: var(--pink); }
750
+ .content-type.thinking { background: var(--warning-muted); color: var(--warning); }
751
+
752
+ .content-block-actions {
753
+ display: flex;
754
+ align-items: center;
755
+ gap: 4px;
756
+ flex-shrink: 0;
757
+ }
758
+
759
+ .content-block-body {
760
+ padding: 8px;
761
+ }
762
+
763
+ .content-block-body.body-collapsed,
764
+ .message-body.body-collapsed {
765
+ max-height: 200px;
766
+ overflow-y: auto;
767
+ }
768
+
769
+ .content-text {
770
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif;
771
+ font-size: 13px;
772
+ line-height: 1.6;
773
+ white-space: pre-wrap;
774
+ word-break: break-word;
775
+ }
776
+
777
+ /* Tool use specific */
778
+ .tool-name {
779
+ font-weight: 600;
780
+ color: var(--purple);
781
+ font-size: 12px;
782
+ flex-shrink: 0;
783
+ }
784
+
785
+ .tool-id {
786
+ font-size: 10px;
787
+ color: var(--text-dim);
788
+ font-family: 'SF Mono', Monaco, 'Courier New', monospace;
789
+ overflow: hidden;
790
+ text-overflow: ellipsis;
791
+ white-space: nowrap;
792
+ min-width: 0;
793
+ }
794
+
795
+ .tool-input {
796
+ background: var(--bg-tertiary);
797
+ border-radius: 0;
798
+ padding: 8px;
799
+ margin-top: 6px;
800
+ font-family: 'SF Mono', Monaco, 'Courier New', monospace;
801
+ font-size: 11px;
802
+ white-space: pre-wrap;
803
+ word-break: break-word;
804
+ }
805
+
806
+ /* Aggregated tool result */
807
+ .tool-result-inline {
808
+ margin-top: 8px;
809
+ border: 1px dashed var(--cyan);
810
+ border-radius: 0;
811
+ overflow: hidden;
812
+ }
813
+
814
+ .tool-result-inline-header {
815
+ display: flex;
816
+ align-items: center;
817
+ justify-content: space-between;
818
+ padding: 4px 8px;
819
+ background: var(--cyan-muted);
820
+ font-size: 10px;
821
+ color: var(--cyan);
822
+ }
823
+
824
+ .tool-result-inline-body {
825
+ padding: 8px;
826
+ font-family: 'SF Mono', Monaco, 'Courier New', monospace;
827
+ font-size: 11px;
828
+ white-space: pre-wrap;
829
+ word-break: break-word;
830
+ }
831
+
832
+ /* Jump link */
833
+ .tool-link {
834
+ display: inline-flex;
835
+ align-items: center;
836
+ gap: 4px;
837
+ color: var(--primary);
838
+ font-size: 10px;
839
+ cursor: pointer;
840
+ text-decoration: none;
841
+ }
842
+
843
+ .tool-link:hover {
844
+ text-decoration: underline;
845
+ }
846
+
847
+ /* Highlight flash animation for jump-to-block navigation */
848
+ @keyframes highlight-flash {
849
+ 0% { background: var(--primary-muted); }
850
+ 100% { background: transparent; }
851
+ }
852
+
853
+ .highlight-flash {
854
+ animation: highlight-flash 1.5s ease-out;
855
+ }
856
+
857
+ /* Truncation & rewrite visualization */
858
+ .message-block.truncated {
859
+ opacity: 0.45;
860
+ }
861
+
862
+ .message-block.truncated .message-header {
863
+ background: var(--error-muted);
864
+ }
865
+
866
+ .message-block.rewritten {
867
+ border-left: 3px solid var(--warning);
868
+ }
869
+
870
+ .rewrite-badge {
871
+ font-size: 10px;
872
+ font-weight: 600;
873
+ }
874
+
875
+ .rewrite-badge.deleted {
876
+ color: var(--error);
877
+ }
878
+
879
+ .rewrite-badge.rewritten {
880
+ color: var(--warning);
881
+ }
882
+
883
+ /* Rewrite view toggle (Original / Rewritten / Diff) */
884
+ .rewrite-toggle {
885
+ display: inline-flex;
886
+ border: 1px solid var(--border);
887
+ border-radius: 4px;
888
+ overflow: hidden;
889
+ margin-right: 8px;
890
+ }
891
+
892
+ .rewrite-tab {
893
+ padding: 1px 8px;
894
+ font-size: 10px;
895
+ background: transparent;
896
+ border: none;
897
+ color: var(--text-muted);
898
+ cursor: pointer;
899
+ border-right: 1px solid var(--border);
900
+ }
901
+
902
+ .rewrite-tab:last-child {
903
+ border-right: none;
904
+ }
905
+
906
+ .rewrite-tab.active {
907
+ background: var(--bg-hover);
908
+ color: var(--text);
909
+ }
910
+
911
+ .rewrite-tab:hover:not(.active) {
912
+ background: var(--bg-tertiary);
913
+ }
914
+
915
+ /* Diff view - diff2html overrides */
916
+ .message-body-diff {
917
+ overflow-x: auto;
918
+ }
919
+
920
+ .message-body-diff .d2h-wrapper {
921
+ min-width: 0;
922
+ }
923
+
924
+ .diff-no-changes {
925
+ padding: 16px;
926
+ text-align: center;
927
+ color: var(--text-muted);
928
+ font-style: italic;
929
+ font-size: 12px;
930
+ }
931
+
932
+ .d2h-wrapper {
933
+ font-size: 11px;
934
+ }
935
+
936
+ .d2h-file-wrapper {
937
+ border: none;
938
+ margin-bottom: 0;
939
+ border-radius: 0;
940
+ }
941
+
942
+ .d2h-file-header {
943
+ display: none;
944
+ }
945
+
946
+ .d2h-file-diff {
947
+ overflow: auto;
948
+ }
949
+
950
+ /* Override absolute positioning of line numbers.
951
+ diff2html uses position:absolute for line numbers, which breaks in our
952
+ nested scrollable containers — they "stick" to the page instead of
953
+ scrolling with content. Using position:static avoids this entirely.
954
+ Also reset direction:rtl (used by diff2html for right-alignment trick). */
955
+ .d2h-code-side-linenumber,
956
+ .d2h-code-linenumber {
957
+ position: static !important;
958
+ direction: ltr;
959
+ background: var(--bg-secondary);
960
+ border-color: var(--border);
961
+ color: var(--text-dim);
962
+ }
963
+
964
+ /* Reset the large padding that diff2html adds to make room for absolute-positioned
965
+ line numbers. With static positioning, the <td> occupies its own cell space. */
966
+ .d2h-code-side-line,
967
+ .d2h-code-line {
968
+ padding: 0;
969
+ white-space: pre-wrap;
970
+ word-break: break-word;
971
+ background: var(--bg);
972
+ color: var(--text);
973
+ }
974
+
975
+ .d2h-code-line-ctn {
976
+ white-space: pre-wrap;
977
+ word-break: break-word;
978
+ }
979
+
980
+ .d2h-code-side-line del,
981
+ .d2h-code-line del,
982
+ .d2h-code-side-line ins,
983
+ .d2h-code-line ins {
984
+ text-decoration: none;
985
+ }
986
+
987
+ .d2h-del {
988
+ background: rgba(248, 81, 73, 0.1);
989
+ border-color: transparent;
990
+ }
991
+
992
+ .d2h-del .d2h-code-side-linenumber,
993
+ .d2h-del .d2h-code-linenumber {
994
+ background: rgba(248, 81, 73, 0.15);
995
+ border-color: transparent;
996
+ color: var(--error);
997
+ }
998
+
999
+ .d2h-ins {
1000
+ background: rgba(63, 185, 80, 0.1);
1001
+ border-color: transparent;
1002
+ }
1003
+
1004
+ .d2h-ins .d2h-code-side-linenumber,
1005
+ .d2h-ins .d2h-code-linenumber {
1006
+ background: rgba(63, 185, 80, 0.15);
1007
+ border-color: transparent;
1008
+ color: var(--success);
1009
+ }
1010
+
1011
+ del.d2h-change {
1012
+ background: rgba(248, 81, 73, 0.3);
1013
+ }
1014
+
1015
+ ins.d2h-change {
1016
+ background: rgba(63, 185, 80, 0.3);
1017
+ }
1018
+
1019
+ .d2h-info {
1020
+ background: var(--bg-tertiary);
1021
+ border-color: var(--border);
1022
+ color: var(--primary);
1023
+ }
1024
+
1025
+ .d2h-code-side-emptyplaceholder,
1026
+ .d2h-emptyplaceholder {
1027
+ background: var(--bg-secondary);
1028
+ border-color: transparent;
1029
+ }
1030
+
1031
+ @media (prefers-color-scheme: light) {
1032
+ .d2h-del {
1033
+ background: rgba(255, 129, 130, 0.15);
1034
+ }
1035
+
1036
+ .d2h-del .d2h-code-side-linenumber,
1037
+ .d2h-del .d2h-code-linenumber {
1038
+ background: rgba(255, 129, 130, 0.2);
1039
+ color: #cf222e;
1040
+ }
1041
+
1042
+ .d2h-ins {
1043
+ background: rgba(63, 185, 80, 0.12);
1044
+ }
1045
+
1046
+ .d2h-ins .d2h-code-side-linenumber,
1047
+ .d2h-ins .d2h-code-linenumber {
1048
+ background: rgba(63, 185, 80, 0.18);
1049
+ color: #1a7f37;
1050
+ }
1051
+
1052
+ del.d2h-change {
1053
+ background: rgba(255, 129, 130, 0.4);
1054
+ }
1055
+
1056
+ ins.d2h-change {
1057
+ background: rgba(63, 185, 80, 0.35);
1058
+ }
1059
+
1060
+ .d2h-code-side-linenumber,
1061
+ .d2h-code-linenumber {
1062
+ background: var(--bg-secondary);
1063
+ color: var(--text-dim);
1064
+ }
1065
+
1066
+ .d2h-code-side-line,
1067
+ .d2h-code-line {
1068
+ background: var(--bg);
1069
+ color: var(--text);
1070
+ }
1071
+
1072
+ .d2h-info {
1073
+ background: var(--bg-tertiary);
1074
+ color: var(--primary);
1075
+ }
1076
+
1077
+ .d2h-code-side-emptyplaceholder,
1078
+ .d2h-emptyplaceholder {
1079
+ background: var(--bg-secondary);
1080
+ }
1081
+ }
1082
+
1083
+ .truncation-divider {
1084
+ display: flex;
1085
+ align-items: center;
1086
+ gap: 12px;
1087
+ margin: 8px 0;
1088
+ padding: 0 4px;
1089
+ }
1090
+
1091
+ .truncation-divider-line {
1092
+ flex: 1;
1093
+ height: 1px;
1094
+ background: var(--error);
1095
+ opacity: 0.5;
1096
+ }
1097
+
1098
+ .truncation-divider-label {
1099
+ font-size: 10px;
1100
+ color: var(--error);
1101
+ white-space: nowrap;
1102
+ font-weight: 600;
1103
+ letter-spacing: 0.3px;
1104
+ text-transform: uppercase;
1105
+ }
1106
+
1107
+ .truncation-value {
1108
+ color: var(--warning) !important;
1109
+ }
1110
+
1111
+ /* Error block */
1112
+ .error-block {
1113
+ padding: 12px;
1114
+ background: var(--error-muted);
1115
+ color: var(--error);
1116
+ border-radius: 0;
1117
+ margin-bottom: 12px;
1118
+ }
1119
+
1120
+ /* Aggregated tool result links */
1121
+ .aggregated-links {
1122
+ display: flex;
1123
+ flex-wrap: wrap;
1124
+ align-items: center;
1125
+ gap: 8px;
1126
+ font-size: 11px;
1127
+ }
1128
+
1129
+ .aggregated-label {
1130
+ color: var(--text-dim);
1131
+ }
1132
+
1133
+ /* Search highlight */
1134
+ .search-highlight {
1135
+ background: var(--warning);
1136
+ color: var(--bg);
1137
+ padding: 0 2px;
1138
+ border-radius: 0;
1139
+ }
1140
+
1141
+ /* JSON Tree view */
1142
+ .json-tree {
1143
+ font-family: 'SF Mono', Monaco, 'Courier New', monospace;
1144
+ font-size: 12px;
1145
+ line-height: 1.6;
1146
+ }
1147
+
1148
+ .json-tree ul {
1149
+ list-style: none;
1150
+ padding-left: 20px;
1151
+ }
1152
+
1153
+ .json-tree > ul {
1154
+ padding-left: 0;
1155
+ }
1156
+
1157
+ .json-tree li {
1158
+ position: relative;
1159
+ }
1160
+
1161
+ .json-tree .jt-toggle {
1162
+ cursor: pointer;
1163
+ user-select: none;
1164
+ display: inline-flex;
1165
+ width: 14px;
1166
+ justify-content: center;
1167
+ color: var(--text-dim);
1168
+ font-size: 10px;
1169
+ margin-right: 2px;
1170
+ }
1171
+
1172
+ .json-tree .jt-toggle:hover {
1173
+ color: var(--text);
1174
+ }
1175
+
1176
+ .json-tree .jt-key {
1177
+ color: #9cdcfe;
1178
+ }
1179
+
1180
+ .json-tree .jt-string {
1181
+ color: #ce9178;
1182
+ }
1183
+
1184
+ .json-tree .jt-number {
1185
+ color: #b5cea8;
1186
+ }
1187
+
1188
+ .json-tree .jt-boolean {
1189
+ color: #569cd6;
1190
+ }
1191
+
1192
+ .json-tree .jt-null {
1193
+ color: #569cd6;
1194
+ font-style: italic;
1195
+ }
1196
+
1197
+ .json-tree .jt-bracket {
1198
+ color: var(--text-dim);
1199
+ }
1200
+
1201
+ .json-tree .jt-collapsed-info {
1202
+ color: var(--text-dim);
1203
+ font-style: italic;
1204
+ font-size: 11px;
1205
+ }
1206
+
1207
+ .json-tree .jt-comma {
1208
+ color: var(--text-dim);
1209
+ }
1210
+
1211
+ .json-tree .jt-string-truncated {
1212
+ word-break: break-all;
1213
+ }
1214
+
1215
+ .json-tree .jt-expand-string {
1216
+ display: inline-block;
1217
+ margin-left: 6px;
1218
+ color: var(--primary);
1219
+ font-size: 10px;
1220
+ cursor: pointer;
1221
+ font-style: italic;
1222
+ user-select: none;
1223
+ }
1224
+
1225
+ .json-tree .jt-expand-string:hover {
1226
+ text-decoration: underline;
1227
+ }
1228
+
1229
+
1230
+ /* Action buttons (icon + text) */
1231
+ .action-btn {
1232
+ display: inline-flex;
1233
+ align-items: center;
1234
+ gap: 3px;
1235
+ padding: 2px 6px;
1236
+ background: transparent;
1237
+ border: none;
1238
+ border-radius: 3px;
1239
+ color: var(--text-muted);
1240
+ cursor: pointer;
1241
+ font-size: 11px;
1242
+ font-family: inherit;
1243
+ transition: all 0.15s;
1244
+ white-space: nowrap;
1245
+ }
1246
+
1247
+ .action-btn:hover {
1248
+ background: var(--bg-hover);
1249
+ color: var(--text);
1250
+ }
1251
+
1252
+ .action-btn svg {
1253
+ width: 13px;
1254
+ height: 13px;
1255
+ flex-shrink: 0;
1256
+ }
1257
+
1258
+ /* Icon-only buttons (header, modal close) */
1259
+ .icon-btn {
1260
+ display: inline-flex;
1261
+ align-items: center;
1262
+ justify-content: center;
1263
+ width: 28px;
1264
+ height: 28px;
1265
+ padding: 0;
1266
+ background: transparent;
1267
+ border: none;
1268
+ border-radius: 3px;
1269
+ color: var(--text-muted);
1270
+ cursor: pointer;
1271
+ font-size: 12px;
1272
+ transition: all 0.15s;
1273
+ }
1274
+
1275
+ .icon-btn:hover {
1276
+ background: var(--bg-hover);
1277
+ color: var(--text);
1278
+ }
1279
+
1280
+ .icon-btn svg {
1281
+ width: 16px;
1282
+ height: 16px;
1283
+ }
1284
+
1285
+ /* Regular buttons */
1286
+ button {
1287
+ background: var(--bg-tertiary);
1288
+ border: 1px solid var(--border);
1289
+ color: var(--text);
1290
+ padding: 6px 12px;
1291
+ border-radius: 0;
1292
+ cursor: pointer;
1293
+ font-size: 12px;
1294
+ transition: all 0.15s;
1295
+ display: inline-flex;
1296
+ align-items: center;
1297
+ gap: 6px;
1298
+ }
1299
+
1300
+ button svg {
1301
+ width: 14px;
1302
+ height: 14px;
1303
+ flex-shrink: 0;
1304
+ }
1305
+
1306
+ button:hover {
1307
+ background: var(--bg-hover);
1308
+ }
1309
+
1310
+ button.primary {
1311
+ background: var(--primary);
1312
+ border-color: var(--primary);
1313
+ color: var(--primary-contrast);
1314
+ }
1315
+
1316
+ button.primary:hover {
1317
+ opacity: 0.9;
1318
+ }
1319
+
1320
+ button.danger {
1321
+ color: var(--error);
1322
+ }
1323
+
1324
+ button.danger:hover {
1325
+ background: var(--error-muted);
1326
+ }
1327
+
1328
+ button:disabled {
1329
+ opacity: 0.5;
1330
+ cursor: not-allowed;
1331
+ }
1332
+
1333
+ button.small {
1334
+ padding: 4px 8px;
1335
+ font-size: 11px;
1336
+ }
1337
+
1338
+ /* Modal */
1339
+ .modal-overlay {
1340
+ position: fixed;
1341
+ top: 0;
1342
+ left: 0;
1343
+ right: 0;
1344
+ bottom: 0;
1345
+ background: rgba(0, 0, 0, 0.6);
1346
+ display: none;
1347
+ justify-content: center;
1348
+ align-items: center;
1349
+ z-index: 1000;
1350
+ }
1351
+
1352
+ .modal-overlay.open {
1353
+ display: flex;
1354
+ }
1355
+
1356
+ .modal {
1357
+ background: #161b22;
1358
+ border: 1px solid #30363d;
1359
+ border-radius: 0;
1360
+ width: calc(100vw - 48px);
1361
+ height: calc(100vh - 48px);
1362
+ display: flex;
1363
+ flex-direction: column;
1364
+ color: #e6edf3;
1365
+ /* Force dark mode inside modals */
1366
+ --bg: #0d1117;
1367
+ --bg-secondary: #161b22;
1368
+ --bg-tertiary: #21262d;
1369
+ --bg-hover: #30363d;
1370
+ --text: #e6edf3;
1371
+ --text-muted: #8b949e;
1372
+ --text-dim: #6e7681;
1373
+ --border: #30363d;
1374
+ --border-light: #21262d;
1375
+ --primary: #58a6ff;
1376
+ }
1377
+
1378
+ .modal-header {
1379
+ padding: 12px 16px;
1380
+ border-bottom: 1px solid var(--border);
1381
+ display: flex;
1382
+ justify-content: space-between;
1383
+ align-items: center;
1384
+ }
1385
+
1386
+ .modal-header h3 {
1387
+ font-size: 14px;
1388
+ font-weight: 600;
1389
+ }
1390
+
1391
+ .modal-body {
1392
+ flex: 1;
1393
+ overflow: auto;
1394
+ padding: 16px;
1395
+ }
1396
+
1397
+ /* Scrollbar */
1398
+ ::-webkit-scrollbar {
1399
+ width: 8px;
1400
+ height: 8px;
1401
+ }
1402
+
1403
+ ::-webkit-scrollbar-track {
1404
+ background: var(--bg);
1405
+ }
1406
+
1407
+ ::-webkit-scrollbar-thumb {
1408
+ background: var(--border);
1409
+ border-radius: 0;
1410
+ }
1411
+
1412
+ ::-webkit-scrollbar-thumb:hover {
1413
+ background: var(--text-dim);
1414
+ }
1415
+
1416
+ /* Loading */
1417
+ .loading {
1418
+ text-align: center;
1419
+ padding: 20px;
1420
+ color: var(--text-muted);
1421
+ }
1422
+
1423
+ /* Empty state */
1424
+ .empty-state {
1425
+ text-align: center;
1426
+ padding: 40px 20px;
1427
+ color: var(--text-muted);
1428
+ }
1429
+
1430
+ .empty-state h3 {
1431
+ margin-bottom: 8px;
1432
+ color: var(--text);
1433
+ font-size: 14px;
1434
+ }
1435
+
1436
+ .empty-state p {
1437
+ font-size: 12px;
1438
+ }
1439
+
1440
+ /* Responsive */
1441
+ @media (max-width: 768px) {
1442
+ .main {
1443
+ flex-direction: column;
1444
+ }
1445
+
1446
+ .list-panel {
1447
+ width: 100%;
1448
+ max-width: none;
1449
+ height: 40%;
1450
+ border-right: none;
1451
+ border-bottom: 1px solid var(--border);
1452
+ }
1453
+
1454
+ .detail-panel {
1455
+ height: 60%;
1456
+ }
1457
+
1458
+ .header {
1459
+ flex-wrap: wrap;
1460
+ gap: 8px;
1461
+ }
1462
+
1463
+ .stats-bar {
1464
+ flex-wrap: wrap;
1465
+ gap: 12px;
1466
+ }
1467
+ }