@dfsramos/foreman 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/LICENSE +21 -0
  3. package/README.md +385 -2
  4. package/dist/agent/adapters/agy.js +96 -0
  5. package/dist/agent/adapters/claude.js +152 -0
  6. package/dist/agent/adapters/codex.js +107 -0
  7. package/dist/agent/adapters/opencode.js +91 -0
  8. package/dist/agent/config.js +169 -0
  9. package/dist/agent/process.js +230 -0
  10. package/dist/agent/prompt.js +184 -0
  11. package/dist/agent/registry.js +57 -0
  12. package/dist/agent/types.js +12 -0
  13. package/dist/cli-args.js +70 -0
  14. package/dist/cli.js +184 -0
  15. package/dist/config.js +102 -0
  16. package/dist/daemon.js +109 -0
  17. package/dist/db.js +467 -0
  18. package/dist/git/taskstore.js +224 -0
  19. package/dist/git/worktree.js +248 -0
  20. package/dist/imports/connections.js +57 -0
  21. package/dist/imports/destination.js +2 -0
  22. package/dist/imports/linear.js +40 -0
  23. package/dist/imports/registry.js +4 -0
  24. package/dist/imports/types.js +1 -0
  25. package/dist/kaneo/client.js +47 -0
  26. package/dist/kaneo/issues.js +138 -0
  27. package/dist/kaneo/workspace.js +24 -0
  28. package/dist/linear/browse.js +55 -0
  29. package/dist/linear/client.js +48 -0
  30. package/dist/linear/issues.js +99 -0
  31. package/dist/linear/workspace.js +30 -0
  32. package/dist/paths.js +12 -0
  33. package/dist/pidfile.js +35 -0
  34. package/dist/projects.js +211 -0
  35. package/dist/review/decide.js +186 -0
  36. package/dist/review/loop.js +114 -0
  37. package/dist/runner.js +1281 -0
  38. package/dist/server/app.js +344 -0
  39. package/dist/server/imports.js +182 -0
  40. package/dist/server/tasks.js +77 -0
  41. package/dist/sources/branch.js +17 -0
  42. package/dist/sources/git-import.js +60 -0
  43. package/dist/sources/git.js +430 -0
  44. package/dist/sources/kaneo.js +156 -0
  45. package/dist/sources/lease.js +38 -0
  46. package/dist/sources/linear.js +186 -0
  47. package/dist/sources/options.js +26 -0
  48. package/dist/sources/registry.js +6 -0
  49. package/dist/sources/taskfile.js +190 -0
  50. package/dist/sources/types.js +1 -0
  51. package/package.json +63 -4
  52. package/public/agents.js +435 -0
  53. package/public/app.js +1200 -0
  54. package/public/imports.js +481 -0
  55. package/public/index.html +19 -0
  56. package/public/projects.js +481 -0
  57. package/public/style.css +1614 -0
  58. package/public/tasks.js +253 -0
  59. package/public/ui.js +165 -0
