claude-session-dashboard 0.2.1 → 0.3.1

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 (37) hide show
  1. package/README.md +156 -14
  2. package/dist/client/assets/_dashboard-C-1YOzkf.js +1 -0
  3. package/dist/client/assets/_sessionId-C4jQeEqE.js +12 -0
  4. package/dist/client/assets/app-DNBe9Acr.css +1 -0
  5. package/dist/client/assets/{createServerFn-B0pEGqTk.js → createServerFn-B5mibSc4.js} +1 -1
  6. package/dist/client/assets/index-C83jHUdL.js +1 -0
  7. package/dist/client/assets/{main-CM5g2n-_.js → main-CkUc_xJ0.js} +7 -7
  8. package/dist/client/assets/{sessions.queries-AUVV0tJj.js → sessions.queries-C-HTNzuR.js} +1 -1
  9. package/dist/client/assets/settings-D56cUmNH.js +1 -0
  10. package/dist/client/assets/{settings.types-BRNIMHGJ.js → settings.types-l5MKKuAK.js} +1 -1
  11. package/dist/client/assets/stats-BunIdzj_.js +4 -0
  12. package/dist/client/assets/{useSessionCost-DgFKglaG.js → useSessionCost-BDldLkTA.js} +1 -1
  13. package/dist/client/favicon.svg +3 -0
  14. package/dist/server/assets/_dashboard-TUzgwLqB.js +112 -0
  15. package/dist/server/assets/{_sessionId-BZf2Aqy5.js → _sessionId-BvDwvNyA.js} +162 -145
  16. package/dist/server/assets/_tanstack-start-manifest_v-CVdzOaof.js +4 -0
  17. package/dist/server/assets/{claude-path-BdwflgZ1.js → claude-path-B2oho3NT.js} +2 -2
  18. package/dist/server/assets/{index-Do0HxVmM.js → index-Biupny11.js} +22 -21
  19. package/dist/server/assets/{project-analytics.server-BkWSd6a8.js → project-analytics.server-t1bM6wAa.js} +3 -3
  20. package/dist/server/assets/{router-ChxlsPNU.js → router-kB-tCwY9.js} +55 -29
  21. package/dist/server/assets/{session-detail.server-DLXl-Pn-.js → session-detail.server-IUw67jz-.js} +2 -2
  22. package/dist/server/assets/{session-parser-CAEXxF1D.js → session-parser-CIucKYBT.js} +67 -0
  23. package/dist/server/assets/{session-scanner-CLfls9u-.js → session-scanner-1h9TTTAV.js} +2 -2
  24. package/dist/server/assets/{sessions.server-CUhasKW2.js → sessions.server-Cpffr3MU.js} +3 -3
  25. package/dist/server/assets/{settings-ko61yfVs.js → settings-jxAA3KAS.js} +66 -20
  26. package/dist/server/assets/{stats-C9cZXTP5.js → stats-CzGBAoxT.js} +261 -24
  27. package/dist/server/assets/{stats.server-52mNk2Yw.js → stats.server-DXJiLqey.js} +62 -3
  28. package/dist/server/server.js +17 -17
  29. package/package.json +7 -1
  30. package/dist/client/assets/_dashboard-Bxw4OxIS.js +0 -1
  31. package/dist/client/assets/_sessionId-CNR4Ln7m.js +0 -12
  32. package/dist/client/assets/app-u2nTs9ny.css +0 -1
  33. package/dist/client/assets/index-BbdJ1jMA.js +0 -1
  34. package/dist/client/assets/settings-CIwZDakc.js +0 -1
  35. package/dist/client/assets/stats-CjWSMX3y.js +0 -4
  36. package/dist/server/assets/_dashboard-CAO6-qAS.js +0 -116
  37. package/dist/server/assets/_tanstack-start-manifest_v-C5hwNzs-.js +0 -4
