llm-relay 0.85.0 → 0.86.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/README.md +39 -62
  2. package/THIRD_PARTY_NOTICES.md +5 -4
  3. package/dist/accounting-state.js.map +1 -1
  4. package/dist/accounting-store-schema.js.map +1 -1
  5. package/dist/accounting-store.js.map +1 -1
  6. package/dist/accounting.js.map +1 -1
  7. package/dist/authEnv.js.map +1 -1
  8. package/dist/availability-snapshot.js.map +1 -1
  9. package/dist/availability.js.map +1 -1
  10. package/dist/backend.js.map +1 -1
  11. package/dist/benchmarks.js.map +1 -1
  12. package/dist/breaker-persistence.js.map +1 -1
  13. package/dist/candidate-runner.d.ts +6 -12
  14. package/dist/candidate-runner.js +16 -4
  15. package/dist/candidate-runner.js.map +1 -1
  16. package/dist/candidates.js.map +1 -1
  17. package/dist/catalog.js.map +1 -1
  18. package/dist/circuit-breaker.d.ts +14 -17
  19. package/dist/circuit-breaker.js +46 -6
  20. package/dist/circuit-breaker.js.map +1 -1
  21. package/dist/claude-hook.js.map +1 -1
  22. package/dist/cli.d.ts +4 -1
  23. package/dist/cli.js +127 -12
  24. package/dist/cli.js.map +1 -1
  25. package/dist/config/routing-parser.d.ts +3 -13
  26. package/dist/config/routing-parser.js +16 -10
  27. package/dist/config/routing-parser.js.map +1 -1
  28. package/dist/config-reload.d.ts +34 -0
  29. package/dist/config-reload.js +180 -0
  30. package/dist/config-reload.js.map +1 -0
  31. package/dist/config-types.d.ts +26 -65
  32. package/dist/config-types.js.map +1 -1
  33. package/dist/config.d.ts +1 -1
  34. package/dist/config.js +1 -1
  35. package/dist/config.js.map +1 -1
  36. package/dist/configured-lane-execution-launcher.d.ts +36 -0
  37. package/dist/configured-lane-execution-launcher.js +133 -0
  38. package/dist/configured-lane-execution-launcher.js.map +1 -0
  39. package/dist/context-limits.js.map +1 -1
  40. package/dist/control-authorization.js.map +1 -1
  41. package/dist/cooldown-clear.js.map +1 -1
  42. package/dist/credential-fleet.js.map +1 -1
  43. package/dist/credential-select.js.map +1 -1
  44. package/dist/daemon-dispatch-view.d.ts +21 -0
  45. package/dist/daemon-dispatch-view.js +16 -0
  46. package/dist/daemon-dispatch-view.js.map +1 -0
  47. package/dist/dashboard/.vite/dashboard-bundle-graph.json +2 -1
  48. package/dist/dashboard/.vite/manifest.json +2 -2
  49. package/dist/dashboard/assets/index-BoSmrF3q.js +123 -0
  50. package/dist/dashboard/assets/index-DKPeE07T.css +1 -0
  51. package/dist/dashboard/index.html +2 -2
  52. package/dist/dashboard-auth.js.map +1 -1
  53. package/dist/dashboard-contract.d.ts +2 -2
  54. package/dist/dashboard-routes.js.map +1 -1
  55. package/dist/dashboard-snapshot.js.map +1 -1
  56. package/dist/dashboard-static.js.map +1 -1
  57. package/dist/delegate-gate/cli.js.map +1 -1
  58. package/dist/dispatch-exhaustion-persistence.d.ts +1 -0
  59. package/dist/dispatch-exhaustion-persistence.js +7 -2
  60. package/dist/dispatch-exhaustion-persistence.js.map +1 -1
  61. package/dist/dispatch-lane-stats.d.ts +10 -17
  62. package/dist/dispatch-lane-stats.js +0 -5
  63. package/dist/dispatch-lane-stats.js.map +1 -1
  64. package/dist/dispatch.d.ts +32 -78
  65. package/dist/dispatch.js +51 -54
  66. package/dist/dispatch.js.map +1 -1
  67. package/dist/documents.js.map +1 -1
  68. package/dist/dotenv.js.map +1 -1
  69. package/dist/dynamic-pools.js.map +1 -1
  70. package/dist/executable-lookup.d.ts +2 -0
  71. package/dist/executable-lookup.js +7 -4
  72. package/dist/executable-lookup.js.map +1 -1
  73. package/dist/host-routing.js.map +1 -1
  74. package/dist/installed-hosts.js.map +1 -1
  75. package/dist/json-shape.js.map +1 -1
  76. package/dist/key-checker.js.map +1 -1
  77. package/dist/key-import.js.map +1 -1
  78. package/dist/keys-cli.js.map +1 -1
  79. package/dist/keystore.js.map +1 -1
  80. package/dist/lane-activity.d.ts +8 -0
  81. package/dist/lane-activity.js +27 -2
  82. package/dist/lane-activity.js.map +1 -1
  83. package/dist/lane-affinity.d.ts +4 -4
  84. package/dist/lane-affinity.js.map +1 -1
  85. package/dist/lane-cadence.js.map +1 -1
  86. package/dist/lane-execution-broker.d.ts +124 -0
  87. package/dist/lane-execution-broker.js +479 -0
  88. package/dist/lane-execution-broker.js.map +1 -0
  89. package/dist/lane-launch-env.d.ts +14 -0
  90. package/dist/lane-launch-env.js +52 -0
  91. package/dist/lane-launch-env.js.map +1 -0
  92. package/dist/lane-manifest.js.map +1 -1
  93. package/dist/lane-probe.js.map +1 -1
  94. package/dist/lane-quota-probe.js.map +1 -1
  95. package/dist/log.js.map +1 -1
  96. package/dist/mcp/job-archive.d.ts +12 -9
  97. package/dist/mcp/job-archive.js +44 -37
  98. package/dist/mcp/job-archive.js.map +1 -1
  99. package/dist/mcp/job-journal.d.ts +42 -2
  100. package/dist/mcp/job-journal.js +212 -32
  101. package/dist/mcp/job-journal.js.map +1 -1
  102. package/dist/mcp/lane-execution-client.d.ts +26 -0
  103. package/dist/mcp/lane-execution-client.js +117 -0
  104. package/dist/mcp/lane-execution-client.js.map +1 -0
  105. package/dist/mcp/lane-runner.d.ts +140 -25
  106. package/dist/mcp/lane-runner.js +361 -49
  107. package/dist/mcp/lane-runner.js.map +1 -1
  108. package/dist/mcp/persistence-lock.d.ts +13 -0
  109. package/dist/mcp/persistence-lock.js +4 -0
  110. package/dist/mcp/persistence-lock.js.map +1 -0
  111. package/dist/mcp/process-cpu.d.ts +18 -0
  112. package/dist/mcp/process-cpu.js +133 -0
  113. package/dist/mcp/process-cpu.js.map +1 -0
  114. package/dist/mcp/readonly-boundary.js.map +1 -1
  115. package/dist/mcp/server.d.ts +97 -3
  116. package/dist/mcp/server.js +547 -61
  117. package/dist/mcp/server.js.map +1 -1
  118. package/dist/mcp/tree-delta.js.map +1 -1
  119. package/dist/mcp/windows-npm-shim.d.ts +32 -0
  120. package/dist/mcp/windows-npm-shim.js +92 -0
  121. package/dist/mcp/windows-npm-shim.js.map +1 -0
  122. package/dist/metadata.js.map +1 -1
  123. package/dist/openai-dialect.js.map +1 -1
  124. package/dist/openai-request.js.map +1 -1
  125. package/dist/os-keyring.js.map +1 -1
  126. package/dist/ping/cadence.js.map +1 -1
  127. package/dist/ping/metrics.js.map +1 -1
  128. package/dist/ping/ping.js.map +1 -1
  129. package/dist/ping/probe-cache.js.map +1 -1
  130. package/dist/ping/quota.js.map +1 -1
  131. package/dist/ping/runtime-telemetry.js.map +1 -1
  132. package/dist/pool-health.js.map +1 -1
  133. package/dist/process-safety-net.js +18 -10
  134. package/dist/process-safety-net.js.map +1 -1
  135. package/dist/quota-observation.js.map +1 -1
  136. package/dist/rate-limits.js.map +1 -1
  137. package/dist/refusal-interpretation.js.map +1 -1
  138. package/dist/registry.js.map +1 -1
  139. package/dist/request-log.js.map +1 -1
  140. package/dist/reshaper.js.map +1 -1
  141. package/dist/resolved-attempt.js.map +1 -1
  142. package/dist/responses-request.js.map +1 -1
  143. package/dist/routes/admin.d.ts +8 -0
  144. package/dist/routes/admin.js +54 -8
  145. package/dist/routes/admin.js.map +1 -1
  146. package/dist/routes/messages.js +10 -10
  147. package/dist/routes/messages.js.map +1 -1
  148. package/dist/routes/openai-front.js +4 -4
  149. package/dist/routes/openai-front.js.map +1 -1
  150. package/dist/secret-file-acl.js.map +1 -1
  151. package/dist/self-update.js.map +1 -1
  152. package/dist/server.d.ts +19 -0
  153. package/dist/server.js +70 -4
  154. package/dist/server.js.map +1 -1
  155. package/dist/session-pin.js.map +1 -1
  156. package/dist/setup-claude.d.ts +6 -1
  157. package/dist/setup-claude.js +3 -3
  158. package/dist/setup-claude.js.map +1 -1
  159. package/dist/spend-headroom.js.map +1 -1
  160. package/dist/sse.js.map +1 -1
  161. package/dist/state-paths.js.map +1 -1
  162. package/dist/storage/file-lock.d.ts +26 -0
  163. package/dist/storage/file-lock.js +127 -0
  164. package/dist/storage/file-lock.js.map +1 -0
  165. package/dist/storage/json-store.d.ts +33 -0
  166. package/dist/storage/json-store.js +68 -1
  167. package/dist/storage/json-store.js.map +1 -1
  168. package/dist/stream-commit.js.map +1 -1
  169. package/dist/stream-pipeline.js.map +1 -1
  170. package/dist/target-facts.js.map +1 -1
  171. package/dist/telemetry.d.ts +3 -1
  172. package/dist/telemetry.js +2 -1
  173. package/dist/telemetry.js.map +1 -1
  174. package/dist/tier-data.js.map +1 -1
  175. package/dist/tool-dialects.js.map +1 -1
  176. package/dist/usage-observer.js.map +1 -1
  177. package/dist/winenv.js.map +1 -1
  178. package/docs/README.md +4 -2
  179. package/docs/dashboard-bundle-inventory.json +5 -4
  180. package/package.json +15 -14
  181. package/scripts/install-skill.mjs +4 -2
  182. package/skills/llm-relay/SKILL.md +10 -8
  183. package/skills/llm-relay/references/dispatch-lanes.md +18 -1
  184. package/dist/dashboard/assets/index-C-I6hPeY.js +0 -403
  185. package/dist/dashboard/assets/index-CrSNlLMD.css +0 -1
