@tea-agent/loop-agent 0.11.0 → 0.13.0-alpha.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 (123) hide show
  1. package/CHANGELOG.md +74 -1
  2. package/README.md +33 -4
  3. package/dist/application/dag/generate-task-dag.js +45 -0
  4. package/dist/application/dag/run-dag.js +10 -0
  5. package/dist/application/dag/validate-dag.js +11 -0
  6. package/dist/cli/command-definitions.js +10 -3
  7. package/dist/commands/init.js +74 -7
  8. package/dist/commands/knowledge.js +129 -31
  9. package/dist/governance/manifest-types.js +3 -0
  10. package/dist/shared/package-metadata.js +135 -0
  11. package/dist/task/config-types.js +6 -1
  12. package/dist/worker/cli.js +99 -2
  13. package/dist/worker/delivery/package.js +3 -3
  14. package/dist/worker/feature/decision-loader.js +37 -6
  15. package/dist/worker/feature/next-action.js +10 -2
  16. package/dist/worker/feature/ready-plan-projection.js +81 -0
  17. package/dist/worker/feature/reducer.js +2 -1
  18. package/dist/worker/feature/review.js +19 -2
  19. package/dist/worker/feature/run.js +27 -2
  20. package/dist/worker/follow-up/approve.js +5 -2
  21. package/dist/worker/follow-up/factory.js +1 -1
  22. package/dist/worker/observability/event-history.js +216 -0
  23. package/dist/worker/observability/read-model.js +552 -118
  24. package/dist/worker/observe/paths.js +17 -0
  25. package/dist/worker/observe/routes.js +310 -23
  26. package/dist/worker/observe/server.js +59 -1
  27. package/dist/worker/observe/spec-evidence.js +281 -0
  28. package/dist/worker/observe/static/api.js +46 -0
  29. package/dist/worker/observe/static/app.js +120 -2598
  30. package/dist/worker/observe/static/constants.js +148 -0
  31. package/dist/worker/observe/static/copy.js +67 -0
  32. package/dist/worker/observe/static/dag-helpers.js +172 -0
  33. package/dist/worker/observe/static/dag-model.js +72 -0
  34. package/dist/worker/observe/static/dom.js +61 -0
  35. package/dist/worker/observe/static/format-pool.js +67 -0
  36. package/dist/worker/observe/static/format.js +292 -0
  37. package/dist/worker/observe/static/index.html +300 -82
  38. package/dist/worker/observe/static/kpi.js +94 -0
  39. package/dist/worker/observe/static/relations.js +133 -0
  40. package/dist/worker/observe/static/router.js +93 -0
  41. package/dist/worker/observe/static/run-processing.js +148 -0
  42. package/dist/worker/observe/static/shell-chrome.js +68 -0
  43. package/dist/worker/observe/static/state.js +253 -0
  44. package/dist/worker/observe/static/styles.css +1731 -495
  45. package/dist/worker/observe/static/views/batch.js +227 -0
  46. package/dist/worker/observe/static/views/dag-graph.js +172 -0
  47. package/dist/worker/observe/static/views/dag-inspector.js +596 -0
  48. package/dist/worker/observe/static/views/dag.js +362 -0
  49. package/dist/worker/observe/static/views/dashboard.js +445 -0
  50. package/dist/worker/observe/static/views/failures.js +143 -0
  51. package/dist/worker/observe/static/views/feature.js +492 -0
  52. package/dist/worker/observe/static/views/pool.js +350 -0
  53. package/dist/worker/observe/static/views/run.js +453 -0
  54. package/dist/worker/observe/static/views/session-timeline.js +205 -0
  55. package/dist/worker/observe/static/views/shell.js +7 -0
  56. package/dist/worker/observe/static/views/task.js +314 -0
  57. package/dist/worker/observe/static/views/timeline.js +163 -0
  58. package/dist/worker/pool/doctor.js +165 -0
  59. package/dist/worker/pool/migrate-state.js +303 -0
  60. package/dist/worker/pool/run-store.js +205 -17
  61. package/dist/worker/pool/types.js +17 -1
  62. package/dist/worker/pool/validation.js +100 -15
  63. package/dist/worker/report/morning-report.js +12 -2
  64. package/dist/worker/runner/run-ready.js +41 -26
  65. package/dist/worker/task-graph/ready-planner.js +136 -0
  66. package/dist/workflows/dag/controller-identity.js +104 -0
  67. package/dist/workflows/dag/convergence/controller.js +16 -8
  68. package/dist/workflows/dag/failure-routing.js +12 -1
  69. package/dist/workflows/dag/init-hybrid.js +1233 -11
  70. package/dist/workflows/dag/node-execution.js +123 -29
  71. package/dist/workflows/dag/repair-artifact.js +91 -0
  72. package/dist/workflows/dag/report.js +50 -0
  73. package/dist/workflows/dag/retry-policy.js +138 -0
  74. package/dist/workflows/dag/runner.js +32 -0
  75. package/dist/workflows/dag/runtime-contract.js +87 -0
  76. package/dist/workflows/dag/skill-snapshot.js +2 -0
  77. package/dist/workflows/dag/types.js +45 -1
  78. package/dist/workflows/dag/validate.js +68 -4
  79. package/docs/README.md +1 -1
  80. package/docs/agent-dag-recovery-playbook.md +9 -0
  81. package/docs/agent-dag-runner.md +26 -1
  82. package/docs/architecture/dag-execution.md +6 -0
  83. package/docs/architecture/evolution.md +7 -5
  84. package/docs/architecture/facts-and-state.md +15 -2
  85. package/docs/architecture/worker-and-feature.md +6 -2
  86. package/docs/decisions/README.md +3 -0
  87. package/docs/design/README.md +12 -3
  88. package/docs/exec-plans/active/README.md +2 -2
  89. package/docs/exec-plans/completed/README.md +12 -0
  90. package/docs/feature-workflow.md +108 -2
  91. package/docs/loop-agent-harness.md +15 -4
  92. package/docs/progress/README.md +22 -0
  93. package/docs/reports/README.md +14 -2
  94. package/docs/templates/agent-dag-report.schema.json +17 -0
  95. package/docs/templates/agent-dag.schema.json +69 -1
  96. package/docs/templates/agent-dag.supervised-implementation.json +8 -2
  97. package/docs/templates/backend-test-dag.generate-pytest.prompt.md +139 -0
  98. package/docs/templates/backend-test-dag.json +288 -0
  99. package/docs/templates/backend-test-dag.retrospect.prompt.md +125 -0
  100. package/docs/templates/backend-test-dag.review-cases.prompt.md +81 -0
  101. package/docs/templates/knowledge-graph-bootstrap-dag.json +118 -0
  102. package/docs/templates/knowledge-sync-dag.json +177 -0
  103. package/docs/templates/knowledge-sync-draft.schema.json +71 -0
  104. package/docs/verification-matrix.md +2 -1
  105. package/package.json +8 -2
  106. package/scripts/kb-bootstrap-init-skeleton.sh +239 -0
  107. package/scripts/kb-graph-incremental-prepare.mjs +372 -0
  108. package/scripts/kb-graph-incremental-prepare.sh +5 -0
  109. package/scripts/kb-graph-materialize.mjs +105 -0
  110. package/scripts/kb-graph-materialize.sh +4 -0
  111. package/scripts/kb-graph-promote.mjs +153 -0
  112. package/scripts/kb-graph-promote.sh +4 -0
  113. package/scripts/kb-query.mjs +554 -0
  114. package/scripts/kb-query.sh +5 -0
  115. package/skills/agent-worker/SKILL.md +3 -1
  116. package/skills/agent-worker/references/agent-worker-operator.md +18 -1
  117. package/skills/frontend-design-review/SKILL.md +26 -24
  118. package/skills/frontend-implementation/SKILL.md +29 -26
  119. package/skills/frontend-implementation/references/node-contracts.md +50 -19
  120. package/skills/frontend-review/SKILL.md +1 -1
  121. package/skills/loop-agent/references/command-reference.md +2 -0
  122. package/skills/loop-agent/references/hybrid-dag.md +22 -3
  123. package/skills/loop-agent/references/verification-and-failure-handling.md +6 -0
@@ -1,61 +1,71 @@
1
1
  :root {
2
- --canvas: #f7f7f4;
3
- --canvas-soft: #fafaf7;
4
- --surface: #ffffff;
5
- --surface-muted: #f0efe9;
6
- --surface-ink: #26251e;
7
- --ink: #26251e;
8
- --body: #5a5852;
9
- --muted: #807d72;
10
- --muted-soft: #a09c92;
11
- --hairline: #e6e5e0;
12
- --hairline-strong: #cfcdc4;
13
- --orange: #f54e00;
14
- --orange-active: #d04200;
15
- --blue: #3f6ea4;
16
- --green: #1f8a65;
17
- --amber: #a66a00;
18
- --red: #c72d53;
19
- --lavender: #e4daf1;
20
- --mint: #d8ead5;
21
- --peach: #f1d8cb;
22
- --gold: #d8b166;
23
- --space-1: 4px;
24
- --space-2: 8px;
25
- --space-3: 12px;
26
- --space-4: 16px;
27
- --space-5: 20px;
28
- --space-6: 24px;
29
- --space-8: 32px;
30
- --space-10: 40px;
31
- --space-12: 48px;
32
- --radius-sm: 4px;
33
- --radius-md: 6px;
34
- --radius-lg: 8px;
35
- --transition-fast: 160ms ease;
36
- --transition-base: 240ms ease;
37
- }
38
-
39
- * { box-sizing: border-box; }
40
-
41
- html { background: var(--canvas); scroll-behavior: smooth; }
2
+ --canvas: #f7f7f4;
3
+ --canvas-soft: #fafaf7;
4
+ --surface: #ffffff;
5
+ --surface-muted: #f0efe9;
6
+ --surface-ink: #26251e;
7
+ --ink: #26251e;
8
+ --body: #5a5852;
9
+ --muted: #807d72;
10
+ --muted-soft: #a09c92;
11
+ --hairline: #e6e5e0;
12
+ --hairline-strong: #cfcdc4;
13
+ --orange: #f54e00;
14
+ --orange-active: #d04200;
15
+ --blue: #3f6ea4;
16
+ --green: #1f8a65;
17
+ --amber: #a66a00;
18
+ --red: #c72d53;
19
+ --lavender: #e4daf1;
20
+ --mint: #d8ead5;
21
+ --peach: #f1d8cb;
22
+ --gold: #d8b166;
23
+ --space-1: 4px;
24
+ --space-2: 8px;
25
+ --space-3: 12px;
26
+ --space-4: 16px;
27
+ --space-5: 20px;
28
+ --space-6: 24px;
29
+ --space-8: 32px;
30
+ --space-10: 40px;
31
+ --space-12: 48px;
32
+ --radius-sm: 4px;
33
+ --radius-md: 6px;
34
+ --radius-lg: 8px;
35
+ --transition-fast: 160ms ease;
36
+ --transition-base: 240ms ease;
37
+ }
38
+
39
+ * {
40
+ box-sizing: border-box;
41
+ }
42
+
43
+ html {
44
+ background: var(--canvas);
45
+ scroll-behavior: smooth;
46
+ }
42
47
 
43
48
  body {
44
- min-width: 320px;
45
- margin: 0;
46
- background: var(--canvas);
47
- color: var(--ink);
48
- font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
49
- font-size: 14px;
50
- line-height: 1.5;
49
+ min-width: 320px;
50
+ margin: 0;
51
+ background: var(--canvas);
52
+ color: var(--ink);
53
+ font-family:
54
+ system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
55
+ font-size: 14px;
56
+ line-height: 1.5;
51
57
  }
52
58
 
53
59
  button,
54
60
  input,
55
61
  select,
56
- textarea { font: inherit; }
62
+ textarea {
63
+ font: inherit;
64
+ }
57
65
 
58
- a { color: inherit; }
66
+ a {
67
+ color: inherit;
68
+ }
59
69
 
60
70
  code,
61
71
  pre,
@@ -70,248 +80,499 @@ td:first-child,
70
80
  .kpi-value,
71
81
  .risk-total,
72
82
  .process-timeline-time {
73
- font-family: "JetBrains Mono", "SFMono-Regular", Consolas, monospace;
83
+ font-family: "JetBrains Mono", "SFMono-Regular", Consolas, monospace;
74
84
  }
75
85
 
76
86
  .skip-link {
77
- position: fixed;
78
- top: -64px;
79
- left: var(--space-4);
80
- z-index: 100;
81
- padding: 9px 12px;
82
- background: var(--orange);
83
- color: #fff;
84
- font-weight: 700;
85
- text-decoration: none;
86
- transition: top var(--transition-fast);
87
+ position: fixed;
88
+ top: -64px;
89
+ left: var(--space-4);
90
+ z-index: 100;
91
+ padding: 9px 12px;
92
+ background: var(--orange);
93
+ color: #fff;
94
+ font-weight: 700;
95
+ text-decoration: none;
96
+ transition: top var(--transition-fast);
87
97
  }
88
98
 
