claude-session-dashboard 0.4.3 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/dist/client/assets/_dashboard-DLFGahko.js +1 -0
  2. package/dist/client/assets/{_sessionId-D4Tpmmb5.js → _sessionId-xiPzwrlf.js} +1 -1
  3. package/dist/client/assets/{createServerFn-BYTDoNe-.js → createServerFn-BLR4iNR3.js} +1 -1
  4. package/dist/client/assets/{index-DnK_zh3s.js → index-D_9sS4oJ.js} +1 -1
  5. package/dist/client/assets/{main-CV28H4XG.js → main-BcKPK-4E.js} +3 -3
  6. package/dist/client/assets/{sessions.queries-tzrs5GhP.js → sessions.queries-CHKiZnLm.js} +1 -1
  7. package/dist/client/assets/{settings-D8yv1q93.js → settings-B2tG1vy0.js} +1 -1
  8. package/dist/client/assets/{settings.types-CMYAW0cQ.js → settings.types-DHC6rkil.js} +1 -1
  9. package/dist/client/assets/{stats-C_6E4jyb.js → stats-BlA0NIHc.js} +1 -1
  10. package/dist/client/assets/{useSessionCost-BBu3AmcX.js → useSessionCost-BikgEmWy.js} +1 -1
  11. package/dist/server/assets/{_dashboard-TUzgwLqB.js → _dashboard-smfIqyQC.js} +56 -30
  12. package/dist/server/assets/{_sessionId-DyFxvcBN.js → _sessionId-DIUMcrWR.js} +1 -1
  13. package/dist/server/assets/{_tanstack-start-manifest_v-Bzp9kpGN.js → _tanstack-start-manifest_v-Dmhlhehg.js} +1 -1
  14. package/dist/server/assets/app-info.server-CXcS0a5s.js +40 -0
  15. package/dist/server/assets/{index-Bx7vBs4O.js → index-hFrIPkke.js} +1 -1
  16. package/dist/server/assets/{project-analytics.server-kTooOGl-.js → project-analytics.server-Bxk8-NnT.js} +2 -2
  17. package/dist/server/assets/{router-Cd4jLk4T.js → router-5hznwWqr.js} +5 -5
  18. package/dist/server/assets/{session-detail.server-CO5XwLSv.js → session-detail.server-BIoOQwSE.js} +1 -1
  19. package/dist/server/assets/{session-parser-DxLcS8VW.js → session-parser-B0pdBvgT.js} +2 -2
  20. package/dist/server/assets/{session-scanner-DRGzVO2T.js → session-scanner-CpgOq5m1.js} +1 -1
  21. package/dist/server/assets/{sessions.server-CTeIkXCV.js → sessions.server-Biq8gbAJ.js} +2 -2
  22. package/dist/server/assets/{settings-KKaz1ty7.js → settings-D0FgLIR5.js} +1 -1
  23. package/dist/server/assets/{stats-Bsrkajci.js → stats-Ae6umrPI.js} +1 -1
  24. package/dist/server/assets/{stats.server-iJ_z7eUN.js → stats.server-DhzOihwM.js} +2 -2
  25. package/dist/server/server.js +14 -11
  26. package/package.json +1 -1
  27. package/dist/client/assets/_dashboard-t702m22X.js +0 -1
@@ -1,9 +1,10 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { useMatches, Link, Outlet } from "@tanstack/react-router";
3
- import { useQuery } from "@tanstack/react-query";
3
+ import { useQuery, queryOptions } from "@tanstack/react-query";
4
4
  import { a as activeSessionsQuery } from "./sessions.queries-B5ZBiVJy.js";
5
- import "./createSsrRpc-CVg2UDl0.js";
6
- import "../server.js";
5
+ import { c as createSsrRpc } from "./createSsrRpc-CVg2UDl0.js";
6
+ import { c as createServerFn } from "../server.js";
7
+ import "zod";
7
8
  import "@tanstack/history";
8
9
  import "@tanstack/router-core/ssr/client";
9
10
  import "@tanstack/router-core";
@@ -13,13 +14,22 @@ import "h3-v2";
13
14
  import "tiny-invariant";
14
15
  import "seroval";
15
16
  import "@tanstack/react-router/ssr/server";
16
- import "zod";
17
17
  function ActiveSessionsBadge() {
18
18
  const { data: activeSessions } = useQuery(activeSessionsQuery);
19
19
  const count = activeSessions?.length ?? 0;
20
20
  if (count === 0) return null;
21
21
  return /* @__PURE__ */ jsx("span", { className: "ml-auto rounded-full bg-emerald-500/20 px-1.5 py-0.5 text-[10px] font-medium text-emerald-400", children: count });
22
22
  }
