@tea-agent/loop-agent 0.13.0-beta.0 → 0.13.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 (282) hide show
  1. package/AGENTS.md +157 -155
  2. package/CHANGELOG.md +301 -322
  3. package/README.md +335 -345
  4. package/bin/agent-worker.js +22 -22
  5. package/bin/loop-agent.js +21 -21
  6. package/dist/commands/cursor-prompt.js +6 -6
  7. package/dist/commands/init.js +597 -528
  8. package/dist/commands/loop-benchmark.js +11 -11
  9. package/dist/commands/pi-reuse-benchmark.js +16 -16
  10. package/dist/executors/shell-executor.js +200 -21
  11. package/dist/infrastructure/evaluation/candidate-store.js +5 -1
  12. package/dist/sidecars/cursor-prompt/executor.js +1 -1
  13. package/dist/task/runtime.js +27 -27
  14. package/dist/worker/observe/static/api.js +46 -46
  15. package/dist/worker/observe/static/app.js +150 -150
  16. package/dist/worker/observe/static/constants.js +148 -148
  17. package/dist/worker/observe/static/copy.js +67 -67
  18. package/dist/worker/observe/static/dag-helpers.js +172 -172
  19. package/dist/worker/observe/static/dag-layout.d.ts +31 -31
  20. package/dist/worker/observe/static/dag-layout.js +83 -83
  21. package/dist/worker/observe/static/dag-model.js +72 -72
  22. package/dist/worker/observe/static/dom.js +212 -53
  23. package/dist/worker/observe/static/format-pool.js +67 -67
  24. package/dist/worker/observe/static/format.js +292 -292
  25. package/dist/worker/observe/static/index.html +308 -308
  26. package/dist/worker/observe/static/kpi.js +94 -94
  27. package/dist/worker/observe/static/relations.js +133 -133
  28. package/dist/worker/observe/static/router.js +93 -93
  29. package/dist/worker/observe/static/run-processing.js +148 -148
  30. package/dist/worker/observe/static/shell-chrome.js +68 -68
  31. package/dist/worker/observe/static/state.js +267 -253
  32. package/dist/worker/observe/static/styles.css +1902 -1902
  33. package/dist/worker/observe/static/views/batch.js +227 -227
  34. package/dist/worker/observe/static/views/dag-graph.js +172 -172
  35. package/dist/worker/observe/static/views/dag-inspector.js +627 -607
  36. package/dist/worker/observe/static/views/dag.js +371 -362
  37. package/dist/worker/observe/static/views/dashboard.js +509 -252
  38. package/dist/worker/observe/static/views/failures.js +143 -143
  39. package/dist/worker/observe/static/views/feature.js +492 -492
  40. package/dist/worker/observe/static/views/pool.js +350 -350
  41. package/dist/worker/observe/static/views/run.js +453 -453
  42. package/dist/worker/observe/static/views/session-timeline.js +219 -205
  43. package/dist/worker/observe/static/views/shell.js +7 -7
  44. package/dist/worker/observe/static/views/task.js +314 -314
  45. package/dist/worker/observe/static/views/timeline.js +163 -163
  46. package/dist/workflows/dag/backend-test-case-manifest.js +503 -0
  47. package/dist/workflows/dag/backend-test-execution-contract.js +353 -0
  48. package/dist/workflows/dag/backend-test-result-contract.js +568 -0
  49. package/dist/workflows/dag/canvas-observer.js +275 -275
  50. package/dist/workflows/dag/decision-envelope.js +57 -2
  51. package/dist/workflows/dag/frontend-implementation-contract.js +240 -0
  52. package/dist/workflows/dag/frontend-project-capability.js +309 -0
  53. package/dist/workflows/dag/frontend-repair.js +341 -0
  54. package/dist/workflows/dag/frontend-risk.js +161 -0
  55. package/dist/workflows/dag/frontend-verification-trace.js +190 -0
  56. package/dist/workflows/dag/init-hybrid.js +1020 -125
  57. package/dist/workflows/dag/repair-artifact.js +43 -3
  58. package/dist/workflows/dag/skill-instructions.js +4 -2
  59. package/dist/workflows/dag/types.js +29 -8
  60. package/docs/README.md +105 -104
  61. package/docs/agent-dag-recovery-playbook.md +195 -195
  62. package/docs/agent-dag-runner.md +67 -67
  63. package/docs/architecture/README.md +26 -26
  64. package/docs/architecture/dag-execution.md +140 -140
  65. package/docs/architecture/evolution.md +54 -54
  66. package/docs/architecture/facts-and-state.md +71 -71
  67. package/docs/architecture/runtime-boundaries.md +191 -191
  68. package/docs/architecture/system-overview.md +93 -93
  69. package/docs/architecture/worker-and-feature.md +85 -85
  70. package/docs/cursor-prompt-sidecar.md +36 -36
  71. package/docs/decisions/README.md +18 -18
  72. package/docs/design/README.md +167 -167
  73. package/docs/development-principles.md +73 -73
  74. package/docs/exec-plans/README.md +6 -6
  75. package/docs/exec-plans/active/README.md +1 -4
  76. package/docs/exec-plans/completed/README.md +106 -84
  77. package/docs/feature-workflow.md +414 -389
  78. package/docs/harness-methodology-debugging.md +153 -153
  79. package/docs/harness-methodology-tdd.md +130 -130
  80. package/docs/harness-methodology-verification.md +27 -27
  81. package/docs/init-surface.manifest.json +307 -289
  82. package/docs/loop-agent-harness.md +142 -142
  83. package/docs/production-readiness.md +96 -96
  84. package/docs/progress/README.md +76 -60
  85. package/docs/reports/README.md +150 -108
  86. package/docs/skills/README.md +7 -7
  87. package/docs/skills/vetted-skill-registry.md +29 -29
  88. package/docs/templates/adr.md +60 -60
  89. package/docs/templates/agent-dag-authority-surface-audit.prompt.md +94 -94
  90. package/docs/templates/agent-dag-decision-envelope.schema.json +213 -213
  91. package/docs/templates/agent-dag-decision-gate-dogfood-report.md +117 -117
  92. package/docs/templates/agent-dag-decision-gate.prompt.md +246 -246
  93. package/docs/templates/agent-dag-process-supervisor.prompt.md +98 -98
  94. package/docs/templates/agent-dag-report.schema.json +473 -473
  95. package/docs/templates/agent-dag-review-verdict.prompt.md +68 -68
  96. package/docs/templates/agent-dag.base.json +190 -190
  97. package/docs/templates/agent-dag.final-verification.json +185 -185
  98. package/docs/templates/agent-dag.schema.json +411 -411
  99. package/docs/templates/agent-dag.supervised-implementation.json +620 -501
  100. package/docs/templates/backend-test-analysis.schema.json +44 -44
  101. package/docs/templates/backend-test-case-manifest.schema.json +190 -0
  102. package/docs/templates/backend-test-dag.classify.prompt.md +75 -0
  103. package/docs/templates/backend-test-dag.generate-pytest.prompt.md +204 -202
  104. package/docs/templates/backend-test-dag.json +559 -311
  105. package/docs/templates/backend-test-dag.retrospect.prompt.md +139 -125
  106. package/docs/templates/backend-test-dag.review-cases.prompt.md +83 -81
  107. package/docs/templates/backend-test-execution.schema.json +133 -0
  108. package/docs/templates/backend-test-result.schema.json +99 -0
  109. package/docs/templates/branch-merge-report.md +93 -0
  110. package/docs/templates/exec-plan.md +64 -64
  111. package/docs/templates/feature-spec.md +53 -53
  112. package/docs/templates/frontend-design-contract.md +42 -42
  113. package/docs/templates/frontend-eval/fixtures/failures/01-type-build-error.md +17 -0
  114. package/docs/templates/frontend-eval/fixtures/failures/02-unit-component-test-fail.md +16 -0
  115. package/docs/templates/frontend-eval/fixtures/failures/03-fixture-schema-drift.md +16 -0
  116. package/docs/templates/frontend-eval/fixtures/failures/04-missing-loading-empty-error-state.md +16 -0
  117. package/docs/templates/frontend-eval/fixtures/failures/05-forbidden-write-writeset-expansion.md +16 -0
  118. package/docs/templates/frontend-eval/fixtures/failures/06-unapproved-dependency-add.md +16 -0
  119. package/docs/templates/frontend-eval/fixtures/failures/07-mock-production-on.md +21 -0
  120. package/docs/templates/frontend-eval/fixtures/functional/01-simple-component-style.md +29 -0
  121. package/docs/templates/frontend-eval/fixtures/functional/02-form-validation.md +28 -0
  122. package/docs/templates/frontend-eval/fixtures/functional/03-list-detail-page.md +28 -0
  123. package/docs/templates/frontend-eval/fixtures/functional/04-api-mock.md +29 -0
  124. package/docs/templates/frontend-eval/fixtures/functional/05-permission-auth-gated-ui.md +27 -0
  125. package/docs/templates/frontend-eval/fixtures/functional/06-ssr-server-client-boundary.md +28 -0
  126. package/docs/templates/frontend-eval/fixtures/functional/07-shared-public-component-api.md +28 -0
  127. package/docs/templates/frontend-eval/fixtures/functional/08-pure-local-no-remote.md +27 -0
  128. package/docs/templates/frontend-eval/metrics.md +138 -0
  129. package/docs/templates/frontend-eval/smoke-targets.md +53 -0
  130. package/docs/templates/frontend-implementation-contract.schema.json +27 -0
  131. package/docs/templates/frontend-task-constraints.md +35 -35
  132. package/docs/templates/frontend-task-requirement.md +70 -70
  133. package/docs/templates/frontend-test-dag.generate-cases.prompt.md +5 -5
  134. package/docs/templates/frontend-test-dag.json +23 -23
  135. package/docs/templates/frontend-test-dag.retrieve-context.prompt.md +3 -3
  136. package/docs/templates/frontend-test-dag.retrospect.prompt.md +3 -3
  137. package/docs/templates/frontend-test-dag.review-cases.prompt.md +3 -3
  138. package/docs/templates/frontend-test-dag.review-execution.prompt.md +3 -3
  139. package/docs/templates/harness.schema.json +221 -221
  140. package/docs/templates/hybrid-dag.json +188 -188
  141. package/docs/templates/init-evolution-review.md +35 -35
  142. package/docs/templates/interactive-ui-round2-experiment.md +66 -66
  143. package/docs/templates/knowledge-graph-bootstrap-dag.json +118 -118
  144. package/docs/templates/knowledge-sync-dag.json +178 -178
  145. package/docs/templates/knowledge-sync-draft.schema.json +71 -71
  146. package/docs/templates/product-line/AGENTS.md +8 -8
  147. package/docs/templates/product-line/README.md +9 -9
  148. package/docs/templates/product-line/acceptance.yaml +14 -14
  149. package/docs/templates/product-line/closeout.yaml +9 -9
  150. package/docs/templates/product-line/design.md +13 -13
  151. package/docs/templates/product-line/links.md +10 -10
  152. package/docs/templates/product-line/requirement.md +17 -17
  153. package/docs/templates/product-line/task-graph.yaml +15 -15
  154. package/docs/templates/product-line/task.yaml +64 -64
  155. package/docs/templates/product-line/test-plan.md +7 -7
  156. package/docs/templates/production-readiness-checklist.md +57 -57
  157. package/docs/templates/progress-log.md +17 -17
  158. package/docs/templates/project-start-checklist.md +9 -9
  159. package/docs/templates/qa-report.md +48 -48
  160. package/docs/templates/sprint-contract.md +29 -29
  161. package/docs/templates/worker-dogfood-evidence.md +80 -80
  162. package/docs/templates/worker-dogfood-setup.md +68 -68
  163. package/docs/verification-matrix.md +70 -70
  164. package/examples/decision-gate-agent-dag.json +177 -177
  165. package/examples/example-dag.json +46 -46
  166. package/examples/hybrid-loop-agent-dag.json +189 -189
  167. package/harness.json +66 -66
  168. package/package.json +52 -88
  169. package/scripts/check-product-line-docs.sh +29 -29
  170. package/scripts/check-task-pool-root.sh +32 -32
  171. package/scripts/kb-bootstrap-init-skeleton.sh +240 -240
  172. package/scripts/kb-graph-incremental-prepare.mjs +386 -386
  173. package/scripts/kb-graph-incremental-prepare.sh +5 -5
  174. package/scripts/kb-graph-materialize.mjs +105 -105
  175. package/scripts/kb-graph-materialize.sh +4 -4
  176. package/scripts/kb-graph-promote.mjs +164 -164
  177. package/scripts/kb-graph-promote.sh +4 -4
  178. package/scripts/kb-query.mjs +554 -554
  179. package/scripts/kb-query.sh +5 -5
  180. package/skills/agent-worker/SKILL.md +39 -39
  181. package/skills/agent-worker/references/agent-worker-operator.md +60 -60
  182. package/skills/ai-engineering-context/SKILL.md +48 -48
  183. package/skills/analyze-product-dependencies/SKILL.md +67 -67
  184. package/skills/analyze-product-dependencies/agents/openai.yaml +4 -4
  185. package/skills/analyze-product-dependencies/references/api-documentation-schema.md +30 -30
  186. package/skills/analyze-product-dependencies/references/dependency-analysis-schema.md +28 -28
  187. package/skills/analyze-product-dependencies/references/example.md +76 -76
  188. package/skills/analyze-product-dependencies/references/forward-test-cases.md +35 -35
  189. package/skills/analyze-product-dependencies/references/input-contract.md +11 -11
  190. package/skills/analyze-product-dependencies/references/scouting-rules.md +61 -61
  191. package/skills/analyze-product-dependencies/scripts/test-validators.mjs +267 -267
  192. package/skills/analyze-product-dependencies/scripts/validate-api-documentation.mjs +101 -101
  193. package/skills/analyze-product-dependencies/scripts/validate-dependency-analysis.mjs +142 -142
  194. package/skills/analyze-product-dependencies/scripts/validate-product-requirement-input.mjs +76 -76
  195. package/skills/analyze-product-dependencies/scripts/validation-helpers.mjs +146 -146
  196. package/skills/analyze-product-requirements/SKILL.md +90 -90
  197. package/skills/analyze-product-requirements/agents/openai.yaml +4 -4
  198. package/skills/analyze-product-requirements/references/acceptance-criteria.md +91 -91
  199. package/skills/analyze-product-requirements/references/clarification-and-knowledge.md +56 -56
  200. package/skills/analyze-product-requirements/references/example.md +86 -86
  201. package/skills/analyze-product-requirements/references/forward-test-cases.md +66 -66
  202. package/skills/analyze-product-requirements/references/product-analysis-schema.md +32 -32
  203. package/skills/analyze-product-requirements/references/product-requirement-schema.md +33 -33
  204. package/skills/analyze-product-requirements/references/requirement-clarification-schema.md +35 -35
  205. package/skills/analyze-product-requirements/scripts/test-validators.mjs +193 -193
  206. package/skills/analyze-product-requirements/scripts/validate-product-analysis.mjs +69 -69
  207. package/skills/analyze-product-requirements/scripts/validate-product-requirement.mjs +97 -97
  208. package/skills/analyze-product-requirements/scripts/validate-requirement-clarification.mjs +98 -98
  209. package/skills/analyze-product-requirements/scripts/validation-helpers.mjs +156 -156
  210. package/skills/browser-tools/SKILL.md +196 -0
  211. package/skills/browser-tools/browser-content.js +103 -0
  212. package/skills/browser-tools/browser-cookies.js +35 -0
  213. package/skills/browser-tools/browser-eval.js +53 -0
  214. package/skills/browser-tools/browser-hn-scraper.js +108 -0
  215. package/skills/browser-tools/browser-nav.js +44 -0
  216. package/skills/browser-tools/browser-pick.js +162 -0
  217. package/skills/browser-tools/browser-screenshot.js +34 -0
  218. package/skills/browser-tools/browser-start.js +86 -0
  219. package/skills/browser-tools/package-lock.json +2556 -0
  220. package/skills/browser-tools/package.json +19 -0
  221. package/skills/code-review-core/SKILL.md +20 -20
  222. package/skills/codebase-scout/SKILL.md +19 -19
  223. package/skills/frontend-design-review/SKILL.md +66 -66
  224. package/skills/frontend-design-review/references/review-checklist.md +58 -58
  225. package/skills/frontend-implementation/SKILL.md +49 -47
  226. package/skills/frontend-implementation/references/code-standards.md +32 -32
  227. package/skills/frontend-implementation/references/design-spec.md +46 -46
  228. package/skills/frontend-implementation/references/node-contracts.md +27 -76
  229. package/skills/frontend-review/SKILL.md +59 -59
  230. package/skills/frontend-review/references/review-findings.md +47 -47
  231. package/skills/frontend-verification/SKILL.md +53 -53
  232. package/skills/frontend-verification/references/verification-checklist.md +68 -68
  233. package/skills/grill-me/SKILL.md +10 -10
  234. package/skills/grill-with-docs/SKILL.md +88 -88
  235. package/skills/grill-with-docs/adr-format.md +47 -47
  236. package/skills/grill-with-docs/context-format.md +60 -60
  237. package/skills/init-capability-evolution/SKILL.md +70 -70
  238. package/skills/loop-agent/SKILL.md +151 -151
  239. package/skills/loop-agent/references/README.md +67 -67
  240. package/skills/loop-agent/references/command-reference.md +527 -505
  241. package/skills/loop-agent/references/docs-converge.md +126 -126
  242. package/skills/loop-agent/references/harness-policy.md +263 -263
  243. package/skills/loop-agent/references/hybrid-dag.md +243 -238
  244. package/skills/loop-agent/references/learned/README.md +21 -21
  245. package/skills/loop-agent/references/long-running-loop.md +57 -57
  246. package/skills/loop-agent/references/model-routing.md +36 -36
  247. package/skills/loop-agent/references/multi-worktree.md +54 -54
  248. package/skills/loop-agent/references/one-shot-runs.md +85 -85
  249. package/skills/loop-agent/references/orchestrator-and-interventions.md +169 -169
  250. package/skills/loop-agent/references/pi-prompt.md +23 -23
  251. package/skills/loop-agent/references/pi-subagent-assisted-mode.md +84 -84
  252. package/skills/loop-agent/references/post-implementation-and-patterns.md +44 -44
  253. package/skills/loop-agent/references/task-workflow.md +89 -89
  254. package/skills/loop-agent/references/verification-and-failure-handling.md +141 -139
  255. package/skills/playwright-cli/SKILL.md +420 -420
  256. package/skills/playwright-cli/references/element-attributes.md +23 -23
  257. package/skills/playwright-cli/references/playwright-tests.md +39 -39
  258. package/skills/playwright-cli/references/request-mocking.md +87 -87
  259. package/skills/playwright-cli/references/running-code.md +241 -241
  260. package/skills/playwright-cli/references/session-management.md +225 -225
  261. package/skills/playwright-cli/references/storage-state.md +275 -275
  262. package/skills/playwright-cli/references/test-generation.md +433 -433
  263. package/skills/playwright-cli/references/tracing.md +139 -139
  264. package/skills/playwright-cli/references/video-recording.md +143 -143
  265. package/skills/playwright-cli-case-generator/SKILL.md +74 -74
  266. package/skills/requesting-code-review/SKILL.md +101 -101
  267. package/skills/requesting-code-review/code-reviewer.md +168 -168
  268. package/skills/systematic-debugging/CREATION-LOG.md +119 -119
  269. package/skills/systematic-debugging/SKILL.md +296 -296
  270. package/skills/systematic-debugging/condition-based-waiting-example.ts +158 -158
  271. package/skills/systematic-debugging/condition-based-waiting.md +115 -115
  272. package/skills/systematic-debugging/defense-in-depth.md +122 -122
  273. package/skills/systematic-debugging/find-polluter.sh +63 -63
  274. package/skills/systematic-debugging/root-cause-tracing.md +169 -169
  275. package/skills/systematic-debugging/test-academic.md +14 -14
  276. package/skills/systematic-debugging/test-pressure-1.md +58 -58
  277. package/skills/systematic-debugging/test-pressure-2.md +68 -68
  278. package/skills/systematic-debugging/test-pressure-3.md +69 -69
  279. package/skills/test-driven-development/SKILL.md +20 -20
  280. package/skills/using-git-worktrees/SKILL.md +215 -215
  281. package/skills/verification-before-completion/SKILL.md +154 -154
  282. package/skills/webapp-testing/SKILL.md +19 -19
