taskplane 0.28.4 → 0.28.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +215 -215
  3. package/bin/gitignore-patterns.mjs +79 -79
  4. package/bin/rpc-wrapper.mjs +1086 -1086
  5. package/bin/taskplane.mjs +3254 -3254
  6. package/dashboard/public/app.js +2573 -2573
  7. package/dashboard/public/index.html +139 -139
  8. package/dashboard/public/style.css +1882 -1882
  9. package/dashboard/public/taskplane-word-color.svg +18 -18
  10. package/dashboard/public/taskplane-word-white.svg +18 -18
  11. package/dashboard/server.cjs +1666 -1666
  12. package/extensions/reviewer-extension.ts +119 -119
  13. package/extensions/task-orchestrator.ts +28 -28
  14. package/extensions/taskplane/abort.ts +502 -502
  15. package/extensions/taskplane/agent-bridge-extension.ts +838 -765
  16. package/extensions/taskplane/agent-host.ts +833 -745
  17. package/extensions/taskplane/cleanup.ts +747 -747
  18. package/extensions/taskplane/config-loader.ts +1328 -1322
  19. package/extensions/taskplane/config-schema.ts +692 -682
  20. package/extensions/taskplane/config.ts +73 -73
  21. package/extensions/taskplane/context-window.ts +66 -66
  22. package/extensions/taskplane/diagnostic-reports.ts +463 -463
  23. package/extensions/taskplane/diagnostics.ts +385 -385
  24. package/extensions/taskplane/engine-worker-entry.mjs +34 -34
  25. package/extensions/taskplane/engine-worker.ts +381 -381
  26. package/extensions/taskplane/engine.ts +4539 -4527
  27. package/extensions/taskplane/execution.ts +2733 -2708
  28. package/extensions/taskplane/extension.ts +30 -9
  29. package/extensions/taskplane/formatting.ts +773 -773
  30. package/extensions/taskplane/git.ts +90 -90
  31. package/extensions/taskplane/index.ts +28 -28
  32. package/extensions/taskplane/lane-runner.ts +1383 -1360
  33. package/extensions/taskplane/mailbox.ts +689 -689
  34. package/extensions/taskplane/merge.ts +3135 -3135
  35. package/extensions/taskplane/messages.ts +985 -985
  36. package/extensions/taskplane/migrations.ts +278 -278
  37. package/extensions/taskplane/naming.ts +117 -117
  38. package/extensions/taskplane/path-resolver.ts +237 -237
  39. package/extensions/taskplane/persistence.ts +2087 -2087
  40. package/extensions/taskplane/process-registry.ts +416 -416
  41. package/extensions/taskplane/quality-gate.ts +1033 -1033
  42. package/extensions/taskplane/resume.ts +2879 -2878
  43. package/extensions/taskplane/sessions.ts +57 -57
  44. package/extensions/taskplane/settings-loader.ts +136 -136
  45. package/extensions/taskplane/settings-tui.ts +1867 -1867
  46. package/extensions/taskplane/sidecar-telemetry.ts +252 -252
  47. package/extensions/taskplane/supervisor-primer.md +1694 -1694
  48. package/extensions/taskplane/supervisor.ts +4341 -4341
  49. package/extensions/taskplane/task-executor-core.ts +550 -550
  50. package/extensions/taskplane/tmux-compat.ts +37 -37
  51. package/extensions/taskplane/types.ts +4297 -4278
  52. package/extensions/taskplane/verification.ts +542 -542
  53. package/extensions/taskplane/waves.ts +1548 -1548
  54. package/extensions/taskplane/workspace.ts +705 -705
  55. package/extensions/taskplane/worktree.ts +2604 -2505
  56. package/package.json +57 -57
  57. package/skills/create-taskplane-task/SKILL.md +465 -465
  58. package/skills/create-taskplane-task/references/prompt-template.md +285 -285
  59. package/templates/agents/local/supervisor.md +33 -33
  60. package/templates/agents/local/task-merger.md +27 -27
  61. package/templates/agents/local/task-reviewer.md +30 -30
  62. package/templates/agents/local/task-worker.md +34 -34
  63. package/templates/agents/supervisor-routing.md +92 -92
  64. package/templates/agents/supervisor.md +168 -168
  65. package/templates/agents/task-merger.md +214 -214
  66. package/templates/agents/task-reviewer.md +192 -192
  67. package/templates/agents/task-worker.md +505 -429
  68. package/templates/tasks/EXAMPLE-001-hello-world/PROMPT.md +98 -98
  69. package/templates/tasks/EXAMPLE-001-hello-world/STATUS.md +73 -73
  70. package/templates/tasks/EXAMPLE-002-parallel-smoke/PROMPT.md +97 -97
  71. package/templates/tasks/EXAMPLE-002-parallel-smoke/STATUS.md +73 -73
