wisp-agents 0.7.0 → 0.9.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
@@ -140,12 +140,43 @@ kbd {
140
140
  .link { color: var(--accent-ink); font-weight: 500; }
141
141
  .link:hover { text-decoration: underline; text-underline-offset: 3px; }
142
142
  .link.on { color: var(--ink); }
143
- select {
144
- height: 30px; border-radius: 9px; border: 1px solid var(--line); background: var(--surface); padding: 0 26px 0 10px;
145
- appearance: none; font-size: 13px; color: var(--ink-2);
143
+ /* ---------- form kit ----------
144
+ One look for every standalone control. Use these classes, don't restyle controls per component:
145
+ <input class="input"> <textarea class="textarea"> <select> (styled by default)
146
+ .mono code-ish values: paths, cron, tokens, commands
147
+ .sm / .lg 30px rows in dense panels / the 38px add-project row
148
+ .field a box holding an icon / prefix + a bare <input>: <label class="field">icon<input></label>
149
+ .check a label wrapping a checkbox and its text
150
+ Components set only layout (width, flex) on these; a container already tinted surface-2 sets
151
+ --field-bg: var(--surface) so its fields don't melt into it. Prompt boxes (launcher, composer, rerun) and
152
+ inline renames (project name, memory edit) are their own, deliberately borderless pattern. */
153
+ :is(.input, .textarea, select, .field) {
154
+ width: 100%; min-width: 0; height: 32px; padding: 0 10px; border-radius: 9px; border: 1px solid var(--line-2);
155
+ background-color: var(--field-bg, var(--surface-2)); color: var(--ink); font: 13px/1.4 var(--sans); outline: 0;
156
+ transition: border-color 0.15s, box-shadow 0.15s, background-color 0.15s;
157
+ }
158
+ :is(.input, .textarea, select, .field):hover { border-color: color-mix(in srgb, var(--ink) 14%, var(--line-2)); }
159
+ :is(.input, .textarea, select):focus, .field:focus-within {
160
+ border-color: var(--accent); background-color: var(--surface); box-shadow: 0 0 0 3px var(--accent-soft);
161
+ }
162
+ :is(.input, .textarea, .field input)::placeholder { color: var(--faint); }
163
+ :is(.input, .textarea, select):disabled { opacity: 0.55; cursor: not-allowed; }
164
+ :is(.input, .textarea, select):is([aria-invalid='true'], :user-invalid) { border-color: var(--bad); }
165
+ :is(.input, .textarea, select):is([aria-invalid='true'], :user-invalid):focus { box-shadow: 0 0 0 3px var(--del-bg); }
166
+ .textarea { display: block; height: auto; min-height: 64px; padding: 7px 10px; line-height: 1.5; resize: vertical; }
167
+ :is(.input, .textarea, .field).mono { font-family: var(--mono); font-size: 12.5px; }
168
+ :is(.input, .field).sm { height: 30px; padding: 0 8px; }
169
+ :is(.input, .field).lg { height: 38px; padding: 0 12px; border-radius: 11px; }
170
+ select:not([multiple]) {
171
+ width: auto; padding-right: 28px; appearance: none; cursor: pointer; text-overflow: ellipsis;
146
172
  background-image: linear-gradient(45deg, transparent 50%, var(--muted) 50%), linear-gradient(135deg, var(--muted) 50%, transparent 50%);
147
- background-position: calc(100% - 13px) 13px, calc(100% - 9px) 13px; background-size: 4px 4px; background-repeat: no-repeat;
173
+ background-position: calc(100% - 14px) 50%, calc(100% - 10px) 50%; background-size: 4px 4px; background-repeat: no-repeat;
148
174
  }
175
+ .field { display: flex; align-items: center; gap: 8px; color: var(--muted); }
176
+ .field .i { width: 14px; height: 14px; flex: none; }
177
+ .field > input { flex: 1; min-width: 0; height: 100%; padding: 0; border: 0; outline: 0; background: none; font: inherit; color: var(--ink); }
178
+ input[type='checkbox'] { width: 15px; height: 15px; margin: 0; flex: none; accent-color: var(--accent); cursor: pointer; }
179
+ .check { display: inline-flex; align-items: center; gap: 8px; font-size: 13px; color: var(--ink-2); cursor: pointer; }
149
180
 
150
181
  /* ---------- the mark ---------- */
151
182
  /* A plain dot. Brand: ink dot with an offset accent dot. Live: a thin spinner ring. */
@@ -167,7 +198,7 @@ select {
167
198
 
168
199
  /* ---------- layout: one column — top bar, launcher, feed ---------- */
169
200
  .stage {
170
- position: relative; height: 100vh; overflow-y: auto; overflow-x: hidden; scroll-padding-top: 64px;
201
+ position: relative; height: 100vh; overflow-y: auto; overflow-x: hidden; scroll-padding-top: 116px; /* top bar + docked launcher */
171
202
  /* reserve the gutter on both sides so the scrollbar appearing never shifts or off-centres the layout */
172
203
  scrollbar-gutter: stable both-edges;
173
204
  }
@@ -196,11 +227,12 @@ select {
196
227
  .topbar.scrolled { border-bottom-color: var(--line); }
197
228
 
198
229
  .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);
230
+ position: fixed; top: 116px; left: 0; right: 0; margin-inline: auto; z-index: 20; display: flex; align-items: center; gap: 7px;
231
+ width: max-content; height: 38px; padding: 0 9px 0 12px; border-radius: 19px; color: var(--ink-2);
201
232
  background: var(--surface); border: 1px solid var(--line-2); box-shadow: var(--shadow-2);
202
233
  transition: color 0.15s, border-color 0.15s, translate 0.2s var(--ease); animation: to-top-in 0.25s var(--ease);
203
234
  }
235
+ .to-top kbd { line-height: 1.3; }
204
236
  .to-top:hover { color: var(--ink); border-color: var(--faint); translate: 0 -2px; }
205
237
  @keyframes to-top-in { from { opacity: 0; transform: translateY(-10px) scale(0.97); } }
206
238
  .to-top:focus-visible { outline: 0; box-shadow: 0 0 0 2px var(--accent-soft), 0 0 0 1px var(--accent); }
@@ -226,8 +258,10 @@ select {
226
258
  .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
259
 
228
260
  /* ---------- 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); }
261
+ .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; }
262
+ /* A picker or menu opened from the launcher lives on <body> and takes focus; the launcher stays lit
263
+ while it's open so switching between the two harness pickers doesn't flash the ring off and on. */
264
+ .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
265
  .launcher.drop, .composer.drop { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-soft); }
232
266
  .l-projects { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; padding: 0 2px 8px; }
233
267
  .l-in { font-size: 12.5px; color: var(--faint); margin-right: 2px; }
@@ -239,12 +273,73 @@ select {
239
273
  .lp-chip.on { background: var(--bg-2); border-color: var(--line-2); color: var(--ink); font-weight: 500; }
240
274
  .lp-chip.add { color: var(--muted); border-style: dashed; }
241
275
  .lp-chip.add .i { width: 14px; height: 14px; }
276
+ /* recipes: one-click prompts under the launch bar */
277
+ .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); }
278
+ .l-recipes .l-in { display: inline-flex; align-items: center; gap: 5px; }
279
+ .l-recipes .l-in .i { width: 13px; height: 13px; color: var(--accent); }
280
+ .l-recipes .lp-chip { height: 24px; padding: 0 9px; font-size: 12px; }
281
+ .l-recipes .lp-chip.rc { background: var(--surface-2); }
282
+ .l-recipes .lp-chip.rc:hover { border-color: color-mix(in srgb, var(--accent) 45%, var(--line-2)); color: var(--ink); }
283
+ .l-recipes .lp-chip[hidden] { display: none; }
284
+ .rc-f { font-style: normal; color: var(--faint); margin-left: -3px; }
285
+ .lr-empty { margin-right: 2px; }
242
286
  .launcher textarea, .composer textarea {
243
287
  display: block; width: 100%; resize: none; border: 0; outline: 0; background: transparent; padding: 8px 4px;
244
288
  font-size: 15px; line-height: 1.55; color: var(--ink); min-height: 64px;
245
289
  }
246
290
  .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; }
