wisp-agents 0.6.0 → 0.8.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.
package/web/css/app.css CHANGED
@@ -167,7 +167,7 @@ select {
167
167
 
168
168
  /* ---------- layout: one column — top bar, launcher, feed ---------- */
169
169
  .stage {
170
- position: relative; height: 100vh; overflow-y: auto; overflow-x: hidden; scroll-padding-top: 64px;
170
+ position: relative; height: 100vh; overflow-y: auto; overflow-x: hidden; scroll-padding-top: 116px; /* top bar + docked launcher */
171
171
  /* reserve the gutter on both sides so the scrollbar appearing never shifts or off-centres the layout */
172
172
  scrollbar-gutter: stable both-edges;
173
173
  }
@@ -196,11 +196,12 @@ select {
196
196
  .topbar.scrolled { border-bottom-color: var(--line); }
197
197
 
198
198
  .to-top {
199
- position: fixed; top: 64px; left: 0; right: 0; margin-inline: auto; z-index: 20; display: grid; place-items: center;
200
- width: 38px; height: 38px; border-radius: 50%; color: var(--ink-2);
199
+ position: fixed; top: 116px; left: 0; right: 0; margin-inline: auto; z-index: 20; display: flex; align-items: center; gap: 7px;
200
+ width: max-content; height: 38px; padding: 0 9px 0 12px; border-radius: 19px; color: var(--ink-2);
201
201
  background: var(--surface); border: 1px solid var(--line-2); box-shadow: var(--shadow-2);
202
202
  transition: color 0.15s, border-color 0.15s, translate 0.2s var(--ease); animation: to-top-in 0.25s var(--ease);
203
203
  }
204
+ .to-top kbd { line-height: 1.3; }
204
205
  .to-top:hover { color: var(--ink); border-color: var(--faint); translate: 0 -2px; }
205
206
  @keyframes to-top-in { from { opacity: 0; transform: translateY(-10px) scale(0.97); } }
206
207
  .to-top:focus-visible { outline: 0; box-shadow: 0 0 0 2px var(--accent-soft), 0 0 0 1px var(--accent); }
@@ -226,8 +227,10 @@ select {
226
227
  .p-need { font-size: 10.5px; font-weight: 600; min-width: 16px; height: 16px; padding: 0 4px; border-radius: 99px; background: var(--ink); color: var(--bg); display: grid; place-items: center; }
227
228
 
228
229
  /* ---------- launcher ---------- */
229
- .launcher { padding: 12px 12px 10px; border-radius: 12px; border-color: var(--line-2); box-shadow: var(--shadow-1); transition: box-shadow 0.15s, border-color 0.15s; }
230
- .launcher:focus-within { border-color: color-mix(in srgb, var(--accent) 55%, var(--line-2)); box-shadow: 0 0 0 3px var(--accent-soft); }
230
+ .launcher { container: launcher / inline-size; padding: 12px 12px 10px; border-radius: 12px; border-color: var(--line-2); box-shadow: var(--shadow-1); transition: box-shadow 0.15s, border-color 0.15s; }
231
+ /* A picker or menu opened from the launcher lives on <body> and takes focus; the launcher stays lit
232
+ while it's open so switching between the two harness pickers doesn't flash the ring off and on. */
233
+ .launcher:is(:focus-within, :has(.open)) { border-color: color-mix(in srgb, var(--accent) 55%, var(--line-2)); box-shadow: 0 0 0 3px var(--accent-soft); }
231
234
  .launcher.drop, .composer.drop { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-soft); }
232
235
  .l-projects { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; padding: 0 2px 8px; }
233
236
  .l-in { font-size: 12.5px; color: var(--faint); margin-right: 2px; }
@@ -239,12 +242,73 @@ select {
239
242
  .lp-chip.on { background: var(--bg-2); border-color: var(--line-2); color: var(--ink); font-weight: 500; }
240
243
  .lp-chip.add { color: var(--muted); border-style: dashed; }
241
244
  .lp-chip.add .i { width: 14px; height: 14px; }
245
+ /* recipes: one-click prompts under the launch bar */
246
+ .l-recipes { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin: 8px -12px -10px; padding: 7px 14px 8px; border-top: 1px solid var(--line); }
247
+ .l-recipes .l-in { display: inline-flex; align-items: center; gap: 5px; }
248
+ .l-recipes .l-in .i { width: 13px; height: 13px; color: var(--accent); }
249
+ .l-recipes .lp-chip { height: 24px; padding: 0 9px; font-size: 12px; }
250
+ .l-recipes .lp-chip.rc { background: var(--surface-2); }
251
+ .l-recipes .lp-chip.rc:hover { border-color: color-mix(in srgb, var(--accent) 45%, var(--line-2)); color: var(--ink); }
252
+ .l-recipes .lp-chip[hidden] { display: none; }
253
+ .rc-f { font-style: normal; color: var(--faint); margin-left: -3px; }
254
+ .lr-empty { margin-right: 2px; }
242
255
  .launcher textarea, .composer textarea {
243
256
  display: block; width: 100%; resize: none; border: 0; outline: 0; background: transparent; padding: 8px 4px;
244
257
  font-size: 15px; line-height: 1.55; color: var(--ink); min-height: 64px;
245
258
  }
246
259
  .launcher textarea::placeholder, .composer textarea::placeholder { color: var(--faint); }
247
- .l-bar { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; padding-top: 6px; }
260
+ /* docked: pinned under the top bar once scrolled past, one line until focused (or a menu of it is open) */
261
+ .launcher.docked {
262
+ position: fixed; top: 60px; left: 0; right: 0; margin-inline: auto; z-index: 15; width: min(752px, calc(100% - 48px));
263
+ max-height: calc(100vh - 76px); overflow-y: auto; box-shadow: var(--shadow-2); animation: dock-in 0.2s var(--ease);
264
+ }
265
+ .launcher.docked:is(:focus-within, :has(.open)) { box-shadow: 0 0 0 3px var(--accent-soft), var(--shadow-2); }
266
+ .launcher.docked:not(:focus-within):not(:has(.open)) { display: flex; align-items: center; gap: 6px; padding: 6px 8px; cursor: text; overflow: hidden; }
267
+ .launcher.docked:not(:focus-within):not(:has(.open)) :is(.l-in, .lp-chip:not(.on), .tray, .l-bar, .l-recipes) { display: none; }
268
+ .launcher.docked:not(:focus-within):not(:has(.open)) .l-projects { flex: none; flex-wrap: nowrap; padding: 0; }
269
+ .launcher.docked:not(:focus-within):not(:has(.open)) textarea {
270
+ flex: 1; min-width: 0; min-height: 0; height: 30px !important; padding: 4px; font-size: 14px; white-space: pre; overflow: hidden; cursor: text;
271
+ }
272
+ @keyframes dock-in { from { opacity: 0; transform: translateY(-8px); } }
273
+ body:has(.launcher.docked:is(:focus-within, :has(.open))) .to-top { display: none; }
274
+ .l-bar { display: flex; align-items: center; gap: 8px; padding-top: 6px; }
275
+ .l-bar > :not(.runners) { flex: none; }
276
+ .l-bar .grow { flex: 1; }
277
+ /* harness pill(s): "vs" rides on the end of it; on, the second harness joins the same pill */
278
+ .runners {
279
+ display: inline-flex; align-items: stretch; min-width: 0; height: 30px; border-radius: 9px;
280
+ border: 1px solid var(--line); background: var(--surface); transition: border-color 0.15s;
281
+ }
282
+ .runners:hover, .runners:has(.open) { border-color: var(--line-2); }
283
+ .runners .runner-btn { height: 28px; min-width: 0; border: 0; border-radius: 8px; background: transparent; }
284
+ .runners .runner-btn:hover, .runners .runner-btn.open { background: var(--bg-2); }
285
+ .runners .runner-btn { overflow: hidden; }
286
+ .runners .rb-logo { flex: none; }
287
+ .runners .rb-h { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
288
+ .runners .rb-m { flex: 0 100 auto; min-width: 0; }
289
+ .runners.cmp .rb-e, .l-bar:has(.runners.cmp) #wtBtn span { display: none; }
290
+ /* two harnesses on a narrow bar: drop the model names, then the harness names (logos stay) */
291
+ @container launcher (max-width: 640px) { .runners.cmp .rb-m { display: none; } }
292
+ @container launcher (max-width: 520px) {
293
+ .l-bar .mode-btn span, .l-bar #wtBtn span, .runners .rb-m { display: none; }
294
+ .runners.cmp .rb-h { display: none; }
295
+ .runners.cmp .runner-btn .chev { margin-left: 0; }
296
+ .runners.cmp .rb-logo { margin-right: 4px; }
297
+ }
298
+ .vs-btn {
299
+ position: relative; flex: none; display: grid; place-items: center; width: 30px;
300
+ font: 600 11px var(--mono); letter-spacing: 0.02em; color: var(--faint); transition: color 0.15s, background 0.15s;
301
+ }
302
+ .vs-btn::before { content: ''; position: absolute; left: 0; top: 7px; bottom: 7px; width: 1px; background: var(--line); }
303
+ .vs-btn:hover { color: var(--accent-ink); }
304
+ .vs-btn .i { display: none; width: 13px; height: 13px; }
305
+ .vs-btn:focus-visible { outline: 0; border-radius: 6px; box-shadow: inset 0 0 0 1px var(--accent); }
306
+ .runners.cmp { border-color: color-mix(in srgb, var(--accent) 35%, var(--line)); }
307
+ .runners.cmp .vs-btn { width: 26px; color: var(--accent-ink); }
308
+ .runners.cmp .vs-btn::before { display: none; }
309
+ .runners.cmp .vs-btn:hover { color: var(--ink); }
310
+ .runners.cmp .vs-btn:is(:hover, :focus-visible) span { display: none; }
311
+ .runners.cmp .vs-btn:is(:hover, :focus-visible) .i { display: block; }
248
312
  /* permission mode: icon-only on the default, labelled otherwise */
249
313
  .mode-btn {
250
314
  display: inline-flex; align-items: center; gap: 6px; height: 32px; min-width: 32px; padding: 0 9px; border-radius: 9px;
@@ -428,7 +492,6 @@ select {
428
492
  .it-loading { display: flex; align-items: center; gap: 10px; padding: 18px; color: var(--muted); font-size: 13px; }
429
493
  .it-bar { display: flex; align-items: center; gap: 12px; padding: 8px 10px 8px 14px; }
430
494
  .it-meta { flex: 1; min-width: 0; display: flex; align-items: center; gap: 10px; font-size: 12px; color: var(--muted); white-space: nowrap; overflow: hidden; }
431
- .it-meta .path { font-family: var(--mono); font-size: 11px; color: var(--faint); }
432
495
  .it-actions { display: flex; gap: 2px; flex: none; }
433
496
  .it-body .earlier { display: block; margin: 4px 0 0 18px; }
434
497
  .it-dock { padding: 4px 14px 14px; }
@@ -519,12 +582,11 @@ select {
519
582
  /* ask card (mid-run question) */
520
583
  .ask-card, .b-question {
521
584
  position: relative; padding: 16px 18px; border-radius: var(--radius); margin: 4px 0 14px;
522
- background: var(--surface); border: 1px solid color-mix(in srgb, var(--warn) 40%, var(--line));
523
- box-shadow: inset 3px 0 0 var(--warn);
585
+ background: var(--surface); border: 1px solid color-mix(in srgb, var(--warn) 60%, var(--line));
524
586
  animation: rise 0.4s var(--ease) both;
525
587
  }
526
- .b-question { border-color: color-mix(in srgb, var(--accent) 35%, var(--line)); box-shadow: inset 3px 0 0 var(--accent); }
527
- .b-question.answered { opacity: 0.65; box-shadow: none; background: var(--surface-2); border: 1px solid var(--line); }
588
+ .b-question { border-color: color-mix(in srgb, var(--accent) 60%, var(--line)); }
589
+ .b-question.answered { opacity: 0.65; background: var(--surface-2); border: 1px solid var(--line); }
528
590
  .q-head { display: flex; align-items: center; gap: 7px; font-size: 12.5px; font-weight: 500; color: var(--warn); }
529
591
  .b-question .q-head { color: var(--accent-ink); }
530
592
  .q-text { margin: 6px 0 12px; font: 600 17px/1.4 var(--display); letter-spacing: -0.015em; color: var(--ink); }
@@ -729,6 +791,8 @@ pre.code { margin: 0 0 12px; padding: 12px 14px; border-radius: 10px; background
729
791
  .wire-label { font: 500 11px var(--sans); fill: var(--muted); paint-order: stroke; stroke: var(--surface); stroke-width: 4px; }
730
792
  .cols { position: relative; display: flex; align-items: center; justify-content: space-between; gap: 46px; }
731
793
  .col { flex: 1; display: flex; flex-direction: column; gap: 12px; min-width: 0; max-width: 220px; }
794
+ .cols.snake { display: grid; grid-template-columns: repeat(var(--per-row), minmax(0, 1fr)); column-gap: 46px; row-gap: 40px; align-items: center; }
795
+ .cols.snake .col { width: 100%; max-width: 220px; justify-self: center; }
732
796
  .node {
733
797
  position: relative; padding: 9px 12px; border-radius: 8px; background: var(--surface); border: 1px solid var(--line-2);
734
798
  text-align: center; animation: pop 0.4s var(--ease) calc(200ms + var(--k) * 120ms) both;
@@ -808,6 +872,88 @@ pre.code { margin: 0 0 12px; padding: 12px 14px; border-radius: 10px; background
808
872
  .b-commits .sub { display: flex; gap: 10px; margin-top: 2px; font: 12px var(--mono); color: var(--muted); }
809
873
  .b-commits .sub code { padding: 0 5px; }
810
874
 
875
+ /* graph: a PR's branches, the merge target and its conflicts */
876
+ .b-graph { --g-base: var(--faint); --g-1: #3b82f6; --g-2: #14b8a6; --g-3: #8b5cf6; --g-4: #e5487f; --g-merged: #8250df; padding: 14px 16px 12px; container-type: inline-size; }
877
+ .g-head { display: flex; align-items: baseline; gap: 12px; margin-bottom: 8px; }
878
+ .g-head h3 { flex: 1; min-width: 0; margin: 0; font-size: 14px; font-weight: 600; color: var(--ink); }
879
+ .g-ref { font-weight: 500; color: var(--muted); }
880
+ .g-pr { display: inline-flex; align-items: center; gap: 6px; font-size: 12.5px; font-weight: 500; --tone: var(--good); color: var(--tone); }
881
+ .g-pr i { width: 6px; height: 6px; border-radius: 50%; background: currentColor; }
882
+ .g-pr.st-merged { --tone: var(--g-merged); }
883
+ .g-pr.st-closed { --tone: var(--bad); }
884
+ .g-pr.st-draft { --tone: var(--muted); }
885
+ .g-body { position: relative; display: grid; grid-template-columns: var(--g-w) 1fr; column-gap: 14px; }
886
+ .g-svg { overflow: visible; }
887
+ .g-wire { fill: none; stroke-width: 1.5; stroke-linecap: round; stroke-dasharray: 1; stroke-dashoffset: 1; opacity: 0.75; animation: draw 0.7s var(--ease) calc(250ms + var(--k) * 60ms) forwards; }
888
+ .g-wire.pending { stroke-dasharray: 3 3; stroke-dashoffset: 0; animation: fade-in 0.5s 0.5s both; stroke: var(--faint); }
889
+ .g-wire.pending.st-conflict { stroke: var(--warn); }
890
+ .g-wire.pending.st-ready { stroke: var(--good); }
891
+ .g-wire.st-merged { stroke: var(--g-merged); }
892
+ .g-tail { fill: none; stroke-width: 1.5; stroke-dasharray: 2 3; opacity: 0.5; animation: fade-in 0.5s 0.4s both; }
893
+ .g-dot { fill: var(--lc); stroke: var(--surface); stroke-width: 2; transform-box: fill-box; transform-origin: center; animation: pop 0.35s var(--ease) calc(200ms + var(--k) * 60ms) both; }
894
+ .g-dot.conflict { fill: var(--warn); }
895
+ .g-dot.merge { fill: var(--surface); stroke: var(--lc); stroke-width: 1.6; }
896
+ .g-target circle { fill: var(--surface); stroke: var(--faint); stroke-width: 1.5; stroke-dasharray: 2 2; }
897
+ .g-target path { fill: none; stroke: #fff; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }
898
+ .g-target.st-conflict circle { fill: var(--warn); stroke: color-mix(in srgb, var(--warn) 25%, transparent); stroke-width: 4; stroke-dasharray: none; paint-order: stroke; }
899
+ .g-target.st-ready circle { fill: var(--good); stroke: color-mix(in srgb, var(--good) 22%, transparent); stroke-width: 4; stroke-dasharray: none; paint-order: stroke; }
900
+ .g-target.st-merged circle { fill: var(--g-merged); stroke: none; }
901
+ .g-target.st-blocked circle { fill: var(--bad); stroke: none; }
902
+ .g-rows { list-style: none; margin: 0; padding: 0; min-width: 0; }
903
+ .g-row { display: flex; align-items: center; gap: 8px; height: 30px; min-width: 0; margin: 0 -6px; padding: 0 6px; border-radius: 6px; font-size: 13.5px; animation: rise 0.4s var(--ease) calc(200ms + var(--k) * 60ms) both; transition: background 0.15s; }
904
+ .g-msg { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--ink); }
905
+ .g-row.other .g-msg, .g-row.target .g-msg { color: var(--muted); }
906
+ .g-row.conflict .g-msg { color: var(--warn); }
907
+ .g-row.lit { background: color-mix(in srgb, var(--warn) 9%, transparent); }
908
+ .g-tag { flex: none; padding: 1px 6px; border-radius: 5px; font: 11.5px var(--mono); color: var(--lc); background: color-mix(in srgb, var(--lc) 11%, transparent); }
909
+ .g-num { flex: none; display: inline-grid; place-items: center; min-width: 17px; height: 17px; padding: 0 4px; border-radius: 9px; font-size: 11px; font-weight: 600; color: var(--warn); background: color-mix(in srgb, var(--warn) 12%, transparent); }
910
+ .g-meta { flex: none; margin-left: auto; padding-left: 10px; font-size: 12.5px; color: var(--muted); white-space: nowrap; }
911
+ .g-meta code { font: 12px var(--mono); color: var(--faint); background: none; padding: 0; margin-right: 4px; }
912
+ .g-state { margin-left: auto; font-size: 12.5px; font-weight: 500; color: var(--muted); }
913
+ .g-row.st-conflict .g-state { color: var(--warn); }
914
+ .g-row.st-ready .g-state { color: var(--good); }
915
+ .g-row.st-merged .g-state { color: var(--g-merged); }
916
+ .g-row.st-blocked .g-state { color: var(--bad); }
917
+ .g-checks { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 10px; }
918
+ .g-check { display: inline-flex; align-items: center; gap: 6px; height: 26px; padding: 0 10px; border: 1px solid var(--line); border-radius: 13px; font-size: 12.5px; animation: rise 0.4s var(--ease) calc(500ms + var(--k) * 60ms) both; }
919
+ .g-check .i { width: 12px; height: 12px; color: var(--good); }
920
+ .g-check b { font-weight: 500; }
921
+ .g-check span { color: var(--muted); }
922
+ .g-check.st-fail .i { color: var(--bad); }
923
+ .g-check.st-pending .i, .g-check.st-skip .i { color: var(--muted); }
924
+ .g-conflicts { list-style: none; margin: 10px 0 0; padding: 8px 0 0; border-top: 1px solid var(--line); }
925
+ .g-conflicts li { padding: 7px 6px; margin: 0 -6px; border-radius: 8px; animation: rise 0.4s var(--ease) calc(500ms + var(--k) * 70ms) both; transition: background 0.15s; }
926
+ .g-conflicts li.lit { background: color-mix(in srgb, var(--warn) 7%, transparent); }
927
+ .g-c-head { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; font-size: 13px; }
928
+ .g-c-head .g-num { align-self: center; }
929
+ .g-file { font: 12.5px var(--mono); }
930
+ .g-c-detail { color: var(--ink-2); }
931
+ .g-sides { display: grid; grid-template-columns: max-content 1fr; gap: 4px 10px; align-items: baseline; margin: 5px 0 0 25px; font-size: 12px; }
932
+ .g-side { display: contents; }
933
+ .g-num.plain { color: var(--muted); background: var(--bg-2); }
934
+ .g-who { font: 11.5px var(--mono); color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 180px; }
935
+ .g-side code { font: 12px var(--mono); white-space: pre-wrap; word-break: break-word; padding: 2px 6px; border-radius: 5px; background: var(--add-bg); color: var(--ink-2); }
936
+ .g-side.theirs code { background: color-mix(in srgb, var(--warn) 8%, transparent); }
937
+ .g-res { display: flex; gap: 6px; margin: 5px 0 0 25px; font-size: 12.5px; color: var(--ink-2); }
938
+ .g-res .i { width: 13px; height: 13px; margin-top: 2px; color: var(--good); flex: none; }
939
+ .g-foot { display: flex; align-items: center; gap: 8px; min-height: 32px; margin-top: 8px; font-size: 13.5px; color: var(--ink); }
940
+ .g-foot > .i { width: 14px; height: 14px; color: var(--muted); flex: none; }
941
+ .g-foot.st-conflict > .i, .g-count { color: var(--warn); }
942
+ .g-foot.st-ready > .i { color: var(--good); }
943
+ .g-foot.st-merged > .i { color: var(--g-merged); }
944
+ .g-foot.st-blocked > .i { color: var(--bad); }
945
+ .g-foot-text { flex: 1; min-width: 0; }
946
+ .g-count { font: inherit; text-decoration: underline dotted; text-underline-offset: 3px; cursor: pointer; }
947
+ .g-action { flex: none; height: 30px; padding: 0 12px; border-radius: 8px; font-size: 13px; font-weight: 500; color: var(--accent-ink); background: var(--accent-soft); transition: background 0.15s; }
948
+ .g-action:hover:not(:disabled) { background: color-mix(in srgb, var(--accent) 16%, transparent); }
949
+ .g-action:disabled { opacity: 0.5; cursor: default; }
950
+ @container (max-width: 520px) {
951
+ .g-meta { display: none; }
952
+ }
953
+ @media (prefers-color-scheme: dark) {
954
+ :root:not([data-theme='light']) .b-graph { --g-1: #6d8dff; --g-2: #2fd0b4; --g-3: #a78bfa; --g-4: #f472b6; --g-merged: #b48cff; }
955
+ }
956
+
811
957
  /* checklist */
812
958
  .b-check { padding: 16px 20px 12px; }
813
959
  .b-check ul { list-style: none; margin: 0; padding: 0; }
@@ -846,6 +992,40 @@ pre.code { margin: 0 0 12px; padding: 12px 14px; border-radius: 10px; background
846
992
  }
847
993
  .chip:hover { border-color: var(--faint); color: var(--ink); background: var(--surface-2); }
848
994
 
995
+ /* actions block */
996
+ .b-actions { padding: 16px 18px 12px; }
997
+ .act-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
998
+ .act-row { border-radius: 10px; border: 1px solid var(--line); background: var(--surface-2); overflow: hidden; animation: rise 0.45s var(--ease) calc(150ms + var(--k) * 70ms) both; transition: border-color 0.15s; }
999
+ .act-row.ran-ok { border-color: color-mix(in srgb, var(--good) 35%, var(--line)); }
1000
+ .act-row.ran-bad { border-color: color-mix(in srgb, var(--bad) 45%, var(--line)); }
1001
+ .act-bar { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 9px 12px; }
1002
+ .act-info { min-width: 0; display: flex; flex-direction: column; gap: 2px; }
1003
+ .act-info b { font-weight: 600; font-size: 13.5px; color: var(--ink); }
1004
+ .act-cmd { font: 11.5px var(--mono); color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1005
+ .act-detail { font-size: 12.5px; color: var(--muted); }
1006
+ .act-side { display: inline-flex; align-items: center; gap: 8px; flex: none; }
1007
+ .act-side .exit { background: var(--bg-2); color: var(--muted); }
1008
+ .act-side .exit.ok { background: var(--add-bg); color: var(--good); }
1009
+ .act-side .exit.bad { background: var(--del-bg); color: var(--bad); }
1010
+ .act-res { border-top: 1px solid var(--line); background: var(--term-bg); color: var(--term-ink); padding: 10px 12px; }
1011
+ .act-out { margin: 0; font: 12px/1.55 var(--mono); white-space: pre-wrap; word-break: break-word; max-height: 280px; overflow-y: auto; color: #b4b4b0; }
1012
+ .act-fix { margin-top: 8px; }
1013
+
1014
+ /* interactive terminal, tests, revert & checkpoints */
1015
+ .term-run { color: #b4b4b0; border-color: rgba(255, 255, 255, 0.14); background: rgba(255, 255, 255, 0.05); }
1016
+ .term-run:hover:not(:disabled) { color: #fff; background: rgba(255, 255, 255, 0.12); border-color: rgba(255, 255, 255, 0.25); }
1017
+ .tests-cmd { display: flex; align-items: center; gap: 8px; margin-top: 8px; flex-wrap: wrap; }
1018
+ .tests-cmd .cmdline { margin-top: 0; }
1019
+ .tests-rerun-out { margin-top: 12px; padding: 10px 12px; border-radius: 10px; background: var(--term-bg); color: var(--term-ink); }
1020
+ .tests-rerun-out pre { margin: 0; font: 12px/1.55 var(--mono); white-space: pre-wrap; word-break: break-word; max-height: 260px; overflow-y: auto; color: #b4b4b0; }
1021
+ .rev-tag { display: inline-flex; align-items: center; padding: 1px 6px; border-radius: 5px; font: 500 11px var(--sans); background: var(--bg-2); color: var(--muted); border: 1px solid var(--line); }
1022
+ .cp-sha { font: 500 11px var(--mono); color: var(--faint); padding: 1px 5px; border-radius: 5px; background: var(--surface); border: 1px solid var(--line); }
1023
+ .b-diff.is-reverted .diff-scroll { opacity: 0.55; }
1024
+ .b-diff.is-reverted .path .base, .b-files li.is-reverted .path .base { text-decoration: line-through; color: var(--muted); }
1025
+ .cp-rollback { display: inline-flex; align-items: center; gap: 5px; }
1026
+ .cp-rollback .i { width: 12px; height: 12px; }
1027
+ .cp-rollback.rolled-back { color: var(--accent-ink); }
1028
+
849
1029
  /* trail */
850
1030
  .trail { margin-top: 18px; }
851
1031
  .trail-bar { display: flex; align-items: center; flex-wrap: wrap; gap: 14px; padding: 8px 2px; border-top: 1px dashed var(--line); font-size: 12px; color: var(--faint); }
@@ -874,7 +1054,11 @@ pre.code { margin: 0 0 12px; padding: 12px 14px; border-radius: 10px; background
874
1054
  .send { display: grid; place-items: center; width: 30px; height: 30px; border-radius: 8px; background: var(--ink); color: var(--bg); transition: opacity 0.15s; }
875
1055
  .send:hover { opacity: 0.86; }
876
1056
  .send:disabled { opacity: 0.5; }
1057
+ .send.busy { opacity: 1; position: relative; color: transparent; }
1058
+ .send.busy::after { content: ''; position: absolute; inset: 8px; border-radius: 50%; border: 2px solid var(--bg); border-right-color: transparent; animation: spin 0.7s linear infinite; }
1059
+ @keyframes spin { to { transform: rotate(360deg); } }
877
1060
  .c-done { color: var(--muted); }
1061
+ .c-ship { color: var(--accent-ink); }
878
1062
  .c-queue { color: var(--faint); font-size: 12px; }
879
1063
  .c-queue.on { color: var(--ink); background: var(--bg-2); }
880
1064
  .c-done:hover { color: var(--good); }
@@ -912,6 +1096,14 @@ pre.code { margin: 0 0 12px; padding: 12px 14px; border-radius: 10px; background
912
1096
  .modal h4 { margin: 22px 0 8px; font-size: 13px; font-weight: 600; color: var(--ink); }
913
1097
  .modal .hint { margin: 8px 0 0; font-size: 12.5px; color: var(--muted); }
914
1098
  .modal .hint code { font-size: 11.5px; padding: 1px 5px; border-radius: 5px; background: var(--bg-2); }
1099
+ /* rerun dialog: the launcher's prompt + harness bar, in a modal. Its popovers sit above the overlay. */
1100
+ .rr-box { padding: 8px 10px 8px; border-radius: 12px; border: 1px solid var(--line-2); background: var(--surface-2); transition: border-color 0.15s, box-shadow 0.15s; }
1101
+ .rr-box:is(:focus-within, :has(.open)) { border-color: color-mix(in srgb, var(--accent) 55%, var(--line-2)); box-shadow: 0 0 0 3px var(--accent-soft); }
1102
+ .rr-prompt { display: block; width: 100%; resize: none; border: 0; outline: 0; background: transparent; padding: 6px 2px; font-size: 14.5px; line-height: 1.55; color: var(--ink); min-height: 72px; }
1103
+ .rr-files { display: flex; flex-wrap: wrap; gap: 6px; padding: 2px 2px 6px; }
1104
+ .rr-file { display: inline-flex; align-items: center; gap: 5px; height: 24px; padding: 0 8px; border-radius: 7px; font-size: 12px; color: var(--ink-2); background: var(--bg-2); }
1105
+ .rr-file .i { width: 12px; height: 12px; color: var(--muted); }
1106
+ .overlay:not([hidden]) ~ :is(.picker, .menu) { z-index: 55; }
915
1107
  .add-row { display: flex; gap: 8px; }
916
1108
  .path-input { position: relative; flex: 1; display: flex; align-items: center; gap: 8px; height: 38px; padding: 0 12px; border-radius: 11px; border: 1px solid var(--line-2); background: var(--surface-2); }
917
1109
  .path-input:focus-within { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-soft); }
@@ -950,8 +1142,116 @@ pre.code { margin: 0 0 12px; padding: 12px 14px; border-radius: 10px; background
950
1142
  .switch[aria-checked='true']::after { transform: translateX(14px); }
951
1143
  .switch:disabled { opacity: 0.4; cursor: not-allowed; }
952
1144
  .settings-modal input { flex: 1; max-width: 340px; height: 30px; border-radius: 9px; border: 1px solid var(--line); background: var(--surface-2); padding: 0 10px; font: 12px var(--mono); outline: 0; }
953
- .agents { margin-top: 18px; }
954
- .agent-row { display: flex; align-items: center; gap: 10px; padding: 4px 0; font-size: 13px; }
1145
+
1146
+ /* settings: sidebar of sections, one pane at a time */
1147
+ .modal.sx { display: grid; grid-template-columns: 196px 1fr; width: min(880px, 100%); height: min(620px, 86vh); padding: 0; overflow: hidden; }
1148
+ .sx-nav { display: flex; flex-direction: column; gap: 1px; padding: 18px 10px; background: var(--bg-2); border-right: 1px solid var(--line); overflow-y: auto; }
1149
+ .sx-nav h2 { margin: 0 8px 14px; font: 600 18px/1.2 var(--display); letter-spacing: -0.015em; }
1150
+ .sx-nav button { display: flex; align-items: center; gap: 9px; height: 32px; padding: 0 10px; border-radius: 8px; font-size: 13px; color: var(--ink-2); text-align: left; transition: background 0.12s, color 0.12s; }
1151
+ .sx-nav button .i { width: 15px; height: 15px; color: var(--muted); }
1152
+ .sx-nav button span { flex: 1; }
1153
+ .sx-nav button:hover { background: color-mix(in srgb, var(--ink) 6%, transparent); color: var(--ink); }
1154
+ .sx-nav button[aria-selected='true'] { background: var(--surface); color: var(--ink); font-weight: 500; box-shadow: var(--shadow-1); }
1155
+ .sx-nav button[aria-selected='true'] .i { color: var(--accent); }
1156
+ .sx-nav button:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
1157
+ .sx-main { min-width: 0; padding: 18px 24px 24px; overflow-y: auto; }
1158
+ .sx-main > header { align-items: flex-start; gap: 16px; margin-bottom: 18px; }
1159
+ .sx-title { margin: 2px 0 4px; font: 600 16px/1.3 var(--display); letter-spacing: -0.01em; }
1160
+ .sx-lede { margin: 0; font-size: 12.5px; color: var(--muted); }
1161
+ .sx-group { border: 1px solid var(--line); border-radius: 12px; background: var(--surface-2); }
1162
+ .sx-group + .sx-group, .sx-pane > * + .sx-group { margin-top: 14px; }
1163
+ .sx-row { display: flex; align-items: center; gap: 16px; min-height: 52px; padding: 9px 14px; }
1164
+ .sx-row + .sx-row { border-top: 1px solid var(--line); }
1165
+ .sx-row[hidden] { display: none; }
1166
+ .sx-text { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
1167
+ .sx-text b { display: flex; align-items: center; gap: 8px; font-weight: 500; font-size: 13.5px; }
1168
+ .sx-text small { font-size: 12px; color: var(--muted); overflow: hidden; text-overflow: ellipsis; }
1169
+ .sx-text code { font-size: 11px; }
1170
+ .sx-ctl { flex: none; display: flex; align-items: center; gap: 8px; }
1171
+ .sx-ctl input { width: 300px; }
1172
+ .sx-state { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: var(--muted); }
1173
+ .sx-state.bad { color: var(--bad); }
1174
+ .sx-usage .it-loading { grid-column: 1 / -1; }
1175
+ /* a view (Memory, Automations, Usage, Phone) opened inside Settings: no dialog chrome of its own */
1176
+ .modal.embedded { width: auto; max-height: none; overflow: visible; padding: 0; border: 0; border-radius: 0; box-shadow: none; background: none; transform: none; }
1177
+ .modal.embedded header { justify-content: flex-start; gap: 10px; }
1178
+ .modal.embedded header h2 { font-size: 16px; margin-right: auto; }
1179
+ .sx-back { margin-left: -8px; padding: 0 8px 0 4px; color: var(--muted); }
1180
+ .sx-back .i { width: 16px; height: 16px; }
1181
+ @media (max-width: 640px) {
1182
+ .modal.sx { grid-template-columns: 1fr; grid-template-rows: auto 1fr; }
1183
+ .sx-nav { flex-direction: row; align-items: center; padding: 10px; overflow-x: auto; border-right: 0; border-bottom: 1px solid var(--line); }
1184
+ .sx-nav h2 { display: none; }
1185
+ .sx-nav button { flex: none; }
1186
+ .sx-main { padding: 16px; }
1187
+ .sx-ctl input { width: 180px; }
1188
+ .sx-usage { grid-template-columns: repeat(2, 1fr); }
1189
+ }
1190
+
1191
+ /* memory: what the background retros learned */
1192
+ .memory-modal { width: min(680px, 100%); }
1193
+ .memory-modal header { gap: 10px; }
1194
+ .memory-modal header h2 { margin-right: auto; }
1195
+ .mem-live { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: var(--muted); }
1196
+ .mem-live .orb.live { --s: 11px; border-width: 1.5px; }
1197
+ .mem-lede { margin: -6px 0 14px; font-size: 13px; color: var(--muted); }
1198
+ .mem-tabs { display: flex; align-items: center; gap: 2px; padding: 3px; overflow-x: auto; border-radius: 10px; background: var(--bg-2); border: 1px solid var(--line); }
1199
+ .mem-tabs button { flex: none; display: inline-flex; align-items: center; gap: 6px; padding: 5px 10px; border-radius: 7px; font-size: 12.5px; color: var(--muted); white-space: nowrap; transition: background 0.12s, color 0.12s; }
1200
+ .mem-tabs button:hover { color: var(--ink); }
1201
+ .mem-tabs button.on { background: var(--surface); color: var(--ink); font-weight: 500; box-shadow: var(--shadow-1); }
1202
+ .mem-tabs button span { min-width: 16px; padding: 0 4px; border-radius: 5px; font-size: 11px; font-variant-numeric: tabular-nums; text-align: center; background: var(--line); color: var(--muted); }
1203
+ .mem-tabs button.on span { background: var(--accent-soft); color: var(--accent-ink); }
1204
+ .mem-tabs i { flex: 1; min-width: 8px; }
1205
+ .mem-body { padding-top: 6px; }
1206
+ .mem-body.off .mem-sec, .mem-body.off .tl { opacity: 0.5; }
1207
+ .mem-off { display: flex; align-items: center; gap: 8px; margin: 10px 0 2px; padding: 8px 10px; border-radius: 10px; font-size: 12.5px; color: var(--ink-2); background: var(--bg-2); }
1208
+ .mem-off span { flex: 1; }
1209
+ .mem-off .i { color: var(--muted); }
1210
+ .mem-budget { margin: 10px 2px 0; }
1211
+ .mem-sec h4 { display: flex; align-items: baseline; gap: 8px; margin: 18px 0 6px; }
1212
+ .mem-sec h4 .muted { font-weight: 400; }
1213
+ .mem-sec h4 em { margin-left: auto; font: 500 11px var(--mono); font-style: normal; color: var(--faint); }
1214
+ .mem-sec h4 em.full { color: var(--warn); }
1215
+ .mem-item { display: flex; align-items: flex-start; gap: 10px; padding: 8px 10px; margin: 0 -10px; border-radius: 10px; transition: background 0.12s; }
1216
+ .mem-item:hover { background: var(--surface-2); }
1217
+ .mem-ico { display: grid; place-items: center; flex: none; width: 22px; height: 22px; margin-top: 1px; border-radius: 7px; background: var(--accent-soft); color: var(--accent-ink); }
1218
+ .mem-sec[data-kind='lessons'] .mem-ico, .mem-sec[data-kind='lessons'] .mem-edit .mem-ico { background: var(--add-bg); color: var(--good); }
1219
+ .mem-ico .i { width: 13px; height: 13px; }
1220
+ .mem-main { flex: 1; min-width: 0; }
1221
+ .mem-main p { margin: 0; font-size: 13.5px; line-height: 1.45; color: var(--ink); overflow-wrap: anywhere; }
1222
+ .mem-src { font-size: 11.5px; color: var(--faint); }
1223
+ .mem-src a, .tl-head a { color: inherit; text-decoration: none; }
1224
+ .mem-src a:hover, .tl-head a:hover { color: var(--accent-ink); text-decoration: underline; }
1225
+ .mem-acts { display: flex; gap: 2px; opacity: 0; transition: opacity 0.12s; }
1226
+ .mem-item:hover .mem-acts, .mem-item:focus-within .mem-acts { opacity: 1; }
1227
+ .mem-edit { align-items: center; padding-top: 7px; padding-bottom: 7px; background: var(--surface-2); box-shadow: inset 0 0 0 1px var(--accent); }
1228
+ .mem-edit input { flex: 1; min-width: 0; border: 0; outline: 0; background: transparent; font: 13.5px var(--sans); color: var(--ink); }
1229
+ .memory-modal .mem-edit input { max-width: none; height: auto; padding: 0; }
1230
+ .mem-add { display: inline-flex; align-items: center; gap: 6px; margin: 4px 0 0; padding: 4px 8px 4px 6px; border-radius: 7px; font-size: 12.5px; color: var(--muted); }
1231
+ .mem-add:hover { color: var(--accent-ink); background: var(--accent-soft); }
1232
+ .mem-add .i { width: 13px; height: 13px; }
1233
+ .mem-empty { margin: 2px 0 4px; font-size: 12.5px; color: var(--faint); }
1234
+ .mem-body > .mem-empty { margin: 22px 0 8px; text-align: center; }
1235
+ /* retros: a timeline, newest first */
1236
+ .tl { position: relative; display: flex; gap: 12px; padding: 12px 0 2px; }
1237
+ .tl:first-of-type { margin-top: 6px; }
1238
+ .tl::before { content: ''; position: absolute; left: 4.5px; top: 26px; bottom: -12px; width: 1px; background: var(--line); }
1239
+ .tl:last-child::before { display: none; }
1240
+ .tl-dot { flex: none; display: grid; place-items: center; width: 10px; height: 10px; margin-top: 4px; border-radius: 50%; background: var(--good); box-shadow: 0 0 0 3px var(--surface); }
1241
+ .tl.nothing .tl-dot { background: var(--line-2); }
1242
+ .tl.failed .tl-dot { background: var(--bad); }
1243
+ .tl.running .tl-dot { background: none; }
1244
+ .tl.running .orb.live { --s: 12px; border-width: 1.5px; }
1245
+ .tl-main { flex: 1; min-width: 0; }
1246
+ .tl-head { display: flex; align-items: baseline; gap: 8px; margin-bottom: 3px; }
1247
+ .tl-head b { font-weight: 600; font-size: 13px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1248
+ .tl-head .muted:last-child { margin-left: auto; flex: none; }
1249
+ .tl-main p { margin: 2px 0; font-size: 12.5px; line-height: 1.45; }
1250
+ .tl-add::before { content: '+ '; color: var(--good); font-weight: 600; }
1251
+ .tl-del { color: var(--muted); }
1252
+ .tl-del::before { content: '− '; font-weight: 600; }
1253
+ .tl-tag { margin-left: 4px; font-size: 11px; color: var(--faint); white-space: nowrap; }
1254
+ .tl-err { color: var(--bad); font: 11.5px/1.45 var(--mono); }
955
1255
  .keys-modal { width: min(380px, 100%); }
956
1256
  .krow { display: flex; align-items: center; gap: 14px; padding: 6px 0; }
957
1257
  .krow kbd { min-width: 56px; text-align: center; font-size: 11.5px; }
@@ -964,6 +1264,23 @@ pre.code { margin: 0 0 12px; padding: 12px 14px; border-radius: 10px; background
964
1264
  .search-btn:hover { border-color: var(--line-2); color: var(--ink); }
965
1265
  .search-btn .i { width: 14px; height: 14px; }
966
1266
  .search-btn kbd { margin-left: 8px; }
1267
+ .update-btn {
1268
+ display: inline-flex; align-items: center; gap: 6px; height: 30px; padding: 0 10px; border-radius: 9px;
1269
+ background: var(--accent-soft); color: var(--accent-ink); font-size: 13px; font-weight: 500; transition: background 0.15s;
1270
+ }
1271
+ .update-btn[hidden] { display: none; }
1272
+ .update-btn:hover { background: var(--accent); color: #fff; }
1273
+ .update-btn.busy { opacity: 0.7; cursor: progress; }
1274
+ .update-btn .i { width: 14px; height: 14px; }
1275
+ .auto-btn {
1276
+ display: inline-flex; align-items: center; gap: 7px; height: 30px; padding: 0 10px; border-radius: 9px;
1277
+ border: 1px solid var(--line); background: var(--surface-2); color: var(--muted); font-size: 13px; transition: border-color 0.15s, color 0.15s;
1278
+ }
1279
+ .auto-btn:hover { border-color: var(--line-2); color: var(--ink); }
1280
+ .auto-btn .i { width: 14px; height: 14px; }
1281
+ .auto-btn.live .i { color: var(--accent); }
1282
+ .ab-n { min-width: 17px; height: 17px; padding: 0 5px; border-radius: 99px; font-size: 10.5px; font-weight: 600; display: grid; place-items: center; background: var(--accent-soft); color: var(--accent-ink); }
1283
+ .ab-n[hidden] { display: none; }
967
1284
  .overlay:has(.palette) { place-items: start center; padding-top: min(14vh, 120px); background: rgba(0, 0, 0, 0.18); }
968
1285
  .palette {
969
1286
  display: flex; flex-direction: column; width: min(640px, 100%); max-height: min(560px, 72vh); overflow: hidden; border-radius: 14px;
@@ -1021,9 +1338,11 @@ pre.code { margin: 0 0 12px; padding: 12px 14px; border-radius: 10px; background
1021
1338
  /* ---------- responsive ---------- */
1022
1339
  @media (max-width: 720px) {
1023
1340
  .topbar { padding: 0 12px; gap: 10px; }
1024
- .search-btn span, .search-btn kbd { display: none; }
1341
+ .search-btn span, .search-btn kbd, .update-btn span, .auto-btn span { display: none; }
1342
+ .auto-btn { padding: 0 8px; border-color: transparent; background: none; }
1025
1343
  .search-btn { padding: 0 8px; border-color: transparent; background: none; }
1026
1344
  .feed-wrap { padding: 14px 16px 80px; }
1345
+ .launcher.docked { width: calc(100% - 32px); }
1027
1346
  .it-side .q-proj, .it-actions span, .c-done span { display: none; }
1028
1347
  .turns { padding: 6px 14px 8px; }
1029
1348
  .it-dock { padding: 4px 10px 10px; }
@@ -1047,3 +1366,307 @@ body.electron .topbar { -webkit-app-region: drag; }
1047
1366
  body.electron .topbar button, body.electron .topbar a, body.electron .topbar .projects { -webkit-app-region: no-drag; }
1048
1367
  body.electron .overlay, body.electron .overlay *, body.electron .menu, body.electron .menu *, body.electron .toasts, body.electron .toast * { -webkit-app-region: no-drag; }
1049
1368
  body.electron.mac .topbar { padding-left: 88px; }
1369
+
1370
+ /* ---------- worktrees, compare, ship it ---------- */
1371
+ .tog-btn {
1372
+ display: inline-flex; align-items: center; gap: 5px; height: 30px; padding: 0 8px; border-radius: 9px;
1373
+ font-size: 12.5px; color: var(--muted); transition: background 0.15s, color 0.15s;
1374
+ }
1375
+ .tog-btn:hover { background: var(--bg-2); color: var(--ink); }
1376
+ .tog-btn.on { color: var(--accent-ink); }
1377
+ .tog-btn:focus-visible { outline: 0; box-shadow: 0 0 0 2px var(--accent-soft), 0 0 0 1px var(--accent); }
1378
+ .vs-mark { font: 600 11px var(--mono); }
1379
+ .q-vs { font: 600 10.5px var(--mono); color: var(--accent-ink); padding: 1px 5px; border-radius: 5px; background: var(--accent-soft); }
1380
+
1381
+ /* a compare task: one card, the shared prompt on top and a row per run under it */
1382
+ .task-item {
1383
+ background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); overflow: clip;
1384
+ transition: border-color 0.15s, box-shadow 0.15s;
1385
+ }
1386
+ .task-item:hover, .task-item:has(.item.focused) { border-color: var(--line-2); }
1387
+ .task-item:has(.item.open) { border-color: var(--line-2); box-shadow: var(--shadow-2); }
1388
+ .task-item.st-done { background: transparent; }
1389
+ .task-item.arrived { animation: arrive 1.4s var(--ease); }
1390
+ .task-head { display: grid; grid-template-columns: 10px 1fr auto; gap: 12px; align-items: center; padding: 11px 12px 9px 14px; }
1391
+ .task-head .it-title { color: var(--ink); font-weight: 600; }
1392
+ .task-item.st-done .task-head .it-title { color: var(--muted); font-weight: 500; }
1393
+ .task-item.st-done .q-dot { opacity: 0.35; }
1394
+ .task-head .it-sub { display: flex; align-items: center; gap: 7px; }
1395
+ .task-item.st-waiting .task-head .it-sub { color: var(--warn); }
1396
+ .task-head .ghost .vs-mark { margin-right: 5px; color: var(--accent-ink); }
1397
+ .task-item:hover .it-quick, .task-head .it-quick:focus-visible { opacity: 1; }
1398
+ .task-runs { display: flex; flex-direction: column; }
1399
+ .item.run { border: 0; border-top: 1px solid var(--line); border-radius: 0; background: transparent; box-shadow: none; }
1400
+ .item.run.focused { box-shadow: inset 2px 0 0 var(--line-2); background: var(--surface-2); }
1401
+ .item.run.open { box-shadow: inset 2px 0 0 var(--accent); }
1402
+ .item.run .it-head { grid-template-columns: 18px 1fr auto; padding: 8px 12px 8px 26px; border-radius: 0; }
1403
+ .item.run.open .it-head { border-radius: 0; }
1404
+ .item.run .it-title { font-size: 13px; font-weight: 400; color: var(--ink-2); white-space: nowrap; }
1405
+ .item.run .it-title b { font-weight: 600; color: var(--ink); }
1406
+ .run-model { margin-left: 8px; color: var(--muted); }
1407
+ .item.run .it-sub, .item.run .q-live { font-size: 12px; }
1408
+ .run-logo { display: grid; place-items: center; width: 18px; height: 18px; border-radius: 5px; background: var(--bg-2); color: var(--ink); }
1409
+ .run-logo > * { display: block; width: 11px; height: 11px; }
1410
+ .run-logo .mono { background: currentColor; -webkit-mask: var(--logo) center / contain no-repeat; mask: var(--logo) center / contain no-repeat; }
1411
+ .pill.st-running { --tone: var(--accent); }
1412
+ .it-meta .m.branch, .it-meta .m:has(> .i) { display: inline-flex; align-items: center; gap: 4px; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
1413
+ .it-meta .m.branch { font: 11px var(--mono); color: var(--ink-2); }
1414
+ .it-meta .m .i { width: 12px; height: 12px; flex: none; color: var(--faint); }
1415
+ .it-meta .m.m-plan, .it-meta .m.m-plan .i { color: var(--accent-ink); }
1416
+ .it-meta .m.m-auto, .it-meta .m.m-auto .i { color: var(--warn); }
1417
+
1418
+ .pill.pr { gap: 5px; font-variant-numeric: tabular-nums; }
1419
+ .pill.pr-pass, .pr-strip.pr-pass { --tone: var(--good); }
1420
+ .pill.pr-pending, .pr-strip.pr-pending { --tone: var(--warn); }
1421
+ .pill.pr-fail, .pr-strip.pr-fail { --tone: var(--bad); }
1422
+ .pill.pr-merged, .pr-strip.pr-merged { --tone: #8250df; }
1423
+ .pill.pr-closed, .pr-strip.pr-closed { --tone: var(--faint); }
1424
+ .pr-strip {
1425
+ display: flex; align-items: center; gap: 8px; margin: 0 14px 4px; padding: 5px 6px 5px 10px; border-radius: 9px;
1426
+ font-size: 12.5px; background: color-mix(in srgb, var(--tone) 7%, transparent); border: 1px solid color-mix(in srgb, var(--tone) 18%, transparent);
1427
+ }
1428
+ .pr-strip[hidden] { display: none; }
1429
+ .pr-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--tone); flex: none; }
1430
+ .pr-strip.pr-pending .pr-dot { animation: pulse 1.4s ease-in-out infinite; }
1431
+ .pr-num { font-weight: 600; color: var(--ink); }
1432
+ .pr-line { color: var(--ink-2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
1433
+ .pr-strip .ghost .i { width: 13px; height: 13px; }
1434
+ .pr-strip .pr-merge { color: var(--good); font-weight: 500; }
1435
+ @keyframes pulse { 50% { opacity: 0.35; } }
1436
+
1437
+ .ship-modal, .run-modal { width: min(620px, 100%); }
1438
+ .ship-route { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; margin: -4px 0 12px; font-size: 12.5px; }
1439
+ .ship-route code { font: 12px var(--mono); padding: 1px 6px; border-radius: 6px; background: var(--bg-2); }
1440
+ .ship-route .i { width: 13px; height: 13px; color: var(--faint); }
1441
+ .ship-route .muted { margin-left: auto; }
1442
+ .ship-field { display: flex; flex-direction: column; gap: 6px; margin: 12px 0 0; }
1443
+ .ship-field > span { font-size: 12.5px; font-weight: 500; color: var(--ink-2); }
1444
+ .ship-field input, .ship-field textarea, .ship-field select {
1445
+ width: 100%; border-radius: 9px; border: 1px solid var(--line-2); background: var(--surface-2); padding: 7px 10px; font: 13px var(--sans); outline: 0; resize: vertical;
1446
+ }
1447
+ .ship-field textarea { font: 12.5px/1.5 var(--mono); }
1448
+ .ship-field :is(input, textarea, select):focus { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-soft); }
1449
+ .ship-check { display: flex; align-items: center; gap: 8px; margin-top: 10px; font-size: 13px; }
1450
+ .ship-foot { display: flex; align-items: center; gap: 12px; margin-top: 16px; }
1451
+ .ship-foot > .muted { margin-right: auto; }
1452
+ .ship-foot code { font-size: 11px; }
1453
+ .hint.bad { color: var(--bad); }
1454
+
1455
+ .compare-modal { width: min(1280px, 100%); max-height: 92vh; display: flex; flex-direction: column; }
1456
+ .cmp-prompt { margin: -6px 0 14px; padding: 8px 12px; border-radius: 10px; background: var(--bg-2); font-size: 13px; white-space: pre-wrap; max-height: 96px; overflow: auto; }
1457
+ .cmp-grid { flex: 1; min-height: 0; display: grid; grid-template-columns: repeat(var(--n), minmax(280px, 1fr)); gap: 12px; overflow-x: auto; }
1458
+ .cmp-col { display: flex; flex-direction: column; min-height: 0; border: 1px solid var(--line); border-radius: 12px; background: var(--surface-2); }
1459
+ .cmp-head { display: flex; align-items: center; gap: 8px; padding: 10px 12px; border-bottom: 1px solid var(--line); }
1460
+ .cmp-who { display: flex; flex-direction: column; margin-right: auto; min-width: 0; }
1461
+ .cmp-who small { font-size: 11.5px; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1462
+ .cmp-stats { display: grid; grid-template-columns: repeat(5, 1fr); gap: 4px; margin: 0; padding: 8px 12px; border-bottom: 1px solid var(--line); }
1463
+ .cmp-stats div { display: flex; flex-direction: column; gap: 2px; }
1464
+ .cmp-stats dt { font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.04em; color: var(--faint); }
1465
+ .cmp-stats dd { margin: 0; font-size: 13px; font-weight: 500; font-variant-numeric: tabular-nums; white-space: nowrap; }
1466
+ .cmp-body { flex: 1; min-height: 160px; max-height: 58vh; overflow: auto; padding: 12px; background: var(--surface); }
1467
+ .cmp-foot { display: flex; align-items: center; gap: 8px; padding: 8px 10px; border-top: 1px solid var(--line); }
1468
+
1469
+ /* ---------- automations, usage, phone ---------- */
1470
+ .auto-modal, .usage-modal, .phone-modal { width: min(720px, 100%); position: relative; }
1471
+ .usage-modal { padding-bottom: 24px; }
1472
+ .mem-lede code { font-size: 11.5px; padding: 1px 5px; border-radius: 5px; background: var(--bg-2); }
1473
+ .auto-body { padding-top: 10px; }
1474
+ .au-list { display: flex; flex-direction: column; gap: 2px; }
1475
+ .au-item { display: flex; align-items: flex-start; gap: 10px; padding: 10px 8px; border-radius: 10px; }
1476
+ .au-item:hover { background: var(--surface-2); }
1477
+ .au-item.off .au-main { opacity: 0.55; }
1478
+ .au-main { flex: 1; min-width: 0; }
1479
+ .au-main b { font-size: 13.5px; }
1480
+ .au-main p { margin: 2px 0 0; font-size: 12.5px; color: var(--muted); }
1481
+ .au-main code { font-size: 11.5px; padding: 0 4px; border-radius: 4px; background: var(--bg-2); }
1482
+ .au-tags { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 6px; }
1483
+ .au-tags i { font-style: normal; font-size: 11px; padding: 1px 6px; border-radius: 5px; background: var(--bg-2); color: var(--ink-2); }
1484
+ .au-tags a { color: var(--accent-ink); }
1485
+ .au-err { display: flex; align-items: center; gap: 5px; color: var(--bad) !important; }
1486
+ .au-err .i { width: 12px; height: 12px; }
1487
+ .au-acts { display: flex; align-items: center; gap: 4px; flex: none; }
1488
+ .au-form { display: flex; flex-direction: column; gap: 0; }
1489
+ .au-form > label, .au-form > div > label, .au-row { display: flex; align-items: center; gap: 14px; padding: 8px 0; border-bottom: 1px solid var(--line); }
1490
+ .au-form label > span, .au-row > span { width: 92px; flex: none; font-size: 12.5px; font-weight: 500; color: var(--ink-2); }
1491
+ .au-form label.stack { flex-direction: column; align-items: stretch; gap: 6px; }
1492
+ .au-form label.stack > span { width: auto; }
1493
+ .au-form input, .au-form select, .au-form textarea { flex: 1; min-width: 0; border-radius: 8px; border: 1px solid var(--line); background: var(--surface-2); padding: 6px 9px; font: 13px var(--sans); outline: 0; }
1494
+ .au-form textarea { font: 12.5px/1.5 var(--mono); resize: vertical; }
1495
+ .au-form :is(input, select, textarea):focus { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-soft); }
1496
+ .au-form [hidden] { display: none !important; }
1497
+ .au-params { margin: 6px 0 2px; }
1498
+ .au-params code, .k-vars code { font-size: 11px; }
1499
+ .au-runner { display: flex; align-items: center; gap: 10px; }
1500
+ .au-presets { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin: 6px 0 4px 106px; }
1501
+ .au-kinds { display: grid; grid-template-columns: repeat(3, 1fr); gap: 6px; margin-bottom: 6px; }
1502
+ .au-kinds button { display: grid; grid-template-columns: 16px 1fr; column-gap: 8px; text-align: left; padding: 8px 10px; border-radius: 10px; border: 1px solid var(--line); }
1503
+ .au-kinds button .i { grid-row: span 2; margin-top: 2px; color: var(--muted); }
1504
+ .au-kinds button b { font-size: 13px; }
1505
+ .au-kinds button small { font-size: 11px; color: var(--muted); }
1506
+ .au-kinds button.on { border-color: var(--accent); background: var(--accent-soft); }
1507
+ .au-kinds button.on .i { color: var(--accent); }
1508
+ .au-warn { display: flex; gap: 8px; margin: 10px 0 0; padding: 8px 10px; border-radius: 9px; font-size: 12.5px; color: var(--warn); background: color-mix(in srgb, var(--warn) 8%, transparent); }
1509
+ .au-warn .i { flex: none; margin-top: 1px; }
1510
+ .au-foot { display: flex; justify-content: flex-end; gap: 8px; margin-top: 14px; }
1511
+
1512
+ .usage-modal header { gap: 12px; }
1513
+ .usage-modal header h2 { margin-right: auto; }
1514
+ .us-tiles { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; }
1515
+ .us-tiles div { display: flex; flex-direction: column; padding: 10px 12px; border-radius: 11px; border: 1px solid var(--line); background: var(--surface-2); }
1516
+ .us-tiles span { font-size: 11.5px; color: var(--muted); }
1517
+ .us-tiles b { font: 600 22px/1.3 var(--display); font-variant-numeric: tabular-nums; letter-spacing: -0.01em; }
1518
+ .us-tiles small { font-size: 11px; color: var(--faint); }
1519
+ .us-chart { display: flex; align-items: flex-end; gap: 2px; height: 120px; padding-bottom: 1px; border-bottom: 1px solid var(--line-2); }
1520
+ .us-bar { flex: 1; height: 100%; display: flex; align-items: flex-end; cursor: default; }
1521
+ .us-bar i { display: block; width: 100%; border-radius: 4px 4px 0 0; background: var(--accent); opacity: 0.85; }
1522
+ .us-bar:hover i { opacity: 1; }
1523
+ .us-axis { display: flex; justify-content: space-between; margin-top: 4px; font-size: 11px; color: var(--faint); }
1524
+ .us-tip { position: absolute; z-index: 5; transform: translate(-50%, -100%); padding: 3px 7px; border-radius: 6px; background: var(--ink); color: var(--bg); font-size: 11px; white-space: nowrap; pointer-events: none; }
1525
+ .us-table { width: 100%; border-collapse: collapse; font-size: 12.5px; font-variant-numeric: tabular-nums; }
1526
+ .us-table th { text-align: right; font-weight: 500; font-size: 11px; color: var(--faint); padding: 4px 6px; border-bottom: 1px solid var(--line); }
1527
+ .us-table td { text-align: right; padding: 6px; border-bottom: 1px solid var(--line); color: var(--ink-2); }
1528
+ .us-table :is(th, td):first-child { text-align: left; color: var(--ink); }
1529
+ .us-proj, .us-runner { display: inline-flex; align-items: center; gap: 6px; }
1530
+
1531
+ .phone-modal .ph-sec h4 { display: flex; align-items: center; gap: 8px; }
1532
+ .phone-modal .ph-sec h4 .switch { margin-left: auto; }
1533
+ .phone-modal .settings-modal { width: auto; padding: 0; border: 0; box-shadow: none; background: none; }
1534
+ .ph-check { display: inline-flex !important; align-items: center; gap: 6px; padding: 0 !important; border: 0 !important; font-size: 13px; }
1535
+ .ph-ok, .ph-bad { display: inline-flex; align-items: center; gap: 4px; font-size: 11.5px; font-weight: 500; }
1536
+ .ph-ok { color: var(--good); }
1537
+ .ph-bad { color: var(--bad); max-width: 260px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1538
+ .ph-ok .i, .ph-bad .i { width: 12px; height: 12px; }
1539
+
1540
+ /* ---------- subagents ---------- */
1541
+ /* logo stack: the lead in front, its subagents tucked behind; they fan out on hover */
1542
+ .team-stack { position: relative; display: inline-flex; align-items: center; flex: none; height: 20px; padding-right: 1px; outline: none; cursor: default; }
1543
+ .team-stack .ts-l, .team-stack .ts-m, .tb-stack .ts-m {
1544
+ position: relative; display: grid; place-items: center; flex: none; width: 20px; height: 20px; border-radius: 50%;
1545
+ background: var(--bg-2); color: var(--ink); box-shadow: 0 0 0 1.5px var(--surface);
1546
+ transition: margin 0.22s var(--ease), transform 0.22s var(--ease), opacity 0.15s, filter 0.15s;
1547
+ }
1548
+ .team-stack .ts-l { z-index: 6; background: var(--surface); box-shadow: 0 0 0 1.5px var(--surface), inset 0 0 0 1px var(--line-2); }
1549
+ .team-stack .ts-m { margin-left: -4px; z-index: calc(5 - var(--i)); }
1550
+ .team-stack :is(.ts-l, .ts-m) > *, .tb-stack .ts-m > * { display: block; width: 11px; height: 11px; }
1551
+ .team-stack .mono, .tb-stack .mono, .sub-logo .mono, .tl-logo .mono { background: currentColor; -webkit-mask: var(--logo) center / contain no-repeat; mask: var(--logo) center / contain no-repeat; }
1552
+ .team-stack .ts-more { font: 600 9.5px var(--mono); color: var(--muted); }
1553
+ .team-stack .ts-m.idle { opacity: 0.45; filter: grayscale(1); }
1554
+ .team-stack:is(:hover, :focus-visible) .ts-m { margin-left: 3px; transform: translateY(calc(-1px * (var(--i) - 1.5))); }
1555
+ .team-stack:is(:hover, :focus-visible) .ts-m.idle { opacity: 0.8; filter: none; }
1556
+ .team-stack .ts-m.busy { background: var(--accent-soft); animation: ts-pulse 1.4s var(--ease) infinite; }
1557
+ @keyframes ts-pulse { 50% { box-shadow: 0 0 0 1.5px var(--surface), 0 0 0 3px color-mix(in srgb, var(--accent) 55%, transparent); } }
1558
+ @keyframes ts-spin { to { transform: rotate(360deg); } }
1559
+ .team-stack::after {
1560
+ content: attr(data-tip); position: absolute; right: -6px; top: calc(100% + 6px); transform: translateY(-2px);
1561
+ padding: 3px 7px; border-radius: 6px; background: var(--ink); color: var(--bg); font-size: 11px; white-space: nowrap;
1562
+ opacity: 0; pointer-events: none; transition: opacity 0.12s, transform 0.12s; z-index: 7;
1563
+ }
1564
+ .team-stack:is(:hover, :focus-visible)::after { opacity: 1; transform: none; }
1565
+ .subs-head .team-stack::after { right: auto; left: 0; }
1566
+ .it-side .team-stack { margin-right: 2px; }
1567
+
1568
+ /* launcher button + its member stack */
1569
+ .tb-stack { display: inline-flex; align-items: center; flex: none; }
1570
+ .tb-stack .ts-m { width: 18px; height: 18px; z-index: calc(6 - var(--i)); }
1571
+ .tb-stack .ts-more { font: 600 9px var(--mono); color: var(--muted); }
1572
+ .tb-stack .ts-m + .ts-m { margin-left: -4px; }
1573
+ .team-btn.on { color: var(--accent-ink); background: var(--accent-soft); }
1574
+ .team-btn.on:hover { background: color-mix(in srgb, var(--accent) 14%, transparent); }
1575
+ .team-btn.off { color: var(--faint); }
1576
+ .team-btn.off .tb-stack { opacity: 0.5; filter: grayscale(1); }
1577
+ .team-btn .tb-label { max-width: 120px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1578
+ .team-btn.open { background: var(--bg-2); color: var(--ink); }
1579
+ /* narrow bar: the member logos carry the button, so the harness name keeps its room */
1580
+ @container launcher (max-width: 640px) { .team-btn .tb-label { display: none; } }
1581
+
1582
+ /* editor popover */
1583
+ .team-pop {
1584
+ position: fixed; z-index: 40; display: flex; flex-direction: column; max-height: min(520px, 76vh); overflow: hidden;
1585
+ border-radius: 14px; background: var(--surface); border: 1px solid var(--line); box-shadow: var(--shadow-2); animation: pop 0.2s var(--ease);
1586
+ }
1587
+ .tp-head { display: flex; align-items: flex-start; gap: 12px; padding: 14px 14px 10px; }
1588
+ .tp-title { flex: 1; display: grid; gap: 2px; }
1589
+ .tp-title b { font-weight: 600; font-size: 14px; }
1590
+ .tp-title small { font-size: 12.5px; color: var(--muted); line-height: 1.35; }
1591
+ .tp-presets { flex: none; gap: 5px; }
1592
+ .tp-presets .chev { width: 11px; height: 11px; transform: rotate(90deg); color: var(--faint); }
1593
+ .tp-warn { display: flex; gap: 8px; margin: 0 14px 10px; padding: 8px 10px; border-radius: 9px; font-size: 12.5px; color: var(--warn); background: color-mix(in srgb, var(--warn) 8%, transparent); border: 1px solid color-mix(in srgb, var(--warn) 25%, var(--line)); }
1594
+ .tp-warn[hidden] { display: none; }
1595
+ .tp-warn .i { flex: none; width: 14px; height: 14px; margin-top: 1px; }
1596
+ .tp-list { flex: 1; overflow-y: auto; display: flex; flex-direction: column; gap: 8px; padding: 0 14px 12px; }
1597
+ .tp-row { display: grid; gap: 6px; padding: 8px; border-radius: 11px; border: 1px solid var(--line); background: var(--surface-2); animation: rise 0.25s var(--ease) both; }
1598
+ .tp-top { display: flex; align-items: center; gap: 6px; min-width: 0; }
1599
+ .tp-runner { flex: 0 1 auto; min-width: 0; overflow: hidden; }
1600
+ .tp-runner .rb-m { max-width: 140px; }
1601
+ .tp-name { flex: 1 1 90px; min-width: 70px; display: flex; align-items: center; height: 30px; padding: 0 8px; border-radius: 9px; border: 1px solid var(--line); background: var(--surface); color: var(--faint); font: 12.5px var(--mono); }
1602
+ .tp-name:focus-within, .tp-use:focus-within { border-color: var(--accent); }
1603
+ .tp-name input, .tp-use input { flex: 1; min-width: 0; border: 0; outline: 0; background: none; font: inherit; color: var(--ink); }
1604
+ .tp-copies { flex: none; display: inline-flex; align-items: center; height: 30px; padding: 0 2px; border-radius: 9px; border: 1px solid var(--line); background: var(--surface); }
1605
+ .tp-copies b { min-width: 22px; text-align: center; font: 500 12px var(--mono); color: var(--muted); font-variant-numeric: tabular-nums; }
1606
+ .tp-copies.on { border-color: color-mix(in srgb, var(--accent) 35%, var(--line)); }
1607
+ .tp-copies.on b { color: var(--accent-ink); }
1608
+ .tp-copies button { display: grid; place-items: center; width: 22px; height: 24px; border-radius: 7px; color: var(--muted); }
1609
+ .tp-copies button:hover:not(:disabled) { background: var(--bg-2); color: var(--ink); }
1610
+ .tp-copies button:disabled { opacity: 0.35; }
1611
+ .tp-copies button:focus-visible { outline: 0; box-shadow: inset 0 0 0 1px var(--accent); }
1612
+ .tp-copies .i { width: 11px; height: 11px; }
1613
+ .tp-del { flex: none; width: 28px; height: 28px; }
1614
+ .tp-del .i { width: 13px; height: 13px; }
1615
+ .tp-use { display: flex; align-items: center; gap: 8px; height: 30px; padding: 0 9px; border-radius: 9px; border: 1px solid var(--line); background: var(--surface); font-size: 13px; }
1616
+ .tp-use > span { flex: none; font-size: 11px; font-weight: 600; letter-spacing: 0.04em; text-transform: uppercase; color: var(--faint); }
1617
+ .tp-use input::placeholder, .tp-name input::placeholder { color: var(--faint); }
1618
+ .tp-empty { display: flex; align-items: center; gap: 12px; padding: 16px; border-radius: 11px; border: 1px dashed var(--line-2); color: var(--muted); font-size: 13px; }
1619
+ .tp-empty .i { flex: none; width: 22px; height: 22px; color: var(--faint); }
1620
+ .tp-empty p { margin: 0; line-height: 1.4; }
1621
+ .tp-foot { display: flex; align-items: center; gap: 8px; padding: 10px 14px; border-top: 1px solid var(--line); background: var(--surface-2); }
1622
+ .tp-count { font-size: 12px; color: var(--faint); font-variant-numeric: tabular-nums; }
1623
+ .tp-saveform { display: flex; align-items: center; gap: 8px; flex: 1; }
1624
+ .tp-saveform input { flex: 1; min-width: 0; height: 30px; padding: 0 10px; border-radius: 9px; border: 1px solid var(--accent); background: var(--surface); font: inherit; font-size: 13px; color: var(--ink); outline: 0; }
1625
+ .menu.tp-menu { width: 300px; }
1626
+ .menu.tp-menu button { align-items: center; text-align: left; }
1627
+ .menu.tp-menu button.on b { color: var(--accent-ink); }
1628
+ .tp-mdel { display: grid; place-items: center; flex: none; width: 24px; height: 24px; border-radius: 6px; color: var(--faint); opacity: 0; }
1629
+ .menu.tp-menu button:hover .tp-mdel { opacity: 1; }
1630
+ .tp-mdel:hover { color: var(--bad); background: var(--del-bg); }
1631
+ .tp-mdel .i { width: 13px; height: 13px; }
1632
+ .tp-mempty { padding: 12px; font-size: 13px; color: var(--muted); }
1633
+
1634
+ /* session meta */
1635
+ .it-meta .m.team-m { font: 11px var(--mono); color: var(--accent-ink); }
1636
+
1637
+ /* live: one line per subagent while the lead waits */
1638
+ .team-live { display: grid; gap: 4px; margin: 0 0 10px; padding: 8px; border-radius: 10px; background: var(--surface-2); border: 1px solid var(--line); }
1639
+ .tl-row { display: flex; align-items: center; gap: 9px; min-width: 0; padding: 3px 4px; font-size: 13px; }
1640
+ .tl-logo { display: grid; place-items: center; flex: none; width: 22px; height: 22px; border-radius: 50%; background: var(--surface); box-shadow: 0 0 0 1px var(--line); color: var(--ink); position: relative; }
1641
+ .tl-logo > * { width: 12px; height: 12px; display: block; }
1642
+ .tl-row.live .tl-logo::after { content: ''; position: absolute; inset: -3px; border-radius: 50%; border: 1.5px solid var(--accent); border-right-color: transparent; border-bottom-color: transparent; animation: ts-spin 1.1s linear infinite; }
1643
+ .tl-name { flex: none; font: 500 12.5px var(--mono); color: var(--ink); }
1644
+ .tl-live { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--muted); }
1645
+ .tl-row.live .tl-live { color: var(--ink-2); }
1646
+ .tl-row .elapsed { flex: none; font-size: 12px; color: var(--faint); font-variant-numeric: tabular-nums; }
1647
+
1648
+ /* after: the team's reports */
1649
+ .subs { margin: 14px 0 4px; }
1650
+ .subs-head { display: flex; align-items: center; gap: 10px; margin-bottom: 8px; font-size: 13px; }
1651
+ .subs-head b { font-weight: 600; }
1652
+ .subs-to { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font: 12px var(--mono); color: var(--muted); }
1653
+ .subs-list { display: grid; gap: 6px; }
1654
+ .sub { border-radius: var(--radius); border: 1px solid var(--line); background: var(--surface); overflow: hidden; transition: border-color 0.15s; }
1655
+ .sub:hover, .sub.open { border-color: var(--line-2); }
1656
+ .sub-head { display: flex; align-items: center; gap: 11px; width: 100%; padding: 9px 12px; text-align: left; }
1657
+ .sub-logo { display: grid; place-items: center; flex: none; width: 28px; height: 28px; border-radius: 8px; background: var(--bg-2); color: var(--ink); }
1658
+ .sub-logo > * { width: 15px; height: 15px; display: block; }
1659
+ .sub-main { flex: 1; min-width: 0; display: grid; gap: 1px; }
1660
+ .sub-top { display: flex; align-items: baseline; gap: 8px; min-width: 0; }
1661
+ .sub-top b { flex: none; font: 600 12.5px var(--mono); color: var(--ink); }
1662
+ .sub-model { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 12px; color: var(--faint); }
1663
+ .sub-title { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 13.5px; color: var(--ink-2); }
1664
+ .sub-side { display: flex; align-items: center; gap: 10px; flex: none; font-size: 12px; color: var(--muted); font-variant-numeric: tabular-nums; }
1665
+ .sub-side .chev { width: 12px; height: 12px; color: var(--faint); transform: rotate(90deg); transition: transform 0.2s var(--ease); }
1666
+ .sub.open .sub-side .chev { transform: rotate(-90deg); }
1667
+ .sub-body { padding: 4px 14px 14px; border-top: 1px solid var(--line); background: var(--surface-2); }
1668
+ .sub-task { margin: 10px 0 12px; }
1669
+ .sub-task span { font-size: 11px; font-weight: 600; letter-spacing: 0.04em; text-transform: uppercase; color: var(--faint); }
1670
+ .sub-task p { margin: 3px 0 0; font-size: 13px; color: var(--ink-2); white-space: pre-wrap; }
1671
+ .sub-wait { margin: 0; font-size: 13px; }
1672
+ @container (max-width: 520px) { .sub-files, .sub-dur, .sub-model { display: none; } }