tokmon 0.12.0 → 0.12.2

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 +184 -167
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -988,14 +988,12 @@ function App({ interval: cliInterval }) {
988
988
  resetView();
989
989
  return;
990
990
  }
991
- if (input === "1") {
992
- setTab(0);
993
- resetView();
994
- return;
995
- }
996
- if (input === "2") {
997
- setTab(1);
998
- resetView();
991
+ if (input && /^[0-9]$/.test(input) && slots.length > 1) {
992
+ const target = slots[parseInt(input, 10)];
993
+ if (target) {
994
+ updateConfig((c) => ({ ...c, activeAccountId: target.id }));
995
+ resetView();
996
+ }
999
997
  return;
1000
998
  }
1001
999
  if (tab === 1) {
@@ -1165,7 +1163,7 @@ function Footer({ hasAccounts }) {
1165
1163
  /* @__PURE__ */ jsx(Text, { dimColor: true, children: " (" }),
1166
1164
  /* @__PURE__ */ jsx(Text, { color: "cyan", children: "davidilie.com" }),
1167
1165
  /* @__PURE__ */ jsx(Text, { dimColor: true, children: ") \xB7 s=settings " }),
1168
- hasAccounts && /* @__PURE__ */ jsx(Text, { dimColor: true, children: "a/A=cycle account " }),
1166
+ hasAccounts && /* @__PURE__ */ jsx(Text, { dimColor: true, children: "0-9=jump a/A=cycle " }),
1169
1167
  /* @__PURE__ */ jsx(Text, { dimColor: true, children: "q=quit" })
1170
1168
  ] });
1171
1169
  }
@@ -1181,28 +1179,17 @@ function TabBar({ tabs, active, onSelect }) {
1181
1179
  ] }) }, t)) });
1182
1180
  }
1183
1181
  function AccountStrip({ slots, activeIdx, onSelect }) {
1184
- return /* @__PURE__ */ jsxs(Box, { children: [
1185
- /* @__PURE__ */ jsx(Text, { dimColor: true, children: "account " }),
1186
- slots.map((s, i) => {
1187
- const active = i === activeIdx;
1188
- const dot = s.id === null ? "\u2726" : "\u25CF";
1189
- return /* @__PURE__ */ jsx(ClickableBox, { onClick: () => onSelect(i), marginRight: 2, children: active ? /* @__PURE__ */ jsxs(Text, { bold: true, color: s.color, children: [
1190
- /* @__PURE__ */ jsxs(Text, { children: [
1191
- dot,
1192
- " "
1193
- ] }),
1194
- /* @__PURE__ */ jsxs(Text, { inverse: true, children: [
1195
- " ",
1196
- s.name,
1197
- " "
1198
- ] })
1199
- ] }) : /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
1200
- dot,
1201
- " ",
1202
- s.name
1203
- ] }) }, s.id ?? "__all__");
1204
- })
1205
- ] });
1182
+ return /* @__PURE__ */ jsx(Box, { flexWrap: "wrap", children: slots.map((s, i) => {
1183
+ const active = i === activeIdx;
1184
+ const dot = s.id === null ? "\u2726" : "\u25CF";
1185
+ return /* @__PURE__ */ jsxs(ClickableBox, { onClick: () => onSelect(i), marginRight: 2, children: [
1186
+ /* @__PURE__ */ jsx(Text, { dimColor: !active, children: i }),
1187
+ /* @__PURE__ */ jsx(Text, { children: " " }),
1188
+ /* @__PURE__ */ jsx(Text, { color: s.color, bold: active, dimColor: !active, children: dot }),
1189
+ /* @__PURE__ */ jsx(Text, { children: " " }),
1190
+ active ? /* @__PURE__ */ jsx(Text, { bold: true, color: s.color, children: s.name }) : /* @__PURE__ */ jsx(Text, { dimColor: true, children: s.name })
1191
+ ] }, s.id ?? "__all__");
1192
+ }) });
1206
1193
  }