@@ -1,1882 +1,1882 @@
1
- /* ─── Reset & Base ─────────────────────────────────────────────────────── */
2
-
3
- *,
4
- *::before,
5
- *::after {
6
- box-sizing: border-box;
7
- margin: 0;
8
- padding: 0;
9
- }
10
-
11
- :root {
12
- --font-mono: "JetBrains Mono", "Fira Code", "Cascadia Code", "SF Mono", Consolas, monospace;
13
- --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;
14
- --radius: 8px;
15
- --radius-sm: 4px;
16
- }
17
-
18
- /* ─── Dark Theme (default) ─────────────────────────────────────────────── */
19
-
20
- :root,
21
- [data-theme="dark"] {
22
- --bg: #0d1117;
23
- --bg-surface: #161b22;
24
- --bg-surface-hover: #1c2129;
25
- --bg-inset: #0d1117;
26
- --border: #30363d;
27
- --border-subtle: #21262d;
28
- --text: #e6edf3;
29
- --text-muted: #8b949e;
30
- --text-faint: #484f58;
31
- --accent: #58a6ff;
32
- --accent-dim: #1f6feb;
33
- --green: #3fb950;
34
- --green-dim: #238636;
35
- --red: #f85149;
36
- --red-dim: #da3633;
37
- --yellow: #d29922;
38
- --yellow-dim: #9e6a03;
39
- --cyan: #39d2c0;
40
- --magenta: #bc8cff;
41
- --phase-on-color: #fff;
42
- --phase-merging-bg: #1a3a5c;
43
- --wave-seg-border: rgba(0,0,0,0.3);
44
- --wave-label-color: rgba(255,255,255,0.85);
45
- --wave-label-shadow: 0 1px 2px rgba(0,0,0,0.6);
46
- --wave-future-bg: rgba(139,148,158,0.25);
47
- --wave-future-label: rgba(255,255,255,0.55);
48
- --badge-succeeded-bg: rgba(63,185,80,0.15);
49
- --badge-running-bg: rgba(88,166,255,0.15);
50
- --badge-failed-bg: rgba(248,81,73,0.15);
51
- --badge-stalled-bg: rgba(210,153,34,0.15);
52
- --badge-pending-bg: rgba(139,148,158,0.1);
53
- --badge-skipped-bg: rgba(139,148,158,0.1);
54
- --accent-tint-bg: rgba(88,166,255,0.08);
55
- --accent-tint-hover: rgba(88,166,255,0.18);
56
- --accent-tint-active: rgba(88,166,255,0.25);
57
- --accent-tint-subtle: rgba(88,166,255,0.06);
58
- --green-tint-bg: rgba(63,185,80,0.06);
59
- --green-tint-active: rgba(63,185,80,0.12);
60
- --yellow-tint-active: rgba(210,153,34,0.25);
61
- --magenta-tint-bg: rgba(188,140,255,0.12);
62
- --magenta-tint: rgba(188,140,255,0.15);
63
- --border-table-subtle: rgba(48,54,61,0.3);
64
- --scrollbar-thumb: var(--border);
65
- --scrollbar-thumb-hover: var(--text-faint);
66
- color-scheme: dark;
67
- }
68
-
69
- /* ─── Light Theme ──────────────────────────────────────────────────────── */
70
-
71
- [data-theme="light"] {
72
- --bg: #ffffff;
73
- --bg-surface: #f6f8fa;
74
- --bg-surface-hover: #eaeef2;
75
- --bg-inset: #f0f2f5;
76
- --border: #d0d7de;
77
- --border-subtle: #e1e4e8;
78
- --text: #1f2328;
79
- --text-muted: #656d76;
80
- --text-faint: #8c959f;
81
- --accent: #0969da;
82
- --accent-dim: #0550ae;
83
- --green: #1a7f37;
84
- --green-dim: #116329;
85
- --red: #cf222e;
86
- --red-dim: #a40e26;
87
- --yellow: #9a6700;
88
- --yellow-dim: #7d4e00;
89
- --cyan: #1b7c83;
90
- --magenta: #8250df;
91
- --phase-on-color: #fff;
92
- --phase-merging-bg: #ddf4ff;
93
- --wave-seg-border: rgba(0,0,0,0.08);
94
- --wave-label-color: rgba(0,0,0,0.7);
95
- --wave-label-shadow: none;
96
- --wave-future-bg: rgba(139,148,158,0.15);
97
- --wave-future-label: rgba(0,0,0,0.4);
98
- --badge-succeeded-bg: rgba(26,127,55,0.1);
99
- --badge-running-bg: rgba(9,105,218,0.1);
100
- --badge-failed-bg: rgba(207,34,46,0.1);
101
- --badge-stalled-bg: rgba(154,103,0,0.1);
102
- --badge-pending-bg: rgba(140,149,159,0.08);
103
- --badge-skipped-bg: rgba(140,149,159,0.08);
104
- --accent-tint-bg: rgba(9,105,218,0.06);
105
- --accent-tint-hover: rgba(9,105,218,0.12);
106
- --accent-tint-active: rgba(9,105,218,0.18);
107
- --accent-tint-subtle: rgba(9,105,218,0.04);
108
- --green-tint-bg: rgba(26,127,55,0.06);
109
- --green-tint-active: rgba(26,127,55,0.1);
110
- --yellow-tint-active: rgba(154,103,0,0.15);
111
- --magenta-tint-bg: rgba(130,80,223,0.08);
112
- --magenta-tint: rgba(130,80,223,0.1);
113
- --border-table-subtle: rgba(208,215,222,0.5);
114
- --scrollbar-thumb: #c1c8cf;
115
- --scrollbar-thumb-hover: #8c959f;
116
- color-scheme: light;
117
- }
118
-
119
- html { font-size: 14px; }
120
-
121
- body {
122
- font-family: var(--font-sans);
123
- background: var(--bg);
124
- color: var(--text);
125
- min-height: 100vh;
126
- overflow-x: hidden;
127
- transition: background-color 0.3s ease, color 0.3s ease;
128
- }
129
-
130
- /* Smooth theme transition for key elements */
131
- .panel,
132
- .summary-bar,
133
- .header-badge,
134
- .status-badge,
135
- .count-chip,
136
- .wave-chip,
137
- .session-view-btn,
138
- .session-cmd,
139
- .repo-filter-select,
140
- .history-select,
141
- .task-row,
142
- .lane-header,
143
- .conv-tool-call,
144
- .conv-tool-result,
145
- .copy-toast,
146
- .auto-scroll-label input[type="checkbox"],
147
- .terminal-close,
148
- .stat-card {
149
- transition: background-color 0.3s ease, color 0.3s ease, border-color 0.3s ease;
150
- }
151
-
152
- /* ─── Layout Shell ─────────────────────────────────────────────────────── */
153
-
154
- .dashboard {
155
- display: grid;
156
- grid-template-rows: auto auto 1fr auto;
157
- min-height: 100vh;
158
- padding: 16px 20px;
159
- gap: 12px;
160
- max-width: 1600px;
161
- margin: 0 auto;
162
- }
163
-
164
- /* ─── Header ───────────────────────────────────────────────────────────── */
165
-
166
- .header {
167
- display: flex;
168
- align-items: center;
169
- gap: 16px;
170
- flex-wrap: wrap;
171
- }
172
-
173
- .header-title {
174
- font-size: 1.35rem;
175
- font-weight: 700;
176
- letter-spacing: -0.02em;
177
- white-space: nowrap;
178
- }
179
-
180
- .header-logo {
181
- height: 1.6rem;
182
- width: auto;
183
- vertical-align: middle;
184
- opacity: 0.95;
185
- }
186
-
187
- .header-badge {
188
- display: inline-flex;
189
- align-items: center;
190
- gap: 6px;
191
- font-family: var(--font-mono);
192
- font-size: 0.8rem;
193
- padding: 3px 10px;
194
- border-radius: 12px;
195
- font-weight: 500;
196
- }
197
-
198
- .badge-batch {
199
- background: var(--bg-surface);
200
- border: 1px solid var(--border);
201
- color: var(--accent);
202
- }
203
-
204
- .badge-phase {
205
- font-weight: 600;
206
- text-transform: uppercase;
207
- letter-spacing: 0.05em;
208
- font-size: 0.7rem;
209
- }
210
-
211
- .phase-executing { background: var(--accent-dim); color: var(--phase-on-color); }
212
- .phase-merging { background: var(--phase-merging-bg); color: var(--accent); }
213
- .phase-completed { background: var(--green-dim); color: var(--phase-on-color); }
214
- .phase-paused { background: var(--yellow-dim); color: var(--phase-on-color); }
215
- .phase-stopped,
216
- .phase-aborted { background: var(--red-dim); color: var(--phase-on-color); }
217
- .phase-failed { background: var(--red-dim); color: var(--phase-on-color); }
218
-
219
- .header-meta {
220
- margin-left: auto;
221
- display: flex;
222
- align-items: center;
223
- gap: 12px;
224
- color: var(--text-muted);
225
- font-size: 0.8rem;
226
- }
227
-
228
- .connection-dot {
229
- width: 8px;
230
- height: 8px;
231
- border-radius: 50%;
232
- display: inline-block;
233
- }
234
-
235
- .connection-dot.connected { background: var(--green); }
236
- .connection-dot.disconnected { background: var(--red); }
237
-
238
- /* ─── Theme Toggle ─────────────────────────────────────────────────────── */
239
-
240
- .theme-toggle {
241
- background: none;
242
- border: 1px solid var(--border);
243
- border-radius: var(--radius-sm);
244
- cursor: pointer;
245
- padding: 3px 8px;
246
- font-size: 0.9rem;
247
- line-height: 1;
248
- color: var(--text-muted);
249
- transition: background-color 0.2s, border-color 0.2s, color 0.2s;
250
- }
251
-
252
- .theme-toggle:hover {
253
- background: var(--bg-surface-hover);
254
- border-color: var(--accent-dim);
255
- color: var(--accent);
256
- }
257
-
258
- .theme-toggle-icon {
259
- display: inline-block;
260
- }
261
-
262
- /* ─── Summary Bar ──────────────────────────────────────────────────────── */
263
-
264
- .summary-bar {
265
- display: flex;
266
- align-items: center;
267
- gap: 16px;
268
- padding: 12px 16px;
269
- background: var(--bg-surface);
270
- border: 1px solid var(--border);
271
- border-radius: var(--radius);
272
- flex-wrap: wrap;
273
- }
274
-
275
- .summary-progress {
276
- display: flex;
277
- align-items: center;
278
- gap: 10px;
279
- flex-shrink: 0;
280
- }
281
-
282
- .progress-bar-bg {
283
- width: 280px;
284
- height: 18px;
285
- background: var(--bg-inset);
286
- border-radius: 4px;
287
- overflow: hidden;
288
- display: flex;
289
- position: relative;
290
- }
291
-
292
- /* Individual wave segment within the segmented bar */
293
- .wave-seg {
294
- position: relative;
295
- height: 100%;
296
- overflow: hidden;
297
- border-right: 1px solid var(--wave-seg-border);
298
- }
299
- .wave-seg:last-child { border-right: none; }
300
-
301
- /* The filled portion within each segment */
302
- .wave-seg-fill {
303
- height: 100%;
304
- transition: width 0.5s ease, background-color 0.5s ease;
305
- }
306
- .wave-seg-fill.pct-0 { background: transparent; }
307
- .wave-seg-fill.pct-low { background: var(--yellow); }
308
- .wave-seg-fill.pct-mid { background: var(--cyan); }
309
- .wave-seg-fill.pct-hi { background: var(--green); }
310
-
311
- /* Wave label centered in each segment */
312
- .wave-seg-label {
313
- position: absolute;
314
- top: 0; left: 0; right: 0; bottom: 0;
315
- display: flex;
316
- align-items: center;
317
- justify-content: center;
318
- font-size: 0.6rem;
319
- font-weight: 700;
320
- letter-spacing: 0.03em;
321
- color: var(--wave-label-color);
322
- pointer-events: none;
323
- text-shadow: var(--wave-label-shadow);
324
- }
325
-
326
- /* Highlight the active wave segment */
327
- .wave-seg-current { box-shadow: inset 0 0 0 1px var(--accent); }
328
-
329
- /* Future waves: visible but subdued */
330
- .wave-seg-future {
331
- background: var(--wave-future-bg);
332
- }
333
- .wave-seg-future .wave-seg-label {
334
- color: var(--wave-future-label);
335
- text-shadow: none;
336
- }
337
-
338
- /* Legacy single-bar fill (still used by per-task progress bars) */
339
- .progress-bar-fill {
340
- height: 100%;
341
- border-radius: 4px;
342
- transition: width 0.5s ease, background-color 0.5s ease;
343
- }
344
- .progress-bar-fill.pct-0 { background: var(--text-faint); }
345
- .progress-bar-fill.pct-low { background: var(--yellow); }
346
- .progress-bar-fill.pct-mid { background: var(--cyan); }
347
- .progress-bar-fill.pct-hi { background: var(--green); }
348
-
349
- .summary-pct {
350
- font-family: var(--font-mono);
351
- font-size: 0.95rem;
352
- font-weight: 600;
353
- min-width: 38px;
354
- }
355
-
356
- .summary-counts {
357
- display: flex;
358
- gap: 10px;
359
- font-family: var(--font-mono);
360
- font-size: 0.85rem;
361
- }
362
-
363
- .count-chip {
364
- display: inline-flex;
365
- align-items: center;
366
- gap: 4px;
367
- padding: 2px 10px;
368
- border-radius: 10px;
369
- font-weight: 500;
370
- margin-right: 4px;
371
- }
372
- .count-num { font-variant-numeric: tabular-nums; }
373
- .count-icon { font-size: 0.85em; opacity: 0.9; }
374
- .count-total { color: var(--text-faint); margin-left: 2px; }
375
-
376
- .count-succeeded { background: var(--badge-succeeded-bg); color: var(--green); }
377
- .count-running { background: var(--badge-running-bg); color: var(--accent); }
378
- .count-failed { background: var(--badge-failed-bg); color: var(--red); }
379
- .count-stalled { background: var(--badge-stalled-bg); color: var(--yellow); }
380
- .count-pending { background: var(--badge-pending-bg); color: var(--text-muted); }
381
-
382
- .summary-elapsed {
383
- color: var(--text-muted);
384
- font-size: 0.8rem;
385
- font-family: var(--font-mono);
386
- }
387
-
388
- .summary-waves {
389
- display: flex;
390
- align-items: center;
391
- gap: 6px;
392
- font-size: 0.8rem;
393
- }
394
-
395
- .wave-chip {
396
- padding: 2px 8px;
397
- border-radius: 10px;
398
- font-family: var(--font-mono);
399
- font-size: 0.75rem;
400
- font-weight: 500;
401
- border: 1px solid var(--border);
402
- color: var(--text-muted);
403
- }
404
-
405
- .wave-chip.current {
406
- border-color: var(--accent-dim);
407
- background: var(--badge-running-bg);
408
- color: var(--accent);
409
- font-weight: 700;
410
- }
411
-
412
- .wave-chip.done {
413
- border-color: var(--green-dim);
414
- background: var(--green-tint-active);
415
- color: var(--green);
416
- }
417
-
418
- /* TP-178: Merging wave indicator — pulsing accent to distinguish from executing (#493) */
419
- .wave-chip.merging {
420
- animation: merge-pulse 1.5s ease-in-out infinite;
421
- }
422
-
423
- .wave-seg-merging {
424
- animation: merge-pulse 1.5s ease-in-out infinite;
425
- }
426
-
427
- @keyframes merge-pulse {
428
- 0%, 100% { opacity: 1; }
429
- 50% { opacity: 0.5; }
430
- }
431
-
432
- /* ─── Content ──────────────────────────────────────────────────────────── */
433
-
434
- .content {
435
- display: flex;
436
- flex-direction: column;
437
- gap: 12px;
438
- min-height: 0;
439
- }
440
-
441
- /* ─── Panels (shared) ──────────────────────────────────────────────────── */
442
-
443
- .panel {
444
- background: var(--bg-surface);
445
- border: 1px solid var(--border);
446
- border-radius: var(--radius);
447
- overflow: hidden;
448
- display: flex;
449
- flex-direction: column;
450
- }
451
-
452
- .panel-header {
453
- padding: 10px 14px;
454
- font-size: 0.75rem;
455
- font-weight: 600;
456
- text-transform: uppercase;
457
- letter-spacing: 0.06em;
458
- color: var(--text-muted);
459
- border-bottom: 1px solid var(--border);
460
- background: var(--bg-surface);
461
- }
462
-
463
- .panel-body {
464
- padding: 0;
465
- flex: 1;
466
- overflow-y: auto;
467
- }
468
-
469
- .empty-state {
470
- padding: 24px;
471
- text-align: center;
472
- color: var(--text-faint);
473
- font-size: 0.85rem;
474
- }
475
-
476
- /* ─── Lane Group (lane header + nested task rows) ──────────────────────── */
477
-
478
- .lane-group {
479
- border-bottom: 1px solid var(--border);
480
- }
481
-
482
- .lane-group:last-child { border-bottom: none; }
483
-
484
- .lane-header {
485
- display: grid;
486
- grid-template-columns: 36px 1fr auto;
487
- align-items: center;
488
- gap: 12px;
489
- padding: 10px 14px;
490
- background: var(--bg-inset);
491
- border-bottom: 1px solid var(--border-subtle);
492
- }
493
-
494
- .lane-num {
495
- font-family: var(--font-mono);
496
- font-size: 1rem;
497
- font-weight: 700;
498
- color: var(--text-muted);
499
- text-align: center;
500
- }
501
-
502
- .lane-meta {
503
- display: flex;
504
- align-items: center;
505
- gap: 10px;
506
- min-width: 0;
507
- }
508
-
509
- .lane-session {
510
- font-family: var(--font-mono);
511
- font-size: 0.82rem;
512
- color: var(--accent);
513
- white-space: nowrap;
514
- }
515
-
516
- .lane-branch {
517
- font-size: 0.72rem;
518
- color: var(--text-muted);
519
- white-space: nowrap;
520
- overflow: hidden;
521
- text-overflow: ellipsis;
522
- }
523
-
524
- .lane-segment {
525
- display: inline-flex;
526
- align-items: center;
527
- gap: 4px;
528
- font-family: var(--font-mono);
529
- font-size: 0.68rem;
530
- font-weight: 600;
531
- padding: 2px 7px;
532
- border-radius: 8px;
533
- background: var(--badge-running-bg);
534
- color: var(--accent);
535
- max-width: 220px;
536
- overflow: hidden;
537
- text-overflow: ellipsis;
538
- white-space: nowrap;
539
- }
540
-
541
- .lane-right {
542
- display: flex;
543
- align-items: center;
544
- gap: 10px;
545
- }
546
-
547
- .session-dot {
548
- width: 8px;
549
- height: 8px;
550
- border-radius: 50%;
551
- flex-shrink: 0;
552
- }
553
-
554
- .session-dot.alive { background: var(--green); }
555
- .session-dot.dead { background: var(--red); opacity: 0.6; }
556
-
557
- .session-view-btn {
558
- font-family: var(--font-sans);
559
- font-size: 0.72rem;
560
- font-weight: 600;
561
- padding: 3px 10px;
562
- border-radius: var(--radius-sm);
563
- background: var(--accent-dim);
564
- border: 1px solid var(--accent-dim);
565
- color: var(--phase-on-color);
566
- cursor: pointer;
567
- white-space: nowrap;
568
- transition: background 0.2s, border-color 0.2s;
569
- }
570
-
571
- .session-view-btn:hover {
572
- background: var(--accent);
573
- border-color: var(--accent);
574
- }
575
-
576
- .session-cmd {
577
- font-family: var(--font-mono);
578
- font-size: 0.7rem;
579
- padding: 3px 8px;
580
- border-radius: var(--radius-sm);
581
- background: var(--bg);
582
- border: 1px solid var(--border);
583
- color: var(--text);
584
- cursor: pointer;
585
- user-select: all;
586
- white-space: nowrap;
587
- transition: border-color 0.2s, color 0.2s;
588
- }
589
-
590
- .session-cmd:hover {
591
- border-color: var(--accent-dim);
592
- color: var(--accent);
593
- }
594
-
595
- .session-cmd.copied {
596
- border-color: var(--green-dim);
597
- color: var(--green);
598
- }
599
-
600
- .session-cmd.dead-session {
601
- color: var(--text-muted);
602
- cursor: default;
603
- }
604
-
605
- /* ─── Task Row (inside lane group) ─────────────────────────────────────── */
606
-
607
- .task-row {
608
- display: grid;
609
- grid-template-columns: 36px 24px 100px 90px 80px 200px 1fr;
610
- align-items: center;
611
- gap: 8px;
612
- padding: 8px 14px;
613
- border-bottom: 1px solid var(--border-subtle);
614
- transition: background 0.15s;
615
- }
616
-
617
- .task-row:last-child { border-bottom: none; }
618
- .task-row:hover { background: var(--bg-surface-hover); }
619
-
620
- .task-icon {
621
- text-align: center;
622
- }
623
-
624
- .task-id {
625
- font-family: var(--font-mono);
626
- font-weight: 600;
627
- font-size: 0.85rem;
628
- }
629
-
630
- .task-duration {
631
- font-family: var(--font-mono);
632
- font-size: 0.8rem;
633
- color: var(--text-muted);
634
- }
635
-
636
- .task-step {
637
- font-size: 0.8rem;
638
- color: var(--text-muted);
639
- white-space: nowrap;
640
- overflow: hidden;
641
- text-overflow: ellipsis;
642
- }
643
-
644
- .task-segment-progress {
645
- font-family: var(--font-mono);
646
- color: var(--accent);
647
- }
648
-
649
- .task-packet-home {
650
- font-family: var(--font-mono);
651
- color: var(--magenta);
652
- }
653
-
654
- .task-detail-sep {
655
- color: var(--text-faint);
656
- margin: 0 2px;
657
- }
658
-
659
- .task-step-main {
660
- color: var(--text-muted);
661
- }
662
-
663
- .task-iter {
664
- font-family: var(--font-mono);
665
- font-size: 0.7rem;
666
- color: var(--text-faint);
667
- margin-left: 6px;
668
- }
669
-
670
- /* Status badges */
671
- .status-badge {
672
- display: inline-flex;
673
- align-items: center;
674
- gap: 4px;
675
- font-family: var(--font-mono);
676
- font-size: 0.75rem;
677
- font-weight: 600;
678
- padding: 2px 8px;
679
- border-radius: 10px;
680
- }
681
-
682
- .status-succeeded { background: var(--badge-succeeded-bg); color: var(--green); }
683
- .status-running { background: var(--badge-running-bg); color: var(--accent); }
684
- .status-failed { background: var(--badge-failed-bg); color: var(--red); }
685
- .status-stalled { background: var(--badge-stalled-bg); color: var(--yellow); }
686
- .status-pending { background: var(--badge-pending-bg); color: var(--text-muted); }
687
- .status-skipped { background: var(--badge-skipped-bg); color: var(--text-faint); }
688
-
689
- .status-dot {
690
- width: 6px;
691
- height: 6px;
692
- border-radius: 50%;
693
- display: inline-block;
694
- }
695
-
696
- .status-dot.succeeded { background: var(--green); }
697
- .status-dot.running { background: var(--accent); }
698
- .status-dot.failed { background: var(--red); }
699
- .status-dot.stalled { background: var(--yellow); }
700
- .status-dot.pending { background: var(--text-faint); }
701
- .status-dot.skipped { background: var(--text-faint); }
702
-
703
- /* Task progress bar (inline) */
704
- .task-progress {
705
- display: flex;
706
- align-items: center;
707
- gap: 8px;
708
- }
709
-
710
- .task-progress-bar {
711
- width: 80px;
712
- height: 6px;
713
- background: var(--bg-inset);
714
- border-radius: 3px;
715
- overflow: hidden;
716
- flex-shrink: 0;
717
- }
718
-
719
- .task-progress-fill {
720
- height: 100%;
721
- border-radius: 3px;
722
- transition: width 0.5s ease;
723
- }
724
-
725
- .task-progress-fill.pct-0 { background: var(--text-faint); }
726
- .task-progress-fill.pct-low { background: var(--yellow); }
727
- .task-progress-fill.pct-mid { background: var(--cyan); }
728
- .task-progress-fill.pct-hi { background: var(--green); }
729
-
730
- /* TP-178: Pulsing indicator for executing tasks without sidecar progress (#494) */
731
- .task-progress-executing {
732
- opacity: 0.4;
733
- animation: executing-pulse 2s ease-in-out infinite;
734
- }
735
- @keyframes executing-pulse {
736
- 0%, 100% { opacity: 0.25; }
737
- 50% { opacity: 0.55; }
738
- }
739
-
740
- .task-progress-text {
741
- font-family: var(--font-mono);
742
- font-size: 0.75rem;
743
- color: var(--text-muted);
744
- min-width: 55px;
745
- }
746
-
747
- /* ─── Merge Agents Table ───────────────────────────────────────────────── */
748
-
749
- .merge-table {
750
- width: 100%;
751
- border-collapse: collapse;
752
- }
753
-
754
- .merge-table th {
755
- text-align: left;
756
- padding: 8px 12px;
757
- font-size: 0.7rem;
758
- font-weight: 600;
759
- text-transform: uppercase;
760
- letter-spacing: 0.05em;
761
- color: var(--text-faint);
762
- border-bottom: 1px solid var(--border);
763
- background: var(--bg-surface);
764
- }
765
-
766
- .merge-table td {
767
- padding: 8px 12px;
768
- border-bottom: 1px solid var(--border-subtle);
769
- font-size: 0.85rem;
770
- }
771
-
772
- .merge-table tr:last-child td { border-bottom: none; }
773
- .merge-table tr:hover td { background: var(--bg-surface-hover); }
774
-
775
- .merge-wave-cell { font-family: var(--font-mono); }
776
- .merge-session-cell { font-family: var(--font-mono); font-size: 0.8rem; }
777
- .merge-detail-cell { font-size: 0.8rem; color: var(--text-muted); }
778
- .merge-no-data { color: var(--text-faint); }
779
-
780
- .merge-stats {
781
- display: flex;
782
- flex-wrap: wrap;
783
- gap: 4px 8px;
784
- align-items: center;
785
- font-size: 0.75rem;
786
- }
787
-
788
- .merge-telemetry-cell {
789
- font-size: 0.75rem;
790
- min-width: 120px;
791
- }
792
-
793
- /* ─── Terminal Panel ────────────────────────────────────────────────────── */
794
-
795
- .terminal-panel .panel-header {
796
- display: flex;
797
- align-items: center;
798
- justify-content: space-between;
799
- }
800
-
801
- .terminal-close {
802
- background: none;
803
- border: 1px solid var(--border);
804
- color: var(--text-muted);
805
- font-size: 0.85rem;
806
- cursor: pointer;
807
- padding: 2px 8px;
808
- border-radius: var(--radius-sm);
809
- transition: color 0.2s, border-color 0.2s;
810
- }
811
-
812
- .terminal-close:hover {
813
- color: var(--red);
814
- border-color: var(--red-dim);
815
- }
816
-
817
- .terminal-panel .panel-body {
818
- max-height: 500px;
819
- padding: 0;
820
- background: var(--bg-inset);
821
- overflow-y: auto;
822
- }
823
-
824
- /* ─── Worker Stats (inline in task row) ────────────────────────────────── */
825
-
826
- .worker-stats {
827
- display: flex;
828
- align-items: center;
829
- gap: 10px;
830
- margin-top: 4px;
831
- flex-wrap: wrap;
832
- }
833
-
834
- .worker-stat {
835
- font-family: var(--font-mono);
836
- font-size: 0.7rem;
837
- color: var(--text-muted);
838
- white-space: nowrap;
839
- }
840
-
841
- .worker-last-tool {
842
- color: var(--text-muted);
843
- max-width: 600px;
844
- overflow-wrap: break-word;
845
- word-break: break-all;
846
- white-space: normal;
847
- }
848
-
849
- /* ─── Reviewer Sub-Row ─────────────────────────────────────────────── */
850
-
851
- .reviewer-sub-row {
852
- background: var(--bg-surface-hover);
853
- border-left: 3px solid var(--yellow);
854
- padding-left: 11px; /* compensate for border */
855
- font-size: 0.85em;
856
- }
857
-
858
- .reviewer-sub-row .reviewer-label {
859
- font-family: var(--font-mono);
860
- font-size: 0.75rem;
861
- color: var(--yellow);
862
- font-weight: 600;
863
- }
864
-
865
- .reviewer-sub-row .reviewer-type {
866
- font-family: var(--font-mono);
867
- font-size: 0.7rem;
868
- color: var(--text-muted);
869
- }
870
-
871
- .reviewer-stats {
872
- margin-top: 0;
873
- }
874
-
875
- /* ─── Telemetry Badges (retry, compaction) ─────────────────────────────── */
876
-
877
- .telem-badge {
878
- display: inline-flex;
879
- align-items: center;
880
- gap: 3px;
881
- font-family: var(--font-mono);
882
- font-size: 0.65rem;
883
- font-weight: 500;
884
- padding: 1px 7px;
885
- border-radius: 8px;
886
- white-space: nowrap;
887
- margin-left: 4px;
888
- }
889
-
890
- .telem-retry {
891
- background: var(--badge-stalled-bg);
892
- color: var(--yellow);
893
- }
894
-
895
- .telem-retry-active {
896
- background: var(--yellow-tint-active);
897
- color: var(--yellow);
898
- animation: pulse 1.5s infinite;
899
- }
900
-
901
- .telem-compaction {
902
- background: var(--magenta-tint);
903
- color: var(--magenta);
904
- }
905
-
906
- /* ─── Conversation Viewer ──────────────────────────────────────────────── */
907
-
908
- .conv-stream {
909
- padding: 12px 16px;
910
- font-family: var(--font-mono);
911
- font-size: 0.82rem;
912
- line-height: 1.6;
913
- white-space: pre-wrap;
914
- word-break: break-word;
915
- }
916
-
917
- .conv-text {
918
- color: var(--text);
919
- }
920
-
921
- .conv-thinking {
922
- color: var(--text-faint);
923
- font-style: italic;
924
- }
925
-
926
- .conv-tool-call {
927
- margin: 8px 0 4px;
928
- padding: 6px 10px;
929
- background: var(--accent-tint-bg);
930
- border-left: 3px solid var(--accent-dim);
931
- border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
932
- }
933
-
934
- .conv-tool-name {
935
- color: var(--accent);
936
- font-weight: 600;
937
- }
938
-
939
- .conv-tool-args {
940
- color: var(--text-muted);
941
- font-size: 0.75rem;
942
- }
943
-
944
- .conv-tool-result {
945
- margin: 0 0 8px;
946
- padding: 6px 10px;
947
- background: var(--bg-inset);
948
- border-left: 3px solid var(--border);
949
- border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
950
- max-height: 200px;
951
- overflow-y: auto;
952
- }
953
-
954
- .conv-tool-result pre {
955
- margin: 0;
956
- font-size: 0.75rem;
957
- color: var(--text-muted);
958
- white-space: pre-wrap;
959
- }
960
-
961
- .conv-usage {
962
- margin: 6px 0;
963
- padding: 4px 10px;
964
- font-size: 0.7rem;
965
- color: var(--text-faint);
966
- border-top: 1px solid var(--border-subtle);
967
- }
968
-
969
- .conv-empty {
970
- padding: 40px;
971
- text-align: center;
972
- color: var(--text-faint);
973
- }
974
-
975
- /* ─── Viewer Eye Button (task row) ─────────────────────────────────────── */
976
-
977
- .task-actions {
978
- display: flex;
979
- align-items: center;
980
- justify-content: center;
981
- }
982
-
983
- .viewer-eye-btn {
984
- background: none;
985
- border: none;
986
- cursor: pointer;
987
- font-size: 0.85rem;
988
- padding: 3px 5px;
989
- border-radius: var(--radius-sm);
990
- opacity: 1;
991
- transition: opacity 0.2s, background 0.2s, color 0.2s, box-shadow 0.2s;
992
- line-height: 1;
993
- color: var(--text-muted);
994
- }
995
-
996
- .viewer-eye-btn:hover {
997
- opacity: 1;
998
- background: var(--accent-tint-hover);
999
- color: var(--accent);
1000
- }
1001
-
1002
- .viewer-eye-btn.active {
1003
- opacity: 1;
1004
- background: var(--accent-tint-active);
1005
- color: var(--accent);
1006
- box-shadow: 0 0 0 1px var(--accent-dim);
1007
- }
1008
-
1009
- .session-view-btn.active {
1010
- background: var(--accent);
1011
- border-color: var(--accent);
1012
- }
1013
-
1014
- /* ─── Viewer Controls (auto-scroll checkbox + close) ───────────────────── */
1015
-
1016
- .terminal-controls {
1017
- display: flex;
1018
- align-items: center;
1019
- gap: 12px;
1020
- }
1021
-
1022
- .auto-scroll-label {
1023
- display: flex;
1024
- align-items: center;
1025
- gap: 6px;
1026
- cursor: pointer;
1027
- font-size: 0.75rem;
1028
- color: var(--text-muted);
1029
- user-select: none;
1030
- white-space: nowrap;
1031
- }
1032
-
1033
- .auto-scroll-label input[type="checkbox"] {
1034
- appearance: none;
1035
- -webkit-appearance: none;
1036
- width: 14px;
1037
- height: 14px;
1038
- border: 1px solid var(--border);
1039
- border-radius: 3px;
1040
- background: var(--bg-inset);
1041
- cursor: pointer;
1042
- position: relative;
1043
- flex-shrink: 0;
1044
- }
1045
-
1046
- .auto-scroll-label input[type="checkbox"]:checked {
1047
- background: var(--accent-dim);
1048
- border-color: var(--accent);
1049
- }
1050
-
1051
- .auto-scroll-label input[type="checkbox"]:checked::after {
1052
- content: '✓';
1053
- position: absolute;
1054
- top: -1px;
1055
- left: 2px;
1056
- font-size: 11px;
1057
- color: var(--phase-on-color);
1058
- }
1059
-
1060
- /* ─── STATUS.md Rendered Content ───────────────────────────────────────── */
1061
-
1062
- .status-md-content {
1063
- padding: 12px 16px;
1064
- font-family: var(--font-sans);
1065
- font-size: 0.85rem;
1066
- line-height: 1.6;
1067
- }
1068
-
1069
- .status-md-h1 {
1070
- font-size: 1.15rem;
1071
- font-weight: 700;
1072
- color: var(--text);
1073
- margin: 16px 0 8px;
1074
- padding-bottom: 4px;
1075
- border-bottom: 1px solid var(--border-subtle);
1076
- }
1077
-
1078
- .status-md-h1:first-child { margin-top: 0; }
1079
-
1080
- .status-md-h2 {
1081
- font-size: 1rem;
1082
- font-weight: 600;
1083
- color: var(--text);
1084
- margin: 14px 0 6px;
1085
- }
1086
-
1087
- .status-md-h3 {
1088
- font-size: 0.9rem;
1089
- font-weight: 600;
1090
- color: var(--text-muted);
1091
- margin: 12px 0 4px;
1092
- }
1093
-
1094
- .status-md-h4 {
1095
- font-size: 0.85rem;
1096
- font-weight: 600;
1097
- color: var(--text-muted);
1098
- margin: 10px 0 4px;
1099
- }
1100
-
1101
- .status-md-check {
1102
- display: flex;
1103
- align-items: flex-start;
1104
- gap: 8px;
1105
- padding: 3px 8px;
1106
- border-radius: var(--radius-sm);
1107
- border-left: 2px solid transparent;
1108
- transition: background 0.2s, border-color 0.2s;
1109
- }
1110
-
1111
- .status-md-check.checked {
1112
- color: var(--text-muted);
1113
- }
1114
-
1115
- .status-md-check.checked .check-box {
1116
- color: var(--green);
1117
- }
1118
-
1119
- .status-md-check.unchecked {
1120
- color: var(--text);
1121
- }
1122
-
1123
- .status-md-check.unchecked .check-box {
1124
- color: var(--text-faint);
1125
- }
1126
-
1127
- .check-box {
1128
- flex-shrink: 0;
1129
- font-size: 0.85rem;
1130
- line-height: 1.6;
1131
- }
1132
-
1133
- /* Progress frontier highlight — only when tracking is active */
1134
- .status-md-content.tracking .status-md-check.last-checked {
1135
- border-left-color: var(--accent);
1136
- background: var(--accent-tint-subtle);
1137
- }
1138
-
1139
- .status-md-li {
1140
- padding: 2px 8px;
1141
- color: var(--text);
1142
- }
1143
-
1144
- .status-md-text {
1145
- padding: 2px 8px;
1146
- color: var(--text);
1147
- }
1148
-
1149
- .status-md-spacer {
1150
- height: 8px;
1151
- }
1152
-
1153
- .status-md-code {
1154
- font-family: var(--font-mono);
1155
- font-size: 0.8rem;
1156
- padding: 1px 5px;
1157
- background: var(--bg-surface);
1158
- border: 1px solid var(--border-subtle);
1159
- border-radius: 3px;
1160
- color: var(--accent);
1161
- }
1162
-
1163
- /* ─── Errors Panel ─────────────────────────────────────────────────────── */
1164
-
1165
- .errors-panel .panel-header { color: var(--red); }
1166
-
1167
- .error-item {
1168
- padding: 8px 14px;
1169
- font-family: var(--font-mono);
1170
- font-size: 0.78rem;
1171
- color: var(--red);
1172
- border-bottom: 1px solid var(--border-subtle);
1173
- display: flex;
1174
- align-items: flex-start;
1175
- gap: 8px;
1176
- }
1177
-
1178
- .error-item:last-child { border-bottom: none; }
1179
- .error-bullet { flex-shrink: 0; margin-top: 2px; }
1180
- .error-text { word-break: break-word; }
1181
-
1182
- /* ─── Footer ───────────────────────────────────────────────────────────── */
1183
-
1184
- .footer {
1185
- display: flex;
1186
- align-items: center;
1187
- justify-content: space-between;
1188
- padding: 8px 4px;
1189
- font-size: 0.75rem;
1190
- color: var(--text-faint);
1191
- }
1192
-
1193
- /* ─── No Batch State ───────────────────────────────────────────────────── */
1194
-
1195
- .no-batch {
1196
- display: flex;
1197
- flex-direction: column;
1198
- align-items: center;
1199
- justify-content: center;
1200
- gap: 12px;
1201
- padding: 80px 20px;
1202
- text-align: center;
1203
- }
1204
-
1205
- .no-batch-icon { font-size: 3rem; opacity: 0.3; }
1206
- .no-batch-title { font-size: 1.1rem; font-weight: 600; color: var(--text-muted); }
1207
- .no-batch-hint { font-size: 0.85rem; color: var(--text-faint); font-family: var(--font-mono); }
1208
-
1209
- /* ─── Responsive ───────────────────────────────────────────────────────── */
1210
-
1211
- @media (max-width: 900px) {
1212
- .task-row {
1213
- grid-template-columns: 36px 24px 90px 80px 70px 1fr;
1214
- }
1215
- .task-row .task-step { display: none; }
1216
- .progress-bar-bg { width: 160px; }
1217
- }
1218
-
1219
- /* ─── Repo Filter & Badges ─────────────────────────────────────────────── */
1220
-
1221
- .repo-filter-select {
1222
- background: var(--bg-surface);
1223
- border: 1px solid var(--border);
1224
- color: var(--text-muted);
1225
- font-family: var(--font-mono);
1226
- font-size: 0.8rem;
1227
- padding: 3px 8px;
1228
- border-radius: 8px;
1229
- cursor: pointer;
1230
- max-width: 220px;
1231
- }
1232
- .repo-filter-select:hover {
1233
- border-color: var(--accent);
1234
- color: var(--text);
1235
- }
1236
- .repo-filter-select:focus {
1237
- outline: none;
1238
- border-color: var(--accent);
1239
- }
1240
-
1241
- .repo-badge {
1242
- display: inline-flex;
1243
- align-items: center;
1244
- gap: 4px;
1245
- font-family: var(--font-mono);
1246
- font-size: 0.68rem;
1247
- font-weight: 500;
1248
- padding: 1px 7px;
1249
- border-radius: 8px;
1250
- background: var(--magenta-tint-bg);
1251
- color: var(--magenta);
1252
- white-space: nowrap;
1253
- max-width: 140px;
1254
- overflow: hidden;
1255
- text-overflow: ellipsis;
1256
- }
1257
-
1258
- .repo-badge-lane {
1259
- margin-left: 8px;
1260
- }
1261
-
1262
- .repo-badge-task {
1263
- margin-left: 4px;
1264
- }
1265
-
1266
- /* Merge repo sub-rows */
1267
- .merge-repo-row td {
1268
- padding: 4px 12px 4px 28px !important;
1269
- font-size: 0.78rem !important;
1270
- color: var(--text-muted);
1271
- border-bottom: 1px solid var(--border-subtle);
1272
- }
1273
-
1274
- .merge-repo-row td:first-child {
1275
- padding-left: 28px !important;
1276
- }
1277
-
1278
- .merge-repo-row:last-child td {
1279
- border-bottom: none;
1280
- }
1281
-
1282
- /* ─── Supervisor Panel ──────────────────────────────────────────────────── */
1283
-
1284
- .supervisor-panel {
1285
- border-color: var(--border);
1286
- }
1287
-
1288
- .supervisor-panel-header {
1289
- display: flex;
1290
- align-items: center;
1291
- gap: 10px;
1292
- cursor: pointer;
1293
- user-select: none;
1294
- }
1295
-
1296
- .supervisor-panel-header:hover {
1297
- background: var(--bg-surface-hover);
1298
- }
1299
-
1300
- .supervisor-collapse-btn {
1301
- margin-left: auto;
1302
- background: none;
1303
- border: none;
1304
- color: var(--text-muted);
1305
- font-size: 0.9rem;
1306
- cursor: pointer;
1307
- padding: 0 4px;
1308
- line-height: 1;
1309
- }
1310
-
1311
- .supervisor-collapse-btn:hover {
1312
- color: var(--text);
1313
- }
1314
-
1315
- .supervisor-panel-body {
1316
- padding: 0;
1317
- }
1318
-
1319
- .supervisor-section {
1320
- padding: 0;
1321
- }
1322
-
1323
- .supervisor-section:empty {
1324
- display: none;
1325
- }
1326
-
1327
- /* Supervisor status badge (in panel header) */
1328
- .supervisor-status-badge {
1329
- font-family: var(--font-mono);
1330
- font-size: 0.7rem;
1331
- font-weight: 600;
1332
- padding: 2px 8px;
1333
- border-radius: 10px;
1334
- text-transform: uppercase;
1335
- letter-spacing: 0.04em;
1336
- }
1337
-
1338
- .supervisor-status-badge.supervisor-active {
1339
- background: var(--badge-succeeded-bg);
1340
- color: var(--green);
1341
- }
1342
-
1343
- .supervisor-status-badge.supervisor-stale {
1344
- background: var(--badge-stalled-bg);
1345
- color: var(--yellow);
1346
- }
1347
-
1348
- .supervisor-status-badge.supervisor-inactive {
1349
- background: var(--badge-pending-bg);
1350
- color: var(--text-muted);
1351
- }
1352
-
1353
- /* Status row inside the panel */
1354
- .supervisor-status-row {
1355
- display: flex;
1356
- align-items: center;
1357
- gap: 10px;
1358
- padding: 10px 14px;
1359
- border-bottom: 1px solid var(--border-subtle);
1360
- flex-wrap: wrap;
1361
- }
1362
-
1363
- .supervisor-status-dot {
1364
- width: 8px;
1365
- height: 8px;
1366
- border-radius: 50%;
1367
- flex-shrink: 0;
1368
- }
1369
-
1370
- .supervisor-status-dot.supervisor-active {
1371
- background: var(--green);
1372
- animation: pulse 2s infinite;
1373
- }
1374
-
1375
- .supervisor-status-dot.supervisor-stale {
1376
- background: var(--yellow);
1377
- }
1378
-
1379
- .supervisor-status-dot.supervisor-inactive {
1380
- background: var(--text-faint);
1381
- }
1382
-
1383
- .supervisor-status-label {
1384
- font-weight: 600;
1385
- font-size: 0.85rem;
1386
- }
1387
-
1388
- .supervisor-autonomy-badge {
1389
- font-family: var(--font-mono);
1390
- font-size: 0.7rem;
1391
- font-weight: 500;
1392
- padding: 1px 7px;
1393
- border-radius: 8px;
1394
- background: var(--magenta-tint-bg);
1395
- color: var(--magenta);
1396
- }
1397
-
1398
- .supervisor-heartbeat {
1399
- font-family: var(--font-mono);
1400
- font-size: 0.75rem;
1401
- color: var(--text-muted);
1402
- }
1403
-
1404
- .supervisor-session-id {
1405
- font-family: var(--font-mono);
1406
- font-size: 0.72rem;
1407
- color: var(--text-faint);
1408
- overflow: hidden;
1409
- text-overflow: ellipsis;
1410
- max-width: 200px;
1411
- white-space: nowrap;
1412
- }
1413
-
1414
- /* Subsection titles */
1415
- .supervisor-subsection-title {
1416
- font-size: 0.72rem;
1417
- font-weight: 600;
1418
- text-transform: uppercase;
1419
- letter-spacing: 0.05em;
1420
- color: var(--text-faint);
1421
- padding: 8px 14px 4px;
1422
- border-top: 1px solid var(--border-subtle);
1423
- }
1424
-
1425
- /* ── Conversation List ─────────────────────────────────────────────────── */
1426
-
1427
- .supervisor-conversation-list {
1428
- max-height: 250px;
1429
- overflow-y: auto;
1430
- padding: 4px 14px 8px;
1431
- }
1432
-
1433
- .supervisor-conv-entry {
1434
- padding: 6px 10px;
1435
- margin-bottom: 4px;
1436
- border-radius: var(--radius-sm);
1437
- font-size: 0.82rem;
1438
- }
1439
-
1440
- .supervisor-conv-entry.conv-role-operator {
1441
- background: var(--accent-tint-subtle);
1442
- border-left: 3px solid var(--accent-dim);
1443
- }
1444
-
1445
- .supervisor-conv-entry.conv-role-supervisor {
1446
- background: var(--green-tint-bg);
1447
- border-left: 3px solid var(--green-dim);
1448
- }
1449
-
1450
- .supervisor-conv-header {
1451
- display: flex;
1452
- align-items: center;
1453
- gap: 8px;
1454
- margin-bottom: 2px;
1455
- }
1456
-
1457
- .supervisor-conv-role {
1458
- font-weight: 600;
1459
- font-size: 0.75rem;
1460
- text-transform: uppercase;
1461
- letter-spacing: 0.04em;
1462
- }
1463
-
1464
- .conv-role-operator .supervisor-conv-role { color: var(--accent); }
1465
- .conv-role-supervisor .supervisor-conv-role { color: var(--green); }
1466
-
1467
- .supervisor-conv-time {
1468
- font-family: var(--font-mono);
1469
- font-size: 0.68rem;
1470
- color: var(--text-faint);
1471
- }
1472
-
1473
- .supervisor-conv-content {
1474
- color: var(--text);
1475
- line-height: 1.5;
1476
- white-space: pre-wrap;
1477
- word-break: break-word;
1478
- }
1479
-
1480
- /* ── Recovery Actions Timeline ─────────────────────────────────────────── */
1481
-
1482
- .supervisor-timeline {
1483
- max-height: 300px;
1484
- overflow-y: auto;
1485
- padding: 4px 14px 8px;
1486
- }
1487
-
1488
- .supervisor-action-entry {
1489
- display: flex;
1490
- gap: 10px;
1491
- padding: 6px 0;
1492
- border-bottom: 1px solid var(--border-subtle);
1493
- }
1494
-
1495
- .supervisor-action-entry:last-child {
1496
- border-bottom: none;
1497
- }
1498
-
1499
- .supervisor-action-left {
1500
- display: flex;
1501
- flex-direction: column;
1502
- align-items: center;
1503
- gap: 4px;
1504
- min-width: 60px;
1505
- flex-shrink: 0;
1506
- }
1507
-
1508
- .supervisor-action-time {
1509
- font-family: var(--font-mono);
1510
- font-size: 0.68rem;
1511
- color: var(--text-faint);
1512
- white-space: nowrap;
1513
- }
1514
-
1515
- .supervisor-action-dot {
1516
- width: 8px;
1517
- height: 8px;
1518
- border-radius: 50%;
1519
- }
1520
-
1521
- .supervisor-action-dot.action-success { background: var(--green); }
1522
- .supervisor-action-dot.action-failed { background: var(--red); }
1523
- .supervisor-action-dot.action-pending { background: var(--yellow); }
1524
-
1525
- .supervisor-action-right {
1526
- flex: 1;
1527
- min-width: 0;
1528
- }
1529
-
1530
- .supervisor-action-header {
1531
- display: flex;
1532
- align-items: center;
1533
- gap: 6px;
1534
- flex-wrap: wrap;
1535
- }
1536
-
1537
- .supervisor-action-tier {
1538
- font-family: var(--font-mono);
1539
- font-size: 0.68rem;
1540
- font-weight: 700;
1541
- padding: 1px 5px;
1542
- border-radius: 4px;
1543
- background: var(--magenta-tint-bg);
1544
- color: var(--magenta);
1545
- }
1546
-
1547
- .supervisor-action-type {
1548
- font-weight: 600;
1549
- font-size: 0.82rem;
1550
- color: var(--text);
1551
- }
1552
-
1553
- .supervisor-action-target {
1554
- font-family: var(--font-mono);
1555
- font-size: 0.75rem;
1556
- color: var(--text-muted);
1557
- }
1558
-
1559
- .supervisor-action-outcome {
1560
- font-family: var(--font-mono);
1561
- font-size: 0.7rem;
1562
- font-weight: 600;
1563
- padding: 1px 6px;
1564
- border-radius: 8px;
1565
- }
1566
-
1567
- .supervisor-action-outcome.action-success {
1568
- background: var(--badge-succeeded-bg);
1569
- color: var(--green);
1570
- }
1571
-
1572
- .supervisor-action-outcome.action-failed {
1573
- background: var(--badge-failed-bg);
1574
- color: var(--red);
1575
- }
1576
-
1577
- .supervisor-action-outcome.action-pending {
1578
- background: var(--badge-stalled-bg);
1579
- color: var(--yellow);
1580
- }
1581
-
1582
- .supervisor-action-description {
1583
- font-size: 0.8rem;
1584
- color: var(--text-secondary, #b0b0b0);
1585
- margin-top: 3px;
1586
- line-height: 1.4;
1587
- overflow: hidden;
1588
- text-overflow: ellipsis;
1589
- white-space: nowrap;
1590
- max-width: 600px;
1591
- cursor: default;
1592
- }
1593
-
1594
- .supervisor-action-reason {
1595
- font-size: 0.78rem;
1596
- color: var(--text-muted);
1597
- margin-top: 2px;
1598
- line-height: 1.4;
1599
- }
1600
-
1601
- /* ── Batch Summary ─────────────────────────────────────────────────────── */
1602
-
1603
- .supervisor-summary-content {
1604
- padding: 0 14px 8px;
1605
- max-height: 300px;
1606
- overflow-y: auto;
1607
- }
1608
-
1609
- .supervisor-summary-content .status-md-content {
1610
- padding: 4px 0;
1611
- }
1612
-
1613
- /* ─── Scrollbar ────────────────────────────────────────────────────────── */
1614
-
1615
- ::-webkit-scrollbar { width: 6px; }
1616
- ::-webkit-scrollbar-track { background: transparent; }
1617
- ::-webkit-scrollbar-thumb { background: var(--scrollbar-thumb); border-radius: 3px; }
1618
- ::-webkit-scrollbar-thumb:hover { background: var(--scrollbar-thumb-hover); }
1619
-
1620
- /* ─── Pulse animation ──────────────────────────────────────────────────── */
1621
-
1622
- @keyframes pulse {
1623
- 0%, 100% { opacity: 1; }
1624
- 50% { opacity: 0.5; }
1625
- }
1626
-
1627
- .status-running .status-dot { animation: pulse 2s infinite; }
1628
-
1629
- /* ─── Copy toast ───────────────────────────────────────────────────────── */
1630
-
1631
- .copy-toast {
1632
- position: fixed;
1633
- bottom: 20px;
1634
- right: 20px;
1635
- background: var(--green-dim);
1636
- color: var(--phase-on-color);
1637
- padding: 8px 16px;
1638
- border-radius: var(--radius);
1639
- font-size: 0.8rem;
1640
- font-family: var(--font-mono);
1641
- opacity: 0;
1642
- transform: translateY(8px);
1643
- transition: opacity 0.2s, transform 0.2s;
1644
- pointer-events: none;
1645
- z-index: 100;
1646
- }
1647
-
1648
- .copy-toast.visible {
1649
- opacity: 1;
1650
- transform: translateY(0);
1651
- }
1652
-
1653
- /* ── History Dropdown ────────────────────────────────────────────────────── */
1654
-
1655
- .history-select {
1656
- background: var(--bg-surface);
1657
- border: 1px solid var(--border);
1658
- color: var(--text-muted);
1659
- font-family: var(--font-mono);
1660
- font-size: 0.8rem;
1661
- padding: 3px 8px;
1662
- border-radius: 8px;
1663
- cursor: pointer;
1664
- max-width: 260px;
1665
- }
1666
- .history-select:hover {
1667
- border-color: var(--accent);
1668
- color: var(--text-primary);
1669
- }
1670
- .history-select:focus {
1671
- outline: none;
1672
- border-color: var(--accent);
1673
- }
1674
-
1675
- /* ── History Summary Panel ───────────────────────────────────────────────── */
1676
-
1677
- .history-panel .panel-body {
1678
- padding: 16px;
1679
- }
1680
-
1681
- .history-header {
1682
- display: flex;
1683
- align-items: center;
1684
- gap: 16px;
1685
- margin-bottom: 16px;
1686
- flex-wrap: wrap;
1687
- }
1688
-
1689
- .history-header .batch-id {
1690
- font-family: var(--font-mono);
1691
- font-size: 1.1rem;
1692
- font-weight: 700;
1693
- color: var(--accent);
1694
- }
1695
-
1696
- .history-header .batch-status {
1697
- font-size: 0.85rem;
1698
- padding: 2px 10px;
1699
- border-radius: 12px;
1700
- font-weight: 600;
1701
- }
1702
-
1703
- .history-header .batch-status.completed { background: var(--badge-succeeded-bg); color: var(--green); }
1704
- .history-header .batch-status.partial { background: var(--badge-stalled-bg); color: var(--yellow); }
1705
- .history-header .batch-status.failed { background: var(--badge-failed-bg); color: var(--red); }
1706
- .history-header .batch-status.aborted { background: var(--badge-pending-bg); color: var(--text-muted); }
1707
-
1708
- .history-header .batch-time {
1709
- color: var(--text-muted);
1710
- font-size: 0.85rem;
1711
- }
1712
-
1713
- .history-stats {
1714
- display: grid;
1715
- grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
1716
- gap: 12px;
1717
- margin-bottom: 16px;
1718
- }
1719
-
1720
- .stat-card {
1721
- background: var(--bg-surface);
1722
- border: 1px solid var(--border);
1723
- border-radius: 8px;
1724
- padding: 12px;
1725
- text-align: center;
1726
- }
1727
-
1728
- .stat-card .stat-value {
1729
- font-family: var(--font-mono);
1730
- font-size: 1.3rem;
1731
- font-weight: 700;
1732
- color: var(--text-primary);
1733
- }
1734
-
1735
- .stat-card .stat-label {
1736
- font-size: 0.75rem;
1737
- color: var(--text-muted);
1738
- margin-top: 2px;
1739
- }
1740
-
1741
- .stat-card.stat-tokens .stat-value {
1742
- font-size: 0.95rem;
1743
- color: var(--accent);
1744
- }
1745
-
1746
- .history-waves-table,
1747
- .history-tasks-table {
1748
- width: 100%;
1749
- border-collapse: collapse;
1750
- margin-bottom: 16px;
1751
- }
1752
-
1753
- .history-waves-table th,
1754
- .history-tasks-table th {
1755
- text-align: left;
1756
- padding: 6px 10px;
1757
- border-bottom: 1px solid var(--border);
1758
- font-size: 0.75rem;
1759
- color: var(--text-muted);
1760
- text-transform: uppercase;
1761
- letter-spacing: 0.05em;
1762
- }
1763
-
1764
- .history-waves-table td,
1765
- .history-tasks-table td {
1766
- padding: 6px 10px;
1767
- border-bottom: 1px solid var(--border-table-subtle);
1768
- font-family: var(--font-mono);
1769
- font-size: 0.85rem;
1770
- color: var(--text-muted);
1771
- }
1772
-
1773
- .history-section-title {
1774
- font-size: 0.9rem;
1775
- font-weight: 600;
1776
- color: var(--text-primary);
1777
- margin: 16px 0 8px;
1778
- }
1779
-
1780
- /* TP-107: Agents Panel */
1781
- .agents-grid {
1782
- display: flex;
1783
- flex-direction: column;
1784
- gap: 6px;
1785
- }
1786
- .agent-card {
1787
- padding: 8px 12px;
1788
- border-radius: 6px;
1789
- background: var(--bg-secondary);
1790
- border-left: 3px solid var(--green);
1791
- }
1792
- .agent-card.agent-terminal {
1793
- border-left-color: var(--text-faint);
1794
- opacity: 0.7;
1795
- }
1796
- .agent-header {
1797
- font-size: 0.85rem;
1798
- margin-bottom: 4px;
1799
- }
1800
- .agent-meta {
1801
- display: flex;
1802
- flex-wrap: wrap;
1803
- gap: 4px;
1804
- }
1805
- .agent-badge {
1806
- font-size: 0.7rem;
1807
- padding: 1px 6px;
1808
- border-radius: 3px;
1809
- background: var(--bg-primary);
1810
- color: var(--text-secondary);
1811
- }
1812
- .agent-status-running { color: var(--green); }
1813
- .agent-status-spawning { color: var(--yellow); }
1814
- .agent-status-exited { color: var(--text-faint); } /* displayed as 'shutdown' */
1815
- .agent-status-killed { color: var(--text-faint); } /* displayed as 'shutdown' */
1816
- .agent-status-crashed { color: var(--red); }
1817
- .agent-status-timed_out { color: var(--red); }
1818
-
1819
- /* TP-107: Messages Panel */
1820
- .messages-list {
1821
- display: flex;
1822
- flex-direction: column;
1823
- gap: 4px;
1824
- }
1825
- .message-row {
1826
- display: flex;
1827
- align-items: flex-start;
1828
- gap: 8px;
1829
- padding: 6px 8px;
1830
- font-size: 0.8rem;
1831
- border-radius: 4px;
1832
- background: var(--bg-secondary);
1833
- }
1834
- .msg-time {
1835
- color: var(--text-faint);
1836
- min-width: 60px;
1837
- }
1838
- .msg-direction {
1839
- color: var(--text-secondary);
1840
- min-width: 100px;
1841
- }
1842
- .msg-badge {
1843
- font-size: 0.65rem;
1844
- padding: 1px 5px;
1845
- border-radius: 3px;
1846
- text-transform: uppercase;
1847
- }
1848
- .msg-type {
1849
- background: var(--bg-primary);
1850
- color: var(--text-secondary);
1851
- }
1852
- .msg-pending {
1853
- background: var(--yellow);
1854
- color: var(--bg-primary);
1855
- }
1856
- .msg-delivered {
1857
- background: var(--green);
1858
- color: var(--bg-primary);
1859
- }
1860
- .msg-reply {
1861
- background: var(--blue);
1862
- color: var(--bg-primary);
1863
- }
1864
- .msg-preview {
1865
- color: var(--text-primary);
1866
- white-space: pre-wrap;
1867
- word-break: break-word;
1868
- flex: 1;
1869
- }
1870
- .msg-rate-limited {
1871
- background: var(--red);
1872
- color: var(--bg-primary);
1873
- }
1874
-
1875
- /* TP-107: V2 conversation event styles */
1876
- .conv-steer {
1877
- border-left: 3px solid var(--blue);
1878
- padding-left: 8px;
1879
- }
1880
- .conv-error {
1881
- color: var(--red);
1882
- }
1
+ /* ─── Reset & Base ─────────────────────────────────────────────────────── */
2
+
3
+ *,
4
+ *::before,
5
+ *::after {
6
+ box-sizing: border-box;
7
+ margin: 0;
8
+ padding: 0;
9
+ }
10
+
11
+ :root {
12
+ --font-mono: "JetBrains Mono", "Fira Code", "Cascadia Code", "SF Mono", Consolas, monospace;
13
+ --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;
14
+ --radius: 8px;
15
+ --radius-sm: 4px;
16
+ }
17
+
18
+ /* ─── Dark Theme (default) ─────────────────────────────────────────────── */
19
+
20
+ :root,
21
+ [data-theme="dark"] {
22
+ --bg: #0d1117;
23
+ --bg-surface: #161b22;
24
+ --bg-surface-hover: #1c2129;
25
+ --bg-inset: #0d1117;
26
+ --border: #30363d;
27
+ --border-subtle: #21262d;
28
+ --text: #e6edf3;
29
+ --text-muted: #8b949e;
30
+ --text-faint: #484f58;
31
+ --accent: #58a6ff;
32
+ --accent-dim: #1f6feb;
33
+ --green: #3fb950;
34
+ --green-dim: #238636;
35
+ --red: #f85149;
36
+ --red-dim: #da3633;
37
+ --yellow: #d29922;
38
+ --yellow-dim: #9e6a03;
39
+ --cyan: #39d2c0;
40
+ --magenta: #bc8cff;
41
+ --phase-on-color: #fff;
42
+ --phase-merging-bg: #1a3a5c;
43
+ --wave-seg-border: rgba(0,0,0,0.3);
44
+ --wave-label-color: rgba(255,255,255,0.85);
45
+ --wave-label-shadow: 0 1px 2px rgba(0,0,0,0.6);
46
+ --wave-future-bg: rgba(139,148,158,0.25);
47
+ --wave-future-label: rgba(255,255,255,0.55);
48
+ --badge-succeeded-bg: rgba(63,185,80,0.15);
49
+ --badge-running-bg: rgba(88,166,255,0.15);
50
+ --badge-failed-bg: rgba(248,81,73,0.15);
51
+ --badge-stalled-bg: rgba(210,153,34,0.15);
52
+ --badge-pending-bg: rgba(139,148,158,0.1);
53
+ --badge-skipped-bg: rgba(139,148,158,0.1);
54
+ --accent-tint-bg: rgba(88,166,255,0.08);
55
+ --accent-tint-hover: rgba(88,166,255,0.18);
56
+ --accent-tint-active: rgba(88,166,255,0.25);
57
+ --accent-tint-subtle: rgba(88,166,255,0.06);
58
+ --green-tint-bg: rgba(63,185,80,0.06);
59
+ --green-tint-active: rgba(63,185,80,0.12);
60
+ --yellow-tint-active: rgba(210,153,34,0.25);
61
+ --magenta-tint-bg: rgba(188,140,255,0.12);
62
+ --magenta-tint: rgba(188,140,255,0.15);
63
+ --border-table-subtle: rgba(48,54,61,0.3);
64
+ --scrollbar-thumb: var(--border);
65
+ --scrollbar-thumb-hover: var(--text-faint);
66
+ color-scheme: dark;
67
+ }
68
+
69
+ /* ─── Light Theme ──────────────────────────────────────────────────────── */
70
+
71
+ [data-theme="light"] {
72
+ --bg: #ffffff;
73
+ --bg-surface: #f6f8fa;
74
+ --bg-surface-hover: #eaeef2;
75
+ --bg-inset: #f0f2f5;
76
+ --border: #d0d7de;
77
+ --border-subtle: #e1e4e8;
78
+ --text: #1f2328;
79
+ --text-muted: #656d76;
80
+ --text-faint: #8c959f;
81
+ --accent: #0969da;
82
+ --accent-dim: #0550ae;
83
+ --green: #1a7f37;
84
+ --green-dim: #116329;
85
+ --red: #cf222e;
86
+ --red-dim: #a40e26;
87
+ --yellow: #9a6700;
88
+ --yellow-dim: #7d4e00;
89
+ --cyan: #1b7c83;
90
+ --magenta: #8250df;
91
+ --phase-on-color: #fff;
92
+ --phase-merging-bg: #ddf4ff;
93
+ --wave-seg-border: rgba(0,0,0,0.08);
94
+ --wave-label-color: rgba(0,0,0,0.7);
95
+ --wave-label-shadow: none;
96
+ --wave-future-bg: rgba(139,148,158,0.15);
97
+ --wave-future-label: rgba(0,0,0,0.4);
98
+ --badge-succeeded-bg: rgba(26,127,55,0.1);
99
+ --badge-running-bg: rgba(9,105,218,0.1);
100
+ --badge-failed-bg: rgba(207,34,46,0.1);
101
+ --badge-stalled-bg: rgba(154,103,0,0.1);
102
+ --badge-pending-bg: rgba(140,149,159,0.08);
103
+ --badge-skipped-bg: rgba(140,149,159,0.08);
104
+ --accent-tint-bg: rgba(9,105,218,0.06);
105
+ --accent-tint-hover: rgba(9,105,218,0.12);
106
+ --accent-tint-active: rgba(9,105,218,0.18);
107
+ --accent-tint-subtle: rgba(9,105,218,0.04);
108
+ --green-tint-bg: rgba(26,127,55,0.06);
109
+ --green-tint-active: rgba(26,127,55,0.1);
110
+ --yellow-tint-active: rgba(154,103,0,0.15);
111
+ --magenta-tint-bg: rgba(130,80,223,0.08);
112
+ --magenta-tint: rgba(130,80,223,0.1);
113
+ --border-table-subtle: rgba(208,215,222,0.5);
114
+ --scrollbar-thumb: #c1c8cf;
115
+ --scrollbar-thumb-hover: #8c959f;
116
+ color-scheme: light;
117
+ }
118
+
119
+ html { font-size: 14px; }
120
+
121
+ body {
122
+ font-family: var(--font-sans);
123
+ background: var(--bg);
124
+ color: var(--text);
125
+ min-height: 100vh;
126
+ overflow-x: hidden;
127
+ transition: background-color 0.3s ease, color 0.3s ease;
128
+ }
129
+
130
+ /* Smooth theme transition for key elements */
131
+ .panel,
132
+ .summary-bar,
133
+ .header-badge,
134
+ .status-badge,
135
+ .count-chip,
136
+ .wave-chip,
137
+ .session-view-btn,
138
+ .session-cmd,
139
+ .repo-filter-select,
140
+ .history-select,
141
+ .task-row,
142
+ .lane-header,
143
+ .conv-tool-call,
144
+ .conv-tool-result,
145
+ .copy-toast,
146
+ .auto-scroll-label input[type="checkbox"],
147
+ .terminal-close,
148
+ .stat-card {
149
+ transition: background-color 0.3s ease, color 0.3s ease, border-color 0.3s ease;
150
+ }
151
+
152
+ /* ─── Layout Shell ─────────────────────────────────────────────────────── */
153
+
154
+ .dashboard {
155
+ display: grid;
156
+ grid-template-rows: auto auto 1fr auto;
157
+ min-height: 100vh;
158
+ padding: 16px 20px;
159
+ gap: 12px;
160
+ max-width: 1600px;
161
+ margin: 0 auto;
162
+ }
163
+
164
+ /* ─── Header ───────────────────────────────────────────────────────────── */
165
+
166
+ .header {
167
+ display: flex;
168
+ align-items: center;
169
+ gap: 16px;
170
+ flex-wrap: wrap;
171
+ }
172
+
173
+ .header-title {
174
+ font-size: 1.35rem;
175
+ font-weight: 700;
176
+ letter-spacing: -0.02em;
177
+ white-space: nowrap;
178
+ }
179
+
180
+ .header-logo {
181
+ height: 1.6rem;
182
+ width: auto;
183
+ vertical-align: middle;
184
+ opacity: 0.95;
185
+ }
186
+
187
+ .header-badge {
188
+ display: inline-flex;
189
+ align-items: center;
190
+ gap: 6px;
191
+ font-family: var(--font-mono);
192
+ font-size: 0.8rem;
193
+ padding: 3px 10px;
194
+ border-radius: 12px;
195
+ font-weight: 500;
196
+ }
197
+
198
+ .badge-batch {
199
+ background: var(--bg-surface);
200
+ border: 1px solid var(--border);
201
+ color: var(--accent);
202
+ }
203
+
204
+ .badge-phase {
205
+ font-weight: 600;
206
+ text-transform: uppercase;
207
+ letter-spacing: 0.05em;
208
+ font-size: 0.7rem;
209
+ }
210
+
211
+ .phase-executing { background: var(--accent-dim); color: var(--phase-on-color); }
212
+ .phase-merging { background: var(--phase-merging-bg); color: var(--accent); }
213
+ .phase-completed { background: var(--green-dim); color: var(--phase-on-color); }
214
+ .phase-paused { background: var(--yellow-dim); color: var(--phase-on-color); }
215
+ .phase-stopped,
216
+ .phase-aborted { background: var(--red-dim); color: var(--phase-on-color); }
217
+ .phase-failed { background: var(--red-dim); color: var(--phase-on-color); }
218
+
219
+ .header-meta {
220
+ margin-left: auto;
221
+ display: flex;
222
+ align-items: center;
223
+ gap: 12px;
224
+ color: var(--text-muted);
225
+ font-size: 0.8rem;
226
+ }
227
+
228
+ .connection-dot {
229
+ width: 8px;
230
+ height: 8px;
231
+ border-radius: 50%;
232
+ display: inline-block;
233
+ }
234
+
235
+ .connection-dot.connected { background: var(--green); }
236
+ .connection-dot.disconnected { background: var(--red); }
237
+
238
+ /* ─── Theme Toggle ─────────────────────────────────────────────────────── */
239
+
240
+ .theme-toggle {
241
+ background: none;
242
+ border: 1px solid var(--border);
243
+ border-radius: var(--radius-sm);
244
+ cursor: pointer;
245
+ padding: 3px 8px;
246
+ font-size: 0.9rem;
247
+ line-height: 1;
248
+ color: var(--text-muted);
249
+ transition: background-color 0.2s, border-color 0.2s, color 0.2s;
250
+ }
251
+
252
+ .theme-toggle:hover {
253
+ background: var(--bg-surface-hover);
254
+ border-color: var(--accent-dim);
255
+ color: var(--accent);
256
+ }
257
+
258
+ .theme-toggle-icon {
259
+ display: inline-block;
260
+ }
261
+
262
+ /* ─── Summary Bar ──────────────────────────────────────────────────────── */
263
+
264
+ .summary-bar {
265
+ display: flex;
266
+ align-items: center;
267
+ gap: 16px;
268
+ padding: 12px 16px;
269
+ background: var(--bg-surface);
270
+ border: 1px solid var(--border);
271
+ border-radius: var(--radius);
272
+ flex-wrap: wrap;
273
+ }
274
+
275
+ .summary-progress {
276
+ display: flex;
277
+ align-items: center;
278
+ gap: 10px;
279
+ flex-shrink: 0;
280
+ }
281
+
282
+ .progress-bar-bg {
283
+ width: 280px;
284
+ height: 18px;
285
+ background: var(--bg-inset);
286
+ border-radius: 4px;
287
+ overflow: hidden;
288
+ display: flex;
289
+ position: relative;
290
+ }
291
+
292
+ /* Individual wave segment within the segmented bar */
293
+ .wave-seg {
294
+ position: relative;
295
+ height: 100%;
296
+ overflow: hidden;
297
+ border-right: 1px solid var(--wave-seg-border);
298
+ }
299
+ .wave-seg:last-child { border-right: none; }
300
+
301
+ /* The filled portion within each segment */
302
+ .wave-seg-fill {
303
+ height: 100%;
304
+ transition: width 0.5s ease, background-color 0.5s ease;
305
+ }
306
+ .wave-seg-fill.pct-0 { background: transparent; }
307
+ .wave-seg-fill.pct-low { background: var(--yellow); }
308
+ .wave-seg-fill.pct-mid { background: var(--cyan); }
309
+ .wave-seg-fill.pct-hi { background: var(--green); }
310
+
311
+ /* Wave label centered in each segment */
312
+ .wave-seg-label {
313
+ position: absolute;
314
+ top: 0; left: 0; right: 0; bottom: 0;
315
+ display: flex;
316
+ align-items: center;
317
+ justify-content: center;
318
+ font-size: 0.6rem;
319
+ font-weight: 700;
320
+ letter-spacing: 0.03em;
321
+ color: var(--wave-label-color);
322
+ pointer-events: none;
323
+ text-shadow: var(--wave-label-shadow);
324
+ }
325
+
326
+ /* Highlight the active wave segment */
327
+ .wave-seg-current { box-shadow: inset 0 0 0 1px var(--accent); }
328
+
329
+ /* Future waves: visible but subdued */
330
+ .wave-seg-future {
331
+ background: var(--wave-future-bg);
332
+ }
333
+ .wave-seg-future .wave-seg-label {
334
+ color: var(--wave-future-label);
335
+ text-shadow: none;
336
+ }
337
+
338
+ /* Legacy single-bar fill (still used by per-task progress bars) */
339
+ .progress-bar-fill {
340
+ height: 100%;
341
+ border-radius: 4px;
342
+ transition: width 0.5s ease, background-color 0.5s ease;
343
+ }
344
+ .progress-bar-fill.pct-0 { background: var(--text-faint); }
345
+ .progress-bar-fill.pct-low { background: var(--yellow); }
346
+ .progress-bar-fill.pct-mid { background: var(--cyan); }
347
+ .progress-bar-fill.pct-hi { background: var(--green); }
348
+
349
+ .summary-pct {
350
+ font-family: var(--font-mono);
351
+ font-size: 0.95rem;
352
+ font-weight: 600;
353
+ min-width: 38px;
354
+ }
355
+
356
+ .summary-counts {
357
+ display: flex;
358
+ gap: 10px;
359
+ font-family: var(--font-mono);
360
+ font-size: 0.85rem;
361
+ }
362
+
363
+ .count-chip {
364
+ display: inline-flex;
365
+ align-items: center;
366
+ gap: 4px;
367
+ padding: 2px 10px;
368
+ border-radius: 10px;
369
+ font-weight: 500;
370
+ margin-right: 4px;
371
+ }
372
+ .count-num { font-variant-numeric: tabular-nums; }
373
+ .count-icon { font-size: 0.85em; opacity: 0.9; }
374
+ .count-total { color: var(--text-faint); margin-left: 2px; }
375
+
376
+ .count-succeeded { background: var(--badge-succeeded-bg); color: var(--green); }
377
+ .count-running { background: var(--badge-running-bg); color: var(--accent); }
378
+ .count-failed { background: var(--badge-failed-bg); color: var(--red); }
379
+ .count-stalled { background: var(--badge-stalled-bg); color: var(--yellow); }
380
+ .count-pending { background: var(--badge-pending-bg); color: var(--text-muted); }
381
+
382
+ .summary-elapsed {
383
+ color: var(--text-muted);
384
+ font-size: 0.8rem;
385
+ font-family: var(--font-mono);
386
+ }
387
+
388
+ .summary-waves {
389
+ display: flex;
390
+ align-items: center;
391
+ gap: 6px;
392
+ font-size: 0.8rem;
393
+ }
394
+
395
+ .wave-chip {
396
+ padding: 2px 8px;
397
+ border-radius: 10px;
398
+ font-family: var(--font-mono);
399
+ font-size: 0.75rem;
400
+ font-weight: 500;
401
+ border: 1px solid var(--border);
402
+ color: var(--text-muted);
403
+ }
404
+
405
+ .wave-chip.current {
406
+ border-color: var(--accent-dim);
407
+ background: var(--badge-running-bg);
408
+ color: var(--accent);
409
+ font-weight: 700;
410
+ }
411
+
412
+ .wave-chip.done {
413
+ border-color: var(--green-dim);
414
+ background: var(--green-tint-active);
415
+ color: var(--green);
416
+ }
417
+
418
+ /* TP-178: Merging wave indicator — pulsing accent to distinguish from executing (#493) */
419
+ .wave-chip.merging {
420
+ animation: merge-pulse 1.5s ease-in-out infinite;
421
+ }
422
+
423
+ .wave-seg-merging {
424
+ animation: merge-pulse 1.5s ease-in-out infinite;
425
+ }
426
+
427
+ @keyframes merge-pulse {
428
+ 0%, 100% { opacity: 1; }
429
+ 50% { opacity: 0.5; }
430
+ }
431
+
432
+ /* ─── Content ──────────────────────────────────────────────────────────── */
433
+
434
+ .content {
435
+ display: flex;
436
+ flex-direction: column;
437
+ gap: 12px;
438
+ min-height: 0;
439
+ }
440
+
441
+ /* ─── Panels (shared) ──────────────────────────────────────────────────── */
442
+
443
+ .panel {
444
+ background: var(--bg-surface);
445
+ border: 1px solid var(--border);
446
+ border-radius: var(--radius);
447
+ overflow: hidden;
448
+ display: flex;
449
+ flex-direction: column;
450
+ }
451
+
452
+ .panel-header {
453
+ padding: 10px 14px;
454
+ font-size: 0.75rem;
455
+ font-weight: 600;
456
+ text-transform: uppercase;
457
+ letter-spacing: 0.06em;
458
+ color: var(--text-muted);
459
+ border-bottom: 1px solid var(--border);
460
+ background: var(--bg-surface);
461
+ }
462
+
463
+ .panel-body {
464
+ padding: 0;
465
+ flex: 1;
466
+ overflow-y: auto;
467
+ }
468
+
469
+ .empty-state {
470
+ padding: 24px;
471
+ text-align: center;
472
+ color: var(--text-faint);
473
+ font-size: 0.85rem;
474
+ }
475
+
476
+ /* ─── Lane Group (lane header + nested task rows) ──────────────────────── */
477
+
478
+ .lane-group {
479
+ border-bottom: 1px solid var(--border);
480
+ }
481
+
482
+ .lane-group:last-child { border-bottom: none; }
483
+
484
+ .lane-header {
485
+ display: grid;
486
+ grid-template-columns: 36px 1fr auto;
487
+ align-items: center;
488
+ gap: 12px;
489
+ padding: 10px 14px;
490
+ background: var(--bg-inset);
491
+ border-bottom: 1px solid var(--border-subtle);
492
+ }
493
+
494
+ .lane-num {
495
+ font-family: var(--font-mono);
496
+ font-size: 1rem;
497
+ font-weight: 700;
498
+ color: var(--text-muted);
499
+ text-align: center;
500
+ }
501
+
502
+ .lane-meta {
503
+ display: flex;
504
+ align-items: center;
505
+ gap: 10px;
506
+ min-width: 0;
507
+ }
508
+
509
+ .lane-session {
510
+ font-family: var(--font-mono);
511
+ font-size: 0.82rem;
512
+ color: var(--accent);
513
+ white-space: nowrap;
514
+ }
515
+
516
+ .lane-branch {
517
+ font-size: 0.72rem;
518
+ color: var(--text-muted);
519
+ white-space: nowrap;
520
+ overflow: hidden;
521
+ text-overflow: ellipsis;
522
+ }
523
+
524
+ .lane-segment {
525
+ display: inline-flex;
526
+ align-items: center;
527
+ gap: 4px;
528
+ font-family: var(--font-mono);
529
+ font-size: 0.68rem;
530
+ font-weight: 600;
531
+ padding: 2px 7px;
532
+ border-radius: 8px;
533
+ background: var(--badge-running-bg);
534
+ color: var(--accent);
535
+ max-width: 220px;
536
+ overflow: hidden;
537
+ text-overflow: ellipsis;
538
+ white-space: nowrap;
539
+ }
540
+
541
+ .lane-right {
542
+ display: flex;
543
+ align-items: center;
544
+ gap: 10px;
545
+ }
546
+
547
+ .session-dot {
548
+ width: 8px;
549
+ height: 8px;
550
+ border-radius: 50%;
551
+ flex-shrink: 0;
552
+ }
553
+
554
+ .session-dot.alive { background: var(--green); }
555
+ .session-dot.dead { background: var(--red); opacity: 0.6; }
556
+
557
+ .session-view-btn {
558
+ font-family: var(--font-sans);
559
+ font-size: 0.72rem;
560
+ font-weight: 600;
561
+ padding: 3px 10px;
562
+ border-radius: var(--radius-sm);
563
+ background: var(--accent-dim);
564
+ border: 1px solid var(--accent-dim);
565
+ color: var(--phase-on-color);
566
+ cursor: pointer;
567
+ white-space: nowrap;
568
+ transition: background 0.2s, border-color 0.2s;
569
+ }
570
+
571
+ .session-view-btn:hover {
572
+ background: var(--accent);
573
+ border-color: var(--accent);
574
+ }
575
+
576
+ .session-cmd {
577
+ font-family: var(--font-mono);
578
+ font-size: 0.7rem;
579
+ padding: 3px 8px;
580
+ border-radius: var(--radius-sm);
581
+ background: var(--bg);
582
+ border: 1px solid var(--border);
583
+ color: var(--text);
584
+ cursor: pointer;
585
+ user-select: all;
586
+ white-space: nowrap;
587
+ transition: border-color 0.2s, color 0.2s;
588
+ }
589
+
590
+ .session-cmd:hover {
591
+ border-color: var(--accent-dim);
592
+ color: var(--accent);
593
+ }
594
+
595
+ .session-cmd.copied {
596
+ border-color: var(--green-dim);
597
+ color: var(--green);
598
+ }
599
+
600
+ .session-cmd.dead-session {
601
+ color: var(--text-muted);
602
+ cursor: default;
603
+ }
604
+
605
+ /* ─── Task Row (inside lane group) ─────────────────────────────────────── */
606
+
607
+ .task-row {
608
+ display: grid;
609
+ grid-template-columns: 36px 24px 100px 90px 80px 200px 1fr;
610
+ align-items: center;
611
+ gap: 8px;
612
+ padding: 8px 14px;
613
+ border-bottom: 1px solid var(--border-subtle);
614
+ transition: background 0.15s;
615
+ }
616
+
617
+ .task-row:last-child { border-bottom: none; }
618
+ .task-row:hover { background: var(--bg-surface-hover); }
619
+
620
+ .task-icon {
621
+ text-align: center;
622
+ }
623
+
624
+ .task-id {
625
+ font-family: var(--font-mono);
626
+ font-weight: 600;
627
+ font-size: 0.85rem;
628
+ }
629
+
630
+ .task-duration {
631
+ font-family: var(--font-mono);
632
+ font-size: 0.8rem;
633
+ color: var(--text-muted);
634
+ }
635
+
636
+ .task-step {
637
+ font-size: 0.8rem;
638
+ color: var(--text-muted);
639
+ white-space: nowrap;
640
+ overflow: hidden;
641
+ text-overflow: ellipsis;
642
+ }
643
+
644
+ .task-segment-progress {
645
+ font-family: var(--font-mono);
646
+ color: var(--accent);
647
+ }
648
+
649
+ .task-packet-home {
650
+ font-family: var(--font-mono);
651
+ color: var(--magenta);
652
+ }
653
+
654
+ .task-detail-sep {
655
+ color: var(--text-faint);
656
+ margin: 0 2px;
657
+ }
658
+
659
+ .task-step-main {
660
+ color: var(--text-muted);
661
+ }
662
+
663
+ .task-iter {
664
+ font-family: var(--font-mono);
665
+ font-size: 0.7rem;
666
+ color: var(--text-faint);
667
+ margin-left: 6px;
668
+ }
669
+
670
+ /* Status badges */
671
+ .status-badge {
672
+ display: inline-flex;
673
+ align-items: center;
674
+ gap: 4px;
675
+ font-family: var(--font-mono);
676
+ font-size: 0.75rem;
677
+ font-weight: 600;
678
+ padding: 2px 8px;
679
+ border-radius: 10px;
680
+ }
681
+
682
+ .status-succeeded { background: var(--badge-succeeded-bg); color: var(--green); }
683
+ .status-running { background: var(--badge-running-bg); color: var(--accent); }
684
+ .status-failed { background: var(--badge-failed-bg); color: var(--red); }
685
+ .status-stalled { background: var(--badge-stalled-bg); color: var(--yellow); }
686
+ .status-pending { background: var(--badge-pending-bg); color: var(--text-muted); }
687
+ .status-skipped { background: var(--badge-skipped-bg); color: var(--text-faint); }
688
+
689
+ .status-dot {
690
+ width: 6px;
691
+ height: 6px;
692
+ border-radius: 50%;
693
+ display: inline-block;
694
+ }
695
+
696
+ .status-dot.succeeded { background: var(--green); }
697
+ .status-dot.running { background: var(--accent); }
698
+ .status-dot.failed { background: var(--red); }
699
+ .status-dot.stalled { background: var(--yellow); }
700
+ .status-dot.pending { background: var(--text-faint); }
701
+ .status-dot.skipped { background: var(--text-faint); }
702
+
703
+ /* Task progress bar (inline) */
704
+ .task-progress {
705
+ display: flex;
706
+ align-items: center;
707
+ gap: 8px;
708
+ }
709
+
710
+ .task-progress-bar {
711
+ width: 80px;
712
+ height: 6px;
713
+ background: var(--bg-inset);
714
+ border-radius: 3px;
715
+ overflow: hidden;
716
+ flex-shrink: 0;
717
+ }
718
+
719
+ .task-progress-fill {
720
+ height: 100%;
721
+ border-radius: 3px;
722
+ transition: width 0.5s ease;
723
+ }
724
+
725
+ .task-progress-fill.pct-0 { background: var(--text-faint); }
726
+ .task-progress-fill.pct-low { background: var(--yellow); }
727
+ .task-progress-fill.pct-mid { background: var(--cyan); }
728
+ .task-progress-fill.pct-hi { background: var(--green); }
729
+
730
+ /* TP-178: Pulsing indicator for executing tasks without sidecar progress (#494) */
731
+ .task-progress-executing {
732
+ opacity: 0.4;
733
+ animation: executing-pulse 2s ease-in-out infinite;
734
+ }
735
+ @keyframes executing-pulse {
736
+ 0%, 100% { opacity: 0.25; }
737
+ 50% { opacity: 0.55; }
738
+ }
739
+
740
+ .task-progress-text {
741
+ font-family: var(--font-mono);
742
+ font-size: 0.75rem;
743
+ color: var(--text-muted);
744
+ min-width: 55px;
745
+ }
746
+
747
+ /* ─── Merge Agents Table ───────────────────────────────────────────────── */
748
+
749
+ .merge-table {
750
+ width: 100%;
751
+ border-collapse: collapse;
752
+ }
753
+
754
+ .merge-table th {
755
+ text-align: left;
756
+ padding: 8px 12px;
757
+ font-size: 0.7rem;
758
+ font-weight: 600;
759
+ text-transform: uppercase;
760
+ letter-spacing: 0.05em;
761
+ color: var(--text-faint);
762
+ border-bottom: 1px solid var(--border);
763
+ background: var(--bg-surface);
764
+ }
765
+
766
+ .merge-table td {
767
+ padding: 8px 12px;
768
+ border-bottom: 1px solid var(--border-subtle);
769
+ font-size: 0.85rem;
770
+ }
771
+
772
+ .merge-table tr:last-child td { border-bottom: none; }
773
+ .merge-table tr:hover td { background: var(--bg-surface-hover); }
774
+
775
+ .merge-wave-cell { font-family: var(--font-mono); }
776
+ .merge-session-cell { font-family: var(--font-mono); font-size: 0.8rem; }
777
+ .merge-detail-cell { font-size: 0.8rem; color: var(--text-muted); }
778
+ .merge-no-data { color: var(--text-faint); }
779
+
780
+ .merge-stats {
781
+ display: flex;
782
+ flex-wrap: wrap;
783
+ gap: 4px 8px;
784
+ align-items: center;
785
+ font-size: 0.75rem;
786
+ }
787
+
788
+ .merge-telemetry-cell {
789
+ font-size: 0.75rem;
790
+ min-width: 120px;
791
+ }
792
+
793
+ /* ─── Terminal Panel ────────────────────────────────────────────────────── */
794
+
795
+ .terminal-panel .panel-header {
796
+ display: flex;
797
+ align-items: center;
798
+ justify-content: space-between;
799
+ }
800
+
801
+ .terminal-close {
802
+ background: none;
803
+ border: 1px solid var(--border);
804
+ color: var(--text-muted);
805
+ font-size: 0.85rem;
806
+ cursor: pointer;
807
+ padding: 2px 8px;
808
+ border-radius: var(--radius-sm);
809
+ transition: color 0.2s, border-color 0.2s;
810
+ }
811
+
812
+ .terminal-close:hover {
813
+ color: var(--red);
814
+ border-color: var(--red-dim);
815
+ }
816
+
817
+ .terminal-panel .panel-body {
818
+ max-height: 500px;
819
+ padding: 0;
820
+ background: var(--bg-inset);
821
+ overflow-y: auto;
822
+ }
823
+
824
+ /* ─── Worker Stats (inline in task row) ────────────────────────────────── */
825
+
826
+ .worker-stats {
827
+ display: flex;
828
+ align-items: center;
829
+ gap: 10px;
830
+ margin-top: 4px;
831
+ flex-wrap: wrap;
832
+ }
833
+
834
+ .worker-stat {
835
+ font-family: var(--font-mono);
836
+ font-size: 0.7rem;
837
+ color: var(--text-muted);
838
+ white-space: nowrap;
839
+ }
840
+
841
+ .worker-last-tool {
842
+ color: var(--text-muted);
843
+ max-width: 600px;
844
+ overflow-wrap: break-word;
845
+ word-break: break-all;
846
+ white-space: normal;
847
+ }
848
+
849
+ /* ─── Reviewer Sub-Row ─────────────────────────────────────────────── */
850
+
851
+ .reviewer-sub-row {
852
+ background: var(--bg-surface-hover);
853
+ border-left: 3px solid var(--yellow);
854
+ padding-left: 11px; /* compensate for border */
855
+ font-size: 0.85em;
856
+ }
857
+
858
+ .reviewer-sub-row .reviewer-label {
859
+ font-family: var(--font-mono);
860
+ font-size: 0.75rem;
861
+ color: var(--yellow);
862
+ font-weight: 600;
863
+ }
864
+
865
+ .reviewer-sub-row .reviewer-type {
866
+ font-family: var(--font-mono);
867
+ font-size: 0.7rem;
868
+ color: var(--text-muted);
869
+ }
870
+
871
+ .reviewer-stats {
872
+ margin-top: 0;
873
+ }
874
+
875
+ /* ─── Telemetry Badges (retry, compaction) ─────────────────────────────── */
876
+
877
+ .telem-badge {
878
+ display: inline-flex;
879
+ align-items: center;
880
+ gap: 3px;
881
+ font-family: var(--font-mono);
882
+ font-size: 0.65rem;
883
+ font-weight: 500;
884
+ padding: 1px 7px;
885
+ border-radius: 8px;
886
+ white-space: nowrap;
887
+ margin-left: 4px;
888
+ }
889
+
890
+ .telem-retry {
891
+ background: var(--badge-stalled-bg);
892
+ color: var(--yellow);
893
+ }
894
+
895
+ .telem-retry-active {
896
+ background: var(--yellow-tint-active);
897
+ color: var(--yellow);
898
+ animation: pulse 1.5s infinite;
899
+ }
900
+
901
+ .telem-compaction {
902
+ background: var(--magenta-tint);
903
+ color: var(--magenta);
904
+ }
905
+
906
+ /* ─── Conversation Viewer ──────────────────────────────────────────────── */
907
+
908
+ .conv-stream {
909
+ padding: 12px 16px;
910
+ font-family: var(--font-mono);
911
+ font-size: 0.82rem;
912
+ line-height: 1.6;
913
+ white-space: pre-wrap;
914
+ word-break: break-word;
915
+ }
916
+
917
+ .conv-text {
918
+ color: var(--text);
919
+ }
920
+
921
+ .conv-thinking {
922
+ color: var(--text-faint);
923
+ font-style: italic;
924
+ }
925
+
926
+ .conv-tool-call {
927
+ margin: 8px 0 4px;
928
+ padding: 6px 10px;
929
+ background: var(--accent-tint-bg);
930
+ border-left: 3px solid var(--accent-dim);
931
+ border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
932
+ }
933
+
934
+ .conv-tool-name {
935
+ color: var(--accent);
936
+ font-weight: 600;
937
+ }
938
+
939
+ .conv-tool-args {
940
+ color: var(--text-muted);
941
+ font-size: 0.75rem;
942
+ }
943
+
944
+ .conv-tool-result {
945
+ margin: 0 0 8px;
946
+ padding: 6px 10px;
947
+ background: var(--bg-inset);
948
+ border-left: 3px solid var(--border);
949
+ border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
950
+ max-height: 200px;
951
+ overflow-y: auto;
952
+ }
953
+
954
+ .conv-tool-result pre {
955
+ margin: 0;
956
+ font-size: 0.75rem;
957
+ color: var(--text-muted);
958
+ white-space: pre-wrap;
959
+ }
960
+
961
+ .conv-usage {
962
+ margin: 6px 0;
963
+ padding: 4px 10px;
964
+ font-size: 0.7rem;
965
+ color: var(--text-faint);
966
+ border-top: 1px solid var(--border-subtle);
967
+ }
968
+
969
+ .conv-empty {
970
+ padding: 40px;
971
+ text-align: center;
972
+ color: var(--text-faint);
973
+ }
974
+
975
+ /* ─── Viewer Eye Button (task row) ─────────────────────────────────────── */
976
+
977
+ .task-actions {
978
+ display: flex;
979
+ align-items: center;
980
+ justify-content: center;
981
+ }
982
+
983
+ .viewer-eye-btn {
984
+ background: none;
985
+ border: none;
986
+ cursor: pointer;
987
+ font-size: 0.85rem;
988
+ padding: 3px 5px;
989
+ border-radius: var(--radius-sm);
990
+ opacity: 1;
991
+ transition: opacity 0.2s, background 0.2s, color 0.2s, box-shadow 0.2s;
992
+ line-height: 1;
993
+ color: var(--text-muted);
994
+ }
995
+
996
+ .viewer-eye-btn:hover {
997
+ opacity: 1;
998
+ background: var(--accent-tint-hover);
999
+ color: var(--accent);
1000
+ }
1001
+
1002
+ .viewer-eye-btn.active {
1003
+ opacity: 1;
1004
+ background: var(--accent-tint-active);
1005
+ color: var(--accent);
1006
+ box-shadow: 0 0 0 1px var(--accent-dim);
1007
+ }
1008
+
1009
+ .session-view-btn.active {
1010
+ background: var(--accent);
1011
+ border-color: var(--accent);
1012
+ }
1013
+
1014
+ /* ─── Viewer Controls (auto-scroll checkbox + close) ───────────────────── */
1015
+
1016
+ .terminal-controls {
1017
+ display: flex;
1018
+ align-items: center;
1019
+ gap: 12px;
1020
+ }
1021
+
1022
+ .auto-scroll-label {
1023
+ display: flex;
1024
+ align-items: center;
1025
+ gap: 6px;
1026
+ cursor: pointer;
1027
+ font-size: 0.75rem;
1028
+ color: var(--text-muted);
1029
+ user-select: none;
1030
+ white-space: nowrap;
1031
+ }
1032
+
1033
+ .auto-scroll-label input[type="checkbox"] {
1034
+ appearance: none;
1035
+ -webkit-appearance: none;
1036
+ width: 14px;
1037
+ height: 14px;
1038
+ border: 1px solid var(--border);
1039
+ border-radius: 3px;
1040
+ background: var(--bg-inset);
1041
+ cursor: pointer;
1042
+ position: relative;
1043
+ flex-shrink: 0;
1044
+ }
1045
+
1046
+ .auto-scroll-label input[type="checkbox"]:checked {
1047
+ background: var(--accent-dim);
1048
+ border-color: var(--accent);
1049
+ }
1050
+
1051
+ .auto-scroll-label input[type="checkbox"]:checked::after {
1052
+ content: '✓';
1053
+ position: absolute;
1054
+ top: -1px;
1055
+ left: 2px;
1056
+ font-size: 11px;
1057
+ color: var(--phase-on-color);
1058
+ }
1059
+
1060
+ /* ─── STATUS.md Rendered Content ───────────────────────────────────────── */
1061
+
1062
+ .status-md-content {
1063
+ padding: 12px 16px;
1064
+ font-family: var(--font-sans);
1065
+ font-size: 0.85rem;
1066
+ line-height: 1.6;
1067
+ }
1068
+
1069
+ .status-md-h1 {
1070
+ font-size: 1.15rem;
1071
+ font-weight: 700;
1072
+ color: var(--text);
1073
+ margin: 16px 0 8px;
1074
+ padding-bottom: 4px;
1075
+ border-bottom: 1px solid var(--border-subtle);
1076
+ }
1077
+
1078
+ .status-md-h1:first-child { margin-top: 0; }
1079
+
1080
+ .status-md-h2 {
1081
+ font-size: 1rem;
1082
+ font-weight: 600;
1083
+ color: var(--text);
1084
+ margin: 14px 0 6px;
1085
+ }
1086
+
1087
+ .status-md-h3 {
1088
+ font-size: 0.9rem;
1089
+ font-weight: 600;
1090
+ color: var(--text-muted);
1091
+ margin: 12px 0 4px;
1092
+ }
1093
+
1094
+ .status-md-h4 {
1095
+ font-size: 0.85rem;
1096
+ font-weight: 600;
1097
+ color: var(--text-muted);
1098
+ margin: 10px 0 4px;
1099
+ }
1100
+
1101
+ .status-md-check {
1102
+ display: flex;
1103
+ align-items: flex-start;
1104
+ gap: 8px;
1105
+ padding: 3px 8px;
1106
+ border-radius: var(--radius-sm);
1107
+ border-left: 2px solid transparent;
1108
+ transition: background 0.2s, border-color 0.2s;
1109
+ }
1110
+
1111
+ .status-md-check.checked {
1112
+ color: var(--text-muted);
1113
+ }
1114
+
1115
+ .status-md-check.checked .check-box {
1116
+ color: var(--green);
1117
+ }
1118
+
1119
+ .status-md-check.unchecked {
1120
+ color: var(--text);
1121
+ }
1122
+
1123
+ .status-md-check.unchecked .check-box {
1124
+ color: var(--text-faint);
1125
+ }
1126
+
1127
+ .check-box {
1128
+ flex-shrink: 0;
1129
+ font-size: 0.85rem;
1130
+ line-height: 1.6;
1131
+ }
1132
+
1133
+ /* Progress frontier highlight — only when tracking is active */
1134
+ .status-md-content.tracking .status-md-check.last-checked {
1135
+ border-left-color: var(--accent);
1136
+ background: var(--accent-tint-subtle);
1137
+ }
1138
+
1139
+ .status-md-li {
1140
+ padding: 2px 8px;
1141
+ color: var(--text);
1142
+ }
1143
+
1144
+ .status-md-text {
1145
+ padding: 2px 8px;
1146
+ color: var(--text);
1147
+ }
1148
+
1149
+ .status-md-spacer {
1150
+ height: 8px;
1151
+ }
1152
+
1153
+ .status-md-code {
1154
+ font-family: var(--font-mono);
1155
+ font-size: 0.8rem;
1156
+ padding: 1px 5px;
1157
+ background: var(--bg-surface);
1158
+ border: 1px solid var(--border-subtle);
1159
+ border-radius: 3px;
1160
+ color: var(--accent);
1161
+ }
1162
+
1163
+ /* ─── Errors Panel ─────────────────────────────────────────────────────── */
1164
+
1165
+ .errors-panel .panel-header { color: var(--red); }
1166
+
1167
+ .error-item {
1168
+ padding: 8px 14px;
1169
+ font-family: var(--font-mono);
1170
+ font-size: 0.78rem;
1171
+ color: var(--red);
1172
+ border-bottom: 1px solid var(--border-subtle);
1173
+ display: flex;
1174
+ align-items: flex-start;
1175
+ gap: 8px;
1176
+ }
1177
+
1178
+ .error-item:last-child { border-bottom: none; }
1179
+ .error-bullet { flex-shrink: 0; margin-top: 2px; }
1180
+ .error-text { word-break: break-word; }
1181
+
1182
+ /* ─── Footer ───────────────────────────────────────────────────────────── */
1183
+
1184
+ .footer {
1185
+ display: flex;
1186
+ align-items: center;
1187
+ justify-content: space-between;
1188
+ padding: 8px 4px;
1189
+ font-size: 0.75rem;
1190
+ color: var(--text-faint);
1191
+ }
1192
+
1193
+ /* ─── No Batch State ───────────────────────────────────────────────────── */
1194
+
1195
+ .no-batch {
1196
+ display: flex;
1197
+ flex-direction: column;
1198
+ align-items: center;
1199
+ justify-content: center;
1200
+ gap: 12px;
1201
+ padding: 80px 20px;
1202
+ text-align: center;
1203
+ }
1204
+
1205
+ .no-batch-icon { font-size: 3rem; opacity: 0.3; }
1206
+ .no-batch-title { font-size: 1.1rem; font-weight: 600; color: var(--text-muted); }
1207
+ .no-batch-hint { font-size: 0.85rem; color: var(--text-faint); font-family: var(--font-mono); }
1208
+
1209
+ /* ─── Responsive ───────────────────────────────────────────────────────── */
1210
+
1211
+ @media (max-width: 900px) {
1212
+ .task-row {
1213
+ grid-template-columns: 36px 24px 90px 80px 70px 1fr;
1214
+ }
1215
+ .task-row .task-step { display: none; }
1216
+ .progress-bar-bg { width: 160px; }
1217
+ }
1218
+
1219
+ /* ─── Repo Filter & Badges ─────────────────────────────────────────────── */
1220
+
1221
+ .repo-filter-select {
1222
+ background: var(--bg-surface);
1223
+ border: 1px solid var(--border);
1224
+ color: var(--text-muted);
1225
+ font-family: var(--font-mono);
1226
+ font-size: 0.8rem;
1227
+ padding: 3px 8px;
1228
+ border-radius: 8px;
1229
+ cursor: pointer;
1230
+ max-width: 220px;
1231
+ }
1232
+ .repo-filter-select:hover {
1233
+ border-color: var(--accent);
1234
+ color: var(--text);
1235
+ }
1236
+ .repo-filter-select:focus {
1237
+ outline: none;
1238
+ border-color: var(--accent);
1239
+ }
1240
+
1241
+ .repo-badge {
1242
+ display: inline-flex;
1243
+ align-items: center;
1244
+ gap: 4px;
1245
+ font-family: var(--font-mono);
1246
+ font-size: 0.68rem;
1247
+ font-weight: 500;
1248
+ padding: 1px 7px;
1249
+ border-radius: 8px;
1250
+ background: var(--magenta-tint-bg);
1251
+ color: var(--magenta);
1252
+ white-space: nowrap;
1253
+ max-width: 140px;
1254
+ overflow: hidden;
1255
+ text-overflow: ellipsis;
1256
+ }
1257
+
1258
+ .repo-badge-lane {
1259
+ margin-left: 8px;
1260
+ }
1261
+
1262
+ .repo-badge-task {
1263
+ margin-left: 4px;
1264
+ }
1265
+
1266
+ /* Merge repo sub-rows */
1267
+ .merge-repo-row td {
1268
+ padding: 4px 12px 4px 28px !important;
1269
+ font-size: 0.78rem !important;
1270
+ color: var(--text-muted);
1271
+ border-bottom: 1px solid var(--border-subtle);
1272
+ }
1273
+
1274
+ .merge-repo-row td:first-child {
1275
+ padding-left: 28px !important;
1276
+ }
1277
+
1278
+ .merge-repo-row:last-child td {
1279
+ border-bottom: none;
1280
+ }
1281
+
1282
+ /* ─── Supervisor Panel ──────────────────────────────────────────────────── */
1283
+
1284
+ .supervisor-panel {
1285
+ border-color: var(--border);
1286
+ }
1287
+
1288
+ .supervisor-panel-header {
1289
+ display: flex;
1290
+ align-items: center;
1291
+ gap: 10px;
1292
+ cursor: pointer;
1293
+ user-select: none;
1294
+ }
1295
+
1296
+ .supervisor-panel-header:hover {
1297
+ background: var(--bg-surface-hover);
1298
+ }
1299
+
1300
+ .supervisor-collapse-btn {
1301
+ margin-left: auto;
1302
+ background: none;
1303
+ border: none;
1304
+ color: var(--text-muted);
1305
+ font-size: 0.9rem;
1306
+ cursor: pointer;
1307
+ padding: 0 4px;
1308
+ line-height: 1;
1309
+ }
1310
+
1311
+ .supervisor-collapse-btn:hover {
1312
+ color: var(--text);
1313
+ }
1314
+
1315
+ .supervisor-panel-body {
1316
+ padding: 0;
1317
+ }
1318
+
1319
+ .supervisor-section {
1320
+ padding: 0;
1321
+ }
1322
+
1323
+ .supervisor-section:empty {
1324
+ display: none;
1325
+ }
1326
+
1327
+ /* Supervisor status badge (in panel header) */
1328
+ .supervisor-status-badge {
1329
+ font-family: var(--font-mono);
1330
+ font-size: 0.7rem;
1331
+ font-weight: 600;
1332
+ padding: 2px 8px;
1333
+ border-radius: 10px;
1334
+ text-transform: uppercase;
1335
+ letter-spacing: 0.04em;
1336
+ }
1337
+
1338
+ .supervisor-status-badge.supervisor-active {
1339
+ background: var(--badge-succeeded-bg);
1340
+ color: var(--green);
1341
+ }
1342
+
1343
+ .supervisor-status-badge.supervisor-stale {
1344
+ background: var(--badge-stalled-bg);
1345
+ color: var(--yellow);
1346
+ }
1347
+
1348
+ .supervisor-status-badge.supervisor-inactive {
1349
+ background: var(--badge-pending-bg);
1350
+ color: var(--text-muted);
1351
+ }
1352
+
1353
+ /* Status row inside the panel */
1354
+ .supervisor-status-row {
1355
+ display: flex;
1356
+ align-items: center;
1357
+ gap: 10px;
1358
+ padding: 10px 14px;
1359
+ border-bottom: 1px solid var(--border-subtle);
1360
+ flex-wrap: wrap;
1361
+ }
1362
+
1363
+ .supervisor-status-dot {
1364
+ width: 8px;
1365
+ height: 8px;
1366
+ border-radius: 50%;
1367
+ flex-shrink: 0;
1368
+ }
1369
+
1370
+ .supervisor-status-dot.supervisor-active {
1371
+ background: var(--green);
1372
+ animation: pulse 2s infinite;
1373
+ }
1374
+
1375
+ .supervisor-status-dot.supervisor-stale {
1376
+ background: var(--yellow);
1377
+ }
1378
+
1379
+ .supervisor-status-dot.supervisor-inactive {
1380
+ background: var(--text-faint);
1381
+ }
1382
+
1383
+ .supervisor-status-label {
1384
+ font-weight: 600;
1385
+ font-size: 0.85rem;
1386
+ }
1387
+
1388
+ .supervisor-autonomy-badge {
1389
+ font-family: var(--font-mono);
1390
+ font-size: 0.7rem;
1391
+ font-weight: 500;
1392
+ padding: 1px 7px;
1393
+ border-radius: 8px;
1394
+ background: var(--magenta-tint-bg);
1395
+ color: var(--magenta);
1396
+ }
1397
+
1398
+ .supervisor-heartbeat {
1399
+ font-family: var(--font-mono);
1400
+ font-size: 0.75rem;
1401
+ color: var(--text-muted);
1402
+ }
1403
+
1404
+ .supervisor-session-id {
1405
+ font-family: var(--font-mono);
1406
+ font-size: 0.72rem;
1407
+ color: var(--text-faint);
1408
+ overflow: hidden;
1409
+ text-overflow: ellipsis;
1410
+ max-width: 200px;
1411
+ white-space: nowrap;
1412
+ }
1413
+
1414
+ /* Subsection titles */
1415
+ .supervisor-subsection-title {
1416
+ font-size: 0.72rem;
1417
+ font-weight: 600;
1418
+ text-transform: uppercase;
1419
+ letter-spacing: 0.05em;
1420
+ color: var(--text-faint);
1421
+ padding: 8px 14px 4px;
1422
+ border-top: 1px solid var(--border-subtle);
1423
+ }
1424
+
1425
+ /* ── Conversation List ─────────────────────────────────────────────────── */
1426
+
1427
+ .supervisor-conversation-list {
1428
+ max-height: 250px;
1429
+ overflow-y: auto;
1430
+ padding: 4px 14px 8px;
1431
+ }
1432
+
1433
+ .supervisor-conv-entry {
1434
+ padding: 6px 10px;
1435
+ margin-bottom: 4px;
1436
+ border-radius: var(--radius-sm);
1437
+ font-size: 0.82rem;
1438
+ }
1439
+
1440
+ .supervisor-conv-entry.conv-role-operator {
1441
+ background: var(--accent-tint-subtle);
1442
+ border-left: 3px solid var(--accent-dim);
1443
+ }
1444
+
1445
+ .supervisor-conv-entry.conv-role-supervisor {
1446
+ background: var(--green-tint-bg);
1447
+ border-left: 3px solid var(--green-dim);
1448
+ }
1449
+
1450
+ .supervisor-conv-header {
1451
+ display: flex;
1452
+ align-items: center;
1453
+ gap: 8px;
1454
+ margin-bottom: 2px;
1455
+ }
1456
+
1457
+ .supervisor-conv-role {
1458
+ font-weight: 600;
1459
+ font-size: 0.75rem;
1460
+ text-transform: uppercase;
1461
+ letter-spacing: 0.04em;
1462
+ }
1463
+
1464
+ .conv-role-operator .supervisor-conv-role { color: var(--accent); }
1465
+ .conv-role-supervisor .supervisor-conv-role { color: var(--green); }
1466
+
1467
+ .supervisor-conv-time {
1468
+ font-family: var(--font-mono);
1469
+ font-size: 0.68rem;
1470
+ color: var(--text-faint);
1471
+ }
1472
+
1473
+ .supervisor-conv-content {
1474
+ color: var(--text);
1475
+ line-height: 1.5;
1476
+ white-space: pre-wrap;
1477
+ word-break: break-word;
1478
+ }
1479
+
1480
+ /* ── Recovery Actions Timeline ─────────────────────────────────────────── */
1481
+
1482
+ .supervisor-timeline {
1483
+ max-height: 300px;
1484
+ overflow-y: auto;
1485
+ padding: 4px 14px 8px;
1486
+ }
1487
+
1488
+ .supervisor-action-entry {
1489
+ display: flex;
1490
+ gap: 10px;
1491
+ padding: 6px 0;
1492
+ border-bottom: 1px solid var(--border-subtle);
1493
+ }
1494
+
1495
+ .supervisor-action-entry:last-child {
1496
+ border-bottom: none;
1497
+ }
1498
+
1499
+ .supervisor-action-left {
1500
+ display: flex;
1501
+ flex-direction: column;
1502
+ align-items: center;
1503
+ gap: 4px;
1504
+ min-width: 60px;
1505
+ flex-shrink: 0;
1506
+ }
1507
+
1508
+ .supervisor-action-time {
1509
+ font-family: var(--font-mono);
1510
+ font-size: 0.68rem;
1511
+ color: var(--text-faint);
1512
+ white-space: nowrap;
1513
+ }
1514
+
1515
+ .supervisor-action-dot {
1516
+ width: 8px;
1517
+ height: 8px;
1518
+ border-radius: 50%;
1519
+ }
1520
+
1521
+ .supervisor-action-dot.action-success { background: var(--green); }
1522
+ .supervisor-action-dot.action-failed { background: var(--red); }
1523
+ .supervisor-action-dot.action-pending { background: var(--yellow); }
1524
+
1525
+ .supervisor-action-right {
1526
+ flex: 1;
1527
+ min-width: 0;
1528
+ }
1529
+
1530
+ .supervisor-action-header {
1531
+ display: flex;
1532
+ align-items: center;
1533
+ gap: 6px;
1534
+ flex-wrap: wrap;
1535
+ }
1536
+
1537
+ .supervisor-action-tier {
1538
+ font-family: var(--font-mono);
1539
+ font-size: 0.68rem;
1540
+ font-weight: 700;
1541
+ padding: 1px 5px;
1542
+ border-radius: 4px;
1543
+ background: var(--magenta-tint-bg);
1544
+ color: var(--magenta);
1545
+ }
1546
+
1547
+ .supervisor-action-type {
1548
+ font-weight: 600;
1549
+ font-size: 0.82rem;
1550
+ color: var(--text);
1551
+ }
1552
+
1553
+ .supervisor-action-target {
1554
+ font-family: var(--font-mono);
1555
+ font-size: 0.75rem;
1556
+ color: var(--text-muted);
1557
+ }
1558
+
1559
+ .supervisor-action-outcome {
1560
+ font-family: var(--font-mono);
1561
+ font-size: 0.7rem;
1562
+ font-weight: 600;
1563
+ padding: 1px 6px;
1564
+ border-radius: 8px;
1565
+ }
1566
+
1567
+ .supervisor-action-outcome.action-success {
1568
+ background: var(--badge-succeeded-bg);
1569
+ color: var(--green);
1570
+ }
1571
+
1572
+ .supervisor-action-outcome.action-failed {
1573
+ background: var(--badge-failed-bg);
1574
+ color: var(--red);
1575
+ }
1576
+
1577
+ .supervisor-action-outcome.action-pending {
1578
+ background: var(--badge-stalled-bg);
1579
+ color: var(--yellow);
1580
+ }
1581
+
1582
+ .supervisor-action-description {
1583
+ font-size: 0.8rem;
1584
+ color: var(--text-secondary, #b0b0b0);
1585
+ margin-top: 3px;
1586
+ line-height: 1.4;
1587
+ overflow: hidden;
1588
+ text-overflow: ellipsis;
1589
+ white-space: nowrap;
1590
+ max-width: 600px;
1591
+ cursor: default;
1592
+ }
1593
+
1594
+ .supervisor-action-reason {
1595
+ font-size: 0.78rem;
1596
+ color: var(--text-muted);
1597
+ margin-top: 2px;
1598
+ line-height: 1.4;
1599
+ }
1600
+
1601
+ /* ── Batch Summary ─────────────────────────────────────────────────────── */
1602
+
1603
+ .supervisor-summary-content {
1604
+ padding: 0 14px 8px;
1605
+ max-height: 300px;
1606
+ overflow-y: auto;
1607
+ }
1608
+
1609
+ .supervisor-summary-content .status-md-content {
1610
+ padding: 4px 0;
1611
+ }
1612
+
1613
+ /* ─── Scrollbar ────────────────────────────────────────────────────────── */
1614
+
1615
+ ::-webkit-scrollbar { width: 6px; }
1616
+ ::-webkit-scrollbar-track { background: transparent; }
1617
+ ::-webkit-scrollbar-thumb { background: var(--scrollbar-thumb); border-radius: 3px; }
1618
+ ::-webkit-scrollbar-thumb:hover { background: var(--scrollbar-thumb-hover); }
1619
+
1620
+ /* ─── Pulse animation ──────────────────────────────────────────────────── */
1621
+
1622
+ @keyframes pulse {
1623
+ 0%, 100% { opacity: 1; }
1624
+ 50% { opacity: 0.5; }
1625
+ }
1626
+
1627
+ .status-running .status-dot { animation: pulse 2s infinite; }
1628
+
1629
+ /* ─── Copy toast ───────────────────────────────────────────────────────── */
1630
+
1631
+ .copy-toast {
1632
+ position: fixed;
1633
+ bottom: 20px;
1634
+ right: 20px;
1635
+ background: var(--green-dim);
1636
+ color: var(--phase-on-color);
1637
+ padding: 8px 16px;
1638
+ border-radius: var(--radius);
1639
+ font-size: 0.8rem;
1640
+ font-family: var(--font-mono);
1641
+ opacity: 0;
1642
+ transform: translateY(8px);
1643
+ transition: opacity 0.2s, transform 0.2s;
1644
+ pointer-events: none;
1645
+ z-index: 100;
1646
+ }
1647
+
1648
+ .copy-toast.visible {
1649
+ opacity: 1;
1650
+ transform: translateY(0);
1651
+ }
1652
+
1653
+ /* ── History Dropdown ────────────────────────────────────────────────────── */
1654
+
1655
+ .history-select {
1656
+ background: var(--bg-surface);
1657
+ border: 1px solid var(--border);
1658
+ color: var(--text-muted);
1659
+ font-family: var(--font-mono);
1660
+ font-size: 0.8rem;
1661
+ padding: 3px 8px;
1662
+ border-radius: 8px;
1663
+ cursor: pointer;
1664
+ max-width: 260px;
1665
+ }
1666
+ .history-select:hover {
1667
+ border-color: var(--accent);
1668
+ color: var(--text-primary);
1669
+ }
1670
+ .history-select:focus {
1671
+ outline: none;
1672
+ border-color: var(--accent);
1673
+ }
1674
+
1675
+ /* ── History Summary Panel ───────────────────────────────────────────────── */
1676
+
1677
+ .history-panel .panel-body {
1678
+ padding: 16px;
1679
+ }
1680
+
1681
+ .history-header {
1682
+ display: flex;
1683
+ align-items: center;
1684
+ gap: 16px;
1685
+ margin-bottom: 16px;
1686
+ flex-wrap: wrap;
1687
+ }
1688
+
1689
+ .history-header .batch-id {
1690
+ font-family: var(--font-mono);
1691
+ font-size: 1.1rem;
1692
+ font-weight: 700;
1693
+ color: var(--accent);
1694
+ }
1695
+
1696
+ .history-header .batch-status {
1697
+ font-size: 0.85rem;
1698
+ padding: 2px 10px;
1699
+ border-radius: 12px;
1700
+ font-weight: 600;
1701
+ }
1702
+
1703
+ .history-header .batch-status.completed { background: var(--badge-succeeded-bg); color: var(--green); }
1704
+ .history-header .batch-status.partial { background: var(--badge-stalled-bg); color: var(--yellow); }
1705
+ .history-header .batch-status.failed { background: var(--badge-failed-bg); color: var(--red); }
1706
+ .history-header .batch-status.aborted { background: var(--badge-pending-bg); color: var(--text-muted); }
1707
+
1708
+ .history-header .batch-time {
1709
+ color: var(--text-muted);
1710
+ font-size: 0.85rem;
1711
+ }
1712
+
1713
+ .history-stats {
1714
+ display: grid;
1715
+ grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
1716
+ gap: 12px;
1717
+ margin-bottom: 16px;
1718
+ }
1719
+
1720
+ .stat-card {
1721
+ background: var(--bg-surface);
1722
+ border: 1px solid var(--border);
1723
+ border-radius: 8px;
1724
+ padding: 12px;
1725
+ text-align: center;
1726
+ }
1727
+
1728
+ .stat-card .stat-value {
1729
+ font-family: var(--font-mono);
1730
+ font-size: 1.3rem;
1731
+ font-weight: 700;
1732
+ color: var(--text-primary);
1733
+ }
1734
+
1735
+ .stat-card .stat-label {
1736
+ font-size: 0.75rem;
1737
+ color: var(--text-muted);
1738
+ margin-top: 2px;
1739
+ }
1740
+
1741
+ .stat-card.stat-tokens .stat-value {
1742
+ font-size: 0.95rem;
1743
+ color: var(--accent);
1744
+ }
1745
+
1746
+ .history-waves-table,
1747
+ .history-tasks-table {
1748
+ width: 100%;
1749
+ border-collapse: collapse;
1750
+ margin-bottom: 16px;
1751
+ }
1752
+
1753
+ .history-waves-table th,
1754
+ .history-tasks-table th {
1755
+ text-align: left;
1756
+ padding: 6px 10px;
1757
+ border-bottom: 1px solid var(--border);
1758
+ font-size: 0.75rem;
1759
+ color: var(--text-muted);
1760
+ text-transform: uppercase;
1761
+ letter-spacing: 0.05em;
1762
+ }
1763
+
1764
+ .history-waves-table td,
1765
+ .history-tasks-table td {
1766
+ padding: 6px 10px;
1767
+ border-bottom: 1px solid var(--border-table-subtle);
1768
+ font-family: var(--font-mono);
1769
+ font-size: 0.85rem;
1770
+ color: var(--text-muted);
1771
+ }
1772
+
1773
+ .history-section-title {
1774
+ font-size: 0.9rem;
1775
+ font-weight: 600;
1776
+ color: var(--text-primary);
1777
+ margin: 16px 0 8px;
1778
+ }
1779
+
1780
+ /* TP-107: Agents Panel */
1781
+ .agents-grid {
1782
+ display: flex;
1783
+ flex-direction: column;
1784
+ gap: 6px;
1785
+ }
1786
+ .agent-card {
1787
+ padding: 8px 12px;
1788
+ border-radius: 6px;
1789
+ background: var(--bg-secondary);
1790
+ border-left: 3px solid var(--green);
1791
+ }
1792
+ .agent-card.agent-terminal {
1793
+ border-left-color: var(--text-faint);
1794
+ opacity: 0.7;
1795
+ }
1796
+ .agent-header {
1797
+ font-size: 0.85rem;
1798
+ margin-bottom: 4px;
1799
+ }
1800
+ .agent-meta {
1801
+ display: flex;
1802
+ flex-wrap: wrap;
1803
+ gap: 4px;
1804
+ }
1805
+ .agent-badge {
1806
+ font-size: 0.7rem;
1807
+ padding: 1px 6px;
1808
+ border-radius: 3px;
1809
+ background: var(--bg-primary);
1810
+ color: var(--text-secondary);
1811
+ }
1812
+ .agent-status-running { color: var(--green); }
1813
+ .agent-status-spawning { color: var(--yellow); }
1814
+ .agent-status-exited { color: var(--text-faint); } /* displayed as 'shutdown' */
1815
+ .agent-status-killed { color: var(--text-faint); } /* displayed as 'shutdown' */
1816
+ .agent-status-crashed { color: var(--red); }
1817
+ .agent-status-timed_out { color: var(--red); }
1818
+
1819
+ /* TP-107: Messages Panel */
1820
+ .messages-list {
1821
+ display: flex;
1822
+ flex-direction: column;
1823
+ gap: 4px;
1824
+ }
1825
+ .message-row {
1826
+ display: flex;
1827
+ align-items: flex-start;
1828
+ gap: 8px;
1829
+ padding: 6px 8px;
1830
+ font-size: 0.8rem;
1831
+ border-radius: 4px;
1832
+ background: var(--bg-secondary);
1833
+ }
1834
+ .msg-time {
1835
+ color: var(--text-faint);
1836
+ min-width: 60px;
1837
+ }
1838
+ .msg-direction {
1839
+ color: var(--text-secondary);
1840
+ min-width: 100px;
1841
+ }
1842
+ .msg-badge {
1843
+ font-size: 0.65rem;
1844
+ padding: 1px 5px;
1845
+ border-radius: 3px;
1846
+ text-transform: uppercase;
1847
+ }
1848
+ .msg-type {
1849
+ background: var(--bg-primary);
1850
+ color: var(--text-secondary);
1851
+ }
1852
+ .msg-pending {
1853
+ background: var(--yellow);
1854
+ color: var(--bg-primary);
1855
+ }
1856
+ .msg-delivered {
1857
+ background: var(--green);
1858
+ color: var(--bg-primary);
1859
+ }
1860
+ .msg-reply {
1861
+ background: var(--blue);
1862
+ color: var(--bg-primary);
1863
+ }
1864
+ .msg-preview {
1865
+ color: var(--text-primary);
1866
+ white-space: pre-wrap;
1867
+ word-break: break-word;
1868
+ flex: 1;
1869
+ }
1870
+ .msg-rate-limited {
1871
+ background: var(--red);
1872
+ color: var(--bg-primary);
1873
+ }
1874
+
1875
+ /* TP-107: V2 conversation event styles */
1876
+ .conv-steer {
1877
+ border-left: 3px solid var(--blue);
1878
+ padding-left: 8px;
1879
+ }
1880
+ .conv-error {
1881
+ color: var(--red);
1882
+ }