@tea-agent/loop-agent 0.10.0 → 0.12.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 (207) hide show
  1. package/AGENTS.md +10 -2
  2. package/CHANGELOG.md +91 -24
  3. package/README.md +84 -12
  4. package/dist/application/dag/args.js +1 -12
  5. package/dist/application/dag/generate-task-dag.js +38 -2
  6. package/dist/application/dag/run-dag.js +11 -27
  7. package/dist/application/dag/validate-dag.js +13 -2
  8. package/dist/application/loop/run-action.js +0 -4
  9. package/dist/cli/command-definitions.js +44 -16
  10. package/dist/cli/program.js +40 -23
  11. package/dist/cli/update/notifier.js +117 -0
  12. package/dist/cli/update/npm-client.js +151 -0
  13. package/dist/cli/update/policy.js +58 -0
  14. package/dist/cli/update/state.js +68 -0
  15. package/dist/cli.js +33 -0
  16. package/dist/commands/cursor-prompt.js +42 -82
  17. package/dist/commands/dag-approve.js +36 -0
  18. package/dist/commands/delegate.js +75 -77
  19. package/dist/commands/doctor.js +0 -18
  20. package/dist/commands/init.js +547 -95
  21. package/dist/commands/instructions.js +7 -10
  22. package/dist/commands/loop.js +4 -20
  23. package/dist/commands/plan.js +50 -0
  24. package/dist/executors/config-core.js +0 -51
  25. package/dist/executors/dag-pi-executor.js +1 -1
  26. package/dist/executors/dag.js +0 -1
  27. package/dist/executors/index.js +0 -2
  28. package/dist/executors/model-routing.js +9 -9
  29. package/dist/executors/shell-executor.js +1 -1
  30. package/dist/governance/checks.js +6 -3
  31. package/dist/governance/exec-plans.js +545 -0
  32. package/dist/governance/manifest-types.js +24 -2
  33. package/dist/infrastructure/harness/loop-action-store.js +0 -3
  34. package/dist/records/harvest.js +2 -23
  35. package/dist/records/one-shot-runs.js +1 -1
  36. package/dist/shared/artifacts-core.js +24 -5
  37. package/dist/shared/output-truncation.js +37 -0
  38. package/dist/shared/package-metadata.js +488 -0
  39. package/dist/{executors/cursor-executor.js → sidecars/cursor-prompt/executor.js} +2 -42
  40. package/dist/sidecars/cursor-prompt/index.js +3 -0
  41. package/dist/sidecars/cursor-prompt/stream.js +121 -0
  42. package/dist/task/config-types.js +29 -12
  43. package/dist/task/delegate.js +9 -21
  44. package/dist/task/runtime.js +1 -2
  45. package/dist/worker/cli.js +32 -3
  46. package/dist/worker/delivery/final-verification.js +47 -11
  47. package/dist/worker/delivery/package.js +63 -10
  48. package/dist/worker/feature/run.js +60 -8
  49. package/dist/worker/loop-agent/loop-agent-client.js +329 -126
  50. package/dist/worker/observability/event-history.js +216 -0
  51. package/dist/worker/observability/read-model.js +338 -83
  52. package/dist/worker/observe/paths.js +17 -0
  53. package/dist/worker/observe/routes.js +165 -21
  54. package/dist/worker/observe/server.js +59 -1
  55. package/dist/worker/observe/static/api.js +27 -0
  56. package/dist/worker/observe/static/app.js +120 -2317
  57. package/dist/worker/observe/static/constants.js +148 -0
  58. package/dist/worker/observe/static/copy.js +67 -0
  59. package/dist/worker/observe/static/dag-helpers.js +172 -0
  60. package/dist/worker/observe/static/dag-model.js +72 -0
  61. package/dist/worker/observe/static/dom.js +61 -0
  62. package/dist/worker/observe/static/format-pool.js +67 -0
  63. package/dist/worker/observe/static/format.js +292 -0
  64. package/dist/worker/observe/static/index.html +300 -82
  65. package/dist/worker/observe/static/kpi.js +94 -0
  66. package/dist/worker/observe/static/relations.js +128 -0
  67. package/dist/worker/observe/static/router.js +85 -0
  68. package/dist/worker/observe/static/run-processing.js +148 -0
  69. package/dist/worker/observe/static/shell-chrome.js +68 -0
  70. package/dist/worker/observe/static/state.js +253 -0
  71. package/dist/worker/observe/static/styles.css +1720 -495
  72. package/dist/worker/observe/static/views/batch.js +226 -0
  73. package/dist/worker/observe/static/views/dag-graph.js +172 -0
  74. package/dist/worker/observe/static/views/dag-inspector.js +477 -0
  75. package/dist/worker/observe/static/views/dag.js +362 -0
  76. package/dist/worker/observe/static/views/dashboard.js +442 -0
  77. package/dist/worker/observe/static/views/failures.js +143 -0
  78. package/dist/worker/observe/static/views/feature.js +453 -0
  79. package/dist/worker/observe/static/views/pool.js +347 -0
  80. package/dist/worker/observe/static/views/run.js +453 -0
  81. package/dist/worker/observe/static/views/session-timeline.js +205 -0
  82. package/dist/worker/observe/static/views/shell.js +7 -0
  83. package/dist/worker/observe/static/views/task.js +260 -0
  84. package/dist/worker/observe/static/views/timeline.js +163 -0
  85. package/dist/worker/preflight.js +49 -1
  86. package/dist/worker/run-task/run-task.js +22 -12
  87. package/dist/worker/runner/run-ready.js +76 -12
  88. package/dist/worker/task-spec/schema.js +0 -1
  89. package/dist/workflows/dag/controller-identity.js +104 -0
  90. package/dist/workflows/dag/convergence/controller.js +1 -1
  91. package/dist/workflows/dag/executor-registry.js +0 -2
  92. package/dist/workflows/dag/init-hybrid.js +797 -27
  93. package/dist/workflows/dag/node-execution.js +183 -35
  94. package/dist/workflows/dag/repair-artifact.js +91 -0
  95. package/dist/workflows/dag/report.js +50 -0
  96. package/dist/workflows/dag/retry-policy.js +138 -0
  97. package/dist/workflows/dag/runner.js +77 -17
  98. package/dist/workflows/dag/runtime-contract.js +87 -0
  99. package/dist/workflows/dag/scheduler.js +7 -2
  100. package/dist/workflows/dag/sdd-embedded.js +128 -0
  101. package/dist/workflows/dag/skill-instructions.js +5 -4
  102. package/dist/workflows/dag/skill-snapshot.js +529 -0
  103. package/dist/workflows/dag/types.js +86 -10
  104. package/dist/workflows/dag/validate.js +73 -12
  105. package/dist/workflows/loop/actions/dag-action.js +0 -2
  106. package/dist/workflows/loop/actions/shared.js +1 -1
  107. package/dist/workflows/loop/actions.js +14 -31
  108. package/dist/workflows/loop/benchmark.js +1 -1
  109. package/dist/workflows/loop/index.js +1 -1
  110. package/dist/workflows/loop/policy/auto-policy.js +22 -14
  111. package/dist/workflows/loop/policy/path-patterns.js +13 -0
  112. package/docs/README.md +36 -33
  113. package/docs/agent-dag-recovery-playbook.md +1 -1
  114. package/docs/agent-dag-runner.md +28 -3
  115. package/docs/architecture/README.md +26 -0
  116. package/docs/architecture/dag-execution.md +140 -0
  117. package/docs/architecture/evolution.md +53 -0
  118. package/docs/architecture/facts-and-state.md +58 -0
  119. package/docs/architecture/runtime-boundaries.md +45 -17
  120. package/docs/architecture/system-overview.md +93 -0
  121. package/docs/architecture/worker-and-feature.md +81 -0
  122. package/docs/cursor-prompt-sidecar.md +36 -0
  123. package/docs/decisions/README.md +13 -1
  124. package/docs/design/README.md +43 -21
  125. package/docs/development-principles.md +2 -2
  126. package/docs/exec-plans/active/README.md +1 -3
  127. package/docs/exec-plans/completed/README.md +23 -0
  128. package/docs/feature-workflow.md +78 -4
  129. package/docs/harness-methodology-debugging.md +1 -1
  130. package/docs/harness-methodology-tdd.md +3 -3
  131. package/docs/init-surface.manifest.json +60 -25
  132. package/docs/loop-agent-harness.md +28 -4
  133. package/docs/progress/README.md +50 -1
  134. package/docs/reports/README.md +90 -18
  135. package/docs/skills/README.md +2 -1
  136. package/docs/skills/vetted-skill-registry.md +2 -1
  137. package/docs/templates/agent-dag-report.schema.json +23 -6
  138. package/docs/templates/agent-dag.base.json +0 -5
  139. package/docs/templates/agent-dag.final-verification.json +0 -5
  140. package/docs/templates/agent-dag.schema.json +70 -3
  141. package/docs/templates/agent-dag.supervised-implementation.json +9 -8
  142. package/docs/templates/backend-test-dag.generate-pytest.prompt.md +139 -0
  143. package/docs/templates/backend-test-dag.json +276 -0
  144. package/docs/templates/backend-test-dag.retrospect.prompt.md +125 -0
  145. package/docs/templates/backend-test-dag.review-cases.prompt.md +81 -0
  146. package/docs/templates/frontend-design-contract.md +33 -0
  147. package/docs/templates/frontend-task-constraints.md +25 -0
  148. package/docs/templates/frontend-task-requirement.md +61 -0
  149. package/docs/templates/harness.schema.json +10 -12
  150. package/docs/templates/hybrid-dag.json +1 -6
  151. package/docs/templates/interactive-ui-round2-experiment.md +1 -1
  152. package/docs/templates/product-line/task.yaml +0 -1
  153. package/docs/templates/project-start-checklist.md +2 -2
  154. package/docs/templates/worker-dogfood-evidence.md +28 -0
  155. package/docs/templates/worker-dogfood-setup.md +20 -0
  156. package/docs/verification-matrix.md +10 -0
  157. package/examples/decision-gate-agent-dag.json +87 -33
  158. package/examples/example-dag.json +0 -5
  159. package/examples/hybrid-loop-agent-dag.json +0 -5
  160. package/harness.json +7 -15
  161. package/package.json +22 -46
  162. package/scripts/check-product-line-docs.sh +10 -7
  163. package/skills/agent-worker/SKILL.md +37 -0
  164. package/skills/agent-worker/references/agent-worker-operator.md +43 -0
  165. package/skills/frontend-design-review/SKILL.md +59 -0
  166. package/skills/frontend-design-review/references/review-checklist.md +37 -0
  167. package/skills/frontend-implementation/SKILL.md +51 -0
  168. package/skills/frontend-implementation/references/code-standards.md +34 -0
  169. package/skills/frontend-implementation/references/design-spec.md +46 -0
  170. package/skills/frontend-implementation/references/node-contracts.md +32 -0
  171. package/skills/frontend-review/SKILL.md +53 -0
  172. package/skills/frontend-review/references/review-findings.md +42 -0
  173. package/skills/frontend-verification/SKILL.md +40 -0
  174. package/skills/frontend-verification/references/verification-checklist.md +56 -0
  175. package/skills/grill-me/SKILL.md +10 -0
  176. package/skills/grill-with-docs/SKILL.md +88 -0
  177. package/skills/grill-with-docs/adr-format.md +47 -0
  178. package/skills/grill-with-docs/context-format.md +60 -0
  179. package/skills/loop-agent/SKILL.md +11 -9
  180. package/skills/loop-agent/references/command-reference.md +14 -15
  181. package/skills/loop-agent/references/docs-converge.md +126 -0
  182. package/skills/loop-agent/references/harness-policy.md +7 -7
  183. package/skills/loop-agent/references/hybrid-dag.md +36 -20
  184. package/skills/loop-agent/references/long-running-loop.md +4 -6
  185. package/skills/loop-agent/references/multi-worktree.md +6 -6
  186. package/skills/loop-agent/references/orchestrator-and-interventions.md +3 -3
  187. package/skills/loop-agent/references/pi-subagent-assisted-mode.md +14 -11
  188. package/skills/loop-agent/references/task-workflow.md +1 -1
  189. package/skills/loop-agent/references/verification-and-failure-handling.md +6 -0
  190. package/skills/using-git-worktrees/SKILL.md +215 -0
  191. package/dist/commands/cursor-worker.js +0 -43
  192. package/dist/cursor-worker-entry.js +0 -8
  193. package/dist/executors/cursor-artifacts.js +0 -33
  194. package/dist/executors/cursor-execution-log.js +0 -81
  195. package/dist/executors/cursor-executor-artifacts.js +0 -134
  196. package/dist/executors/cursor-run.js +0 -115
  197. package/dist/executors/cursor-tool.js +0 -94
  198. package/dist/executors/cursor-worker-client.js +0 -223
  199. package/dist/executors/cursor-worker-protocol.js +0 -18
  200. package/dist/executors/cursor-worker-server.js +0 -54
  201. package/dist/executors/cursor-worker.js +0 -3
  202. package/dist/executors/cursor.js +0 -6
  203. package/dist/executors/dag-cursor-executor.js +0 -87
  204. package/dist/workflows/loop/actions/cursor-fix.js +0 -191
  205. package/dist/workflows/loop/policy/cursor-fix-policy.js +0 -31
  206. package/docs/cursor-executor-usage.md +0 -25
  207. package/docs/dynamic-workflow-dag-engine-roadmap.md +0 -1749
