@oeronteros-1/opencode-orchestra 1.0.15 → 1.0.16

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/README.md CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
  ### 1.0.13 — первичный агент и стабильность
24
24
 
25
- - **Первичный агент `orch-lead`**: теперь ведущий агент явно виден как основной (`primary agent`). Это упрощает отладку: в `/plugin-status` и логах сессии `orch-lead` отображается как главный координатор, а не скрытый специалист. Пример вывода:
25
+ - **Первичный агент `orch-lead`**: ведущий агент не только координирует специалистов, но и сам редактирует файлы, запускает проверку и завершает пользовательскую задачу. Файловые операции разрешены, а shell-команды требуют подтверждения OpenCode. В `/plugin-status` и логах сессии `orch-lead` отображается как главный исполнитель, а не скрытый специалист. Пример вывода:
26
26
  ```text
27
27
  /plugin-status
28
28
  Primary agent: orch-lead (v1.0.13)
@@ -61,6 +61,7 @@ CLI использует Bun напрямую, поэтому отдельный
61
61
  Команда:
62
62
 
63
63
  - добавит `@oeronteros-1/opencode-orchestra@latest` в OpenCode config (`opencode.json` или `opencode.jsonc`);
64
+ - добавит плагин Superpowers (`superpowers@git+https://github.com/obra/superpowers.git`) в массив `plugin`;
64
65
  - подключит удалённый Context7 MCP (`https://mcp.context7.com/mcp`);
65
66
  - подключит Playwright MCP для браузерной автоматизации;
66
67
  - установит статический `codebase-memory-mcp`, включит автоматическую индексацию и подключит его к OpenCode;
@@ -74,11 +75,13 @@ CLI использует Bun напрямую, поэтому отдельный
74
75
 
75
76
  На Linux и macOS используются официальные shell-инсталляторы Codebase Memory и uv. На Windows загружаются официальные PowerShell-инсталляторы, исполняемые с временным `ExecutionPolicy Bypass`; Codebase Memory устанавливается в `%LOCALAPPDATA%`, а пути к `uv` и MemoryGraph определяются автоматически. Сам установщик Orchestra не изменяет системные каталоги.
76
77
 
78
+ Superpowers — фреймворк навыков для агентов (obra/superpowers) — добавляется в массив `plugin` официальной git-спекой и устанавливается через плагин-менеджер OpenCode. На некоторых Windows-сборках OpenCode git-спеки могут не установиться из-за проблем с путями кэша и `git.exe`; в этом случае выполните `npm install superpowers@git+https://github.com/obra/superpowers.git --prefix "$HOME\.config\opencode"` и добавьте запись `"~/.config/opencode/node_modules/superpowers"` в `plugin`.
79
+
77
80
  ```bash
78
81
  bunx @oeronteros-1/opencode-orchestra@latest install --help
79
82
  ```
80
83
 
81
- Полезные флаги: `--no-context7`, `--no-codebase-memory`, `--no-memorygraph`, `--no-playwright`, `--no-deps`, `--force`, `--dry-run`, `--config-dir DIR`.
84
+ Полезные флаги: `--no-context7`, `--no-codebase-memory`, `--no-memorygraph`, `--no-playwright`, `--no-superpowers`, `--no-deps`, `--force`, `--dry-run`, `--config-dir DIR`.
82
85
 
83
86
  ## Диагностика, обновление и автодополнение
84
87
 
@@ -225,9 +228,9 @@ Resolver формирует упорядоченный список более
225
228
 
226
229
  ## Агенты и команды
227
230
 
228
- Плагин добавляет один публичный `orch-lead`, скрытых workers, скрытый reduce-агент `orch-merge` и скрытый `orch-judge`. Workers не могут делегировать работу дальше; lead может вызывать только агентов Orchestra.
231
+ Плагин добавляет один публичный primary-агент `orch-lead`, скрытых workers, скрытый reduce-агент `orch-merge` и скрытый `orch-judge`. Workers не могут редактировать файлы или делегировать работу дальше; lead может вызывать только агентов Orchestra, после чего сам реализует изменения и проверяет результат.
229
232
 