@@ -0,0 +1,112 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { useMatches, Link, Outlet } from "@tanstack/react-router";
3
+ import { useQuery } from "@tanstack/react-query";
4
+ import { a as activeSessionsQuery } from "./sessions.queries-B5ZBiVJy.js";
5
+ import "./createSsrRpc-CVg2UDl0.js";
6
+ import "../server.js";
7
+ import "@tanstack/history";
8
+ import "@tanstack/router-core/ssr/client";
9
+ import "@tanstack/router-core";
10
+ import "node:async_hooks";
11
+ import "@tanstack/router-core/ssr/server";
12
+ import "h3-v2";
13
+ import "tiny-invariant";
14
+ import "seroval";
15
+ import "@tanstack/react-router/ssr/server";
16
+ import "zod";
17
+ function ActiveSessionsBadge() {
18
+ const { data: activeSessions } = useQuery(activeSessionsQuery);
19
+ const count = activeSessions?.length ?? 0;
20
+ if (count === 0) return null;
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
+ }
23
+ const NAV_ITEMS = [
24
+ {
25
+ to: "/sessions",
26
+ label: "Sessions",
27
+ icon: /* @__PURE__ */ jsxs("svg", { className: "h-4 w-4", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", children: [
28
+ /* @__PURE__ */ jsx("line", { x1: "2", y1: "4", x2: "14", y2: "4" }),
29
+ /* @__PURE__ */ jsx("line", { x1: "2", y1: "8", x2: "14", y2: "8" }),
30
+ /* @__PURE__ */ jsx("line", { x1: "2", y1: "12", x2: "14", y2: "12" })
31
+ ] })
32
+ },
33
+ {
34
+ to: "/stats",
35
+ label: "Stats",
36
+ icon: /* @__PURE__ */ jsxs("svg", { className: "h-4 w-4", viewBox: "0 0 16 16", fill: "currentColor", children: [
37
+ /* @__PURE__ */ jsx("rect", { x: "1", y: "8", width: "3", height: "7", rx: "0.5" }),
38
+ /* @__PURE__ */ jsx("rect", { x: "6.5", y: "4", width: "3", height: "11", rx: "0.5" }),
39
+ /* @__PURE__ */ jsx("rect", { x: "12", y: "1", width: "3", height: "14", rx: "0.5" })
40
+ ] })
41
+ },
42
+ {
43
+ to: "/settings",
44
+ label: "Settings",
45
+ icon: /* @__PURE__ */ jsxs("svg", { className: "h-4 w-4", viewBox: "0 0 16 16", fill: "currentColor", children: [
46
+ /* @__PURE__ */ jsx("path", { d: "M8 10a2 2 0 100-4 2 2 0 000 4z" }),
47
+ /* @__PURE__ */ 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" })
48
+ ] })
49
+ }
50
+ ];
51
+ function AppShell({ children }) {
52
+ const matches = useMatches();
53
+ const currentPath = matches[matches.length - 1]?.pathname ?? "";
54
+ return /* @__PURE__ */ jsxs("div", { className: "flex min-h-screen", children: [
55
+ /* @__PURE__ */ jsxs("aside", { className: "flex w-56 shrink-0 flex-col border-r border-gray-800 bg-gray-950", children: [
56
+ /* @__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: [
57
+ /* @__PURE__ */ jsx("span", { className: "text-brand-500", children: "Claude" }),
58
+ " Dashboard"
59
+ ] }) }),
60
+ /* @__PURE__ */ jsx("nav", { className: "flex-1 p-3", children: NAV_ITEMS.map((item) => {
61
+ const isActive = currentPath.startsWith(item.to);
62
+ return /* @__PURE__ */ jsxs(
63
+ Link,
64
+ {
65
+ to: item.to,
66
+ className: `flex items-center gap-2.5 rounded-lg px-3 py-2 text-sm transition-colors ${isActive ? "bg-gray-800 text-white" : "text-gray-400 hover:bg-gray-800/50 hover:text-gray-200"}`,
67
+ children: [
68
+ /* @__PURE__ */ jsx("span", { className: "text-gray-500", children: item.icon }),
69
+ item.label,
70
+ item.to === "/sessions" && /* @__PURE__ */ jsx(ActiveSessionsBadge, {})
71
+ ]
72
+ },
73
+ item.to
74
+ );
75
+ }) }),
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
+ )
100
+ ] }),
101
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-gray-600", children: "Read-only" })
102
+ ] }) })
103
+ ] }),
104
+ /* @__PURE__ */ jsx("main", { className: "flex-1 overflow-auto", children: /* @__PURE__ */ jsx("div", { className: "mx-auto max-w-5xl px-6 py-6", children }) })
105
+ ] });
106
+ }
107
+ function DashboardLayout() {
108
+ return /* @__PURE__ */ jsx(AppShell, { children: /* @__PURE__ */ jsx(Outlet, {}) });
109
+ }
110
+ export {
111
+ DashboardLayout as component
112
+ };
@@ -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-ChxlsPNU.js";
13
+ import { b as Route, u as usePrivacy } from "./router-kB-tCwY9.js";
14
14
  import "@tanstack/history";
15
15
  import "@tanstack/router-core/ssr/client";
16
16
  import "@tanstack/router-core";
@@ -121,7 +121,8 @@ function buildTimelineChartData(turns, agents, skills, errors) {
121
121
  durationMs: agent.durationMs ?? null,
122
122
  totalTokens: agent.totalTokens ?? null,
123
123
  totalToolUseCount: agent.totalToolUseCount ?? null,
124
- toolDots
124
+ toolDots,
125
+ skills: agent.skills?.map((s) => ({ skill: s.skill, args: s.args })) ?? []
125
126
  };
126
127
  });
127
128
  const skillMarkers = skills.map((s) => {
@@ -161,10 +162,10 @@ function shortenToolName(name) {
161
162
  }
162
163
  const TOOL_COLORS = {
163
164
  // File reading
164
- Read: "#60a5fa",
165
- // blue-400
166
- Grep: "#60a5fa",
167
- Glob: "#60a5fa",
165
+ Read: "#e09070",
166
+ // brand-400
167
+ Grep: "#e09070",
168
+ Glob: "#e09070",
168
169
  // File writing
169
170
  Write: "#34d399",
170
171
  // emerald-400
@@ -382,7 +383,6 @@ function TimelineChart({ data, width, onHover }) {
382
383
  y: agentLaneYs[i],
383
384
  toX,
384
385
  laneHeight: LANE_HEIGHT,
385
- leftMargin: LEFT_MARGIN,
386
386
  onHover,
387
387
  getPosition
388
388
  },
@@ -526,7 +526,6 @@ function AgentLaneSVG({
526
526
  y,
527
527
  toX,
528
528
  laneHeight,
529
- leftMargin,
530
529
  onHover,
531
530
  getPosition
532
531
  }) {
@@ -605,7 +604,40 @@ function AgentLaneSVG({
605
604
  ] })
606
605
  },
607
606
  `${dot.toolName}-${i}`
608
- ))
607
+ )),
608
+ lane.skills && lane.skills.length > 0 && lane.skills.map((skill, i) => {
609
+ const skillRelX = lane.startX + (lane.endX - lane.startX) / (lane.skills.length + 1) * (i + 1);
610
+ const cx = toX(skillRelX);
611
+ const cy = y + 6;
612
+ const size = 3;
613
+ return /* @__PURE__ */ jsx(
614
+ "polygon",
615
+ {
616
+ points: `${cx},${cy - size} ${cx + size},${cy} ${cx},${cy + size} ${cx - size},${cy}`,
617
+ fill: "#fbbf24",
618
+ opacity: 0.85,
619
+ className: "cursor-pointer hover:opacity-100",
620
+ onMouseEnter: (e) => onHover(
621
+ {
622
+ kind: "skill",
623
+ skill: skill.skill,
624
+ args: skill.args,
625
+ timestamp: new Date(lane.startMs).toISOString()
626
+ },
627
+ getPosition(e)
628
+ ),
629
+ onMouseLeave: () => onHover(null, { x: 0, y: 0 }),
630
+ children: /* @__PURE__ */ jsxs("title", { children: [
631
+ "/",
632
+ skill.skill,
633
+ " (",
634
+ lane.subagentType,
635
+ ")"
636
+ ] })
637
+ },
638
+ `skill-${skill.skill}-${i}`
639
+ );
640
+ })
609
641
  ] });