@@ -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
- .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);
374
+ .kpi-grid {
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,183 +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
- .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); }
455
- .dag-inspector-title { display: grid; gap: 6px; min-width: 0; }
456
- .dag-inspector-title h3 { margin: 0; font-size: 14px; }
457
- .dag-inspector-node { min-width: 0; color: var(--body); font-size: 12px; font-family: "JetBrains Mono", "SFMono-Regular", Consolas, monospace; overflow-wrap: anywhere; }
458
- .dag-inspector-controls { display: inline-flex; align-items: center; gap: 8px; }
459
- .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; }
460
- .dag-inspector-close:hover, .dag-inspector-close:focus-visible { border-color: var(--orange); color: var(--orange-active); outline: none; }
461
- .dag-inspector-tabs { display: flex; grid-column: 1 / -1; gap: 4px; margin-top: 2px; }
462
- .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; }
463
- .dag-inspector-tab:hover, .dag-inspector-tab:focus-visible { color: var(--ink); outline: none; }
464
- .dag-inspector-tab[aria-selected="true"] { border-color: color-mix(in srgb, var(--orange) 55%, var(--hairline)); background: #fff5ed; color: var(--orange-active); }
465
- .dag-inspector-content { min-height: 0; padding: var(--space-4); overflow: auto; overscroll-behavior: contain; }
466
- .panel-graph { min-height: 0; }
467
-
468
- .dag-graph-wrap { display: grid; gap: var(--space-3); }
469
- .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
+ }
470
937
  .dag-graph-summary,
