@unity-china/codely-cli 1.0.0-rc.4 → 1.0.0-rc.6

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,2860 @@
1
+ :root {
2
+ color-scheme: dark;
3
+
4
+ --bg: #0f111a;
5
+ --panel: #151a27;
6
+ --panel-2: #101521;
7
+ --border: rgba(255, 255, 255, 0.08);
8
+ --text: rgba(255, 255, 255, 0.92);
9
+ --muted: rgba(255, 255, 255, 0.62);
10
+ --subtle: rgba(255, 255, 255, 0.12);
11
+
12
+ --accent: #7aa2f7;
13
+ --accent-2: #bb9af7;
14
+ --ok: #9ece6a;
15
+ --warn: #e0af68;
16
+ --err: #f7768e;
17
+
18
+ --shadow: 0 16px 50px rgba(0, 0, 0, 0.45);
19
+ --radius: 8px;
20
+ --radius-sm: 6px;
21
+
22
+ --mono:
23
+ ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono',
24
+ 'Courier New', monospace;
25
+ --sans:
26
+ ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial,
27
+ 'Apple Color Emoji', 'Segoe UI Emoji';
28
+ }
29
+
30
+ * {
31
+ box-sizing: border-box;
32
+ }
33
+
34
+ html,
35
+ body {
36
+ height: 100%;
37
+ }
38
+
39
+ #app {
40
+ height: 100%;
41
+ min-height: 0;
42
+ }
43
+
44
+ body {
45
+ margin: 0;
46
+ background:
47
+ radial-gradient(1200px 800px at 10% 0%, #1b2140 0%, transparent 60%),
48
+ radial-gradient(900px 700px at 90% 10%, #2a1b40 0%, transparent 55%),
49
+ var(--bg);
50
+ color: var(--text);
51
+ font-family: var(--sans);
52
+ overflow: hidden;
53
+ }
54
+
55
+ a {
56
+ color: var(--accent);
57
+ text-decoration: none;
58
+ }
59
+ a:hover {
60
+ text-decoration: underline;
61
+ }
62
+
63
+ button,
64
+ input,
65
+ textarea {
66
+ font-family: inherit;
67
+ }
68
+
69
+ .app {
70
+ height: 100%;
71
+ display: flex;
72
+ padding: 12px;
73
+ min-height: 0;
74
+ min-width: 0;
75
+ position: relative;
76
+ overflow: hidden;
77
+ }
78
+
79
+ .main,
80
+ .cp-main {
81
+ flex: 1;
82
+ background:
83
+ linear-gradient(180deg, rgba(255, 255, 255, 0.03), transparent),
84
+ var(--panel-2);
85
+ border: 1px solid var(--border);
86
+ border-radius: var(--radius);
87
+ box-shadow: var(--shadow);
88
+ overflow: hidden;
89
+ display: flex;
90
+ flex-direction: column;
91
+ min-height: 0;
92
+ min-width: 0;
93
+ position: relative;
94
+ }
95
+
96
+ .btn {
97
+ display: inline-flex;
98
+ align-items: center;
99
+ justify-content: center;
100
+ gap: 8px;
101
+ padding: 8px 12px;
102
+ border-radius: var(--radius-sm);
103
+ border: 1px solid var(--border);
104
+ background: rgba(255, 255, 255, 0.03);
105
+ color: var(--text);
106
+ cursor: pointer;
107
+ font-size: 13px;
108
+ }
109
+ .btn:hover {
110
+ background: rgba(255, 255, 255, 0.06);
111
+ }
112
+ .btn:active {
113
+ transform: translateY(1px);
114
+ }
115
+ .btn.primary {
116
+ background: linear-gradient(
117
+ 135deg,
118
+ rgba(122, 162, 247, 0.2),
119
+ rgba(187, 154, 247, 0.16)
120
+ );
121
+ border-color: rgba(122, 162, 247, 0.35);
122
+ }
123
+ .btn.danger {
124
+ background: rgba(247, 118, 142, 0.12);
125
+ border-color: rgba(247, 118, 142, 0.28);
126
+ }
127
+
128
+ .content {
129
+ flex: 1;
130
+ overflow-y: auto;
131
+ padding: 10px 18px 80px;
132
+ min-height: 0;
133
+ min-width: 0;
134
+ overflow-anchor: auto;
135
+ scroll-padding-bottom: 80px;
136
+ }
137
+
138
+ .content > * {
139
+ margin-bottom: 8px;
140
+ }
141
+
142
+ .content > * {
143
+ margin-bottom: 12px;
144
+ }
145
+
146
+ .session-notice {
147
+ position: sticky;
148
+ top: 0;
149
+ z-index: 4;
150
+ padding: 10px 12px;
151
+ border: 1px solid rgba(224, 175, 104, 0.3);
152
+ border-radius: var(--radius-md);
153
+ background: rgba(224, 175, 104, 0.08);
154
+ color: var(--warn);
155
+ white-space: pre-wrap;
156
+ line-height: 1.45;
157
+ backdrop-filter: blur(18px);
158
+ }
159
+
160
+ .user-message {
161
+ padding: 4px 0;
162
+ color: var(--text);
163
+ font-weight: 500;
164
+ }
165
+
166
+ .assistant-message {
167
+ padding: 4px 0;
168
+ }
169
+
170
+ .md {
171
+ font-size: 14px;
172
+ line-height: 1.55;
173
+ color: var(--text);
174
+ }
175
+ .md p {
176
+ margin: 0 0 10px;
177
+ white-space: pre-wrap;
178
+ }
179
+ .md h1,
180
+ .md h2,
181
+ .md h3,
182
+ .md h4 {
183
+ margin: 14px 0 8px;
184
+ line-height: 1.25;
185
+ }
186
+ .md h1 {
187
+ font-size: 20px;
188
+ }
189
+ .md h2 {
190
+ font-size: 17px;
191
+ }
192
+ .md h3 {
193
+ font-size: 15px;
194
+ }
195
+ .md h4 {
196
+ font-size: 14px;
197
+ color: rgba(255, 255, 255, 0.86);
198
+ }
199
+ .md ul,
200
+ .md ol {
201
+ margin: 0 0 10px 18px;
202
+ padding: 0;
203
+ }
204
+ .md li {
205
+ margin: 4px 0;
206
+ white-space: pre-wrap;
207
+ }
208
+ .md code.inline {
209
+ font-family: var(--mono);
210
+ font-size: 13px;
211
+ padding: 2px 6px;
212
+ border-radius: 8px;
213
+ border: 1px solid var(--border);
214
+ background: rgba(255, 255, 255, 0.04);
215
+ color: rgba(187, 154, 247, 0.95);
216
+ }
217
+ .md pre {
218
+ margin: 10px 0;
219
+ padding: 12px;
220
+ border-radius: 14px;
221
+ border: 1px solid var(--border);
222
+ background: rgba(0, 0, 0, 0.3);
223
+ overflow: auto;
224
+ font-family: var(--mono);
225
+ font-size: 13px;
226
+ line-height: 1.5;
227
+ }
228
+ .md pre code {
229
+ font-family: var(--mono);
230
+ }
231
+ .md hr {
232
+ border: none;
233
+ border-top: 1px solid var(--border);
234
+ margin: 14px 0;
235
+ }
236
+ .md table {
237
+ width: 100%;
238
+ border-collapse: collapse;
239
+ margin: 10px 0;
240
+ font-size: 12px;
241
+ }
242
+ .md th,
243
+ .md td {
244
+ border: 1px solid var(--border);
245
+ padding: 8px 10px;
246
+ vertical-align: top;
247
+ }
248
+ .md th {
249
+ background: rgba(255, 255, 255, 0.03);
250
+ color: rgba(255, 255, 255, 0.86);
251
+ }
252
+ .md blockquote {
253
+ margin: 10px 0;
254
+ padding: 8px 10px;
255
+ border-left: 3px solid rgba(122, 162, 247, 0.5);
256
+ background: rgba(122, 162, 247, 0.06);
257
+ border-radius: 10px;
258
+ color: rgba(255, 255, 255, 0.86);
259
+ }
260
+
261
+ .think {
262
+ margin: 12px 0;
263
+ }
264
+ .think summary {
265
+ cursor: pointer;
266
+ padding: 4px 0;
267
+ color: rgba(255, 255, 255, 0.7);
268
+ font-size: 11px;
269
+ font-weight: 600;
270
+ user-select: none;
271
+ opacity: 0.8;
272
+ letter-spacing: 0.05em;
273
+ }
274
+ .think summary:hover {
275
+ opacity: 1;
276
+ }
277
+ .think.active {
278
+ margin: 12px 0;
279
+ }
280
+ .think-body {
281
+ margin-top: 6px;
282
+ padding: 10px 12px;
283
+ border-left: 3px solid rgba(122, 162, 247, 0.55);
284
+ background: rgba(122, 162, 247, 0.06);
285
+ border-radius: 10px;
286
+ }
287
+ .think-content,
288
+ .think pre {
289
+ margin: 0;
290
+ padding: 0;
291
+ border: none;
292
+ background: transparent;
293
+ color: rgba(255, 255, 255, 0.86);
294
+ font-family: var(--sans);
295
+ font-size: 12px;
296
+ line-height: 1.45;
297
+ white-space: pre-wrap;
298
+ word-break: break-all;
299
+ }
300
+
301
+ .tool-card {
302
+ margin: 12px 0;
303
+ border-radius: var(--radius);
304
+ border: 1px solid var(--border);
305
+ background: rgba(255, 255, 255, 0.02);
306
+ overflow: hidden;
307
+ }
308
+
309
+ .tool-compact {
310
+ margin: 6px 0;
311
+ display: flex;
312
+ align-items: center;
313
+ gap: 8px;
314
+ font-family: var(--mono);
315
+ font-size: 12px;
316
+ color: rgba(255, 255, 255, 0.78);
317
+ opacity: 0.95;
318
+ }
319
+
320
+ .tool-compact-arrow {
321
+ color: rgba(255, 255, 255, 0.55);
322
+ }
323
+
324
+ .tool-compact-kind {
325
+ color: rgba(187, 154, 247, 0.95);
326
+ }
327
+
328
+ .tool-compact-title {
329
+ color: rgba(255, 255, 255, 0.86);
330
+ overflow: hidden;
331
+ text-overflow: ellipsis;
332
+ white-space: nowrap;
333
+ flex: 1;
334
+ min-width: 0;
335
+ }
336
+
337
+ .tool-compact-status {
338
+ font-family: var(--sans);
339
+ font-size: 11px;
340
+ color: var(--muted);
341
+ }
342
+
343
+ .planning-indicator {
344
+ font-size: 11px;
345
+ color: var(--muted);
346
+ margin: 12px 0;
347
+ font-style: italic;
348
+ background: linear-gradient(90deg, var(--muted), var(--text), var(--muted));
349
+ background-size: 200% 100%;
350
+ -webkit-background-clip: text;
351
+ -webkit-text-fill-color: transparent;
352
+ animation: shimmer-text 2s infinite linear;
353
+ opacity: 0.6;
354
+ }
355
+
356
+ @keyframes shimmer-text {
357
+ 0% {
358
+ background-position: 200% 0;
359
+ }
360
+ 100% {
361
+ background-position: -200% 0;
362
+ }
363
+ }
364
+
365
+ .shimmer {
366
+ display: none;
367
+ }
368
+
369
+ @keyframes shimmer-pulse {
370
+ 0% {
371
+ background-position: 200% 0;
372
+ transform: scale(0.9);
373
+ opacity: 0.4;
374
+ }
375
+ 50% {
376
+ transform: scale(1.1);
377
+ opacity: 0.8;
378
+ }
379
+ 100% {
380
+ background-position: -200% 0;
381
+ transform: scale(0.9);
382
+ opacity: 0.4;
383
+ }
384
+ }
385
+ .tool-card-header {
386
+ display: flex;
387
+ align-items: center;
388
+ justify-content: space-between;
389
+ gap: 10px;
390
+ padding: 6px 10px;
391
+ background: rgba(255, 255, 255, 0.03);
392
+ border-bottom: 1px solid var(--border);
393
+ }
394
+ .tool-card-title {
395
+ display: flex;
396
+ align-items: center;
397
+ gap: 10px;
398
+ min-width: 0;
399
+ }
400
+ .tool-kind {
401
+ font-family: var(--mono);
402
+ font-size: 11px;
403
+ padding: 3px 7px;
404
+ border-radius: 999px;
405
+ border: 1px solid var(--border);
406
+ color: var(--muted);
407
+ background: rgba(255, 255, 255, 0.03);
408
+ }
409
+ .tool-status {
410
+ font-size: 11px;
411
+ color: var(--muted);
412
+ }
413
+ .tool-card-body {
414
+ padding: 10px 12px;
415
+ }
416
+ .diff {
417
+ border-radius: var(--radius-sm);
418
+ border: 1px solid var(--border);
419
+ background: rgba(0, 0, 0, 0.26);
420
+ overflow: auto;
421
+ max-height: 420px;
422
+ }
423
+ .diff pre {
424
+ margin: 0;
425
+ padding: 10px 12px;
426
+ font-family: var(--mono);
427
+ font-size: 12px;
428
+ line-height: 1.45;
429
+ }
430
+ .diff .add {
431
+ color: rgba(158, 206, 106, 0.95);
432
+ }
433
+ .diff .del {
434
+ color: rgba(247, 118, 142, 0.95);
435
+ }
436
+ .diff .meta {
437
+ color: rgba(122, 162, 247, 0.92);
438
+ }
439
+ .diff .hunk {
440
+ color: rgba(224, 175, 104, 0.95);
441
+ }
442
+
443
+ .composer {
444
+ border-top: 1px solid var(--border);
445
+ padding: 12px;
446
+ background: var(--panel-2);
447
+ position: relative;
448
+ z-index: 10;
449
+ flex-shrink: 0;
450
+ }
451
+ .composer-inner {
452
+ display: block;
453
+ }
454
+ .input-wrap {
455
+ position: relative;
456
+ border: 1px solid var(--border);
457
+ border-radius: var(--radius);
458
+ background: rgba(255, 255, 255, 0.03);
459
+ /* Allow the slash command autocomplete popover to render outside the input. */
460
+ overflow: visible;
461
+ transition: all 0.2s;
462
+ }
463
+ .input-wrap:focus-within {
464
+ border-color: rgba(122, 162, 247, 0.5);
465
+ box-shadow: 0 0 0 4px rgba(122, 162, 247, 0.12);
466
+ }
467
+ textarea {
468
+ width: 100%;
469
+ min-height: 44px;
470
+ max-height: 180px;
471
+ resize: none;
472
+ padding: 11px 44px 11px 12px;
473
+ border: none;
474
+ background: transparent;
475
+ color: var(--text);
476
+ outline: none;
477
+ font-size: 13px;
478
+ line-height: 1.45;
479
+ display: block;
480
+ }
481
+
482
+ .composer-references {
483
+ display: flex;
484
+ flex-wrap: wrap;
485
+ gap: 6px;
486
+ padding: 8px 12px 0;
487
+ background: transparent;
488
+ }
489
+
490
+ .ref-chip {
491
+ display: inline-flex;
492
+ align-items: center;
493
+ gap: 6px;
494
+ padding: 4px 10px;
495
+ background: rgba(255, 255, 255, 0.05);
496
+ border: 1px solid var(--border);
497
+ border-radius: 6px;
498
+ font-size: 11px;
499
+ font-weight: 500;
500
+ color: var(--muted);
501
+ max-width: 200px;
502
+ }
503
+
504
+ .ref-label {
505
+ overflow: hidden;
506
+ text-overflow: ellipsis;
507
+ white-space: nowrap;
508
+ }
509
+
510
+ .ref-chip.file {
511
+ background: rgba(255, 255, 255, 0.08);
512
+ }
513
+
514
+ .ref-chip.link {
515
+ background: rgba(255, 255, 255, 0.08);
516
+ }
517
+
518
+ .ref-chip.default {
519
+ background: rgba(255, 255, 255, 0.04);
520
+ }
521
+
522
+ .ref-remove {
523
+ background: none;
524
+ border: none;
525
+ color: inherit;
526
+ cursor: pointer;
527
+ padding: 0;
528
+ font-size: 14px;
529
+ display: flex;
530
+ align-items: center;
531
+ justify-content: center;
532
+ opacity: 0.5;
533
+ width: 14px;
534
+ height: 14px;
535
+ }
536
+
537
+ .ref-remove:hover {
538
+ opacity: 1;
539
+ }
540
+
541
+ .composer-submit {
542
+ position: absolute;
543
+ right: 8px;
544
+ bottom: 8px;
545
+ width: 28px;
546
+ height: 28px;
547
+ border-radius: 6px;
548
+ border: none;
549
+ background: rgba(255, 255, 255, 0.1);
550
+ color: var(--text);
551
+ display: flex;
552
+ align-items: center;
553
+ justify-content: center;
554
+ cursor: pointer;
555
+ transition: all 0.2s;
556
+ z-index: 20;
557
+ opacity: 0.8;
558
+ }
559
+
560
+ .composer-submit:hover {
561
+ opacity: 1;
562
+ background: rgba(255, 255, 255, 0.15);
563
+ }
564
+
565
+ .composer-submit:active {
566
+ transform: scale(0.92);
567
+ }
568
+
569
+ .composer-submit.busy {
570
+ background: rgba(255, 255, 255, 0.15);
571
+ opacity: 1;
572
+ color: var(--err);
573
+ }
574
+
575
+ .composer-submit svg {
576
+ display: block;
577
+ }
578
+ .composer-footer {
579
+ display: flex;
580
+ align-items: center;
581
+ justify-content: space-between;
582
+ margin-top: 8px;
583
+ gap: 12px;
584
+ }
585
+
586
+ .composer-footer-right {
587
+ display: flex;
588
+ align-items: center;
589
+ gap: 12px;
590
+ }
591
+
592
+ .workspace-info {
593
+ font-size: 11px;
594
+ color: rgba(255, 255, 255, 0.35);
595
+ overflow: hidden;
596
+ text-overflow: ellipsis;
597
+ white-space: nowrap;
598
+ max-width: 50%;
599
+ }
600
+
601
+ .hint {
602
+ font-size: 11px;
603
+ color: rgba(255, 255, 255, 0.35);
604
+ font-weight: normal;
605
+ white-space: nowrap;
606
+ }
607
+
608
+ .status-bar {
609
+ display: flex;
610
+ align-items: center;
611
+ gap: 8px;
612
+ cursor: pointer;
613
+ padding: 4px 8px;
614
+ border-radius: var(--radius-sm);
615
+ transition: background 0.2s;
616
+ }
617
+ .status-bar:hover {
618
+ background: rgba(255, 255, 255, 0.04);
619
+ }
620
+
621
+ .status-text {
622
+ font-size: 11px;
623
+ color: var(--err);
624
+ opacity: 0.9;
625
+ }
626
+
627
+ .status-dot {
628
+ width: 10px;
629
+ height: 10px;
630
+ border-radius: 50%;
631
+ background: var(--subtle);
632
+ box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.04);
633
+ }
634
+ .status-dot.connected {
635
+ background: var(--ok);
636
+ box-shadow: 0 0 8px rgba(158, 206, 106, 0.4);
637
+ }
638
+ .status-dot.connecting {
639
+ background: var(--warn);
640
+ animation: pulse 1.5s infinite ease-in-out;
641
+ }
642
+ .status-dot.disconnected {
643
+ background: var(--err);
644
+ box-shadow: 0 0 8px rgba(247, 118, 142, 0.4);
645
+ }
646
+
647
+ @keyframes pulse {
648
+ 0% {
649
+ opacity: 0.4;
650
+ transform: scale(0.85);
651
+ }
652
+ 50% {
653
+ opacity: 1;
654
+ transform: scale(1.05);
655
+ }
656
+ 100% {
657
+ opacity: 0.4;
658
+ transform: scale(0.85);
659
+ }
660
+ }
661
+
662
+ .autocomplete {
663
+ position: absolute;
664
+ left: 0;
665
+ right: 0;
666
+ bottom: calc(100% + 8px);
667
+ z-index: 50;
668
+ border: 1px solid var(--border);
669
+ background: rgba(20, 24, 35, 0.95);
670
+ backdrop-filter: blur(12px);
671
+ border-radius: 12px;
672
+ overflow: hidden;
673
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.5);
674
+ max-height: 320px;
675
+ display: flex;
676
+ flex-direction: column;
677
+ }
678
+
679
+ .ac-header {
680
+ padding: 8px 12px;
681
+ font-size: 11px;
682
+ font-weight: 700;
683
+ color: var(--muted);
684
+ text-transform: uppercase;
685
+ letter-spacing: 0.1em;
686
+ border-bottom: 1px solid var(--border);
687
+ background: rgba(255, 255, 255, 0.02);
688
+ }
689
+
690
+ .ac-item {
691
+ padding: 8px 12px;
692
+ display: flex;
693
+ flex-direction: column;
694
+ gap: 2px;
695
+ cursor: pointer;
696
+ border-bottom: 1px solid rgba(255, 255, 255, 0.03);
697
+ }
698
+
699
+ .ac-item:last-child {
700
+ border-bottom: none;
701
+ }
702
+
703
+ .ac-item:hover,
704
+ .ac-item.active {
705
+ background: rgba(122, 162, 247, 0.12);
706
+ }
707
+
708
+ .ac-name code {
709
+ font-family: var(--mono);
710
+ font-size: 13px;
711
+ font-weight: 600;
712
+ color: var(--accent);
713
+ }
714
+
715
+ .ac-desc {
716
+ font-size: 12px;
717
+ color: var(--muted);
718
+ overflow: hidden;
719
+ text-overflow: ellipsis;
720
+ white-space: nowrap;
721
+ }
722
+
723
+ .ac-item.active .ac-desc {
724
+ color: var(--text);
725
+ }
726
+
727
+ .modal-backdrop {
728
+ position: fixed;
729
+ inset: 0;
730
+ background: rgba(0, 0, 0, 0.55);
731
+ display: flex;
732
+ align-items: center;
733
+ justify-content: center;
734
+ padding: 18px;
735
+ z-index: 9999;
736
+ }
737
+ .modal {
738
+ width: min(1100px, 96vw);
739
+ max-height: 90vh;
740
+ overflow: hidden;
741
+ border-radius: 18px;
742
+ border: 1px solid var(--border);
743
+ background: rgba(16, 21, 33, 0.96);
744
+ box-shadow: var(--shadow);
745
+ display: flex;
746
+ flex-direction: column;
747
+ }
748
+ .modal-header {
749
+ padding: 12px 14px;
750
+ border-bottom: 1px solid var(--border);
751
+ display: flex;
752
+ align-items: center;
753
+ justify-content: space-between;
754
+ gap: 10px;
755
+ }
756
+ .modal-header h2 {
757
+ margin: 0;
758
+ font-size: 13px;
759
+ font-weight: 650;
760
+ }
761
+ .modal-body {
762
+ display: grid;
763
+ grid-template-columns: 1fr 1fr;
764
+ gap: 12px;
765
+ padding: 12px;
766
+ overflow: auto;
767
+ }
768
+ .modal-pane {
769
+ border: 1px solid var(--border);
770
+ border-radius: 14px;
771
+ overflow: hidden;
772
+ background: rgba(0, 0, 0, 0.18);
773
+ }
774
+ .modal-pane .pane-title {
775
+ padding: 10px 12px;
776
+ border-bottom: 1px solid var(--border);
777
+ font-size: 12px;
778
+ color: var(--muted);
779
+ }
780
+ .modal-pane textarea {
781
+ border: none;
782
+ border-radius: 0;
783
+ background: transparent;
784
+ padding: 12px;
785
+ min-height: 320px;
786
+ max-height: none;
787
+ outline: none;
788
+ font-family: var(--mono);
789
+ font-size: 12px;
790
+ }
791
+ .modal-footer {
792
+ padding: 12px 14px;
793
+ border-top: 1px solid var(--border);
794
+ display: flex;
795
+ justify-content: flex-end;
796
+ gap: 10px;
797
+ }
798
+
799
+ /* Subagent card styles */
800
+ .subagent-card {
801
+ background: linear-gradient(
802
+ 135deg,
803
+ rgba(122, 162, 247, 0.04),
804
+ rgba(187, 154, 247, 0.03)
805
+ );
806
+ border-color: rgba(122, 162, 247, 0.2);
807
+ }
808
+
809
+ .subagent-header {
810
+ display: flex;
811
+ align-items: center;
812
+ justify-content: space-between;
813
+ padding: 10px 14px;
814
+ background: rgba(122, 162, 247, 0.06);
815
+ border-bottom: 1px solid rgba(122, 162, 247, 0.15);
816
+ }
817
+
818
+ .subagent-header.running {
819
+ background: linear-gradient(
820
+ 90deg,
821
+ rgba(122, 162, 247, 0.08),
822
+ rgba(187, 154, 247, 0.08),
823
+ rgba(122, 162, 247, 0.08)
824
+ );
825
+ background-size: 200% 100%;
826
+ animation: shimmer-bg 3s infinite linear;
827
+ }
828
+
829
+ @keyframes shimmer-bg {
830
+ 0% {
831
+ background-position: 200% 0;
832
+ }
833
+ 100% {
834
+ background-position: -200% 0;
835
+ }
836
+ }
837
+
838
+ .subagent-title {
839
+ display: flex;
840
+ align-items: center;
841
+ gap: 10px;
842
+ }
843
+
844
+ .subagent-label {
845
+ font-family: var(--mono);
846
+ font-size: 10px;
847
+ text-transform: uppercase;
848
+ letter-spacing: 0.08em;
849
+ padding: 4px 8px;
850
+ border-radius: 999px;
851
+ background: linear-gradient(
852
+ 135deg,
853
+ rgba(122, 162, 247, 0.25),
854
+ rgba(187, 154, 247, 0.2)
855
+ );
856
+ border: 1px solid rgba(122, 162, 247, 0.4);
857
+ color: var(--accent);
858
+ font-weight: 700;
859
+ }
860
+
861
+ .subagent-name {
862
+ font-size: 13px;
863
+ font-weight: 600;
864
+ color: var(--text);
865
+ }
866
+
867
+ .subagent-status-wrap {
868
+ display: flex;
869
+ align-items: center;
870
+ gap: 8px;
871
+ }
872
+
873
+ .subagent-spinner {
874
+ width: 14px;
875
+ height: 14px;
876
+ border: 2px solid rgba(122, 162, 247, 0.2);
877
+ border-top-color: var(--accent);
878
+ border-radius: 50%;
879
+ animation: spin 1s linear infinite;
880
+ }
881
+
882
+ @keyframes spin {
883
+ to {
884
+ transform: rotate(360deg);
885
+ }
886
+ }
887
+
888
+ .subagent-status {
889
+ font-size: 11px;
890
+ color: var(--muted);
891
+ font-weight: 500;
892
+ }
893
+
894
+ .subagent-task {
895
+ padding: 10px 14px;
896
+ background: rgba(0, 0, 0, 0.15);
897
+ border-bottom: 1px solid var(--border);
898
+ }
899
+
900
+ .subagent-task-label {
901
+ font-size: 10px;
902
+ text-transform: uppercase;
903
+ letter-spacing: 0.06em;
904
+ color: var(--muted);
905
+ margin-bottom: 4px;
906
+ font-weight: 600;
907
+ }
908
+
909
+ .subagent-task-text {
910
+ font-size: 13px;
911
+ line-height: 1.5;
912
+ color: var(--text);
913
+ white-space: pre-wrap;
914
+ word-break: break-word;
915
+ }
916
+
917
+ .subagent-params {
918
+ padding: 8px 14px;
919
+ background: rgba(0, 0, 0, 0.1);
920
+ border-bottom: 1px solid var(--border);
921
+ display: flex;
922
+ flex-direction: column;
923
+ gap: 4px;
924
+ }
925
+
926
+ .subagent-param {
927
+ font-family: var(--mono);
928
+ font-size: 11px;
929
+ color: rgba(255, 255, 255, 0.7);
930
+ padding: 4px 8px;
931
+ background: rgba(255, 255, 255, 0.03);
932
+ border-radius: 4px;
933
+ border: 1px solid rgba(255, 255, 255, 0.08);
934
+ }
935
+
936
+ .subagent-result {
937
+ padding: 10px 14px;
938
+ }
939
+
940
+ @media (max-width: 980px) {
941
+ .app {
942
+ grid-template-columns: 1fr;
943
+ }
944
+ .sidebar {
945
+ display: none;
946
+ }
947
+ .modal-body {
948
+ grid-template-columns: 1fr;
949
+ }
950
+ }
951
+
952
+ /* =============================================
953
+ Control Plane — shared base styles
954
+ ============================================= */
955
+
956
+ .control-plane {
957
+ display: flex;
958
+ flex-direction: column;
959
+ gap: 0;
960
+ height: 100%;
961
+ min-height: 0;
962
+ }
963
+
964
+ /* Top header bar */
965
+ .cp-header {
966
+ display: flex;
967
+ align-items: center;
968
+ justify-content: space-between;
969
+ gap: 12px;
970
+ padding: 12px 16px;
971
+ border-bottom: 1px solid var(--border);
972
+ flex-shrink: 0;
973
+ }
974
+
975
+ .cp-header h1 {
976
+ margin: 0;
977
+ font-size: 16px;
978
+ }
979
+
980
+ .cp-header-actions {
981
+ display: flex;
982
+ gap: 8px;
983
+ }
984
+
985
+ .cp-subtitle {
986
+ font-size: 13px;
987
+ color: var(--muted);
988
+ margin-top: 3px;
989
+ }
990
+
991
+ /* Body area below header — sidebar + main */
992
+ .cp-body {
993
+ display: flex;
994
+ flex: 1;
995
+ min-height: 0;
996
+ overflow: hidden;
997
+ }
998
+
999
+ /* =============================================
1000
+ PC Sidebar
1001
+ ============================================= */
1002
+
1003
+ .cp-sidebar {
1004
+ width: 260px;
1005
+ flex-shrink: 0;
1006
+ border-right: 1px solid var(--border);
1007
+ display: flex;
1008
+ flex-direction: column;
1009
+ overflow: hidden;
1010
+ background: var(--panel-2);
1011
+ }
1012
+
1013
+ .cp-sidebar-section-label {
1014
+ padding: 10px 12px 6px;
1015
+ font-size: 11px;
1016
+ font-weight: 700;
1017
+ color: var(--muted);
1018
+ text-transform: uppercase;
1019
+ letter-spacing: 0.08em;
1020
+ flex-shrink: 0;
1021
+ display: flex;
1022
+ align-items: center;
1023
+ gap: 6px;
1024
+ }
1025
+
1026
+ .cp-sidebar-workers-label {
1027
+ border-top: 1px solid var(--border);
1028
+ }
1029
+
1030
+ .cp-sidebar-workers-count {
1031
+ background: rgba(255, 255, 255, 0.08);
1032
+ border-radius: 999px;
1033
+ padding: 1px 7px;
1034
+ font-size: 11px;
1035
+ font-weight: 600;
1036
+ color: var(--muted);
1037
+ }
1038
+
1039
+ /* Broadcast summary section in sidebar */
1040
+ .cp-sidebar-broadcast-section {
1041
+ padding: 10px 12px 12px;
1042
+ border-bottom: 1px solid var(--border);
1043
+ flex-shrink: 0;
1044
+ display: flex;
1045
+ flex-direction: column;
1046
+ gap: 8px;
1047
+ }
1048
+
1049
+ .cp-sidebar-broadcast-target {
1050
+ font-size: 12px;
1051
+ color: var(--muted);
1052
+ }
1053
+
1054
+ .cp-sidebar-broadcast-btn {
1055
+ width: 100%;
1056
+ justify-content: center;
1057
+ }
1058
+
1059
+ /* Worker nav list inside sidebar */
1060
+ .cp-sidebar-workers {
1061
+ flex: 1;
1062
+ overflow-y: auto;
1063
+ padding: 4px 0 8px;
1064
+ }
1065
+
1066
+ .cp-sidebar-worker-item {
1067
+ display: flex;
1068
+ align-items: flex-start;
1069
+ gap: 8px;
1070
+ padding: 8px 12px;
1071
+ cursor: pointer;
1072
+ transition: background 0.12s;
1073
+ border-left: 2px solid transparent;
1074
+ }
1075
+
1076
+ .cp-sidebar-worker-item:hover {
1077
+ background: rgba(255, 255, 255, 0.04);
1078
+ }
1079
+
1080
+ .cp-sidebar-worker-item.active {
1081
+ background: rgba(122, 162, 247, 0.08);
1082
+ border-left-color: var(--accent);
1083
+ }
1084
+
1085
+ .cp-sidebar-worker-item input[type='checkbox'] {
1086
+ width: 14px;
1087
+ height: 14px;
1088
+ flex-shrink: 0;
1089
+ cursor: pointer;
1090
+ margin-top: 3px;
1091
+ }
1092
+
1093
+ .cp-sidebar-worker-info {
1094
+ flex: 1;
1095
+ min-width: 0;
1096
+ display: flex;
1097
+ flex-direction: column;
1098
+ gap: 2px;
1099
+ }
1100
+
1101
+ .cp-sidebar-worker-name {
1102
+ font-size: 13px;
1103
+ font-weight: 500;
1104
+ line-height: 1.4;
1105
+ word-break: break-word;
1106
+ }
1107
+
1108
+ .cp-sidebar-worker-url {
1109
+ font-family: var(--mono);
1110
+ font-size: 11px;
1111
+ color: var(--muted);
1112
+ word-break: break-all;
1113
+ line-height: 1.4;
1114
+ }
1115
+
1116
+ .cp-sidebar-worker-tags {
1117
+ font-size: 11px;
1118
+ color: rgba(187, 154, 247, 0.7);
1119
+ line-height: 1.4;
1120
+ }
1121
+
1122
+ .cp-sidebar-worker-status {
1123
+ flex-shrink: 0;
1124
+ margin-top: 2px;
1125
+ }
1126
+
1127
+ /* =============================================
1128
+ PC Broadcast Modal
1129
+ ============================================= */
1130
+
1131
+ .cp-broadcast-modal-backdrop {
1132
+ position: fixed;
1133
+ inset: 0;
1134
+ background: rgba(0, 0, 0, 0.6);
1135
+ z-index: 300;
1136
+ display: flex;
1137
+ align-items: center;
1138
+ justify-content: center;
1139
+ padding: 20px;
1140
+ backdrop-filter: blur(3px);
1141
+ }
1142
+
1143
+ .cp-broadcast-modal {
1144
+ width: min(860px, 96vw);
1145
+ max-height: 88vh;
1146
+ background: rgba(16, 21, 33, 0.98);
1147
+ border: 1px solid var(--border);
1148
+ border-radius: 16px;
1149
+ box-shadow: var(--shadow);
1150
+ display: flex;
1151
+ flex-direction: column;
1152
+ overflow: hidden;
1153
+ }
1154
+
1155
+ .cp-broadcast-modal-header {
1156
+ display: flex;
1157
+ align-items: center;
1158
+ justify-content: space-between;
1159
+ padding: 14px 18px;
1160
+ border-bottom: 1px solid var(--border);
1161
+ flex-shrink: 0;
1162
+ }
1163
+
1164
+ .cp-broadcast-modal-title {
1165
+ font-size: 15px;
1166
+ font-weight: 650;
1167
+ }
1168
+
1169
+ .cp-broadcast-modal-close {
1170
+ background: none;
1171
+ border: none;
1172
+ color: var(--muted);
1173
+ font-size: 16px;
1174
+ cursor: pointer;
1175
+ padding: 4px 8px;
1176
+ border-radius: 6px;
1177
+ line-height: 1;
1178
+ }
1179
+
1180
+ .cp-broadcast-modal-close:hover {
1181
+ background: rgba(255, 255, 255, 0.06);
1182
+ color: var(--text);
1183
+ }
1184
+
1185
+ .cp-broadcast-modal-body {
1186
+ display: grid;
1187
+ grid-template-columns: 1fr 320px;
1188
+ gap: 0;
1189
+ flex: 1;
1190
+ min-height: 0;
1191
+ overflow: hidden;
1192
+ }
1193
+
1194
+ .cp-broadcast-modal-left {
1195
+ display: flex;
1196
+ flex-direction: column;
1197
+ padding: 14px 18px;
1198
+ gap: 10px;
1199
+ border-right: 1px solid var(--border);
1200
+ min-height: 0;
1201
+ }
1202
+
1203
+ .cp-broadcast-modal-right {
1204
+ display: flex;
1205
+ flex-direction: column;
1206
+ min-height: 0;
1207
+ overflow: hidden;
1208
+ }
1209
+
1210
+ .cp-broadcast-modal-label {
1211
+ font-size: 11px;
1212
+ font-weight: 700;
1213
+ color: var(--muted);
1214
+ text-transform: uppercase;
1215
+ letter-spacing: 0.08em;
1216
+ display: flex;
1217
+ align-items: center;
1218
+ justify-content: space-between;
1219
+ gap: 8px;
1220
+ flex-shrink: 0;
1221
+ }
1222
+
1223
+ .cp-broadcast-modal-node-actions {
1224
+ display: flex;
1225
+ gap: 6px;
1226
+ }
1227
+
1228
+ .cp-broadcast-modal-textarea {
1229
+ flex: 1;
1230
+ min-height: 160px;
1231
+ resize: none;
1232
+ border: 1px solid var(--border);
1233
+ border-radius: var(--radius-sm);
1234
+ background: rgba(255, 255, 255, 0.03);
1235
+ color: var(--text);
1236
+ padding: 10px 12px;
1237
+ font-size: 14px;
1238
+ line-height: 1.5;
1239
+ }
1240
+
1241
+ .cp-broadcast-modal-textarea:focus {
1242
+ outline: none;
1243
+ border-color: rgba(122, 162, 247, 0.5);
1244
+ box-shadow: 0 0 0 3px rgba(122, 162, 247, 0.1);
1245
+ }
1246
+
1247
+ .cp-broadcast-modal-footer {
1248
+ display: flex;
1249
+ align-items: center;
1250
+ justify-content: space-between;
1251
+ gap: 10px;
1252
+ flex-shrink: 0;
1253
+ }
1254
+
1255
+ .cp-broadcast-modal-target {
1256
+ font-size: 12px;
1257
+ color: var(--muted);
1258
+ }
1259
+
1260
+ .cp-broadcast-modal-node-list {
1261
+ flex: 1;
1262
+ overflow-y: auto;
1263
+ padding: 8px 0;
1264
+ }
1265
+
1266
+ .cp-broadcast-modal-node-item {
1267
+ display: flex;
1268
+ align-items: flex-start;
1269
+ gap: 10px;
1270
+ padding: 8px 16px;
1271
+ cursor: pointer;
1272
+ transition: background 0.1s;
1273
+ }
1274
+
1275
+ .cp-broadcast-modal-node-item:hover {
1276
+ background: rgba(255, 255, 255, 0.04);
1277
+ }
1278
+
1279
+ .cp-broadcast-modal-node-item input[type='checkbox'] {
1280
+ width: 15px;
1281
+ height: 15px;
1282
+ flex-shrink: 0;
1283
+ cursor: pointer;
1284
+ margin-top: 2px;
1285
+ }
1286
+
1287
+ .cp-broadcast-modal-node-info {
1288
+ display: flex;
1289
+ flex-direction: column;
1290
+ gap: 2px;
1291
+ min-width: 0;
1292
+ }
1293
+
1294
+ .cp-broadcast-modal-node-name {
1295
+ font-size: 13px;
1296
+ font-weight: 500;
1297
+ line-height: 1.4;
1298
+ word-break: break-word;
1299
+ }
1300
+
1301
+ .cp-broadcast-modal-node-url {
1302
+ font-family: var(--mono);
1303
+ font-size: 11px;
1304
+ color: var(--muted);
1305
+ word-break: break-all;
1306
+ }
1307
+
1308
+ .cp-broadcast-modal-node-tags {
1309
+ font-size: 11px;
1310
+ color: rgba(187, 154, 247, 0.7);
1311
+ }
1312
+
1313
+ /* =============================================
1314
+ PC Main area — worker grid
1315
+ ============================================= */
1316
+
1317
+ .cp-main {
1318
+ flex: 1;
1319
+ min-width: 0;
1320
+ display: flex;
1321
+ flex-direction: column;
1322
+ overflow: hidden;
1323
+ }
1324
+
1325
+ .cp-workers {
1326
+ flex: 1;
1327
+ overflow: auto;
1328
+ display: flex;
1329
+ flex-direction: column;
1330
+ }
1331
+
1332
+ .cp-workers-header {
1333
+ padding: 12px 16px 0;
1334
+ font-size: 11px;
1335
+ color: var(--muted);
1336
+ text-transform: uppercase;
1337
+ letter-spacing: 0.08em;
1338
+ flex-shrink: 0;
1339
+ display: flex;
1340
+ align-items: center;
1341
+ justify-content: space-between;
1342
+ }
1343
+
1344
+ .cp-workers-header .btn {
1345
+ text-transform: none;
1346
+ letter-spacing: normal;
1347
+ font-size: 11px;
1348
+ padding: 2px 8px;
1349
+ }
1350
+
1351
+ .cp-worker-grid {
1352
+ display: grid;
1353
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
1354
+ gap: 12px;
1355
+ padding: 12px 16px 16px;
1356
+ align-content: start;
1357
+ }
1358
+
1359
+ /* =============================================
1360
+ Worker task cards
1361
+ ============================================= */
1362
+
1363
+ .cp-task-card {
1364
+ border: 2px solid var(--border);
1365
+ border-radius: var(--radius);
1366
+ background: rgba(255, 255, 255, 0.02);
1367
+ overflow: hidden;
1368
+ display: flex;
1369
+ flex-direction: column;
1370
+ cursor: pointer;
1371
+ transition: border-color 0.15s ease;
1372
+ max-height: 30vh;
1373
+ min-height: 180px;
1374
+ }
1375
+
1376
+ .cp-task-card:hover {
1377
+ border-color: rgba(255, 255, 255, 0.2);
1378
+ }
1379
+
1380
+ .cp-task-card.selected {
1381
+ border-color: var(--ok);
1382
+ }
1383
+
1384
+ .cp-task-card.error {
1385
+ border-color: var(--err);
1386
+ }
1387
+
1388
+ .cp-task-card.selected.error {
1389
+ border-color: var(--err);
1390
+ }
1391
+
1392
+ .cp-task-header {
1393
+ display: flex;
1394
+ flex-direction: column;
1395
+ gap: 6px;
1396
+ padding: 8px 10px;
1397
+ border-bottom: 1px solid var(--border);
1398
+ flex-shrink: 0;
1399
+ }
1400
+
1401
+ .cp-task-header-top {
1402
+ display: flex;
1403
+ align-items: flex-start;
1404
+ justify-content: space-between;
1405
+ gap: 8px;
1406
+ }
1407
+
1408
+ .cp-task-header-left {
1409
+ display: flex;
1410
+ align-items: flex-start;
1411
+ gap: 8px;
1412
+ min-width: 0;
1413
+ flex: 1;
1414
+ }
1415
+
1416
+ .cp-task-header-info {
1417
+ min-width: 0;
1418
+ flex: 1;
1419
+ display: flex;
1420
+ flex-direction: column;
1421
+ gap: 2px;
1422
+ /* Keep title + URL as two explicit lines; do not clip the link row away */
1423
+ overflow: visible;
1424
+ }
1425
+
1426
+ .cp-task-name {
1427
+ font-weight: 600;
1428
+ font-size: 13px;
1429
+ line-height: 1.35;
1430
+ /* Line 1: title only; URL is always the next sibling on line 2 */
1431
+ overflow: hidden;
1432
+ text-overflow: ellipsis;
1433
+ white-space: nowrap;
1434
+ }
1435
+
1436
+ .cp-task-url {
1437
+ font-size: 11px;
1438
+ color: var(--muted);
1439
+ display: block;
1440
+ line-height: 1.35;
1441
+ word-break: break-all;
1442
+ /* Second line dedicated to link; wrap instead of single-line ellipsis */
1443
+ overflow-wrap: anywhere;
1444
+ }
1445
+
1446
+ .cp-task-meta {
1447
+ display: flex;
1448
+ flex-direction: row;
1449
+ align-items: center;
1450
+ gap: 6px;
1451
+ font-size: 11px;
1452
+ color: var(--muted);
1453
+ flex-shrink: 0;
1454
+ margin-left: auto;
1455
+ }
1456
+
1457
+ .cp-conn {
1458
+ padding: 2px 6px;
1459
+ border-radius: 6px;
1460
+ border: 1px solid var(--border);
1461
+ font-size: 10px;
1462
+ color: var(--muted);
1463
+ text-transform: uppercase;
1464
+ }
1465
+
1466
+ .cp-conn.connected {
1467
+ color: var(--ok);
1468
+ border-color: rgba(158, 206, 106, 0.4);
1469
+ }
1470
+
1471
+ .cp-conn.disconnected {
1472
+ color: var(--err);
1473
+ border-color: rgba(247, 118, 142, 0.4);
1474
+ }
1475
+
1476
+ .cp-queue,
1477
+ .cp-activity {
1478
+ font-size: 11px;
1479
+ }
1480
+
1481
+ /* One row: Cancel / Refresh / Retry + idle activity timestamp */
1482
+ .cp-task-actions-row {
1483
+ display: flex;
1484
+ flex-direction: row;
1485
+ flex-wrap: wrap;
1486
+ align-items: center;
1487
+ gap: 8px;
1488
+ }
1489
+
1490
+ .cp-task-actions {
1491
+ display: flex;
1492
+ flex-direction: row;
1493
+ gap: 6px;
1494
+ flex-shrink: 0;
1495
+ flex-wrap: wrap;
1496
+ }
1497
+
1498
+ .cp-task-actions-time {
1499
+ flex-shrink: 0;
1500
+ }
1501
+
1502
+ .cp-task-actions .btn {
1503
+ padding: 2px 8px;
1504
+ font-size: 11px;
1505
+ }
1506
+
1507
+ .cp-task-error {
1508
+ padding: 6px 12px;
1509
+ font-size: 12px;
1510
+ color: var(--err);
1511
+ border-bottom: 1px solid var(--border);
1512
+ flex-shrink: 0;
1513
+ }
1514
+
1515
+ .cp-task-notice {
1516
+ padding: 6px 12px;
1517
+ font-size: 12px;
1518
+ color: var(--warn);
1519
+ border-bottom: 1px solid var(--border);
1520
+ background: rgba(224, 175, 104, 0.06);
1521
+ white-space: pre-wrap;
1522
+ flex-shrink: 0;
1523
+ }
1524
+
1525
+ .cp-task-body {
1526
+ padding: 10px 12px;
1527
+ overflow: auto;
1528
+ flex: 1;
1529
+ min-height: 60px;
1530
+ }
1531
+
1532
+ .cp-task-message,
1533
+ .cp-task-tool {
1534
+ margin-bottom: 10px;
1535
+ }
1536
+
1537
+ .cp-task-input {
1538
+ display: flex;
1539
+ gap: 8px;
1540
+ padding: 10px 12px;
1541
+ border-top: 1px solid var(--border);
1542
+ background: rgba(0, 0, 0, 0.1);
1543
+ flex-shrink: 0;
1544
+ }
1545
+
1546
+ .cp-task-textarea {
1547
+ flex: 1;
1548
+ min-height: 40px;
1549
+ max-height: 80px;
1550
+ resize: vertical;
1551
+ border: 1px solid var(--border);
1552
+ border-radius: var(--radius-sm);
1553
+ background: rgba(255, 255, 255, 0.03);
1554
+ color: var(--text);
1555
+ padding: 8px 10px;
1556
+ font-size: 13px;
1557
+ line-height: 1.4;
1558
+ }
1559
+
1560
+ .cp-task-input .btn {
1561
+ align-self: flex-end;
1562
+ }
1563
+
1564
+ /* =============================================
1565
+ Endpoint registry Drawer (right side)
1566
+ ============================================= */
1567
+
1568
+ .cp-drawer {
1569
+ position: fixed;
1570
+ top: 0;
1571
+ right: 0;
1572
+ bottom: 0;
1573
+ width: 600px;
1574
+ max-width: 100%;
1575
+ z-index: 100;
1576
+ background: var(--panel-2);
1577
+ border-left: 1px solid var(--border);
1578
+ box-shadow: -4px 0 20px rgba(0, 0, 0, 0.5);
1579
+ transform: translateX(100%);
1580
+ transition: transform 0.2s ease;
1581
+ display: flex;
1582
+ flex-direction: column;
1583
+ }
1584
+
1585
+ .cp-drawer.open {
1586
+ transform: translateX(0);
1587
+ }
1588
+
1589
+ .cp-drawer-backdrop {
1590
+ position: fixed;
1591
+ inset: 0;
1592
+ background: rgba(0, 0, 0, 0.5);
1593
+ z-index: 90;
1594
+ backdrop-filter: blur(2px);
1595
+ }
1596
+
1597
+ .cp-drawer-header {
1598
+ display: flex;
1599
+ align-items: center;
1600
+ justify-content: space-between;
1601
+ gap: 12px;
1602
+ padding: 14px 16px;
1603
+ border-bottom: 1px solid var(--border);
1604
+ position: sticky;
1605
+ top: 0;
1606
+ background: var(--panel-2);
1607
+ z-index: 10;
1608
+ }
1609
+
1610
+ .cp-drawer-header h2 {
1611
+ margin: 0;
1612
+ font-size: 14px;
1613
+ }
1614
+
1615
+ .cp-drawer-toolbar {
1616
+ display: flex;
1617
+ flex-direction: column;
1618
+ gap: 8px;
1619
+ padding: 12px 16px;
1620
+ border-bottom: 1px solid var(--border);
1621
+ }
1622
+
1623
+ .cp-drawer-content {
1624
+ flex: 1;
1625
+ overflow: auto;
1626
+ padding: 12px 16px;
1627
+ }
1628
+
1629
+ /* =============================================
1630
+ Shared form elements
1631
+ ============================================= */
1632
+
1633
+ .cp-input,
1634
+ .cp-select {
1635
+ background: rgba(255, 255, 255, 0.03);
1636
+ border: 1px solid var(--border);
1637
+ color: var(--text);
1638
+ border-radius: var(--radius-sm);
1639
+ padding: 8px 10px;
1640
+ font-size: 13px;
1641
+ width: 100%;
1642
+ }
1643
+
1644
+ .cp-select {
1645
+ min-width: 100px;
1646
+ }
1647
+
1648
+ .cp-content {
1649
+ padding: 12px 16px;
1650
+ overflow: auto;
1651
+ flex: 1;
1652
+ }
1653
+
1654
+ .cp-list {
1655
+ display: flex;
1656
+ flex-direction: column;
1657
+ gap: 10px;
1658
+ }
1659
+
1660
+ .cp-row {
1661
+ display: flex;
1662
+ justify-content: space-between;
1663
+ gap: 12px;
1664
+ padding: 10px 12px;
1665
+ border: 1px solid var(--border);
1666
+ border-radius: var(--radius);
1667
+ background: rgba(255, 255, 255, 0.03);
1668
+ }
1669
+
1670
+ .cp-select-box {
1671
+ display: flex;
1672
+ align-items: flex-start;
1673
+ padding-top: 3px;
1674
+ }
1675
+
1676
+ .cp-select-box input {
1677
+ width: 15px;
1678
+ height: 15px;
1679
+ }
1680
+
1681
+ .cp-row-main {
1682
+ flex: 1;
1683
+ min-width: 0;
1684
+ }
1685
+
1686
+ .cp-row-title {
1687
+ display: flex;
1688
+ flex-direction: column;
1689
+ gap: 3px;
1690
+ }
1691
+
1692
+ .cp-name {
1693
+ font-weight: 600;
1694
+ font-size: 13px;
1695
+ }
1696
+
1697
+ .cp-url {
1698
+ font-family: var(--mono);
1699
+ font-size: 11px;
1700
+ color: var(--muted);
1701
+ word-break: break-all;
1702
+ }
1703
+
1704
+ .cp-row-meta {
1705
+ display: flex;
1706
+ align-items: center;
1707
+ gap: 10px;
1708
+ flex-wrap: wrap;
1709
+ margin-top: 6px;
1710
+ }
1711
+
1712
+ .cp-tags {
1713
+ display: flex;
1714
+ gap: 6px;
1715
+ flex-wrap: wrap;
1716
+ }
1717
+
1718
+ .cp-tag {
1719
+ padding: 2px 6px;
1720
+ border: 1px solid var(--border);
1721
+ border-radius: 6px;
1722
+ font-size: 11px;
1723
+ color: var(--muted);
1724
+ }
1725
+
1726
+ .cp-tag.muted {
1727
+ opacity: 0.6;
1728
+ }
1729
+
1730
+ .cp-actions {
1731
+ display: flex;
1732
+ gap: 6px;
1733
+ align-items: center;
1734
+ }
1735
+
1736
+ .cp-health {
1737
+ font-size: 11px;
1738
+ padding: 2px 6px;
1739
+ border-radius: 6px;
1740
+ border: 1px solid var(--border);
1741
+ color: var(--muted);
1742
+ }
1743
+
1744
+ .cp-health.ok {
1745
+ color: var(--ok);
1746
+ border-color: rgba(158, 206, 106, 0.4);
1747
+ }
1748
+
1749
+ .cp-health.err {
1750
+ color: var(--err);
1751
+ border-color: rgba(247, 118, 142, 0.4);
1752
+ }
1753
+
1754
+ .cp-health.pending {
1755
+ color: var(--muted);
1756
+ }
1757
+
1758
+ .cp-health-ms {
1759
+ margin-left: 6px;
1760
+ color: var(--muted);
1761
+ font-size: 11px;
1762
+ }
1763
+
1764
+ .cp-pagination {
1765
+ display: flex;
1766
+ align-items: center;
1767
+ justify-content: space-between;
1768
+ gap: 10px;
1769
+ padding: 10px 16px;
1770
+ border-top: 1px solid var(--border);
1771
+ }
1772
+
1773
+ .cp-page-info,
1774
+ .cp-page-number {
1775
+ font-size: 12px;
1776
+ color: var(--muted);
1777
+ }
1778
+
1779
+ .cp-page-controls {
1780
+ display: flex;
1781
+ align-items: center;
1782
+ gap: 8px;
1783
+ }
1784
+
1785
+ .cp-modal-body {
1786
+ display: flex;
1787
+ flex-direction: column;
1788
+ gap: 10px;
1789
+ padding: 12px;
1790
+ }
1791
+
1792
+ .cp-label {
1793
+ display: flex;
1794
+ flex-direction: column;
1795
+ gap: 6px;
1796
+ font-size: 13px;
1797
+ color: var(--muted);
1798
+ }
1799
+
1800
+ .cp-modal-actions {
1801
+ display: flex;
1802
+ gap: 8px;
1803
+ }
1804
+
1805
+ .cp-error {
1806
+ color: var(--err);
1807
+ font-size: 13px;
1808
+ margin-top: 6px;
1809
+ }
1810
+
1811
+ .cp-loading,
1812
+ .cp-empty {
1813
+ color: var(--muted);
1814
+ font-size: 13px;
1815
+ padding: 10px 0;
1816
+ }
1817
+
1818
+ /* =============================================
1819
+ Mobile — Worker compact list card
1820
+ ============================================= */
1821
+
1822
+ .cp-task-card-compact {
1823
+ display: flex;
1824
+ align-items: center;
1825
+ gap: 10px;
1826
+ padding: 12px 14px;
1827
+ border: 1px solid var(--border);
1828
+ border-radius: var(--radius);
1829
+ background: rgba(255, 255, 255, 0.02);
1830
+ cursor: pointer;
1831
+ transition: background 0.12s;
1832
+ -webkit-tap-highlight-color: transparent;
1833
+ }
1834
+
1835
+ .cp-task-card-compact:active {
1836
+ background: rgba(255, 255, 255, 0.05);
1837
+ }
1838
+
1839
+ .cp-task-card-compact.error {
1840
+ border-color: rgba(247, 118, 142, 0.35);
1841
+ }
1842
+
1843
+ .cp-task-card-compact input[type='checkbox'] {
1844
+ width: 18px;
1845
+ height: 18px;
1846
+ flex-shrink: 0;
1847
+ cursor: pointer;
1848
+ }
1849
+
1850
+ .cp-task-card-compact-body {
1851
+ flex: 1;
1852
+ min-width: 0;
1853
+ }
1854
+
1855
+ .cp-task-card-compact-top {
1856
+ display: flex;
1857
+ align-items: center;
1858
+ gap: 8px;
1859
+ margin-bottom: 4px;
1860
+ }
1861
+
1862
+ .cp-task-card-compact-name {
1863
+ font-size: 14px;
1864
+ font-weight: 600;
1865
+ flex: 1;
1866
+ min-width: 0;
1867
+ overflow: hidden;
1868
+ text-overflow: ellipsis;
1869
+ white-space: nowrap;
1870
+ }
1871
+
1872
+ .cp-task-card-compact-meta {
1873
+ font-size: 11px;
1874
+ color: var(--muted);
1875
+ display: flex;
1876
+ gap: 8px;
1877
+ }
1878
+
1879
+ .cp-task-card-compact-preview {
1880
+ font-size: 12px;
1881
+ color: var(--muted);
1882
+ overflow: hidden;
1883
+ text-overflow: ellipsis;
1884
+ white-space: nowrap;
1885
+ }
1886
+
1887
+ .cp-task-card-compact-chevron {
1888
+ color: var(--muted);
1889
+ flex-shrink: 0;
1890
+ font-size: 16px;
1891
+ opacity: 0.5;
1892
+ }
1893
+
1894
+ /* =============================================
1895
+ Mobile — Detail view
1896
+ ============================================= */
1897
+
1898
+ .cp-mobile-detail {
1899
+ display: flex;
1900
+ flex-direction: column;
1901
+ flex: 1;
1902
+ min-height: 0;
1903
+ overflow: hidden;
1904
+ }
1905
+
1906
+ .cp-mobile-header-title {
1907
+ font-size: 16px;
1908
+ font-weight: 700;
1909
+ margin: 0;
1910
+ }
1911
+
1912
+ .cp-mobile-back-btn {
1913
+ display: flex;
1914
+ align-items: center;
1915
+ gap: 4px;
1916
+ background: none;
1917
+ border: none;
1918
+ color: var(--accent);
1919
+ font-size: 15px;
1920
+ cursor: pointer;
1921
+ padding: 4px 0;
1922
+ flex-shrink: 0;
1923
+ }
1924
+
1925
+ .cp-mobile-detail-title {
1926
+ font-size: 15px;
1927
+ font-weight: 600;
1928
+ overflow: hidden;
1929
+ text-overflow: ellipsis;
1930
+ white-space: nowrap;
1931
+ }
1932
+
1933
+ .cp-mobile-detail-feed {
1934
+ flex: 1;
1935
+ overflow: auto;
1936
+ padding: 10px 14px;
1937
+ min-height: 0;
1938
+ }
1939
+
1940
+ .cp-mobile-detail-input {
1941
+ display: flex;
1942
+ gap: 8px;
1943
+ padding: 10px 14px;
1944
+ border-top: 1px solid var(--border);
1945
+ background: rgba(0, 0, 0, 0.1);
1946
+ flex-shrink: 0;
1947
+ }
1948
+
1949
+ .cp-mobile-detail-textarea {
1950
+ flex: 1;
1951
+ min-height: 44px;
1952
+ max-height: 120px;
1953
+ resize: none;
1954
+ border: 1px solid var(--border);
1955
+ border-radius: var(--radius-sm);
1956
+ background: rgba(255, 255, 255, 0.03);
1957
+ color: var(--text);
1958
+ padding: 10px 12px;
1959
+ font-size: 14px;
1960
+ line-height: 1.4;
1961
+ }
1962
+
1963
+ .cp-mobile-detail-send {
1964
+ align-self: flex-end;
1965
+ min-height: 44px;
1966
+ padding: 0 18px;
1967
+ }
1968
+
1969
+ /* =============================================
1970
+ Mobile — Bottom Tab Bar
1971
+ ============================================= */
1972
+
1973
+ .cp-mobile-tab-bar {
1974
+ display: none;
1975
+ flex-shrink: 0;
1976
+ border-top: 1px solid var(--border);
1977
+ background: var(--panel-2);
1978
+ padding-bottom: env(safe-area-inset-bottom, 0px);
1979
+ }
1980
+
1981
+ .cp-mobile-tab {
1982
+ flex: 1;
1983
+ display: flex;
1984
+ flex-direction: column;
1985
+ align-items: center;
1986
+ justify-content: center;
1987
+ gap: 4px;
1988
+ padding: 10px 4px;
1989
+ background: none;
1990
+ border: none;
1991
+ color: var(--muted);
1992
+ font-size: 11px;
1993
+ cursor: pointer;
1994
+ position: relative;
1995
+ -webkit-tap-highlight-color: transparent;
1996
+ transition: color 0.12s;
1997
+ }
1998
+
1999
+ .cp-mobile-tab.active {
2000
+ color: var(--accent);
2001
+ }
2002
+
2003
+ .cp-mobile-tab svg {
2004
+ flex-shrink: 0;
2005
+ }
2006
+
2007
+ .cp-mobile-tab-broadcast {
2008
+ color: var(--muted);
2009
+ }
2010
+
2011
+ .cp-mobile-tab-badge {
2012
+ position: absolute;
2013
+ top: 6px;
2014
+ right: calc(50% - 18px);
2015
+ background: var(--accent);
2016
+ color: #0f111a;
2017
+ font-size: 10px;
2018
+ font-weight: 700;
2019
+ border-radius: 999px;
2020
+ padding: 1px 5px;
2021
+ min-width: 16px;
2022
+ text-align: center;
2023
+ line-height: 1.4;
2024
+ }
2025
+
2026
+ /* =============================================
2027
+ Mobile — Broadcast tab (inline, full height)
2028
+ ============================================= */
2029
+
2030
+ .cp-mobile-broadcast-tab {
2031
+ flex: 1;
2032
+ display: flex;
2033
+ flex-direction: column;
2034
+ overflow: hidden;
2035
+ min-height: 0;
2036
+ }
2037
+
2038
+ .cp-broadcast-sheet-nodes {
2039
+ border-bottom: 1px solid var(--border);
2040
+ overflow: hidden;
2041
+ flex: 1;
2042
+ display: flex;
2043
+ flex-direction: column;
2044
+ min-height: 0;
2045
+ }
2046
+
2047
+ .cp-broadcast-sheet-nodes-header {
2048
+ display: flex;
2049
+ align-items: center;
2050
+ justify-content: space-between;
2051
+ gap: 8px;
2052
+ padding: 10px 16px;
2053
+ border-bottom: 1px solid var(--border);
2054
+ background: rgba(255, 255, 255, 0.02);
2055
+ flex-shrink: 0;
2056
+ }
2057
+
2058
+ .cp-broadcast-sheet-subtitle {
2059
+ font-size: 13px;
2060
+ color: var(--muted);
2061
+ }
2062
+
2063
+ .cp-broadcast-sheet-node-list {
2064
+ overflow-y: auto;
2065
+ flex: 1;
2066
+ }
2067
+
2068
+ .cp-broadcast-sheet-node-item {
2069
+ display: flex;
2070
+ align-items: flex-start;
2071
+ gap: 12px;
2072
+ padding: 12px 16px;
2073
+ cursor: pointer;
2074
+ border-bottom: 1px solid rgba(255, 255, 255, 0.04);
2075
+ -webkit-tap-highlight-color: transparent;
2076
+ }
2077
+
2078
+ .cp-broadcast-sheet-node-item:active {
2079
+ background: rgba(255, 255, 255, 0.04);
2080
+ }
2081
+
2082
+ .cp-broadcast-sheet-node-item:last-child {
2083
+ border-bottom: none;
2084
+ }
2085
+
2086
+ .cp-broadcast-sheet-node-item input[type='checkbox'] {
2087
+ width: 18px;
2088
+ height: 18px;
2089
+ flex-shrink: 0;
2090
+ margin-top: 2px;
2091
+ cursor: pointer;
2092
+ }
2093
+
2094
+ .cp-broadcast-sheet-node-info {
2095
+ display: flex;
2096
+ flex-direction: column;
2097
+ gap: 3px;
2098
+ min-width: 0;
2099
+ }
2100
+
2101
+ .cp-broadcast-sheet-node-name {
2102
+ font-size: 14px;
2103
+ font-weight: 500;
2104
+ word-break: break-word;
2105
+ line-height: 1.4;
2106
+ }
2107
+
2108
+ .cp-broadcast-sheet-node-url {
2109
+ font-family: var(--mono);
2110
+ font-size: 12px;
2111
+ color: var(--muted);
2112
+ word-break: break-all;
2113
+ }
2114
+
2115
+ .cp-broadcast-sheet-compose {
2116
+ padding: 12px 16px;
2117
+ border-top: 1px solid var(--border);
2118
+ display: flex;
2119
+ flex-direction: column;
2120
+ gap: 10px;
2121
+ flex-shrink: 0;
2122
+ padding-bottom: calc(12px + env(safe-area-inset-bottom, 0px));
2123
+ }
2124
+
2125
+ .cp-broadcast-sheet-textarea {
2126
+ width: 100%;
2127
+ min-height: 80px;
2128
+ max-height: 160px;
2129
+ resize: none;
2130
+ border: 1px solid var(--border);
2131
+ border-radius: var(--radius-sm);
2132
+ background: rgba(255, 255, 255, 0.03);
2133
+ color: var(--text);
2134
+ padding: 10px 12px;
2135
+ font-size: 14px;
2136
+ line-height: 1.4;
2137
+ }
2138
+
2139
+ .cp-broadcast-sheet-footer {
2140
+ display: flex;
2141
+ gap: 10px;
2142
+ }
2143
+
2144
+ .cp-broadcast-sheet-footer .btn {
2145
+ flex: 1;
2146
+ min-height: 44px;
2147
+ font-size: 14px;
2148
+ }
2149
+
2150
+ /* =============================================
2151
+ Mobile — Worker list view
2152
+ ============================================= */
2153
+
2154
+ .cp-mobile-list {
2155
+ flex: 1;
2156
+ overflow-y: auto;
2157
+ padding: 10px 12px;
2158
+ display: flex;
2159
+ flex-direction: column;
2160
+ gap: 8px;
2161
+ }
2162
+
2163
+ /* =============================================
2164
+ Mobile — Endpoints tab
2165
+ ============================================= */
2166
+
2167
+ .cp-mobile-endpoints-tab {
2168
+ flex: 1;
2169
+ display: flex;
2170
+ flex-direction: column;
2171
+ overflow: hidden;
2172
+ min-height: 0;
2173
+ }
2174
+
2175
+ .cp-mobile-endpoints-toolbar {
2176
+ padding: 10px 14px;
2177
+ border-bottom: 1px solid var(--border);
2178
+ flex-shrink: 0;
2179
+ }
2180
+
2181
+ /* =============================================
2182
+ Responsive breakpoints
2183
+ ============================================= */
2184
+
2185
+ /* Desktop: sidebar + broadcast modal, no mobile elements */
2186
+ @media (min-width: 769px) {
2187
+ .cp-sidebar {
2188
+ display: flex;
2189
+ }
2190
+ .cp-header-mobile,
2191
+ .cp-mobile-list,
2192
+ .cp-mobile-detail,
2193
+ .cp-mobile-tab-bar,
2194
+ .cp-mobile-endpoints-tab,
2195
+ .cp-mobile-broadcast-tab {
2196
+ display: none !important;
2197
+ }
2198
+ .cp-header-pc {
2199
+ display: flex;
2200
+ }
2201
+ }
2202
+
2203
+ /* Mobile: bottom tabs, no sidebar */
2204
+ @media (max-width: 768px) {
2205
+ .app {
2206
+ padding: 0;
2207
+ }
2208
+
2209
+ .cp-header-pc {
2210
+ display: none !important;
2211
+ }
2212
+
2213
+ .cp-header-mobile {
2214
+ display: flex;
2215
+ }
2216
+
2217
+ .cp-sidebar {
2218
+ display: none;
2219
+ }
2220
+
2221
+ .cp-main {
2222
+ display: none;
2223
+ }
2224
+
2225
+ .cp-mobile-tab-bar {
2226
+ display: flex;
2227
+ }
2228
+
2229
+ /* Body fills between header and tab bar */
2230
+ .cp-body {
2231
+ flex: 1;
2232
+ min-height: 0;
2233
+ overflow: hidden;
2234
+ position: relative;
2235
+ }
2236
+
2237
+ /* Drawer goes full screen on mobile */
2238
+ .cp-drawer {
2239
+ inset: 0;
2240
+ width: 100%;
2241
+ max-width: none;
2242
+ border-radius: 0;
2243
+ border: none;
2244
+ }
2245
+ .cp-drawer.open {
2246
+ width: 100%;
2247
+ }
2248
+
2249
+ /* Endpoint list rows stack vertically */
2250
+ .cp-row {
2251
+ flex-direction: column;
2252
+ gap: 8px;
2253
+ }
2254
+ .cp-actions {
2255
+ margin-top: 0;
2256
+ justify-content: flex-start;
2257
+ flex-wrap: wrap;
2258
+ gap: 8px;
2259
+ }
2260
+ .cp-actions .btn {
2261
+ min-height: 40px;
2262
+ flex: 1;
2263
+ }
2264
+
2265
+ .cp-input,
2266
+ .cp-select {
2267
+ min-height: 40px;
2268
+ font-size: 14px;
2269
+ }
2270
+
2271
+ .btn {
2272
+ min-height: 38px;
2273
+ }
2274
+
2275
+ /* Broadcast modal hidden on mobile (use sheet instead) */
2276
+ .cp-broadcast-modal-backdrop {
2277
+ display: none !important;
2278
+ }
2279
+ }
2280
+
2281
+ /* ─── Rollout Page ──────────────────────────────────────────────────────────── */
2282
+
2283
+ .rollout-app {
2284
+ display: flex;
2285
+ flex-direction: column;
2286
+ height: 100%;
2287
+ background: var(--bg);
2288
+ }
2289
+
2290
+ .rollout-stats {
2291
+ display: flex;
2292
+ gap: 20px;
2293
+ padding: 14px 24px;
2294
+ border-bottom: 1px solid var(--border);
2295
+ background: var(--panel);
2296
+ }
2297
+ .rollout-stat {
2298
+ text-align: center;
2299
+ min-width: 72px;
2300
+ }
2301
+ .rollout-stat-value {
2302
+ font-size: 22px;
2303
+ font-weight: 700;
2304
+ font-variant-numeric: tabular-nums;
2305
+ color: var(--text);
2306
+ }
2307
+ .rollout-stat-label {
2308
+ font-size: 11px;
2309
+ color: var(--muted);
2310
+ text-transform: uppercase;
2311
+ letter-spacing: 0.5px;
2312
+ margin-top: 2px;
2313
+ }
2314
+ .rollout-running {
2315
+ color: var(--accent);
2316
+ }
2317
+ .rollout-queued {
2318
+ color: var(--warn);
2319
+ }
2320
+ .rollout-completed {
2321
+ color: var(--ok);
2322
+ }
2323
+ .rollout-failed {
2324
+ color: var(--err);
2325
+ }
2326
+
2327
+ .rollout-body {
2328
+ display: flex;
2329
+ flex: 1;
2330
+ min-height: 0;
2331
+ overflow: hidden;
2332
+ }
2333
+
2334
+ .rollout-sidebar {
2335
+ width: 320px;
2336
+ border-right: 1px solid var(--border);
2337
+ background: var(--panel);
2338
+ display: flex;
2339
+ flex-direction: column;
2340
+ overflow-y: auto;
2341
+ }
2342
+ .rollout-sidebar-section {
2343
+ padding: 14px 16px;
2344
+ border-bottom: 1px solid var(--border);
2345
+ }
2346
+ .rollout-sidebar-queue {
2347
+ flex: 1;
2348
+ min-height: 0;
2349
+ display: flex;
2350
+ flex-direction: column;
2351
+ padding: 10px 16px;
2352
+ }
2353
+ .rollout-label {
2354
+ display: block;
2355
+ font-size: 12px;
2356
+ color: var(--muted);
2357
+ margin-bottom: 8px;
2358
+ text-transform: uppercase;
2359
+ letter-spacing: 0.5px;
2360
+ }
2361
+ .rollout-row {
2362
+ display: flex;
2363
+ gap: 8px;
2364
+ align-items: center;
2365
+ }
2366
+ .rollout-input,
2367
+ .rollout-textarea,
2368
+ .rollout-select {
2369
+ background: var(--panel-2);
2370
+ border: 1px solid var(--border);
2371
+ color: var(--text);
2372
+ padding: 7px 10px;
2373
+ border-radius: var(--radius-sm);
2374
+ font-size: 13px;
2375
+ font-family: var(--sans);
2376
+ outline: none;
2377
+ width: 100%;
2378
+ }
2379
+ .rollout-input:focus,
2380
+ .rollout-textarea:focus {
2381
+ border-color: var(--accent);
2382
+ }
2383
+ .rollout-input-sm {
2384
+ width: 70px;
2385
+ flex: 0 0 auto;
2386
+ }
2387
+ .rollout-textarea {
2388
+ resize: vertical;
2389
+ min-height: 80px;
2390
+ }
2391
+ .rollout-select {
2392
+ cursor: pointer;
2393
+ }
2394
+ .rollout-add-form {
2395
+ display: flex;
2396
+ flex-direction: column;
2397
+ gap: 8px;
2398
+ }
2399
+ .rollout-badge {
2400
+ background: var(--subtle);
2401
+ padding: 1px 7px;
2402
+ border-radius: 10px;
2403
+ font-size: 11px;
2404
+ font-weight: 600;
2405
+ }
2406
+ .rollout-queue-list {
2407
+ flex: 1;
2408
+ overflow-y: auto;
2409
+ display: flex;
2410
+ flex-direction: column;
2411
+ gap: 6px;
2412
+ }
2413
+ .rollout-queue-empty {
2414
+ color: var(--muted);
2415
+ font-size: 12px;
2416
+ padding: 8px 0;
2417
+ }
2418
+ .rollout-queue-item {
2419
+ background: var(--panel-2);
2420
+ border: 1px solid var(--border);
2421
+ border-radius: var(--radius-sm);
2422
+ padding: 8px 10px;
2423
+ }
2424
+ .rollout-queue-item-header {
2425
+ display: flex;
2426
+ justify-content: space-between;
2427
+ align-items: center;
2428
+ }
2429
+ .rollout-queue-item-prompt {
2430
+ font-size: 12px;
2431
+ color: var(--muted);
2432
+ margin-top: 4px;
2433
+ overflow: hidden;
2434
+ text-overflow: ellipsis;
2435
+ white-space: nowrap;
2436
+ }
2437
+
2438
+ .rollout-main {
2439
+ flex: 1;
2440
+ display: flex;
2441
+ flex-direction: column;
2442
+ min-width: 0;
2443
+ overflow: hidden;
2444
+ }
2445
+ .rollout-main-header {
2446
+ display: flex;
2447
+ align-items: center;
2448
+ justify-content: space-between;
2449
+ padding: 12px 20px;
2450
+ border-bottom: 1px solid var(--border);
2451
+ }
2452
+ .rollout-main-title {
2453
+ font-size: 15px;
2454
+ font-weight: 600;
2455
+ }
2456
+ .rollout-main-controls {
2457
+ display: flex;
2458
+ gap: 8px;
2459
+ align-items: center;
2460
+ }
2461
+ .rollout-main-controls .rollout-select {
2462
+ width: auto;
2463
+ min-width: 100px;
2464
+ }
2465
+ .rollout-task-list {
2466
+ flex: 1;
2467
+ overflow-y: auto;
2468
+ padding: 16px 20px;
2469
+ display: flex;
2470
+ flex-direction: column;
2471
+ gap: 12px;
2472
+ }
2473
+ .rollout-empty {
2474
+ text-align: center;
2475
+ padding: 40px;
2476
+ color: var(--muted);
2477
+ }
2478
+ .rollout-task-card {
2479
+ background: var(--panel);
2480
+ border: 1px solid var(--border);
2481
+ border-radius: var(--radius);
2482
+ padding: 14px 16px;
2483
+ transition: border-color 0.15s;
2484
+ }
2485
+ .rollout-task-card:hover {
2486
+ border-color: var(--muted);
2487
+ }
2488
+ .rollout-task-card-header {
2489
+ display: flex;
2490
+ align-items: center;
2491
+ justify-content: space-between;
2492
+ margin-bottom: 8px;
2493
+ }
2494
+ .rollout-task-card-left {
2495
+ display: flex;
2496
+ gap: 8px;
2497
+ align-items: center;
2498
+ flex-wrap: wrap;
2499
+ }
2500
+ .rollout-task-id {
2501
+ font-family: var(--mono);
2502
+ font-size: 12px;
2503
+ color: var(--muted);
2504
+ }
2505
+ .rollout-task-model {
2506
+ font-size: 11px;
2507
+ padding: 2px 8px;
2508
+ border-radius: 10px;
2509
+ background: var(--subtle);
2510
+ color: var(--muted);
2511
+ }
2512
+ .rollout-task-tags {
2513
+ font-size: 11px;
2514
+ color: var(--accent-2);
2515
+ }
2516
+ .rollout-task-status {
2517
+ font-size: 12px;
2518
+ font-weight: 600;
2519
+ padding: 2px 10px;
2520
+ border-radius: 10px;
2521
+ }
2522
+ .rollout-task-status.queued {
2523
+ background: rgba(224, 175, 104, 0.15);
2524
+ color: var(--warn);
2525
+ }
2526
+ .rollout-task-status.running {
2527
+ background: rgba(122, 162, 247, 0.15);
2528
+ color: var(--accent);
2529
+ }
2530
+ .rollout-task-status.completed {
2531
+ background: rgba(158, 206, 106, 0.15);
2532
+ color: var(--ok);
2533
+ }
2534
+ .rollout-task-status.failed,
2535
+ .rollout-task-status.stopped {
2536
+ background: rgba(247, 118, 142, 0.15);
2537
+ color: var(--err);
2538
+ }
2539
+ .rollout-task-status.cancelled {
2540
+ background: var(--subtle);
2541
+ color: var(--muted);
2542
+ }
2543
+
2544
+ .rollout-task-prompt {
2545
+ font-size: 13px;
2546
+ line-height: 1.5;
2547
+ color: var(--text);
2548
+ margin-bottom: 4px;
2549
+ word-break: break-word;
2550
+ }
2551
+ .rollout-task-command {
2552
+ font-family: var(--mono);
2553
+ font-size: 11px;
2554
+ line-height: 1.4;
2555
+ color: var(--muted);
2556
+ background: var(--subtle);
2557
+ padding: 3px 8px;
2558
+ border-radius: 4px;
2559
+ margin-bottom: 8px;
2560
+ word-break: break-all;
2561
+ white-space: nowrap;
2562
+ overflow: hidden;
2563
+ text-overflow: ellipsis;
2564
+ }
2565
+ .rollout-task-meta {
2566
+ display: flex;
2567
+ gap: 12px;
2568
+ align-items: center;
2569
+ font-size: 11px;
2570
+ color: var(--muted);
2571
+ }
2572
+ .rollout-task-actions {
2573
+ display: flex;
2574
+ gap: 6px;
2575
+ margin-top: 10px;
2576
+ }
2577
+ .rollout-btn-sm {
2578
+ font-size: 12px !important;
2579
+ padding: 4px 10px !important;
2580
+ }
2581
+ .rollout-btn-xs {
2582
+ font-size: 11px !important;
2583
+ padding: 2px 8px !important;
2584
+ }
2585
+
2586
+ /* Tabs */
2587
+ .rollout-tabs {
2588
+ display: flex;
2589
+ gap: 0;
2590
+ align-items: center;
2591
+ padding: 0 20px;
2592
+ border-bottom: 1px solid var(--border);
2593
+ background: var(--panel);
2594
+ }
2595
+ .rollout-tab {
2596
+ background: none;
2597
+ border: none;
2598
+ border-bottom: 2px solid transparent;
2599
+ padding: 10px 18px;
2600
+ font-size: 13px;
2601
+ font-weight: 500;
2602
+ color: var(--muted);
2603
+ cursor: pointer;
2604
+ transition: all 0.15s;
2605
+ }
2606
+ .rollout-tab:hover {
2607
+ color: var(--text);
2608
+ }
2609
+ .rollout-tab.active {
2610
+ color: var(--accent);
2611
+ border-bottom-color: var(--accent);
2612
+ }
2613
+ .rollout-hint {
2614
+ font-size: 12px;
2615
+ color: var(--muted);
2616
+ font-weight: 400;
2617
+ }
2618
+ .rollout-task-card.is-running {
2619
+ border-left: 3px solid var(--accent);
2620
+ }
2621
+
2622
+ /* Detail / Log panel */
2623
+ .rollout-log-backdrop {
2624
+ position: fixed;
2625
+ inset: 0;
2626
+ background: rgba(0, 0, 0, 0.5);
2627
+ z-index: 99;
2628
+ }
2629
+ .rollout-log-panel {
2630
+ position: fixed;
2631
+ right: 0;
2632
+ top: 0;
2633
+ width: 55vw;
2634
+ min-width: 500px;
2635
+ height: 100vh;
2636
+ background: var(--panel);
2637
+ border-left: 1px solid var(--border);
2638
+ display: flex;
2639
+ flex-direction: column;
2640
+ z-index: 100;
2641
+ animation: rollout-slide-in 0.2s ease;
2642
+ }
2643
+ @keyframes rollout-slide-in {
2644
+ from {
2645
+ transform: translateX(100%);
2646
+ }
2647
+ to {
2648
+ transform: translateX(0);
2649
+ }
2650
+ }
2651
+ .rollout-log-header {
2652
+ display: flex;
2653
+ align-items: center;
2654
+ justify-content: space-between;
2655
+ padding: 14px 16px;
2656
+ border-bottom: 1px solid var(--border);
2657
+ }
2658
+ .rollout-log-header h3 {
2659
+ font-size: 14px;
2660
+ margin: 0;
2661
+ white-space: nowrap;
2662
+ overflow: hidden;
2663
+ text-overflow: ellipsis;
2664
+ max-width: 60%;
2665
+ }
2666
+ .rollout-detail-tabs {
2667
+ display: flex;
2668
+ border-bottom: 1px solid var(--border);
2669
+ padding: 0 16px;
2670
+ }
2671
+ .rollout-detail-tab {
2672
+ background: none;
2673
+ border: none;
2674
+ border-bottom: 2px solid transparent;
2675
+ padding: 8px 14px;
2676
+ font-size: 12px;
2677
+ font-weight: 500;
2678
+ color: var(--muted);
2679
+ cursor: pointer;
2680
+ }
2681
+ .rollout-detail-tab:hover {
2682
+ color: var(--text);
2683
+ }
2684
+ .rollout-detail-tab.active {
2685
+ color: var(--accent);
2686
+ border-bottom-color: var(--accent);
2687
+ }
2688
+ .rollout-log-content {
2689
+ flex: 1;
2690
+ overflow-y: auto;
2691
+ padding: 16px;
2692
+ margin: 0;
2693
+ font-family: var(--mono);
2694
+ font-size: 12px;
2695
+ line-height: 1.6;
2696
+ white-space: pre-wrap;
2697
+ color: var(--muted);
2698
+ }
2699
+ .rollout-log-content.loading {
2700
+ opacity: 0.5;
2701
+ }
2702
+ .rollout-live-dot {
2703
+ color: var(--ok);
2704
+ font-size: 11px;
2705
+ font-weight: 600;
2706
+ animation: rollout-blink 1s infinite;
2707
+ }
2708
+ @keyframes rollout-blink {
2709
+ 0%,
2710
+ 100% {
2711
+ opacity: 1;
2712
+ }
2713
+ 50% {
2714
+ opacity: 0.3;
2715
+ }
2716
+ }
2717
+
2718
+ /* Artifacts list */
2719
+ .rollout-artifact-list {
2720
+ flex: 1;
2721
+ overflow-y: auto;
2722
+ padding: 12px 16px;
2723
+ display: flex;
2724
+ flex-direction: column;
2725
+ gap: 4px;
2726
+ }
2727
+ .rollout-artifact-item {
2728
+ display: flex;
2729
+ align-items: center;
2730
+ gap: 8px;
2731
+ padding: 8px 12px;
2732
+ background: var(--subtle);
2733
+ border-radius: var(--radius);
2734
+ color: var(--text);
2735
+ text-decoration: none;
2736
+ font-family: var(--mono);
2737
+ font-size: 12px;
2738
+ transition: background 0.15s;
2739
+ }
2740
+ .rollout-artifact-item:hover {
2741
+ background: var(--border);
2742
+ }
2743
+ .rollout-artifact-icon {
2744
+ font-size: 14px;
2745
+ }
2746
+
2747
+ /* Resolution badge */
2748
+ .rollout-task-resolution {
2749
+ font-size: 10px;
2750
+ padding: 1px 6px;
2751
+ border-radius: 8px;
2752
+ background: rgba(187, 154, 247, 0.15);
2753
+ color: #bb9af7;
2754
+ font-weight: 600;
2755
+ }
2756
+
2757
+ /* Config info */
2758
+ .rollout-config-info {
2759
+ font-size: 12px;
2760
+ line-height: 1.8;
2761
+ color: var(--muted);
2762
+ }
2763
+ .rollout-config-info code {
2764
+ font-family: var(--mono);
2765
+ font-size: 11px;
2766
+ background: var(--subtle);
2767
+ padding: 1px 5px;
2768
+ border-radius: 3px;
2769
+ }
2770
+
2771
+ /* New Task Dialog */
2772
+ .rollout-dialog {
2773
+ position: fixed;
2774
+ top: 50%;
2775
+ left: 50%;
2776
+ transform: translate(-50%, -50%);
2777
+ width: 680px;
2778
+ max-width: 90vw;
2779
+ max-height: 85vh;
2780
+ background: var(--panel);
2781
+ border: 1px solid var(--border);
2782
+ border-radius: 12px;
2783
+ display: flex;
2784
+ flex-direction: column;
2785
+ z-index: 100;
2786
+ animation: rollout-dialog-in 0.2s ease;
2787
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
2788
+ }
2789
+ @keyframes rollout-dialog-in {
2790
+ from {
2791
+ opacity: 0;
2792
+ transform: translate(-50%, -48%);
2793
+ }
2794
+ to {
2795
+ opacity: 1;
2796
+ transform: translate(-50%, -50%);
2797
+ }
2798
+ }
2799
+ .rollout-dialog-header {
2800
+ display: flex;
2801
+ align-items: center;
2802
+ justify-content: space-between;
2803
+ padding: 16px 20px 12px;
2804
+ border-bottom: 1px solid var(--border);
2805
+ }
2806
+ .rollout-dialog-header h3 {
2807
+ font-size: 16px;
2808
+ margin: 0;
2809
+ }
2810
+ .rollout-dialog-body {
2811
+ flex: 1;
2812
+ overflow-y: auto;
2813
+ padding: 16px 20px;
2814
+ display: flex;
2815
+ flex-direction: column;
2816
+ gap: 12px;
2817
+ }
2818
+ .rollout-dialog-footer {
2819
+ display: flex;
2820
+ align-items: center;
2821
+ justify-content: space-between;
2822
+ padding-top: 12px;
2823
+ border-top: 1px solid var(--border);
2824
+ margin-top: 4px;
2825
+ }
2826
+
2827
+ /* Form groups */
2828
+ .rollout-form-group {
2829
+ display: flex;
2830
+ flex-direction: column;
2831
+ gap: 4px;
2832
+ }
2833
+ .rollout-form-row {
2834
+ display: flex;
2835
+ gap: 12px;
2836
+ align-items: flex-end;
2837
+ }
2838
+ .rollout-form-details {
2839
+ border: 1px solid var(--border);
2840
+ border-radius: var(--radius);
2841
+ padding: 8px 12px;
2842
+ }
2843
+ .rollout-form-details[open] {
2844
+ padding-bottom: 4px;
2845
+ }
2846
+
2847
+ /* JSON editor */
2848
+ .rollout-json-editor {
2849
+ font-family: var(--mono) !important;
2850
+ font-size: 13px !important;
2851
+ line-height: 1.5 !important;
2852
+ min-height: 300px;
2853
+ resize: vertical;
2854
+ tab-size: 2;
2855
+ }
2856
+ .rollout-json-error {
2857
+ color: var(--err);
2858
+ font-size: 12px;
2859
+ padding: 4px 0;
2860
+ }