@@ -0,0 +1,1614 @@
1
+ /* Tokens from the Claude Design handoff (design_handoff_foreman_console/README.md). */
2
+ :root {
3
+ --bg: #f6f6f4;
4
+ --surface: #ffffff;
5
+ --surface-2: #f2f2ef;
6
+ --surface-3: #ebebe7;
7
+ --border: #e3e3de;
8
+ --border-strong: #cfcfc8;
9
+ --text: #1c1c1a;
10
+ --text-2: #5a5a55;
11
+ --text-3: #74746d;
12
+ --primary: #1c1c1a;
13
+ --primary-text: #ffffff;
14
+ --link: #2557c7;
15
+ --ok: #1d7a44;
16
+ --ok-bg: #e7f4eb;
17
+ --ok-border: #bfe0ca;
18
+ --fail: #c0362c;
19
+ --fail-bg: #fcebe9;
20
+ --fail-border: #f0c2bd;
21
+ --fail-row: #fdf5f4;
22
+ --warn: #965a00;
23
+ --warn-bg: #fdf3e0;
24
+ --warn-border: #efd6a4;
25
+ --run: #2557c7;
26
+ --run-bg: #e9effc;
27
+ --run-border: #c6d4f4;
28
+ --muted: #5f5f59;
29
+ --muted-bg: #efefeb;
30
+ --muted-border: #dadad4;
31
+ --log-bg: #fafaf8;
32
+ --overlay: rgba(28, 28, 26, 0.36);
33
+ --mono: ui-monospace, 'SF Mono', SFMono-Regular, Menlo, Consolas, monospace;
34
+ --sans: system-ui, -apple-system, 'Segoe UI', Helvetica, sans-serif;
35
+ }
36
+
37
+ @media (prefers-color-scheme: dark) {
38
+ :root {
39
+ --bg: #0f0f10;
40
+ --surface: #161618;
41
+ --surface-2: #1c1c1f;
42
+ --surface-3: #242428;
43
+ --border: #29292d;
44
+ --border-strong: #3a3a3f;
45
+ --text: #ececea;
46
+ --text-2: #a3a39d;
47
+ --text-3: #85857e;
48
+ --primary: #ececea;
49
+ --primary-text: #111112;
50
+ --link: #86a8ff;
51
+ --ok: #5cc985;
52
+ --ok-bg: #13261a;
53
+ --ok-border: #24492f;
54
+ --fail: #f2766b;
55
+ --fail-bg: #2c1512;
56
+ --fail-border: #5c2721;
57
+ --fail-row: #1b1211;
58
+ --warn: #e6b04e;
59
+ --warn-bg: #281e0b;
60
+ --warn-border: #4e3a15;
61
+ --run: #86a8ff;
62
+ --run-bg: #131c31;
63
+ --run-border: #283a63;
64
+ --muted: #a3a39d;
65
+ --muted-bg: #202023;
66
+ --muted-border: #34343a;
67
+ --log-bg: #121214;
68
+ --overlay: rgba(0, 0, 0, 0.6);
69
+ }
70
+ }
71
+
72
+ *,
73
+ *::before,
74
+ *::after {
75
+ box-sizing: border-box;
76
+ }
77
+
78
+ /* The design is specified in pixels at a 13px base; this scales all of it together. */
79
+ html {
80
+ zoom: 1.1;
81
+ }
82
+
83
+ html,
84
+ body {
85
+ height: 100%;
86
+ margin: 0;
87
+ }
88
+
89
+ body {
90
+ display: flex;
91
+ flex-direction: column;
92
+ background: var(--bg);
93
+ color: var(--text);
94
+ font: 13px/1.45 var(--sans);
95
+ -webkit-font-smoothing: antialiased;
96
+ }
97
+
98
+ a {
99
+ color: var(--link);
100
+ text-decoration: none;
101
+ }
102
+ a:hover {
103
+ text-decoration: underline;
104
+ }
105
+
106
+ button,
107
+ input {
108
+ font: inherit;
109
+ color: inherit;
110
+ }
111
+
112
+ svg {
113
+ flex: none;
114
+ }
115
+
116
+ .mono {
117
+ font-family: var(--mono);
118
+ }
119
+ .muted {
120
+ color: var(--text-2);
121
+ }
122
+ .faint {
123
+ color: var(--text-3);
124
+ }
125
+ .nowrap {
126
+ white-space: nowrap;
127
+ }
128
+ .spacer {
129
+ flex: 1;
130
+ }
131
+
132
+ @keyframes spin {
133
+ to {
134
+ transform: rotate(360deg);
135
+ }
136
+ }
137
+ @keyframes pulse {
138
+ 0%,
139
+ 100% {
140
+ opacity: 1;
141
+ }
142
+ 50% {
143
+ opacity: 0.35;
144
+ }
145
+ }
146
+ .spin {
147
+ animation: spin 0.9s linear infinite;
148
+ }
149
+ .pulse-dot {
150
+ width: 8px;
151
+ height: 8px;
152
+ border-radius: 50%;
153
+ background: currentColor;
154
+ animation: pulse 2s ease-in-out infinite;
155
+ }
156
+ @media (prefers-reduced-motion: reduce) {
157
+ .spin,
158
+ .pulse-dot {
159
+ animation: none;
160
+ }
161
+ }
162
+
163
+ /* Header */
164
+ .header {
165
+ display: flex;
166
+ align-items: center;
167
+ flex-wrap: wrap;
168
+ gap: 12px 18px;
169
+ padding: 10px 20px;
170
+ background: var(--surface);
171
+ border-bottom: 1px solid var(--border);
172
+ }
173
+ .wordmark {
174
+ font: 600 14px/1 var(--mono);
175
+ letter-spacing: -0.02em;
176
+ }
177
+ .header-mid {
178
+ display: flex;
179
+ align-items: center;
180
+ flex-wrap: wrap;
181
+ flex: 1 1 auto;
182
+ gap: 8px 16px;
183
+ min-width: 0;
184
+ }
185
+ .poll-info {
186
+ display: flex;
187
+ flex-wrap: wrap;
188
+ gap: 6px 16px;
189
+ font: 12px/1.2 var(--mono);
190
+ color: var(--text-2);
191
+ }
192
+ .poll-info b {
193
+ color: var(--text);
194
+ font-weight: 600;
195
+ }
196
+ .poll-info .value {
197
+ color: var(--text);
198
+ }
199
+ .controls {
200
+ display: flex;
201
+ align-items: center;
202
+ gap: 8px;
203
+ flex: none;
204
+ }
205
+ .action-error {
206
+ color: var(--fail);
207
+ font-size: 12px;
208
+ }
209
+
210
+ /* Buttons */
211
+ .btn {
212
+ display: inline-flex;
213
+ align-items: center;
214
+ gap: 6px;
215
+ flex: none;
216
+ height: 28px;
217
+ padding: 0 12px;
218
+ border-radius: 6px;
219
+ border: 1px solid var(--border-strong);
220
+ background: var(--surface);
221
+ color: var(--text);
222
+ font: 500 12.5px/1 var(--sans);
223
+ white-space: nowrap;
224
+ cursor: pointer;
225
+ }
226
+ .btn:focus-visible,
227
+ .tab:focus-visible,
228
+ .segment:focus-visible,
229
+ .run-row:focus-visible,
230
+ .compact-row:focus-visible,
231
+ .icon-btn:focus-visible {
232
+ outline: 2px solid var(--link);
233
+ outline-offset: 1px;
234
+ }
235
+ .btn.primary {
236
+ background: var(--primary);
237
+ border-color: var(--primary);
238
+ color: var(--primary-text);
239
+ }
240
+ .btn.danger {
241
+ color: var(--fail);
242
+ border-color: var(--fail-border);
243
+ }
244
+ .btn.danger-solid {
245
+ background: var(--fail);
246
+ border-color: var(--fail);
247
+ color: #ffffff;
248
+ font-weight: 600;
249
+ }
250
+ .btn.tall {
251
+ height: 30px;
252
+ padding: 0 14px;
253
+ }
254
+ .btn.small {
255
+ height: 24px;
256
+ padding: 0 9px;
257
+ border-radius: 4px;
258
+ font-size: 12px;
259
+ }
260
+ .btn:disabled {
261
+ background: var(--surface-3);
262
+ border-color: var(--surface-3);
263
+ color: var(--text-3);
264
+ cursor: not-allowed;
265
+ }
266
+ .icon-btn {
267
+ display: inline-flex;
268
+ align-items: center;
269
+ justify-content: center;
270
+ width: 26px;
271
+ height: 26px;
272
+ padding: 0;
273
+ border: 0;
274
+ border-radius: 6px;
275
+ background: transparent;
276
+ color: var(--text-2);
277
+ cursor: pointer;
278
+ }
279
+ .icon-btn:hover {
280
+ background: var(--surface-2);
281
+ color: var(--text);
282
+ }
283
+ .icon-btn.tiny {
284
+ width: 20px;
285
+ height: 20px;
286
+ }
287
+
288
+ /* Badges */
289
+ .badge {
290
+ display: inline-flex;
291
+ align-items: center;
292
+ gap: 5px;
293
+ height: 20px;
294
+ padding: 0 7px 0 5px;
295
+ border-radius: 4px;
296
+ border: 1px solid;
297
+ font: 500 11.5px/1 var(--sans);
298
+ white-space: nowrap;
299
+ }
300
+ .badge.large {
301
+ gap: 7px;
302
+ height: 26px;
303
+ padding: 0 10px;
304
+ border-radius: 6px;
305
+ font: 600 12.5px/1 var(--sans);
306
+ }
307
+ .badge .detail {
308
+ font-weight: 400;
309
+ color: var(--text-2);
310
+ }
311
+ .tone-ok {
312
+ background: var(--ok-bg);
313
+ color: var(--ok);
314
+ border-color: var(--ok-border);
315
+ }
316
+ .tone-run {
317
+ background: var(--run-bg);
318
+ color: var(--run);
319
+ border-color: var(--run-border);
320
+ }
321
+ .tone-fail {
322
+ background: var(--fail-bg);
323
+ color: var(--fail);
324
+ border-color: var(--fail-border);
325
+ }
326
+ .badge.tone-fail {
327
+ font-weight: 600;
328
+ }
329
+ .tone-warn {
330
+ background: var(--warn-bg);
331
+ color: var(--warn);
332
+ border-color: var(--warn-border);
333
+ }
334
+ .tone-muted {
335
+ background: var(--muted-bg);
336
+ color: var(--muted);
337
+ border-color: var(--muted-border);
338
+ }
339
+ .text-ok {
340
+ color: var(--ok);
341
+ }
342
+ .text-run {
343
+ color: var(--run);
344
+ }
345
+ .text-fail {
346
+ color: var(--fail);
347
+ }
348
+ .text-warn {
349
+ color: var(--warn);
350
+ }
351
+ .text-muted {
352
+ color: var(--muted);
353
+ }
354
+
355
+ /* Banners */
356
+ .banner {
357
+ display: flex;
358
+ align-items: flex-start;
359
+ gap: 10px;
360
+ padding: 10px 20px;
361
+ border-bottom: 1px solid;
362
+ }
363
+ .banner.inline {
364
+ padding: 10px 14px;
365
+ border: 1px solid;
366
+ border-radius: 6px;
367
+ }
368
+ .banner .body {
369
+ flex: 1;
370
+ min-width: 0;
371
+ display: flex;
372
+ flex-direction: column;
373
+ gap: 2px;
374
+ }
375
+ .banner .title {
376
+ font-weight: 600;
377
+ }
378
+ .banner .text {
379
+ font-size: 12.5px;
380
+ color: var(--text);
381
+ overflow-wrap: anywhere;
382
+ }
383
+ .banner svg {
384
+ margin-top: 1px;
385
+ }
386
+
387
+ /* Tabs */
388
+ .tabs {
389
+ display: flex;
390
+ gap: 4px;
391
+ padding: 0 14px;
392
+ background: var(--surface);
393
+ border-bottom: 1px solid var(--border);
394
+ }
395
+ .tab {
396
+ display: inline-flex;
397
+ align-items: center;
398
+ gap: 6px;
399
+ padding: 9px 8px 8px;
400
+ border: 0;
401
+ border-bottom: 2px solid transparent;
402
+ background: none;
403
+ color: var(--text-2);
404
+ font: 500 13px/1 var(--sans);
405
+ cursor: pointer;
406
+ }
407
+ .tab[aria-selected='true'] {
408
+ color: var(--text);
409
+ font-weight: 600;
410
+ border-bottom-color: var(--text);
411
+ }
412
+ .tab .count {
413
+ font: 11.5px/1 var(--mono);
414
+ color: var(--text-3);
415
+ }
416
+ .pill {
417
+ display: inline-flex;
418
+ align-items: center;
419
+ gap: 4px;
420
+ height: 18px;
421
+ padding: 0 7px;
422
+ border-radius: 9px;
423
+ border: 1px solid var(--fail-border);
424
+ background: var(--fail-bg);
425
+ color: var(--fail);
426
+ font: 600 11px/1 var(--sans);
427
+ }
428
+
429
+ /* Layout */
430
+ .main {
431
+ flex: 1;
432
+ min-height: 0;
433
+ overflow: auto;
434
+ display: flex;
435
+ flex-direction: column;
436
+ gap: 16px;
437
+ padding: 20px;
438
+ }
439
+ .card {
440
+ background: var(--surface);
441
+ border: 1px solid var(--border);
442
+ border-radius: 8px;
443
+ min-width: 0;
444
+ }
445
+ .card-head {
446
+ display: flex;
447
+ align-items: center;
448
+ gap: 10px;
449
+ padding: 12px 16px;
450
+ border-bottom: 1px solid var(--border);
451
+ }
452
+ .card-head h2,
453
+ .heading {
454
+ margin: 0;
455
+ font: 600 13px/1.2 var(--sans);
456
+ }
457
+ .card-head .sub {
458
+ font-size: 12px;
459
+ color: var(--text-3);
460
+ }
461
+ .columns {
462
+ display: flex;
463
+ flex-wrap: wrap;
464
+ align-items: flex-start;
465
+ gap: 16px;
466
+ flex: 1;
467
+ min-height: 0;
468
+ }
469
+ .col-main {
470
+ flex: 3 1 560px;
471
+ display: flex;
472
+ flex-direction: column;
473
+ gap: 16px;
474
+ min-width: 0;
475
+ align-self: stretch;
476
+ }
477
+ .col-aside {
478
+ flex: 1 1 280px;
479
+ display: flex;
480
+ flex-direction: column;
481
+ gap: 16px;
482
+ min-width: 0;
483
+ }
484
+ .narrow {
485
+ width: 100%;
486
+ max-width: 620px;
487
+ margin: 40px auto 0;
488
+ display: flex;
489
+ flex-direction: column;
490
+ gap: 16px;
491
+ }
492
+
493
+ /* Stopped / idle panels */
494
+ .stopped-card {
495
+ display: flex;
496
+ flex-direction: column;
497
+ gap: 16px;
498
+ padding: 24px;
499
+ }
500
+ .title-l {
501
+ margin: 0;
502
+ font: 600 18px/1.25 var(--sans);
503
+ }
504
+ .title-m {
505
+ margin: 0;
506
+ font: 600 15px/1.3 var(--sans);
507
+ }
508
+ .stopped-card p {
509
+ margin: 0;
510
+ color: var(--text-2);
511
+ }
512
+ .stopped-card p .mono {
513
+ color: var(--text);
514
+ }
515
+ .checklist {
516
+ border: 1px solid var(--border);
517
+ border-radius: 6px;
518
+ }
519
+ .checklist .row {
520
+ display: grid;
521
+ grid-template-columns: 140px minmax(0, 1fr) auto;
522
+ gap: 12px;
523
+ align-items: center;
524
+ padding: 8px 12px;
525
+ border-top: 1px solid var(--border);
526
+ }
527
+ .checklist .row:first-child {
528
+ border-top: 0;
529
+ }
530
+ .checklist .value {
531
+ font: 12px/1.4 var(--mono);
532
+ overflow-wrap: anywhere;
533
+ }
534
+ .actions {
535
+ display: flex;
536
+ align-items: center;
537
+ flex-wrap: wrap;
538
+ gap: 8px;
539
+ }
540
+ .empty {
541
+ padding: 20px;
542
+ border: 1px dashed var(--border-strong);
543
+ border-radius: 8px;
544
+ text-align: center;
545
+ color: var(--text-2);
546
+ }
547
+ .empty strong {
548
+ display: block;
549
+ color: var(--text);
550
+ font-weight: 600;
551
+ }
552
+ .idle-panel {
553
+ display: flex;
554
+ flex-wrap: wrap;
555
+ gap: 16px 32px;
556
+ padding: 16px 18px;
557
+ }
558
+ .idle-panel .lead {
559
+ flex: 1 1 320px;
560
+ display: flex;
561
+ flex-direction: column;
562
+ gap: 4px;
563
+ color: var(--text-2);
564
+ }
565
+ .idle-panel .lead .title-m {
566
+ color: var(--text);
567
+ }
568
+ .countdown {
569
+ flex: 0 1 260px;
570
+ min-width: 180px;
571
+ display: flex;
572
+ flex-direction: column;
573
+ gap: 6px;
574
+ font: 12px/1.2 var(--mono);
575
+ color: var(--text-2);
576
+ }
577
+ .countdown .row {
578
+ display: flex;
579
+ justify-content: space-between;
580
+ }
581
+ .countdown .row b {
582
+ color: var(--text);
583
+ font-variant-numeric: tabular-nums;
584
+ }
585
+ .bar {
586
+ height: 4px;
587
+ border-radius: 2px;
588
+ background: var(--surface-3);
589
+ overflow: hidden;
590
+ }
591
+ .bar > i {
592
+ display: block;
593
+ height: 100%;
594
+ background: var(--text-3);
595
+ }
596
+ .bar.thin {
597
+ width: 120px;
598
+ height: 3px;
599
+ }
600
+ .bar.thin > i {
601
+ background: var(--run);
602
+ }
603
+
604
+ /* Run header */
605
+ .run-head {
606
+ display: flex;
607
+ flex-direction: column;
608
+ gap: 14px;
609
+ padding: 16px 18px;
610
+ }
611
+ .run-head .top {
612
+ display: flex;
613
+ align-items: flex-start;
614
+ gap: 16px;
615
+ }
616
+ .run-head .issue {
617
+ flex: 1;
618
+ min-width: 0;
619
+ display: flex;
620
+ flex-direction: column;
621
+ gap: 4px;
622
+ }
623
+ .issue-link {
624
+ font: 500 12px/1.2 var(--mono);
625
+ }
626
+ .run-head .elapsed {
627
+ display: flex;
628
+ flex-direction: column;
629
+ align-items: flex-end;
630
+ gap: 5px;
631
+ flex: none;
632
+ }
633
+ .figure {
634
+ font: 600 20px/1 var(--mono);
635
+ font-variant-numeric: tabular-nums;
636
+ }
637
+ .caption {
638
+ font-size: 11.5px;
639
+ color: var(--text-3);
640
+ }
641
+ .meta {
642
+ display: flex;
643
+ align-items: center;
644
+ flex-wrap: wrap;
645
+ gap: 6px 14px;
646
+ font: 12px/1.4 var(--mono);
647
+ color: var(--text-2);
648
+ }
649
+ .meta .item {
650
+ display: inline-flex;
651
+ align-items: center;
652
+ gap: 5px;
653
+ min-width: 0;
654
+ overflow-wrap: anywhere;
655
+ }
656
+
657
+ /* Stepper */
658
+ .stepper {
659
+ display: flex;
660
+ padding-top: 14px;
661
+ border-top: 1px solid var(--border);
662
+ }
663
+ .stepper.bare {
664
+ padding: 14px 18px;
665
+ border-top: 0;
666
+ }
667
+ .step {
668
+ flex: 1 1 0;
669
+ min-width: 0;
670
+ display: flex;
671
+ flex-direction: column;
672
+ gap: 7px;
673
+ }
674
+ .step .track {
675
+ display: flex;
676
+ align-items: center;
677
+ gap: 6px;
678
+ padding-right: 6px;
679
+ }
680
+ .step .dot {
681
+ display: inline-flex;
682
+ align-items: center;
683
+ justify-content: center;
684
+ width: 20px;
685
+ height: 20px;
686
+ flex: none;
687
+ border-radius: 50%;
688
+ border: 1px solid var(--border-strong);
689
+ background: var(--surface);
690
+ color: var(--text-3);
691
+ font: 500 11px/1 var(--mono);
692
+ }
693
+ .step .line {
694
+ flex: 1;
695
+ height: 1px;
696
+ background: var(--border);
697
+ }
698
+ .step:last-child .line {
699
+ display: none;
700
+ }
701
+ .step .label {
702
+ font-size: 12.5px;
703
+ color: var(--text-3);
704
+ white-space: nowrap;
705
+ overflow: hidden;
706
+ text-overflow: ellipsis;
707
+ }
708
+ .step.done .dot {
709
+ background: var(--ok-bg);
710
+ border-color: var(--ok-border);
711
+ color: var(--ok);
712
+ }
713
+ .step.done .line {
714
+ background: var(--ok-border);
715
+ }
716
+ .step.done .label {
717
+ color: var(--text);
718
+ }
719
+ .step.active .dot {
720
+ background: var(--run-bg);
721
+ border-color: var(--run-border);
722
+ color: var(--run);
723
+ }
724
+ .step.fail .dot {
725
+ background: var(--fail-bg);
726
+ border-color: var(--fail-border);
727
+ color: var(--fail);
728
+ }
729
+ .step.abort .dot {
730
+ background: var(--muted-bg);
731
+ border-color: var(--muted-border);
732
+ color: var(--muted);
733
+ }
734
+ .step.active .label,
735
+ .step.fail .label,
736
+ .step.abort .label {
737
+ color: var(--text);
738
+ font-weight: 600;
739
+ }
740
+
741
+ /* Log viewer */
742
+ .log-card {
743
+ display: flex;
744
+ flex-direction: column;
745
+ flex: 1;
746
+ min-height: 260px;
747
+ }
748
+ .log-toolbar {
749
+ display: flex;
750
+ align-items: center;
751
+ gap: 10px;
752
+ padding: 8px 10px 8px 14px;
753
+ border-bottom: 1px solid var(--border);
754
+ }
755
+ .log-toolbar .count {
756
+ font: 11.5px/1 var(--mono);
757
+ color: var(--text-3);
758
+ }
759
+ .log-body {
760
+ flex: 1 1 0;
761
+ min-height: 0;
762
+ overflow: auto;
763
+ padding: 6px 0;
764
+ background: var(--log-bg);
765
+ border-radius: 0 0 8px 8px;
766
+ font: 12px/1.7 var(--mono);
767
+ }
768
+ .log-body.fixed {
769
+ flex: none;
770
+ height: 260px;
771
+ }
772
+ .log-line {
773
+ display: grid;
774
+ grid-template-columns: 64px 50px minmax(0, 1fr);
775
+ gap: 10px;
776
+ padding: 0 14px;
777
+ }
778
+ .log-line .time {
779
+ color: var(--text-3);
780
+ font-variant-numeric: tabular-nums;
781
+ }
782
+ .log-line .text {
783
+ color: var(--text-2);
784
+ white-space: pre-wrap;
785
+ overflow-wrap: anywhere;
786
+ }
787
+ .log-line .text b {
788
+ color: var(--text);
789
+ font-weight: 600;
790
+ }
791
+ .log-line.kind-system .kind {
792
+ color: var(--text-3);
793
+ }
794
+ .log-line.kind-agent .kind {
795
+ color: var(--text-2);
796
+ }
797
+ .log-line.kind-agent .text {
798
+ color: var(--text);
799
+ }
800
+ .log-line.kind-tool .kind {
801
+ color: var(--run);
802
+ }
803
+ .log-line.kind-result .kind {
804
+ color: var(--ok);
805
+ }
806
+ .log-empty {
807
+ padding: 10px 14px;
808
+ color: var(--text-3);
809
+ }
810
+
811
+ /* Key/value lists */
812
+ .kv {
813
+ display: flex;
814
+ flex-direction: column;
815
+ }
816
+ .kv .row {
817
+ display: flex;
818
+ justify-content: space-between;
819
+ gap: 12px;
820
+ padding: 8px 16px;
821
+ border-top: 1px solid var(--border);
822
+ color: var(--text-2);
823
+ }
824
+ .kv .row:first-child {
825
+ border-top: 0;
826
+ }
827
+ .kv .row .v {
828
+ font: 12px/1.45 var(--mono);
829
+ color: var(--text);
830
+ text-align: right;
831
+ overflow-wrap: anywhere;
832
+ }
833
+ .kv-grid {
834
+ display: grid;
835
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
836
+ gap: 14px 20px;
837
+ padding: 14px 18px;
838
+ }
839
+ .kv-grid .k {
840
+ font: 500 11.5px/1 var(--sans);
841
+ letter-spacing: 0.04em;
842
+ text-transform: uppercase;
843
+ color: var(--text-3);
844
+ margin-bottom: 5px;
845
+ }
846
+ .kv-grid .v {
847
+ font: 12px/1.4 var(--mono);
848
+ word-break: break-all;
849
+ }
850
+
851
+ /* Run rows */
852
+ .runs-head,
853
+ .run-row {
854
+ display: grid;
855
+ grid-template-columns: 104px minmax(0, 1.4fr) 110px 110px 76px 76px minmax(0, 1fr);
856
+ gap: 12px;
857
+ align-items: center;
858
+ padding: 0 16px;
859
+ }
860
+ .runs-head {
861
+ height: 30px;
862
+ background: var(--surface-2);
863
+ border-top: 1px solid var(--border);
864
+ font: 500 11.5px/1 var(--sans);
865
+ letter-spacing: 0.04em;
866
+ text-transform: uppercase;
867
+ color: var(--text-3);
868
+ }
869
+ .day-row {
870
+ padding: 6px 16px;
871
+ background: var(--surface-2);
872
+ border-top: 1px solid var(--border);
873
+ font: 500 11.5px/1.2 var(--sans);
874
+ color: var(--text-2);
875
+ }
876
+ .run-row {
877
+ width: 100%;
878
+ height: 38px;
879
+ border: 0;
880
+ border-top: 1px solid var(--border);
881
+ background: none;
882
+ text-align: left;
883
+ cursor: pointer;
884
+ }
885
+ .run-row:hover,
886
+ .compact-row:hover {
887
+ background: var(--surface-2);
888
+ }
889
+ .run-row.failed {
890
+ background: var(--fail-row);
891
+ }
892
+ .run-row .issue {
893
+ display: flex;
894
+ gap: 8px;
895
+ min-width: 0;
896
+ }
897
+ .run-row .issue .id {
898
+ font: 12px/1.45 var(--mono);
899
+ color: var(--text-2);
900
+ flex: none;
901
+ }
902
+ .ellipsis {
903
+ overflow: hidden;
904
+ text-overflow: ellipsis;
905
+ white-space: nowrap;
906
+ min-width: 0;
907
+ }
908
+ .run-row .num {
909
+ font: 12px/1 var(--mono);
910
+ color: var(--text-2);
911
+ }
912
+ .run-row .result {
913
+ font-size: 12.5px;
914
+ }
915
+ .run-row .result a {
916
+ font: 12px/1 var(--mono);
917
+ }
918
+ .compact-row {
919
+ display: flex;
920
+ flex-direction: column;
921
+ gap: 3px;
922
+ width: 100%;
923
+ padding: 8px 14px;
924
+ border: 0;
925
+ border-top: 1px solid var(--border);
926
+ background: none;
927
+ text-align: left;
928
+ cursor: pointer;
929
+ }
930
+ .compact-row .line1 {
931
+ display: flex;
932
+ align-items: center;
933
+ gap: 7px;
934
+ min-width: 0;
935
+ }
936
+ .compact-row .line1 .id {
937
+ font: 12px/1.3 var(--mono);
938
+ color: var(--text-2);
939
+ flex: none;
940
+ }
941
+ .compact-row .line2 {
942
+ font: 11.5px/1.3 var(--mono);
943
+ color: var(--text-3);
944
+ padding-left: 21px;
945
+ }
946
+ .compact-row.failed .line2 {
947
+ color: var(--fail);
948
+ }
949
+ .compact-row.selected {
950
+ background: var(--fail-bg);
951
+ box-shadow: inset 0 0 0 1px var(--fail-border);
952
+ }
953
+ .compact-row.selected:not(.failed) {
954
+ background: var(--surface-2);
955
+ box-shadow: inset 0 0 0 1px var(--border-strong);
956
+ }
957
+ .list-foot {
958
+ display: flex;
959
+ justify-content: center;
960
+ padding: 10px;
961
+ border-top: 1px solid var(--border);
962
+ }
963
+ .list-empty {
964
+ padding: 24px 16px;
965
+ border-top: 1px solid var(--border);
966
+ text-align: center;
967
+ color: var(--text-2);
968
+ }
969
+
970
+ /* History */
971
+ .toolbar {
972
+ display: flex;
973
+ align-items: center;
974
+ gap: 12px;
975
+ padding: 10px 12px;
976
+ }
977
+ .segmented {
978
+ display: inline-flex;
979
+ padding: 2px;
980
+ border: 1px solid var(--border);
981
+ border-radius: 6px;
982
+ background: var(--surface-2);
983
+ }
984
+ .segment {
985
+ display: inline-flex;
986
+ align-items: center;
987
+ gap: 6px;
988
+ height: 24px;
989
+ padding: 0 10px;
990
+ border: 1px solid transparent;
991
+ border-radius: 4px;
992
+ background: none;
993
+ color: var(--text-2);
994
+ font: 500 12.5px/1 var(--sans);
995
+ cursor: pointer;
996
+ }
997
+ .segment[aria-pressed='true'] {
998
+ background: var(--surface);
999
+ border-color: var(--border-strong);
1000
+ color: var(--text);
1001
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.06);
1002
+ }
1003
+ .segment .count {
1004
+ font: 11.5px/1 var(--mono);
1005
+ color: var(--text-3);
1006
+ }
1007
+ .split {
1008
+ display: flex;
1009
+ flex-wrap: wrap;
1010
+ align-items: flex-start;
1011
+ gap: 16px;
1012
+ }
1013
+ .split-list {
1014
+ flex: 1 1 380px;
1015
+ }
1016
+ .split-detail {
1017
+ flex: 1.5 1 480px;
1018
+ }
1019
+ .split-list .compact-row:first-of-type {
1020
+ border-top: 0;
1021
+ }
1022
+ .detail-head {
1023
+ display: flex;
1024
+ flex-direction: column;
1025
+ gap: 8px;
1026
+ padding: 16px 18px;
1027
+ }
1028
+ .detail-head .top {
1029
+ display: flex;
1030
+ align-items: center;
1031
+ gap: 10px;
1032
+ }
1033
+ .detail-head h2 {
1034
+ margin: 0;
1035
+ font: 600 17px/1.3 var(--sans);
1036
+ }
1037
+ .section {
1038
+ border-top: 1px solid var(--border);
1039
+ }
1040
+ .failure-box {
1041
+ margin: 0 18px 16px;
1042
+ padding: 11px 13px;
1043
+ border: 1px solid var(--fail-border);
1044
+ border-radius: 6px;
1045
+ background: var(--fail-bg);
1046
+ display: flex;
1047
+ flex-direction: column;
1048
+ gap: 8px;
1049
+ }
1050
+ .failure-box.aborted {
1051
+ border-color: var(--muted-border);
1052
+ background: var(--muted-bg);
1053
+ }
1054
+ .failure-box .title {
1055
+ font-weight: 600;
1056
+ color: var(--fail);
1057
+ overflow-wrap: anywhere;
1058
+ }
1059
+ .failure-box.aborted .title {
1060
+ color: var(--text);
1061
+ }
1062
+ .failure-box.blocked {
1063
+ border-color: var(--warn-border);
1064
+ background: var(--warn-bg);
1065
+ }
1066
+ .failure-box.blocked .title {
1067
+ color: var(--warn);
1068
+ }
1069
+ .failure-box .text {
1070
+ font-size: 12.5px;
1071
+ }
1072
+
1073
+ /* Config */
1074
+ .config {
1075
+ width: 100%;
1076
+ max-width: 820px;
1077
+ display: flex;
1078
+ flex-direction: column;
1079
+ gap: 16px;
1080
+ padding-bottom: 56px;
1081
+ }
1082
+ .fields {
1083
+ display: grid;
1084
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
1085
+ gap: 14px 20px;
1086
+ padding: 14px 16px;
1087
+ }
1088
+ .field {
1089
+ display: flex;
1090
+ flex-direction: column;
1091
+ gap: 6px;
1092
+ min-width: 0;
1093
+ }
1094
+ .field .label-row {
1095
+ display: flex;
1096
+ align-items: baseline;
1097
+ justify-content: space-between;
1098
+ gap: 8px;
1099
+ min-height: 14px;
1100
+ }
1101
+ .field label,
1102
+ .field .label {
1103
+ font: 500 12px/1.2 var(--sans);
1104
+ color: var(--text-2);
1105
+ }
1106
+ .field .unit {
1107
+ font-weight: 400;
1108
+ color: var(--text-3);
1109
+ }
1110
+ .field .modified {
1111
+ font-size: 11.5px;
1112
+ color: var(--warn);
1113
+ white-space: nowrap;
1114
+ overflow: hidden;
1115
+ text-overflow: ellipsis;
1116
+ }
1117
+ .input {
1118
+ width: 100%;
1119
+ height: 30px;
1120
+ padding: 0 9px;
1121
+ border: 1px solid var(--border-strong);
1122
+ border-radius: 6px;
1123
+ background: var(--surface);
1124
+ color: var(--text);
1125
+ font: 12.5px/1 var(--mono);
1126
+ }
1127
+ .input:focus {
1128
+ outline: none;
1129
+ border-color: var(--link);
1130
+ box-shadow: 0 0 0 3px var(--run-bg);
1131
+ }
1132
+ .input.readonly {
1133
+ display: flex;
1134
+ align-items: center;
1135
+ background: var(--surface-2);
1136
+ border-color: var(--border);
1137
+ color: var(--text-2);
1138
+ overflow: hidden;
1139
+ white-space: nowrap;
1140
+ text-overflow: ellipsis;
1141
+ }
1142
+ .field.error label {
1143
+ color: var(--fail);
1144
+ }
1145
+ .field.error .input {
1146
+ border-color: var(--fail);
1147
+ box-shadow: 0 0 0 3px var(--fail-bg);
1148
+ }
1149
+ .field .help {
1150
+ font-size: 11.5px;
1151
+ color: var(--text-3);
1152
+ }
1153
+ .field.error .help {
1154
+ color: var(--fail);
1155
+ }
1156
+ .secret {
1157
+ display: flex;
1158
+ align-items: center;
1159
+ gap: 8px;
1160
+ height: 30px;
1161
+ font: 12px/1 var(--mono);
1162
+ color: var(--text-2);
1163
+ }
1164
+ .tools {
1165
+ display: flex;
1166
+ flex-direction: column;
1167
+ gap: 6px;
1168
+ padding: 14px 16px;
1169
+ }
1170
+ .tool {
1171
+ display: flex;
1172
+ align-items: center;
1173
+ gap: 8px;
1174
+ height: 30px;
1175
+ padding: 0 6px 0 10px;
1176
+ border-radius: 6px;
1177
+ background: var(--surface-2);
1178
+ font: 12.5px/1 var(--mono);
1179
+ }
1180
+ .tool .name {
1181
+ flex: 1;
1182
+ min-width: 0;
1183
+ overflow: hidden;
1184
+ text-overflow: ellipsis;
1185
+ white-space: nowrap;
1186
+ }
1187
+ .tool-add {
1188
+ display: flex;
1189
+ gap: 8px;
1190
+ margin-top: 4px;
1191
+ }
1192
+ .tool-add .input {
1193
+ border-style: dashed;
1194
+ }
1195
+ .save-bar {
1196
+ position: sticky;
1197
+ bottom: -20px;
1198
+ display: flex;
1199
+ align-items: center;
1200
+ flex-wrap: wrap;
1201
+ gap: 8px 14px;
1202
+ margin: 0 -20px -20px;
1203
+ padding: 10px 20px;
1204
+ background: var(--surface);
1205
+ border-top: 1px solid var(--border);
1206
+ box-shadow: 0 -4px 12px rgba(0, 0, 0, 0.04);
1207
+ }
1208
+ .save-bar .note {
1209
+ display: inline-flex;
1210
+ align-items: center;
1211
+ gap: 6px;
1212
+ font-size: 12.5px;
1213
+ color: var(--text-2);
1214
+ }
1215
+ .save-bar .note.warn {
1216
+ color: var(--warn);
1217
+ }
1218
+ .save-bar .note.fail {
1219
+ color: var(--fail);
1220
+ }
1221
+ .save-bar .note.ok {
1222
+ color: var(--ok);
1223
+ }
1224
+ .dot {
1225
+ width: 7px;
1226
+ height: 7px;
1227
+ border-radius: 50%;
1228
+ background: currentColor;
1229
+ flex: none;
1230
+ }
1231
+
1232
+ /* Dialog */
1233
+ .dialog {
1234
+ width: calc(100% - 40px);
1235
+ max-width: 440px;
1236
+ padding: 0;
1237
+ border: 1px solid var(--border);
1238
+ border-radius: 10px;
1239
+ background: var(--surface);
1240
+ color: var(--text);
1241
+ box-shadow: 0 12px 40px rgba(0, 0, 0, 0.22);
1242
+ }
1243
+ .dialog::backdrop {
1244
+ background: var(--overlay);
1245
+ }
1246
+ .dialog .body {
1247
+ display: flex;
1248
+ gap: 12px;
1249
+ padding: 18px 20px 16px;
1250
+ }
1251
+ .dialog .mark {
1252
+ display: inline-flex;
1253
+ align-items: center;
1254
+ justify-content: center;
1255
+ width: 28px;
1256
+ height: 28px;
1257
+ flex: none;
1258
+ border-radius: 50%;
1259
+ background: var(--fail-bg);
1260
+ color: var(--fail);
1261
+ }
1262
+ .dialog h2 {
1263
+ margin: 4px 0 8px;
1264
+ font: 600 15px/1.3 var(--sans);
1265
+ }
1266
+ .dialog p {
1267
+ margin: 0 0 8px;
1268
+ color: var(--text-2);
1269
+ }
1270
+ .dialog p b {
1271
+ color: var(--text);
1272
+ font-weight: 600;
1273
+ }
1274
+ .dialog p .mono {
1275
+ color: var(--text);
1276
+ font-size: 12px;
1277
+ overflow-wrap: anywhere;
1278
+ }
1279
+ .dialog .foot {
1280
+ display: flex;
1281
+ justify-content: flex-end;
1282
+ gap: 8px;
1283
+ padding: 12px 20px;
1284
+ border-top: 1px solid var(--border);
1285
+ border-radius: 0 0 10px 10px;
1286
+ background: var(--surface-2);
1287
+ }
1288
+
1289
+ /* Active runs selector */
1290
+ .strip {
1291
+ display: flex;
1292
+ flex-direction: column;
1293
+ border: 1px solid var(--border);
1294
+ border-radius: 8px;
1295
+ background: var(--surface);
1296
+ overflow: hidden;
1297
+ }
1298
+ .strip-item {
1299
+ display: grid;
1300
+ grid-template-columns: auto auto minmax(0, 1fr) auto;
1301
+ gap: 10px;
1302
+ align-items: center;
1303
+ height: 34px;
1304
+ padding: 0 14px;
1305
+ border: 0;
1306
+ border-top: 1px solid var(--border);
1307
+ background: none;
1308
+ color: var(--text);
1309
+ text-align: left;
1310
+ cursor: pointer;
1311
+ }
1312
+ .strip-item:first-child {
1313
+ border-top: 0;
1314
+ }
1315
+ .strip-item:hover {
1316
+ background: var(--surface-2);
1317
+ }
1318
+ .strip-item svg {
1319
+ color: var(--run);
1320
+ }
1321
+ .strip-item .mono {
1322
+ font-size: 12px;
1323
+ color: var(--text-2);
1324
+ }
1325
+ .strip-item .faint {
1326
+ font-size: 12px;
1327
+ }
1328
+ .strip-item[aria-pressed='true'] {
1329
+ background: var(--run-bg);
1330
+ box-shadow: inset 0 0 0 1px var(--run-border);
1331
+ font-weight: 600;
1332
+ }
1333
+ .strip-item:focus-visible {
1334
+ outline: 2px solid var(--link);
1335
+ outline-offset: -2px;
1336
+ }
1337
+
1338
+ /* Agents */
1339
+ .agent-head {
1340
+ flex-wrap: wrap;
1341
+ }
1342
+ .agent-head .order {
1343
+ display: inline-flex;
1344
+ gap: 2px;
1345
+ }
1346
+ .agent-head .icon-btn:disabled {
1347
+ color: var(--border-strong);
1348
+ cursor: default;
1349
+ background: none;
1350
+ }
1351
+ .switch {
1352
+ display: inline-flex;
1353
+ align-items: center;
1354
+ gap: 6px;
1355
+ font: 500 12.5px/1 var(--sans);
1356
+ color: var(--text-2);
1357
+ cursor: pointer;
1358
+ }
1359
+ .switch input {
1360
+ width: 15px;
1361
+ height: 15px;
1362
+ margin: 0;
1363
+ accent-color: var(--ok);
1364
+ cursor: pointer;
1365
+ }
1366
+ .notes {
1367
+ margin: 0;
1368
+ padding: 12px 16px 0 34px;
1369
+ font-size: 12px;
1370
+ color: var(--text-2);
1371
+ }
1372
+ .notes li + li {
1373
+ margin-top: 3px;
1374
+ }
1375
+ select.input {
1376
+ padding: 0 6px;
1377
+ }
1378
+ .field.wide {
1379
+ grid-column: 1 / -1;
1380
+ }
1381
+ .field.wide .tools {
1382
+ padding: 0;
1383
+ }
1384
+
1385
+ .usage-line {
1386
+ padding: 12px 16px 0;
1387
+ font-size: 12.5px;
1388
+ }
1389
+ .usage-line b {
1390
+ font-weight: 600;
1391
+ }
1392
+
1393
+ /* Agents capacity row and per-project status */
1394
+ .agents-row {
1395
+ display: flex;
1396
+ align-items: center;
1397
+ flex-wrap: wrap;
1398
+ gap: 8px 10px;
1399
+ padding: 10px 16px;
1400
+ }
1401
+ .agent-chip {
1402
+ height: 24px;
1403
+ padding: 0 9px 0 7px;
1404
+ font-weight: 400;
1405
+ }
1406
+ .agent-chip b {
1407
+ font-weight: 600;
1408
+ }
1409
+ .project-row {
1410
+ display: grid;
1411
+ grid-template-columns: minmax(0, 1fr) auto auto minmax(0, 2fr) auto;
1412
+ gap: 10px;
1413
+ align-items: center;
1414
+ min-height: 40px;
1415
+ padding: 6px 16px;
1416
+ border-top: 1px solid var(--border);
1417
+ font-size: 12.5px;
1418
+ }
1419
+ .project-row .name {
1420
+ font-weight: 600;
1421
+ font-size: 13px;
1422
+ }
1423
+ .col-aside .project-row {
1424
+ grid-template-columns: minmax(0, 1fr) auto auto;
1425
+ }
1426
+ .col-aside .project-row > :nth-child(2),
1427
+ .col-aside .project-row > :nth-child(4) {
1428
+ display: none;
1429
+ }
1430
+ .checks {
1431
+ display: flex;
1432
+ flex-wrap: wrap;
1433
+ gap: 8px 18px;
1434
+ padding: 4px 0;
1435
+ }
1436
+ .project-filter {
1437
+ width: auto;
1438
+ max-width: 220px;
1439
+ height: 28px;
1440
+ }
1441
+ .text-ok {
1442
+ color: var(--ok);
1443
+ }
1444
+ .config > .title-l {
1445
+ margin: 0 0 -4px;
1446
+ }
1447
+ .usage-line[hidden] {
1448
+ display: none;
1449
+ }
1450
+
1451
+ .lookup-row {
1452
+ display: flex;
1453
+ align-items: center;
1454
+ flex-wrap: wrap;
1455
+ gap: 8px 12px;
1456
+ padding: 0 16px 14px;
1457
+ font-size: 12.5px;
1458
+ }
1459
+
1460
+ .review-tag {
1461
+ height: 18px;
1462
+ padding: 0 6px;
1463
+ flex: none;
1464
+ font-size: 11px;
1465
+ }
1466
+
1467
+ /* Import tab */
1468
+ .import-conn {
1469
+ display: flex;
1470
+ align-items: center;
1471
+ gap: 12px;
1472
+ padding: 10px 16px;
1473
+ border-top: 1px solid var(--border);
1474
+ }
1475
+ .import-head,
1476
+ .import-row {
1477
+ display: grid;
1478
+ grid-template-columns: 24px 84px minmax(0, 1.6fr) 96px 120px minmax(0, 1fr);
1479
+ gap: 12px;
1480
+ align-items: center;
1481
+ padding: 0 16px;
1482
+ }
1483
+ .import-head {
1484
+ height: 30px;
1485
+ background: var(--surface-2);
1486
+ border-top: 1px solid var(--border);
1487
+ font: 500 11.5px/1 var(--sans);
1488
+ letter-spacing: 0.04em;
1489
+ text-transform: uppercase;
1490
+ color: var(--text-3);
1491
+ }
1492
+ .import-row {
1493
+ min-height: 38px;
1494
+ border-top: 1px solid var(--border);
1495
+ font-size: 12.5px;
1496
+ }
1497
+ .import-row.done {
1498
+ color: var(--text-3);
1499
+ }
1500
+ .import-title {
1501
+ display: flex;
1502
+ align-items: center;
1503
+ gap: 8px;
1504
+ min-width: 0;
1505
+ padding: 0;
1506
+ border: 0;
1507
+ background: none;
1508
+ color: inherit;
1509
+ font: inherit;
1510
+ text-align: left;
1511
+ cursor: pointer;
1512
+ }
1513
+ .import-title:hover .ellipsis {
1514
+ text-decoration: underline;
1515
+ }
1516
+ .import-detail {
1517
+ padding: 10px 16px 14px 52px;
1518
+ border-top: 1px solid var(--border);
1519
+ background: var(--surface-2);
1520
+ }
1521
+ .import-meta {
1522
+ display: flex;
1523
+ flex-wrap: wrap;
1524
+ gap: 6px 16px;
1525
+ margin-bottom: 8px;
1526
+ font-size: 12px;
1527
+ }
1528
+ .import-desc {
1529
+ margin: 0;
1530
+ max-height: 280px;
1531
+ overflow: auto;
1532
+ white-space: pre-wrap;
1533
+ word-break: break-word;
1534
+ font: 12.5px/1.5 var(--sans);
1535
+ }
1536
+ .import-failures {
1537
+ padding: 0 16px 10px;
1538
+ font-size: 12px;
1539
+ color: var(--fail);
1540
+ }
1541
+
1542
+ /* ---------- tasks tab ---------- */
1543
+ .tasks-where {
1544
+ display: flex;
1545
+ flex-wrap: wrap;
1546
+ align-items: baseline;
1547
+ gap: 6px 16px;
1548
+ padding: 0 16px 14px;
1549
+ font-size: 12.5px;
1550
+ }
1551
+ .tasks-where .mono {
1552
+ min-width: 0;
1553
+ max-width: 100%;
1554
+ }
1555
+ .task-group summary {
1556
+ display: flex;
1557
+ align-items: center;
1558
+ gap: 8px;
1559
+ padding: 10px 16px;
1560
+ border-top: 1px solid var(--border);
1561
+ cursor: pointer;
1562
+ user-select: none;
1563
+ }
1564
+ .task-group:first-child summary {
1565
+ border-top: 0;
1566
+ }
1567
+ .task-group summary::marker {
1568
+ color: var(--text-3);
1569
+ }
1570
+ .task-state {
1571
+ font-weight: 600;
1572
+ font-size: 12.5px;
1573
+ }
1574
+ .task-count {
1575
+ padding: 1px 6px;
1576
+ border-radius: 999px;
1577
+ background: var(--surface-2);
1578
+ font: 500 11px/1.4 var(--mono);
1579
+ color: var(--text-2);
1580
+ }
1581
+ .task-empty {
1582
+ padding: 0 16px 12px 36px;
1583
+ font-size: 12.5px;
1584
+ color: var(--text-3);
1585
+ }
1586
+ .task-head,
1587
+ .task-row {
1588
+ display: grid;
1589
+ grid-template-columns: 84px minmax(0, 1.6fr) 96px minmax(0, 1fr) 120px;
1590
+ gap: 12px;
1591
+ align-items: center;
1592
+ padding: 0 16px;
1593
+ }
1594
+ .task-head {
1595
+ height: 30px;
1596
+ background: var(--surface-2);
1597
+ border-top: 1px solid var(--border);
1598
+ font: 500 11.5px/1 var(--sans);
1599
+ letter-spacing: 0.04em;
1600
+ text-transform: uppercase;
1601
+ color: var(--text-3);
1602
+ }
1603
+ .task-row {
1604
+ min-height: 38px;
1605
+ border-top: 1px solid var(--border);
1606
+ font-size: 12.5px;
1607
+ }
1608
+ textarea.input {
1609
+ height: auto;
1610
+ min-height: 96px;
1611
+ padding: 8px 9px;
1612
+ font: 12.5px/1.5 var(--mono);
1613
+ resize: vertical;
1614
+ }