claude-session-dashboard 0.1.3 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +156 -14
- package/dist/client/assets/_dashboard-I7m6D7BE.js +1 -0
- package/dist/client/assets/_sessionId-DEliIff6.js +12 -0
- package/dist/client/assets/app-D7yorIIh.css +1 -0
- package/dist/client/assets/{createServerFn-Le0d8Pjz.js → createServerFn-Bn6_ISOt.js} +1 -1
- package/dist/client/assets/format-Bsprb3az.js +1 -0
- package/dist/client/assets/index-BkqRvnEf.js +1 -0
- package/dist/client/assets/{main-CzD8HjLq.js → main-CfJIADCp.js} +7 -7
- package/dist/client/assets/sessions.queries-CrJg4dYU.js +1 -0
- package/dist/client/assets/settings-C4_lsEzl.js +1 -0
- package/dist/client/assets/{settings.types-B4841OLF.js → settings.types-9Qf5WcRY.js} +1 -1
- package/dist/client/assets/stats-_r1gmaTe.js +4 -0
- package/dist/client/assets/useSessionCost-DPZ-ubM1.js +65 -0
- package/dist/client/favicon.svg +3 -0
- package/dist/server/assets/_dashboard-TUzgwLqB.js +112 -0
- package/dist/server/assets/{_sessionId-BwZK4Ezz.js → _sessionId-C-XZIPqn.js} +57 -35
- package/dist/server/assets/_tanstack-start-manifest_v-B51mSkGz.js +4 -0
- package/dist/server/assets/{claude-path-CkuljM34.js → claude-path-BdwflgZ1.js} +9 -3
- package/dist/server/assets/{format-CGmJnuhZ.js → format-DIZHV7IJ.js} +3 -3
- package/dist/server/assets/{index-D4VWrt2z.js → index-CKfH7HpA.js} +28 -60
- package/dist/server/assets/project-analytics.server-BkWSd6a8.js +61 -0
- package/dist/server/assets/{router-xTSe9UH_.js → router-Cb_hBXHI.js} +62 -31
- package/dist/server/assets/{session-detail.server-azkRfON2.js → session-detail.server-DLXl-Pn-.js} +1 -1
- package/dist/server/assets/session-scanner-CLfls9u-.js +93 -0
- package/dist/server/assets/sessions.queries-B5ZBiVJy.js +42 -0
- package/dist/server/assets/{sessions.server-B8zbmvSM.js → sessions.server-CUhasKW2.js} +5 -89
- package/dist/server/assets/{settings-ko61yfVs.js → settings-C0_KyVQQ.js} +66 -20
- package/dist/server/assets/stats-BtgVene-.js +886 -0
- package/dist/server/assets/{stats.server-BZWxV-mC.js → stats.server-qTOvID9-.js} +62 -3
- package/dist/server/assets/useSessionCost-CYs5UOX-.js +209 -0
- package/dist/server/server.js +13 -10
- package/package.json +11 -1
- package/dist/client/assets/_dashboard-CYwTENkn.js +0 -1
- package/dist/client/assets/_sessionId-Bwfhm_El.js +0 -12
- package/dist/client/assets/app-DhZyFob1.css +0 -1
- package/dist/client/assets/format-Bf-cSf6L.js +0 -1
- package/dist/client/assets/index-DXhX1hdS.js +0 -1
- package/dist/client/assets/settings-BSPc79zZ.js +0 -1
- package/dist/client/assets/stats-CDIvpOt9.js +0 -4
- package/dist/client/assets/useSessionCost-9NP6uhla.js +0 -61
- package/dist/server/assets/_dashboard--ukhquwO.js +0 -97
- package/dist/server/assets/_tanstack-start-manifest_v-gtQY7f-T.js +0 -4
- package/dist/server/assets/stats-DItsFPp5.js +0 -266
- package/dist/server/assets/useSessionCost-EB0VxklP.js +0 -76
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { c as createServerRpc } from "./createServerRpc-Bd3B-Ah9.js";
|
|
2
2
|
import * as fs from "node:fs";
|
|
3
|
-
import {
|
|
3
|
+
import { g as getStatsPath } from "./claude-path-BdwflgZ1.js";
|
|
4
|
+
import * as path from "node:path";
|
|
5
|
+
import * as os from "node:os";
|
|
4
6
|
import { z } from "zod";
|
|
5
7
|
import { c as createServerFn } from "../server.js";
|
|
6
|
-
import "node:path";
|
|
7
|
-
import "node:os";
|
|
8
8
|
import "@tanstack/history";
|
|
9
9
|
import "@tanstack/router-core/ssr/client";
|
|
10
10
|
import "@tanstack/router-core";
|
|
@@ -16,6 +16,59 @@ import "seroval";
|
|
|
16
16
|
import "react/jsx-runtime";
|
|
17
17
|
import "@tanstack/react-router/ssr/server";
|
|
18
18
|
import "@tanstack/react-router";
|
|
19
|
+
const CACHE_VERSION = 1;
|
|
20
|
+
function getCacheDir() {
|
|
21
|
+
return path.join(os.homedir(), ".claude-dashboard", "cache");
|
|
22
|
+
}
|
|
23
|
+
function getCachePath(cacheKey) {
|
|
24
|
+
return path.join(getCacheDir(), `${cacheKey}.cache.json`);
|
|
25
|
+
}
|
|
26
|
+
function readDiskCache(cacheKey, sourceMtimeMs, schema) {
|
|
27
|
+
try {
|
|
28
|
+
const cachePath = getCachePath(cacheKey);
|
|
29
|
+
if (!fs.existsSync(cachePath)) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
const raw = fs.readFileSync(cachePath, "utf-8");
|
|
33
|
+
const parsed = JSON.parse(raw);
|
|
34
|
+
if (parsed.version !== CACHE_VERSION) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
if (parsed.sourceMtimeMs !== sourceMtimeMs) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
const result = schema.safeParse(parsed.data);
|
|
41
|
+
if (!result.success) {
|
|
42
|
+
console.warn(`[disk-cache] Zod validation failed for "${cacheKey}":`, result.error.message);
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
return result.data;
|
|
46
|
+
} catch (error) {
|
|
47
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
48
|
+
console.warn(`[disk-cache] Read failed for "${cacheKey}":`, message);
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function writeDiskCache(cacheKey, sourceFile, sourceMtimeMs, data) {
|
|
53
|
+
try {
|
|
54
|
+
const cacheDir = getCacheDir();
|
|
55
|
+
fs.mkdirSync(cacheDir, { recursive: true });
|
|
56
|
+
const cachePath = getCachePath(cacheKey);
|
|
57
|
+
const tmpPath = `${cachePath}.tmp`;
|
|
58
|
+
const entry = {
|
|
59
|
+
version: CACHE_VERSION,
|
|
60
|
+
sourceFile,
|
|
61
|
+
sourceMtimeMs,
|
|
62
|
+
cachedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
63
|
+
data
|
|
64
|
+
};
|
|
65
|
+
fs.writeFileSync(tmpPath, JSON.stringify(entry), "utf-8");
|
|
66
|
+
fs.renameSync(tmpPath, cachePath);
|
|
67
|
+
} catch (error) {
|
|
68
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
69
|
+
console.warn(`[disk-cache] Write failed for "${cacheKey}":`, message);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
19
72
|
const DailyActivitySchema = z.object({
|
|
20
73
|
date: z.string(),
|
|
21
74
|
messageCount: z.number(),
|
|
@@ -64,9 +117,15 @@ async function parseStats() {
|
|
|
64
117
|
if (cachedStats && cachedStats.mtimeMs === stat.mtimeMs) {
|
|
65
118
|
return cachedStats.data;
|
|
66
119
|
}
|
|
120
|
+
const diskResult = readDiskCache("stats", stat.mtimeMs, StatsCacheSchema);
|
|
121
|
+
if (diskResult) {
|
|
122
|
+
cachedStats = { mtimeMs: stat.mtimeMs, data: diskResult };
|
|
123
|
+
return diskResult;
|
|
124
|
+
}
|
|
67
125
|
const raw = await fs.promises.readFile(statsPath, "utf-8");
|
|
68
126
|
const parsed = JSON.parse(raw);
|
|
69
127
|
const result = StatsCacheSchema.parse(parsed);
|
|
128
|
+
writeDiskCache("stats", statsPath, stat.mtimeMs, result);
|
|
70
129
|
cachedStats = { mtimeMs: stat.mtimeMs, data: result };
|
|
71
130
|
return result;
|
|
72
131
|
}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useRef, useEffect, useMemo } from "react";
|
|
3
|
+
import { useQuery } from "@tanstack/react-query";
|
|
4
|
+
import { s as settingsQuery } from "./settings.queries-DSQd324O.js";
|
|
5
|
+
import { b as DEFAULT_PRICING, n as normalizeModelId } from "./settings.types-DntadCHo.js";
|
|
6
|
+
function escapeCSVField(value) {
|
|
7
|
+
if (value.includes(",") || value.includes('"') || value.includes("\n")) {
|
|
8
|
+
return `"${value.replace(/"/g, '""')}"`;
|
|
9
|
+
}
|
|
10
|
+
return value;
|
|
11
|
+
}
|
|
12
|
+
function toCSVRow(fields) {
|
|
13
|
+
return fields.map((f) => escapeCSVField(String(f))).join(",");
|
|
14
|
+
}
|
|
15
|
+
function dailyActivityToCSV(stats) {
|
|
16
|
+
const header = toCSVRow(["date", "messageCount", "sessionCount", "toolCallCount"]);
|
|
17
|
+
const rows = stats.dailyActivity.map(
|
|
18
|
+
(day) => toCSVRow([day.date, day.messageCount, day.sessionCount, day.toolCallCount])
|
|
19
|
+
);
|
|
20
|
+
return [header, ...rows].join("\n");
|
|
21
|
+
}
|
|
22
|
+
function dailyTokensToCSV(stats) {
|
|
23
|
+
const header = toCSVRow(["date", "model", "tokens"]);
|
|
24
|
+
const rows = [];
|
|
25
|
+
for (const day of stats.dailyModelTokens) {
|
|
26
|
+
for (const [model, tokens] of Object.entries(day.tokensByModel)) {
|
|
27
|
+
rows.push(toCSVRow([day.date, model, tokens]));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return [header, ...rows].join("\n");
|
|
31
|
+
}
|
|
32
|
+
function modelUsageToCSV(stats) {
|
|
33
|
+
const header = toCSVRow([
|
|
34
|
+
"model",
|
|
35
|
+
"inputTokens",
|
|
36
|
+
"outputTokens",
|
|
37
|
+
"cacheReadInputTokens",
|
|
38
|
+
"cacheCreationInputTokens"
|
|
39
|
+
]);
|
|
40
|
+
const rows = Object.entries(stats.modelUsage).map(
|
|
41
|
+
([model, usage]) => toCSVRow([
|
|
42
|
+
model,
|
|
43
|
+
usage.inputTokens,
|
|
44
|
+
usage.outputTokens,
|
|
45
|
+
usage.cacheReadInputTokens,
|
|
46
|
+
usage.cacheCreationInputTokens
|
|
47
|
+
])
|
|
48
|
+
);
|
|
49
|
+
return [header, ...rows].join("\n");
|
|
50
|
+
}
|
|
51
|
+
function statsToJSON(stats) {
|
|
52
|
+
return JSON.stringify(stats, null, 2);
|
|
53
|
+
}
|
|
54
|
+
function sessionToJSON(detail) {
|
|
55
|
+
return JSON.stringify(detail, null, 2);
|
|
56
|
+
}
|
|
57
|
+
function downloadFile(content, filename, mimeType) {
|
|
58
|
+
const blob = new Blob([content], { type: mimeType });
|
|
59
|
+
const url = URL.createObjectURL(blob);
|
|
60
|
+
const a = document.createElement("a");
|
|
61
|
+
a.href = url;
|
|
62
|
+
a.download = filename;
|
|
63
|
+
try {
|
|
64
|
+
document.body.appendChild(a);
|
|
65
|
+
a.click();
|
|
66
|
+
} finally {
|
|
67
|
+
document.body.removeChild(a);
|
|
68
|
+
setTimeout(() => URL.revokeObjectURL(url), 100);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function ExportDropdown({ options }) {
|
|
72
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
73
|
+
const containerRef = useRef(null);
|
|
74
|
+
useEffect(() => {
|
|
75
|
+
function handleClickOutside(event) {
|
|
76
|
+
if (containerRef.current && !containerRef.current.contains(event.target)) {
|
|
77
|
+
setIsOpen(false);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (isOpen) {
|
|
81
|
+
document.addEventListener("mousedown", handleClickOutside);
|
|
82
|
+
}
|
|
83
|
+
return () => {
|
|
84
|
+
document.removeEventListener("mousedown", handleClickOutside);
|
|
85
|
+
};
|
|
86
|
+
}, [isOpen]);
|
|
87
|
+
return /* @__PURE__ */ jsxs("div", { ref: containerRef, className: "relative", children: [
|
|
88
|
+
/* @__PURE__ */ jsxs(
|
|
89
|
+
"button",
|
|
90
|
+
{
|
|
91
|
+
type: "button",
|
|
92
|
+
onClick: () => setIsOpen((prev) => !prev),
|
|
93
|
+
onKeyDown: (e) => {
|
|
94
|
+
if (e.key === "Escape") setIsOpen(false);
|
|
95
|
+
},
|
|
96
|
+
"aria-expanded": isOpen,
|
|
97
|
+
"aria-haspopup": "menu",
|
|
98
|
+
className: "flex items-center gap-1.5 rounded-lg border border-gray-700 bg-gray-800 px-3 py-1.5 text-sm text-gray-300 hover:bg-gray-700",
|
|
99
|
+
children: [
|
|
100
|
+
"Export",
|
|
101
|
+
/* @__PURE__ */ jsx(
|
|
102
|
+
"svg",
|
|
103
|
+
{
|
|
104
|
+
className: `h-3 w-3 transition-transform ${isOpen ? "rotate-180" : ""}`,
|
|
105
|
+
viewBox: "0 0 12 12",
|
|
106
|
+
fill: "none",
|
|
107
|
+
stroke: "currentColor",
|
|
108
|
+
strokeWidth: "2",
|
|
109
|
+
children: /* @__PURE__ */ jsx("path", { d: "M3 4.5L6 7.5L9 4.5" })
|
|
110
|
+
}
|
|
111
|
+
)
|
|
112
|
+
]
|
|
113
|
+
}
|
|
114
|
+
),
|
|
115
|
+
isOpen && /* @__PURE__ */ jsx("div", { role: "menu", className: "absolute right-0 z-10 mt-1 min-w-[200px] rounded-lg border border-gray-700 bg-gray-800 py-1 shadow-lg", children: options.map((option) => /* @__PURE__ */ jsx(
|
|
116
|
+
"button",
|
|
117
|
+
{
|
|
118
|
+
type: "button",
|
|
119
|
+
role: "menuitem",
|
|
120
|
+
onClick: () => {
|
|
121
|
+
option.onClick();
|
|
122
|
+
setIsOpen(false);
|
|
123
|
+
},
|
|
124
|
+
className: "block w-full cursor-pointer px-3 py-2 text-left text-sm text-gray-300 hover:bg-gray-700",
|
|
125
|
+
children: option.label
|
|
126
|
+
},
|
|
127
|
+
option.label
|
|
128
|
+
)) })
|
|
129
|
+
] });
|
|
130
|
+
}
|
|
131
|
+
function getMergedPricing(settings) {
|
|
132
|
+
const table = {};
|
|
133
|
+
for (const model of DEFAULT_PRICING) {
|
|
134
|
+
const override = settings.pricingOverrides[model.modelId];
|
|
135
|
+
table[model.modelId] = override ? { ...model, ...override } : { ...model };
|
|
136
|
+
}
|
|
137
|
+
return table;
|
|
138
|
+
}
|
|
139
|
+
const FALLBACK_MODEL_ID = "claude-sonnet-4";
|
|
140
|
+
function calculateSessionCost(tokensByModel, pricingTable) {
|
|
141
|
+
const byModel = {};
|
|
142
|
+
const byCategory = {
|
|
143
|
+
input: 0,
|
|
144
|
+
output: 0,
|
|
145
|
+
cacheRead: 0,
|
|
146
|
+
cacheWrite: 0
|
|
147
|
+
};
|
|
148
|
+
for (const [rawModelId, tokens] of Object.entries(tokensByModel)) {
|
|
149
|
+
const normalized = normalizeModelId(rawModelId);
|
|
150
|
+
const pricing = pricingTable[normalized] ?? pricingTable[FALLBACK_MODEL_ID];
|
|
151
|
+
if (!pricing) continue;
|
|
152
|
+
const inputCost = tokens.inputTokens / 1e6 * pricing.inputPerMTok;
|
|
153
|
+
const outputCost = tokens.outputTokens / 1e6 * pricing.outputPerMTok;
|
|
154
|
+
const cacheReadCost = tokens.cacheReadInputTokens / 1e6 * pricing.cacheReadPerMTok;
|
|
155
|
+
const cacheWriteCost = tokens.cacheCreationInputTokens / 1e6 * pricing.cacheWritePerMTok;
|
|
156
|
+
const totalCost = inputCost + outputCost + cacheReadCost + cacheWriteCost;
|
|
157
|
+
const existing = byModel[normalized];
|
|
158
|
+
if (existing) {
|
|
159
|
+
existing.inputCost += inputCost;
|
|
160
|
+
existing.outputCost += outputCost;
|
|
161
|
+
existing.cacheReadCost += cacheReadCost;
|
|
162
|
+
existing.cacheWriteCost += cacheWriteCost;
|
|
163
|
+
existing.totalCost += totalCost;
|
|
164
|
+
existing.tokens.inputTokens += tokens.inputTokens;
|
|
165
|
+
existing.tokens.outputTokens += tokens.outputTokens;
|
|
166
|
+
existing.tokens.cacheReadInputTokens += tokens.cacheReadInputTokens;
|
|
167
|
+
existing.tokens.cacheCreationInputTokens += tokens.cacheCreationInputTokens;
|
|
168
|
+
} else {
|
|
169
|
+
byModel[normalized] = {
|
|
170
|
+
modelId: normalized,
|
|
171
|
+
displayName: pricing.displayName,
|
|
172
|
+
inputCost,
|
|
173
|
+
outputCost,
|
|
174
|
+
cacheReadCost,
|
|
175
|
+
cacheWriteCost,
|
|
176
|
+
totalCost,
|
|
177
|
+
tokens: { ...tokens }
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
byCategory.input += inputCost;
|
|
181
|
+
byCategory.output += outputCost;
|
|
182
|
+
byCategory.cacheRead += cacheReadCost;
|
|
183
|
+
byCategory.cacheWrite += cacheWriteCost;
|
|
184
|
+
}
|
|
185
|
+
const totalUSD = byCategory.input + byCategory.output + byCategory.cacheRead + byCategory.cacheWrite;
|
|
186
|
+
return { totalUSD, byModel, byCategory };
|
|
187
|
+
}
|
|
188
|
+
function useSessionCost(tokensByModel) {
|
|
189
|
+
const { data: settings, isLoading } = useQuery(settingsQuery);
|
|
190
|
+
const cost = useMemo(() => {
|
|
191
|
+
if (!settings) return null;
|
|
192
|
+
if (Object.keys(tokensByModel).length === 0) return null;
|
|
193
|
+
const pricingTable = getMergedPricing(settings);
|
|
194
|
+
return calculateSessionCost(tokensByModel, pricingTable);
|
|
195
|
+
}, [settings, tokensByModel]);
|
|
196
|
+
return { cost, isLoading };
|
|
197
|
+
}
|
|
198
|
+
export {
|
|
199
|
+
ExportDropdown as E,
|
|
200
|
+
dailyActivityToCSV as a,
|
|
201
|
+
dailyTokensToCSV as b,
|
|
202
|
+
calculateSessionCost as c,
|
|
203
|
+
downloadFile as d,
|
|
204
|
+
sessionToJSON as e,
|
|
205
|
+
getMergedPricing as g,
|
|
206
|
+
modelUsageToCSV as m,
|
|
207
|
+
statsToJSON as s,
|
|
208
|
+
useSessionCost as u
|
|
209
|
+
};
|
package/dist/server/server.js
CHANGED
|
@@ -423,7 +423,7 @@ function getResponse() {
|
|
|
423
423
|
return event.res;
|
|
424
424
|
}
|
|
425
425
|
async function getStartManifest(matchedRoutes) {
|
|
426
|
-
const { tsrStartManifest } = await import("./assets/_tanstack-start-manifest_v-
|
|
426
|
+
const { tsrStartManifest } = await import("./assets/_tanstack-start-manifest_v-B51mSkGz.js");
|
|
427
427
|
const startManifest = tsrStartManifest();
|
|
428
428
|
const rootRoute = startManifest.routes[rootRouteId] = startManifest.routes[rootRouteId] || {};
|
|
429
429
|
rootRoute.assets = rootRoute.assets || [];
|
|
@@ -577,27 +577,30 @@ function createMultiplexedStream(jsonStream, rawStreams) {
|
|
|
577
577
|
}
|
|
578
578
|
});
|
|
579
579
|
}
|
|
580
|
-
const manifest = { "
|
|
581
|
-
functionName: "getSessionDetail_createServerFn_handler",
|
|
582
|
-
importer: () => import("./assets/session-detail.server-azkRfON2.js")
|
|
583
|
-
}, "4b9a58c176f487b49800a372100037cdf33cf048f3592a449f115c7e3f5ea799": {
|
|
580
|
+
const manifest = { "4b9a58c176f487b49800a372100037cdf33cf048f3592a449f115c7e3f5ea799": {
|
|
584
581
|
functionName: "getStats_createServerFn_handler",
|
|
585
|
-
importer: () => import("./assets/stats.server-
|
|
582
|
+
importer: () => import("./assets/stats.server-qTOvID9-.js")
|
|
583
|
+
}, "ff8a3161afdfa175e9c519e4146a56ab5bce6e80745e99cfc2191ebbb7a859bb": {
|
|
584
|
+
functionName: "getSessionDetail_createServerFn_handler",
|
|
585
|
+
importer: () => import("./assets/session-detail.server-DLXl-Pn-.js")
|
|
586
586
|
}, "810657681a273df5b4e58f0d8fcc6a5451598b489431b9bcaa98eea0ad815da8": {
|
|
587
587
|
functionName: "getSettings_createServerFn_handler",
|
|
588
588
|
importer: () => import("./assets/settings.server-6B2PvLgf.js")
|
|
589
589
|
}, "3050115d92ca91ab1fd8fd698e33076328aae80dc64ca27c088eee16cebccc1a": {
|
|
590
590
|
functionName: "saveSettings_createServerFn_handler",
|
|
591
591
|
importer: () => import("./assets/settings.server-6B2PvLgf.js")
|
|
592
|
+
}, "64052f224a1d6696436e5d3deeee2b798f0742e1292ffabd038c3a7bf75e6fcb": {
|
|
593
|
+
functionName: "getProjectAnalytics_createServerFn_handler",
|
|
594
|
+
importer: () => import("./assets/project-analytics.server-BkWSd6a8.js")
|
|
592
595
|
}, "bf8e4a7901f1843bdc9c46be1ad5ad59c615b8bbe611b73eb3ff28f20e43ee0d": {
|
|
593
596
|
functionName: "getSessionList_createServerFn_handler",
|
|
594
|
-
importer: () => import("./assets/sessions.server-
|
|
597
|
+
importer: () => import("./assets/sessions.server-CUhasKW2.js")
|
|
595
598
|
}, "839d29fe93dfa2a6d506af7b48ca25197190a5ff4c796e970ddfdc6e8c98827f": {
|
|
596
599
|
functionName: "getActiveSessionList_createServerFn_handler",
|
|
597
|
-
importer: () => import("./assets/sessions.server-
|
|
600
|
+
importer: () => import("./assets/sessions.server-CUhasKW2.js")
|
|
598
601
|
}, "a3f42f9012fd83586787da8f7cb90649da739dd947d867eb67572f68735ff495": {
|
|
599
602
|
functionName: "getPaginatedSessions_createServerFn_handler",
|
|
600
|
-
importer: () => import("./assets/sessions.server-
|
|
603
|
+
importer: () => import("./assets/sessions.server-CUhasKW2.js")
|
|
601
604
|
} };
|
|
602
605
|
async function getServerFnById(id) {
|
|
603
606
|
const serverFnInfo = manifest[id];
|
|
@@ -1013,7 +1016,7 @@ let entriesPromise;
|
|
|
1013
1016
|
let baseManifestPromise;
|
|
1014
1017
|
let cachedFinalManifestPromise;
|
|
1015
1018
|
async function loadEntries() {
|
|
1016
|
-
const routerEntry = await import("./assets/router-
|
|
1019
|
+
const routerEntry = await import("./assets/router-Cb_hBXHI.js").then((n) => n.r);
|
|
1017
1020
|
const startEntry = await import("./assets/start-HYkvq4Ni.js");
|
|
1018
1021
|
return { startEntry, routerEntry };
|
|
1019
1022
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-session-dashboard",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Local observability dashboard for Claude Code sessions",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -39,6 +39,10 @@
|
|
|
39
39
|
"test": "vitest run",
|
|
40
40
|
"test:watch": "vitest",
|
|
41
41
|
"test:ui": "vitest --ui",
|
|
42
|
+
"e2e": "playwright test",
|
|
43
|
+
"e2e:ui": "playwright test --ui",
|
|
44
|
+
"e2e:headed": "playwright test --headed",
|
|
45
|
+
"lint": "eslint src/",
|
|
42
46
|
"prepublishOnly": "npm run build"
|
|
43
47
|
},
|
|
44
48
|
"dependencies": {
|
|
@@ -52,6 +56,8 @@
|
|
|
52
56
|
"zod": "^3.24.0"
|
|
53
57
|
},
|
|
54
58
|
"devDependencies": {
|
|
59
|
+
"@eslint/js": "^9.39.2",
|
|
60
|
+
"@playwright/test": "^1.58.2",
|
|
55
61
|
"@tailwindcss/vite": "^4.1.0",
|
|
56
62
|
"@testing-library/react": "^16.3.2",
|
|
57
63
|
"@types/node": "^22.15.0",
|
|
@@ -59,10 +65,14 @@
|
|
|
59
65
|
"@types/react-dom": "^19.1.0",
|
|
60
66
|
"@vitejs/plugin-react": "^5.1.0",
|
|
61
67
|
"@vitest/ui": "^4.0.18",
|
|
68
|
+
"eslint": "^9.39.2",
|
|
69
|
+
"eslint-plugin-react-hooks": "^7.0.1",
|
|
70
|
+
"eslint-plugin-react-refresh": "^0.5.0",
|
|
62
71
|
"happy-dom": "^20.6.1",
|
|
63
72
|
"jsdom": "^28.0.0",
|
|
64
73
|
"tailwindcss": "^4.1.0",
|
|
65
74
|
"typescript": "^5.8.0",
|
|
75
|
+
"typescript-eslint": "^8.55.0",
|
|
66
76
|
"vite": "^7.3.0",
|
|
67
77
|
"vite-tsconfig-paths": "^4.3.0",
|
|
68
78
|
"vitest": "^4.0.18"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{u as n,j as e,a as c,L as r,O as i}from"./main-CzD8HjLq.js";function x(){const{privacyMode:s,togglePrivacyMode:a}=n();return e.jsxs("button",{type:"button",onClick:a,title:s?"Privacy mode on":"Privacy mode off",className:`flex items-center gap-2 rounded-lg px-3 py-1.5 text-xs transition-colors ${s?"bg-blue-600 text-white":"bg-gray-800 text-gray-400 hover:text-gray-200"}`,children:[e.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",className:"h-3.5 w-3.5",children:[s?e.jsx("path",{fillRule:"evenodd",d:"M3.28 2.22a.75.75 0 00-1.06 1.06l14.5 14.5a.75.75 0 101.06-1.06l-1.745-1.745a10.029 10.029 0 003.3-4.38 1.651 1.651 0 000-1.185A10.004 10.004 0 009.999 3a9.956 9.956 0 00-4.744 1.194L3.28 2.22zM7.752 6.69l1.092 1.092a2.5 2.5 0 013.374 3.373l1.092 1.092a4 4 0 00-5.558-5.558z",clipRule:"evenodd"}):e.jsx("path",{d:"M10 12.5a2.5 2.5 0 100-5 2.5 2.5 0 000 5z"}),s?e.jsx("path",{d:"M10.748 13.93l2.523 2.523a9.987 9.987 0 01-3.27.547c-4.258 0-7.894-2.66-9.337-6.41a1.651 1.651 0 010-1.186A10.007 10.007 0 012.839 6.02L6.07 9.252a4 4 0 004.678 4.678z"}):e.jsx("path",{fillRule:"evenodd",d:"M.458 10a9.996 9.996 0 019.542-6c4.258 0 7.894 2.66 9.337 6.41a1.651 1.651 0 010 1.186A10.004 10.004 0 0110 17.5c-4.258 0-7.894-2.66-9.337-6.41a1.651 1.651 0 010-1.186L.458 10zM14 10a4 4 0 11-8 0 4 4 0 018 0z",clipRule:"evenodd"})]}),"Privacy"]})}const d=[{to:"/sessions",label:"Sessions",icon:">"},{to:"/stats",label:"Stats",icon:"#"},{to:"/settings",label:"Settings",icon:"*"}];function h({children:s}){const a=c(),l=a[a.length-1]?.pathname??"";return e.jsxs("div",{className:"flex min-h-screen",children:[e.jsxs("aside",{className:"flex w-56 shrink-0 flex-col border-r border-gray-800 bg-gray-950",children:[e.jsx("div",{className:"flex h-14 items-center border-b border-gray-800 px-4",children:e.jsxs(r,{to:"/sessions",className:"text-sm font-bold text-white",children:[e.jsx("span",{className:"text-blue-400",children:"Claude"})," Dashboard"]})}),e.jsx("nav",{className:"flex-1 p-3",children:d.map(t=>{const o=l.startsWith(t.to);return e.jsxs(r,{to:t.to,className:`flex items-center gap-2.5 rounded-lg px-3 py-2 text-sm transition-colors ${o?"bg-gray-800 text-white":"text-gray-400 hover:bg-gray-800/50 hover:text-gray-200"}`,children:[e.jsx("span",{className:"font-mono text-xs text-gray-500",children:t.icon}),t.label]},t.to)})}),e.jsxs("div",{className:"border-t border-gray-800 p-3",children:[e.jsx(x,{}),e.jsx("p",{className:"mt-2 text-xs text-gray-600",children:"Read-only observer"})]})]}),e.jsx("main",{className:"flex-1 overflow-auto",children:e.jsx("div",{className:"mx-auto max-w-5xl px-6 py-6",children:s})})]})}function m(){return e.jsx(h,{children:e.jsx(i,{})})}export{m as component};
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import{R as w,r as S,c as Se,j as e,L as se,f as de,u as De}from"./main-CzD8HjLq.js";import{c as Pe,q as Oe,u as be}from"./createServerFn-Le0d8Pjz.js";import{f as I,c as re,a as C,g as ve,b as H}from"./format-Bf-cSf6L.js";import{f as U,L as q,Z as Q,o as X,C as ee,A as Ie,m as W,j as xe,_ as Ee,n as me,c as je,$ as Le,q as Re,u as $e,i as ae,G as _e,k as ue,a0 as pe,D as Ue,N as We,X as Be,Y as Ne,P as Fe,R as Xe,U as ze,a1 as he,a2 as He,a3 as Ge,W as ke}from"./useSessionCost-9NP6uhla.js";import{s as Ve}from"./settings.types-B4841OLF.js";var Ye=["layout","type","stroke","connectNulls","isRange","ref"],qe=["key"],we;function G(t){"@babel/helpers - typeof";return G=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(s){return typeof s}:function(s){return s&&typeof Symbol=="function"&&s.constructor===Symbol&&s!==Symbol.prototype?"symbol":typeof s},G(t)}function Te(t,s){if(t==null)return{};var r=Ke(t,s),a,n;if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(t);for(n=0;n<c.length;n++)a=c[n],!(s.indexOf(a)>=0)&&Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}function Ke(t,s){if(t==null)return{};var r={};for(var a in t)if(Object.prototype.hasOwnProperty.call(t,a)){if(s.indexOf(a)>=0)continue;r[a]=t[a]}return r}function _(){return _=Object.assign?Object.assign.bind():function(t){for(var s=1;s<arguments.length;s++){var r=arguments[s];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(t[a]=r[a])}return t},_.apply(this,arguments)}function fe(t,s){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);s&&(a=a.filter(function(n){return Object.getOwnPropertyDescriptor(t,n).enumerable})),r.push.apply(r,a)}return r}function R(t){for(var s=1;s<arguments.length;s++){var r=arguments[s]!=null?arguments[s]:{};s%2?fe(Object(r),!0).forEach(function(a){D(t,a,r[a])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):fe(Object(r)).forEach(function(a){Object.defineProperty(t,a,Object.getOwnPropertyDescriptor(r,a))})}return t}function Qe(t,s){if(!(t instanceof s))throw new TypeError("Cannot call a class as a function")}function ge(t,s){for(var r=0;r<s.length;r++){var a=s[r];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(t,Me(a.key),a)}}function Ze(t,s,r){return s&&ge(t.prototype,s),r&&ge(t,r),Object.defineProperty(t,"prototype",{writable:!1}),t}function Je(t,s,r){return s=J(s),et(t,Ae()?Reflect.construct(s,r||[],J(t).constructor):s.apply(t,r))}function et(t,s){if(s&&(G(s)==="object"||typeof s=="function"))return s;if(s!==void 0)throw new TypeError("Derived constructors may only return object or undefined");return tt(t)}function tt(t){if(t===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}function Ae(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch{}return(Ae=function(){return!!t})()}function J(t){return J=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(r){return r.__proto__||Object.getPrototypeOf(r)},J(t)}function st(t,s){if(typeof s!="function"&&s!==null)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(s&&s.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),s&&ne(t,s)}function ne(t,s){return ne=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(a,n){return a.__proto__=n,a},ne(t,s)}function D(t,s,r){return s=Me(s),s in t?Object.defineProperty(t,s,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[s]=r,t}function Me(t){var s=at(t,"string");return G(s)=="symbol"?s:s+""}function at(t,s){if(G(t)!="object"||!t)return t;var r=t[Symbol.toPrimitive];if(r!==void 0){var a=r.call(t,s);if(G(a)!="object")return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}var $=(function(t){function s(){var r;Qe(this,s);for(var a=arguments.length,n=new Array(a),c=0;c<a;c++)n[c]=arguments[c];return r=Je(this,s,[].concat(n)),D(r,"state",{isAnimationFinished:!0}),D(r,"id",$e("recharts-area-")),D(r,"handleAnimationEnd",function(){var x=r.props.onAnimationEnd;r.setState({isAnimationFinished:!0}),ae(x)&&x()}),D(r,"handleAnimationStart",function(){var x=r.props.onAnimationStart;r.setState({isAnimationFinished:!1}),ae(x)&&x()}),r}return st(s,t),Ze(s,[{key:"renderDots",value:function(a,n,c){var x=this.props.isAnimationActive,d=this.state.isAnimationFinished;if(x&&!d)return null;var o=this.props,p=o.dot,i=o.points,l=o.dataKey,f=U(this.props,!1),j=U(p,!0),N=i.map(function(h,u){var v=R(R(R({key:"dot-".concat(u),r:3},f),j),{},{index:u,cx:h.x,cy:h.y,dataKey:l,value:h.value,payload:h.payload,points:i});return s.renderDotItem(p,v)}),m={clipPath:a?"url(#clipPath-".concat(n?"":"dots-").concat(c,")"):null};return w.createElement(q,_({className:"recharts-area-dots"},m),N)}},{key:"renderHorizontalRect",value:function(a){var n=this.props,c=n.baseLine,x=n.points,d=n.strokeWidth,o=x[0].x,p=x[x.length-1].x,i=a*Math.abs(o-p),l=Q(x.map(function(f){return f.y||0}));return X(c)&&typeof c=="number"?l=Math.max(c,l):c&&Array.isArray(c)&&c.length&&(l=Math.max(Q(c.map(function(f){return f.y||0})),l)),X(l)?w.createElement("rect",{x:o<p?o:o-i,y:0,width:i,height:Math.floor(l+(d?parseInt("".concat(d),10):1))}):null}},{key:"renderVerticalRect",value:function(a){var n=this.props,c=n.baseLine,x=n.points,d=n.strokeWidth,o=x[0].y,p=x[x.length-1].y,i=a*Math.abs(o-p),l=Q(x.map(function(f){return f.x||0}));return X(c)&&typeof c=="number"?l=Math.max(c,l):c&&Array.isArray(c)&&c.length&&(l=Math.max(Q(c.map(function(f){return f.x||0})),l)),X(l)?w.createElement("rect",{x:0,y:o<p?o:o-i,width:l+(d?parseInt("".concat(d),10):1),height:Math.floor(i)}):null}},{key:"renderClipRect",value:function(a){var n=this.props.layout;return n==="vertical"?this.renderVerticalRect(a):this.renderHorizontalRect(a)}},{key:"renderAreaStatically",value:function(a,n,c,x){var d=this.props,o=d.layout,p=d.type,i=d.stroke,l=d.connectNulls,f=d.isRange;d.ref;var j=Te(d,Ye);return w.createElement(q,{clipPath:c?"url(#clipPath-".concat(x,")"):null},w.createElement(ee,_({},U(j,!0),{points:a,connectNulls:l,type:p,baseLine:n,layout:o,stroke:"none",className:"recharts-area-area"})),i!=="none"&&w.createElement(ee,_({},U(this.props,!1),{className:"recharts-area-curve",layout:o,type:p,connectNulls:l,fill:"none",points:a})),i!=="none"&&f&&w.createElement(ee,_({},U(this.props,!1),{className:"recharts-area-curve",layout:o,type:p,connectNulls:l,fill:"none",points:n})))}},{key:"renderAreaWithAnimation",value:function(a,n){var c=this,x=this.props,d=x.points,o=x.baseLine,p=x.isAnimationActive,i=x.animationBegin,l=x.animationDuration,f=x.animationEasing,j=x.animationId,N=this.state,m=N.prevPoints,h=N.prevBaseLine;return w.createElement(Ie,{begin:i,duration:l,isActive:p,easing:f,from:{t:0},to:{t:1},key:"area-".concat(j),onAnimationEnd:this.handleAnimationEnd,onAnimationStart:this.handleAnimationStart},function(u){var v=u.t;if(m){var g=m.length/d.length,b=d.map(function(M,E){var P=Math.floor(E*g);if(m[P]){var L=m[P],V=W(L.x,M.x),Y=W(L.y,M.y);return R(R({},M),{},{x:V(v),y:Y(v)})}return M}),y;if(X(o)&&typeof o=="number"){var k=W(h,o);y=k(v)}else if(xe(o)||Ee(o)){var A=W(h,0);y=A(v)}else y=o.map(function(M,E){var P=Math.floor(E*g);if(h[P]){var L=h[P],V=W(L.x,M.x),Y=W(L.y,M.y);return R(R({},M),{},{x:V(v),y:Y(v)})}return M});return c.renderAreaStatically(b,y,a,n)}return w.createElement(q,null,w.createElement("defs",null,w.createElement("clipPath",{id:"animationClipPath-".concat(n)},c.renderClipRect(v))),w.createElement(q,{clipPath:"url(#animationClipPath-".concat(n,")")},c.renderAreaStatically(d,o,a,n)))})}},{key:"renderArea",value:function(a,n){var c=this.props,x=c.points,d=c.baseLine,o=c.isAnimationActive,p=this.state,i=p.prevPoints,l=p.prevBaseLine,f=p.totalLength;return o&&x&&x.length&&(!i&&f>0||!me(i,x)||!me(l,d))?this.renderAreaWithAnimation(a,n):this.renderAreaStatically(x,d,a,n)}},{key:"render",value:function(){var a,n=this.props,c=n.hide,x=n.dot,d=n.points,o=n.className,p=n.top,i=n.left,l=n.xAxis,f=n.yAxis,j=n.width,N=n.height,m=n.isAnimationActive,h=n.id;if(c||!d||!d.length)return null;var u=this.state.isAnimationFinished,v=d.length===1,g=je("recharts-area",o),b=l&&l.allowDataOverflow,y=f&&f.allowDataOverflow,k=b||y,A=xe(h)?this.id:h,M=(a=U(x,!1))!==null&&a!==void 0?a:{r:3,strokeWidth:2},E=M.r,P=E===void 0?3:E,L=M.strokeWidth,V=L===void 0?2:L,Y=Le(x)?x:{},oe=Y.clipDot,ce=oe===void 0?!0:oe,K=P*2+V;return w.createElement(q,{className:g},b||y?w.createElement("defs",null,w.createElement("clipPath",{id:"clipPath-".concat(A)},w.createElement("rect",{x:b?i:i-j/2,y:y?p:p-N/2,width:b?j:j*2,height:y?N:N*2})),!ce&&w.createElement("clipPath",{id:"clipPath-dots-".concat(A)},w.createElement("rect",{x:i-K/2,y:p-K/2,width:j+K,height:N+K}))):null,v?null:this.renderArea(k,A),(x||v)&&this.renderDots(k,ce,A),(!m||u)&&Re.renderCallByParent(this.props,d))}}],[{key:"getDerivedStateFromProps",value:function(a,n){return a.animationId!==n.prevAnimationId?{prevAnimationId:a.animationId,curPoints:a.points,curBaseLine:a.baseLine,prevPoints:n.curPoints,prevBaseLine:n.curBaseLine}:a.points!==n.curPoints||a.baseLine!==n.curBaseLine?{curPoints:a.points,curBaseLine:a.baseLine}:null}}])})(S.PureComponent);we=$;D($,"displayName","Area");D($,"defaultProps",{stroke:"#3182bd",fill:"#3182bd",fillOpacity:.6,xAxisId:0,yAxisId:0,legendType:"line",connectNulls:!1,points:[],dot:!1,activeDot:!0,hide:!1,isAnimationActive:!_e.isSsr,animationBegin:0,animationDuration:1500,animationEasing:"ease"});D($,"getBaseValue",function(t,s,r,a){var n=t.layout,c=t.baseValue,x=s.props.baseValue,d=x??c;if(X(d)&&typeof d=="number")return d;var o=n==="horizontal"?a:r,p=o.scale.domain();if(o.type==="number"){var i=Math.max(p[0],p[1]),l=Math.min(p[0],p[1]);return d==="dataMin"?l:d==="dataMax"||i<0?i:Math.max(Math.min(p[0],p[1]),0)}return d==="dataMin"?p[0]:d==="dataMax"?p[1]:p[0]});D($,"getComposedData",function(t){var s=t.props,r=t.item,a=t.xAxis,n=t.yAxis,c=t.xAxisTicks,x=t.yAxisTicks,d=t.bandSize,o=t.dataKey,p=t.stackedData,i=t.dataStartIndex,l=t.displayedData,f=t.offset,j=s.layout,N=p&&p.length,m=we.getBaseValue(s,r,a,n),h=j==="horizontal",u=!1,v=l.map(function(b,y){var k;N?k=p[i+y]:(k=ue(b,o),Array.isArray(k)?u=!0:k=[m,k]);var A=k[1]==null||N&&ue(b,o)==null;return h?{x:pe({axis:a,ticks:c,bandSize:d,entry:b,index:y}),y:A?null:n.scale(k[1]),value:k,payload:b}:{x:A?null:a.scale(k[1]),y:pe({axis:n,ticks:x,bandSize:d,entry:b,index:y}),value:k,payload:b}}),g;return N||u?g=v.map(function(b){var y=Array.isArray(b.value)?b.value[0]:null;return h?{x:b.x,y:y!=null&&b.y!=null?n.scale(y):null}:{x:y!=null?a.scale(y):null,y:b.y}}):g=h?n.scale(m):a.scale(m),R({points:v,baseLine:g,layout:j,isRange:u},f)});D($,"renderDotItem",function(t,s){var r;if(w.isValidElement(t))r=w.cloneElement(t,s);else if(ae(t))r=t(s);else{var a=je("recharts-area-dot",typeof t!="boolean"?t.className:""),n=s.key,c=Te(s,qe);r=w.createElement(Ue,_({},c,{key:n,className:a}))}return r});var nt=We({chartName:"AreaChart",GraphicalChild:$,axisComponents:[{axisType:"xAxis",AxisComp:Be},{axisType:"yAxis",AxisComp:Ne}],formatAxisMap:Fe});const rt=Pe({method:"GET"}).handler(Se("ff8a3161afdfa175e9c519e4146a56ab5bce6e80745e99cfc2191ebbb7a859bb"));function it(t,s){return Oe({queryKey:["session","detail",t],queryFn:()=>rt({data:{sessionId:t,projectPath:s}}),staleTime:3e4})}function lt(t,s,r,a){const n=[];for(const m of t)if(m.timestamp){const h=new Date(m.timestamp).getTime();isNaN(h)||n.push(h)}for(const m of s)if(m.timestamp){const h=new Date(m.timestamp).getTime();isNaN(h)||n.push(h)}for(const m of r)if(m.timestamp){const h=new Date(m.timestamp).getTime();isNaN(h)||n.push(h)}if(n.length===0)return{startMs:0,endMs:0,durationMs:0,mainLane:[],agentLanes:[],skillMarkers:[],errorMarkers:[]};const c=Math.min(...n),x=Math.max(...n),d=Math.max(x-c,1);function o(m){return(m-c)/d}const p=new Set(s.map(m=>m.toolUseId)),i=new Set(r.map(m=>m.toolUseId)),l=[];for(const m of t){if(m.type!=="assistant"||m.toolCalls.length===0)continue;const h=new Date(m.timestamp).getTime();if(!isNaN(h))for(const u of m.toolCalls)p.has(u.toolUseId)||i.has(u.toolUseId)||l.push({timestampMs:h,toolName:u.toolName,toolUseId:u.toolUseId,relativeX:o(h)})}const f=s.map(m=>{const h=new Date(m.timestamp).getTime(),u=m.durationMs?h+m.durationMs:h+d*.02,v=[];if(m.toolCalls){const g=Object.entries(m.toolCalls).sort(([,k],[,A])=>A-k),b=g.reduce((k,[,A])=>k+A,0);let y=0;for(const[k,A]of g)for(let M=0;M<A;M++){const E=b>1?y/(b-1):.5,P=h+(u-h)*E;v.push({toolName:k,count:1,relativeX:o(P)}),y++}}return{subagentType:m.subagentType,description:m.description,startMs:h,endMs:u,startX:o(h),endX:o(u),durationMs:m.durationMs??null,totalTokens:m.totalTokens??null,totalToolUseCount:m.totalToolUseCount??null,toolDots:v}}),j=r.map(m=>{const h=new Date(m.timestamp).getTime();return isNaN(h)?null:{skill:m.skill,args:m.args,timestampMs:h,relativeX:o(h)}}).filter(m=>m!==null),N=a.map(m=>{const h=new Date(m.timestamp).getTime();return isNaN(h)?null:{message:m.message,type:m.type,timestampMs:h,relativeX:o(h)}}).filter(m=>m!==null);return{startMs:c,endMs:x,durationMs:d,mainLane:l,agentLanes:f,skillMarkers:j,errorMarkers:N}}function ie(t){const s=t.match(/^mcp__[^_]+_[^_]+_[^_]+__(.+)$/);return s?s[1]:t}const ot={Read:"#60a5fa",Grep:"#60a5fa",Glob:"#60a5fa",Write:"#34d399",Edit:"#34d399",NotebookEdit:"#34d399",Bash:"#fbbf24",Task:"#818cf8",TaskCreate:"#c084fc",TaskUpdate:"#c084fc",TaskList:"#c084fc",TaskGet:"#c084fc",Skill:"#fcd34d",WebSearch:"#22d3ee",WebFetch:"#22d3ee",EnterPlanMode:"#f472b6",ExitPlanMode:"#f472b6",AskUserQuestion:"#a78bfa"},ct="#9ca3af";function le(t){return ot[t]??ct}const O=90,z=16,B=24,T=32,te=8,Ce=4;function dt(t,s,r){const a=s-t;if(a<=0)return[];const n=Math.max(3,Math.round(r/120)),c=a/n,x=[5e3,1e4,15e3,3e4,6e4,2*6e4,5*6e4,10*6e4,15*6e4,30*6e4,60*6e4,120*6e4],d=x.find(f=>f>=c)??x[x.length-1],p=a<5*6e4?"HH:mm:ss":"HH:mm",i=Math.ceil(t/d)*d,l=[];for(let f=i;f<=s;f+=d){const j=(f-t)/a;l.push({ms:f,label:I(new Date(f),p),x:O+j*(r-O-z)})}return l}function xt({data:t,width:s,onHover:r}){const a=S.useRef(null),n=s,c=n-O-z,x=t.skillMarkers.length>0,d=t.errorMarkers.length>0;let o=B;const p=o;o+=T;const i=[];for(let u=0;u<t.agentLanes.length;u++)o+=te,i.push(o),o+=T;let l=0;x&&(o+=te,l=o,o+=T);let f=0;d&&(o+=te,f=o,o+=T);const j=Math.max(o+8,80);function N(u){return O+u*c}const m=S.useCallback(u=>{if(!a.current)return{x:0,y:0};const v=a.current.getBoundingClientRect();return{x:u.clientX-v.left,y:u.clientY-v.top}},[]),h=dt(t.startMs,t.endMs,n);return e.jsxs("svg",{ref:a,width:n,height:j,className:"select-none",role:"img","aria-label":"Session timeline showing tool calls, agent runs, and skill invocations",onMouseLeave:()=>r(null,{x:0,y:0}),children:[e.jsx("line",{x1:O,y1:B-4,x2:n-z,y2:B-4,stroke:"#374151",strokeWidth:1}),h.map(u=>e.jsxs("g",{children:[e.jsx("line",{x1:u.x,y1:B-8,x2:u.x,y2:B-4,stroke:"#4b5563",strokeWidth:1}),e.jsx("text",{x:u.x,y:B-12,textAnchor:"middle",className:"fill-gray-500 text-[10px]",children:u.label})]},u.ms)),e.jsx("text",{x:4,y:p+T/2+4,className:"fill-gray-500 text-[11px] font-medium",children:"Main"}),e.jsx("line",{x1:O,y1:p+T/2,x2:n-z,y2:p+T/2,stroke:"#1f2937",strokeWidth:1,strokeDasharray:"2,4"}),t.mainLane.map(u=>e.jsx("circle",{cx:N(u.relativeX),cy:p+T/2,r:Ce,fill:le(u.toolName),opacity:.85,className:"cursor-pointer transition-transform hover:opacity-100",onMouseEnter:v=>r({kind:"tool",toolName:u.toolName,timestamp:new Date(u.timestampMs).toISOString(),toolUseId:u.toolUseId},m(v)),onMouseLeave:()=>r(null,{x:0,y:0}),children:e.jsx("title",{children:u.toolName})},u.toolUseId)),t.agentLanes.map((u,v)=>e.jsx(mt,{lane:u,y:i[v],toX:N,laneHeight:T,leftMargin:O,onHover:r,getPosition:m},`${u.subagentType}-${v}`)),x&&e.jsxs(e.Fragment,{children:[e.jsx("text",{x:4,y:l+T/2+4,className:"fill-amber-400/70 text-[11px] font-medium",children:"Skills"}),e.jsx("line",{x1:O,y1:l+T/2,x2:n-z,y2:l+T/2,stroke:"#1f2937",strokeWidth:1,strokeDasharray:"2,4"}),t.skillMarkers.map((u,v)=>{const g=N(u.relativeX),b=l+T/2,y=5;return e.jsx("polygon",{points:`${g},${b-y} ${g+y},${b} ${g},${b+y} ${g-y},${b}`,fill:"#fbbf24",opacity:.85,className:"cursor-pointer hover:opacity-100",onMouseEnter:k=>r({kind:"skill",skill:u.skill,args:u.args,timestamp:new Date(u.timestampMs).toISOString()},m(k)),onMouseLeave:()=>r(null,{x:0,y:0}),children:e.jsxs("title",{children:["/",u.skill]})},`${u.skill}-${v}`)})]}),d&&e.jsxs(e.Fragment,{children:[e.jsx("text",{x:4,y:f+T/2+4,className:"fill-red-400/70 text-[11px] font-medium",children:"Errors"}),e.jsx("line",{x1:O,y1:f+T/2,x2:n-z,y2:f+T/2,stroke:"#1f2937",strokeWidth:1,strokeDasharray:"2,4"}),t.errorMarkers.map((u,v)=>{const g=N(u.relativeX),b=f+T/2,y=5;return e.jsxs("g",{className:"cursor-pointer hover:opacity-100",opacity:.85,onMouseEnter:k=>r({kind:"error",message:u.message,type:u.type,timestamp:new Date(u.timestampMs).toISOString()},m(k)),onMouseLeave:()=>r(null,{x:0,y:0}),children:[e.jsx("line",{x1:g-y,y1:b-y,x2:g+y,y2:b+y,stroke:"#f87171",strokeWidth:2,strokeLinecap:"round"}),e.jsx("line",{x1:g+y,y1:b-y,x2:g-y,y2:b+y,stroke:"#f87171",strokeWidth:2,strokeLinecap:"round"}),e.jsxs("title",{children:[u.type,": ",u.message]})]},`err-${v}`)})]})]})}function mt({lane:t,y:s,toX:r,laneHeight:a,leftMargin:n,onHover:c,getPosition:x}){const d=r(t.startX),o=Math.max(r(t.endX)-d,8),p=s+a/2,i=t.subagentType.length>10?t.subagentType.slice(0,10)+"...":t.subagentType;return e.jsxs("g",{children:[e.jsx("text",{x:4,y:p+4,className:"fill-indigo-400/70 text-[11px] font-medium",children:i}),e.jsx("rect",{x:d,y:s+2,width:o,height:a-4,rx:6,fill:"rgba(99, 102, 241, 0.08)",stroke:"rgba(99, 102, 241, 0.2)",strokeWidth:1,className:"cursor-pointer hover:fill-indigo-500/15",onMouseEnter:l=>c({kind:"agent",agent:t},x(l)),onMouseLeave:()=>c(null,{x:0,y:0}),children:e.jsxs("title",{children:[t.subagentType,": ",t.description]})}),e.jsx("line",{x1:d+4,y1:p,x2:d+o-4,y2:p,stroke:"rgba(99, 102, 241, 0.15)",strokeWidth:1}),t.toolDots.map((l,f)=>e.jsx("circle",{cx:r(l.relativeX),cy:p,r:Ce-.5,fill:le(l.toolName),opacity:.75,className:"cursor-pointer hover:opacity-100",onMouseEnter:j=>c({kind:"tool",toolName:l.toolName,timestamp:new Date(t.startMs+(l.relativeX-t.startX)/(t.endX-t.startX)*(t.endMs-t.startMs)).toISOString(),toolUseId:`${t.subagentType}-${l.toolName}-${f}`},x(j)),onMouseLeave:()=>c(null,{x:0,y:0}),children:e.jsxs("title",{children:[l.toolName," (",t.subagentType,")"]})},`${l.toolName}-${f}`))]})}function ut({item:t,position:s}){return e.jsxs("div",{className:"pointer-events-none absolute z-50 rounded-lg border border-gray-700 bg-gray-900 px-3 py-2 text-xs shadow-xl",style:{left:s.x,top:s.y,transform:"translate(-50%, -100%) translateY(-8px)"},children:[t.kind==="tool"&&e.jsxs("div",{children:[e.jsx("div",{className:"font-semibold text-gray-100",children:ie(t.toolName)}),e.jsx("div",{className:"text-gray-400",children:I(new Date(t.timestamp),"HH:mm:ss")}),e.jsxs("div",{className:"font-mono text-[10px] text-gray-600",children:[t.toolUseId.slice(0,16),"..."]})]}),t.kind==="agent"&&e.jsxs("div",{children:[e.jsx("div",{className:"font-semibold text-indigo-300",children:t.agent.subagentType}),e.jsx("div",{className:"max-w-48 truncate text-gray-400",children:t.agent.description}),e.jsx("div",{className:"mt-1 flex items-center gap-2 text-gray-500",children:t.agent.durationMs!=null&&e.jsxs("span",{children:[I(new Date(t.agent.startMs),"HH:mm")," -"," ",I(new Date(t.agent.endMs),"HH:mm")," (",re(t.agent.durationMs),")"]})}),e.jsxs("div",{className:"flex items-center gap-2 text-gray-500",children:[t.agent.totalTokens!=null&&e.jsxs("span",{children:[C(t.agent.totalTokens)," tokens"]}),t.agent.totalToolUseCount!=null&&e.jsxs("span",{children:[t.agent.totalToolUseCount," tools"]})]})]}),t.kind==="skill"&&e.jsxs("div",{children:[e.jsxs("div",{className:"font-semibold text-amber-300",children:["/",t.skill]}),t.args&&e.jsx("div",{className:"text-gray-400",children:t.args}),e.jsx("div",{className:"text-gray-500",children:I(new Date(t.timestamp),"HH:mm:ss")})]}),t.kind==="error"&&e.jsxs("div",{children:[e.jsx("div",{className:"font-semibold text-red-400",children:t.type}),e.jsx("div",{className:"max-w-48 truncate text-gray-400",children:t.message}),e.jsx("div",{className:"text-gray-500",children:I(new Date(t.timestamp),"HH:mm:ss")})]})]})}function pt({toolNames:t}){const s=[...new Set(t)].slice(0,12);return s.length===0?null:e.jsxs("div",{className:"flex flex-wrap items-center gap-x-3 gap-y-1 px-1 text-[10px] text-gray-500",children:[s.map(r=>e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"inline-block h-2 w-2 rounded-full",style:{backgroundColor:le(r)}}),e.jsx("span",{children:ie(r)})]},r)),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"inline-block h-2 w-2 rotate-45 bg-amber-400"}),e.jsx("span",{children:"Skill"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"text-red-400 font-bold leading-none",children:"×"}),e.jsx("span",{children:"Error"})]})]})}function ht({turns:t,agents:s,skills:r,errors:a}){const n=S.useRef(null),[c,x]=S.useState(0),[d,o]=S.useState(1),[p,i]=S.useState(null);S.useEffect(()=>{if(!n.current)return;const g=new ResizeObserver(b=>{const y=b[0];y&&x(y.contentRect.width)});return g.observe(n.current),()=>g.disconnect()},[]);const l=S.useMemo(()=>lt(t,s,r,a),[t,s,r,a]),f=S.useMemo(()=>{const g=l.mainLane.map(y=>y.toolName);for(const y of l.agentLanes)for(const k of y.toolDots)g.push(k.toolName);const b={};for(const y of g)b[y]=(b[y]??0)+1;return Object.entries(b).sort(([,y],[,k])=>k-y).map(([y])=>y)},[l]),j=(g,b)=>{i(g?{item:g,position:b}:null)};if(t.length===0)return e.jsx("div",{className:"py-8 text-center text-sm text-gray-500",children:"No timeline data available"});const N=new Set(s.map(g=>g.toolUseId)),m=new Set(r.map(g=>g.toolUseId));let h=0,u=0,v=0;for(const g of t)if(g.type==="user"&&g.message?.trim()&&h++,g.type==="assistant"){u++;for(const b of g.toolCalls)!N.has(b.toolUseId)&&!m.has(b.toolUseId)&&v++}return e.jsxs("div",{className:"rounded-xl border border-gray-800 bg-gray-900/50 p-4",children:[e.jsxs("div",{className:"mb-3 flex flex-wrap items-center gap-4",children:[e.jsx(F,{label:"User commands",value:h,color:"blue"}),e.jsx(F,{label:"AI responses",value:u,color:"purple"}),v>0&&e.jsx(F,{label:"Tool calls",value:v,color:"gray"}),s.length>0&&e.jsx(F,{label:"Agents",value:s.length,color:"indigo"}),r.length>0&&e.jsx(F,{label:"Skills",value:r.length,color:"amber"}),a.length>0&&e.jsx(F,{label:"Errors",value:a.length,color:"red"})]}),e.jsxs("div",{className:"mb-3 flex items-start justify-between gap-2",children:[e.jsx("div",{className:"flex-1",children:f.length>0&&e.jsx(pt,{toolNames:f})}),e.jsxs("div",{className:"flex shrink-0 items-center gap-1",children:[e.jsx("button",{type:"button",onClick:()=>o(g=>Math.max(1,g-.5)),disabled:d<=1,className:"rounded bg-gray-800 px-2 py-0.5 text-xs text-gray-300 transition-colors hover:bg-gray-700 disabled:opacity-30",title:"Zoom out",children:"−"}),e.jsx("span",{className:"min-w-[3rem] text-center text-[10px] tabular-nums text-gray-500",children:d===1?"Fit":`${d.toFixed(1)}x`}),e.jsx("button",{type:"button",onClick:()=>o(g=>Math.min(8,g+.5)),disabled:d>=8,className:"rounded bg-gray-800 px-2 py-0.5 text-xs text-gray-300 transition-colors hover:bg-gray-700 disabled:opacity-30",title:"Zoom in",children:"+"}),d>1&&e.jsx("button",{type:"button",onClick:()=>o(1),className:"ml-1 rounded bg-gray-800 px-2 py-0.5 text-[10px] text-gray-400 transition-colors hover:bg-gray-700",title:"Reset zoom",children:"Reset"})]})]}),e.jsx("div",{ref:n,className:"relative overflow-x-auto",children:c>0&&e.jsxs(e.Fragment,{children:[e.jsx(xt,{data:l,width:Math.max(c*d,400),onHover:j}),p&&e.jsx(ut,{item:p.item,position:p.position})]})})]})}function F({label:t,value:s,color:r}){const a={blue:"bg-blue-500/15 text-blue-400",purple:"bg-purple-500/15 text-purple-400",gray:"bg-gray-800 text-gray-300",indigo:"bg-indigo-500/15 text-indigo-400",amber:"bg-amber-500/15 text-amber-400",red:"bg-red-500/15 text-red-400"};return e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:`rounded-md px-2 py-1 text-sm font-bold tabular-nums ${a[r]}`,children:s}),e.jsx("span",{className:"text-[11px] text-gray-500",children:t})]})}function ft({contextWindow:t,tokens:s}){const[r,a]=S.useState(!1);if(!t)return e.jsx(yt,{tokens:s});const{contextLimit:n,modelName:c,systemOverhead:x,currentContextSize:d,messagesEstimate:o,freeSpace:p,autocompactBuffer:i,usagePercent:l,snapshots:f}=t,j=x/n*100,N=o/n*100,m=i/n*100,h=Math.max(0,100-j-N),u=c.replace(/^claude-/,"").split("-202")[0],v=f.map(g=>({turn:g.turnIndex,context:g.contextSize}));return e.jsxs("div",{className:"rounded-xl border border-gray-800 bg-gray-900/50 p-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("h3",{className:"text-sm font-semibold text-gray-300",children:"Context Window"}),e.jsx("span",{className:"rounded bg-gray-800 px-1.5 py-0.5 text-[10px] font-mono text-gray-400",children:u})]}),e.jsxs("div",{className:"mt-1 flex items-baseline gap-1",children:[e.jsx("span",{className:"text-2xl font-bold text-white",children:C(d)}),e.jsxs("span",{className:"text-sm text-gray-500",children:["/ ",C(n)]}),e.jsxs("span",{className:"text-sm text-gray-400",children:["(",l,"%)"]})]}),e.jsx("p",{className:"text-[10px] text-gray-500",children:"~estimated from token usage"}),e.jsxs("div",{className:"mt-3 flex h-3 overflow-hidden rounded-full bg-gray-800",children:[e.jsx("div",{className:"bg-purple-500",style:{width:`${j}%`},title:`System: ~${C(x)}`}),e.jsx("div",{className:"bg-blue-500",style:{width:`${N}%`},title:`Messages: ~${C(o)}`}),h>0&&e.jsx(e.Fragment,{children:h>m?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"bg-gray-700",style:{width:`${h-m}%`}}),e.jsx("div",{className:"autocompact-stripe",style:{width:`${Math.min(m,h)}%`}})]}):e.jsx("div",{className:"autocompact-stripe",style:{width:`${h}%`}})})]}),e.jsxs("div",{className:"mt-1 flex gap-3 text-[10px] text-gray-500",children:[e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"inline-block h-2 w-2 rounded-sm bg-purple-500"}),"system"]}),e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"inline-block h-2 w-2 rounded-sm bg-blue-500"}),"messages"]}),e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"inline-block h-2 w-2 rounded-sm bg-gray-700"}),"free"]})]}),e.jsxs("div",{className:"mt-3 space-y-1.5",children:[e.jsx(Z,{label:"System overhead",value:x,total:n,color:"bg-purple-500",prefix:"~"}),e.jsx(Z,{label:"Messages",value:o,total:n,color:"bg-blue-500",prefix:"~"}),e.jsx(Z,{label:"Autocompact buffer",value:i,total:n,color:"bg-amber-500"}),e.jsx(Z,{label:"Free space",value:p,total:n,color:"bg-gray-600"})]}),v.length>1&&e.jsxs("div",{className:"mt-3",children:[e.jsx("p",{className:"mb-1 text-[10px] text-gray-500",children:"Context growth"}),e.jsx(Xe,{width:"100%",height:96,children:e.jsxs(nt,{data:v,children:[e.jsx("defs",{children:e.jsxs("linearGradient",{id:"contextGrad",x1:"0",y1:"0",x2:"0",y2:"1",children:[e.jsx("stop",{offset:"0%",stopColor:"#3b82f6",stopOpacity:.3}),e.jsx("stop",{offset:"100%",stopColor:"#3b82f6",stopOpacity:.05})]})}),e.jsx(Ne,{domain:[0,n],hide:!0}),e.jsx(ze,{contentStyle:{background:"#1f2937",border:"1px solid #374151",borderRadius:"8px",fontSize:"11px"},labelFormatter:g=>`Turn ${g}`,formatter:g=>[C(g),"Context"]}),e.jsx(he,{y:n,stroke:"#ef4444",strokeDasharray:"4 4",strokeOpacity:.5}),e.jsx(he,{y:n-i,stroke:"#f59e0b",strokeDasharray:"2 4",strokeOpacity:.3}),e.jsx($,{type:"stepAfter",dataKey:"context",stroke:"#3b82f6",fill:"url(#contextGrad)",strokeWidth:1.5,dot:!1})]})})]}),e.jsxs("button",{onClick:()=>a(!r),className:"mt-3 flex w-full items-center gap-1 text-xs text-gray-400 hover:text-gray-300 transition-colors",children:[e.jsx("span",{className:"text-[10px]",children:r?"▾":"▸"}),"Token Details"]}),r&&e.jsx(gt,{tokens:s}),e.jsx("style",{children:`
|
|
2
|
-
.autocompact-stripe {
|
|
3
|
-
background: repeating-linear-gradient(
|
|
4
|
-
-45deg,
|
|
5
|
-
#78716c,
|
|
6
|
-
#78716c 2px,
|
|
7
|
-
#f59e0b 2px,
|
|
8
|
-
#f59e0b 4px
|
|
9
|
-
);
|
|
10
|
-
opacity: 0.4;
|
|
11
|
-
}
|
|
12
|
-
`})]})}function Z({label:t,value:s,total:r,color:a,prefix:n=""}){const c=Math.max(0,Math.min(100,s/r*100));return e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"w-32 text-xs text-gray-400 shrink-0",children:t}),e.jsxs("span",{className:"w-16 text-right text-xs font-mono text-gray-300 shrink-0",children:[n,C(s)]}),e.jsx("div",{className:"flex-1 h-1.5 rounded-full bg-gray-800 overflow-hidden",children:e.jsx("div",{className:`h-full rounded-full ${a}`,style:{width:`${c}%`,opacity:.7}})})]})}function gt({tokens:t}){const s=t.inputTokens+t.outputTokens+t.cacheReadInputTokens+t.cacheCreationInputTokens,r=[{label:"Input",value:t.inputTokens,color:"bg-blue-400"},{label:"Output",value:t.outputTokens,color:"bg-emerald-400"},{label:"Cache Read",value:t.cacheReadInputTokens,color:"bg-amber-400"},{label:"Cache Create",value:t.cacheCreationInputTokens,color:"bg-purple-400"}];return e.jsxs("div",{className:"mt-2 space-y-1.5",children:[r.map(a=>e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-xs text-gray-400",children:a.label}),e.jsx("span",{className:"text-xs font-mono text-gray-300",children:C(a.value)})]},a.label)),s>0&&e.jsx("div",{className:"flex h-2 overflow-hidden rounded-full bg-gray-800",children:r.filter(a=>a.value>0).map(a=>e.jsx("div",{className:`${a.color} opacity-60`,style:{width:`${a.value/s*100}%`}},a.label))})]})}function yt({tokens:t}){const s=t.inputTokens+t.outputTokens,r=s+t.cacheReadInputTokens+t.cacheCreationInputTokens,a=[{label:"Input",value:t.inputTokens,color:"text-blue-400"},{label:"Output",value:t.outputTokens,color:"text-emerald-400"},{label:"Cache Read",value:t.cacheReadInputTokens,color:"text-amber-400"},{label:"Cache Create",value:t.cacheCreationInputTokens,color:"text-purple-400"}];return e.jsxs("div",{className:"rounded-xl border border-gray-800 bg-gray-900/50 p-4",children:[e.jsx("h3",{className:"text-sm font-semibold text-gray-300",children:"Token Usage"}),e.jsx("p",{className:"mt-1 text-2xl font-bold text-white",children:C(s)}),e.jsxs("p",{className:"text-[10px] text-gray-500",children:["input + output (",C(r)," incl. cache)"]}),e.jsx("div",{className:"mt-3 space-y-2",children:a.map(n=>e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-xs text-gray-400",children:n.label}),e.jsx("span",{className:`text-xs font-mono ${n.color}`,children:C(n.value)})]},n.label))}),r>0&&e.jsx("div",{className:"mt-3 flex h-2 overflow-hidden rounded-full bg-gray-800",children:a.filter(n=>n.value>0).map(n=>e.jsx("div",{className:`${n.color.replace("text-","bg-")} opacity-60`,style:{width:`${n.value/r*100}%`}},n.label))})]})}function bt({toolFrequency:t}){const s=Object.entries(t).sort(([,a],[,n])=>n-a),r=s[0]?.[1]??1;return s.length===0?e.jsxs("div",{className:"rounded-xl border border-gray-800 bg-gray-900/50 p-4",children:[e.jsx("h3",{className:"text-sm font-semibold text-gray-300",children:"Tool Usage"}),e.jsx("p",{className:"mt-2 text-xs text-gray-500",children:"No tools used"})]}):e.jsxs("div",{className:"rounded-xl border border-gray-800 bg-gray-900/50 p-4",children:[e.jsx("h3",{className:"text-sm font-semibold text-gray-300",children:"Tool Usage"}),e.jsxs("p",{className:"mt-1 text-xs text-gray-500",children:[s.length," tools, ",s.reduce((a,[,n])=>a+n,0)," calls"]}),e.jsx("div",{className:"mt-3 space-y-1.5",children:s.slice(0,15).map(([a,n])=>e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"w-32 shrink-0 truncate text-xs font-mono text-gray-400",title:a,children:ie(a)}),e.jsx("div",{className:"flex-1",children:e.jsx("div",{className:"h-4 rounded bg-blue-500/20",style:{width:`${n/r*100}%`},children:e.jsx("span",{className:"px-1.5 text-xs text-blue-300",children:n})})})]},a))})]})}function vt({errors:t}){return t.length===0?null:e.jsxs("div",{className:"rounded-xl border border-red-900/50 bg-red-950/20 p-4",children:[e.jsxs("h3",{className:"text-sm font-semibold text-red-400",children:["Errors (",t.length,")"]}),e.jsx("div",{className:"mt-3 space-y-2",children:t.map((s,r)=>e.jsxs("div",{className:"rounded-lg bg-red-950/30 p-2.5",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-xs font-mono text-red-300",children:s.type}),s.timestamp&&e.jsx("span",{className:"text-xs text-gray-500",children:ve(s.timestamp)})]}),e.jsx("p",{className:"mt-1 text-xs text-red-200/80",children:s.message})]},r))})]})}function jt({agents:t,skills:s}){const{data:r}=be(Ve),{agentCosts:a,totalAgentCost:n}=S.useMemo(()=>{if(!r)return{agentCosts:new Map,totalAgentCost:0};const i=He(r),l=new Map;let f=0;for(let j=0;j<t.length;j++){const N=t[j];if(!N.tokens)continue;const h={[N.model??"claude-sonnet-4"]:N.tokens},u=Ge(h,i);l.set(j,u.totalUSD),f+=u.totalUSD}return{agentCosts:l,totalAgentCost:f}},[r,t]);if(t.length===0&&s.length===0)return null;const c=new Map;for(const i of t)c.set(i.subagentType,(c.get(i.subagentType)??0)+1);const x=[...c.entries()].sort(([,i],[,l])=>l-i),d=t.reduce((i,l)=>i+(l.totalTokens??ye(l)??0),0),o=new Map;for(const i of s)o.set(i.skill,(o.get(i.skill)??0)+1);const p=[...o.entries()].sort(([,i],[,l])=>l-i);return e.jsxs("div",{className:"rounded-xl border border-gray-800 bg-gray-900/50 p-4",children:[e.jsx("h3",{className:"text-sm font-semibold text-gray-300",children:"Agents & Skills"}),e.jsxs("p",{className:"mt-1 text-xs text-gray-500",children:[t.length," agent dispatch",t.length!==1?"es":"",d>0&&e.jsxs("span",{className:"ml-1 text-indigo-400",children:["(",C(d)," tokens",n>0&&` · ~${H(n)}`,")"]}),s.length>0&&`, ${s.length} skill invocation${s.length!==1?"s":""}`]}),x.length>0&&e.jsxs("div",{className:"mt-3",children:[e.jsx("p",{className:"mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-gray-500",children:"Agent Types"}),e.jsx("div",{className:"flex flex-wrap gap-1.5",children:x.map(([i,l])=>e.jsxs("span",{className:"inline-flex items-center gap-1 rounded-md bg-indigo-500/15 px-2 py-0.5 text-xs text-indigo-300",children:[i,l>1&&e.jsxs("span",{className:"text-indigo-400/60",children:["×",l]})]},i))})]}),p.length>0&&e.jsxs("div",{className:"mt-3",children:[e.jsx("p",{className:"mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-gray-500",children:"Skills"}),e.jsx("div",{className:"flex flex-wrap gap-1.5",children:p.map(([i,l])=>e.jsxs("span",{className:"inline-flex items-center gap-1 rounded-md bg-amber-500/15 px-2 py-0.5 text-xs text-amber-300",children:["/",i,l>1&&e.jsxs("span",{className:"text-amber-400/60",children:["×",l]})]},i))})]}),t.length>0&&e.jsxs("div",{className:"mt-3 space-y-1",children:[e.jsx("p",{className:"mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-gray-500",children:"Agent Dispatches"}),t.map((i,l)=>{const f=i.totalTokens??ye(i),j=a.get(l);return e.jsxs("div",{className:"flex items-start gap-2 rounded bg-gray-950/40 px-2 py-1.5",children:[e.jsx("span",{className:"shrink-0 rounded bg-indigo-500/20 px-1.5 py-0.5 text-[10px] font-semibold text-indigo-300",children:i.subagentType}),i.model&&e.jsx("span",{className:"shrink-0 rounded bg-gray-800 px-1.5 py-0.5 text-[10px] font-mono text-gray-400",children:i.model.replace(/^claude-/,"").replace(/-\d{8}$/,"")}),e.jsx("span",{className:"min-w-0 flex-1 truncate text-xs text-gray-400",children:i.description}),e.jsxs("div",{className:"flex shrink-0 items-center gap-2",children:[f!=null&&f>0&&e.jsx("span",{className:"text-[10px] font-mono text-indigo-400/80",children:C(f)}),j!=null&&j>0&&e.jsxs("span",{className:"text-[10px] font-mono text-emerald-400/80",children:["~",H(j)]}),i.totalToolUseCount!=null&&e.jsxs("span",{className:"text-[10px] text-gray-500",children:[i.totalToolUseCount," tools"]}),i.durationMs!=null&&e.jsx("span",{className:"text-[10px] text-gray-600",children:re(i.durationMs)}),i.timestamp&&e.jsx("span",{className:"text-[10px] text-gray-600",children:I(new Date(i.timestamp),"HH:mm:ss")})]})]},`a-${l}`)})]}),s.length>0&&e.jsxs("div",{className:"mt-3 space-y-1",children:[e.jsx("p",{className:"mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-gray-500",children:"Skill Invocations"}),s.map((i,l)=>e.jsxs("div",{className:"flex items-start gap-2 rounded bg-gray-950/40 px-2 py-1.5",children:[e.jsxs("span",{className:"shrink-0 rounded bg-amber-500/20 px-1.5 py-0.5 text-[10px] font-semibold text-amber-300",children:["/",i.skill]}),i.args&&e.jsx("span",{className:"min-w-0 flex-1 truncate text-xs font-mono text-gray-500",children:i.args}),i.timestamp&&e.jsx("span",{className:"ml-auto shrink-0 text-[10px] text-gray-600",children:I(new Date(i.timestamp),"HH:mm:ss")})]},`s-${l}`))]})]})}function ye(t){if(t.tokens)return t.tokens.inputTokens+t.tokens.outputTokens}const Nt={pending:{label:"Pending",bg:"bg-gray-500/20",text:"text-gray-400"},in_progress:{label:"In Progress",bg:"bg-blue-500/20",text:"text-blue-400"},completed:{label:"Done",bg:"bg-emerald-500/20",text:"text-emerald-400"},deleted:{label:"Deleted",bg:"bg-red-500/20",text:"text-red-400"}};function kt({tasks:t}){if(t.length===0)return null;const s=t.filter(a=>a.status==="completed").length,r=t.filter(a=>a.status!=="deleted").length;return e.jsxs("div",{className:"rounded-xl border border-gray-800 bg-gray-900/50 p-4",children:[e.jsx("h3",{className:"text-sm font-semibold text-gray-300",children:"Tasks"}),e.jsxs("p",{className:"mt-1 text-xs text-gray-500",children:[s,"/",r," completed"]}),e.jsx("div",{className:"mt-3 space-y-1",children:t.map((a,n)=>{const c=Nt[a.status];return e.jsxs("div",{className:"flex items-start gap-2 rounded bg-gray-950/40 px-2 py-1.5",children:[e.jsx("span",{className:`shrink-0 rounded px-1.5 py-0.5 text-[10px] font-semibold ${c.bg} ${c.text}`,children:c.label}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("span",{className:"text-xs text-gray-300",children:a.subject}),a.description&&e.jsx("p",{className:"mt-0.5 truncate text-[10px] text-gray-500",children:a.description})]}),a.taskId&&e.jsxs("span",{className:"shrink-0 text-[10px] font-mono text-gray-600",children:["#",a.taskId]}),a.timestamp&&e.jsx("span",{className:"shrink-0 text-[10px] text-gray-600",children:I(new Date(a.timestamp),"HH:mm:ss")})]},a.taskId||n)})})]})}function wt({tokensByModel:t}){const{cost:s,isLoading:r}=ke(t);return r?e.jsx("div",{className:"rounded-xl border border-gray-800 bg-gray-900/50 p-4",children:e.jsx("div",{className:"h-6 w-32 animate-pulse rounded bg-gray-800"})}):!s||s.totalUSD===0?e.jsxs("div",{className:"rounded-xl border border-gray-800 bg-gray-900/50 p-4",children:[e.jsx("h3",{className:"text-sm font-semibold text-gray-300",children:"Cost Estimation"}),e.jsx("p",{className:"mt-2 text-xs text-gray-500",children:"No token data available"})]}):e.jsxs("div",{className:"rounded-xl border border-gray-800 bg-gray-900/50 p-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("h3",{className:"text-sm font-semibold text-gray-300",children:"Cost Estimation"}),e.jsxs("span",{className:"font-mono text-lg font-bold text-white",children:["~",H(s.totalUSD)]})]}),e.jsxs("div",{className:"mt-4",children:[e.jsx("p",{className:"text-xs font-medium text-gray-400",children:"By Category"}),e.jsx(Tt,{cost:s}),e.jsx(At,{cost:s})]}),e.jsxs("div",{className:"mt-4",children:[e.jsx("p",{className:"text-xs font-medium text-gray-400",children:"By Model"}),e.jsx(Mt,{cost:s})]}),e.jsxs("div",{className:"mt-3 flex items-center justify-between border-t border-gray-800 pt-3",children:[e.jsx("p",{className:"text-[10px] text-gray-600",children:"Estimated based on API pricing. Actual costs may vary."}),e.jsx(se,{to:"/settings",className:"text-[10px] text-gray-500 hover:text-gray-300",children:"Configure pricing"})]})]})}function Tt({cost:t}){const s=[{label:"Input tokens",value:t.byCategory.input,color:"text-blue-400"},{label:"Output tokens",value:t.byCategory.output,color:"text-emerald-400"},{label:"Cache read",value:t.byCategory.cacheRead,color:"text-amber-400"},{label:"Cache write",value:t.byCategory.cacheWrite,color:"text-purple-400"}];return e.jsx("div",{className:"mt-2 space-y-1",children:s.map(r=>e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-xs text-gray-400",children:r.label}),e.jsx("span",{className:`font-mono text-xs ${r.color}`,children:H(r.value)})]},r.label))})}function At({cost:t}){if(t.totalUSD===0)return null;const s=[{key:"input",value:t.byCategory.input,color:"bg-blue-400"},{key:"output",value:t.byCategory.output,color:"bg-emerald-400"},{key:"cacheRead",value:t.byCategory.cacheRead,color:"bg-amber-400"},{key:"cacheWrite",value:t.byCategory.cacheWrite,color:"bg-purple-400"}];return e.jsx("div",{className:"mt-2 flex h-2 overflow-hidden rounded-full bg-gray-800",children:s.map(r=>{const a=r.value/t.totalUSD*100;return a<.5?null:e.jsx("div",{className:`${r.color} opacity-60`,style:{width:`${a}%`}},r.key)})})}function Mt({cost:t}){const s=Object.values(t.byModel).sort((r,a)=>a.totalCost-r.totalCost);return s.length===0?null:e.jsx("div",{className:"mt-2 space-y-1",children:s.map(r=>{const a=t.totalUSD>0?Math.round(r.totalCost/t.totalUSD*100):0;return e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"font-mono text-xs text-gray-300",children:r.displayName}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"font-mono text-xs text-gray-300",children:H(r.totalCost)}),e.jsxs("span",{className:"text-[10px] text-gray-500",children:["(",a,"%)"]}),e.jsxs("span",{className:"text-[10px] text-gray-600",children:[C(r.tokens.inputTokens+r.tokens.outputTokens+r.tokens.cacheReadInputTokens+r.tokens.cacheCreationInputTokens)," ","tok"]})]})]},r.modelId)})})}function Ct({tokensByModel:t}){const{cost:s,isLoading:r}=ke(t);return r||!s||s.totalUSD===0?null:e.jsxs("span",{className:"font-mono text-xs text-emerald-400",title:"Estimated cost based on API pricing",children:["~",H(s.totalUSD)]})}function Et(){const{sessionId:t}=de.useParams(),{project:s=""}=de.useSearch(),{privacyMode:r,anonymizeProjectName:a}=De(),{data:n,isLoading:c,error:x}=be(it(t,s));if(c)return e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{className:"h-8 w-48 animate-pulse rounded bg-gray-800"}),e.jsx("div",{className:"h-64 animate-pulse rounded-xl bg-gray-900/50"})]});if(x||!n)return e.jsxs("div",{className:"py-12 text-center",children:[e.jsxs("p",{className:"text-sm text-red-400",children:["Failed to load session: ",x?.message??"Not found"]}),e.jsx(se,{to:"/sessions",className:"mt-2 inline-block text-sm text-blue-400 hover:underline",children:"Back to sessions"})]});const d=n.turns[0]?.timestamp,o=n.turns[n.turns.length-1]?.timestamp,p=d&&o?new Date(o).getTime()-new Date(d).getTime():0;return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-start justify-between",children:[e.jsxs("div",{children:[e.jsx(se,{to:"/sessions",className:"text-xs text-gray-500 hover:text-gray-300",children:"← Sessions"}),e.jsx("h1",{className:"mt-1 text-xl font-bold text-white",children:r?a(n.projectName):n.projectName}),e.jsxs("div",{className:"mt-1 flex items-center gap-3 text-xs text-gray-400",children:[n.branch&&e.jsx("span",{className:"font-mono",children:n.branch}),d&&e.jsx("span",{children:ve(d)}),e.jsx("span",{children:re(p)}),e.jsxs("span",{children:[n.turns.length," turns"]}),e.jsx(Ct,{tokensByModel:n.tokensByModel})]}),n.models.length>0&&e.jsx("div",{className:"mt-1 flex gap-1",children:n.models.map(i=>e.jsx("span",{className:"rounded bg-gray-800 px-1.5 py-0.5 text-[10px] font-mono text-gray-400",children:i.replace(/^claude-/,"").split("-202")[0]},i))})]}),e.jsx("span",{className:"font-mono text-xs text-gray-600",children:t.slice(0,8)})]}),e.jsxs("div",{className:"mt-6 grid grid-cols-1 gap-4 md:grid-cols-2",children:[e.jsx(ft,{contextWindow:n.contextWindow,tokens:n.totalTokens}),e.jsx(bt,{toolFrequency:n.toolFrequency})]}),e.jsx("div",{className:"mt-4",children:e.jsx(wt,{tokensByModel:n.tokensByModel})}),(n.agents.length>0||n.skills.length>0)&&e.jsx("div",{className:"mt-4",children:e.jsx(jt,{agents:n.agents,skills:n.skills})}),n.tasks.length>0&&e.jsx("div",{className:"mt-4",children:e.jsx(kt,{tasks:n.tasks})}),e.jsx(vt,{errors:n.errors}),e.jsxs("div",{className:"mt-6",children:[e.jsx("h2",{className:"mb-3 text-sm font-semibold text-gray-300",children:"Timeline"}),e.jsx(ht,{turns:n.turns,agents:n.agents,skills:n.skills,errors:n.errors})]})]})}export{Et as component};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-900:oklch(39.6% .141 25.723);--color-red-950:oklch(25.8% .092 26.042);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-cyan-400:oklch(78.9% .154 211.53);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-indigo-300:oklch(78.5% .115 274.713);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-indigo-900:oklch(35.9% .144 278.697);--color-indigo-950:oklch(25.7% .09 281.288);--color-violet-400:oklch(70.2% .183 293.541);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-pink-400:oklch(71.8% .202 349.761);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-gray-950:oklch(13% .028 261.692);--color-white:#fff;--spacing:.25rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wider:.05em;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--animate-ping:ping 1s cubic-bezier(0,0,.2,1)infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.absolute{position:absolute}.relative{position:relative}.static{position:static}.-top-8{top:calc(var(--spacing)*-8)}.bottom-0{bottom:calc(var(--spacing)*0)}.left-1\/2{left:50%}.z-50{z-index:50}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-6{margin-top:calc(var(--spacing)*6)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-1\.5{margin-bottom:calc(var(--spacing)*1.5)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-1\.5{height:calc(var(--spacing)*1.5)}.h-2{height:calc(var(--spacing)*2)}.h-3{height:calc(var(--spacing)*3)}.h-3\.5{height:calc(var(--spacing)*3.5)}.h-4{height:calc(var(--spacing)*4)}.h-6{height:calc(var(--spacing)*6)}.h-8{height:calc(var(--spacing)*8)}.h-14{height:calc(var(--spacing)*14)}.h-28{height:calc(var(--spacing)*28)}.h-64{height:calc(var(--spacing)*64)}.h-full{height:100%}.min-h-screen{min-height:100vh}.w-2{width:calc(var(--spacing)*2)}.w-3\.5{width:calc(var(--spacing)*3.5)}.w-16{width:calc(var(--spacing)*16)}.w-20{width:calc(var(--spacing)*20)}.w-32{width:calc(var(--spacing)*32)}.w-48{width:calc(var(--spacing)*48)}.w-56{width:calc(var(--spacing)*56)}.w-full{width:100%}.max-w-5xl{max-width:var(--container-5xl)}.max-w-48{max-width:calc(var(--spacing)*48)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-\[2rem\]{min-width:2rem}.min-w-\[3rem\]{min-width:3rem}.flex-1{flex:1}.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.rotate-45{rotate:45deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-ping{animation:var(--animate-ping)}.animate-pulse{animation:var(--animate-pulse)}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.gap-0\.5{gap:calc(var(--spacing)*.5)}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-2\.5{gap:calc(var(--spacing)*2.5)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}.gap-x-3{column-gap:calc(var(--spacing)*3)}.gap-y-1{row-gap:calc(var(--spacing)*1)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-l-lg{border-top-left-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}.rounded-r-lg{border-top-right-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-blue-500{border-color:var(--color-blue-500)}.border-blue-500\/50{border-color:#3080ff80}@supports (color:color-mix(in lab,red,red)){.border-blue-500\/50{border-color:color-mix(in oklab,var(--color-blue-500)50%,transparent)}}.border-gray-700{border-color:var(--color-gray-700)}.border-gray-800{border-color:var(--color-gray-800)}.border-gray-800\/50{border-color:#1e293980}@supports (color:color-mix(in lab,red,red)){.border-gray-800\/50{border-color:color-mix(in oklab,var(--color-gray-800)50%,transparent)}}.border-indigo-500\/10{border-color:#625fff1a}@supports (color:color-mix(in lab,red,red)){.border-indigo-500\/10{border-color:color-mix(in oklab,var(--color-indigo-500)10%,transparent)}}.border-indigo-500\/20{border-color:#625fff33}@supports (color:color-mix(in lab,red,red)){.border-indigo-500\/20{border-color:color-mix(in oklab,var(--color-indigo-500)20%,transparent)}}.border-red-900\/50{border-color:#82181a80}@supports (color:color-mix(in lab,red,red)){.border-red-900\/50{border-color:color-mix(in oklab,var(--color-red-900)50%,transparent)}}.bg-amber-400{background-color:var(--color-amber-400)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-500\/15{background-color:#f99c0026}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/15{background-color:color-mix(in oklab,var(--color-amber-500)15%,transparent)}}.bg-amber-500\/20{background-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/20{background-color:color-mix(in oklab,var(--color-amber-500)20%,transparent)}}.bg-blue-400{background-color:var(--color-blue-400)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-500\/10{background-color:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/10{background-color:color-mix(in oklab,var(--color-blue-500)10%,transparent)}}.bg-blue-500\/15{background-color:#3080ff26}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/15{background-color:color-mix(in oklab,var(--color-blue-500)15%,transparent)}}.bg-blue-500\/20{background-color:#3080ff33}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/20{background-color:color-mix(in oklab,var(--color-blue-500)20%,transparent)}}.bg-blue-600{background-color:var(--color-blue-600)}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-emerald-500\/15{background-color:#00bb7f26}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/15{background-color:color-mix(in oklab,var(--color-emerald-500)15%,transparent)}}.bg-emerald-500\/20{background-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/20{background-color:color-mix(in oklab,var(--color-emerald-500)20%,transparent)}}.bg-gray-500{background-color:var(--color-gray-500)}.bg-gray-500\/15{background-color:#6a728226}@supports (color:color-mix(in lab,red,red)){.bg-gray-500\/15{background-color:color-mix(in oklab,var(--color-gray-500)15%,transparent)}}.bg-gray-500\/20{background-color:#6a728233}@supports (color:color-mix(in lab,red,red)){.bg-gray-500\/20{background-color:color-mix(in oklab,var(--color-gray-500)20%,transparent)}}.bg-gray-600{background-color:var(--color-gray-600)}.bg-gray-700{background-color:var(--color-gray-700)}.bg-gray-800{background-color:var(--color-gray-800)}.bg-gray-800\/50{background-color:#1e293980}@supports (color:color-mix(in lab,red,red)){.bg-gray-800\/50{background-color:color-mix(in oklab,var(--color-gray-800)50%,transparent)}}.bg-gray-900{background-color:var(--color-gray-900)}.bg-gray-900\/50{background-color:#10182880}@supports (color:color-mix(in lab,red,red)){.bg-gray-900\/50{background-color:color-mix(in oklab,var(--color-gray-900)50%,transparent)}}.bg-gray-950{background-color:var(--color-gray-950)}.bg-gray-950\/40{background-color:#03071266}@supports (color:color-mix(in lab,red,red)){.bg-gray-950\/40{background-color:color-mix(in oklab,var(--color-gray-950)40%,transparent)}}.bg-indigo-500\/15{background-color:#625fff26}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/15{background-color:color-mix(in oklab,var(--color-indigo-500)15%,transparent)}}.bg-indigo-500\/20{background-color:#625fff33}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/20{background-color:color-mix(in oklab,var(--color-indigo-500)20%,transparent)}}.bg-indigo-900\/30{background-color:#312c854d}@supports (color:color-mix(in lab,red,red)){.bg-indigo-900\/30{background-color:color-mix(in oklab,var(--color-indigo-900)30%,transparent)}}.bg-indigo-950\/15{background-color:#1e1a4d26}@supports (color:color-mix(in lab,red,red)){.bg-indigo-950\/15{background-color:color-mix(in oklab,var(--color-indigo-950)15%,transparent)}}.bg-purple-400{background-color:var(--color-purple-400)}.bg-purple-500{background-color:var(--color-purple-500)}.bg-purple-500\/15{background-color:#ac4bff26}@supports (color:color-mix(in lab,red,red)){.bg-purple-500\/15{background-color:color-mix(in oklab,var(--color-purple-500)15%,transparent)}}.bg-red-500\/15{background-color:#fb2c3626}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/15{background-color:color-mix(in oklab,var(--color-red-500)15%,transparent)}}.bg-red-500\/20{background-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/20{background-color:color-mix(in oklab,var(--color-red-500)20%,transparent)}}.bg-red-950\/20{background-color:#46080933}@supports (color:color-mix(in lab,red,red)){.bg-red-950\/20{background-color:color-mix(in oklab,var(--color-red-950)20%,transparent)}}.bg-red-950\/30{background-color:#4608094d}@supports (color:color-mix(in lab,red,red)){.bg-red-950\/30{background-color:color-mix(in oklab,var(--color-red-950)30%,transparent)}}.fill-amber-400\/70{fill:#fcbb00b3}@supports (color:color-mix(in lab,red,red)){.fill-amber-400\/70{fill:color-mix(in oklab,var(--color-amber-400)70%,transparent)}}.fill-gray-500{fill:var(--color-gray-500)}.fill-indigo-400\/70{fill:#7d87ffb3}@supports (color:color-mix(in lab,red,red)){.fill-indigo-400\/70{fill:color-mix(in oklab,var(--color-indigo-400)70%,transparent)}}.fill-red-400\/70{fill:#ff6568b3}@supports (color:color-mix(in lab,red,red)){.fill-red-400\/70{fill:color-mix(in oklab,var(--color-red-400)70%,transparent)}}.p-2\.5{padding:calc(var(--spacing)*2.5)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-6{padding-block:calc(var(--spacing)*6)}.py-8{padding-block:calc(var(--spacing)*8)}.py-12{padding-block:calc(var(--spacing)*12)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-3{padding-top:calc(var(--spacing)*3)}.pr-4{padding-right:calc(var(--spacing)*4)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pb-3{padding-bottom:calc(var(--spacing)*3)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-none{--tw-leading:1;line-height:1}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.whitespace-nowrap{white-space:nowrap}.text-amber-300{color:var(--color-amber-300)}.text-amber-400{color:var(--color-amber-400)}.text-amber-400\/60{color:#fcbb0099}@supports (color:color-mix(in lab,red,red)){.text-amber-400\/60{color:color-mix(in oklab,var(--color-amber-400)60%,transparent)}}.text-blue-300{color:var(--color-blue-300)}.text-blue-400{color:var(--color-blue-400)}.text-cyan-400{color:var(--color-cyan-400)}.text-emerald-400{color:var(--color-emerald-400)}.text-emerald-400\/80{color:#00d294cc}@supports (color:color-mix(in lab,red,red)){.text-emerald-400\/80{color:color-mix(in oklab,var(--color-emerald-400)80%,transparent)}}.text-gray-100{color:var(--color-gray-100)}.text-gray-200{color:var(--color-gray-200)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-indigo-300{color:var(--color-indigo-300)}.text-indigo-300\/70{color:#a4b3ffb3}@supports (color:color-mix(in lab,red,red)){.text-indigo-300\/70{color:color-mix(in oklab,var(--color-indigo-300)70%,transparent)}}.text-indigo-400{color:var(--color-indigo-400)}.text-indigo-400\/50{color:#7d87ff80}@supports (color:color-mix(in lab,red,red)){.text-indigo-400\/50{color:color-mix(in oklab,var(--color-indigo-400)50%,transparent)}}.text-indigo-400\/60{color:#7d87ff99}@supports (color:color-mix(in lab,red,red)){.text-indigo-400\/60{color:color-mix(in oklab,var(--color-indigo-400)60%,transparent)}}.text-indigo-400\/80{color:#7d87ffcc}@supports (color:color-mix(in lab,red,red)){.text-indigo-400\/80{color:color-mix(in oklab,var(--color-indigo-400)80%,transparent)}}.text-pink-400{color:var(--color-pink-400)}.text-purple-400{color:var(--color-purple-400)}.text-red-200\/80{color:#ffcacacc}@supports (color:color-mix(in lab,red,red)){.text-red-200\/80{color:color-mix(in oklab,var(--color-red-200)80%,transparent)}}.text-red-300{color:var(--color-red-300)}.text-red-400{color:var(--color-red-400)}.text-violet-400{color:var(--color-violet-400)}.text-white{color:var(--color-white)}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-gray-500::placeholder{color:var(--color-gray-500)}.opacity-60{opacity:.6}.opacity-75{opacity:.75}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}@media(hover:hover){.group-hover\:block:is(:where(.group):hover *){display:block}.hover\:border-gray-600:hover{border-color:var(--color-gray-600)}.hover\:border-gray-700:hover{border-color:var(--color-gray-700)}.hover\:bg-blue-500:hover{background-color:var(--color-blue-500)}.hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.hover\:bg-gray-800\/50:hover{background-color:#1e293980}@supports (color:color-mix(in lab,red,red)){.hover\:bg-gray-800\/50:hover{background-color:color-mix(in oklab,var(--color-gray-800)50%,transparent)}}.hover\:bg-gray-900:hover{background-color:var(--color-gray-900)}.hover\:bg-indigo-950\/30:hover{background-color:#1e1a4d4d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-indigo-950\/30:hover{background-color:color-mix(in oklab,var(--color-indigo-950)30%,transparent)}}.hover\:fill-indigo-500\/15:hover{fill:#625fff26}@supports (color:color-mix(in lab,red,red)){.hover\:fill-indigo-500\/15:hover{fill:color-mix(in oklab,var(--color-indigo-500)15%,transparent)}}.hover\:text-gray-200:hover{color:var(--color-gray-200)}.hover\:text-gray-300:hover{color:var(--color-gray-300)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}}.focus\:border-blue-500:focus{border-color:var(--color-blue-500)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-blue-500:focus{--tw-ring-color:var(--color-blue-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-40:disabled{opacity:.4}@media(hover:hover){.disabled\:hover\:bg-gray-800:disabled:hover{background-color:var(--color-gray-800)}.disabled\:hover\:text-gray-400:disabled:hover{color:var(--color-gray-400)}}@media(min-width:40rem){.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:justify-between{justify-content:space-between}}@media(min-width:48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}}@media(min-width:64rem){.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}}
|