claude-discover 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +74 -0
  3. package/bin/claude/hooks.mjs +102 -0
  4. package/bin/claude/statusline.mjs +130 -0
  5. package/bin/claude-discover.mjs +16 -0
  6. package/bin/proxy.config.js +19 -0
  7. package/bin/proxy.mjs +268 -0
  8. package/out/main/main.js +1542 -0
  9. package/out/preload/findPreload.cjs +16 -0
  10. package/out/preload/preload.cjs +28 -0
  11. package/out/renderer/assets/claude-icon-BqihzN4C.svg +3 -0
  12. package/out/renderer/assets/find-CxcUmpSm.css +88 -0
  13. package/out/renderer/assets/find-DSEw-KLs.js +59 -0
  14. package/out/renderer/assets/index-0bBLuYQv.css +2331 -0
  15. package/out/renderer/assets/index-BLwpO6Wp.js +2629 -0
  16. package/out/renderer/assets/inter-latin-400-normal-C38fXH4l.woff2 +0 -0
  17. package/out/renderer/assets/inter-latin-400-normal-CyCys3Eg.woff +0 -0
  18. package/out/renderer/assets/inter-latin-700-normal-BLAVimhd.woff +0 -0
  19. package/out/renderer/assets/inter-latin-700-normal-Yt3aPRUw.woff2 +0 -0
  20. package/out/renderer/assets/jetbrains-mono-latin-200-normal-CHn02WOn.woff +0 -0
  21. package/out/renderer/assets/jetbrains-mono-latin-200-normal-DvzYDkvL.woff2 +0 -0
  22. package/out/renderer/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff +0 -0
  23. package/out/renderer/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2 +0 -0
  24. package/out/renderer/assets/jetbrains-mono-latin-700-normal-BYuf6tUa.woff2 +0 -0
  25. package/out/renderer/assets/jetbrains-mono-latin-700-normal-D3wTyLJW.woff +0 -0
  26. package/out/renderer/assets/vendors-B4XMnGdr.css +153 -0
  27. package/out/renderer/assets/vendors-D6iOvAG3.js +49248 -0
  28. package/out/renderer/find/find.html +26 -0
  29. package/out/renderer/index.html +17 -0
  30. package/package.json +75 -0
