gabriel / musehub public
_agents.scss
783 lines 20.1 KB
Raw
sha256:9590cee1e0ccd6c76528f005b95d634d80f5019f0dcb7c371e149adc31d1fb65 refactor: enforce gRPC framing on all MWP wire traffic Sonnet 4.6 minor ⚠ breaking 156 days ago
1 // Agent Coordination Hub — Phase 4.3
2 // SINGULARITY aesthetic: dark surfaces, glowing accents, mono typography
3
4 // ── Layout ────────────────────────────────────────────────────────────────────
5
6 .agents-wrap {
7 max-width: 1000px;
8 margin: 0 auto;
9 padding: 0 var(--space-4);
10 font-family: var(--font-mono);
11 }
12
13 // ── Page header ───────────────────────────────────────────────────────────────
14
15 .agents-hd {
16 display: flex;
17 align-items: baseline;
18 gap: var(--space-3);
19 padding: var(--space-5) 0 var(--space-4);
20 border-bottom: 1px solid var(--color-border);
21 margin-bottom: var(--space-5);
22 }
23
24 .agents-hd-title {
25 display: flex;
26 align-items: center;
27 gap: var(--space-2);
28 font-size: 1.1rem;
29 font-weight: 600;
30 letter-spacing: 0.04em;
31 color: var(--color-fg-default);
32
33 svg { opacity: 0.7; }
34 }
35
36 .agents-hd-repo {
37 font-size: 0.8rem;
38 color: var(--color-fg-muted);
39 }
40
41 .agents-hd-live {
42 margin-left: auto;
43 display: flex;
44 align-items: center;
45 gap: var(--space-2);
46 font-size: 0.72rem;
47 letter-spacing: 0.08em;
48 color: var(--color-success, #3fb950);
49 }
50
51 .agents-hd-live-dot {
52 width: 7px;
53 height: 7px;
54 border-radius: 50%;
55 background: var(--color-success, #3fb950);
56 box-shadow: 0 0 6px var(--color-success, #3fb950);
57 animation: agents-pulse 2s ease-in-out infinite;
58 }
59
60 @keyframes agents-pulse {
61 0%, 100% { opacity: 1; box-shadow: 0 0 6px var(--color-success, #3fb950); }
62 50% { opacity: 0.5; box-shadow: 0 0 2px var(--color-success, #3fb950); }
63 }
64
65 // ── Sub-navigation (coord / shard / forecast) ─────────────────────────────────
66
67 .agents-subnav {
68 display: flex;
69 gap: var(--space-2);
70 margin-bottom: var(--space-5);
71 flex-wrap: wrap;
72 }
73
74 .agents-subnav-link {
75 display: inline-flex;
76 align-items: center;
77 gap: var(--space-1);
78 padding: var(--space-1) var(--space-3);
79 border: 1px solid var(--color-border);
80 border-radius: 4px;
81 font-size: 0.78rem;
82 letter-spacing: 0.04em;
83 color: var(--color-fg-muted);
84 text-decoration: none;
85 transition: border-color 0.15s, color 0.15s;
86
87 &:hover {
88 border-color: var(--color-accent-emphasis, #58a6ff);
89 color: var(--color-accent-emphasis, #58a6ff);
90 }
91 }
92
93 // ── Two-column grid (swarm overview) ─────────────────────────────────────────
94
95 .agents-grid {
96 display: grid;
97 grid-template-columns: 240px 1fr;
98 gap: var(--space-4);
99 margin-bottom: var(--space-5);
100
101 @media (max-width: 640px) {
102 grid-template-columns: 1fr;
103 }
104 }
105
106 // ── Cards / panels ────────────────────────────────────────────────────────────
107
108 .agents-card {
109 border: 1px solid var(--color-border);
110 border-radius: 6px;
111 background: var(--color-canvas-subtle, #161b22);
112 padding: var(--space-4);
113 }
114
115 .agents-card-title {
116 font-size: 0.7rem;
117 font-weight: 700;
118 letter-spacing: 0.1em;
119 text-transform: uppercase;
120 color: var(--color-fg-muted);
121 margin-bottom: var(--space-3);
122 }
123
124 // ── Active agent list ─────────────────────────────────────────────────────────
125
126 .agents-active-count {
127 font-size: 0.85rem;
128 font-weight: 600;
129 color: var(--color-success, #3fb950);
130 margin-bottom: var(--space-3);
131
132 &::before {
133 content: "● ";
134 font-size: 0.6rem;
135 }
136 }
137
138 .agents-agent-list {
139 list-style: none;
140 padding: 0;
141 margin: 0;
142 display: flex;
143 flex-direction: column;
144 gap: var(--space-2);
145 }
146
147 .agents-agent-item {
148 a {
149 font-size: 0.8rem;
150 color: var(--color-accent-emphasis, #58a6ff);
151 text-decoration: none;
152 overflow: hidden;
153 text-overflow: ellipsis;
154 white-space: nowrap;
155 display: block;
156
157 &:hover { text-decoration: underline; }
158 }
159 }
160
161 .agents-no-active {
162 font-size: 0.78rem;
163 color: var(--color-fg-subtle);
164 font-style: italic;
165 }
166
167 // ── Task queue bar chart ──────────────────────────────────────────────────────
168
169 .agents-queue {
170 display: flex;
171 flex-direction: column;
172 gap: var(--space-2);
173 }
174
175 .agents-queue-row {
176 display: grid;
177 grid-template-columns: 68px 1fr 28px;
178 align-items: center;
179 gap: var(--space-2);
180 font-size: 0.78rem;
181 }
182
183 .agents-queue-label {
184 color: var(--color-fg-muted);
185 text-align: right;
186 }
187
188 .agents-queue-track {
189 height: 8px;
190 background: var(--color-canvas-default, #0d1117);
191 border: 1px solid var(--color-border);
192 border-radius: 2px;
193 overflow: hidden;
194 }
195
196 .agents-queue-fill {
197 height: 100%;
198 border-radius: 2px;
199 transition: width 0.3s ease;
200 }
201
202 .agents-queue-fill--pending { background: var(--color-accent-emphasis, #58a6ff); }
203 .agents-queue-fill--claimed { background: var(--color-warning-emphasis, #d29922); box-shadow: 0 0 4px var(--color-warning, #e3b341); }
204 .agents-queue-fill--done { background: var(--color-success-emphasis, #238636); }
205 .agents-queue-fill--failed { background: var(--color-danger-emphasis, #da3633); }
206
207 .agents-queue-count {
208 color: var(--color-fg-muted);
209 text-align: right;
210 }
211
212 // ── Reservations table (swarm overview, coord page) ───────────────────────────
213
214 .agents-reservations {
215 margin-bottom: var(--space-5);
216 }
217
218 .agents-reservations-hd {
219 display: flex;
220 align-items: baseline;
221 justify-content: space-between;
222 margin-bottom: var(--space-3);
223 }
224
225 .agents-reservations-title {
226 font-size: 0.7rem;
227 font-weight: 700;
228 letter-spacing: 0.1em;
229 text-transform: uppercase;
230 color: var(--color-fg-muted);
231 }
232
233 .agents-reservations-count {
234 font-size: 0.75rem;
235 color: var(--color-fg-subtle);
236 }
237
238 .agents-table {
239 width: 100%;
240 border-collapse: collapse;
241 font-size: 0.78rem;
242 }
243
244 .agents-table th {
245 text-align: left;
246 padding: var(--space-1) var(--space-2);
247 color: var(--color-fg-subtle);
248 font-weight: 400;
249 font-size: 0.7rem;
250 letter-spacing: 0.05em;
251 text-transform: uppercase;
252 border-bottom: 1px solid var(--color-border);
253 }
254
255 .agents-table td {
256 padding: var(--space-2);
257 border-bottom: 1px solid color-mix(in srgb, var(--color-border) 40%, transparent);
258 vertical-align: middle;
259 }
260
261 .agents-table tr:last-child td { border-bottom: none; }
262
263 .agents-table tr:hover td {
264 background: color-mix(in srgb, var(--color-canvas-subtle, #161b22) 60%, transparent);
265 }
266
267 .agents-symbol-addr {
268 font-family: var(--font-mono);
269 color: var(--color-fg-default);
270 max-width: 280px;
271 overflow: hidden;
272 text-overflow: ellipsis;
273 white-space: nowrap;
274 }
275
276 .agents-agent-chip {
277 display: inline-block;
278 padding: 1px var(--space-2);
279 background: color-mix(in srgb, var(--color-accent-emphasis, #58a6ff) 12%, transparent);
280 border: 1px solid color-mix(in srgb, var(--color-accent-emphasis, #58a6ff) 30%, transparent);
281 border-radius: 10px;
282 font-size: 0.72rem;
283 color: var(--color-accent-emphasis, #58a6ff);
284 white-space: nowrap;
285 }
286
287 .agents-ttl {
288 color: var(--color-fg-muted);
289 font-size: 0.75rem;
290 white-space: nowrap;
291 }
292
293 .agents-ttl--expiring {
294 color: var(--color-warning, #e3b341);
295 }
296
297 // ── Event stream (coord page) ─────────────────────────────────────────────────
298
299 .agents-stream {
300 border: 1px solid var(--color-border);
301 border-radius: 6px;
302 background: var(--color-canvas-default, #0d1117);
303 margin-bottom: var(--space-5);
304 overflow: hidden;
305 }
306
307 .agents-stream-hd {
308 display: flex;
309 align-items: center;
310 justify-content: space-between;
311 padding: var(--space-2) var(--space-3);
312 background: var(--color-canvas-subtle, #161b22);
313 border-bottom: 1px solid var(--color-border);
314 font-size: 0.7rem;
315 color: var(--color-fg-muted);
316 letter-spacing: 0.06em;
317 }
318
319 .agents-stream-cursor {
320 font-family: var(--font-mono);
321 color: var(--color-fg-subtle);
322 }
323
324 .agents-stream-body {
325 padding: var(--space-2) 0;
326 min-height: 120px;
327 max-height: 320px;
328 overflow-y: auto;
329 }
330
331 .agents-stream-row {
332 display: grid;
333 grid-template-columns: 10px 90px 1fr;
334 align-items: center;
335 gap: var(--space-2);
336 padding: 3px var(--space-3);
337 font-size: 0.76rem;
338 transition: background 0.1s;
339
340 &:hover { background: color-mix(in srgb, var(--color-canvas-subtle, #161b22) 60%, transparent); }
341 }
342
343 .agents-stream-dot {
344 width: 7px;
345 height: 7px;
346 border-radius: 50%;
347 flex-shrink: 0;
348 }
349
350 // Color by kind
351 .agents-stream-dot--reservation { background: var(--color-accent-emphasis, #58a6ff); box-shadow: 0 0 4px var(--color-accent-emphasis, #58a6ff); }
352 .agents-stream-dot--heartbeat { background: var(--color-success, #3fb950); }
353 .agents-stream-dot--claim { background: var(--color-warning, #e3b341); box-shadow: 0 0 4px var(--color-warning, #e3b341); }
354 .agents-stream-dot--release { background: var(--color-fg-subtle); }
355 .agents-stream-dot--task { background: color-mix(in srgb, var(--color-accent-emphasis, #58a6ff) 60%, var(--color-success, #3fb950)); }
356 .agents-stream-dot--intent { background: var(--color-fg-muted); }
357 .agents-stream-dot--default { background: var(--color-fg-subtle); }
358
359 .agents-stream-kind {
360 font-size: 0.7rem;
361 font-weight: 600;
362 letter-spacing: 0.04em;
363 color: var(--color-fg-muted);
364 }
365
366 .agents-stream-detail {
367 color: var(--color-fg-default);
368 overflow: hidden;
369 text-overflow: ellipsis;
370 white-space: nowrap;
371 }
372
373 // ── Shard map ─────────────────────────────────────────────────────────────────
374
375 .agents-shard-meta {
376 font-size: 0.8rem;
377 color: var(--color-fg-muted);
378 margin-bottom: var(--space-4);
379 }
380
381 .agents-shard-grid {
382 display: grid;
383 grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
384 gap: var(--space-3);
385 margin-bottom: var(--space-5);
386 }
387
388 .agents-shard-card {
389 border: 1px solid var(--color-border);
390 border-radius: 6px;
391 background: var(--color-canvas-subtle, #161b22);
392 padding: var(--space-3);
393 }
394
395 .agents-shard-card--assigned {
396 border-color: color-mix(in srgb, var(--color-accent-emphasis, #58a6ff) 40%, transparent);
397 }
398
399 .agents-shard-num {
400 font-size: 0.65rem;
401 font-weight: 700;
402 letter-spacing: 0.12em;
403 text-transform: uppercase;
404 color: var(--color-fg-subtle);
405 margin-bottom: var(--space-2);
406 }
407
408 .agents-shard-symbols {
409 font-size: 1rem;
410 font-weight: 600;
411 color: var(--color-fg-default);
412 margin-bottom: 2px;
413 }
414
415 .agents-shard-detail {
416 font-size: 0.72rem;
417 color: var(--color-fg-muted);
418 margin-bottom: var(--space-3);
419 }
420
421 .agents-shard-assigned {
422 font-size: 0.75rem;
423 color: var(--color-accent-emphasis, #58a6ff);
424 margin-bottom: var(--space-2);
425
426 &::before { content: "● "; font-size: 0.55rem; }
427 }
428
429 .agents-shard-unassigned {
430 font-size: 0.75rem;
431 color: var(--color-fg-subtle);
432 margin-bottom: var(--space-2);
433
434 &::before { content: "○ "; font-size: 0.55rem; }
435 }
436
437 .agents-empty {
438 padding: var(--space-8) var(--space-4);
439 text-align: center;
440 color: var(--color-fg-subtle);
441 font-size: 0.85rem;
442 }
443
444 .agents-empty-icon {
445 display: block;
446 margin: 0 auto var(--space-3);
447 opacity: 0.35;
448 }
449
450 .agents-empty-hint {
451 font-size: 0.75rem;
452 color: var(--color-fg-subtle);
453 margin-top: var(--space-2);
454 font-style: italic;
455 }
456
457 // ── Forecast page ─────────────────────────────────────────────────────────────
458
459 .agents-forecast-section {
460 margin-bottom: var(--space-5);
461 }
462
463 .agents-forecast-title {
464 font-size: 0.7rem;
465 font-weight: 700;
466 letter-spacing: 0.1em;
467 text-transform: uppercase;
468 color: var(--color-fg-muted);
469 margin-bottom: var(--space-3);
470 padding-bottom: var(--space-2);
471 border-bottom: 1px solid var(--color-border);
472 }
473
474 .agents-conflict-ok {
475 display: flex;
476 align-items: center;
477 gap: var(--space-2);
478 padding: var(--space-3) var(--space-4);
479 border: 1px solid color-mix(in srgb, var(--color-success, #3fb950) 30%, transparent);
480 border-radius: 6px;
481 background: color-mix(in srgb, var(--color-success, #3fb950) 6%, transparent);
482 color: var(--color-success, #3fb950);
483 font-size: 0.82rem;
484 }
485
486 .agents-conflict-list {
487 display: flex;
488 flex-direction: column;
489 gap: var(--space-3);
490 }
491
492 .agents-conflict-item {
493 padding: var(--space-3) var(--space-4);
494 border: 1px solid color-mix(in srgb, var(--color-danger, #f85149) 35%, transparent);
495 border-radius: 6px;
496 background: color-mix(in srgb, var(--color-danger, #f85149) 5%, transparent);
497 }
498
499 .agents-conflict-addr {
500 font-family: var(--font-mono);
501 font-size: 0.82rem;
502 color: var(--color-danger, #f85149);
503 margin-bottom: var(--space-2);
504 }
505
506 .agents-conflict-agents {
507 display: flex;
508 flex-wrap: wrap;
509 gap: var(--space-2);
510 }
511
512 .agents-blast-list {
513 display: flex;
514 flex-direction: column;
515 gap: var(--space-2);
516 }
517
518 .agents-blast-item {
519 display: flex;
520 align-items: center;
521 gap: var(--space-2);
522 font-size: 0.8rem;
523 }
524
525 .agents-blast-icon {
526 color: var(--color-warning, #e3b341);
527 flex-shrink: 0;
528 }
529
530 .agents-blast-addr {
531 font-family: var(--font-mono);
532 color: var(--color-fg-default);
533 flex: 1;
534 overflow: hidden;
535 text-overflow: ellipsis;
536 white-space: nowrap;
537 }
538
539 .agents-blast-count {
540 color: var(--color-fg-muted);
541 font-size: 0.75rem;
542 white-space: nowrap;
543 }
544
545 .agents-blast-reserved {
546 color: var(--color-warning, #e3b341);
547 font-size: 0.65rem;
548 letter-spacing: 0.08em;
549 text-transform: uppercase;
550 padding: 1px 5px;
551 border: 1px solid color-mix(in srgb, var(--color-warning, #e3b341) 35%, transparent);
552 border-radius: 3px;
553 }
554
555 // ── Agent profile page ────────────────────────────────────────────────────────
556
557 .agents-profile-hd {
558 margin-bottom: var(--space-5);
559 }
560
561 .agents-profile-name {
562 font-size: 1.15rem;
563 font-weight: 700;
564 letter-spacing: 0.02em;
565 color: var(--color-fg-default);
566 margin-bottom: var(--space-2);
567 }
568
569 .agents-profile-meta {
570 display: flex;
571 flex-wrap: wrap;
572 gap: var(--space-3);
573 font-size: 0.78rem;
574 color: var(--color-fg-muted);
575 }
576
577 .agents-profile-meta-item {
578 display: flex;
579 align-items: center;
580 gap: var(--space-1);
581 }
582
583 .agents-profile-meta-key {
584 color: var(--color-fg-subtle);
585 }
586
587 .agents-profile-meta-val {
588 color: var(--color-fg-default);
589 font-weight: 500;
590 }
591
592 .agents-profile-section {
593 margin-bottom: var(--space-5);
594 }
595
596 .agents-profile-section-title {
597 font-size: 0.7rem;
598 font-weight: 700;
599 letter-spacing: 0.1em;
600 text-transform: uppercase;
601 color: var(--color-fg-muted);
602 margin-bottom: var(--space-3);
603 display: flex;
604 align-items: center;
605 gap: var(--space-2);
606 padding-bottom: var(--space-2);
607 border-bottom: 1px solid var(--color-border);
608 }
609
610 .agents-profile-section-count {
611 display: inline-flex;
612 align-items: center;
613 justify-content: center;
614 min-width: 18px;
615 height: 18px;
616 padding: 0 5px;
617 border-radius: 9px;
618 background: var(--color-neutral-emphasis, #6e7681);
619 color: var(--color-canvas-default, #0d1117);
620 font-size: 0.65rem;
621 font-weight: 700;
622 }
623
624 // Task rows in profile
625 .agents-task-row {
626 display: flex;
627 align-items: baseline;
628 gap: var(--space-3);
629 padding: var(--space-2) 0;
630 border-bottom: 1px solid color-mix(in srgb, var(--color-border) 40%, transparent);
631 font-size: 0.8rem;
632
633 &:last-child { border-bottom: none; }
634 }
635
636 .agents-task-id {
637 font-family: var(--font-mono);
638 font-size: 0.72rem;
639 color: var(--color-fg-subtle);
640 flex-shrink: 0;
641 }
642
643 .agents-task-title {
644 flex: 1;
645 color: var(--color-fg-default);
646 overflow: hidden;
647 text-overflow: ellipsis;
648 white-space: nowrap;
649 }
650
651 .agents-task-status {
652 font-size: 0.68rem;
653 font-weight: 700;
654 letter-spacing: 0.06em;
655 text-transform: uppercase;
656 flex-shrink: 0;
657 padding: 1px 5px;
658 border-radius: 3px;
659 }
660
661 .agents-task-status--pending { color: var(--color-fg-muted); border: 1px solid var(--color-border); }
662 .agents-task-status--claimed { color: var(--color-warning, #e3b341); border: 1px solid color-mix(in srgb, var(--color-warning, #e3b341) 35%, transparent); }
663 .agents-task-status--completed { color: var(--color-success, #3fb950); border: 1px solid color-mix(in srgb, var(--color-success, #3fb950) 35%, transparent); }
664 .agents-task-status--failed { color: var(--color-danger, #f85149); border: 1px solid color-mix(in srgb, var(--color-danger, #f85149) 35%, transparent); }
665
666 // Commit rows in profile
667 .agents-commit-row {
668 display: flex;
669 align-items: baseline;
670 gap: var(--space-3);
671 padding: var(--space-2) 0;
672 border-bottom: 1px solid color-mix(in srgb, var(--color-border) 40%, transparent);
673 font-size: 0.8rem;
674
675 &:last-child { border-bottom: none; }
676 }
677
678 .agents-commit-id {
679 font-family: var(--font-mono);
680 font-size: 0.72rem;
681 color: var(--color-accent-emphasis, #58a6ff);
682 flex-shrink: 0;
683 }
684
685 .agents-commit-msg {
686 flex: 1;
687 color: var(--color-fg-default);
688 overflow: hidden;
689 text-overflow: ellipsis;
690 white-space: nowrap;
691 }
692
693 .agents-commit-signed {
694 font-size: 0.65rem;
695 letter-spacing: 0.06em;
696 color: var(--color-success, #3fb950);
697 flex-shrink: 0;
698 opacity: 0.8;
699 }
700
701 // ── Back link ─────────────────────────────────────────────────────────────────
702
703 .agents-back {
704 display: inline-flex;
705 align-items: center;
706 gap: var(--space-1);
707 font-size: 0.78rem;
708 color: var(--color-fg-muted);
709 text-decoration: none;
710 margin-bottom: var(--space-4);
711
712 &:hover { color: var(--color-accent-emphasis, #58a6ff); }
713 }
714
715 // ── Hint / CLI instruction text ───────────────────────────────────────────────
716
717 .agents-hint {
718 font-size: 0.75rem;
719 color: var(--color-fg-subtle);
720 margin-top: var(--space-3);
721 }
722
723 // ── Section empty state paragraphs ───────────────────────────────────────────
724
725 .agents-section-empty {
726 font-size: 0.8rem;
727 color: var(--color-fg-subtle);
728 padding: var(--space-2) 0;
729 }
730
731 .agents-section-empty-hint {
732 font-style: italic;
733 }
734
735 // ── Task priority label ───────────────────────────────────────────────────────
736
737 .agents-task-priority {
738 font-size: 0.72rem;
739 color: var(--color-fg-subtle);
740 flex-shrink: 0;
741 }
742
743 // ── Forecast section title — secondary description ────────────────────────────
744
745 .agents-forecast-title-sub {
746 font-size: 0.7rem;
747 font-weight: 400;
748 text-transform: none;
749 letter-spacing: 0;
750 color: var(--color-fg-muted);
751 }
752
753 // Inline icon inside conflict address ─────────────────────────────────────────
754
755 .agents-conflict-addr svg {
756 vertical-align: -1px;
757 margin-right: 3px;
758 }
759
760 // ── Shard card helpers ────────────────────────────────────────────────────────
761
762 .agents-shard-sym-unit {
763 font-size: 0.7rem;
764 font-weight: 400;
765 color: var(--color-fg-muted);
766 }
767
768 .agents-shard-assigned-link {
769 color: inherit;
770 text-decoration: none;
771 }
772
773 // ── Muted stream entries (empty state) ───────────────────────────────────────
774
775 .agents-stream-kind--muted { color: var(--color-fg-subtle); }
776 .agents-stream-detail--muted { color: var(--color-fg-subtle); }
777
778 // ── Profile meta item — hint / empty variant ──────────────────────────────────
779
780 .agents-profile-meta-item--hint {
781 color: var(--color-fg-subtle);
782 font-style: italic;
783 }
File History 1 commit
sha256:9590cee1e0ccd6c76528f005b95d634d80f5019f0dcb7c371e149adc31d1fb65 refactor: enforce gRPC framing on all MWP wire traffic Sonnet 4.6 minor ⚠ 156 days ago