610
642
  }
611
643
  function TimelineTooltip({ item, position }) {
@@ -827,7 +859,7 @@ function StatBadge({
827
859
  color
828
860
  }) {
829
861
  const colorMap = {
830
- blue: "bg-blue-500/15 text-blue-400",
862
+ blue: "bg-brand-500/15 text-brand-400",
831
863
  purple: "bg-purple-500/15 text-purple-400",
832
864
  gray: "bg-gray-800 text-gray-300",
833
865
  indigo: "bg-indigo-500/15 text-indigo-400",
@@ -900,7 +932,7 @@ function ContextWindowPanel({ contextWindow, tokens }) {
900
932
  /* @__PURE__ */ jsx(
901
933
  "div",
902
934
  {
903
- className: "bg-blue-500",
935
+ className: "bg-brand-500",
904
936
  style: { width: `${messagesPct}%` },
905
937
  title: `Messages: ~${formatTokenCount(messagesEstimate)}`
906
938
  }
@@ -934,7 +966,7 @@ function ContextWindowPanel({ contextWindow, tokens }) {
934
966
  "system"
935
967
  ] }),
936
968
  /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1", children: [
937
- /* @__PURE__ */ jsx("span", { className: "inline-block h-2 w-2 rounded-sm bg-blue-500" }),
969
+ /* @__PURE__ */ jsx("span", { className: "inline-block h-2 w-2 rounded-sm bg-brand-500" }),
938
970
  "messages"
939
971
  ] }),
940
972
  /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1", children: [
@@ -959,7 +991,7 @@ function ContextWindowPanel({ contextWindow, tokens }) {
959
991
  label: "Messages",
960
992
  value: messagesEstimate,
961
993
  total: contextLimit,
962
- color: "bg-blue-500",
994
+ color: "bg-brand-500",
963
995
  prefix: "~"
964
996
  }
965
997
  ),
