ccgauge 1.2.1 → 1.3.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 (120) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-build-manifest.json +57 -41
  3. package/.next/standalone/.next/app-path-routes-manifest.json +9 -7
  4. package/.next/standalone/.next/build-manifest.json +2 -2
  5. package/.next/standalone/.next/prerender-manifest.json +3 -3
  6. package/.next/standalone/.next/routes-manifest.json +6 -0
  7. package/.next/standalone/.next/server/app/_not-found/page.js +2 -2
  8. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  9. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  10. package/.next/standalone/.next/server/app/api/blocks/route.js +1 -1
  11. package/.next/standalone/.next/server/app/api/blocks/route.js.nft.json +1 -1
  12. package/.next/standalone/.next/server/app/api/blocks/route_client-reference-manifest.js +1 -1
  13. package/.next/standalone/.next/server/app/api/export/usage/route.js +1 -1
  14. package/.next/standalone/.next/server/app/api/export/usage/route.js.nft.json +1 -1
  15. package/.next/standalone/.next/server/app/api/export/usage/route_client-reference-manifest.js +1 -1
  16. package/.next/standalone/.next/server/app/api/pricing/refresh/route.js +1 -0
  17. package/.next/standalone/.next/server/app/api/pricing/refresh/route.js.nft.json +1 -0
  18. package/.next/standalone/.next/server/app/api/pricing/refresh/route_client-reference-manifest.js +1 -0
  19. package/.next/standalone/.next/server/app/api/pricing/route.js +1 -1
  20. package/.next/standalone/.next/server/app/api/pricing/route.js.nft.json +1 -1
  21. package/.next/standalone/.next/server/app/api/pricing/route_client-reference-manifest.js +1 -1
  22. package/.next/standalone/.next/server/app/api/projects/route.js +1 -1
  23. package/.next/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  24. package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  25. package/.next/standalone/.next/server/app/api/scan/route.js +1 -1
  26. package/.next/standalone/.next/server/app/api/scan/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/scan/route_client-reference-manifest.js +1 -1
  28. package/.next/standalone/.next/server/app/api/sessions/route.js +1 -1
  29. package/.next/standalone/.next/server/app/api/sessions/route.js.nft.json +1 -1
  30. package/.next/standalone/.next/server/app/api/sessions/route_client-reference-manifest.js +1 -1
  31. package/.next/standalone/.next/server/app/api/turns/route.js +1 -1
  32. package/.next/standalone/.next/server/app/api/turns/route.js.nft.json +1 -1
  33. package/.next/standalone/.next/server/app/api/turns/route_client-reference-manifest.js +1 -1
  34. package/.next/standalone/.next/server/app/api/usage/route.js +1 -1
  35. package/.next/standalone/.next/server/app/api/usage/route.js.nft.json +1 -1
  36. package/.next/standalone/.next/server/app/api/usage/route_client-reference-manifest.js +1 -1
  37. package/.next/standalone/.next/server/app/models/page.js +2 -2
  38. package/.next/standalone/.next/server/app/models/page.js.nft.json +1 -1
  39. package/.next/standalone/.next/server/app/models/page_client-reference-manifest.js +1 -1
  40. package/.next/standalone/.next/server/app/page.js +2 -2
  41. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  42. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  43. package/.next/standalone/.next/server/app/projects/[id]/page.js +2 -2
  44. package/.next/standalone/.next/server/app/projects/[id]/page.js.nft.json +1 -1
  45. package/.next/standalone/.next/server/app/projects/[id]/page_client-reference-manifest.js +1 -1
  46. package/.next/standalone/.next/server/app/projects/page.js +2 -2
  47. package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
  48. package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  49. package/.next/standalone/.next/server/app/sessions/[id]/page.js +2 -2
  50. package/.next/standalone/.next/server/app/sessions/[id]/page.js.nft.json +1 -1
  51. package/.next/standalone/.next/server/app/sessions/[id]/page_client-reference-manifest.js +1 -1
  52. package/.next/standalone/.next/server/app/sessions/page.js +2 -2
  53. package/.next/standalone/.next/server/app/sessions/page.js.nft.json +1 -1
  54. package/.next/standalone/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  55. package/.next/standalone/.next/server/app/settings/page.js +2 -2
  56. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
  57. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  58. package/.next/standalone/.next/server/app/tools/page.js +2 -0
  59. package/.next/standalone/.next/server/app/tools/page.js.nft.json +1 -0
  60. package/.next/standalone/.next/server/app/tools/page_client-reference-manifest.js +1 -0
  61. package/.next/standalone/.next/server/app/usage/page.js +3 -3
  62. package/.next/standalone/.next/server/app/usage/page.js.nft.json +1 -1
  63. package/.next/standalone/.next/server/app/usage/page_client-reference-manifest.js +1 -1
  64. package/.next/standalone/.next/server/app-paths-manifest.json +9 -7
  65. package/.next/standalone/.next/server/chunks/177.js +28 -0
  66. package/.next/standalone/.next/server/chunks/195.js +1 -0
  67. package/.next/standalone/.next/server/chunks/68.js +1 -0
  68. package/.next/standalone/.next/server/chunks/704.js +1 -0
  69. package/.next/standalone/.next/server/chunks/860.js +1 -0
  70. package/.next/standalone/.next/server/chunks/98.js +1 -1
  71. package/.next/standalone/.next/server/functions-config-manifest.json +3 -2
  72. package/.next/standalone/.next/server/middleware-manifest.json +5 -5
  73. package/.next/standalone/.next/server/pages/500.html +1 -1
  74. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  75. package/.next/standalone/.next/static/chunks/148-086250dab6a8a8d0.js +1 -0
  76. package/.next/standalone/.next/static/chunks/app/api/blocks/route-bcee47c5d093728c.js +1 -0
  77. package/.next/standalone/.next/static/chunks/app/api/export/usage/route-bcee47c5d093728c.js +1 -0
  78. package/.next/standalone/.next/static/chunks/app/api/pricing/refresh/route-bcee47c5d093728c.js +1 -0
  79. package/.next/standalone/.next/static/chunks/app/api/pricing/route-bcee47c5d093728c.js +1 -0
  80. package/.next/standalone/.next/static/chunks/app/api/projects/route-bcee47c5d093728c.js +1 -0
  81. package/.next/standalone/.next/static/chunks/app/api/scan/route-bcee47c5d093728c.js +1 -0
  82. package/.next/standalone/.next/static/chunks/app/api/sessions/route-bcee47c5d093728c.js +1 -0
  83. package/.next/standalone/.next/static/chunks/app/api/turns/route-bcee47c5d093728c.js +1 -0
  84. package/.next/standalone/.next/static/chunks/app/api/usage/route-bcee47c5d093728c.js +1 -0
  85. package/.next/standalone/.next/static/chunks/app/layout-e349a18fcb94a7c0.js +1 -0
  86. package/.next/standalone/.next/static/chunks/app/loading-bcee47c5d093728c.js +1 -0
  87. package/.next/standalone/.next/static/chunks/app/settings/page-799eab6a6fb5294f.js +1 -0
  88. package/.next/standalone/.next/static/chunks/app/tools/page-f853bb04cc730994.js +1 -0
  89. package/.next/standalone/.next/static/chunks/app/usage/loading-bcee47c5d093728c.js +1 -0
  90. package/.next/standalone/.next/static/chunks/app/usage/page-64b22de6021c8bfb.js +1 -0
  91. package/.next/standalone/.next/static/css/cc3c7c3125ee7611.css +5 -0
  92. package/.next/standalone/.next/static/qXwEuv57GWCs9fn7xJz_q/_buildManifest.js +1 -0
  93. package/.next/standalone/package.json +2 -2
  94. package/CHANGELOG.md +113 -0
  95. package/README.md +1 -1
  96. package/README.zh-CN.md +2 -2
  97. package/dist/mcp/server.mjs +16 -16
  98. package/dist/report/index.mjs +29 -29
  99. package/package.json +2 -2
  100. package/.next/standalone/.next/server/chunks/567.js +0 -28
  101. package/.next/standalone/.next/server/chunks/697.js +0 -1
  102. package/.next/standalone/.next/server/chunks/716.js +0 -1
  103. package/.next/standalone/.next/server/chunks/730.js +0 -1
  104. package/.next/standalone/.next/static/OqoHJlqnd6wl-Y-PBHJaU/_buildManifest.js +0 -1
  105. package/.next/standalone/.next/static/chunks/148-1212b038580a0433.js +0 -1
  106. package/.next/standalone/.next/static/chunks/app/api/blocks/route-c50a1245d93c020a.js +0 -1
  107. package/.next/standalone/.next/static/chunks/app/api/export/usage/route-c50a1245d93c020a.js +0 -1
  108. package/.next/standalone/.next/static/chunks/app/api/pricing/route-c50a1245d93c020a.js +0 -1
  109. package/.next/standalone/.next/static/chunks/app/api/projects/route-c50a1245d93c020a.js +0 -1
  110. package/.next/standalone/.next/static/chunks/app/api/scan/route-c50a1245d93c020a.js +0 -1
  111. package/.next/standalone/.next/static/chunks/app/api/sessions/route-c50a1245d93c020a.js +0 -1
  112. package/.next/standalone/.next/static/chunks/app/api/turns/route-c50a1245d93c020a.js +0 -1
  113. package/.next/standalone/.next/static/chunks/app/api/usage/route-c50a1245d93c020a.js +0 -1
  114. package/.next/standalone/.next/static/chunks/app/layout-6eefa1ce02863d7b.js +0 -1
  115. package/.next/standalone/.next/static/chunks/app/loading-c50a1245d93c020a.js +0 -1
  116. package/.next/standalone/.next/static/chunks/app/settings/page-1ba7c4a4c0fae2f8.js +0 -1
  117. package/.next/standalone/.next/static/chunks/app/usage/loading-c50a1245d93c020a.js +0 -1
  118. package/.next/standalone/.next/static/chunks/app/usage/page-8ff1ec4ef6aa86a0.js +0 -1
  119. package/.next/standalone/.next/static/css/169dd00e280f7237.css +0 -5
  120. /package/.next/standalone/.next/static/{OqoHJlqnd6wl-Y-PBHJaU → qXwEuv57GWCs9fn7xJz_q}/_ssgManifest.js +0 -0
