tokmon 0.12.4 → 0.12.6

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 (2) hide show
  1. package/dist/cli.js +31 -44
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -642,13 +642,15 @@ function App({ interval: cliInterval }) {
642
642
  });
643
643
  }, []);
644
644
  const billingMs = cfg.billingInterval * 6e4;
645
- const dataSlots = cfg.accounts.length > 0 ? slots.slice(1) : slots;
646
- const dataSlotsKey = dataSlots.map((s) => s.id ?? "__default__").join(",");
645
+ const configReady = config2 !== null;
646
+ const accountsKey = cfg.accounts.map((a) => `${a.id}:${a.homeDir}`).join("|");
647
+ const dataSlotsRef = useRef([]);
648
+ dataSlotsRef.current = cfg.accounts.length > 0 ? slots.slice(1) : slots;
647
649
  useEffect(() => {
648
- if (!config2) return;
650
+ if (!configReady) return;
649
651
  let active = true;
650
652
  const load = async () => {
651
- await Promise.all(dataSlots.map(async (slot) => {
653
+ await Promise.all(dataSlotsRef.current.map(async (slot) => {
652
654
  try {
653
655
  const dashboard = await fetchDashboard(tz, slot.homeDir);
654
656
  if (!active) return;
@@ -673,12 +675,12 @@ function App({ interval: cliInterval }) {
673
675
  active = false;
674
676
  clearInterval(id);
675
677
  };
676
- }, [interval2, tz, config2, dataSlotsKey]);
678
+ }, [interval2, tz, configReady, accountsKey]);
677
679
  useEffect(() => {
678
- if (!config2) return;
680
+ if (!configReady) return;
679
681
  let active = true;
680
682
  const load = async () => {
681
- await Promise.all(dataSlots.map(async (slot) => {
683
+ await Promise.all(dataSlotsRef.current.map(async (slot) => {
682
684
  try {
683
685
  const billing = await fetchBilling(slot.homeDir);
684
686
  if (!active) return;
@@ -698,7 +700,7 @@ function App({ interval: cliInterval }) {
698
700
  active = false;
699
701
  clearInterval(id);
700
702
  };
701
- }, [billingMs, config2, dataSlotsKey]);
703
+ }, [billingMs, configReady, accountsKey]);
702
704
  useEffect(() => {
703
705
  tableLoadedOnce.current = false;
704
706
  setTable(null);
@@ -1155,14 +1157,13 @@ function App({ interval: cliInterval }) {
1155
1157
  activeAccountId: cfg.activeAccountId
1156
1158
  }
1157
1159
  ) : /* @__PURE__ */ jsxs(Fragment, { children: [
1158
- /* @__PURE__ */ jsxs(Box, { marginTop: 1, children: [
1160
+ /* @__PURE__ */ jsxs(Box, { marginTop: 1, marginBottom: 1, children: [
1159
1161
  /* @__PURE__ */ jsx(TabBar, { tabs: TABS, active: tab, onSelect: (i) => {
1160
1162
  setTab(i);
1161
1163
  resetView();
1162
1164
  } }),
1163
1165
  /* @__PURE__ */ jsx(Text, { dimColor: true, children: " Tab/\u2190\u2192" })
1164
1166
  ] }),
1165
- /* @__PURE__ */ jsx(Box, { height: 1 }),
1166
1167
  tab === 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
1167
1168
  /* @__PURE__ */ jsx(
1168
1169
  DashboardView,
@@ -1172,9 +1173,9 @@ function App({ interval: cliInterval }) {
1172
1173
  compact: visibleSlots.length > 1
1173
1174
  }
1174
1175
  ),
1175
- slots.length > 1 && /* @__PURE__ */ jsxs(Box, { marginTop: 1, flexDirection: "column", children: [
1176
- /* @__PURE__ */ jsx(Text, { bold: true, children: "Accounts" }),
1177
- /* @__PURE__ */ jsx(Box, { marginTop: 0, children: /* @__PURE__ */ jsx(
1176
+ slots.length > 1 && /* @__PURE__ */ jsxs(Box, { marginTop: 1, children: [
1177
+ /* @__PURE__ */ jsx(Text, { dimColor: true, children: "focus " }),
1178
+ /* @__PURE__ */ jsx(
1178
1179
  AccountStrip,
1179
1180
  {
1180
1181
  slots,
@@ -1185,7 +1186,7 @@ function App({ interval: cliInterval }) {
1185
1186
  resetView();
1186
1187
  }
1187
1188
  }
1188
- ) })
1189
+ )
1189
1190
  ] })
1190
1191
  ] }),
1191
1192
  tab === 1 && /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -1239,12 +1240,13 @@ function AccountStrip({ slots, activeIdx, onSelect }) {
1239
1240
  return /* @__PURE__ */ jsx(Box, { flexWrap: "wrap", children: slots.map((s, i) => {
1240
1241
  const active = i === activeIdx;
1241
1242
  const dot = s.id === null ? "\u2726" : "\u25CF";
1243
+ const label = truncateName(s.name, 16);
1242
1244
  return /* @__PURE__ */ jsxs(ClickableBox, { onClick: () => onSelect(i), marginRight: 2, children: [
1243
1245
  /* @__PURE__ */ jsx(Text, { dimColor: !active, children: i }),
1244
1246
  /* @__PURE__ */ jsx(Text, { children: " " }),
1245
1247
  /* @__PURE__ */ jsx(Text, { color: s.color, bold: active, dimColor: !active, children: dot }),
1246
1248
  /* @__PURE__ */ jsx(Text, { children: " " }),
1247
- active ? /* @__PURE__ */ jsx(Text, { bold: true, color: s.color, children: s.name }) : /* @__PURE__ */ jsx(Text, { dimColor: true, children: s.name })
1249
+ active ? /* @__PURE__ */ jsx(Text, { bold: true, color: s.color, children: label }) : /* @__PURE__ */ jsx(Text, { dimColor: true, children: label })
1248
1250
  ] }, s.id ?? "__all__");
1249
1251
  }) });
1250
1252
  }
@@ -1389,9 +1391,11 @@ function SettingsView({
1389
1391
  isActive ? "\u25CF" : "\u25CB",
1390
1392
  " "
1391
1393
  ] }),
1392
- /* @__PURE__ */ jsx(Box, { width: 16, children: /* @__PURE__ */ jsx(Text, { bold: true, children: acc.name }) }),
1393
- /* @__PURE__ */ jsx(Box, { width: 14, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: acc.id }) }),
1394
- /* @__PURE__ */ jsx(Text, { dimColor: true, children: acc.homeDir })
1394
+ /* @__PURE__ */ jsx(Text, { bold: true, children: truncateName(acc.name, 24) }),
1395
+ /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
1396
+ " ",
1397
+ truncateName(acc.homeDir, 28)
1398
+ ] })
1395
1399
  ] }, acc.id);
1396
1400
  }),
1397
1401
  /* @__PURE__ */ jsxs(Box, { children: [
@@ -1600,19 +1604,7 @@ function DashboardView({ slots, stats, compact: _compact }) {
1600
1604
  borderTop: false,
1601
1605
  borderBottom: false,
1602
1606
  children: [
1603
- /* @__PURE__ */ jsxs(Box, { children: [
1604
- /* @__PURE__ */ jsx(Text, { bold: true, children: "Claude" }),
1605
- isMulti && /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
1606
- " all accounts (",
1607
- items.length,
1608
- ")"
1609
- ] }),
1610
- !isMulti && items[0].slot.id && /* @__PURE__ */ jsxs(Fragment, { children: [
1611
- /* @__PURE__ */ jsx(Text, { dimColor: true, children: " " }),
1612
- /* @__PURE__ */ jsx(Text, { color: items[0].slot.color, children: "\u25CF " }),
1613
- /* @__PURE__ */ jsx(Text, { dimColor: true, children: items[0].slot.name })
1614
- ] })
1615
- ] }),
1607
+ /* @__PURE__ */ jsx(Text, { bold: true, children: "Claude" }),
1616
1608
  /* @__PURE__ */ jsx(Box, { height: 1 }),
1617
1609
  /* @__PURE__ */ jsx(SummaryRow, { label: "Today", summary: agg.today }),
1618
1610
  /* @__PURE__ */ jsx(SummaryRow, { label: "This Week", summary: agg.week }),
@@ -1682,11 +1674,13 @@ function RateLimitsCard({ items }) {
1682
1674
  /* @__PURE__ */ jsx(Box, { width: 22, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: truncateName(slot.name, 20) }) }),
1683
1675
  /* @__PURE__ */ jsx(Text, { color: "red", children: s.billing.error })
1684
1676
  ] }, slot.id ?? "__default__")) }) : /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Fetching..." }) : /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
1685
- /* @__PURE__ */ jsx(MetricBlock, { label: "Total Usage", sublabel: "5h session", pick: (b) => b?.session, items, showResets: true }),
1686
- /* @__PURE__ */ jsx(MetricBlock, { label: "This Week", sublabel: "7-day", pick: (b) => b?.weekly, items, showResets: true }),
1687
- /* @__PURE__ */ jsx(MetricBlock, { label: "Sonnet", sublabel: "7-day sonnet", pick: (b) => b?.sonnet, items }),
1677
+ /* @__PURE__ */ jsx(MetricBlock, { label: "5h", pick: (b) => b?.session, items, showResets: true }),
1678
+ /* @__PURE__ */ jsx(Box, { height: 1 }),
1679
+ /* @__PURE__ */ jsx(MetricBlock, { label: "Week", pick: (b) => b?.weekly, items, showResets: true }),
1680
+ /* @__PURE__ */ jsx(Box, { height: 1 }),
1681
+ /* @__PURE__ */ jsx(MetricBlock, { label: "Sonnet", pick: (b) => b?.sonnet, items }),
1688
1682
  items.some((i) => i.s.billing?.extraUsage) && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginTop: 1, children: [
1689
- /* @__PURE__ */ jsx(Text, { bold: true, dimColor: true, children: "Extra Usage" }),
1683
+ /* @__PURE__ */ jsx(Text, { bold: true, dimColor: true, children: "Extra" }),
1690
1684
  items.map(({ slot, s }) => {
1691
1685
  const e = s.billing?.extraUsage;
1692
1686
  if (!e) return null;
@@ -1713,7 +1707,6 @@ function RateLimitsCard({ items }) {
1713
1707
  }
1714
1708
  function MetricBlock({
1715
1709
  label,
1716
- sublabel,
1717
1710
  pick,
1718
1711
  items,
1719
1712
  showResets
@@ -1724,14 +1717,8 @@ function MetricBlock({
1724
1717
  error: i.s.billing?.error ?? null
1725
1718
  }));
1726
1719
  if (rows.every((r) => r.lim === null && !r.error)) return null;
1727
- return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [
1728
- /* @__PURE__ */ jsxs(Box, { children: [
1729
- /* @__PURE__ */ jsx(Text, { bold: true, children: label }),
1730
- /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
1731
- " ",
1732
- sublabel
1733
- ] })
1734
- ] }),
1720
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
1721
+ /* @__PURE__ */ jsx(Text, { bold: true, children: label }),
1735
1722
  rows.map(({ slot, lim, error }) => {
1736
1723
  if (lim) {
1737
1724
  return /* @__PURE__ */ jsx(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tokmon",
3
- "version": "0.12.4",
3
+ "version": "0.12.6",
4
4
  "description": "Terminal dashboard for Claude Code usage and costs",
5
5
  "type": "module",
6
6
  "bin": {