471
- .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
+ }
472
943
  .dag-graph-reset {
473
- min-height: 32px;
474
- padding: 0 10px;
475
- border: 1px solid var(--hairline-strong);
476
- border-radius: var(--radius-sm);
477
- background: var(--surface);
478
- color: var(--ink);
479
- font-size: 12px;
480
- font-weight: 650;
481
- 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;
482
953
  }
483
954
  .dag-graph-reset:hover,
484
- .dag-graph-reset:focus-visible { border-color: var(--orange); color: var(--orange-active); outline: none; }
485
- .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; }
486
- .dag-graph { display: block; }
487
- .dag-edge { fill: none; stroke: var(--hairline-strong); stroke-width: 2; transition: opacity var(--transition-fast), stroke var(--transition-fast); }
488
- #dag-arrow path { fill: var(--hairline-strong); }
489
- .dag-graph-node { cursor: pointer; transition: opacity var(--transition-fast); }
490
- .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
+ }
491
992
  .dag-graph-node:hover rect,
492
- .dag-graph-node:focus-visible rect { stroke: var(--orange); stroke-width: 2; }
493
- .dag-graph-node:focus { outline: none; }
494
- .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
+ }
495
1004
  .dag-graph-node.status-running rect,
496
- .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
+ }
497
1009
  .dag-graph-node.status-failed rect,
498
- .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
+ }
499
1014
  .dag-graph-node.status-succeeded:hover rect,
500
1015
  .dag-graph-node.status-succeeded:focus-visible rect,
501
1016
  .dag-graph-node.status-finished:hover rect,
@@ -503,163 +1018,873 @@ body.is-resizing-dag-inspector { cursor: col-resize; user-select: none; }
503
1018
  .dag-graph-node.status-completed:hover rect,
504
1019
  .dag-graph-node.status-completed:focus-visible rect,
505
1020
  .dag-graph-node.status-done:hover rect,
506
- .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
+ }
507
1025
  .dag-graph-node.selected.status-succeeded rect,
508
1026
  .dag-graph-node.selected.status-finished rect,
509
1027
  .dag-graph-node.selected.status-completed rect,
