@mtharrison/loupe 1.0.0 → 1.0.1

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.
@@ -97,6 +97,17 @@ select {
97
97
  button {
98
98
  cursor: pointer;
99
99
  }
100
+ .sr-only {
101
+ position: absolute;
102
+ width: 1px;
103
+ height: 1px;
104
+ padding: 0;
105
+ margin: -1px;
106
+ overflow: hidden;
107
+ clip: rect(0, 0, 0, 0);
108
+ white-space: nowrap;
109
+ border: 0;
110
+ }
100
111
  pre {
101
112
  margin: 0;
102
113
  white-space: pre-wrap;
@@ -421,7 +432,12 @@ pre {
421
432
  align-items: center;
422
433
  justify-content: space-between;
423
434
  gap: 0.75rem;
424
- padding: 0.95rem 0.95rem 0;
435
+ margin: 0.4rem 0.4rem 0;
436
+ padding: 0.88rem 0.92rem;
437
+ border: 1px solid var(--line);
438
+ border-radius: 16px;
439
+ background: rgba(250, 252, 255, 0.9);
440
+ box-shadow: 0 8px 22px rgba(32, 50, 76, 0.04), inset 0 1px 0 rgba(255, 255, 255, 0.7);
425
441
  }
426
442
  .session-sidebar-toolbar-copy {
427
443
  display: flex;
@@ -551,10 +567,10 @@ pre {
551
567
  .theme-switch {
552
568
  display: inline-flex;
553
569
  align-items: center;
554
- gap: 0.28rem;
555
- min-height: 2.75rem;
556
- padding: 0.18rem;
557
- border-radius: 14px;
570
+ gap: 0.18rem;
571
+ min-height: 2.5rem;
572
+ padding: 0.14rem;
573
+ border-radius: 999px;
558
574
  border: 1px solid var(--line);
559
575
  background: rgba(245, 249, 253, 0.92);
560
576
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.7);
@@ -563,13 +579,15 @@ pre {
563
579
  .theme-switch-button {
564
580
  display: inline-flex;
565
581
  align-items: center;
566
- gap: 0.5rem;
582
+ justify-content: center;
583
+ gap: 0;
567
584
  border: 0;
568
585
  background: transparent;
569
586
  color: var(--muted-foreground);
570
- border-radius: 10px;
571
- min-height: 2.35rem;
572
- padding: 0.5rem 0.92rem;
587
+ border-radius: 999px;
588
+ width: 2.2rem;
589
+ min-height: 2.2rem;
590
+ padding: 0;
573
591
  font-weight: 650;
574
592
  line-height: 1;
575
593
  }
@@ -578,6 +596,11 @@ pre {
578
596
  color: var(--primary-strong);
579
597
  box-shadow: inset 0 0 0 1px rgba(40, 93, 168, 0.2), 0 1px 2px rgba(19, 46, 72, 0.08);
580
598
  }
599
+ .tag-filter-toggle.is-active {
600
+ border-color: rgba(40, 93, 168, 0.2);
601
+ background: rgba(40, 93, 168, 0.08);
602
+ color: var(--primary-strong);
603
+ }
581
604
  .clear-traces-button.is-confirming {
582
605
  border-color: rgba(181, 82, 93, 0.34);
583
606
  background: rgba(181, 82, 93, 0.08);
@@ -1017,13 +1040,16 @@ pre {
1017
1040
  line-height: 1.4;
1018
1041
  }
1019
1042
  .hierarchy-timeline-axis {
1043
+ --timeline-time-column: 4.75rem;
1044
+ --timeline-column-gap: 0.45rem;
1020
1045
  display: grid;
1021
- grid-template-columns: 4.75rem minmax(0, 1fr) minmax(13rem, 19rem);
1022
- gap: 0.75rem;
1046
+ grid-template-columns: var(--timeline-time-column) minmax(0, 1fr) minmax(13rem, 19rem);
1047
+ gap: var(--timeline-column-gap);
1023
1048
  align-items: end;
1024
1049
  }
1025
1050
  .hierarchy-timeline-axis-track,
1026
1051
  .hierarchy-timeline-row-track {
1052
+ box-sizing: border-box;
1027
1053
  background-image:
1028
1054
  linear-gradient(
1029
1055
  90deg,
@@ -1036,6 +1062,7 @@ pre {
1036
1062
  .hierarchy-timeline-axis-track {
1037
1063
  position: relative;
1038
1064
  height: 1.6rem;
1065
+ padding: 0 0.82rem 0 0.18rem;
1039
1066
  }
1040
1067
  .hierarchy-timeline-axis-track::before {
1041
1068
  content: "";
@@ -1085,22 +1112,28 @@ pre {
1085
1112
  .hierarchy-timeline-list {
1086
1113
  display: flex;
1087
1114
  flex-direction: column;
1088
- gap: 0.22rem;
1115
+ gap: 0;
1089
1116
  max-height: 28rem;
1090
1117
  overflow: auto;
1091
1118
  padding-right: 0.2rem;
1092
1119
  }
1093
1120
  .hierarchy-timeline-row {
1121
+ --timeline-time-column: 4.75rem;
1122
+ --timeline-column-gap: 0.45rem;
1123
+ --timeline-indent: 0.94rem;
1124
+ --timeline-gutter-base: 1.16rem;
1125
+ --timeline-gutter-width: calc( var(--timeline-depth, 0) * var(--timeline-indent) + var(--timeline-gutter-base) );
1126
+ --timeline-branch-offset: calc( var(--timeline-depth, 0) * var(--timeline-indent) + 0.12rem );
1094
1127
  --timeline-row-color: rgba(69, 104, 222, 0.88);
1128
+ position: relative;
1095
1129
  display: grid;
1096
- grid-template-columns: 4.75rem minmax(0, 1fr) minmax(13rem, 19rem);
1097
- gap: 0.75rem;
1130
+ grid-template-columns: var(--timeline-time-column) minmax(0, 1fr) minmax(13rem, 19rem);
1131
+ gap: var(--timeline-column-gap);
1098
1132
  align-items: center;
1099
1133
  width: 100%;
1100
- padding: 0.44rem 0.55rem;
1101
- border-radius: 12px;
1102
- border: 1px solid transparent;
1103
- background: rgba(255, 255, 255, 0.42);
1134
+ border: 0;
1135
+ background: transparent;
1136
+ padding: 0.12rem 0.55rem;
1104
1137
  color: inherit;
1105
1138
  cursor: default;
1106
1139
  font: inherit;
@@ -1109,38 +1142,59 @@ pre {
1109
1142
  content-visibility: auto;
1110
1143
  contain-intrinsic-size: 3rem;
1111
1144
  }
1145
+ .hierarchy-timeline-row::before {
1146
+ content: "";
1147
+ position: absolute;
1148
+ top: 0.14rem;
1149
+ right: 0.55rem;
1150
+ bottom: 0.14rem;
1151
+ left: calc(0.55rem + var(--timeline-time-column) + var(--timeline-column-gap) + var(--timeline-gutter-width));
1152
+ border-radius: 12px;
1153
+ border: 1px solid transparent;
1154
+ background: rgba(255, 255, 255, 0.42);
1155
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.6), 0 4px 12px rgba(32, 50, 76, 0.03);
1156
+ pointer-events: none;
1157
+ z-index: 0;
1158
+ }
1159
+ .hierarchy-timeline-row > * {
1160
+ position: relative;
1161
+ z-index: 1;
1162
+ }
1112
1163
  .hierarchy-timeline-row.is-clickable {
1113
1164
  cursor: pointer;
1165
+ }
1166
+ .hierarchy-timeline-row.is-clickable::before {
1114
1167
  border-color: rgba(40, 93, 168, 0.08);
1115
- background: rgba(255, 255, 255, 0.7);
1168
+ background: rgba(255, 255, 255, 0.72);
1116
1169
  box-shadow: 0 6px 18px rgba(32, 50, 76, 0.04), inset 0 1px 0 rgba(255, 255, 255, 0.72);
1117
1170
  }
1118
- .hierarchy-timeline-row.is-clickable:hover {
1171
+ .hierarchy-timeline-row.is-clickable:hover::before {
1119
1172
  border-color: rgba(40, 93, 168, 0.14);
1120
1173
  background: rgba(242, 248, 255, 0.86);
1121
1174
  }
1122
1175
  .hierarchy-timeline-row.is-structure {
1123
- border-style: dashed;
1124
- border-color: rgba(84, 100, 125, 0.08);
1125
- background: rgba(255, 255, 255, 0.24);
1126
- box-shadow: none;
1176
+ }
1177
+ .hierarchy-timeline-row.is-structure::before {
1178
+ border-color: color-mix(in srgb, var(--timeline-row-color) 12%, rgba(84, 100, 125, 0.08));
1179
+ background: color-mix(in srgb, var(--timeline-row-color) 5%, rgba(255, 255, 255, 0.56));
1180
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.6), 0 4px 12px rgba(32, 50, 76, 0.02);
1127
1181
  }
1128
1182
  .hierarchy-timeline-row:focus-visible {
1129
1183
  outline: 2px solid rgba(40, 93, 168, 0.22);
1130
1184
  outline-offset: 2px;
1131
1185
  }
1132
- .hierarchy-timeline-row.is-in-path {
1186
+ .hierarchy-timeline-row.is-in-path::before {
1133
1187
  background: rgba(240, 246, 255, 0.54);
1134
1188
  }
1135
- .hierarchy-timeline-row.is-structure.is-in-path {
1189
+ .hierarchy-timeline-row.is-structure.is-in-path::before {
1136
1190
  background: rgba(240, 246, 255, 0.38);
1137
1191
  }
1138
- .hierarchy-timeline-row.is-detail-trace:not(.is-active) {
1192
+ .hierarchy-timeline-row.is-detail-trace:not(.is-active)::before {
1139
1193
  border-color: rgba(40, 93, 168, 0.16);
1140
1194
  background: rgba(238, 246, 255, 0.76);
1141
1195
  box-shadow: inset 2px 0 0 rgba(40, 93, 168, 0.58), 0 8px 18px rgba(32, 50, 76, 0.05);
1142
1196
  }
1143
- .hierarchy-timeline-row.is-active {
1197
+ .hierarchy-timeline-row.is-active::before {
1144
1198
  border-color: rgba(40, 93, 168, 0.18);
1145
1199
  background: rgba(234, 243, 255, 0.82);
1146
1200
  box-shadow: inset 3px 0 0 rgba(40, 93, 168, 0.74), 0 8px 20px rgba(32, 50, 76, 0.06);
@@ -1162,6 +1216,10 @@ pre {
1162
1216
  --timeline-row-color: rgba(61, 108, 225, 0.9);
1163
1217
  }
1164
1218
  .hierarchy-timeline-row-time {
1219
+ align-self: stretch;
1220
+ display: flex;
1221
+ align-items: center;
1222
+ justify-content: flex-end;
1165
1223
  color: var(--muted-foreground);
1166
1224
  font-family:
1167
1225
  ui-monospace,
@@ -1174,26 +1232,47 @@ pre {
1174
1232
  text-align: right;
1175
1233
  white-space: nowrap;
1176
1234
  }
1177
- .hierarchy-timeline-row-labels {
1235
+ .hierarchy-timeline-row-branch {
1236
+ display: grid;
1237
+ grid-template-columns: var(--timeline-gutter-width) minmax(0, 1fr);
1238
+ align-items: stretch;
1239
+ min-width: 0;
1240
+ }
1241
+ .hierarchy-timeline-row-gutter {
1178
1242
  position: relative;
1179
- display: flex;
1180
1243
  min-width: 0;
1181
- flex-direction: column;
1182
- gap: 0.15rem;
1183
- padding-left: calc(var(--timeline-depth, 0) * 0.95rem);
1184
1244
  }
1185
- .hierarchy-timeline-row-labels::before {
1245
+ .hierarchy-timeline-row-gutter::before {
1186
1246
  content: "";
1187
1247
  position: absolute;
1188
- left: calc(var(--timeline-depth, 0) * 0.95rem - 0.42rem);
1189
- top: 0.2rem;
1190
- bottom: 0.2rem;
1248
+ top: -0.14rem;
1249
+ left: var(--timeline-branch-offset);
1250
+ bottom: -0.14rem;
1191
1251
  width: 1px;
1192
- background: rgba(84, 100, 125, 0.12);
1252
+ background: color-mix(in srgb, var(--timeline-row-color) 18%, rgba(84, 100, 125, 0.12));
1253
+ }
1254
+ .hierarchy-timeline-row-gutter::after {
1255
+ content: "";
1256
+ position: absolute;
1257
+ top: 50%;
1258
+ left: var(--timeline-branch-offset);
1259
+ right: 0.08rem;
1260
+ height: 1px;
1261
+ background: color-mix(in srgb, var(--timeline-row-color) 18%, rgba(84, 100, 125, 0.12));
1262
+ transform: translateY(-50%);
1193
1263
  }
1194
- .hierarchy-timeline-row.is-root .hierarchy-timeline-row-labels::before {
1264
+ .hierarchy-timeline-row.is-root .hierarchy-timeline-row-gutter::before,
1265
+ .hierarchy-timeline-row.is-root .hierarchy-timeline-row-gutter::after {
1195
1266
  display: none;
1196
1267
  }
1268
+ .hierarchy-timeline-row-labels {
1269
+ position: relative;
1270
+ display: flex;
1271
+ min-width: 0;
1272
+ flex-direction: column;
1273
+ gap: 0.18rem;
1274
+ padding: 0.58rem 0 0.58rem 0.82rem;
1275
+ }
1197
1276
  .hierarchy-timeline-row-title {
1198
1277
  display: flex;
1199
1278
  align-items: center;
@@ -1218,6 +1297,7 @@ pre {
1218
1297
  .hierarchy-timeline-row.is-structure .hierarchy-timeline-row-title-text {
1219
1298
  font-size: 0.88rem;
1220
1299
  font-weight: 600;
1300
+ color: color-mix(in srgb, var(--timeline-row-color) 42%, var(--foreground));
1221
1301
  }
1222
1302
  .hierarchy-timeline-row.is-structure .hierarchy-timeline-row-meta {
1223
1303
  font-size: 0.74rem;
@@ -1229,6 +1309,7 @@ pre {
1229
1309
  column-gap: 0.65rem;
1230
1310
  row-gap: 0.45rem;
1231
1311
  align-items: center;
1312
+ padding: 0.58rem 0.82rem 0.58rem 0.18rem;
1232
1313
  }
1233
1314
  .hierarchy-timeline-row-track {
1234
1315
  grid-area: track;
@@ -1330,7 +1411,31 @@ pre {
1330
1411
  min-width: 0;
1331
1412
  flex: 1;
1332
1413
  flex-direction: column;
1333
- gap: 0.45rem;
1414
+ gap: 0.55rem;
1415
+ }
1416
+ .trace-detail-breadcrumb {
1417
+ display: flex;
1418
+ align-items: center;
1419
+ flex-wrap: wrap;
1420
+ gap: 0.28rem 0.4rem;
1421
+ color: var(--muted-foreground);
1422
+ font-size: 0.8rem;
1423
+ font-weight: 650;
1424
+ line-height: 1.4;
1425
+ }
1426
+ .trace-detail-breadcrumb-separator {
1427
+ width: 0.9rem;
1428
+ height: 0.9rem;
1429
+ color: rgba(84, 100, 125, 0.5);
1430
+ }
1431
+ .trace-detail-breadcrumb-segment {
1432
+ white-space: nowrap;
1433
+ }
1434
+ .trace-detail-breadcrumb-segment.is-current {
1435
+ border-radius: 999px;
1436
+ padding: 0.18rem 0.56rem;
1437
+ background: rgba(40, 93, 168, 0.08);
1438
+ color: var(--primary-strong);
1334
1439
  }
1335
1440
  .trace-detail-title-row {
1336
1441
  display: flex;
@@ -1341,7 +1446,7 @@ pre {
1341
1446
  }
1342
1447
  .trace-detail-title-row h2 {
1343
1448
  margin: 0;
1344
- font-size: 1.24rem;
1449
+ font-size: 1.34rem;
1345
1450
  letter-spacing: -0.02em;
1346
1451
  }
1347
1452
  .trace-detail-heading p {
@@ -1351,7 +1456,8 @@ pre {
1351
1456
  }
1352
1457
  .trace-detail-subtitle {
1353
1458
  color: var(--muted-foreground);
1354
- font-size: 0.84rem;
1459
+ font-size: 0.82rem;
1460
+ line-height: 1.45;
1355
1461
  }
1356
1462
  .trace-detail-meta {
1357
1463
  display: flex;
@@ -1454,6 +1560,11 @@ pre {
1454
1560
  justify-content: space-between;
1455
1561
  gap: 0.65rem;
1456
1562
  }
1563
+ .trace-detail-json-toggle {
1564
+ min-height: 2.4rem;
1565
+ padding: 0.52rem 0.82rem;
1566
+ color: var(--muted-foreground);
1567
+ }
1457
1568
  .trace-detail-scroll {
1458
1569
  min-height: 0;
1459
1570
  flex: 1;
@@ -1671,6 +1782,18 @@ pre {
1671
1782
  color: var(--foreground);
1672
1783
  opacity: 1;
1673
1784
  }
1785
+ .detail-tabs {
1786
+ padding: 0.24rem;
1787
+ border-radius: 16px;
1788
+ background: rgba(243, 247, 251, 0.98);
1789
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.72), 0 1px 2px rgba(32, 50, 76, 0.04);
1790
+ }
1791
+ .detail-tabs .tabs-trigger {
1792
+ padding: 0.62rem 0.94rem;
1793
+ font-size: 0.84rem;
1794
+ font-weight: 700;
1795
+ letter-spacing: -0.01em;
1796
+ }
1674
1797
  .tabs-root[data-value=conversation] .tabs-trigger[data-tab-value=conversation],
1675
1798
  .tabs-root[data-value=request] .tabs-trigger[data-tab-value=request],
1676
1799
  .tabs-root[data-value=response] .tabs-trigger[data-tab-value=response],
@@ -1922,19 +2045,21 @@ pre {
1922
2045
  }
1923
2046
  .expandable-toggle {
1924
2047
  align-self: flex-start;
1925
- border: 0;
1926
- border-radius: 8px;
1927
- background: transparent;
2048
+ margin-top: 0.22rem;
2049
+ border: 1px solid rgba(40, 93, 168, 0.12);
2050
+ border-radius: 999px;
2051
+ background: rgba(40, 93, 168, 0.06);
1928
2052
  color: var(--primary-strong);
1929
2053
  cursor: pointer;
1930
- font-size: 0.82rem;
2054
+ font-size: 0.78rem;
1931
2055
  font-weight: 650;
1932
2056
  line-height: 1;
1933
- padding: 0;
2057
+ padding: 0.42rem 0.7rem;
1934
2058
  }
1935
2059
  .expandable-toggle:hover {
1936
- text-decoration: underline;
1937
- text-underline-offset: 0.18em;
2060
+ text-decoration: none;
2061
+ border-color: rgba(40, 93, 168, 0.18);
2062
+ background: rgba(40, 93, 168, 0.1);
1938
2063
  }
1939
2064
  .conversation-bubble p {
1940
2065
  margin: 0;
@@ -2527,6 +2652,16 @@ pre {
2527
2652
  color: var(--primary-strong);
2528
2653
  box-shadow: inset 0 0 0 1px rgba(134, 184, 255, 0.2), 0 1px 2px rgba(1, 7, 18, 0.24);
2529
2654
  }
2655
+ :root[data-theme=dark] .tag-filter-toggle.is-active {
2656
+ border-color: rgba(134, 184, 255, 0.24);
2657
+ background: rgba(134, 184, 255, 0.14);
2658
+ color: var(--primary-strong);
2659
+ }
2660
+ :root[data-theme=dark] .session-sidebar-toolbar {
2661
+ border-color: rgba(128, 153, 189, 0.14);
2662
+ background: rgba(16, 24, 36, 0.82);
2663
+ box-shadow: 0 10px 24px rgba(2, 10, 24, 0.18), inset 0 1px 0 rgba(255, 255, 255, 0.04);
2664
+ }
2530
2665
  :root[data-theme=dark] .trace-group-button,
2531
2666
  :root[data-theme=dark] .nav-item,
2532
2667
  :root[data-theme=dark] .tree-node-card,
@@ -2622,33 +2757,37 @@ pre {
2622
2757
  color: color-mix(in srgb, var(--semantic-badge-color) 74%, white);
2623
2758
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06);
2624
2759
  }
2625
- :root[data-theme=dark] .hierarchy-timeline-row {
2626
- background: rgba(22, 32, 47, 0.52);
2627
- }
2628
2760
  :root[data-theme=dark] .hierarchy-timeline-hint {
2629
2761
  color: rgba(182, 197, 219, 0.72);
2630
2762
  }
2631
- :root[data-theme=dark] .hierarchy-timeline-row.is-clickable {
2763
+ :root[data-theme=dark] .hierarchy-timeline-row::before {
2764
+ background: rgba(22, 32, 47, 0.52);
2765
+ }
2766
+ :root[data-theme=dark] .hierarchy-timeline-row.is-clickable::before {
2632
2767
  border-color: rgba(134, 184, 255, 0.12);
2633
2768
  background: rgba(24, 35, 52, 0.74);
2634
2769
  box-shadow: 0 8px 20px rgba(2, 10, 24, 0.16), inset 0 1px 0 rgba(255, 255, 255, 0.04);
2635
2770
  }
2636
- :root[data-theme=dark] .hierarchy-timeline-row.is-structure {
2637
- border-color: rgba(128, 153, 189, 0.08);
2638
- background: rgba(18, 27, 40, 0.26);
2771
+ :root[data-theme=dark] .hierarchy-timeline-row.is-clickable:hover::before {
2772
+ border-color: rgba(134, 184, 255, 0.2);
2773
+ background: rgba(29, 43, 64, 0.88);
2774
+ }
2775
+ :root[data-theme=dark] .hierarchy-timeline-row.is-structure::before {
2776
+ border-color: color-mix(in srgb, var(--timeline-row-color) 18%, rgba(128, 153, 189, 0.08));
2777
+ background: color-mix(in srgb, var(--timeline-row-color) 8%, rgba(18, 27, 40, 0.4));
2639
2778
  }
2640
- :root[data-theme=dark] .hierarchy-timeline-row.is-in-path {
2779
+ :root[data-theme=dark] .hierarchy-timeline-row.is-in-path::before {
2641
2780
  background: rgba(27, 40, 60, 0.7);
2642
2781
  }
2643
- :root[data-theme=dark] .hierarchy-timeline-row.is-structure.is-in-path {
2782
+ :root[data-theme=dark] .hierarchy-timeline-row.is-structure.is-in-path::before {
2644
2783
  background: rgba(24, 35, 52, 0.38);
2645
2784
  }
2646
- :root[data-theme=dark] .hierarchy-timeline-row.is-detail-trace:not(.is-active) {
2785
+ :root[data-theme=dark] .hierarchy-timeline-row.is-detail-trace:not(.is-active)::before {
2647
2786
  border-color: rgba(134, 184, 255, 0.16);
2648
2787
  background: rgba(26, 38, 57, 0.84);
2649
2788
  box-shadow: inset 2px 0 0 rgba(134, 184, 255, 0.6), 0 8px 18px rgba(2, 10, 24, 0.18);
2650
2789
  }
2651
- :root[data-theme=dark] .hierarchy-timeline-row.is-active {
2790
+ :root[data-theme=dark] .hierarchy-timeline-row.is-active::before {
2652
2791
  border-color: rgba(134, 184, 255, 0.2);
2653
2792
  background: rgba(31, 45, 66, 0.94);
2654
2793
  box-shadow: inset 3px 0 0 rgba(134, 184, 255, 0.82), 0 10px 22px rgba(2, 10, 24, 0.18);
@@ -2660,6 +2799,13 @@ pre {
2660
2799
  :root[data-theme=dark] .hierarchy-timeline-title {
2661
2800
  color: rgba(182, 197, 219, 0.78);
2662
2801
  }
2802
+ :root[data-theme=dark] .hierarchy-timeline-row-gutter::before,
2803
+ :root[data-theme=dark] .hierarchy-timeline-row-gutter::after {
2804
+ background: color-mix(in srgb, var(--timeline-row-color) 24%, rgba(128, 153, 189, 0.14));
2805
+ }
2806
+ :root[data-theme=dark] .hierarchy-timeline-row.is-structure .hierarchy-timeline-row-title-text {
2807
+ color: color-mix(in srgb, var(--timeline-row-color) 48%, white);
2808
+ }
2663
2809
  :root[data-theme=dark] .hierarchy-timeline-row-inspect {
2664
2810
  border-color: rgba(134, 184, 255, 0.18);
2665
2811
  background: rgba(134, 184, 255, 0.12);
@@ -2669,12 +2815,26 @@ pre {
2669
2815
  border-color: rgba(134, 184, 255, 0.24);
2670
2816
  background: rgba(134, 184, 255, 0.18);
2671
2817
  }
2818
+ :root[data-theme=dark] .trace-detail-breadcrumb {
2819
+ color: rgba(182, 197, 219, 0.74);
2820
+ }
2821
+ :root[data-theme=dark] .trace-detail-breadcrumb-separator {
2822
+ color: rgba(182, 197, 219, 0.42);
2823
+ }
2824
+ :root[data-theme=dark] .trace-detail-breadcrumb-segment.is-current {
2825
+ background: rgba(134, 184, 255, 0.14);
2826
+ color: rgba(186, 214, 255, 0.96);
2827
+ }
2828
+ :root[data-theme=dark] .trace-detail-subtitle,
2829
+ :root[data-theme=dark] .trace-detail-json-toggle {
2830
+ color: rgba(182, 197, 219, 0.74);
2831
+ }
2672
2832
  :root[data-theme=dark] .hierarchy-timeline-row-title-text {
2673
2833
  color: var(--foreground);
2674
2834
  }
2675
2835
  :root[data-theme=dark] .hierarchy-timeline-axis-track::before,
2676
2836
  :root[data-theme=dark] .hierarchy-timeline-axis-tick::before,
2677
- :root[data-theme=dark] .hierarchy-timeline-row-labels::before,
2837
+ :root[data-theme=dark] .hierarchy-timeline-row-gutter::before,
2678
2838
  :root[data-theme=dark] .hierarchy-timeline-row-track::before {
2679
2839
  background: rgba(128, 153, 189, 0.14);
2680
2840
  }
@@ -2706,6 +2866,10 @@ pre {
2706
2866
  :root[data-theme=dark] .tabs-list {
2707
2867
  background: rgba(16, 24, 36, 0.92);
2708
2868
  }
2869
+ :root[data-theme=dark] .detail-tabs {
2870
+ background: rgba(16, 24, 36, 0.96);
2871
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04), 0 1px 2px rgba(1, 7, 18, 0.22);
2872
+ }
2709
2873
  :root[data-theme=dark] .tabs-trigger:hover {
2710
2874
  background: rgba(134, 184, 255, 0.08);
2711
2875
  color: var(--foreground);
@@ -2806,6 +2970,15 @@ pre {
2806
2970
  background: rgba(29, 42, 60, 0.92);
2807
2971
  border-color: rgba(128, 153, 189, 0.12);
2808
2972
  }
2973
+ :root[data-theme=dark] .expandable-toggle {
2974
+ border-color: rgba(134, 184, 255, 0.18);
2975
+ background: rgba(134, 184, 255, 0.1);
2976
+ color: rgba(186, 214, 255, 0.96);
2977
+ }
2978
+ :root[data-theme=dark] .expandable-toggle:hover {
2979
+ border-color: rgba(134, 184, 255, 0.24);
2980
+ background: rgba(134, 184, 255, 0.16);
2981
+ }
2809
2982
  :root[data-theme=dark] .workspace-grid::-webkit-scrollbar-thumb {
2810
2983
  background: rgba(128, 153, 189, 0.28);
2811
2984
  }
@@ -2877,10 +3050,12 @@ pre {
2877
3050
  padding-right: 0;
2878
3051
  }
2879
3052
  .hierarchy-timeline-axis {
2880
- grid-template-columns: 4.5rem minmax(0, 1fr) minmax(11rem, 1fr);
3053
+ --timeline-time-column: 4.5rem;
3054
+ grid-template-columns: var(--timeline-time-column) minmax(0, 1fr) minmax(11rem, 1fr);
2881
3055
  }
2882
3056
  .hierarchy-timeline-row {
2883
- grid-template-columns: 4.5rem minmax(0, 1fr) minmax(11rem, 1fr);
3057
+ --timeline-time-column: 4.5rem;
3058
+ grid-template-columns: var(--timeline-time-column) minmax(0, 1fr) minmax(11rem, 1fr);
2884
3059
  }
2885
3060
  .sheet-panel {
2886
3061
  width: min(100vw, 48rem);
@@ -2969,6 +3144,17 @@ pre {
2969
3144
  .trace-detail-secondary .hierarchy-timeline-row-time {
2970
3145
  text-align: left;
2971
3146
  }
3147
+ .trace-detail-secondary .hierarchy-timeline-row::before {
3148
+ top: 1.7rem;
3149
+ left: 0;
3150
+ right: 0;
3151
+ }
3152
+ .trace-detail-secondary .hierarchy-timeline-row-branch {
3153
+ grid-template-columns: minmax(0, 1fr);
3154
+ }
3155
+ .trace-detail-secondary .hierarchy-timeline-row-gutter {
3156
+ display: none;
3157
+ }
2972
3158
  .trace-detail-secondary .hierarchy-timeline-row-bars {
2973
3159
  grid-column: auto;
2974
3160
  grid-template-columns: minmax(0, 1fr) auto;
@@ -2989,10 +3175,24 @@ pre {
2989
3175
  }
2990
3176
  .hierarchy-timeline-row {
2991
3177
  grid-template-columns: minmax(0, 1fr);
3178
+ padding-left: 0;
3179
+ padding-right: 0;
2992
3180
  }
2993
3181
  .hierarchy-timeline-row-time {
3182
+ justify-content: flex-start;
2994
3183
  text-align: left;
2995
3184
  }
3185
+ .hierarchy-timeline-row::before {
3186
+ top: 1.7rem;
3187
+ left: 0;
3188
+ right: 0;
3189
+ }
3190
+ .hierarchy-timeline-row-branch {
3191
+ grid-template-columns: minmax(0, 1fr);
3192
+ }
3193
+ .hierarchy-timeline-row-gutter {
3194
+ display: none;
3195
+ }
2996
3196
  .hierarchy-timeline-row-bars {
2997
3197
  grid-column: auto;
2998
3198
  grid-template-columns: minmax(0, 1fr) auto;
@@ -21696,25 +21696,35 @@ var init_check = __esm({
21696
21696
  }
21697
21697
  });
21698
21698
 
21699
+ // node_modules/lucide-react/dist/esm/icons/chevron-right.js
21700
+ var __iconNode6, ChevronRight;
21701
+ var init_chevron_right = __esm({
21702
+ "node_modules/lucide-react/dist/esm/icons/chevron-right.js"() {
21703
+ init_createLucideIcon();
21704
+ __iconNode6 = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
21705
+ ChevronRight = createLucideIcon("chevron-right", __iconNode6);
21706
+ }
21707
+ });
21708
+
21699
21709
  // node_modules/lucide-react/dist/esm/icons/copy.js
21700
- var __iconNode6, Copy;
21710
+ var __iconNode7, Copy;
21701
21711
  var init_copy = __esm({
21702
21712
  "node_modules/lucide-react/dist/esm/icons/copy.js"() {
21703
21713
  init_createLucideIcon();
21704
- __iconNode6 = [
21714
+ __iconNode7 = [
21705
21715
  ["rect", { width: "14", height: "14", x: "8", y: "8", rx: "2", ry: "2", key: "17jyea" }],
21706
21716
  ["path", { d: "M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2", key: "zix9uf" }]
21707
21717
  ];
21708
- Copy = createLucideIcon("copy", __iconNode6);
21718
+ Copy = createLucideIcon("copy", __iconNode7);
21709
21719
  }
21710
21720
  });
21711
21721
 
21712
21722
  // node_modules/lucide-react/dist/esm/icons/funnel.js
21713
- var __iconNode7, Funnel;
21723
+ var __iconNode8, Funnel;
21714
21724
  var init_funnel = __esm({
21715
21725
  "node_modules/lucide-react/dist/esm/icons/funnel.js"() {
21716
21726
  init_createLucideIcon();
21717
- __iconNode7 = [
21727
+ __iconNode8 = [
21718
21728
  [
21719
21729
  "path",
21720
21730
  {
@@ -21723,16 +21733,16 @@ var init_funnel = __esm({
21723
21733
  }
21724
21734
  ]
21725
21735
  ];
21726
- Funnel = createLucideIcon("funnel", __iconNode7);
21736
+ Funnel = createLucideIcon("funnel", __iconNode8);
21727
21737
  }
21728
21738
  });
21729
21739
 
21730
21740
  // node_modules/lucide-react/dist/esm/icons/moon.js
21731
- var __iconNode8, Moon;
21741
+ var __iconNode9, Moon;
21732
21742
  var init_moon = __esm({
21733
21743
  "node_modules/lucide-react/dist/esm/icons/moon.js"() {
21734
21744
  init_createLucideIcon();
21735
- __iconNode8 = [
21745
+ __iconNode9 = [
21736
21746
  [
21737
21747
  "path",
21738
21748
  {
@@ -21741,45 +21751,45 @@ var init_moon = __esm({
21741
21751
  }
21742
21752
  ]
21743
21753
  ];
21744
- Moon = createLucideIcon("moon", __iconNode8);
21754
+ Moon = createLucideIcon("moon", __iconNode9);
21745
21755
  }
21746
21756
  });
21747
21757
 
21748
21758
  // node_modules/lucide-react/dist/esm/icons/network.js
21749
- var __iconNode9, Network;
21759
+ var __iconNode10, Network;
21750
21760
  var init_network = __esm({
21751
21761
  "node_modules/lucide-react/dist/esm/icons/network.js"() {
21752
21762
  init_createLucideIcon();
21753
- __iconNode9 = [
21763
+ __iconNode10 = [
21754
21764
  ["rect", { x: "16", y: "16", width: "6", height: "6", rx: "1", key: "4q2zg0" }],
21755
21765
  ["rect", { x: "2", y: "16", width: "6", height: "6", rx: "1", key: "8cvhb9" }],
21756
21766
  ["rect", { x: "9", y: "2", width: "6", height: "6", rx: "1", key: "1egb70" }],
21757
21767
  ["path", { d: "M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3", key: "1jsf9p" }],
21758
21768
  ["path", { d: "M12 12V8", key: "2874zd" }]
21759
21769
  ];
21760
- Network = createLucideIcon("network", __iconNode9);
21770
+ Network = createLucideIcon("network", __iconNode10);
21761
21771
  }
21762
21772
  });
21763
21773
 
21764
21774
  // node_modules/lucide-react/dist/esm/icons/search.js
21765
- var __iconNode10, Search;
21775
+ var __iconNode11, Search;
21766
21776
  var init_search = __esm({
21767
21777
  "node_modules/lucide-react/dist/esm/icons/search.js"() {
21768
21778
  init_createLucideIcon();
21769
- __iconNode10 = [
21779
+ __iconNode11 = [
21770
21780
  ["path", { d: "m21 21-4.34-4.34", key: "14j7rj" }],
21771
21781
  ["circle", { cx: "11", cy: "11", r: "8", key: "4ej97u" }]
21772
21782
  ];
21773
- Search = createLucideIcon("search", __iconNode10);
21783
+ Search = createLucideIcon("search", __iconNode11);
21774
21784
  }
21775
21785
  });
21776
21786
 
21777
21787
  // node_modules/lucide-react/dist/esm/icons/sun.js
21778
- var __iconNode11, Sun;
21788
+ var __iconNode12, Sun;
21779
21789
  var init_sun = __esm({
21780
21790
  "node_modules/lucide-react/dist/esm/icons/sun.js"() {
21781
21791
  init_createLucideIcon();
21782
- __iconNode11 = [
21792
+ __iconNode12 = [
21783
21793
  ["circle", { cx: "12", cy: "12", r: "4", key: "4exip2" }],
21784
21794
  ["path", { d: "M12 2v2", key: "tus03m" }],
21785
21795
  ["path", { d: "M12 20v2", key: "1lh1kg" }],
@@ -21790,20 +21800,20 @@ var init_sun = __esm({
21790
21800
  ["path", { d: "m6.34 17.66-1.41 1.41", key: "1m8zz5" }],
21791
21801
  ["path", { d: "m19.07 4.93-1.41 1.41", key: "1shlcs" }]
21792
21802
  ];
21793
- Sun = createLucideIcon("sun", __iconNode11);
21803
+ Sun = createLucideIcon("sun", __iconNode12);
21794
21804
  }
21795
21805
  });
21796
21806
 
21797
21807
  // node_modules/lucide-react/dist/esm/icons/x.js
21798
- var __iconNode12, X;
21808
+ var __iconNode13, X;
21799
21809
  var init_x = __esm({
21800
21810
  "node_modules/lucide-react/dist/esm/icons/x.js"() {
21801
21811
  init_createLucideIcon();
21802
- __iconNode12 = [
21812
+ __iconNode13 = [
21803
21813
  ["path", { d: "M18 6 6 18", key: "1bl5f8" }],
21804
21814
  ["path", { d: "m6 6 12 12", key: "d8bk6v" }]
21805
21815
  ];
21806
- X = createLucideIcon("x", __iconNode12);
21816
+ X = createLucideIcon("x", __iconNode13);
21807
21817
  }
21808
21818
  });
21809
21819
 
@@ -21816,6 +21826,7 @@ var init_lucide_react = __esm({
21816
21826
  init_bot();
21817
21827
  init_boxes();
21818
21828
  init_check();
21829
+ init_chevron_right();
21819
21830
  init_copy();
21820
21831
  init_moon();
21821
21832
  init_network();
@@ -37067,6 +37078,7 @@ function App() {
37067
37078
  const hasActiveFilters = Boolean(
37068
37079
  filters.search || filters.status || filters.kind || filters.tags
37069
37080
  );
37081
+ const activeTagFilterCount = countTagFilters(filters.tags);
37070
37082
  const onFilterChange = (key, value) => {
37071
37083
  (0, import_react4.startTransition)(() => {
37072
37084
  setFilters((current) => ({ ...current, [key]: value }));
@@ -37243,11 +37255,7 @@ function App() {
37243
37255
  eventsConnected ? "Connected" : "Reconnecting"
37244
37256
  ]
37245
37257
  }
37246
- ),
37247
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "inspector-meta", children: [
37248
- data.traces.total,
37249
- " stored"
37250
- ] })
37258
+ )
37251
37259
  ] }),
37252
37260
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "inspector-header-actions", children: [
37253
37261
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
@@ -37301,10 +37309,14 @@ function App() {
37301
37309
  Button,
37302
37310
  {
37303
37311
  variant: "outline",
37312
+ className: cn(
37313
+ "tag-filter-toggle",
37314
+ (showAdvancedFilters || activeTagFilterCount > 0) && "is-active"
37315
+ ),
37304
37316
  onClick: () => setShowAdvancedFilters((current) => !current),
37305
37317
  children: [
37306
37318
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Funnel, { "data-icon": "inline-start" }),
37307
- showAdvancedFilters || filters.tags ? "Hide filters" : "More filters"
37319
+ showAdvancedFilters || filters.tags ? "Hide tag filters" : activeTagFilterCount > 0 ? `Tag filters \xB7 ${activeTagFilterCount}` : "Tag filters"
37308
37320
  ]
37309
37321
  }
37310
37322
  ),
@@ -37413,10 +37425,12 @@ function ThemeSwitcher({
37413
37425
  type: "button",
37414
37426
  className: cn("theme-switch-button", theme === "light" && "is-active"),
37415
37427
  "aria-pressed": theme === "light",
37428
+ "aria-label": "Use light theme",
37429
+ title: "Light theme",
37416
37430
  onClick: () => onChange("light"),
37417
37431
  children: [
37418
37432
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Sun, { "data-icon": "inline-start" }),
37419
- "Light"
37433
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "sr-only", children: "Light theme" })
37420
37434
  ]
37421
37435
  }
37422
37436
  ),
@@ -37426,10 +37440,12 @@ function ThemeSwitcher({
37426
37440
  type: "button",
37427
37441
  className: cn("theme-switch-button", theme === "dark" && "is-active"),
37428
37442
  "aria-pressed": theme === "dark",
37443
+ "aria-label": "Use dark theme",
37444
+ title: "Dark theme",
37429
37445
  onClick: () => onChange("dark"),
37430
37446
  children: [
37431
37447
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Moon, { "data-icon": "inline-start" }),
37432
- "Dark"
37448
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "sr-only", children: "Dark theme" })
37433
37449
  ]
37434
37450
  }
37435
37451
  )
@@ -37523,20 +37539,29 @@ function HierarchyTimelineOverview({
37523
37539
  };
37524
37540
  const rowContent = /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_react4.Fragment, { children: [
37525
37541
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "hierarchy-timeline-row-time", children: formatTimelineTimestamp(row.startedAt) }),
37526
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "hierarchy-timeline-row-labels", children: [
37527
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "hierarchy-timeline-row-title", children: [
37528
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "hierarchy-timeline-row-title-text", children: row.label }),
37529
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
37530
- Badge,
37531
- {
37532
- variant: "secondary",
37533
- className: "hierarchy-timeline-pill",
37534
- semantic: row.badge,
37535
- children: row.badge
37536
- }
37537
- )
37538
- ] }),
37539
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "hierarchy-timeline-row-meta", children: row.meta })
37542
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "hierarchy-timeline-row-branch", children: [
37543
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
37544
+ "div",
37545
+ {
37546
+ className: "hierarchy-timeline-row-gutter",
37547
+ "aria-hidden": "true"
37548
+ }
37549
+ ),
37550
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "hierarchy-timeline-row-labels", children: [
37551
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "hierarchy-timeline-row-title", children: [
37552
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "hierarchy-timeline-row-title-text", children: row.label }),
37553
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
37554
+ Badge,
37555
+ {
37556
+ variant: "secondary",
37557
+ className: "hierarchy-timeline-pill",
37558
+ semantic: row.badge,
37559
+ children: row.badge
37560
+ }
37561
+ )
37562
+ ] }),
37563
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "hierarchy-timeline-row-meta", children: row.meta })
37564
+ ] })
37540
37565
  ] }),
37541
37566
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "hierarchy-timeline-row-bars", children: [
37542
37567
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
@@ -37612,13 +37637,32 @@ function TraceDetailPanel({
37612
37637
  const detailCopy = detail ? getTraceDisplayCopy(detail) : fallbackTrace ? getTraceDisplayCopy(fallbackTrace) : null;
37613
37638
  const detailStatus = detail?.status ?? fallbackTrace?.status ?? null;
37614
37639
  const detailDuration = detail ? formatTraceDuration(detail) : fallbackTrace ? fallbackTrace.durationMs == null ? "Running" : `${fallbackTrace.durationMs} ms` : null;
37615
- const detailSubtitle = detail ? detailCopy?.subtitle : fallbackTrace ? detailCopy?.subtitle : null;
37640
+ const detailSubtitle = formatTraceProviderSummary(detail ?? fallbackTrace);
37616
37641
  const detailCostUsd = detail ? getUsageCostUsd(detail.usage) : fallbackTrace?.costUsd ?? null;
37617
37642
  const detailCostLabel = formatUsdCost(detailCostUsd);
37618
37643
  const hasSecondaryInspector = Boolean(detail && timelineModel);
37619
37644
  return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "trace-detail-panel", role: "region", "aria-label": "Trace detail", children: [
37620
37645
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "trace-detail-header", children: [
37621
37646
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "trace-detail-heading", children: [
37647
+ detailCopy?.pathParts?.length ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "trace-detail-breadcrumb", "aria-label": "Trace path", children: detailCopy.pathParts.map((part, index2) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_react4.Fragment, { children: [
37648
+ index2 > 0 ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
37649
+ ChevronRight,
37650
+ {
37651
+ className: "trace-detail-breadcrumb-separator",
37652
+ "aria-hidden": "true"
37653
+ }
37654
+ ) : null,
37655
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
37656
+ "span",
37657
+ {
37658
+ className: cn(
37659
+ "trace-detail-breadcrumb-segment",
37660
+ index2 === detailCopy.pathParts.length - 1 && "is-current"
37661
+ ),
37662
+ children: part
37663
+ }
37664
+ )
37665
+ ] }, `${part}-${index2}`)) }) : null,
37622
37666
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "trace-detail-title-row", children: [
37623
37667
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h2", { children: detailCopy?.title || "Loading trace" }),
37624
37668
  /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "trace-detail-meta", children: [
@@ -37627,8 +37671,7 @@ function TraceDetailPanel({
37627
37671
  detailCostLabel ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(TraceMetricPill, { tone: "cost", children: detailCostLabel }) : null
37628
37672
  ] })
37629
37673
  ] }),
37630
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { children: detailCopy?.path || "Loading the full request and response context." }),
37631
- detailSubtitle ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "trace-detail-subtitle", children: detailSubtitle }) : null
37674
+ detailSubtitle ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "trace-detail-subtitle", children: detailSubtitle }) : detailCopy?.path ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "trace-detail-subtitle", children: detailCopy.path }) : null
37632
37675
  ] }),
37633
37676
  onBack ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "trace-detail-actions", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Button, { variant: "outline", onClick: onBack, children: "Show hierarchy" }) }) : null
37634
37677
  ] }),
@@ -37648,6 +37691,7 @@ function TraceDetailPanel({
37648
37691
  Button,
37649
37692
  {
37650
37693
  variant: "outline",
37694
+ className: "trace-detail-json-toggle",
37651
37695
  onClick: () => onToggleJsonMode(activeTab),
37652
37696
  children: [
37653
37697
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Boxes, { "data-icon": "inline-start" }),
@@ -38615,6 +38659,15 @@ function getHierarchyNodeCopy(node2, traceById) {
38615
38659
  }
38616
38660
  function getTraceDisplayCopy(trace) {
38617
38661
  const actor = trace.hierarchy.childActorId || trace.hierarchy.rootActorId;
38662
+ const pathParts = getTracePathParts(trace);
38663
+ return {
38664
+ path: pathParts.join(" / "),
38665
+ pathParts,
38666
+ subtitle: formatList([actor, trace.provider, trace.model]),
38667
+ title: getTraceTitle(trace)
38668
+ };
38669
+ }
38670
+ function getTracePathParts(trace) {
38618
38671
  const pathParts = [
38619
38672
  `Session ${shortId(trace.hierarchy.sessionId)}`,
38620
38673
  trace.hierarchy.rootActorId
@@ -38633,11 +38686,13 @@ function getTraceDisplayCopy(trace) {
38633
38686
  pathParts.push(`Stage: ${trace.hierarchy.stage}`);
38634
38687
  }
38635
38688
  }
38636
- return {
38637
- path: pathParts.join(" / "),
38638
- subtitle: formatList([actor, trace.provider, trace.model]),
38639
- title: getTraceTitle(trace)
38640
- };
38689
+ return pathParts;
38690
+ }
38691
+ function formatTraceProviderSummary(trace) {
38692
+ if (!trace) {
38693
+ return null;
38694
+ }
38695
+ return formatList([trace.provider, trace.model]);
38641
38696
  }
38642
38697
  function groupTracesForNav(items) {
38643
38698
  const groups = /* @__PURE__ */ new Map();
@@ -39003,6 +39058,12 @@ function mergeTagFilter(current, nextEntry) {
39003
39058
  }
39004
39059
  return [...existing, nextEntry].join(",");
39005
39060
  }
39061
+ function countTagFilters(value) {
39062
+ if (!value.trim()) {
39063
+ return 0;
39064
+ }
39065
+ return value.split(",").map((entry) => entry.trim()).filter(Boolean).length;
39066
+ }
39006
39067
  function getHierarchyNodeCostUsd(node2) {
39007
39068
  return typeof node2?.meta?.costUsd === "number" && Number.isFinite(node2.meta.costUsd) ? node2.meta.costUsd : null;
39008
39069
  }
@@ -39086,7 +39147,7 @@ function createCurrencyMetadataEntry(label, rawValue, secondary) {
39086
39147
  label,
39087
39148
  monospace: false,
39088
39149
  secondary,
39089
- value: formatUsdCost(rawValue) || `$${rawValue.toFixed(4)}`
39150
+ value: formatUsdCost(rawValue) ?? "$0.0000"
39090
39151
  };
39091
39152
  }
39092
39153
  function getUsageSegmentCostUsd(usage, segment) {
@@ -39759,13 +39820,13 @@ var init_app = __esm({
39759
39820
  init_theme();
39760
39821
  import_jsx_runtime2 = __toESM(require_jsx_runtime());
39761
39822
  MESSAGE_COLLAPSE_CHAR_LIMIT = 900;
39762
- MESSAGE_COLLAPSE_LINE_LIMIT = 12;
39763
- MESSAGE_COLLAPSE_HEIGHT_PROSE = "6.5rem";
39764
- MESSAGE_COLLAPSE_HEIGHT_STRUCTURED = "10.75rem";
39765
- MESSAGE_COLLAPSE_CHAR_LIMIT_SYSTEM = 320;
39766
- MESSAGE_COLLAPSE_LINE_LIMIT_SYSTEM = 4;
39767
- MESSAGE_COLLAPSE_HEIGHT_PROSE_SYSTEM = "4.6rem";
39768
- MESSAGE_COLLAPSE_HEIGHT_STRUCTURED_SYSTEM = "7rem";
39823
+ MESSAGE_COLLAPSE_LINE_LIMIT = 10;
39824
+ MESSAGE_COLLAPSE_HEIGHT_PROSE = "9rem";
39825
+ MESSAGE_COLLAPSE_HEIGHT_STRUCTURED = "9rem";
39826
+ MESSAGE_COLLAPSE_CHAR_LIMIT_SYSTEM = 500;
39827
+ MESSAGE_COLLAPSE_LINE_LIMIT_SYSTEM = 5;
39828
+ MESSAGE_COLLAPSE_HEIGHT_PROSE_SYSTEM = "9rem";
39829
+ MESSAGE_COLLAPSE_HEIGHT_STRUCTURED_SYSTEM = "9rem";
39769
39830
  TIMELINE_AXIS_STOPS = [0, 0.25, 0.5, 0.75, 1];
39770
39831
  STATUS_OPTIONS = [
39771
39832
  { label: "All statuses", value: "" },
@@ -39872,6 +39933,7 @@ lucide-react/dist/esm/icons/arrow-up-right.js:
39872
39933
  lucide-react/dist/esm/icons/bot.js:
39873
39934
  lucide-react/dist/esm/icons/boxes.js:
39874
39935
  lucide-react/dist/esm/icons/check.js:
39936
+ lucide-react/dist/esm/icons/chevron-right.js:
39875
39937
  lucide-react/dist/esm/icons/copy.js:
39876
39938
  lucide-react/dist/esm/icons/funnel.js:
39877
39939
  lucide-react/dist/esm/icons/moon.js:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mtharrison/loupe",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Lightweight local tracing dashboard for LLM calls",
5
5
  "author": "Matt Harrison",
6
6
  "license": "MIT",