23
+ const getAppInfo = createServerFn({
24
+ method: "GET"
25
+ }).handler(createSsrRpc("955327d72ca3168c4751159ca07b8fb0fe0d2381dd0b991f06b941480959fbe8"));
26
+ const appInfoQuery = queryOptions({
27
+ queryKey: ["app-info"],
28
+ queryFn: () => getAppInfo(),
29
+ staleTime: Infinity,
30
+ // Version and path never change at runtime
31
+ refetchOnWindowFocus: false
32
+ });
23
33
  const NAV_ITEMS = [
24
34
  {
25
35
  to: "/sessions",
@@ -51,6 +61,7 @@ const NAV_ITEMS = [
51
61
  function AppShell({ children }) {
52
62
  const matches = useMatches();
53
63
  const currentPath = matches[matches.length - 1]?.pathname ?? "";
64
+ const { data: appInfo } = useQuery(appInfoQuery);
54
65
  return /* @__PURE__ */ jsxs("div", { className: "flex min-h-screen", children: [
55
66
  /* @__PURE__ */ jsxs("aside", { className: "flex w-56 shrink-0 flex-col border-r border-gray-800 bg-gray-950", children: [
56
67
  /* @__PURE__ */ jsx("div", { className: "flex h-14 items-center border-b border-gray-800 px-4", children: /* @__PURE__ */ jsxs(Link, { to: "/sessions", className: "text-sm font-bold text-white", children: [
@@ -73,33 +84,48 @@ function AppShell({ children }) {
73
84
  item.to
74
85
  );
75
86
  }) }),
76
- /* @__PURE__ */ jsx("div", { className: "border-t border-gray-800 p-3", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
77
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
78
- /* @__PURE__ */ jsx(
79
- "a",
80
- {
81
- href: "https://github.com/dlupiak/claude-session-dashboard",
82
- target: "_blank",
83
- rel: "noopener noreferrer",
84
- className: "text-gray-500 hover:text-gray-300 transition-colors",
85
- title: "GitHub Repository",
86
- children: /* @__PURE__ */ jsx("svg", { className: "w-4 h-4", viewBox: "0 0 16 16", fill: "currentColor", children: /* @__PURE__ */ jsx("path", { d: "M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z" }) })
87
- }
88
- ),
89
- /* @__PURE__ */ jsx(
90
- "a",
91
- {
92
- href: "https://www.npmjs.com/package/claude-session-dashboard",
93
- target: "_blank",
94
- rel: "noopener noreferrer",
95
- className: "text-gray-500 hover:text-gray-300 transition-colors",
96
- title: "npm Package",
97
- children: /* @__PURE__ */ jsx("svg", { className: "w-4 h-4", viewBox: "0 0 16 16", fill: "currentColor", children: /* @__PURE__ */ jsx("path", { d: "M0 0v16h16V0H0zm13 13H8V5H5v8H3V3h10v10z" }) })
98
- }
99
- )
87
+ /* @__PURE__ */ jsxs("div", { className: "border-t border-gray-800 p-3", children: [
88
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
89
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
90
+ /* @__PURE__ */ jsx(
91
+ "a",
92
+ {
93
+ href: "https://github.com/dlupiak/claude-session-dashboard",
94
+ target: "_blank",
95
+ rel: "noopener noreferrer",
96
+ className: "text-gray-500 hover:text-gray-300 transition-colors",
97
+ title: "GitHub Repository",
98
+ children: /* @__PURE__ */ jsx("svg", { className: "w-4 h-4", viewBox: "0 0 16 16", fill: "currentColor", children: /* @__PURE__ */ jsx("path", { d: "M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z" }) })
99
+ }
100
+ ),
101
+ /* @__PURE__ */ jsx(
102
+ "a",
103
+ {
104
+ href: "https://www.npmjs.com/package/claude-session-dashboard",
105
+ target: "_blank",
106
+ rel: "noopener noreferrer",
107
+ className: "text-gray-500 hover:text-gray-300 transition-colors",
108
+ title: "npm Package",
109
+ children: /* @__PURE__ */ jsx("svg", { className: "w-4 h-4", viewBox: "0 0 16 16", fill: "currentColor", children: /* @__PURE__ */ jsx("path", { d: "M0 0v16h16V0H0zm13 13H8V5H5v8H3V3h10v10z" }) })
110
+ }
111
+ )
112
+ ] }),
113
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-gray-600", children: "Read-only" })
100
114
  ] }),
101
- /* @__PURE__ */ jsx("p", { className: "text-xs text-gray-600", children: "Read-only" })
102
- ] }) })
115
+ appInfo && /* @__PURE__ */ jsxs(
116
+ "p",
117
+ {
118
+ className: "mt-1.5 truncate text-[10px] text-gray-600",
119
+ title: `v${appInfo.version} · ${appInfo.appPath}`,
120
+ children: [
121
+ "v",
122
+ appInfo.version,
123
+ " · ",
124
+ appInfo.appPath
125
+ ]
126
+ }
127
+ )
128
+ ] })
103
129
  ] }),
