@tea-agent/loop-agent 0.32.1 → 0.33.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.
Files changed (40) hide show
  1. package/CHANGELOG.md +78 -0
  2. package/dist/executors/model-routing.js +14 -4
  3. package/dist/governance/manifest-types.js +34 -7
  4. package/dist/worker/console/chat/model-resolver.js +114 -34
  5. package/dist/worker/console/chat/workspace-landing.js +58 -22
  6. package/dist/worker/console/doctor.js +1 -0
  7. package/dist/worker/console/night-aux-ticker.js +5 -0
  8. package/dist/worker/console/operator-surface-health.js +1 -0
  9. package/dist/worker/console/pi-readiness.js +26 -17
  10. package/dist/worker/console/server.js +2 -0
  11. package/dist/worker/console/static/assets/index-CnUXAqxG.css +1 -0
  12. package/dist/worker/console/static/assets/index-PzYzcuFG.js +29 -0
  13. package/dist/worker/console/static/index.html +3 -2
  14. package/dist/worker/console/static-src/app/useRecoveryConsole.js +3 -2
  15. package/dist/worker/console/static-src/night/useNightBoard.js +0 -31
  16. package/dist/worker/observability/read-model.js +106 -0
  17. package/dist/worker/observe/routes.js +22 -9
  18. package/dist/worker/observe/static/api.js +42 -3
  19. package/dist/worker/observe/static/app.js +15 -0
  20. package/dist/worker/observe/static/constants.js +10 -0
  21. package/dist/worker/observe/static/custom-select.js +567 -0
  22. package/dist/worker/observe/static/index.html +56 -47
  23. package/dist/worker/observe/static/kpi.js +2 -24
  24. package/dist/worker/observe/static/operator-chrome.css +480 -0
  25. package/dist/worker/observe/static/operator-chrome.d.ts +82 -0
  26. package/dist/worker/observe/static/operator-chrome.js +554 -0
  27. package/dist/worker/observe/static/router.js +54 -1
  28. package/dist/worker/observe/static/shell-chrome.js +1 -11
  29. package/dist/worker/observe/static/state.js +20 -0
  30. package/dist/worker/observe/static/styles.css +680 -299
  31. package/dist/worker/observe/static/views/dag-inspector.js +20 -17
  32. package/dist/worker/observe/static/views/dag.js +136 -59
  33. package/dist/worker/observe/static/views/dags.js +877 -0
  34. package/dist/worker/observe/static/views/dashboard.js +67 -8
  35. package/dist/workflows/dag/init-hybrid.js +58 -29
  36. package/docs/templates/harness.schema.json +5 -0
  37. package/harness.json +4 -4
  38. package/package.json +1 -1
  39. package/dist/worker/console/static/assets/index-Bpa2qrc-.js +0 -29
  40. package/dist/worker/console/static/assets/index-BqfFDdnG.css +0 -1
@@ -76,59 +76,6 @@ body {
76
76
  line-height: 1.5;
77
77
  }
78
78
 
79
- .embedded-operator-nav {
80
- display: none;
81
- }
82
-
83
- body[data-embedded-shell="true"] .site-header .logo {
84
- display: none;
85
- }
86
-
87
- body[data-embedded-shell="true"] .site-header {
88
- position: sticky;
89
- top: 49px;
90
- z-index: 30;
91
- grid-template-columns: 1fr auto;
92
- grid-template-areas: "nav status" "crumb crumb";
93
- min-height: 56px;
94
- margin-bottom: var(--space-5);
95
- padding: 10px 0;
96
- }
97
-
98
- body[data-embedded-shell="true"] .embedded-operator-nav {
99
- position: sticky;
100
- top: 0;
101
- z-index: 40;
102
- display: flex;
103
- gap: 6px;
104
- align-items: center;
105
- padding: 8px max(24px, calc((100vw - 1680px) / 2));
106
- border-bottom: 1px solid var(--hairline);
107
- background: color-mix(in srgb, var(--canvas) 92%, transparent);
108
- backdrop-filter: blur(10px);
109
- font-size: 13px;
110
- font-weight: 700;
111
- }
112
-
113
- .embedded-operator-nav a,
114
- .embedded-operator-nav span {
115
- padding: 6px 12px;
116
- border-radius: var(--radius-pill);
117
- text-decoration: none;
118
- }
119
-
120
- .embedded-operator-nav a:hover,
121
- .embedded-operator-nav a:focus-visible {
122
- background: var(--surface);
123
- color: var(--orange-active);
124
- outline: none;
125
- }
126
-
127
- .embedded-operator-nav span {
128
- background: var(--ink);
129
- color: #fff;
130
- }
131
-
132
79
  button,
133
80
  input,
134
81
  select,
@@ -149,7 +96,6 @@ pre,
149
96
  .dag-node-table td:nth-child(2),
150
97
  td:first-child,
151
98
  .meta-item dd,
152
- .header-refresh,
153
99
  .kpi-value,
154
100
  .risk-total,
