aigetwey 1.4.2 → 1.4.3

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 (166) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +8 -1
  3. package/dashboard/.next/BUILD_ID +1 -1
  4. package/dashboard/.next/build-manifest.json +3 -3
  5. package/dashboard/.next/diagnostics/route-bundle-stats.json +26 -26
  6. package/dashboard/.next/fallback-build-manifest.json +3 -3
  7. package/dashboard/.next/server/app/(console)/combos/page_client-reference-manifest.js +1 -1
  8. package/dashboard/.next/server/app/(console)/config/page_client-reference-manifest.js +1 -1
  9. package/dashboard/.next/server/app/(console)/console/page_client-reference-manifest.js +1 -1
  10. package/dashboard/.next/server/app/(console)/endpoint/page_client-reference-manifest.js +1 -1
  11. package/dashboard/.next/server/app/(console)/keys/page_client-reference-manifest.js +1 -1
  12. package/dashboard/.next/server/app/(console)/page_client-reference-manifest.js +1 -1
  13. package/dashboard/.next/server/app/(console)/providers/[id]/page_client-reference-manifest.js +1 -1
  14. package/dashboard/.next/server/app/(console)/providers/page_client-reference-manifest.js +1 -1
  15. package/dashboard/.next/server/app/(console)/quota/page_client-reference-manifest.js +1 -1
  16. package/dashboard/.next/server/app/(console)/tools/[id]/page_client-reference-manifest.js +1 -1
  17. package/dashboard/.next/server/app/(console)/tools/page_client-reference-manifest.js +1 -1
  18. package/dashboard/.next/server/app/(console)/usage/page_client-reference-manifest.js +1 -1
  19. package/dashboard/.next/server/app/_global-error.html +1 -1
  20. package/dashboard/.next/server/app/_global-error.rsc +1 -1
  21. package/dashboard/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  22. package/dashboard/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  23. package/dashboard/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  24. package/dashboard/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  25. package/dashboard/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  26. package/dashboard/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  27. package/dashboard/.next/server/app/_not-found.html +1 -1
  28. package/dashboard/.next/server/app/_not-found.rsc +2 -2
  29. package/dashboard/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  30. package/dashboard/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  31. package/dashboard/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  32. package/dashboard/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  33. package/dashboard/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  34. package/dashboard/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  35. package/dashboard/.next/server/app/combos.html +1 -1
  36. package/dashboard/.next/server/app/combos.rsc +5 -5
  37. package/dashboard/.next/server/app/combos.segments/!KGNvbnNvbGUp/combos/__PAGE__.segment.rsc +2 -2
  38. package/dashboard/.next/server/app/combos.segments/!KGNvbnNvbGUp/combos.segment.rsc +1 -1
  39. package/dashboard/.next/server/app/combos.segments/!KGNvbnNvbGUp.segment.rsc +3 -3
  40. package/dashboard/.next/server/app/combos.segments/_full.segment.rsc +5 -5
  41. package/dashboard/.next/server/app/combos.segments/_head.segment.rsc +1 -1
  42. package/dashboard/.next/server/app/combos.segments/_index.segment.rsc +2 -2
  43. package/dashboard/.next/server/app/combos.segments/_tree.segment.rsc +2 -2
  44. package/dashboard/.next/server/app/config.html +1 -1
  45. package/dashboard/.next/server/app/config.rsc +5 -5
  46. package/dashboard/.next/server/app/config.segments/!KGNvbnNvbGUp/config/__PAGE__.segment.rsc +2 -2
  47. package/dashboard/.next/server/app/config.segments/!KGNvbnNvbGUp/config.segment.rsc +1 -1
  48. package/dashboard/.next/server/app/config.segments/!KGNvbnNvbGUp.segment.rsc +3 -3
  49. package/dashboard/.next/server/app/config.segments/_full.segment.rsc +5 -5
  50. package/dashboard/.next/server/app/config.segments/_head.segment.rsc +1 -1
  51. package/dashboard/.next/server/app/config.segments/_index.segment.rsc +2 -2
  52. package/dashboard/.next/server/app/config.segments/_tree.segment.rsc +2 -2
  53. package/dashboard/.next/server/app/console.html +1 -1
  54. package/dashboard/.next/server/app/console.rsc +5 -5
  55. package/dashboard/.next/server/app/console.segments/!KGNvbnNvbGUp/console/__PAGE__.segment.rsc +2 -2
  56. package/dashboard/.next/server/app/console.segments/!KGNvbnNvbGUp/console.segment.rsc +1 -1
  57. package/dashboard/.next/server/app/console.segments/!KGNvbnNvbGUp.segment.rsc +3 -3
  58. package/dashboard/.next/server/app/console.segments/_full.segment.rsc +5 -5
  59. package/dashboard/.next/server/app/console.segments/_head.segment.rsc +1 -1
  60. package/dashboard/.next/server/app/console.segments/_index.segment.rsc +2 -2
  61. package/dashboard/.next/server/app/console.segments/_tree.segment.rsc +2 -2
  62. package/dashboard/.next/server/app/endpoint.html +1 -1
  63. package/dashboard/.next/server/app/endpoint.rsc +5 -5
  64. package/dashboard/.next/server/app/endpoint.segments/!KGNvbnNvbGUp/endpoint/__PAGE__.segment.rsc +2 -2
  65. package/dashboard/.next/server/app/endpoint.segments/!KGNvbnNvbGUp/endpoint.segment.rsc +1 -1
  66. package/dashboard/.next/server/app/endpoint.segments/!KGNvbnNvbGUp.segment.rsc +3 -3
  67. package/dashboard/.next/server/app/endpoint.segments/_full.segment.rsc +5 -5
  68. package/dashboard/.next/server/app/endpoint.segments/_head.segment.rsc +1 -1
  69. package/dashboard/.next/server/app/endpoint.segments/_index.segment.rsc +2 -2
  70. package/dashboard/.next/server/app/endpoint.segments/_tree.segment.rsc +2 -2
  71. package/dashboard/.next/server/app/index.html +1 -1
  72. package/dashboard/.next/server/app/index.rsc +5 -5
  73. package/dashboard/.next/server/app/index.segments/!KGNvbnNvbGUp/__PAGE__.segment.rsc +2 -2
  74. package/dashboard/.next/server/app/index.segments/!KGNvbnNvbGUp.segment.rsc +3 -3
  75. package/dashboard/.next/server/app/index.segments/_full.segment.rsc +5 -5
  76. package/dashboard/.next/server/app/index.segments/_head.segment.rsc +1 -1
  77. package/dashboard/.next/server/app/index.segments/_index.segment.rsc +2 -2
  78. package/dashboard/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  79. package/dashboard/.next/server/app/keys.html +1 -1
  80. package/dashboard/.next/server/app/keys.rsc +5 -5
  81. package/dashboard/.next/server/app/keys.segments/!KGNvbnNvbGUp/keys/__PAGE__.segment.rsc +2 -2
  82. package/dashboard/.next/server/app/keys.segments/!KGNvbnNvbGUp/keys.segment.rsc +1 -1
  83. package/dashboard/.next/server/app/keys.segments/!KGNvbnNvbGUp.segment.rsc +3 -3
  84. package/dashboard/.next/server/app/keys.segments/_full.segment.rsc +5 -5
  85. package/dashboard/.next/server/app/keys.segments/_head.segment.rsc +1 -1
  86. package/dashboard/.next/server/app/keys.segments/_index.segment.rsc +2 -2
  87. package/dashboard/.next/server/app/keys.segments/_tree.segment.rsc +2 -2
  88. package/dashboard/.next/server/app/login/page_client-reference-manifest.js +1 -1
  89. package/dashboard/.next/server/app/login.html +1 -1
  90. package/dashboard/.next/server/app/login.rsc +2 -2
  91. package/dashboard/.next/server/app/login.segments/_full.segment.rsc +2 -2
  92. package/dashboard/.next/server/app/login.segments/_head.segment.rsc +1 -1
  93. package/dashboard/.next/server/app/login.segments/_index.segment.rsc +2 -2
  94. package/dashboard/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  95. package/dashboard/.next/server/app/login.segments/login/__PAGE__.segment.rsc +1 -1
  96. package/dashboard/.next/server/app/login.segments/login.segment.rsc +1 -1
  97. package/dashboard/.next/server/app/providers.html +1 -1
  98. package/dashboard/.next/server/app/providers.rsc +5 -5
  99. package/dashboard/.next/server/app/providers.segments/!KGNvbnNvbGUp/providers/__PAGE__.segment.rsc +2 -2
  100. package/dashboard/.next/server/app/providers.segments/!KGNvbnNvbGUp/providers.segment.rsc +1 -1
  101. package/dashboard/.next/server/app/providers.segments/!KGNvbnNvbGUp.segment.rsc +3 -3
  102. package/dashboard/.next/server/app/providers.segments/_full.segment.rsc +5 -5
  103. package/dashboard/.next/server/app/providers.segments/_head.segment.rsc +1 -1
  104. package/dashboard/.next/server/app/providers.segments/_index.segment.rsc +2 -2
  105. package/dashboard/.next/server/app/providers.segments/_tree.segment.rsc +2 -2
  106. package/dashboard/.next/server/app/quota.html +1 -1
  107. package/dashboard/.next/server/app/quota.rsc +5 -5
  108. package/dashboard/.next/server/app/quota.segments/!KGNvbnNvbGUp/quota/__PAGE__.segment.rsc +2 -2
  109. package/dashboard/.next/server/app/quota.segments/!KGNvbnNvbGUp/quota.segment.rsc +1 -1
  110. package/dashboard/.next/server/app/quota.segments/!KGNvbnNvbGUp.segment.rsc +3 -3
  111. package/dashboard/.next/server/app/quota.segments/_full.segment.rsc +5 -5
  112. package/dashboard/.next/server/app/quota.segments/_head.segment.rsc +1 -1
  113. package/dashboard/.next/server/app/quota.segments/_index.segment.rsc +2 -2
  114. package/dashboard/.next/server/app/quota.segments/_tree.segment.rsc +2 -2
  115. package/dashboard/.next/server/app/tools.html +1 -1
  116. package/dashboard/.next/server/app/tools.rsc +5 -5
  117. package/dashboard/.next/server/app/tools.segments/!KGNvbnNvbGUp/tools/__PAGE__.segment.rsc +2 -2
  118. package/dashboard/.next/server/app/tools.segments/!KGNvbnNvbGUp/tools.segment.rsc +1 -1
  119. package/dashboard/.next/server/app/tools.segments/!KGNvbnNvbGUp.segment.rsc +3 -3
  120. package/dashboard/.next/server/app/tools.segments/_full.segment.rsc +5 -5
  121. package/dashboard/.next/server/app/tools.segments/_head.segment.rsc +1 -1
  122. package/dashboard/.next/server/app/tools.segments/_index.segment.rsc +2 -2
  123. package/dashboard/.next/server/app/tools.segments/_tree.segment.rsc +2 -2
  124. package/dashboard/.next/server/chunks/ssr/[root-of-the-server]__0zf4yft._.js +1 -1
  125. package/dashboard/.next/server/chunks/ssr/[root-of-the-server]__0zf4yft._.js.map +1 -1
  126. package/dashboard/.next/server/chunks/ssr/_0p90gyy._.js +1 -1
  127. package/dashboard/.next/server/chunks/ssr/_0p90gyy._.js.map +1 -1
  128. package/dashboard/.next/server/chunks/ssr/src_components_10h9ide._.js +1 -1
  129. package/dashboard/.next/server/chunks/ssr/src_components_10h9ide._.js.map +1 -1
  130. package/dashboard/.next/server/middleware-build-manifest.js +3 -3
  131. package/dashboard/.next/server/pages/404.html +1 -1
  132. package/dashboard/.next/server/pages/500.html +1 -1
  133. package/dashboard/.next/static/chunks/{40pm83c1_d0jz.js → 0lcp6ibeqkbpk.js} +19 -19
  134. package/dashboard/.next/static/chunks/{0-qqj0_fg6ef0.js → 0wb0jg5y8b49o.js} +1 -1
  135. package/dashboard/.next/static/chunks/2ltht8xwlssac.js +1 -0
  136. package/dashboard/.next/static/chunks/2mpe3tpzx0wtj.css +3 -0
  137. package/dashboard/.next/trace +1 -1
  138. package/dashboard/.next/trace-build +1 -1
  139. package/dashboard/src/components/AreaChart.tsx +88 -19
  140. package/dashboard/src/components/AutostartToggle.tsx +63 -0
  141. package/dashboard/src/components/ConfigEditor.tsx +3 -0
  142. package/dashboard/src/components/TopBar.tsx +1 -1
  143. package/dist/cli/tray/autostart.js +3 -3
  144. package/dist/cli/tray/autostart.js.map +1 -1
  145. package/dist/cli.js +5 -3
  146. package/dist/cli.js.map +1 -1
  147. package/dist/core/handler.js +23 -3
  148. package/dist/core/handler.js.map +1 -1
  149. package/dist/routes/admin.js +28 -0
  150. package/dist/routes/admin.js.map +1 -1
  151. package/dist/routes/v1.js +4 -2
  152. package/dist/routes/v1.js.map +1 -1
  153. package/dist/server.js +32 -5
  154. package/dist/server.js.map +1 -1
  155. package/package.json +1 -1
  156. package/src/cli/tray/autostart.ts +3 -3
  157. package/src/cli.ts +5 -3
  158. package/src/core/handler.ts +22 -3
  159. package/src/routes/admin.ts +27 -0
  160. package/src/routes/v1.ts +4 -2
  161. package/src/server.ts +33 -5
  162. package/dashboard/.next/static/chunks/0347y27liw05t.js +0 -1
  163. package/dashboard/.next/static/chunks/0iv69e64f1ywa.css +0 -3
  164. /package/dashboard/.next/static/{jKcczqYA93-Kuqa9A9H9h → 3ctBU8K8tClTVQCiGy65u}/_buildManifest.js +0 -0
  165. /package/dashboard/.next/static/{jKcczqYA93-Kuqa9A9H9h → 3ctBU8K8tClTVQCiGy65u}/_clientMiddlewareManifest.js +0 -0
  166. /package/dashboard/.next/static/{jKcczqYA93-Kuqa9A9H9h → 3ctBU8K8tClTVQCiGy65u}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/UsageView.tsx","../../../../src/components/AreaChart.tsx","../../../../src/components/LogTable.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState, useCallback } from \"react\";\nimport { AreaChart, type SeriesPoint } from \"@/components/AreaChart\";\nimport { Stat, fmt, Empty } from \"@/components/ui\";\nimport { RichCard } from \"@/components/RichCard\";\nimport type { UsageSummary } from \"@/lib/gateway\";\n\ntype Window = { label: string; key: \"today\" | \"24h\" | \"7d\" | \"30d\" | \"60d\"; bucketMs: number };\n\n// window -> chart bucket size. Buckets keep ~24-60 points per range.\nconst WINDOWS: Window[] = [\n { label: \"Today\", key: \"today\", bucketMs: 3600_000 },\n { label: \"24h\", key: \"24h\", bucketMs: 3600_000 },\n { label: \"7D\", key: \"7d\", bucketMs: 6 * 3600_000 },\n { label: \"30D\", key: \"30d\", bucketMs: 86400_000 },\n { label: \"60D\", key: \"60d\", bucketMs: 2 * 86400_000 },\n];\n\n/** Lookback start (ms epoch) for a window. \"Today\" is since local midnight; the\n * rest are rolling lookbacks from now. */\nfunction sinceFor(key: Window[\"key\"]): number {\n const now = Date.now();\n switch (key) {\n case \"today\": {\n const d = new Date();\n d.setHours(0, 0, 0, 0);\n return d.getTime();\n }\n case \"24h\": return now - 24 * 3600_000;\n case \"7d\": return now - 7 * 86400_000;\n case \"30d\": return now - 30 * 86400_000;\n case \"60d\": return now - 60 * 86400_000;\n }\n}\n\nexport function UsageView() {\n const [win, setWin] = useState<Window>(WINDOWS[0]!);\n const [summary, setSummary] = useState<UsageSummary | null>(null);\n const [series, setSeries] = useState<SeriesPoint[]>([]);\n const [error, setError] = useState(\"\");\n const [loading, setLoading] = useState(true);\n\n const load = useCallback(async (w: Window) => {\n setLoading(true);\n setError(\"\");\n const since = sinceFor(w.key);\n const [sumRes, serRes] = await Promise.all([\n fetch(`/api/gw/admin/usage?since=${since}`),\n fetch(`/api/gw/admin/usage/series?since=${since}&bucket=${w.bucketMs}`),\n ]);\n if (!sumRes.ok) {\n setError(\"could not load usage\");\n setLoading(false);\n return;\n }\n setSummary((await sumRes.json()) as UsageSummary);\n const ser = serRes.ok ? ((await serRes.json()) as { series: SeriesPoint[] }) : { series: [] };\n setSeries(ser.series);\n setLoading(false);\n }, []);\n\n useEffect(() => {\n void load(win);\n }, [win, load]);\n\n const total = summary?.total;\n\n return (\n <div>\n <div className=\"mb-6 flex items-center justify-between gap-3\">\n <div>\n <h1 className=\"text-[22px] font-semibold tracking-tight text-text\">Usage</h1>\n <p className=\"mt-1 text-[13px] text-text-muted\">Tokens and cost across providers and models.</p>\n </div>\n <div className=\"flex items-center gap-1 rounded-full border border-border bg-surface p-1\">\n {WINDOWS.map((w) => (\n <button\n key={w.label}\n onClick={() => setWin(w)}\n className={`rounded-full px-3 py-1 text-[12px] font-medium transition-colors ${\n win.label === w.label ? \"bg-surface-2 text-text\" : \"text-text-muted hover:text-text\"\n }`}\n >\n {w.label}\n </button>\n ))}\n </div>\n </div>\n\n {error ? (\n <Empty>{error}</Empty>\n ) : (\n <>\n <div className=\"mb-5 grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <Stat label=\"Requests\" value={fmt.int(total?.requests ?? 0)} />\n <Stat label=\"Tokens in\" value={fmt.compact(total?.tokens_in ?? 0)} />\n <Stat label=\"Tokens out\" value={fmt.compact(total?.tokens_out ?? 0)} />\n <Stat label=\"Cost\" value={fmt.cost(total?.cost ?? 0)} />\n </div>\n\n <div className=\"mb-5\">\n <AreaChart series={series} />\n </div>\n\n <div className=\"grid gap-4 lg:grid-cols-2\">\n <RichCard header={<span className=\"text-[13px] font-semibold text-text\">By provider</span>}>\n {summary?.by_provider.length ? (\n <BreakdownTable\n rows={summary.by_provider.map((p) => ({ label: p.provider, ...p }))}\n loading={loading}\n />\n ) : (\n <Empty>No usage in this window.</Empty>\n )}\n </RichCard>\n <RichCard header={<span className=\"text-[13px] font-semibold text-text\">By model</span>}>\n {summary?.by_model.length ? (\n <BreakdownTable\n rows={summary.by_model.map((m) => ({ label: `${m.alias} → ${m.model}`, ...m }))}\n loading={loading}\n />\n ) : (\n <Empty>No usage in this window.</Empty>\n )}\n </RichCard>\n </div>\n </>\n )}\n </div>\n );\n}\n\nfunction BreakdownTable({\n rows,\n loading,\n}: {\n rows: Array<{ label: string; requests: number; tokens_in: number; tokens_out: number; cost: number }>;\n loading: boolean;\n}) {\n return (\n <div className={`table-wrap ${loading ? \"opacity-50\" : \"\"}`}>\n <table className=\"w-full border-collapse\">\n <thead>\n <tr className=\"text-text-subtle\">\n {[\"\", \"Reqs\", \"In\", \"Out\", \"Cost\"].map((h, i) => (\n <th\n key={h + i}\n className={`pb-2 text-[10px] font-medium uppercase tracking-wider ${i === 0 ? \"text-left\" : \"text-right\"}`}\n >\n {h}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((r) => (\n <tr key={r.label} className=\"border-t border-border-subtle\">\n <td className=\"py-2 text-[12.5px] text-text\">{r.label}</td>\n <td className=\"py-2 text-right tnum text-[12.5px] text-text-muted\">{fmt.int(r.requests)}</td>\n <td className=\"py-2 text-right tnum text-[12.5px] text-text-muted\">{fmt.compact(r.tokens_in)}</td>\n <td className=\"py-2 text-right tnum text-[12.5px] text-text-muted\">{fmt.compact(r.tokens_out)}</td>\n <td className=\"py-2 text-right tnum text-[12.5px] text-text\">{fmt.cost(r.cost)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\n\nexport interface SeriesPoint {\n ts: number;\n requests: number;\n tokens_in: number;\n tokens_out: number;\n cost: number;\n}\n\ntype Metric = \"tokens\" | \"cost\" | \"requests\";\n\nconst METRICS: { key: Metric; label: string }[] = [\n { key: \"tokens\", label: \"Tokens\" },\n { key: \"cost\", label: \"Cost\" },\n { key: \"requests\", label: \"Requests\" },\n];\n\nfunction valueOf(p: SeriesPoint, m: Metric): number {\n if (m === \"tokens\") return p.tokens_in + p.tokens_out;\n if (m === \"cost\") return p.cost;\n return p.requests;\n}\n\nfunction fmtVal(v: number, m: Metric): string {\n if (m === \"cost\") return v < 0.01 ? `$${v.toFixed(4)}` : `$${v.toFixed(2)}`;\n if (v >= 1_000_000) return `${(v / 1_000_000).toFixed(1)}M`;\n if (v >= 1_000) return `${(v / 1_000).toFixed(1)}K`;\n return String(Math.round(v));\n}\n\nfunction fmtTime(ts: number): string {\n return new Date(ts).toLocaleTimeString(\"en-US\", { hour: \"2-digit\", minute: \"2-digit\", hour12: false });\n}\n\n/** Inline-SVG area chart with a metric toggle. No charting dependency. */\nexport function AreaChart({ series }: { series: SeriesPoint[] }) {\n const [metric, setMetric] = useState<Metric>(\"tokens\");\n\n const W = 1000;\n const H = 240;\n const padX = 8;\n const padY = 16;\n\n const vals = series.map((p) => valueOf(p, metric));\n const max = Math.max(1, ...vals);\n const n = series.length;\n\n const x = (i: number) => (n <= 1 ? padX : padX + (i / (n - 1)) * (W - padX * 2));\n const y = (v: number) => H - padY - (v / max) * (H - padY * 2);\n\n const line = vals.map((v, i) => `${i === 0 ? \"M\" : \"L\"}${x(i).toFixed(1)},${y(v).toFixed(1)}`).join(\" \");\n const area = `${line} L${x(n - 1).toFixed(1)},${H - padY} L${x(0).toFixed(1)},${H - padY} Z`;\n\n const peak = vals.length ? vals.indexOf(Math.max(...vals)) : -1;\n const total = vals.reduce((a, b) => a + b, 0);\n\n return (\n <div className=\"overflow-hidden rounded-brand-lg border border-border bg-surface shadow-soft\">\n <header className=\"flex items-center justify-between gap-3 border-b border-border-subtle px-4 py-3\">\n <div className=\"flex items-center gap-2.5\">\n <span className=\"text-[13px] font-semibold text-text\">Over time</span>\n <span className=\"tnum text-[12px] text-text-muted\">{fmtVal(total, metric)} total</span>\n </div>\n <div className=\"flex items-center gap-1\">\n {METRICS.map((m) => (\n <button\n key={m.key}\n onClick={() => setMetric(m.key)}\n className={`rounded-full px-3 py-1 text-[12px] font-medium transition-colors ${\n metric === m.key ? \"bg-surface-2 text-text\" : \"text-text-muted hover:text-text\"\n }`}\n >\n {m.label}\n </button>\n ))}\n </div>\n </header>\n\n <div className=\"px-2 py-3\">\n {n === 0 || total === 0 ? (\n <div className=\"flex h-[200px] items-center justify-center text-[13px] text-text-muted\">\n No activity in this range.\n </div>\n ) : (\n <svg viewBox={`0 0 ${W} ${H}`} className=\"h-[200px] w-full\" preserveAspectRatio=\"none\">\n <defs>\n <linearGradient id=\"areaFill\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"var(--color-accent)\" stopOpacity=\"0.28\" />\n <stop offset=\"100%\" stopColor=\"var(--color-accent)\" stopOpacity=\"0\" />\n </linearGradient>\n </defs>\n <path d={area} fill=\"url(#areaFill)\" />\n <path d={line} fill=\"none\" stroke=\"var(--color-accent)\" strokeWidth=\"2\" vectorEffect=\"non-scaling-stroke\" />\n {peak >= 0 && (\n <circle cx={x(peak)} cy={y(vals[peak]!)} r=\"3\" fill=\"var(--color-accent)\" vectorEffect=\"non-scaling-stroke\" />\n )}\n </svg>\n )}\n </div>\n\n {n > 0 && total > 0 && peak >= 0 && (\n <div className=\"flex justify-between border-t border-border-subtle px-4 py-2 tnum text-[10px] text-text-subtle\">\n <span>{fmtTime(series[0]!.ts)}</span>\n <span>\n peak {fmtVal(vals[peak]!, metric)} @ {fmtTime(series[peak]!.ts)}\n </span>\n <span>{fmtTime(series[n - 1]!.ts)}</span>\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect, useRef, useCallback } from \"react\";\nimport { Lamp } from \"@/components/Lamp\";\nimport { Badge } from \"@/components/Badge\";\nimport { Icon } from \"@/components/Icon\";\nimport { fmt } from \"@/components/ui\";\nimport type { UsageLog } from \"@/lib/gateway\";\n\ntype StatusFilter = \"all\" | \"ok\" | \"error\";\n\nconst FILTERS: { key: StatusFilter; label: string }[] = [\n { key: \"all\", label: \"All\" },\n { key: \"ok\", label: \"Success\" },\n { key: \"error\", label: \"Errors\" },\n];\n\n// shared control style for the filter row — bordered surface chip, accent on focus.\nconst ctrl = \"h-9 rounded-brand border border-border bg-surface-2 px-2.5 text-[12.5px] text-text focus:border-accent focus:outline-none\";\n\n// recency presets for the request log (a live 200-row buffer, so relative\n// windows fit better than absolute dates). null = no time filter.\nconst SINCE_PRESETS: { label: string; ms: number | null }[] = [\n { label: \"1h\", ms: 3600_000 },\n { label: \"6h\", ms: 6 * 3600_000 },\n { label: \"24h\", ms: 24 * 3600_000 },\n { label: \"7d\", ms: 7 * 86400_000 },\n { label: \"All\", ms: null },\n];\nconst sincePill = (active: boolean): string =>\n `rounded-full px-2.5 py-1 text-[12px] font-medium transition-colors ${\n active ? \"bg-accent/15 text-accent\" : \"text-text-muted hover:text-text\"\n }`;\n\nexport function LogTable({ logs: initial }: { logs: UsageLog[] }) {\n const [logs, setLogs] = useState(initial);\n const [filter, setFilter] = useState<StatusFilter>(\"all\");\n const [provFilter, setProvFilter] = useState<string>(\"all\");\n const [sinceMs, setSinceMs] = useState<number | null>(null);\n const [live, setLive] = useState(true);\n const [collapsed, setCollapsed] = useState(false);\n const [expandedIdx, setExpandedIdx] = useState<number | null>(null);\n const timer = useRef<ReturnType<typeof setInterval> | null>(null);\n\n const refresh = useCallback(async () => {\n try {\n const res = await fetch(\"/api/gw/admin/logs?limit=200\");\n if (res.ok) {\n const data = (await res.json()) as { logs: UsageLog[] };\n setLogs(data.logs);\n }\n } catch { /* ignore */ }\n }, []);\n\n useEffect(() => {\n if (live) {\n timer.current = setInterval(refresh, 5000);\n return () => { if (timer.current) clearInterval(timer.current); };\n }\n if (timer.current) clearInterval(timer.current);\n }, [live, refresh]);\n\n const providers = [...new Set(logs.map((l) => l.provider))].sort();\n\n const okCount = logs.filter((l) => l.status >= 200 && l.status < 300).length;\n const errCount = logs.length - okCount;\n\n const sinceFloor = sinceMs !== null ? Date.now() - sinceMs : null;\n\n const shown = logs.filter((l) => {\n if (filter === \"ok\" && !(l.status >= 200 && l.status < 300)) return false;\n if (filter === \"error\" && l.status >= 200 && l.status < 300) return false;\n if (provFilter !== \"all\" && l.provider !== provFilter) return false;\n if (sinceFloor !== null && l.ts < sinceFloor) return false;\n return true;\n });\n\n const hasFilters = filter !== \"all\" || provFilter !== \"all\" || sinceMs !== null;\n const clearFilters = () => { setFilter(\"all\"); setProvFilter(\"all\"); setSinceMs(null); };\n\n const count = (k: StatusFilter) => (k === \"all\" ? logs.length : k === \"ok\" ? okCount : errCount);\n\n return (\n <div className=\"overflow-hidden rounded-brand-lg border border-border bg-surface shadow-soft\">\n <header className=\"flex flex-col gap-3 border-b border-border-subtle px-4 py-3\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div className=\"flex items-center gap-1.5\">\n <button\n onClick={() => setCollapsed((v) => !v)}\n className=\"flex-none rounded p-0.5 text-text-subtle transition-colors hover:text-text\"\n aria-label={collapsed ? \"Expand requests\" : \"Collapse requests\"}\n title={collapsed ? \"Expand\" : \"Collapse\"}\n >\n <Icon name={collapsed ? \"chevron_right\" : \"expand_more\"} size={18} />\n </button>\n <div className=\"flex items-center gap-1\">\n {FILTERS.map((f) => (\n <button\n key={f.key}\n onClick={() => setFilter(f.key)}\n className={`flex items-center gap-1.5 rounded-full px-3 py-1.5 text-[12px] font-medium transition-colors ${\n filter === f.key ? \"bg-surface-2 text-text\" : \"text-text-muted hover:text-text\"\n }`}\n >\n {f.label}\n <span className=\"tnum text-text-subtle\">{count(f.key)}</span>\n </button>\n ))}\n </div>\n </div>\n <button\n onClick={() => setLive((v) => !v)}\n className={`flex items-center gap-1 rounded-full px-2.5 py-1 text-[11px] font-medium transition-colors ${\n live ? \"bg-success/15 text-success\" : \"text-text-muted hover:text-text\"\n }`}\n title={live ? \"Auto-refresh ON (5s)\" : \"Auto-refresh OFF\"}\n >\n <Icon name={live ? \"radio_button_checked\" : \"radio_button_unchecked\"} size={12} />\n Live\n </button>\n </div>\n\n {!collapsed && (\n <div className=\"flex flex-wrap items-end gap-2.5\">\n <FilterField label=\"Provider\">\n <select\n value={provFilter}\n onChange={(e) => setProvFilter(e.target.value)}\n className={ctrl + \" w-40\"}\n >\n <option value=\"all\">All providers</option>\n {providers.map((p) => (\n <option key={p} value={p}>{p}</option>\n ))}\n </select>\n </FilterField>\n <FilterField label=\"Since\">\n <div className=\"flex h-9 items-center gap-0.5 rounded-brand border border-border bg-surface-2 px-1\">\n {SINCE_PRESETS.map((p) => (\n <button\n key={p.label}\n type=\"button\"\n onClick={() => setSinceMs(p.ms)}\n className={sincePill(sinceMs === p.ms)}\n >\n {p.label}\n </button>\n ))}\n </div>\n </FilterField>\n <button\n onClick={clearFilters}\n disabled={!hasFilters}\n className=\"flex h-9 items-center gap-1.5 rounded-brand border border-border bg-surface-2 px-3 text-[12.5px] font-medium text-text-muted transition-colors hover:border-text-subtle hover:text-text disabled:opacity-40 disabled:hover:border-border disabled:hover:text-text-muted\"\n title={hasFilters ? \"Reset all filters\" : \"No filters applied\"}\n >\n <Icon name=\"filter_alt_off\" size={15} />\n Clear\n </button>\n </div>\n )}\n </header>\n\n {collapsed ? null : shown.length === 0 ? (\n <div className=\"px-4 py-8 text-center text-[13px] text-text-muted\">\n {logs.length === 0 ? \"No requests recorded yet.\" : \"No requests match this filter.\"}\n </div>\n ) : (\n <>\n <div className=\"table-wrap\">\n <table className=\"w-full min-w-[720px] border-collapse\">\n <thead>\n <tr className=\"text-text-subtle\">\n {[\"Status\", \"Time\", \"Alias\", \"Provider\", \"Model\", \"In\", \"Out\", \"ms\", \"Mode\"].map((h, i) => (\n <th\n key={h + i}\n className={`whitespace-nowrap px-4 pb-2.5 pt-3 text-[10px] font-medium uppercase tracking-wider ${\n i >= 5 && i <= 7 ? \"text-right\" : \"text-left\"\n }`}\n >\n {h}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {shown.map((l, i) => {\n const ok = l.status >= 200 && l.status < 300;\n const isExpanded = expandedIdx === i;\n return (\n <tr key={i} onClick={() => setExpandedIdx(isExpanded ? null : i)} className={`border-t border-border-subtle cursor-pointer transition-colors ${isExpanded ? \"bg-surface-2/60\" : \"hover:bg-surface-2/70\"}`}>\n <Td>\n <Badge tone={ok ? \"live\" : \"down\"}>\n <Lamp state={ok ? \"live\" : \"down\"} />\n {l.status}\n </Badge>\n </Td>\n <Td muted title={fmt.time(l.ts)} suppressHydrationWarning>\n {fmt.ago(l.ts)} ago\n </Td>\n <Td className=\"text-text\">{l.alias}</Td>\n <Td muted>{l.provider}</Td>\n <Td muted>{l.model}</Td>\n <Td right>{fmt.int(l.tokens_in)}</Td>\n <Td right>{fmt.int(l.tokens_out)}</Td>\n <Td right>{fmt.int(l.latency_ms)}</Td>\n <Td muted>{l.stream ? \"stream\" : \"unary\"}</Td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n\n {expandedIdx !== null && shown[expandedIdx] && (\n <RequestDetail log={shown[expandedIdx]} onClose={() => setExpandedIdx(null)} />\n )}\n </>\n )}\n </div>\n );\n}\n\nfunction FilterField({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <label className=\"flex flex-col gap-1\">\n <span className=\"text-[10px] font-medium uppercase tracking-wider text-text-subtle\">{label}</span>\n {children}\n </label>\n );\n}\n\nfunction Td({\n children,\n muted,\n right,\n title,\n className,\n suppressHydrationWarning,\n}: {\n children: React.ReactNode;\n muted?: boolean;\n right?: boolean;\n title?: string;\n className?: string;\n suppressHydrationWarning?: boolean;\n}) {\n return (\n <td\n title={title}\n suppressHydrationWarning={suppressHydrationWarning}\n className={`whitespace-nowrap px-4 py-2.5 tnum text-[12.5px] ${right ? \"text-right\" : \"text-left\"} ${\n muted ? \"text-text-muted\" : \"text-text\"\n }${className ? ` ${className}` : \"\"}`}\n >\n {children}\n </td>\n );\n}\n\nfunction RequestDetail({ log, onClose }: { log: UsageLog; onClose: () => void }) {\n const ok = log.status >= 200 && log.status < 300;\n const totalTokens = log.tokens_in + log.tokens_out;\n\n return (\n <div className=\"border-t border-border-subtle bg-surface-2/40 px-5 py-4\">\n <div className=\"mb-3 flex items-center justify-between\">\n <span className=\"text-[12px] font-semibold text-text\">Request Details</span>\n <button onClick={onClose} className=\"text-text-subtle hover:text-text\">\n <Icon name=\"close\" size={16} />\n </button>\n </div>\n <div className=\"grid grid-cols-2 gap-x-8 gap-y-2 text-[12px] sm:grid-cols-4\">\n <DetailCell label=\"Status\" value={`${log.status} ${ok ? \"OK\" : \"Error\"}`} />\n <DetailCell label=\"Timestamp\" value={new Date(log.ts).toLocaleString()} />\n <DetailCell label=\"Alias\" value={log.alias} />\n <DetailCell label=\"Provider\" value={log.provider} />\n <DetailCell label=\"Model\" value={log.model} />\n <DetailCell label=\"Mode\" value={log.stream ? \"Streaming\" : \"Unary\"} />\n <DetailCell label=\"Latency\" value={`${log.latency_ms}ms`} />\n <DetailCell label=\"Cost\" value={fmt.cost(log.cost)} />\n <DetailCell label=\"Input tokens\" value={fmt.int(log.tokens_in)} />\n <DetailCell label=\"Output tokens\" value={fmt.int(log.tokens_out)} />\n <DetailCell label=\"Cached tokens\" value={fmt.int(log.cached_tokens)} />\n <DetailCell label=\"Total tokens\" value={fmt.int(totalTokens)} />\n </div>\n </div>\n );\n}\n\nfunction DetailCell({ label, value }: { label: string; value: string }) {\n return (\n <div>\n <span className=\"text-[10px] uppercase tracking-wider text-text-subtle\">{label}</span>\n <div className=\"tnum text-text\">{value}</div>\n </div>\n );\n}\n"],"names":["METRICS","key","label","valueOf","p","m","tokens_in","tokens_out","cost","requests","fmtVal","v","toFixed","String","Math","round","fmtTime","ts","Date","toLocaleTimeString","hour","minute","hour12","AreaChart","series","metric","setMetric","W","H","padX","padY","vals","map","max","n","length","x","i","y","line","join","area","peak","indexOf","total","reduce","a","b","className","onClick","viewBox","preserveAspectRatio","id","x1","y1","x2","y2","offset","stopColor","stopOpacity","d","fill","stroke","strokeWidth","vectorEffect","cx","cy","r","FILTERS","ctrl","SINCE_PRESETS","ms","sincePill","active","LogTable","logs","initial","setLogs","filter","setFilter","provFilter","setProvFilter","sinceMs","setSinceMs","live","setLive","collapsed","setCollapsed","expandedIdx","setExpandedIdx","timer","refresh","res","fetch","ok","data","json","current","setInterval","clearInterval","providers","Set","l","provider","sort","okCount","status","errCount","sinceFloor","now","shown","hasFilters","clearFilters","count","k","title","name","size","f","FilterField","value","onChange","e","target","type","disabled","h","isExpanded","Td","tone","state","muted","time","suppressHydrationWarning","ago","alias","model","right","int","latency_ms","stream","RequestDetail","log","onClose","children","totalTokens","DetailCell","toLocaleString","cached_tokens"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/components/UsageView.tsx","../../../../src/components/AreaChart.tsx","../../../../src/components/LogTable.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState, useCallback } from \"react\";\nimport { AreaChart, type SeriesPoint } from \"@/components/AreaChart\";\nimport { Stat, fmt, Empty } from \"@/components/ui\";\nimport { RichCard } from \"@/components/RichCard\";\nimport type { UsageSummary } from \"@/lib/gateway\";\n\ntype Window = { label: string; key: \"today\" | \"24h\" | \"7d\" | \"30d\" | \"60d\"; bucketMs: number };\n\n// window -> chart bucket size. Buckets keep ~24-60 points per range.\nconst WINDOWS: Window[] = [\n { label: \"Today\", key: \"today\", bucketMs: 3600_000 },\n { label: \"24h\", key: \"24h\", bucketMs: 3600_000 },\n { label: \"7D\", key: \"7d\", bucketMs: 6 * 3600_000 },\n { label: \"30D\", key: \"30d\", bucketMs: 86400_000 },\n { label: \"60D\", key: \"60d\", bucketMs: 2 * 86400_000 },\n];\n\n/** Lookback start (ms epoch) for a window. \"Today\" is since local midnight; the\n * rest are rolling lookbacks from now. */\nfunction sinceFor(key: Window[\"key\"]): number {\n const now = Date.now();\n switch (key) {\n case \"today\": {\n const d = new Date();\n d.setHours(0, 0, 0, 0);\n return d.getTime();\n }\n case \"24h\": return now - 24 * 3600_000;\n case \"7d\": return now - 7 * 86400_000;\n case \"30d\": return now - 30 * 86400_000;\n case \"60d\": return now - 60 * 86400_000;\n }\n}\n\nexport function UsageView() {\n const [win, setWin] = useState<Window>(WINDOWS[0]!);\n const [summary, setSummary] = useState<UsageSummary | null>(null);\n const [series, setSeries] = useState<SeriesPoint[]>([]);\n const [error, setError] = useState(\"\");\n const [loading, setLoading] = useState(true);\n\n const load = useCallback(async (w: Window) => {\n setLoading(true);\n setError(\"\");\n const since = sinceFor(w.key);\n const [sumRes, serRes] = await Promise.all([\n fetch(`/api/gw/admin/usage?since=${since}`),\n fetch(`/api/gw/admin/usage/series?since=${since}&bucket=${w.bucketMs}`),\n ]);\n if (!sumRes.ok) {\n setError(\"could not load usage\");\n setLoading(false);\n return;\n }\n setSummary((await sumRes.json()) as UsageSummary);\n const ser = serRes.ok ? ((await serRes.json()) as { series: SeriesPoint[] }) : { series: [] };\n setSeries(ser.series);\n setLoading(false);\n }, []);\n\n useEffect(() => {\n void load(win);\n }, [win, load]);\n\n const total = summary?.total;\n\n return (\n <div>\n <div className=\"mb-6 flex items-center justify-between gap-3\">\n <div>\n <h1 className=\"text-[22px] font-semibold tracking-tight text-text\">Usage</h1>\n <p className=\"mt-1 text-[13px] text-text-muted\">Tokens and cost across providers and models.</p>\n </div>\n <div className=\"flex items-center gap-1 rounded-full border border-border bg-surface p-1\">\n {WINDOWS.map((w) => (\n <button\n key={w.label}\n onClick={() => setWin(w)}\n className={`rounded-full px-3 py-1 text-[12px] font-medium transition-colors ${\n win.label === w.label ? \"bg-surface-2 text-text\" : \"text-text-muted hover:text-text\"\n }`}\n >\n {w.label}\n </button>\n ))}\n </div>\n </div>\n\n {error ? (\n <Empty>{error}</Empty>\n ) : (\n <>\n <div className=\"mb-5 grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <Stat label=\"Requests\" value={fmt.int(total?.requests ?? 0)} />\n <Stat label=\"Tokens in\" value={fmt.compact(total?.tokens_in ?? 0)} />\n <Stat label=\"Tokens out\" value={fmt.compact(total?.tokens_out ?? 0)} />\n <Stat label=\"Cost\" value={fmt.cost(total?.cost ?? 0)} />\n </div>\n\n <div className=\"mb-5\">\n <AreaChart series={series} />\n </div>\n\n <div className=\"grid gap-4 lg:grid-cols-2\">\n <RichCard header={<span className=\"text-[13px] font-semibold text-text\">By provider</span>}>\n {summary?.by_provider.length ? (\n <BreakdownTable\n rows={summary.by_provider.map((p) => ({ label: p.provider, ...p }))}\n loading={loading}\n />\n ) : (\n <Empty>No usage in this window.</Empty>\n )}\n </RichCard>\n <RichCard header={<span className=\"text-[13px] font-semibold text-text\">By model</span>}>\n {summary?.by_model.length ? (\n <BreakdownTable\n rows={summary.by_model.map((m) => ({ label: `${m.alias} → ${m.model}`, ...m }))}\n loading={loading}\n />\n ) : (\n <Empty>No usage in this window.</Empty>\n )}\n </RichCard>\n </div>\n </>\n )}\n </div>\n );\n}\n\nfunction BreakdownTable({\n rows,\n loading,\n}: {\n rows: Array<{ label: string; requests: number; tokens_in: number; tokens_out: number; cost: number }>;\n loading: boolean;\n}) {\n return (\n <div className={`table-wrap ${loading ? \"opacity-50\" : \"\"}`}>\n <table className=\"w-full border-collapse\">\n <thead>\n <tr className=\"text-text-subtle\">\n {[\"\", \"Reqs\", \"In\", \"Out\", \"Cost\"].map((h, i) => (\n <th\n key={h + i}\n className={`pb-2 text-[10px] font-medium uppercase tracking-wider ${i === 0 ? \"text-left\" : \"text-right\"}`}\n >\n {h}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((r) => (\n <tr key={r.label} className=\"border-t border-border-subtle\">\n <td className=\"py-2 text-[12.5px] text-text\">{r.label}</td>\n <td className=\"py-2 text-right tnum text-[12.5px] text-text-muted\">{fmt.int(r.requests)}</td>\n <td className=\"py-2 text-right tnum text-[12.5px] text-text-muted\">{fmt.compact(r.tokens_in)}</td>\n <td className=\"py-2 text-right tnum text-[12.5px] text-text-muted\">{fmt.compact(r.tokens_out)}</td>\n <td className=\"py-2 text-right tnum text-[12.5px] text-text\">{fmt.cost(r.cost)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useRef, useCallback } from \"react\";\n\nexport interface SeriesPoint {\n ts: number;\n requests: number;\n tokens_in: number;\n tokens_out: number;\n cost: number;\n}\n\ntype Metric = \"tokens\" | \"cost\" | \"requests\";\n\nconst METRICS: { key: Metric; label: string }[] = [\n { key: \"tokens\", label: \"Tokens\" },\n { key: \"cost\", label: \"Cost\" },\n { key: \"requests\", label: \"Requests\" },\n];\n\nfunction valueOf(p: SeriesPoint, m: Metric): number {\n if (m === \"tokens\") return p.tokens_in + p.tokens_out;\n if (m === \"cost\") return p.cost;\n return p.requests;\n}\n\nfunction fmtVal(v: number, m: Metric): string {\n if (m === \"cost\") return v < 0.01 ? `$${v.toFixed(4)}` : `$${v.toFixed(2)}`;\n if (v >= 1_000_000) return `${(v / 1_000_000).toFixed(1)}M`;\n if (v >= 1_000) return `${(v / 1_000).toFixed(1)}K`;\n return String(Math.round(v));\n}\n\nfunction fmtTime(ts: number): string {\n return new Date(ts).toLocaleTimeString(\"en-US\", { hour: \"2-digit\", minute: \"2-digit\", hour12: false });\n}\n\nfunction fmtDate(ts: number): string {\n return new Date(ts).toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\", hour: \"2-digit\", minute: \"2-digit\", hour12: false });\n}\n\n/** Inline-SVG area chart with metric toggle and hover tooltip. No charting dependency. */\nexport function AreaChart({ series }: { series: SeriesPoint[] }) {\n const [metric, setMetric] = useState<Metric>(\"tokens\");\n const [hoverIdx, setHoverIdx] = useState<number | null>(null);\n const svgRef = useRef<SVGSVGElement>(null);\n\n const W = 1000;\n const H = 240;\n const padX = 8;\n const padY = 16;\n\n const vals = series.map((p) => valueOf(p, metric));\n const max = Math.max(1, ...vals);\n const n = series.length;\n\n const xPos = (i: number) => (n <= 1 ? padX : padX + (i / (n - 1)) * (W - padX * 2));\n const yPos = (v: number) => H - padY - (v / max) * (H - padY * 2);\n\n const line = vals.map((v, i) => `${i === 0 ? \"M\" : \"L\"}${xPos(i).toFixed(1)},${yPos(v).toFixed(1)}`).join(\" \");\n const area = `${line} L${xPos(n - 1).toFixed(1)},${H - padY} L${xPos(0).toFixed(1)},${H - padY} Z`;\n\n const peak = vals.length ? vals.indexOf(Math.max(...vals)) : -1;\n const total = vals.reduce((a, b) => a + b, 0);\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<SVGSVGElement>) => {\n if (n <= 1 || !svgRef.current) return;\n const rect = svgRef.current.getBoundingClientRect();\n const relX = (e.clientX - rect.left) / rect.width;\n const idx = Math.round(relX * (n - 1));\n setHoverIdx(Math.max(0, Math.min(n - 1, idx)));\n },\n [n],\n );\n\n const handleMouseLeave = useCallback(() => setHoverIdx(null), []);\n\n const hp = hoverIdx !== null ? series[hoverIdx] : null;\n\n return (\n <div className=\"overflow-hidden rounded-brand-lg border border-border bg-surface shadow-soft\">\n <header className=\"flex items-center justify-between gap-3 border-b border-border-subtle px-4 py-3\">\n <div className=\"flex items-center gap-2.5\">\n <span className=\"text-[13px] font-semibold text-text\">Over time</span>\n <span className=\"tnum text-[12px] text-text-muted\">{fmtVal(total, metric)} total</span>\n </div>\n <div className=\"flex items-center gap-1\">\n {METRICS.map((m) => (\n <button\n key={m.key}\n onClick={() => setMetric(m.key)}\n className={`rounded-full px-3 py-1 text-[12px] font-medium transition-colors ${\n metric === m.key ? \"bg-surface-2 text-text\" : \"text-text-muted hover:text-text\"\n }`}\n >\n {m.label}\n </button>\n ))}\n </div>\n </header>\n\n <div className=\"relative px-2 py-3\">\n {n === 0 || total === 0 ? (\n <div className=\"flex h-[200px] items-center justify-center text-[13px] text-text-muted\">\n No activity in this range.\n </div>\n ) : (\n <>\n <svg\n ref={svgRef}\n viewBox={`0 0 ${W} ${H}`}\n className=\"h-[200px] w-full cursor-crosshair\"\n preserveAspectRatio=\"none\"\n onMouseMove={handleMouseMove}\n onMouseLeave={handleMouseLeave}\n >\n <defs>\n <linearGradient id=\"areaFill\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"var(--color-accent)\" stopOpacity=\"0.28\" />\n <stop offset=\"100%\" stopColor=\"var(--color-accent)\" stopOpacity=\"0\" />\n </linearGradient>\n </defs>\n <path d={area} fill=\"url(#areaFill)\" />\n <path d={line} fill=\"none\" stroke=\"var(--color-accent)\" strokeWidth=\"2\" vectorEffect=\"non-scaling-stroke\" />\n {peak >= 0 && hoverIdx === null && (\n <circle cx={xPos(peak)} cy={yPos(vals[peak]!)} r=\"3\" fill=\"var(--color-accent)\" vectorEffect=\"non-scaling-stroke\" />\n )}\n {hoverIdx !== null && (\n <>\n <line\n x1={xPos(hoverIdx)}\n y1={padY}\n x2={xPos(hoverIdx)}\n y2={H - padY}\n stroke=\"var(--color-accent)\"\n strokeWidth=\"1\"\n strokeDasharray=\"4 3\"\n vectorEffect=\"non-scaling-stroke\"\n opacity=\"0.5\"\n />\n <circle\n cx={xPos(hoverIdx)}\n cy={yPos(vals[hoverIdx]!)}\n r=\"4\"\n fill=\"var(--color-accent)\"\n stroke=\"var(--color-bg)\"\n strokeWidth=\"2\"\n vectorEffect=\"non-scaling-stroke\"\n />\n </>\n )}\n </svg>\n {hoverIdx !== null && hp && (\n <div\n className=\"pointer-events-none absolute top-2 z-10 rounded-lg border border-border bg-surface-2 px-3 py-2 shadow-lg\"\n style={{ left: `${Math.min(85, Math.max(5, (hoverIdx / (n - 1)) * 100))}%`, transform: \"translateX(-50%)\" }}\n >\n <div className=\"text-[11px] text-text-muted\">{fmtDate(hp.ts)}</div>\n <div className=\"mt-1 flex flex-col gap-0.5 tnum text-[12px]\">\n <span className=\"text-text\">{fmtVal(valueOf(hp, metric), metric)} <span className=\"text-text-muted\">{metric}</span></span>\n {metric === \"tokens\" && (\n <span className=\"text-text-subtle text-[10px]\">in: {fmtVal(hp.tokens_in, \"tokens\")} · out: {fmtVal(hp.tokens_out, \"tokens\")}</span>\n )}\n <span className=\"text-text-subtle text-[10px]\">{hp.requests} req · ${hp.cost.toFixed(4)}</span>\n </div>\n </div>\n )}\n </>\n )}\n </div>\n\n {n > 0 && total > 0 && peak >= 0 && (\n <div className=\"flex justify-between border-t border-border-subtle px-4 py-2 tnum text-[10px] text-text-subtle\">\n <span>{fmtTime(series[0]!.ts)}</span>\n <span>\n peak {fmtVal(vals[peak]!, metric)} @ {fmtTime(series[peak]!.ts)}\n </span>\n <span>{fmtTime(series[n - 1]!.ts)}</span>\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect, useRef, useCallback } from \"react\";\nimport { Lamp } from \"@/components/Lamp\";\nimport { Badge } from \"@/components/Badge\";\nimport { Icon } from \"@/components/Icon\";\nimport { fmt } from \"@/components/ui\";\nimport type { UsageLog } from \"@/lib/gateway\";\n\ntype StatusFilter = \"all\" | \"ok\" | \"error\";\n\nconst FILTERS: { key: StatusFilter; label: string }[] = [\n { key: \"all\", label: \"All\" },\n { key: \"ok\", label: \"Success\" },\n { key: \"error\", label: \"Errors\" },\n];\n\n// shared control style for the filter row — bordered surface chip, accent on focus.\nconst ctrl = \"h-9 rounded-brand border border-border bg-surface-2 px-2.5 text-[12.5px] text-text focus:border-accent focus:outline-none\";\n\n// recency presets for the request log (a live 200-row buffer, so relative\n// windows fit better than absolute dates). null = no time filter.\nconst SINCE_PRESETS: { label: string; ms: number | null }[] = [\n { label: \"1h\", ms: 3600_000 },\n { label: \"6h\", ms: 6 * 3600_000 },\n { label: \"24h\", ms: 24 * 3600_000 },\n { label: \"7d\", ms: 7 * 86400_000 },\n { label: \"All\", ms: null },\n];\nconst sincePill = (active: boolean): string =>\n `rounded-full px-2.5 py-1 text-[12px] font-medium transition-colors ${\n active ? \"bg-accent/15 text-accent\" : \"text-text-muted hover:text-text\"\n }`;\n\nexport function LogTable({ logs: initial }: { logs: UsageLog[] }) {\n const [logs, setLogs] = useState(initial);\n const [filter, setFilter] = useState<StatusFilter>(\"all\");\n const [provFilter, setProvFilter] = useState<string>(\"all\");\n const [sinceMs, setSinceMs] = useState<number | null>(null);\n const [live, setLive] = useState(true);\n const [collapsed, setCollapsed] = useState(false);\n const [expandedIdx, setExpandedIdx] = useState<number | null>(null);\n const timer = useRef<ReturnType<typeof setInterval> | null>(null);\n\n const refresh = useCallback(async () => {\n try {\n const res = await fetch(\"/api/gw/admin/logs?limit=200\");\n if (res.ok) {\n const data = (await res.json()) as { logs: UsageLog[] };\n setLogs(data.logs);\n }\n } catch { /* ignore */ }\n }, []);\n\n useEffect(() => {\n if (live) {\n timer.current = setInterval(refresh, 5000);\n return () => { if (timer.current) clearInterval(timer.current); };\n }\n if (timer.current) clearInterval(timer.current);\n }, [live, refresh]);\n\n const providers = [...new Set(logs.map((l) => l.provider))].sort();\n\n const okCount = logs.filter((l) => l.status >= 200 && l.status < 300).length;\n const errCount = logs.length - okCount;\n\n const sinceFloor = sinceMs !== null ? Date.now() - sinceMs : null;\n\n const shown = logs.filter((l) => {\n if (filter === \"ok\" && !(l.status >= 200 && l.status < 300)) return false;\n if (filter === \"error\" && l.status >= 200 && l.status < 300) return false;\n if (provFilter !== \"all\" && l.provider !== provFilter) return false;\n if (sinceFloor !== null && l.ts < sinceFloor) return false;\n return true;\n });\n\n const hasFilters = filter !== \"all\" || provFilter !== \"all\" || sinceMs !== null;\n const clearFilters = () => { setFilter(\"all\"); setProvFilter(\"all\"); setSinceMs(null); };\n\n const count = (k: StatusFilter) => (k === \"all\" ? logs.length : k === \"ok\" ? okCount : errCount);\n\n return (\n <div className=\"overflow-hidden rounded-brand-lg border border-border bg-surface shadow-soft\">\n <header className=\"flex flex-col gap-3 border-b border-border-subtle px-4 py-3\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div className=\"flex items-center gap-1.5\">\n <button\n onClick={() => setCollapsed((v) => !v)}\n className=\"flex-none rounded p-0.5 text-text-subtle transition-colors hover:text-text\"\n aria-label={collapsed ? \"Expand requests\" : \"Collapse requests\"}\n title={collapsed ? \"Expand\" : \"Collapse\"}\n >\n <Icon name={collapsed ? \"chevron_right\" : \"expand_more\"} size={18} />\n </button>\n <div className=\"flex items-center gap-1\">\n {FILTERS.map((f) => (\n <button\n key={f.key}\n onClick={() => setFilter(f.key)}\n className={`flex items-center gap-1.5 rounded-full px-3 py-1.5 text-[12px] font-medium transition-colors ${\n filter === f.key ? \"bg-surface-2 text-text\" : \"text-text-muted hover:text-text\"\n }`}\n >\n {f.label}\n <span className=\"tnum text-text-subtle\">{count(f.key)}</span>\n </button>\n ))}\n </div>\n </div>\n <button\n onClick={() => setLive((v) => !v)}\n className={`flex items-center gap-1 rounded-full px-2.5 py-1 text-[11px] font-medium transition-colors ${\n live ? \"bg-success/15 text-success\" : \"text-text-muted hover:text-text\"\n }`}\n title={live ? \"Auto-refresh ON (5s)\" : \"Auto-refresh OFF\"}\n >\n <Icon name={live ? \"radio_button_checked\" : \"radio_button_unchecked\"} size={12} />\n Live\n </button>\n </div>\n\n {!collapsed && (\n <div className=\"flex flex-wrap items-end gap-2.5\">\n <FilterField label=\"Provider\">\n <select\n value={provFilter}\n onChange={(e) => setProvFilter(e.target.value)}\n className={ctrl + \" w-40\"}\n >\n <option value=\"all\">All providers</option>\n {providers.map((p) => (\n <option key={p} value={p}>{p}</option>\n ))}\n </select>\n </FilterField>\n <FilterField label=\"Since\">\n <div className=\"flex h-9 items-center gap-0.5 rounded-brand border border-border bg-surface-2 px-1\">\n {SINCE_PRESETS.map((p) => (\n <button\n key={p.label}\n type=\"button\"\n onClick={() => setSinceMs(p.ms)}\n className={sincePill(sinceMs === p.ms)}\n >\n {p.label}\n </button>\n ))}\n </div>\n </FilterField>\n <button\n onClick={clearFilters}\n disabled={!hasFilters}\n className=\"flex h-9 items-center gap-1.5 rounded-brand border border-border bg-surface-2 px-3 text-[12.5px] font-medium text-text-muted transition-colors hover:border-text-subtle hover:text-text disabled:opacity-40 disabled:hover:border-border disabled:hover:text-text-muted\"\n title={hasFilters ? \"Reset all filters\" : \"No filters applied\"}\n >\n <Icon name=\"filter_alt_off\" size={15} />\n Clear\n </button>\n </div>\n )}\n </header>\n\n {collapsed ? null : shown.length === 0 ? (\n <div className=\"px-4 py-8 text-center text-[13px] text-text-muted\">\n {logs.length === 0 ? \"No requests recorded yet.\" : \"No requests match this filter.\"}\n </div>\n ) : (\n <>\n <div className=\"table-wrap\">\n <table className=\"w-full min-w-[720px] border-collapse\">\n <thead>\n <tr className=\"text-text-subtle\">\n {[\"Status\", \"Time\", \"Alias\", \"Provider\", \"Model\", \"In\", \"Out\", \"ms\", \"Mode\"].map((h, i) => (\n <th\n key={h + i}\n className={`whitespace-nowrap px-4 pb-2.5 pt-3 text-[10px] font-medium uppercase tracking-wider ${\n i >= 5 && i <= 7 ? \"text-right\" : \"text-left\"\n }`}\n >\n {h}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {shown.map((l, i) => {\n const ok = l.status >= 200 && l.status < 300;\n const isExpanded = expandedIdx === i;\n return (\n <tr key={i} onClick={() => setExpandedIdx(isExpanded ? null : i)} className={`border-t border-border-subtle cursor-pointer transition-colors ${isExpanded ? \"bg-surface-2/60\" : \"hover:bg-surface-2/70\"}`}>\n <Td>\n <Badge tone={ok ? \"live\" : \"down\"}>\n <Lamp state={ok ? \"live\" : \"down\"} />\n {l.status}\n </Badge>\n </Td>\n <Td muted title={fmt.time(l.ts)} suppressHydrationWarning>\n {fmt.ago(l.ts)} ago\n </Td>\n <Td className=\"text-text\">{l.alias}</Td>\n <Td muted>{l.provider}</Td>\n <Td muted>{l.model}</Td>\n <Td right>{fmt.int(l.tokens_in)}</Td>\n <Td right>{fmt.int(l.tokens_out)}</Td>\n <Td right>{fmt.int(l.latency_ms)}</Td>\n <Td muted>{l.stream ? \"stream\" : \"unary\"}</Td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n\n {expandedIdx !== null && shown[expandedIdx] && (\n <RequestDetail log={shown[expandedIdx]} onClose={() => setExpandedIdx(null)} />\n )}\n </>\n )}\n </div>\n );\n}\n\nfunction FilterField({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <label className=\"flex flex-col gap-1\">\n <span className=\"text-[10px] font-medium uppercase tracking-wider text-text-subtle\">{label}</span>\n {children}\n </label>\n );\n}\n\nfunction Td({\n children,\n muted,\n right,\n title,\n className,\n suppressHydrationWarning,\n}: {\n children: React.ReactNode;\n muted?: boolean;\n right?: boolean;\n title?: string;\n className?: string;\n suppressHydrationWarning?: boolean;\n}) {\n return (\n <td\n title={title}\n suppressHydrationWarning={suppressHydrationWarning}\n className={`whitespace-nowrap px-4 py-2.5 tnum text-[12.5px] ${right ? \"text-right\" : \"text-left\"} ${\n muted ? \"text-text-muted\" : \"text-text\"\n }${className ? ` ${className}` : \"\"}`}\n >\n {children}\n </td>\n );\n}\n\nfunction RequestDetail({ log, onClose }: { log: UsageLog; onClose: () => void }) {\n const ok = log.status >= 200 && log.status < 300;\n const totalTokens = log.tokens_in + log.tokens_out;\n\n return (\n <div className=\"border-t border-border-subtle bg-surface-2/40 px-5 py-4\">\n <div className=\"mb-3 flex items-center justify-between\">\n <span className=\"text-[12px] font-semibold text-text\">Request Details</span>\n <button onClick={onClose} className=\"text-text-subtle hover:text-text\">\n <Icon name=\"close\" size={16} />\n </button>\n </div>\n <div className=\"grid grid-cols-2 gap-x-8 gap-y-2 text-[12px] sm:grid-cols-4\">\n <DetailCell label=\"Status\" value={`${log.status} ${ok ? \"OK\" : \"Error\"}`} />\n <DetailCell label=\"Timestamp\" value={new Date(log.ts).toLocaleString()} />\n <DetailCell label=\"Alias\" value={log.alias} />\n <DetailCell label=\"Provider\" value={log.provider} />\n <DetailCell label=\"Model\" value={log.model} />\n <DetailCell label=\"Mode\" value={log.stream ? \"Streaming\" : \"Unary\"} />\n <DetailCell label=\"Latency\" value={`${log.latency_ms}ms`} />\n <DetailCell label=\"Cost\" value={fmt.cost(log.cost)} />\n <DetailCell label=\"Input tokens\" value={fmt.int(log.tokens_in)} />\n <DetailCell label=\"Output tokens\" value={fmt.int(log.tokens_out)} />\n <DetailCell label=\"Cached tokens\" value={fmt.int(log.cached_tokens)} />\n <DetailCell label=\"Total tokens\" value={fmt.int(totalTokens)} />\n </div>\n </div>\n );\n}\n\nfunction DetailCell({ label, value }: { label: string; value: string }) {\n return (\n <div>\n <span className=\"text-[10px] uppercase tracking-wider text-text-subtle\">{label}</span>\n <div className=\"tnum text-text\">{value}</div>\n </div>\n );\n}\n"],"names":["METRICS","key","label","valueOf","p","m","tokens_in","tokens_out","cost","requests","fmtVal","v","toFixed","String","Math","round","fmtTime","ts","Date","toLocaleTimeString","hour","minute","hour12","fmtDate","toLocaleDateString","month","day","AreaChart","series","metric","setMetric","hoverIdx","setHoverIdx","svgRef","W","H","padX","padY","vals","map","max","n","length","xPos","i","yPos","line","join","area","peak","indexOf","total","reduce","a","b","handleMouseMove","e","current","rect","getBoundingClientRect","relX","clientX","left","width","idx","min","handleMouseLeave","hp","className","onClick","ref","viewBox","preserveAspectRatio","onMouseMove","onMouseLeave","id","x1","y1","x2","y2","offset","stopColor","stopOpacity","d","fill","stroke","strokeWidth","vectorEffect","cx","cy","r","strokeDasharray","opacity","style","transform","FILTERS","ctrl","SINCE_PRESETS","ms","sincePill","active","LogTable","logs","initial","setLogs","filter","setFilter","provFilter","setProvFilter","sinceMs","setSinceMs","live","setLive","collapsed","setCollapsed","expandedIdx","setExpandedIdx","timer","refresh","res","fetch","ok","data","json","setInterval","clearInterval","providers","Set","l","provider","sort","okCount","status","errCount","sinceFloor","now","shown","hasFilters","clearFilters","count","k","title","name","size","f","FilterField","value","onChange","target","type","disabled","h","isExpanded","Td","tone","state","muted","time","suppressHydrationWarning","ago","alias","model","right","int","latency_ms","stream","RequestDetail","log","onClose","children","totalTokens","DetailCell","toLocaleString","cached_tokens"],"mappings":"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"}