@@ -0,0 +1,5 @@
1
+ .rdp-root{--rdp-accent-color:blue;--rdp-accent-background-color:#f0f0ff;--rdp-day-height:44px;--rdp-day-width:44px;--rdp-day_button-border-radius:100%;--rdp-day_button-border:2px solid transparent;--rdp-day_button-height:42px;--rdp-day_button-width:42px;--rdp-selected-border:2px solid var(--rdp-accent-color);--rdp-disabled-opacity:0.5;--rdp-outside-opacity:0.75;--rdp-today-color:var(--rdp-accent-color);--rdp-dropdown-gap:0.5rem;--rdp-months-gap:2rem;--rdp-nav_button-disabled-opacity:0.5;--rdp-nav_button-height:2.25rem;--rdp-nav_button-width:2.25rem;--rdp-nav-height:2.75rem;--rdp-range_middle-background-color:var(--rdp-accent-background-color);--rdp-range_middle-color:inherit;--rdp-range_start-color:white;--rdp-range_start-background:linear-gradient(var(--rdp-gradient-direction),transparent 50%,var(--rdp-range_middle-background-color) 50%);--rdp-range_start-date-background-color:var(--rdp-accent-color);--rdp-range_end-background:linear-gradient(var(--rdp-gradient-direction),var(--rdp-range_middle-background-color) 50%,transparent 50%);--rdp-range_end-color:white;--rdp-range_end-date-background-color:var(--rdp-accent-color);--rdp-week_number-border-radius:100%;--rdp-week_number-border:2px solid transparent;--rdp-week_number-height:var(--rdp-day-height);--rdp-week_number-opacity:0.75;--rdp-week_number-width:var(--rdp-day-width);--rdp-weeknumber-text-align:center;--rdp-weekday-opacity:0.75;--rdp-weekday-padding:0.5rem 0rem;--rdp-weekday-text-align:center;--rdp-gradient-direction:90deg;--rdp-animation_duration:0.3s;--rdp-animation_timing:cubic-bezier(0.4,0,0.2,1)}.rdp-root[dir=rtl]{--rdp-gradient-direction:-90deg}.rdp-root[data-broadcast-calendar=true]{--rdp-outside-opacity:unset}.rdp-root{position:relative}.rdp-root,.rdp-root *{box-sizing:border-box}.rdp-day{width:var(--rdp-day-width);height:var(--rdp-day-height);text-align:center}.rdp-day_button{background:none;padding:0;margin:0;cursor:pointer;font:inherit;color:inherit;justify-content:center;align-items:center;display:flex;width:var(--rdp-day_button-width);height:var(--rdp-day_button-height);border:var(--rdp-day_button-border);border-radius:var(--rdp-day_button-border-radius)}.rdp-day_button:disabled{cursor:revert}.rdp-caption_label{z-index:1;position:relative;display:inline-flex;align-items:center;white-space:nowrap;border:0}.rdp-dropdown:focus-visible~.rdp-caption_label{outline:5px auto Highlight;outline:5px auto -webkit-focus-ring-color}.rdp-button_next,.rdp-button_previous{border:none;background:none;padding:0;margin:0;cursor:pointer;font:inherit;color:inherit;-moz-appearance:none;-webkit-appearance:none;display:inline-flex;align-items:center;justify-content:center;position:relative;appearance:none;width:var(--rdp-nav_button-width);height:var(--rdp-nav_button-height)}.rdp-button_next:disabled,.rdp-button_next[aria-disabled=true],.rdp-button_previous:disabled,.rdp-button_previous[aria-disabled=true]{cursor:revert;opacity:var(--rdp-nav_button-disabled-opacity)}.rdp-chevron{display:inline-block;fill:var(--rdp-accent-color)}.rdp-root[dir=rtl] .rdp-nav .rdp-chevron{transform:rotate(180deg);transform-origin:50%}.rdp-dropdowns{position:relative;display:inline-flex;align-items:center;gap:var(--rdp-dropdown-gap)}.rdp-dropdown{z-index:2;opacity:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;position:absolute;inset-block-start:0;inset-block-end:0;inset-inline-start:0;width:100%;margin:0;padding:0;cursor:inherit;border:none;line-height:inherit}.rdp-dropdown_root{position:relative;display:inline-flex;align-items:center}.rdp-dropdown_root[data-disabled=true] .rdp-chevron{opacity:var(--rdp-disabled-opacity)}.rdp-month_caption{display:flex;align-content:center;height:var(--rdp-nav-height);font-weight:700;font-size:large}.rdp-root[data-nav-layout=after] .rdp-month,.rdp-root[data-nav-layout=around] .rdp-month{position:relative}.rdp-root[data-nav-layout=around] .rdp-month_caption{justify-content:center;margin-inline-start:var(--rdp-nav_button-width);margin-inline-end:var(--rdp-nav_button-width);position:relative}.rdp-root[data-nav-layout=around] .rdp-button_previous{position:absolute;inset-inline-start:0;top:0;height:var(--rdp-nav-height);display:inline-flex}.rdp-root[data-nav-layout=around] .rdp-button_next{position:absolute;inset-inline-end:0;top:0;height:var(--rdp-nav-height);display:inline-flex;justify-content:center}.rdp-months{position:relative;display:flex;flex-wrap:wrap;gap:var(--rdp-months-gap);max-width:-moz-fit-content;max-width:fit-content}.rdp-month_grid{border-collapse:collapse}.rdp-nav{position:absolute;inset-block-start:0;inset-inline-end:0;display:flex;align-items:center;height:var(--rdp-nav-height)}.rdp-weekday{opacity:var(--rdp-weekday-opacity);padding:var(--rdp-weekday-padding);font-weight:500;font-size:smaller;text-align:var(--rdp-weekday-text-align);text-transform:var(--rdp-weekday-text-transform)}.rdp-week_number{opacity:var(--rdp-week_number-opacity);font-weight:400;font-size:small;height:var(--rdp-week_number-height);width:var(--rdp-week_number-width);border:var(--rdp-week_number-border);border-radius:var(--rdp-week_number-border-radius);text-align:var(--rdp-weeknumber-text-align)}.rdp-today:not(.rdp-outside){color:var(--rdp-today-color)}.rdp-selected{font-weight:700;font-size:large}.rdp-selected .rdp-day_button{border:var(--rdp-selected-border)}.rdp-outside{opacity:var(--rdp-outside-opacity)}.rdp-disabled:not(.rdp-selected){opacity:var(--rdp-disabled-opacity)}.rdp-hidden{visibility:hidden;color:var(--rdp-range_start-color)}.rdp-range_start{background:var(--rdp-range_start-background)}.rdp-range_start .rdp-day_button{background-color:var(--rdp-range_start-date-background-color);color:var(--rdp-range_start-color)}.rdp-range_middle{background-color:var(--rdp-range_middle-background-color)}.rdp-range_middle .rdp-day_button{border:unset;border-radius:unset;color:var(--rdp-range_middle-color)}.rdp-range_end{background:var(--rdp-range_end-background);color:var(--rdp-range_end-color)}.rdp-range_end .rdp-day_button{color:var(--rdp-range_start-color);background-color:var(--rdp-range_end-date-background-color)}.rdp-range_start.rdp-range_end{background:revert}.rdp-focusable{cursor:pointer}@keyframes rdp-slide_in_left{0%{transform:translateX(-100%)}to{transform:translateX(0)}}@keyframes rdp-slide_in_right{0%{transform:translateX(100%)}to{transform:translateX(0)}}@keyframes rdp-slide_out_left{0%{transform:translateX(0)}to{transform:translateX(-100%)}}@keyframes rdp-slide_out_right{0%{transform:translateX(0)}to{transform:translateX(100%)}}.rdp-weeks_before_enter{animation:rdp-slide_in_left var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}.rdp-weeks_before_exit{animation:rdp-slide_out_left var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}.rdp-weeks_after_enter{animation:rdp-slide_in_right var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}.rdp-weeks_after_exit{animation:rdp-slide_out_right var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}.rdp-root[dir=rtl] .rdp-weeks_after_enter{animation:rdp-slide_in_left var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}.rdp-root[dir=rtl] .rdp-weeks_before_exit{animation:rdp-slide_out_right var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}.rdp-root[dir=rtl] .rdp-weeks_before_enter{animation:rdp-slide_in_right var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}.rdp-root[dir=rtl] .rdp-weeks_after_exit{animation:rdp-slide_out_left var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}@keyframes rdp-fade_in{0%{opacity:0}to{opacity:1}}@keyframes rdp-fade_out{0%{opacity:1}to{opacity:0}}.rdp-caption_after_enter{animation:rdp-fade_in var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}.rdp-caption_after_exit{animation:rdp-fade_out var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}.rdp-caption_before_enter{animation:rdp-fade_in var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}.rdp-caption_before_exit{animation:rdp-fade_out var(--rdp-animation_duration) var(--rdp-animation_timing) forwards}*,:after,:before{--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/0.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/0.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: }
2
+
3
+ /*
4
+ ! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com
5
+ */*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:var(--font-sans),ui-sans-serif,system-ui,sans-serif;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,pre,samp{font-family:var(--font-mono),ui-monospace,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,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{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}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.card{border-radius:12px;border-width:1px;--tw-border-opacity:1;border-color:rgb(var(--border)/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(var(--bg-surface)/var(--tw-bg-opacity,1));box-shadow:var(--shadow-card)}.card-elevated{background:rgb(var(--bg-elevated));box-shadow:var(--shadow-popover)}.card-pad{padding:1.25rem}@media (min-width:640px){.card-pad{padding:1.5rem}}.label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;--tw-text-opacity:1;color:rgb(var(--text-tertiary)/var(--tw-text-opacity,1))}.num-hero{overflow-wrap:break-word;font-size:1.875rem;line-height:2.25rem;font-weight:600;--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);letter-spacing:-.025em;--tw-text-opacity:1;color:rgb(var(--text-primary)/var(--tw-text-opacity,1))}@media (min-width:640px){.num-hero{font-size:2rem;line-height:2.25rem}}.num-mid{font-size:1.5rem;line-height:2rem;font-weight:600;--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);--tw-text-opacity:1;color:rgb(var(--text-primary)/var(--tw-text-opacity,1))}.num-mono{font-family:var(--font-mono),ui-monospace,monospace;--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.pill{display:inline-flex;align-items:center;border-radius:8px;padding:.125rem .5rem;font-size:.75rem;font-weight:500;line-height:1.25rem}.pill-muted{padding:.125rem .5rem;font-size:.75rem;background-color:rgb(var(--bg-surface-hi)/var(--tw-bg-opacity,1));color:rgb(var(--text-secondary)/var(--tw-text-opacity,1))}.btn,.pill-muted{display:inline-flex;align-items:center;border-radius:8px;font-weight:500;line-height:1.25rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(var(--border)/var(--tw-border-opacity,1));--tw-bg-opacity:1;--tw-text-opacity:1}.btn{justify-content:center;gap:.375rem;background-color:rgb(var(--bg-surface)/var(--tw-bg-opacity,1));padding:.375rem .75rem;font-size:.875rem;color:rgb(var(--text-primary)/var(--tw-text-opacity,1));transition:background-color .15s,border-color .15s,color .15s,transform .1s,box-shadow .15s}.btn:hover:not(:disabled){background:rgb(var(--bg-surface-hi));border-color:rgb(var(--border-hi))}.btn:active:not(:disabled){transform:translateY(1px)}.btn:disabled{cursor:not-allowed;opacity:.5}.btn-ghost{display:inline-flex;align-items:center;justify-content:center;gap:.375rem;border-radius:8px;padding:.375rem .75rem;font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity:1;color:rgb(var(--text-secondary)/var(--tw-text-opacity,1));transition:background-color .15s,color .15s}.btn-ghost:hover:not(:disabled){color:rgb(var(--text-primary));background:rgb(var(--bg-surface-hi))}.btn-ghost:disabled{cursor:not-allowed;opacity:.4}.section-header{background:linear-gradient(to bottom,rgb(var(--bg-surface)) 0,rgb(var(--bg-surface-hi)/.4) 100%)}.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}.pointer-events-none{pointer-events:none}.\!visible{visibility:visible!important}.visible{visibility:visible}.collapse{visibility:collapse}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-y-0{top:0;bottom:0}.-bottom-\[12px\]{bottom:-12px}.bottom-0{bottom:0}.left-0{left:0}.right-0{right:0}.top-0{top:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-50{z-index:50}.m-4{margin:1rem}.mx-1\.5{margin-left:.375rem;margin-right:.375rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-auto{margin-top:auto}.\!block{display:block!important}.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}.contents{display:contents}.\!hidden{display:none!important}.hidden{display:none}.aspect-square{aspect-ratio:1/1}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-7{height:1.75rem}.h-72{height:18rem}.h-8{height:2rem}.h-\[2px\]{height:2px}.h-\[3px\]{height:3px}.h-full{height:100%}.max-h-48{max-height:12rem}.max-h-64{max-height:16rem}.max-h-72{max-height:18rem}.min-h-\[132px\]{min-height:132px}.min-h-\[160px\]{min-height:160px}.min-h-\[180px\]{min-height:180px}.min-h-\[232px\]{min-height:232px}.min-h-\[280px\]{min-height:280px}.min-h-\[64px\]{min-height:64px}.min-h-screen{min-height:100vh}.w-1\.5{width:.375rem}.w-12{width:3rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-4{width:1rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[26px\]{width:26px}.w-\[324px\]{width:324px}.w-full{width:100%}.min-w-0{min-width:0}.min-w-\[120px\]{min-width:120px}.min-w-\[168px\]{min-width:168px}.min-w-\[180px\]{min-width:180px}.min-w-\[200px\]{min-width:200px}.min-w-\[80px\]{min-width:80px}.max-w-2xl{max-width:42rem}.max-w-7xl{max-width:80rem}.max-w-\[160px\]{max-width:160px}.max-w-\[180px\]{max-width:180px}.max-w-\[280px\]{max-width:280px}.max-w-\[320px\]{max-width:320px}.max-w-full{max-width:100%}.max-w-md{max-width:28rem}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.translate-x-5{--tw-translate-x:1.25rem}.rotate-90,.translate-x-5{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate:90deg}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.cursor-help{cursor:help}.cursor-pointer{cursor:pointer}.cursor-progress{cursor:progress}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize{resize:both}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.grid-cols-\[auto_1fr_auto\]{grid-template-columns:auto 1fr auto}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-\[3px\]{gap:3px}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-y-0\.5{row-gap:.125rem}.gap-y-1\.5{row-gap:.375rem}.gap-y-3{row-gap:.75rem}.gap-y-\[3px\]{row-gap:3px}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.875rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.875rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.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))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-border>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(var(--border)/var(--tw-divide-opacity,1))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-\[3px\]{border-radius:3px}.rounded-\[4px\]{border-radius:4px}.rounded-button{border-radius:8px}.rounded-card{border-radius:12px}.rounded-full{border-radius:9999px}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.125rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-border{--tw-border-opacity:1;border-color:rgb(var(--border)/var(--tw-border-opacity,1))}.border-border-hi{--tw-border-opacity:1;border-color:rgb(var(--border-hi)/var(--tw-border-opacity,1))}.border-border\/60{border-color:rgb(var(--border)/.6)}.border-brand{--tw-border-opacity:1;border-color:rgb(var(--brand)/var(--tw-border-opacity,1))}.border-brand\/20{border-color:rgb(var(--brand)/.2)}.border-brand\/25{border-color:rgb(var(--brand)/.25)}.border-brand\/40{border-color:rgb(var(--brand)/.4)}.border-chart-cache-create\/25{border-color:rgb(var(--chart-cache-create)/.25)}.border-chart-input\/25{border-color:rgb(var(--chart-input)/.25)}.border-danger\/20{border-color:rgb(var(--danger)/.2)}.border-success\/20{border-color:rgb(var(--success)/.2)}.border-transparent{border-color:transparent}.border-warning\/20{border-color:rgb(var(--warning)/.2)}.border-warning\/25{border-color:rgb(var(--warning)/.25)}.bg-bg{--tw-bg-opacity:1;background-color:rgb(var(--bg-base)/var(--tw-bg-opacity,1))}.bg-bg-elevated{--tw-bg-opacity:1;background-color:rgb(var(--bg-elevated)/var(--tw-bg-opacity,1))}.bg-bg-surface{--tw-bg-opacity:1;background-color:rgb(var(--bg-surface)/var(--tw-bg-opacity,1))}.bg-bg-surface-hi{--tw-bg-opacity:1;background-color:rgb(var(--bg-surface-hi)/var(--tw-bg-opacity,1))}.bg-bg-surface-hi\/20{background-color:rgb(var(--bg-surface-hi)/.2)}.bg-bg-surface-hi\/30{background-color:rgb(var(--bg-surface-hi)/.3)}.bg-bg-surface-hi\/40{background-color:rgb(var(--bg-surface-hi)/.4)}.bg-bg-surface-hi\/60{background-color:rgb(var(--bg-surface-hi)/.6)}.bg-bg-surface\/40{background-color:rgb(var(--bg-surface)/.4)}.bg-border-hi{--tw-bg-opacity:1;background-color:rgb(var(--border-hi)/var(--tw-bg-opacity,1))}.bg-brand{--tw-bg-opacity:1;background-color:rgb(var(--brand)/var(--tw-bg-opacity,1))}.bg-brand-strong{--tw-bg-opacity:1;background-color:rgb(var(--brand-strong)/var(--tw-bg-opacity,1))}.bg-brand\/10{background-color:rgb(var(--brand)/.1)}.bg-brand\/5{background-color:rgb(var(--brand)/.05)}.bg-chart-cache-create{--tw-bg-opacity:1;background-color:rgb(var(--chart-cache-create)/var(--tw-bg-opacity,1))}.bg-chart-cache-create\/15{background-color:rgb(var(--chart-cache-create)/.15)}.bg-chart-cache-read{--tw-bg-opacity:1;background-color:rgb(var(--chart-cache-read)/var(--tw-bg-opacity,1))}.bg-chart-input{--tw-bg-opacity:1;background-color:rgb(var(--chart-input)/var(--tw-bg-opacity,1))}.bg-chart-output{--tw-bg-opacity:1;background-color:rgb(var(--chart-output)/var(--tw-bg-opacity,1))}.bg-danger{--tw-bg-opacity:1;background-color:rgb(var(--danger)/var(--tw-bg-opacity,1))}.bg-danger\/10{background-color:rgb(var(--danger)/.1)}.bg-success{--tw-bg-opacity:1;background-color:rgb(var(--success)/var(--tw-bg-opacity,1))}.bg-success\/10{background-color:rgb(var(--success)/.1)}.bg-warning{--tw-bg-opacity:1;background-color:rgb(var(--warning)/var(--tw-bg-opacity,1))}.bg-warning\/10{background-color:rgb(var(--warning)/.1)}.bg-gradient-to-l{background-image:linear-gradient(to left,var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-bg-surface{--tw-gradient-from:rgb(var(--bg-surface)/1) var(--tw-gradient-from-position);--tw-gradient-to:rgb(var(--bg-surface)/0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-brand{--tw-gradient-from:rgb(var(--brand)/1) var(--tw-gradient-from-position);--tw-gradient-to:rgb(var(--brand)/0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-brand\/0{--tw-gradient-from:rgb(var(--brand)/0) var(--tw-gradient-from-position);--tw-gradient-to:rgb(var(--brand)/0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-success\/0{--tw-gradient-from:rgb(var(--success)/0) var(--tw-gradient-from-position);--tw-gradient-to:rgb(var(--success)/0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-warning\/0{--tw-gradient-from:rgb(var(--warning)/0) var(--tw-gradient-from-position);--tw-gradient-to:rgb(var(--warning)/0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.via-brand\/70{--tw-gradient-to:rgb(var(--brand)/0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),rgb(var(--brand)/0.7) var(--tw-gradient-via-position),var(--tw-gradient-to)}.via-success\/70{--tw-gradient-to:rgb(var(--success)/0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),rgb(var(--success)/0.7) var(--tw-gradient-via-position),var(--tw-gradient-to)}.via-warning\/70{--tw-gradient-to:rgb(var(--warning)/0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),rgb(var(--warning)/0.7) var(--tw-gradient-via-position),var(--tw-gradient-to)}.to-brand-hover{--tw-gradient-to:rgb(var(--brand-hover)/1) var(--tw-gradient-to-position)}.to-brand\/0{--tw-gradient-to:rgb(var(--brand)/0) var(--tw-gradient-to-position)}.to-success\/0{--tw-gradient-to:rgb(var(--success)/0) var(--tw-gradient-to-position)}.to-transparent{--tw-gradient-to:transparent var(--tw-gradient-to-position)}.to-warning\/0{--tw-gradient-to:rgb(var(--warning)/0) var(--tw-gradient-to-position)}.object-contain{-o-object-fit:contain;object-fit:contain}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-14{padding-top:3.5rem;padding-bottom:3.5rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-1\.5{padding-bottom:.375rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pl-2{padding-left:.5rem}.pl-4{padding-left:1rem}.pr-1\.5{padding-right:.375rem}.pr-2{padding-right:.5rem}.pr-2\.5{padding-right:.625rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-\[18px\]{padding-top:18px}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[15px\]{font-size:15px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-\[0\.06em\]{letter-spacing:.06em}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.text-brand{--tw-text-opacity:1;color:rgb(var(--brand)/var(--tw-text-opacity,1))}.text-brand\/70{color:rgb(var(--brand)/.7)}.text-chart-cache-create{--tw-text-opacity:1;color:rgb(var(--chart-cache-create)/var(--tw-text-opacity,1))}.text-chart-input{--tw-text-opacity:1;color:rgb(var(--chart-input)/var(--tw-text-opacity,1))}.text-danger{--tw-text-opacity:1;color:rgb(var(--danger)/var(--tw-text-opacity,1))}.text-success{--tw-text-opacity:1;color:rgb(var(--success)/var(--tw-text-opacity,1))}.text-text-primary{--tw-text-opacity:1;color:rgb(var(--text-primary)/var(--tw-text-opacity,1))}.text-text-secondary{--tw-text-opacity:1;color:rgb(var(--text-secondary)/var(--tw-text-opacity,1))}.text-text-tertiary{--tw-text-opacity:1;color:rgb(var(--text-tertiary)/var(--tw-text-opacity,1))}.text-warning{--tw-text-opacity:1;color:rgb(var(--warning)/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-white\/80{color:rgb(255 255 255/.8)}.underline{text-decoration-line:underline}.accent-brand{accent-color:rgb(var(--brand)/1)}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-90{opacity:.9}.shadow-lg{--tw-shadow:0 10px 15px -3px rgb(0 0 0/0.1),0 4px 6px -4px rgb(0 0 0/0.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-lg,.shadow-popover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-popover{--tw-shadow:var(--shadow-popover);--tw-shadow-colored:var(--shadow-popover)}.shadow-sm{--tw-shadow:0 1px 2px 0 rgb(0 0 0/0.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-sm,.shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgb(0 0 0/0.1),0 8px 10px -6px rgb(0 0 0/0.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)}.outline-none{outline:2px solid transparent;outline-offset:2px}.ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-brand\/40{--tw-ring-color:rgb(var(--brand)/0.4)}.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-md{--tw-backdrop-blur:blur(12px)}.backdrop-blur-md,.backdrop-filter{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-\[transform\2c width\]{transition-property:transform,width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-100{transition-duration:.1s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-500{transition-duration:.5s}.ease-out-soft{transition-timing-function:var(--ease-out-soft)}.\[ccgauge\:api\]{ccgauge:api}.\[ccgauge\:indexer\]{ccgauge:indexer}.\[grid-template-columns\:auto_1fr\]{grid-template-columns:auto 1fr}.\[grid-template-columns\:repeat\(24\2c minmax\(0\2c 1fr\)\)\]{grid-template-columns:repeat(24,minmax(0,1fr))}.theme-dark,:root{--bg-base:10 10 10;--bg-surface:22 22 22;--bg-surface-hi:32 32 34;--bg-elevated:38 38 42;--border:38 38 42;--border-hi:64 64 70;--text-primary:250 250 250;--text-secondary:168 168 174;--text-tertiary:120 120 128;--brand:129 140 248;--brand-hover:165 180 252;--brand-strong:99 102 241;--success:34 197 94;--warning:250 204 21;--danger:248 113 113;--chart-input:96 165 250;--chart-output:251 146 60;--chart-cache-read:52 211 153;--chart-cache-create:167 139 250;--chart-grid:38 38 42;--chart-axis:120 120 128;--shadow-card:0 1px 0 0 rgb(255 255 255/0.02),0 4px 12px -4px rgb(0 0 0/0.4);--shadow-card-hover:0 1px 0 0 rgb(255 255 255/0.04),0 8px 24px -8px rgb(0 0 0/0.6);--shadow-popover:0 4px 12px -2px rgb(0 0 0/0.4),0 16px 48px -8px rgb(0 0 0/0.6);--ring-focus:129 140 248;--ease-out-soft:cubic-bezier(0.16,1,0.3,1)}.theme-light{--bg-base:252 252 253;--bg-surface:255 255 255;--bg-surface-hi:247 247 249;--bg-elevated:250 250 252;--border:226 226 232;--border-hi:200 200 208;--text-primary:17 17 23;--text-secondary:82 82 91;--text-tertiary:145 145 156;--brand:79 70 229;--brand-hover:67 56 202;--brand-strong:79 70 229;--success:22 163 74;--warning:217 119 6;--danger:220 38 38;--chart-input:37 99 235;--chart-output:234 88 12;--chart-cache-read:22 163 74;--chart-cache-create:124 58 237;--chart-grid:232 232 238;--chart-axis:113 113 122;--shadow-card:0 1px 2px 0 rgb(15 23 42/0.04),0 1px 3px 0 rgb(15 23 42/0.04);--shadow-card-hover:0 4px 12px -2px rgb(15 23 42/0.08),0 8px 32px -8px rgb(15 23 42/0.06);--shadow-popover:0 8px 24px -4px rgb(15 23 42/0.08),0 16px 48px -8px rgb(15 23 42/0.08);--ring-focus:79 70 229}:root{--font-sans:"Geist Sans","Inter",-apple-system,BlinkMacSystemFont,"Segoe UI",system-ui,"PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;--font-mono:"Geist Mono","JetBrains Mono",ui-monospace,SFMono-Regular,Menlo,monospace}*{border-color:rgb(var(--border))}html{overflow-y:scroll;scrollbar-gutter:stable}body,html{background:rgb(var(--bg-base));color:rgb(var(--text-primary));font-family:var(--font-sans);font-feature-settings:"cv11","ss01","ss03";-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility}body{min-height:100vh}::-moz-selection{background:rgb(var(--brand)/.25);color:rgb(var(--text-primary))}::selection{background:rgb(var(--brand)/.25);color:rgb(var(--text-primary))}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:rgb(var(--border-hi)/.7);border:2px solid transparent;background-clip:padding-box;border-radius:6px}::-webkit-scrollbar-thumb:hover{background:rgb(var(--text-tertiary)/.7);background-clip:padding-box}.scrollbar-thin::-webkit-scrollbar{width:6px;height:6px}.scrollbar-thin::-webkit-scrollbar-thumb{background:rgb(var(--border-hi)/.5);border:0;border-radius:3px}.nav-scroller{scrollbar-width:none}.nav-scroller::-webkit-scrollbar{display:none;width:0;height:0}:where(button,a,input,select,textarea,[tabindex]):focus-visible{outline:2px solid rgb(var(--ring-focus)/.6);outline-offset:2px;border-radius:6px}@media (prefers-reduced-motion:reduce){*,:after,:before{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}@keyframes dash-rise{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}@keyframes bar-grow{0%{transform:scaleX(0)}to{transform:scaleX(1)}}@keyframes shimmer{0%{background-position:-180% 0}to{background-position:180% 0}}.dash-stagger>*{animation:dash-rise .42s var(--ease-out-soft) both}.dash-stagger>:first-child{animation-delay:.02s}.dash-stagger>:nth-child(2){animation-delay:.07s}.dash-stagger>:nth-child(3){animation-delay:.12s}.dash-stagger>:nth-child(4){animation-delay:.17s}.dash-stagger>:nth-child(5){animation-delay:.22s}.dash-stagger>:nth-child(n+6){animation-delay:.26s}.bar-grow{transform-origin:left center;animation:bar-grow .6s var(--ease-out-soft) both}.skeleton-shimmer{background-color:rgb(var(--bg-surface-hi));background-image:linear-gradient(90deg,transparent 0,rgb(var(--text-tertiary)/.08) 50%,transparent 100%);background-size:180% 100%;background-repeat:no-repeat;animation:shimmer 1.5s ease-in-out infinite}@media (prefers-reduced-motion:reduce){.bar-grow,.dash-stagger>*{animation:none!important;transform:none!important;opacity:1!important}.skeleton-shimmer{animation:none!important;background-image:none!important}}.divider-soft{border-top:1px solid rgb(var(--border))}html[data-usage-overview=hidden] .usage-overview-block{display:none}.rdp-root{--rdp-accent-color:rgb(var(--brand-strong));--rdp-accent-background-color:rgb(var(--brand)/0.14);--rdp-today-color:rgb(var(--brand));--rdp-day-height:2.25rem;--rdp-day-width:2.25rem;--rdp-day_button-height:2.25rem;--rdp-day_button-width:2.25rem;--rdp-day_button-border-radius:8px;--rdp-day_button-border:1px solid transparent;--rdp-nav_button-height:1.75rem;--rdp-nav_button-width:1.75rem;--rdp-disabled-opacity:0.32;--rdp-outside-opacity:0.32;--rdp-selected-border:none;--rdp-weekday-opacity:1;--rdp-months-gap:0.75rem}.rdp-caption_label,.rdp-root{color:rgb(var(--text-primary))}.rdp-caption_label{font-weight:600;font-size:.875rem;letter-spacing:-.005em}.rdp-weekday{color:rgb(var(--text-tertiary));font-weight:600;font-size:.6875rem;letter-spacing:.04em;text-transform:uppercase;padding-bottom:.25rem}.rdp-day_button{font-weight:500;font-size:.8125rem;font-variant-numeric:tabular-nums;color:rgb(var(--text-primary));transition:background-color .15s,color .15s,box-shadow .15s}.rdp-day_button:hover:not([disabled]):not(.rdp-selected .rdp-day_button){background-color:rgb(var(--bg-surface-hi));color:rgb(var(--text-primary))}.rdp-day_button:focus-visible{outline:none;box-shadow:0 0 0 2px rgb(var(--brand)/.4);z-index:1}.rdp-selected .rdp-day_button{font-weight:600}.rdp-today:not(.rdp-selected) .rdp-day_button{color:rgb(var(--brand))}.rdp-today .rdp-day_button{position:relative}.rdp-today .rdp-day_button:after{content:"";position:absolute;left:50%;bottom:3px;width:3px;height:3px;margin-left:-1.5px;border-radius:999px;background:rgb(var(--brand))}.rdp-today.rdp-selected .rdp-day_button:after{background:rgb(255 255 255/.85)}.rdp-button_next,.rdp-button_previous{color:rgb(var(--text-tertiary));border-radius:8px;transition:background-color .15s,color .15s}.rdp-button_next:hover:not([disabled]),.rdp-button_previous:hover:not([disabled]){color:rgb(var(--text-primary));background-color:rgb(var(--bg-surface-hi))}.rdp-button_next:focus-visible,.rdp-button_previous:focus-visible{outline:none;box-shadow:0 0 0 2px rgb(var(--brand)/.4)}.rdp-button_next:disabled,.rdp-button_previous:disabled{opacity:.4;cursor:not-allowed}.rdp-range_middle .rdp-day_button{background-color:transparent;color:rgb(var(--text-primary));font-weight:500}.rdp-month_caption{padding:0 0 .5rem}.placeholder\:text-text-tertiary::-moz-placeholder{--tw-text-opacity:1;color:rgb(var(--text-tertiary)/var(--tw-text-opacity,1))}.placeholder\:text-text-tertiary::placeholder{--tw-text-opacity:1;color:rgb(var(--text-tertiary)/var(--tw-text-opacity,1))}.last\:border-b-0:last-child{border-bottom-width:0}.hover\:z-10:hover{z-index:10}.hover\:scale-125:hover{--tw-scale-x:1.25;--tw-scale-y:1.25;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-border-hi:hover{--tw-border-opacity:1;border-color:rgb(var(--border-hi)/var(--tw-border-opacity,1))}.hover\:border-brand\/60:hover{border-color:rgb(var(--brand)/.6)}.hover\:border-text-tertiary:hover{--tw-border-opacity:1;border-color:rgb(var(--text-tertiary)/var(--tw-border-opacity,1))}.hover\:bg-bg-surface-hi:hover{--tw-bg-opacity:1;background-color:rgb(var(--bg-surface-hi)/var(--tw-bg-opacity,1))}.hover\:bg-bg-surface-hi\/30:hover{background-color:rgb(var(--bg-surface-hi)/.3)}.hover\:bg-bg-surface-hi\/40:hover{background-color:rgb(var(--bg-surface-hi)/.4)}.hover\:bg-bg-surface-hi\/60:hover{background-color:rgb(var(--bg-surface-hi)/.6)}.hover\:bg-brand-hover:hover{--tw-bg-opacity:1;background-color:rgb(var(--brand-hover)/var(--tw-bg-opacity,1))}.hover\:bg-brand\/15:hover{background-color:rgb(var(--brand)/.15)}.hover\:bg-brand\/20:hover{background-color:rgb(var(--brand)/.2)}.hover\:text-brand:hover{--tw-text-opacity:1;color:rgb(var(--brand)/var(--tw-text-opacity,1))}.hover\:text-text-primary:hover{--tw-text-opacity:1;color:rgb(var(--text-primary)/var(--tw-text-opacity,1))}.hover\:opacity-90:hover{opacity:.9}.hover\:ring-1:hover{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.hover\:ring-brand\/60:hover{--tw-ring-color:rgb(var(--brand)/0.6)}.focus\:border-border-hi:focus{--tw-border-opacity:1;border-color:rgb(var(--border-hi)/var(--tw-border-opacity,1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus-visible\:bg-bg-surface-hi\/50:focus-visible{background-color:rgb(var(--bg-surface-hi)/.5)}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-brand\/40:focus-visible{--tw-ring-color:rgb(var(--brand)/0.4)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:hover\:bg-brand-strong:hover:disabled{--tw-bg-opacity:1;background-color:rgb(var(--brand-strong)/var(--tw-bg-opacity,1))}.group:hover .group-hover\:text-brand{--tw-text-opacity:1;color:rgb(var(--brand)/var(--tw-text-opacity,1))}.group:hover .group-hover\:brightness-110{--tw-brightness:brightness(1.1);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)}@media (min-width:640px){.sm\:mt-0{margin-top:0}.sm\:inline{display:inline}.sm\:flex{display:flex}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-start{align-items:flex-start}.sm\:items-end{align-items:flex-end}.sm\:items-baseline{align-items:baseline}.sm\:justify-between{justify-content:space-between}.sm\:gap-2\.5{gap:.625rem}.sm\:gap-4{gap:1rem}.sm\: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))}.sm\:p-6{padding:1.5rem}.sm\:px-3{padding-left:.75rem;padding-right:.75rem}.sm\:px-5{padding-left:1.25rem;padding-right:1.25rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-16{padding-top:4rem;padding-bottom:4rem}.sm\:py-8{padding-top:2rem;padding-bottom:2rem}.sm\:pt-5{padding-top:1.25rem}.sm\:pt-\[22px\]{padding-top:22px}.sm\:text-\[1\.75rem\]{font-size:1.75rem}}@media (min-width:768px){.md\:flex{display:flex}.md\:w-\[170px\]{width:170px}.md\:shrink-0{flex-shrink:0}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:flex-col{flex-direction:column}.md\:gap-8{gap:2rem}}@media (min-width:1024px){.lg\:col-span-2{grid-column:span 2/span 2}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}
@@ -0,0 +1 @@
1
+ self.__BUILD_MANIFEST=function(e,r,t,_){return{__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},__routerFilterStatic:{numItems:17,errorRate:1e-4,numBits:326,numHashes:14,bitArray:[0,1,0,r,1,e,e,r,e,e,e,r,e,e,e,r,r,e,r,e,e,r,e,e,r,r,e,r,e,r,r,r,r,e,e,e,r,e,r,e,r,r,e,r,e,e,r,r,e,e,r,e,r,e,r,e,e,e,r,e,r,e,e,e,r,r,r,e,e,e,r,e,e,r,e,e,e,r,e,r,e,e,e,e,e,e,e,r,e,e,e,e,e,e,e,e,r,r,e,e,e,r,r,e,r,r,e,r,e,e,r,r,e,r,r,e,e,r,e,r,r,e,r,r,e,e,e,r,e,r,e,e,e,r,e,r,e,r,r,e,r,r,e,e,e,e,r,r,r,r,e,e,e,e,e,e,e,r,r,r,r,r,e,r,r,e,r,r,r,r,r,r,e,e,e,e,r,r,e,e,r,e,r,e,e,r,e,e,e,e,e,e,r,r,e,r,e,e,e,r,r,e,e,e,r,e,e,e,r,r,r,r,r,e,r,r,r,r,e,r,e,e,e,e,r,e,r,r,r,r,e,e,e,e,e,e,r,r,r,r,e,r,e,e,e,r,r,r,r,r,r,e,e,r,r,r,r,e,e,r,r,e,r,e,r,e,r,r,e,e,r,e,r,r,e,r,r,e,r,e,e,e,r,e,r,r,r,r,r,r,r,e,e,r,r,r,r,e,r,r,r,r,e,e,e,e,e,e,r,e,e,e,e,r,e,r,e,r,e,e,r,r,r,r,e,r]},__routerFilterDynamic:{numItems:2,errorRate:1e-4,numBits:39,numHashes:14,bitArray:[e,e,e,e,e,e,r,e,e,e,r,r,e,r,r,r,r,e,e,r,e,r,e,e,e,r,r,e,e,e,e,e,r,e,r,r,r,r,r]},"/_error":["static/chunks/pages/_error-022e4ac7bbb9914f.js"],sortedPages:["/_app","/_error"]}}(1,0,1e-4,14),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ccgauge",
3
- "version": "1.2.1",
3
+ "version": "1.3.0",
4
4
  "description": "Local web dashboard for Claude Code and OpenAI Codex CLI token usage and cost",
5
5
  "keywords": [
6
6
  "claude",
@@ -65,7 +65,7 @@
65
65
  "lint": "eslint .",
66
66
  "typecheck": "tsc --noEmit",
67
67
  "update-pricing": "node scripts/update-pricing.mjs",
68
- "test": "node --experimental-strip-types --no-warnings scripts/test-codex-parser.mjs && node --experimental-strip-types --no-warnings scripts/test-pricing-snapshot.mjs && node --experimental-strip-types --no-warnings scripts/test-turns.mjs && node --experimental-strip-types --no-warnings scripts/test-sidechain.mjs && node --experimental-strip-types --no-warnings scripts/test-source-merge.mjs && node --experimental-strip-types --no-warnings scripts/test-cost-from-usage.mjs && node --experimental-strip-types --no-warnings scripts/test-range.mjs && node scripts/check-parser-versions.mjs && node scripts/check-readme-images.mjs",
68
+ "test": "node --experimental-strip-types --no-warnings scripts/test-codex-parser.mjs && node --experimental-strip-types --no-warnings scripts/test-pricing-snapshot.mjs && node --experimental-strip-types --no-warnings scripts/test-pricing-store.mjs && node --experimental-strip-types --no-warnings scripts/test-turns.mjs && node --experimental-strip-types --no-warnings scripts/test-sidechain.mjs && node --experimental-strip-types --no-warnings scripts/test-source-merge.mjs && node --experimental-strip-types --no-warnings scripts/test-cost-from-usage.mjs && node --experimental-strip-types --no-warnings scripts/test-range.mjs && node scripts/check-parser-versions.mjs && node scripts/check-readme-images.mjs",
69
69
  "test:mcp": "node scripts/test-mcp-server.mjs",
70
70
  "clean": "node -e \"for (const p of ['.next','node_modules','tsconfig.tsbuildinfo']) require('node:fs').rmSync(p,{recursive:true,force:true})\"",
71
71
  "screenshots": "node scripts/screenshots.mjs",
package/CHANGELOG.md CHANGED
@@ -5,6 +5,119 @@ All notable changes to **ccgauge** are documented here.
5
5
  The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and
6
6
  this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.3.0] — 2026-07-20
9
+
10
+ Two headline features. **Tools & skills**: a new page that answers "which
11
+ tool or skill is eating my tokens?"
12
+ ([#1](https://github.com/chengzuopeng/ccgauge/issues/1)). **Live pricing**:
13
+ ccgauge can now refresh its model-price table from LiteLLM at runtime instead
14
+ of only shipping a build-time snapshot.
15
+
16
+ ### Added
17
+
18
+ - **Tools & skills page** (`/tools`, under the new Analytics nav dropdown) —
19
+ ranks every tool, skill, and MCP server by **estimated context footprint**:
20
+ the size of each tool_result / skill-body payload is attributed to the
21
+ tool that produced it and converted to tokens at ~4 chars/token. Three
22
+ breakdown dimensions (by skill / by tool / by MCP server), top-consumer
23
+ emphasis, and expandable per-row stats (invocations, sessions, avg per
24
+ call, largest single payload). The numbers are estimates — Anthropic
25
+ doesn't bill per tool, and the page says so — but the *ranking* is what
26
+ finds the skill that's quietly costing 80% of your context. Claude source
27
+ only for now; Codex rollout files don't carry the needed shape.
28
+ - **Skill-body measurement.** A skill invocation's real payload is the
29
+ synthetic "Base directory for this skill:" message, not the tiny
30
+ "Launching skill: X" tool_result ack. The parser now measures that body
31
+ and credits it to the skill by name (claude parserVersion bumped to v6;
32
+ the persisted index reparses automatically on first load).
33
+ - **Runtime pricing refresh.** On the first page load the web server fetches
34
+ LiteLLM's price table in the background, validates it, and caches it to
35
+ `~/.ccgauge/cache/litellm-pricing.json` (24 h TTL, atomic write). The cached
36
+ overlay layers on top of the committed snapshot, so a newly-released model
37
+ (e.g. `gpt-5.6`, `claude-sonnet-5`) is priced correctly without waiting for a
38
+ ccgauge release. The fetch is single-flighted, 5 s-timeout-bounded, and never
39
+ blocks a request; a bad/short upstream table is rejected and the built-in
40
+ snapshot stays in place.
41
+ - **"Refresh prices" button** on the Settings pricing panel, plus a source line
42
+ showing whether prices are the built-in snapshot or a cached LiteLLM copy and
43
+ when it was fetched.
44
+ - **`CCGAUGE_OFFLINE=1`** (or `CCGAUGE_PRICING_OFFLINE=1`) disables all pricing
45
+ network access; the CLI and MCP server never fetch regardless — they only read
46
+ the on-disk overlay.
47
+
48
+ ### Changed
49
+
50
+ - **Nav: analytics pages folded into a dropdown.** Sessions / Projects /
51
+ Models / Tools now live under one "Analytics" item with a hover dropdown
52
+ (opens on focus too, so touch works). The sliding underline parks on
53
+ Analytics whenever a sub-route is active, and the active sub-page is
54
+ highlighted inside the menu.
55
+ - Provider cost resolution now reads a runtime pricing overlay (built-in
56
+ snapshot → on-disk LiteLLM cache) shared by the dashboard, CLI, and MCP server,
57
+ so a refresh flows into cost math everywhere, not just the settings table.
58
+ - Privacy copy updated: the README and Settings "About" note now state that the
59
+ only optional outbound request is the LiteLLM price fetch (off with
60
+ `CCGAUGE_OFFLINE=1`); your usage data still never leaves the machine.
61
+ - Refreshed the committed LiteLLM snapshot (adds `gpt-5.6*`, `claude-sonnet-5`).
62
+
63
+ ### Fixed
64
+
65
+ - **Dedup no longer drops tool_use ids from streamed turns.** A streamed
66
+ assistant turn is split across several JSONL records sharing
67
+ `messageId::requestId` (thinking / text / tool_use chunks); dedup kept only
68
+ the earliest record — often the thinking-only chunk — silently discarding
69
+ 96% of tool_use ids. Harmless before, but it would have left the new
70
+ by-tool attribution ~75% "(unknown)". Dedup now unions tool_use refs
71
+ across the chunk group (usage/cost math unchanged).
72
+
73
+ ## [1.2.3] — 2026-07-08
74
+
75
+ Two fixes to the `/usage` overview area.
76
+
77
+ ### Fixed
78
+
79
+ - **The "Overview" toggle now actually hides the overview.** The eye button in
80
+ the Usage header is meant to collapse the KPI cards *and* the trend chart in
81
+ one click (its own tooltip reads "KPIs + trend"), leaving just the Requests
82
+ table. But neither element carried the `.usage-overview-block` class the CSS
83
+ targets, so the button flipped its state and nothing moved. The KPI grid, the
84
+ Trend section, and both of their loading skeletons now carry the class, so the
85
+ toggle collapses and restores the whole overview as intended.
86
+ - **Restored the gap between the trend chart and the Requests table.** The
87
+ Requests section was missing its top margin and sat flush against the trend
88
+ card; it now uses `mt-4` to match the vertical rhythm of the rest of the page.
89
+
90
+ ## [1.2.2] — 2026-06-19
91
+
92
+ Fixes a real footgun in the v1.2.0 Codex fast-tier multiplier: the result of
93
+ reading `~/.codex/config.toml` was memoized at module load, so toggling
94
+ `service_tier` required a full server restart to take effect. The detection
95
+ logic itself is intentionally kept identical to ccusage's
96
+ `adapter/codex/speed.rs` — that's the only practical proxy available, since
97
+ the rollout JSONL doesn't record the active service tier per turn.
98
+
99
+ ### Fixed
100
+
101
+ - **No more boot-time cache on the fast-tier detection.**
102
+ `detectCodexFastTier()` now re-reads `config.toml` on every call (a
103
+ ~few-hundred-byte read per request, negligible). Live verification: with
104
+ `service_tier="fast"` Codex totals come in at \$256.76; flip to
105
+ `"default"` mid-session and the next `/api/turns` request reports \$102.70
106
+ with `codexFastActive=false`; flip back to `"fast"` and it returns to
107
+ \$256.76 — all without touching the process.
108
+
109
+ ### Known limitation
110
+
111
+ - **Per-turn fast-mode is unrecoverable from rollout data.** If you toggle
112
+ `service_tier` over time, historical turns recorded under the previous
113
+ setting are still billed at the *current* setting's rate. ccusage
114
+ v20.0.14 has the same behavior. The dashboard reflects "what would my
115
+ bill be if every Codex turn ran under the active tier", not absolute
116
+ historical truth — there is no field in the rollout JSONL that records
117
+ the tier at API-call time (verified by exhaustive inspection of every
118
+ payload across `token_count` / `session_meta` / `turn_context` events
119
+ plus `~/.codex/.codex-global-state.json`).
120
+
8
121
  ## [1.2.1] — 2026-06-18
9
122
 
10
123
  Fixes two stacking / clipping bugs on the usage page that made dropdowns
package/README.md CHANGED
@@ -21,7 +21,7 @@ npx ccgauge
21
21
 
22
22
  ccgauge reads the JSONL session files Claude Code and Codex CLI already store on your disk, computes day / project / model / session breakdowns plus **dollar-equivalent cost**, and opens a unified browser dashboard. Switch providers with one click. Ask your LLM about your usage via the built-in MCP server. Or skip the browser entirely and run `ccgauge report -d` for a rich terminal dashboard.
23
23
 
24
- **No login. No telemetry. No outbound network calls.**
24
+ **No login. No telemetry. Your usage data never leaves your machine** — the only outbound request fetches public model prices from LiteLLM, and `CCGAUGE_OFFLINE=1` turns even that off.
25
25
 
26
26
  ![Overview — English / Dark](https://raw.githubusercontent.com/chengzuopeng/ccgauge/main/docs/screenshots/overview-en-dark.png)
27
27
 
package/README.zh-CN.md CHANGED
@@ -33,7 +33,7 @@ ccgauge 读取 Claude Code 和 Codex CLI 本地已经写下的 JSONL 会话文
33
33
  - 💰 **缓存节省单独成卡。** 直接看本周 Anthropic prompt caching 帮你省了多少美元 —— 不是脚注,是 KPI 大卡。
34
34
  - ⏱️ **5 小时窗口实时进度。** 倒计时、进度条、预计总花费 —— 在被限速前就知道窗口什么时候重置。
35
35
  - 🤖 **MCP 原生支持。** 连上 Claude Desktop / Cursor / Cline,直接问*「我昨天都做了啥,按项目分一下?」* —— 真实数字、不截图、不复制粘贴。
36
- - 🔒 **100% 本地、隐私优先。** 只读你已有的 JSONL 文件,零外网调用,MIT 开源,对话内容全程不出本机。
36
+ - 🔒 **本地优先、隐私第一。** 只读你已有的 JSONL 文件,对话内容全程不出本机,MIT 开源。唯一的外网请求是从 LiteLLM 拉取公开的模型价格(设 `CCGAUGE_OFFLINE=1` 可关闭)。
37
37
  - 🪜 **Worktree 感知。** 同一个 repo 的所有 worktree 自动合并到同一个项目行 —— 跟你的思维模型一致。
38
38
 
39
39
  ## v1.1.0 新特性
@@ -72,7 +72,7 @@ ccgauge 读取 Claude Code 和 Codex CLI 本地已经写下的 JSONL 会话文
72
72
  - 内置价格表:12 个 Claude 模型 + gpt-5 系列 + o 系列;未知模型自动回退到同 family 最新单价。
73
73
 
74
74
  ### 隐私优先
75
- - 100% 本地:只读 JSONL 文件,零外网调用。
75
+ - 本地优先:只读 JSONL 文件;唯一的外网请求是从 LiteLLM 拉取公开价格,设 `CCGAUGE_OFFLINE=1` 可关闭。
76
76
  - 开源,MIT。
77
77
  - 后台常驻模式,配套 `start / stop / restart / status / open / logs` 完整生命周期。
78
78