104
130
  /* @__PURE__ */ jsx("main", { className: "flex-1 overflow-auto", children: /* @__PURE__ */ jsx("div", { className: "mx-auto max-w-5xl px-6 py-6", children }) })
105
131
  ] });
@@ -10,7 +10,7 @@ import { ResponsiveContainer, AreaChart, YAxis, Tooltip, ReferenceLine, Area } f
10
10
  import { s as settingsQuery } from "./settings.queries-DSQd324O.js";
11
11
  import { g as getMergedPricing, c as calculateSessionCost, u as useSessionCost, E as ExportDropdown, d as downloadFile, e as sessionToJSON } from "./useSessionCost-CYs5UOX-.js";
12
12
  import { a as activeSessionsQuery } from "./sessions.queries-B5ZBiVJy.js";
13
- import { b as Route, u as usePrivacy } from "./router-Cd4jLk4T.js";
13
+ import { b as Route, u as usePrivacy } from "./router-5hznwWqr.js";
14
14
  import "@tanstack/history";
15
15
  import "@tanstack/router-core/ssr/client";
16
16
  import "@tanstack/router-core";
@@ -1,4 +1,4 @@
1
- const tsrStartManifest = () => ({ "routes": { "__root__": { "filePath": "/Users/dmytro.lupiak/GitHub/claude-session-dashboard/apps/web/src/routes/__root.tsx", "children": ["/", "/_dashboard"], "preloads": ["/assets/main-CV28H4XG.js"], "assets": [] }, "/": { "filePath": "/Users/dmytro.lupiak/GitHub/claude-session-dashboard/apps/web/src/routes/index.tsx" }, "/_dashboard": { "filePath": "/Users/dmytro.lupiak/GitHub/claude-session-dashboard/apps/web/src/routes/_dashboard.tsx", "children": ["/_dashboard/settings", "/_dashboard/stats", "/_dashboard/sessions/$sessionId", "/_dashboard/sessions/"], "assets": [], "preloads": ["/assets/_dashboard-t702m22X.js", "/assets/createServerFn-BYTDoNe-.js", "/assets/sessions.queries-tzrs5GhP.js"] }, "/_dashboard/settings": { "filePath": "/Users/dmytro.lupiak/GitHub/claude-session-dashboard/apps/web/src/routes/_dashboard/settings.tsx", "assets": [], "preloads": ["/assets/settings-D8yv1q93.js", "/assets/settings.types-CMYAW0cQ.js"] }, "/_dashboard/stats": { "filePath": "/Users/dmytro.lupiak/GitHub/claude-session-dashboard/apps/web/src/routes/_dashboard/stats.tsx", "assets": [], "preloads": ["/assets/stats-C_6E4jyb.js", "/assets/format-Bsprb3az.js", "/assets/useSessionCost-BBu3AmcX.js", "/assets/settings.types-CMYAW0cQ.js"] }, "/_dashboard/sessions/$sessionId": { "filePath": "/Users/dmytro.lupiak/GitHub/claude-session-dashboard/apps/web/src/routes/_dashboard/sessions/$sessionId.tsx", "assets": [], "preloads": ["/assets/_sessionId-D4Tpmmb5.js", "/assets/format-Bsprb3az.js", "/assets/useSessionCost-BBu3AmcX.js", "/assets/settings.types-CMYAW0cQ.js"] }, "/_dashboard/sessions/": { "filePath": "/Users/dmytro.lupiak/GitHub/claude-session-dashboard/apps/web/src/routes/_dashboard/sessions/index.tsx", "assets": [], "preloads": ["/assets/index-DnK_zh3s.js", "/assets/format-Bsprb3az.js"] } }, "clientEntry": "/assets/main-CV28H4XG.js" });
1
+ const tsrStartManifest = () => ({ "routes": { "__root__": { "filePath": "/Users/dmytro.lupiak/GitHub/claude-session-dashboard/apps/web/src/routes/__root.tsx", "children": ["/", "/_dashboard"], "preloads": ["/assets/main-BcKPK-4E.js"], "assets": [] }, "/": { "filePath": "/Users/dmytro.lupiak/GitHub/claude-session-dashboard/apps/web/src/routes/index.tsx" }, "/_dashboard": { "filePath": "/Users/dmytro.lupiak/GitHub/claude-session-dashboard/apps/web/src/routes/_dashboard.tsx", "children": ["/_dashboard/settings", "/_dashboard/stats", "/_dashboard/sessions/$sessionId", "/_dashboard/sessions/"], "assets": [], "preloads": ["/assets/_dashboard-DLFGahko.js", "/assets/createServerFn-BLR4iNR3.js", "/assets/sessions.queries-CHKiZnLm.js"] }, "/_dashboard/settings": { "filePath": "/Users/dmytro.lupiak/GitHub/claude-session-dashboard/apps/web/src/routes/_dashboard/settings.tsx", "assets": [], "preloads": ["/assets/settings-B2tG1vy0.js", "/assets/settings.types-DHC6rkil.js"] }, "/_dashboard/stats": { "filePath": "/Users/dmytro.lupiak/GitHub/claude-session-dashboard/apps/web/src/routes/_dashboard/stats.tsx", "assets": [], "preloads": ["/assets/stats-BlA0NIHc.js", "/assets/format-Bsprb3az.js", "/assets/useSessionCost-BikgEmWy.js", "/assets/settings.types-DHC6rkil.js"] }, "/_dashboard/sessions/$sessionId": { "filePath": "/Users/dmytro.lupiak/GitHub/claude-session-dashboard/apps/web/src/routes/_dashboard/sessions/$sessionId.tsx", "assets": [], "preloads": ["/assets/_sessionId-xiPzwrlf.js", "/assets/format-Bsprb3az.js", "/assets/useSessionCost-BikgEmWy.js", "/assets/settings.types-DHC6rkil.js"] }, "/_dashboard/sessions/": { "filePath": "/Users/dmytro.lupiak/GitHub/claude-session-dashboard/apps/web/src/routes/_dashboard/sessions/index.tsx", "assets": [], "preloads": ["/assets/index-D_9sS4oJ.js", "/assets/format-Bsprb3az.js"] } }, "clientEntry": "/assets/main-BcKPK-4E.js" });
2
2
  export {
3
3
  tsrStartManifest
4
4
  };