1207
1194
  function ViewBar({ views, active, sort, onSelect }) {
1208
1195
  return /* @__PURE__ */ jsxs(Box, { children: [
@@ -1538,114 +1525,183 @@ function ColorField({ value, focused }) {
1538
1525
  /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: " shows on dashboard, account strip, borders" }) })
1539
1526
  ] });
1540
1527
  }
1541
- function DashboardView({ slots, stats, compact }) {
1528
+ function DashboardView({ slots, stats, compact: _compact }) {
1542
1529
  const slotKey = (s) => s.id ?? "__default__";
1543
- return /* @__PURE__ */ jsx(Box, { flexDirection: "column", children: slots.map((slot, i) => {
1544
- const s = stats.get(slotKey(slot));
1545
- if (!s?.dashboard) {
1546
- return /* @__PURE__ */ jsxs(Box, { children: [
1547
- /* @__PURE__ */ jsxs(Text, { color: slot.color, bold: true, children: [
1548
- "\u25CF ",
1549
- slot.name,
1550
- " "
1551
- ] }),
1552
- /* @__PURE__ */ jsx(Text, { dimColor: true, children: "loading..." })
1553
- ] }, slotKey(slot));
1554
- }
1555
- return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
1556
- /* @__PURE__ */ jsx(
1557
- AccountCard,
1558
- {
1559
- slot,
1560
- dashboard: s.dashboard,
1561
- billing: s.billing,
1562
- compact
1563
- }
1564
- ),
1565
- i < slots.length - 1 && /* @__PURE__ */ jsx(Box, { height: 1 })
1566
- ] }, slotKey(slot));
1567
- }) });
1568
- }
1569
- function AccountCard({ slot, dashboard, billing, compact }) {
1530
+ const items = slots.map((slot) => ({ slot, s: stats.get(slotKey(slot)) })).filter((x) => !!x.s?.dashboard);
1531
+ if (items.length === 0) return /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Loading..." });
1532
+ const agg = aggregateUsage(items.map((i) => i.s.dashboard));
1533
+ const isMulti = items.length > 1;
1570
1534
  return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
1571
- /* @__PURE__ */ jsxs(Box, { children: [
1572
- /* @__PURE__ */ jsxs(Text, { color: slot.color, bold: true, children: [
1573
- "\u25CF ",
1574
- slot.name
1575
- ] }),
1576
- slot.id && /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
1577
- " ",
1578
- slot.id
1579
- ] })
1580
- ] }),
1581
- /* @__PURE__ */ jsxs(Box, { flexDirection: compact ? "row" : "column", marginTop: compact ? 0 : 0, children: [
1582
- /* @__PURE__ */ jsxs(
1583
- Box,
1584
- {
1585
- flexDirection: "column",
1586
- paddingLeft: 1,
1587
- marginRight: compact ? 2 : 0,
1588
- borderStyle: "bold",
1589
- borderColor: slot.color,
1590
- borderRight: false,
1591
- borderTop: false,
1592
- borderBottom: false,
1593
- children: [
1594
- /* @__PURE__ */ jsx(Text, { bold: true, children: "Usage" }),
1595
- !compact && /* @__PURE__ */ jsx(Box, { height: 1 }),
1596
- /* @__PURE__ */ jsx(SummaryRow, { label: "Today", summary: dashboard.today, compact }),
1597
- /* @__PURE__ */ jsx(SummaryRow, { label: compact ? "Week" : "This Week", summary: dashboard.week, compact }),
1598
- /* @__PURE__ */ jsx(SummaryRow, { label: compact ? "Month" : "This Month", summary: dashboard.month, compact }),
1599
- dashboard.burnRate > 0 && !compact && /* @__PURE__ */ jsxs(Fragment, { children: [
1600
- /* @__PURE__ */ jsx(Box, { height: 1 }),
1601
- /* @__PURE__ */ jsxs(Box, { children: [
1602
- /* @__PURE__ */ jsx(Box, { width: 14, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Burn rate" }) }),
1603
- /* @__PURE__ */ jsx(Box, { width: 12, justifyContent: "flex-end", children: /* @__PURE__ */ jsx(Text, { color: "red", children: currency(dashboard.burnRate) }) }),
1604
- /* @__PURE__ */ jsx(Text, { dimColor: true, children: "/hr" })
1605
- ] })
1535
+ /* @__PURE__ */ jsxs(
1536
+ Box,
1537
+ {
1538
+ flexDirection: "column",
1539
+ paddingLeft: 1,
1540
+ borderStyle: "bold",
1541
+ borderColor: isMulti ? "green" : items[0].slot.color,
1542
+ borderRight: false,
1543
+ borderTop: false,
1544
+ borderBottom: false,
1545
+ children: [
1546
+ /* @__PURE__ */ jsxs(Box, { children: [
1547
+ /* @__PURE__ */ jsx(Text, { bold: true, children: "Claude" }),
1548
+ isMulti && /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
1549
+ " all accounts (",
1550
+ items.length,
1551
+ ")"
1606
1552
  ] }),
1607
- dashboard.burnRate > 0 && compact && /* @__PURE__ */ jsxs(Box, { children: [
1608
- /* @__PURE__ */ jsx(Box, { width: 10, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Burn" }) }),
1609
- /* @__PURE__ */ jsx(Text, { color: "red", children: currency(dashboard.burnRate) }),
1553
+ !isMulti && items[0].slot.id && /* @__PURE__ */ jsxs(Fragment, { children: [
1554
+ /* @__PURE__ */ jsx(Text, { dimColor: true, children: " " }),
1555
+ /* @__PURE__ */ jsx(Text, { color: items[0].slot.color, children: "\u25CF " }),
1556
+ /* @__PURE__ */ jsx(Text, { dimColor: true, children: items[0].slot.name })
1557
+ ] })
1558
+ ] }),
1559
+ /* @__PURE__ */ jsx(Box, { height: 1 }),
1560
+ /* @__PURE__ */ jsx(SummaryRow, { label: "Today", summary: agg.today }),
1561
+ /* @__PURE__ */ jsx(SummaryRow, { label: "This Week", summary: agg.week }),
1562
+ /* @__PURE__ */ jsx(SummaryRow, { label: "This Month", summary: agg.month }),
1563
+ agg.burnRate > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
1564
+ /* @__PURE__ */ jsx(Box, { height: 1 }),
1565
+ /* @__PURE__ */ jsxs(Box, { children: [
1566
+ /* @__PURE__ */ jsx(Box, { width: 14, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Burn rate" }) }),
1567
+ /* @__PURE__ */ jsx(Box, { width: 12, justifyContent: "flex-end", children: /* @__PURE__ */ jsx(Text, { color: "red", children: currency(agg.burnRate) }) }),
1610
1568
  /* @__PURE__ */ jsx(Text, { dimColor: true, children: "/hr" })
1611
1569
  ] })
1612
- ]
1613
- }
1614
- ),
1615
- !compact && /* @__PURE__ */ jsx(Box, { height: 1 }),
1616
- /* @__PURE__ */ jsxs(
1617
- Box,
1618
- {
1619
- flexDirection: "column",
1620
- paddingLeft: 1,
1621
- borderStyle: "bold",
1622
- borderColor: billing?.error ? "red" : "yellow",
1623
- borderRight: false,
1624
- borderTop: false,
1625
- borderBottom: false,
1626
- children: [
1627
- /* @__PURE__ */ jsx(Text, { bold: true, children: "Rate Limits" }),
1628
- !compact && /* @__PURE__ */ jsx(Box, { height: 1 }),
1629
- billing?.error ? /* @__PURE__ */ jsx(Text, { color: "red", children: billing.error }) : billing?.session || billing?.weekly ? /* @__PURE__ */ jsxs(Fragment, { children: [
1630
- billing.session && /* @__PURE__ */ jsx(LimitBar, { label: "Session", pct: billing.session.utilization, resets: billing.session.resetsAt, compact }),
1631
- billing.weekly && /* @__PURE__ */ jsx(LimitBar, { label: "Weekly", pct: billing.weekly.utilization, resets: billing.weekly.resetsAt, compact }),
1632
- billing.sonnet && /* @__PURE__ */ jsx(LimitBar, { label: "Sonnet", pct: billing.sonnet.utilization, resets: billing.sonnet.resetsAt, compact }),
1633
- billing.extraUsage && /* @__PURE__ */ jsxs(Box, { children: [
1634
- /* @__PURE__ */ jsx(Box, { width: 10, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Extra" }) }),
1570
+ ] })
1571
+ ]
1572
+ }
1573
+ ),
1574
+ /* @__PURE__ */ jsx(Box, { height: 1 }),
1575
+ /* @__PURE__ */ jsx(RateLimitsCard, { items })
1576
+ ] });
1577
+ }
1578
+ function aggregateUsage(list) {
1579
+ const z = {
1580
+ today: { cost: 0, tokens: 0 },
1581
+ week: { cost: 0, tokens: 0 },
1582
+ month: { cost: 0, tokens: 0 },
1583
+ burnRate: 0
1584
+ };
1585
+ for (const d of list) {
1586
+ z.today.cost += d.today.cost;
1587
+ z.today.tokens += d.today.tokens;
1588
+ z.week.cost += d.week.cost;
1589
+ z.week.tokens += d.week.tokens;
1590
+ z.month.cost += d.month.cost;
1591
+ z.month.tokens += d.month.tokens;
1592
+ z.burnRate += d.burnRate;
1593
+ }
1594
+ return z;
1595
+ }
1596
+ function SummaryRow({ label, summary }) {
1597
+ return /* @__PURE__ */ jsxs(Box, { children: [
1598
+ /* @__PURE__ */ jsx(Box, { width: 14, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: label }) }),
1599
+ /* @__PURE__ */ jsx(Box, { width: 12, justifyContent: "flex-end", children: /* @__PURE__ */ jsx(Text, { bold: true, color: "yellow", children: currency(summary.cost) }) }),
1600
+ /* @__PURE__ */ jsx(Box, { width: 18, justifyContent: "flex-end", children: /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
1601
+ tokens(summary.tokens),
1602
+ " tokens"
1603
+ ] }) })
1604
+ ] });
1605
+ }
1606
+ function RateLimitsCard({ items }) {
1607
+ const anyData = items.some((i) => i.s.billing?.session || i.s.billing?.weekly || i.s.billing?.sonnet);
1608
+ const anyError = items.some((i) => i.s.billing?.error);
1609
+ const borderColor = !anyData && anyError ? "red" : "yellow";
1610
+ return /* @__PURE__ */ jsxs(
1611
+ Box,
1612
+ {
1613
+ flexDirection: "column",
1614
+ paddingLeft: 1,
1615
+ borderStyle: "bold",
1616
+ borderColor,
1617
+ borderRight: false,
1618
+ borderTop: false,
1619
+ borderBottom: false,
1620
+ children: [
1621
+ /* @__PURE__ */ jsx(Text, { bold: true, children: "Rate Limits" }),
1622
+ /* @__PURE__ */ jsx(Box, { height: 1 }),
1623
+ !anyData ? anyError ? /* @__PURE__ */ jsx(Box, { flexDirection: "column", children: items.map(({ slot, s }) => s.billing?.error && /* @__PURE__ */ jsxs(Box, { children: [
1624
+ /* @__PURE__ */ jsx(Text, { color: slot.color, children: "\u25CF " }),
1625
+ /* @__PURE__ */ jsx(Box, { width: 12, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: slot.name }) }),
1626
+ /* @__PURE__ */ jsx(Text, { color: "red", children: s.billing.error })
1627
+ ] }, slot.id ?? "__default__")) }) : /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Fetching..." }) : /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
1628
+ /* @__PURE__ */ jsx(MetricBlock, { label: "Total Usage", sublabel: "5h session", pick: (b) => b?.session, items, showResets: true }),
1629
+ /* @__PURE__ */ jsx(MetricBlock, { label: "This Week", sublabel: "7-day", pick: (b) => b?.weekly, items, showResets: true }),
1630
+ /* @__PURE__ */ jsx(MetricBlock, { label: "Sonnet", sublabel: "7-day sonnet", pick: (b) => b?.sonnet, items }),
1631
+ items.some((i) => i.s.billing?.extraUsage) && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginTop: 1, children: [
1632
+ /* @__PURE__ */ jsx(Text, { bold: true, dimColor: true, children: "Extra Usage" }),
1633
+ items.map(({ slot, s }) => {
1634
+ const e = s.billing?.extraUsage;
1635
+ if (!e) return null;
1636
+ return /* @__PURE__ */ jsxs(Box, { children: [
1637
+ /* @__PURE__ */ jsx(Text, { color: slot.color, children: "\u25CF " }),
1638
+ /* @__PURE__ */ jsx(Box, { width: 12, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: slot.name }) }),
1635
1639
  /* @__PURE__ */ jsxs(Text, { color: "yellow", children: [
1636
1640
  "$",
1637
- billing.extraUsage.used.toFixed(2)
1641
+ e.used.toFixed(2)
1638
1642
  ] }),
1639
1643
  /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
1640
1644
  " / $",
1641
- billing.extraUsage.limit.toFixed(2),
1642
- " limit"
1645
+ e.limit.toFixed(2)
1643
1646
  ] })
1644
- ] })
1645
- ] }) : /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Fetching..." })
1646
- ]
1647
- }
1648
- )
1647
+ ] }, slot.id ?? "__default__");
1648
+ })
1649
+ ] })
1650
+ ] })
1651
+ ]
1652
+ }
1653
+ );
1654
+ }
1655
+ function MetricBlock({
1656
+ label,
1657
+ sublabel,
1658
+ pick,
1659
+ items,
1660
+ showResets
1661
+ }) {
1662
+ const rows = items.map((i) => ({ slot: i.slot, lim: pick(i.s.billing) ?? null })).filter((r) => r.lim !== null);
1663
+ if (rows.length === 0) return null;
1664
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [
1665
+ /* @__PURE__ */ jsxs(Box, { children: [
1666
+ /* @__PURE__ */ jsx(Text, { bold: true, children: label }),
1667
+ /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
1668
+ " ",
1669
+ sublabel
1670
+ ] })
1671
+ ] }),
1672
+ rows.map(({ slot, lim }) => /* @__PURE__ */ jsx(
1673
+ AccountLimitBar,
1674
+ {
1675
+ slot,
1676
+ pct: lim.utilization,
1677
+ resets: showResets ? lim.resetsAt : null,
1678
+ showName: items.length > 1
1679
+ },
1680
+ slot.id ?? "__default__"
1681
+ ))
1682
+ ] });
1683
+ }
1684
+ function AccountLimitBar({
1685
+ slot,
1686
+ pct,
1687
+ resets,
1688
+ showName
1689
+ }) {
1690
+ const width = 28;
1691
+ const filled = Math.max(0, Math.min(width, Math.round(pct / 100 * width)));
1692
+ return /* @__PURE__ */ jsxs(Box, { children: [
1693
+ /* @__PURE__ */ jsx(Text, { color: slot.color, children: "\u25CF " }),
1694
+ showName ? /* @__PURE__ */ jsx(Box, { width: 12, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: slot.name }) }) : /* @__PURE__ */ jsx(Box, { width: 2, children: /* @__PURE__ */ jsx(Text, { children: " " }) }),
1695
+ /* @__PURE__ */ jsx(Text, { color: slot.color, children: "\u2501".repeat(filled) }),
1696
+ /* @__PURE__ */ jsx(Text, { dimColor: true, children: "\u2500".repeat(width - filled) }),
1697
+ /* @__PURE__ */ jsx(Text, { children: " " }),
1698
+ /* @__PURE__ */ jsx(Box, { width: 5, justifyContent: "flex-end", children: /* @__PURE__ */ jsxs(Text, { bold: true, children: [
1699
+ Math.round(pct),
1700
+ "%"
1701
+ ] }) }),
1702
+ resets && /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
1703
+ " resets ",
1704
+ resets
1649
1705
  ] })