230
- `orch-lead` строит dependency-aware DAG: независимые ветки одного уровня запускаются параллельно в пределах `parallelWorkers`, downstream-узлы ждут свои зависимости, а после всех веток `orch-merge` один раз объединяет результаты с сохранением источников, конфликтов и неопределённости. Это явный fan-out/fan-in pipeline, а не последовательный список рекомендаций.
233
+ `orch-lead` строит dependency-aware DAG: независимые ветки одного уровня запускаются параллельно через OpenCode Task tool в пределах `parallelWorkers`, downstream-узлы ждут свои зависимости, а после всех веток `orch-merge` один раз объединяет результаты с сохранением источников, конфликтов и неопределённости. Затем `orch-lead` редактирует файлы и запускает релевантную проверку. Это явный fan-out/fan-in pipeline, а не последовательный список рекомендаций.
231
234
 
232
235
  ### `orch-judge` — арбитр для критических решений
233
236
 
@@ -250,6 +253,8 @@ Resolver формирует упорядоченный список более
250
253
  /plugin-status
251
254
  ```
252
255
 
256
+ `/orchestra <задача>` закреплена за `orch-lead`: команда сначала вызывает `orchestra_route`, затем lead сам выполняет возвращённый план без делегирования самому себе. Workers по умолчанию скрыты из `@`-автодополнения (`orchestration.exposeWorkers: false`), но доступны lead через Task tool и отображаются в локальном dashboard и `/orchestra-status`.
257
+
253
258
  `/orchestra-status` показывает статистику текущей Orchestra-сессии, а `/plugin-status` — версию загруженного плагина, бюджет, стратегию моделей и состояние companion MCP.
254
259
 
255
260
  Профили: `architecture`, `debug`, `ui`, `research`, `review`, `security`, `performance`, `migration`, `ops`.
@@ -330,7 +335,7 @@ bunx @oeronteros-1/opencode-orchestra@latest dashboard
330
335
  bunx @oeronteros-1/opencode-orchestra@latest install
331
336
  ```
332
337
 
333
- Миграция `orchestra.jsonc` не требуется. Установщик сохранит существующие plugin options и MCP entries, обновит bare/pinned Orchestra entry до `@latest` и создаст backup перед изменением основного OpenCode config. После обновления перезапустите OpenCode и выполните `/plugin-status`.
338
+ Миграция `orchestra.jsonc` не требуется. Установщик сохранит существующие plugin options и MCP entries, обновит bare/pinned Orchestra entry до `@latest`, добавит Superpowers (если его ещё нет) и создаст backup перед изменением основного OpenCode config. После обновления перезапустите OpenCode и выполните `/plugin-status`.
334
339
 
335
340
  ## Безопасность и приватность
336
341
 
