@oeronteros-1/opencode-orchestra 1.0.28 → 1.0.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/README.md +79 -1
  2. package/dashboard-dist/assets/index-DXFxvVhJ.css +1 -0
  3. package/dashboard-dist/assets/index-DlLCX2BY.js +132 -0
  4. package/dashboard-dist/index.html +2 -2
  5. package/dist/agents/integrator.js +1 -1
  6. package/dist/agents/integrator.js.map +1 -1
  7. package/dist/agents/lead.js +2 -13
  8. package/dist/agents/lead.js.map +1 -1
  9. package/dist/config/load.d.ts +5 -0
  10. package/dist/config/load.js +20 -5
  11. package/dist/config/load.js.map +1 -1
  12. package/dist/diagnostics/doctor.js +194 -0
  13. package/dist/diagnostics/doctor.js.map +1 -1
  14. package/dist/diagnostics/update.js +8 -7
  15. package/dist/diagnostics/update.js.map +1 -1
  16. package/dist/index.js +21 -3
  17. package/dist/index.js.map +1 -1
  18. package/dist/orchestration/ownership.d.ts +19 -0
  19. package/dist/orchestration/ownership.js +26 -0
  20. package/dist/orchestration/ownership.js.map +1 -1
  21. package/dist/routing/classifier.js +20 -2
  22. package/dist/routing/classifier.js.map +1 -1
  23. package/dist/routing/fallback.d.ts +19 -10
  24. package/dist/routing/fallback.js +89 -18
  25. package/dist/routing/fallback.js.map +1 -1
  26. package/dist/routing/model-resolver.d.ts +47 -0
  27. package/dist/routing/model-resolver.js +110 -2
  28. package/dist/routing/model-resolver.js.map +1 -1
  29. package/dist/spawn.d.ts +14 -1
  30. package/dist/spawn.js +58 -4
  31. package/dist/spawn.js.map +1 -1
  32. package/dist/telemetry/ledger.d.ts +49 -0
  33. package/dist/telemetry/ledger.js +157 -0
  34. package/dist/telemetry/ledger.js.map +1 -1
  35. package/dist/tools.js +71 -3
  36. package/dist/tools.js.map +1 -1
  37. package/package.json +4 -4
  38. package/dashboard-dist/assets/index-BTleCKc7.js +0 -124
  39. package/dashboard-dist/assets/index-igZBUoKO.css +0 -2
package/README.md CHANGED
@@ -14,12 +14,21 @@
14
14
  - диагностика `doctor`, проверка обновлений и shell completion;
15
15
  - идемпотентная установка без удаления пользовательской OpenCode/MCP-конфигурации.
16
16
 
17
- Версия плагина — **1.0.25**. Полный контракт конфигурации описан в [schema/opencode-orchestra.schema.json](schema/opencode-orchestra.schema.json), рабочий пример — в [examples/.opencode/orchestra.jsonc](examples/.opencode/orchestra.jsonc).
17
+ Версия плагина — **1.0.27**. Полный контракт конфигурации описан в [schema/opencode-orchestra.schema.json](schema/opencode-orchestra.schema.json), рабочий пример — в [examples/.opencode/orchestra.jsonc](examples/.opencode/orchestra.jsonc).
18
18
 
19
19
  ## Что нового в 1.0.9–1.0.25
20
20
 
21
21
  Полноценные разделы с примерами для пользователей.
22
22
 
23
+ ### 1.0.29 — надёжность и прозрачная маршрутизация (next/unreleased)
24
+
25
+ - **Graceful degradation при невалидном `orchestra.jsonc`**: если глобальный или проектный конфиг не парсится либо не проходит валидацию схемы, плагин продолжает запуск на безопасных default-значениях, пишет один warning с путём к конфигу и sanitized-причиной и **не перезаписывает** файл. Обнаружение моделей, регистрация проектов, телеметрия и создание агентов/инструментов продолжаются как обычно.
26
+ - **Структурированная причина маршрутизации**: `orchestra_route` возвращает `routing.lead.model` вместе с машиночитаемым `routing.lead.reason` (`code`, `text`, `matchedCapabilities`, `score`, `budget`) и `routing.source` (`exact_override`, `manual_pool`, `auto_discovered`, `budget_exclusion`, `no_candidate`). `code` — стабильный идентификатор решения; `text` — диагностическая строка без секретов и промптов.
27
+ - **Политика ошибок и capability-aware fallback**: retryable-ошибки (rate-limit/429, timeout/408, provider 5xx/overloaded) переключают на следующий совместимый кандидат; terminal-ошибки (auth/401/403, invalid-request/400/404, неизвестная) останавливают цепочку. Альтернативы фильтруются по capability и бюджету и ранжируются детерминированно: compatibility → priority → tier → бюджетный класс стоимости → id. Плагин **не перехватывает** provider retry: цепочка `fallback.chains` передаётся только для dispatch-failover через `orch-lead`.
28
+ - **События надёжности (reliability events)**: ledger записывает sanitized-события `failed`/`retried` только из реально наблюдаемых попыток (модель, класс ошибки, следующая модель, номер попытки, исход). Сырой текст ошибки не сохраняется; список ограничен последними 100 событиями.
29
+ - **Routing-проверки `doctor`**: неразрушающие проверки для lead/judge/workers, точных overrides, дубликатов и неизвестных цен (предупреждение, никогда не `free`). Валидный частичный конфиг не считается ошибкой.
30
+ - **Карта конфликтов и сохранённые worktrees**: `orch-integrator` строит детерминированную cross-editor карту конфликтов (`editors`, `conflictingPaths`, `ownershipViolations`, `order`, `clean`), работает fail-closed при любом нарушении ownership/ancestry/git-конфликте и сохраняет worktrees для диагностики.
31
+
23
32
  ### 1.0.24–1.0.25 — параллельные редакторы и Windows-совместимость
24
33
 