510
- .dag-graph-node.selected.status-done rect { stroke: var(--green); fill: #f2faf5; }
511
- .dag-graph-node.status-skipped rect { stroke-dasharray: 5 4; }
512
- .dag-node-label { fill: var(--ink); font-size: 13px; font-weight: 700; }
513
- .dag-node-meta { fill: var(--muted); font-size: 11px; }
514
- .dag-node-status { fill: var(--body); font-size: 11px; }
515
- .dag-dimmed { opacity: .28; }
516
- .dag-graph-node.status-running { animation: graph-node-pulse 2s ease-in-out infinite; }
517
- @keyframes graph-node-pulse { 50% { opacity: .72; } }
518
-
519
- .dag-section-heading { display: flex; align-items: baseline; justify-content: space-between; gap: var(--space-3); margin-bottom: var(--space-4); }
520
- .dag-section-heading h3 { margin: 0; }
521
- .dag-section-meta { color: var(--muted); font-size: 12px; }
522
- #dag-nodes .dag-section-heading { padding: var(--space-5) var(--space-5) 0; }
523
- #dag-nodes .dag-node-table { border-top: 1px solid var(--hairline); }
524
- .dag-node-table { table-layout: fixed; }
525
- .dag-node-table th:nth-child(1), .dag-node-table td:nth-child(1) { width: 19%; }
526
- .dag-node-table th:nth-child(2), .dag-node-table td:nth-child(2) { width: 7%; }
527
- .dag-node-table th:nth-child(3), .dag-node-table td:nth-child(3) { width: 12%; }
528
- .dag-node-table th:nth-child(4), .dag-node-table td:nth-child(4) { width: 16%; }
529
- .dag-node-table th:nth-child(5), .dag-node-table td:nth-child(5) { width: 12%; }
530
- .dag-node-table th:nth-child(6), .dag-node-table td:nth-child(6) { width: 9%; }
531
- .dag-node-table th:nth-child(7), .dag-node-table td:nth-child(7) { width: 25%; }
532
- .dag-node-table td:nth-child(1), .dag-node-table td:nth-child(4), .dag-node-table td:nth-child(7) { overflow-wrap: anywhere; }
533
- .dag-active-node { background: #fff8f3; }
534
- .dag-error-node { background: #fff7f8; }
535
- .dag-node-selected { box-shadow: inset 3px 0 0 var(--orange); }
536
-
537
- .rank-lanes { display: grid; gap: var(--space-3); }
538
- .rank-lane { display: grid; grid-template-columns: 56px minmax(0, 1fr); gap: var(--space-3); align-items: center; }
539
- .rank-lane-label { color: var(--muted); font-size: 11px; font-weight: 700; }
540
- .rank-lane-nodes { display: flex; flex-wrap: wrap; gap: 8px; }
541
- .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); }
542
- .rank-node-active { border-color: var(--orange); }
543
- .rank-node-error { border-color: var(--red); }
544
- .rank-node-id { color: var(--ink); font-size: 11px; }
545
- .rank-node-dur { color: var(--muted); font-size: 11px; }
546
-
547
- .process-timeline-note { margin: 0 0 var(--space-2); color: var(--muted); font-size: 11px; }
548
- .process-timeline { display: grid; gap: 0; margin: 0; padding: var(--space-2) 0; list-style: none; }
549
- .process-timeline-item { display: grid; grid-template-columns: 20px minmax(0, 1fr); align-items: stretch; min-height: 34px; }
550
- .process-timeline-item.has-time { grid-template-columns: 20px 92px minmax(0, 1fr); }
551
- .process-timeline-rail { position: relative; display: grid; place-items: center; min-height: 34px; }
552
- .process-timeline-rail::before { position: absolute; top: 0; bottom: 0; width: 1px; background: var(--hairline-strong); content: ""; }
553
- .process-timeline-item.is-first .process-timeline-rail::before { top: 50%; }
554
- .process-timeline-item.is-last .process-timeline-rail::before { bottom: 50%; }
555
- .process-timeline-dot { position: relative; z-index: 1; width: 8px; height: 8px; border: 2px solid var(--surface); border-radius: 50%; background: var(--muted-soft); }
556
- .process-timeline-lifecycle .process-timeline-dot { background: var(--lavender); }
557
- .process-timeline-tool-start .process-timeline-dot { background: var(--orange); }
558
- .process-timeline-tool-end .process-timeline-dot { background: var(--green); }
559
- .process-timeline-assistant .process-timeline-dot { background: var(--blue); }
560
- .process-timeline-protocol .process-timeline-dot { background: var(--muted-soft); }
561
- .process-timeline-time { padding: 9px 0; color: var(--muted); font-size: 10px; font-variant-numeric: tabular-nums; }
562
- .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; }
563
- .process-timeline-protocol .process-timeline-label { color: var(--muted); font-size: 11px; }
564
-
565
- .markdown-output { display: grid; gap: var(--space-3); color: var(--body); font-size: 13px; line-height: 1.65; }
566
- .markdown-output > :first-child { margin-top: 0; }
567
- .markdown-output > :last-child { margin-bottom: 0; }
568
- .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; }
569
- .markdown-output h1 { font-size: 21px; }
570
- .markdown-output h2 { font-size: 18px; }
571
- .markdown-output h3 { font-size: 16px; }
572
- .markdown-output h4 { font-size: 14px; }
573
- .markdown-output p, .markdown-output blockquote, .markdown-output ul, .markdown-output ol { margin: 0; }
574
- .markdown-output ul, .markdown-output ol { padding-left: 22px; }
575
- .markdown-output blockquote { padding-left: 12px; border-left: 3px solid var(--peach); color: var(--body); }
576
- .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; }
577
- .markdown-output code { padding: 1px 4px; border-radius: 3px; background: var(--surface-muted); color: var(--ink); font-size: .92em; }
578
- .markdown-output pre code { padding: 0; background: transparent; color: inherit; }
579
- .markdown-output a { color: var(--orange-active); text-decoration-color: var(--orange); text-underline-offset: 3px; }
580
- .markdown-output table { font-size: 12px; }
581
- .markdown-output th, .markdown-output td { padding: 8px 9px; }
582
- .markdown-output th { position: static; }
583
- .markdown-error { display: grid; gap: var(--space-2); padding-top: var(--space-4); border-top: 1px solid var(--hairline); }
584
- .markdown-error-title { margin: 0; color: var(--red); font-size: 12px; font-weight: 700; }
585
-
586
- .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; }
587
- .run-evidence { display: grid; gap: var(--space-4); min-width: 0; }
588
- .panel-rail { background: var(--canvas-soft); }
589
- .step-timeline { display: grid; gap: 0; margin: 0; padding: 0; list-style: none; }
590
- .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); }
591
- .step-timeline li:last-child { border-bottom: 0; }
592
- .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; }
593
- .step-marker.succeeded { border-color: var(--green); color: var(--green); }
594
- .step-marker.running { border-color: var(--orange); color: var(--orange-active); }
595
- .step-marker.failed { border-color: var(--red); color: var(--red); }
596
- .step-name { min-width: 0; color: var(--body); font-size: 12px; overflow-wrap: anywhere; }
597
- .step-duration { color: var(--muted); font-size: 11px; font-variant-numeric: tabular-nums; }
598
-
599
- .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; }
600
-
601
- .artifact-list { display: grid; gap: 8px; margin: 0; padding: 0; list-style: none; }
602
- .artifact-list li { min-width: 0; }
603
- .artifact-list a { color: var(--body); font-size: 12px; overflow-wrap: anywhere; }
604
- .artifact-links { display: flex; flex-wrap: wrap; gap: 6px; }
605
- .muted { color: var(--muted); }
606
-
607
- .dag-run-timeline { position: relative; display: grid; gap: 0; }
608
- .dag-run-timeline::before { position: absolute; top: 12px; bottom: 12px; left: 10px; width: 1px; background: var(--hairline-strong); content: ""; }
609
- .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
+ .run-layer-process {
1355
+ display: grid;
1356
+ gap: var(--space-4);
1357
+ margin-top: var(--space-4);
1358
+ }
1359
+ .run-layer-diagnosis {
1360
+ display: grid;
1361
+ gap: var(--space-4);
1362
+ margin-top: var(--space-4);
1363
+ }
1364
+ .run-detail-workspace {
1365
+ display: grid;
1366
+ grid-template-columns: minmax(220px, 0.5fr) minmax(0, 1.25fr);
1367
+ gap: var(--space-4);
1368
+ align-items: start;
1369
+ }
1370
+ .run-evidence {
1371
+ display: grid;
1372
+ gap: var(--space-4);
1373
+ min-width: 0;
1374
+ }
1375
+ .artifact-preview-list {
1376
+ gap: 12px;
1377
+ }
1378
+ .artifact-preview-head {
1379
+ display: flex;
1380
+ flex-wrap: wrap;
1381
+ gap: 8px;
1382
+ align-items: baseline;
1383
+ margin-bottom: 6px;
1384
+ }
1385
+ .artifact-preview-label {
1386
+ font-size: 12px;
1387
+ color: var(--muted);
1388
+ overflow-wrap: anywhere;
1389
+ }
1390
+ .artifact-preview-body {
1391
+ max-height: 240px;
1392
+ overflow: auto;
1393
+ font-size: 12px;
1394
+ }
1395
+ .artifact-preview-error {
1396
+ color: var(--red);
1397
+ }
1398
+ .batch-task-links,
1399
+ .batch-task-evidence {
1400
+ display: flex;
1401
+ flex-wrap: wrap;
1402
+ gap: 4px;
1403
+ align-items: center;
1404
+ }
1405
+ .object-link {
1406
+ color: var(--body);
1407
+ text-decoration: underline;
1408
+ text-underline-offset: 2px;
1409
+ }
1410
+ .panel-rail {
1411
+ background: var(--canvas-soft);
1412
+ }
1413
+ .step-timeline {
1414
+ display: grid;
1415
+ gap: 0;
1416
+ margin: 0;
1417
+ padding: 0;
1418
+ list-style: none;
1419
+ }
1420
+ .step-timeline li {
1421
+ display: grid;
1422
+ grid-template-columns: 18px minmax(0, 1fr) auto;
1423
+ align-items: center;
1424
+ gap: 8px;
1425
+ min-height: 38px;
1426
+ border-bottom: 1px solid var(--hairline);
1427
+ }
1428
+ .step-timeline li:last-child {
1429
+ border-bottom: 0;
1430
+ }
1431
+ .step-marker {
1432
+ display: inline-grid;
1433
+ place-items: center;
1434
+ width: 16px;
1435
+ height: 16px;
1436
+ border: 1px solid var(--hairline-strong);
1437
+ border-radius: 50%;
1438
+ color: var(--muted);
1439
+ font-size: 10px;
1440
+ }
1441
+ .step-marker.succeeded {
1442
+ border-color: var(--green);
1443
+ color: var(--green);
1444
+ }
1445
+ .step-marker.running {
1446
+ border-color: var(--orange);
1447
+ color: var(--orange-active);
1448
+ }
1449
+ .step-marker.failed {
1450
+ border-color: var(--red);
1451
+ color: var(--red);
1452
+ }
1453
+ .step-name {
1454
+ min-width: 0;
1455
+ color: var(--body);
1456
+ font-size: 12px;
1457
+ overflow-wrap: anywhere;
1458
+ }
1459
+ .step-duration {
1460
+ color: var(--muted);
1461
+ font-size: 11px;
1462
+ font-variant-numeric: tabular-nums;
1463
+ }
1464
+
1465
+ .output-block {
1466
+ max-height: 480px;
1467
+ margin: 0;
1468
+ padding: var(--space-4);
1469
+ overflow: auto;
1470
+ border: 1px solid var(--hairline);
1471
+ border-radius: var(--radius-sm);
1472
+ background: var(--surface-ink);
1473
+ color: #f8f7f2;
1474
+ font-size: 12px;
1475
+ line-height: 1.7;
1476
+ white-space: pre-wrap;
1477
+ overflow-wrap: anywhere;
1478
+ }
1479
+
1480
+ .artifact-list {
1481
+ display: grid;
1482
+ gap: 8px;
1483
+ margin: 0;
1484
+ padding: 0;
1485
+ list-style: none;
1486
+ }
1487
+ .artifact-list li {
1488
+ min-width: 0;
1489
+ }
1490
+ .artifact-list a {
1491
+ color: var(--body);
1492
+ font-size: 12px;
1493
+ overflow-wrap: anywhere;
1494
+ }
1495
+ .artifact-links {
1496
+ display: flex;
1497
+ flex-wrap: wrap;
1498
+ gap: 6px;
1499
+ }
1500
+ .muted {
1501
+ color: var(--muted);
1502
+ }
1503
+
1504
+ .dag-run-timeline {
1505
+ position: relative;
1506
+ display: grid;
1507
+ gap: 0;
1508
+ }
1509
+ .dag-run-timeline::before {
1510
+ position: absolute;
1511
+ top: 12px;
1512
+ bottom: 12px;
1513
+ left: 10px;
1514
+ width: 1px;
1515
+ background: var(--hairline-strong);
1516
+ content: "";
1517
+ }
1518
+ .dag-run-timeline-item {
1519
+ position: relative;
1520
+ display: grid;
1521
+ grid-template-columns: 24px minmax(0, 1fr) auto;
1522
+ gap: var(--space-3);
1523
+ align-items: start;
1524
+ padding: 9px 0;
1525
+ color: inherit;
1526
+ text-decoration: none;
1527
+ transition: background-color var(--transition-fast);
1528
+ }
610
1529
  .dag-run-timeline-item:hover,