@@ -0,0 +1,40 @@
1
+ import { c as createServerRpc } from "./createServerRpc-Bd3B-Ah9.js";
2
+ import * as fs from "node:fs";
3
+ import * as path from "node:path";
4
+ import { c as createServerFn } from "../server.js";
5
+ import "@tanstack/history";
6
+ import "@tanstack/router-core/ssr/client";
7
+ import "@tanstack/router-core";
8
+ import "node:async_hooks";
9
+ import "@tanstack/router-core/ssr/server";
10
+ import "h3-v2";
11
+ import "tiny-invariant";
12
+ import "seroval";
13
+ import "react/jsx-runtime";
14
+ import "@tanstack/react-router/ssr/server";
15
+ import "@tanstack/react-router";
16
+ const getAppInfo_createServerFn_handler = createServerRpc({
17
+ id: "955327d72ca3168c4751159ca07b8fb0fe0d2381dd0b991f06b941480959fbe8",
18
+ name: "getAppInfo",
19
+ filename: "src/features/settings/app-info.server.ts"
20
+ }, (opts) => getAppInfo.__executeServer(opts));
21
+ const getAppInfo = createServerFn({
22
+ method: "GET"
23
+ }).handler(getAppInfo_createServerFn_handler, async () => {
24
+ let version = "unknown";
25
+ try {
26
+ const pkgPath = path.resolve(process.cwd(), "package.json");
27
+ const raw = fs.readFileSync(pkgPath, "utf-8");
28
+ const pkg = JSON.parse(raw);
29
+ version = pkg.version ?? "unknown";
30
+ } catch {
31
+ }
32
+ return {
33
+ version,
34
+ appPath: process.cwd(),
35
+ nodeEnv: "production"
36
+ };
37
+ });
38
+ export {
39
+ getAppInfo_createServerFn_handler
40
+ };
@@ -4,7 +4,7 @@ import { useQuery } from "@tanstack/react-query";
4
4
  import { Link, useNavigate } from "@tanstack/react-router";