@@ -1 +0,0 @@
1
- .metric-chart-svg{display:block;max-width:100%;overflow:visible}.chart-grid{stroke:var(--border);stroke-width:1;stroke-dasharray:4 4}.chart-axis-label{fill:var(--muted);font-size:11px;font-variant-numeric:tabular-nums}.chart-series-0{fill:#3b82f6}.chart-series-1{fill:#10b981}.chart-series-2{fill:#8b5cf6}.chart-series-3{fill:#f59e0b}.chart-series-4{fill:#ec4899}.app.dark .chart-series-0{fill:#60a5fa}.app.dark .chart-series-1{fill:#34d399}.app.dark .chart-series-2{fill:#a78bfa}.app.dark .chart-series-3{fill:#fbbf24}.app.dark .chart-series-4{fill:#f472b6}.metric-bar{transition:opacity .15s ease;cursor:pointer}.metric-bar:hover{opacity:.75}.chart-legend{display:flex;flex-wrap:wrap;gap:.5rem 1rem;margin:.6rem 0 .2rem;padding:0;list-style:none;color:var(--muted);font-size:.8rem}.chart-legend li{display:inline-flex;align-items:center;gap:.35rem}.chart-swatch{display:inline-block;width:.75rem;height:.75rem;border-radius:.25rem}.chart-swatch.chart-series-0{background:#3b82f6}.chart-swatch.chart-series-1{background:#10b981}.chart-swatch.chart-series-2{background:#8b5cf6}.chart-swatch.chart-series-3{background:#f59e0b}.chart-swatch.chart-series-4{background:#ec4899}.app.dark .chart-swatch.chart-series-0{background:#60a5fa}.app.dark .chart-swatch.chart-series-1{background:#34d399}.app.dark .chart-swatch.chart-series-2{background:#a78bfa}.app.dark .chart-swatch.chart-series-3{background:#fbbf24}.app.dark .chart-swatch.chart-series-4{background:#f472b6}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}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;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media(min-width:640px){.container{max-width:640px}}@media(min-width:768px){.container{max-width:768px}}@media(min-width:1024px){.container{max-width:1024px}}@media(min-width:1280px){.container{max-width:1280px}}@media(min-width:1536px){.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.visible{visibility:visible}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.col-span-2{grid-column:span 2 / span 2}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.resize{resize:both}.items-center{align-items:center}.gap-1{gap:.25rem}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.border{border-width:1px}.uppercase{text-transform:uppercase}.italic{font-style:italic}.underline{text-decoration-line:underline}.outline{outline-style:solid}.blur{--tw-blur: blur(8px);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)}.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)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}:root{--surface: #ffffff;--card: #ffffff;--ink: #172033;--foreground: #172033;--muted: #526177;--muted-foreground: #526177;--border: #d8deea;--accent: #2563eb;--primary: #2563eb;--warning: #9a5414;--danger: #be123c;--focus: #b45309;--row-hover: #eef3fc;--group-bg: #e7ecf5;color-scheme:light dark;font-family:Inter,ui-sans-serif,system-ui,sans-serif;background:#f6f8fb;color:#172033}*{box-sizing:border-box}body{margin:0;background:#f6f8fb;color:#172033}button,select{font:inherit}button{cursor:pointer}button:focus-visible,select:focus-visible,input:focus-visible{outline:3px solid var(--focus);outline-offset:2px}.app,.app-shell{--surface: #ffffff;--card: #ffffff;--ink: #172033;--foreground: #172033;--muted: #526177;--muted-foreground: #526177;--border: #d8deea;--accent: #2563eb;--primary: #2563eb;--warning: #9a5414;--danger: #be123c;--focus: #b45309;--row-hover: #eef3fc;--group-bg: #e7ecf5;min-height:100vh;margin:0 auto;color:var(--ink)}.app{max-width:1440px;padding:1rem;background:#f6f8fb}.app.dark,.app-shell.dark,[data-theme=dark]{--surface: #172033;--card: #172033;--ink: #edf2fb;--foreground: #edf2fb;--muted: #94a3b8;--muted-foreground: #94a3b8;--border: #2e3c54;--accent: #60a5fa;--primary: #3b82f6;--warning: #fbbf24;--danger: #fda4af;--focus: #fbbf24;--row-hover: #1e2a42;--group-bg: #1e2a42;background:#0f1726;color:var(--ink)}header{display:flex;justify-content:space-between;gap:1rem;align-items:start;margin:1rem 0}h1{margin:.1rem 0;font-size:clamp(1.6rem,4vw,2.5rem)}h2{font-size:1.05rem;margin-top:0}h3{font-size:1rem}h4{font-size:.9rem}.eyebrow{color:var(--muted);font-size:.85rem;margin:0;letter-spacing:.04em;text-transform:uppercase}.header-actions,.filters{display:flex;gap:.6rem;flex-wrap:wrap;align-items:end}button,select{border:1px solid var(--border);background:var(--surface);color:var(--ink);border-radius:.4rem;padding:.5rem .65rem}button{display:inline-flex;gap:.35rem;align-items:center}label{display:grid;gap:.25rem;font-size:.85rem;color:var(--muted)}label:has(input){display:flex;align-items:center;gap:.4rem;padding:.5rem 0}.panel-nav{margin:.6rem 0}.panel-nav ul{list-style:none;display:flex;flex-wrap:wrap;gap:.4rem;margin:0;padding:0}.panel-nav a{display:inline-block;border:1px solid var(--border);border-radius:999px;padding:.25rem .7rem;font-size:.8rem;color:var(--ink);text-decoration:none}.panel-nav a:hover,.panel-nav a:focus-visible{border-color:var(--accent);color:var(--accent)}.status,.notice{margin:.8rem 0;color:var(--muted)}.filters,.panel,.notice{border:1px solid var(--border);background:var(--surface);border-radius:1rem;padding:.85rem;margin:.85rem 0}.notice.partial,.notice.stale{border-left:6px solid var(--warning)}.notice.unavailable,.error{border-left:6px solid var(--danger)}.notice.empty{border-left:6px solid var(--accent)}.panel,.chart-panel{padding:0;border-radius:1rem;overflow:hidden;border:1px solid var(--border);background:var(--surface);margin:0}.panel-header{padding:.75rem 1rem;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--border)}.panel-header h2,.panel-title{display:inline-flex;align-items:center;gap:.5rem;margin:0;font-size:.95rem;font-weight:600;color:var(--ink)}.panel>*:not(.panel-header):not(.coverage),.chart-panel>*:not(.panel-header):not(.coverage){padding:0 1rem 1rem}.panel>.panel-header+*:not(.coverage),.panel>.coverage+*{padding-top:.85rem}.panel-icon{width:1.1rem;height:1.1rem;color:var(--muted);flex-shrink:0}.panel-count{color:var(--muted);font-weight:500;font-size:.8rem;margin-left:.35rem}.coverage{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.analytics-grid{display:grid;grid-template-columns:1fr;gap:1rem;margin-top:1rem}@media(min-width:1024px){.analytics-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.col-span-2{grid-column:span 2 / span 2}}.summary-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:.75rem}.card{background:var(--surface);border:1px solid var(--border);border-radius:1rem;padding:.85rem 1rem;min-width:0;display:flex;flex-direction:column;justify-content:space-between;transition:border-color .15s ease}.card:hover{border-color:var(--accent)}.card-header{display:flex;align-items:center;justify-content:space-between;gap:.5rem}.card-label{color:var(--muted);margin:0;font-size:.6875rem;font-weight:600;text-transform:uppercase;letter-spacing:.06em}.card-icon-pill{display:flex;align-items:center;justify-content:center;width:1.75rem;height:1.75rem;border-radius:.45rem;background:var(--row-hover);color:var(--muted);flex-shrink:0}.card-icon{width:1rem;height:1rem}.card-value{font-weight:700;font-size:1.35rem;font-variant-numeric:tabular-nums;margin:.35rem 0 .15rem;color:var(--ink)}.card-hint,small{color:var(--muted);overflow-wrap:anywhere;font-size:.75rem;line-height:1.35;margin-top:.15rem}.spend-card .cell-list{margin:0}.cell-list{display:grid;grid-template-columns:1fr;gap:.45rem;margin:.5rem 0}.cell-list div{border-top:1px solid var(--border);padding-top:.35rem}.cell-list dt{color:var(--muted);font-size:.78rem}.cell-list dd{margin:.1rem 0 0;overflow-wrap:anywhere}.null-value{color:var(--muted);font-style:italic}.chart{min-width:0}.table-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch}table{width:100%;border-collapse:collapse}caption{text-align:left;font-weight:650;color:var(--muted);padding:.5rem 0}th,td{text-align:left;padding:.4rem .5rem;border-bottom:1px solid var(--border);vertical-align:top;overflow-wrap:break-word;line-height:1.35}th{font-weight:650;white-space:nowrap}.responsive-table tbody tr:not(.group-row):hover>*,.responsive-table tbody tr:not(.group-row):focus-within>*{background:var(--row-hover)}.empty-row{color:var(--muted);font-style:italic;text-align:center}.quota-table .group-row th{background:var(--group-bg);font-weight:700;padding:.5rem}.quota-table .group-name{font-weight:700}.quota-table .quota-value{font-variant-numeric:tabular-nums}.quota-table .quota-relative{font-weight:600;white-space:nowrap}.basis-badge{display:inline-block;border:1px solid var(--border);border-radius:999px;padding:0 .5rem;font-size:.72rem;font-weight:650;white-space:nowrap;line-height:1.5}.basis-badge.basis-strong{border-color:var(--accent);color:var(--accent)}.basis-badge.basis-weak{border-color:var(--warning);color:var(--warning)}.basis-badge.basis-unknown{color:var(--muted);font-style:italic;border-style:dashed}.platform-dot{display:inline-block;width:.55rem;height:.55rem;border-radius:9999px;margin-right:.4rem;vertical-align:middle;flex-shrink:0}.badge{display:inline-flex;align-items:center;white-space:nowrap;padding:.1rem .45rem;border-radius:.25rem;font-size:.72rem;font-weight:600;background:var(--row-hover);color:var(--muted);border:1px solid var(--border)}.status-badge{display:inline-flex;align-items:center;white-space:nowrap;border-radius:9999px;padding:.1rem .55rem;font-size:.72rem;font-weight:600;text-transform:capitalize;line-height:1.35;border:1px solid transparent}.status-badge-success{background:#10b9811f;color:#059669;border-color:#10b98140}.status-badge-error{background:#ef44441f;color:#dc2626;border-color:#ef444440}.status-badge-warning{background:#f59e0b1f;color:#d97706;border-color:#f59e0b40}.status-badge-muted{background:var(--row-hover);color:var(--muted);border-color:var(--border)}.app.dark .status-badge-success{background:#10b98133;color:#34d399;border-color:#10b98166}.app.dark .status-badge-error{background:#ef444433;color:#f87171;border-color:#ef444466}.app.dark .status-badge-warning{background:#f59e0b33;color:#fbbf24;border-color:#f59e0b66}.segmented-control{display:inline-flex;gap:.2rem;border:1px solid var(--border);background:var(--surface);border-radius:.6rem;padding:.2rem}.segmented-option{border:0;background:transparent;color:var(--muted);border-radius:.4rem;padding:.25rem .6rem;font-size:.75rem;font-weight:500;cursor:pointer;transition:all .15s ease}.segmented-option:hover{color:var(--ink);background:var(--row-hover)}.segmented-option.active{background:var(--ink);color:var(--surface);font-weight:600;box-shadow:0 1px 2px #0000001a}.app.dark .segmented-option.active{background:var(--ink);color:var(--surface)}.range-nav{display:flex;align-items:center;gap:.65rem;margin:.75rem 0;flex-wrap:wrap}.range-nav-label{font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--muted)}.dialog-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:5;display:grid;place-items:center;padding:1rem;background:#0000008c}.dialog{width:min(1100px,100%);max-height:90vh;overflow:auto;background:var(--surface);color:var(--ink);border-radius:1rem;padding:1.25rem;border:1px solid var(--border)}.dialog-header{display:flex;align-items:center;justify-content:space-between;gap:.75rem;margin-bottom:.6rem}.dialog-header-title{display:inline-flex;align-items:center;gap:.6rem;flex-wrap:wrap}.dialog-header-title h2{margin:0;font-size:1.15rem;font-weight:600}.dialog-icon{width:1.25rem;height:1.25rem;color:var(--muted)}.dialog-close-btn{border:1px solid var(--border);background:var(--surface);color:var(--muted);border-radius:.45rem;padding:.35rem;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.dialog-close-btn:hover{color:var(--ink);border-color:var(--accent)}.dialog-close-icon{width:1rem;height:1rem}.dialog-description{color:var(--muted);font-size:.85rem;margin:0 0 1rem}.dialog-section{margin:1.25rem 0}.dialog-section-title{font-size:.95rem;font-weight:600;margin:0 0 .5rem;color:var(--ink)}.detail-grid{display:grid;grid-template-columns:max-content minmax(0,1fr);gap:.5rem 1rem}.detail-grid dt{font-weight:650}.detail-grid dd{margin:0;overflow-wrap:anywhere}.detail-grid-v2{display:grid;grid-template-columns:repeat(auto-fill,minmax(135px,1fr));gap:.75rem;background:var(--row-hover);border:1px solid var(--border);border-radius:.75rem;padding:.75rem 1rem;margin:.5rem 0}.detail-item{min-width:0}.detail-label{font-size:.6875rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--muted);margin:0}.detail-value{font-size:.85rem;font-weight:500;margin:.15rem 0 0;color:var(--ink);overflow-wrap:anywhere}.detail-cards-row{display:grid;grid-template-columns:1fr;gap:.75rem;margin:.75rem 0}.detail-subcard{background:var(--surface);border:1px solid var(--border);border-radius:.65rem;padding:.75rem}.detail-subcard h4{margin:0 0 .35rem;font-size:.8rem;font-weight:600;color:var(--muted);text-transform:uppercase;letter-spacing:.04em}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}@media(max-width:767px){.app{padding:.65rem}header{display:block}.header-actions{margin-top:.7rem}.summary-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.filters{align-items:stretch}.filters label{min-width:calc(50% - .4rem)}.responsive-table{border:0}.responsive-table thead{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}.responsive-table tr{display:block;border:1px solid var(--border);border-radius:.45rem;margin:.5rem 0;padding:.25rem}.responsive-table th[scope=row],.responsive-table td{display:grid;grid-template-columns:minmax(7.5rem,42%) 1fr;gap:.5rem;border:0;padding:.35rem}.responsive-table th[scope=row]:before,.responsive-table td:before{content:attr(data-label);color:var(--muted);font-weight:600}.responsive-table td[colspan]{grid-template-columns:1fr}.responsive-table td[colspan]:before{content:none}}@media(max-width:360px){.summary-grid{grid-template-columns:1fr}.filters label{min-width:100%}.app{padding:.45rem}.header-actions button{width:100%;justify-content:center}.detail-grid{grid-template-columns:1fr;gap:.2rem}.detail-grid dd{margin-bottom:.45rem}}@media(min-width:768px){.summary-grid{grid-template-columns:repeat(4,minmax(0,1fr))}.cell-list{grid-template-columns:repeat(2,minmax(0,1fr))}.spend-cells{grid-template-columns:1fr}.detail-cards-row{grid-template-columns:1fr 1fr}}@media(min-width:1280px){.app{padding:1.5rem}.summary-grid{grid-template-columns:repeat(8,minmax(0,1fr))}.spend-card{grid-column:span 1}.chart-panel{min-width:0}}@media(prefers-reduced-motion:reduce){*,*:before,*:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}