@unity-china/codely-cli 1.0.0-alpha.1

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,2188 @@
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
+ .user-message {
147
+ padding: 4px 0;
148
+ color: var(--text);
149
+ font-weight: 500;
150
+ }
151
+
152
+ .assistant-message {
153
+ padding: 4px 0;
154
+ }
155
+
156
+ .md {
157
+ font-size: 14px;
158
+ line-height: 1.55;
159
+ color: var(--text);
160
+ }
161
+ .md p {
162
+ margin: 0 0 10px;
163
+ white-space: pre-wrap;
164
+ }
165
+ .md h1,
166
+ .md h2,
167
+ .md h3,
168
+ .md h4 {
169
+ margin: 14px 0 8px;
170
+ line-height: 1.25;
171
+ }
172
+ .md h1 {
173
+ font-size: 20px;
174
+ }
175
+ .md h2 {
176
+ font-size: 17px;
177
+ }
178
+ .md h3 {
179
+ font-size: 15px;
180
+ }
181
+ .md h4 {
182
+ font-size: 14px;
183
+ color: rgba(255, 255, 255, 0.86);
184
+ }
185
+ .md ul,
186
+ .md ol {
187
+ margin: 0 0 10px 18px;
188
+ padding: 0;
189
+ }
190
+ .md li {
191
+ margin: 4px 0;
192
+ white-space: pre-wrap;
193
+ }
194
+ .md code.inline {
195
+ font-family: var(--mono);
196
+ font-size: 13px;
197
+ padding: 2px 6px;
198
+ border-radius: 8px;
199
+ border: 1px solid var(--border);
200
+ background: rgba(255, 255, 255, 0.04);
201
+ color: rgba(187, 154, 247, 0.95);
202
+ }
203
+ .md pre {
204
+ margin: 10px 0;
205
+ padding: 12px;
206
+ border-radius: 14px;
207
+ border: 1px solid var(--border);
208
+ background: rgba(0, 0, 0, 0.3);
209
+ overflow: auto;
210
+ font-family: var(--mono);
211
+ font-size: 13px;
212
+ line-height: 1.5;
213
+ }
214
+ .md pre code {
215
+ font-family: var(--mono);
216
+ }
217
+ .md hr {
218
+ border: none;
219
+ border-top: 1px solid var(--border);
220
+ margin: 14px 0;
221
+ }
222
+ .md table {
223
+ width: 100%;
224
+ border-collapse: collapse;
225
+ margin: 10px 0;
226
+ font-size: 12px;
227
+ }
228
+ .md th,
229
+ .md td {
230
+ border: 1px solid var(--border);
231
+ padding: 8px 10px;
232
+ vertical-align: top;
233
+ }
234
+ .md th {
235
+ background: rgba(255, 255, 255, 0.03);
236
+ color: rgba(255, 255, 255, 0.86);
237
+ }
238
+ .md blockquote {
239
+ margin: 10px 0;
240
+ padding: 8px 10px;
241
+ border-left: 3px solid rgba(122, 162, 247, 0.5);
242
+ background: rgba(122, 162, 247, 0.06);
243
+ border-radius: 10px;
244
+ color: rgba(255, 255, 255, 0.86);
245
+ }
246
+
247
+ .think {
248
+ margin: 12px 0;
249
+ }
250
+ .think summary {
251
+ cursor: pointer;
252
+ padding: 4px 0;
253
+ color: rgba(255, 255, 255, 0.7);
254
+ font-size: 11px;
255
+ font-weight: 600;
256
+ user-select: none;
257
+ opacity: 0.8;
258
+ letter-spacing: 0.05em;
259
+ }
260
+ .think summary:hover {
261
+ opacity: 1;
262
+ }
263
+ .think.active {
264
+ margin: 12px 0;
265
+ }
266
+ .think-body {
267
+ margin-top: 6px;
268
+ padding: 10px 12px;
269
+ border-left: 3px solid rgba(122, 162, 247, 0.55);
270
+ background: rgba(122, 162, 247, 0.06);
271
+ border-radius: 10px;
272
+ }
273
+ .think-content,
274
+ .think pre {
275
+ margin: 0;
276
+ padding: 0;
277
+ border: none;
278
+ background: transparent;
279
+ color: rgba(255, 255, 255, 0.86);
280
+ font-family: var(--sans);
281
+ font-size: 12px;
282
+ line-height: 1.45;
283
+ white-space: pre-wrap;
284
+ word-break: break-all;
285
+ }
286
+
287
+ .tool-card {
288
+ margin: 12px 0;
289
+ border-radius: var(--radius);
290
+ border: 1px solid var(--border);
291
+ background: rgba(255, 255, 255, 0.02);
292
+ overflow: hidden;
293
+ }
294
+
295
+ .tool-compact {
296
+ margin: 6px 0;
297
+ display: flex;
298
+ align-items: center;
299
+ gap: 8px;
300
+ font-family: var(--mono);
301
+ font-size: 12px;
302
+ color: rgba(255, 255, 255, 0.78);
303
+ opacity: 0.95;
304
+ }
305
+
306
+ .tool-compact-arrow {
307
+ color: rgba(255, 255, 255, 0.55);
308
+ }
309
+
310
+ .tool-compact-kind {
311
+ color: rgba(187, 154, 247, 0.95);
312
+ }
313
+
314
+ .tool-compact-title {
315
+ color: rgba(255, 255, 255, 0.86);
316
+ overflow: hidden;
317
+ text-overflow: ellipsis;
318
+ white-space: nowrap;
319
+ flex: 1;
320
+ min-width: 0;
321
+ }
322
+
323
+ .tool-compact-status {
324
+ font-family: var(--sans);
325
+ font-size: 11px;
326
+ color: var(--muted);
327
+ }
328
+
329
+ .planning-indicator {
330
+ font-size: 11px;
331
+ color: var(--muted);
332
+ margin: 12px 0;
333
+ font-style: italic;
334
+ background: linear-gradient(90deg, var(--muted), var(--text), var(--muted));
335
+ background-size: 200% 100%;
336
+ -webkit-background-clip: text;
337
+ -webkit-text-fill-color: transparent;
338
+ animation: shimmer-text 2s infinite linear;
339
+ opacity: 0.6;
340
+ }
341
+
342
+ @keyframes shimmer-text {
343
+ 0% {
344
+ background-position: 200% 0;
345
+ }
346
+ 100% {
347
+ background-position: -200% 0;
348
+ }
349
+ }
350
+
351
+ .shimmer {
352
+ display: none;
353
+ }
354
+
355
+ @keyframes shimmer-pulse {
356
+ 0% {
357
+ background-position: 200% 0;
358
+ transform: scale(0.9);
359
+ opacity: 0.4;
360
+ }
361
+ 50% {
362
+ transform: scale(1.1);
363
+ opacity: 0.8;
364
+ }
365
+ 100% {
366
+ background-position: -200% 0;
367
+ transform: scale(0.9);
368
+ opacity: 0.4;
369
+ }
370
+ }
371
+ .tool-card-header {
372
+ display: flex;
373
+ align-items: center;
374
+ justify-content: space-between;
375
+ gap: 10px;
376
+ padding: 6px 10px;
377
+ background: rgba(255, 255, 255, 0.03);
378
+ border-bottom: 1px solid var(--border);
379
+ }
380
+ .tool-card-title {
381
+ display: flex;
382
+ align-items: center;
383
+ gap: 10px;
384
+ min-width: 0;
385
+ }
386
+ .tool-kind {
387
+ font-family: var(--mono);
388
+ font-size: 11px;
389
+ padding: 3px 7px;
390
+ border-radius: 999px;
391
+ border: 1px solid var(--border);
392
+ color: var(--muted);
393
+ background: rgba(255, 255, 255, 0.03);
394
+ }
395
+ .tool-status {
396
+ font-size: 11px;
397
+ color: var(--muted);
398
+ }
399
+ .tool-card-body {
400
+ padding: 10px 12px;
401
+ }
402
+ .diff {
403
+ border-radius: var(--radius-sm);
404
+ border: 1px solid var(--border);
405
+ background: rgba(0, 0, 0, 0.26);
406
+ overflow: auto;
407
+ max-height: 420px;
408
+ }
409
+ .diff pre {
410
+ margin: 0;
411
+ padding: 10px 12px;
412
+ font-family: var(--mono);
413
+ font-size: 12px;
414
+ line-height: 1.45;
415
+ }
416
+ .diff .add {
417
+ color: rgba(158, 206, 106, 0.95);
418
+ }
419
+ .diff .del {
420
+ color: rgba(247, 118, 142, 0.95);
421
+ }
422
+ .diff .meta {
423
+ color: rgba(122, 162, 247, 0.92);
424
+ }
425
+ .diff .hunk {
426
+ color: rgba(224, 175, 104, 0.95);
427
+ }
428
+
429
+ .composer {
430
+ border-top: 1px solid var(--border);
431
+ padding: 12px;
432
+ background: var(--panel-2);
433
+ position: relative;
434
+ z-index: 10;
435
+ flex-shrink: 0;
436
+ }
437
+ .composer-inner {
438
+ display: block;
439
+ }
440
+ .input-wrap {
441
+ position: relative;
442
+ border: 1px solid var(--border);
443
+ border-radius: var(--radius);
444
+ background: rgba(255, 255, 255, 0.03);
445
+ /* Allow the slash command autocomplete popover to render outside the input. */
446
+ overflow: visible;
447
+ transition: all 0.2s;
448
+ }
449
+ .input-wrap:focus-within {
450
+ border-color: rgba(122, 162, 247, 0.5);
451
+ box-shadow: 0 0 0 4px rgba(122, 162, 247, 0.12);
452
+ }
453
+ textarea {
454
+ width: 100%;
455
+ min-height: 44px;
456
+ max-height: 180px;
457
+ resize: none;
458
+ padding: 11px 44px 11px 12px;
459
+ border: none;
460
+ background: transparent;
461
+ color: var(--text);
462
+ outline: none;
463
+ font-size: 13px;
464
+ line-height: 1.45;
465
+ display: block;
466
+ }
467
+
468
+ .composer-references {
469
+ display: flex;
470
+ flex-wrap: wrap;
471
+ gap: 6px;
472
+ padding: 8px 12px 0;
473
+ background: transparent;
474
+ }
475
+
476
+ .ref-chip {
477
+ display: inline-flex;
478
+ align-items: center;
479
+ gap: 6px;
480
+ padding: 4px 10px;
481
+ background: rgba(255, 255, 255, 0.05);
482
+ border: 1px solid var(--border);
483
+ border-radius: 6px;
484
+ font-size: 11px;
485
+ font-weight: 500;
486
+ color: var(--muted);
487
+ max-width: 200px;
488
+ }
489
+
490
+ .ref-label {
491
+ overflow: hidden;
492
+ text-overflow: ellipsis;
493
+ white-space: nowrap;
494
+ }
495
+
496
+ .ref-chip.file {
497
+ background: rgba(255, 255, 255, 0.08);
498
+ }
499
+
500
+ .ref-chip.link {
501
+ background: rgba(255, 255, 255, 0.08);
502
+ }
503
+
504
+ .ref-chip.default {
505
+ background: rgba(255, 255, 255, 0.04);
506
+ }
507
+
508
+ .ref-remove {
509
+ background: none;
510
+ border: none;
511
+ color: inherit;
512
+ cursor: pointer;
513
+ padding: 0;
514
+ font-size: 14px;
515
+ display: flex;
516
+ align-items: center;
517
+ justify-content: center;
518
+ opacity: 0.5;
519
+ width: 14px;
520
+ height: 14px;
521
+ }
522
+
523
+ .ref-remove:hover {
524
+ opacity: 1;
525
+ }
526
+
527
+ .composer-submit {
528
+ position: absolute;
529
+ right: 8px;
530
+ bottom: 8px;
531
+ width: 28px;
532
+ height: 28px;
533
+ border-radius: 6px;
534
+ border: none;
535
+ background: rgba(255, 255, 255, 0.1);
536
+ color: var(--text);
537
+ display: flex;
538
+ align-items: center;
539
+ justify-content: center;
540
+ cursor: pointer;
541
+ transition: all 0.2s;
542
+ z-index: 20;
543
+ opacity: 0.8;
544
+ }
545
+
546
+ .composer-submit:hover {
547
+ opacity: 1;
548
+ background: rgba(255, 255, 255, 0.15);
549
+ }
550
+
551
+ .composer-submit:active {
552
+ transform: scale(0.92);
553
+ }
554
+
555
+ .composer-submit.busy {
556
+ background: rgba(255, 255, 255, 0.15);
557
+ opacity: 1;
558
+ color: var(--err);
559
+ }
560
+
561
+ .composer-submit svg {
562
+ display: block;
563
+ }
564
+ .composer-footer {
565
+ display: flex;
566
+ align-items: center;
567
+ justify-content: space-between;
568
+ margin-top: 8px;
569
+ gap: 12px;
570
+ }
571
+
572
+ .composer-footer-right {
573
+ display: flex;
574
+ align-items: center;
575
+ gap: 12px;
576
+ }
577
+
578
+ .workspace-info {
579
+ font-size: 11px;
580
+ color: rgba(255, 255, 255, 0.35);
581
+ overflow: hidden;
582
+ text-overflow: ellipsis;
583
+ white-space: nowrap;
584
+ max-width: 50%;
585
+ }
586
+
587
+ .hint {
588
+ font-size: 11px;
589
+ color: rgba(255, 255, 255, 0.35);
590
+ font-weight: normal;
591
+ white-space: nowrap;
592
+ }
593
+
594
+ .status-bar {
595
+ display: flex;
596
+ align-items: center;
597
+ gap: 8px;
598
+ cursor: pointer;
599
+ padding: 4px 8px;
600
+ border-radius: var(--radius-sm);
601
+ transition: background 0.2s;
602
+ }
603
+ .status-bar:hover {
604
+ background: rgba(255, 255, 255, 0.04);
605
+ }
606
+
607
+ .status-text {
608
+ font-size: 11px;
609
+ color: var(--err);
610
+ opacity: 0.9;
611
+ }
612
+
613
+ .status-dot {
614
+ width: 10px;
615
+ height: 10px;
616
+ border-radius: 50%;
617
+ background: var(--subtle);
618
+ box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.04);
619
+ }
620
+ .status-dot.connected {
621
+ background: var(--ok);
622
+ box-shadow: 0 0 8px rgba(158, 206, 106, 0.4);
623
+ }
624
+ .status-dot.connecting {
625
+ background: var(--warn);
626
+ animation: pulse 1.5s infinite ease-in-out;
627
+ }
628
+ .status-dot.disconnected {
629
+ background: var(--err);
630
+ box-shadow: 0 0 8px rgba(247, 118, 142, 0.4);
631
+ }
632
+
633
+ @keyframes pulse {
634
+ 0% {
635
+ opacity: 0.4;
636
+ transform: scale(0.85);
637
+ }
638
+ 50% {
639
+ opacity: 1;
640
+ transform: scale(1.05);
641
+ }
642
+ 100% {
643
+ opacity: 0.4;
644
+ transform: scale(0.85);
645
+ }
646
+ }
647
+
648
+ .autocomplete {
649
+ position: absolute;
650
+ left: 0;
651
+ right: 0;
652
+ bottom: calc(100% + 8px);
653
+ z-index: 50;
654
+ border: 1px solid var(--border);
655
+ background: rgba(20, 24, 35, 0.95);
656
+ backdrop-filter: blur(12px);
657
+ border-radius: 12px;
658
+ overflow: hidden;
659
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.5);
660
+ max-height: 320px;
661
+ display: flex;
662
+ flex-direction: column;
663
+ }
664
+
665
+ .ac-header {
666
+ padding: 8px 12px;
667
+ font-size: 11px;
668
+ font-weight: 700;
669
+ color: var(--muted);
670
+ text-transform: uppercase;
671
+ letter-spacing: 0.1em;
672
+ border-bottom: 1px solid var(--border);
673
+ background: rgba(255, 255, 255, 0.02);
674
+ }
675
+
676
+ .ac-item {
677
+ padding: 8px 12px;
678
+ display: flex;
679
+ flex-direction: column;
680
+ gap: 2px;
681
+ cursor: pointer;
682
+ border-bottom: 1px solid rgba(255, 255, 255, 0.03);
683
+ }
684
+
685
+ .ac-item:last-child {
686
+ border-bottom: none;
687
+ }
688
+
689
+ .ac-item:hover,
690
+ .ac-item.active {
691
+ background: rgba(122, 162, 247, 0.12);
692
+ }
693
+
694
+ .ac-name code {
695
+ font-family: var(--mono);
696
+ font-size: 13px;
697
+ font-weight: 600;
698
+ color: var(--accent);
699
+ }
700
+
701
+ .ac-desc {
702
+ font-size: 12px;
703
+ color: var(--muted);
704
+ overflow: hidden;
705
+ text-overflow: ellipsis;
706
+ white-space: nowrap;
707
+ }
708
+
709
+ .ac-item.active .ac-desc {
710
+ color: var(--text);
711
+ }
712
+
713
+ .modal-backdrop {
714
+ position: fixed;
715
+ inset: 0;
716
+ background: rgba(0, 0, 0, 0.55);
717
+ display: flex;
718
+ align-items: center;
719
+ justify-content: center;
720
+ padding: 18px;
721
+ z-index: 9999;
722
+ }
723
+ .modal {
724
+ width: min(1100px, 96vw);
725
+ max-height: 90vh;
726
+ overflow: hidden;
727
+ border-radius: 18px;
728
+ border: 1px solid var(--border);
729
+ background: rgba(16, 21, 33, 0.96);
730
+ box-shadow: var(--shadow);
731
+ display: flex;
732
+ flex-direction: column;
733
+ }
734
+ .modal-header {
735
+ padding: 12px 14px;
736
+ border-bottom: 1px solid var(--border);
737
+ display: flex;
738
+ align-items: center;
739
+ justify-content: space-between;
740
+ gap: 10px;
741
+ }
742
+ .modal-header h2 {
743
+ margin: 0;
744
+ font-size: 13px;
745
+ font-weight: 650;
746
+ }
747
+ .modal-body {
748
+ display: grid;
749
+ grid-template-columns: 1fr 1fr;
750
+ gap: 12px;
751
+ padding: 12px;
752
+ overflow: auto;
753
+ }
754
+ .modal-pane {
755
+ border: 1px solid var(--border);
756
+ border-radius: 14px;
757
+ overflow: hidden;
758
+ background: rgba(0, 0, 0, 0.18);
759
+ }
760
+ .modal-pane .pane-title {
761
+ padding: 10px 12px;
762
+ border-bottom: 1px solid var(--border);
763
+ font-size: 12px;
764
+ color: var(--muted);
765
+ }
766
+ .modal-pane textarea {
767
+ border: none;
768
+ border-radius: 0;
769
+ background: transparent;
770
+ padding: 12px;
771
+ min-height: 320px;
772
+ max-height: none;
773
+ outline: none;
774
+ font-family: var(--mono);
775
+ font-size: 12px;
776
+ }
777
+ .modal-footer {
778
+ padding: 12px 14px;
779
+ border-top: 1px solid var(--border);
780
+ display: flex;
781
+ justify-content: flex-end;
782
+ gap: 10px;
783
+ }
784
+
785
+ /* Subagent card styles */
786
+ .subagent-card {
787
+ background: linear-gradient(
788
+ 135deg,
789
+ rgba(122, 162, 247, 0.04),
790
+ rgba(187, 154, 247, 0.03)
791
+ );
792
+ border-color: rgba(122, 162, 247, 0.2);
793
+ }
794
+
795
+ .subagent-header {
796
+ display: flex;
797
+ align-items: center;
798
+ justify-content: space-between;
799
+ padding: 10px 14px;
800
+ background: rgba(122, 162, 247, 0.06);
801
+ border-bottom: 1px solid rgba(122, 162, 247, 0.15);
802
+ }
803
+
804
+ .subagent-header.running {
805
+ background: linear-gradient(
806
+ 90deg,
807
+ rgba(122, 162, 247, 0.08),
808
+ rgba(187, 154, 247, 0.08),
809
+ rgba(122, 162, 247, 0.08)
810
+ );
811
+ background-size: 200% 100%;
812
+ animation: shimmer-bg 3s infinite linear;
813
+ }
814
+
815
+ @keyframes shimmer-bg {
816
+ 0% {
817
+ background-position: 200% 0;
818
+ }
819
+ 100% {
820
+ background-position: -200% 0;
821
+ }
822
+ }
823
+
824
+ .subagent-title {
825
+ display: flex;
826
+ align-items: center;
827
+ gap: 10px;
828
+ }
829
+
830
+ .subagent-label {
831
+ font-family: var(--mono);
832
+ font-size: 10px;
833
+ text-transform: uppercase;
834
+ letter-spacing: 0.08em;
835
+ padding: 4px 8px;
836
+ border-radius: 999px;
837
+ background: linear-gradient(
838
+ 135deg,
839
+ rgba(122, 162, 247, 0.25),
840
+ rgba(187, 154, 247, 0.2)
841
+ );
842
+ border: 1px solid rgba(122, 162, 247, 0.4);
843
+ color: var(--accent);
844
+ font-weight: 700;
845
+ }
846
+
847
+ .subagent-name {
848
+ font-size: 13px;
849
+ font-weight: 600;
850
+ color: var(--text);
851
+ }
852
+
853
+ .subagent-status-wrap {
854
+ display: flex;
855
+ align-items: center;
856
+ gap: 8px;
857
+ }
858
+
859
+ .subagent-spinner {
860
+ width: 14px;
861
+ height: 14px;
862
+ border: 2px solid rgba(122, 162, 247, 0.2);
863
+ border-top-color: var(--accent);
864
+ border-radius: 50%;
865
+ animation: spin 1s linear infinite;
866
+ }
867
+
868
+ @keyframes spin {
869
+ to {
870
+ transform: rotate(360deg);
871
+ }
872
+ }
873
+
874
+ .subagent-status {
875
+ font-size: 11px;
876
+ color: var(--muted);
877
+ font-weight: 500;
878
+ }
879
+
880
+ .subagent-task {
881
+ padding: 10px 14px;
882
+ background: rgba(0, 0, 0, 0.15);
883
+ border-bottom: 1px solid var(--border);
884
+ }
885
+
886
+ .subagent-task-label {
887
+ font-size: 10px;
888
+ text-transform: uppercase;
889
+ letter-spacing: 0.06em;
890
+ color: var(--muted);
891
+ margin-bottom: 4px;
892
+ font-weight: 600;
893
+ }
894
+
895
+ .subagent-task-text {
896
+ font-size: 13px;
897
+ line-height: 1.5;
898
+ color: var(--text);
899
+ white-space: pre-wrap;
900
+ word-break: break-word;
901
+ }
902
+
903
+ .subagent-params {
904
+ padding: 8px 14px;
905
+ background: rgba(0, 0, 0, 0.1);
906
+ border-bottom: 1px solid var(--border);
907
+ display: flex;
908
+ flex-direction: column;
909
+ gap: 4px;
910
+ }
911
+
912
+ .subagent-param {
913
+ font-family: var(--mono);
914
+ font-size: 11px;
915
+ color: rgba(255, 255, 255, 0.7);
916
+ padding: 4px 8px;
917
+ background: rgba(255, 255, 255, 0.03);
918
+ border-radius: 4px;
919
+ border: 1px solid rgba(255, 255, 255, 0.08);
920
+ }
921
+
922
+ .subagent-result {
923
+ padding: 10px 14px;
924
+ }
925
+
926
+ @media (max-width: 980px) {
927
+ .app {
928
+ grid-template-columns: 1fr;
929
+ }
930
+ .sidebar {
931
+ display: none;
932
+ }
933
+ .modal-body {
934
+ grid-template-columns: 1fr;
935
+ }
936
+ }
937
+
938
+ /* =============================================
939
+ Control Plane — shared base styles
940
+ ============================================= */
941
+
942
+ .control-plane {
943
+ display: flex;
944
+ flex-direction: column;
945
+ gap: 0;
946
+ height: 100%;
947
+ min-height: 0;
948
+ }
949
+
950
+ /* Top header bar */
951
+ .cp-header {
952
+ display: flex;
953
+ align-items: center;
954
+ justify-content: space-between;
955
+ gap: 12px;
956
+ padding: 12px 16px;
957
+ border-bottom: 1px solid var(--border);
958
+ flex-shrink: 0;
959
+ }
960
+
961
+ .cp-header h1 {
962
+ margin: 0;
963
+ font-size: 16px;
964
+ }
965
+
966
+ .cp-header-actions {
967
+ display: flex;
968
+ gap: 8px;
969
+ }
970
+
971
+ .cp-subtitle {
972
+ font-size: 13px;
973
+ color: var(--muted);
974
+ margin-top: 3px;
975
+ }
976
+
977
+ /* Body area below header — sidebar + main */
978
+ .cp-body {
979
+ display: flex;
980
+ flex: 1;
981
+ min-height: 0;
982
+ overflow: hidden;
983
+ }
984
+
985
+ /* =============================================
986
+ PC Sidebar
987
+ ============================================= */
988
+
989
+ .cp-sidebar {
990
+ width: 260px;
991
+ flex-shrink: 0;
992
+ border-right: 1px solid var(--border);
993
+ display: flex;
994
+ flex-direction: column;
995
+ overflow: hidden;
996
+ background: var(--panel-2);
997
+ }
998
+
999
+ .cp-sidebar-section-label {
1000
+ padding: 10px 12px 6px;
1001
+ font-size: 11px;
1002
+ font-weight: 700;
1003
+ color: var(--muted);
1004
+ text-transform: uppercase;
1005
+ letter-spacing: 0.08em;
1006
+ flex-shrink: 0;
1007
+ display: flex;
1008
+ align-items: center;
1009
+ gap: 6px;
1010
+ }
1011
+
1012
+ .cp-sidebar-workers-label {
1013
+ border-top: 1px solid var(--border);
1014
+ }
1015
+
1016
+ .cp-sidebar-workers-count {
1017
+ background: rgba(255, 255, 255, 0.08);
1018
+ border-radius: 999px;
1019
+ padding: 1px 7px;
1020
+ font-size: 11px;
1021
+ font-weight: 600;
1022
+ color: var(--muted);
1023
+ }
1024
+
1025
+ /* Broadcast summary section in sidebar */
1026
+ .cp-sidebar-broadcast-section {
1027
+ padding: 10px 12px 12px;
1028
+ border-bottom: 1px solid var(--border);
1029
+ flex-shrink: 0;
1030
+ display: flex;
1031
+ flex-direction: column;
1032
+ gap: 8px;
1033
+ }
1034
+
1035
+ .cp-sidebar-broadcast-target {
1036
+ font-size: 12px;
1037
+ color: var(--muted);
1038
+ }
1039
+
1040
+ .cp-sidebar-broadcast-btn {
1041
+ width: 100%;
1042
+ justify-content: center;
1043
+ }
1044
+
1045
+ /* Worker nav list inside sidebar */
1046
+ .cp-sidebar-workers {
1047
+ flex: 1;
1048
+ overflow-y: auto;
1049
+ padding: 4px 0 8px;
1050
+ }
1051
+
1052
+ .cp-sidebar-worker-item {
1053
+ display: flex;
1054
+ align-items: flex-start;
1055
+ gap: 8px;
1056
+ padding: 8px 12px;
1057
+ cursor: pointer;
1058
+ transition: background 0.12s;
1059
+ border-left: 2px solid transparent;
1060
+ }
1061
+
1062
+ .cp-sidebar-worker-item:hover {
1063
+ background: rgba(255, 255, 255, 0.04);
1064
+ }
1065
+
1066
+ .cp-sidebar-worker-item.active {
1067
+ background: rgba(122, 162, 247, 0.08);
1068
+ border-left-color: var(--accent);
1069
+ }
1070
+
1071
+ .cp-sidebar-worker-item input[type='checkbox'] {
1072
+ width: 14px;
1073
+ height: 14px;
1074
+ flex-shrink: 0;
1075
+ cursor: pointer;
1076
+ margin-top: 3px;
1077
+ }
1078
+
1079
+ .cp-sidebar-worker-info {
1080
+ flex: 1;
1081
+ min-width: 0;
1082
+ display: flex;
1083
+ flex-direction: column;
1084
+ gap: 2px;
1085
+ }
1086
+
1087
+ .cp-sidebar-worker-name {
1088
+ font-size: 13px;
1089
+ font-weight: 500;
1090
+ line-height: 1.4;
1091
+ word-break: break-word;
1092
+ }
1093
+
1094
+ .cp-sidebar-worker-url {
1095
+ font-family: var(--mono);
1096
+ font-size: 11px;
1097
+ color: var(--muted);
1098
+ word-break: break-all;
1099
+ line-height: 1.4;
1100
+ }
1101
+
1102
+ .cp-sidebar-worker-tags {
1103
+ font-size: 11px;
1104
+ color: rgba(187, 154, 247, 0.7);
1105
+ line-height: 1.4;
1106
+ }
1107
+
1108
+ .cp-sidebar-worker-status {
1109
+ flex-shrink: 0;
1110
+ margin-top: 2px;
1111
+ }
1112
+
1113
+ /* =============================================
1114
+ PC Broadcast Modal
1115
+ ============================================= */
1116
+
1117
+ .cp-broadcast-modal-backdrop {
1118
+ position: fixed;
1119
+ inset: 0;
1120
+ background: rgba(0, 0, 0, 0.6);
1121
+ z-index: 300;
1122
+ display: flex;
1123
+ align-items: center;
1124
+ justify-content: center;
1125
+ padding: 20px;
1126
+ backdrop-filter: blur(3px);
1127
+ }
1128
+
1129
+ .cp-broadcast-modal {
1130
+ width: min(860px, 96vw);
1131
+ max-height: 88vh;
1132
+ background: rgba(16, 21, 33, 0.98);
1133
+ border: 1px solid var(--border);
1134
+ border-radius: 16px;
1135
+ box-shadow: var(--shadow);
1136
+ display: flex;
1137
+ flex-direction: column;
1138
+ overflow: hidden;
1139
+ }
1140
+
1141
+ .cp-broadcast-modal-header {
1142
+ display: flex;
1143
+ align-items: center;
1144
+ justify-content: space-between;
1145
+ padding: 14px 18px;
1146
+ border-bottom: 1px solid var(--border);
1147
+ flex-shrink: 0;
1148
+ }
1149
+
1150
+ .cp-broadcast-modal-title {
1151
+ font-size: 15px;
1152
+ font-weight: 650;
1153
+ }
1154
+
1155
+ .cp-broadcast-modal-close {
1156
+ background: none;
1157
+ border: none;
1158
+ color: var(--muted);
1159
+ font-size: 16px;
1160
+ cursor: pointer;
1161
+ padding: 4px 8px;
1162
+ border-radius: 6px;
1163
+ line-height: 1;
1164
+ }
1165
+
1166
+ .cp-broadcast-modal-close:hover {
1167
+ background: rgba(255, 255, 255, 0.06);
1168
+ color: var(--text);
1169
+ }
1170
+
1171
+ .cp-broadcast-modal-body {
1172
+ display: grid;
1173
+ grid-template-columns: 1fr 320px;
1174
+ gap: 0;
1175
+ flex: 1;
1176
+ min-height: 0;
1177
+ overflow: hidden;
1178
+ }
1179
+
1180
+ .cp-broadcast-modal-left {
1181
+ display: flex;
1182
+ flex-direction: column;
1183
+ padding: 14px 18px;
1184
+ gap: 10px;
1185
+ border-right: 1px solid var(--border);
1186
+ min-height: 0;
1187
+ }
1188
+
1189
+ .cp-broadcast-modal-right {
1190
+ display: flex;
1191
+ flex-direction: column;
1192
+ min-height: 0;
1193
+ overflow: hidden;
1194
+ }
1195
+
1196
+ .cp-broadcast-modal-label {
1197
+ font-size: 11px;
1198
+ font-weight: 700;
1199
+ color: var(--muted);
1200
+ text-transform: uppercase;
1201
+ letter-spacing: 0.08em;
1202
+ display: flex;
1203
+ align-items: center;
1204
+ justify-content: space-between;
1205
+ gap: 8px;
1206
+ flex-shrink: 0;
1207
+ }
1208
+
1209
+ .cp-broadcast-modal-node-actions {
1210
+ display: flex;
1211
+ gap: 6px;
1212
+ }
1213
+
1214
+ .cp-broadcast-modal-textarea {
1215
+ flex: 1;
1216
+ min-height: 160px;
1217
+ resize: none;
1218
+ border: 1px solid var(--border);
1219
+ border-radius: var(--radius-sm);
1220
+ background: rgba(255, 255, 255, 0.03);
1221
+ color: var(--text);
1222
+ padding: 10px 12px;
1223
+ font-size: 14px;
1224
+ line-height: 1.5;
1225
+ }
1226
+
1227
+ .cp-broadcast-modal-textarea:focus {
1228
+ outline: none;
1229
+ border-color: rgba(122, 162, 247, 0.5);
1230
+ box-shadow: 0 0 0 3px rgba(122, 162, 247, 0.1);
1231
+ }
1232
+
1233
+ .cp-broadcast-modal-footer {
1234
+ display: flex;
1235
+ align-items: center;
1236
+ justify-content: space-between;
1237
+ gap: 10px;
1238
+ flex-shrink: 0;
1239
+ }
1240
+
1241
+ .cp-broadcast-modal-target {
1242
+ font-size: 12px;
1243
+ color: var(--muted);
1244
+ }
1245
+
1246
+ .cp-broadcast-modal-node-list {
1247
+ flex: 1;
1248
+ overflow-y: auto;
1249
+ padding: 8px 0;
1250
+ }
1251
+
1252
+ .cp-broadcast-modal-node-item {
1253
+ display: flex;
1254
+ align-items: flex-start;
1255
+ gap: 10px;
1256
+ padding: 8px 16px;
1257
+ cursor: pointer;
1258
+ transition: background 0.1s;
1259
+ }
1260
+
1261
+ .cp-broadcast-modal-node-item:hover {
1262
+ background: rgba(255, 255, 255, 0.04);
1263
+ }
1264
+
1265
+ .cp-broadcast-modal-node-item input[type='checkbox'] {
1266
+ width: 15px;
1267
+ height: 15px;
1268
+ flex-shrink: 0;
1269
+ cursor: pointer;
1270
+ margin-top: 2px;
1271
+ }
1272
+
1273
+ .cp-broadcast-modal-node-info {
1274
+ display: flex;
1275
+ flex-direction: column;
1276
+ gap: 2px;
1277
+ min-width: 0;
1278
+ }
1279
+
1280
+ .cp-broadcast-modal-node-name {
1281
+ font-size: 13px;
1282
+ font-weight: 500;
1283
+ line-height: 1.4;
1284
+ word-break: break-word;
1285
+ }
1286
+
1287
+ .cp-broadcast-modal-node-url {
1288
+ font-family: var(--mono);
1289
+ font-size: 11px;
1290
+ color: var(--muted);
1291
+ word-break: break-all;
1292
+ }
1293
+
1294
+ .cp-broadcast-modal-node-tags {
1295
+ font-size: 11px;
1296
+ color: rgba(187, 154, 247, 0.7);
1297
+ }
1298
+
1299
+ /* =============================================
1300
+ PC Main area — worker grid
1301
+ ============================================= */
1302
+
1303
+ .cp-main {
1304
+ flex: 1;
1305
+ min-width: 0;
1306
+ display: flex;
1307
+ flex-direction: column;
1308
+ overflow: hidden;
1309
+ }
1310
+
1311
+ .cp-workers {
1312
+ flex: 1;
1313
+ overflow: auto;
1314
+ display: flex;
1315
+ flex-direction: column;
1316
+ }
1317
+
1318
+ .cp-workers-header {
1319
+ padding: 12px 16px 0;
1320
+ font-size: 11px;
1321
+ color: var(--muted);
1322
+ text-transform: uppercase;
1323
+ letter-spacing: 0.08em;
1324
+ flex-shrink: 0;
1325
+ }
1326
+
1327
+ .cp-worker-grid {
1328
+ display: grid;
1329
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
1330
+ gap: 12px;
1331
+ padding: 12px 16px 16px;
1332
+ align-content: start;
1333
+ }
1334
+
1335
+ /* =============================================
1336
+ Worker task cards
1337
+ ============================================= */
1338
+
1339
+ .cp-task-card {
1340
+ border: 2px solid var(--border);
1341
+ border-radius: var(--radius);
1342
+ background: rgba(255, 255, 255, 0.02);
1343
+ overflow: hidden;
1344
+ display: flex;
1345
+ flex-direction: column;
1346
+ cursor: pointer;
1347
+ transition: border-color 0.15s ease;
1348
+ min-height: 360px;
1349
+ }
1350
+
1351
+ .cp-task-card:hover {
1352
+ border-color: rgba(255, 255, 255, 0.2);
1353
+ }
1354
+
1355
+ .cp-task-card.selected {
1356
+ border-color: var(--ok);
1357
+ }
1358
+
1359
+ .cp-task-card.error {
1360
+ border-color: var(--err);
1361
+ }
1362
+
1363
+ .cp-task-card.selected.error {
1364
+ border-color: var(--err);
1365
+ }
1366
+
1367
+ .cp-task-header {
1368
+ display: flex;
1369
+ align-items: flex-start;
1370
+ justify-content: space-between;
1371
+ gap: 12px;
1372
+ padding: 10px 12px;
1373
+ border-bottom: 1px solid var(--border);
1374
+ flex-shrink: 0;
1375
+ }
1376
+
1377
+ .cp-task-name {
1378
+ font-weight: 600;
1379
+ font-size: 14px;
1380
+ }
1381
+
1382
+ .cp-task-url {
1383
+ font-size: 11px;
1384
+ color: var(--muted);
1385
+ word-break: break-all;
1386
+ }
1387
+
1388
+ .cp-task-meta {
1389
+ display: flex;
1390
+ flex-direction: column;
1391
+ gap: 4px;
1392
+ font-size: 11px;
1393
+ color: var(--muted);
1394
+ }
1395
+
1396
+ .cp-conn {
1397
+ padding: 2px 6px;
1398
+ border-radius: 6px;
1399
+ border: 1px solid var(--border);
1400
+ font-size: 10px;
1401
+ color: var(--muted);
1402
+ text-transform: uppercase;
1403
+ }
1404
+
1405
+ .cp-conn.connected {
1406
+ color: var(--ok);
1407
+ border-color: rgba(158, 206, 106, 0.4);
1408
+ }
1409
+
1410
+ .cp-conn.disconnected {
1411
+ color: var(--err);
1412
+ border-color: rgba(247, 118, 142, 0.4);
1413
+ }
1414
+
1415
+ .cp-queue,
1416
+ .cp-activity {
1417
+ font-size: 11px;
1418
+ }
1419
+
1420
+ .cp-task-actions {
1421
+ display: flex;
1422
+ flex-direction: column;
1423
+ gap: 6px;
1424
+ }
1425
+
1426
+ .cp-task-error {
1427
+ padding: 6px 12px;
1428
+ font-size: 12px;
1429
+ color: var(--err);
1430
+ border-bottom: 1px solid var(--border);
1431
+ flex-shrink: 0;
1432
+ }
1433
+
1434
+ .cp-task-body {
1435
+ padding: 10px 12px;
1436
+ overflow: auto;
1437
+ flex: 1;
1438
+ min-height: 120px;
1439
+ }
1440
+
1441
+ .cp-task-message,
1442
+ .cp-task-tool {
1443
+ margin-bottom: 10px;
1444
+ }
1445
+
1446
+ .cp-task-input {
1447
+ display: flex;
1448
+ gap: 8px;
1449
+ padding: 10px 12px;
1450
+ border-top: 1px solid var(--border);
1451
+ background: rgba(0, 0, 0, 0.1);
1452
+ flex-shrink: 0;
1453
+ }
1454
+
1455
+ .cp-task-textarea {
1456
+ flex: 1;
1457
+ min-height: 40px;
1458
+ max-height: 80px;
1459
+ resize: vertical;
1460
+ border: 1px solid var(--border);
1461
+ border-radius: var(--radius-sm);
1462
+ background: rgba(255, 255, 255, 0.03);
1463
+ color: var(--text);
1464
+ padding: 8px 10px;
1465
+ font-size: 13px;
1466
+ line-height: 1.4;
1467
+ }
1468
+
1469
+ .cp-task-input .btn {
1470
+ align-self: flex-end;
1471
+ }
1472
+
1473
+ /* =============================================
1474
+ Endpoint registry Drawer (right side)
1475
+ ============================================= */
1476
+
1477
+ .cp-drawer {
1478
+ position: fixed;
1479
+ top: 0;
1480
+ right: 0;
1481
+ bottom: 0;
1482
+ width: 600px;
1483
+ max-width: 100%;
1484
+ z-index: 100;
1485
+ background: var(--panel-2);
1486
+ border-left: 1px solid var(--border);
1487
+ box-shadow: -4px 0 20px rgba(0, 0, 0, 0.5);
1488
+ transform: translateX(100%);
1489
+ transition: transform 0.2s ease;
1490
+ display: flex;
1491
+ flex-direction: column;
1492
+ }
1493
+
1494
+ .cp-drawer.open {
1495
+ transform: translateX(0);
1496
+ }
1497
+
1498
+ .cp-drawer-backdrop {
1499
+ position: fixed;
1500
+ inset: 0;
1501
+ background: rgba(0, 0, 0, 0.5);
1502
+ z-index: 90;
1503
+ backdrop-filter: blur(2px);
1504
+ }
1505
+
1506
+ .cp-drawer-header {
1507
+ display: flex;
1508
+ align-items: center;
1509
+ justify-content: space-between;
1510
+ gap: 12px;
1511
+ padding: 14px 16px;
1512
+ border-bottom: 1px solid var(--border);
1513
+ position: sticky;
1514
+ top: 0;
1515
+ background: var(--panel-2);
1516
+ z-index: 10;
1517
+ }
1518
+
1519
+ .cp-drawer-header h2 {
1520
+ margin: 0;
1521
+ font-size: 14px;
1522
+ }
1523
+
1524
+ .cp-drawer-toolbar {
1525
+ display: flex;
1526
+ flex-direction: column;
1527
+ gap: 8px;
1528
+ padding: 12px 16px;
1529
+ border-bottom: 1px solid var(--border);
1530
+ }
1531
+
1532
+ .cp-drawer-content {
1533
+ flex: 1;
1534
+ overflow: auto;
1535
+ padding: 12px 16px;
1536
+ }
1537
+
1538
+ /* =============================================
1539
+ Shared form elements
1540
+ ============================================= */
1541
+
1542
+ .cp-input,
1543
+ .cp-select {
1544
+ background: rgba(255, 255, 255, 0.03);
1545
+ border: 1px solid var(--border);
1546
+ color: var(--text);
1547
+ border-radius: var(--radius-sm);
1548
+ padding: 8px 10px;
1549
+ font-size: 13px;
1550
+ width: 100%;
1551
+ }
1552
+
1553
+ .cp-select {
1554
+ min-width: 100px;
1555
+ }
1556
+
1557
+ .cp-content {
1558
+ padding: 12px 16px;
1559
+ overflow: auto;
1560
+ flex: 1;
1561
+ }
1562
+
1563
+ .cp-list {
1564
+ display: flex;
1565
+ flex-direction: column;
1566
+ gap: 10px;
1567
+ }
1568
+
1569
+ .cp-row {
1570
+ display: flex;
1571
+ justify-content: space-between;
1572
+ gap: 12px;
1573
+ padding: 10px 12px;
1574
+ border: 1px solid var(--border);
1575
+ border-radius: var(--radius);
1576
+ background: rgba(255, 255, 255, 0.03);
1577
+ }
1578
+
1579
+ .cp-select-box {
1580
+ display: flex;
1581
+ align-items: flex-start;
1582
+ padding-top: 3px;
1583
+ }
1584
+
1585
+ .cp-select-box input {
1586
+ width: 15px;
1587
+ height: 15px;
1588
+ }
1589
+
1590
+ .cp-row-main {
1591
+ flex: 1;
1592
+ min-width: 0;
1593
+ }
1594
+
1595
+ .cp-row-title {
1596
+ display: flex;
1597
+ flex-direction: column;
1598
+ gap: 3px;
1599
+ }
1600
+
1601
+ .cp-name {
1602
+ font-weight: 600;
1603
+ font-size: 13px;
1604
+ }
1605
+
1606
+ .cp-url {
1607
+ font-family: var(--mono);
1608
+ font-size: 11px;
1609
+ color: var(--muted);
1610
+ word-break: break-all;
1611
+ }
1612
+
1613
+ .cp-row-meta {
1614
+ display: flex;
1615
+ align-items: center;
1616
+ gap: 10px;
1617
+ flex-wrap: wrap;
1618
+ margin-top: 6px;
1619
+ }
1620
+
1621
+ .cp-tags {
1622
+ display: flex;
1623
+ gap: 6px;
1624
+ flex-wrap: wrap;
1625
+ }
1626
+
1627
+ .cp-tag {
1628
+ padding: 2px 6px;
1629
+ border: 1px solid var(--border);
1630
+ border-radius: 6px;
1631
+ font-size: 11px;
1632
+ color: var(--muted);
1633
+ }
1634
+
1635
+ .cp-tag.muted {
1636
+ opacity: 0.6;
1637
+ }
1638
+
1639
+ .cp-actions {
1640
+ display: flex;
1641
+ gap: 6px;
1642
+ align-items: center;
1643
+ }
1644
+
1645
+ .cp-health {
1646
+ font-size: 11px;
1647
+ padding: 2px 6px;
1648
+ border-radius: 6px;
1649
+ border: 1px solid var(--border);
1650
+ color: var(--muted);
1651
+ }
1652
+
1653
+ .cp-health.ok {
1654
+ color: var(--ok);
1655
+ border-color: rgba(158, 206, 106, 0.4);
1656
+ }
1657
+
1658
+ .cp-health.err {
1659
+ color: var(--err);
1660
+ border-color: rgba(247, 118, 142, 0.4);
1661
+ }
1662
+
1663
+ .cp-health.pending {
1664
+ color: var(--muted);
1665
+ }
1666
+
1667
+ .cp-health-ms {
1668
+ margin-left: 6px;
1669
+ color: var(--muted);
1670
+ font-size: 11px;
1671
+ }
1672
+
1673
+ .cp-pagination {
1674
+ display: flex;
1675
+ align-items: center;
1676
+ justify-content: space-between;
1677
+ gap: 10px;
1678
+ padding: 10px 16px;
1679
+ border-top: 1px solid var(--border);
1680
+ }
1681
+
1682
+ .cp-page-info,
1683
+ .cp-page-number {
1684
+ font-size: 12px;
1685
+ color: var(--muted);
1686
+ }
1687
+
1688
+ .cp-page-controls {
1689
+ display: flex;
1690
+ align-items: center;
1691
+ gap: 8px;
1692
+ }
1693
+
1694
+ .cp-modal-body {
1695
+ display: flex;
1696
+ flex-direction: column;
1697
+ gap: 10px;
1698
+ padding: 12px;
1699
+ }
1700
+
1701
+ .cp-label {
1702
+ display: flex;
1703
+ flex-direction: column;
1704
+ gap: 6px;
1705
+ font-size: 13px;
1706
+ color: var(--muted);
1707
+ }
1708
+
1709
+ .cp-modal-actions {
1710
+ display: flex;
1711
+ gap: 8px;
1712
+ }
1713
+
1714
+ .cp-error {
1715
+ color: var(--err);
1716
+ font-size: 13px;
1717
+ margin-top: 6px;
1718
+ }
1719
+
1720
+ .cp-loading,
1721
+ .cp-empty {
1722
+ color: var(--muted);
1723
+ font-size: 13px;
1724
+ padding: 10px 0;
1725
+ }
1726
+
1727
+ /* =============================================
1728
+ Mobile — Worker compact list card
1729
+ ============================================= */
1730
+
1731
+ .cp-task-card-compact {
1732
+ display: flex;
1733
+ align-items: center;
1734
+ gap: 10px;
1735
+ padding: 12px 14px;
1736
+ border: 1px solid var(--border);
1737
+ border-radius: var(--radius);
1738
+ background: rgba(255, 255, 255, 0.02);
1739
+ cursor: pointer;
1740
+ transition: background 0.12s;
1741
+ -webkit-tap-highlight-color: transparent;
1742
+ }
1743
+
1744
+ .cp-task-card-compact:active {
1745
+ background: rgba(255, 255, 255, 0.05);
1746
+ }
1747
+
1748
+ .cp-task-card-compact.error {
1749
+ border-color: rgba(247, 118, 142, 0.35);
1750
+ }
1751
+
1752
+ .cp-task-card-compact input[type='checkbox'] {
1753
+ width: 18px;
1754
+ height: 18px;
1755
+ flex-shrink: 0;
1756
+ cursor: pointer;
1757
+ }
1758
+
1759
+ .cp-task-card-compact-body {
1760
+ flex: 1;
1761
+ min-width: 0;
1762
+ }
1763
+
1764
+ .cp-task-card-compact-top {
1765
+ display: flex;
1766
+ align-items: center;
1767
+ gap: 8px;
1768
+ margin-bottom: 4px;
1769
+ }
1770
+
1771
+ .cp-task-card-compact-name {
1772
+ font-size: 14px;
1773
+ font-weight: 600;
1774
+ flex: 1;
1775
+ min-width: 0;
1776
+ overflow: hidden;
1777
+ text-overflow: ellipsis;
1778
+ white-space: nowrap;
1779
+ }
1780
+
1781
+ .cp-task-card-compact-meta {
1782
+ font-size: 11px;
1783
+ color: var(--muted);
1784
+ display: flex;
1785
+ gap: 8px;
1786
+ }
1787
+
1788
+ .cp-task-card-compact-preview {
1789
+ font-size: 12px;
1790
+ color: var(--muted);
1791
+ overflow: hidden;
1792
+ text-overflow: ellipsis;
1793
+ white-space: nowrap;
1794
+ }
1795
+
1796
+ .cp-task-card-compact-chevron {
1797
+ color: var(--muted);
1798
+ flex-shrink: 0;
1799
+ font-size: 16px;
1800
+ opacity: 0.5;
1801
+ }
1802
+
1803
+ /* =============================================
1804
+ Mobile — Detail view
1805
+ ============================================= */
1806
+
1807
+ .cp-mobile-detail {
1808
+ display: flex;
1809
+ flex-direction: column;
1810
+ flex: 1;
1811
+ min-height: 0;
1812
+ overflow: hidden;
1813
+ }
1814
+
1815
+ .cp-mobile-header-title {
1816
+ font-size: 16px;
1817
+ font-weight: 700;
1818
+ margin: 0;
1819
+ }
1820
+
1821
+ .cp-mobile-back-btn {
1822
+ display: flex;
1823
+ align-items: center;
1824
+ gap: 4px;
1825
+ background: none;
1826
+ border: none;
1827
+ color: var(--accent);
1828
+ font-size: 15px;
1829
+ cursor: pointer;
1830
+ padding: 4px 0;
1831
+ flex-shrink: 0;
1832
+ }
1833
+
1834
+ .cp-mobile-detail-title {
1835
+ font-size: 15px;
1836
+ font-weight: 600;
1837
+ overflow: hidden;
1838
+ text-overflow: ellipsis;
1839
+ white-space: nowrap;
1840
+ }
1841
+
1842
+ .cp-mobile-detail-feed {
1843
+ flex: 1;
1844
+ overflow: auto;
1845
+ padding: 10px 14px;
1846
+ min-height: 0;
1847
+ }
1848
+
1849
+ .cp-mobile-detail-input {
1850
+ display: flex;
1851
+ gap: 8px;
1852
+ padding: 10px 14px;
1853
+ border-top: 1px solid var(--border);
1854
+ background: rgba(0, 0, 0, 0.1);
1855
+ flex-shrink: 0;
1856
+ }
1857
+
1858
+ .cp-mobile-detail-textarea {
1859
+ flex: 1;
1860
+ min-height: 44px;
1861
+ max-height: 120px;
1862
+ resize: none;
1863
+ border: 1px solid var(--border);
1864
+ border-radius: var(--radius-sm);
1865
+ background: rgba(255, 255, 255, 0.03);
1866
+ color: var(--text);
1867
+ padding: 10px 12px;
1868
+ font-size: 14px;
1869
+ line-height: 1.4;
1870
+ }
1871
+
1872
+ .cp-mobile-detail-send {
1873
+ align-self: flex-end;
1874
+ min-height: 44px;
1875
+ padding: 0 18px;
1876
+ }
1877
+
1878
+ /* =============================================
1879
+ Mobile — Bottom Tab Bar
1880
+ ============================================= */
1881
+
1882
+ .cp-mobile-tab-bar {
1883
+ display: none;
1884
+ flex-shrink: 0;
1885
+ border-top: 1px solid var(--border);
1886
+ background: var(--panel-2);
1887
+ padding-bottom: env(safe-area-inset-bottom, 0px);
1888
+ }
1889
+
1890
+ .cp-mobile-tab {
1891
+ flex: 1;
1892
+ display: flex;
1893
+ flex-direction: column;
1894
+ align-items: center;
1895
+ justify-content: center;
1896
+ gap: 4px;
1897
+ padding: 10px 4px;
1898
+ background: none;
1899
+ border: none;
1900
+ color: var(--muted);
1901
+ font-size: 11px;
1902
+ cursor: pointer;
1903
+ position: relative;
1904
+ -webkit-tap-highlight-color: transparent;
1905
+ transition: color 0.12s;
1906
+ }
1907
+
1908
+ .cp-mobile-tab.active {
1909
+ color: var(--accent);
1910
+ }
1911
+
1912
+ .cp-mobile-tab svg {
1913
+ flex-shrink: 0;
1914
+ }
1915
+
1916
+ .cp-mobile-tab-broadcast {
1917
+ color: var(--muted);
1918
+ }
1919
+
1920
+ .cp-mobile-tab-badge {
1921
+ position: absolute;
1922
+ top: 6px;
1923
+ right: calc(50% - 18px);
1924
+ background: var(--accent);
1925
+ color: #0f111a;
1926
+ font-size: 10px;
1927
+ font-weight: 700;
1928
+ border-radius: 999px;
1929
+ padding: 1px 5px;
1930
+ min-width: 16px;
1931
+ text-align: center;
1932
+ line-height: 1.4;
1933
+ }
1934
+
1935
+ /* =============================================
1936
+ Mobile — Broadcast tab (inline, full height)
1937
+ ============================================= */
1938
+
1939
+ .cp-mobile-broadcast-tab {
1940
+ flex: 1;
1941
+ display: flex;
1942
+ flex-direction: column;
1943
+ overflow: hidden;
1944
+ min-height: 0;
1945
+ }
1946
+
1947
+ .cp-broadcast-sheet-nodes {
1948
+ border-bottom: 1px solid var(--border);
1949
+ overflow: hidden;
1950
+ flex: 1;
1951
+ display: flex;
1952
+ flex-direction: column;
1953
+ min-height: 0;
1954
+ }
1955
+
1956
+ .cp-broadcast-sheet-nodes-header {
1957
+ display: flex;
1958
+ align-items: center;
1959
+ justify-content: space-between;
1960
+ gap: 8px;
1961
+ padding: 10px 16px;
1962
+ border-bottom: 1px solid var(--border);
1963
+ background: rgba(255, 255, 255, 0.02);
1964
+ flex-shrink: 0;
1965
+ }
1966
+
1967
+ .cp-broadcast-sheet-subtitle {
1968
+ font-size: 13px;
1969
+ color: var(--muted);
1970
+ }
1971
+
1972
+ .cp-broadcast-sheet-node-list {
1973
+ overflow-y: auto;
1974
+ flex: 1;
1975
+ }
1976
+
1977
+ .cp-broadcast-sheet-node-item {
1978
+ display: flex;
1979
+ align-items: flex-start;
1980
+ gap: 12px;
1981
+ padding: 12px 16px;
1982
+ cursor: pointer;
1983
+ border-bottom: 1px solid rgba(255, 255, 255, 0.04);
1984
+ -webkit-tap-highlight-color: transparent;
1985
+ }
1986
+
1987
+ .cp-broadcast-sheet-node-item:active {
1988
+ background: rgba(255, 255, 255, 0.04);
1989
+ }
1990
+
1991
+ .cp-broadcast-sheet-node-item:last-child {
1992
+ border-bottom: none;
1993
+ }
1994
+
1995
+ .cp-broadcast-sheet-node-item input[type='checkbox'] {
1996
+ width: 18px;
1997
+ height: 18px;
1998
+ flex-shrink: 0;
1999
+ margin-top: 2px;
2000
+ cursor: pointer;
2001
+ }
2002
+
2003
+ .cp-broadcast-sheet-node-info {
2004
+ display: flex;
2005
+ flex-direction: column;
2006
+ gap: 3px;
2007
+ min-width: 0;
2008
+ }
2009
+
2010
+ .cp-broadcast-sheet-node-name {
2011
+ font-size: 14px;
2012
+ font-weight: 500;
2013
+ word-break: break-word;
2014
+ line-height: 1.4;
2015
+ }
2016
+
2017
+ .cp-broadcast-sheet-node-url {
2018
+ font-family: var(--mono);
2019
+ font-size: 12px;
2020
+ color: var(--muted);
2021
+ word-break: break-all;
2022
+ }
2023
+
2024
+ .cp-broadcast-sheet-compose {
2025
+ padding: 12px 16px;
2026
+ border-top: 1px solid var(--border);
2027
+ display: flex;
2028
+ flex-direction: column;
2029
+ gap: 10px;
2030
+ flex-shrink: 0;
2031
+ padding-bottom: calc(12px + env(safe-area-inset-bottom, 0px));
2032
+ }
2033
+
2034
+ .cp-broadcast-sheet-textarea {
2035
+ width: 100%;
2036
+ min-height: 80px;
2037
+ max-height: 160px;
2038
+ resize: none;
2039
+ border: 1px solid var(--border);
2040
+ border-radius: var(--radius-sm);
2041
+ background: rgba(255, 255, 255, 0.03);
2042
+ color: var(--text);
2043
+ padding: 10px 12px;
2044
+ font-size: 14px;
2045
+ line-height: 1.4;
2046
+ }
2047
+
2048
+ .cp-broadcast-sheet-footer {
2049
+ display: flex;
2050
+ gap: 10px;
2051
+ }
2052
+
2053
+ .cp-broadcast-sheet-footer .btn {
2054
+ flex: 1;
2055
+ min-height: 44px;
2056
+ font-size: 14px;
2057
+ }
2058
+
2059
+ /* =============================================
2060
+ Mobile — Worker list view
2061
+ ============================================= */
2062
+
2063
+ .cp-mobile-list {
2064
+ flex: 1;
2065
+ overflow-y: auto;
2066
+ padding: 10px 12px;
2067
+ display: flex;
2068
+ flex-direction: column;
2069
+ gap: 8px;
2070
+ }
2071
+
2072
+ /* =============================================
2073
+ Mobile — Endpoints tab
2074
+ ============================================= */
2075
+
2076
+ .cp-mobile-endpoints-tab {
2077
+ flex: 1;
2078
+ display: flex;
2079
+ flex-direction: column;
2080
+ overflow: hidden;
2081
+ min-height: 0;
2082
+ }
2083
+
2084
+ .cp-mobile-endpoints-toolbar {
2085
+ padding: 10px 14px;
2086
+ border-bottom: 1px solid var(--border);
2087
+ flex-shrink: 0;
2088
+ }
2089
+
2090
+ /* =============================================
2091
+ Responsive breakpoints
2092
+ ============================================= */
2093
+
2094
+ /* Desktop: sidebar + broadcast modal, no mobile elements */
2095
+ @media (min-width: 769px) {
2096
+ .cp-sidebar {
2097
+ display: flex;
2098
+ }
2099
+ .cp-header-mobile,
2100
+ .cp-mobile-list,
2101
+ .cp-mobile-detail,
2102
+ .cp-mobile-tab-bar,
2103
+ .cp-mobile-endpoints-tab,
2104
+ .cp-mobile-broadcast-tab {
2105
+ display: none !important;
2106
+ }
2107
+ .cp-header-pc {
2108
+ display: flex;
2109
+ }
2110
+ }
2111
+
2112
+ /* Mobile: bottom tabs, no sidebar */
2113
+ @media (max-width: 768px) {
2114
+ .app {
2115
+ padding: 0;
2116
+ }
2117
+
2118
+ .cp-header-pc {
2119
+ display: none !important;
2120
+ }
2121
+
2122
+ .cp-header-mobile {
2123
+ display: flex;
2124
+ }
2125
+
2126
+ .cp-sidebar {
2127
+ display: none;
2128
+ }
2129
+
2130
+ .cp-main {
2131
+ display: none;
2132
+ }
2133
+
2134
+ .cp-mobile-tab-bar {
2135
+ display: flex;
2136
+ }
2137
+
2138
+ /* Body fills between header and tab bar */
2139
+ .cp-body {
2140
+ flex: 1;
2141
+ min-height: 0;
2142
+ overflow: hidden;
2143
+ position: relative;
2144
+ }
2145
+
2146
+ /* Drawer goes full screen on mobile */
2147
+ .cp-drawer {
2148
+ inset: 0;
2149
+ width: 100%;
2150
+ max-width: none;
2151
+ border-radius: 0;
2152
+ border: none;
2153
+ }
2154
+ .cp-drawer.open {
2155
+ width: 100%;
2156
+ }
2157
+
2158
+ /* Endpoint list rows stack vertically */
2159
+ .cp-row {
2160
+ flex-direction: column;
2161
+ gap: 8px;
2162
+ }
2163
+ .cp-actions {
2164
+ margin-top: 0;
2165
+ justify-content: flex-start;
2166
+ flex-wrap: wrap;
2167
+ gap: 8px;
2168
+ }
2169
+ .cp-actions .btn {
2170
+ min-height: 40px;
2171
+ flex: 1;
2172
+ }
2173
+
2174
+ .cp-input,
2175
+ .cp-select {
2176
+ min-height: 40px;
2177
+ font-size: 14px;
2178
+ }
2179
+
2180
+ .btn {
2181
+ min-height: 38px;
2182
+ }
2183
+
2184
+ /* Broadcast modal hidden on mobile (use sheet instead) */
2185
+ .cp-broadcast-modal-backdrop {
2186
+ display: none !important;
2187
+ }
2188
+ }