89
- .skip-link:focus { top: var(--space-3); }
99
+ .skip-link:focus {
100
+ top: var(--space-3);
101
+ }
90
102
 
91
103
  #app {
92
- width: min(100% - 48px, 1680px);
93
- margin: 0 auto;
94
- padding-bottom: 56px;
104
+ width: min(100% - 48px, 1680px);
105
+ margin: 0 auto;
106
+ padding-bottom: 56px;
95
107
  }
96
108
 
97
109
  .site-header {
98
- position: sticky;
99
- top: 0;
100
- z-index: 30;
101
- display: grid;
102
- grid-template-columns: auto auto 1fr;
103
- grid-template-areas: "brand nav status" "crumb crumb crumb";
104
- column-gap: var(--space-6);
105
- align-items: center;
106
- min-height: 76px;
107
- margin-bottom: var(--space-8);
108
- padding: 14px 0 12px;
109
- background: color-mix(in srgb, var(--canvas) 94%, transparent);
110
- border-bottom: 1px solid var(--hairline);
111
- backdrop-filter: blur(10px);
110
+ position: sticky;
111
+ top: 0;
112
+ z-index: 30;
113
+ display: grid;
114
+ grid-template-columns: auto auto 1fr;
115
+ grid-template-areas: "brand nav status" "crumb crumb crumb";
116
+ column-gap: var(--space-6);
117
+ align-items: center;
118
+ min-height: 76px;
119
+ margin-bottom: var(--space-8);
120
+ padding: 14px 0 12px;
121
+ background: color-mix(in srgb, var(--canvas) 94%, transparent);
122
+ border-bottom: 1px solid var(--hairline);
123
+ backdrop-filter: blur(10px);
112
124
  }
113
125
 
114
126
  .logo {
115
- grid-area: brand;
116
- display: inline-flex;
117
- align-items: center;
118
- gap: 9px;
119
- color: var(--ink);
120
- font-size: 16px;
121
- font-weight: 650;
122
- letter-spacing: 0;
123
- text-decoration: none;
127
+ grid-area: brand;
128
+ display: inline-flex;
129
+ align-items: center;
130
+ gap: 9px;
131
+ color: var(--ink);
132
+ font-size: 16px;
133
+ font-weight: 650;
134
+ letter-spacing: 0;
135
+ text-decoration: none;
124
136
  }
125
137
 
126
- .logo > i { color: var(--orange); font-size: 20px; font-weight: 400; }
127
- .logo:hover { color: var(--orange-active); }
138
+ .logo > i {
139
+ color: var(--orange);
140
+ font-size: 20px;
141
+ font-weight: 400;
142
+ }
143
+ .logo:hover {
144
+ color: var(--orange-active);
145
+ }
128
146
 
129
147
  .top-nav {
130
- grid-area: nav;
131
- display: inline-flex;
132
- align-items: center;
133
- gap: 4px;
148
+ grid-area: nav;
149
+ display: inline-flex;
150
+ align-items: center;
151
+ gap: 4px;
134
152
  }
135
153
 
136
154
  .nav-link {
137
- display: inline-flex;
138
- align-items: center;
139
- gap: 7px;
140
- min-height: 36px;
141
- padding: 0 10px;
142
- border: 1px solid transparent;
143
- border-radius: var(--radius-sm);
144
- color: var(--body);
145
- font-size: 13px;
146
- font-weight: 600;
147
- text-decoration: none;
148
- transition: border-color var(--transition-fast), background-color var(--transition-fast), color var(--transition-fast);
149
- }
150
-
151
- .nav-link > i { font-size: 16px; font-weight: 400; }
155
+ display: inline-flex;
156
+ align-items: center;
157
+ gap: 7px;
158
+ min-height: 36px;
159
+ padding: 0 10px;
160
+ border: 1px solid transparent;
161
+ border-radius: var(--radius-sm);
162
+ color: var(--body);
163
+ font-size: 13px;
164
+ font-weight: 600;
165
+ text-decoration: none;
166
+ transition:
167
+ border-color var(--transition-fast),
168
+ background-color var(--transition-fast),
169
+ color var(--transition-fast);
170
+ }
171
+
172
+ .nav-link > i {
173
+ font-size: 16px;
174
+ font-weight: 400;
175
+ }
152
176
  .nav-link:hover,
153
- .nav-link:focus-visible { border-color: var(--hairline-strong); background: var(--surface); color: var(--ink); outline: none; }
154
- .nav-link-active { border-color: var(--orange); background: var(--surface); color: var(--ink); }
177
+ .nav-link:focus-visible {
178
+ border-color: var(--hairline-strong);
179
+ background: var(--surface);
180
+ color: var(--ink);
181
+ outline: none;
182
+ }
183
+ .nav-link-active {
184
+ border-color: var(--orange);
185
+ background: var(--surface);
186
+ color: var(--ink);
187
+ }
155
188
 
156
189
  .header-meta {
157
- grid-area: status;
158
- display: inline-flex;
159
- justify-self: end;
160
- align-items: center;
161
- gap: 7px;
162
- color: var(--muted);
163
- font-size: 12px;
164
- font-variant-numeric: tabular-nums;
190
+ grid-area: status;
191
+ display: inline-flex;
192
+ justify-self: end;
193
+ align-items: center;
194
+ gap: 7px;
195
+ color: var(--muted);
196
+ font-size: 12px;
197
+ font-variant-numeric: tabular-nums;
165
198
  }
166
199
 
167
- .header-meta > i { color: var(--green); font-size: 16px; }
200
+ .header-meta > i {
201
+ color: var(--green);
202
+ font-size: 16px;
203
+ }
168
204
 
169
205
  .breadcrumb {
170
- grid-area: crumb;
171
- display: flex;
172
- min-height: 16px;
173
- gap: 7px;
174
- color: var(--muted);
175
- font-size: 12px;
206
+ grid-area: crumb;
207
+ display: flex;
208
+ min-height: 16px;
209
+ gap: 7px;
210
+ color: var(--muted);
211
+ font-size: 12px;
176
212
  }
177
213
 
178
- .breadcrumb[hidden] { display: none; }
214
+ .breadcrumb[hidden] {
215
+ display: none;
216
+ }
179
217
 
180
- .breadcrumb a { color: var(--body); text-decoration: none; }
218
+ .breadcrumb a {
219
+ color: var(--body);
220
+ text-decoration: none;
221
+ }
181
222
  .breadcrumb a:hover,
182
- .breadcrumb a:focus-visible { color: var(--orange); text-decoration: underline; outline: none; }
223
+ .breadcrumb a:focus-visible {
224
+ color: var(--orange);
225
+ text-decoration: underline;
226
+ outline: none;
227
+ }
183
228
 
184
- .dashboard-main:focus { outline: none; }
185
- .view { min-width: 0; }
186
- .view[hidden] { display: none !important; }
187
- .view:not(.view-dashboard) { display: grid; gap: var(--space-4); }
229
+ .dashboard-main:focus {
230
+ outline: none;
231
+ }
232
+ .view {
233
+ min-width: 0;
234
+ }
235
+ .view[hidden] {
236
+ display: none !important;
237
+ }
238
+ .view:not(.view-dashboard) {
239
+ display: grid;
240
+ gap: var(--space-4);
241
+ }
188
242
 
189
243
  .view-heading {
190
- display: grid;
191
- gap: 4px;
192
- margin-bottom: var(--space-6);
244
+ display: grid;
245
+ gap: 4px;
246
+ margin-bottom: var(--space-6);
193
247
  }
194
248
 
195
249
  .view-kicker {
196
- margin: 0;
197
- color: var(--orange);
198
- font-size: 11px;
199
- font-weight: 700;
200
- letter-spacing: .08em;
250
+ margin: 0;
251
+ color: var(--orange);
252
+ font-size: 11px;
253
+ font-weight: 700;
254
+ letter-spacing: 0.08em;
201
255
  }
202
256
 
203
257
  .view h2 {
204
- margin: 0;
205
- color: var(--ink);
206
- font-size: 28px;
207
- font-weight: 500;
208
- line-height: 1.16;
209
- letter-spacing: 0;
258
+ margin: 0;
259
+ color: var(--ink);
260
+ font-size: 28px;
261
+ font-weight: 500;
262
+ line-height: 1.16;
263
+ letter-spacing: 0;
210
264
  }
211
265
 
212
- .view-heading > p:last-child { max-width: 66ch; margin: 0; color: var(--body); }
266
+ .view-heading > p:last-child {
267
+ max-width: 66ch;
268
+ margin: 0;
269
+ color: var(--body);
270
+ }
213
271
 
214
272
  .panel {
215
- min-width: 0;
216
- background: var(--surface);
217
- border: 1px solid var(--hairline);
218
- border-radius: var(--radius-lg);
219
- padding: var(--space-5);
273
+ min-width: 0;
274
+ background: var(--surface);
275
+ border: 1px solid var(--hairline);
276
+ border-radius: var(--radius-lg);
277
+ padding: var(--space-5);
220
278
  }
221
279
 