155
101
  .process-timeline-time {
@@ -176,140 +122,13 @@ td:first-child,
176
122
  #app {
177
123
  width: min(100% - 48px, 1680px);
178
124
  margin: 0 auto;
179
- padding-bottom: 56px;
180
- }
181
-
182
- .site-header {
183
- position: sticky;
184
- top: 0;
185
- z-index: 30;
186
- display: grid;
187
- grid-template-columns: auto 1fr auto;
188
- grid-template-areas: "brand nav status" "crumb crumb crumb";
189
- column-gap: var(--space-5);
190
- align-items: center;
191
- min-height: 72px;
192
- margin-bottom: var(--space-6);
193
- padding: 14px 0 12px;
194
- background: color-mix(in srgb, var(--canvas) 82%, transparent);
195
- border-bottom: 1px solid var(--hairline);
196
- backdrop-filter: blur(12px);
197
- }
198
-
199
- .logo {
200
- grid-area: brand;
201
- display: inline-flex;
202
- align-items: center;
203
- gap: 10px;
204
- color: var(--ink);
205
- font-size: 15px;
206
- font-weight: 650;
207
- letter-spacing: -0.01em;
208
- text-decoration: none;
209
- }
210
-
211
- .logo > i {
212
- display: inline-flex;
213
- align-items: center;
214
- justify-content: center;
215
- width: 32px;
216
- height: 32px;
217
- border-radius: var(--radius-md);
218
- background: var(--orange-soft);
219
- color: var(--orange-active);
220
- font-size: 18px;
221
- font-weight: 400;
222
- }
223
-
224
- .logo:hover {
225
- color: var(--orange-active);
226
- }
227
-
228
- .top-nav {
229
- grid-area: nav;
230
- display: inline-flex;
231
- flex-wrap: wrap;
232
- align-items: center;
233
- gap: 4px;
234
- justify-self: start;
235
- padding: 5px;
236
- border: 1px solid var(--hairline);
237
- border-radius: var(--radius-pill);
238
- background: color-mix(in srgb, var(--surface) 88%, transparent);
239
- box-shadow: var(--shadow-panel);
240
- }
241
-
242
- .nav-link {
243
- display: inline-flex;
244
- align-items: center;
245
- gap: 7px;
246
- min-height: 34px;
247
- padding: 0 14px;
248
- border: 1px solid transparent;
249
- border-radius: var(--radius-pill);
250
- color: var(--body);
251
- font-size: 13px;
252
- font-weight: 600;
253
- text-decoration: none;
254
- transition:
255
- border-color var(--transition-fast),
256
- background-color var(--transition-fast),
257
- color var(--transition-fast),
258
- box-shadow var(--transition-fast);
259
- }
260
-
261
- .nav-link > i {
262
- font-size: 15px;
263
- font-weight: 400;
264
- }
265
-
266
- .nav-link:hover,
267
- .nav-link:focus-visible {
268
- border-color: transparent;
269
- background: var(--surface);
270
- color: var(--ink);
271
- outline: none;
272
- }
273
-
274
- .nav-link-active {
275
- border-color: transparent;
276
- background: var(--ink);
277
- color: #fff;
278
- box-shadow: none;
279
- }
280
-
281
- .nav-link-active:hover,
282
- .nav-link-active:focus-visible {
283
- background: var(--ink);
284
- color: #fff;
285
- }
286
-
287
- .header-meta {
288
- grid-area: status;
289
- display: inline-flex;
290
- justify-self: end;
291
- align-items: center;
292
- gap: 8px;
293
- min-height: 34px;
294
- padding: 0 12px;
295
- border: 1px solid var(--hairline);
296
- border-radius: var(--radius-pill);
297
- background: var(--surface);
298
- color: var(--muted);
299
- font-size: 12px;
300
- font-variant-numeric: tabular-nums;
301
- box-shadow: var(--shadow-panel);
302
- }
303
-
304
- .header-meta > i {
305
- color: color-mix(in srgb, var(--green) 70%, white);
306
- font-size: 14px;
125
+ padding: var(--space-5) 0 56px;
307
126
  }
308
127
 
309
128
  .breadcrumb {
310
- grid-area: crumb;
311
129
  display: flex;
312
130
  min-height: 16px;
131
+ margin-bottom: var(--space-4);
313
132
  gap: 7px;
314
133
  color: var(--muted);
315
134
  font-size: 12px;
@@ -344,6 +163,65 @@ td:first-child,
344
163
  gap: var(--space-4);
345
164
  }
346
165
 