@@ -986,8 +1018,8 @@ function ContextWindowPanel({ contextWindow, tokens }) {
986
1018
  /* @__PURE__ */ jsx("p", { className: "mb-1 text-[10px] text-gray-500", children: "Context growth" }),
987
1019
  /* @__PURE__ */ jsx(ResponsiveContainer, { width: "100%", height: 96, children: /* @__PURE__ */ jsxs(AreaChart, { data: chartData, children: [
988
1020
  /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsxs("linearGradient", { id: "contextGrad", x1: "0", y1: "0", x2: "0", y2: "1", children: [
989
- /* @__PURE__ */ jsx("stop", { offset: "0%", stopColor: "#3b82f6", stopOpacity: 0.3 }),
990
- /* @__PURE__ */ jsx("stop", { offset: "100%", stopColor: "#3b82f6", stopOpacity: 0.05 })
1021
+ /* @__PURE__ */ jsx("stop", { offset: "0%", stopColor: "#d97757", stopOpacity: 0.3 }),
1022
+ /* @__PURE__ */ jsx("stop", { offset: "100%", stopColor: "#d97757", stopOpacity: 0.05 })
991
1023
  ] }) }),
992
1024
  /* @__PURE__ */ jsx(
993
1025
  YAxis,
@@ -1000,8 +1032,8 @@ function ContextWindowPanel({ contextWindow, tokens }) {
1000
1032
  Tooltip,
1001
1033
  {
1002
1034
  contentStyle: {
1003
- background: "#1f2937",
1004
- border: "1px solid #374151",
1035
+ background: "#1c1c1a",
1036
+ border: "1px solid #3d3b36",
1005
1037
  borderRadius: "8px",
1006
1038
  fontSize: "11px"
1007
1039
  },
@@ -1032,7 +1064,7 @@ function ContextWindowPanel({ contextWindow, tokens }) {
1032
1064
  {
1033
1065
  type: "stepAfter",
1034
1066
  dataKey: "context",
1035
- stroke: "#3b82f6",
1067
+ stroke: "#d97757",
1036
1068
  fill: "url(#contextGrad)",
1037
1069
  strokeWidth: 1.5,
1038
1070
  dot: false
@@ -1092,7 +1124,7 @@ function CategoryRow({
1092
1124
  function TokenBreakdown({ tokens }) {
1093
1125
  const allTotal = tokens.inputTokens + tokens.outputTokens + tokens.cacheReadInputTokens + tokens.cacheCreationInputTokens;
1094
1126
  const items = [
1095
- { label: "Input", value: tokens.inputTokens, color: "bg-blue-400" },
1127
+ { label: "Input", value: tokens.inputTokens, color: "bg-brand-400" },
1096
1128
  { label: "Output", value: tokens.outputTokens, color: "bg-emerald-400" },
1097
1129
  { label: "Cache Read", value: tokens.cacheReadInputTokens, color: "bg-amber-400" },
1098
1130
  { label: "Cache Create", value: tokens.cacheCreationInputTokens, color: "bg-purple-400" }
@@ -1116,7 +1148,7 @@ function TokenFallback({ tokens }) {
1116
1148
  const activeTotal = tokens.inputTokens + tokens.outputTokens;
1117
1149
  const allTotal = activeTotal + tokens.cacheReadInputTokens + tokens.cacheCreationInputTokens;
1118
1150
  const items = [
1119
- { label: "Input", value: tokens.inputTokens, color: "text-blue-400" },
1151
+ { label: "Input", value: tokens.inputTokens, color: "text-brand-400" },
1120
1152
  { label: "Output", value: tokens.outputTokens, color: "text-emerald-400" },
1121
1153
  { label: "Cache Read", value: tokens.cacheReadInputTokens, color: "text-amber-400" },
1122
1154
  { label: "Cache Create", value: tokens.cacheCreationInputTokens, color: "text-purple-400" }
@@ -1167,9 +1199,9 @@ function ToolUsagePanel({
1167
1199
  /* @__PURE__ */ jsx("div", { className: "flex-1", children: /* @__PURE__ */ jsx(
1168
1200
  "div",
1169
1201
  {
1170
- className: "h-4 rounded bg-blue-500/20",
1202
+ className: "h-4 rounded bg-brand-500/20",
1171
1203
  style: { width: `${count / maxCount * 100}%` },
1172
- children: /* @__PURE__ */ jsx("span", { className: "px-1.5 text-xs text-blue-300", children: count })
1204
+ children: /* @__PURE__ */ jsx("span", { className: "px-1.5 text-xs text-brand-300", children: count })
1173
1205
  }
1174
1206
  ) })
1175
1207
  ] }, tool)) })
@@ -1183,7 +1215,7 @@ function ErrorPanel({ errors }) {
1183
1215
  errors.length,
1184
1216
  ")"
1185
1217
  ] }),
1186
- /* @__PURE__ */ jsx("div", { className: "mt-3 space-y-2", children: errors.map((error, i) => /* @__PURE__ */ jsxs("div", { className: "rounded-lg bg-red-950/30 p-2.5", children: [
1218
+ /* @__PURE__ */ jsx("div", { className: "mt-3 max-h-64 space-y-2 overflow-y-auto", children: errors.map((error, i) => /* @__PURE__ */ jsxs("div", { className: "rounded-lg bg-red-950/30 p-2.5", children: [
1187
1219
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
1188
1220
  /* @__PURE__ */ jsx("span", { className: "text-xs font-mono text-red-300", children: error.type }),
1189
1221
  error.timestamp && /* @__PURE__ */ jsx("span", { className: "text-xs text-gray-500", children: formatDateTime(error.timestamp) })
@@ -1192,9 +1224,12 @@ function ErrorPanel({ errors }) {
1192
1224
  ] }, i)) })
1193
1225
  ] });
1194
1226
  }
1195
- function AgentsSkillsPanel({
1196
- agents,
1197
- skills
1227
+ function computeAgentTokens(agent) {
1228
+ if (!agent.tokens) return void 0;
1229
+ return agent.tokens.inputTokens + agent.tokens.outputTokens;
1230
+ }
1231
+ function AgentDispatchesPanel({
1232
+ agents
1198
1233
  }) {
1199
1234
  const { data: settings } = useQuery(settingsQuery);
1200
1235
  const { agentCosts, totalAgentCost } = useMemo(() => {
@@ -1215,27 +1250,13 @@ function AgentsSkillsPanel({
1215
1250
  }
1216
1251
  return { agentCosts: costs, totalAgentCost: total };
1217
1252
  }, [settings, agents]);
1218
- if (agents.length === 0 && skills.length === 0) return null;
1219
- const agentCounts = /* @__PURE__ */ new Map();
1220
- for (const a of agents) {
1221
- agentCounts.set(a.subagentType, (agentCounts.get(a.subagentType) ?? 0) + 1);
1222
- }
1223
- const sortedAgentCounts = [...agentCounts.entries()].sort(
1224
- ([, a], [, b]) => b - a
1225
- );
1253
+ if (agents.length === 0) return null;
1226
1254
  const totalAgentTokens = agents.reduce(
1227
1255
  (sum, a) => sum + (a.totalTokens ?? computeAgentTokens(a) ?? 0),
1228
1256
  0
1229
1257
  );
1230
- const skillCounts = /* @__PURE__ */ new Map();
1231
- for (const s of skills) {
1232
- skillCounts.set(s.skill, (skillCounts.get(s.skill) ?? 0) + 1);
1233
- }
1234
- const sortedSkillCounts = [...skillCounts.entries()].sort(
1235
- ([, a], [, b]) => b - a
1236
- );
1237
1258
  return /* @__PURE__ */ jsxs("div", { className: "rounded-xl border border-gray-800 bg-gray-900/50 p-4", children: [
1238
- /* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold text-gray-300", children: "Agents & Skills" }),
1259
+ /* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold text-gray-300", children: "Agent Dispatches" }),
1239
1260
  /* @__PURE__ */ jsxs("p", { className: "mt-1 text-xs text-gray-500", children: [
1240
1261
  agents.length,
1241
1262
  " agent dispatch",
@@ -1246,106 +1267,100 @@ function AgentsSkillsPanel({
1246
1267
  " tokens",
1247
1268
  totalAgentCost > 0 && ` · ~${formatUSD(totalAgentCost)}`,
1248
1269
  ")"
1249
- ] }),
1250
- skills.length > 0 && `, ${skills.length} skill invocation${skills.length !== 1 ? "s" : ""}`
1251
- ] }),
1252
- sortedAgentCounts.length > 0 && /* @__PURE__ */ jsxs("div", { className: "mt-3", children: [
1253
- /* @__PURE__ */ jsx("p", { className: "mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-gray-500", children: "Agent Types" }),
1254
- /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1.5", children: sortedAgentCounts.map(([type, count]) => /* @__PURE__ */ jsxs(
1255
- "span",
1256
- {
1257
- className: "inline-flex items-center gap-1 rounded-md bg-indigo-500/15 px-2 py-0.5 text-xs text-indigo-300",
1258
- children: [
1259
- type,
1260
- count > 1 && /* @__PURE__ */ jsxs("span", { className: "text-indigo-400/60", children: [
1261
- "×",
1262
- count
1263
- ] })
1264
- ]
1265
- },
1266
- type
1267
- )) })
1268
- ] }),
1269
- sortedSkillCounts.length > 0 && /* @__PURE__ */ jsxs("div", { className: "mt-3", children: [
1270
- /* @__PURE__ */ jsx("p", { className: "mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-gray-500", children: "Skills" }),
1271
- /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1.5", children: sortedSkillCounts.map(([skill, count]) => /* @__PURE__ */ jsxs(
1272
- "span",
1273
- {
1274
- className: "inline-flex items-center gap-1 rounded-md bg-amber-500/15 px-2 py-0.5 text-xs text-amber-300",
1275
- children: [
1276
- "/",
1277
- skill,
1278
- count > 1 && /* @__PURE__ */ jsxs("span", { className: "text-amber-400/60", children: [
1279
- "×",
1280
- count
1281
- ] })
1282
- ]
1283
- },
1284
- skill
1285
- )) })
1286
- ] }),
1287
- agents.length > 0 && /* @__PURE__ */ jsxs("div", { className: "mt-3 space-y-1", children: [
1288
- /* @__PURE__ */ jsx("p", { className: "mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-gray-500", children: "Agent Dispatches" }),
1289
- agents.map((a, i) => {
1290
- const tokenCount = a.totalTokens ?? computeAgentTokens(a);
1291
- const agentCost = agentCosts.get(i);
1292
- return /* @__PURE__ */ jsxs(
1293
- "div",
1294
- {
1295
- className: "flex items-start gap-2 rounded bg-gray-950/40 px-2 py-1.5",
1296
- children: [
1297
- /* @__PURE__ */ jsx("span", { className: "shrink-0 rounded bg-indigo-500/20 px-1.5 py-0.5 text-[10px] font-semibold text-indigo-300", children: a.subagentType }),
1298
- a.model && /* @__PURE__ */ jsx("span", { className: "shrink-0 rounded bg-gray-800 px-1.5 py-0.5 text-[10px] font-mono text-gray-400", children: a.model.replace(/^claude-/, "").replace(/-\d{8}$/, "") }),
1299
- /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate text-xs text-gray-400", children: a.description }),
1300
- /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [
1301
- tokenCount != null && tokenCount > 0 && /* @__PURE__ */ jsx("span", { className: "text-[10px] font-mono text-indigo-400/80", children: formatTokenCount(tokenCount) }),
1302
- agentCost != null && agentCost > 0 && /* @__PURE__ */ jsxs("span", { className: "text-[10px] font-mono text-emerald-400/80", children: [
1303
- "~",
1304
- formatUSD(agentCost)
1305
- ] }),
1306
- a.totalToolUseCount != null && /* @__PURE__ */ jsxs("span", { className: "text-[10px] text-gray-500", children: [
1307
- a.totalToolUseCount,
1308
- " tools"
1309
- ] }),
1310
- a.durationMs != null && /* @__PURE__ */ jsx("span", { className: "text-[10px] text-gray-600", children: formatDuration(a.durationMs) }),
1311
- a.timestamp && /* @__PURE__ */ jsx("span", { className: "text-[10px] text-gray-600", children: format(new Date(a.timestamp), "HH:mm:ss") })
1312
- ] })
1313
- ]
1314
- },
1315
- `a-${i}`
1316
- );
1317
- })
1270
+ ] })
1318
1271
  ] }),
1319
- skills.length > 0 && /* @__PURE__ */ jsxs("div", { className: "mt-3 space-y-1", children: [
1320
- /* @__PURE__ */ jsx("p", { className: "mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-gray-500", children: "Skill Invocations" }),
1321
- skills.map((s, i) => /* @__PURE__ */ jsxs(
1322
- "div",
1323
- {
1324
- className: "flex items-start gap-2 rounded bg-gray-950/40 px-2 py-1.5",
1325
- children: [
1326
- /* @__PURE__ */ jsxs("span", { className: "shrink-0 rounded bg-amber-500/20 px-1.5 py-0.5 text-[10px] font-semibold text-amber-300", children: [
1327
- "/",
1328
- s.skill
1329
- ] }),
1330
- s.args && /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate text-xs font-mono text-gray-500", children: s.args }),
1331
- s.timestamp && /* @__PURE__ */ jsx("span", { className: "ml-auto shrink-0 text-[10px] text-gray-600", children: format(new Date(s.timestamp), "HH:mm:ss") })
1332
- ]
1333
- },
1334
- `s-${i}`
1335
- ))
1336
- ] })
1272
+ /* @__PURE__ */ jsx("div", { className: "mt-3 space-y-1", children: agents.map((a, i) => {
1273
+ const tokenCount = a.totalTokens ?? computeAgentTokens(a);
1274
+ const agentCost = agentCosts.get(i);
1275
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-2 rounded bg-gray-950/40 px-2 py-1.5", children: [
1276
+ /* @__PURE__ */ jsx("span", { className: "shrink-0 rounded bg-indigo-500/20 px-1.5 py-0.5 text-[10px] font-semibold text-indigo-300", children: a.subagentType }),
1277
+ a.model && /* @__PURE__ */ jsx("span", { className: "shrink-0 rounded bg-gray-800 px-1.5 py-0.5 text-[10px] font-mono text-gray-400", children: a.model.replace(/^claude-/, "").replace(/-\d{8}$/, "") }),
1278
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate text-xs text-gray-400", children: a.description }),
1279
+ /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [
1280
+ tokenCount != null && tokenCount > 0 && /* @__PURE__ */ jsx("span", { className: "text-[10px] font-mono text-indigo-400/80", children: formatTokenCount(tokenCount) }),
1281
+ agentCost != null && agentCost > 0 && /* @__PURE__ */ jsxs("span", { className: "text-[10px] font-mono text-emerald-400/80", children: [
1282
+ "~",
1283
+ formatUSD(agentCost)
1284
+ ] }),
1285
+ a.totalToolUseCount != null && /* @__PURE__ */ jsxs("span", { className: "text-[10px] text-gray-500", children: [
1286
+ a.totalToolUseCount,
1287
+ " tools"
1288
+ ] }),
1289
+ a.durationMs != null && /* @__PURE__ */ jsx("span", { className: "text-[10px] text-gray-600", children: formatDuration(a.durationMs) }),
1290
+ a.timestamp && /* @__PURE__ */ jsx("span", { className: "text-[10px] text-gray-600", children: format(new Date(a.timestamp), "HH:mm:ss") })
1291
+ ] })
1292
+ ] }, `a-${i}`);
1293
+ }) })
1337
1294
  ] });