25
34
  - **Параллельные редакторы**: `orchestration.parallelEditors` включает безопасный fan-out/fan-in для правок: каждый `orch-editor` работает в отдельном experimental Git worktree, а `orch-integrator` проверяет фактический diff и интегрирует коммиты в детерминированном порядке. При конфликте worktrees сохраняются для диагностики; `0` (по умолчанию) отключает режим.
@@ -254,6 +263,75 @@ bunx @oeronteros-1/opencode-orchestra@latest completion zsh > ~/.zsh/completions
254
263
 
255
264
  Resolver формирует упорядоченный список fallback-кандидатов из доступных пользователю моделей, предпочитая схожую стоимость и совместимые capabilities. Цепочка передаётся lead в поле `fallback`; execution-слой может переключиться на следующий кандидат при ошибке провайдера. Если текущая версия OpenCode не предоставляет provider-interception, сам плагин не перехватывает вызов и не обещает автоматический retry. Прогноз стоимости — информативное поле: выполнение не блокируется, а предупреждение помогает подтвердить расходы заранее.
256
265
 
266
+ ### Структурированная причина маршрутизации
267
+
268
+ `orchestra_route` возвращает `routing` с выбранной моделью lead и машиночитаемой причиной вместо необходимости разбирать прозу:
269
+
270
+ ```jsonc
271
+ {
272
+ "routing": {
273
+ "lead": {
274
+ "model": "anthropic/claude-sonnet-4-5",
275
+ "reason": {
276
+ "code": "capability_match",
277
+ "text": "id=anthropic/claude-sonnet-4-5 cost=subscription capability=explicit score=100",
278
+ "matchedCapabilities": ["reasoning"],
279
+ "score": 100,
280
+ "budget": "balanced"
281
+ }
282
+ },
283
+ "source": "manual_pool",
284
+ "budget": "balanced"
285
+ }
286
+ }
287
+ ```
288
+
289
+ - `code` — стабильный идентификатор решения: `frontier`, `preferred_tier`, `preferred_cost`, `capability_match`, `price`, `priority`, `exact_override`. Это машиночитаемый контракт; `text` — диагностическая строка, не являющаяся контрактом совместимости.
290
+ - `matchedCapabilities` — capability, по которым модель подошла (пусто для `exact_override`); `score` — итоговый скоринг победителя; `budget` — режим бюджета.
291
+ - `text` не содержит секретов, промптов, токенов и содержимого файлов.
292
+
293
+ `source` показывает происхождение выбора: `exact_override` (точное `models.agents["orch-lead"]`), `manual_pool` (ручной пул при `strategy: "manual"`), `auto_discovered` (автособранный пул подключённых моделей), `budget_exclusion` (пул заблокирован бюджетом/лимитом платных вызовов) и `no_candidate` (пул пуст — используется текущая модель OpenCode).
294
+
295
+ ### Политика ошибок
296
+
297
+ Ошибки классифицируются по policy-классам, а не по сырому тексту:
298
+
299
+ | Класс | Политика |
300
+ | --- | --- |
301
+ | Rate limit / 429 | переключиться на следующий совместимый кандидат |
302
+ | Timeout / 408 | переключиться на следующий совместимый кандидат |
303
+ | Provider 5xx / overloaded | переключиться на следующий совместимый кандидат |
304
+ | Auth / 401 / 403 | остановиться — ошибка конфигурации |
305
+ | Invalid request / 400 / 404 / unsupported capability | остановиться — ошибка маршрутизации или запроса |
306
+ | Неизвестная ошибка | остановиться, если явно не классифицирована как retryable |
307
+
308
+ Каждая последовательность ограничена максимальным числом попыток, не повторяет одну и ту же модель и сохраняет исходную ошибку. Лимиты платных вызовов остаются авторитетными.
309
+
310
+ ### Capability-aware fallback
311
+
312
+ Fallback-цепочка строится только из worker-пулов (`code`, `reasoning`, `research`, `vision`, `image`). Кандидаты фильтруются по budget-eligibility (платные исключаются при исчерпании лимита), а явно несовместимые с требуемой capability отсеиваются до выбора победителя. Неизвестные по capability модели остаются в цепочке, но ранжируются ниже. Альтернативы упорядочиваются детерминированно: compatibility → priority → tier → бюджетный класс стоимости → id. `fallback.chains` в ответе `orchestra_route` содержит `enabled`, `maxRetries` и усечённую до `maxRetries + 1` цепочку на каждую capability. Плагин не перехватывает вызовы провайдера: цепочка предназначена для безопасного dispatch-failover через `orch-lead`.
313
+
314
+ ### События надёжности
315
+
316
+ Там, где Orchestra может наблюдать выполнение, ledger записывает событие надёжности только из реально наблюдаемых попыток: `attempt`, `model`, `errorKind` (policy-класс, не сырой текст), `outcome` (`failed`/`retried`/`succeeded`), `nextModel` и `at`. Переход `retried` фиксируется только при последующей наблюдаемой попытке после retryable-ошибки; события ограничены последними 100, строки обрезаются, а неопознанные записи отбрасываются. Креды, промпты и тела ответов провайдера никогда не сохраняются. Если вызовы провайдера перехватить нельзя, эквивалентные policy-метаданные возвращаются в `orch-lead`, но фейковое событие выполнения не записывается.
317
+
318
+ ### Routing-проверки `doctor`
319
+
320
+ `doctor` добавляет неразрушающие routing-проверки с стабильными идентификаторами и severity:
321
+
322
+ - пустой пул роли — `info` («текущая модель OpenCode»);
323
+ - недоступный точный agent override или невалидный формат `provider/model` — `warning`;
324
+ - роль без совместимого кандидата или заблокированная бюджетом — `warning`;
325
+ - дубликаты кандидатов — `warning`;
326
+ - неизвестная цена победителя — `warning` (никогда не трактуется как `free`);
327
+ - валидный частичный конфиг (пустые пулы, отсутствующие секции) не считается ошибкой и не блокирует запуск.
328
+
329
+ Проверки не изменяют файлы конфигурации.
330
+
331
+ ### Карта конфликтов и сохранённые worktrees
332
+
333
+ Перед интеграцией `orch-integrator` выводит фактические изменённые пути из git и строит cross-editor карту конфликтов: `editors` (id, commit, изменённые пути, ownership-нарушения), `conflictingPaths` (пути, затронутые более чем одним редактором), `ownershipViolations`, детерминированный `order` интеграции и флаг `clean`. Любое нарушение ownership, провал ancestry-проверки или git-конфликт останавливает автоматическую интеграцию — интегратор интегрирует всё или ничего и **сохраняет worktrees** для диагностики. Чистый текстовый merge не считается доказательством семантической корректности.
334
+
257
335
  ## Агенты и команды