@@ -1,1902 +1,1902 @@
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
- * {
40
- box-sizing: border-box;
41
- }
42
-
43
- html {
44
- background: var(--canvas);
45
- scroll-behavior: smooth;
46
- }
47
-
48
- body {
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;
57
- }
58
-
59
- button,
60
- input,
61
- select,
62
- textarea {
63
- font: inherit;
64
- }
65
-
66
- a {
67
- color: inherit;
68
- }
69
-
70
- code,
71
- pre,
72
- .output-block,
73
- .rank-node-id,
74
- .dag-node-label,
75
- .dag-node-meta,
76
- .dag-node-status,
77
- td:first-child,
78
- .meta-item dd,
79
- .header-refresh,
80
- .kpi-value,
81
- .risk-total,
82
- .process-timeline-time {
83
- font-family: "JetBrains Mono", "SFMono-Regular", Consolas, monospace;
84
- }
85
-
86
- .skip-link {
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);
97
- }
98
-
99
- .skip-link:focus {
100
- top: var(--space-3);
101
- }
102
-
103
- #app {
104
- width: min(100% - 48px, 1680px);
105
- margin: 0 auto;
106
- padding-bottom: 56px;
107
- }
108
-
109
- .site-header {
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);
124
- }
125
-
126
- .logo {
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;
136
- }
137
-
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
- }
146
-
147
- .top-nav {
148
- grid-area: nav;
149
- display: inline-flex;
150
- align-items: center;
151
- gap: 4px;
152
- }
153
-
154
- .nav-link {
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
- }
176
- .nav-link:hover,
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
- }
188
-
189
- .header-meta {
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;
198
- }
199
-
200
- .header-meta > i {
201
- color: var(--green);
202
- font-size: 16px;
203
- }
204
-
205
- .breadcrumb {
206
- grid-area: crumb;
207
- display: flex;
208
- min-height: 16px;
209
- gap: 7px;
210
- color: var(--muted);
211
- font-size: 12px;
212
- }
213
-
214
- .breadcrumb[hidden] {
215
- display: none;
216
- }
217
-
218
- .breadcrumb a {
219
- color: var(--body);
220
- text-decoration: none;
221
- }
222
- .breadcrumb a:hover,
223
- .breadcrumb a:focus-visible {
224
- color: var(--orange);
225
- text-decoration: underline;
226
- outline: none;
227
- }
228
-
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
- }
242
-
243
- .view-heading {
244
- display: grid;
245
- gap: 4px;
246
- margin-bottom: var(--space-6);
247
- }
248
-
249
- .view-kicker {
250
- margin: 0;
251
- color: var(--orange);
252
- font-size: 11px;
253
- font-weight: 700;
254
- letter-spacing: 0.08em;
255
- }
256
-
257
- .view h2 {
258
- margin: 0;
259
- color: var(--ink);
260
- font-size: 28px;
261
- font-weight: 500;
262
- line-height: 1.16;
263
- letter-spacing: 0;
264
- }
265
-
266
- .view-heading > p:last-child {
267
- max-width: 66ch;
268
- margin: 0;
269
- color: var(--body);
270
- }
271
-
272
- .panel {
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);
278
- }
279
-
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
- }
294
-
295
- .section-heading,
296
- .panel h3 {
297
- margin: 0 0 var(--space-4);
298
- color: var(--ink);
299
- font-size: 14px;
300
- font-weight: 700;
301
- }
302
-
303
- .empty,
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
- }
313
-
314
- .view-dashboard {
315
- display: grid;
316
- gap: var(--space-4);
317
- }
318
-
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
- }
348
-
349
- .panel-kpi {
350
- padding: 0;
351
- background: transparent;
352
- border: 0;
353
- }
354
-
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
- }
373
-
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);
381
- }
382
-
383
- .kpi-card {
384
- position: relative;
385
- min-width: 0;
386
- min-height: 84px;
387
- padding: 15px 18px 14px;
388
- border-left: 1px solid var(--hairline);
389
- }
390
-
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
- }
412
-
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
- }
463
-
464
- .dashboard-workspace,
465
- .dashboard-secondary {
466
- display: grid;
467
- gap: var(--space-4);
468
- align-items: stretch;
469
- }
470
-
471
- .dashboard-workspace {
472
- grid-template-columns: 1fr;
473
- }
474
- .dashboard-secondary {
475
- grid-template-columns: repeat(2, minmax(0, 1fr));
476
- }
477
-
478
- .panel-risk {
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
- }
576
-
577
- .risk-link,
578
- .active-dag-link,
579
- .link,
580
- .inbox-link,
581
- .artifact-link,
582
- .step-link {
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;
589
- }
590
-
591
- .risk-link {
592
- margin: 0;
593
- padding: 0;
594
- white-space: nowrap;
595
- }
596
- .risk-link:hover,
597
- .active-dag-link:hover,
598
- .link:hover,
599
- .inbox-link:hover,
600
- .artifact-link:hover,
601
- .step-link:hover {
602
- color: var(--orange-active);
603
- }
604
-
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
- }
643
-
644
- .meta-grid {
645
- display: grid;
646
- grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
647
- gap: 15px 24px;
648
- margin: 0;
649
- }
650
-
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
- }
668
-
669
- table {
670
- width: 100%;
671
- border-collapse: collapse;
672
- font-size: 13px;
673
- }
674
- th,
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
- }
709
-
710
- .badge {
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;
723
- }
724
-
725
- .badge-succeeded,
726
- .badge-finished,
727
- .badge-completed,
728
- .badge-done,
729
- .liveness-active {
730
- color: var(--green);
731
- background: #f2faf5;
732
- }
733
- .badge-failed,
734
- .badge-error,
735
- .liveness-stale {
736
- color: var(--red);
737
- background: #fff5f7;
738
- }
739
- .badge-partial-failed {
740
- color: #9a3a4f;
741
- background: #fff7f8;
742
- }
743
- .badge-running,
744
- .badge-started {
745
- color: var(--orange-active);
746
- background: #fff5ed;
747
- }
748
- .badge-pending,
749
- .badge-queued,
750
- .badge-blocked,
751
- .badge-unknown {
752
- color: var(--body);
753
- background: var(--surface-muted);
754
- }
755
- .badge-skipped,
756
- .badge-reused,
757
- .liveness-quiet {
758
- color: var(--blue);
759
- background: #f2f6fb;
760
- }
761
- .liveness-timeout-risk {
762
- color: var(--amber);
763
- background: #fff8e7;
764
- }
765
-
766
- .dag-detail-workspace {
767
- display: block;
768
- }
769
-
770
- .dag-inspector {
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
- }
800
- .dag-inspector-resize-handle {
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;
810
- }
811
- .dag-inspector-resize-handle::before {
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);
825
- }
826
- .dag-inspector-resize-handle:hover::before,
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
- }
937
- .dag-graph-summary,
938
- .dag-graph-fallback {
939
- margin: 0;
940
- color: var(--muted);
941
- font-size: 12px;
942
- }
943
- .dag-graph-reset {
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;
953
- }
954
- .dag-graph-reset:hover,
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
- }
992
- .dag-graph-node:hover rect,
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
- }
1004
- .dag-graph-node.status-running rect,
1005
- .dag-graph-node.status-started rect {
1006
- stroke: var(--orange);
1007
- fill: #fff7f0;
1008
- }
1009
- .dag-graph-node.status-failed rect,
1010
- .dag-graph-node.status-error rect {
1011
- stroke: var(--red);
1012
- fill: #fff7f8;
1013
- }
1014
- .dag-graph-node.status-succeeded:hover rect,
1015
- .dag-graph-node.status-succeeded:focus-visible rect,
1016
- .dag-graph-node.status-finished:hover rect,
1017
- .dag-graph-node.status-finished:focus-visible rect,
1018
- .dag-graph-node.status-completed:hover rect,
1019
- .dag-graph-node.status-completed:focus-visible rect,
1020
- .dag-graph-node.status-done:hover rect,
1021
- .dag-graph-node.status-done:focus-visible rect {
1022
- stroke: var(--green);
1023
- fill: #f2faf5;
1024
- }
1025
- .dag-graph-node.selected.status-succeeded rect,
1026
- .dag-graph-node.selected.status-finished rect,
1027
- .dag-graph-node.selected.status-completed rect,
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
- }
1541
- .dag-run-timeline-item:hover,
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
- }
1596
-
1597
- #failures-list .row-failed td:first-child,
1598
- #failures-list .row-blocked td:first-child {
1599
- color: var(--red);
1600
- font-weight: 700;
1601
- }
1602
-
1603
- @media (max-width: 1320px) {
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
- }
1622
- }
1623
-
1624
- @media (max-width: 1080px) {
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
- }
1639
- }
1640
-
1641
- @media (max-width: 720px) {
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
- }
1891
- }
1892
-
1893
- @media (prefers-reduced-motion: reduce) {
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
- }
1902
- }
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
+ * {
40
+ box-sizing: border-box;
41
+ }
42
+
43
+ html {
44
+ background: var(--canvas);
45
+ scroll-behavior: smooth;
46
+ }
47
+
48
+ body {
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;
57
+ }
58
+
59
+ button,
60
+ input,
61
+ select,
62
+ textarea {
63
+ font: inherit;
64
+ }
65
+
66
+ a {
67
+ color: inherit;
68
+ }
69
+
70
+ code,
71
+ pre,
72
+ .output-block,
73
+ .rank-node-id,
74
+ .dag-node-label,
75
+ .dag-node-meta,
76
+ .dag-node-status,
77
+ td:first-child,
78
+ .meta-item dd,
79
+ .header-refresh,
80
+ .kpi-value,
81
+ .risk-total,
82
+ .process-timeline-time {
83
+ font-family: "JetBrains Mono", "SFMono-Regular", Consolas, monospace;
84
+ }
85
+
86
+ .skip-link {
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);
97
+ }
98
+
99
+ .skip-link:focus {
100
+ top: var(--space-3);
101
+ }
102
+
103
+ #app {
104
+ width: min(100% - 48px, 1680px);
105
+ margin: 0 auto;
106
+ padding-bottom: 56px;
107
+ }
108
+
109
+ .site-header {
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);
124
+ }
125
+
126
+ .logo {
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;
136
+ }
137
+
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
+ }
146
+
147
+ .top-nav {
148
+ grid-area: nav;
149
+ display: inline-flex;
150
+ align-items: center;
151
+ gap: 4px;
152
+ }
153
+
154
+ .nav-link {
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
+ }
176
+ .nav-link:hover,
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
+ }
188
+
189
+ .header-meta {
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;
198
+ }
199
+
200
+ .header-meta > i {
201
+ color: var(--green);
202
+ font-size: 16px;
203
+ }
204
+
205
+ .breadcrumb {
206
+ grid-area: crumb;
207
+ display: flex;
208
+ min-height: 16px;
209
+ gap: 7px;
210
+ color: var(--muted);
211
+ font-size: 12px;
212
+ }
213
+
214
+ .breadcrumb[hidden] {
215
+ display: none;
216
+ }
217
+
218
+ .breadcrumb a {
219
+ color: var(--body);
220
+ text-decoration: none;
221
+ }
222
+ .breadcrumb a:hover,
223
+ .breadcrumb a:focus-visible {
224
+ color: var(--orange);
225
+ text-decoration: underline;
226
+ outline: none;
227
+ }
228
+
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
+ }
242
+
243
+ .view-heading {
244
+ display: grid;
245
+ gap: 4px;
246
+ margin-bottom: var(--space-6);
247
+ }
248
+
249
+ .view-kicker {
250
+ margin: 0;
251
+ color: var(--orange);
252
+ font-size: 11px;
253
+ font-weight: 700;
254
+ letter-spacing: 0.08em;
255
+ }
256
+
257
+ .view h2 {
258
+ margin: 0;
259
+ color: var(--ink);
260
+ font-size: 28px;
261
+ font-weight: 500;
262
+ line-height: 1.16;
263
+ letter-spacing: 0;
264
+ }
265
+
266
+ .view-heading > p:last-child {
267
+ max-width: 66ch;
268
+ margin: 0;
269
+ color: var(--body);
270
+ }
271
+
272
+ .panel {
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);
278
+ }
279
+
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
+ }
294
+
295
+ .section-heading,
296
+ .panel h3 {
297
+ margin: 0 0 var(--space-4);
298
+ color: var(--ink);
299
+ font-size: 14px;
300
+ font-weight: 700;
301
+ }
302
+
303
+ .empty,
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
+ }
313
+
314
+ .view-dashboard {
315
+ display: grid;
316
+ gap: var(--space-4);
317
+ }
318
+
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
+ }
348
+
349
+ .panel-kpi {
350
+ padding: 0;
351
+ background: transparent;
352
+ border: 0;
353
+ }
354
+
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
+ }
373
+
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);
381
+ }
382
+
383
+ .kpi-card {
384
+ position: relative;
385
+ min-width: 0;
386
+ min-height: 84px;
387
+ padding: 15px 18px 14px;
388
+ border-left: 1px solid var(--hairline);
389
+ }
390
+
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
+ }
412
+
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
+ }
463
+
464
+ .dashboard-workspace,
465
+ .dashboard-secondary {
466
+ display: grid;
467
+ gap: var(--space-4);
468
+ align-items: stretch;
469
+ }
470
+
471
+ .dashboard-workspace {
472
+ grid-template-columns: 1fr;
473
+ }
474
+ .dashboard-secondary {
475
+ grid-template-columns: repeat(2, minmax(0, 1fr));
476
+ }
477
+
478
+ .panel-risk {
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
+ }
576
+
577
+ .risk-link,
578
+ .active-dag-link,
579
+ .link,
580
+ .inbox-link,
581
+ .artifact-link,
582
+ .step-link {
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;
589
+ }
590
+
591
+ .risk-link {
592
+ margin: 0;
593
+ padding: 0;
594
+ white-space: nowrap;
595
+ }
596
+ .risk-link:hover,
597
+ .active-dag-link:hover,
598
+ .link:hover,
599
+ .inbox-link:hover,
600
+ .artifact-link:hover,
601
+ .step-link:hover {
602
+ color: var(--orange-active);
603
+ }
604
+
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
+ }
643
+
644
+ .meta-grid {
645
+ display: grid;
646
+ grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
647
+ gap: 15px 24px;
648
+ margin: 0;
649
+ }
650
+
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
+ }
668
+
669
+ table {
670
+ width: 100%;
671
+ border-collapse: collapse;
672
+ font-size: 13px;
673
+ }
674
+ th,
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
+ }
709
+
710
+ .badge {
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;
723
+ }
724
+
725
+ .badge-succeeded,
726
+ .badge-finished,
727
+ .badge-completed,
728
+ .badge-done,
729
+ .liveness-active {
730
+ color: var(--green);
731
+ background: #f2faf5;
732
+ }
733
+ .badge-failed,
734
+ .badge-error,
735
+ .liveness-stale {
736
+ color: var(--red);
737
+ background: #fff5f7;
738
+ }
739
+ .badge-partial-failed {
740
+ color: #9a3a4f;
741
+ background: #fff7f8;
742
+ }
743
+ .badge-running,
744
+ .badge-started {
745
+ color: var(--orange-active);
746
+ background: #fff5ed;
747
+ }
748
+ .badge-pending,
749
+ .badge-queued,
750
+ .badge-blocked,
751
+ .badge-unknown {
752
+ color: var(--body);
753
+ background: var(--surface-muted);
754
+ }
755
+ .badge-skipped,
756
+ .badge-reused,
757
+ .liveness-quiet {
758
+ color: var(--blue);
759
+ background: #f2f6fb;
760
+ }
761
+ .liveness-timeout-risk {
762
+ color: var(--amber);
763
+ background: #fff8e7;
764
+ }
765
+
766
+ .dag-detail-workspace {
767
+ display: block;
768
+ }
769
+
770
+ .dag-inspector {
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
+ }
800
+ .dag-inspector-resize-handle {
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;
810
+ }
811
+ .dag-inspector-resize-handle::before {
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);
825
+ }
826
+ .dag-inspector-resize-handle:hover::before,
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
+ }
937
+ .dag-graph-summary,
938
+ .dag-graph-fallback {
939
+ margin: 0;
940
+ color: var(--muted);
941
+ font-size: 12px;
942
+ }
943
+ .dag-graph-reset {
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;
953
+ }
954
+ .dag-graph-reset:hover,
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
+ }
992
+ .dag-graph-node:hover rect,
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
+ }
1004
+ .dag-graph-node.status-running rect,
1005
+ .dag-graph-node.status-started rect {
1006
+ stroke: var(--orange);
1007
+ fill: #fff7f0;
1008
+ }
1009
+ .dag-graph-node.status-failed rect,
1010
+ .dag-graph-node.status-error rect {
1011
+ stroke: var(--red);
1012
+ fill: #fff7f8;
1013
+ }
1014
+ .dag-graph-node.status-succeeded:hover rect,
1015
+ .dag-graph-node.status-succeeded:focus-visible rect,
1016
+ .dag-graph-node.status-finished:hover rect,
1017
+ .dag-graph-node.status-finished:focus-visible rect,
1018
+ .dag-graph-node.status-completed:hover rect,
1019
+ .dag-graph-node.status-completed:focus-visible rect,
1020
+ .dag-graph-node.status-done:hover rect,
1021
+ .dag-graph-node.status-done:focus-visible rect {
1022
+ stroke: var(--green);
1023
+ fill: #f2faf5;
1024
+ }
1025
+ .dag-graph-node.selected.status-succeeded rect,
1026
+ .dag-graph-node.selected.status-finished rect,
1027
+ .dag-graph-node.selected.status-completed rect,
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
+ }
1541
+ .dag-run-timeline-item:hover,
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
+ }
1596
+
1597
+ #failures-list .row-failed td:first-child,
1598
+ #failures-list .row-blocked td:first-child {
1599
+ color: var(--red);
1600
+ font-weight: 700;
1601
+ }
1602
+
1603
+ @media (max-width: 1320px) {
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
+ }
1622
+ }
1623
+
1624
+ @media (max-width: 1080px) {
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
+ }
1639
+ }
1640
+
1641
+ @media (max-width: 720px) {
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
+ }
1891
+ }
1892
+
1893
+ @media (prefers-reduced-motion: reduce) {
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
+ }
1902
+ }