5
5
  import { p as paginatedSessionListQuery, a as activeSessionsQuery } from "./sessions.queries-B5ZBiVJy.js";
6
6
  import { a as formatDuration, b as formatRelativeTime, d as formatBytes } from "./format-DIZHV7IJ.js";
7
- import { u as usePrivacy, a as Route } from "./router-Cd4jLk4T.js";
7
+ import { u as usePrivacy, a as Route } from "./router-5hznwWqr.js";
8
8
  import "./createSsrRpc-CVg2UDl0.js";
9
9
  import "../server.js";
10
10
  import "@tanstack/history";
@@ -1,9 +1,9 @@
1
1
  import { c as createServerRpc } from "./createServerRpc-Bd3B-Ah9.js";
2
- import { a as scanAllSessions } from "./session-scanner-DRGzVO2T.js";
2
+ import { a as scanAllSessions } from "./session-scanner-CpgOq5m1.js";
3
3
  import { c as createServerFn } from "../server.js";
4
4
  import "node:fs";
5
5
  import "node:path";
6
- import "./session-parser-DxLcS8VW.js";
6
+ import "./session-parser-B0pdBvgT.js";
7
7
  import "node:os";
8
8
  import "node:readline";
9
9
  import "@tanstack/history";
@@ -136,7 +136,7 @@ function RootDocument({ children }) {
136
136
  ] })
137
137
  ] });
138
138
  }
139
- const $$splitComponentImporter$4 = () => import("./_dashboard-TUzgwLqB.js");
139
+ const $$splitComponentImporter$4 = () => import("./_dashboard-smfIqyQC.js");
140
140
  const Route$5 = createFileRoute("/_dashboard")({
141
141
  component: lazyRouteComponent($$splitComponentImporter$4, "component")
142
142
  });
@@ -145,7 +145,7 @@ const Route$4 = createFileRoute("/")({
145
145
  throw redirect({ to: "/sessions" });
146
146
  }
147
147
  });
148
- const $$splitComponentImporter$3 = () => import("./stats-Bsrkajci.js");
148
+ const $$splitComponentImporter$3 = () => import("./stats-Ae6umrPI.js");
149
149
  const statsSearchSchema = z.object({
150
150
  tab: z.enum(["overview", "projects"]).default("overview").catch("overview")
151
151
  });
@@ -153,11 +153,11 @@ const Route$3 = createFileRoute("/_dashboard/stats")({
153
153
  validateSearch: statsSearchSchema,
154
154
  component: lazyRouteComponent($$splitComponentImporter$3, "component")
155
155
  });
156
- const $$splitComponentImporter$2 = () => import("./settings-KKaz1ty7.js");
156
+ const $$splitComponentImporter$2 = () => import("./settings-D0FgLIR5.js");
157
157
  const Route$2 = createFileRoute("/_dashboard/settings")({
158
158
  component: lazyRouteComponent($$splitComponentImporter$2, "component")
159
159
  });