291
+ /* docked: pinned under the top bar once scrolled past, one line until focused (or a menu of it is open) */
292
+ .launcher.docked {
293
+ position: fixed; top: 60px; left: 0; right: 0; margin-inline: auto; z-index: 15; width: min(752px, calc(100% - 48px));
294
+ max-height: calc(100vh - 76px); overflow-y: auto; box-shadow: var(--shadow-2); animation: dock-in 0.2s var(--ease);
295
+ }
296
+ .launcher.docked:is(:focus-within, :has(.open)) { box-shadow: 0 0 0 3px var(--accent-soft), var(--shadow-2); }
297
+ .launcher.docked:not(:focus-within):not(:has(.open)) { display: flex; align-items: center; gap: 6px; padding: 6px 8px; cursor: text; overflow: hidden; }
298
+ .launcher.docked:not(:focus-within):not(:has(.open)) :is(.l-in, .lp-chip:not(.on), .tray, .l-bar, .l-recipes) { display: none; }
299
+ .launcher.docked:not(:focus-within):not(:has(.open)) .l-projects { flex: none; flex-wrap: nowrap; padding: 0; }
300
+ .launcher.docked:not(:focus-within):not(:has(.open)) textarea {
301
+ flex: 1; min-width: 0; min-height: 0; height: 30px !important; padding: 4px; font-size: 14px; white-space: pre; overflow: hidden; cursor: text;
302
+ }
303
+ @keyframes dock-in { from { opacity: 0; transform: translateY(-8px); } }
304
+ body:has(.launcher.docked:is(:focus-within, :has(.open))) .to-top { display: none; }
305
+ .l-bar { display: flex; align-items: center; gap: 8px; padding-top: 6px; }
306
+ .l-bar > :not(.runners) { flex: none; }
307
+ .l-bar .grow { flex: 1; }
308
+ /* harness pill(s): "vs" rides on the end of it; on, the second harness joins the same pill */
309
+ .runners {
310
+ display: inline-flex; align-items: stretch; min-width: 0; height: 30px; border-radius: 9px;
311
+ border: 1px solid var(--line); background: var(--surface); transition: border-color 0.15s;
312
+ }
313
+ .runners:hover, .runners:has(.open) { border-color: var(--line-2); }
314
+ .runners .runner-btn { height: 28px; min-width: 0; border: 0; border-radius: 8px; background: transparent; }
315
+ .runners .runner-btn:hover, .runners .runner-btn.open { background: var(--bg-2); }
316
+ .runners .runner-btn { overflow: hidden; }
317
+ .runners .rb-logo { flex: none; }
318
+ .runners .rb-h { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
319
+ .runners .rb-m { flex: 0 100 auto; min-width: 0; }
320
+ .runners.cmp .rb-e, .l-bar:has(.runners.cmp) #wtBtn span { display: none; }
321
+ /* two harnesses on a narrow bar: drop the model names, then the harness names (logos stay) */
322
+ @container launcher (max-width: 640px) { .runners.cmp .rb-m { display: none; } }
323
+ @container launcher (max-width: 520px) {
324
+ .l-bar .mode-btn span, .l-bar #wtBtn span, .runners .rb-m { display: none; }
325
+ .runners.cmp .rb-h { display: none; }
326
+ .runners.cmp .runner-btn .chev { margin-left: 0; }
327
+ .runners.cmp .rb-logo { margin-right: 4px; }
328
+ }
329
+ .vs-btn {
330
+ position: relative; flex: none; display: grid; place-items: center; width: 30px;
331
+ font: 600 11px var(--mono); letter-spacing: 0.02em; color: var(--faint); transition: color 0.15s, background 0.15s;
332
+ }
333
+ .vs-btn::before { content: ''; position: absolute; left: 0; top: 7px; bottom: 7px; width: 1px; background: var(--line); }
334
+ .vs-btn:hover { color: var(--accent-ink); }
335
+ .vs-btn .i { display: none; width: 13px; height: 13px; }
336
+ .vs-btn:focus-visible { outline: 0; border-radius: 6px; box-shadow: inset 0 0 0 1px var(--accent); }
337
+ .runners.cmp { border-color: color-mix(in srgb, var(--accent) 35%, var(--line)); }
338
+ .runners.cmp .vs-btn { width: 26px; color: var(--accent-ink); }
339
+ .runners.cmp .vs-btn::before { display: none; }
340
+ .runners.cmp .vs-btn:hover { color: var(--ink); }
341
+ .runners.cmp .vs-btn:is(:hover, :focus-visible) span { display: none; }
342
+ .runners.cmp .vs-btn:is(:hover, :focus-visible) .i { display: block; }
248
343
  /* permission mode: icon-only on the default, labelled otherwise */
249
344
  .mode-btn {
250
345
  display: inline-flex; align-items: center; gap: 6px; height: 32px; min-width: 32px; padding: 0 9px; border-radius: 9px;
@@ -315,10 +410,7 @@ select {
315
410
  .pk-text small:empty { display: none; }
316
411
  .pk-dot { flex: none; width: 6px; height: 6px; border-radius: 50%; background: var(--accent); }
317
412
  .pk-main { display: flex; flex-direction: column; min-width: 0; min-height: 0; }
318
- .pk-search { flex: none; display: flex; align-items: center; gap: 8px; margin: 8px 8px 2px; padding: 0 10px; height: 34px; border-radius: 9px; border: 1px solid var(--line); background: var(--bg-2); color: var(--faint); transition: border-color 0.15s, background 0.15s; }
319
- .pk-search:focus-within { border-color: var(--accent); background: var(--surface); }
320
- .pk-search .i { width: 14px; height: 14px; flex: none; }
321
- .pk-search input { flex: 1; min-width: 0; border: 0; outline: 0; background: none; font: inherit; font-size: 13px; color: var(--ink); }
413
+ .pk-search { flex: none; width: auto; margin: 8px 8px 2px; color: var(--faint); }
322
414
  .pk-list { flex: 1; overflow-y: auto; padding: 6px; }
323
415
  .pk-group + .pk-group { margin-top: 4px; }
324
416
  .pk-check { width: 15px; height: 15px; flex: none; color: var(--accent); visibility: hidden; }
@@ -428,7 +520,6 @@ select {
428
520
  .it-loading { display: flex; align-items: center; gap: 10px; padding: 18px; color: var(--muted); font-size: 13px; }
429
521
  .it-bar { display: flex; align-items: center; gap: 12px; padding: 8px 10px 8px 14px; }
430
522
  .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
523
  .it-actions { display: flex; gap: 2px; flex: none; }
433
524
  .it-body .earlier { display: block; margin: 4px 0 0 18px; }
434
525
  .it-dock { padding: 4px 14px 14px; }
@@ -519,12 +610,11 @@ select {
519
610
  /* ask card (mid-run question) */
520
611
  .ask-card, .b-question {
521
612
  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);
613
+ background: var(--surface); border: 1px solid color-mix(in srgb, var(--warn) 60%, var(--line));
524
614
  animation: rise 0.4s var(--ease) both;
525
615
  }
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); }
616
+ .b-question { border-color: color-mix(in srgb, var(--accent) 60%, var(--line)); }
617
+ .b-question.answered { opacity: 0.65; background: var(--surface-2); border: 1px solid var(--line); }
528
618
  .q-head { display: flex; align-items: center; gap: 7px; font-size: 12.5px; font-weight: 500; color: var(--warn); }
529
619
  .b-question .q-head { color: var(--accent-ink); }
530
620
  .q-text { margin: 6px 0 12px; font: 600 17px/1.4 var(--display); letter-spacing: -0.015em; color: var(--ink); }
@@ -538,9 +628,7 @@ select {
538
628
  .opt .k { display: grid; place-items: center; width: 20px; height: 20px; border-radius: 6px; background: var(--bg-2); font: 500 11px var(--mono); color: var(--muted); flex: none; }
539
629
  .opt:hover:not(:disabled) { border-color: var(--accent); background: var(--accent-soft); }
540
630
  .opt.own { color: var(--muted); border-style: dashed; padding-left: 12px; }
541
- .q-own { display: flex; gap: 8px; margin-top: 12px; }
542
- .q-own input { flex: 1; height: 34px; border-radius: 10px; border: 1px solid var(--line); background: var(--surface-2); padding: 0 12px; outline: 0; }
543
- .q-own input:focus { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-soft); }
631
+ .q-own { display: flex; align-items: center; gap: 8px; margin-top: 12px; }
544
632
  .ask-card.sent { opacity: 0.5; pointer-events: none; }
545
633
 
546
634
  /* ---------- presentation blocks ---------- */
@@ -729,6 +817,8 @@ pre.code { margin: 0 0 12px; padding: 12px 14px; border-radius: 10px; background
729
817
  .wire-label { font: 500 11px var(--sans); fill: var(--muted); paint-order: stroke; stroke: var(--surface); stroke-width: 4px; }
730
818
  .cols { position: relative; display: flex; align-items: center; justify-content: space-between; gap: 46px; }
731
819
  .col { flex: 1; display: flex; flex-direction: column; gap: 12px; min-width: 0; max-width: 220px; }
820
+ .cols.snake { display: grid; grid-template-columns: repeat(var(--per-row), minmax(0, 1fr)); column-gap: 46px; row-gap: 40px; align-items: center; }
821
+ .cols.snake .col { width: 100%; max-width: 220px; justify-self: center; }
732
822
  .node {
733
823
  position: relative; padding: 9px 12px; border-radius: 8px; background: var(--surface); border: 1px solid var(--line-2);
734
824
  text-align: center; animation: pop 0.4s var(--ease) calc(200ms + var(--k) * 120ms) both;
@@ -808,6 +898,88 @@ pre.code { margin: 0 0 12px; padding: 12px 14px; border-radius: 10px; background
808
898
  .b-commits .sub { display: flex; gap: 10px; margin-top: 2px; font: 12px var(--mono); color: var(--muted); }
809
899
  .b-commits .sub code { padding: 0 5px; }
810
900
 
901
+ /* graph: a PR's branches, the merge target and its conflicts */
902
+ .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; }
903
+ .g-head { display: flex; align-items: baseline; gap: 12px; margin-bottom: 8px; }
904
+ .g-head h3 { flex: 1; min-width: 0; margin: 0; font-size: 14px; font-weight: 600; color: var(--ink); }
905
+ .g-ref { font-weight: 500; color: var(--muted); }
906
+ .g-pr { display: inline-flex; align-items: center; gap: 6px; font-size: 12.5px; font-weight: 500; --tone: var(--good); color: var(--tone); }
907
+ .g-pr i { width: 6px; height: 6px; border-radius: 50%; background: currentColor; }
908
+ .g-pr.st-merged { --tone: var(--g-merged); }
909
+ .g-pr.st-closed { --tone: var(--bad); }
910
+ .g-pr.st-draft { --tone: var(--muted); }
911
+ .g-body { position: relative; display: grid; grid-template-columns: var(--g-w) 1fr; column-gap: 14px; }
912
+ .g-svg { overflow: visible; }
913
+ .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; }
914
+ .g-wire.pending { stroke-dasharray: 3 3; stroke-dashoffset: 0; animation: fade-in 0.5s 0.5s both; stroke: var(--faint); }
915
+ .g-wire.pending.st-conflict { stroke: var(--warn); }
916
+ .g-wire.pending.st-ready { stroke: var(--good); }
917
+ .g-wire.st-merged { stroke: var(--g-merged); }
918
+ .g-tail { fill: none; stroke-width: 1.5; stroke-dasharray: 2 3; opacity: 0.5; animation: fade-in 0.5s 0.4s both; }
919
+ .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; }
920
+ .g-dot.conflict { fill: var(--warn); }
921
+ .g-dot.merge { fill: var(--surface); stroke: var(--lc); stroke-width: 1.6; }
922
+ .g-target circle { fill: var(--surface); stroke: var(--faint); stroke-width: 1.5; stroke-dasharray: 2 2; }
923
+ .g-target path { fill: none; stroke: #fff; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }
924
+ .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; }
925
+ .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; }
926
+ .g-target.st-merged circle { fill: var(--g-merged); stroke: none; }
927
+ .g-target.st-blocked circle { fill: var(--bad); stroke: none; }
928
+ .g-rows { list-style: none; margin: 0; padding: 0; min-width: 0; }
929
+ .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; }
930
+ .g-msg { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--ink); }
931
+ .g-row.other .g-msg, .g-row.target .g-msg { color: var(--muted); }
932
+ .g-row.conflict .g-msg { color: var(--warn); }
933
+ .g-row.lit { background: color-mix(in srgb, var(--warn) 9%, transparent); }
934
+ .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); }
935
+ .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); }
936
+ .g-meta { flex: none; margin-left: auto; padding-left: 10px; font-size: 12.5px; color: var(--muted); white-space: nowrap; }
937
+ .g-meta code { font: 12px var(--mono); color: var(--faint); background: none; padding: 0; margin-right: 4px; }
938
+ .g-state { margin-left: auto; font-size: 12.5px; font-weight: 500; color: var(--muted); }
939
+ .g-row.st-conflict .g-state { color: var(--warn); }
940
+ .g-row.st-ready .g-state { color: var(--good); }
941
+ .g-row.st-merged .g-state { color: var(--g-merged); }
942
+ .g-row.st-blocked .g-state { color: var(--bad); }
943
+ .g-checks { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 10px; }
944
+ .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; }
945
+ .g-check .i { width: 12px; height: 12px; color: var(--good); }
946
+ .g-check b { font-weight: 500; }
947
+ .g-check span { color: var(--muted); }
948
+ .g-check.st-fail .i { color: var(--bad); }
949
+ .g-check.st-pending .i, .g-check.st-skip .i { color: var(--muted); }
950
+ .g-conflicts { list-style: none; margin: 10px 0 0; padding: 8px 0 0; border-top: 1px solid var(--line); }
951
+ .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; }
952
+ .g-conflicts li.lit { background: color-mix(in srgb, var(--warn) 7%, transparent); }
953
+ .g-c-head { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; font-size: 13px; }
954
+ .g-c-head .g-num { align-self: center; }
955
+ .g-file { font: 12.5px var(--mono); }
956
+ .g-c-detail { color: var(--ink-2); }
957
+ .g-sides { display: grid; grid-template-columns: max-content 1fr; gap: 4px 10px; align-items: baseline; margin: 5px 0 0 25px; font-size: 12px; }
958
+ .g-side { display: contents; }
959
+ .g-num.plain { color: var(--muted); background: var(--bg-2); }
960
+ .g-who { font: 11.5px var(--mono); color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 180px; }
961
+ .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); }
962
+ .g-side.theirs code { background: color-mix(in srgb, var(--warn) 8%, transparent); }
963
+ .g-res { display: flex; gap: 6px; margin: 5px 0 0 25px; font-size: 12.5px; color: var(--ink-2); }
964
+ .g-res .i { width: 13px; height: 13px; margin-top: 2px; color: var(--good); flex: none; }
965
+ .g-foot { display: flex; align-items: center; gap: 8px; min-height: 32px; margin-top: 8px; font-size: 13.5px; color: var(--ink); }
966
+ .g-foot > .i { width: 14px; height: 14px; color: var(--muted); flex: none; }
967
+ .g-foot.st-conflict > .i, .g-count { color: var(--warn); }
968
+ .g-foot.st-ready > .i { color: var(--good); }
969
+ .g-foot.st-merged > .i { color: var(--g-merged); }
970
+ .g-foot.st-blocked > .i { color: var(--bad); }
971
+ .g-foot-text { flex: 1; min-width: 0; }
972
+ .g-count { font: inherit; text-decoration: underline dotted; text-underline-offset: 3px; cursor: pointer; }
973
+ .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; }
974
+ .g-action:hover:not(:disabled) { background: color-mix(in srgb, var(--accent) 16%, transparent); }
975
+ .g-action:disabled { opacity: 0.5; cursor: default; }
976
+ @container (max-width: 520px) {
977
+ .g-meta { display: none; }
978
+ }
979
+ @media (prefers-color-scheme: dark) {
980
+ :root:not([data-theme='light']) .b-graph { --g-1: #6d8dff; --g-2: #2fd0b4; --g-3: #a78bfa; --g-4: #f472b6; --g-merged: #b48cff; }
981
+ }
982
+
811
983
  /* checklist */
812
984
  .b-check { padding: 16px 20px 12px; }
813
985
  .b-check ul { list-style: none; margin: 0; padding: 0; }
@@ -846,6 +1018,40 @@ pre.code { margin: 0 0 12px; padding: 12px 14px; border-radius: 10px; background
846
1018
  }
847
1019
  .chip:hover { border-color: var(--faint); color: var(--ink); background: var(--surface-2); }
848
1020
 
1021
+ /* actions block */
1022
+ .b-actions { padding: 16px 18px 12px; }
1023
+ .act-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
1024
+ .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; }
1025
+ .act-row.ran-ok { border-color: color-mix(in srgb, var(--good) 35%, var(--line)); }
1026
+ .act-row.ran-bad { border-color: color-mix(in srgb, var(--bad) 45%, var(--line)); }
1027
+ .act-bar { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 9px 12px; }
1028
+ .act-info { min-width: 0; display: flex; flex-direction: column; gap: 2px; }
1029
+ .act-info b { font-weight: 600; font-size: 13.5px; color: var(--ink); }
1030
+ .act-cmd { font: 11.5px var(--mono); color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1031
+ .act-detail { font-size: 12.5px; color: var(--muted); }
1032
+ .act-side { display: inline-flex; align-items: center; gap: 8px; flex: none; }
1033
+ .act-side .exit { background: var(--bg-2); color: var(--muted); }
1034
+ .act-side .exit.ok { background: var(--add-bg); color: var(--good); }
1035
+ .act-side .exit.bad { background: var(--del-bg); color: var(--bad); }
1036
+ .act-res { border-top: 1px solid var(--line); background: var(--term-bg); color: var(--term-ink); padding: 10px 12px; }
1037
+ .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; }
1038
+ .act-fix { margin-top: 8px; }
1039
+
1040
+ /* interactive terminal, tests, revert & checkpoints */
1041
+ .term-run { color: #b4b4b0; border-color: rgba(255, 255, 255, 0.14); background: rgba(255, 255, 255, 0.05); }
1042
+ .term-run:hover:not(:disabled) { color: #fff; background: rgba(255, 255, 255, 0.12); border-color: rgba(255, 255, 255, 0.25); }
1043
+ .tests-cmd { display: flex; align-items: center; gap: 8px; margin-top: 8px; flex-wrap: wrap; }
1044
+ .tests-cmd .cmdline { margin-top: 0; }
1045
+ .tests-rerun-out { margin-top: 12px; padding: 10px 12px; border-radius: 10px; background: var(--term-bg); color: var(--term-ink); }
1046
+ .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; }
1047
+ .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); }
1048
+ .cp-sha { font: 500 11px var(--mono); color: var(--faint); padding: 1px 5px; border-radius: 5px; background: var(--surface); border: 1px solid var(--line); }
1049
+ .b-diff.is-reverted .diff-scroll { opacity: 0.55; }
1050
+ .b-diff.is-reverted .path .base, .b-files li.is-reverted .path .base { text-decoration: line-through; color: var(--muted); }
1051
+ .cp-rollback { display: inline-flex; align-items: center; gap: 5px; }
1052
+ .cp-rollback .i { width: 12px; height: 12px; }
1053
+ .cp-rollback.rolled-back { color: var(--accent-ink); }
1054
+
849
1055
  /* trail */