611
- .dag-run-timeline-item:focus-visible { margin-inline: -8px; padding-inline: 8px; background: #fff8f4; outline: none; }
612
- .dag-run-timeline-rail { position: relative; display: grid; place-items: center; min-height: 24px; }
613
- .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); }
614
- .dag-run-timeline-dot.status-finished, .dag-run-timeline-dot.status-succeeded, .dag-run-timeline-dot.status-completed { background: var(--green); }
615
- .dag-run-timeline-dot.status-failed, .dag-run-timeline-dot.status-error, .dag-run-timeline-dot.status-partial_failed { background: var(--red); }
616
- .dag-run-timeline-dot.status-running, .dag-run-timeline-dot.status-started { background: var(--orange); }
617
- .dag-run-timeline-content { display: grid; gap: 3px; min-width: 0; }
618
- .dag-run-timeline-title { color: var(--ink); font-size: 13px; font-weight: 700; overflow-wrap: anywhere; }
619
- .dag-run-timeline-meta { color: var(--muted); font-size: 11px; overflow-wrap: anywhere; }
620
- .dag-run-timeline-status { padding-top: 1px; }
1530
+ .dag-run-timeline-item:focus-visible {
1531
+ margin-inline: -8px;
1532
+ padding-inline: 8px;
1533
+ background: #fff8f4;
1534
+ outline: none;
1535
+ }
1536
+ .dag-run-timeline-rail {
1537
+ position: relative;
1538
+ display: grid;
1539
+ place-items: center;
1540
+ min-height: 24px;
1541
+ }
1542
+ .dag-run-timeline-dot {
1543
+ position: relative;
1544
+ z-index: 1;
1545
+ width: 9px;
1546
+ height: 9px;
1547
+ border: 2px solid var(--surface);
1548
+ border-radius: 50%;
1549
+ background: var(--muted-soft);
1550
+ }
1551
+ .dag-run-timeline-dot.status-finished,
1552
+ .dag-run-timeline-dot.status-succeeded,
1553
+ .dag-run-timeline-dot.status-completed {
1554
+ background: var(--green);
1555
+ }
1556
+ .dag-run-timeline-dot.status-failed,
1557
+ .dag-run-timeline-dot.status-error,
1558
+ .dag-run-timeline-dot.status-partial_failed {
1559
+ background: var(--red);
1560
+ }
1561
+ .dag-run-timeline-dot.status-running,
1562
+ .dag-run-timeline-dot.status-started {
1563
+ background: var(--orange);
1564
+ }
1565
+ .dag-run-timeline-content {
1566
+ display: grid;
1567
+ gap: 3px;
1568
+ min-width: 0;
1569
+ }
1570
+ .dag-run-timeline-title {
1571
+ color: var(--ink);
1572
+ font-size: 13px;
1573
+ font-weight: 700;
1574
+ overflow-wrap: anywhere;
1575
+ }
1576
+ .dag-run-timeline-meta {
1577
+ color: var(--muted);
1578
+ font-size: 11px;
1579
+ overflow-wrap: anywhere;
1580
+ }
1581
+ .dag-run-timeline-status {
1582
+ padding-top: 1px;
1583
+ }
621
1584
 