160
- const $$splitComponentImporter$1 = () => import("./index-Bx7vBs4O.js");
160
+ const $$splitComponentImporter$1 = () => import("./index-hFrIPkke.js");
161
161
  const sessionsSearchSchema = z.object({
162
162
  page: z.number().int().min(1).default(1).catch(1),
163
163
  pageSize: z.number().int().min(5).max(100).default(5).catch(5),
@@ -169,7 +169,7 @@ const Route$1 = createFileRoute("/_dashboard/sessions/")({
169
169
  validateSearch: sessionsSearchSchema,
170
170
  component: lazyRouteComponent($$splitComponentImporter$1, "component")
171
171
  });
172
- const $$splitComponentImporter = () => import("./_sessionId-DyFxvcBN.js");
172
+ const $$splitComponentImporter = () => import("./_sessionId-DIUMcrWR.js");
173
173
  const searchSchema = z.object({
174
174
  project: z.string().optional()
175
175
  });
@@ -1,7 +1,7 @@
1
1
  import { c as createServerRpc } from "./createServerRpc-Bd3B-Ah9.js";
2
2
  import * as path from "node:path";
3
3
  import * as fs from "node:fs";
4
- import { e as extractProjectName, p as parseDetail, a as getProjectsDir, d as decodeProjectDirName } from "./session-parser-DxLcS8VW.js";
4
+ import { e as extractProjectName, p as parseDetail, g as getProjectsDir, d as decodeProjectDirName } from "./session-parser-B0pdBvgT.js";
5
5
  import { c as createServerFn } from "../server.js";
6
6
  import "node:os";
7
7
  import "node:readline";
@@ -664,11 +664,11 @@ function extractTextContent(msg) {
664
664
  return texts.length > 0 ? texts.join("\n").slice(0, 500) : void 0;
665
665
  }
666
666
  export {
667
- getProjectsDir as a,
667
+ getStatsPath as a,
668
668
  extractSessionId as b,
669
669
  parseSummary as c,
670
670
  decodeProjectDirName as d,
671
671
  extractProjectName as e,
672
- getStatsPath as g,
672
+ getProjectsDir as g,
673
673
  parseDetail as p
674
674
  };
@@ -1,6 +1,6 @@
1
1
  import * as fs from "node:fs";
2
2
  import * as path from "node:path";
3
- import { a as getProjectsDir, d as decodeProjectDirName, e as extractProjectName, b as extractSessionId, c as parseSummary } from "./session-parser-DxLcS8VW.js";
3
+ import { g as getProjectsDir, d as decodeProjectDirName, e as extractProjectName, b as extractSessionId, c as parseSummary } from "./session-parser-B0pdBvgT.js";
4
4
  async function scanProjects() {
5
5
  const projectsDir = getProjectsDir();
6
6
  let entries;
@@ -1,10 +1,10 @@
1
1
  import { c as createServerRpc } from "./createServerRpc-Bd3B-Ah9.js";
2
2
  import { z } from "zod";
3
- import { a as scanAllSessions, g as getActiveSessions } from "./session-scanner-DRGzVO2T.js";
3
+ import { a as scanAllSessions, g as getActiveSessions } from "./session-scanner-CpgOq5m1.js";
4
4
  import { c as createServerFn } from "../server.js";
5
5
  import "node:fs";
6
6
  import "node:path";
7
- import "./session-parser-DxLcS8VW.js";
7
+ import "./session-parser-B0pdBvgT.js";
8
8
  import "node:os";
9
9
  import "node:readline";
10
10
  import "@tanstack/history";
@@ -3,7 +3,7 @@ import { useState } from "react";
3
3
  import { useQuery } from "@tanstack/react-query";
4
4
  import { s as settingsQuery, u as useSettingsMutation } from "./settings.queries-DSQd324O.js";
5
5
  import { a as SUBSCRIPTION_TIERS, b as DEFAULT_PRICING, D as DEFAULT_SETTINGS } from "./settings.types-DntadCHo.js";
6
- import { u as usePrivacy } from "./router-Cd4jLk4T.js";
6
+ import { u as usePrivacy } from "./router-5hznwWqr.js";
7
7
  import "./createSsrRpc-CVg2UDl0.js";
8
8
  import "../server.js";
9
9
  import "@tanstack/history";
@@ -8,7 +8,7 @@ import { format, addDays, getDay, parseISO, startOfISOWeek } from "date-fns";
8
8
  import { createPortal } from "react-dom";
9
9
  import { f as formatTokenCount, a as formatDuration, b as formatRelativeTime, c as formatUSD } from "./format-DIZHV7IJ.js";
10
10
  import { Link } from "@tanstack/react-router";
11
- import { u as usePrivacy, R as Route } from "./router-Cd4jLk4T.js";
11
+ import { u as usePrivacy, R as Route } from "./router-5hznwWqr.js";
12
12
  import { u as useSessionCost, E as ExportDropdown, d as downloadFile, a as dailyActivityToCSV, b as dailyTokensToCSV, m as modelUsageToCSV, s as statsToJSON } from "./useSessionCost-CYs5UOX-.js";
13
13
  import "@tanstack/history";
14
14
  import "@tanstack/router-core/ssr/client";
@@ -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 { g as getStatsPath, p as parseDetail } from "./session-parser-DxLcS8VW.js";
3
+ import { a as getStatsPath, p as parseDetail } from "./session-parser-B0pdBvgT.js";
4
4
  import * as path from "node:path";
5
5
  import * as os from "node:os";
6
6
  import { z } from "zod";
7
- import { s as scanAllSessionsWithPaths } from "./session-scanner-DRGzVO2T.js";
7
+ import { s as scanAllSessionsWithPaths } from "./session-scanner-CpgOq5m1.js";
8
8
  import { c as createServerFn } from "../server.js";
9
9
  import "node:readline";
10
10
  import "@tanstack/history";
@@ -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-Bzp9kpGN.js");
426
+ const { tsrStartManifest } = await import("./assets/_tanstack-start-manifest_v-Dmhlhehg.js");
427
427
  const startManifest = tsrStartManifest();
428
428
  const rootRoute = startManifest.routes[rootRouteId] = startManifest.routes[rootRouteId] || {};
429
429
  rootRoute.assets = rootRoute.assets || [];
@@ -577,12 +577,12 @@ function createMultiplexedStream(jsonStream, rawStreams) {
577
577
  }
578
578
  });
579
579
  }