850
1056
  .trail { margin-top: 18px; }
851
1057
  .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 +1080,11 @@ pre.code { margin: 0 0 12px; padding: 12px 14px; border-radius: 10px; background
874
1080
  .send { display: grid; place-items: center; width: 30px; height: 30px; border-radius: 8px; background: var(--ink); color: var(--bg); transition: opacity 0.15s; }
875
1081
  .send:hover { opacity: 0.86; }
876
1082
  .send:disabled { opacity: 0.5; }
1083
+ .send.busy { opacity: 1; position: relative; color: transparent; }
1084
+ .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; }
1085
+ @keyframes spin { to { transform: rotate(360deg); } }
877
1086
  .c-done { color: var(--muted); }
1087
+ .c-ship { color: var(--accent-ink); }
878
1088
  .c-queue { color: var(--faint); font-size: 12px; }
879
1089
  .c-queue.on { color: var(--ink); background: var(--bg-2); }
880
1090
  .c-done:hover { color: var(--good); }
@@ -914,20 +1124,18 @@ pre.code { margin: 0 0 12px; padding: 12px 14px; border-radius: 10px; background
914
1124
  .modal .hint code { font-size: 11.5px; padding: 1px 5px; border-radius: 5px; background: var(--bg-2); }
915
1125
  /* rerun dialog: the launcher's prompt + harness bar, in a modal. Its popovers sit above the overlay. */
916
1126
  .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); }