@@ -0,0 +1,2331 @@
1
+ .tick-hline {
2
+ &.tick-major { stroke: #2a3140; }
3
+ &.tick-minor { stroke: #1e2a38; }
4
+ }
5
+ .tick-text {
6
+ fill: #7a8699;
7
+ font-family: var(--font-mono), monospace;
8
+ &.tick-major { font-size: 9px; }
9
+ &.tick-minor { font-size: 9px; }
10
+ }
11
+ .work-handle-label {
12
+ font: 11px var(--font-mono), monospace;
13
+ color: #cbd1dc;
14
+ background: #0e1118;
15
+ border: 1px solid #cbd1dc;
16
+ border-radius: 3px;
17
+ padding: 1px 5px;
18
+ text-align: center;
19
+ white-space: nowrap;
20
+ }
21
+
22
+ .work-handle {
23
+ cursor: ew-resize;
24
+
25
+ & .work-handle-hit { fill: transparent; }
26
+ & .work-handle-line { stroke: #868e9d; stroke-width: 2; }
27
+ & .work-handle-grip { fill: #cbd1dc; }
28
+ }
29
+
30
+ .work-handles {
31
+ & .work-handle-line { opacity: 0.3; transition: opacity 120ms ease; }
32
+ & .work-handle-grip { opacity: 0; transition: opacity 120ms ease; }
33
+ }
34
+ .work-overlay:hover .work-handles {
35
+ & .work-handle-line { opacity: 1; }
36
+ & .work-handle-grip { opacity: 1; }
37
+ }
38
+
39
+ .work-offhours-shade {
40
+ fill: url(#work-offhours-stripes);
41
+ pointer-events: none;
42
+ }
43
+
44
+ .work-offhours-stripe {
45
+ stroke: #5d5d5d;
46
+ stroke-width: 1.5;
47
+ opacity: 0.45;
48
+ }
49
+
50
+ .now-line {
51
+ pointer-events: none;
52
+ & line { stroke: var(--danger); stroke-width: 1.5; }
53
+ & text { fill: var(--danger); font-size: 11px; }
54
+ }
55
+ .gantt-wrap {
56
+ display: flex;
57
+ flex-direction: column;
58
+ min-height: 0;
59
+ border-bottom: 1px solid var(--border);
60
+ padding: 0 16px 8px;
61
+ background: var(--bg);
62
+ }
63
+
64
+ .heat-strip {
65
+ display: block;
66
+ background: var(--bg-elev);
67
+ border: 1px solid var(--border);
68
+ border-bottom: none;
69
+ border-top-left-radius: 4px;
70
+ border-top-right-radius: 4px;
71
+ }
72
+
73
+ .heat-strip-label {
74
+ fill: #cbd1dc;
75
+ font-size: 10px;
76
+ font-family: var(--font-mono), monospace;
77
+ }
78
+
79
+ .gantt-canvas {
80
+ width: 100%;
81
+ flex: 1;
82
+ min-height: 0;
83
+ background: var(--bg-elev);
84
+ border: 1px solid var(--border);
85
+ border-radius: 4px;
86
+ overflow-x: hidden;
87
+ overflow-y: auto;
88
+ user-select: none;
89
+
90
+ & svg { display: block; }
91
+ }
92
+
93
+ .heat-strip + .gantt-canvas {
94
+ border-top-left-radius: 0;
95
+ border-top-right-radius: 0;
96
+ border-top: none;
97
+ }
98
+
99
+ .gantt-gutter { fill: #0e1118; }
100
+ .gantt-divider { stroke: #232936; }
101
+ .gantt-group-sep { stroke: #1b212c; }
102
+ .gantt-project { fill: #cbd1dc; font-size: 11px;}
103
+ .gantt-project-clickable { cursor: pointer; }
104
+ .gantt-project-clickable:hover { fill: #ffffff; }
105
+ .gantt-project-active { fill: #7aa2f7; font-weight: 600; }
106
+
107
+ /* Full-height grid lines, positioned from TimeAxis's computeTicks. */
108
+ .tick-vline {
109
+ &.tick-major { stroke: #161a22; }
110
+ &.tick-minor { stroke: #181e2a; }
111
+ }
112
+
113
+ .bar-fill { opacity: 0.92; }
114
+ .bar-outline { fill: none; stroke: #fff; stroke-width: 1.5; }
115
+ .gantt-idle { fill: #1f2632; }
116
+ .gantt-bar-count {
117
+ fill: #ffffff;
118
+ stroke: #0b0e14;
119
+ stroke-width: 2.5;
120
+ paint-order: stroke;
121
+ stroke-linejoin: round;
122
+ font-weight: 700;
123
+ font-family: var(--font-mono), monospace;
124
+ font-size: 9px;
125
+ pointer-events: none;
126
+ }
127
+
128
+ .bar {
129
+ cursor: pointer;
130
+ &:hover rect { filter: brightness(1.15); }
131
+ &.selected rect { filter: brightness(1.2); }
132
+ }
133
+ /* Legend on the left; centered nav group: ‹ date › — where the date is a
134
+ button opening the granularity menu — plus a floating "Today" link. The
135
+ empty 1fr side cells keep the nav group truly centered. */
136
+ .gantt-toolbar {
137
+ display: grid;
138
+ grid-template-columns: 1fr auto 1fr;
139
+ align-items: center;
140
+ gap: 16px;
141
+ padding: 12px 16px 0;
142
+ margin-bottom: 8px;
143
+ }
144
+
145
+ .gantt-toolbar-nav {
146
+ position: relative;
147
+ display: flex;
148
+ align-items: center;
149
+ gap: 4px;
150
+ }
151
+
152
+ /* The date is the granularity trigger: click it to open the menu below. */
153
+ .gantt-period {
154
+ position: relative;
155
+ display: inline-flex;
156
+ }
157
+
158
+ .gantt-toolbar-title {
159
+ display: inline-flex;
160
+ align-items: center;
161
+ justify-content: center;
162
+ gap: 5px;
163
+ margin: 0;
164
+ background: transparent;
165
+ border: none;
166
+ border-radius: 6px;
167
+ padding: 3px 8px;
168
+ font-size: 18px;
169
+ font-weight: 600;
170
+ color: var(--text);
171
+ white-space: nowrap;
172
+ min-width: 130px;
173
+ cursor: pointer;
174
+ user-select: none;
175
+ transition: background 0.12s, color 0.12s;
176
+ }
177
+
178
+ .gantt-toolbar-title:hover { background: rgba(74, 158, 255, 0.15); }
179
+ .gantt-toolbar-title[aria-expanded="true"] { background: rgba(74, 158, 255, 0.22); }
180
+
181
+ .gantt-nav-arrow {
182
+ background: transparent;
183
+ border: none;
184
+ border-radius: 4px;
185
+ color: var(--text);
186
+ font-size: 30px;
187
+ font-weight: 700;
188
+ line-height: 1;
189
+ padding: 0 10px;
190
+ cursor: pointer;
191
+ flex-shrink: 0;
192
+ user-select: none;
193
+ transition: background 0.12s, color 0.12s;
194
+ margin-top: -5px;
195
+ }
196
+
197
+ .gantt-nav-arrow:hover {
198
+ background: rgba(74, 158, 255, 0.15);
199
+ color: #fff;
200
+ }
201
+
202
+ /* Floats right of the nav so the title stays centered and nothing shifts. */
203
+ .gantt-toolbar-today {
204
+ position: absolute;
205
+ left: 100%;
206
+ margin-left: 6px;
207
+ background: transparent;
208
+ border-radius: 6px;
209
+ color: var(--accent);
210
+ font-size: 11px;
211
+ font-weight: 600;
212
+ white-space: nowrap;
213
+ padding: 4px 8px;
214
+ cursor: pointer;
215
+ user-select: none;
216
+ transition: background 0.12s, color 0.12s;
217
+ border: 1px solid transparent;
218
+ }
219
+
220
+ .gantt-toolbar-today:hover {
221
+ background: rgb(0 0 0 / 0.15);
222
+ /*color: #fff;*/
223
+ border: 1px solid rgb(127 162 205 / 0.25);
224
+ }
225
+
226
+ .gantt-legend {
227
+ display: flex;
228
+ flex-wrap: nowrap;
229
+ justify-content: flex-start;
230
+ white-space: nowrap;
231
+ gap: 14px;
232
+ font-size: 12px;
233
+ color: var(--text-dim);
234
+ min-width: 0;
235
+ overflow: hidden;
236
+ }
237
+
238
+ .legend-chip {
239
+ display: inline-flex;
240
+ align-items: center;
241
+ gap: 6px;
242
+ background: transparent;
243
+ border: 1px solid transparent;
244
+ color: inherit;
245
+ font: inherit;
246
+ padding: 2px 6px;
247
+ border-radius: 4px;
248
+ cursor: pointer;
249
+ transition: opacity 0.15s, border-color 0.15s, background 0.15s;
250
+
251
+ &:hover { background: rgba(255,255,255,0.04); }
252
+ &.active { border-color: var(--text-dim); background: rgba(255,255,255,0.06); }
253
+ &.dim { opacity: 0.4; }
254
+ }
255
+
256
+ .swatch {
257
+ display: inline-block;
258
+ width: 12px;
259
+ height: 12px;
260
+ border-radius: 2px;
261
+ }
262
+
263
+ .gantt-granularity-caret {
264
+ font-size: 15px;
265
+ }
266
+
267
+ /* Floating menu centered under the date. */
268
+ .gantt-granularity-menu {
269
+ position: absolute;
270
+ top: calc(100% + 6px);
271
+ left: 50%;
272
+ transform: translateX(-50%);
273
+ display: flex;
274
+ flex-direction: column;
275
+ min-width: 120px;
276
+ background: var(--bg-elev);
277
+ border: 1px solid rgba(80, 120, 168, 0.45);
278
+ border-radius: 8px;
279
+ box-shadow: 0 6px 14px rgba(0,0,0,0.4);
280
+ overflow: hidden;
281
+ z-index: 20;
282
+ }
283
+
284
+ .gantt-granularity-option {
285
+ background: transparent;
286
+ border: none;
287
+ color: #c6d2e3;
288
+ font-size: 12px;
289
+ text-align: left;
290
+ padding: 7px 14px;
291
+ cursor: pointer;
292
+ transition: background 0.12s, color 0.12s;
293
+ }
294
+
295
+ .gantt-granularity-option:hover {
296
+ background: rgba(74, 158, 255, 0.15);
297
+ color: #fff;
298
+ }
299
+
300
+ .gantt-granularity-option.active {
301
+ background: rgba(74, 158, 255, 0.22);
302
+ color: #fff;
303
+ font-weight: 600;
304
+ }
305
+ .cost-chart {
306
+ position: relative;
307
+ margin-top: 6px;
308
+ margin-bottom: 10px;
309
+ }
310
+
311
+ .cost-chart-cols {
312
+ position: relative;
313
+ display: flex;
314
+ align-items: flex-end;
315
+ gap: 2px;
316
+ }
317
+
318
+ /* x-axis line at the bar baseline, above the labels */
319
+ .cost-chart-cols::after {
320
+ content: '';
321
+ position: absolute;
322
+ left: 0;
323
+ right: 0;
324
+ top: 52px;
325
+ border-top: 1px solid var(--border);
326
+ }
327
+
328
+ .cost-chart-col {
329
+ flex: 1;
330
+ min-width: 0;
331
+ display: flex;
332
+ flex-direction: column;
333
+ align-items: stretch;
334
+ }
335
+
336
+ .cost-chart-cell {
337
+ height: 52px;
338
+ display: flex;
339
+ flex-direction: column;
340
+ justify-content: flex-end;
341
+ }
342
+
343
+ .cost-chart-bar {
344
+ background: var(--accent);
345
+ border-radius: 1px 1px 0 0;
346
+
347
+ .cost-chart-col:hover & { filter: brightness(1.25); }
348
+ }
349
+
350
+ .cost-chart-label {
351
+ height: 9px;
352
+ margin-top: 3px;
353
+ font-size: 9px;
354
+ line-height: 1;
355
+ color: var(--text-faint);
356
+ text-align: center;
357
+ white-space: nowrap;
358
+ }
359
+ .gantt-side {
360
+ background: var(--bg-elev);
361
+ border: 1px solid var(--border);
362
+ border-radius: 4px;
363
+ padding: 10px 12px;
364
+ margin: 0 16px 8px 0;
365
+ overflow-y: auto;
366
+ font-size: 12px;
367
+ color: var(--text-dim);
368
+ display: flex;
369
+ flex-direction: column;
370
+ gap: 12px;
371
+ }
372
+
373
+ .gantt-side-section {
374
+ display: flex;
375
+ flex-direction: column;
376
+ gap: 4px;
377
+ padding-bottom: 10px;
378
+ border-bottom: 1px solid var(--border);
379
+ }
380
+
381
+ .gantt-side-heading {
382
+ color: var(--text-faint);
383
+ text-transform: uppercase;
384
+ font-size: 10px;
385
+ letter-spacing: 0.5px;
386
+ margin-bottom: 2px;
387
+ display: flex;
388
+ align-items: center;
389
+ gap: 6px;
390
+ }
391
+
392
+ .stats-toggle {
393
+ background: none;
394
+ border: 1px solid var(--border);
395
+ border-radius: 3px;
396
+ color: var(--text-dim);
397
+ font-size: 10px;
398
+ font-family: var(--font-mono), monospace;
399
+ padding: 1px 6px;
400
+ line-height: 14px;
401
+ cursor: pointer;
402
+ letter-spacing: 0;
403
+ text-transform: none;
404
+ margin-left: auto;
405
+
406
+ &:hover { color: var(--text); border-color: var(--text-dim); }
407
+ }
408
+
409
+ .gantt-side-row {
410
+ display: flex;
411
+ justify-content: space-between;
412
+ align-items: baseline;
413
+ gap: 12px;
414
+
415
+ & b {
416
+ color: var(--text);
417
+ font-family: var(--font-mono), monospace;
418
+ font-weight: 500;
419
+ text-align: right;
420
+ white-space: nowrap;
421
+ flex-shrink: 0;
422
+ }
423
+
424
+ & > span {
425
+ flex: 1;
426
+ min-width: 0;
427
+ overflow: hidden;
428
+ text-overflow: ellipsis;
429
+ white-space: nowrap;
430
+ }
431
+
432
+ /* Text badge — undo the circular icon-badge sizing from styles.css */
433
+ & .warn-badge {
434
+ font-size: inherit;
435
+ font-weight: inherit;
436
+ letter-spacing: 0;
437
+ line-height: 1;
438
+ width: auto;
439
+ height: auto;
440
+ border-radius: 3px;
441
+ padding: 0 5px;
442
+ margin: 0 -5px;
443
+ color: var(--warn);
444
+ }
445
+ }
446
+ .session-list {
447
+ display: flex;
448
+ flex-direction: column;
449
+ background: var(--bg-elev);
450
+ min-width: 0;
451
+ min-height: 0;
452
+ overflow: hidden;
453
+ }
454
+
455
+ .session-list-header {
456
+ padding: 10px;
457
+ display: flex;
458
+ flex-direction: column;
459
+ gap: 6px;
460
+ border-bottom: 1px solid var(--border);
461
+ }
462
+
463
+ .session-list-header-row {
464
+ display: flex;
465
+ align-items: center;
466
+ justify-content: flex-end;
467
+ gap: 8px;
468
+ }
469
+
470
+ .filter-count {
471
+ font-size: 11px;
472
+ color: var(--text);
473
+ margin-right: auto;
474
+ }
475
+
476
+ .session-list-scroll { overflow-y: auto; flex: 1; }
477
+
478
+ .filter-wrap {
479
+ position: relative;
480
+ display: flex;
481
+ }
482
+
483
+ .filter {
484
+ background: black;
485
+ border: 1px solid var(--border);
486
+ border-radius: 4px;
487
+ color: var(--text);
488
+ padding: 6px 8px;
489
+ padding-right: 26px;
490
+ font-size: 12px;
491
+ outline: none;
492
+ flex: 1;
493
+
494
+ &:focus { border-color: var(--accent); }
495
+ }
496
+
497
+ .filter-clear {
498
+ position: absolute;
499
+ right: 6px;
500
+ top: 50%;
501
+ transform: translateY(-50%);
502
+ display: flex;
503
+ align-items: center;
504
+ justify-content: center;
505
+ width: 16px;
506
+ height: 16px;
507
+ padding: 0;
508
+ border: none;
509
+ border-radius: 50%;
510
+ background: var(--bg-elev-2);
511
+ color: var(--text-dim);
512
+ font-size: 14px;
513
+ line-height: 1;
514
+ cursor: pointer;
515
+
516
+ &:hover { color: var(--text); background: var(--border); }
517
+ }
518
+
519
+ .sort-toggle {
520
+ display: inline-flex;
521
+ align-items: center;
522
+ gap: 4px;
523
+ font-size: 11px;
524
+ }
525
+
526
+ .sort-toggle-label { color: var(--text-faint); margin-right: 2px; }
527
+
528
+ .sort-pill {
529
+ background: var(--bg-elev-2);
530
+ border: 1px solid var(--border);
531
+ color: var(--text-dim);
532
+ padding: 2px 8px;
533
+ border-radius: 10px;
534
+ font-size: 11px;
535
+ cursor: pointer;
536
+ font-family: inherit;
537
+
538
+ &:hover { color: var(--text); }
539
+
540
+ &.active {
541
+ background: var(--accent);
542
+ color: #0b1220;
543
+ border-color: var(--accent);
544
+ font-weight: 600;
545
+ }
546
+ }
547
+
548
+ .session-row {
549
+ padding: 8px 10px;
550
+ border-left: 3px solid transparent;
551
+ border-bottom: 1px solid var(--border);
552
+ cursor: pointer;
553
+ display: flex;
554
+ align-items: flex-start;
555
+ gap: 10px;
556
+
557
+ &:hover { background: var(--bg-elev-2); }
558
+ &.selected { background: var(--selected); }
559
+ &.is-subagent-child { padding-left: 20px; }
560
+ }
561
+
562
+ .session-row-main { flex: 1; min-width: 0; }
563
+
564
+ .session-row-stats {
565
+ flex: none;
566
+ display: flex;
567
+ flex-direction: column;
568
+ align-items: flex-end;
569
+ gap: 2px;
570
+ min-width: 56px;
571
+ font-family: var(--font-mono), monospace;
572
+
573
+ /* Line heights mirror the main column (18px label + 2px gap + 14px line) so both second lines align */
574
+ & .stat-primary {
575
+ font-size: 11px;
576
+ font-weight: 600;
577
+ line-height: 18px;
578
+ color: var(--text-dim);
579
+
580
+ &.muted { color: var(--text-dim); }
581
+ &.warn { color: var(--warn); }
582
+ &.danger { color: var(--danger); }
583
+ }
584
+
585
+ & .stat-secondary {
586
+ font-size: 10px;
587
+ line-height: 14px;
588
+ color: var(--text-faint);
589
+ &.warn { color: var(--warn); }
590
+ &.danger { color: var(--danger); }
591
+ }
592
+ }
593
+
594
+ .session-row-top {
595
+ display: flex;
596
+ justify-content: space-between;
597
+ align-items: center;
598
+ font-size: 11px;
599
+ }
600
+
601
+ .source-tag { font-weight: 600; letter-spacing: 0.4px; }
602
+
603
+ .session-row-meta {
604
+ display: flex;
605
+ align-items: center;
606
+ gap: 6px;
607
+ font-size: 11px;
608
+ min-width: 0;
609
+ }
610
+
611
+ .session-time { color: var(--text-faint); font-family: var(--font-mono), monospace; margin-left: auto; }
612
+ .session-time-bottom {
613
+ margin-top: 2px;
614
+ display: flex;
615
+ gap: 0px;
616
+ font-family: var(--font-mono), monospace;
617
+ font-size: 10px;
618
+ line-height: 14px;
619
+ color: var(--text-faint);
620
+ }
621
+ .session-model { color: var(--text-dim); }
622
+ .session-time-meta { color: var(--text-faint); }
623
+
624
+ .session-name {
625
+ font-weight: 600;
626
+ color: var(--accent, #4ea1ff);
627
+ }
628
+
629
+ .subagent-tag,
630
+ .worktree-tag {
631
+ font-family: var(--font-mono), monospace;
632
+ font-size: 11px;
633
+ color: var(--accent, #4ea1ff);
634
+ }
635
+
636
+ .worktree-tag { color: #34d399; }
637
+
638
+ .fork-tag {
639
+ color: var(--accent);
640
+ font-weight: bold;
641
+ }
642
+
643
+ /* Single flex line, 18px tall to fit the circular badges without growing the line box */
644
+ .session-label {
645
+ font-size: 12px;
646
+ display: flex;
647
+ align-items: center;
648
+ gap: 5px;
649
+ height: 18px;
650
+ line-height: 18px;
651
+ overflow: hidden;
652
+
653
+ & > * { flex-shrink: 0; }
654
+ }
655
+
656
+ .session-label-text {
657
+ flex-shrink: 1;
658
+ min-width: 0;
659
+ overflow: hidden;
660
+ text-overflow: ellipsis;
661
+ white-space: nowrap;
662
+ }
663
+
664
+ .model-tag { font-family: var(--font-mono), monospace; color: var(--text-faint); margin-left: auto; }
665
+ .markdown { white-space: normal; max-height: 500px; overflow: auto; }
666
+ .markdown > *:first-child { margin-top: 0; }
667
+ .markdown > *:last-child { margin-bottom: 0; }
668
+ .markdown p { margin-bottom: 1em; }
669
+ .markdown p:has(+ ul), .markdown p:has(+ ol) { margin-bottom: 0; }
670
+ .markdown h1, .markdown h2, .markdown h3, .markdown h4 {
671
+ margin: 6px 0 1em; font-weight: 600; line-height: 1.3;
672
+ }
673
+ /* Sizes are em so markdown scales with its container's font size (e.g. ConversationView's zoom). */
674
+ .markdown h1 { font-size: 1.5em; }
675
+ .markdown h2 { font-size: 1.35em; }
676
+ .markdown h3 { font-size: 1.2em; }
677
+ .markdown h4 { font-size: 1.1em; }
678
+ .markdown ul { margin: 0 0 1em; padding-left: 15px; }
679
+ .markdown ol { margin: 0 0 1em; padding-left: 20px; }
680
+ .markdown li { margin: 0; }
681
+ .markdown li > ul, .markdown li > ol { margin: 2px 0; }
682
+ .markdown a { color: var(--accent); text-decoration: none; }
683
+ .markdown a:hover { text-decoration: underline; }
684
+ .markdown blockquote {
685
+ margin: 4px 0; padding: 4px 10px;
686
+ border-left: 3px solid var(--border-strong);
687
+ color: var(--text-dim);
688
+ }
689
+ .markdown code {
690
+ font-family: var(--font-mono), monospace;
691
+ font-size: 0.9em;
692
+ background: var(--bg-elev-2);
693
+ border: 1px solid var(--border);
694
+ border-radius: 3px;
695
+ padding: 0 4px;
696
+ }
697
+ .markdown pre {
698
+ margin: 4px 0;
699
+ background: #0d1117;
700
+ border: 1px solid var(--border);
701
+ border-radius: 6px;
702
+ padding: 10px 12px;
703
+ overflow: auto;
704
+ max-width: 100%;
705
+ }
706
+ .markdown pre code {
707
+ background: transparent;
708
+ border: none;
709
+ padding: 0;
710
+ font-size: 0.9em;
711
+ line-height: 1.5;
712
+ white-space: pre-wrap; /* wrap long lines instead of hljs's horizontal scroll */
713
+ overflow-wrap: anywhere; /* break unbreakable tokens (paths, urls) */
714
+ }
715
+ .markdown table {
716
+ border-collapse: collapse; margin: 6px 0; font-size: 1em;
717
+ }
718
+ .markdown th, .markdown td {
719
+ border: 1px solid var(--border); padding: 4px 8px; text-align: left;
720
+ }
721
+ .markdown th { background: var(--bg-elev-2); }
722
+ .markdown hr { border: none; border-top: 1px solid var(--border); margin: 10px 0; }
723
+ .conversation {
724
+ display: flex;
725
+ flex-direction: column;
726
+ max-width: calc(820px * var(--font-scale, 1));
727
+ width: 100%;
728
+ margin-left: auto;
729
+ margin-right: auto;
730
+ font-family: var(--font-mono), monospace;
731
+ /* Shift/Ctrl+wheel zoom (useMouseFontScale): every font size below multiplies this scale. */
732
+ font-size: calc(11px * var(--font-scale, 1));
733
+ }
734
+
735
+ .conv-row + .conv-row { margin-top: 15px; }
736
+ .conv-row-instruction + .conv-row { margin-top: 20px; }
737
+ .conv-row-assistant + .conv-row-user { margin-top: 60px; }
738
+ .conv-row-instruction + .conv-row-instruction,
739
+ .conv-row-assistant + .conv-row-assistant { margin-top: 0; }
740
+
741
+
742
+ /* Token timeline: a right gutter with one dot per row, scrolling with the content.
743
+ Totals live in the message headers (see TokenStats); delta and context size in their tooltip. */
744
+ .conversation.has-token-timeline {
745
+ position: relative;
746
+ max-width: calc(848px * var(--font-scale, 1));
747
+ padding-right: 28px;
748
+ }
749
+
750
+ .conversation.has-token-timeline::after {
751
+ content: '';
752
+ position: absolute;
753
+ top: 0;
754
+ bottom: 0;
755
+ right: 13px;
756
+ border-left: 1px solid var(--border);
757
+ }
758
+
759
+ .conv-row { position: relative; }
760
+
761
+ .token-point {
762
+ position: absolute;
763
+ right: -18px; /* dot centered on the line: gutter 28 − line offset 13 + dot radius 2.5 ≈ 18 */
764
+ top: 10px;
765
+ z-index: 1; /* paint the dots over the timeline line (.conversation::after comes later in tree order) */
766
+ }
767
+
768
+ .token-point-dot {
769
+ display: block;
770
+ width: 5px;
771
+ height: 5px;
772
+ border-radius: 50%;
773
+ }
774
+
775
+ .token-point-user .token-point-dot { background: #5da9c9; }
776
+ .token-point-assistant .token-point-dot { background: #9aa3b2; }
777
+ .token-point-command .token-point-dot { background: var(--accent); } /* slash commands: no tokens, just a marker */
778
+ .token-point.negative .token-point-dot { background: #63a76b; } /* compaction shrank the context — good news, so green */
779
+
780
+ /* Context size fill bar, shown in the msg-tokens tooltip (see TokenStats): fraction of CTX_LIMIT. */
781
+ .token-point-ctx-bar {
782
+ display: inline-block;
783
+ vertical-align: middle;
784
+ width: 30px;
785
+ height: 4px;
786
+ border-radius: 2px;
787
+ background: var(--bg-elev-2);
788
+ overflow: hidden;
789
+
790
+ & > span {
791
+ display: block;
792
+ height: 100%;
793
+ background: var(--ok);
794
+ }
795
+ }
796
+
797
+ /* msg-tokens tooltip: `Context [fill bar] N tokens`, the turn's usage breakdown grid
798
+ (labels left, numbers right), then the accumulated total under a divider. */
799
+ .token-tooltip { display: flex; flex-direction: column; gap: 5px; }
800
+ .token-tooltip-ctx { display: flex; align-items: center; gap: 5px; }
801
+ .token-tooltip .token-point-ctx-bar { flex: 1; width: auto; background: rgba(255, 255, 255, 0.25); } /* grow to fill the row; lighter track for tippy's dark background */
802
+ .token-tooltip-ctx-val { text-align: right; font-variant-numeric: tabular-nums; }
803
+ .token-tooltip-grid {
804
+ display: grid;
805
+ grid-template-columns: auto auto;
806
+ column-gap: 16px;
807
+ row-gap: 2px;
808
+ }
809
+ .token-tooltip-ctx + .token-tooltip-grid {
810
+ border-top: 1px solid rgba(255, 255, 255, 0.25);
811
+ padding-top: 5px;
812
+ }
813
+ .token-tooltip-sum {
814
+ border-top: 1px solid rgba(255, 255, 255, 0.25);
815
+ padding-top: 2px;
816
+ }
817
+ .token-tooltip-total {
818
+ display: flex;
819
+ justify-content: space-between;
820
+ gap: 16px;
821
+ border-top: 1px solid rgba(255, 255, 255, 0.25);
822
+ padding-top: 5px;
823
+ }
824
+ .token-tooltip-grid > span:nth-child(even),
825
+ .token-tooltip-total > span:last-child {
826
+ text-align: right;
827
+ font-variant-numeric: tabular-nums;
828
+ }
829
+
830
+ .turn {
831
+ position: relative;
832
+ display: flex;
833
+ flex-direction: column;
834
+ }
835
+
836
+ .turn-blocks {
837
+ display: flex;
838
+ flex-direction: column;
839
+ min-width: 0;
840
+ }
841
+
842
+ /* Message headers: token stats + time above user bubbles (right-aligned); Claude icon · author · summary | token stats · time above assistant cards. */
843
+ .msg-header {
844
+ display: flex;
845
+ align-items: center;
846
+ flex-wrap: wrap;
847
+ gap: 6px;
848
+ margin-top: 6px;
849
+ margin-bottom: 4px;
850
+ font-size: calc(11px * var(--font-scale, 1));
851
+ color: var(--text-faint);
852
+ }
853
+
854
+
855
+ .msg-icon {
856
+ width: calc(15px * var(--font-scale, 1));
857
+ height: calc(15px * var(--font-scale, 1));
858
+ flex: none;
859
+ color: var(--text-dim);
860
+ }
861
+
862
+ .msg-author { color: var(--text); font-weight: 600; font-size: calc(12px * var(--font-scale, 1)); }
863
+ .msg-user .msg-author { color: rgb(113, 183, 214); }
864
+
865
+ .msg-summary {
866
+ background: transparent;
867
+ border: none;
868
+ padding: 0;
869
+ display: inline-flex;
870
+ align-items: center;
871
+ gap: 5px;
872
+ }
873
+
874
+ button.msg-summary { cursor: pointer; }
875
+ button.msg-summary:hover { color: var(--text); background: var(--bg-elev-2); border-radius: 3px; }
876
+
877
+ .msg-errors { color: var(--danger); font-weight: 600; }
878
+
879
+ .msg-header-right {
880
+ margin-left: auto;
881
+ display: inline-flex;
882
+ align-items: center;
883
+ gap: 10px;
884
+ }
885
+
886
+ /* Pipe divider between header-right cells: `tokens | time`. */
887
+ .msg-header-right .msg-tokens:not(:last-child)::after {
888
+ content: '|';
889
+ margin-left: 10px;
890
+ color: var(--border);
891
+ }
892
+
893
+ /* Context injected with a user message, disclosed from its header's `attachments · N items` summary. */
894
+ .msg-context {
895
+ margin-bottom: 8px;
896
+ display: flex;
897
+ flex-direction: column;
898
+ }
899
+
900
+ .msg-time, .msg-tokens, .msg-summary {
901
+ font-family: var(--font-mono), monospace;
902
+ font-size: calc(10.5px * var(--font-scale, 1));
903
+ color: var(--text-faint);
904
+ }
905
+
906
+ /* Assistant cycle card: header row above, bordered body with the response (tools fold into it). */
907
+ .assistant-card-body {
908
+ /*border: 1px solid var(--border);*/
909
+ border-radius: 6px;
910
+ padding: 5px 10px;
911
+ background: var(--bg-elev);
912
+ display: flex;
913
+ flex-direction: column;
914
+ }
915
+
916
+ .aux {
917
+ & .block-text {
918
+ margin: 5px 0 10px 0;
919
+ }
920
+ }
921
+
922
+ /* Aux turns kept mounted while the card is folded, so their expanded state survives (see AssistantCard). */
923
+ .turn-hidden { display: none; }
924
+
925
+ /* Mark just the turn that errored, not the whole card. */
926
+ .turn-error { border-left: 2px solid var(--danger); padding-left: 8px; margin-left: -10px; }
927
+
928
+ .turn-user {
929
+ & .turn-blocks { align-items: flex-start; }
930
+ & .turn-blocks > .aux { align-self: stretch; }
931
+ & .turn-blocks > .tool-result { align-self: stretch; }
932
+
933
+ & .block-text {
934
+ background: var(--bg-elev);
935
+ border: 1px solid rgb(47 78 91);
936
+ color: rgb(113, 183, 214);
937
+ border-radius: 6px;
938
+ padding: 5px 10px;
939
+ align-self: stretch;
940
+ text-align: left;
941
+ margin: 0;
942
+ }
943
+ }
944
+
945
+ .turn-assistant .block-text { color: var(--text); }
946
+
947
+ .turn-meta-note {
948
+ & .block-text {
949
+ background: transparent;
950
+ border: 1px dashed var(--border);
951
+ }
952
+ }
953
+ .turn-assistant.turn-meta-note .turn-blocks > .aux { align-self: flex-start; }
954
+
955
+ .tool-result {
956
+ font-size: calc(12px * var(--font-scale, 1));
957
+
958
+ & .tool-result-label {
959
+ color: var(--text-faint);
960
+ font-size: calc(11px * var(--font-scale, 1));
961
+ font-family: var(--font-mono), monospace;
962
+ margin-bottom: 2px;
963
+ }
964
+
965
+ & pre {
966
+ margin: 0;
967
+ font-family: var(--font-mono), monospace;
968
+ font-size: calc(11.5px * var(--font-scale, 1));
969
+ white-space: pre-wrap;
970
+ word-break: break-word;
971
+ color: var(--text-dim);
972
+ border-left: 2px solid var(--border);
973
+ padding: 4px 8px;
974
+ max-height: 360px;
975
+ overflow: auto;
976
+ }
977
+
978
+ &.error {
979
+ & .tool-result-label { color: var(--danger); }
980
+ & pre { border-left-color: var(--danger); color: var(--danger); }
981
+ }
982
+ }
983
+
984
+ .block-image {
985
+ max-width: 100%;
986
+ max-height: 480px;
987
+ border-radius: 4px;
988
+ display: block;
989
+ margin: 4px 0;
990
+ }
991
+
992
+ .block-text {
993
+ white-space: pre-wrap;
994
+ word-break: break-word;
995
+ font-family: var(--font-mono), monospace;
996
+ font-size: calc(11px * var(--font-scale, 1));
997
+ font-weight: 200; /* extra-light cut loaded in main.jsx (jetbrains-mono/latin-200) */
998
+ line-height: 1.5;
999
+
1000
+ &.markdown { white-space: normal; }
1001
+ }
1002
+
1003
+ .turn-user .block-text.markdown { display: inline-block; }
1004
+
1005
+ .block-command {
1006
+ font-family: var(--font-mono), monospace;
1007
+ font-size: calc(11px * var(--font-scale, 1));
1008
+ background: transparent;
1009
+ border: 1px dashed var(--border);
1010
+ border-radius: 4px;
1011
+ padding: 6px 10px;
1012
+ max-width: 100%;
1013
+ text-align: left;
1014
+ color: var(--text-faint);
1015
+ }
1016
+
1017
+ .cmd-name { color: var(--accent); font-weight: 600; }
1018
+ .cmd-args { color: var(--text-dim); white-space: pre-wrap; }
1019
+
1020
+ .cmd-stdout {
1021
+ color: var(--text-dim);
1022
+ white-space: pre-wrap;
1023
+ word-break: break-word;
1024
+ }
1025
+
1026
+ .aux {
1027
+ font-size: calc(12px * var(--font-scale, 1));
1028
+
1029
+ &.error .aux-toggle { color: var(--danger); }
1030
+ }
1031
+
1032
+ .aux-toggle {
1033
+ background: transparent;
1034
+ border: none;
1035
+ padding: 0;
1036
+ color: var(--text-faint);
1037
+ font-size: calc(11px * var(--font-scale, 1));
1038
+ cursor: pointer;
1039
+ font-family: var(--font-mono), monospace;
1040
+ display: inline-flex;
1041
+ gap: 4px;
1042
+
1043
+ &:hover { color: var(--text); background: var(--bg-elev-2); border-radius: 3px; }
1044
+ }
1045
+
1046
+
1047
+ .aux-label {
1048
+ color: var(--text-faint);
1049
+ font-size: calc(11px * var(--font-scale, 1));
1050
+ font-family: var(--font-mono), monospace;
1051
+ display: inline-flex;
1052
+ gap: 4px;
1053
+ }
1054
+
1055
+
1056
+ .aux-body {
1057
+ margin-top: 4px;
1058
+ border-left: 2px solid var(--border);
1059
+ padding: 4px 8px;
1060
+
1061
+ & pre {
1062
+ margin: 0;
1063
+ font-family: var(--font-mono), monospace;
1064
+ font-size: calc(11.5px * var(--font-scale, 1));
1065
+ white-space: pre-wrap;
1066
+ word-break: break-word;
1067
+ color: var(--text-dim);
1068
+ max-height: 360px;
1069
+ overflow: auto;
1070
+ }
1071
+ }
1072
+
1073
+ /* Instruction files (system prompt / CLAUDE.md / memory) extracted from the captured API requests. */
1074
+ .instruction-file {
1075
+ border-left: 2px solid #a78bfa;
1076
+ padding-left: 8px;
1077
+ margin-left: -10px;
1078
+ }
1079
+
1080
+ /* Full path of an expanded memory file, first line of the body — one click selects it for copying. */
1081
+ .instruction-path {
1082
+ font-family: var(--font-mono), monospace;
1083
+ font-size: calc(10.5px * var(--font-scale, 1));
1084
+ color: var(--text-faint);
1085
+ margin: 2px 0 4px;
1086
+ user-select: all;
1087
+ }
1088
+
1089
+ .instructions-note {
1090
+ font-size: calc(11px * var(--font-scale, 1));
1091
+ color: var(--text-faint);
1092
+ margin-bottom: 4px;
1093
+ padding-bottom: 4px;
1094
+ border-bottom: 1px dashed var(--border);
1095
+ line-height: 1.5;
1096
+ }
1097
+ .shorten-more {
1098
+ color: var(--warn);
1099
+ font-style: italic;
1100
+ }
1101
+ .jsonl-viewer {
1102
+ display: flex;
1103
+ flex-direction: column;
1104
+ min-height: 0;
1105
+ flex: 1;
1106
+ }
1107
+
1108
+ .jsonl-viewer-toolbar {
1109
+ display: flex;
1110
+ padding: 16px 20px;
1111
+ }
1112
+
1113
+ .jsonl-viewer-search {
1114
+ flex: 1;
1115
+ background: var(--bg);
1116
+ color: var(--text);
1117
+ border: 1px solid var(--border);
1118
+ border-radius: 3px;
1119
+ padding: 4px 8px;
1120
+ font-size: 12px;
1121
+ font-family: inherit;
1122
+
1123
+ &:focus { outline: none; border-color: var(--accent); }
1124
+ }
1125
+
1126
+ .jsonl-viewer-content {
1127
+ flex: 1;
1128
+ display: flex;
1129
+ min-height: 0;
1130
+ }
1131
+
1132
+ .jsonl-viewer-body {
1133
+ flex: 1;
1134
+ overflow: auto;
1135
+ padding: 8px 12px;
1136
+ display: flex;
1137
+ flex-direction: column;
1138
+ gap: 4px;
1139
+ background: var(--bg);
1140
+ /* Shift/Ctrl+wheel zoom (useMouseFontScale): font sizes below multiply this scale. */
1141
+ font-size: calc(12px * var(--font-scale, 1));
1142
+
1143
+ & .w-json-view-container {
1144
+ --w-rjv-background-color: rgb(6 6 6) !important;
1145
+ font-size: calc(12px * var(--font-scale, 1)) !important;
1146
+ line-height: 1.2 !important;
1147
+ }
1148
+ & .w-rjv-value {
1149
+ color: var(--w-rjv-type-string-color)
1150
+ }
1151
+ }
1152
+
1153
+ .jsonl-viewer-toc {
1154
+ flex: 0 0 160px;
1155
+ overflow: auto;
1156
+ border-right: 1px solid var(--border);
1157
+ background: var(--bg);
1158
+ margin: 0;
1159
+ padding: 6px 0;
1160
+ list-style: none;
1161
+ font-size: 12px;
1162
+ }
1163
+
1164
+ .jsonl-viewer-toc li { margin: 0; }
1165
+
1166
+ .jsonl-viewer-toc button {
1167
+ display: flex;
1168
+ align-items: center;
1169
+ gap: 8px;
1170
+ width: 100%;
1171
+ background: transparent;
1172
+ border: 0;
1173
+ color: var(--text);
1174
+ text-align: left;
1175
+ padding: 3px 10px;
1176
+ font: inherit;
1177
+ cursor: pointer;
1178
+
1179
+ &:hover { background: var(--hover, rgba(255,255,255,0.06)); }
1180
+ }
1181
+
1182
+ .jsonl-viewer-toc-index {
1183
+ color: var(--text-faint);
1184
+ min-width: 22px;
1185
+ text-align: right;
1186
+ font-variant-numeric: tabular-nums;
1187
+ }
1188
+
1189
+ .jsonl-viewer-toc-label {
1190
+ overflow: hidden;
1191
+ text-overflow: ellipsis;
1192
+ white-space: nowrap;
1193
+ }
1194
+
1195
+ .jsonl-viewer-mark {
1196
+ background: rgb(168 168 168 / 0.35);
1197
+ color: inherit;
1198
+ border-radius: 2px;
1199
+ padding: 0 1px;
1200
+ }
1201
+ .jsonl-viewer-loading,
1202
+ .jsonl-viewer-error {
1203
+ color: var(--text-faint);
1204
+ }
1205
+
1206
+ .jsonl-viewer-error { color: var(--danger); }
1207
+ .requests-view {
1208
+ flex: 1;
1209
+ display: flex;
1210
+ min-height: 0;
1211
+ background: var(--bg);
1212
+ font-size: 12px;
1213
+ }
1214
+
1215
+ .requests-list {
1216
+ flex: 0 0 550px;
1217
+ overflow: auto;
1218
+ border-right: 1px solid var(--border);
1219
+ margin: 0;
1220
+ padding: 20px 10px;
1221
+ list-style: none;
1222
+ }
1223
+
1224
+ .requests-list li { margin: 0; }
1225
+
1226
+ /* separator above the request that starts a new user turn */
1227
+ .requests-list li.new-turn {
1228
+ border-top: 1px solid var(--border);
1229
+ margin-top: 6px;
1230
+ padding-top: 6px;
1231
+ }
1232
+
1233
+ .requests-list button {
1234
+ display: flex;
1235
+ align-items: center;
1236
+ gap: 8px;
1237
+ width: 100%;
1238
+ background: transparent;
1239
+ border: 0;
1240
+ color: var(--text);
1241
+ text-align: left;
1242
+ padding: 4px 10px;
1243
+ font: inherit;
1244
+ cursor: pointer;
1245
+
1246
+ &:hover { background: var(--hover, rgba(255, 255, 255, 0.06)); }
1247
+ &.active { background: var(--hover, rgba(255, 255, 255, 0.1)); }
1248
+ }
1249
+
1250
+ .requests-url {
1251
+ flex: 1;
1252
+ color: var(--text-faint);
1253
+ overflow: hidden;
1254
+ text-overflow: ellipsis;
1255
+ white-space: nowrap;
1256
+ }
1257
+
1258
+ /* category label, last column — fixed width so the labels line up left-aligned,
1259
+ set off from the metrics by a full-height vertical rule; colors come from the
1260
+ shared .kind-* palette in styles.css */
1261
+ .requests-kind {
1262
+ flex: 0 0 106px;
1263
+ align-self: stretch;
1264
+ display: flex;
1265
+ align-items: center;
1266
+ padding: 0 8px;
1267
+ border-left: 1px solid var(--border);
1268
+ overflow: hidden;
1269
+ white-space: nowrap;
1270
+ }
1271
+
1272
+ /* Postman-style method colors — muted, kept local so they don't track the app palette */
1273
+ .requests-method {
1274
+ flex: 0 0 34px;
1275
+ font-weight: 600;
1276
+
1277
+ &.get { color: #6ea882; }
1278
+ &.post { color: #6b93c4; }
1279
+ &.put { color: #c2835f; }
1280
+ &.delete { color: #c47b7b; }
1281
+ }
1282
+
1283
+ .requests-status {
1284
+ font-variant-numeric: tabular-nums;
1285
+
1286
+ &.ok { color: var(--text-faint); }
1287
+ &.error { color: var(--danger); font-weight: bold; }
1288
+ }
1289
+
1290
+ .requests-meta {
1291
+ color: var(--text-faint);
1292
+ font-variant-numeric: tabular-nums;
1293
+ }
1294
+
1295
+ .requests-tokens {
1296
+ min-width: 42px;
1297
+ text-align: right;
1298
+ }
1299
+
1300
+ .requests-duration {
1301
+ min-width: 44px;
1302
+ text-align: right;
1303
+ }
1304
+
1305
+ .requests-detail {
1306
+ flex: 1;
1307
+ min-width: 0;
1308
+ display: flex;
1309
+ flex-direction: column;
1310
+ }
1311
+
1312
+ .requests-tabs {
1313
+ display: flex;
1314
+ gap: 14px;
1315
+ padding: 5px 12px;
1316
+ border-bottom: 1px solid var(--border);
1317
+
1318
+ & button {
1319
+ background: transparent;
1320
+ border: 0;
1321
+ padding: 2px 0;
1322
+ color: var(--text-faint);
1323
+ text-transform: uppercase;
1324
+ font: inherit;
1325
+ font-size: 11px;
1326
+ letter-spacing: 0.5px;
1327
+ cursor: pointer;
1328
+
1329
+ &:hover { color: var(--text); }
1330
+ &.active { color: var(--text); }
1331
+ }
1332
+ }
1333
+
1334
+ .requests-pane {
1335
+ flex: 1;
1336
+ min-width: 0;
1337
+ overflow: auto;
1338
+ padding: 8px 12px 12px;
1339
+
1340
+ /* Shift/Ctrl+wheel zoom (useMouseFontScale): font sizes below multiply this scale. */
1341
+ & .w-json-view-container {
1342
+ --w-rjv-background-color: rgb(6 6 6) !important;
1343
+ font-size: calc(12px * var(--font-scale, 1)) !important;
1344
+ line-height: 1.2 !important;
1345
+ }
1346
+ }
1347
+
1348
+ /* the hand-made braces / `"messages": [ … ]` lines stitching the body tree and the per-message
1349
+ trees into one document, styled to blend in with JsonView (theme vars come from the wrapper's
1350
+ inline style; indents mirror its KeyValues: 6px margin + 15px padding + guide line) */
1351
+ .requests-doc {
1352
+ font-family: var(--w-rjv-font-family, monospace);
1353
+ font-size: calc(12px * var(--font-scale, 1));
1354
+ line-height: 1.2;
1355
+
1356
+ & .key { color: var(--w-rjv-key-string); }
1357
+ & .colon { color: var(--w-rjv-colon-color); }
1358
+ & .bracket { color: var(--w-rjv-brackets-color); }
1359
+
1360
+ /* the root braces are ours, so hide the body tree's own open row (arrow + brace) and closing
1361
+ brace; the tree is the wrapper's direct child, unlike the nested per-message trees.
1362
+ !important beats the open row's inline display:inline-flex */
1363
+ & > .w-json-view-container > :is(span:first-child, div:not(.w-rjv-wrap)) { display: none !important; }
1364
+
1365
+ & .requests-msgs,
1366
+ & .requests-msgs .items {
1367
+ margin-left: 6px;
1368
+ padding-left: 15px;
1369
+ border-left: 1px solid var(--w-rjv-line-color);
1370
+ }
1371
+
1372
+ & .w-rjv-value {
1373
+ color: var(--w-rjv-type-string-color)
1374
+ }
1375
+ }
1376
+
1377
+ /* summary shown inside a collapsed node in place of the '...' ellipsis */
1378
+ .requests-hint {
1379
+ cursor: pointer;
1380
+ user-select: none;
1381
+ font-style: italic;
1382
+ color: var(--text-faint);
1383
+ padding: 0 3px;
1384
+ white-space: pre; /* keeps the role's alignment padding */
1385
+ }
1386
+
1387
+ /* parts already sent in an earlier request ($refs in the log) fade so what's new stands out */
1388
+ .requests-seen,
1389
+ .requests-pane :is(.w-rjv-inner, .w-rjv-line):has(> span .requests-seen-key) {
1390
+ opacity: 0.6;
1391
+ }
1392
+
1393
+ .requests-headers {
1394
+ padding-bottom: 8px;
1395
+ margin-bottom: 8px;
1396
+ border-bottom: 1px solid var(--border);
1397
+ }
1398
+
1399
+ .requests-label {
1400
+ display: flex;
1401
+ justify-content: space-between;
1402
+ color: var(--text-faint);
1403
+ text-transform: uppercase;
1404
+ font-size: calc(11px * var(--font-scale, 1));
1405
+ letter-spacing: 0.5px;
1406
+ padding: 2px 0 6px;
1407
+ }
1408
+
1409
+ /* explains the seen-part fading to first-time viewers */
1410
+ .requests-label-hint {
1411
+ text-transform: none;
1412
+ letter-spacing: normal;
1413
+ font-style: italic;
1414
+ }
1415
+
1416
+ .requests-pane-empty,
1417
+ .requests-empty {
1418
+ color: var(--text-faint);
1419
+ }
1420
+
1421
+ .requests-empty {
1422
+ padding: 10px 20px;
1423
+ }
1424
+ .toggle {
1425
+ display: inline-flex;
1426
+ align-items: center;
1427
+ gap: 8px;
1428
+ font-size: 12px;
1429
+ color: var(--text-dim);
1430
+ cursor: pointer;
1431
+ user-select: none;
1432
+ padding: 4px 10px;
1433
+ background: rgb(11 13 18 / 0.8);
1434
+ border: 1px solid var(--bg);
1435
+ border-radius: 999px;
1436
+ }
1437
+
1438
+ .toggle:hover {
1439
+ color: var(--text);
1440
+ border-color: var(--border-strong);
1441
+ }
1442
+
1443
+ .toggle input {
1444
+ appearance: none;
1445
+ -webkit-appearance: none;
1446
+ width: 26px;
1447
+ height: 14px;
1448
+ background: var(--bg-elev-2);
1449
+ border: 1px solid var(--border);
1450
+ border-radius: 999px;
1451
+ position: relative;
1452
+ cursor: pointer;
1453
+ margin: 0;
1454
+ transition: background 120ms ease, border-color 120ms ease;
1455
+ }
1456
+
1457
+ .toggle input::after {
1458
+ content: '';
1459
+ position: absolute;
1460
+ top: 1px;
1461
+ left: 1px;
1462
+ width: 10px;
1463
+ height: 10px;
1464
+ background: var(--text-dim);
1465
+ border-radius: 50%;
1466
+ transition: transform 120ms ease, background 120ms ease;
1467
+ }
1468
+
1469
+ .toggle input:checked {
1470
+ background: var(--accent);
1471
+ border-color: var(--accent);
1472
+ }
1473
+
1474
+ .toggle input:checked::after {
1475
+ transform: translateX(12px);
1476
+ background: #fff;
1477
+ }
1478
+ .prompt-editor-wrap {
1479
+ position: relative;
1480
+ }
1481
+
1482
+ .prompt-editor-raw {
1483
+ field-sizing: content; /* auto-grow to the text, like the old contentEditable (Chromium 123+) */
1484
+ display: block;
1485
+ width: 100%;
1486
+ word-break: break-word;
1487
+ font-family: var(--font-mono), monospace;
1488
+ font-size: 12px;
1489
+ line-height: 1.5;
1490
+ margin: 0;
1491
+ padding: 0;
1492
+ border: none;
1493
+ background: transparent;
1494
+ color: inherit;
1495
+ resize: none;
1496
+ outline: none;
1497
+ }
1498
+
1499
+ .prompt-editor-raw:focus {
1500
+ outline: 1px solid #4a9eff;
1501
+ outline-offset: 4px;
1502
+ }
1503
+
1504
+ .prompt-editor-styled {
1505
+ cursor: text;
1506
+ }
1507
+
1508
+ .prompt-editor-reset {
1509
+ position: absolute;
1510
+ top: 0;
1511
+ right: 0;
1512
+ font-size: 11px;
1513
+ color: var(--text-dim);
1514
+ background: var(--bg, #1a1a1a);
1515
+ border: 1px solid var(--border);
1516
+ border-radius: 999px;
1517
+ padding: 2px 10px;
1518
+ cursor: pointer;
1519
+ font-family: inherit;
1520
+ z-index: 2;
1521
+ }
1522
+
1523
+ .prompt-editor-reset:hover {
1524
+ color: var(--text);
1525
+ border-color: var(--border-strong);
1526
+ }
1527
+ .agent-prompt-typing {
1528
+ display: inline-flex;
1529
+ align-items: center;
1530
+ gap: 4px;
1531
+ margin-top: 8px;
1532
+
1533
+ & .dot {
1534
+ width: 4px;
1535
+ height: 4px;
1536
+ border-radius: 50%;
1537
+ background: var(--text-faint);
1538
+ animation: agent-typing-bounce 1.2s infinite ease-in-out;
1539
+ }
1540
+ & .dot:nth-child(2) { animation-delay: 0.15s; }
1541
+ & .dot:nth-child(3) { animation-delay: 0.3s; }
1542
+ }
1543
+
1544
+ @keyframes agent-typing-bounce {
1545
+ 0%, 60%, 100% { opacity: 0.3; transform: translateY(0); }
1546
+ 30% { opacity: 1; transform: translateY(-3px); }
1547
+ }
1548
+
1549
+ .agent-prompt-error {
1550
+ font-size: 12px;
1551
+ color: #ff8a8a;
1552
+ }
1553
+
1554
+ .agent-prompt-output {
1555
+ flex: 1;
1556
+ min-height: 0;
1557
+ overflow: auto;
1558
+ border: 1px solid var(--border);
1559
+ border-radius: 6px;
1560
+ padding: 12px 16px;
1561
+ }
1562
+ .agent-view {
1563
+ flex: 1;
1564
+ min-height: 0;
1565
+ display: grid;
1566
+ grid-template-columns: 1fr 1fr;
1567
+ grid-template-rows: auto 1fr;
1568
+ padding: 16px 20px;
1569
+ position: relative;
1570
+ gap: 12px;
1571
+ }
1572
+
1573
+ .agent-view-actions {
1574
+ grid-column: 1 / -1;
1575
+ display: inline-flex;
1576
+ align-items: center;
1577
+ gap: 8px;
1578
+ justify-self: end;
1579
+ z-index: 1;
1580
+ }
1581
+
1582
+ .agent-view-block {
1583
+ min-height: 0;
1584
+ overflow: auto;
1585
+ border: 1px solid var(--border);
1586
+ border-radius: 6px;
1587
+ padding: 12px 16px;
1588
+ }
1589
+
1590
+ .agent-view-close {
1591
+ font-size: 14px;
1592
+ line-height: 1;
1593
+ color: var(--text-faint);
1594
+ background: transparent;
1595
+ border: 1px solid var(--border);
1596
+ border-radius: 4px;
1597
+ padding: 4px 8px;
1598
+ cursor: pointer;
1599
+
1600
+ &:hover { color: var(--text); background: var(--bg-elev-2); }
1601
+ }
1602
+
1603
+ .agent-view-raw {
1604
+ white-space: pre-wrap;
1605
+ word-break: break-word;
1606
+ font-family: var(--font-mono), monospace;
1607
+ font-size: 12px;
1608
+ line-height: 1.5;
1609
+ margin: 0;
1610
+ }
1611
+
1612
+ .agent-view-right {
1613
+ display: flex;
1614
+ flex-direction: column;
1615
+ gap: 12px;
1616
+ min-height: 0;
1617
+ min-width: 0;
1618
+ }
1619
+
1620
+ .agent-view-left,
1621
+ .agent-view-right > .agent-prompt-wrap,
1622
+ .agent-view-right > .agent-view-output-wrap {
1623
+ flex: 1 1 0;
1624
+ min-height: 0;
1625
+ min-width: 0;
1626
+ display: flex;
1627
+ flex-direction: column;
1628
+ gap: 6px;
1629
+ }
1630
+
1631
+ .agent-view-left > .agent-view-block,
1632
+ .agent-view-output-wrap > .agent-prompt-output,
1633
+ .agent-prompt-wrap > .agent-view-block {
1634
+ flex: 1;
1635
+ min-height: 0;
1636
+ }
1637
+
1638
+ .agent-prompt-wrap {
1639
+ position: relative;
1640
+ }
1641
+
1642
+ .agent-view-label {
1643
+ font-size: 11px;
1644
+ font-weight: 600;
1645
+ text-transform: uppercase;
1646
+ letter-spacing: 0.6px;
1647
+ color: var(--text-faint);
1648
+ }
1649
+
1650
+ .agent-prompt-actions {
1651
+ position: absolute;
1652
+ right: 8px;
1653
+ bottom: 8px;
1654
+ display: inline-flex;
1655
+ align-items: center;
1656
+ gap: 8px;
1657
+ padding: 4px 6px;
1658
+ background: var(--bg);
1659
+ }
1660
+
1661
+ .session-summary {
1662
+ width: 280px;
1663
+ flex-shrink: 0;
1664
+ display: flex;
1665
+ flex-direction: column;
1666
+ gap: 10px;
1667
+ padding: 12px 16px;
1668
+ border-left: 1px solid var(--border);
1669
+ background: var(--bg);
1670
+ overflow-y: auto;
1671
+ }
1672
+
1673
+ .summary-ai {
1674
+ display: flex;
1675
+ flex-direction: column;
1676
+ gap: 8px;
1677
+ padding-bottom: 15px;
1678
+ border-bottom: 1px solid var(--border);
1679
+ }
1680
+
1681
+ .summary-ai-row {
1682
+ display: flex;
1683
+ justify-content: flex-end;
1684
+ align-items: center;
1685
+ gap: 4px;
1686
+ }
1687
+
1688
+ .summary-ai-gear {
1689
+ padding: 4px 8px;
1690
+ font-size: 14px;
1691
+ line-height: 1;
1692
+ color: var(--text-faint);
1693
+ background: transparent;
1694
+ cursor: pointer;
1695
+ border: none;
1696
+
1697
+ &:hover { color: var(--text); background: transparent; }
1698
+ }
1699
+
1700
+
1701
+ .summary-ai-output {
1702
+ max-height: 320px;
1703
+ overflow: auto;
1704
+ background: var(--bg-elev-1, var(--bg));
1705
+ font-size: 12px;
1706
+
1707
+ .agent-prompt-output {
1708
+ padding: 0;
1709
+ border: none;
1710
+ border-radius: 0;
1711
+ }
1712
+ }
1713
+
1714
+
1715
+ .summary-section {
1716
+ display: flex;
1717
+ flex-direction: column;
1718
+ gap: 8px;
1719
+ padding-bottom: 10px;
1720
+ border-bottom: 1px solid var(--border);
1721
+
1722
+ &:last-child { border-bottom: none; }
1723
+ }
1724
+
1725
+ .summary-section-title {
1726
+ color: var(--text);
1727
+ font-size: 11px;
1728
+ font-weight: 600;
1729
+ text-transform: uppercase;
1730
+ letter-spacing: 0.6px;
1731
+ opacity: 0.85;
1732
+ }
1733
+
1734
+ .field {
1735
+ display: flex;
1736
+ justify-content: space-between;
1737
+ align-items: baseline;
1738
+ gap: 12px;
1739
+
1740
+ &.full {
1741
+ display: block;
1742
+ word-break: break-all;
1743
+
1744
+ & .field-value {
1745
+ text-align: left;
1746
+ font-weight: normal;
1747
+ font-family: inherit;
1748
+
1749
+ &.mono { font-family: var(--font-mono), monospace; }
1750
+ }
1751
+ }
1752
+
1753
+ &.has-below {
1754
+ display: flex;
1755
+ flex-direction: column;
1756
+ align-items: stretch;
1757
+ gap: 6px;
1758
+ flex-basis: 100%;
1759
+
1760
+ & .field-row {
1761
+ display: flex;
1762
+ justify-content: space-between;
1763
+ align-items: baseline;
1764
+ gap: 12px;
1765
+ }
1766
+ }
1767
+ }
1768
+
1769
+ .field-label { color: var(--text-faint); font-size: 11px; letter-spacing: 0.5px; }
1770
+
1771
+ .field-value {
1772
+ color: var(--text);
1773
+ font-family: var(--font-mono), monospace;
1774
+ font-weight: 500;
1775
+ text-align: right;
1776
+ white-space: nowrap;
1777
+ overflow: auto;
1778
+ font-size: 12px;
1779
+ word-break: break-word;
1780
+
1781
+ &.mono { font-family: var(--font-mono), monospace; }
1782
+
1783
+ & .warn { color: var(--warn); }
1784
+ & .danger { color: var(--danger); }
1785
+ }
1786
+
1787
+ .progress-bar {
1788
+ width: 100%;
1789
+ height: 8px;
1790
+ border-radius: 3px;
1791
+ background: var(--bg-elev-2);
1792
+ border: 1px solid var(--border);
1793
+ overflow: hidden;
1794
+
1795
+ & .progress-bar-fill {
1796
+ height: 100%;
1797
+ background: var(--accent);
1798
+ transition: width 120ms ease;
1799
+ }
1800
+
1801
+ &.tone-warn .progress-bar-fill { background: var(--warn); }
1802
+ &.tone-danger .progress-bar-fill { background: var(--danger); }
1803
+ }
1804
+ .session-view {
1805
+ display: flex;
1806
+ flex-direction: column;
1807
+ min-width: 0;
1808
+ min-height: 0;
1809
+
1810
+ &.empty {
1811
+ align-items: center;
1812
+ justify-content: center;
1813
+ color: var(--text-faint);
1814
+ }
1815
+ }
1816
+
1817
+ .view-body {
1818
+ flex: 1;
1819
+ display: flex;
1820
+ flex-direction: row;
1821
+ min-height: 0;
1822
+ min-width: 0;
1823
+ }
1824
+
1825
+ .view-conversation {
1826
+ flex: 1;
1827
+ min-width: 0;
1828
+ display: flex;
1829
+ flex-direction: column;
1830
+ min-height: 0;
1831
+ background: #000000;
1832
+ }
1833
+
1834
+ .view-tab-pane {
1835
+ flex: 1;
1836
+ min-height: 0;
1837
+ display: flex;
1838
+ }
1839
+
1840
+ .view-tab-pane-row {
1841
+ flex: 1;
1842
+ display: flex;
1843
+ flex-direction: row;
1844
+ min-width: 0;
1845
+ min-height: 0;
1846
+ }
1847
+
1848
+ .view-tab-pane-main {
1849
+ flex: 1;
1850
+ min-width: 0;
1851
+ min-height: 0;
1852
+ display: flex;
1853
+ flex-direction: column;
1854
+ }
1855
+
1856
+ .view-tabs-bar {
1857
+ display: flex;
1858
+ align-items: center;
1859
+ justify-content: space-between;
1860
+ padding: 0 20px 0 8px;
1861
+ border-bottom: 1px solid var(--border);
1862
+ }
1863
+
1864
+ .view-tabs {
1865
+ display: flex;
1866
+ }
1867
+
1868
+ .view-tab {
1869
+ background: transparent;
1870
+ border: 0;
1871
+ border-bottom: 2px solid transparent;
1872
+ border-radius:0px;
1873
+ margin-bottom: -1px; /* active underline sits on the bar's border */
1874
+ margin-top: 10px;
1875
+ padding: 9px 12px 7px;
1876
+ color: var(--text-faint);
1877
+ font: inherit;
1878
+ font-size: 12px;
1879
+ cursor: pointer;
1880
+
1881
+ &:hover { color: var(--text); }
1882
+ &.active { color: var(--text); border-bottom-color: var(--accent); }
1883
+ }
1884
+
1885
+ .view-tab-pane-content {
1886
+ flex: 1;
1887
+ min-height: 0;
1888
+ overflow-y: auto;
1889
+ padding: 22px 16px;
1890
+ container-type: inline-size; /* lets the token timeline collapse to dots when the pane is narrow */
1891
+ }
1892
+
1893
+ .view-tab-pane-row > .session-summary {
1894
+ overflow-y: auto;
1895
+ min-height: 0;
1896
+ }
1897
+ .statusbar-group { display: inline-flex; align-items: center; gap: 8px; cursor: default; }
1898
+
1899
+ .statusbar-seg {
1900
+ align-self: stretch;
1901
+ margin-right: -8px; /* eat the flex gap so the background reaches the next separator */
1902
+ padding-right: 8px;
1903
+ }
1904
+ .statusbar-seg-on { background: rgba(52, 211, 153, 0.08); }
1905
+ .statusbar-seg:hover { background: rgba(255, 255, 255, 0.07); }
1906
+ .statusbar-seg-on:hover { background: rgba(52, 211, 153, 0.18); }
1907
+
1908
+ /* Fixed-width slot so switching ON/off/DOWN/day-counts never shifts the bar (widest token: DOWN / 365d) */
1909
+ .statusbar-state { display: inline-block; min-width: 2.9em; }
1910
+
1911
+ /* ⚠ slot kept in layout even when hidden, so warn on/off doesn't shift the label */
1912
+ .statusbar-warn { visibility: hidden; }
1913
+ .statusbar-warn[data-on] { visibility: visible; }
1914
+
1915
+ .statusbar-off { color: var(--warn); }
1916
+ .statusbar-active { color: #34d399; }
1917
+
1918
+ /* Scoped to the StatusBar switch tooltips only — the global [title] tippies keep their own padding */
1919
+ .statusbar-tooltip { padding: 6px 8px; }
1920
+ .statusbar-tooltip p { margin: 0 0 6px; }
1921
+ .statusbar-tooltip pre {
1922
+ margin: 0 0 6px;
1923
+ padding: 6px 8px;
1924
+ border-radius: 4px;
1925
+ background: rgba(0, 0, 0, 0.35);
1926
+ font-size: 11px;
1927
+ overflow-x: auto;
1928
+ }
1929
+ .statusbar-tooltip ul { margin: 0 0 6px; padding-left: 18px; }
1930
+ .statusbar-tooltip li { margin: 2px 0; }
1931
+ .statusbar-tooltip > :last-child { margin-bottom: 0; }
1932
+
1933
+ /* Horizontal line always shown under the description */
1934
+ .statusbar-tooltip-footer {
1935
+ display: flex;
1936
+ flex-direction: column;
1937
+ align-items: center;
1938
+ gap: 8px;
1939
+ margin-top: 10px;
1940
+ padding-top: 10px;
1941
+ border-top: 1px solid var(--border);
1942
+ }
1943
+ /* Button centered, "?" toggle sitting right next to it (equal side columns keep the button centered) */
1944
+ .statusbar-tooltip-actions {
1945
+ align-self: stretch;
1946
+ display: grid;
1947
+ grid-template-columns: 1fr auto 1fr;
1948
+ align-items: center;
1949
+ gap: 8px;
1950
+ }
1951
+ .statusbar-tooltip .statusbar-tooltip-btn {
1952
+ grid-column: 2;
1953
+ min-width: 120px;
1954
+ padding: 6px 12px;
1955
+ }
1956
+ .statusbar-tooltip-help {
1957
+ grid-column: 3;
1958
+ justify-self: start;
1959
+ display: inline-flex;
1960
+ align-items: center;
1961
+ justify-content: center;
1962
+ width: 16px;
1963
+ height: 16px;
1964
+ padding: 0;
1965
+ border-radius: 50%;
1966
+ border: 1px solid var(--border-strong);
1967
+ background: var(--bg-elev-2);
1968
+ color: var(--text);
1969
+ font-size: 11px;
1970
+ font-weight: 700;
1971
+ line-height: 1;
1972
+ cursor: pointer;
1973
+ transition: background 120ms ease, border-color 120ms ease;
1974
+ }
1975
+ .statusbar-tooltip-help:hover,
1976
+ .statusbar-tooltip-help[aria-expanded="true"] { border-color: var(--text-dim); }
1977
+ /* Grayed uniformly, with a line below separating it from the controls */
1978
+ .statusbar-tooltip-changes {
1979
+ align-self: stretch;
1980
+ padding-bottom: 10px;
1981
+ border-bottom: 1px solid var(--border);
1982
+ color: var(--text-dim);
1983
+ }
1984
+ .statusbar-tooltip-changes-title { margin-bottom: 6px; }
1985
+ .statusbar-tooltip-changes pre,
1986
+ .statusbar-tooltip-changes code { color: inherit; }
1987
+ .statusbar-tooltip-keep {
1988
+ display: inline-flex;
1989
+ align-items: center;
1990
+ gap: 5px;
1991
+ white-space: nowrap;
1992
+ cursor: pointer;
1993
+ }
1994
+ .statusbar-tooltip-keep input {
1995
+ appearance: none;
1996
+ -webkit-appearance: none;
1997
+ width: 16px;
1998
+ height: 16px;
1999
+ background: var(--bg-elev-2);
2000
+ border: 1px solid var(--border-strong);
2001
+ border-radius: 3px;
2002
+ position: relative;
2003
+ cursor: pointer;
2004
+ margin: 0;
2005
+ transition: background 120ms ease, border-color 120ms ease;
2006
+ }
2007
+ .statusbar-tooltip-keep input:hover:not(:disabled),
2008
+ .statusbar-tooltip-keep input:checked { border-color: var(--text-dim); }
2009
+ .statusbar-tooltip-keep input:checked::after {
2010
+ content: '';
2011
+ position: absolute;
2012
+ top: 2px;
2013
+ left: 5px;
2014
+ width: 4px;
2015
+ height: 8px;
2016
+ border: solid #fff;
2017
+ border-width: 0 2px 2px 0;
2018
+ transform: rotate(45deg);
2019
+ }
2020
+ .statusbar-tooltip-keep:has(input:disabled) { opacity: 0.5; cursor: default; }
2021
+ .statusbar-tooltip-keep input:disabled { cursor: default; }
2022
+ .statusbar-tooltip .statusbar-tooltip-btn-green {
2023
+ color: #34d399;
2024
+ border-color: #34d399;
2025
+ }
2026
+ .statusbar-tooltip .statusbar-tooltip-btn-green:hover:not(:disabled) {
2027
+ background: rgba(52, 211, 153, 0.15);
2028
+ border-color: #6ee7b7;
2029
+ }
2030
+ .statusbar-tooltip .statusbar-tooltip-btn-blue {
2031
+ color: #60a5fa;
2032
+ border-color: #60a5fa;
2033
+ }
2034
+ .statusbar-tooltip .statusbar-tooltip-btn-blue:hover:not(:disabled) {
2035
+ background: rgba(96, 165, 250, 0.15);
2036
+ border-color: #93c5fd;
2037
+ }
2038
+ .statusbar-tooltip .statusbar-tooltip-btn-red {
2039
+ color: #f87171;
2040
+ border-color: #f87171;
2041
+ }
2042
+ .statusbar-tooltip .statusbar-tooltip-btn-red:hover:not(:disabled) {
2043
+ background: rgba(248, 113, 113, 0.15);
2044
+ border-color: #fca5a5;
2045
+ }
2046
+ .statusbar {
2047
+ flex: 0 0 24px;
2048
+ display: flex;
2049
+ align-items: center;
2050
+ justify-content: flex-end;
2051
+ gap: 8px;
2052
+ padding: 0 10px;
2053
+ border-top: 1px solid var(--border);
2054
+ font-size: 12px;
2055
+ color: var(--text-faint);
2056
+ }
2057
+
2058
+ .statusbar > * + * { padding-left: 8px; border-left: 1px solid rgb(255 255 255 / 0.17); }
2059
+
2060
+ /* Last in the bar, at the right edge — no seg gap-eating there; the path ellipsizes. */
2061
+ .statusbar-claude-dir {
2062
+ min-width: 0;
2063
+ margin-right: 0;
2064
+ padding-right: 0;
2065
+ }
2066
+ .statusbar-claude-dir .statusbar-msg {
2067
+ min-width: 0;
2068
+ overflow: hidden;
2069
+ text-overflow: ellipsis;
2070
+ white-space: nowrap;
2071
+ }
2072
+
2073
+ /* Session-loading indicator (compact progress bar, mirrors SessionSummary's .progress-bar) */
2074
+ /* Pinned to the left; the auto margin pushes everything else right.
2075
+ Fixed width + tabular-nums keep the layout from shifting as the count changes. */
2076
+ .statusbar-loading {
2077
+ display: inline-flex;
2078
+ align-items: center;
2079
+ gap: 8px;
2080
+ width: 220px;
2081
+ margin-right: auto;
2082
+ }
2083
+ .statusbar-loading-text { white-space: nowrap; }
2084
+ .statusbar-loading-num {
2085
+ display: inline-block;
2086
+ min-width: 4ch;
2087
+ text-align: right;
2088
+ font-variant-numeric: tabular-nums;
2089
+ }
2090
+ .statusbar-loading .progress-bar {
2091
+ margin-left: auto; /* pin the bar to the right edge so the count never nudges it */
2092
+ flex: none;
2093
+ width: 100px;
2094
+ height: 6px;
2095
+ border-radius: 3px;
2096
+ background: var(--bg-elev-2);
2097
+ border: 1px solid var(--border);
2098
+ overflow: hidden;
2099
+ }
2100
+ .statusbar-loading .progress-bar-fill {
2101
+ display: block;
2102
+ height: 100%;
2103
+ background: var(--accent);
2104
+ transition: width 120ms ease;
2105
+ }
2106
+ .app {
2107
+ display: flex;
2108
+ flex-direction: column;
2109
+ height: 100vh;
2110
+ overflow: hidden;
2111
+ }
2112
+
2113
+ .app-main {
2114
+ flex: 1;
2115
+ min-height: 0;
2116
+ overflow: hidden;
2117
+ }
2118
+
2119
+
2120
+ .app-loading {
2121
+ display: flex;
2122
+ align-items: center;
2123
+ justify-content: center;
2124
+ height: 100vh;
2125
+ color: var(--text-faint);
2126
+ font-size: 24px;
2127
+ }
2128
+
2129
+ .gantt-pane {
2130
+ display: flex;
2131
+ flex-direction: column;
2132
+ min-height: 0;
2133
+ overflow: hidden;
2134
+ }
2135
+
2136
+ .gantt-body {
2137
+ display: flex;
2138
+ flex: 1;
2139
+ min-height: 0;
2140
+ overflow: hidden;
2141
+
2142
+ & > * { min-width: 0; min-height: 0; }
2143
+ & > .gantt-wrap { flex: 1; }
2144
+ & > .gantt-side { flex: 0 0 247px; }
2145
+ }
2146
+
2147
+ .body-outer {
2148
+ display: flex;
2149
+ min-height: 0;
2150
+ min-width: 0;
2151
+ overflow: hidden;
2152
+
2153
+ & > * { flex: 1; min-height: 0; min-width: 0; }
2154
+ }
2155
+
2156
+ .body {
2157
+ flex: 1;
2158
+ min-height: 0;
2159
+ }
2160
+
2161
+ .body-pane {
2162
+ display: flex;
2163
+ min-width: 0;
2164
+ min-height: 0;
2165
+ overflow: hidden;
2166
+
2167
+ & > * { flex: 1; min-width: 0; min-height: 0; }
2168
+ }
2169
+
2170
+ .resize-handle {
2171
+ background: var(--border);
2172
+ transition: background 120ms;
2173
+
2174
+ &:hover,
2175
+ &[data-resize-handle-active] {
2176
+ background: var(--text-faint);
2177
+ }
2178
+
2179
+ &.resize-handle-v { width: 4px; cursor: col-resize; }
2180
+ &.resize-handle-h { height: 4px; cursor: row-resize; }
2181
+ }
2182
+ *, *::before, *::after {
2183
+ box-sizing: border-box;
2184
+ margin: 0;
2185
+ padding: 0;
2186
+ }
2187
+
2188
+ .tippy-box {
2189
+ --tooltip-border: #424e66; /* a step brighter than --border-strong so the edge reads on dark bg */
2190
+ font-family: var(--font-sans);
2191
+ font-size: 12px;
2192
+ background: var(--bg);
2193
+ background-clip: padding-box;
2194
+ border: 1px solid var(--tooltip-border);
2195
+ border-radius: 5px;
2196
+ }
2197
+ .tippy-box .tippy-content { background: #0e1011; border-radius: 4px; white-space: pre-line; } /* render \n in title attributes as line breaks */
2198
+ .tippy-box > .tippy-arrow { color: var(--bg); }
2199
+ /* Border around the arrow too (tippy's light-border technique): ::after draws a border-colored
2200
+ triangle offset 1px outward from the bg-colored ::before; z-index -1 tucks it behind the box. */
2201
+ .tippy-box > .tippy-arrow::after {
2202
+ content: "";
2203
+ position: absolute;
2204
+ z-index: -1;
2205
+ border-color: transparent;
2206
+ border-style: solid;
2207
+ }
2208
+ .tippy-box[data-placement^='top'] > .tippy-arrow::after { border-top-color: var(--tooltip-border); border-width: 7px 7px 0; top: 17px; left: 1px; }
2209
+ .tippy-box[data-placement^='bottom'] > .tippy-arrow::after { border-bottom-color: var(--tooltip-border); border-width: 0 7px 7px; bottom: 17px; left: 1px; }
2210
+ .tippy-box[data-placement^='left'] > .tippy-arrow::after { border-left-color: var(--tooltip-border); border-width: 7px 0 7px 7px; left: 17px; top: 1px; }
2211
+ .tippy-box[data-placement^='right'] > .tippy-arrow::after { border-right-color: var(--tooltip-border); border-width: 7px 7px 7px 0; right: 17px; top: 1px; }
2212
+
2213
+ :focus, :focus-visible {
2214
+ outline: none;
2215
+ }
2216
+
2217
+ :root {
2218
+ --bg: #0b0d12;
2219
+ --bg-elev: #11141b;
2220
+ --bg-elev-2: #0c1b26;
2221
+ --border: #232936;
2222
+ --border-strong: #303849;
2223
+ --text: #e6e9ef;
2224
+ --text-dim: #69717d;
2225
+ --text-faint: #6b7280;
2226
+ --accent: #60a5fa;
2227
+ --selected: #1e2a3d;
2228
+ --ok: #69717d;
2229
+ --warn: #fbbf24;
2230
+ --danger: #b34242;
2231
+ --font-sans: "Inter", ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
2232
+ --font-mono: "JetBrains Mono", ui-monospace, "Cascadia Code", Consolas, Menlo, monospace;
2233
+ font-family: var(--font-sans), sans-serif;
2234
+ font-feature-settings: "cv11", "ss01", "ss03";
2235
+ }
2236
+
2237
+
2238
+ html, body, #root { height: 100%; margin: 0; }
2239
+ body {
2240
+ background: var(--bg);
2241
+ color: var(--text);
2242
+ font-size: 13px;
2243
+ -webkit-font-smoothing: antialiased;
2244
+ }
2245
+
2246
+ button {
2247
+ background: var(--bg-elev-2);
2248
+ color: var(--text);
2249
+ border: 1px solid var(--border);
2250
+ border-radius: 4px;
2251
+ padding: 4px 10px;
2252
+ font-size: 12px;
2253
+ cursor: pointer;
2254
+ }
2255
+ button:hover { background: var(--border); }
2256
+
2257
+ .button-primary {
2258
+ font-size: 12px;
2259
+ color: #c6d2e3;
2260
+ cursor: pointer;
2261
+ user-select: none;
2262
+ background: transparent;
2263
+ padding: 4px 12px;
2264
+ border: 1px solid #5078a8;
2265
+ border-radius: 999px;
2266
+ font-family: inherit;
2267
+ min-width: 80px;
2268
+ text-align: center;
2269
+ white-space: nowrap;
2270
+ box-sizing: border-box;
2271
+ }
2272
+ .button-primary:hover:not(:disabled) {
2273
+ background: rgba(74, 158, 255, 0.15);
2274
+ border-color: #6cb4ff;
2275
+ }
2276
+ .button-primary:disabled { opacity: 0.6; cursor: default; }
2277
+
2278
+ .empty { padding: 20px; color: var(--text-faint); text-align: center; }
2279
+
2280
+ .warn-badge {
2281
+ display: inline-flex; align-items: center; justify-content: center;
2282
+ font-size: 10px; font-weight: 600; letter-spacing: 0.4px;
2283
+ width: 18px; height: 18px; border-radius: 50%;
2284
+ background: rgba(251, 191, 36, 0.18);
2285
+ color: var(--warn);
2286
+ }
2287
+
2288
+ .danger-badge {
2289
+ display: inline-flex; align-items: center; justify-content: center;
2290
+ font-size: 10px; font-weight: 600; letter-spacing: 0.4px;
2291
+ width: 18px; height: 18px; border-radius: 50%;
2292
+ background: rgba(179, 66, 66, 0.18);
2293
+ color: var(--danger);
2294
+ }
2295
+
2296
+ .fast-badge {
2297
+ display: inline-flex; align-items: center; justify-content: center;
2298
+ font-size: 12px; font-weight: 700; line-height: 1;
2299
+ width: 18px; height: 18px; border-radius: 50%;
2300
+ background: rgba(251, 146, 60, 0.2);
2301
+ color: #fb923c;
2302
+ }
2303
+
2304
+ /* Fast mode used but no multiplier known — reported cost is inaccurate. */
2305
+ .fast-badge-unknown {
2306
+ background: rgba(179, 66, 66, 0.18);
2307
+ color: var(--danger);
2308
+ }
2309
+
2310
+ /* Scrollbars */
2311
+ ::-webkit-scrollbar { width: 5px; height: 5px; }
2312
+ ::-webkit-scrollbar-track { background: transparent; }
2313
+ ::-webkit-scrollbar-thumb {
2314
+ background-color: rgba(255,255,255,0.15);
2315
+ border-radius: 6px;
2316
+ background-clip: padding-box;
2317
+ transition: background-color 0.2s ease;
2318
+ }
2319
+ :hover::-webkit-scrollbar-thumb { background-color: rgba(255,255,255,0.25); }
2320
+ ::-webkit-scrollbar-thumb:hover { background-color: rgba(255,255,255,0.4); }
2321
+
2322
+ /* Request-kind palette (classifyRequest in RequestParser) — used by RequestsView's list labels */
2323
+ .kind-main { color: #6b93c4; }
2324
+ .kind-tools { color: #6ea882; }
2325
+ .kind-agent { color: #9b87c9; }
2326
+ .kind-compact { color: #c2835f; }
2327
+ .kind-title { color: #7b53a0; }
2328
+ .kind-suggest { color: #6ea882; }
2329
+ .kind-web { color: #5fa8ad; }
2330
+ .kind-security { color: #c4937b; }
2331
+ .kind-quota, .kind-status, .kind-count { color: var(--text-faint); }