@@ -7,9 +7,9 @@ globalThis.__BUILD_MANIFEST = {
7
7
  "static/chunks/0cz1d0mv5g_q7.js"
8
8
  ],
9
9
  "lowPriorityFiles": [
10
- "static/jKcczqYA93-Kuqa9A9H9h/_buildManifest.js",
11
- "static/jKcczqYA93-Kuqa9A9H9h/_ssgManifest.js",
12
- "static/jKcczqYA93-Kuqa9A9H9h/_clientMiddlewareManifest.js"
10
+ "static/3ctBU8K8tClTVQCiGy65u/_buildManifest.js",
11
+ "static/3ctBU8K8tClTVQCiGy65u/_ssgManifest.js",
12
+ "static/3ctBU8K8tClTVQCiGy65u/_clientMiddlewareManifest.js"
13
13
  ],
14
14
  "rootMainFiles": [
15
15
  "static/chunks/36ssnkm0cjgq6.js",
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="en" class="dark inter_c15e96cb-module__0bjUvq__variable jetbrains_mono_7ea1d0f9-module__6GV5LG__variable"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/0iv69e64f1ywa.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/36ssnkm0cjgq6.js"/><script src="/_next/static/chunks/3jat3x6f_2a6o.js" async=""></script><script src="/_next/static/chunks/3j9pm5otqxm82.js" async=""></script><script src="/_next/static/chunks/0mk1g55o6kl1e.js" async=""></script><script src="/_next/static/chunks/27jktro2p5rq9.js" async=""></script><script src="/_next/static/chunks/turbopack-28-wpvvyttgwq.js" async=""></script><script src="/_next/static/chunks/13ge_ybuj8rl3.js" async=""></script><script src="/_next/static/chunks/14mrh2-p_w84d.js" async=""></script><link rel="preload" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0&amp;display=block" as="style"/><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><title>aigetwey</title><meta name="description" content="Console for the aigetwey AI gateway"/><link rel="icon" href="/icon.svg?icon.43yv9zw_mes0x.svg" sizes="any" type="image/svg+xml"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0&amp;display=block"/><script>(self.__next_s=self.__next_s||[]).push([0,{"children":"try{var t=localStorage.getItem(\"theme\");if(t===\"light\")document.documentElement.className=document.documentElement.className.replace(\"dark\",\"light\")}catch(e){}","id":"theme-init"}])</script><script src="/_next/static/chunks/0cz1d0mv5g_q7.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><div class="fixed bottom-5 right-5 z-[100] flex flex-col gap-2"></div><script src="/_next/static/chunks/36ssnkm0cjgq6.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[79520,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"\"]\n3:I[59919,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"ThemeProvider\"]\n4:I[76972,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"ToastProvider\"]\n5:I[39756,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\"]\n6:I[37457,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\"]\n7:I[97367,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"OutletBoundary\"]\n8:\"$Sreact.suspense\"\nb:I[97367,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"ViewportBoundary\"]\nd:I[97367,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"MetadataBoundary\"]\nf:I[68027,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\",1]\n:HL[\"/_next/static/chunks/0iv69e64f1ywa.css\",\"style\"]\n:HL[\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\u0026display=block\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0iv69e64f1ywa.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/14mrh2-p_w84d.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"dark inter_c15e96cb-module__0bjUvq__variable jetbrains_mono_7ea1d0f9-module__6GV5LG__variable\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"link\",null,{\"rel\":\"stylesheet\",\"href\":\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\u0026display=block\"}],[\"$\",\"$L2\",null,{\"id\":\"theme-init\",\"strategy\":\"beforeInteractive\",\"children\":\"try{var t=localStorage.getItem(\\\"theme\\\");if(t===\\\"light\\\")document.documentElement.className=document.documentElement.className.replace(\\\"dark\\\",\\\"light\\\")}catch(e){}\"}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"$L3\",null,{\"children\":[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L7\",null,{\"children\":[\"$\",\"$8\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@9\"}]}]]}],{},null,false,null]},null,false,\"$@a\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$Lb\",null,{\"children\":\"$Lc\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Ld\",null,{\"children\":[\"$\",\"$8\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Le\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$f\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0iv69e64f1ywa.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"jKcczqYA93-Kuqa9A9H9h\"}\n"])</script><script>self.__next_f.push([1,"10:[]\na:\"$W10\"\n"])</script><script>self.__next_f.push([1,"c:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"11:I[27201,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"IconMark\"]\n9:null\ne:[[\"$\",\"title\",\"0\",{\"children\":\"aigetwey\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Console for the aigetwey AI gateway\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/icon.svg?icon.43yv9zw_mes0x.svg\",\"sizes\":\"any\",\"type\":\"image/svg+xml\"}],[\"$\",\"$L11\",\"3\",{}]]\n"])</script></body></html>
1
+ <!DOCTYPE html><html lang="en" class="dark inter_c15e96cb-module__0bjUvq__variable jetbrains_mono_7ea1d0f9-module__6GV5LG__variable"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/2mpe3tpzx0wtj.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/36ssnkm0cjgq6.js"/><script src="/_next/static/chunks/3jat3x6f_2a6o.js" async=""></script><script src="/_next/static/chunks/3j9pm5otqxm82.js" async=""></script><script src="/_next/static/chunks/0mk1g55o6kl1e.js" async=""></script><script src="/_next/static/chunks/27jktro2p5rq9.js" async=""></script><script src="/_next/static/chunks/turbopack-28-wpvvyttgwq.js" async=""></script><script src="/_next/static/chunks/13ge_ybuj8rl3.js" async=""></script><script src="/_next/static/chunks/14mrh2-p_w84d.js" async=""></script><link rel="preload" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0&amp;display=block" as="style"/><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><title>aigetwey</title><meta name="description" content="Console for the aigetwey AI gateway"/><link rel="icon" href="/icon.svg?icon.43yv9zw_mes0x.svg" sizes="any" type="image/svg+xml"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0&amp;display=block"/><script>(self.__next_s=self.__next_s||[]).push([0,{"children":"try{var t=localStorage.getItem(\"theme\");if(t===\"light\")document.documentElement.className=document.documentElement.className.replace(\"dark\",\"light\")}catch(e){}","id":"theme-init"}])</script><script src="/_next/static/chunks/0cz1d0mv5g_q7.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><div class="fixed bottom-5 right-5 z-[100] flex flex-col gap-2"></div><script src="/_next/static/chunks/36ssnkm0cjgq6.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[79520,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"\"]\n3:I[59919,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"ThemeProvider\"]\n4:I[76972,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"ToastProvider\"]\n5:I[39756,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\"]\n6:I[37457,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\"]\n7:I[97367,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"OutletBoundary\"]\n8:\"$Sreact.suspense\"\nb:I[97367,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"ViewportBoundary\"]\nd:I[97367,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"MetadataBoundary\"]\nf:I[68027,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\",1]\n:HL[\"/_next/static/chunks/2mpe3tpzx0wtj.css\",\"style\"]\n:HL[\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\u0026display=block\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/2mpe3tpzx0wtj.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/14mrh2-p_w84d.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"dark inter_c15e96cb-module__0bjUvq__variable jetbrains_mono_7ea1d0f9-module__6GV5LG__variable\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"link\",null,{\"rel\":\"stylesheet\",\"href\":\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0\u0026display=block\"}],[\"$\",\"$L2\",null,{\"id\":\"theme-init\",\"strategy\":\"beforeInteractive\",\"children\":\"try{var t=localStorage.getItem(\\\"theme\\\");if(t===\\\"light\\\")document.documentElement.className=document.documentElement.className.replace(\\\"dark\\\",\\\"light\\\")}catch(e){}\"}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"$L3\",null,{\"children\":[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L7\",null,{\"children\":[\"$\",\"$8\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@9\"}]}]]}],{},null,false,null]},null,false,\"$@a\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$Lb\",null,{\"children\":\"$Lc\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Ld\",null,{\"children\":[\"$\",\"$8\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Le\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$f\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/2mpe3tpzx0wtj.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"3ctBU8K8tClTVQCiGy65u\"}\n"])</script><script>self.__next_f.push([1,"10:[]\na:\"$W10\"\n"])</script><script>self.__next_f.push([1,"c:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"11:I[27201,[\"/_next/static/chunks/13ge_ybuj8rl3.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"IconMark\"]\n9:null\ne:[[\"$\",\"title\",\"0\",{\"children\":\"aigetwey\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Console for the aigetwey AI gateway\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/icon.svg?icon.43yv9zw_mes0x.svg\",\"sizes\":\"any\",\"type\":\"image/svg+xml\"}],[\"$\",\"$L11\",\"3\",{}]]\n"])</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/36ssnkm0cjgq6.js"/><script src="/_next/static/chunks/3jat3x6f_2a6o.js" async=""></script><script src="/_next/static/chunks/3j9pm5otqxm82.js" async=""></script><script src="/_next/static/chunks/0mk1g55o6kl1e.js" async=""></script><script src="/_next/static/chunks/27jktro2p5rq9.js" async=""></script><script src="/_next/static/chunks/turbopack-28-wpvvyttgwq.js" async=""></script><script src="/_next/static/chunks/05-c3ty_6dwfk.js" async=""></script><script src="/_next/static/chunks/14mrh2-p_w84d.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: This page couldn’t load</title><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/0cz1d0mv5g_q7.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/36ssnkm0cjgq6.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[39756,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\"]\n3:I[37457,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\"]\n4:I[97367,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[97367,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"ViewportBoundary\"]\na:I[97367,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"MetadataBoundary\"]\nc:I[68027,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\",1]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$@7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"jKcczqYA93-Kuqa9A9H9h\"}\n"])</script><script>self.__next_f.push([1,"d:[]\n7:\"$Wd\"\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\nb:[]\n"])</script></body></html>
1
+ <!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/36ssnkm0cjgq6.js"/><script src="/_next/static/chunks/3jat3x6f_2a6o.js" async=""></script><script src="/_next/static/chunks/3j9pm5otqxm82.js" async=""></script><script src="/_next/static/chunks/0mk1g55o6kl1e.js" async=""></script><script src="/_next/static/chunks/27jktro2p5rq9.js" async=""></script><script src="/_next/static/chunks/turbopack-28-wpvvyttgwq.js" async=""></script><script src="/_next/static/chunks/05-c3ty_6dwfk.js" async=""></script><script src="/_next/static/chunks/14mrh2-p_w84d.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: This page couldn’t load</title><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/0cz1d0mv5g_q7.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/36ssnkm0cjgq6.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[39756,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\"]\n3:I[37457,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\"]\n4:I[97367,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[97367,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"ViewportBoundary\"]\na:I[97367,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"MetadataBoundary\"]\nc:I[68027,[\"/_next/static/chunks/05-c3ty_6dwfk.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\",1]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$@7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"3ctBU8K8tClTVQCiGy65u\"}\n"])</script><script>self.__next_f.push([1,"d:[]\n7:\"$Wd\"\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\nb:[]\n"])</script></body></html>