1127
+ .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
1128
  .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
1129
  .rr-files { display: flex; flex-wrap: wrap; gap: 6px; padding: 2px 2px 6px; }
920
1130
  .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); }
921
1131
  .rr-file .i { width: 12px; height: 12px; color: var(--muted); }
922
1132
  .overlay:not([hidden]) ~ :is(.picker, .menu) { z-index: 55; }
923
1133
  .add-row { display: flex; gap: 8px; }
924
- .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); }
925
- .path-input:focus-within { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-soft); }
926
- .path-input .i { color: var(--muted); }
1134
+ .path-input { position: relative; flex: 1; }
1135
+ .path-input .i { width: 16px; height: 16px; }
927
1136
  .path-input .browse { display: grid; place-items: center; margin-left: -4px; width: 26px; height: 26px; border-radius: 7px; }
928
1137
  .path-input .browse:hover { background: var(--bg-2); }
929
1138
  .path-input .browse:hover .i { color: var(--accent); }
930
- .path-input input { flex: 1; border: 0; outline: 0; background: transparent; font: 13px var(--mono); }
931
1139
  .suggest { position: absolute; left: 0; right: 0; top: calc(100% + 6px); z-index: 2; padding: 4px; border-radius: 12px; background: var(--surface); border: 1px solid var(--line); box-shadow: var(--shadow-2); }
932
1140
  .suggest button { display: block; width: 100%; text-align: left; padding: 6px 10px; border-radius: 8px; font: 12.5px var(--mono); color: var(--ink-2); }
933
1141
  .suggest button:hover, .suggest button.on { background: var(--accent-soft); color: var(--ink); }
@@ -957,8 +1165,52 @@ pre.code { margin: 0 0 12px; padding: 12px 14px; border-radius: 10px; background
957
1165
  .switch[aria-checked='true'] { background: var(--accent); }
958
1166
  .switch[aria-checked='true']::after { transform: translateX(14px); }
959
1167
  .switch:disabled { opacity: 0.4; cursor: not-allowed; }
960
- .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; }
1168
+ .settings-modal label > .input { flex: 1; max-width: 340px; }
1169
+
1170
+ /* settings: sidebar of sections, one pane at a time */
1171
+ .modal.sx { display: grid; grid-template-columns: 196px 1fr; width: min(880px, 100%); height: min(620px, 86vh); padding: 0; overflow: hidden; }
1172
+ .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; }
1173
+ .sx-nav h2 { margin: 0 8px 14px; font: 600 18px/1.2 var(--display); letter-spacing: -0.015em; }
1174
+ .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; }
1175
+ .sx-nav button .i { width: 15px; height: 15px; color: var(--muted); }
1176
+ .sx-nav button span { flex: 1; }
1177
+ .sx-nav button:hover { background: color-mix(in srgb, var(--ink) 6%, transparent); color: var(--ink); }
1178
+ .sx-nav button[aria-selected='true'] { background: var(--surface); color: var(--ink); font-weight: 500; box-shadow: var(--shadow-1); }
1179
+ .sx-nav button[aria-selected='true'] .i { color: var(--accent); }
1180
+ .sx-nav button:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
1181
+ .sx-main { min-width: 0; padding: 18px 24px 24px; overflow-y: auto; }
1182
+ .sx-main > header { align-items: flex-start; gap: 16px; margin-bottom: 18px; }
1183
+ .sx-title { margin: 2px 0 4px; font: 600 16px/1.3 var(--display); letter-spacing: -0.01em; }
1184
+ .sx-lede { margin: 0; font-size: 12.5px; color: var(--muted); }
1185
+ .sx-group { --field-bg: var(--surface); border: 1px solid var(--line); border-radius: 12px; background: var(--surface-2); }
1186
+ .sx-group + .sx-group, .sx-pane > * + .sx-group { margin-top: 14px; }
1187
+ .sx-row { display: flex; align-items: center; gap: 16px; min-height: 52px; padding: 9px 14px; }
1188
+ .sx-row + .sx-row { border-top: 1px solid var(--line); }
1189
+ .sx-row[hidden] { display: none; }
1190
+ .sx-text { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
1191
+ .sx-text b { display: flex; align-items: center; gap: 8px; font-weight: 500; font-size: 13.5px; }
1192
+ .sx-text small { font-size: 12px; color: var(--muted); overflow: hidden; text-overflow: ellipsis; }
1193
+ .sx-text code { font-size: 11px; }
1194
+ .sx-ctl { flex: none; display: flex; align-items: center; gap: 8px; }
1195
+ .sx-ctl .input { width: 300px; }
1196
+ .sx-state { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: var(--muted); }
1197
+ .sx-state.bad { color: var(--bad); }
1198
+ .sx-usage .it-loading { grid-column: 1 / -1; }
1199
+ /* a view (Memory, Automations, Usage, Phone) opened inside Settings: no dialog chrome of its own */
1200
+ .modal.embedded { width: auto; max-height: none; overflow: visible; padding: 0; border: 0; border-radius: 0; box-shadow: none; background: none; transform: none; }
1201
+ .modal.embedded header { justify-content: flex-start; gap: 10px; }
1202
+ .modal.embedded header h2 { font-size: 16px; margin-right: auto; }
1203
+ .sx-back { margin-left: -8px; padding: 0 8px 0 4px; color: var(--muted); }
1204
+ .sx-back .i { width: 16px; height: 16px; }
1205
+ @media (max-width: 640px) {
1206
+ .modal.sx { grid-template-columns: 1fr; grid-template-rows: auto 1fr; }
1207
+ .sx-nav { flex-direction: row; align-items: center; padding: 10px; overflow-x: auto; border-right: 0; border-bottom: 1px solid var(--line); }
1208
+ .sx-nav h2 { display: none; }
1209
+ .sx-nav button { flex: none; }
1210
+ .sx-main { padding: 16px; }
1211
+ .sx-ctl .input { width: 180px; }
1212
+ .sx-usage { grid-template-columns: repeat(2, 1fr); }
1213
+ }
962
1214
 
963
1215
  /* memory: what the background retros learned */
964
1216
  .memory-modal { width: min(680px, 100%); }
@@ -998,7 +1250,6 @@ pre.code { margin: 0 0 12px; padding: 12px 14px; border-radius: 10px; background
998
1250
  .mem-item:hover .mem-acts, .mem-item:focus-within .mem-acts { opacity: 1; }
999
1251
  .mem-edit { align-items: center; padding-top: 7px; padding-bottom: 7px; background: var(--surface-2); box-shadow: inset 0 0 0 1px var(--accent); }
1000
1252
  .mem-edit input { flex: 1; min-width: 0; border: 0; outline: 0; background: transparent; font: 13.5px var(--sans); color: var(--ink); }
1001
- .memory-modal .mem-edit input { max-width: none; height: auto; padding: 0; }
1002
1253
  .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); }
1003
1254
  .mem-add:hover { color: var(--accent-ink); background: var(--accent-soft); }
1004
1255
  .mem-add .i { width: 13px; height: 13px; }