@@ -0,0 +1,2 @@
1
+ /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
2
+ @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-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}}}@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-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;--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 components;@layer utilities{.relative{position:relative}.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)}.w-11{width:calc(var(--spacing) * 11)}.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,)}.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\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.border-white\/10{border-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.border-white\/\[0\.08\]{border-color:#ffffff14}@supports (color:color-mix(in lab, red, red)){.border-white\/\[0\.08\]{border-color:color-mix(in oklab, var(--color-white) 8%, transparent)}}.bg-\[\#10131a\]\/85{background-color:oklab(18.6905% -.000851832 -.0150777/.85)}.bg-violet-500{background-color:var(--color-violet-500)}.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{background-color:var(--color-zinc-700)}.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)}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px 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)}.shadow-\[0_24px_80px_-48px_rgba\(0\,0\,0\,\.9\)\]{--tw-shadow:0 24px 80px -48px var(--tw-shadow-color,#000000e6);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}.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-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.hover\:bg-violet-400:hover{background-color:var(--color-violet-400)}.hover\:bg-white\/\[0\.05\]:hover{background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.hover\:bg-white\/\[0\.05\]:hover{background-color:color-mix(in oklab, var(--color-white) 5%, 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\:text-white:hover{color:var(--color-white)}}.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\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-50:disabled{opacity:.5}.data-\[checked\]\:translate-x-5[data-checked]{--tw-translate-x:calc(var(--spacing) * 5);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[checked\]\:bg-violet-500[data-checked]{background-color:var(--color-violet-500)}}:root{color:#f4f4f5;font-synthesis:none;text-rendering:optimizelegibility;background:#090b10;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}*{box-sizing:border-box}body{background:radial-gradient(circle at 75% -10%,#7c3aed1f,#0000 32rem),#090b10;min-width:320px;min-height:100vh;margin:0}button,input,select{font:inherit}button{cursor:pointer}.app-shell{grid-template-columns:230px minmax(0,1fr);min-height:100vh;display:grid}.sidebar{-webkit-backdrop-filter:blur(24px);backdrop-filter:blur(24px);z-index:10;background:#080a0fd1;border-right:1px solid #ffffff12;flex-direction:column;height:100vh;padding:26px 16px 20px;display:flex;position:sticky;top:0}.brand{align-items:center;gap:12px;padding:0 9px 28px;display:flex}.brand strong,.brand small{letter-spacing:.16em;display:block}.brand strong{font-size:13px}.brand small{color:#71717a;margin-top:3px;font-size:8px}.brand-mark{color:#fff;background:linear-gradient(145deg,#8b5cf6,#5b21b6);border-radius:10px;justify-content:center;align-items:end;gap:3px;width:32px;height:32px;padding:7px;display:flex;box-shadow:0 8px 28px #7c3aed47}.brand-mark span{background:currentColor;border-radius:2px;width:3px;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:5px;display:grid}.nav-link{color:#8b8b95;border-radius:11px;align-items:center;gap:12px;height:43px;padding:0 12px;font-size:13px;font-weight:550;text-decoration:none;transition:all .18s;display:flex;position:relative}.nav-link:hover{color:#e4e4e7;background:#ffffff09}.nav-link.active{color:#fff;background:#8b5cf61f}.nav-link.active:before{content:"";background:#8b5cf6;border-radius:1px;width:2px;height:20px;position:absolute;left:-16px;box-shadow:0 0 14px #8b5cf6}.sidebar-foot{border-top:1px solid #ffffff12;margin-top:auto;padding:16px 11px 0}.local-chip{color:#a1a1aa;letter-spacing:.14em;text-transform:uppercase;align-items:center;gap:7px;font-size:10px;font-weight:700;display:flex}.project-name{color:#71717a;white-space:nowrap;text-overflow:ellipsis;margin-top:7px;font-size:11px;overflow:hidden}.status-dot{background:#34d399;border-radius:50%;flex:none;width:7px;height:7px;box-shadow:0 0 10px #34d399bf}.status-dot.off{box-shadow:none;background:#52525b}.main-panel{min-width:0}.topbar{border-bottom:1px solid #ffffff0f;justify-content:space-between;align-items:center;height:70px;padding:0 4vw;display:flex}.top-actions{align-items:center;gap:4px;display:flex}.eyebrow{color:#777783;letter-spacing:.17em;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:12px;min-width:0;display:flex}.project-select{color:#e4e4e7;background:#12151c;border:1px solid #ffffff1a;border-radius:9px;outline:none;max-width:240px;height:34px;padding:0 30px 0 10px}.content{max-width:1480px;margin:0 auto;padding:46px 4vw 80px}.page-intro{margin-bottom:32px}.page-intro h1{letter-spacing:-.04em;margin:8px 0;font-size:clamp(28px,3vw,44px);font-weight:650;line-height:1.08}.page-intro p{color:#8b8b95;max-width:640px;margin:0;font-size:14px;line-height:1.6}h2{letter-spacing:-.015em;margin:5px 0 0;font-size:16px}.metrics-grid{grid-template-columns:repeat(4,minmax(0,1fr));gap:13px;margin-bottom:14px;display:grid}.insight-banner{flex-wrap:wrap;align-items:center;gap:32px;margin-bottom:14px;padding:16px 22px;display:flex}.insight-banner>div{gap:2px;display:grid}.insight-banner .eyebrow{color:#85858f}.insight-banner strong{letter-spacing:-.03em;font-size:20px}.insight-banner small{color:#656570;font-size:10px}.metric-card{grid-template-columns:1fr auto;align-items:center;min-height:158px;padding:20px;display:grid}.metric-card>span{color:#85858f;letter-spacing:.06em;text-transform:uppercase;font-size:11px;font-weight:650}.metric-card strong{letter-spacing:-.045em;grid-column:1/-1;font-size:clamp(25px,2.4vw,36px)}.metric-card small{color:#656570;grid-column:1/-1;font-size:10px}.metric-icon{color:#a78bfa;background:#8b5cf61a;border-radius:10px;place-items:center;width:34px;height:34px;display:grid}.dashboard-grid{grid-template-columns:minmax(0,2fr) minmax(260px,1fr);gap:14px;margin-bottom:14px;display:grid}.chart-card,.mcp-card,.list-card,.ranking-card,.settings-card{padding:22px}.card-heading{justify-content:space-between;align-items:start;margin-bottom:20px;display:flex}.updated{color:#5f5f69;font-size:10px}.chart-wrap{height:260px;margin:4px -4px -8px -16px;font-size:10px}.mcp-list{margin-top:20px;display:grid}.mcp-list>div{border-top:1px solid #ffffff0f;grid-template-columns:auto 1fr auto;align-items:center;gap:10px;min-height:50px;font-size:12px;display:grid}.mcp-list small{color:#656570;font-size:9px}.project-list{margin-top:16px;display:grid}.project-list button{color:#8b8b95;text-align:left;background:0 0;border:0;border-top:1px solid #ffffff0f;grid-template-columns:minmax(0,1fr) auto auto;align-items:center;gap:12px;min-height:54px;padding:8px 0;display:grid}.project-list button:hover strong{color:#a78bfa}.project-list strong,.project-list small{text-overflow:ellipsis;white-space:nowrap;display:block;overflow:hidden}.project-list strong{color:#d4d4d8;font-size:11px}.project-list small{color:#5f5f69;margin-top:3px;font-size:8px}.text-link{color:#a78bfa;font-size:11px;text-decoration:none}.recent-list>div{color:#a1a1aa;border-top:1px solid #ffffff0e;grid-template-columns:90px minmax(0,1fr) 100px 80px;align-items:center;gap:14px;min-height:56px;font-size:11px;display:grid}.recent-list strong,.recent-list small{display:block}.recent-list strong{color:#d4d4d8;font-size:11px;font-weight:550}.recent-list small{color:#5f5f69;margin-top:3px;font-size:9px}.agent-badge{color:#a78bfa;background:#8b5cf612;border:1px solid #8b5cf62e;border-radius:6px;justify-self:start;padding:4px 8px;font-size:9px}.empty-state{color:#666671;justify-content:center;align-items:center;gap:10px;min-height:180px;font-size:11px;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{color:#666671;letter-spacing:.11em;text-transform:uppercase;border-bottom:1px solid #ffffff14;height:46px;font-size:9px;font-weight:700}.table-head>div,.table-row>div{text-overflow:ellipsis;white-space:nowrap;flex:none;padding:0 14px;overflow:hidden}.table-scroll{height:min(65vh,650px);overflow:auto}.table-row{color:#b1b1ba;border-bottom:1px solid #ffffff0b;min-height:46px;font-size:10px;position:absolute;inset-inline:0}.table-row:hover{background:#ffffff06}.ranking-list>div{color:#898994;border-top:1px solid #ffffff0e;grid-template-columns:42px minmax(230px,1fr) 90px 100px 90px;align-items:center;gap:16px;min-height:65px;font-size:10px;display:grid}.ranking-list>div:first-child{border-top:0}.rank{color:#52525b;font-variant-numeric:tabular-nums}.rank-main strong{color:#d4d4d8;font-size:11px;font-weight:550}.usage-bar{background:#ffffff0d;border-radius:2px;width:100%;max-width:420px;height:2px;margin-top:10px;overflow:hidden}.usage-bar span{background:linear-gradient(90deg,#7c3aed,#22d3ee);height:100%;display:block}.settings-stack{gap:14px;display:grid}.setting-title{justify-content:space-between;align-items:start;gap:22px;margin-bottom:22px;display:flex}.setting-title h2,.inline-setting h2{margin:0 0 5px}.setting-title p,.inline-setting p{color:#73737e;margin:0;font-size:11px;line-height:1.5}.setting-title select{color:#d4d4d8;background:#151820;border:1px solid #ffffff1a;border-radius:9px;outline:none;min-width:120px;height:36px;padding:0 32px 0 12px}.budget-grid{grid-template-columns:repeat(4,1fr);gap:10px;display:grid}.budget-option{color:#9b9ba5;text-align:left;background:#ffffff05;border:1px solid #ffffff14;border-radius:12px;min-height:92px;padding:14px;transition:all .18s}.budget-option strong,.budget-option span{display:block}.budget-option strong{color:#d4d4d8;text-transform:uppercase;font-size:12px}.budget-option span{margin-top:7px;font-size:9px;line-height:1.4}.budget-option:hover,.budget-option.selected{background:#8b5cf614;border-color:#8b5cf673}.budget-option.selected strong{color:#c4b5fd}.model-empty{color:#d6b86f;background:#fbbf240d;border:1px solid #fbbf242e;border-radius:10px;margin:-6px 0 16px;padding:12px 14px;font-size:11px;line-height:1.5}.model-empty code{color:#fde68a}.agent-model-list{border:1px solid #ffffff12;border-radius:14px;overflow:hidden}.agent-model-row{border-bottom:1px solid #ffffff0f;grid-template-columns:minmax(220px,.8fr) minmax(280px,1.2fr);align-items:center;gap:24px;min-height:74px;padding:12px 16px;display:grid}.agent-model-row:last-child{border-bottom:0}.agent-model-row:hover{background:#ffffff05}.agent-identity strong,.agent-identity span,.agent-identity small{display:block}.agent-identity strong{color:#e4e4e7;font-size:12px}.agent-identity span{color:#858590;margin-top:3px;font-size:10px}.agent-identity small{color:#555560;letter-spacing:.04em;margin-top:5px;font-size:8px}.agent-model-row select{color:#e4e4e7;text-overflow:ellipsis;background:#11141b;border:1px solid #ffffff17;border-radius:10px;outline:none;width:100%;height:42px;padding:0 36px 0 12px;overflow:hidden}.agent-model-row select:focus{border-color:#8b5cf6a6;box-shadow:0 0 0 3px #8b5cf614}.inline-setting{justify-content:space-between;align-items:center;gap:24px;display:flex}.form-actions{color:#666671;justify-content:space-between;align-items:center;gap:16px;font-size:9px;display:flex}.form-actions>span{white-space:nowrap;text-overflow:ellipsis;max-width:65%;overflow:hidden}.loading,.error-state{color:#71717a;justify-content:center;align-items:center;gap:10px;min-height:55vh;font-size:11px;display:flex}.error-state{color:#f87171}.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;background:#12151c;border:1px solid #ffffff1a;border-radius:14px;width:260px;padding:12px;position:absolute;top:calc(100% + 8px);right:0;box-shadow:0 24px 64px -24px #000000d9}.export-head{justify-content:space-between;align-items:center;margin-bottom:10px;padding:0 2px;display:flex}.export-close{color:#71717a;background:0 0;border:0;font-size:18px;line-height:1}.export-close:hover{color:#fff}.export-list{gap:2px;display:grid}.export-item{border-radius:9px;justify-content:space-between;align-items:center;gap:10px;padding:6px 4px;display:flex}.export-item:hover{background:#ffffff0a}.export-item-label{color:#d4d4d8;font-size:11px}.export-item-actions{gap:4px;display:flex}.export-item-actions .inline-flex{letter-spacing:.06em;height:26px;padding:0 8px;font-size:9px;font-weight:700}.export-error{color:#f87171;border:1px solid #f8717140;border-radius:8px;margin-top:10px;padding:8px 10px;font-size:10px}html.light .export-panel{background:#fff;border-color:#0000001a}html.light .export-item:hover{background:#00000008}html.light .export-item-label{color:#18181b}html.light .export-close{color:#71717a}html.light .export-close:hover{color:#18181b}html.light{color:#18181b;background:#f5f5f7}html.light body{background:radial-gradient(circle at 75% -10%,#7c3aed1a,#0000 32rem),#f5f5f7}html.light .sidebar{background:#f8f8fae0;border-color:#00000014}html.light .nav-link{color:#71717a}html.light .nav-link.active{color:#5b21b6}html.light section{background:#ffffffdb;border-color:#00000014}html.light .topbar{border-color:#00000012}html.light .page-intro p,html.light .setting-title p,html.light .inline-setting p{color:#71717a}html.light h1,html.light h2,html.light .metric-card strong,html.light .recent-list strong,html.light .rank-main strong{color:#18181b}html.light .table-row,html.light .recent-list>div,html.light .ranking-list>div,html.light .mcp-list>div{border-color:#0000000f}@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){.app-shell{display:block}.sidebar{border:0;border-top:1px solid #ffffff14;width:100%;height:66px;padding:7px 10px;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:2px;width:58px;height:50px;padding:0;font-size:8px}.nav-link.active:before{display:none}.topbar{height:58px;padding:0 18px}.content{padding:30px 16px 100px}.metrics-grid{grid-template-columns:1fr 1fr}.metric-card{min-height:135px;padding:16px}.recent-list>div{grid-template-columns:72px minmax(0,1fr) 70px}.recent-list>div>span:last-child{display:none}.agent-model-row{grid-template-columns:1fr;gap:10px;padding:14px}.ranking-list>div{grid-template-columns:30px minmax(150px,1fr) 80px}.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:30px}.mcp-list small{display:none}.mcp-list>div{grid-template-columns:auto 1fr}}.live-card{padding:22px}.live-state{color:#656570;align-items:center;gap:6px;font-size:10px;display:inline-flex}.live-state.active{color:#34d399}.live-state.off{color:#71717a}.live-state .status-dot{background:#52525b;width:8px;height:8px}.live-state.active .status-dot{background:#34d399;animation:1.6s ease-in-out infinite live-pulse}@keyframes live-pulse{0%,to{opacity:1}50%{opacity:.35}}.live-list{gap:10px;margin-top:4px;display:grid}.live-row{background:#8b5cf60b;border:1px solid #8b5cf629;border-radius:12px;grid-template-columns:90px minmax(0,1fr) 84px;align-items:start;gap:14px;padding:12px;display:grid}.live-body{min-width:0}.live-meta{align-items:baseline;gap:10px;display:flex}.live-meta strong{color:#d4d4d8;font-size:12px;font-weight:600}.live-meta span{color:#5f5f69;font-size:9px}.live-snippet{color:#a1a1aa;max-width:100ch;margin:6px 0 0;font-size:11px;line-height:1.5}.live-stats{color:#5f5f69;gap:12px;margin-top:6px;font-size:9px;display:flex}.live-warn{color:#fbbf24;cursor:help}.live-cost{color:#a78bfa;white-space:nowrap;justify-self:end;font-size:12px;font-weight:550}.live-total{color:#656570;grid-template-columns:1fr auto 1fr;align-items:baseline;gap:10px;padding:12px 4px 0;font-size:9px;display:grid}.live-total strong{color:#d4d4d8;text-align:right;font-size:12px;font-weight:550}.live-card .empty-state{min-height:110px}.live-card .agent-badge{justify-self:start}html.light .live-meta strong,html.light .live-total strong{color:#18181b}html.light .live-snippet{color:#3f3f46}html.light .live-row{background:#faf5ff;border-color:#8b5cf62e}@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-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}