258
336
 
259
337
  Плагин добавляет один публичный primary-агент `orch-lead`, скрытых workers, скрытый reduce-агент `orch-merge` и скрытый `orch-judge`. Workers не могут редактировать файлы или делегировать работу дальше; lead может вызывать только агентов Orchestra, после чего сам реализует изменения и проверяет результат.
@@ -0,0 +1 @@
1
+ @import "https://fonts.googleapis.com/css2?family=Geist:wght@300;400;500;600;700;800&family=JetBrains+Mono:wght@400;500;600&display=swap";@layer components;@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-violet-400:oklch(70.2% .183 293.541);--color-violet-500:oklch(60.6% .25 292.717);--color-violet-600:oklch(54.1% .281 293.009);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-700:oklch(37% .013 285.805);--color-white:#fff;--spacing:.25rem;--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--font-weight-semibold:600;--radius-xl:.75rem;--radius-2xl:1rem;--shadow-lg:0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;--ease-out:cubic-bezier(0, 0, .2, 1);--blur-xl:24px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer utilities{.pointer-events-none{pointer-events:none}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.-top-\[200px\]{top:-200px}.-right-\[100px\]{right:-100px}.-bottom-\[150px\]{bottom:-150px}.-left-\[100px\]{left:-100px}.block{display:block}.inline-flex{display:inline-flex}.table{display:table}.table-row{display:table-row}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-10{height:calc(var(--spacing) * 10)}.h-\[500px\]{height:500px}.h-\[600px\]{height:600px}.w-11{width:calc(var(--spacing) * 11)}.w-\[500px\]{width:500px}.w-\[600px\]{width:600px}.translate-x-0\.5{--tw-translate-x:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-\[shimmer_3s_ease-in-out_infinite\]{animation:3s ease-in-out infinite shimmer}.items-center{align-items:center}.justify-center{justify-content:center}.gap-2{gap:calc(var(--spacing) * 2)}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:2147483647px}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-white\/\[0\.1\]{border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.border-white\/\[0\.1\]{border-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.border-white\/\[0\.06\]{border-color:#ffffff0f}@supports (color:color-mix(in lab, red, red)){.border-white\/\[0\.06\]{border-color:color-mix(in oklab, var(--color-white) 6%, transparent)}}.bg-\[rgba\(12\,15\,22\,0\.75\)\]{background-color:#0c0f16bf}.bg-white{background-color:var(--color-white)}.bg-white\/\[0\.03\]{background-color:#ffffff08}@supports (color:color-mix(in lab, red, red)){.bg-white\/\[0\.03\]{background-color:color-mix(in oklab, var(--color-white) 3%, transparent)}}.bg-zinc-700\/50{background-color:#3f3f4680}@supports (color:color-mix(in lab, red, red)){.bg-zinc-700\/50{background-color:color-mix(in oklab, var(--color-zinc-700) 50%, transparent)}}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-transparent{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-violet-600{--tw-gradient-from:var(--color-violet-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.via-white\/\[0\.03\]{--tw-gradient-via:#ffffff08}@supports (color:color-mix(in lab, red, red)){.via-white\/\[0\.03\]{--tw-gradient-via:color-mix(in oklab, var(--color-white) 3%, transparent)}}.via-white\/\[0\.03\]{--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-violet-500{--tw-gradient-to:var(--color-violet-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.bg-\[length\:200\%_100\%\]{background-size:200% 100%}.px-4{padding-inline:calc(var(--spacing) * 4)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.text-white{color:var(--color-white)}.text-zinc-200{color:var(--color-zinc-200)}.text-zinc-400{color:var(--color-zinc-400)}.opacity-0{opacity:0}.shadow-\[0_4px_16px_rgba\(139\,92\,246\,0\.3\)\]{--tw-shadow:0 4px 16px var(--tw-shadow-color,#8b5cf64d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_8px_32px_rgba\(0\,0\,0\,0\.3\)\]{--tw-shadow:0 8px 32px var(--tw-shadow-color,#0000004d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}@media (hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}.hover\:translate-y-\[-1px\]:hover{--tw-translate-y:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:border-white\/\[0\.1\]:hover{border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.hover\:border-white\/\[0\.1\]:hover{border-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.hover\:border-white\/\[0\.15\]:hover{border-color:#ffffff26}@supports (color:color-mix(in lab, red, red)){.hover\:border-white\/\[0\.15\]:hover{border-color:color-mix(in oklab, var(--color-white) 15%, transparent)}}.hover\:bg-white\/\[0\.06\]:hover{background-color:#ffffff0f}@supports (color:color-mix(in lab, red, red)){.hover\:bg-white\/\[0\.06\]:hover{background-color:color-mix(in oklab, var(--color-white) 6%, transparent)}}.hover\:bg-white\/\[0\.07\]:hover{background-color:#ffffff12}@supports (color:color-mix(in lab, red, red)){.hover\:bg-white\/\[0\.07\]:hover{background-color:color-mix(in oklab, var(--color-white) 7.0%, transparent)}}.hover\:from-violet-500:hover{--tw-gradient-from:var(--color-violet-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.hover\:to-violet-400:hover{--tw-gradient-to:var(--color-violet-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.hover\:text-white:hover{color:var(--color-white)}.hover\:shadow-\[0_2px_8px_rgba\(0\,0\,0\,0\.15\)\]:hover{--tw-shadow:0 2px 8px var(--tw-shadow-color,#00000026);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.hover\:shadow-\[0_4px_16px_rgba\(0\,0\,0\,0\.2\)\]:hover{--tw-shadow:0 4px 16px var(--tw-shadow-color,#0003);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.hover\:shadow-\[0_8px_24px_rgba\(139\,92\,246\,0\.4\)\]:hover{--tw-shadow:0 8px 24px var(--tw-shadow-color,#8b5cf666);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.hover\:shadow-\[0_16px_64px_rgba\(0\,0\,0\,0\.4\)\]:hover{--tw-shadow:0 16px 64px var(--tw-shadow-color,#0006);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-violet-400:focus-visible{--tw-ring-color:var(--color-violet-400)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:ring-offset-transparent:focus-visible{--tw-ring-offset-color:transparent}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.active\:translate-y-0:active{--tw-translate-y:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.active\:shadow-\[0_2px_8px_rgba\(139\,92\,246\,0\.3\)\]:active{--tw-shadow:0 2px 8px var(--tw-shadow-color,#8b5cf64d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-50:disabled{opacity:.5}.data-\[checked\]\:translate-x-\[22px\][data-checked]{--tw-translate-x:22px;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[checked\]\:border-violet-500\/30[data-checked]{border-color:#8d54ff4d}@supports (color:color-mix(in lab, red, red)){.data-\[checked\]\:border-violet-500\/30[data-checked]{border-color:color-mix(in oklab, var(--color-violet-500) 30%, transparent)}}.data-\[checked\]\:bg-gradient-to-r[data-checked]{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.data-\[checked\]\:from-violet-600[data-checked]{--tw-gradient-from:var(--color-violet-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.data-\[checked\]\:to-violet-500[data-checked]{--tw-gradient-to:var(--color-violet-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.data-\[checked\]\:shadow-\[0_0_16px_rgba\(139\,92\,246\,0\.3\)\][data-checked]{--tw-shadow:0 0 16px var(--tw-shadow-color,#8b5cf64d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.data-\[checked\]\:shadow-\[0_2px_8px_rgba\(0\,0\,0\,0\.3\)\][data-checked]{--tw-shadow:0 2px 8px var(--tw-shadow-color,#0000004d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}@media (hover:hover){.data-\[checked\]\:hover\:border-violet-400\/40[data-checked]:hover{border-color:#a685ff66}@supports (color:color-mix(in lab, red, red)){.data-\[checked\]\:hover\:border-violet-400\/40[data-checked]:hover{border-color:color-mix(in oklab, var(--color-violet-400) 40%, transparent)}}}}:root{--font-sans:"Geist", ui-sans-serif, system-ui, -apple-system, sans-serif;--font-mono:"JetBrains Mono", ui-monospace, monospace;--bg-primary:#06080d;--bg-secondary:#0a0d14;--bg-tertiary:#0f1219;--bg-card:#0c0f16bf;--bg-card-hover:#10141ed9;--bg-glass:#ffffff08;--bg-glass-hover:#ffffff0f;--border-subtle:#ffffff0f;--border-medium:#ffffff1a;--border-accent:#8b5cf64d;--text-primary:#f4f4f5;--text-secondary:#a1a1aa;--text-tertiary:#71717a;--text-muted:#52525b;--accent-violet:#8b5cf6;--accent-violet-light:#a78bfa;--accent-violet-dark:#6d28d9;--accent-cyan:#22d3ee;--accent-emerald:#34d399;--accent-amber:#f59e0b;--accent-rose:#f43f5e;--shadow-sm:0 2px 8px #0000004d;--shadow-md:0 8px 32px #0006;--shadow-lg:0 16px 64px #00000080;--shadow-glow-violet:0 0 20px #8b5cf626;--shadow-glow-cyan:0 0 20px #22d3ee26;color:var(--text-primary);background:var(--bg-primary);font-family:var(--font-sans);font-synthesis:none;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}*{box-sizing:border-box}body{background:radial-gradient(ellipse 80% 50% at 50% -20%, #8b5cf61f, transparent), radial-gradient(ellipse 60% 40% at 80% 50%, #22d3ee0f, transparent), radial-gradient(ellipse 50% 30% at 20% 80%, #8b5cf614, transparent), var(--bg-primary);min-width:320px;min-height:100vh;margin:0}button,input,select{font:inherit}button{cursor:pointer}@keyframes mesh-float{0%,to{transform:translate(0)scale(1)}25%{transform:translate(2%,-3%)scale(1.02)}50%{transform:translate(-1%,2%)scale(.98)}75%{transform:translate(3%,1%)scale(1.01)}}@keyframes mesh-opacity{0%,to{opacity:.6}50%{opacity:1}}.mesh-bg{z-index:-1;pointer-events:none;position:fixed;inset:0;overflow:hidden}.mesh-bg:before,.mesh-bg:after{content:"";filter:blur(80px);border-radius:50%;animation:20s ease-in-out infinite mesh-float;position:absolute}.mesh-bg:before{background:radial-gradient(circle,#8b5cf626,#0000 70%);width:600px;height:600px;animation-delay:-5s;top:-200px;right:-100px}.mesh-bg:after{background:radial-gradient(circle,#22d3ee1a,#0000 70%);width:500px;height:500px;animation-delay:-10s;bottom:-150px;left:-100px}.app-shell{grid-template-columns:260px minmax(0,1fr);min-height:100vh;display:grid}.sidebar{border-right:1px solid var(--border-subtle);-webkit-backdrop-filter:blur(24px)saturate(1.2);backdrop-filter:blur(24px)saturate(1.2);z-index:10;background:#080a0fd9;flex-direction:column;height:100vh;padding:28px 18px 24px;transition:background .3s;display:flex;position:sticky;top:0}.brand{align-items:center;gap:14px;padding:0 10px 32px;display:flex}.brand strong,.brand small{letter-spacing:.18em;display:block}.brand strong{font-size:14px;font-weight:700}.brand small{color:var(--text-tertiary);margin-top:4px;font-size:9px;font-weight:500}.brand-mark{color:#fff;background:linear-gradient(145deg, var(--accent-violet), var(--accent-violet-dark));border-radius:12px;justify-content:center;align-items:end;gap:3px;width:36px;height:36px;padding:8px;transition:transform .3s,box-shadow .3s;display:flex;box-shadow:0 8px 32px #8b5cf64d,inset 0 1px #ffffff26}.brand-mark:hover{transform:scale(1.05);box-shadow:0 12px 40px #8b5cf666,inset 0 1px #fff3}.brand-mark span{background:currentColor;border-radius:2px;width:3px;transition:height .3s;display:block}.brand-mark span:first-child{opacity:.65;height:8px}.brand-mark span:nth-child(2){height:17px}.brand-mark span:nth-child(3){opacity:.8;height:12px}nav{gap:4px;display:grid}.nav-link{height:44px;color:var(--text-tertiary);border-radius:12px;align-items:center;gap:14px;padding:0 14px;font-size:13px;font-weight:550;text-decoration:none;transition:all .2s;display:flex;position:relative}.nav-link:hover{color:var(--text-primary);background:var(--bg-glass-hover)}.nav-link.active{color:#fff;box-shadow:var(--shadow-glow-violet);background:#8b5cf61f}.nav-link.active:before{content:"";background:linear-gradient(180deg, var(--accent-violet), var(--accent-cyan));border-radius:2px;width:3px;height:24px;position:absolute;left:-18px;box-shadow:0 0 16px #8b5cf699}.sidebar-foot{border-top:1px solid var(--border-subtle);margin-top:auto;padding:18px 12px 0}.local-chip{color:var(--text-secondary);letter-spacing:.16em;text-transform:uppercase;align-items:center;gap:8px;font-size:10px;font-weight:700;display:flex}.project-name{color:var(--text-tertiary);white-space:nowrap;text-overflow:ellipsis;margin-top:8px;font-size:11px;overflow:hidden}.status-dot{background:var(--accent-emerald);border-radius:50%;flex:none;width:8px;height:8px;animation:2s ease-in-out infinite pulse-glow;box-shadow:0 0 12px #34d39999}.status-dot.off{background:var(--text-muted);box-shadow:none;animation:none}@keyframes pulse-glow{0%,to{box-shadow:0 0 12px #34d39999}50%{box-shadow:0 0 20px #34d399e6}}.main-panel{min-width:0}.topbar{border-bottom:1px solid var(--border-subtle);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);z-index:5;background:#06080d99;justify-content:space-between;align-items:center;height:72px;padding:0 4vw;display:flex;position:sticky;top:0}.top-actions{align-items:center;gap:6px;display:flex}.eyebrow{color:var(--text-muted);letter-spacing:.18em;text-transform:uppercase;font-size:9px;font-weight:700;line-height:1.4}.topbar .eyebrow{white-space:nowrap;text-overflow:ellipsis;max-width:60vw;display:block;overflow:hidden}.topbar>div:first-child{align-items:center;gap:14px;min-width:0;display:flex}.project-select{border:1px solid var(--border-medium);max-width:260px;height:36px;color:var(--text-primary);background:var(--bg-tertiary);border-radius:10px;outline:none;padding:0 32px 0 12px;transition:all .2s}.project-select:focus{border-color:var(--accent-violet);box-shadow:0 0 0 3px #8b5cf626}.content{max-width:1520px;margin:0 auto;padding:48px 4vw 80px}.page-intro{margin-bottom:36px}.page-intro h1{letter-spacing:-.045em;background:linear-gradient(135deg, var(--text-primary) 0%, var(--text-secondary) 100%);-webkit-text-fill-color:transparent;-webkit-background-clip:text;background-clip:text;margin:10px 0;font-size:clamp(30px,3.2vw,48px);font-weight:700;line-height:1.05}.page-intro p{max-width:640px;color:var(--text-tertiary);margin:0;font-size:14px;line-height:1.65}h2{letter-spacing:-.02em;margin:5px 0 0;font-size:16px;font-weight:600}.metrics-grid{grid-template-columns:repeat(4,minmax(0,1fr));gap:16px;margin-bottom:18px;display:grid}.insight-banner{background:var(--bg-card);border:1px solid var(--border-subtle);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);border-radius:16px;flex-wrap:wrap;align-items:center;gap:36px;margin-bottom:18px;padding:20px 26px;display:flex}.insight-banner>div{gap:3px;display:grid}.insight-banner .eyebrow{color:var(--text-muted)}.insight-banner strong{letter-spacing:-.035em;font-size:22px}.insight-banner small{color:var(--text-muted);font-size:11px}.metric-card{background:var(--bg-card);border:1px solid var(--border-subtle);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);border-radius:16px;grid-template-columns:1fr auto;align-items:center;min-height:168px;padding:24px;transition:all .3s;display:grid;position:relative;overflow:hidden}.metric-card:before{content:"";opacity:0;background:linear-gradient(90deg,#0000,#8b5cf64d,#0000);height:1px;transition:opacity .3s;position:absolute;top:0;left:0;right:0}.metric-card:hover{border-color:var(--border-accent);background:var(--bg-card-hover);box-shadow:var(--shadow-glow-violet);transform:translateY(-2px)}.metric-card:hover:before{opacity:1}.metric-card>span{color:var(--text-muted);letter-spacing:.08em;text-transform:uppercase;font-size:11px;font-weight:650}.metric-card strong{letter-spacing:-.05em;grid-column:1/-1;font-size:clamp(28px,2.6vw,40px);font-weight:700}.metric-card small{color:var(--text-muted);grid-column:1/-1;font-size:11px}.metric-icon{width:40px;height:40px;color:var(--accent-violet-light);box-shadow:var(--shadow-glow-violet);background:#8b5cf61f;border-radius:12px;place-items:center;transition:all .3s;display:grid}.metric-card:hover .metric-icon{background:#8b5cf633;transform:scale(1.05)}.dashboard-grid{grid-template-columns:minmax(0,2fr) minmax(280px,1fr);gap:16px;margin-bottom:18px;display:grid}.chart-card,.mcp-card,.list-card,.ranking-card,.settings-card{background:var(--bg-card);border:1px solid var(--border-subtle);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);border-radius:16px;padding:26px;transition:all .3s}.chart-card:hover,.mcp-card:hover,.list-card:hover,.ranking-card:hover{border-color:var(--border-medium)}.card-heading{justify-content:space-between;align-items:start;margin-bottom:24px;display:flex}.updated{color:var(--text-muted);font-size:10px}.chart-wrap{height:280px;margin:4px -4px -8px -16px;font-size:10px}.chart-controls{align-items:center;gap:14px;display:flex}.chart-controls select{border:1px solid var(--border-medium);height:32px;color:var(--text-secondary);background:var(--bg-tertiary);border-radius:9px;padding:0 10px;transition:all .2s}.chart-controls select:focus{border-color:var(--accent-violet);box-shadow:0 0 0 3px #8b5cf626}.mcp-list{margin-top:24px;display:grid}.mcp-list>div{border-top:1px solid var(--border-subtle);grid-template-columns:auto 1fr auto;align-items:center;gap:12px;min-height:54px;font-size:12px;transition:background .2s;display:grid}.mcp-list>div:hover{background:var(--bg-glass)}.mcp-list small{color:var(--text-muted);font-size:10px}.project-list{margin-top:18px;display:grid}.project-list button{border:0;border-top:1px solid var(--border-subtle);min-height:58px;color:var(--text-secondary);text-align:left;background:0 0;grid-template-columns:minmax(0,1fr) auto auto;align-items:center;gap:14px;padding:10px 0;transition:all .2s;display:grid}.project-list button:hover{background:var(--bg-glass)}.project-list button:hover strong{color:var(--accent-violet-light)}.project-list strong,.project-list small{text-overflow:ellipsis;white-space:nowrap;display:block;overflow:hidden}.project-list strong{color:var(--text-primary);font-size:12px}.project-list small{color:var(--text-muted);margin-top:4px;font-size:9px}.text-link{color:var(--accent-violet-light);font-size:11px;text-decoration:none;transition:color .2s}.text-link:hover{color:var(--accent-violet)}.recent-list>div{border-top:1px solid var(--border-subtle);min-height:60px;color:var(--text-secondary);grid-template-columns:100px minmax(0,1fr) 110px 90px;align-items:center;gap:16px;padding:0 4px;font-size:11px;transition:background .2s;display:grid}.recent-list>div:hover{background:var(--bg-glass)}.recent-list strong,.recent-list small{display:block}.recent-list strong{color:var(--text-primary);font-size:12px;font-weight:550}.recent-list small{color:var(--text-muted);margin-top:4px;font-size:10px}.agent-badge{color:var(--accent-violet-light);letter-spacing:.02em;background:#8b5cf614;border:1px solid #8b5cf633;border-radius:8px;justify-self:start;padding:5px 10px;font-size:10px;font-weight:600;transition:all .2s}.agent-badge:hover{background:#8b5cf626;border-color:#8b5cf659}.empty-state{min-height:200px;color:var(--text-muted);justify-content:center;align-items:center;gap:12px;font-size:12px;display:flex}.table-card{overflow:hidden}.virtual-table{min-width:0}.table-head,.table-row{align-items:center;min-width:940px;display:flex}.table-head{border-bottom:1px solid var(--border-medium);height:48px;color:var(--text-muted);letter-spacing:.12em;text-transform:uppercase;font-size:9px;font-weight:700}.table-head>div,.table-row>div{text-overflow:ellipsis;white-space:nowrap;flex:none;padding:0 16px;overflow:hidden}.table-scroll{height:min(65vh,650px);overflow:auto}.table-row{border-bottom:1px solid var(--border-subtle);min-height:48px;color:var(--text-secondary);font-size:11px;transition:all .2s;position:absolute;inset-inline:0}.table-row:hover{background:var(--bg-glass-hover)}.ranking-list>div{border-top:1px solid var(--border-subtle);min-height:70px;color:var(--text-secondary);grid-template-columns:46px minmax(240px,1fr) 100px 110px 100px;align-items:center;gap:18px;padding:0 4px;font-size:11px;transition:all .2s;display:grid}.ranking-list>div:first-child{border-top:0}.ranking-list>div:hover{background:var(--bg-glass)}.rank{color:var(--text-muted);font-variant-numeric:tabular-nums;font-weight:600}.rank-main strong{color:var(--text-primary);font-size:12px;font-weight:550}.usage-bar{background:#ffffff0f;border-radius:3px;width:100%;max-width:420px;height:3px;margin-top:12px;overflow:hidden}.usage-bar span{background:linear-gradient(90deg, var(--accent-violet), var(--accent-cyan));border-radius:3px;height:100%;display:block;box-shadow:0 0 8px #8b5cf666}.settings-stack{gap:16px;display:grid}.setting-title{justify-content:space-between;align-items:start;gap:24px;margin-bottom:24px;display:flex}.setting-title h2,.inline-setting h2{margin:0 0 6px}.setting-title p,.inline-setting p{color:var(--text-tertiary);margin:0;font-size:12px;line-height:1.55}.setting-title select{border:1px solid var(--border-medium);min-width:130px;height:38px;color:var(--text-primary);background:var(--bg-tertiary);border-radius:10px;outline:none;padding:0 34px 0 14px;transition:all .2s}.setting-title select:focus{border-color:var(--accent-violet);box-shadow:0 0 0 3px #8b5cf626}.budget-grid{grid-template-columns:repeat(4,1fr);gap:12px;display:grid}.budget-option{border:1px solid var(--border-subtle);min-height:100px;color:var(--text-secondary);background:var(--bg-glass);text-align:left;border-radius:14px;padding:16px;transition:all .25s}.budget-option strong,.budget-option span{display:block}.budget-option strong{color:var(--text-primary);text-transform:uppercase;font-size:13px;font-weight:600}.budget-option span{margin-top:8px;font-size:10px;line-height:1.45}.budget-option:hover,.budget-option.selected{border-color:var(--border-accent);box-shadow:var(--shadow-glow-violet);background:#8b5cf61a}.budget-option.selected strong{color:var(--accent-violet-light)}.model-empty{color:#d6b86f;background:#fbbf240f;border:1px solid #fbbf2433;border-radius:12px;margin:-8px 0 18px;padding:14px 16px;font-size:12px;line-height:1.55}.model-empty code{color:#fde68a;font-family:var(--font-mono)}.agent-model-list{border:1px solid var(--border-subtle);border-radius:16px;overflow:hidden}.agent-model-row{border-bottom:1px solid var(--border-subtle);grid-template-columns:minmax(240px,.8fr) minmax(300px,1.2fr);align-items:center;gap:28px;min-height:78px;padding:14px 18px;transition:background .2s;display:grid}.agent-model-row:last-child{border-bottom:0}.agent-model-row:hover{background:var(--bg-glass)}.agent-identity strong,.agent-identity span,.agent-identity small{display:block}.agent-identity strong{color:var(--text-primary);font-size:13px}.agent-identity span{color:var(--text-secondary);margin-top:4px;font-size:11px}.agent-identity small{color:var(--text-muted);letter-spacing:.04em;font-size:9px;font-family:var(--font-mono);margin-top:6px}.agent-model-row select{border:1px solid var(--border-subtle);width:100%;height:44px;color:var(--text-primary);background:var(--bg-tertiary);text-overflow:ellipsis;border-radius:11px;outline:none;padding:0 38px 0 14px;transition:all .2s;overflow:hidden}.agent-model-row select:focus{border-color:var(--accent-violet);box-shadow:0 0 0 3px #8b5cf626}.inline-setting{justify-content:space-between;align-items:center;gap:28px;display:flex}.form-actions{color:var(--text-muted);justify-content:space-between;align-items:center;gap:18px;font-size:10px;display:flex}.settings-fields{grid-template-columns:repeat(3,minmax(0,1fr));gap:16px;display:grid}.settings-fields label{color:var(--text-secondary);gap:7px;font-size:11px;display:grid}.settings-fields input{border:1px solid var(--border-subtle);height:40px;color:var(--text-primary);background:var(--bg-tertiary);border-radius:10px;outline:none;padding:0 12px;transition:all .2s}.settings-fields input:focus{border-color:var(--accent-violet);box-shadow:0 0 0 3px #8b5cf626}.check-setting{grid-template-columns:1fr auto;align-items:center}.settings-field{max-width:240px;color:var(--text-secondary);gap:7px;font-size:11px;display:grid}.settings-field input{border:1px solid var(--border-subtle);height:40px;color:var(--text-primary);background:var(--bg-tertiary);border-radius:10px;padding:0 12px}.form-actions>span{white-space:nowrap;text-overflow:ellipsis;max-width:65%;overflow:hidden}.loading,.error-state{min-height:55vh;color:var(--text-tertiary);justify-content:center;align-items:center;gap:12px;font-size:12px;display:flex}.error-state{color:var(--accent-rose)}.spin{animation:1s linear infinite spin}@keyframes spin{to{transform:rotate(360deg)}}.export-menu{position:relative}.export-scrim{z-index:40;cursor:default;background:0 0;border:0;position:fixed;inset:0}.export-panel{z-index:50;border:1px solid var(--border-medium);background:var(--bg-tertiary);-webkit-backdrop-filter:blur(24px);backdrop-filter:blur(24px);width:280px;box-shadow:var(--shadow-lg);border-radius:16px;padding:14px;position:absolute;top:calc(100% + 10px);right:0}.export-head{justify-content:space-between;align-items:center;margin-bottom:12px;padding:0 4px;display:flex}.export-close{color:var(--text-tertiary);background:0 0;border:0;font-size:20px;line-height:1;transition:color .2s}.export-close:hover{color:var(--text-primary)}.export-list{gap:3px;display:grid}.export-item{border-radius:10px;justify-content:space-between;align-items:center;gap:12px;padding:8px 6px;transition:background .2s;display:flex}.export-item:hover{background:var(--bg-glass-hover)}.export-item-label{color:var(--text-primary);font-size:12px}.export-item-actions{gap:6px;display:flex}.export-item-actions .inline-flex{letter-spacing:.06em;height:28px;padding:0 10px;font-size:10px;font-weight:700}.export-error{color:var(--accent-rose);border:1px solid #f8717140;border-radius:10px;margin-top:12px;padding:10px 12px;font-size:11px}.live-card{padding:26px}.live-state{color:var(--text-muted);align-items:center;gap:8px;font-size:11px;font-weight:600;display:inline-flex}.live-state.active{color:var(--accent-emerald)}.live-state.off{color:var(--text-tertiary)}.live-state .status-dot{background:var(--text-muted);width:9px;height:9px}.live-state.active .status-dot{background:var(--accent-emerald);animation:1.6s ease-in-out infinite live-pulse}@keyframes live-pulse{0%,to{opacity:1;box-shadow:0 0 12px #34d39999}50%{opacity:.4;box-shadow:0 0 20px #34d399e6}}.live-list{gap:12px;margin-top:6px;display:grid}.live-row{background:#8b5cf60d;border:1px solid #8b5cf62e;border-radius:14px;grid-template-columns:100px minmax(0,1fr) 90px;align-items:start;gap:16px;padding:14px;transition:all .3s;display:grid}.live-row:hover{box-shadow:var(--shadow-glow-violet);background:#8b5cf614;border-color:#8b5cf64d}.live-body{min-width:0}.live-meta{align-items:baseline;gap:12px;display:flex}.live-meta strong{color:var(--text-primary);font-size:13px;font-weight:600}.live-meta span{color:var(--text-muted);font-size:10px}.live-snippet{color:var(--text-secondary);max-width:100ch;margin:8px 0 0;font-size:12px;line-height:1.55}.live-stats{color:var(--text-muted);gap:14px;margin-top:8px;font-size:10px;display:flex}.live-warn{color:var(--accent-amber);cursor:help}.live-cost{color:var(--accent-violet-light);white-space:nowrap;justify-self:end;font-size:13px;font-weight:600}.live-total{color:var(--text-muted);grid-template-columns:1fr auto 1fr;align-items:baseline;gap:12px;padding:14px 6px 0;font-size:10px;display:grid}.live-total strong{color:var(--text-primary);text-align:right;font-size:13px;font-weight:600}.live-card .empty-state{min-height:120px}.live-card .agent-badge{justify-self:start}@keyframes shimmer{0%{background-position:-200% 0}to{background-position:200% 0}}.shimmer{background:linear-gradient(90deg,#0000 0%,#ffffff0a 50%,#0000 100%) 0 0/200% 100%;animation:3s ease-in-out infinite shimmer}@keyframes float{0%,to{transform:translateY(0)}50%{transform:translateY(-6px)}}.float-animation{animation:6s ease-in-out infinite float}html.light{--bg-primary:#f8f9fb;--bg-secondary:#f0f1f4;--bg-tertiary:#e8e9ed;--bg-card:#ffffffd9;--bg-card-hover:#fffffff2;--bg-glass:#00000005;--bg-glass-hover:#0000000a;--border-subtle:#0000000f;--border-medium:#0000001a;--border-accent:#8b5cf640;--text-primary:#18181b;--text-secondary:#52525b;--text-tertiary:#71717a;--text-muted:#a1a1aa;--shadow-sm:0 2px 8px #00000014;--shadow-md:0 8px 32px #0000001f;--shadow-lg:0 16px 64px #00000029;--shadow-glow-violet:0 0 20px #8b5cf61a;--shadow-glow-cyan:0 0 20px #22d3ee1a;color:var(--text-primary);background:var(--bg-primary)}html.light body{background:radial-gradient(ellipse 80% 50% at 50% -20%, #8b5cf614, transparent), radial-gradient(ellipse 60% 40% at 80% 50%, #22d3ee0a, transparent), var(--bg-primary)}html.light .sidebar{border-color:var(--border-subtle);background:#ffffffe0}html.light .nav-link{color:var(--text-tertiary)}html.light .nav-link.active{color:var(--accent-violet-dark)}html.light .topbar{border-color:var(--border-subtle);background:#f8f9fbb3}html.light .page-intro p,html.light .setting-title p,html.light .inline-setting p{color:var(--text-tertiary)}html.light h1,html.light h2,html.light .metric-card strong,html.light .recent-list strong,html.light .rank-main strong{color:var(--text-primary)}html.light .table-row,html.light .recent-list>div,html.light .ranking-list>div,html.light .mcp-list>div{border-color:var(--border-subtle)}html.light .live-row{background:#8b5cf60a;border-color:#8b5cf626}html.light .live-meta strong,html.light .live-total strong{color:var(--text-primary)}html.light .live-snippet{color:var(--text-secondary)}html.light .export-panel{border-color:var(--border-subtle);background:#fffffff2}html.light .export-item:hover{background:var(--bg-glass)}html.light .export-item-label{color:var(--text-primary)}html.light .export-close{color:var(--text-tertiary)}html.light .export-close:hover{color:var(--text-primary)}@media (width<=1000px){.metrics-grid{grid-template-columns:repeat(2,1fr)}.dashboard-grid{grid-template-columns:1fr}.budget-grid{grid-template-columns:repeat(2,1fr)}}@media (width<=720px){.settings-fields{grid-template-columns:1fr}.app-shell{display:block}.sidebar{border:0;border-top:1px solid var(--border-subtle);width:100%;height:70px;padding:8px 12px;position:fixed;inset:auto 0 0}.brand,.sidebar-foot{display:none}.sidebar nav{justify-content:space-around;display:flex}.nav-link{flex-direction:column;justify-content:center;gap:3px;width:60px;height:52px;padding:0;font-size:9px}.nav-link.active:before{display:none}.topbar{height:60px;padding:0 18px}.content{padding:32px 18px 110px}.metrics-grid{grid-template-columns:1fr 1fr}.metric-card{min-height:145px;padding:18px}.recent-list>div{grid-template-columns:80px minmax(0,1fr) 80px}.recent-list>div>span:last-child{display:none}.agent-model-row{grid-template-columns:1fr;gap:12px;padding:16px}.ranking-list>div{grid-template-columns:34px minmax(160px,1fr) 90px}.ranking-list>div>span:nth-last-child(-n+2){display:none}.form-actions{flex-direction:column;align-items:stretch}.form-actions>span{max-width:100%}.form-actions button{width:100%}}@media (width<=470px){.metrics-grid{grid-template-columns:1fr}.budget-grid{grid-template-columns:1fr 1fr}.page-intro h1{font-size:32px}.mcp-list small{display:none}.mcp-list>div{grid-template-columns:auto 1fr}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}