622
1585
  #failures-list .row-failed td:first-child,
623
- #failures-list .row-blocked td:first-child { color: var(--red); font-weight: 700; }
1586
+ #failures-list .row-blocked td:first-child {
1587
+ color: var(--red);
1588
+ font-weight: 700;
1589
+ }
624
1590
 
625
1591
  @media (max-width: 1320px) {
626
- .kpi-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
627
- .kpi-card:nth-child(4) { border-left: 0; }
628
- .kpi-card:nth-child(n + 4) { border-top: 1px solid var(--hairline); }
629
- .dashboard-workspace { grid-template-columns: 1fr; }
630
- .run-detail-workspace { grid-template-columns: minmax(200px, .45fr) minmax(0, 1fr); }
631
- .panel-artifacts { grid-column: 1 / -1; }
1592
+ .kpi-grid {
1593
+ grid-template-columns: repeat(3, minmax(0, 1fr));
1594
+ }
1595
+ .kpi-card:nth-child(4) {
1596
+ border-left: 0;
1597
+ }
1598
+ .kpi-card:nth-child(n + 4) {
1599
+ border-top: 1px solid var(--hairline);
1600
+ }
1601
+ .dashboard-workspace {
1602
+ grid-template-columns: 1fr;
1603
+ }
1604
+ .run-detail-workspace {
1605
+ grid-template-columns: minmax(200px, 0.45fr) minmax(0, 1fr);
1606
+ }
1607
+ .panel-artifacts {
1608
+ grid-column: 1 / -1;
1609
+ }
632
1610
  }