@@ -1024,8 +1275,6 @@ pre.code { margin: 0 0 12px; padding: 12px 14px; border-radius: 10px; background
1024
1275
  .tl-del::before { content: '− '; font-weight: 600; }
1025
1276
  .tl-tag { margin-left: 4px; font-size: 11px; color: var(--faint); white-space: nowrap; }
1026
1277
  .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
1278
  .keys-modal { width: min(380px, 100%); }
1030
1279
  .krow { display: flex; align-items: center; gap: 14px; padding: 6px 0; }
1031
1280
  .krow kbd { min-width: 56px; text-align: center; font-size: 11.5px; }
@@ -1046,6 +1295,15 @@ pre.code { margin: 0 0 12px; padding: 12px 14px; border-radius: 10px; background
1046
1295
  .update-btn:hover { background: var(--accent); color: #fff; }
1047
1296
  .update-btn.busy { opacity: 0.7; cursor: progress; }
1048
1297
  .update-btn .i { width: 14px; height: 14px; }
1298
+ .auto-btn {
1299
+ display: inline-flex; align-items: center; gap: 7px; height: 30px; padding: 0 10px; border-radius: 9px;
1300
+ border: 1px solid var(--line); background: var(--surface-2); color: var(--muted); font-size: 13px; transition: border-color 0.15s, color 0.15s;
1301
+ }
1302
+ .auto-btn:hover { border-color: var(--line-2); color: var(--ink); }
1303
+ .auto-btn .i { width: 14px; height: 14px; }
1304
+ .auto-btn.live .i { color: var(--accent); }
1305
+ .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); }
1306
+ .ab-n[hidden] { display: none; }
1049
1307
  .overlay:has(.palette) { place-items: start center; padding-top: min(14vh, 120px); background: rgba(0, 0, 0, 0.18); }
1050
1308
  .palette {
1051
1309
  display: flex; flex-direction: column; width: min(640px, 100%); max-height: min(560px, 72vh); overflow: hidden; border-radius: 14px;
@@ -1100,13 +1358,129 @@ pre.code { margin: 0 0 12px; padding: 12px 14px; border-radius: 10px; background
1100
1358
  @keyframes ring { from { transform: scale(0.6); opacity: 0.9; } to { transform: scale(1.7); opacity: 0; } }
1101
1359
  @keyframes shimmer { from { background-position: 100% 0; } to { background-position: -200% 0; } }
1102
1360
 
1361
+ /* ---------- machines: other computers over SSH ---------- */
1362
+ .machines-btn.trouble .i { color: var(--warn); }
1363
+ .q-machine {
1364
+ display: inline-flex; align-items: center; gap: 4px; max-width: 120px; padding: 0 6px; border-radius: 5px; border: 1px solid var(--line);
1365
+ font-size: 11px; font-weight: 500; line-height: 17px; color: var(--ink-2); white-space: nowrap;
1366
+ }
1367
+ .q-machine span { overflow: hidden; text-overflow: ellipsis; }
1368
+ .q-machine .i { flex: none; width: 11px; height: 11px; color: var(--accent); }
1369
+ .q-machine.off { color: var(--faint); border-style: dashed; }
1370
+ .q-machine.off .i { color: var(--faint); }
1371
+ /* the launcher: one group of project chips per place it runs on */
1372
+ .l-projects { row-gap: 6px; }
1373
+ .lp-group { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 6px; }
1374
+ .lp-group + .lp-group { margin-left: 4px; padding-left: 10px; border-left: 1px solid var(--line); }
1375
+ .lp-gl { display: inline-flex; align-items: center; gap: 4px; font-size: 12px; font-weight: 500; color: var(--ink-2); }
1376
+ .lp-gl .i { width: 13px; height: 13px; color: var(--accent); }
1377
+ .lp-gl.off { color: var(--faint); }
1378
+ .lp-gl.off .i { color: var(--faint); }
1379
+ .lp-gl .link { margin-left: 2px; }
1380
+ .where-btn .chev { width: 11px; height: 11px; opacity: 0.6; transform: rotate(90deg); }
1381
+ .where-btn.bare span, .where-btn.bare .chev { display: none; }
1382
+ .where-menu { min-width: 300px; }
1383
+ .wm-h { display: flex; align-items: baseline; gap: 8px; padding: 6px 10px 6px; font-size: 12px; font-weight: 600; color: var(--ink); }
1384
+ .wm-h small { font-weight: 400; color: var(--faint); }
1385
+ .where-menu .wm-row { gap: 10px; }
1386
+ .wm-check { display: grid; place-items: center; width: 16px; height: 16px; flex: none; border-radius: 5px; border: 1.5px solid var(--line-2); color: transparent; }
1387
+ .wm-check .i { width: 11px; height: 11px; }
1388
+ .wm-row.on .wm-check { background: var(--accent); border-color: var(--accent); color: #fff; }
1389
+ .wm-icon { position: relative; display: inline-grid; place-items: center; flex: none; color: var(--muted); }
1390
+ .wm-icon .i { width: 16px; height: 16px; }
1391
+ .wm-icon .dot { position: absolute; right: -3px; bottom: -2px; width: 7px; height: 7px; border: 1.5px solid var(--surface); box-sizing: content-box; }
1392
+ .wm-row.on .wm-icon { color: var(--accent); }
1393
+ .wm-name { flex: 1; min-width: 0; display: flex; flex-direction: column; text-align: left; }
1394
+ .wm-name b { font-weight: 500; color: var(--ink); }
1395
+ .wm-name small { font: 11px var(--mono); color: var(--faint); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1396
+ .wm-agents { display: inline-flex; gap: 5px; }
1397
+ .wm-only { padding: 1px 6px; border-radius: 6px; font-size: 11px; color: var(--muted); opacity: 0; transition: opacity 0.12s; }
1398
+ .wm-row:hover .wm-only { opacity: 1; }
1399
+ .wm-only:hover { background: var(--bg-2); color: var(--ink); }
1400
+ .wm-sep { height: 1px; margin: 5px 4px; background: var(--line); }
1401
+ .p-chip .p-where { width: 11px; height: 11px; color: var(--muted); }
1402
+ .projects-modal .where { margin-bottom: 12px; }
1403
+ .projects-modal .where .i { width: 13px; height: 13px; color: var(--muted); }
1404
+ .projects-modal .where button.on .i { color: var(--accent); }
1405
+ .projects-modal .where .dot { width: 6px; height: 6px; }
1406
+ .machines-modal { width: min(640px, 100%); }
1407
+ .mc-list { display: flex; flex-direction: column; gap: 10px; }
1408
+ .mc { padding: 12px 14px; border-radius: 12px; border: 1px solid var(--line); background: var(--surface); }
1409
+ .mc-head { display: flex; align-items: center; gap: 10px; }
1410
+ .mc-icon { position: relative; flex: none; display: grid; place-items: center; width: 32px; height: 32px; border-radius: 9px; background: var(--bg-2); color: var(--muted); }
1411
+ .mc-icon .i { width: 17px; height: 17px; }
1412
+ .mc-dot { position: absolute; right: -2px; bottom: -2px; width: 10px; height: 10px; border-radius: 50%; background: var(--faint); border: 2px solid var(--surface); }
1413
+ .mc.st-online .mc-icon { color: var(--accent); }
1414
+ .mc.st-online .mc-dot { background: var(--good); }
1415
+ .mc.st-error .mc-dot { background: var(--bad); }
1416
+ .mc:is(.st-connecting, .st-reconnecting) .mc-dot { background: var(--warn); animation: blink 1.2s infinite; }
1417
+ .mc-title { flex: 1; min-width: 0; display: flex; flex-direction: column; }
1418
+ .mc-title b { font-size: 14px; font-weight: 600; }
1419
+ .mc-title span { font: 11.5px var(--mono); color: var(--faint); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1420
+ .mc-state { font-size: 12px; color: var(--muted); white-space: nowrap; }
1421
+ .mc.st-online .mc-state { color: var(--good); }
1422
+ .mc.st-error .mc-state { color: var(--bad); }
1423
+ .mc-meta, .mc-steps, .mc-hint, .mc-projects, .mc-edit { margin-left: 42px; }
1424
+ .mc-meta { display: flex; align-items: center; gap: 12px; margin-top: 8px; font-size: 12px; color: var(--muted); }
1425
+ .mc-meta .bad { color: var(--bad); }
1426
+ .mc-agents { display: inline-flex; gap: 7px; }
1427
+ .mc-steps { list-style: none; display: flex; flex-direction: column; gap: 5px; margin-top: 10px; margin-bottom: 0; padding: 0; }
1428
+ .mc-steps li { display: grid; grid-template-columns: 16px auto 1fr; align-items: center; column-gap: 8px; font-size: 12.5px; color: var(--faint); }
1429
+ .mc-steps li b { font-weight: 500; }
1430
+ .mc-steps li small { font: 11.5px var(--mono); color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1431
+ .mc-si { display: grid; place-items: center; width: 16px; height: 16px; border-radius: 50%; border: 1.5px solid var(--line-2); }
1432
+ .mc-si .i { width: 10px; height: 10px; }
1433
+ .mc-steps .s-done { color: var(--ink-2); }
1434
+ .mc-steps .s-done .mc-si { background: var(--good); border-color: var(--good); color: #fff; animation: check-in 0.25s var(--ease); }
1435
+ .mc-steps .s-run { color: var(--ink); }
1436
+ .mc-steps .s-run .mc-si { border-color: var(--accent); border-top-color: transparent; animation: spin 0.8s linear infinite; }
1437
+ .mc-steps .s-fail { color: var(--bad); }
1438
+ .mc-steps .s-fail .mc-si { background: var(--bad); border-color: var(--bad); color: #fff; }
1439
+ .mc-steps .s-fail small { color: var(--bad); white-space: normal; }
1440
+ .mc-steps .s-warn { color: var(--warn); }
1441
+ .mc-steps .s-warn .mc-si { border-color: var(--warn); color: var(--warn); }
1442
+ .mc-steps .s-warn small { white-space: normal; }
1443
+ .mc-hint { margin-top: 10px; padding: 10px 12px; border-radius: 10px; border: 1px solid color-mix(in srgb, var(--bad) 25%, var(--line)); background: var(--del-bg); font-size: 12.5px; color: var(--ink-2); }
1444
+ .mc-hint.soft { border-color: var(--line); background: var(--surface-2); }
1445
+ .mc-hint p { margin: 0 0 6px; }
1446
+ .mc-hint > :last-child { margin-bottom: 0; }
1447
+ .mc-cmd { display: flex; align-items: center; gap: 6px; margin: 4px 0 8px; padding: 3px 3px 3px 10px; border-radius: 8px; background: var(--term-bg); color: var(--term-ink); }
1448
+ .mc-cmd code { flex: 1; font: 12px var(--mono); }
1449
+ .mc-cmd .ghost { color: var(--term-ink); }
1450
+ .mc-cmd .ghost:hover { background: rgba(255, 255, 255, 0.1); color: #fff; }
1451
+ .mc-log summary { cursor: pointer; font-size: 12px; color: var(--muted); width: max-content; }
1452
+ .mc-log pre { max-height: 180px; overflow: auto; margin: 6px 0 0; padding: 8px 10px; border-radius: 8px; background: var(--surface); border: 1px solid var(--line); font: 11px/1.5 var(--mono); white-space: pre-wrap; }
1453
+ .mc-projects { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-top: 10px; }
1454
+ .mc-edit { margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--line); }
1455
+ .mc-add { margin-top: 12px; }
1456
+ .mc-add h4 { margin-top: 18px; }
1457
+ .mc-new { height: 32px; }
1458
+ .mc-form { display: flex; flex-direction: column; gap: 10px; }
1459
+ .mc-row { display: flex; gap: 10px; }
1460
+ .mc-field { display: flex; flex-direction: column; gap: 5px; width: 150px; min-width: 0; }
1461
+ .mc-field.grow { flex: 1; width: auto; }
1462
+ .mc-field span { font-size: 12px; font-weight: 500; color: var(--ink-2); }
1463
+ .mc-adv summary { cursor: pointer; width: max-content; font-size: 12.5px; color: var(--muted); }
1464
+ .mc-adv[open] summary { margin-bottom: 8px; }
1465
+ .mc-check { margin-top: 8px; }
1466
+ .mc-foot { display: flex; align-items: center; gap: 10px; }
1467
+ .mc-foot .hint { flex: 1; margin: 0 !important; font-size: 12px !important; }
1468
+ .mc-foot .primary { flex: none; }
1469
+ .mc-foot .primary .i { width: 14px; height: 14px; }
1470
+ .menu button.danger:hover { color: var(--bad); background: var(--del-bg); }
1471
+
1103
1472
  /* ---------- responsive ---------- */
1104
1473
  @media (max-width: 720px) {
1105
1474
  .topbar { padding: 0 12px; gap: 10px; }
1106
- .search-btn span, .search-btn kbd, .update-btn span { display: none; }
1475
+ .search-btn span, .search-btn kbd, .update-btn span, .auto-btn span { display: none; }
1476
+ .auto-btn { padding: 0 8px; border-color: transparent; background: none; }
1107
1477
  .search-btn { padding: 0 8px; border-color: transparent; background: none; }
1108
1478
  .feed-wrap { padding: 14px 16px 80px; }
1109
- .it-side .q-proj, .it-actions span, .c-done span { display: none; }
1479
+ .launcher.docked { width: calc(100% - 32px); }
1480
+ .it-side .q-proj, .it-actions span, .c-done span, .q-machine span { display: none; }
1481
+ .mc-row { flex-direction: column; }
1482
+ .mc-field { width: auto; }
1483
+ .mc-meta, .mc-steps, .mc-hint, .mc-projects, .mc-edit { margin-left: 0; }
1110
1484
  .turns { padding: 6px 14px 8px; }
1111
1485
  .it-dock { padding: 4px 10px 10px; }
1112
1486
  .b-hero h2 { font-size: 22px; }
@@ -1129,3 +1503,297 @@ body.electron .topbar { -webkit-app-region: drag; }
1129
1503
  body.electron .topbar button, body.electron .topbar a, body.electron .topbar .projects { -webkit-app-region: no-drag; }
1130
1504
  body.electron .overlay, body.electron .overlay *, body.electron .menu, body.electron .menu *, body.electron .toasts, body.electron .toast * { -webkit-app-region: no-drag; }
1131
1505
  body.electron.mac .topbar { padding-left: 88px; }
1506
+
1507
+ /* ---------- worktrees, compare, ship it ---------- */
1508
+ .tog-btn {
1509
+ display: inline-flex; align-items: center; gap: 5px; height: 30px; padding: 0 8px; border-radius: 9px;
1510
+ font-size: 12.5px; color: var(--muted); transition: background 0.15s, color 0.15s;
1511
+ }
1512
+ .tog-btn:hover { background: var(--bg-2); color: var(--ink); }
1513
+ .tog-btn.on { color: var(--accent-ink); }
1514
+ .tog-btn:focus-visible { outline: 0; box-shadow: 0 0 0 2px var(--accent-soft), 0 0 0 1px var(--accent); }
1515
+ .vs-mark { font: 600 11px var(--mono); }
1516
+ .q-vs { font: 600 10.5px var(--mono); color: var(--accent-ink); padding: 1px 5px; border-radius: 5px; background: var(--accent-soft); }
1517
+
1518
+ /* a compare task: one card, the shared prompt on top and a row per run under it */
1519
+ .task-item {
1520
+ background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); overflow: clip;
1521
+ transition: border-color 0.15s, box-shadow 0.15s;
1522
+ }
1523
+ .task-item:hover, .task-item:has(.item.focused) { border-color: var(--line-2); }
1524
+ .task-item:has(.item.open) { border-color: var(--line-2); box-shadow: var(--shadow-2); }
1525
+ .task-item.st-done { background: transparent; }
1526
+ .task-item.arrived { animation: arrive 1.4s var(--ease); }
1527
+ .task-head { display: grid; grid-template-columns: 10px 1fr auto; gap: 12px; align-items: center; padding: 11px 12px 9px 14px; }
1528
+ .task-head .it-title { color: var(--ink); font-weight: 600; }
1529
+ .task-item.st-done .task-head .it-title { color: var(--muted); font-weight: 500; }
1530
+ .task-item.st-done .q-dot { opacity: 0.35; }
1531
+ .task-head .it-sub { display: flex; align-items: center; gap: 7px; }
1532
+ .task-item.st-waiting .task-head .it-sub { color: var(--warn); }
1533
+ .task-head .ghost .vs-mark { margin-right: 5px; color: var(--accent-ink); }
1534
+ .task-item:hover .it-quick, .task-head .it-quick:focus-visible { opacity: 1; }
1535
+ .task-runs { display: flex; flex-direction: column; }
1536
+ .item.run { border: 0; border-top: 1px solid var(--line); border-radius: 0; background: transparent; box-shadow: none; }
1537
+ .item.run.focused { box-shadow: inset 2px 0 0 var(--line-2); background: var(--surface-2); }
1538
+ .item.run.open { box-shadow: inset 2px 0 0 var(--accent); }
1539
+ .item.run .it-head { grid-template-columns: 18px 1fr auto; padding: 8px 12px 8px 26px; border-radius: 0; }
1540
+ .item.run.open .it-head { border-radius: 0; }
1541
+ .item.run .it-title { font-size: 13px; font-weight: 400; color: var(--ink-2); white-space: nowrap; }
1542
+ .item.run .it-title b { font-weight: 600; color: var(--ink); }
1543
+ .run-model { margin-left: 8px; color: var(--muted); }
1544
+ .item.run .it-sub, .item.run .q-live { font-size: 12px; }
1545
+ .run-logo { display: grid; place-items: center; width: 18px; height: 18px; border-radius: 5px; background: var(--bg-2); color: var(--ink); }
1546
+ .run-logo > * { display: block; width: 11px; height: 11px; }
1547
+ .run-logo .mono { background: currentColor; -webkit-mask: var(--logo) center / contain no-repeat; mask: var(--logo) center / contain no-repeat; }
1548
+ .pill.st-running { --tone: var(--accent); }
1549
+ .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; }
1550
+ .it-meta .m.branch { font: 11px var(--mono); color: var(--ink-2); }
1551
+ .it-meta .m .i { width: 12px; height: 12px; flex: none; color: var(--faint); }
1552
+ .it-meta .m.m-plan, .it-meta .m.m-plan .i { color: var(--accent-ink); }
1553
+ .it-meta .m.m-auto, .it-meta .m.m-auto .i { color: var(--warn); }
1554
+
1555
+ .pill.pr { gap: 5px; font-variant-numeric: tabular-nums; }
1556
+ .pill.pr-pass, .pr-strip.pr-pass { --tone: var(--good); }
1557
+ .pill.pr-pending, .pr-strip.pr-pending { --tone: var(--warn); }
1558
+ .pill.pr-fail, .pr-strip.pr-fail { --tone: var(--bad); }
1559
+ .pill.pr-merged, .pr-strip.pr-merged { --tone: #8250df; }
1560
+ .pill.pr-closed, .pr-strip.pr-closed { --tone: var(--faint); }
1561
+ .pr-strip {
1562
+ display: flex; align-items: center; gap: 8px; margin: 0 14px 4px; padding: 5px 6px 5px 10px; border-radius: 9px;
1563
+ font-size: 12.5px; background: color-mix(in srgb, var(--tone) 7%, transparent); border: 1px solid color-mix(in srgb, var(--tone) 18%, transparent);
1564
+ }
1565
+ .pr-strip[hidden] { display: none; }
1566
+ .pr-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--tone); flex: none; }
1567
+ .pr-strip.pr-pending .pr-dot { animation: pulse 1.4s ease-in-out infinite; }
1568
+ .pr-num { font-weight: 600; color: var(--ink); }
1569
+ .pr-line { color: var(--ink-2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
1570
+ .pr-strip .ghost .i { width: 13px; height: 13px; }
1571
+ .pr-strip .pr-merge { color: var(--good); font-weight: 500; }
1572
+ @keyframes pulse { 50% { opacity: 0.35; } }
1573
+
1574
+ .ship-modal, .run-modal { width: min(620px, 100%); }
1575
+ .ship-route { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; margin: -4px 0 12px; font-size: 12.5px; }
1576
+ .ship-route code { font: 12px var(--mono); padding: 1px 6px; border-radius: 6px; background: var(--bg-2); }
1577
+ .ship-route .i { width: 13px; height: 13px; color: var(--faint); }
1578
+ .ship-route .muted { margin-left: auto; }
1579
+ .ship-field { display: flex; flex-direction: column; gap: 6px; margin: 12px 0 0; }
1580
+ .ship-field > span { font-size: 12.5px; font-weight: 500; color: var(--ink-2); }
1581
+ .ship-field select { width: 100%; }
1582
+ .ship-check { display: flex; margin-top: 10px; }
1583
+ .ship-foot { display: flex; align-items: center; gap: 12px; margin-top: 16px; }
1584
+ .ship-foot > .muted { margin-right: auto; }
1585
+ .ship-foot code { font-size: 11px; }
1586
+ .hint.bad { color: var(--bad); }
1587
+
1588
+ .compare-modal { width: min(1280px, 100%); max-height: 92vh; display: flex; flex-direction: column; }
1589
+ .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; }
1590
+ .cmp-grid { flex: 1; min-height: 0; display: grid; grid-template-columns: repeat(var(--n), minmax(280px, 1fr)); gap: 12px; overflow-x: auto; }
1591
+ .cmp-col { display: flex; flex-direction: column; min-height: 0; border: 1px solid var(--line); border-radius: 12px; background: var(--surface-2); }
1592
+ .cmp-head { display: flex; align-items: center; gap: 8px; padding: 10px 12px; border-bottom: 1px solid var(--line); }
1593
+ .cmp-who { display: flex; flex-direction: column; margin-right: auto; min-width: 0; }
1594
+ .cmp-who small { font-size: 11.5px; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1595
+ .cmp-stats { display: grid; grid-template-columns: repeat(5, 1fr); gap: 4px; margin: 0; padding: 8px 12px; border-bottom: 1px solid var(--line); }
1596
+ .cmp-stats div { display: flex; flex-direction: column; gap: 2px; }
1597
+ .cmp-stats dt { font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.04em; color: var(--faint); }
1598
+ .cmp-stats dd { margin: 0; font-size: 13px; font-weight: 500; font-variant-numeric: tabular-nums; white-space: nowrap; }
1599
+ .cmp-body { flex: 1; min-height: 160px; max-height: 58vh; overflow: auto; padding: 12px; background: var(--surface); }
1600
+ .cmp-foot { display: flex; align-items: center; gap: 8px; padding: 8px 10px; border-top: 1px solid var(--line); }
1601
+
1602
+ /* ---------- automations, usage, phone ---------- */
1603
+ .auto-modal, .usage-modal, .phone-modal { width: min(720px, 100%); position: relative; }
1604
+ .usage-modal { padding-bottom: 24px; }
1605
+ .mem-lede code { font-size: 11.5px; padding: 1px 5px; border-radius: 5px; background: var(--bg-2); }
1606
+ .auto-body { padding-top: 10px; }
1607
+ .au-list { display: flex; flex-direction: column; gap: 2px; }
1608
+ .au-item { display: flex; align-items: flex-start; gap: 10px; padding: 10px 8px; border-radius: 10px; }
1609
+ .au-item:hover { background: var(--surface-2); }
1610
+ .au-item.off .au-main { opacity: 0.55; }
1611
+ .au-main { flex: 1; min-width: 0; }
1612
+ .au-main b { font-size: 13.5px; }
1613
+ .au-main p { margin: 2px 0 0; font-size: 12.5px; color: var(--muted); }
1614
+ .au-main code { font-size: 11.5px; padding: 0 4px; border-radius: 4px; background: var(--bg-2); }
1615
+ .au-tags { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 6px; }
1616
+ .au-tags i { font-style: normal; font-size: 11px; padding: 1px 6px; border-radius: 5px; background: var(--bg-2); color: var(--ink-2); }
1617
+ .au-tags a { color: var(--accent-ink); }
1618
+ .au-err { display: flex; align-items: center; gap: 5px; color: var(--bad) !important; }
1619
+ .au-err .i { width: 12px; height: 12px; }
1620
+ .au-acts { display: flex; align-items: center; gap: 4px; flex: none; }
1621
+ .au-form { display: flex; flex-direction: column; gap: 0; }
1622
+ .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); }
1623
+ .au-form label > span, .au-row > span { width: 92px; flex: none; font-size: 12.5px; font-weight: 500; color: var(--ink-2); }
1624
+ .au-form label.stack { flex-direction: column; align-items: stretch; gap: 6px; }
1625
+ .au-form label.stack > span { width: auto; }
1626
+ .au-form :is(.input, .textarea, select) { flex: 1; }
1627
+ .au-form [hidden] { display: none !important; }
1628
+ .au-params { margin: 6px 0 2px; }
1629
+ .au-params code, .k-vars code { font-size: 11px; }
1630
+ .au-runner { display: flex; align-items: center; gap: 10px; }
1631
+ .au-presets { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin: 6px 0 4px 106px; }
1632
+ .au-kinds { display: grid; grid-template-columns: repeat(3, 1fr); gap: 6px; margin-bottom: 6px; }
1633
+ .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); }
1634
+ .au-kinds button .i { grid-row: span 2; margin-top: 2px; color: var(--muted); }
1635
+ .au-kinds button b { font-size: 13px; }
1636
+ .au-kinds button small { font-size: 11px; color: var(--muted); }
1637
+ .au-kinds button.on { border-color: var(--accent); background: var(--accent-soft); }
1638
+ .au-kinds button.on .i { color: var(--accent); }
1639
+ .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); }
1640
+ .au-warn .i { flex: none; margin-top: 1px; }
1641
+ .au-foot { display: flex; justify-content: flex-end; gap: 8px; margin-top: 14px; }
1642
+
1643
+ .usage-modal header { gap: 12px; }
1644
+ .usage-modal header h2 { margin-right: auto; }
1645
+ .us-tiles { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; }
1646
+ .us-tiles div { display: flex; flex-direction: column; padding: 10px 12px; border-radius: 11px; border: 1px solid var(--line); background: var(--surface-2); }
1647
+ .us-tiles span { font-size: 11.5px; color: var(--muted); }
1648
+ .us-tiles b { font: 600 22px/1.3 var(--display); font-variant-numeric: tabular-nums; letter-spacing: -0.01em; }
1649
+ .us-tiles small { font-size: 11px; color: var(--faint); }
1650
+ .us-chart { display: flex; align-items: flex-end; gap: 2px; height: 120px; padding-bottom: 1px; border-bottom: 1px solid var(--line-2); }
1651
+ .us-bar { flex: 1; height: 100%; display: flex; align-items: flex-end; cursor: default; }
1652
+ .us-bar i { display: block; width: 100%; border-radius: 4px 4px 0 0; background: var(--accent); opacity: 0.85; }
1653
+ .us-bar:hover i { opacity: 1; }
1654
+ .us-axis { display: flex; justify-content: space-between; margin-top: 4px; font-size: 11px; color: var(--faint); }
1655
+ .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; }
1656
+ .us-table { width: 100%; border-collapse: collapse; font-size: 12.5px; font-variant-numeric: tabular-nums; }
1657
+ .us-table th { text-align: right; font-weight: 500; font-size: 11px; color: var(--faint); padding: 4px 6px; border-bottom: 1px solid var(--line); }
1658
+ .us-table td { text-align: right; padding: 6px; border-bottom: 1px solid var(--line); color: var(--ink-2); }
1659
+ .us-table :is(th, td):first-child { text-align: left; color: var(--ink); }
1660
+ .us-proj, .us-runner { display: inline-flex; align-items: center; gap: 6px; }
1661
+
1662
+ .phone-modal .ph-sec h4 { display: flex; align-items: center; gap: 8px; }
1663
+ .phone-modal .ph-sec h4 .switch { margin-left: auto; }
1664
+ .phone-modal .settings-modal { width: auto; padding: 0; border: 0; box-shadow: none; background: none; }
1665
+ .settings-modal label.check { padding: 0; border: 0; gap: 6px; }
1666
+ .ph-ok, .ph-bad { display: inline-flex; align-items: center; gap: 4px; font-size: 11.5px; font-weight: 500; }
1667
+ .ph-ok { color: var(--good); }
1668
+ .ph-bad { color: var(--bad); max-width: 260px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1669
+ .ph-ok .i, .ph-bad .i { width: 12px; height: 12px; }
1670
+
1671
+ /* ---------- subagents ---------- */
1672
+ /* logo stack: the lead in front, its subagents tucked behind; they fan out on hover */
1673
+ .team-stack { position: relative; display: inline-flex; align-items: center; flex: none; height: 20px; padding-right: 1px; outline: none; cursor: default; }
1674
+ .team-stack .ts-l, .team-stack .ts-m, .tb-stack .ts-m {
1675
+ position: relative; display: grid; place-items: center; flex: none; width: 20px; height: 20px; border-radius: 50%;
1676
+ background: var(--bg-2); color: var(--ink); box-shadow: 0 0 0 1.5px var(--surface);
1677
+ transition: margin 0.22s var(--ease), transform 0.22s var(--ease), opacity 0.15s, filter 0.15s;
1678
+ }
1679
+ .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); }
1680
+ .team-stack .ts-m { margin-left: -4px; z-index: calc(5 - var(--i)); }
1681
+ .team-stack :is(.ts-l, .ts-m) > *, .tb-stack .ts-m > * { display: block; width: 11px; height: 11px; }
1682
+ .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; }
1683
+ .team-stack .ts-more { font: 600 9.5px var(--mono); color: var(--muted); }
1684
+ .team-stack .ts-m.idle { opacity: 0.45; filter: grayscale(1); }
1685
+ .team-stack:is(:hover, :focus-visible) .ts-m { margin-left: 3px; transform: translateY(calc(-1px * (var(--i) - 1.5))); }
1686
+ .team-stack:is(:hover, :focus-visible) .ts-m.idle { opacity: 0.8; filter: none; }
1687
+ .team-stack .ts-m.busy { background: var(--accent-soft); animation: ts-pulse 1.4s var(--ease) infinite; }
1688
+ @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); } }
1689
+ @keyframes ts-spin { to { transform: rotate(360deg); } }
1690
+ .team-stack::after {
1691
+ content: attr(data-tip); position: absolute; right: -6px; top: calc(100% + 6px); transform: translateY(-2px);
1692
+ padding: 3px 7px; border-radius: 6px; background: var(--ink); color: var(--bg); font-size: 11px; white-space: nowrap;
1693
+ opacity: 0; pointer-events: none; transition: opacity 0.12s, transform 0.12s; z-index: 7;
1694
+ }
1695
+ .team-stack:is(:hover, :focus-visible)::after { opacity: 1; transform: none; }
1696
+ .subs-head .team-stack::after { right: auto; left: 0; }
1697
+ .it-side .team-stack { margin-right: 2px; }
1698
+
1699
+ /* launcher button + its member stack */
1700
+ .tb-stack { display: inline-flex; align-items: center; flex: none; }
1701
+ .tb-stack .ts-m { width: 18px; height: 18px; z-index: calc(6 - var(--i)); }
1702
+ .tb-stack .ts-more { font: 600 9px var(--mono); color: var(--muted); }
1703
+ .tb-stack .ts-m + .ts-m { margin-left: -4px; }
1704
+ .team-btn.on { color: var(--accent-ink); background: var(--accent-soft); }
1705
+ .team-btn.on:hover { background: color-mix(in srgb, var(--accent) 14%, transparent); }
1706
+ .team-btn.off { color: var(--faint); }
1707
+ .team-btn.off .tb-stack { opacity: 0.5; filter: grayscale(1); }
1708
+ .team-btn .tb-label { max-width: 120px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1709
+ .team-btn.open { background: var(--bg-2); color: var(--ink); }
1710
+ /* narrow bar: the member logos carry the button, so the harness name keeps its room */
1711
+ @container launcher (max-width: 640px) { .team-btn .tb-label { display: none; } }
1712
+
1713
+ /* editor popover */
1714
+ .team-pop {
1715
+ position: fixed; z-index: 40; display: flex; flex-direction: column; max-height: min(520px, 76vh); overflow: hidden;
1716
+ border-radius: 14px; background: var(--surface); border: 1px solid var(--line); box-shadow: var(--shadow-2); animation: pop 0.2s var(--ease);
1717
+ }
1718
+ .tp-head { display: flex; align-items: flex-start; gap: 12px; padding: 14px 14px 10px; }
1719
+ .tp-title { flex: 1; display: grid; gap: 2px; }
1720
+ .tp-title b { font-weight: 600; font-size: 14px; }
1721
+ .tp-title small { font-size: 12.5px; color: var(--muted); line-height: 1.35; }
1722
+ .tp-presets { flex: none; gap: 5px; }
1723
+ .tp-presets .chev { width: 11px; height: 11px; transform: rotate(90deg); color: var(--faint); }
1724
+ .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)); }
1725
+ .tp-warn[hidden] { display: none; }
1726
+ .tp-warn .i { flex: none; width: 14px; height: 14px; margin-top: 1px; }
1727
+ .tp-list { flex: 1; overflow-y: auto; display: flex; flex-direction: column; gap: 8px; padding: 0 14px 12px; }
1728
+ .tp-row { --field-bg: var(--surface); 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; }
1729
+ .tp-top { display: flex; align-items: center; gap: 6px; min-width: 0; }
1730
+ .tp-runner { flex: 0 1 auto; min-width: 0; overflow: hidden; }
1731
+ .tp-runner .rb-m { max-width: 140px; }
1732
+ .tp-name { flex: 1 1 90px; min-width: 70px; width: auto; gap: 0; color: var(--faint); }
1733
+ .tp-copies { flex: none; display: inline-flex; align-items: center; height: 30px; padding: 0 2px; border-radius: 9px; border: 1px solid var(--line-2); background: var(--surface); }
1734
+ .tp-copies b { min-width: 22px; text-align: center; font: 500 12px var(--mono); color: var(--muted); font-variant-numeric: tabular-nums; }
1735
+ .tp-copies.on { border-color: color-mix(in srgb, var(--accent) 35%, var(--line)); }
1736
+ .tp-copies.on b { color: var(--accent-ink); }
1737
+ .tp-copies button { display: grid; place-items: center; width: 22px; height: 24px; border-radius: 7px; color: var(--muted); }
1738
+ .tp-copies button:hover:not(:disabled) { background: var(--bg-2); color: var(--ink); }
1739
+ .tp-copies button:disabled { opacity: 0.35; }
1740
+ .tp-copies button:focus-visible { outline: 0; box-shadow: inset 0 0 0 1px var(--accent); }
1741
+ .tp-copies .i { width: 11px; height: 11px; }
1742
+ .tp-del { flex: none; width: 28px; height: 28px; }
1743
+ .tp-del .i { width: 13px; height: 13px; }
1744
+ .tp-use > span { flex: none; font-size: 11px; font-weight: 600; letter-spacing: 0.04em; text-transform: uppercase; color: var(--faint); }
1745
+ .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; }
1746
+ .tp-empty .i { flex: none; width: 22px; height: 22px; color: var(--faint); }
1747
+ .tp-empty p { margin: 0; line-height: 1.4; }
1748
+ .tp-foot { display: flex; align-items: center; gap: 8px; padding: 10px 14px; border-top: 1px solid var(--line); background: var(--surface-2); }
1749
+ .tp-count { font-size: 12px; color: var(--faint); font-variant-numeric: tabular-nums; }
1750
+ .tp-saveform { display: flex; align-items: center; gap: 8px; flex: 1; }
1751
+ .tp-saveform .input { flex: 1; }
1752
+ .menu.tp-menu { width: 300px; }
1753
+ .menu.tp-menu button { align-items: center; text-align: left; }
1754
+ .menu.tp-menu button.on b { color: var(--accent-ink); }
1755
+ .tp-mdel { display: grid; place-items: center; flex: none; width: 24px; height: 24px; border-radius: 6px; color: var(--faint); opacity: 0; }
1756
+ .menu.tp-menu button:hover .tp-mdel { opacity: 1; }
1757
+ .tp-mdel:hover { color: var(--bad); background: var(--del-bg); }
1758
+ .tp-mdel .i { width: 13px; height: 13px; }
1759
+ .tp-mempty { padding: 12px; font-size: 13px; color: var(--muted); }
1760
+
1761
+ /* session meta */
1762
+ .it-meta .m.team-m { font: 11px var(--mono); color: var(--accent-ink); }
1763
+
1764
+ /* live: one line per subagent while the lead waits */
1765
+ .team-live { display: grid; gap: 4px; margin: 0 0 10px; padding: 8px; border-radius: 10px; background: var(--surface-2); border: 1px solid var(--line); }
1766
+ .tl-row { display: flex; align-items: center; gap: 9px; min-width: 0; padding: 3px 4px; font-size: 13px; }
1767
+ .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; }
1768
+ .tl-logo > * { width: 12px; height: 12px; display: block; }
1769
+ .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; }
1770
+ .tl-name { flex: none; font: 500 12.5px var(--mono); color: var(--ink); }
1771
+ .tl-live { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--muted); }
1772
+ .tl-row.live .tl-live { color: var(--ink-2); }
1773
+ .tl-row .elapsed { flex: none; font-size: 12px; color: var(--faint); font-variant-numeric: tabular-nums; }
1774
+
1775
+ /* after: the team's reports */
1776
+ .subs { margin: 14px 0 4px; }
1777
+ .subs-head { display: flex; align-items: center; gap: 10px; margin-bottom: 8px; font-size: 13px; }
1778
+ .subs-head b { font-weight: 600; }
1779
+ .subs-to { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font: 12px var(--mono); color: var(--muted); }
1780
+ .subs-list { display: grid; gap: 6px; }
1781
+ .sub { border-radius: var(--radius); border: 1px solid var(--line); background: var(--surface); overflow: hidden; transition: border-color 0.15s; }
1782
+ .sub:hover, .sub.open { border-color: var(--line-2); }
1783
+ .sub-head { display: flex; align-items: center; gap: 11px; width: 100%; padding: 9px 12px; text-align: left; }
1784
+ .sub-logo { display: grid; place-items: center; flex: none; width: 28px; height: 28px; border-radius: 8px; background: var(--bg-2); color: var(--ink); }
1785
+ .sub-logo > * { width: 15px; height: 15px; display: block; }
1786
+ .sub-main { flex: 1; min-width: 0; display: grid; gap: 1px; }
1787
+ .sub-top { display: flex; align-items: baseline; gap: 8px; min-width: 0; }
1788
+ .sub-top b { flex: none; font: 600 12.5px var(--mono); color: var(--ink); }
1789
+ .sub-model { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 12px; color: var(--faint); }
1790
+ .sub-title { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 13.5px; color: var(--ink-2); }
1791
+ .sub-side { display: flex; align-items: center; gap: 10px; flex: none; font-size: 12px; color: var(--muted); font-variant-numeric: tabular-nums; }
1792
+ .sub-side .chev { width: 12px; height: 12px; color: var(--faint); transform: rotate(90deg); transition: transform 0.2s var(--ease); }
1793
+ .sub.open .sub-side .chev { transform: rotate(-90deg); }
1794
+ .sub-body { padding: 4px 14px 14px; border-top: 1px solid var(--line); background: var(--surface-2); }
1795
+ .sub-task { margin: 10px 0 12px; }
1796
+ .sub-task span { font-size: 11px; font-weight: 600; letter-spacing: 0.04em; text-transform: uppercase; color: var(--faint); }
1797
+ .sub-task p { margin: 3px 0 0; font-size: 13px; color: var(--ink-2); white-space: pre-wrap; }
1798
+ .sub-wait { margin: 0; font-size: 13px; }
1799
+ @container (max-width: 520px) { .sub-files, .sub-dur, .sub-model { display: none; } }