580
- const manifest = { "4b9a58c176f487b49800a372100037cdf33cf048f3592a449f115c7e3f5ea799": {
581
- functionName: "getStats_createServerFn_handler",
582
- importer: () => import("./assets/stats.server-iJ_z7eUN.js")
583
- }, "ff8a3161afdfa175e9c519e4146a56ab5bce6e80745e99cfc2191ebbb7a859bb": {
580
+ const manifest = { "ff8a3161afdfa175e9c519e4146a56ab5bce6e80745e99cfc2191ebbb7a859bb": {
584
581
  functionName: "getSessionDetail_createServerFn_handler",
585
- importer: () => import("./assets/session-detail.server-CO5XwLSv.js")
582
+ importer: () => import("./assets/session-detail.server-BIoOQwSE.js")
583
+ }, "4b9a58c176f487b49800a372100037cdf33cf048f3592a449f115c7e3f5ea799": {
584
+ functionName: "getStats_createServerFn_handler",
585
+ importer: () => import("./assets/stats.server-DhzOihwM.js")
586
586
  }, "810657681a273df5b4e58f0d8fcc6a5451598b489431b9bcaa98eea0ad815da8": {
587
587
  functionName: "getSettings_createServerFn_handler",
588
588
  importer: () => import("./assets/settings.server-6B2PvLgf.js")
@@ -591,16 +591,19 @@ const manifest = { "4b9a58c176f487b49800a372100037cdf33cf048f3592a449f115c7e3f5e
591
591
  importer: () => import("./assets/settings.server-6B2PvLgf.js")
592
592
  }, "bf8e4a7901f1843bdc9c46be1ad5ad59c615b8bbe611b73eb3ff28f20e43ee0d": {
593
593
  functionName: "getSessionList_createServerFn_handler",
594
- importer: () => import("./assets/sessions.server-CTeIkXCV.js")
594
+ importer: () => import("./assets/sessions.server-Biq8gbAJ.js")
595
595
  }, "839d29fe93dfa2a6d506af7b48ca25197190a5ff4c796e970ddfdc6e8c98827f": {
596
596
  functionName: "getActiveSessionList_createServerFn_handler",
597
- importer: () => import("./assets/sessions.server-CTeIkXCV.js")
597
+ importer: () => import("./assets/sessions.server-Biq8gbAJ.js")
598
598
  }, "a3f42f9012fd83586787da8f7cb90649da739dd947d867eb67572f68735ff495": {
599
599
  functionName: "getPaginatedSessions_createServerFn_handler",
600
- importer: () => import("./assets/sessions.server-CTeIkXCV.js")
600
+ importer: () => import("./assets/sessions.server-Biq8gbAJ.js")
601
+ }, "955327d72ca3168c4751159ca07b8fb0fe0d2381dd0b991f06b941480959fbe8": {
602
+ functionName: "getAppInfo_createServerFn_handler",
603
+ importer: () => import("./assets/app-info.server-CXcS0a5s.js")
601
604
  }, "64052f224a1d6696436e5d3deeee2b798f0742e1292ffabd038c3a7bf75e6fcb": {
602
605
  functionName: "getProjectAnalytics_createServerFn_handler",
603
- importer: () => import("./assets/project-analytics.server-kTooOGl-.js")
606
+ importer: () => import("./assets/project-analytics.server-Bxk8-NnT.js")
604
607
  } };
605
608
  async function getServerFnById(id) {
606
609
  const serverFnInfo = manifest[id];
@@ -1016,7 +1019,7 @@ let entriesPromise;
1016
1019
  let baseManifestPromise;
1017
1020
  let cachedFinalManifestPromise;
1018
1021
  async function loadEntries() {
1019
- const routerEntry = await import("./assets/router-Cd4jLk4T.js").then((n) => n.r);
1022
+ const routerEntry = await import("./assets/router-5hznwWqr.js").then((n) => n.r);
1020
1023
  const startEntry = await import("./assets/start-HYkvq4Ni.js");
1021
1024
  return { startEntry, routerEntry };
1022
1025
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-session-dashboard",
3
- "version": "0.4.3",
3
+ "version": "0.4.4",
4
4
  "description": "Local observability dashboard for Claude Code sessions",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -1 +0,0 @@
1
- import{j as e,u as o,L as r,O as i}from"./main-CV28H4XG.js";import{u as c}from"./createServerFn-BYTDoNe-.js";import{a as x}from"./sessions.queries-tzrs5GhP.js";function h(){const{data:t}=c(x),a=t?.length??0;return a===0?null:e.jsx("span",{className:"ml-auto rounded-full bg-emerald-500/20 px-1.5 py-0.5 text-[10px] font-medium text-emerald-400",children:a})}const d=[{to:"/sessions",label:"Sessions",icon:e.jsxs("svg",{className:"h-4 w-4",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.5",children:[e.jsx("line",{x1:"2",y1:"4",x2:"14",y2:"4"}),e.jsx("line",{x1:"2",y1:"8",x2:"14",y2:"8"}),e.jsx("line",{x1:"2",y1:"12",x2:"14",y2:"12"})]})},{to:"/stats",label:"Stats",icon:e.jsxs("svg",{className:"h-4 w-4",viewBox:"0 0 16 16",fill:"currentColor",children:[e.jsx("rect",{x:"1",y:"8",width:"3",height:"7",rx:"0.5"}),e.jsx("rect",{x:"6.5",y:"4",width:"3",height:"11",rx:"0.5"}),e.jsx("rect",{x:"12",y:"1",width:"3",height:"14",rx:"0.5"})]})},{to:"/settings",label:"Settings",icon:e.jsxs("svg",{className:"h-4 w-4",viewBox:"0 0 16 16",fill:"currentColor",children:[e.jsx("path",{d:"M8 10a2 2 0 100-4 2 2 0 000 4z"}),e.jsx("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M6.5.8a1 1 0 011-.8h1a1 1 0 011 .8l.15.9a5.5 5.5 0 011.1.64l.86-.36a1 1 0 011.17.36l.5.86a1 1 0 01-.18 1.17l-.7.55a5.5 5.5 0 010 1.27l.7.55a1 1 0 01.18 1.17l-.5.86a1 1 0 01-1.17.36l-.86-.36a5.5 5.5 0 01-1.1.64l-.14.9a1 1 0 01-1 .8h-1a1 1 0 01-1-.8l-.14-.9a5.5 5.5 0 01-1.1-.64l-.87.36a1 1 0 01-1.17-.36l-.5-.86a1 1 0 01.18-1.17l.7-.55a5.5 5.5 0 010-1.27l-.7-.55a1 1 0 01-.18-1.17l.5-.86a1 1 0 011.17-.36l.87.36a5.5 5.5 0 011.1-.64L6.5.8zM8 11a3 3 0 100-6 3 3 0 000 6z"})]})}];function m({children:t}){const a=o(),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-brand-500",children:"Claude"})," Dashboard"]})}),e.jsx("nav",{className:"flex-1 p-3",children:d.map(s=>{const n=l.startsWith(s.to);return e.jsxs(r,{to:s.to,className:`flex items-center gap-2.5 rounded-lg px-3 py-2 text-sm transition-colors ${n?"bg-gray-800 text-white":"text-gray-400 hover:bg-gray-800/50 hover:text-gray-200"}`,children:[e.jsx("span",{className:"text-gray-500",children:s.icon}),s.label,s.to==="/sessions"&&e.jsx(h,{})]},s.to)})}),e.jsx("div",{className:"border-t border-gray-800 p-3",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("a",{href:"https://github.com/dlupiak/claude-session-dashboard",target:"_blank",rel:"noopener noreferrer",className:"text-gray-500 hover:text-gray-300 transition-colors",title:"GitHub Repository",children:e.jsx("svg",{className:"w-4 h-4",viewBox:"0 0 16 16",fill:"currentColor",children:e.jsx("path",{d:"M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"})})}),e.jsx("a",{href:"https://www.npmjs.com/package/claude-session-dashboard",target:"_blank",rel:"noopener noreferrer",className:"text-gray-500 hover:text-gray-300 transition-colors",title:"npm Package",children:e.jsx("svg",{className:"w-4 h-4",viewBox:"0 0 16 16",fill:"currentColor",children:e.jsx("path",{d:"M0 0v16h16V0H0zm13 13H8V5H5v8H3V3h10v10z"})})})]}),e.jsx("p",{className:"text-xs text-gray-600",children:"Read-only"})]})})]}),e.jsx("main",{className:"flex-1 overflow-auto",children:e.jsx("div",{className:"mx-auto max-w-5xl px-6 py-6",children:t})})]})}function j(){return e.jsx(m,{children:e.jsx(i,{})})}export{j as component};