222
- .panel-primary { border-color: var(--hairline-strong); }
223
- .panel-meta { background: transparent; border-color: var(--hairline-strong); }
224
- .panel-table { overflow: hidden; padding: 0; }
225
- .panel-output { background: #fbfbf9; }
280
+ .panel-primary {
281
+ border-color: var(--hairline-strong);
282
+ }
283
+ .panel-meta {
284
+ background: transparent;
285
+ border-color: var(--hairline-strong);
286
+ }
287
+ .panel-table {
288
+ overflow: hidden;
289
+ padding: 0;
290
+ }
291
+ .panel-output {
292
+ background: #fbfbf9;
293
+ }
226
294
 
227
295
  .section-heading,
228
296
  .panel h3 {
229
- margin: 0 0 var(--space-4);
230
- color: var(--ink);
231
- font-size: 14px;
232
- font-weight: 700;
297
+ margin: 0 0 var(--space-4);
298
+ color: var(--ink);
299
+ font-size: 14px;
300
+ font-weight: 700;
233
301
  }
234
302
 
235
303
  .empty,
236
- .risk-empty { margin: 0; color: var(--muted); }
237
- .empty-state { padding: var(--space-8); text-align: center; color: var(--body); }
304
+ .risk-empty {
305
+ margin: 0;
306
+ color: var(--muted);
307
+ }
308
+ .empty-state {
309
+ padding: var(--space-8);
310
+ text-align: center;
311
+ color: var(--body);
312
+ }
238
313
 
239
- .view-dashboard { display: grid; gap: var(--space-4); }
314
+ .view-dashboard {
315
+ display: grid;
316
+ gap: var(--space-4);
317
+ }
240
318
 
241
- .repo-banner { display: flex; align-items: center; gap: var(--space-3); padding: 10px 14px; border: 1px solid var(--hairline-strong); border-radius: var(--radius-lg); background: var(--surface); }
242
- .repo-banner > i { color: var(--muted); font-size: 18px; }
243
- .repo-banner-text { display: grid; gap: 2px; min-width: 0; }
244
- .repo-banner-name { color: var(--ink); font-size: 14px; font-weight: 700; overflow-wrap: anywhere; }
245
- .repo-banner-path { color: var(--muted); font-size: 11px; overflow-wrap: anywhere; }
319
+ .repo-banner {
320
+ display: flex;
321
+ align-items: center;
322
+ gap: var(--space-3);
323
+ padding: 10px 14px;
324
+ border: 1px solid var(--hairline-strong);
325
+ border-radius: var(--radius-lg);
326
+ background: var(--surface);
327
+ }
328
+ .repo-banner > i {
329
+ color: var(--muted);
330
+ font-size: 18px;
331
+ }
332
+ .repo-banner-text {
333
+ display: grid;
334
+ gap: 2px;
335
+ min-width: 0;
336
+ }
337
+ .repo-banner-name {
338
+ color: var(--ink);
339
+ font-size: 14px;
340
+ font-weight: 700;
341
+ overflow-wrap: anywhere;
342
+ }
343
+ .repo-banner-path {
344
+ color: var(--muted);
345
+ font-size: 11px;
346
+ overflow-wrap: anywhere;
347
+ }
246
348
 
247
- .panel-kpi { padding: 0; background: transparent; border: 0; }
349
+ .panel-kpi {
350
+ padding: 0;
351
+ background: transparent;
352
+ border: 0;
353
+ }
248
354
 
249
- .kpi-group { margin: 0; padding: 0; border: 0; display: grid; gap: var(--space-3); }
250
- .kpi-group + .kpi-group { margin-top: var(--space-3); }
251
- .kpi-group-legend { padding: 0; color: var(--muted); font-size: 11px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; }
355
+ .kpi-group {
356
+ margin: 0;
357
+ padding: 0;
358
+ border: 0;
359
+ display: grid;
360
+ gap: var(--space-3);
361
+ }
362
+ .kpi-group + .kpi-group {
363
+ margin-top: var(--space-3);
364
+ }
365
+ .kpi-group-legend {
366
+ padding: 0;
367
+ color: var(--muted);
368
+ font-size: 11px;
369
+ font-weight: 700;
370
+ letter-spacing: 0.04em;
371
+ text-transform: uppercase;
372
+ }
252
373
 
253
374
  .kpi-grid {
254
- display: grid;
255
- grid-template-columns: repeat(6, minmax(0, 1fr));
256
- overflow: visible;
257
- border: 1px solid var(--hairline-strong);
258
- border-radius: var(--radius-lg);
259
- background: var(--surface);
375
+ display: grid;
376
+ grid-template-columns: repeat(6, minmax(0, 1fr));
377
+ overflow: visible;
378
+ border: 1px solid var(--hairline-strong);
379
+ border-radius: var(--radius-lg);
380
+ background: var(--surface);
260
381
  }
261
382
 
262
383
  .kpi-card {
263
- position: relative;
264
- min-width: 0;
265
- min-height: 84px;
266
- padding: 15px 18px 14px;
267
- border-left: 1px solid var(--hairline);
384
+ position: relative;
385
+ min-width: 0;
386
+ min-height: 84px;
387
+ padding: 15px 18px 14px;
388
+ border-left: 1px solid var(--hairline);
268
389
  }
269
390
 
270
- .kpi-card:first-child { border-left: 0; }
271
- .kpi-label { margin-bottom: 9px; color: var(--muted); font-size: 11px; font-weight: 650; }
272
- .kpi-value-row { display: flex; align-items: baseline; gap: 6px; }
273
- .kpi-value { color: var(--ink); font-size: 26px; font-weight: 500; line-height: 1; font-variant-numeric: tabular-nums; }
391
+ .kpi-card:first-child {
392
+ border-left: 0;
393
+ }
394
+ .kpi-label {
395
+ margin-bottom: 9px;
396
+ color: var(--muted);
397
+ font-size: 11px;
398
+ font-weight: 650;
399
+ }
400
+ .kpi-value-row {
401
+ display: flex;
402
+ align-items: baseline;
403
+ gap: 6px;
404
+ }
405
+ .kpi-value {
406
+ color: var(--ink);
407
+ font-size: 26px;
408
+ font-weight: 500;
409
+ line-height: 1;
410
+ font-variant-numeric: tabular-nums;
411
+ }
274
412
 
275
- .kpi-help { display: inline-flex; align-items: center; justify-content: center; width: 16px; height: 16px; padding: 0; border: 0; border-radius: 50%; background: transparent; color: var(--muted-soft); cursor: help; font-size: 13px; line-height: 1; }
276
- .kpi-help:hover, .kpi-help:focus-visible { color: var(--ink); background: var(--surface-muted); outline: none; }
277
- .kpi-help:focus-visible { box-shadow: 0 0 0 2px var(--hairline-strong); }
278
- .kpi-tip { position: absolute; left: 12px; right: 12px; top: calc(100% - 8px); z-index: 10; max-width: 280px; padding: 8px 10px; border: 1px solid var(--hairline-strong); border-radius: var(--radius-md); background: var(--surface-ink); color: var(--canvas); font-size: 11px; font-weight: 400; line-height: 1.5; box-shadow: var(--shadow-panel); opacity: 0; visibility: hidden; pointer-events: none; transition: opacity var(--transition-fast); }
279
- .kpi-help:hover + .kpi-tip, .kpi-help:focus-visible + .kpi-tip { opacity: 1; visibility: visible; }
413
+ .kpi-help {
414
+ display: inline-flex;
415
+ align-items: center;
416
+ justify-content: center;
417
+ width: 16px;
418
+ height: 16px;
419
+ padding: 0;
420
+ border: 0;
421
+ border-radius: 50%;
422
+ background: transparent;
423
+ color: var(--muted-soft);
424
+ cursor: help;
425
+ font-size: 13px;
426
+ line-height: 1;
427
+ }
428
+ .kpi-help:hover,
429
+ .kpi-help:focus-visible {
430
+ color: var(--ink);
431
+ background: var(--surface-muted);
432
+ outline: none;
433
+ }
434
+ .kpi-help:focus-visible {
435
+ box-shadow: 0 0 0 2px var(--hairline-strong);
436
+ }
437
+ .kpi-tip {
438
+ position: absolute;
439
+ left: 12px;
440
+ right: 12px;
441
+ top: calc(100% - 8px);
442
+ z-index: 10;
443
+ max-width: 280px;
444
+ padding: 8px 10px;
445
+ border: 1px solid var(--hairline-strong);
446
+ border-radius: var(--radius-md);
447
+ background: var(--surface-ink);
448
+ color: var(--canvas);
449
+ font-size: 11px;
450
+ font-weight: 400;
451
+ line-height: 1.5;
452
+ box-shadow: var(--shadow-panel);
453
+ opacity: 0;
454
+ visibility: hidden;
455
+ pointer-events: none;
456
+ transition: opacity var(--transition-fast);
457
+ }
458
+ .kpi-help:hover + .kpi-tip,
459
+ .kpi-help:focus-visible + .kpi-tip {
460
+ opacity: 1;
461
+ visibility: visible;
462
+ }
280
463
 
281
464
  .dashboard-workspace,
282
465
  .dashboard-secondary {
283
- display: grid;
284
- gap: var(--space-4);
285
- align-items: stretch;
466
+ display: grid;
467
+ gap: var(--space-4);
468
+ align-items: stretch;
286
469
  }
287
470
 
288
- .dashboard-workspace { grid-template-columns: 1fr; }
289
- .dashboard-secondary { grid-template-columns: repeat(2, minmax(0, 1fr)); }
471
+ .dashboard-workspace {
472
+ grid-template-columns: 1fr;
473
+ }
474
+ .dashboard-secondary {
475
+ grid-template-columns: repeat(2, minmax(0, 1fr));
476
+ }
290
477
 
291
478
  .panel-risk {
292
- display: block;
293
- background: var(--canvas-soft);
294
- }
295
-
296
- .panel-risk-attention { border-color: color-mix(in srgb, var(--red) 50%, var(--hairline)); background: #fff8f9; }
297
- .panel-risk .section-heading { margin: 0 0 var(--space-3); }
298
- .risk-blocks { display: grid; gap: var(--space-4); }
299
- .risk-block { display: grid; grid-template-columns: minmax(120px, .25fr) minmax(0, 1fr); align-items: start; gap: var(--space-3); padding-top: var(--space-3); border-top: 1px solid var(--hairline); }
300
- .risk-block:first-child { padding-top: 0; border-top: 0; }
301
- .risk-block-label { color: var(--muted); font-size: 11px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; }
302
- .risk-block-dag .risk-block-label { color: var(--ink); }
303
- .risk-block-worker .risk-block-label { color: var(--ink); }
304
- .risk-total { margin: 0; color: var(--amber); font-size: 32px; font-weight: 500; line-height: 1; font-variant-numeric: tabular-nums; }
305
- .panel-risk-attention .risk-total { color: var(--red); }
306
- .risk-summary { margin: 0; color: var(--body); font-size: 12px; line-height: 1.6; }
307
- .panel-risk .risk-empty { margin: 0; }
308
-
309
- .projection-fault { display: flex; align-items: flex-start; gap: var(--space-3); padding: 14px 16px; border: 1px solid color-mix(in srgb, var(--red) 50%, var(--hairline)); border-radius: var(--radius-lg); background: #fff8f9; }
310
- .projection-fault > i { color: var(--red); font-size: 20px; line-height: 1.4; }
311
- .projection-fault-body { display: grid; gap: 4px; min-width: 0; }
312
- .projection-fault-title { margin: 0; color: var(--ink); font-size: 14px; font-weight: 700; }
313
- .projection-fault-message { margin: 0; color: var(--body); font-size: 12px; overflow-wrap: anywhere; }
314
- .projection-fault-at { margin: 0; color: var(--muted); font-size: 11px; }
479
+ display: block;
480
+ background: var(--canvas-soft);
481
+ }
482
+
483
+ .panel-risk-attention {
484
+ border-color: color-mix(in srgb, var(--red) 50%, var(--hairline));
485
+ background: #fff8f9;
486
+ }
487
+ .panel-risk .section-heading {
488
+ margin: 0 0 var(--space-3);
489
+ }
490
+ .risk-blocks {
491
+ display: grid;
492
+ gap: var(--space-4);
493
+ }
494
+ .risk-block {
495
+ display: grid;
496
+ grid-template-columns: minmax(120px, 0.25fr) minmax(0, 1fr);
497
+ align-items: start;
498
+ gap: var(--space-3);
499
+ padding-top: var(--space-3);
500
+ border-top: 1px solid var(--hairline);
501
+ }
502
+ .risk-block:first-child {
503
+ padding-top: 0;
504
+ border-top: 0;
505
+ }
506
+ .risk-block-label {
507
+ color: var(--muted);
508
+ font-size: 11px;
509
+ font-weight: 700;
510
+ letter-spacing: 0.04em;
511
+ text-transform: uppercase;
512
+ }
513
+ .risk-block-dag .risk-block-label {
514
+ color: var(--ink);
515
+ }
516
+ .risk-block-worker .risk-block-label {
517
+ color: var(--ink);
518
+ }
519
+ .risk-total {
520
+ margin: 0;
521
+ color: var(--amber);
522
+ font-size: 32px;
523
+ font-weight: 500;
524
+ line-height: 1;
525
+ font-variant-numeric: tabular-nums;
526
+ }
527
+ .panel-risk-attention .risk-total {
528
+ color: var(--red);
529
+ }
530
+ .risk-summary {
531
+ margin: 0;
532
+ color: var(--body);
533
+ font-size: 12px;
534
+ line-height: 1.6;
535
+ }
536
+ .panel-risk .risk-empty {
537
+ margin: 0;
538
+ }
539
+
540
+ .projection-fault {
541
+ display: flex;
542
+ align-items: flex-start;
543
+ gap: var(--space-3);
544
+ padding: 14px 16px;
545
+ border: 1px solid color-mix(in srgb, var(--red) 50%, var(--hairline));
546
+ border-radius: var(--radius-lg);
547
+ background: #fff8f9;
548
+ }
549
+ .projection-fault > i {
550
+ color: var(--red);
551
+ font-size: 20px;
552
+ line-height: 1.4;
553
+ }
554
+ .projection-fault-body {
555
+ display: grid;
556
+ gap: 4px;
557
+ min-width: 0;
558
+ }
559
+ .projection-fault-title {
560
+ margin: 0;
561
+ color: var(--ink);
562
+ font-size: 14px;
563
+ font-weight: 700;
564
+ }
565
+ .projection-fault-message {
566
+ margin: 0;
567
+ color: var(--body);
568
+ font-size: 12px;
569
+ overflow-wrap: anywhere;
570
+ }
571
+ .projection-fault-at {
572
+ margin: 0;
573
+ color: var(--muted);
574
+ font-size: 11px;
575
+ }
315
576
 
316
577
  .risk-link,
317
578
  .active-dag-link,
@@ -319,184 +580,437 @@ td:first-child,
319
580
  .inbox-link,
320
581
  .artifact-link,
321
582
  .step-link {
322
- color: var(--ink);
323
- font-size: 12px;
324
- font-weight: 700;
325
- text-decoration-color: var(--orange);
326
- text-decoration-thickness: 1px;
327
- text-underline-offset: 4px;
583
+ color: var(--ink);
584
+ font-size: 12px;
585
+ font-weight: 700;
586
+ text-decoration-color: var(--orange);
587
+ text-decoration-thickness: 1px;
588
+ text-underline-offset: 4px;
328
589
  }
329
590
 
330
- .risk-link { margin: 0; padding: 0; white-space: nowrap; }
591
+ .risk-link {
592
+ margin: 0;
593
+ padding: 0;
594
+ white-space: nowrap;
595
+ }
331
596
  .risk-link:hover,
332
597
  .active-dag-link:hover,
333
598
  .link:hover,
334
599
  .inbox-link:hover,
335
600
  .artifact-link:hover,
336
- .step-link:hover { color: var(--orange-active); }
601
+ .step-link:hover {
602
+ color: var(--orange-active);
603
+ }
337
604
 
338
- .active-dag-list { display: grid; gap: 10px; }
339
- .active-dag-card { padding: 14px; border: 1px solid var(--hairline); border-radius: var(--radius-md); background: var(--canvas-soft); }
340
- .active-dag-card-running { border-left: 3px solid var(--orange); padding-left: 12px; }
341
- .active-dag-header { display: flex; align-items: start; justify-content: space-between; gap: var(--space-3); margin-bottom: 9px; }
342
- .active-dag-title { min-width: 0; color: var(--ink); font-size: 14px; font-weight: 700; overflow-wrap: anywhere; }
343
- .active-dag-meta { display: grid; gap: 4px; color: var(--body); font-size: 12px; }
344
- .active-dag-link { display: inline-block; margin-top: 10px; }
605
+ .active-dag-list {
606
+ display: grid;
607
+ gap: 10px;
608
+ }
609
+ .active-dag-card {
610
+ padding: 14px;
611
+ border: 1px solid var(--hairline);
612
+ border-radius: var(--radius-md);
613
+ background: var(--canvas-soft);
614
+ }
615
+ .active-dag-card-running {
616
+ border-left: 3px solid var(--orange);
617
+ padding-left: 12px;
618
+ }
619
+ .active-dag-header {
620
+ display: flex;
621
+ align-items: start;
622
+ justify-content: space-between;
623
+ gap: var(--space-3);
624
+ margin-bottom: 9px;
625
+ }
626
+ .active-dag-title {
627
+ min-width: 0;
628
+ color: var(--ink);
629
+ font-size: 14px;
630
+ font-weight: 700;
631
+ overflow-wrap: anywhere;
632
+ }
633
+ .active-dag-meta {
634
+ display: grid;
635
+ gap: 4px;
636
+ color: var(--body);
637
+ font-size: 12px;
638
+ }
639
+ .active-dag-link {
640
+ display: inline-block;
641
+ margin-top: 10px;
642
+ }
345
643
 
346
644
  .meta-grid {
347
- display: grid;
348
- grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
349
- gap: 15px 24px;
350
- margin: 0;
645
+ display: grid;
646
+ grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
647
+ gap: 15px 24px;
648
+ margin: 0;
351
649
  }
352
650
 
353
- .meta-item { min-width: 0; }
354
- .meta-item dt { color: var(--muted); font-size: 11px; font-weight: 650; }
355
- .meta-item dd { min-height: 24px; margin: 4px 0 0; padding-top: 5px; border-top: 1px solid var(--hairline); color: var(--ink); overflow-wrap: anywhere; font-size: 12px; }
651
+ .meta-item {
652
+ min-width: 0;
653
+ }
654
+ .meta-item dt {
655
+ color: var(--muted);
656
+ font-size: 11px;
657
+ font-weight: 650;
658
+ }
659
+ .meta-item dd {
660
+ min-height: 24px;
661
+ margin: 4px 0 0;
662
+ padding-top: 5px;
663
+ border-top: 1px solid var(--hairline);
664
+ color: var(--ink);
665
+ overflow-wrap: anywhere;
666
+ font-size: 12px;
667
+ }
356
668
 
357
- table { width: 100%; border-collapse: collapse; font-size: 13px; }
669
+ table {
670
+ width: 100%;
671
+ border-collapse: collapse;
672
+ font-size: 13px;
673
+ }
358
674
  th,
359
- td { padding: 11px 14px; border-bottom: 1px solid var(--hairline); text-align: left; vertical-align: top; }
360
- th { position: sticky; top: 0; z-index: 2; background: var(--surface-muted); color: var(--body); font-size: 11px; font-weight: 700; }
361
- td { color: var(--body); }
362
- tbody tr:last-child td { border-bottom: 0; }
363
- tbody tr { transition: background-color var(--transition-fast); }
364
- tbody tr:hover { background: #fff8f4; }
365
- tr.clickable { cursor: pointer; }
366
- tr.clickable:focus-within { outline: 2px solid var(--orange); outline-offset: -2px; }
675
+ td {
676
+ padding: 11px 14px;
677
+ border-bottom: 1px solid var(--hairline);
678
+ text-align: left;
679
+ vertical-align: top;
680
+ }
681
+ th {
682
+ position: sticky;
683
+ top: 0;
684
+ z-index: 2;
685
+ background: var(--surface-muted);
686
+ color: var(--body);
687
+ font-size: 11px;
688
+ font-weight: 700;
689
+ }
690
+ td {
691
+ color: var(--body);
692
+ }
693
+ tbody tr:last-child td {
694
+ border-bottom: 0;
695
+ }
696
+ tbody tr {
697
+ transition: background-color var(--transition-fast);
698
+ }
699
+ tbody tr:hover {
700
+ background: #fff8f4;
701
+ }
702
+ tr.clickable {
703
+ cursor: pointer;
704
+ }
705
+ tr.clickable:focus-within {
706
+ outline: 2px solid var(--orange);
707
+ outline-offset: -2px;
708
+ }
367
709
 
368
710
  .badge {
369
- display: inline-flex;
370
- align-items: center;
371
- min-height: 22px;
372
- padding: 2px 7px;
373
- border: 1px solid currentColor;
374
- border-radius: 999px;
375
- background: transparent;
376
- color: var(--muted);
377
- font-size: 11px;
378
- font-weight: 700;
379
- line-height: 1.2;
380
- white-space: nowrap;
711
+ display: inline-flex;
712
+ align-items: center;
713
+ min-height: 22px;
714
+ padding: 2px 7px;
715
+ border: 1px solid currentColor;
716
+ border-radius: 999px;
717
+ background: transparent;
718
+ color: var(--muted);
719
+ font-size: 11px;
720
+ font-weight: 700;
721
+ line-height: 1.2;
722
+ white-space: nowrap;
381
723
  }
382
724
 
383
725
  .badge-succeeded,
384
726
  .badge-finished,
385
727
  .badge-completed,
386
728
  .badge-done,
387
- .liveness-active { color: var(--green); background: #f2faf5; }
729
+ .liveness-active {
730
+ color: var(--green);
731
+ background: #f2faf5;
732
+ }
388
733
  .badge-failed,
389
734
  .badge-error,
390
- .liveness-stale { color: var(--red); background: #fff5f7; }
391
- .badge-partial-failed { color: #9a3a4f; background: #fff7f8; }
735
+ .liveness-stale {
736
+ color: var(--red);
737
+ background: #fff5f7;
738
+ }
739
+ .badge-partial-failed {
740
+ color: #9a3a4f;
741
+ background: #fff7f8;
742
+ }
392
743
  .badge-running,
393
- .badge-started { color: var(--orange-active); background: #fff5ed; }
744
+ .badge-started {
745
+ color: var(--orange-active);
746
+ background: #fff5ed;
747
+ }
394
748
  .badge-pending,
395
749
  .badge-queued,
396
750
  .badge-blocked,
397
- .badge-unknown { color: var(--body); background: var(--surface-muted); }
751
+ .badge-unknown {
752
+ color: var(--body);
753
+ background: var(--surface-muted);
754
+ }
398
755
  .badge-skipped,
399
756
  .badge-reused,
400
- .liveness-quiet { color: var(--blue); background: #f2f6fb; }
401
- .liveness-timeout-risk { color: var(--amber); background: #fff8e7; }
757
+ .liveness-quiet {
758
+ color: var(--blue);
759
+ background: #f2f6fb;
760
+ }
761
+ .liveness-timeout-risk {
762
+ color: var(--amber);
763
+ background: #fff8e7;
764
+ }
402
765
 
403
- .dag-detail-workspace { display: block; }
766
+ .dag-detail-workspace {
767
+ display: block;
768
+ }
404
769
 
405
770
  .dag-inspector {
406
- position: fixed;
407
- z-index: 40;
408
- top: 96px;
409
- right: 24px;
410
- bottom: 24px;
411
- display: grid;
412
- grid-template-rows: auto minmax(0, 1fr);
413
- width: min(var(--dag-inspector-width, 440px), calc(100vw - 48px));
414
- min-width: 0;
415
- padding: 0;
416
- overflow: hidden;
417
- border-color: var(--hairline-strong);
418
- box-shadow: 0 20px 48px rgba(38, 37, 30, .16);
419
- opacity: 0;
420
- pointer-events: none;
421
- transform: translateX(calc(100% + 24px));
422
- visibility: hidden;
423
- transition: transform var(--transition-base), opacity var(--transition-base), visibility 0s linear 240ms;
424
- }
425
- .dag-inspector.is-open { opacity: 1; pointer-events: auto; transform: translateX(0); visibility: visible; transition-delay: 0s, 0s, 0s; }
771
+ position: fixed;
772
+ z-index: 40;
773
+ top: 96px;
774
+ right: 24px;
775
+ bottom: 24px;
776
+ display: grid;
777
+ grid-template-rows: auto minmax(0, 1fr);
778
+ width: min(var(--dag-inspector-width, 440px), calc(100vw - 48px));
779
+ min-width: 0;
780
+ padding: 0;
781
+ overflow: hidden;
782
+ border-color: var(--hairline-strong);
783
+ box-shadow: 0 20px 48px rgba(38, 37, 30, 0.16);
784
+ opacity: 0;
785
+ pointer-events: none;
786
+ transform: translateX(calc(100% + 24px));
787
+ visibility: hidden;
788
+ transition:
789
+ transform var(--transition-base),
790
+ opacity var(--transition-base),
791
+ visibility 0s linear 240ms;
792
+ }
793
+ .dag-inspector.is-open {
794
+ opacity: 1;
795
+ pointer-events: auto;
796
+ transform: translateX(0);
797
+ visibility: visible;
798
+ transition-delay: 0s, 0s, 0s;
799
+ }
426
800
  .dag-inspector-resize-handle {
427
- position: absolute;
428
- z-index: 1;
429
- top: 0;
430
- bottom: 0;
431
- left: 0;
432
- width: 18px;
433
- cursor: col-resize;
434
- touch-action: none;
435
- outline: none;
801
+ position: absolute;
802
+ z-index: 1;
803
+ top: 0;
804
+ bottom: 0;
805
+ left: 0;
806
+ width: 18px;
807
+ cursor: col-resize;
808
+ touch-action: none;
809
+ outline: none;
436
810
  }
437
811
  .dag-inspector-resize-handle::before {
438
- content: "";
439
- position: absolute;
440
- top: 50%;
441
- left: 7px;
442
- width: 3px;
443
- height: 52px;
444
- transform: translateY(-50%);
445
- border-radius: 2px;
446
- background: var(--hairline-strong);
447
- opacity: 0;
448
- transition: opacity var(--transition-base), background var(--transition-base);
812
+ content: "";
813
+ position: absolute;
814
+ top: 50%;
815
+ left: 7px;
816
+ width: 3px;
817
+ height: 52px;
818
+ transform: translateY(-50%);
819
+ border-radius: 2px;
820
+ background: var(--hairline-strong);
821
+ opacity: 0;
822
+ transition:
823
+ opacity var(--transition-base),
824
+ background var(--transition-base);
449
825
  }
450
826
  .dag-inspector-resize-handle:hover::before,
451
- .dag-inspector-resize-handle:focus-visible::before { background: var(--orange); opacity: 1; }
452
- .dag-inspector-resize-handle:focus-visible { outline: 2px solid var(--orange); outline-offset: -2px; }
453
- body.is-resizing-dag-inspector { cursor: col-resize; user-select: none; }
454
- body.is-resizing-dag-graph { cursor: grabbing; user-select: none; }
455
- .dag-inspector-header { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: var(--space-3); align-items: start; padding: var(--space-4) var(--space-4) var(--space-3); border-bottom: 1px solid var(--hairline); background: var(--canvas-soft); }
456
- .dag-inspector-title { display: grid; gap: 6px; min-width: 0; }
457
- .dag-inspector-title h3 { margin: 0; font-size: 14px; }
458
- .dag-inspector-node { min-width: 0; color: var(--body); font-size: 12px; font-family: "JetBrains Mono", "SFMono-Regular", Consolas, monospace; overflow-wrap: anywhere; }
459
- .dag-inspector-controls { display: inline-flex; align-items: center; gap: 8px; }
460
- .dag-inspector-close { display: inline-grid; place-items: center; width: 32px; height: 32px; border: 1px solid var(--hairline-strong); border-radius: var(--radius-sm); background: var(--surface); color: var(--body); cursor: pointer; }
461
- .dag-inspector-close:hover, .dag-inspector-close:focus-visible { border-color: var(--orange); color: var(--orange-active); outline: none; }
462
- .dag-inspector-tabs { display: flex; grid-column: 1 / -1; gap: 4px; margin-top: 2px; }
463
- .dag-inspector-tab { min-height: 32px; padding: 0 10px; border: 1px solid transparent; border-radius: var(--radius-sm); background: transparent; color: var(--muted); font-size: 12px; font-weight: 700; cursor: pointer; }
464
- .dag-inspector-tab:hover, .dag-inspector-tab:focus-visible { color: var(--ink); outline: none; }
465
- .dag-inspector-tab[aria-selected="true"] { border-color: color-mix(in srgb, var(--orange) 55%, var(--hairline)); background: #fff5ed; color: var(--orange-active); }
466
- .dag-inspector-content { min-height: 0; padding: var(--space-4); overflow: auto; overscroll-behavior: contain; }
467
- .panel-graph { min-height: 0; }
468
-
469
- .dag-graph-wrap { display: grid; gap: var(--space-3); }
470
- .dag-graph-toolbar { display: flex; align-items: center; justify-content: space-between; gap: var(--space-3); }
827
+ .dag-inspector-resize-handle:focus-visible::before {
828
+ background: var(--orange);
829
+ opacity: 1;
830
+ }
831
+ .dag-inspector-resize-handle:focus-visible {
832
+ outline: 2px solid var(--orange);
833
+ outline-offset: -2px;
834
+ }
835
+ body.is-resizing-dag-inspector {
836
+ cursor: col-resize;
837
+ user-select: none;
838
+ }
839
+ body.is-resizing-dag-graph {
840
+ cursor: grabbing;
841
+ user-select: none;
842
+ }
843
+ .dag-inspector-header {
844
+ display: grid;
845
+ grid-template-columns: minmax(0, 1fr) auto;
846
+ gap: var(--space-3);
847
+ align-items: start;
848
+ padding: var(--space-4) var(--space-4) var(--space-3);
849
+ border-bottom: 1px solid var(--hairline);
850
+ background: var(--canvas-soft);
851
+ }
852
+ .dag-inspector-title {
853
+ display: grid;
854
+ gap: 6px;
855
+ min-width: 0;
856
+ }
857
+ .dag-inspector-title h3 {
858
+ margin: 0;
859
+ font-size: 14px;
860
+ }
861
+ .dag-inspector-node {
862
+ min-width: 0;
863
+ color: var(--body);
864
+ font-size: 12px;
865
+ font-family: "JetBrains Mono", "SFMono-Regular", Consolas, monospace;
866
+ overflow-wrap: anywhere;
867
+ }
868
+ .dag-inspector-controls {
869
+ display: inline-flex;
870
+ align-items: center;
871
+ gap: 8px;
872
+ }
873
+ .dag-inspector-close {
874
+ display: inline-grid;
875
+ place-items: center;
876
+ width: 32px;
877
+ height: 32px;
878
+ border: 1px solid var(--hairline-strong);
879
+ border-radius: var(--radius-sm);
880
+ background: var(--surface);
881
+ color: var(--body);
882
+ cursor: pointer;
883
+ }
884
+ .dag-inspector-close:hover,
885
+ .dag-inspector-close:focus-visible {
886
+ border-color: var(--orange);
887
+ color: var(--orange-active);
888
+ outline: none;
889
+ }
890
+ .dag-inspector-tabs {
891
+ display: flex;
892
+ grid-column: 1 / -1;
893
+ gap: 4px;
894
+ margin-top: 2px;
895
+ }
896
+ .dag-inspector-tab {
897
+ min-height: 32px;
898
+ padding: 0 10px;
899
+ border: 1px solid transparent;
900
+ border-radius: var(--radius-sm);
901
+ background: transparent;
902
+ color: var(--muted);
903
+ font-size: 12px;
904
+ font-weight: 700;
905
+ cursor: pointer;
906
+ }
907
+ .dag-inspector-tab:hover,
908
+ .dag-inspector-tab:focus-visible {
909
+ color: var(--ink);
910
+ outline: none;
911
+ }
912
+ .dag-inspector-tab[aria-selected="true"] {
913
+ border-color: color-mix(in srgb, var(--orange) 55%, var(--hairline));
914
+ background: #fff5ed;
915
+ color: var(--orange-active);
916
+ }
917
+ .dag-inspector-content {
918
+ min-height: 0;
919
+ padding: var(--space-4);
920
+ overflow: auto;
921
+ overscroll-behavior: contain;
922
+ }
923
+ .panel-graph {
924
+ min-height: 0;
925
+ }
926
+
927
+ .dag-graph-wrap {
928
+ display: grid;
929
+ gap: var(--space-3);
930
+ }
931
+ .dag-graph-toolbar {
932
+ display: flex;
933
+ align-items: center;
934
+ justify-content: space-between;
935
+ gap: var(--space-3);
936
+ }
471
937
  .dag-graph-summary,
472
- .dag-graph-fallback { margin: 0; color: var(--muted); font-size: 12px; }
938
+ .dag-graph-fallback {
939
+ margin: 0;
940
+ color: var(--muted);
941
+ font-size: 12px;
942
+ }
473
943
  .dag-graph-reset {
474
- min-height: 32px;
475
- padding: 0 10px;
476
- border: 1px solid var(--hairline-strong);
477
- border-radius: var(--radius-sm);
478
- background: var(--surface);
479
- color: var(--ink);
480
- font-size: 12px;
481
- font-weight: 650;
482
- cursor: pointer;
944
+ min-height: 32px;
945
+ padding: 0 10px;
946
+ border: 1px solid var(--hairline-strong);
947
+ border-radius: var(--radius-sm);
948
+ background: var(--surface);
949
+ color: var(--ink);
950
+ font-size: 12px;
951
+ font-weight: 650;
952
+ cursor: pointer;
483
953
  }
484
954
  .dag-graph-reset:hover,
485
- .dag-graph-reset:focus-visible { border-color: var(--orange); color: var(--orange-active); outline: none; }
486
- .dag-graph-viewport { min-height: 320px; max-height: 560px; overflow: auto; border: 1px solid var(--hairline); border-radius: var(--radius-md); background: var(--canvas-soft); scroll-behavior: auto; }
487
- .dag-graph { display: block; }
488
- .dag-edge { fill: none; stroke: var(--hairline-strong); stroke-width: 2; transition: opacity var(--transition-fast), stroke var(--transition-fast); }
489
- #dag-arrow path { fill: var(--hairline-strong); }
490
- .dag-graph-node { cursor: pointer; transition: opacity var(--transition-fast); }
491
- .dag-graph-node rect { fill: var(--surface); stroke: var(--hairline-strong); stroke-width: 1.5; }
955
+ .dag-graph-reset:focus-visible {
956
+ border-color: var(--orange);
957
+ color: var(--orange-active);
958
+ outline: none;
959
+ }
960
+ .dag-graph-viewport {
961
+ min-height: 320px;
962
+ max-height: 560px;
963
+ overflow: auto;
964
+ border: 1px solid var(--hairline);
965
+ border-radius: var(--radius-md);
966
+ background: var(--canvas-soft);
967
+ scroll-behavior: auto;
968
+ }
969
+ .dag-graph {
970
+ display: block;
971
+ }
972
+ .dag-edge {
973
+ fill: none;
974
+ stroke: var(--hairline-strong);
975
+ stroke-width: 2;
976
+ transition:
977
+ opacity var(--transition-fast),
978
+ stroke var(--transition-fast);
979
+ }
980
+ #dag-arrow path {
981
+ fill: var(--hairline-strong);
982
+ }
983
+ .dag-graph-node {
984
+ cursor: pointer;
985
+ transition: opacity var(--transition-fast);
986
+ }
987
+ .dag-graph-node rect {
988
+ fill: var(--surface);
989
+ stroke: var(--hairline-strong);
990
+ stroke-width: 1.5;
991
+ }
492
992
  .dag-graph-node:hover rect,
493
- .dag-graph-node:focus-visible rect { stroke: var(--orange); stroke-width: 2; }
494
- .dag-graph-node:focus { outline: none; }
495
- .dag-graph-node.selected rect { stroke: var(--orange); stroke-width: 3; }
993
+ .dag-graph-node:focus-visible rect {
994
+ stroke: var(--orange);
995
+ stroke-width: 2;
996
+ }
997
+ .dag-graph-node:focus {
998
+ outline: none;
999
+ }
1000
+ .dag-graph-node.selected rect {
1001
+ stroke: var(--orange);
1002
+ stroke-width: 3;
1003
+ }
496
1004
  .dag-graph-node.status-running rect,
497
- .dag-graph-node.status-started rect { stroke: var(--orange); fill: #fff7f0; }
1005
+ .dag-graph-node.status-started rect {
1006
+ stroke: var(--orange);
1007
+ fill: #fff7f0;
1008
+ }
498
1009
  .dag-graph-node.status-failed rect,
499
- .dag-graph-node.status-error rect { stroke: var(--red); fill: #fff7f8; }
1010
+ .dag-graph-node.status-error rect {
1011
+ stroke: var(--red);
1012
+ fill: #fff7f8;
1013
+ }
500
1014
  .dag-graph-node.status-succeeded:hover rect,
501
1015
  .dag-graph-node.status-succeeded:focus-visible rect,
502
1016
  .dag-graph-node.status-finished:hover rect,
@@ -504,163 +1018,885 @@ body.is-resizing-dag-graph { cursor: grabbing; user-select: none; }
504
1018
  .dag-graph-node.status-completed:hover rect,
505
1019
  .dag-graph-node.status-completed:focus-visible rect,
506
1020
  .dag-graph-node.status-done:hover rect,
507
- .dag-graph-node.status-done:focus-visible rect { stroke: var(--green); fill: #f2faf5; }
1021
+ .dag-graph-node.status-done:focus-visible rect {
1022
+ stroke: var(--green);
1023
+ fill: #f2faf5;
1024
+ }
508
1025
  .dag-graph-node.selected.status-succeeded rect,
509
1026
  .dag-graph-node.selected.status-finished rect,
510
1027
  .dag-graph-node.selected.status-completed rect,
511
- .dag-graph-node.selected.status-done rect { stroke: var(--green); fill: #f2faf5; }
512
- .dag-graph-node.status-skipped rect { stroke-dasharray: 5 4; }
513
- .dag-node-label { fill: var(--ink); font-size: 13px; font-weight: 700; }
514
- .dag-node-meta { fill: var(--muted); font-size: 11px; }
515
- .dag-node-status { fill: var(--body); font-size: 11px; }
516
- .dag-dimmed { opacity: .28; }
517
- .dag-graph-node.status-running { animation: graph-node-pulse 2s ease-in-out infinite; }
518
- @keyframes graph-node-pulse { 50% { opacity: .72; } }
519
-
520
- .dag-section-heading { display: flex; align-items: baseline; justify-content: space-between; gap: var(--space-3); margin-bottom: var(--space-4); }
521
- .dag-section-heading h3 { margin: 0; }
522
- .dag-section-meta { color: var(--muted); font-size: 12px; }
523
- #dag-nodes .dag-section-heading { padding: var(--space-5) var(--space-5) 0; }
524
- #dag-nodes .dag-node-table { border-top: 1px solid var(--hairline); }
525
- .dag-node-table { table-layout: fixed; }
526
- .dag-node-table th:nth-child(1), .dag-node-table td:nth-child(1) { width: 19%; }
527
- .dag-node-table th:nth-child(2), .dag-node-table td:nth-child(2) { width: 7%; }
528
- .dag-node-table th:nth-child(3), .dag-node-table td:nth-child(3) { width: 12%; }
529
- .dag-node-table th:nth-child(4), .dag-node-table td:nth-child(4) { width: 16%; }
530
- .dag-node-table th:nth-child(5), .dag-node-table td:nth-child(5) { width: 12%; }
531
- .dag-node-table th:nth-child(6), .dag-node-table td:nth-child(6) { width: 9%; }
532
- .dag-node-table th:nth-child(7), .dag-node-table td:nth-child(7) { width: 25%; }
533
- .dag-node-table td:nth-child(1), .dag-node-table td:nth-child(4), .dag-node-table td:nth-child(7) { overflow-wrap: anywhere; }
534
- .dag-active-node { background: #fff8f3; }
535
- .dag-error-node { background: #fff7f8; }
536
- .dag-node-selected { box-shadow: inset 3px 0 0 var(--orange); }
537
-
538
- .rank-lanes { display: grid; gap: var(--space-3); }
539
- .rank-lane { display: grid; grid-template-columns: 56px minmax(0, 1fr); gap: var(--space-3); align-items: center; }
540
- .rank-lane-label { color: var(--muted); font-size: 11px; font-weight: 700; }
541
- .rank-lane-nodes { display: flex; flex-wrap: wrap; gap: 8px; }
542
- .rank-node-chip { display: inline-flex; align-items: center; gap: 7px; min-height: 32px; padding: 5px 8px; border: 1px solid var(--hairline); border-radius: var(--radius-sm); background: var(--canvas-soft); }
543
- .rank-node-active { border-color: var(--orange); }
544
- .rank-node-error { border-color: var(--red); }
545
- .rank-node-id { color: var(--ink); font-size: 11px; }
546
- .rank-node-dur { color: var(--muted); font-size: 11px; }
547
-
548
- .process-timeline-note { margin: 0 0 var(--space-2); color: var(--muted); font-size: 11px; }
549
- .process-timeline { display: grid; gap: 0; margin: 0; padding: var(--space-2) 0; list-style: none; }
550
- .process-timeline-item { display: grid; grid-template-columns: 20px minmax(0, 1fr); align-items: stretch; min-height: 34px; }
551
- .process-timeline-item.has-time { grid-template-columns: 20px 92px minmax(0, 1fr); }
552
- .process-timeline-rail { position: relative; display: grid; place-items: center; min-height: 34px; }
553
- .process-timeline-rail::before { position: absolute; top: 0; bottom: 0; width: 1px; background: var(--hairline-strong); content: ""; }
554
- .process-timeline-item.is-first .process-timeline-rail::before { top: 50%; }
555
- .process-timeline-item.is-last .process-timeline-rail::before { bottom: 50%; }
556
- .process-timeline-dot { position: relative; z-index: 1; width: 8px; height: 8px; border: 2px solid var(--surface); border-radius: 50%; background: var(--muted-soft); }
557
- .process-timeline-lifecycle .process-timeline-dot { background: var(--lavender); }
558
- .process-timeline-tool-start .process-timeline-dot { background: var(--orange); }
559
- .process-timeline-tool-end .process-timeline-dot { background: var(--green); }
560
- .process-timeline-assistant .process-timeline-dot { background: var(--blue); }
561
- .process-timeline-protocol .process-timeline-dot { background: var(--muted-soft); }
562
- .process-timeline-time { padding: 9px 0; color: var(--muted); font-size: 10px; font-variant-numeric: tabular-nums; }
563
- .process-timeline-label { min-width: 0; padding: 8px 0 8px var(--space-2); color: var(--body); font-size: 12px; line-height: 1.5; overflow-wrap: anywhere; }
564
- .process-timeline-protocol .process-timeline-label { color: var(--muted); font-size: 11px; }
565
-
566
- .markdown-output { display: grid; gap: var(--space-3); color: var(--body); font-size: 13px; line-height: 1.65; }
567
- .markdown-output > :first-child { margin-top: 0; }
568
- .markdown-output > :last-child { margin-bottom: 0; }
569
- .markdown-output h1, .markdown-output h2, .markdown-output h3, .markdown-output h4 { margin: var(--space-5) 0 var(--space-2); color: var(--ink); line-height: 1.3; }
570
- .markdown-output h1 { font-size: 21px; }
571
- .markdown-output h2 { font-size: 18px; }
572
- .markdown-output h3 { font-size: 16px; }
573
- .markdown-output h4 { font-size: 14px; }
574
- .markdown-output p, .markdown-output blockquote, .markdown-output ul, .markdown-output ol { margin: 0; }
575
- .markdown-output ul, .markdown-output ol { padding-left: 22px; }
576
- .markdown-output blockquote { padding-left: 12px; border-left: 3px solid var(--peach); color: var(--body); }
577
- .markdown-output pre { margin: 0; padding: var(--space-3); overflow: auto; border: 1px solid var(--hairline); border-radius: var(--radius-sm); background: var(--surface-ink); color: #f8f7f2; font-size: 12px; line-height: 1.65; }
578
- .markdown-output code { padding: 1px 4px; border-radius: 3px; background: var(--surface-muted); color: var(--ink); font-size: .92em; }
579
- .markdown-output pre code { padding: 0; background: transparent; color: inherit; }
580
- .markdown-output a { color: var(--orange-active); text-decoration-color: var(--orange); text-underline-offset: 3px; }
581
- .markdown-output table { font-size: 12px; }
582
- .markdown-output th, .markdown-output td { padding: 8px 9px; }
583
- .markdown-output th { position: static; }
584
- .markdown-error { display: grid; gap: var(--space-2); padding-top: var(--space-4); border-top: 1px solid var(--hairline); }
585
- .markdown-error-title { margin: 0; color: var(--red); font-size: 12px; font-weight: 700; }
586
-
587
- .run-detail-workspace { display: grid; grid-template-columns: minmax(220px, .5fr) minmax(0, 1.25fr) minmax(220px, .45fr); gap: var(--space-4); align-items: start; }
588
- .run-evidence { display: grid; gap: var(--space-4); min-width: 0; }
589
- .panel-rail { background: var(--canvas-soft); }
590
- .step-timeline { display: grid; gap: 0; margin: 0; padding: 0; list-style: none; }
591
- .step-timeline li { display: grid; grid-template-columns: 18px minmax(0, 1fr) auto; align-items: center; gap: 8px; min-height: 38px; border-bottom: 1px solid var(--hairline); }
592
- .step-timeline li:last-child { border-bottom: 0; }
593
- .step-marker { display: inline-grid; place-items: center; width: 16px; height: 16px; border: 1px solid var(--hairline-strong); border-radius: 50%; color: var(--muted); font-size: 10px; }
594
- .step-marker.succeeded { border-color: var(--green); color: var(--green); }
595
- .step-marker.running { border-color: var(--orange); color: var(--orange-active); }
596
- .step-marker.failed { border-color: var(--red); color: var(--red); }
597
- .step-name { min-width: 0; color: var(--body); font-size: 12px; overflow-wrap: anywhere; }
598
- .step-duration { color: var(--muted); font-size: 11px; font-variant-numeric: tabular-nums; }
599
-
600
- .output-block { max-height: 480px; margin: 0; padding: var(--space-4); overflow: auto; border: 1px solid var(--hairline); border-radius: var(--radius-sm); background: var(--surface-ink); color: #f8f7f2; font-size: 12px; line-height: 1.7; white-space: pre-wrap; overflow-wrap: anywhere; }
601
-
602
- .artifact-list { display: grid; gap: 8px; margin: 0; padding: 0; list-style: none; }
603
- .artifact-list li { min-width: 0; }
604
- .artifact-list a { color: var(--body); font-size: 12px; overflow-wrap: anywhere; }
605
- .artifact-links { display: flex; flex-wrap: wrap; gap: 6px; }
606
- .muted { color: var(--muted); }
607
-
608
- .dag-run-timeline { position: relative; display: grid; gap: 0; }
609
- .dag-run-timeline::before { position: absolute; top: 12px; bottom: 12px; left: 10px; width: 1px; background: var(--hairline-strong); content: ""; }
610
- .dag-run-timeline-item { position: relative; display: grid; grid-template-columns: 24px minmax(0, 1fr) auto; gap: var(--space-3); align-items: start; padding: 9px 0; color: inherit; text-decoration: none; transition: background-color var(--transition-fast); }
1028
+ .dag-graph-node.selected.status-done rect {
1029
+ stroke: var(--green);
1030
+ fill: #f2faf5;
1031
+ }
1032
+ .dag-graph-node.status-skipped rect {
1033
+ stroke-dasharray: 5 4;
1034
+ }
1035
+ .dag-node-label {
1036
+ fill: var(--ink);
1037
+ font-size: 13px;
1038
+ font-weight: 700;
1039
+ }
1040
+ .dag-node-meta {
1041
+ fill: var(--muted);
1042
+ font-size: 11px;
1043
+ }
1044
+ .dag-node-status {
1045
+ fill: var(--body);
1046
+ font-size: 11px;
1047
+ }
1048
+ .dag-dimmed {
1049
+ opacity: 0.28;
1050
+ }
1051
+ .dag-graph-node.status-running {
1052
+ animation: graph-node-pulse 2s ease-in-out infinite;
1053
+ }
1054
+ @keyframes graph-node-pulse {
1055
+ 50% {
1056
+ opacity: 0.72;
1057
+ }
1058
+ }
1059
+
1060
+ .dag-section-heading {
1061
+ display: flex;
1062
+ align-items: baseline;
1063
+ justify-content: space-between;
1064
+ gap: var(--space-3);
1065
+ margin-bottom: var(--space-4);
1066
+ }
1067
+ .dag-section-heading h3 {
1068
+ margin: 0;
1069
+ }
1070
+ .dag-section-meta {
1071
+ color: var(--muted);
1072
+ font-size: 12px;
1073
+ }
1074
+ #dag-nodes .dag-section-heading {
1075
+ padding: var(--space-5) var(--space-5) 0;
1076
+ }
1077
+ #dag-nodes .dag-node-table {
1078
+ border-top: 1px solid var(--hairline);
1079
+ }
1080
+ .dag-node-table {
1081
+ table-layout: fixed;
1082
+ }
1083
+ .dag-node-table th:nth-child(1),
1084
+ .dag-node-table td:nth-child(1) {
1085
+ width: 19%;
1086
+ }
1087
+ .dag-node-table th:nth-child(2),
1088
+ .dag-node-table td:nth-child(2) {
1089
+ width: 7%;
1090
+ }
1091
+ .dag-node-table th:nth-child(3),
1092
+ .dag-node-table td:nth-child(3) {
1093
+ width: 12%;
1094
+ }
1095
+ .dag-node-table th:nth-child(4),
1096
+ .dag-node-table td:nth-child(4) {
1097
+ width: 16%;
1098
+ }
1099
+ .dag-node-table th:nth-child(5),
1100
+ .dag-node-table td:nth-child(5) {
1101
+ width: 12%;
1102
+ }
1103
+ .dag-node-table th:nth-child(6),
1104
+ .dag-node-table td:nth-child(6) {
1105
+ width: 9%;
1106
+ }
1107
+ .dag-node-table th:nth-child(7),
1108
+ .dag-node-table td:nth-child(7) {
1109
+ width: 25%;
1110
+ }
1111
+ .dag-node-table td:nth-child(1),
1112
+ .dag-node-table td:nth-child(4),
1113
+ .dag-node-table td:nth-child(7) {
1114
+ overflow-wrap: anywhere;
1115
+ }
1116
+ .dag-active-node {
1117
+ background: #fff8f3;
1118
+ }
1119
+ .dag-error-node {
1120
+ background: #fff7f8;
1121
+ }
1122
+ .dag-node-selected {
1123
+ box-shadow: inset 3px 0 0 var(--orange);
1124
+ }
1125
+
1126
+ .rank-lanes {
1127
+ display: grid;
1128
+ gap: var(--space-3);
1129
+ }
1130
+ .rank-lane {
1131
+ display: grid;
1132
+ grid-template-columns: 56px minmax(0, 1fr);
1133
+ gap: var(--space-3);
1134
+ align-items: center;
1135
+ }
1136
+ .rank-lane-label {
1137
+ color: var(--muted);
1138
+ font-size: 11px;
1139
+ font-weight: 700;
1140
+ }
1141
+ .rank-lane-nodes {
1142
+ display: flex;
1143
+ flex-wrap: wrap;
1144
+ gap: 8px;
1145
+ }
1146
+ .rank-node-chip {
1147
+ display: inline-flex;
1148
+ align-items: center;
1149
+ gap: 7px;
1150
+ min-height: 32px;
1151
+ padding: 5px 8px;
1152
+ border: 1px solid var(--hairline);
1153
+ border-radius: var(--radius-sm);
1154
+ background: var(--canvas-soft);
1155
+ }
1156
+ .rank-node-active {
1157
+ border-color: var(--orange);
1158
+ }
1159
+ .rank-node-error {
1160
+ border-color: var(--red);
1161
+ }
1162
+ .rank-node-id {
1163
+ color: var(--ink);
1164
+ font-size: 11px;
1165
+ }
1166
+ .rank-node-dur {
1167
+ color: var(--muted);
1168
+ font-size: 11px;
1169
+ }
1170
+
1171
+ .process-timeline-note {
1172
+ margin: 0 0 var(--space-2);
1173
+ color: var(--muted);
1174
+ font-size: 11px;
1175
+ }
1176
+ .process-timeline {
1177
+ display: grid;
1178
+ gap: 0;
1179
+ margin: 0;
1180
+ padding: var(--space-2) 0;
1181
+ list-style: none;
1182
+ }
1183
+ .process-timeline-item {
1184
+ display: grid;
1185
+ grid-template-columns: 20px minmax(0, 1fr);
1186
+ align-items: stretch;
1187
+ min-height: 34px;
1188
+ }
1189
+ .process-timeline-item.has-time {
1190
+ grid-template-columns: 20px 92px minmax(0, 1fr);
1191
+ }
1192
+ .process-timeline-rail {
1193
+ position: relative;
1194
+ display: grid;
1195
+ place-items: center;
1196
+ min-height: 34px;
1197
+ }
1198
+ .process-timeline-rail::before {
1199
+ position: absolute;
1200
+ top: 0;
1201
+ bottom: 0;
1202
+ width: 1px;
1203
+ background: var(--hairline-strong);
1204
+ content: "";
1205
+ }
1206
+ .process-timeline-item.is-first .process-timeline-rail::before {
1207
+ top: 50%;
1208
+ }
1209
+ .process-timeline-item.is-last .process-timeline-rail::before {
1210
+ bottom: 50%;
1211
+ }
1212
+ .process-timeline-dot {
1213
+ position: relative;
1214
+ z-index: 1;
1215
+ width: 8px;
1216
+ height: 8px;
1217
+ border: 2px solid var(--surface);
1218
+ border-radius: 50%;
1219
+ background: var(--muted-soft);
1220
+ }
1221
+ .process-timeline-lifecycle .process-timeline-dot {
1222
+ background: var(--lavender);
1223
+ }
1224
+ .process-timeline-tool-start .process-timeline-dot {
1225
+ background: var(--orange);
1226
+ }
1227
+ .process-timeline-tool-end .process-timeline-dot {
1228
+ background: var(--green);
1229
+ }
1230
+ .process-timeline-assistant .process-timeline-dot {
1231
+ background: var(--blue);
1232
+ }
1233
+ .process-timeline-protocol .process-timeline-dot {
1234
+ background: var(--muted-soft);
1235
+ }
1236
+ .process-timeline-time {
1237
+ padding: 9px 0;
1238
+ color: var(--muted);
1239
+ font-size: 10px;
1240
+ font-variant-numeric: tabular-nums;
1241
+ }
1242
+ .process-timeline-label {
1243
+ min-width: 0;
1244
+ padding: 8px 0 8px var(--space-2);
1245
+ color: var(--body);
1246
+ font-size: 12px;
1247
+ line-height: 1.5;
1248
+ overflow-wrap: anywhere;
1249
+ }
1250
+ .process-timeline-protocol .process-timeline-label {
1251
+ color: var(--muted);
1252
+ font-size: 11px;
1253
+ }
1254
+
1255
+ .markdown-output {
1256
+ display: grid;
1257
+ gap: var(--space-3);
1258
+ color: var(--body);
1259
+ font-size: 13px;
1260
+ line-height: 1.65;
1261
+ }
1262
+ .markdown-output > :first-child {
1263
+ margin-top: 0;
1264
+ }
1265
+ .markdown-output > :last-child {
1266
+ margin-bottom: 0;
1267
+ }
1268
+ .markdown-output h1,
1269
+ .markdown-output h2,
1270
+ .markdown-output h3,
1271
+ .markdown-output h4 {
1272
+ margin: var(--space-5) 0 var(--space-2);
1273
+ color: var(--ink);
1274
+ line-height: 1.3;
1275
+ }
1276
+ .markdown-output h1 {
1277
+ font-size: 21px;
1278
+ }
1279
+ .markdown-output h2 {
1280
+ font-size: 18px;
1281
+ }
1282
+ .markdown-output h3 {
1283
+ font-size: 16px;
1284
+ }
1285
+ .markdown-output h4 {
1286
+ font-size: 14px;
1287
+ }
1288
+ .markdown-output p,
1289
+ .markdown-output blockquote,
1290
+ .markdown-output ul,
1291
+ .markdown-output ol {
1292
+ margin: 0;
1293
+ }
1294
+ .markdown-output ul,
1295
+ .markdown-output ol {
1296
+ padding-left: 22px;
1297
+ }
1298
+ .markdown-output blockquote {
1299
+ padding-left: 12px;
1300
+ border-left: 3px solid var(--peach);
1301
+ color: var(--body);
1302
+ }
1303
+ .markdown-output pre {
1304
+ margin: 0;
1305
+ padding: var(--space-3);
1306
+ overflow: auto;
1307
+ border: 1px solid var(--hairline);
1308
+ border-radius: var(--radius-sm);
1309
+ background: var(--surface-ink);
1310
+ color: #f8f7f2;
1311
+ font-size: 12px;
1312
+ line-height: 1.65;
1313
+ }
1314
+ .markdown-output code {
1315
+ padding: 1px 4px;
1316
+ border-radius: 3px;
1317
+ background: var(--surface-muted);
1318
+ color: var(--ink);
1319
+ font-size: 0.92em;
1320
+ }
1321
+ .markdown-output pre code {
1322
+ padding: 0;
1323
+ background: transparent;
1324
+ color: inherit;
1325
+ }
1326
+ .markdown-output a {
1327
+ color: var(--orange-active);
1328
+ text-decoration-color: var(--orange);
1329
+ text-underline-offset: 3px;
1330
+ }
1331
+ .markdown-output table {
1332
+ font-size: 12px;
1333
+ }
1334
+ .markdown-output th,
1335
+ .markdown-output td {
1336
+ padding: 8px 9px;
1337
+ }
1338
+ .markdown-output th {
1339
+ position: static;
1340
+ }
1341
+ .markdown-error {
1342
+ display: grid;
1343
+ gap: var(--space-2);
1344
+ padding-top: var(--space-4);
1345
+ border-top: 1px solid var(--hairline);
1346
+ }
1347
+ .markdown-error-title {
1348
+ margin: 0;
1349
+ color: var(--red);
1350
+ font-size: 12px;
1351
+ font-weight: 700;
1352
+ }
1353
+
1354
+ .spec-evidence-section { padding-bottom: var(--space-4); border-bottom: 1px solid var(--hairline); }
1355
+ .spec-evidence-section + .spec-evidence-section { margin-top: var(--space-4); }
1356
+ .spec-evidence-section h4 { margin: 0 0 var(--space-2); color: var(--ink); font-size: 12px; font-weight: 700; }
1357
+ .spec-evidence-summary { margin: var(--space-2) 0 0; color: var(--body); font-size: 12px; line-height: 1.6; }
1358
+ .spec-evidence-list { display: grid; gap: 6px; margin: var(--space-2) 0 0; padding: 0; list-style: none; }
1359
+ .spec-evidence-list li { display: flex; align-items: flex-start; gap: 6px; color: var(--body); font-size: 12px; line-height: 1.5; overflow-wrap: anywhere; }
1360
+ .spec-evidence-list li > i { flex-shrink: 0; margin-top: 2px; color: var(--muted); font-size: 13px; }
1361
+ .spec-evidence-list code { font-size: 11px; }
1362
+ .spec-evidence-time { margin-left: auto; color: var(--muted); font-size: 10px; font-variant-numeric: tabular-nums; white-space: nowrap; }
1363
+ .spec-evidence-warning { display: flex; align-items: flex-start; gap: 8px; margin-top: var(--space-4); padding: 10px 12px; border: 1px solid color-mix(in srgb, var(--amber) 50%, var(--hairline)); border-radius: var(--radius-sm); background: #fff8e7; color: var(--body); font-size: 12px; line-height: 1.6; }
1364
+ .spec-evidence-warning > i { flex-shrink: 0; margin-top: 2px; color: var(--amber); }
1365
+
1366
+ .run-layer-process {
1367
+ display: grid;
1368
+ gap: var(--space-4);
1369
+ margin-top: var(--space-4);
1370
+ }
1371
+ .run-layer-diagnosis {
1372
+ display: grid;
1373
+ gap: var(--space-4);
1374
+ margin-top: var(--space-4);
1375
+ }
1376
+ .run-detail-workspace {
1377
+ display: grid;
1378
+ grid-template-columns: minmax(220px, 0.5fr) minmax(0, 1.25fr);
1379
+ gap: var(--space-4);
1380
+ align-items: start;
1381
+ }
1382
+ .run-evidence {
1383
+ display: grid;
1384
+ gap: var(--space-4);
1385
+ min-width: 0;
1386
+ }
1387
+ .artifact-preview-list {
1388
+ gap: 12px;
1389
+ }
1390
+ .artifact-preview-head {
1391
+ display: flex;
1392
+ flex-wrap: wrap;
1393
+ gap: 8px;
1394
+ align-items: baseline;
1395
+ margin-bottom: 6px;
1396
+ }
1397
+ .artifact-preview-label {
1398
+ font-size: 12px;
1399
+ color: var(--muted);
1400
+ overflow-wrap: anywhere;
1401
+ }
1402
+ .artifact-preview-body {
1403
+ max-height: 240px;
1404
+ overflow: auto;
1405
+ font-size: 12px;
1406
+ }
1407
+ .artifact-preview-error {
1408
+ color: var(--red);
1409
+ }
1410
+ .batch-task-links,
1411
+ .batch-task-evidence {
1412
+ display: flex;
1413
+ flex-wrap: wrap;
1414
+ gap: 4px;
1415
+ align-items: center;
1416
+ }
1417
+ .object-link {
1418
+ color: var(--body);
1419
+ text-decoration: underline;
1420
+ text-underline-offset: 2px;
1421
+ }
1422
+ .panel-rail {
1423
+ background: var(--canvas-soft);
1424
+ }
1425
+ .step-timeline {
1426
+ display: grid;
1427
+ gap: 0;
1428
+ margin: 0;
1429
+ padding: 0;
1430
+ list-style: none;
1431
+ }
1432
+ .step-timeline li {
1433
+ display: grid;
1434
+ grid-template-columns: 18px minmax(0, 1fr) auto;
1435
+ align-items: center;
1436
+ gap: 8px;
1437
+ min-height: 38px;
1438
+ border-bottom: 1px solid var(--hairline);
1439
+ }
1440
+ .step-timeline li:last-child {
1441
+ border-bottom: 0;
1442
+ }
1443
+ .step-marker {
1444
+ display: inline-grid;
1445
+ place-items: center;
1446
+ width: 16px;
1447
+ height: 16px;
1448
+ border: 1px solid var(--hairline-strong);
1449
+ border-radius: 50%;
1450
+ color: var(--muted);
1451
+ font-size: 10px;
1452
+ }
1453
+ .step-marker.succeeded {
1454
+ border-color: var(--green);
1455
+ color: var(--green);
1456
+ }
1457
+ .step-marker.running {
1458
+ border-color: var(--orange);
1459
+ color: var(--orange-active);
1460
+ }
1461
+ .step-marker.failed {
1462
+ border-color: var(--red);
1463
+ color: var(--red);
1464
+ }
1465
+ .step-name {
1466
+ min-width: 0;
1467
+ color: var(--body);
1468
+ font-size: 12px;
1469
+ overflow-wrap: anywhere;
1470
+ }
1471
+ .step-duration {
1472
+ color: var(--muted);
1473
+ font-size: 11px;
1474
+ font-variant-numeric: tabular-nums;
1475
+ }
1476
+
1477
+ .output-block {
1478
+ max-height: 480px;
1479
+ margin: 0;
1480
+ padding: var(--space-4);
1481
+ overflow: auto;
1482
+ border: 1px solid var(--hairline);
1483
+ border-radius: var(--radius-sm);
1484
+ background: var(--surface-ink);
1485
+ color: #f8f7f2;
1486
+ font-size: 12px;
1487
+ line-height: 1.7;
1488
+ white-space: pre-wrap;
1489
+ overflow-wrap: anywhere;
1490
+ }
1491
+
1492
+ .artifact-list {
1493
+ display: grid;
1494
+ gap: 8px;
1495
+ margin: 0;
1496
+ padding: 0;
1497
+ list-style: none;
1498
+ }
1499
+ .artifact-list li {
1500
+ min-width: 0;
1501
+ }
1502
+ .artifact-list a {
1503
+ color: var(--body);
1504
+ font-size: 12px;
1505
+ overflow-wrap: anywhere;
1506
+ }
1507
+ .artifact-links {
1508
+ display: flex;
1509
+ flex-wrap: wrap;
1510
+ gap: 6px;
1511
+ }
1512
+ .muted {
1513
+ color: var(--muted);
1514
+ }
1515
+
1516
+ .dag-run-timeline {
1517
+ position: relative;
1518
+ display: grid;
1519
+ gap: 0;
1520
+ }
1521
+ .dag-run-timeline::before {
1522
+ position: absolute;
1523
+ top: 12px;
1524
+ bottom: 12px;
1525
+ left: 10px;
1526
+ width: 1px;
1527
+ background: var(--hairline-strong);
1528
+ content: "";
1529
+ }
1530
+ .dag-run-timeline-item {
1531
+ position: relative;
1532
+ display: grid;
1533
+ grid-template-columns: 24px minmax(0, 1fr) auto;
1534
+ gap: var(--space-3);
1535
+ align-items: start;
1536
+ padding: 9px 0;
1537
+ color: inherit;
1538
+ text-decoration: none;
1539
+ transition: background-color var(--transition-fast);
1540
+ }
611
1541
  .dag-run-timeline-item:hover,
612
- .dag-run-timeline-item:focus-visible { margin-inline: -8px; padding-inline: 8px; background: #fff8f4; outline: none; }
613
- .dag-run-timeline-rail { position: relative; display: grid; place-items: center; min-height: 24px; }
614
- .dag-run-timeline-dot { position: relative; z-index: 1; width: 9px; height: 9px; border: 2px solid var(--surface); border-radius: 50%; background: var(--muted-soft); }
615
- .dag-run-timeline-dot.status-finished, .dag-run-timeline-dot.status-succeeded, .dag-run-timeline-dot.status-completed { background: var(--green); }
616
- .dag-run-timeline-dot.status-failed, .dag-run-timeline-dot.status-error, .dag-run-timeline-dot.status-partial_failed { background: var(--red); }
617
- .dag-run-timeline-dot.status-running, .dag-run-timeline-dot.status-started { background: var(--orange); }
618
- .dag-run-timeline-content { display: grid; gap: 3px; min-width: 0; }
619
- .dag-run-timeline-title { color: var(--ink); font-size: 13px; font-weight: 700; overflow-wrap: anywhere; }
620
- .dag-run-timeline-meta { color: var(--muted); font-size: 11px; overflow-wrap: anywhere; }
621
- .dag-run-timeline-status { padding-top: 1px; }
1542
+ .dag-run-timeline-item:focus-visible {
1543
+ margin-inline: -8px;
1544
+ padding-inline: 8px;
1545
+ background: #fff8f4;
1546
+ outline: none;
1547
+ }
1548
+ .dag-run-timeline-rail {
1549
+ position: relative;
1550
+ display: grid;
1551
+ place-items: center;
1552
+ min-height: 24px;
1553
+ }
1554
+ .dag-run-timeline-dot {
1555
+ position: relative;
1556
+ z-index: 1;
1557
+ width: 9px;
1558
+ height: 9px;
1559
+ border: 2px solid var(--surface);
1560
+ border-radius: 50%;
1561
+ background: var(--muted-soft);
1562
+ }
1563
+ .dag-run-timeline-dot.status-finished,
1564
+ .dag-run-timeline-dot.status-succeeded,
1565
+ .dag-run-timeline-dot.status-completed {
1566
+ background: var(--green);
1567
+ }
1568
+ .dag-run-timeline-dot.status-failed,
1569
+ .dag-run-timeline-dot.status-error,
1570
+ .dag-run-timeline-dot.status-partial_failed {
1571
+ background: var(--red);
1572
+ }
1573
+ .dag-run-timeline-dot.status-running,
1574
+ .dag-run-timeline-dot.status-started {
1575
+ background: var(--orange);
1576
+ }
1577
+ .dag-run-timeline-content {
1578
+ display: grid;
1579
+ gap: 3px;
1580
+ min-width: 0;
1581
+ }
1582
+ .dag-run-timeline-title {
1583
+ color: var(--ink);
1584
+ font-size: 13px;
1585
+ font-weight: 700;
1586
+ overflow-wrap: anywhere;
1587
+ }
1588
+ .dag-run-timeline-meta {
1589
+ color: var(--muted);
1590
+ font-size: 11px;
1591
+ overflow-wrap: anywhere;
1592
+ }
1593
+ .dag-run-timeline-status {
1594
+ padding-top: 1px;
1595
+ }
622
1596
 
623
1597
  #failures-list .row-failed td:first-child,
624
- #failures-list .row-blocked td:first-child { color: var(--red); font-weight: 700; }
1598
+ #failures-list .row-blocked td:first-child {
1599
+ color: var(--red);
1600
+ font-weight: 700;
1601
+ }
625
1602
 
626
1603
  @media (max-width: 1320px) {
627
- .kpi-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
628
- .kpi-card:nth-child(4) { border-left: 0; }
629
- .kpi-card:nth-child(n + 4) { border-top: 1px solid var(--hairline); }
630
- .dashboard-workspace { grid-template-columns: 1fr; }
631
- .run-detail-workspace { grid-template-columns: minmax(200px, .45fr) minmax(0, 1fr); }
632
- .panel-artifacts { grid-column: 1 / -1; }
1604
+ .kpi-grid {
1605
+ grid-template-columns: repeat(3, minmax(0, 1fr));
1606
+ }
1607
+ .kpi-card:nth-child(4) {
1608
+ border-left: 0;
1609
+ }
1610
+ .kpi-card:nth-child(n + 4) {
1611
+ border-top: 1px solid var(--hairline);
1612
+ }
1613
+ .dashboard-workspace {
1614
+ grid-template-columns: 1fr;
1615
+ }
1616
+ .run-detail-workspace {
1617
+ grid-template-columns: minmax(200px, 0.45fr) minmax(0, 1fr);
1618
+ }
1619
+ .panel-artifacts {
1620
+ grid-column: 1 / -1;
1621
+ }
633
1622
  }
634
1623
 
635
1624
  @media (max-width: 1080px) {
636
- #app { width: min(100% - 32px, 1680px); }
637
- .site-header { grid-template-columns: auto auto 1fr; grid-template-areas: "brand nav status" "crumb crumb crumb"; row-gap: 8px; }
638
- .run-detail-workspace { grid-template-columns: 1fr; }
639
- .panel-artifacts { grid-column: auto; }
1625
+ #app {
1626
+ width: min(100% - 32px, 1680px);
1627
+ }
1628
+ .site-header {
1629
+ grid-template-columns: auto auto 1fr;
1630
+ grid-template-areas: "brand nav status" "crumb crumb crumb";
1631
+ row-gap: 8px;
1632
+ }
1633
+ .run-detail-workspace {
1634
+ grid-template-columns: 1fr;
1635
+ }
1636
+ .panel-artifacts {
1637
+ grid-column: auto;
1638
+ }
640
1639
  }
641
1640
 
642
1641
  @media (max-width: 720px) {
643
- #app { width: min(100% - 24px, 1680px); }
644
- .site-header { margin-bottom: var(--space-6); }
645
- .kpi-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
646
- .kpi-card:nth-child(n) { border-top: 1px solid var(--hairline); border-left: 1px solid var(--hairline); }
647
- .kpi-card:nth-child(1), .kpi-card:nth-child(2) { border-top: 0; }
648
- .kpi-card:nth-child(odd) { border-left: 0; }
649
- .dag-inspector { top: 76px; right: 12px; bottom: 12px; width: calc(100vw - 24px); }
650
- .dag-inspector-resize-handle { display: none; }
651
- .dashboard-secondary { grid-template-columns: 1fr; }
652
- .risk-block { grid-template-columns: 1fr; gap: var(--space-2); }
653
- .panel { padding: var(--space-4); }
654
- .panel-table { overflow-x: auto; padding: 0; }
655
- table { min-width: 680px; }
656
- .view h2 { font-size: 24px; }
1642
+ #app {
1643
+ width: min(100% - 24px, 1680px);
1644
+ }
1645
+ .site-header {
1646
+ margin-bottom: var(--space-6);
1647
+ }
1648
+ .kpi-grid {
1649
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1650
+ }
1651
+ .kpi-card:nth-child(n) {
1652
+ border-top: 1px solid var(--hairline);
1653
+ border-left: 1px solid var(--hairline);
1654
+ }
1655
+ .kpi-card:nth-child(1),
1656
+ .kpi-card:nth-child(2) {
1657
+ border-top: 0;
1658
+ }
1659
+ .kpi-card:nth-child(odd) {
1660
+ border-left: 0;
1661
+ }
1662
+ .dag-inspector {
1663
+ top: 76px;
1664
+ right: 12px;
1665
+ bottom: 12px;
1666
+ width: calc(100vw - 24px);
1667
+ }
1668
+ .dag-inspector-resize-handle {
1669
+ display: none;
1670
+ }
1671
+ .dashboard-secondary {
1672
+ grid-template-columns: 1fr;
1673
+ }
1674
+ .risk-block {
1675
+ grid-template-columns: 1fr;
1676
+ gap: var(--space-2);
1677
+ }
1678
+ .panel {
1679
+ padding: var(--space-4);
1680
+ }
1681
+ .panel-table {
1682
+ overflow-x: auto;
1683
+ padding: 0;
1684
+ }
1685
+ table {
1686
+ min-width: 680px;
1687
+ }
1688
+ .view h2 {
1689
+ font-size: 24px;
1690
+ }
1691
+ }
1692
+
1693
+ /* R3: object relation bar + recommended commands (copy-only) */
1694
+ .object-relations-panel {
1695
+ padding: var(--space-3) var(--space-4);
1696
+ }
1697
+
1698
+ .object-relation-bar {
1699
+ display: flex;
1700
+ flex-wrap: wrap;
1701
+ align-items: center;
1702
+ gap: var(--space-2);
1703
+ font-size: 0.9rem;
1704
+ }
1705
+
1706
+ .object-relation-item {
1707
+ display: inline-flex;
1708
+ align-items: baseline;
1709
+ gap: 0.25rem;
1710
+ }
1711
+
1712
+ .object-relation-label {
1713
+ color: var(--muted, #6b6560);
1714
+ font-weight: 600;
1715
+ font-size: 0.75rem;
1716
+ text-transform: uppercase;
1717
+ letter-spacing: 0.04em;
1718
+ }
1719
+
1720
+ .object-relation-sep {
1721
+ color: var(--muted, #6b6560);
1722
+ opacity: 0.7;
1723
+ user-select: none;
1724
+ }
1725
+
1726
+ .object-link {
1727
+ color: var(--accent, #8a5a2b);
1728
+ text-decoration: none;
1729
+ word-break: break-all;
1730
+ }
1731
+
1732
+ .object-link:hover,
1733
+ .object-link:focus-visible {
1734
+ text-decoration: underline;
1735
+ }
1736
+
1737
+ .recommended-command {
1738
+ border: 1px solid var(--border, #e2ddd4);
1739
+ border-radius: 8px;
1740
+ padding: var(--space-3);
1741
+ margin: var(--space-2) 0;
1742
+ background: #fbf9f4;
1743
+ }
1744
+
1745
+ .recommended-command-head {
1746
+ display: flex;
1747
+ flex-wrap: wrap;
1748
+ gap: var(--space-2);
1749
+ align-items: baseline;
1750
+ margin-bottom: var(--space-2);
1751
+ }
1752
+
1753
+ .recommended-command-kind {
1754
+ font-size: 0.75rem;
1755
+ font-weight: 600;
1756
+ color: var(--muted, #6b6560);
1757
+ text-transform: uppercase;
1758
+ }
1759
+
1760
+ .recommended-command-label {
1761
+ font-weight: 600;
1762
+ }
1763
+
1764
+ .recommended-command-body {
1765
+ display: flex;
1766
+ flex-wrap: wrap;
1767
+ align-items: center;
1768
+ gap: var(--space-2);
1769
+ }
1770
+
1771
+ .recommended-command-text {
1772
+ flex: 1 1 12rem;
1773
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
1774
+ font-size: 0.85rem;
1775
+ word-break: break-all;
1776
+ background: #f0ebe3;
1777
+ padding: 0.35rem 0.5rem;
1778
+ border-radius: 4px;
1779
+ }
1780
+
1781
+ button.copy-command {
1782
+ appearance: none;
1783
+ border: 1px solid var(--border, #d4cdc2);
1784
+ background: #fff;
1785
+ border-radius: 6px;
1786
+ padding: 0.35rem 0.75rem;
1787
+ cursor: pointer;
1788
+ font-size: 0.85rem;
1789
+ }
1790
+
1791
+ button.copy-command:hover,
1792
+ button.copy-command:focus-visible {
1793
+ border-color: var(--accent, #8a5a2b);
1794
+ }
1795
+
1796
+ .executed-facts {
1797
+ border-left: 3px solid #6b8f71;
1798
+ }
1799
+
1800
+ .advisory-note {
1801
+ margin: 0 0 var(--space-2);
1802
+ font-size: 0.85rem;
1803
+ }
1804
+
1805
+ .blocking-list {
1806
+ margin: 0;
1807
+ padding-left: 1.25rem;
1808
+ }
1809
+
1810
+ .blocking-message {
1811
+ font-weight: 500;
1812
+ }
1813
+
1814
+ .blocking-meta {
1815
+ font-size: 0.85rem;
1816
+ color: var(--muted, #6b6560);
1817
+ margin: 0.15rem 0 0.35rem;
1818
+ }
1819
+
1820
+
1821
+
1822
+ /* R5: unified view states + information hierarchy */
1823
+ .view-state {
1824
+ border-radius: var(--radius, 8px);
1825
+ padding: var(--space-3, 0.75rem) var(--space-4, 1rem);
1826
+ margin: 0 0 var(--space-3, 0.75rem);
1827
+ }
1828
+ .view-state-loading {
1829
+ border: 1px dashed var(--border, #e2dcd4);
1830
+ background: var(--surface-muted, #f7f4ef);
1831
+ color: var(--muted, #6b6560);
1832
+ }
1833
+ .view-state-empty {
1834
+ border: 1px solid var(--border, #e2dcd4);
1835
+ background: var(--surface, #fffdf9);
1836
+ }
1837
+ .view-state-degraded {
1838
+ /* projection-fault styles also apply */
1839
+ }
1840
+ .view-state-error {
1841
+ border: 1px solid var(--danger-border, #e8b4b4);
1842
+ background: var(--danger-bg, #fdf2f2);
1843
+ color: var(--danger-text, #8a2f2f);
1844
+ }
1845
+ .view-state-error p {
1846
+ margin: 0;
1847
+ }
1848
+ .layer-primary {
1849
+ /* main facts */
1850
+ }
1851
+ .layer-diagnostic {
1852
+ opacity: 0.98;
1853
+ }
1854
+ .layer-raw {
1855
+ font-size: 0.9rem;
1856
+ color: var(--muted, #6b6560);
1857
+ }
1858
+ .pool-filters {
1859
+ display: flex;
1860
+ flex-wrap: wrap;
1861
+ gap: 0.5rem 0.75rem;
1862
+ align-items: center;
1863
+ margin: 0 0 var(--space-3, 0.75rem);
1864
+ }
1865
+ .pool-filters label {
1866
+ display: inline-flex;
1867
+ align-items: center;
1868
+ gap: 0.35rem;
1869
+ font-size: 0.9rem;
1870
+ }
1871
+ .pool-filters select,
1872
+ .pool-filters input[type="search"] {
1873
+ font: inherit;
1874
+ padding: 0.25rem 0.5rem;
1875
+ border: 1px solid var(--border, #e2dcd4);
1876
+ border-radius: 6px;
1877
+ background: var(--surface, #fff);
1878
+ min-height: 2rem;
1879
+ }
1880
+ .pool-filters select:focus-visible,
1881
+ .pool-filters input[type="search"]:focus-visible {
1882
+ outline: 2px solid var(--focus, #3d6bf3);
1883
+ outline-offset: 2px;
1884
+ }
1885
+
1886
+ @media (max-width: 1024px) {
1887
+ .pool-filters {
1888
+ flex-direction: column;
1889
+ align-items: stretch;
1890
+ }
657
1891
  }
658
1892
 
659
1893
  @media (prefers-reduced-motion: reduce) {
660
- *, *::before, *::after {
661
- animation-duration: .01ms !important;
662
- animation-iteration-count: 1 !important;
663
- scroll-behavior: auto !important;
664
- transition-duration: .01ms !important;
665
- }
1894
+ *,
1895
+ *::before,
1896
+ *::after {
1897
+ animation-duration: 0.01ms !important;
1898
+ animation-iteration-count: 1 !important;
1899
+ scroll-behavior: auto !important;
1900
+ transition-duration: 0.01ms !important;
1901
+ }
666
1902
  }