633
1611
 
634
1612
  @media (max-width: 1080px) {
635
- #app { width: min(100% - 32px, 1680px); }
636
- .site-header { grid-template-columns: auto auto 1fr; grid-template-areas: "brand nav status" "crumb crumb crumb"; row-gap: 8px; }
637
- .run-detail-workspace { grid-template-columns: 1fr; }
638
- .panel-artifacts { grid-column: auto; }
1613
+ #app {
1614
+ width: min(100% - 32px, 1680px);
1615
+ }
1616
+ .site-header {
1617
+ grid-template-columns: auto auto 1fr;
1618
+ grid-template-areas: "brand nav status" "crumb crumb crumb";
1619
+ row-gap: 8px;
1620
+ }
1621
+ .run-detail-workspace {
1622
+ grid-template-columns: 1fr;
1623
+ }
1624
+ .panel-artifacts {
1625
+ grid-column: auto;
1626
+ }
639
1627
  }
640
1628
 
641
1629
  @media (max-width: 720px) {
642
- #app { width: min(100% - 24px, 1680px); }
643
- .site-header { margin-bottom: var(--space-6); }
644
- .kpi-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
645
- .kpi-card:nth-child(n) { border-top: 1px solid var(--hairline); border-left: 1px solid var(--hairline); }
646
- .kpi-card:nth-child(1), .kpi-card:nth-child(2) { border-top: 0; }
647
- .kpi-card:nth-child(odd) { border-left: 0; }
648
- .dag-inspector { top: 76px; right: 12px; bottom: 12px; width: calc(100vw - 24px); }
649
- .dag-inspector-resize-handle { display: none; }
650
- .dashboard-secondary { grid-template-columns: 1fr; }
651
- .risk-block { grid-template-columns: 1fr; gap: var(--space-2); }
652
- .panel { padding: var(--space-4); }
653
- .panel-table { overflow-x: auto; padding: 0; }
654
- table { min-width: 680px; }
655
- .view h2 { font-size: 24px; }
1630
+ #app {
1631
+ width: min(100% - 24px, 1680px);
1632
+ }
1633
+ .site-header {
1634
+ margin-bottom: var(--space-6);
1635
+ }
1636
+ .kpi-grid {
1637
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1638
+ }
1639
+ .kpi-card:nth-child(n) {
1640
+ border-top: 1px solid var(--hairline);
1641
+ border-left: 1px solid var(--hairline);
1642
+ }
1643
+ .kpi-card:nth-child(1),
1644
+ .kpi-card:nth-child(2) {
1645
+ border-top: 0;
1646
+ }
1647
+ .kpi-card:nth-child(odd) {
1648
+ border-left: 0;
1649
+ }
1650
+ .dag-inspector {
1651
+ top: 76px;
1652
+ right: 12px;
1653
+ bottom: 12px;
1654
+ width: calc(100vw - 24px);
1655
+ }
1656
+ .dag-inspector-resize-handle {
1657
+ display: none;
1658
+ }
1659
+ .dashboard-secondary {
1660
+ grid-template-columns: 1fr;
1661
+ }
1662
+ .risk-block {
1663
+ grid-template-columns: 1fr;
1664
+ gap: var(--space-2);
1665
+ }
1666
+ .panel {
1667
+ padding: var(--space-4);
1668
+ }
1669
+ .panel-table {
1670
+ overflow-x: auto;
1671
+ padding: 0;
1672
+ }
1673
+ table {
1674
+ min-width: 680px;
1675
+ }
1676
+ .view h2 {
1677
+ font-size: 24px;
1678
+ }
1679
+ }
1680
+
1681
+ /* R3: object relation bar + recommended commands (copy-only) */
1682
+ .object-relations-panel {
1683
+ padding: var(--space-3) var(--space-4);
1684
+ }
1685
+
1686
+ .object-relation-bar {
1687
+ display: flex;
1688
+ flex-wrap: wrap;
1689
+ align-items: center;
1690
+ gap: var(--space-2);
1691
+ font-size: 0.9rem;
1692
+ }
1693
+
1694
+ .object-relation-item {
1695
+ display: inline-flex;
1696
+ align-items: baseline;
1697
+ gap: 0.25rem;
1698
+ }
1699
+
1700
+ .object-relation-label {
1701
+ color: var(--muted, #6b6560);
1702
+ font-weight: 600;
1703
+ font-size: 0.75rem;
1704
+ text-transform: uppercase;
1705
+ letter-spacing: 0.04em;
1706
+ }
1707
+
1708
+ .object-relation-sep {
1709
+ color: var(--muted, #6b6560);
1710
+ opacity: 0.7;
1711
+ user-select: none;
1712
+ }
1713
+
1714
+ .object-link {
1715
+ color: var(--accent, #8a5a2b);
1716
+ text-decoration: none;
1717
+ word-break: break-all;
1718
+ }
1719
+
1720
+ .object-link:hover,
1721
+ .object-link:focus-visible {
1722
+ text-decoration: underline;
1723
+ }
1724
+
1725
+ .recommended-command {
1726
+ border: 1px solid var(--border, #e2ddd4);
1727
+ border-radius: 8px;
1728
+ padding: var(--space-3);
1729
+ margin: var(--space-2) 0;
1730
+ background: #fbf9f4;
1731
+ }
1732
+
1733
+ .recommended-command-head {
1734
+ display: flex;
1735
+ flex-wrap: wrap;
1736
+ gap: var(--space-2);
1737
+ align-items: baseline;
1738
+ margin-bottom: var(--space-2);
1739
+ }
1740
+
1741
+ .recommended-command-kind {
1742
+ font-size: 0.75rem;
1743
+ font-weight: 600;
1744
+ color: var(--muted, #6b6560);
1745
+ text-transform: uppercase;
1746
+ }
1747
+
1748
+ .recommended-command-label {
1749
+ font-weight: 600;
1750
+ }
1751
+
1752
+ .recommended-command-body {
1753
+ display: flex;
1754
+ flex-wrap: wrap;
1755
+ align-items: center;
1756
+ gap: var(--space-2);
1757
+ }
1758
+
1759
+ .recommended-command-text {
1760
+ flex: 1 1 12rem;
1761
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
1762
+ font-size: 0.85rem;
1763
+ word-break: break-all;
1764
+ background: #f0ebe3;
1765
+ padding: 0.35rem 0.5rem;
1766
+ border-radius: 4px;
1767
+ }
1768
+
1769
+ button.copy-command {
1770
+ appearance: none;
1771
+ border: 1px solid var(--border, #d4cdc2);
1772
+ background: #fff;
1773
+ border-radius: 6px;
1774
+ padding: 0.35rem 0.75rem;
1775
+ cursor: pointer;
1776
+ font-size: 0.85rem;
1777
+ }
1778
+
1779
+ button.copy-command:hover,
1780
+ button.copy-command:focus-visible {
1781
+ border-color: var(--accent, #8a5a2b);
1782
+ }
1783
+
1784
+ .executed-facts {
1785
+ border-left: 3px solid #6b8f71;
1786
+ }
1787
+
1788
+ .advisory-note {
1789
+ margin: 0 0 var(--space-2);
1790
+ font-size: 0.85rem;
1791
+ }
1792
+
1793
+ .blocking-list {
1794
+ margin: 0;
1795
+ padding-left: 1.25rem;
1796
+ }
1797
+
1798
+ .blocking-message {
1799
+ font-weight: 500;
1800
+ }
1801
+
1802
+ .blocking-meta {
1803
+ font-size: 0.85rem;
1804
+ color: var(--muted, #6b6560);
1805
+ margin: 0.15rem 0 0.35rem;
1806
+ }
1807
+
1808
+
1809
+
1810
+ /* R5: unified view states + information hierarchy */
1811
+ .view-state {
1812
+ border-radius: var(--radius, 8px);
1813
+ padding: var(--space-3, 0.75rem) var(--space-4, 1rem);
1814
+ margin: 0 0 var(--space-3, 0.75rem);
1815
+ }
1816
+ .view-state-loading {
1817
+ border: 1px dashed var(--border, #e2dcd4);
1818
+ background: var(--surface-muted, #f7f4ef);
1819
+ color: var(--muted, #6b6560);
1820
+ }
1821
+ .view-state-empty {
1822
+ border: 1px solid var(--border, #e2dcd4);
1823
+ background: var(--surface, #fffdf9);
1824
+ }
1825
+ .view-state-degraded {
1826
+ /* projection-fault styles also apply */
1827
+ }
1828
+ .view-state-error {
1829
+ border: 1px solid var(--danger-border, #e8b4b4);
1830
+ background: var(--danger-bg, #fdf2f2);
1831
+ color: var(--danger-text, #8a2f2f);
1832
+ }
1833
+ .view-state-error p {
1834
+ margin: 0;
1835
+ }
1836
+ .layer-primary {
1837
+ /* main facts */
1838
+ }
1839
+ .layer-diagnostic {
1840
+ opacity: 0.98;
1841
+ }
1842
+ .layer-raw {
1843
+ font-size: 0.9rem;
1844
+ color: var(--muted, #6b6560);
1845
+ }
1846
+ .pool-filters {
1847
+ display: flex;
1848
+ flex-wrap: wrap;
1849
+ gap: 0.5rem 0.75rem;
1850
+ align-items: center;
1851
+ margin: 0 0 var(--space-3, 0.75rem);
1852
+ }
1853
+ .pool-filters label {
1854
+ display: inline-flex;
1855
+ align-items: center;
1856
+ gap: 0.35rem;
1857
+ font-size: 0.9rem;
1858
+ }
1859
+ .pool-filters select,
1860
+ .pool-filters input[type="search"] {
1861
+ font: inherit;
1862
+ padding: 0.25rem 0.5rem;
1863
+ border: 1px solid var(--border, #e2dcd4);
1864
+ border-radius: 6px;
1865
+ background: var(--surface, #fff);
1866
+ min-height: 2rem;
1867
+ }
1868
+ .pool-filters select:focus-visible,
1869
+ .pool-filters input[type="search"]:focus-visible {
1870
+ outline: 2px solid var(--focus, #3d6bf3);
1871
+ outline-offset: 2px;
1872
+ }
1873
+
1874
+ @media (max-width: 1024px) {
1875
+ .pool-filters {
1876
+ flex-direction: column;
1877
+ align-items: stretch;
1878
+ }
656
1879
  }
657
1880
 
658
1881
  @media (prefers-reduced-motion: reduce) {
659
- *, *::before, *::after {
660
- animation-duration: .01ms !important;
661
- animation-iteration-count: 1 !important;
662
- scroll-behavior: auto !important;
663
- transition-duration: .01ms !important;
664
- }
1882
+ *,
1883
+ *::before,
1884
+ *::after {
1885
+ animation-duration: 0.01ms !important;
1886
+ animation-iteration-count: 1 !important;
1887
+ scroll-behavior: auto !important;
1888
+ transition-duration: 0.01ms !important;
1889
+ }
665
1890
  }