1650
1706
  ] });
1651
1707
  }
@@ -1667,45 +1723,6 @@ function fmtMinutes(mins) {
1667
1723
  const m = mins % 60;
1668
1724
  return m === 0 ? `${h}h` : `${h}h ${m}m`;
1669
1725
  }
1670
- function LimitBar({ label, pct, resets, compact }) {
1671
- const width = compact ? 16 : 30;
1672
- const filled = Math.round(pct / 100 * width);
1673
- const color = pct >= 80 ? "red" : pct >= 50 ? "yellow" : "green";
1674
- return /* @__PURE__ */ jsxs(Box, { children: [
1675
- /* @__PURE__ */ jsx(Box, { width: 10, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: label }) }),
1676
- /* @__PURE__ */ jsx(Text, { color, children: "\u2501".repeat(filled) }),
1677
- /* @__PURE__ */ jsx(Text, { dimColor: true, children: "\u2500".repeat(width - filled) }),
1678
- /* @__PURE__ */ jsx(Text, { children: " " }),
1679
- /* @__PURE__ */ jsxs(Text, { bold: true, children: [
1680
- Math.round(pct),
1681
- "%"
1682
- ] }),
1683
- !compact && /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
1684
- " resets ",
1685
- resets
1686
- ] })
1687
- ] });
1688
- }
1689
- function SummaryRow({ label, summary, compact }) {
1690
- if (compact) {
1691
- return /* @__PURE__ */ jsxs(Box, { children: [
1692
- /* @__PURE__ */ jsx(Box, { width: 10, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: label }) }),
1693
- /* @__PURE__ */ jsx(Box, { width: 10, justifyContent: "flex-end", children: /* @__PURE__ */ jsx(Text, { bold: true, color: "yellow", children: currency(summary.cost) }) }),
1694
- /* @__PURE__ */ jsx(Box, { width: 14, justifyContent: "flex-end", children: /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
1695
- tokens(summary.tokens),
1696
- " tk"
1697
- ] }) })
1698
- ] });
1699
- }
1700
- return /* @__PURE__ */ jsxs(Box, { children: [
1701
- /* @__PURE__ */ jsx(Box, { width: 14, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: label }) }),
1702
- /* @__PURE__ */ jsx(Box, { width: 12, justifyContent: "flex-end", children: /* @__PURE__ */ jsx(Text, { bold: true, color: "yellow", children: currency(summary.cost) }) }),
1703
- /* @__PURE__ */ jsx(Box, { width: 18, justifyContent: "flex-end", children: /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
1704
- tokens(summary.tokens),
1705
- " tokens"
1706
- ] }) })
1707
- ] });
1708
- }
1709
1726
  function TableView({ rows: allRows, cursor, expanded, maxRows, cols, onRowClick }) {
1710
1727
  const wide = cols > 90;
1711
1728
  const base = wide ? { label: 12, input: 10, output: 10, cc: 14, cr: 12, total: 11, cost: 13 } : { label: 8, input: 7, output: 7, cc: 7, cr: 8, total: 0, cost: 11 };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tokmon",
3
- "version": "0.12.0",
3
+ "version": "0.12.2",
4
4
  "description": "Terminal dashboard for Claude Code usage and costs",
5
5
  "type": "module",
6
6
  "bin": {