@matt82198/aesop 0.1.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +117 -2
- package/README.md +59 -218
- package/bin/cli.js +168 -41
- package/daemons/run-watchdog.sh +16 -4
- package/daemons/selfheal.sh +231 -0
- package/docs/ANY-REPO.md +427 -0
- package/docs/CONTRIBUTING.md +72 -0
- package/docs/DEMO.md +334 -0
- package/docs/HOOK-INSTALL.md +15 -56
- package/docs/INSTALL.md +74 -4
- package/docs/PORTING.md +166 -0
- package/docs/README.md +33 -3
- package/docs/TEAM-STATE.md +372 -0
- package/docs/reproduce.md +33 -3
- package/driver/CLAUDE.md +150 -0
- package/driver/README.md +383 -0
- package/driver/aesop.config.example.json +80 -0
- package/driver/agent_driver.py +355 -0
- package/driver/backend_config.py +253 -0
- package/driver/claude_code_driver.py +198 -0
- package/driver/codex_driver.py +673 -0
- package/driver/openai_compatible_driver.py +249 -0
- package/driver/openai_transport.py +179 -0
- package/driver/verification_policy.py +75 -0
- package/driver/wave_bridge.py +254 -0
- package/driver/wave_loop.py +1408 -0
- package/driver/wave_scheduler.py +890 -0
- package/hooks/pre-push-policy.sh +131 -33
- package/mcp/server.mjs +320 -4
- package/monitor/collect-signals.mjs +69 -0
- package/package.json +22 -14
- package/skills/CLAUDE.md +132 -2
- package/skills/buildsystem/SKILL.md +330 -0
- package/skills/buildsystem/wave-flat-dispatch.template.mjs +658 -0
- package/skills/fleet/SKILL.md +113 -0
- package/skills/power/SKILL.md +246 -131
- package/state_store/__init__.py +4 -2
- package/state_store/api.py +19 -4
- package/state_store/coordination.py +209 -0
- package/state_store/identity.py +51 -0
- package/state_store/projections.py +63 -0
- package/state_store/read_api.py +156 -0
- package/state_store/store.py +185 -73
- package/state_store/write_api.py +462 -0
- package/templates/wave-presets/data.json +65 -0
- package/templates/wave-presets/library.json +65 -0
- package/templates/wave-presets/saas.json +64 -0
- package/tools/audit_report.py +388 -0
- package/tools/bench_runner.py +100 -3
- package/tools/ci_merge_wait.py +256 -35
- package/tools/ci_workflow_lint.py +430 -0
- package/tools/claudemd_drift.py +394 -0
- package/tools/claudemd_lint.py +359 -0
- package/tools/common.py +39 -3
- package/tools/cost_ceiling.py +166 -43
- package/tools/cost_econ.py +480 -0
- package/tools/cost_projection.py +559 -0
- package/tools/crossos_drift.py +394 -0
- package/tools/defect_escape.py +252 -0
- package/tools/doctor.js +1 -1
- package/tools/eod_sweep.py +188 -26
- package/tools/fleet.js +260 -0
- package/tools/fleet_ledger.py +209 -7
- package/tools/git_identity_check.py +315 -0
- package/tools/health-score.js +40 -0
- package/tools/health_score.py +361 -0
- package/tools/metrics_gate.py +13 -4
- package/tools/mutation_test.py +523 -0
- package/tools/portability_check.py +206 -0
- package/tools/proposals.mjs +47 -2
- package/tools/reconcile.py +7 -4
- package/tools/reproduce.js +405 -0
- package/tools/secret_scan.py +207 -65
- package/tools/self_stats.py +20 -0
- package/tools/stall_check.py +247 -16
- package/tools/stateapi_lint.py +325 -0
- package/tools/test_battery.py +173 -0
- package/tools/transcript_digest.py +380 -0
- package/tools/verify_activity_filter.py +437 -0
- package/tools/verify_agent_inspector.py +2 -0
- package/tools/verify_cost_panel.py +345 -0
- package/tools/verify_dash.py +2 -0
- package/tools/verify_dispatch_panel.py +301 -0
- package/tools/verify_failure_drilldown.py +188 -0
- package/tools/verify_prboard.py +2 -0
- package/tools/verify_scorecards.py +281 -0
- package/tools/verify_submit_encoding.py +2 -0
- package/tools/verify_ui_trio.py +409 -0
- package/tools/verify_wave_telemetry.py +268 -0
- package/tools/wave_backlog_analyzer.py +490 -0
- package/tools/wave_ledger_hook.py +150 -0
- package/tools/wave_preflight.py +779 -0
- package/tools/wave_resume.py +215 -0
- package/tools/wave_templates.py +340 -0
- package/ui/agents.py +68 -14
- package/ui/collectors.py +81 -55
- package/ui/config.py +7 -2
- package/ui/cost.py +231 -12
- package/ui/handler.py +383 -55
- package/ui/quality_scorecard.py +232 -0
- package/ui/sse.py +3 -3
- package/ui/wave_audit_tail.py +213 -0
- package/ui/wave_dispatch.py +280 -0
- package/ui/wave_failure.py +288 -0
- package/ui/wave_gantt.py +152 -0
- package/ui/wave_reasoning_tail.py +176 -0
- package/ui/wave_telemetry.py +383 -0
- package/ui/web/dist/assets/index-CNQxaiOW.css +1 -0
- package/ui/web/dist/assets/index-CP68RIh3.js +9 -0
- package/ui/web/dist/index.html +2 -2
- package/bin/CLAUDE.md +0 -76
- package/daemons/CLAUDE.md +0 -36
- package/dash/CLAUDE.md +0 -32
- package/docs/archive/README.md +0 -3
- package/docs/archive/spikes/tiered-cognition/ACTIVATION.md +0 -125
- package/docs/archive/spikes/tiered-cognition/DESIGN.md +0 -287
- package/docs/archive/spikes/tiered-cognition/FINDINGS.md +0 -113
- package/docs/archive/spikes/tiered-cognition/README.md +0 -27
- package/docs/archive/spikes/tiered-cognition/aesop-cognition.example.md +0 -32
- package/docs/archive/spikes/tiered-cognition/force-model-policy.merged.mjs +0 -673
- package/docs/archive/spikes/tiered-cognition/strip-tools-hook.mjs +0 -434
- package/hooks/CLAUDE.md +0 -89
- package/mcp/CLAUDE.md +0 -213
- package/monitor/CLAUDE.md +0 -40
- package/scan/CLAUDE.md +0 -30
- package/state_store/CLAUDE.md +0 -39
- package/tools/CLAUDE.md +0 -79
- package/ui/CLAUDE.md +0 -127
- package/ui/web/dist/assets/index-0qQYnvMC.js +0 -9
- package/ui/web/dist/assets/index-BdIlFieV.css +0 -1
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Wave telemetry collector — current wave phase, cost metrics, and blockers.
|
|
4
|
+
|
|
5
|
+
Reads state at CALL TIME (not import time) to ensure test isolation.
|
|
6
|
+
State sources (via read_api facade):
|
|
7
|
+
- orchestrator-status: current phase and activity (preferred, <24h)
|
|
8
|
+
- STATE.md: current phase and wave info (fallback if status file missing/stale)
|
|
9
|
+
- AUDIT-BACKLOG.md: top blocker via parse
|
|
10
|
+
- ledger: cost data (re-uses cost.py logic)
|
|
11
|
+
"""
|
|
12
|
+
import json
|
|
13
|
+
import re
|
|
14
|
+
import sys
|
|
15
|
+
from datetime import datetime, timezone, timedelta
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
|
|
18
|
+
import config
|
|
19
|
+
import cost
|
|
20
|
+
|
|
21
|
+
# serve.py runs with ui/ as the import root; state_store is a repo-root
|
|
22
|
+
# package, so the repo root must be on sys.path before this import.
|
|
23
|
+
_REPO_ROOT = str(Path(__file__).resolve().parent.parent)
|
|
24
|
+
if _REPO_ROOT not in sys.path:
|
|
25
|
+
sys.path.insert(0, _REPO_ROOT)
|
|
26
|
+
from state_store.read_api import ReadAPI # noqa: E402
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _read_orchestrator_status():
|
|
30
|
+
"""Read orchestrator-status.json if fresh (<24h old) using the read_api.
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
tuple: (phase_str, activity_str, source_str) or (None, None, None) if missing/stale/malformed
|
|
34
|
+
"""
|
|
35
|
+
try:
|
|
36
|
+
# Use read_api to read orchestrator status
|
|
37
|
+
api = ReadAPI(str(config.STATE_DIR))
|
|
38
|
+
status = api.read_orchestrator_status()
|
|
39
|
+
if status is None:
|
|
40
|
+
return None, None, None
|
|
41
|
+
|
|
42
|
+
# Check freshness (24h threshold)
|
|
43
|
+
updated_at_str = status.get("updated_at")
|
|
44
|
+
if not updated_at_str:
|
|
45
|
+
return None, None, None
|
|
46
|
+
|
|
47
|
+
# Parse ISO format timestamp (handle both "Z" and "+00:00" suffixes)
|
|
48
|
+
updated_at_str_normalized = updated_at_str.replace("Z", "+00:00")
|
|
49
|
+
try:
|
|
50
|
+
updated_at = datetime.fromisoformat(updated_at_str_normalized)
|
|
51
|
+
except ValueError:
|
|
52
|
+
return None, None, None
|
|
53
|
+
|
|
54
|
+
# Check if fresh (<24h) and not in the future
|
|
55
|
+
now = datetime.now(timezone.utc)
|
|
56
|
+
age = now - updated_at
|
|
57
|
+
# Treat ANY future-dated timestamp as NOT fresh (fail-closed)
|
|
58
|
+
if age > timedelta(hours=24) or age < timedelta(0):
|
|
59
|
+
return None, None, None
|
|
60
|
+
|
|
61
|
+
# Extract phase and activity
|
|
62
|
+
phase = status.get("phase", "").lower()
|
|
63
|
+
activity = status.get("activity", "").lower()
|
|
64
|
+
|
|
65
|
+
if not phase:
|
|
66
|
+
return None, None, None
|
|
67
|
+
|
|
68
|
+
return phase, activity, "orchestrator-status"
|
|
69
|
+
except Exception as e:
|
|
70
|
+
print(f"[wave_telemetry] Error reading orchestrator-status.json: {e}", file=sys.stderr)
|
|
71
|
+
return None, None, None
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def _parse_state_md_phase():
|
|
75
|
+
"""Extract current phase and wave from STATE.md.
|
|
76
|
+
|
|
77
|
+
Looks for lines like:
|
|
78
|
+
## Phase: `rc-1-published-source-available` (2026-07-17, current)
|
|
79
|
+
or
|
|
80
|
+
## Phase: `wave-rc.2` (2026-07-17, current)
|
|
81
|
+
|
|
82
|
+
Returns:
|
|
83
|
+
dict: {"wave": str, "phase": str} or {"wave": "unknown", "phase": "unknown"}
|
|
84
|
+
"""
|
|
85
|
+
try:
|
|
86
|
+
state_md = config.AESOP_ROOT / "STATE.md"
|
|
87
|
+
if not state_md.exists():
|
|
88
|
+
return {"wave": "unknown", "phase": "unknown"}
|
|
89
|
+
|
|
90
|
+
content = state_md.read_text(encoding='utf-8')
|
|
91
|
+
|
|
92
|
+
# Look for ## Phase: `...` (..., current)
|
|
93
|
+
# Extract the phase name between backticks and the wave indicator
|
|
94
|
+
match = re.search(r'## Phase:\s*`([^`]+)`', content)
|
|
95
|
+
if not match:
|
|
96
|
+
return {"wave": "unknown", "phase": "unknown"}
|
|
97
|
+
|
|
98
|
+
phase = match.group(1)
|
|
99
|
+
|
|
100
|
+
# Extract wave name from phase (e.g., "wave-rc.2" from "rc-1-published-source-available")
|
|
101
|
+
# Match patterns like "wave-26", "wave-rc.2", "rc-1", etc.
|
|
102
|
+
# Use (?:\.\w+)* to capture dot-separated identifiers (e.g., "wave-rc.2")
|
|
103
|
+
wave_match = re.search(r'(wave[-.]?\w+(?:\.\w+)*|rc[-.]?\w+(?:\.\w+)*)', phase, re.IGNORECASE)
|
|
104
|
+
if wave_match:
|
|
105
|
+
wave_str = wave_match.group(0) # e.g., "wave-26" or "rc-1"
|
|
106
|
+
else:
|
|
107
|
+
wave_str = phase # Fallback to phase itself
|
|
108
|
+
|
|
109
|
+
return {
|
|
110
|
+
"wave": wave_str.lower(),
|
|
111
|
+
"phase": phase.lower()
|
|
112
|
+
}
|
|
113
|
+
except Exception as e:
|
|
114
|
+
print(f"[wave_telemetry] Error parsing STATE.md: {e}", file=sys.stderr)
|
|
115
|
+
return {"wave": "unknown", "phase": "unknown"}
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def _parse_top_blocker():
|
|
119
|
+
"""Extract top blocker from AUDIT-BACKLOG.md.
|
|
120
|
+
|
|
121
|
+
Looks for the first P0 item with status 🔵 (inflight) or ⬜ (todo).
|
|
122
|
+
Returns the title if found, otherwise looks for orchestrator-status.
|
|
123
|
+
|
|
124
|
+
Returns:
|
|
125
|
+
str: blocker title or reason, e.g., "CI test flakes", "unknown"
|
|
126
|
+
"""
|
|
127
|
+
try:
|
|
128
|
+
backlog_file = config.AUDIT_BACKLOG_FILE
|
|
129
|
+
if not backlog_file.exists():
|
|
130
|
+
return "unknown"
|
|
131
|
+
|
|
132
|
+
content = backlog_file.read_text(encoding='utf-8')
|
|
133
|
+
lines = content.split('\n')
|
|
134
|
+
|
|
135
|
+
in_p0 = False
|
|
136
|
+
for line in lines:
|
|
137
|
+
line_stripped = line.strip()
|
|
138
|
+
|
|
139
|
+
# Check if we entered P0 section
|
|
140
|
+
if re.match(r'^##\s*P0\b', line_stripped):
|
|
141
|
+
in_p0 = True
|
|
142
|
+
continue
|
|
143
|
+
|
|
144
|
+
# If we entered a different tier, stop
|
|
145
|
+
if line_stripped.startswith('## ') and not re.match(r'^##\s*P0\b', line_stripped):
|
|
146
|
+
in_p0 = False
|
|
147
|
+
continue
|
|
148
|
+
|
|
149
|
+
if in_p0 and line_stripped.startswith('- '):
|
|
150
|
+
# Check for inflight (🔵) or todo (⬜) status
|
|
151
|
+
if '🔵' in line_stripped or '⬜' in line_stripped:
|
|
152
|
+
# Extract title after status
|
|
153
|
+
# Pattern: - 🔵 **[tag] Title**
|
|
154
|
+
match = re.search(r'(?:🔵|⬜)\s+\*\*\[([^\]]+)\]\s+(.+?)\*\*', line_stripped)
|
|
155
|
+
if match:
|
|
156
|
+
title = match.group(2)
|
|
157
|
+
return title
|
|
158
|
+
|
|
159
|
+
return "unknown"
|
|
160
|
+
except Exception as e:
|
|
161
|
+
print(f"[wave_telemetry] Error parsing blocker: {e}", file=sys.stderr)
|
|
162
|
+
return "unknown"
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def _get_wave_cost_metrics():
|
|
166
|
+
"""Get cost metrics for the current wave.
|
|
167
|
+
|
|
168
|
+
Uses cost.py to parse the ledger and return this-wave totals.
|
|
169
|
+
For now, returns a simplified snapshot of per-model tokens and OK rate.
|
|
170
|
+
|
|
171
|
+
Returns:
|
|
172
|
+
dict: {
|
|
173
|
+
"tokens_used": int,
|
|
174
|
+
"top_model": str,
|
|
175
|
+
"ok_rate": float (0.0-1.0)
|
|
176
|
+
}
|
|
177
|
+
"""
|
|
178
|
+
try:
|
|
179
|
+
summary = cost.get_cost_summary()
|
|
180
|
+
|
|
181
|
+
if "error" in summary:
|
|
182
|
+
return {
|
|
183
|
+
"tokens_used": 0,
|
|
184
|
+
"top_model": "unknown",
|
|
185
|
+
"ok_rate": 0.0
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
# Sum total tokens across all models
|
|
189
|
+
total_tokens = 0
|
|
190
|
+
top_model = "unknown"
|
|
191
|
+
top_model_tokens = 0
|
|
192
|
+
|
|
193
|
+
for model, stats in summary.get("models", {}).items():
|
|
194
|
+
tokens = stats.get("tokens_in", 0) + stats.get("tokens_out", 0)
|
|
195
|
+
total_tokens += tokens
|
|
196
|
+
if tokens > top_model_tokens:
|
|
197
|
+
# Extract model name (e.g., "haiku" from "claude-haiku-4-5" or "claude-haiku-4-5-20251001")
|
|
198
|
+
model_lower = model.lower()
|
|
199
|
+
if "haiku" in model_lower:
|
|
200
|
+
top_model = "haiku"
|
|
201
|
+
elif "sonnet" in model_lower:
|
|
202
|
+
top_model = "sonnet"
|
|
203
|
+
elif "opus" in model_lower:
|
|
204
|
+
top_model = "opus"
|
|
205
|
+
else:
|
|
206
|
+
# Fallback to last part of model id
|
|
207
|
+
top_model = model.split("-")[-1]
|
|
208
|
+
top_model_tokens = tokens
|
|
209
|
+
|
|
210
|
+
scorecard = summary.get("overall_scorecard", {})
|
|
211
|
+
ok_rate = scorecard.get("ok_rate", 0.0)
|
|
212
|
+
|
|
213
|
+
return {
|
|
214
|
+
"tokens_used": total_tokens,
|
|
215
|
+
"top_model": top_model,
|
|
216
|
+
"ok_rate": ok_rate
|
|
217
|
+
}
|
|
218
|
+
except Exception as e:
|
|
219
|
+
print(f"[wave_telemetry] Error computing cost metrics: {e}", file=sys.stderr)
|
|
220
|
+
return {
|
|
221
|
+
"tokens_used": 0,
|
|
222
|
+
"top_model": "unknown",
|
|
223
|
+
"ok_rate": 0.0
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
def _get_wave_start_time():
|
|
228
|
+
"""Get the wave start time from orchestrator-status.json or STATE.md.
|
|
229
|
+
|
|
230
|
+
Returns:
|
|
231
|
+
datetime or None: wave start time in UTC, or None if not available
|
|
232
|
+
"""
|
|
233
|
+
try:
|
|
234
|
+
# Use read_api to read orchestrator status
|
|
235
|
+
api = ReadAPI(str(config.STATE_DIR))
|
|
236
|
+
status = api.read_orchestrator_status()
|
|
237
|
+
if status is not None:
|
|
238
|
+
# Check if there's a wave_start_time or started_at field
|
|
239
|
+
start_time_str = status.get("wave_start_time") or status.get("started_at")
|
|
240
|
+
if start_time_str:
|
|
241
|
+
start_time_str_normalized = start_time_str.replace("Z", "+00:00")
|
|
242
|
+
return datetime.fromisoformat(start_time_str_normalized)
|
|
243
|
+
except Exception:
|
|
244
|
+
pass
|
|
245
|
+
return None
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
def _calculate_burn_rate_fields(total_tokens: int) -> dict:
|
|
249
|
+
"""Calculate burn-rate and projection fields for live wave cost.
|
|
250
|
+
|
|
251
|
+
Args:
|
|
252
|
+
total_tokens: total tokens burned in this wave so far
|
|
253
|
+
|
|
254
|
+
Returns:
|
|
255
|
+
dict: {
|
|
256
|
+
"tokens_burned_per_min": float (tokens/min),
|
|
257
|
+
"projected_total_tokens": int (at current rate),
|
|
258
|
+
"cost_ceiling_exceeded": bool
|
|
259
|
+
}
|
|
260
|
+
"""
|
|
261
|
+
try:
|
|
262
|
+
# Try to get wave start time for burn-rate calculation
|
|
263
|
+
wave_start = _get_wave_start_time()
|
|
264
|
+
if not wave_start:
|
|
265
|
+
# Fallback: estimate from cost ledger timestamps if available
|
|
266
|
+
return {
|
|
267
|
+
"tokens_burned_per_min": 0.0,
|
|
268
|
+
"projected_total_tokens": 0,
|
|
269
|
+
"cost_ceiling_exceeded": False
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
now = datetime.now(timezone.utc)
|
|
273
|
+
elapsed_seconds = (now - wave_start).total_seconds()
|
|
274
|
+
if elapsed_seconds < 1:
|
|
275
|
+
return {
|
|
276
|
+
"tokens_burned_per_min": 0.0,
|
|
277
|
+
"projected_total_tokens": 0,
|
|
278
|
+
"cost_ceiling_exceeded": False
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
elapsed_minutes = elapsed_seconds / 60.0
|
|
282
|
+
burn_rate = total_tokens / elapsed_minutes if elapsed_minutes > 0 else 0.0
|
|
283
|
+
|
|
284
|
+
# Get cost ceiling from config (typical: 2M tokens = $40 budget estimate)
|
|
285
|
+
cost_ceiling = getattr(config, 'COST_CEILING_TOKENS', 2_000_000)
|
|
286
|
+
|
|
287
|
+
# Estimate wave duration (typical: 8-30 min, assume 20 min average for projection)
|
|
288
|
+
avg_wave_duration_min = 20
|
|
289
|
+
estimated_remaining_min = max(0, avg_wave_duration_min - elapsed_minutes)
|
|
290
|
+
projected_additional = burn_rate * estimated_remaining_min
|
|
291
|
+
projected_total = int(total_tokens + projected_additional)
|
|
292
|
+
|
|
293
|
+
ceiling_exceeded = total_tokens > cost_ceiling
|
|
294
|
+
|
|
295
|
+
return {
|
|
296
|
+
"tokens_burned_per_min": round(burn_rate, 1),
|
|
297
|
+
"projected_total_tokens": projected_total,
|
|
298
|
+
"cost_ceiling_exceeded": ceiling_exceeded
|
|
299
|
+
}
|
|
300
|
+
except Exception as e:
|
|
301
|
+
print(f"[wave_telemetry] Error calculating burn-rate: {e}", file=sys.stderr)
|
|
302
|
+
return {
|
|
303
|
+
"tokens_burned_per_min": 0.0,
|
|
304
|
+
"projected_total_tokens": 0,
|
|
305
|
+
"cost_ceiling_exceeded": False
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
def get_wave_telemetry():
|
|
310
|
+
"""Get consolidated wave telemetry snapshot.
|
|
311
|
+
|
|
312
|
+
Prefers state/orchestrator-status.json (if fresh <24h) over STATE.md regex parsing.
|
|
313
|
+
Reads all state at call time (not import time) to ensure test isolation.
|
|
314
|
+
|
|
315
|
+
Returns:
|
|
316
|
+
dict: {
|
|
317
|
+
"wave": str,
|
|
318
|
+
"phase": str,
|
|
319
|
+
"blocker": str,
|
|
320
|
+
"tokens_used": int,
|
|
321
|
+
"top_model": str,
|
|
322
|
+
"ok_rate": float,
|
|
323
|
+
"source": "orchestrator-status" | "state-md",
|
|
324
|
+
"tokens_burned_per_min": float (NEW: burn rate),
|
|
325
|
+
"projected_total_tokens": int (NEW: projection),
|
|
326
|
+
"cost_ceiling_exceeded": bool (NEW: alert flag)
|
|
327
|
+
}
|
|
328
|
+
"""
|
|
329
|
+
try:
|
|
330
|
+
# Try orchestrator-status.json first (fresh <24h)
|
|
331
|
+
orch_phase, orch_activity, source = _read_orchestrator_status()
|
|
332
|
+
|
|
333
|
+
if orch_phase:
|
|
334
|
+
# Fresh orchestrator-status.json found; use it
|
|
335
|
+
# Extract wave identifier from phase (e.g., "wave-26" from "wave-26-verify", "wave-rc.2" from "wave-rc.2: build")
|
|
336
|
+
# Use (?:\.\w+)* to capture dot-separated identifiers (e.g., "wave-rc.2")
|
|
337
|
+
wave_match = re.search(r'(wave[-.]?\w+(?:\.\w+)*|rc[-.]?\w+(?:\.\w+)*)', orch_phase, re.IGNORECASE)
|
|
338
|
+
if wave_match:
|
|
339
|
+
wave_str = wave_match.group(0) # e.g., "wave-26", "wave-rc", or "rc-1"
|
|
340
|
+
else:
|
|
341
|
+
wave_str = orch_phase # Fallback to phase itself
|
|
342
|
+
phase_info = {
|
|
343
|
+
"wave": wave_str.lower(),
|
|
344
|
+
"phase": orch_phase
|
|
345
|
+
}
|
|
346
|
+
source_field = source
|
|
347
|
+
else:
|
|
348
|
+
# Fall back to STATE.md
|
|
349
|
+
phase_info = _parse_state_md_phase()
|
|
350
|
+
source_field = "state-md"
|
|
351
|
+
|
|
352
|
+
blocker = _parse_top_blocker()
|
|
353
|
+
cost_metrics = _get_wave_cost_metrics()
|
|
354
|
+
|
|
355
|
+
# Calculate burn-rate fields
|
|
356
|
+
burn_rate_fields = _calculate_burn_rate_fields(cost_metrics["tokens_used"])
|
|
357
|
+
|
|
358
|
+
return {
|
|
359
|
+
"wave": phase_info["wave"],
|
|
360
|
+
"phase": phase_info["phase"],
|
|
361
|
+
"blocker": blocker,
|
|
362
|
+
"tokens_used": cost_metrics["tokens_used"],
|
|
363
|
+
"top_model": cost_metrics["top_model"],
|
|
364
|
+
"ok_rate": cost_metrics["ok_rate"],
|
|
365
|
+
"source": source_field,
|
|
366
|
+
"tokens_burned_per_min": burn_rate_fields["tokens_burned_per_min"],
|
|
367
|
+
"projected_total_tokens": burn_rate_fields["projected_total_tokens"],
|
|
368
|
+
"cost_ceiling_exceeded": burn_rate_fields["cost_ceiling_exceeded"]
|
|
369
|
+
}
|
|
370
|
+
except Exception as e:
|
|
371
|
+
print(f"[wave_telemetry] Uncaught error: {e}", file=sys.stderr)
|
|
372
|
+
return {
|
|
373
|
+
"wave": "unknown",
|
|
374
|
+
"phase": "unknown",
|
|
375
|
+
"blocker": "error",
|
|
376
|
+
"tokens_used": 0,
|
|
377
|
+
"top_model": "unknown",
|
|
378
|
+
"ok_rate": 0.0,
|
|
379
|
+
"source": "error",
|
|
380
|
+
"tokens_burned_per_min": 0.0,
|
|
381
|
+
"projected_total_tokens": 0,
|
|
382
|
+
"cost_ceiling_exceeded": False
|
|
383
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.health-header{z-index:100;background:var(--color-surface);border-bottom:1px solid var(--color-border);padding:var(--space-3) var(--space-5);position:sticky;top:0}.health-header__cells{gap:var(--space-4);max-width:var(--content-max-width);flex-wrap:wrap;align-items:center;margin:0 auto;display:flex}.health-header__cell{align-items:flex-start;gap:var(--space-2);padding:var(--space-2) var(--space-3);background:var(--color-bg-subtle);border:1px solid var(--color-border-subtle);border-radius:var(--radius-md);font-size:var(--font-size-sm);cursor:pointer;transition:background-color var(--transition-fast), border-color var(--transition-fast), box-shadow var(--transition-fast);flex-direction:column;display:flex}.health-header__cell:hover{background:var(--color-bg-inset);border-color:var(--color-border)}.health-header__cell:focus-visible{outline:2px solid var(--color-focus-ring);outline-offset:2px}.health-header__label{font-size:var(--font-size-xs);color:var(--color-text-muted);font-weight:var(--font-weight-medium);text-transform:uppercase;letter-spacing:.05em}.health-header__status{font-family:var(--font-mono);font-size:var(--font-size-sm);font-weight:var(--font-weight-bold);color:var(--color-text)}.health-header__count{font-family:var(--font-mono);font-size:var(--font-size-lg);font-weight:var(--font-weight-bold);color:var(--color-accent)}.health-header__badge{padding:var(--space-1) var(--space-2);background:var(--color-status-warn-bg);color:var(--color-status-warn);border-radius:var(--radius-sm);font-size:var(--font-size-xs);font-weight:var(--font-weight-bold);display:inline-block}.health-header__icon{font-size:var(--font-size-lg);line-height:1}.health-header__cell--sse{cursor:default}.health-header__cell--sse:hover{background:var(--color-bg-subtle);border-color:var(--color-border-subtle)}.health-header__cell--timestamp{cursor:default}.health-header__cell--timestamp:hover{background:var(--color-bg-subtle);border-color:var(--color-border-subtle)}.health-header__cell--stale,.health-header__cell--stale:hover{background:var(--color-status-warn-bg);border-color:var(--color-status-warn)}.health-header__cell--theme,.health-header__cell--refresh{margin-left:auto}@media (width<=768px){.health-header{padding:var(--space-2) var(--space-3)}.health-header__cells{gap:var(--space-3)}.health-header__cell{padding:var(--space-2);font-size:var(--font-size-xs)}.health-header__count{font-size:var(--font-size-md)}}.health-header__data-wrapper{gap:var(--space-2);flex-direction:column;display:flex}.health-header__warning-strip{align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-3);background:var(--color-status-warn-bg);border:1px solid var(--color-status-warn);border-radius:var(--radius-md);color:var(--color-status-warn);font-size:var(--font-size-xs);font-weight:var(--font-weight-bold);animation:1.5s ease-in-out infinite pulse-warning;display:flex}.health-header__warning-icon{font-size:var(--font-size-sm);flex-shrink:0;display:inline-block}.health-header__warning-text{font-family:var(--font-mono);font-size:var(--font-size-xs)}@keyframes pulse-warning{0%,to{opacity:1}50%{opacity:.7}}@media (prefers-reduced-motion:reduce){.health-header__cell{transition:none}.health-header__warning-strip{animation:none}}.agent-row{border-bottom:1px solid var(--color-border-subtle);padding:var(--space-3) 0;list-style:none}.agent-row:last-child{border-bottom:none}.agent-row__inspect{padding:var(--space-1) var(--space-3);border:1px solid var(--color-border);border-radius:var(--radius-sm);color:var(--color-text);cursor:pointer;font-size:var(--font-size-xs);font-weight:var(--font-weight-medium);white-space:nowrap;background:0 0;margin-left:auto}.agent-row__inspect:hover{background:var(--color-bg-subtle)}.agent-row__inspect:focus-visible{outline:2px solid var(--color-focus-ring);outline-offset:2px}.agent-row__toggle{width:var(--space-5);height:var(--space-5);margin-right:var(--space-2);cursor:pointer;color:var(--color-text-muted);transition:color var(--transition-fast);background:0 0;border:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.agent-row__toggle:hover{color:var(--color-accent)}.agent-row__toggle:focus-visible{outline:2px solid var(--color-focus-ring);outline-offset:2px;border-radius:var(--radius-sm)}.agent-row__toggle-icon{font-size:var(--font-size-xs);line-height:1;display:inline-block}.agent-row__header{align-items:center;gap:var(--space-3);font-size:var(--font-size-sm);line-height:var(--line-height-normal);display:flex}.agent-row__status-icon{font-size:var(--font-size-lg);flex-shrink:0;display:inline-block}.agent-row__id{font-family:var(--font-mono);font-weight:var(--font-weight-bold);color:var(--color-accent);flex-shrink:0;min-width:100px}.agent-row__age{font-family:var(--font-mono);font-size:var(--font-size-xs);color:var(--color-text-muted);flex-shrink:0;min-width:50px}.agent-row__hint{color:var(--color-text);word-break:break-word;flex-grow:1}.agent-row__detail{margin-top:var(--space-3);margin-left:calc(var(--space-5) + var(--space-2));padding:var(--space-3);background:var(--color-bg-subtle);border-left:2px solid var(--color-accent);border-radius:var(--radius-md);animation:.15s expand-in}@keyframes expand-in{0%{opacity:0;max-height:0}to{opacity:1;max-height:100vh}}@media (prefers-reduced-motion:reduce){.agent-row__detail{animation:none}}.agent-row__detail-row{gap:var(--space-3);margin-bottom:var(--space-2);font-size:var(--font-size-sm);line-height:var(--line-height-normal);grid-template-columns:120px 1fr;align-items:baseline;display:grid}.agent-row__detail-label{font-weight:var(--font-weight-bold);color:var(--color-text-muted);text-align:right}.agent-row__detail-value{color:var(--color-text);font-family:var(--font-mono);word-break:break-word}.agent-row__prompt{margin-top:var(--space-4);padding-top:var(--space-3);border-top:1px solid var(--color-border-subtle)}.agent-row__prompt-label{margin-bottom:var(--space-2);font-weight:var(--font-weight-bold);color:var(--color-text-muted);font-size:var(--font-size-xs);text-transform:uppercase;letter-spacing:.05em;display:block}.agent-row__prompt-text{background:var(--color-bg-inset);border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-3);font-size:var(--font-size-xs);line-height:var(--line-height-normal);color:var(--color-text);font-family:var(--font-mono);white-space:pre-wrap;word-break:break-word;max-height:300px;margin:0;overflow-y:auto}.agent-row__prompt-loading,.agent-row__prompt-error{background:var(--color-bg-inset);border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-3);font-family:var(--font-mono);font-size:var(--font-size-sm)}.agent-row__prompt-loading{color:var(--color-text-muted)}.agent-row__prompt-error{color:var(--color-status-error)}@media (width<=768px){.agent-row__detail-row{gap:var(--space-2);grid-template-columns:1fr}.agent-row__detail-label{text-align:left;font-weight:var(--font-weight-bold)}}.agent-inspector-backdrop{z-index:1000;background:#00000073;justify-content:flex-end;display:flex;position:fixed;inset:0}.agent-inspector{background:var(--color-surface);border-left:1px solid var(--color-border);width:min(560px,100%);max-width:100%;height:100%;box-shadow:var(--shadow-md);padding:var(--space-5);gap:var(--space-4);flex-direction:column;display:flex;overflow-y:auto}.agent-inspector__head{justify-content:space-between;align-items:center;gap:var(--space-3);display:flex}.agent-inspector__title{font-size:var(--font-size-xl);color:var(--color-text);margin:0}.agent-inspector__close{border:1px solid var(--color-border);border-radius:var(--radius-sm);width:2rem;height:2rem;color:var(--color-text);cursor:pointer;font-size:var(--font-size-md);background:0 0;justify-content:center;align-items:center;padding:0;line-height:1;display:inline-flex}.agent-inspector__close:hover{background:var(--color-bg-subtle)}.agent-inspector__close:focus-visible,.agent-inspector__transcript a:focus-visible{outline:2px solid var(--color-focus-ring);outline-offset:2px}.agent-inspector__meta{gap:var(--space-2);margin:0;display:grid}.agent-inspector__meta-row{gap:var(--space-3);font-size:var(--font-size-sm);grid-template-columns:8rem 1fr;align-items:baseline;display:grid}.agent-inspector__meta-row dt{color:var(--color-text-muted);font-weight:var(--font-weight-medium);margin:0}.agent-inspector__meta-row dd{color:var(--color-text);word-break:break-word;margin:0}.agent-inspector__mono{font-family:var(--font-mono);font-size:var(--font-size-xs)}.agent-inspector__status{align-items:center;gap:var(--space-1);font-weight:var(--font-weight-medium);display:inline-flex}.agent-inspector__status-icon{font-size:.9em}.agent-inspector__section h3{margin:0 0 var(--space-2);font-size:var(--font-size-md);color:var(--color-text)}.agent-inspector__truncated{color:var(--color-text-muted);font-size:var(--font-size-xs);font-weight:400}.agent-inspector__prompt{padding:var(--space-3);background:var(--color-bg-inset);border:1px solid var(--color-border-subtle);border-radius:var(--radius-md);color:var(--color-text);font-family:var(--font-mono);font-size:var(--font-size-xs);line-height:var(--line-height-normal);white-space:pre-wrap;word-break:break-word;max-height:12rem;margin:0;overflow-y:auto}.agent-inspector__callout{padding:var(--space-3);border-left:4px solid var(--color-accent);border-radius:var(--radius-md);background:var(--color-bg-subtle);color:var(--color-text);font-size:var(--font-size-sm)}.agent-inspector__callout--error{border-left-color:var(--color-status-error);background:var(--color-status-error-bg)}.agent-inspector__transcript{gap:var(--space-2);border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-surface);padding:0;padding:var(--space-3);flex-direction:column;max-height:24rem;margin:0;list-style:none;display:flex;overflow-y:auto}.agent-inspector__tail-entry{gap:var(--space-3);padding-bottom:var(--space-2);border-bottom:1px solid var(--color-border-subtle);grid-template-columns:6rem 1fr;align-items:start;display:grid}.agent-inspector__tail-entry:last-child{border-bottom:none;padding-bottom:0}.agent-inspector__tail-type{font-size:var(--font-size-xs);font-weight:var(--font-weight-bold);text-transform:uppercase;letter-spacing:.03em;color:var(--color-text-muted);white-space:nowrap}.agent-inspector__tail-type--user{color:var(--color-accent)}.agent-inspector__tail-type--assistant{color:var(--color-text)}.agent-inspector__tail-text{font-family:var(--font-mono);font-size:var(--font-size-xs);line-height:var(--line-height-normal);color:var(--color-text);white-space:pre-wrap;word-break:break-word;margin:0}@media (width<=768px){.agent-inspector{width:100%;padding:var(--space-4)}.agent-inspector__meta-row,.agent-inspector__tail-entry{gap:var(--space-1);grid-template-columns:1fr}}.agents-panel{min-width:0;padding:var(--space-5);background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-md);flex:1}.agents-panel h2{margin:0 0 var(--space-4) 0;font-size:var(--font-size-lg);font-weight:var(--font-weight-bold);color:var(--color-text)}.agents-panel__summaries{gap:var(--space-3);margin-bottom:var(--space-4);padding:var(--space-3);background:var(--color-bg-subtle);border:1px solid var(--color-border-subtle);border-radius:var(--radius-md);grid-template-columns:repeat(auto-fill,minmax(200px,1fr));display:grid}.agent-summary{align-items:center;gap:var(--space-2);padding:var(--space-2);background:var(--color-surface);border:1px solid var(--color-border-subtle);border-radius:var(--radius-sm);font-size:var(--font-size-sm);display:flex}.agent-summary__project{font-weight:var(--font-weight-medium);color:var(--color-text);flex:none;min-width:fit-content}.agent-summary__status{padding:var(--space-1) var(--space-2);border-radius:var(--radius-sm);font-size:var(--font-size-xs);font-weight:var(--font-weight-bold);text-transform:uppercase;white-space:nowrap;flex:none}.agent-summary__status--running{background:var(--color-status-ok-bg);color:var(--color-status-ok)}.agent-summary__status--idle{background:var(--color-status-info-bg);color:var(--color-status-info)}.agent-summary__status--SUSPICIOUS,.agent-summary__status--HIGH{background:var(--color-status-error-bg);color:var(--color-status-error)}.agent-summary__status--MED,.agent-summary__status--DRIFT{background:var(--color-status-warn-bg);color:var(--color-status-warn)}.agent-summary__runtime{text-align:right;font-family:var(--font-mono);color:var(--color-text-muted);flex:1;min-width:fit-content}.agents-panel__list{margin:0;margin-top:var(--space-4);padding:0;list-style:none}@media (width<=768px){.agents-panel{padding:var(--space-3)}.agents-panel h2{font-size:var(--font-size-md)}}.alerts-panel{min-width:0;padding:var(--space-5);background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-md);flex:1}.alerts-panel h2{margin:0 0 var(--space-4) 0;font-size:var(--font-size-lg);font-weight:var(--font-weight-bold);color:var(--color-text)}.alerts-panel__list{gap:var(--space-3);flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.alerts-panel__item{gap:var(--space-3);padding:var(--space-3);background:var(--color-bg-subtle);border-left:4px solid var(--color-border);border-radius:var(--radius-md);font-size:var(--font-size-sm);line-height:var(--line-height-normal);word-break:break-word;align-items:flex-start;display:flex}.alerts-panel__item[data-severity=error]{background:var(--color-status-error-bg)}.alerts-panel__item[data-severity=warn]{background:var(--color-status-warn-bg)}.alerts-panel__item[data-severity=info]{background:var(--color-status-info-bg)}.alerts-panel__severity{min-width:60px;padding:var(--space-1) var(--space-2);font-weight:var(--font-weight-bold);font-size:var(--font-size-xs);text-transform:uppercase;letter-spacing:.05em;border-radius:var(--radius-sm);background:#0000000d;border:1.5px solid;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}@media (prefers-color-scheme:dark){.alerts-panel__severity{background:#ffffff1a}}.alerts-panel__text{color:var(--color-text);font-family:var(--font-mono);font-size:var(--font-size-xs);flex-grow:1}@media (width<=768px){.alerts-panel{padding:var(--space-3)}.alerts-panel h2{font-size:var(--font-size-md)}.alerts-panel__item{padding:var(--space-2);gap:var(--space-2)}}.events-feed{min-width:0;padding:var(--space-5);background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-md);flex:1}.events-feed h2{margin:0 0 var(--space-4) 0;font-size:var(--font-size-lg);font-weight:var(--font-weight-bold);color:var(--color-text)}.events-feed__list{gap:var(--space-2);background:linear-gradient(to bottom, var(--color-surface) 0%, var(--color-surface) 85%, #0000000d 100%);flex-direction:column;max-height:300px;margin:0;padding:0;list-style:none;display:flex;position:relative;overflow-y:auto}.events-feed__item{padding:var(--space-2) var(--space-3);background:var(--color-bg-inset);border:1px solid var(--color-border-subtle);border-radius:var(--radius-sm);font-size:var(--font-size-xs);line-height:var(--line-height-normal);color:var(--color-text-muted)}.events-feed__item code{font-family:var(--font-mono);color:var(--color-text);word-break:break-word}.empty-state{padding:var(--space-2) var(--space-3);text-align:center;color:var(--color-text-muted);font-size:var(--font-size-sm);background:var(--color-bg-inset);border-radius:var(--radius-sm);width:fit-content;margin:0 auto;display:inline-block}@media (width<=768px){.events-feed{padding:var(--space-3)}.events-feed h2{font-size:var(--font-size-md)}.events-feed__list{max-height:200px}.events-feed__item{padding:var(--space-2);font-size:var(--font-size-xs)}}.repos-panel{min-width:0;padding:var(--space-5);background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-md);flex:1}.repos-panel h2{margin:0 0 var(--space-4) 0;font-size:var(--font-size-lg);font-weight:var(--font-weight-bold);color:var(--color-text)}.repos-panel__list{gap:var(--space-3);flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.repos-panel__item{justify-content:space-between;align-items:center;gap:var(--space-3);padding:var(--space-3);background:var(--color-bg-subtle);border:1px solid var(--color-border-subtle);border-radius:var(--radius-md);font-size:var(--font-size-sm);display:flex}.repos-panel__item[data-severity=ok]{background:var(--color-status-ok-bg);border-color:var(--color-status-ok)}.repos-panel__item[data-severity=warn]{background:var(--color-status-warn-bg);border-color:var(--color-status-warn)}.repos-panel__item[data-severity=error]{background:var(--color-status-error-bg);border-color:var(--color-status-error)}.repos-panel__name{font-weight:var(--font-weight-bold);color:var(--color-text);font-family:var(--font-mono)}.repos-panel__state{font-family:var(--font-mono);font-size:var(--font-size-xs);text-align:right}.empty-state{padding:var(--space-4);text-align:center;color:var(--color-text-muted);font-size:var(--font-size-sm)}@media (width<=768px){.repos-panel{padding:var(--space-3)}.repos-panel h2{font-size:var(--font-size-md)}.repos-panel__item{padding:var(--space-2);flex-direction:column;align-items:flex-start}.repos-panel__state{text-align:left}}.inbox-form{padding:var(--space-5);background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-md)}.inbox-form h2{margin:0 0 var(--space-4) 0;font-size:var(--font-size-lg);font-weight:var(--font-weight-bold);color:var(--color-text)}.inbox-form__form{gap:var(--space-3);flex-direction:column;display:flex}.inbox-form__group{gap:var(--space-2);align-items:stretch;display:flex}.inbox-form__input{min-width:0;padding:var(--space-3) var(--space-4);background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--radius-md);font-size:var(--font-size-sm);font-family:var(--font-sans);color:var(--color-text);line-height:var(--line-height-normal);transition:border-color var(--transition-fast), box-shadow var(--transition-fast);flex:1}.inbox-form__input:focus-visible{outline:2px solid var(--color-focus-ring);outline-offset:2px;border-color:var(--color-accent)}.inbox-form__input::placeholder{color:var(--color-text-muted)}.inbox-form__input:disabled{opacity:.6;cursor:not-allowed}.inbox-form__submit{padding:var(--space-3) var(--space-5);background:var(--color-accent);color:var(--color-text-inverse);border-radius:var(--radius-md);font-size:var(--font-size-sm);font-weight:var(--font-weight-bold);cursor:pointer;transition:background-color var(--transition-fast);border:none}.inbox-form__submit:hover:not(:disabled){background:var(--color-accent-emphasis)}.inbox-form__submit:focus-visible{outline:2px solid var(--color-focus-ring);outline-offset:2px}.inbox-form__submit:disabled{opacity:.5;cursor:not-allowed}.inbox-form__error{padding:var(--space-3);background:var(--color-status-error-bg);color:var(--color-status-error);border-left:4px solid var(--color-status-error);border-radius:var(--radius-md);font-size:var(--font-size-sm)}.inbox-form__success{padding:var(--space-3);background:var(--color-status-ok-bg);color:var(--color-status-ok);border-left:4px solid var(--color-status-ok);border-radius:var(--radius-md);font-size:var(--font-size-sm)}.sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}@media (width<=768px){.inbox-form{padding:var(--space-3)}.inbox-form h2{font-size:var(--font-size-md)}.inbox-form__group{flex-direction:column}.inbox-form__submit{width:100%}}@media (prefers-reduced-motion:reduce){.inbox-form__input,.inbox-form__submit{transition:none}}.wave-telemetry-progress{border:1px solid var(--color-border-secondary);background:var(--color-surface-secondary);border-radius:8px;padding:1.5rem}.wave-progress-header{justify-content:space-between;align-items:center;margin-bottom:1.5rem;display:flex}.wave-progress-header h3{text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-secondary);margin:0;font-size:.875rem;font-weight:500}.wave-progress-badge{background:var(--color-accent-secondary);color:var(--color-text-on-accent);text-transform:uppercase;border-radius:4px;padding:.25rem .75rem;font-size:.875rem;font-weight:600}.wave-progress-content{flex-direction:column;gap:1rem;display:flex}.wave-progress-phase,.wave-progress-blocker{flex-direction:column;gap:.25rem;display:flex}.phase-label,.blocker-label{text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-secondary);font-size:.75rem;font-weight:600}.phase-value,.blocker-value{color:var(--color-text-primary);word-break:break-word;font-size:1rem;font-weight:500}.wave-progress-error{color:var(--color-severity-error);margin:0;font-size:.875rem}@media (prefers-color-scheme:dark){.wave-telemetry-progress{--color-surface-secondary:#1a1a1a;--color-border-secondary:#333;--color-text-secondary:#999;--color-text-primary:#fff;--color-accent-secondary:#444;--color-text-on-accent:#ccc;--color-severity-error:#ff6b6b}}@media (prefers-color-scheme:light){.wave-telemetry-progress{--color-surface-secondary:#f5f5f5;--color-border-secondary:#d0d0d0;--color-text-secondary:#666;--color-text-primary:#000;--color-accent-secondary:#e0e0e0;--color-text-on-accent:#333;--color-severity-error:#d32f2f}}.overview{gap:var(--space-4);padding:var(--space-6);max-width:var(--content-max-width);flex-direction:column;width:100%;margin:0 auto;display:flex}.overview__section{gap:var(--space-5);display:flex}.overview__section--full{width:100%}.overview__section--row{gap:var(--space-5);grid-template-columns:repeat(3,1fr);display:grid}@media (width<=1200px){.overview__section--row{grid-template-columns:repeat(2,1fr)}}@media (width<=768px){.overview{gap:var(--space-4);padding:var(--space-4)}.overview__section{gap:var(--space-3)}.overview__section--row{grid-template-columns:1fr}}@media (prefers-reduced-motion:reduce){.overview{scroll-behavior:auto}}.wave-telemetry-cost{border:1px solid var(--color-border-secondary);background:var(--color-surface-secondary);border-radius:8px;padding:1.5rem}.cost-header{margin-bottom:1.5rem}.cost-header h3{text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-secondary);margin:0;font-size:.875rem;font-weight:500}.cost-grid{grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:1rem;display:grid}.cost-tile{background:var(--color-surface-primary);border:1px solid var(--color-border-primary);border-radius:6px;flex-direction:column;gap:.5rem;padding:1rem;display:flex}.cost-tile--tokens{--tile-accent:var(--color-blue-500)}.cost-tile--model{--tile-accent:var(--color-green-500)}.cost-tile--okrate{--tile-accent:var(--color-amber-500)}.cost-tile--burnrate{--tile-accent:var(--color-purple-500)}.cost-tile--projection{--tile-accent:var(--color-cyan-500)}.tile-label{text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-secondary);font-size:.75rem;font-weight:600}.tile-value{color:var(--tile-accent,var(--color-text-primary));font-size:1.25rem;font-weight:700;line-height:1}.tile-unit{color:var(--color-text-secondary);font-size:.75rem}.cost-content{justify-content:center;align-items:center;min-height:100px;display:flex}.cost-content p{color:var(--color-text-secondary);margin:0;font-size:.875rem}.cost-error{color:var(--color-severity-error)!important}.wave-telemetry-cost--alert{border-color:var(--color-severity-error);background:var(--color-surface-alert)}.cost-alert-badge{background:var(--color-severity-error);color:#fff;text-transform:uppercase;letter-spacing:.05em;border-radius:4px;padding:.25rem .75rem;font-size:.75rem;font-weight:600}.cost-ceiling-warning{border-left:3px solid var(--color-severity-error);color:var(--color-severity-error);background:#ff6b6b1a;border-radius:4px;margin-bottom:1rem;padding:.75rem;font-size:.875rem;font-weight:500}@media (prefers-color-scheme:dark){.wave-telemetry-cost{--color-surface-secondary:#1a1a1a;--color-surface-primary:#0a0a0a;--color-surface-alert:#2a1515;--color-border-secondary:#333;--color-border-primary:#222;--color-text-secondary:#999;--color-text-primary:#fff;--color-blue-500:#4a9eff;--color-green-500:#4caf50;--color-amber-500:#ffa726;--color-purple-500:#b47ff0;--color-cyan-500:#4dd9ff;--color-severity-error:#ff6b6b}}@media (prefers-color-scheme:light){.wave-telemetry-cost{--color-surface-secondary:#f5f5f5;--color-surface-primary:#fff;--color-surface-alert:#fff3f0;--color-border-secondary:#d0d0d0;--color-border-primary:#e0e0e0;--color-text-secondary:#666;--color-text-primary:#000;--color-blue-500:#1976d2;--color-green-500:#388e3c;--color-amber-500:#f57c00;--color-purple-500:#7b1fa2;--color-cyan-500:#0097a7;--color-severity-error:#d32f2f}}.quality-scorecards{padding:var(--space-4);border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-surface);gap:var(--space-5);flex-direction:column;display:flex}.quality-scorecards--loading,.quality-scorecards--empty{color:var(--color-text-muted);text-align:center;padding:var(--space-5);justify-content:center;align-items:center;min-height:200px;display:flex}.quality-section{gap:var(--space-3);flex-direction:column;display:flex}.quality-section h4{font-size:var(--font-size-md);font-weight:var(--font-weight-medium);color:var(--color-text);margin:0}.quality-table{border-collapse:collapse;width:100%;font-size:var(--font-size-sm);background:var(--color-bg-subtle);border:1px solid var(--color-border-subtle);border-radius:var(--radius-sm);overflow:hidden}.quality-table thead{background:var(--color-bg-muted)}.quality-table th{padding:var(--space-2) var(--space-3);text-align:left;font-weight:var(--font-weight-medium);color:var(--color-text-muted);border-bottom:1px solid var(--color-border-subtle)}.quality-table tbody tr{border-bottom:1px solid var(--color-border-subtle);transition:background-color .15s ease-out}.quality-table tbody tr:hover{background:var(--color-bg-hover)}.quality-table td{padding:var(--space-2) var(--space-3)}.cell-specialty{font-weight:var(--font-weight-medium)}.cell-numeric{text-align:center}.cell-metric{align-items:center;gap:var(--space-2);display:flex}.metric{font-weight:var(--font-weight-bold);font-size:var(--font-size-md)}.metric-detail{font-size:var(--font-size-xs);color:var(--color-text-muted)}.quality-row--ok .cell-specialty,.quality-row--ok .metric{color:var(--color-status-ok)}.quality-row--warn .cell-specialty,.quality-row--warn .metric{color:var(--color-status-warn)}.quality-row--error .cell-specialty,.quality-row--error .metric{color:var(--color-status-error)}.quality-ranking{gap:var(--space-2);flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.ranking-item{gap:var(--space-3);padding:var(--space-2) var(--space-3);border:1px solid var(--color-border-subtle);border-radius:var(--radius-sm);background:var(--color-bg-subtle);font-size:var(--font-size-sm);grid-template-columns:2rem 1fr auto;align-items:center;display:grid}.ranking-place{font-weight:var(--font-weight-bold);color:var(--color-text-muted);text-align:center}.ranking-specialty{font-weight:var(--font-weight-medium);color:var(--color-text)}.ranking-metric{font-weight:var(--font-weight-medium);color:var(--color-text);text-align:right}.quality-footer{border-top:1px solid var(--color-border-subtle);padding-top:var(--space-3)}.quality-footer small{color:var(--color-text-muted);font-size:var(--font-size-xs)}@media (width<=768px){.quality-table{font-size:var(--font-size-xs)}.quality-table th,.quality-table td{padding:var(--space-2)}.ranking-item{gap:var(--space-2);padding:var(--space-2);grid-template-columns:1.5rem 1fr auto}}.work-view{padding:var(--space-4)}.work-container{gap:var(--space-6);max-width:var(--content-max-width);grid-template-columns:1fr 300px;margin:0 auto;display:grid}@media (width<=1200px){.work-container{grid-template-columns:1fr}.work-sidebar{order:2}}.board-header{margin-bottom:var(--space-4);justify-content:space-between;align-items:center;display:flex}.board-header h2{font-size:var(--font-size-lg);font-weight:var(--font-weight-bold)}.add-item-button{padding:var(--space-2) var(--space-3);background:var(--color-accent);color:var(--color-text-inverse);border-radius:var(--radius-sm);font-weight:var(--font-weight-medium);cursor:pointer;transition:background-color var(--transition-normal);border:none}.add-item-button:hover{background:var(--color-accent-emphasis)}.add-item-button:disabled{opacity:.5;cursor:not-allowed}.form-container{background:var(--color-bg-subtle);border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-4);margin-bottom:var(--space-4)}.tracker-form{gap:var(--space-3);flex-direction:column;display:flex}.form-group{gap:var(--space-1);flex-direction:column;display:flex}.form-group label{font-weight:var(--font-weight-medium);font-size:var(--font-size-sm);color:var(--color-text)}.form-group input,.form-group select,.form-group textarea{padding:var(--space-2);border:1px solid var(--color-border);border-radius:var(--radius-sm);background:var(--color-surface);color:var(--color-text);font-size:var(--font-size-sm)}.form-group input:focus,.form-group select:focus,.form-group textarea:focus{border-color:var(--color-accent)}.form-group input:disabled,.form-group select:disabled,.form-group textarea:disabled{opacity:.6;cursor:not-allowed}.tracker-form button{padding:var(--space-2) var(--space-3);background:var(--color-accent);color:var(--color-text-inverse);border-radius:var(--radius-sm);font-weight:var(--font-weight-medium);cursor:pointer;transition:background-color var(--transition-normal);border:none}.tracker-form button:hover:not(:disabled){background:var(--color-accent-emphasis)}.tracker-form button:disabled{opacity:.5;cursor:not-allowed}.form-error{padding:var(--space-2) var(--space-3);background:var(--color-status-error-bg);color:var(--color-status-error);border-radius:var(--radius-sm);border-left:3px solid var(--color-status-error)}.form-success{padding:var(--space-2) var(--space-3);background:var(--color-status-ok-bg);color:var(--color-status-ok);border-radius:var(--radius-sm);border-left:3px solid var(--color-status-ok)}.tracker-board{gap:var(--space-4);flex-direction:column;display:flex}.lanes-container{gap:var(--space-3);grid-template-columns:repeat(4,1fr);display:grid}@media (width<=1600px){.lanes-container{grid-template-columns:repeat(2,1fr)}}@media (width<=768px){.lanes-container{grid-template-columns:1fr}}.tracker-lane{background:var(--color-bg-subtle);border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-3);min-height:300px}.lane-header{margin-bottom:var(--space-3);font-size:var(--font-size-md);font-weight:var(--font-weight-bold);justify-content:space-between;align-items:center;display:flex}.lane-count{padding:var(--space-1) var(--space-2);background:var(--color-accent);color:var(--color-text-inverse);border-radius:var(--radius-sm);font-size:var(--font-size-xs);font-weight:var(--font-weight-bold);display:inline-block}.lane-badge{padding:var(--space-1) var(--space-2);border-radius:var(--radius-sm);font-size:var(--font-size-xs);font-weight:var(--font-weight-bold);white-space:nowrap;display:inline-block}.lane-badge--active{background:var(--color-accent);color:var(--color-text-inverse)}.lane-badge--empty{background:var(--color-bg-inset);color:var(--color-text-muted)}.lane-content{gap:var(--space-2);flex-direction:column;max-height:600px;display:flex;overflow-y:auto}.lane-empty{text-align:center;color:var(--color-text-muted);padding:var(--space-4);font-style:italic}.tracker-card{background:var(--color-surface);border:1px solid var(--color-border-subtle);border-radius:var(--radius-md);padding:var(--space-3);box-shadow:var(--shadow-sm);transition:box-shadow var(--transition-normal)}.tracker-card:hover{box-shadow:var(--shadow-md)}.tracker-card-header{justify-content:space-between;align-items:flex-start;gap:var(--space-2);margin-bottom:var(--space-2);display:flex}.tracker-card-title-row{align-items:flex-start;gap:var(--space-2);flex:1;display:flex}.priority-chip{padding:var(--space-1) var(--space-2);color:var(--color-text-inverse);font-size:var(--font-size-xs);font-weight:var(--font-weight-bold);border-radius:var(--radius-sm);white-space:nowrap;flex-shrink:0;display:inline-block}.tracker-card-title{font-size:var(--font-size-md);font-weight:var(--font-weight-medium);line-height:var(--line-height-tight);margin:0}.expand-button{padding:var(--space-1);cursor:pointer;color:var(--color-text-muted);font-size:var(--font-size-sm);background:0 0;border:none}.expand-button:hover{color:var(--color-text)}.tracker-card-tags{gap:var(--space-1);margin-bottom:var(--space-2);flex-wrap:wrap;display:flex}.tag{padding:var(--space-1) var(--space-2);background:var(--color-bg-inset);border:1px solid var(--color-border);border-radius:var(--radius-sm);font-size:var(--font-size-xs);color:var(--color-text-muted);display:inline-block}.tracker-card-details{background:var(--color-bg-inset);border-top:1px solid var(--color-border);margin:var(--space-2) 0;padding:var(--space-2) 0}.detail-section{padding:var(--space-2) 0;border-bottom:1px solid var(--color-border-subtle)}.detail-section:last-child{border-bottom:none}.detail-label{font-size:var(--font-size-xs);font-weight:var(--font-weight-bold);color:var(--color-text-muted);text-transform:uppercase;margin-bottom:var(--space-1);display:block}.detail-section p,.detail-section time,.detail-section a,.detail-section code{font-size:var(--font-size-sm);color:var(--color-text)}.detail-section a{word-break:break-all}.pr-link-inert{padding:var(--space-1) var(--space-2);background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--radius-sm);font-family:var(--font-mono);font-size:var(--font-size-xs);color:var(--color-status-error);word-break:break-all;white-space:pre-wrap;display:block}.tracker-card-actions{gap:var(--space-1);margin-top:var(--space-2);display:flex}.tracker-card-actions button{padding:var(--space-1) var(--space-2);background:var(--color-accent);color:var(--color-text-inverse);border-radius:var(--radius-sm);font-size:var(--font-size-xs);font-weight:var(--font-weight-medium);cursor:pointer;transition:background-color var(--transition-normal);border:none;flex:1}.tracker-card-actions button:hover:not(:disabled){background:var(--color-accent-emphasis)}.tracker-card-actions button:disabled{opacity:.5;cursor:not-allowed}.card-error{padding:var(--space-2);background:var(--color-status-error-bg);color:var(--color-status-error);border-radius:var(--radius-sm);border-left:3px solid var(--color-status-error);margin-top:var(--space-2);font-size:var(--font-size-sm)}.archived-summary{background:var(--color-bg-subtle);border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-3);margin-top:var(--space-4)}.archived-summary h3{font-size:var(--font-size-md);font-weight:var(--font-weight-bold);margin-bottom:var(--space-2)}.archived-list{gap:var(--space-1);flex-direction:column;max-height:200px;list-style:none;display:flex;overflow-y:auto}.archived-item{gap:var(--space-2);padding:var(--space-2);background:var(--color-surface);border-radius:var(--radius-sm);font-size:var(--font-size-sm);align-items:center;display:flex}.archived-title{color:var(--color-text-muted);flex:1;text-decoration:line-through}.archived-priority{padding:var(--space-1) var(--space-2);background:var(--color-bg-inset);border-radius:var(--radius-sm);font-size:var(--font-size-xs);font-weight:var(--font-weight-bold);color:var(--color-text-muted)}.backlog-panel{background:var(--color-bg-subtle);border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-3);top:calc(var(--header-height) + var(--space-3));position:sticky}.backlog-panel h3{font-size:var(--font-size-md);font-weight:var(--font-weight-bold);margin-bottom:var(--space-3)}.empty-state{color:var(--color-text-muted);text-align:center;padding:var(--space-3);font-style:italic}.backlog-tier{margin-bottom:var(--space-3)}.tier-header{margin-bottom:var(--space-2);justify-content:space-between;align-items:center;display:flex}.tier-header h4{font-size:var(--font-size-sm);font-weight:var(--font-weight-bold);margin:0}.tier-counts{font-size:var(--font-size-xs);color:var(--color-text-muted)}.tier-progress-bar{background:var(--color-bg-inset);border-radius:var(--radius-sm);height:6px;margin-bottom:var(--space-2);display:flex;overflow:hidden}.progress-segment{height:100%;transition:width var(--transition-normal);flex:none}.progress-segment.done{background:var(--color-status-ok)}.progress-segment.inflight{background:var(--color-status-warn)}.progress-segment.todo{background:var(--color-status-neutral)}.tier-items-list{gap:var(--space-1);flex-direction:column;max-height:250px;display:flex;position:relative;overflow-y:auto}.tier-items-list:after{background:linear-gradient(to bottom, transparent, var(--color-bg-subtle));pointer-events:none;height:20px;position:absolute;bottom:0;left:0;right:0}.backlog-item{gap:var(--space-2);padding:var(--space-1) var(--space-2);font-size:var(--font-size-xs);background:var(--color-surface);border-radius:var(--radius-sm);word-break:break-word;align-items:flex-start;display:flex}.item-status{font-size:var(--font-size-sm);flex-shrink:0}.item-tag{font-weight:var(--font-weight-bold);color:var(--color-accent);flex-shrink:0;min-width:fit-content}.item-title{color:var(--color-text);flex:1}._container_1pt1h_5{border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-bg-subtle);padding:var(--space-4)}._title_1pt1h_12{margin:0 0 var(--space-4) 0;font-size:var(--font-size-md);font-weight:var(--font-weight-medium);color:var(--color-text)}._timelineContent_1pt1h_19{gap:var(--space-4);flex-direction:column;display:flex}._row_1pt1h_25{gap:var(--space-3);grid-template-columns:160px 1fr 80px;align-items:center;display:grid}._rowLabel_1pt1h_32{gap:var(--space-1);font-size:var(--font-size-sm);flex-direction:column;display:flex;overflow:hidden}._agentId_1pt1h_40{font-family:var(--font-mono);font-weight:var(--font-weight-bold);color:var(--color-text);word-break:break-all}._agentStatus_1pt1h_47{font-size:var(--font-size-xs);color:var(--color-text-muted);text-transform:uppercase}._barContainer_1pt1h_53{background:var(--color-bg);border:1px solid var(--color-border-subtle);border-radius:var(--radius-sm);height:24px;position:relative;overflow:visible}._bar_1pt1h_53{border-radius:var(--radius-sm);height:100%;transition:width var(--transition-normal);min-width:5%;max-width:100%;padding-right:var(--space-2);font-size:var(--font-size-xs);font-weight:var(--font-weight-medium);color:var(--color-text-inverse);white-space:nowrap;justify-content:flex-end;align-items:center;display:flex;overflow:hidden}._status-ok_1pt1h_80{background:var(--color-status-ok)}._status-info_1pt1h_84{background:var(--color-status-info)}._status-warn_1pt1h_88{background:var(--color-status-warn)}._status-error_1pt1h_92{background:var(--color-status-error)}._status-neutral_1pt1h_96{background:var(--color-status-neutral)}._rowDuration_1pt1h_100{text-align:right;font-size:var(--font-size-sm);font-family:var(--font-mono);color:var(--color-text-muted);min-width:60px}._footer_1pt1h_108{margin-top:var(--space-4);padding-top:var(--space-4);border-top:1px solid var(--color-border-subtle);font-size:var(--font-size-xs);color:var(--color-text-muted)}._legend_1pt1h_116{line-height:var(--line-height-normal);display:inline-block}@media (width<=768px){._row_1pt1h_25{gap:var(--space-2);grid-template-columns:1fr}._rowLabel_1pt1h_32{gap:var(--space-2);flex-direction:row;align-items:baseline;display:flex}._barContainer_1pt1h_53{order:3;grid-column:1}._rowDuration_1pt1h_100{text-align:left;order:2}}@media (prefers-reduced-motion:reduce){._bar_1pt1h_53{transition:none}}._scaleLabels_1pt1h_154{pointer-events:none;height:18px;display:flex;position:absolute;top:-20px;left:0;right:0}._scaleTick_1pt1h_164{flex-direction:column;align-items:center;height:100%;display:flex;position:absolute}._scaleLabel_1pt1h_154{font-size:var(--font-size-xs);color:var(--color-text-muted);font-weight:var(--font-weight-normal);white-space:nowrap;text-transform:lowercase}._barLabel_1pt1h_181{font-size:var(--font-size-xs);color:var(--color-text-inverse);font-weight:var(--font-weight-bold);white-space:nowrap;margin-left:var(--space-1)}._container_jryat_5{border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-bg-subtle);flex-direction:column;height:100%;display:flex;overflow:hidden}._header_jryat_15{padding:var(--space-4);border-bottom:1px solid var(--color-border-subtle);background:var(--color-bg);justify-content:space-between;align-items:center;display:flex}._title_jryat_24{font-size:var(--font-size-md);font-weight:var(--font-weight-medium);color:var(--color-text);margin:0}._toggleButton_jryat_31{padding:var(--space-2) var(--space-3);border:1px solid var(--color-border);border-radius:var(--radius-sm);background:var(--color-bg);color:var(--color-text-muted);font-size:var(--font-size-sm);cursor:pointer;transition:all var(--transition-fast)}._toggleButton_jryat_31:hover{background:var(--color-bg-inset);color:var(--color-text)}._toggleButton_jryat_31:focus-visible{outline:2px solid var(--color-focus-ring);outline-offset:2px}._toggleButton_jryat_31[aria-pressed=true]{background:var(--color-status-ok-bg);color:var(--color-status-ok);border-color:var(--color-status-ok)}._messagesBox_jryat_58{padding:var(--space-4);gap:var(--space-3);scroll-behavior:smooth;flex-direction:column;flex:1;display:flex;overflow-y:auto}._emptyState_jryat_68{color:var(--color-text-muted);font-size:var(--font-size-sm);text-align:center;padding:var(--space-8) var(--space-4)}._message_jryat_58{padding:var(--space-3) var(--space-4);border-left:3px solid var(--color-border);border-radius:var(--radius-sm);background:var(--color-bg);font-size:var(--font-size-sm)}._role-user_jryat_84{border-left-color:var(--color-status-info);background:#0969da0a}._role-assistant_jryat_89{border-left-color:var(--color-status-ok);background:#1a7f370a}._role_jryat_84{font-weight:var(--font-weight-bold);text-transform:uppercase;font-size:var(--font-size-xs);margin-right:var(--space-2);display:inline-block}._role-user_jryat_84 ._role_jryat_84{color:var(--color-status-info)}._role-assistant_jryat_89 ._role_jryat_84{color:var(--color-status-ok)}._timestamp_jryat_110{color:var(--color-text-muted);font-size:var(--font-size-xs);font-family:var(--font-mono);margin-left:var(--space-2);display:inline-block}._text_jryat_118{margin-top:var(--space-2);color:var(--color-text);line-height:var(--line-height-normal);word-wrap:break-word;white-space:pre-wrap}._footer_jryat_126{padding:var(--space-2) var(--space-4);border-top:1px solid var(--color-border-subtle);background:var(--color-bg);text-align:right;font-size:var(--font-size-xs)}._footerTimestamp_jryat_134{color:var(--color-text-muted);font-family:var(--font-mono)}@media (prefers-reduced-motion:reduce){._messagesBox_jryat_58{scroll-behavior:auto}}._container_mspxs_6{border:1px solid var(--color-border,#e0e0e0);background-color:var(--color-surface,#f9f9f9);border-radius:8px;margin:12px 0;padding:12px}@media (prefers-color-scheme:dark){._container_mspxs_6{border-color:var(--color-border,#444);background-color:var(--color-surface,#1a1a1a)}}._header_mspxs_21{border-bottom:1px solid var(--color-border,#e0e0e0);align-items:center;gap:12px;margin-bottom:12px;padding-bottom:8px;display:flex}@media (prefers-color-scheme:dark){._header_mspxs_21{border-color:var(--color-border,#444)}}._title_mspxs_36{color:var(--color-text,#333);margin:0;font-size:14px;font-weight:600}@media (prefers-color-scheme:dark){._title_mspxs_36{color:var(--color-text,#ccc)}}._phase_mspxs_49{color:var(--color-text-secondary,#666);font-size:12px;font-weight:500}@media (prefers-color-scheme:dark){._phase_mspxs_49{color:var(--color-text-secondary,#999)}}._timestamp_mspxs_61{color:var(--color-text-secondary,#999);margin-left:auto;font-size:11px}@media (prefers-color-scheme:dark){._timestamp_mspxs_61{color:var(--color-text-secondary,#666)}}._agentsList_mspxs_73{flex-direction:column;gap:8px;display:flex}._agentRow_mspxs_79{background-color:var(--color-background,#fff);border:1px solid var(--color-border,#e0e0e0);border-radius:4px;align-items:center;gap:8px;padding:8px;font-size:12px;display:flex}@media (prefers-color-scheme:dark){._agentRow_mspxs_79{background-color:var(--color-background,#222);border-color:var(--color-border,#333)}}._agentId_mspxs_97{color:var(--color-text,#333);min-width:60px;font-family:monospace;font-weight:500}@media (prefers-color-scheme:dark){._agentId_mspxs_97{color:var(--color-text,#ccc)}}._phaseBadge_mspxs_110{text-transform:uppercase;letter-spacing:.5px;color:#fff;border-radius:3px;padding:2px 6px;font-size:11px;font-weight:600}._phase-blue_mspxs_120{background-color:#2196f3}._phase-cyan_mspxs_124{background-color:#00bcd4}._phase-green_mspxs_128{background-color:#4caf50}._phase-orange_mspxs_132{background-color:#ff9800}._phase-gray_mspxs_136{background-color:#9e9e9e}._age_mspxs_73{background-color:var(--color-border,#e0e0e0);color:var(--color-text,#333);text-align:center;border-radius:3px;min-width:40px;padding:2px 6px;font-weight:500}@media (prefers-color-scheme:dark){._age_mspxs_73{background-color:var(--color-border,#333);color:var(--color-text,#ccc)}}._tokens_mspxs_157{background-color:var(--color-border,#e0e0e0);color:var(--color-text,#333);text-align:center;border-radius:3px;min-width:60px;padding:2px 6px;font-weight:500}@media (prefers-color-scheme:dark){._tokens_mspxs_157{background-color:var(--color-border,#333);color:var(--color-text,#ccc)}}._warnings_mspxs_174{color:#d32f2f;margin-left:auto;font-size:11px;font-weight:500}@media (prefers-color-scheme:dark){._warnings_mspxs_174{color:#ff6b6b}}._unavailable_mspxs_187{text-align:center;color:var(--color-text-secondary,#999);padding:12px;font-size:13px;font-style:italic}@media (prefers-color-scheme:dark){._unavailable_mspxs_187{color:var(--color-text-secondary,#666)}}._empty_mspxs_201{text-align:center;color:var(--color-text-secondary,#999);padding:8px;font-size:12px}@media (prefers-color-scheme:dark){._empty_mspxs_201{color:var(--color-text-secondary,#666)}}._agentMetrics_mspxs_214{align-items:center;gap:6px;display:flex}._lifecycle_mspxs_220{color:var(--color-text-secondary,#666);align-items:center;gap:4px;margin-left:auto;font-size:11px;display:flex}@media (prefers-color-scheme:dark){._lifecycle_mspxs_220{color:var(--color-text-secondary,#999)}}._lifecycleLabel_mspxs_235{font-weight:500}._lifecycleBadge_mspxs_239{background-color:var(--color-border,#e0e0e0);color:var(--color-text,#333);border-radius:3px;padding:2px 6px;font-size:10px;font-weight:600}@media (prefers-color-scheme:dark){._lifecycleBadge_mspxs_239{background-color:var(--color-border,#333);color:var(--color-text,#ccc)}}._container_ud6jd_5{gap:var(--space-6);flex-direction:column;height:100%;display:flex;overflow-y:auto}._section_ud6jd_13{flex-direction:column;flex:0 auto;min-height:200px;display:flex}._section_ud6jd_13:first-child{flex:0 40%}._section_ud6jd_13:last-child{flex:60%}._timelineHeader_ud6jd_28{gap:var(--space-3);margin-bottom:var(--space-4);flex-direction:column;display:flex}._timelineTitle_ud6jd_35{font-size:var(--font-size-lg);margin:0;font-weight:600}._filterControls_ud6jd_41{gap:var(--space-2);flex-wrap:wrap;display:flex}._filterButton_ud6jd_47{padding:var(--space-2) var(--space-4);border:1px solid var(--color-border);background:var(--color-bg-subtle);color:var(--color-text);cursor:pointer;font-size:var(--font-size-sm);border-radius:4px;font-weight:500;transition:all .2s}._filterButton_ud6jd_47:hover{background:var(--color-bg-inset);border-color:var(--color-border-subtle)}._filterButtonActive_ud6jd_64{background:var(--color-accent);border-color:var(--color-accent);color:var(--color-text-inverse)}._filterButtonActive_ud6jd_64:hover{background:var(--color-accent-emphasis);border-color:var(--color-accent-emphasis)}@media (width<=768px){._container_ud6jd_5{gap:var(--space-4)}._section_ud6jd_13:first-child{flex:0 auto;min-height:auto}._section_ud6jd_13:last-child{flex:auto;min-height:250px}._filterControls_ud6jd_41{gap:var(--space-1)}._filterButton_ud6jd_47{padding:var(--space-1) var(--space-2);font-size:var(--font-size-xs)}}.cost-table-wrapper{border-radius:var(--radius-md);overflow-x:auto}.cost-table{border-collapse:collapse;width:100%;font-size:var(--font-size-sm);background:var(--color-surface)}.cost-table caption{text-align:left;padding:var(--space-2);font-size:var(--font-size-sm);color:var(--color-text-muted);caption-side:top}.cost-table thead{background:var(--color-bg-inset);border-bottom:2px solid var(--color-border)}.cost-table th{padding:var(--space-2) var(--space-3);text-align:left;font-weight:var(--font-weight-bold);color:var(--color-text)}.cost-table th.col-numeric{text-align:right}.cost-table tbody tr{border-bottom:1px solid var(--color-border-subtle)}.cost-table tbody tr:hover{background:var(--color-bg-subtle)}.cost-table td{padding:var(--space-2) var(--space-3);text-align:left;color:var(--color-text)}.cost-table td.col-numeric{text-align:right;font-family:var(--font-mono)}.cost-table .model-name{font-weight:var(--font-weight-medium);font-family:var(--font-mono);font-size:var(--font-size-xs);word-break:break-word;max-width:180px}.cost-table .verdict-failed{color:var(--color-status-error)}.cost-table .verdict-empty{color:var(--color-status-warn)}.cost-table .verdict-hung{color:var(--color-status-error)}.cost-table .col-total{font-weight:var(--font-weight-bold)}@media (width<=640px){.cost-table .verdict-col-header,.cost-table .verdict-cell{display:none}}@media (width<=768px){.cost-table{font-size:var(--font-size-xs)}.cost-table th,.cost-table td{padding:var(--space-1) var(--space-2)}.cost-table .model-name{max-width:100px}}.chart-container{border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-surface);flex-direction:column;display:flex;overflow:hidden}.chart-empty{min-height:250px;padding:var(--space-6);text-align:center;flex-direction:column;justify-content:center;align-items:center;display:flex}.chart-empty-message{margin:0 0 var(--space-2) 0;font-size:var(--font-size-md);font-weight:var(--font-weight-medium);color:var(--color-text)}.chart-empty-hint{font-size:var(--font-size-sm);color:var(--color-text-muted);margin:0}.cost-chart-svg{max-width:100%;height:auto;display:block;overflow:visible}.chart-footer{padding:var(--space-2) var(--space-4);border-top:1px solid var(--color-border-subtle);background:var(--color-bg);text-align:right;font-size:var(--font-size-xs)}.chart-footer-timestamp{color:var(--color-text-muted);font-family:var(--font-mono)}.chart-axis{stroke:var(--color-border);stroke-width:2px}.chart-label-x,.chart-label-y{fill:var(--color-text-muted);font-size:12px;font-family:var(--font-sans)}.bar-segment{stroke:var(--color-border-subtle);stroke-width:.5px;transition:opacity var(--transition-fast);cursor:pointer}.bar-segment:hover{opacity:.8}.bar-input{fill:var(--color-status-info)}.bar-output{fill:var(--color-accent)}.chart-legend{font-size:12px}.legend-text{fill:var(--color-text-muted);font-family:var(--font-sans);font-size:12px}@media (width<=768px){.cost-chart-svg{width:100%}.chart-label-x,.chart-label-y,.legend-text{font-size:10px}}.scorecard{padding:var(--space-5);border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-surface)}.scorecard-header{margin-bottom:var(--space-4)}.scorecard-header h3{margin:0 0 var(--space-2) 0;font-size:var(--font-size-lg);font-weight:var(--font-weight-medium);color:var(--color-text)}.scorecard-total{font-size:var(--font-size-sm);color:var(--color-text-muted)}.scorecard-tiles{gap:var(--space-3);margin-bottom:var(--space-4);grid-template-columns:repeat(auto-fit,minmax(120px,1fr));display:grid}.scorecard-tile{padding:var(--space-3);border-radius:var(--radius-md);text-align:center;border:1px solid var(--color-border);background:var(--color-bg-subtle)}.tile-label{font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);margin-bottom:var(--space-1)}.tile-percent{font-size:var(--font-size-xl);font-weight:var(--font-weight-bold);margin-bottom:var(--space-1)}.tile-count{font-size:var(--font-size-xs);color:var(--color-text-muted)}.scorecard-tile--ok{border-color:var(--color-status-ok);background:var(--color-status-ok-bg)}.scorecard-tile--ok .tile-label,.scorecard-tile--ok .tile-percent{color:var(--color-status-ok)}.scorecard-tile--error{border-color:var(--color-status-error);background:var(--color-status-error-bg)}.scorecard-tile--error .tile-label,.scorecard-tile--error .tile-percent{color:var(--color-status-error)}.scorecard-tile--warn{border-color:var(--color-status-warn);background:var(--color-status-warn-bg)}.scorecard-tile--warn .tile-label,.scorecard-tile--warn .tile-percent{color:var(--color-status-warn)}.scorecard-tile--neutral{border-color:var(--color-status-neutral)}.scorecard-tile--neutral .tile-label,.scorecard-tile--neutral .tile-percent{color:var(--color-status-neutral)}.scorecard-footer{border-top:1px solid var(--color-border-subtle);padding-top:var(--space-3)}.scorecard-footer small{color:var(--color-text-muted);font-size:var(--font-size-xs)}.weekly-cost-wrapper{width:100%;overflow-x:auto}.weekly-cost-empty{padding:var(--space-5);text-align:center;color:var(--color-text-muted);background-color:var(--color-bg-inset);border:1px solid var(--color-border-subtle);border-radius:var(--radius-md)}.weekly-cost-empty .empty-message{font-size:var(--font-size-sm);margin:0}.weekly-cost-table{border-collapse:collapse;width:100%;font-size:var(--font-size-sm)}.weekly-cost-table caption{text-align:left;padding:var(--space-3) 0 var(--space-2) 0;font-size:var(--font-size-xs);color:var(--color-text-muted)}.weekly-cost-table thead th{background-color:var(--color-bg-subtle);border:1px solid var(--color-border-subtle);padding:var(--space-3);text-align:left;font-weight:var(--font-weight-bold);color:var(--color-text)}.weekly-cost-table thead th.col-numeric{text-align:right}.weekly-cost-table tbody td{border:1px solid var(--color-border-subtle);padding:var(--space-3);background-color:var(--color-surface)}.weekly-cost-table tbody tr:nth-child(odd) td{background-color:var(--color-bg-inset)}.weekly-cost-table tbody td.week-label{font-weight:var(--font-weight-medium);color:var(--color-text)}.weekly-cost-table tbody td.col-numeric{text-align:right;font-family:var(--font-mono);color:var(--color-text-muted)}@media (prefers-reduced-motion:no-preference){.weekly-cost-table tbody tr{transition:background-color var(--transition-fast)}.weekly-cost-table tbody tr:hover td{background-color:var(--color-bg-subtle)}}.verdict-cost-wrapper{width:100%}.verdict-cost-empty{padding:var(--space-5);text-align:center;color:var(--color-text-muted);background-color:var(--color-bg-inset);border:1px solid var(--color-border-subtle);border-radius:var(--radius-md)}.verdict-cost-empty .empty-message{font-size:var(--font-size-sm);margin:0}.verdict-cost-grid{gap:var(--space-4);margin-bottom:var(--space-4);grid-template-columns:repeat(auto-fit,minmax(200px,1fr));display:grid}.verdict-cost-tile{padding:var(--space-4);border:2px solid var(--color-border);border-radius:var(--radius-md);background-color:var(--color-bg-subtle);transition:all var(--transition-normal)}.verdict-cost-tile:hover:not(.verdict-tile--disabled){border-color:var(--color-accent);background-color:var(--color-surface);box-shadow:var(--shadow-md)}.verdict-tile--ok{border-left:4px solid var(--color-status-ok)}.verdict-tile--failed{border-left:4px solid var(--color-status-error)}.verdict-tile--empty{border-left:4px solid var(--color-status-warn)}.verdict-tile--hung{border-left:4px solid var(--color-status-neutral)}.verdict-tile--disabled{opacity:.5;background-color:var(--color-bg-inset);border-color:var(--color-border-subtle);cursor:not-allowed}.verdict-cost-tile .tile-label{font-size:var(--font-size-xs);font-weight:var(--font-weight-bold);color:var(--color-text-muted);text-transform:uppercase;letter-spacing:.5px;margin-bottom:var(--space-2)}.verdict-cost-tile .tile-value{font-size:var(--font-size-lg);font-weight:var(--font-weight-bold);color:var(--color-text);margin-bottom:var(--space-2);align-items:baseline;gap:var(--space-2);display:flex}.verdict-cost-tile .tile-unit{font-size:var(--font-size-xs);color:var(--color-text-muted);font-weight:var(--font-weight-normal)}.verdict-cost-tile .tile-disabled{color:var(--color-text-muted);font-size:var(--font-size-xl);line-height:1}.verdict-cost-tile .tile-meta{font-size:var(--font-size-xs);color:var(--color-text-muted)}.verdict-cost-note{padding:var(--space-3);background-color:var(--color-bg-inset);border:1px solid var(--color-border-subtle);border-radius:var(--radius-md);border-left:3px solid var(--color-status-info)}.verdict-cost-note p{font-size:var(--font-size-xs);color:var(--color-text-muted);line-height:var(--line-height-normal);margin:0}.model-mix-wrapper{width:100%}.model-mix-empty{padding:var(--space-5);text-align:center;color:var(--color-text-muted);background-color:var(--color-bg-inset);border:1px solid var(--color-border-subtle);border-radius:var(--radius-md)}.model-mix-empty .chart-empty-message{font-size:var(--font-size-sm);margin:0}.model-mix-chart-svg{width:100%;max-width:800px;height:auto;margin:0 auto;display:block}.model-mix-chart-svg .chart-axis{stroke:var(--color-border);stroke-width:1.5px}.model-mix-chart-svg .chart-label-x,.model-mix-chart-svg .chart-label-y{font-size:12px;font-family:var(--font-sans);fill:var(--color-text-muted)}.model-mix-chart-svg .chart-label-x{text-anchor:middle}.model-mix-chart-svg .bar-segment{stroke:var(--color-bg);stroke-width:1px;opacity:.9;transition:opacity .15s}.model-mix-chart-svg .bar-segment:hover{opacity:1;stroke-width:1.5px;filter:brightness(1.1)}.model-mix-chart-svg .bar-segment:hover title{display:block}.model-mix-chart-svg .chart-legend{font-family:var(--font-sans)}.model-mix-chart-svg .legend-text{fill:var(--color-text-muted);font-size:11px}.model-mix-wrapper .model-mix-note{margin-top:var(--space-4);padding:var(--space-3);background-color:var(--color-bg-inset);border:1px solid var(--color-border-subtle);border-radius:var(--radius-md)}.model-mix-note p{font-size:var(--font-size-xs);color:var(--color-text-muted);line-height:var(--line-height-normal);margin:0}@media (width<=600px){.model-mix-chart-svg{min-height:200px}.model-mix-chart-svg .chart-label-x{font-size:10px}.model-mix-chart-svg .legend-text{font-size:9px}}.cost-analytics-panel{background:var(--color-surface,#1a1a1a);border:1px solid var(--color-border,#333);border-radius:.5rem;flex-direction:column;gap:1.5rem;padding:1.5rem;display:flex}.cost-analytics-panel h3{color:var(--color-text,#fff);margin:0 0 1rem;font-size:1.1rem;font-weight:600}.analytics-grid{grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:1.5rem;display:grid}.analytics-section{background:var(--color-bg,#0f0f0f);border:1px solid var(--color-border,#333);border-radius:.375rem;flex-direction:column;gap:.75rem;padding:1rem;display:flex}.analytics-section h4{color:var(--color-text,#fff);text-transform:uppercase;letter-spacing:.05em;opacity:.9;margin:0;font-size:.95rem;font-weight:600}.wave-spend-chart{width:100%;height:150px}.wave-bar{fill:var(--color-primary,#60a5fa);opacity:.8;transition:opacity .2s}.wave-bar:hover{opacity:1}.wave-label{fill:var(--color-text-secondary,#999);font-size:.75rem;font-weight:500}.counterfactual-compare{flex-direction:column;gap:0;font-size:.85rem;display:flex;overflow-x:auto}.compare-row{border-bottom:1px solid var(--color-border,#222);grid-template-columns:1.5fr 1fr 1fr 1.2fr;align-items:center;gap:.5rem;padding:.5rem;display:grid}.compare-row:last-child{border-bottom:none}.compare-header{background:var(--color-surface,#1a1a1a);color:var(--color-text-secondary,#999);text-transform:uppercase;letter-spacing:.05em;border-bottom:2px solid var(--color-border,#333);padding:.75rem .5rem;font-size:.75rem;font-weight:600}.compare-total{background:var(--color-surface-variant,#111);border-top:2px solid var(--color-border,#333);border-bottom:none;font-weight:600}.compare-col{text-align:right}.model-col{text-align:left;color:var(--color-text,#fff);font-family:SF Mono,Monaco,monospace;font-size:.8rem}.cost-col{color:var(--color-text-secondary,#aaa);font-variant-numeric:tabular-nums}.savings-col{font-variant-numeric:tabular-nums;font-weight:600}.savings-col.positive{color:var(--color-success,#10b981)}.savings-col.negative{color:var(--color-error,#ef4444)}.burn-rate-projection{flex-direction:column;gap:1rem;display:flex}.burn-stats{flex-direction:column;gap:.5rem;font-size:.85rem;display:flex}.stat-row{justify-content:space-between;align-items:center;padding:.25rem 0;display:flex}.stat-label{color:var(--color-text-secondary,#999);font-weight:500}.stat-value{color:var(--color-text,#fff);text-align:right;font-family:SF Mono,Monaco,monospace;font-weight:600}.burn-meter{flex-direction:column;gap:.5rem;display:flex}.meter-bar{background:var(--color-bg,#0f0f0f);border:1px solid var(--color-border,#333);border-radius:.25rem;width:100%;height:24px;position:relative;overflow:hidden}.meter-fill{border-radius:.25rem 0 0 .25rem;height:100%;transition:width .3s,background-color .2s}.meter-fill.burn-safe{background:linear-gradient(90deg, var(--color-success,#10b981), var(--color-info,#3b82f6))}.meter-fill.burn-warning{background:linear-gradient(90deg, var(--color-warn,#f59e0b), var(--color-error,#ef4444))}.meter-fill.burn-alert{background:var(--color-error,#ef4444)}.meter-label{color:var(--color-text,#fff);justify-content:space-between;font-size:.8rem;font-weight:600;display:flex}.meter-projection{color:var(--color-text-secondary,#999);font-size:.75rem;font-style:italic}.analytics-unavailable{background:var(--color-surface-variant,#111);border:1px dashed var(--color-border,#333);text-align:center;border-radius:.375rem;justify-content:center;align-items:center;min-height:100px;padding:1.5rem;display:flex}.analytics-unavailable p{color:var(--color-text-secondary,#999);margin:0;font-size:.85rem}@media (width<=768px){.analytics-grid{grid-template-columns:1fr}.compare-row{grid-template-columns:1fr;gap:.25rem}.compare-col{text-align:left}.compare-col:before{content:attr(data-label);color:var(--color-text-secondary,#999);min-width:80px;font-weight:600;display:inline-block}}@media (prefers-color-scheme:dark){.cost-analytics-panel{background:#1a1a1a}.analytics-section{background:#0f0f0f;border-color:#333}}@media (prefers-color-scheme:light){.cost-analytics-panel{background:#f5f5f5;border-color:#e0e0e0}.analytics-section{background:#fff;border-color:#d0d0d0}.analytics-section h4{color:#1a1a1a}.wave-label,.stat-label,.compare-header{color:#666}.stat-value,.cost-col,.model-col,.meter-label{color:#1a1a1a}.meter-bar{background:#e0e0e0;border-color:silver}}.view-cost{padding:var(--space-5);max-width:var(--content-max-width)}.view-cost h2{margin-top:0;margin-bottom:var(--space-5);font-size:var(--font-size-xl);color:var(--color-text)}.view-cost h3{font-size:var(--font-size-lg);color:var(--color-text);margin-top:var(--space-5);margin-bottom:var(--space-3)}.cost-callout{padding:var(--space-4);border-left:4px solid var(--color-accent);border-radius:var(--radius-md);background:var(--color-bg-subtle);margin-bottom:var(--space-5)}.cost-callout h3{margin-top:0;margin-bottom:var(--space-2);font-size:var(--font-size-md)}.cost-callout p{color:var(--color-text);font-size:var(--font-size-sm);line-height:var(--line-height-normal);margin:0}.cost-callout code{background:var(--color-bg-inset);font-family:var(--font-mono);border-radius:3px;padding:.2em .4em;font-size:.9em}.cost-callout--info{border-left-color:var(--color-status-info)}.cost-layout{gap:var(--space-5);display:grid}.cost-section{border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-4);background:var(--color-surface)}.cost-section h3{margin-top:0;margin-bottom:var(--space-3)}.cost-section--full{grid-column:1/-1}@media (width<=768px){.view-cost{padding:var(--space-3)}.cost-layout{gap:var(--space-4)}.cost-section{padding:var(--space-3)}}.failure-drilldown{flex-direction:column;gap:.5rem;display:flex}.failure-drilldown-toggle{border:1px solid var(--color-border,#ccc);cursor:pointer;font-family:inherit;font-size:inherit;text-align:left;background:0 0;border-radius:4px;padding:.5rem;transition:background-color .2s}.failure-drilldown-toggle:hover{background-color:var(--color-bg-hover,#f5f5f5)}.failure-drilldown-toggle:active{background-color:var(--color-bg-active,#e8e8e8)}@media (prefers-color-scheme:dark){.failure-drilldown-toggle:hover{background-color:#2a2a2a}.failure-drilldown-toggle:active{background-color:#333}}.failure-drilldown-content{background-color:var(--color-bg-secondary,#f9f9f9);border:1px solid var(--color-border,#ccc);border-radius:4px;flex-direction:column;gap:1rem;padding:1rem;display:flex}@media (prefers-color-scheme:dark){.failure-drilldown-content{background-color:#1a1a1a;border-color:#444}}.failure-drilldown-loading,.failure-drilldown-error,.failure-drilldown-unavailable,.failure-drilldown-empty{border-radius:4px;padding:1rem;font-size:.95rem}.failure-drilldown-loading{color:var(--color-text-secondary,#666);background-color:#0000}.failure-drilldown-error{color:#c41e3a;background-color:#fef5f5;border:1px solid #c41e3a;flex-direction:column;gap:.5rem;display:flex}@media (prefers-color-scheme:dark){.failure-drilldown-error{background-color:#2a1a1a;border-color:#8b2e2e}}.failure-drilldown-error button{color:#fff;cursor:pointer;background:#c41e3a;border:none;border-radius:4px;align-self:flex-start;padding:.5rem 1rem;font-size:.9rem}.failure-drilldown-error button:hover{background:#a01830}.failure-drilldown-unavailable{color:var(--color-text,#333);background-color:#fffaef;border:1px solid #f0ad4e}@media (prefers-color-scheme:dark){.failure-drilldown-unavailable{background-color:#2a1f00;border-color:#8b6f00}}.failure-drilldown-empty{color:var(--color-text-secondary,#666);background-color:#0000;font-style:italic}.failure-run{border-left:4px solid var(--color-border,#ccc);background-color:#0000;border-radius:2px;flex-direction:column;gap:.75rem;padding:1rem;display:flex}.failure-run-header{flex-wrap:wrap;align-items:center;gap:1rem;display:flex}.failure-run-conclusion{color:var(--color-text,#333);align-items:center;gap:.25rem;font-weight:600;display:flex}.failure-run-icon{font-size:1.2em;display:inline-block}.failure-run-name{color:var(--color-text,#333);font-family:monospace;font-size:.9rem}.failure-run-link{color:#06c;font-size:.9rem;text-decoration:none}.failure-run-link:hover{text-decoration:underline}@media (prefers-color-scheme:dark){.failure-run-link{color:#66b3ff}}.failure-run-meta{color:var(--color-text-secondary,#666);font-size:.85rem}.failure-run-meta code{background-color:var(--color-code-bg,#f0f0f0);border-radius:2px;padding:2px 4px;font-family:monospace;font-size:.85em}@media (prefers-color-scheme:dark){.failure-run-meta code{background-color:#2a2a2a}}.failure-jobs{flex-direction:column;gap:.5rem;display:flex}.failure-jobs-summary{color:var(--color-text,#333);padding:.5rem 0;font-weight:500}.failure-jobs-failing{color:#c41e3a}.failure-jobs-all-passing{color:#2ecc71}.failure-jobs-empty{color:var(--color-text-secondary,#666);text-align:center;padding:1rem;font-style:italic}.failure-jobs-list{flex-direction:column;gap:.5rem;display:flex}.failure-job{border:1px solid var(--color-border,#ddd);border-radius:4px;flex-direction:column;gap:.5rem;display:flex;overflow:hidden}.failure-job-summary{background:var(--color-bg-secondary,#fafafa);cursor:pointer;text-align:left;font-family:inherit;font-size:inherit;color:var(--color-text,#333);border:none;align-items:center;gap:.75rem;padding:.75rem;transition:background-color .15s;display:flex}.failure-job-summary:hover{background-color:var(--color-bg-hover,#f0f0f0)}.failure-job-summary:active{background-color:var(--color-bg-active,#e8e8e8)}@media (prefers-color-scheme:dark){.failure-job-summary{background:#2a2a2a}.failure-job-summary:hover{background-color:#333}.failure-job-summary:active{background-color:#3a3a3a}}.failure-job-summary.failure-job-failing{background-color:#fef5f5;border-left:4px solid #c41e3a}@media (prefers-color-scheme:dark){.failure-job-summary.failure-job-failing{background-color:#2a1a1a;border-left-color:#8b2e2e}}.failure-job-icon{width:1em;color:var(--color-text-secondary,#666);justify-content:center;align-items:center;font-size:.9em;display:inline-flex}.failure-job-status{flex:none;align-items:center;gap:.25rem;font-weight:500;display:flex}.failure-job-conclusion-icon{font-size:1em;display:inline-block}.failure-job-name{color:var(--color-text,#333);text-overflow:ellipsis;flex:auto;min-width:0;font-family:monospace;font-size:.9rem;overflow:hidden}.failure-job-link{color:#06c;white-space:nowrap;flex:none;font-size:.85rem;text-decoration:none}.failure-job-link:hover{text-decoration:underline}@media (prefers-color-scheme:dark){.failure-job-link{color:#66b3ff}}.failure-job-details{border-top:1px solid var(--color-border,#ddd);background-color:#0000;flex-direction:column;gap:.5rem;padding:.75rem;display:flex}@media (prefers-color-scheme:dark){.failure-job-details{border-top-color:#444}}.failure-job-meta{color:var(--color-text-secondary,#666);font-size:.85rem}.failure-job-meta code{background-color:var(--color-code-bg,#f0f0f0);border-radius:2px;padding:2px 4px;font-family:monospace;font-size:.85em}@media (prefers-color-scheme:dark){.failure-job-meta code{background-color:#1a1a1a}}.failure-job-meta a{color:#06c;text-decoration:none}.failure-job-meta a:hover{text-decoration:underline}@media (prefers-color-scheme:dark){.failure-job-meta a{color:#66b3ff}}.failure-job-log{color:#333;background-color:#f5f5f5;border:1px solid #ddd;border-radius:2px;max-height:300px;margin:0;padding:.75rem;font-family:Courier New,Courier,monospace;font-size:.8rem;line-height:1.4;overflow:auto}@media (prefers-color-scheme:dark){.failure-job-log{color:#ccc;background-color:#1a1a1a;border-color:#444}}.failure-job-log-unavailable{color:var(--color-text,#333);background-color:#fffaef;border:1px solid #f0ad4e;border-radius:2px;padding:.75rem;font-size:.9rem}@media (prefers-color-scheme:dark){.failure-job-log-unavailable{background-color:#2a1f00;border-color:#8b6f00}}.view-prboard{padding:var(--space-5);max-width:var(--content-max-width)}.prboard-head{justify-content:space-between;align-items:center;gap:var(--space-3);margin-bottom:var(--space-5);display:flex}.view-prboard h2{font-size:var(--font-size-xl);color:var(--color-text);margin:0}.view-prboard h3{margin-top:0;margin-bottom:var(--space-2);font-size:var(--font-size-md);color:var(--color-text)}.prboard-refresh{padding:var(--space-1) var(--space-3);border:1px solid var(--color-border);border-radius:var(--radius-sm);color:var(--color-text);cursor:pointer;font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);background:0 0}.prboard-refresh:hover{background:var(--color-bg-subtle)}.prboard-refresh:focus-visible{outline:2px solid var(--color-focus-ring);outline-offset:2px}.prboard-callout{padding:var(--space-4);border-left:4px solid var(--color-accent);border-radius:var(--radius-md);background:var(--color-bg-subtle);margin-bottom:var(--space-5);color:var(--color-text);font-size:var(--font-size-sm);line-height:var(--line-height-normal)}.prboard-callout p{margin:var(--space-2) 0 0}.prboard-callout code{background:var(--color-bg-inset);font-family:var(--font-mono);border-radius:3px;padding:.2em .4em;font-size:.9em}.prboard-callout--info{border-left-color:var(--color-status-info)}.prboard-callout--warn{border-left-color:var(--color-status-warn)}.prboard-callout--error{border-left-color:var(--color-status-error);background:var(--color-status-error-bg)}.prboard-filter{padding:var(--space-3) var(--space-4);border:1px solid var(--color-border);border-radius:var(--radius-md) var(--radius-md) 0 0;background:var(--color-surface);border-bottom:none}.prboard-toggle-label{align-items:center;gap:var(--space-2);font-size:var(--font-size-sm);color:var(--color-text);cursor:pointer;-webkit-user-select:none;user-select:none;display:flex}.prboard-toggle-input{cursor:pointer;flex-shrink:0}.prboard-toggle-input:focus-visible{outline:2px solid var(--color-focus-ring);outline-offset:2px}.prboard-table-wrapper{border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-surface);overflow-x:auto}.prboard-table{border-collapse:collapse;width:100%;font-size:var(--font-size-sm)}.prboard-table caption{text-align:left;padding:var(--space-3) var(--space-4);color:var(--color-text-muted);font-size:var(--font-size-xs)}.prboard-table th{text-align:left;padding:var(--space-2) var(--space-4);border-bottom:2px solid var(--color-border);color:var(--color-text-muted);font-weight:var(--font-weight-bold);white-space:nowrap}.prboard-table td{padding:var(--space-3) var(--space-4);border-bottom:1px solid var(--color-border-subtle);color:var(--color-text);vertical-align:top}.prboard-table tbody tr:last-child td{border-bottom:none}.prboard-num{font-variant-numeric:tabular-nums;white-space:nowrap;font-weight:var(--font-weight-medium)}.prboard-branch-tag{border-radius:var(--radius-sm);background:var(--color-bg-inset);color:var(--color-text-muted);font-size:var(--font-size-xs);text-transform:uppercase;letter-spacing:.03em;padding:.1em .5em;display:inline-block}.prboard-title a{color:var(--color-accent);font-weight:var(--font-weight-medium);text-decoration:none}.prboard-title a:hover{text-decoration:underline}.prboard-title a:focus-visible{outline:2px solid var(--color-focus-ring);outline-offset:2px;border-radius:var(--radius-sm)}.prboard-draft-badge{color:var(--color-text-muted);font-size:var(--font-size-xs)}.prboard-branchcol code{font-family:var(--font-mono);font-size:var(--font-size-xs);color:var(--color-text-muted);word-break:break-all}.prboard-status{align-items:center;gap:var(--space-1);white-space:nowrap;font-weight:var(--font-weight-medium);display:inline-flex}.prboard-status-icon{font-size:.9em}.prboard-agecol{color:var(--color-text-muted);white-space:nowrap}.prboard-blocker{color:var(--color-status-warn)}@media (width<=768px){.view-prboard{padding:var(--space-3)}.prboard-table th,.prboard-table td{padding:var(--space-2) var(--space-3)}}:root{--color-bg:#fff;--color-bg-subtle:#f6f8fa;--color-bg-inset:#eff2f5;--color-surface:#fff;--color-border:#d0d7de;--color-border-subtle:#e4e8ec;--color-text:#1f2328;--color-text-muted:#59636e;--color-text-inverse:#fff;--color-accent:#0969da;--color-accent-emphasis:#0550ae;--color-status-ok:#1a7f37;--color-status-warn:#9a6700;--color-status-error:#cf222e;--color-status-info:#0969da;--color-status-neutral:#59636e;--color-status-ok-bg:#dafbe1;--color-status-warn-bg:#fff8c5;--color-status-error-bg:#ffebe9;--color-status-info-bg:#ddf4ff;--color-focus-ring:#0969da;--space-1:.25rem;--space-2:.5rem;--space-3:.75rem;--space-4:1rem;--space-5:1.5rem;--space-6:2rem;--space-7:3rem;--font-sans:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--font-mono:ui-monospace, SFMono-Regular, "Cascadia Mono", Consolas, "Liberation Mono", Menlo, monospace;--font-size-xs:.75rem;--font-size-sm:.875rem;--font-size-md:1rem;--font-size-lg:1.125rem;--font-size-xl:1.375rem;--line-height-tight:1.25;--line-height-normal:1.5;--font-weight-normal:400;--font-weight-medium:500;--font-weight-bold:600;--radius-sm:4px;--radius-md:6px;--radius-lg:10px;--shadow-sm:0 1px 2px #1f232814;--shadow-md:0 3px 8px #1f23281f;--header-height:3rem;--content-max-width:90rem;--transition-fast:.12s ease;--transition-normal:.2s ease;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}.text-status-ok{color:var(--color-status-ok)}.text-status-warn{color:var(--color-status-warn)}.text-status-error{color:var(--color-status-error)}.text-status-info{color:var(--color-status-info)}.text-status-neutral{color:var(--color-status-neutral)}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--color-bg:#0d1117;--color-bg-subtle:#161b22;--color-bg-inset:#010409;--color-surface:#161b22;--color-border:#30363d;--color-border-subtle:#21262d;--color-text:#e6edf3;--color-text-muted:#9198a1;--color-text-inverse:#0d1117;--color-accent:#4493f8;--color-accent-emphasis:#79b8ff;--color-status-ok:#3fb950;--color-status-warn:#d29922;--color-status-error:#f85149;--color-status-info:#58a6ff;--color-status-neutral:#9198a1;--color-status-ok-bg:#12261e;--color-status-warn-bg:#3d3a1f;--color-status-error-bg:#4a2028;--color-status-info-bg:#121d2f;--color-focus-ring:#58a6ff;--shadow-sm:0 1px 2px #01040999;--shadow-md:0 3px 8px #010409b3;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}}:root[data-theme=dark]{--color-bg:#0d1117;--color-bg-subtle:#161b22;--color-bg-inset:#010409;--color-surface:#161b22;--color-border:#30363d;--color-border-subtle:#21262d;--color-text:#e6edf3;--color-text-muted:#9198a1;--color-text-inverse:#0d1117;--color-accent:#4493f8;--color-accent-emphasis:#79b8ff;--color-status-ok:#3fb950;--color-status-warn:#d29922;--color-status-error:#f85149;--color-status-info:#58a6ff;--color-status-neutral:#9198a1;--color-status-ok-bg:#12261e;--color-status-warn-bg:#3d3a1f;--color-status-error-bg:#4a2028;--color-status-info-bg:#121d2f;--color-focus-ring:#58a6ff;--shadow-sm:0 1px 2px #01040999;--shadow-md:0 3px 8px #010409b3;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}*,:before,:after{box-sizing:border-box;margin:0;padding:0}html{-webkit-text-size-adjust:100%}body{font-family:var(--font-sans);font-size:var(--font-size-md);line-height:var(--line-height-normal);color:var(--color-text);background:var(--color-bg)}img,svg{max-width:100%;display:block}button,input,select,textarea{font:inherit;color:inherit}a{color:var(--color-accent)}:focus{outline:none}:focus-visible{outline:2px solid var(--color-focus-ring);outline-offset:2px;border-radius:var(--radius-sm)}.sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}.app-header{z-index:100;align-items:center;gap:var(--space-3);min-height:var(--header-height);padding:0 var(--space-4);background:var(--color-bg-subtle);border-bottom:1px solid var(--color-border);display:flex;position:sticky;top:0}.app-title{font-size:var(--font-size-md);font-weight:var(--font-weight-bold);white-space:nowrap}.app-nav{gap:var(--space-1);display:flex}.app-nav a{padding:var(--space-2) var(--space-3);color:var(--color-text-muted);font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);border-bottom:2px solid #0000;text-decoration:none;display:inline-block}.app-nav a[aria-current=page]{color:var(--color-text);border-bottom-color:var(--color-accent)}.app-nav a:hover{color:var(--color-text)}.app-main{max-width:var(--content-max-width);padding:var(--space-4);margin:0 auto}.view-placeholder{padding:var(--space-6);border:1px dashed var(--color-border);border-radius:var(--radius-md);color:var(--color-text-muted);text-align:center}.theme-toggle{padding:var(--space-1) var(--space-2);border:1px solid var(--color-border);border-radius:var(--radius-sm);cursor:pointer;font-size:var(--font-size-sm);color:var(--color-text-muted);background:0 0;margin-left:auto}.theme-toggle:hover{color:var(--color-text);background:var(--color-bg-inset)}.sse-status{font-size:var(--font-size-xs);font-weight:var(--font-weight-medium);padding:var(--space-1) var(--space-2);border-radius:var(--radius-sm);white-space:nowrap}.sse-status[data-status=live]{color:var(--color-status-ok);background:var(--color-status-ok-bg)}.sse-status[data-status=reconnecting]{color:var(--color-status-warn);background:var(--color-status-warn-bg)}.sse-status[data-status=error]{color:var(--color-status-error);background:var(--color-status-error-bg)}
|