1338
1295
  }
1339
- function computeAgentTokens(agent) {
1340
- if (!agent.tokens) return void 0;
1341
- return agent.tokens.inputTokens + agent.tokens.outputTokens;
1296
+ function SkillInvocationsPanel({
1297
+ agents,
1298
+ skills
1299
+ }) {
1300
+ const { groups, totalCount } = useMemo(() => {
1301
+ const allSkills = [
1302
+ ...skills.map((s) => ({ ...s, agentSource: null })),
1303
+ ...agents.flatMap(
1304
+ (a) => (a.skills ?? []).map((s) => ({ ...s, agentSource: a.subagentType }))
1305
+ )
1306
+ ].sort((a, b) => a.timestamp.localeCompare(b.timestamp));
1307
+ const groupMap = /* @__PURE__ */ new Map();
1308
+ for (const s of allSkills) {
1309
+ let group = groupMap.get(s.skill);
1310
+ if (!group) {
1311
+ group = { skill: s.skill, count: 0, hasInjected: false, invocations: [] };
1312
+ groupMap.set(s.skill, group);
1313
+ }
1314
+ group.count++;
1315
+ if (s.source === "injected") group.hasInjected = true;
1316
+ group.invocations.push({
1317
+ agentSource: s.agentSource,
1318
+ timestamp: s.timestamp,
1319
+ source: s.source
1320
+ });
1321
+ }
1322
+ return { groups: Array.from(groupMap.values()), totalCount: allSkills.length };
1323
+ }, [skills, agents]);
1324
+ if (totalCount === 0) return null;
1325
+ return /* @__PURE__ */ jsxs("div", { className: "rounded-xl border border-gray-800 bg-gray-900/50 p-4", children: [
1326
+ /* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold text-gray-300", children: "Skill Invocations" }),
1327
+ /* @__PURE__ */ jsxs("p", { className: "mt-1 text-xs text-gray-500", children: [
1328
+ groups.length,
1329
+ " unique skill",
1330
+ groups.length !== 1 ? "s" : "",
1331
+ ",",
1332
+ " ",
1333
+ totalCount,
1334
+ " invocation",
1335
+ totalCount !== 1 ? "s" : ""
1336
+ ] }),
1337
+ /* @__PURE__ */ jsx("div", { className: "mt-3 space-y-1", children: groups.map((group) => /* @__PURE__ */ jsxs("div", { className: "rounded bg-gray-950/40 px-2 py-1.5", children: [
1338
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
1339
+ /* @__PURE__ */ jsxs("span", { className: "shrink-0 rounded bg-amber-500/20 px-1.5 py-0.5 text-[10px] font-semibold text-amber-300", children: [
1340
+ "/",
1341
+ group.skill
1342
+ ] }),
1343
+ /* @__PURE__ */ jsxs("span", { className: "text-[10px] text-gray-500", children: [
1344
+ "×",
1345
+ group.count
1346
+ ] }),
1347
+ group.hasInjected && /* @__PURE__ */ jsx("span", { className: "shrink-0 rounded bg-gray-800/40 px-1 py-0.5 text-[9px] text-gray-500", children: "context" })
1348
+ ] }),
1349
+ /* @__PURE__ */ jsx("div", { className: "mt-1 ml-2 flex flex-wrap gap-x-1 text-[10px] text-gray-500", children: group.invocations.map((inv, j) => /* @__PURE__ */ jsxs("span", { children: [
1350
+ /* @__PURE__ */ jsx("span", { className: "text-gray-400", children: inv.agentSource ?? "session" }),
1351
+ ", ",
1352
+ /* @__PURE__ */ jsx("span", { className: "text-gray-600", children: format(new Date(inv.timestamp), "HH:mm:ss") }),
1353
+ j < group.invocations.length - 1 && /* @__PURE__ */ jsx("span", { className: "text-gray-700", children: "; " })
1354
+ ] }, j)) })
1355
+ ] }, group.skill)) })
1356
+ ] });
1342
1357
  }