166
+ /* 「昨夜班次」条带:夜间结果在观测总览的唯一一级呈现(管理动作在操作侧) */
167
+ .night-strip {
168
+ display: flex;
169
+ align-items: center;
170
+ gap: 14px;
171
+ padding: 13px 18px;
172
+ margin-bottom: var(--space-4);
173
+ border-left: 3px solid var(--lavender);
174
+ background: linear-gradient(
175
+ 90deg,
176
+ color-mix(in srgb, var(--lavender) 22%, var(--surface)),
177
+ var(--surface) 55%
178
+ );
179
+ }
180
+ .night-strip[hidden] {
181
+ display: none;
182
+ }
183
+ .night-strip-icon {
184
+ display: inline-flex;
185
+ align-items: center;
186
+ justify-content: center;
187
+ flex: 0 0 auto;
188
+ width: 34px;
189
+ height: 34px;
190
+ border-radius: 10px;
191
+ background: color-mix(in srgb, var(--lavender) 55%, var(--surface));
192
+ color: #6a4a9e;
193
+ font-size: 16px;
194
+ }
195
+ .night-strip-main {
196
+ min-width: 0;
197
+ }
198
+ .night-strip-title {
199
+ font-size: 13px;
200
+ font-weight: 700;
201
+ color: var(--ink);
202
+ }
203
+ .night-strip-sub {
204
+ margin-top: 1px;
205
+ font-size: 12px;
206
+ color: var(--body);
207
+ font-variant-numeric: tabular-nums;
208
+ }
209
+ .night-strip-actions {
210
+ margin-left: auto;
211
+ display: inline-flex;
212
+ align-items: center;
213
+ gap: 8px;
214
+ flex-shrink: 0;
215
+ }
216
+ .night-strip-manage {
217
+ border-color: color-mix(in srgb, var(--orange) 35%, var(--hairline));
218
+ color: var(--orange-active);
219
+ }
220
+ .night-strip-manage:hover {
221
+ border-color: var(--orange);
222
+ background: var(--orange-soft);
223
+ }
224
+
347
225
  .view-heading {
348
226
  display: grid;
349
227
  gap: 4px;
@@ -456,42 +334,65 @@ td:first-child,
456
334
  .view-pool .page-header-heading {
457
335
  margin-bottom: 0;
458
336
  }
459
- .pool-toolbar {
460
- display: grid;
461
- justify-items: end;
462
- gap: 8px;
463
- padding-top: 2px;
464
- }
465
- .pool-toolbar-actions {
337
+ .page-header-actions {
466
338
  display: flex;
467
339
  flex-wrap: wrap;
468
340
  align-items: center;
469
341
  justify-content: flex-end;
470
342
  gap: 10px 12px;
343
+ padding-top: 2px;
471
344
  }
472
- .pool-toolbar .pool-updated-at {
473
- margin: 0;
474
- max-width: 28ch;
475
- font-size: 11px;
476
- line-height: 1.4;
477
- text-align: right;
478
- }
345
+ .page-action-btn,
479
346
  .pool-refresh-btn {
480
347
  appearance: none;
348
+ display: inline-flex;
349
+ align-items: center;
350
+ justify-content: center;
351
+ min-height: 34px;
352
+ padding: 8px 14px;
481
353
  border: 1px solid var(--hairline);
482
354
  border-radius: var(--radius-pill);
483
355
  background: var(--surface);
484
356
  color: var(--ink);
485
357
  font-size: 13px;
486
358
  font-weight: 700;
487
- padding: 8px 14px;
359
+ line-height: 1.2;
360
+ text-decoration: none;
488
361
  cursor: pointer;
489
362
  box-shadow: var(--shadow-panel);
363
+ transition:
364
+ background-color var(--transition-fast),
365
+ border-color var(--transition-fast),
366
+ color var(--transition-fast);
490
367
  }
491
- .pool-refresh-btn:hover {
368
+ .page-action-btn:hover,
369
+ .page-action-btn:focus-visible,
370
+ .pool-refresh-btn:hover,
371
+ .pool-refresh-btn:focus-visible {
492
372
  border-color: var(--orange);
493
373
  color: var(--orange-active);
494
374
  background: var(--orange-soft);
375
+ outline: none;
376
+ }
377
+ .pool-toolbar {
378
+ display: grid;
379
+ justify-items: end;
380
+ gap: 8px;
381
+ padding-top: 2px;
382
+ }
383
+ .pool-toolbar-actions {
384
+ display: flex;
385
+ flex-wrap: wrap;
386
+ align-items: center;
387
+ justify-content: flex-end;
388
+ gap: 10px 12px;
389
+ }
390
+ .pool-toolbar .pool-updated-at {
391
+ margin: 0;
392
+ max-width: 28ch;
393
+ font-size: 11px;
394
+ line-height: 1.4;
395
+ text-align: right;
495
396
  }
496
397
  .pool-auto-refresh-label {
497
398
  display: inline-flex;
@@ -615,75 +516,6 @@ td:first-child,
615
516
  gap: var(--space-3);
616
517
  }
617
518
 
618
- .repo-banner {
619
- display: flex;
620
- align-items: flex-start;
621
- gap: 10px;
622
- padding: 6px 12px;
623
- border: 1px solid var(--hairline);
624
- border-radius: var(--radius-md);
625
- background: transparent;
626
- }
627
- .repo-banner-inline {
628
- justify-self: end;
629
- align-items: center;
630
- max-width: min(48ch, 100%);
631
- padding: 4px 10px 4px 8px;
632
- border: 1px solid var(--hairline);
633
- border-radius: 999px;
634
- background: var(--canvas-soft);
635
- }
636
- .repo-banner-icon {
637
- display: inline-flex;
638
- align-items: center;
639
- justify-content: center;
640
- flex: 0 0 auto;
641
- width: 28px;
642
- height: 28px;
643
- border-radius: 8px;
644
- background: var(--surface);
645
- border: 1px solid var(--hairline);
646
- color: var(--orange-active);
647
- }
648
- .repo-banner-icon > i {
649
- font-size: 15px;
650
- line-height: 1;
651
- }
652
- .repo-banner-inline .repo-banner-text {
653
- display: grid;
654
- justify-items: start;
655
- gap: 1px;
656
- min-width: 0;
657
- }
658
- .repo-banner-text {
659
- display: flex;
660
- flex-wrap: wrap;
661
- align-items: baseline;
662
- gap: 6px 10px;
663
- min-width: 0;
664
- }
665
- .repo-banner-name {
666
- color: var(--ink);
667
- font-size: 13px;
668
- font-weight: 700;
669
- letter-spacing: 0.01em;
670
- line-height: 1.25;
671
- overflow: hidden;
672
- text-overflow: ellipsis;
673
- white-space: nowrap;
674
- }
675
- .repo-banner-path {
676
- color: var(--muted);
677
- font-size: 11px;
678
- line-height: 1.35;
679
- font-variant-numeric: tabular-nums;
680
- letter-spacing: 0.01em;
681
- overflow: hidden;
682
- text-overflow: ellipsis;
683
- white-space: nowrap;
684
- max-width: 36ch;
685
- }
686
-
687
519
  .panel-kpi {
688
520
  display: grid;
689
521
  grid-template-columns: var(--dashboard-cols);
@@ -1292,7 +1124,7 @@ tr.clickable:focus-within {
1292
1124
  .dag-inspector {
1293
1125
  position: fixed;
1294
1126
  z-index: 40;
1295
- /* Align with site-header top edge; same inset as right/bottom. */
1127
+ /* Align near the unified chrome bottom edge; same inset as right/bottom. */
1296
1128
  top: 24px;
1297
1129
  right: 24px;
1298
1130
  bottom: 24px;
@@ -1471,12 +1303,11 @@ body.is-resizing-dag-graph {
1471
1303
  color: var(--muted);
1472
1304
  }
1473
1305
  .dag-inspector-attempt-select {
1474
- font-size: 12px;
1475
- padding: 2px 6px;
1476
- border: 1px solid var(--hairline);
1477
- border-radius: 6px;
1478
- background: var(--surface);
1479
- color: var(--ink);
1306
+ /* Shared custom-select surface; keep class for integration hooks. */
1307
+ min-width: 9.5rem;
1308
+ }
1309
+ .dag-inspector-attempt-bar .custom-select-menu {
1310
+ z-index: 5;
1480
1311
  }
1481
1312
  .dag-inspector-attempt-preview {
1482
1313
  display: flex;
@@ -1892,9 +1723,10 @@ body.is-resizing-dag-graph {
1892
1723
  .dag-node-table {
1893
1724
  table-layout: fixed;
1894
1725
  }
1726
+ /* 9 columns sum to 100%: 4/17/6/8/14/9/8/14/20 */
1895
1727
  .dag-node-table th:nth-child(1),
1896
1728
  .dag-node-table td:nth-child(1) {
1897
- width: 5%;
1729
+ width: 4%;
1898
1730
  }
1899
1731
  .dag-node-table th:nth-child(2),
1900
1732
  .dag-node-table td:nth-child(2) {
@@ -1902,27 +1734,31 @@ body.is-resizing-dag-graph {
1902
1734
  }
1903
1735
  .dag-node-table th:nth-child(3),
1904
1736
  .dag-node-table td:nth-child(3) {
1905
- width: 7%;
1737
+ width: 6%;
1906
1738
  }
1907
1739
  .dag-node-table th:nth-child(4),
1908
1740
  .dag-node-table td:nth-child(4) {
1909
- width: 11%;
1741
+ width: 8%;
1910
1742
  }
1911
1743
  .dag-node-table th:nth-child(5),
1912
1744
  .dag-node-table td:nth-child(5) {
1913
- width: 15%;
1745
+ width: 14%;
1914
1746
  }
1915
1747
  .dag-node-table th:nth-child(6),
1916
1748
  .dag-node-table td:nth-child(6) {
1917
- width: 11%;
1749
+ width: 9%;
1918
1750
  }
1919
1751
  .dag-node-table th:nth-child(7),
1920
1752
  .dag-node-table td:nth-child(7) {
1921
- width: 9%;
1753
+ width: 8%;
1922
1754
  }
1923
1755
  .dag-node-table th:nth-child(8),
1924
1756
  .dag-node-table td:nth-child(8) {
1925
- width: 25%;
1757
+ width: 14%;
1758
+ }
1759
+ .dag-node-table th:nth-child(9),
1760
+ .dag-node-table td:nth-child(9) {
1761
+ width: 20%;
1926
1762
  }
1927
1763
  .dag-node-table th:first-child,
1928
1764
  .dag-node-table td:first-child {
@@ -1930,9 +1766,19 @@ body.is-resizing-dag-graph {
1930
1766
  }
1931
1767
  .dag-node-table td:nth-child(2),
1932
1768
  .dag-node-table td:nth-child(5),
1933
- .dag-node-table td:nth-child(8) {
1769
+ .dag-node-table td:nth-child(8),
1770
+ .dag-node-table td:nth-child(9) {
1934
1771
  overflow-wrap: anywhere;
1935
1772
  }
1773
+ .dag-node-error-summary {
1774
+ display: -webkit-box;
1775
+ -webkit-box-orient: vertical;
1776
+ -webkit-line-clamp: 2;
1777
+ line-clamp: 2;
1778
+ overflow: hidden;
1779
+ color: var(--red);
1780
+ word-break: break-word;
1781
+ }
1936
1782
  .dag-active-node {
1937
1783
  background: #fff8f3;
1938
1784
  }
@@ -2808,11 +2654,6 @@ body.is-resizing-dag-graph {
2808
2654
  #app {
2809
2655
  width: min(100% - 32px, 1680px);
2810
2656
  }
2811
- .site-header {
2812
- grid-template-columns: auto 1fr auto;
2813
- grid-template-areas: "brand nav status" "crumb crumb crumb";
2814
- row-gap: 8px;
2815
- }
2816
2657
  .run-detail-workspace {
2817
2658
  grid-template-columns: 1fr;
2818
2659
  }
@@ -2827,14 +2668,6 @@ body.is-resizing-dag-graph {
2827
2668
  .dashboard-page-header {
2828
2669
  grid-template-columns: 1fr;
2829
2670
  }
2830
- .repo-banner-inline {
2831
- justify-self: start;
2832
- max-width: none;
2833
- }
2834
- .repo-banner-path {
2835
- max-width: none;
2836
- white-space: normal;
2837
- }
2838
2671
  .pool-toolbar {
2839
2672
  justify-items: start;
2840
2673
  }
@@ -2851,9 +2684,6 @@ body.is-resizing-dag-graph {
2851
2684
  #app {
2852
2685
  width: min(100% - 24px, 1680px);
2853
2686
  }
2854
- .site-header {
2855
- margin-bottom: var(--space-6);
2856
- }
2857
2687
  .kpi-grid {
2858
2688
  grid-template-columns: repeat(2, minmax(0, 1fr));
2859
2689
  }
@@ -3154,3 +2984,554 @@ button.copy-command:focus-visible {
3154
2984
  transition-duration: 0.01ms !important;
3155
2985
  }
3156
2986
  }
2987
+
2988
+ /* Formal DAG run history page (#/dags) */
2989
+ .section-heading-row {
2990
+ display: flex;
2991
+ align-items: center;
2992
+ justify-content: space-between;
2993
+ gap: var(--space-3, 0.75rem);
2994
+ margin: 0 0 var(--space-3, 0.75rem);
2995
+ }
2996
+ .section-heading-row .section-heading {
2997
+ margin: 0;
2998
+ }
2999
+ .section-heading-action {
3000
+ flex-shrink: 0;
3001
+ font-size: 13px;
3002
+ font-weight: 600;
3003
+ color: var(--orange-active, #c45c26);
3004
+ text-decoration: none;
3005
+ }
3006
+ .section-heading-action:hover,
3007
+ .section-heading-action:focus-visible {
3008
+ text-decoration: underline;
3009
+ }
3010
+ .view-dags .dags-table-wrap,
3011
+ .dags-table-wrap.table-scroll {
3012
+ overflow-x: auto;
3013
+ -webkit-overflow-scrolling: touch;
3014
+ }
3015
+ .dags-history-table {
3016
+ width: 100%;
3017
+ min-width: 720px;
3018
+ border-collapse: collapse;
3019
+ }
3020
+ .dags-run-id-wrap {
3021
+ display: inline-flex;
3022
+ align-items: center;
3023
+ gap: 0.35rem;
3024
+ max-width: 100%;
3025
+ }
3026
+ .dags-run-id {
3027
+ font-size: 12px;
3028
+ overflow-wrap: anywhere;
3029
+ word-break: break-all;
3030
+ }
3031
+ .dags-copy-btn,
3032
+ .dags-copy-btn-icon {
3033
+ flex-shrink: 0;
3034
+ display: inline-flex;
3035
+ align-items: center;
3036
+ justify-content: center;
3037
+ width: 30px;
3038
+ height: 30px;
3039
+ padding: 0;
3040
+ border: 1px solid var(--hairline, #e2dcd4);
3041
+ border-radius: var(--radius-md, 6px);
3042
+ background: var(--surface, #fff);
3043
+ color: var(--ink, #1c1917);
3044
+ cursor: pointer;
3045
+ line-height: 1;
3046
+ }
3047
+ .dags-copy-btn:hover {
3048
+ border-color: var(--hairline-strong, #cfcdc4);
3049
+ background: var(--surface-muted, #f0efe9);
3050
+ }
3051
+ .dags-copy-btn:active {
3052
+ border-color: var(--hairline-strong, #cfcdc4);
3053
+ background: color-mix(in srgb, var(--surface-muted, #f0efe9) 80%, var(--hairline, #e6e5e0));
3054
+ }
3055
+ /* Mouse focus must not leave residual orange chrome; orange is :focus-visible only. */
3056
+ .dags-copy-btn:focus:not(:focus-visible) {
3057
+ outline: none;
3058
+ border-color: var(--hairline, #e2dcd4);
3059
+ }
3060
+ .dags-copy-btn:focus-visible {
3061
+ border-color: var(--orange-active, #c45c26);
3062
+ outline: 2px solid color-mix(in srgb, var(--orange) 55%, transparent);
3063
+ outline-offset: 1px;
3064
+ }
3065
+ .dags-copy-btn .dags-copy-icon {
3066
+ display: block;
3067
+ }
3068
+ .dags-copy-btn .dags-copy-icon-check {
3069
+ display: none;
3070
+ }
3071
+ .dags-copy-btn.is-copied {
3072
+ color: var(--green, #1f8a65);
3073
+ border-color: var(--hairline, #e2dcd4);
3074
+ }
3075
+ .dags-copy-btn.is-copied:hover,
3076
+ .dags-copy-btn.is-copied:active {
3077
+ border-color: var(--hairline-strong, #cfcdc4);
3078
+ }
3079
+ .dags-copy-btn.is-copied .dags-copy-icon-rects {
3080
+ display: none;
3081
+ }
3082
+ .dags-copy-btn.is-copied .dags-copy-icon-check {
3083
+ display: block;
3084
+ }
3085
+ /* Copy success must never paint row / cell / run-id container chrome. */
3086
+ .dags-history-row.is-copied,
3087
+ .dags-run-id-cell.is-copied,
3088
+ .dags-run-id-wrap.is-copied {
3089
+ background: transparent;
3090
+ border-color: inherit;
3091
+ box-shadow: none;
3092
+ }
3093
+ .dags-copy-toast {
3094
+ position: fixed;
3095
+ right: 24px;
3096
+ bottom: 24px;
3097
+ z-index: 50;
3098
+ max-width: min(360px, calc(100vw - 32px));
3099
+ padding: 10px 14px;
3100
+ border: 1px solid var(--hairline-strong, #cfcdc4);
3101
+ border-radius: var(--radius-md, 8px);
3102
+ background: var(--surface, #fff);
3103
+ color: var(--ink, #1c1917);
3104
+ box-shadow: var(--shadow-soft);
3105
+ font-size: 13px;
3106
+ pointer-events: none;
3107
+ }
3108
+ .dags-copy-toast[hidden] {
3109
+ display: none !important;
3110
+ }
3111
+ .sr-only {
3112
+ position: absolute;
3113
+ width: 1px;
3114
+ height: 1px;
3115
+ padding: 0;
3116
+ margin: -1px;
3117
+ overflow: hidden;
3118
+ clip: rect(0, 0, 0, 0);
3119
+ white-space: nowrap;
3120
+ border: 0;
3121
+ }
3122
+ .dags-pagination {
3123
+ display: grid;
3124
+ grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
3125
+ align-items: center;
3126
+ column-gap: 1rem;
3127
+ row-gap: 0.75rem;
3128
+ width: 100%;
3129
+ min-width: 0;
3130
+ }
3131
+ .dags-pagination-summary {
3132
+ min-width: 0;
3133
+ justify-self: start;
3134
+ text-align: left;
3135
+ }
3136
+ .dags-pagination-summary .dags-meta {
3137
+ margin: 0;
3138
+ }
3139
+ .dags-pagination-pages {
3140
+ display: inline-flex;
3141
+ flex-wrap: nowrap;
3142
+ align-items: center;
3143
+ justify-content: center;
3144
+ gap: 2px;
3145
+ justify-self: center;
3146
+ flex: 0 0 auto;
3147
+ max-width: 100%;
3148
+ padding: 5px;
3149
+ border: 1px solid var(--hairline, #e6e5e0);
3150
+ border-radius: 14px;
3151
+ background: var(--surface, #ffffff);
3152
+ box-shadow:
3153
+ 0 1px 2px rgb(38 37 30 / 4%),
3154
+ 0 4px 12px rgb(38 37 30 / 3%);
3155
+ }
3156
+ .dags-pagination-tools {
3157
+ display: inline-flex;
3158
+ flex-wrap: wrap;
3159
+ align-items: center;
3160
+ justify-content: flex-end;
3161
+ gap: 0.5rem;
3162
+ justify-self: end;
3163
+ min-width: 0;
3164
+ }
3165
+ .dags-page-num,
3166
+ .dags-page-nav {
3167
+ box-sizing: border-box;
3168
+ display: inline-flex;
3169
+ align-items: center;
3170
+ justify-content: center;
3171
+ width: 36px;
3172
+ height: 36px;
3173
+ min-width: 36px;
3174
+ min-height: 36px;
3175
+ padding: 0;
3176
+ margin: 0;
3177
+ border: 1px solid transparent;
3178
+ border-radius: 10px;
3179
+ background: transparent;
3180
+ color: var(--ink, #26251e);
3181
+ font: inherit;
3182
+ font-size: 13px;
3183
+ font-weight: 500;
3184
+ line-height: 1;
3185
+ cursor: pointer;
3186
+ appearance: none;
3187
+ -webkit-appearance: none;
3188
+ transition:
3189
+ background var(--transition-fast, 160ms ease),
3190
+ color var(--transition-fast, 160ms ease),
3191
+ border-color var(--transition-fast, 160ms ease),
3192
+ box-shadow var(--transition-base, 220ms ease),
3193
+ opacity var(--transition-fast, 160ms ease);
3194
+ }
3195
+ .dags-page-num i,
3196
+ .dags-page-nav i,
3197
+ .dags-refresh-btn i {
3198
+ font-size: 18px;
3199
+ line-height: 1;
3200
+ pointer-events: none;
3201
+ }
3202
+ .dags-page-num:hover:not(:disabled),
3203
+ .dags-page-nav:hover:not(:disabled) {
3204
+ background: color-mix(in srgb, var(--orange-soft, #fff1ea) 70%, var(--surface-muted, #f0efe9));
3205
+ color: var(--ink, #26251e);
3206
+ }
3207
+ .dags-page-num:active:not(:disabled),
3208
+ .dags-page-nav:active:not(:disabled) {
3209
+ background: color-mix(in srgb, var(--orange, #f54e00) 14%, var(--surface-muted, #f0efe9));
3210
+ }
3211
+ .dags-page-num:focus-visible,
3212
+ .dags-page-nav:focus-visible,
3213
+ .dags-refresh-btn:focus-visible,
3214
+ .dags-page-size-label select:focus-visible,
3215
+ .dags-page-size-label .custom-select-trigger:focus-visible {
3216
+ outline: 2px solid color-mix(in srgb, var(--orange, #f54e00) 55%, transparent);
3217
+ outline-offset: 1px;
3218
+ }
3219
+ .dags-page-num.is-current,
3220
+ .dags-page-num.is-current:disabled,
3221
+ .dags-page-num.is-current:hover:disabled,
3222
+ .dags-page-num.is-current:active:disabled {
3223
+ background: var(--orange, #f54e00);
3224
+ border-color: var(--orange, #f54e00);
3225
+ color: #fff;
3226
+ opacity: 1;
3227
+ box-shadow: 0 2px 8px color-mix(in srgb, var(--orange, #f54e00) 35%, transparent);
3228
+ cursor: default;
3229
+ }
3230
+ .dags-page-nav:disabled,
3231
+ .dags-page-num:disabled:not(.is-current),
3232
+ .dags-refresh-btn:disabled,
3233
+ .dags-page-size-label select:disabled,
3234
+ .dags-page-size-label .custom-select.is-disabled .custom-select-trigger,
3235
+ .dags-page-size-label .custom-select-trigger:disabled {
3236
+ opacity: 0.45;
3237
+ cursor: not-allowed;
3238
+ }
3239
+ .dags-page-ellipsis {
3240
+ display: inline-flex;
3241
+ align-items: center;
3242
+ justify-content: center;
3243
+ width: 28px;
3244
+ min-width: 28px;
3245
+ height: 36px;
3246
+ color: var(--muted, #807d72);
3247
+ user-select: none;
3248
+ pointer-events: none;
3249
+ }
3250
+ .dags-page-size-label {
3251
+ display: inline-flex;
3252
+ align-items: center;
3253
+ gap: 0.35rem;
3254
+ font-size: 13px;
3255
+ color: var(--body, #5a5852);
3256
+ }
3257
+ .dags-page-size-label select {
3258
+ box-sizing: border-box;
3259
+ height: 36px;
3260
+ min-width: 4.5rem;
3261
+ padding: 0 0.5rem;
3262
+ border: 1px solid var(--hairline, #e6e5e0);
3263
+ border-radius: var(--radius-md, 8px);
3264
+ background: var(--surface, #ffffff);
3265
+ color: var(--ink, #26251e);
3266
+ font: inherit;
3267
+ font-size: 13px;
3268
+ line-height: 1;
3269
+ cursor: pointer;
3270
+ transition:
3271
+ border-color var(--transition-fast, 160ms ease),
3272
+ box-shadow var(--transition-fast, 160ms ease),
3273
+ background var(--transition-fast, 160ms ease);
3274
+ }
3275
+ .dags-page-size-label .custom-select {
3276
+ min-width: 4.5rem;
3277
+ }
3278
+ .dags-page-size-label .custom-select-trigger {
3279
+ box-sizing: border-box;
3280
+ height: 36px;
3281
+ min-width: 4.5rem;
3282
+ border: 1px solid var(--hairline, #e6e5e0);
3283
+ border-radius: 10px;
3284
+ background: var(--surface, #ffffff);
3285
+ color: var(--ink, #26251e);
3286
+ font: inherit;
3287
+ font-size: 13px;
3288
+ line-height: 1;
3289
+ cursor: pointer;
3290
+ }
3291
+ .dags-refresh-btn {
3292
+ box-sizing: border-box;
3293
+ display: inline-flex;
3294
+ align-items: center;
3295
+ justify-content: center;
3296
+ width: 36px;
3297
+ height: 36px;
3298
+ min-width: 36px;
3299
+ min-height: 36px;
3300
+ padding: 0;
3301
+ margin: 0;
3302
+ border: 1px solid var(--hairline, #e6e5e0);
3303
+ border-radius: var(--radius-md, 8px);
3304
+ background: var(--surface, #ffffff);
3305
+ color: var(--ink, #26251e);
3306
+ font: inherit;
3307
+ line-height: 1;
3308
+ cursor: pointer;
3309
+ appearance: none;
3310
+ -webkit-appearance: none;
3311
+ transition:
3312
+ background var(--transition-fast, 160ms ease),
3313
+ border-color var(--transition-fast, 160ms ease),
3314
+ color var(--transition-fast, 160ms ease),
3315
+ box-shadow var(--transition-fast, 160ms ease),
3316
+ opacity var(--transition-fast, 160ms ease);
3317
+ }
3318
+ .dags-refresh-btn:hover:not(:disabled) {
3319
+ border-color: var(--hairline-strong, #cfcdc4);
3320
+ background: var(--surface-muted, #f0efe9);
3321
+ }
3322
+ .dags-refresh-btn:active:not(:disabled) {
3323
+ background: color-mix(in srgb, var(--surface-muted, #f0efe9) 80%, var(--hairline, #e6e5e0));
3324
+ }
3325
+ .dags-pagination.is-busy {
3326
+ opacity: 0.92;
3327
+ }
3328
+ .dags-degraded-banner:not([hidden]) {
3329
+ border: 1px solid color-mix(in srgb, #c45c26 35%, var(--hairline, #e2dcd4));
3330
+ background: color-mix(in srgb, #c45c26 8%, var(--surface, #fff));
3331
+ color: var(--ink, #1c1917);
3332
+ padding: var(--space-3, 0.75rem) var(--space-4, 1rem);
3333
+ margin-bottom: var(--space-3, 0.75rem);
3334
+ }
3335
+ .dags-history-row.clickable {
3336
+ cursor: pointer;
3337
+ }
3338
+ @media (max-width: 720px) {
3339
+ .dags-pagination {
3340
+ display: flex;
3341
+ flex-wrap: wrap;
3342
+ align-items: center;
3343
+ justify-content: space-between;
3344
+ }
3345
+ .dags-pagination-summary {
3346
+ flex: 1 1 auto;
3347
+ justify-self: auto;
3348
+ }
3349
+ .dags-pagination-tools {
3350
+ flex: 0 0 auto;
3351
+ margin-left: auto;
3352
+ justify-self: auto;
3353
+ }
3354
+ .dags-pagination-pages {
3355
+ order: 3;
3356
+ flex: 0 0 auto;
3357
+ flex-wrap: nowrap;
3358
+ width: max-content;
3359
+ max-width: 100%;
3360
+ margin-inline: auto;
3361
+ justify-content: center;
3362
+ justify-self: auto;
3363
+ gap: 1px;
3364
+ padding: 3px;
3365
+ }
3366
+ .dags-page-num,
3367
+ .dags-page-nav {
3368
+ width: 28px;
3369
+ height: 28px;
3370
+ min-width: 28px;
3371
+ min-height: 28px;
3372
+ border-radius: 8px;
3373
+ font-size: 12px;
3374
+ }
3375
+ .dags-page-num i,
3376
+ .dags-page-nav i {
3377
+ font-size: 15px;
3378
+ }
3379
+ .dags-page-ellipsis {
3380
+ width: 16px;
3381
+ min-width: 16px;
3382
+ height: 28px;
3383
+ }
3384
+ }
3385
+ @media (prefers-reduced-motion: reduce) {
3386
+ .dags-copy-btn,
3387
+ .dags-page-num,
3388
+ .dags-page-nav,
3389
+ .dags-refresh-btn,
3390
+ .dags-page-size-label select,
3391
+ .dags-page-size-label .custom-select-trigger,
3392
+ .dags-copy-toast,
3393
+ .custom-select-trigger,
3394
+ .custom-select-chevron,
3395
+ .custom-select-menu {
3396
+ transition: none !important;
3397
+ transform: none !important;
3398
+ animation: none !important;
3399
+ }
3400
+ .custom-select.is-open .custom-select-chevron {
3401
+ transform: none !important;
3402
+ }
3403
+ }
3404
+
3405
+ /* Shared custom select (DAG history pageSize + inspector attempt). */
3406
+ .custom-select {
3407
+ position: relative;
3408
+ display: inline-flex;
3409
+ vertical-align: middle;
3410
+ min-width: 4.5rem;
3411
+ }
3412
+ .custom-select-trigger {
3413
+ box-sizing: border-box;
3414
+ display: inline-flex;
3415
+ align-items: center;
3416
+ justify-content: space-between;
3417
+ gap: 0.35rem;
3418
+ width: 100%;
3419
+ height: 36px;
3420
+ min-height: 36px;
3421
+ padding: 0 0.55rem 0 0.65rem;
3422
+ margin: 0;
3423
+ border: 1px solid var(--hairline, #e6e5e0);
3424
+ border-radius: 10px;
3425
+ background: var(--surface, #ffffff);
3426
+ color: var(--ink, #26251e);
3427
+ font: inherit;
3428
+ font-size: 13px;
3429
+ line-height: 1;
3430
+ cursor: pointer;
3431
+ appearance: none;
3432
+ -webkit-appearance: none;
3433
+ box-shadow: 0 1px 2px color-mix(in srgb, var(--ink, #26251e) 4%, transparent);
3434
+ transition:
3435
+ border-color var(--transition-fast, 160ms ease),
3436
+ box-shadow var(--transition-fast, 160ms ease),
3437
+ background var(--transition-fast, 160ms ease);
3438
+ }
3439
+ .custom-select-trigger:hover:not(:disabled) {
3440
+ background: var(--surface-muted, #f0efe9);
3441
+ border-color: var(--hairline-strong, #cfcdc4);
3442
+ }
3443
+ .custom-select-trigger:focus-visible {
3444
+ outline: 2px solid color-mix(in srgb, var(--orange, #f54e00) 55%, transparent);
3445
+ outline-offset: 1px;
3446
+ }
3447
+ .custom-select-trigger:disabled {
3448
+ opacity: 0.45;
3449
+ cursor: not-allowed;
3450
+ }
3451
+ .custom-select-value {
3452
+ flex: 1 1 auto;
3453
+ min-width: 0;
3454
+ text-align: left;
3455
+ overflow: hidden;
3456
+ text-overflow: ellipsis;
3457
+ white-space: nowrap;
3458
+ }
3459
+ .custom-select-chevron {
3460
+ flex: 0 0 auto;
3461
+ font-size: 16px;
3462
+ line-height: 1;
3463
+ color: var(--muted, #807d72);
3464
+ transition: transform var(--transition-fast, 160ms ease);
3465
+ pointer-events: none;
3466
+ }
3467
+ .custom-select.is-open .custom-select-chevron {
3468
+ transform: rotate(180deg);
3469
+ }
3470
+ .custom-select-menu {
3471
+ box-sizing: border-box;
3472
+ position: absolute;
3473
+ z-index: 40;
3474
+ display: flex;
3475
+ flex-direction: column;
3476
+ min-width: 100%;
3477
+ max-height: calc(6 * 38px + 8px);
3478
+ padding: 4px;
3479
+ overflow-x: hidden;
3480
+ overflow-y: auto;
3481
+ border: 1px solid var(--hairline, #e6e5e0);
3482
+ border-radius: 12px;
3483
+ background: color-mix(in srgb, var(--surface, #ffffff) 96%, transparent);
3484
+ backdrop-filter: blur(8px);
3485
+ box-shadow:
3486
+ 0 4px 16px color-mix(in srgb, var(--ink, #26251e) 10%, transparent),
3487
+ 0 1px 3px color-mix(in srgb, var(--ink, #26251e) 6%, transparent);
3488
+ }
3489
+ .custom-select-menu[hidden] {
3490
+ display: none !important;
3491
+ }
3492
+ .custom-select-option {
3493
+ box-sizing: border-box;
3494
+ display: flex;
3495
+ align-items: center;
3496
+ justify-content: space-between;
3497
+ gap: 0.5rem;
3498
+ min-height: 38px;
3499
+ height: 38px;
3500
+ padding: 0 0.65rem;
3501
+ border-radius: 8px;
3502
+ color: var(--ink, #26251e);
3503
+ font-size: 13px;
3504
+ line-height: 1.2;
3505
+ cursor: pointer;
3506
+ user-select: none;
3507
+ }
3508
+ .custom-select-option:hover,
3509
+ .custom-select-option.is-active {
3510
+ background: var(--surface-muted, #f0efe9);
3511
+ }
3512
+ .custom-select-option.is-selected {
3513
+ background: var(--orange-soft, #fff1ea);
3514
+ color: var(--orange-active, #d04200);
3515
+ font-weight: 600;
3516
+ }
3517
+ .custom-select-option.is-selected.is-active,
3518
+ .custom-select-option.is-selected:hover {
3519
+ background: color-mix(in srgb, var(--orange-soft, #fff1ea) 70%, var(--surface-muted, #f0efe9));
3520
+ }
3521
+ .custom-select-option-label {
3522
+ flex: 1 1 auto;
3523
+ min-width: 0;
3524
+ overflow: hidden;
3525
+ text-overflow: ellipsis;
3526
+ white-space: nowrap;
3527
+ }
3528
+ .custom-select-option-check {
3529
+ flex: 0 0 auto;
3530
+ font-size: 15px;
3531
+ line-height: 1;
3532
+ opacity: 0;
3533
+ color: var(--orange-active, #d04200);
3534
+ }
3535
+ .custom-select-option.is-selected .custom-select-option-check {
3536
+ opacity: 1;
3537
+ }