wisp-agents 0.7.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); }
@@ -914,7 +1098,7 @@ pre.code { margin: 0 0 12px; padding: 12px 14px; border-radius: 10px; background
914
1098
  .modal .hint code { font-size: 11.5px; padding: 1px 5px; border-radius: 5px; background: var(--bg-2); }
915
1099
  /* rerun dialog: the launcher's prompt + harness bar, in a modal. Its popovers sit above the overlay. */
916
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; }
917
- .rr-box:focus-within { border-color: color-mix(in srgb, var(--accent) 55%, var(--line-2)); box-shadow: 0 0 0 3px var(--accent-soft); }
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); }
918
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; }
919
1103
  .rr-files { display: flex; flex-wrap: wrap; gap: 6px; padding: 2px 2px 6px; }
920
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); }
@@ -958,7 +1142,51 @@ pre.code { margin: 0 0 12px; padding: 12px 14px; border-radius: 10px; background
958
1142
  .switch[aria-checked='true']::after { transform: translateX(14px); }
959
1143
  .switch:disabled { opacity: 0.4; cursor: not-allowed; }
960
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; }
961
- .setting #openMemory { margin-left: -4px; }
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
+ }
962
1190
 
963
1191
  /* memory: what the background retros learned */
964
1192
  .memory-modal { width: min(680px, 100%); }
@@ -1024,8 +1252,6 @@ pre.code { margin: 0 0 12px; padding: 12px 14px; border-radius: 10px; background
1024
1252
  .tl-del::before { content: '− '; font-weight: 600; }
1025
1253
  .tl-tag { margin-left: 4px; font-size: 11px; color: var(--faint); white-space: nowrap; }
1026
1254
  .tl-err { color: var(--bad); font: 11.5px/1.45 var(--mono); }
1027
- .agents { margin-top: 18px; }
1028
- .agent-row { display: flex; align-items: center; gap: 10px; padding: 4px 0; font-size: 13px; }
1029
1255
  .keys-modal { width: min(380px, 100%); }
1030
1256
  .krow { display: flex; align-items: center; gap: 14px; padding: 6px 0; }
1031
1257
  .krow kbd { min-width: 56px; text-align: center; font-size: 11.5px; }
@@ -1046,6 +1272,15 @@ pre.code { margin: 0 0 12px; padding: 12px 14px; border-radius: 10px; background
1046
1272
  .update-btn:hover { background: var(--accent); color: #fff; }
1047
1273
  .update-btn.busy { opacity: 0.7; cursor: progress; }
1048
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; }
1049
1284
  .overlay:has(.palette) { place-items: start center; padding-top: min(14vh, 120px); background: rgba(0, 0, 0, 0.18); }
1050
1285
  .palette {
1051
1286
  display: flex; flex-direction: column; width: min(640px, 100%); max-height: min(560px, 72vh); overflow: hidden; border-radius: 14px;
@@ -1103,9 +1338,11 @@ pre.code { margin: 0 0 12px; padding: 12px 14px; border-radius: 10px; background
1103
1338
  /* ---------- responsive ---------- */
1104
1339
  @media (max-width: 720px) {
1105
1340
  .topbar { padding: 0 12px; gap: 10px; }
1106
- .search-btn span, .search-btn kbd, .update-btn span { 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; }
1107
1343
  .search-btn { padding: 0 8px; border-color: transparent; background: none; }
1108
1344
  .feed-wrap { padding: 14px 16px 80px; }
1345
+ .launcher.docked { width: calc(100% - 32px); }
1109
1346
  .it-side .q-proj, .it-actions span, .c-done span { display: none; }
1110
1347
  .turns { padding: 6px 14px 8px; }
1111
1348
  .it-dock { padding: 4px 10px 10px; }
@@ -1129,3 +1366,307 @@ body.electron .topbar { -webkit-app-region: drag; }
1129
1366
  body.electron .topbar button, body.electron .topbar a, body.electron .topbar .projects { -webkit-app-region: no-drag; }
1130
1367
  body.electron .overlay, body.electron .overlay *, body.electron .menu, body.electron .menu *, body.electron .toasts, body.electron .toast * { -webkit-app-region: no-drag; }
1131
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; } }