1343
1358
  const statusConfig = {
1344
1359
  pending: { label: "Pending", bg: "bg-gray-500/20", text: "text-gray-400" },
1345
1360
  in_progress: {
1346
1361
  label: "In Progress",
1347
- bg: "bg-blue-500/20",
1348
- text: "text-blue-400"
1362
+ bg: "bg-brand-500/20",
1363
+ text: "text-brand-400"
1349
1364
  },
1350
1365
  completed: {
1351
1366
  label: "Done",
@@ -1439,7 +1454,7 @@ function CostEstimationPanel({ tokensByModel }) {
1439
1454
  }
1440
1455
  function CategoryBreakdown({ cost }) {
1441
1456
  const categories = [
1442
- { label: "Input tokens", value: cost.byCategory.input, color: "text-blue-400" },
1457
+ { label: "Input tokens", value: cost.byCategory.input, color: "text-brand-400" },
1443
1458
  { label: "Output tokens", value: cost.byCategory.output, color: "text-emerald-400" },
1444
1459
  { label: "Cache read", value: cost.byCategory.cacheRead, color: "text-amber-400" },
1445
1460
  { label: "Cache write", value: cost.byCategory.cacheWrite, color: "text-purple-400" }
@@ -1452,7 +1467,7 @@ function CategoryBreakdown({ cost }) {
1452
1467
  function CostBar({ cost }) {
1453
1468
  if (cost.totalUSD === 0) return null;
1454
1469
  const segments = [
1455
- { key: "input", value: cost.byCategory.input, color: "bg-blue-400" },
1470
+ { key: "input", value: cost.byCategory.input, color: "bg-brand-400" },
1456
1471
  { key: "output", value: cost.byCategory.output, color: "bg-emerald-400" },
1457
1472
  { key: "cacheRead", value: cost.byCategory.cacheRead, color: "bg-amber-400" },
1458
1473
  { key: "cacheWrite", value: cost.byCategory.cacheWrite, color: "bg-purple-400" }
@@ -1513,10 +1528,10 @@ function CostSummaryLine({ tokensByModel }) {
1513
1528
  );
1514
1529
  }
1515
1530
  function ActiveSessionBanner() {
1516
- return /* @__PURE__ */ jsxs("div", { className: "mb-4 flex items-center gap-2 rounded-lg border border-green-800 bg-green-900/30 px-4 py-2 text-sm text-green-300", children: [
1531
+ return /* @__PURE__ */ jsxs("div", { className: "mb-4 flex items-center gap-2 rounded-lg border border-emerald-800 bg-emerald-900/30 px-4 py-2 text-sm text-emerald-300", children: [
1517
1532
  /* @__PURE__ */ jsxs("span", { className: "relative flex h-2 w-2", children: [
1518
- /* @__PURE__ */ jsx("span", { className: "absolute inline-flex h-full w-full animate-ping rounded-full bg-green-400 opacity-75" }),
1519
- /* @__PURE__ */ jsx("span", { className: "relative inline-flex h-2 w-2 rounded-full bg-green-500" })
1533
+ /* @__PURE__ */ jsx("span", { className: "absolute inline-flex h-full w-full animate-ping rounded-full bg-emerald-400 opacity-75" }),
1534
+ /* @__PURE__ */ jsx("span", { className: "relative inline-flex h-2 w-2 rounded-full bg-emerald-500" })
1520
1535
  ] }),
1521
1536
  "This session is currently active. Data refreshes automatically."
1522
1537
  ] });
@@ -1534,7 +1549,8 @@ function SessionDetailPage() {
1534
1549
  } = Route.useSearch();
1535
1550
  const {
1536
1551
  privacyMode,
1537
- anonymizeProjectName
1552
+ anonymizeProjectName,
1553
+ anonymizeBranch
1538
1554
  } = usePrivacy();
1539
1555
  const isActive = useIsSessionActive(sessionId);
1540
1556
  const {
@@ -1554,7 +1570,7 @@ function SessionDetailPage() {
1554
1570
  "Failed to load session: ",
1555
1571
  error?.message ?? "Not found"
1556
1572
  ] }),
1557
- /* @__PURE__ */ jsx(Link, { to: "/sessions", className: "mt-2 inline-block text-sm text-blue-400 hover:underline", children: "Back to sessions" })
1573
+ /* @__PURE__ */ jsx(Link, { to: "/sessions", className: "mt-2 inline-block text-sm text-brand-300 hover:underline", children: "Back to sessions" })
1558
1574
  ] });
1559
1575
  }
1560
1576
  const startedAt = detail.turns[0]?.timestamp;
@@ -1567,7 +1583,7 @@ function SessionDetailPage() {
1567
1583
  /* @__PURE__ */ jsx(Link, { to: "/sessions", className: "text-xs text-gray-500 hover:text-gray-300", children: "← Sessions" }),
1568
1584
  /* @__PURE__ */ jsx("h1", { className: "mt-1 text-xl font-bold text-white", children: privacyMode ? anonymizeProjectName(detail.projectName) : detail.projectName }),
1569
1585
  /* @__PURE__ */ jsxs("div", { className: "mt-1 flex items-center gap-3 text-xs text-gray-400", children: [
1570
- detail.branch && /* @__PURE__ */ jsx("span", { className: "font-mono", children: detail.branch }),
1586
+ detail.branch && /* @__PURE__ */ jsx("span", { className: "font-mono", children: anonymizeBranch(detail.branch) }),
1571
1587
  startedAt && /* @__PURE__ */ jsx("span", { children: formatDateTime(startedAt) }),
1572
1588
  /* @__PURE__ */ jsx("span", { children: formatDuration(durationMs) }),
1573
1589
  /* @__PURE__ */ jsxs("span", { children: [
@@ -1591,13 +1607,14 @@ function SessionDetailPage() {
1591
1607
  /* @__PURE__ */ jsx(ToolUsagePanel, { toolFrequency: detail.toolFrequency })
1592
1608
  ] }),
1593
1609
  /* @__PURE__ */ jsx("div", { className: "mt-4", children: /* @__PURE__ */ jsx(CostEstimationPanel, { tokensByModel: detail.tokensByModel }) }),
1594
- (detail.agents.length > 0 || detail.skills.length > 0) && /* @__PURE__ */ jsx("div", { className: "mt-4", children: /* @__PURE__ */ jsx(AgentsSkillsPanel, { agents: detail.agents, skills: detail.skills }) }),
1610
+ detail.agents.length > 0 && /* @__PURE__ */ jsx("div", { className: "mt-4", children: /* @__PURE__ */ jsx(AgentDispatchesPanel, { agents: detail.agents }) }),
1595
1611
  detail.tasks.length > 0 && /* @__PURE__ */ jsx("div", { className: "mt-4", children: /* @__PURE__ */ jsx(TasksPanel, { tasks: detail.tasks }) }),
1596
- /* @__PURE__ */ jsx(ErrorPanel, { errors: detail.errors }),
1612
+ /* @__PURE__ */ jsx("div", { className: "mt-4", children: /* @__PURE__ */ jsx(ErrorPanel, { errors: detail.errors }) }),
1597
1613
  /* @__PURE__ */ jsxs("div", { className: "mt-6", children: [
1598
1614
  /* @__PURE__ */ jsx("h2", { className: "mb-3 text-sm font-semibold text-gray-300", children: "Timeline" }),
1599
1615
  /* @__PURE__ */ jsx(TimelineEventsChart, { turns: detail.turns, agents: detail.agents, skills: detail.skills, errors: detail.errors })
1600
- ] })
1616
+ ] }),
1617
+ (detail.skills.length > 0 || detail.agents.some((a) => (a.skills?.length ?? 0) > 0)) && /* @__PURE__ */ jsx("div", { className: "mt-6", children: /* @__PURE__ */ jsx(SkillInvocationsPanel, { agents: detail.agents, skills: detail.skills }) })
1601
1618
  ] });
1602
1619
  }
1603
1620
  export {
@@ -0,0 +1,4 @@
1
+ const tsrStartManifest = () => ({ "routes": { "__root__": { "filePath": "/home/runner/work/claude-session-dashboard/claude-session-dashboard/apps/web/src/routes/__root.tsx", "children": ["/", "/_dashboard"], "preloads": ["/assets/main-CkUc_xJ0.js"], "assets": [] }, "/": { "filePath": "/home/runner/work/claude-session-dashboard/claude-session-dashboard/apps/web/src/routes/index.tsx" }, "/_dashboard": { "filePath": "/home/runner/work/claude-session-dashboard/claude-session-dashboard/apps/web/src/routes/_dashboard.tsx", "children": ["/_dashboard/settings", "/_dashboard/stats", "/_dashboard/sessions/$sessionId", "/_dashboard/sessions/"], "assets": [], "preloads": ["/assets/_dashboard-C-1YOzkf.js", "/assets/createServerFn-B5mibSc4.js", "/assets/sessions.queries-C-HTNzuR.js"] }, "/_dashboard/settings": { "filePath": "/home/runner/work/claude-session-dashboard/claude-session-dashboard/apps/web/src/routes/_dashboard/settings.tsx", "assets": [], "preloads": ["/assets/settings-D56cUmNH.js", "/assets/settings.types-l5MKKuAK.js"] }, "/_dashboard/stats": { "filePath": "/home/runner/work/claude-session-dashboard/claude-session-dashboard/apps/web/src/routes/_dashboard/stats.tsx", "assets": [], "preloads": ["/assets/stats-BunIdzj_.js", "/assets/format-Bsprb3az.js", "/assets/useSessionCost-BDldLkTA.js", "/assets/settings.types-l5MKKuAK.js"] }, "/_dashboard/sessions/$sessionId": { "filePath": "/home/runner/work/claude-session-dashboard/claude-session-dashboard/apps/web/src/routes/_dashboard/sessions/$sessionId.tsx", "assets": [], "preloads": ["/assets/_sessionId-C4jQeEqE.js", "/assets/format-Bsprb3az.js", "/assets/useSessionCost-BDldLkTA.js", "/assets/settings.types-l5MKKuAK.js"] }, "/_dashboard/sessions/": { "filePath": "/home/runner/work/claude-session-dashboard/claude-session-dashboard/apps/web/src/routes/_dashboard/sessions/index.tsx", "assets": [], "preloads": ["/assets/index-C83jHUdL.js", "/assets/format-Bsprb3az.js"] } }, "clientEntry": "/assets/main-CkUc_xJ0.js" });
2
+ export {
3
+ tsrStartManifest
4
+ };
@@ -23,9 +23,9 @@ function extractSessionId(filename) {
23
23
  return filename.replace(/\.jsonl$/, "");
24
24
  }
25
25
  export {
26
- getProjectsDir as a,
26
+ getStatsPath as a,
27
27
  extractSessionId as b,
28
28
  decodeProjectDirName as d,
29
29
  extractProjectName as e,
30
- getStatsPath as g
30
+ getProjectsDir as g
31
31
  };