@tokscale/cli 1.4.3 → 2.0.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.
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +128 -0
- package/dist/index.js.map +1 -0
- package/package.json +19 -26
- package/dist/auth.d.ts +0 -17
- package/dist/auth.d.ts.map +0 -1
- package/dist/auth.js +0 -162
- package/dist/auth.js.map +0 -1
- package/dist/cli.d.ts +0 -9
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -1550
- package/dist/cli.js.map +0 -1
- package/dist/credentials.d.ts +0 -50
- package/dist/credentials.d.ts.map +0 -1
- package/dist/credentials.js +0 -151
- package/dist/credentials.js.map +0 -1
- package/dist/cursor.d.ts +0 -167
- package/dist/cursor.d.ts.map +0 -1
- package/dist/cursor.js +0 -906
- package/dist/cursor.js.map +0 -1
- package/dist/date-utils.d.ts +0 -10
- package/dist/date-utils.d.ts.map +0 -1
- package/dist/date-utils.js +0 -47
- package/dist/date-utils.js.map +0 -1
- package/dist/graph-types.d.ts +0 -142
- package/dist/graph-types.d.ts.map +0 -1
- package/dist/graph-types.js +0 -6
- package/dist/graph-types.js.map +0 -1
- package/dist/native-runner.d.ts +0 -11
- package/dist/native-runner.d.ts.map +0 -1
- package/dist/native-runner.js +0 -77
- package/dist/native-runner.js.map +0 -1
- package/dist/native.d.ts +0 -106
- package/dist/native.d.ts.map +0 -1
- package/dist/native.js +0 -302
- package/dist/native.js.map +0 -1
- package/dist/sessions/types.d.ts +0 -28
- package/dist/sessions/types.d.ts.map +0 -1
- package/dist/sessions/types.js +0 -27
- package/dist/sessions/types.js.map +0 -1
- package/dist/spinner.d.ts +0 -75
- package/dist/spinner.d.ts.map +0 -1
- package/dist/spinner.js +0 -203
- package/dist/spinner.js.map +0 -1
- package/dist/submit.d.ts +0 -23
- package/dist/submit.d.ts.map +0 -1
- package/dist/submit.js +0 -294
- package/dist/submit.js.map +0 -1
- package/dist/table.d.ts +0 -42
- package/dist/table.d.ts.map +0 -1
- package/dist/table.js +0 -181
- package/dist/table.js.map +0 -1
- package/dist/tui/App.d.ts +0 -4
- package/dist/tui/App.d.ts.map +0 -1
- package/dist/tui/App.js +0 -333
- package/dist/tui/App.js.map +0 -1
- package/dist/tui/components/BarChart.d.ts +0 -17
- package/dist/tui/components/BarChart.d.ts.map +0 -1
- package/dist/tui/components/BarChart.js +0 -146
- package/dist/tui/components/BarChart.js.map +0 -1
- package/dist/tui/components/DailyView.d.ts +0 -13
- package/dist/tui/components/DailyView.d.ts.map +0 -1
- package/dist/tui/components/DailyView.js +0 -86
- package/dist/tui/components/DailyView.js.map +0 -1
- package/dist/tui/components/DateBreakdownPanel.d.ts +0 -7
- package/dist/tui/components/DateBreakdownPanel.d.ts.map +0 -1
- package/dist/tui/components/DateBreakdownPanel.js +0 -36
- package/dist/tui/components/DateBreakdownPanel.js.map +0 -1
- package/dist/tui/components/Footer.d.ts +0 -28
- package/dist/tui/components/Footer.d.ts.map +0 -1
- package/dist/tui/components/Footer.js +0 -130
- package/dist/tui/components/Footer.js.map +0 -1
- package/dist/tui/components/Header.d.ts +0 -9
- package/dist/tui/components/Header.d.ts.map +0 -1
- package/dist/tui/components/Header.js +0 -20
- package/dist/tui/components/Header.js.map +0 -1
- package/dist/tui/components/Legend.d.ts +0 -7
- package/dist/tui/components/Legend.d.ts.map +0 -1
- package/dist/tui/components/Legend.js +0 -16
- package/dist/tui/components/Legend.js.map +0 -1
- package/dist/tui/components/LoadingSpinner.d.ts +0 -8
- package/dist/tui/components/LoadingSpinner.d.ts.map +0 -1
- package/dist/tui/components/LoadingSpinner.js +0 -55
- package/dist/tui/components/LoadingSpinner.js.map +0 -1
- package/dist/tui/components/ModelRow.d.ts +0 -13
- package/dist/tui/components/ModelRow.d.ts.map +0 -1
- package/dist/tui/components/ModelRow.js +0 -15
- package/dist/tui/components/ModelRow.js.map +0 -1
- package/dist/tui/components/ModelView.d.ts +0 -13
- package/dist/tui/components/ModelView.d.ts.map +0 -1
- package/dist/tui/components/ModelView.js +0 -96
- package/dist/tui/components/ModelView.js.map +0 -1
- package/dist/tui/components/OverviewView.d.ts +0 -14
- package/dist/tui/components/OverviewView.d.ts.map +0 -1
- package/dist/tui/components/OverviewView.js +0 -65
- package/dist/tui/components/OverviewView.js.map +0 -1
- package/dist/tui/components/StatsView.d.ts +0 -14
- package/dist/tui/components/StatsView.d.ts.map +0 -1
- package/dist/tui/components/StatsView.js +0 -102
- package/dist/tui/components/StatsView.js.map +0 -1
- package/dist/tui/components/TokenBreakdown.d.ts +0 -14
- package/dist/tui/components/TokenBreakdown.d.ts.map +0 -1
- package/dist/tui/components/TokenBreakdown.js +0 -10
- package/dist/tui/components/TokenBreakdown.js.map +0 -1
- package/dist/tui/components/index.d.ts +0 -16
- package/dist/tui/components/index.d.ts.map +0 -1
- package/dist/tui/components/index.js +0 -13
- package/dist/tui/components/index.js.map +0 -1
- package/dist/tui/config/settings.d.ts +0 -15
- package/dist/tui/config/settings.d.ts.map +0 -1
- package/dist/tui/config/settings.js +0 -147
- package/dist/tui/config/settings.js.map +0 -1
- package/dist/tui/config/themes.d.ts +0 -15
- package/dist/tui/config/themes.d.ts.map +0 -1
- package/dist/tui/config/themes.js +0 -82
- package/dist/tui/config/themes.js.map +0 -1
- package/dist/tui/hooks/useData.d.ts +0 -19
- package/dist/tui/hooks/useData.d.ts.map +0 -1
- package/dist/tui/hooks/useData.js +0 -468
- package/dist/tui/hooks/useData.js.map +0 -1
- package/dist/tui/index.d.ts +0 -4
- package/dist/tui/index.d.ts.map +0 -1
- package/dist/tui/index.js +0 -36
- package/dist/tui/index.js.map +0 -1
- package/dist/tui/types/index.d.ts +0 -137
- package/dist/tui/types/index.d.ts.map +0 -1
- package/dist/tui/types/index.js +0 -26
- package/dist/tui/types/index.js.map +0 -1
- package/dist/tui/utils/cleanup.d.ts +0 -22
- package/dist/tui/utils/cleanup.d.ts.map +0 -1
- package/dist/tui/utils/cleanup.js +0 -59
- package/dist/tui/utils/cleanup.js.map +0 -1
- package/dist/tui/utils/colors.d.ts +0 -19
- package/dist/tui/utils/colors.d.ts.map +0 -1
- package/dist/tui/utils/colors.js +0 -71
- package/dist/tui/utils/colors.js.map +0 -1
- package/dist/tui/utils/format.d.ts +0 -7
- package/dist/tui/utils/format.d.ts.map +0 -1
- package/dist/tui/utils/format.js +0 -45
- package/dist/tui/utils/format.js.map +0 -1
- package/dist/tui/utils/responsive.d.ts +0 -5
- package/dist/tui/utils/responsive.d.ts.map +0 -1
- package/dist/tui/utils/responsive.js +0 -5
- package/dist/tui/utils/responsive.js.map +0 -1
- package/dist/wrapped.d.ts +0 -43
- package/dist/wrapped.d.ts.map +0 -1
- package/dist/wrapped.js +0 -719
- package/dist/wrapped.js.map +0 -1
- package/src/auth.ts +0 -211
- package/src/cli.ts +0 -1892
- package/src/credentials.ts +0 -176
- package/src/cursor.ts +0 -1044
- package/src/date-utils.ts +0 -51
- package/src/graph-types.ts +0 -175
- package/src/native-runner.js +0 -4
- package/src/native-runner.ts +0 -91
- package/src/native.ts +0 -633
- package/src/sessions/types.ts +0 -59
- package/src/spinner.ts +0 -283
- package/src/submit.ts +0 -360
- package/src/table.ts +0 -233
- package/src/tui/App.tsx +0 -453
- package/src/tui/components/BarChart.tsx +0 -205
- package/src/tui/components/DailyView.tsx +0 -132
- package/src/tui/components/DateBreakdownPanel.tsx +0 -79
- package/src/tui/components/Footer.tsx +0 -380
- package/src/tui/components/Header.tsx +0 -68
- package/src/tui/components/Legend.tsx +0 -39
- package/src/tui/components/LoadingSpinner.tsx +0 -81
- package/src/tui/components/ModelRow.tsx +0 -47
- package/src/tui/components/ModelView.tsx +0 -147
- package/src/tui/components/OverviewView.tsx +0 -121
- package/src/tui/components/StatsView.tsx +0 -249
- package/src/tui/components/TokenBreakdown.tsx +0 -46
- package/src/tui/components/index.ts +0 -15
- package/src/tui/config/settings.ts +0 -183
- package/src/tui/config/themes.ts +0 -115
- package/src/tui/hooks/useData.ts +0 -558
- package/src/tui/index.tsx +0 -44
- package/src/tui/opentui.d.ts +0 -166
- package/src/tui/types/index.ts +0 -173
- package/src/tui/utils/cleanup.ts +0 -65
- package/src/tui/utils/colors.ts +0 -78
- package/src/tui/utils/format.ts +0 -36
- package/src/tui/utils/responsive.ts +0 -8
- package/src/types.d.ts +0 -28
- package/src/wrapped.ts +0 -848
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "@opentui/solid/jsx-runtime";
|
|
2
|
-
import { For, createMemo } from "solid-js";
|
|
3
|
-
import { getModelColor, getSourceDisplayName } from "../utils/colors.js";
|
|
4
|
-
import { formatTokensCompact, formatCostFull } from "../utils/format.js";
|
|
5
|
-
import { isNarrow, isVeryNarrow } from "../utils/responsive.js";
|
|
6
|
-
const STRIPE_BG = "#232328";
|
|
7
|
-
const INPUT_COL_WIDTH = 12;
|
|
8
|
-
const OUTPUT_COL_WIDTH = 12;
|
|
9
|
-
const CACHE_READ_COL_WIDTH = 10;
|
|
10
|
-
const CACHE_WRITE_COL_WIDTH = 10;
|
|
11
|
-
const TOTAL_COL_WIDTH = 14;
|
|
12
|
-
const COST_COL_WIDTH = 12;
|
|
13
|
-
const METRIC_COLUMNS_WIDTH_FULL = INPUT_COL_WIDTH + OUTPUT_COL_WIDTH + CACHE_READ_COL_WIDTH + CACHE_WRITE_COL_WIDTH + TOTAL_COL_WIDTH + COST_COL_WIDTH;
|
|
14
|
-
const METRIC_COLUMNS_WIDTH_NARROW = TOTAL_COL_WIDTH + COST_COL_WIDTH;
|
|
15
|
-
const SIDE_PADDING = 2;
|
|
16
|
-
const MIN_NAME_COLUMN = 16;
|
|
17
|
-
const MIN_NAME_COLUMN_NARROW = 12;
|
|
18
|
-
export function ModelView(props) {
|
|
19
|
-
const sortedEntries = createMemo(() => {
|
|
20
|
-
const entries = props.data.modelEntries;
|
|
21
|
-
const sortBy = props.sortBy;
|
|
22
|
-
const sortDesc = props.sortDesc;
|
|
23
|
-
return [...entries].sort((a, b) => {
|
|
24
|
-
let cmp = 0;
|
|
25
|
-
if (sortBy === "cost")
|
|
26
|
-
cmp = a.cost - b.cost;
|
|
27
|
-
else if (sortBy === "tokens")
|
|
28
|
-
cmp = a.total - b.total;
|
|
29
|
-
else
|
|
30
|
-
cmp = a.model.localeCompare(b.model);
|
|
31
|
-
return sortDesc ? -cmp : cmp;
|
|
32
|
-
});
|
|
33
|
-
});
|
|
34
|
-
const isNarrowTerminal = () => isNarrow(props.width);
|
|
35
|
-
const isVeryNarrowTerminal = () => isVeryNarrow(props.width);
|
|
36
|
-
const nameColumnWidths = createMemo(() => {
|
|
37
|
-
const metricWidth = isNarrowTerminal() ? METRIC_COLUMNS_WIDTH_NARROW : METRIC_COLUMNS_WIDTH_FULL;
|
|
38
|
-
const minName = isNarrowTerminal() ? MIN_NAME_COLUMN_NARROW : MIN_NAME_COLUMN;
|
|
39
|
-
const available = Math.max(props.width - SIDE_PADDING - metricWidth, minName);
|
|
40
|
-
const nameColumn = Math.max(minName, available);
|
|
41
|
-
return {
|
|
42
|
-
column: nameColumn,
|
|
43
|
-
text: Math.max(nameColumn - 1, 1),
|
|
44
|
-
};
|
|
45
|
-
});
|
|
46
|
-
const visibleEntries = createMemo(() => {
|
|
47
|
-
const maxRows = Math.max(props.height - 3, 0);
|
|
48
|
-
return sortedEntries().slice(0, maxRows);
|
|
49
|
-
});
|
|
50
|
-
const formattedRows = createMemo(() => {
|
|
51
|
-
const nameWidth = nameColumnWidths().text;
|
|
52
|
-
return visibleEntries().map((entry) => {
|
|
53
|
-
const sourceLabel = getSourceDisplayName(entry.source);
|
|
54
|
-
const fullName = `${sourceLabel} ${entry.model}`;
|
|
55
|
-
let displayName = fullName;
|
|
56
|
-
if (fullName.length > nameWidth) {
|
|
57
|
-
displayName = nameWidth > 1 ? `${fullName.slice(0, nameWidth - 1)}…` : fullName.slice(0, 1);
|
|
58
|
-
}
|
|
59
|
-
return {
|
|
60
|
-
entry,
|
|
61
|
-
displayName,
|
|
62
|
-
nameWidth,
|
|
63
|
-
input: formatTokensCompact(entry.input),
|
|
64
|
-
output: formatTokensCompact(entry.output),
|
|
65
|
-
cacheRead: formatTokensCompact(entry.cacheRead),
|
|
66
|
-
cacheWrite: formatTokensCompact(entry.cacheWrite),
|
|
67
|
-
total: formatTokensCompact(entry.total),
|
|
68
|
-
cost: formatCostFull(entry.cost),
|
|
69
|
-
};
|
|
70
|
-
});
|
|
71
|
-
});
|
|
72
|
-
const sortArrow = () => (props.sortDesc ? "▼" : "▲");
|
|
73
|
-
const nameHeader = () => isVeryNarrowTerminal()
|
|
74
|
-
? ` Model`
|
|
75
|
-
: ` Source/Model`;
|
|
76
|
-
const totalHeader = () => (props.sortBy === "tokens" ? `${sortArrow()} Total` : "Total");
|
|
77
|
-
const costHeader = () => (props.sortBy === "cost" ? `${sortArrow()} Cost` : "Cost");
|
|
78
|
-
const renderHeader = () => {
|
|
79
|
-
if (isNarrowTerminal()) {
|
|
80
|
-
return `${nameHeader().padEnd(nameColumnWidths().column)}${totalHeader().padStart(TOTAL_COL_WIDTH)}${costHeader().padStart(COST_COL_WIDTH)}`;
|
|
81
|
-
}
|
|
82
|
-
return `${nameHeader().padEnd(nameColumnWidths().column)}${"Input".padStart(INPUT_COL_WIDTH)}${"Output".padStart(OUTPUT_COL_WIDTH)}${"C.Read".padStart(CACHE_READ_COL_WIDTH)}${"C.Write".padStart(CACHE_WRITE_COL_WIDTH)}${totalHeader().padStart(TOTAL_COL_WIDTH)}${costHeader().padStart(COST_COL_WIDTH)}`;
|
|
83
|
-
};
|
|
84
|
-
const renderRowData = (row) => {
|
|
85
|
-
if (isNarrowTerminal()) {
|
|
86
|
-
return `${row.displayName.padEnd(row.nameWidth)}${row.total.padStart(TOTAL_COL_WIDTH)}`;
|
|
87
|
-
}
|
|
88
|
-
return `${row.displayName.padEnd(row.nameWidth)}${row.input.padStart(INPUT_COL_WIDTH)}${row.output.padStart(OUTPUT_COL_WIDTH)}${row.cacheRead.padStart(CACHE_READ_COL_WIDTH)}${row.cacheWrite.padStart(CACHE_WRITE_COL_WIDTH)}${row.total.padStart(TOTAL_COL_WIDTH)}`;
|
|
89
|
-
};
|
|
90
|
-
return (_jsxs("box", { flexDirection: "column", children: [_jsx("box", { flexDirection: "row", children: _jsx("text", { fg: "cyan", bold: true, children: renderHeader() }) }), _jsx(For, { each: formattedRows(), children: (row, i) => {
|
|
91
|
-
const isActive = createMemo(() => i() === props.selectedIndex());
|
|
92
|
-
const rowBg = createMemo(() => isActive() ? "blue" : (i() % 2 === 1 ? STRIPE_BG : undefined));
|
|
93
|
-
return (_jsxs("box", { flexDirection: "row", children: [_jsx("text", { fg: getModelColor(row.entry.model), bg: rowBg(), children: "\u25CF" }), _jsx("text", { bg: rowBg(), fg: isActive() ? "white" : undefined, children: renderRowData(row) }), _jsx("text", { fg: "green", bg: rowBg(), children: row.cost.padStart(COST_COL_WIDTH) })] }));
|
|
94
|
-
} })] }));
|
|
95
|
-
}
|
|
96
|
-
//# sourceMappingURL=ModelView.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ModelView.js","sourceRoot":"","sources":["../../../src/tui/components/ModelView.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { type Accessor } from "solid-js";
|
|
2
|
-
import type { TUIData, SortType } from "../hooks/useData.js";
|
|
3
|
-
interface OverviewViewProps {
|
|
4
|
-
data: TUIData;
|
|
5
|
-
sortBy: SortType;
|
|
6
|
-
sortDesc: boolean;
|
|
7
|
-
selectedIndex: Accessor<number>;
|
|
8
|
-
scrollOffset: Accessor<number>;
|
|
9
|
-
height: number;
|
|
10
|
-
width: number;
|
|
11
|
-
}
|
|
12
|
-
export declare function OverviewView(props: OverviewViewProps): any;
|
|
13
|
-
export {};
|
|
14
|
-
//# sourceMappingURL=OverviewView.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"OverviewView.d.ts","sourceRoot":"","sources":["../../../src/tui/components/OverviewView.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAIhE,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAY7D,UAAU,iBAAiB;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,QAAQ,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,OA8FpD"}
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "@opentui/solid/jsx-runtime";
|
|
2
|
-
import { Show, For, createMemo } from "solid-js";
|
|
3
|
-
import { BarChart } from "./BarChart.js";
|
|
4
|
-
import { Legend } from "./Legend.js";
|
|
5
|
-
import { ModelRow } from "./ModelRow.js";
|
|
6
|
-
import { formatCost } from "../utils/format.js";
|
|
7
|
-
import { isNarrow, isVeryNarrow } from "../utils/responsive.js";
|
|
8
|
-
const CHART_MAX_DAYS = 60;
|
|
9
|
-
function getDateDaysAgo(days) {
|
|
10
|
-
const date = new Date();
|
|
11
|
-
date.setDate(date.getDate() - days);
|
|
12
|
-
return date.toISOString().split("T")[0];
|
|
13
|
-
}
|
|
14
|
-
export function OverviewView(props) {
|
|
15
|
-
const safeHeight = () => Math.max(props.height, 12);
|
|
16
|
-
const chartHeight = () => Math.max(5, Math.floor(safeHeight() * 0.35));
|
|
17
|
-
const listHeight = () => Math.max(4, safeHeight() - chartHeight() - 4);
|
|
18
|
-
const itemsPerPage = () => Math.max(1, Math.floor(listHeight() / 2));
|
|
19
|
-
const isNarrowTerminal = () => isNarrow(props.width);
|
|
20
|
-
const isVeryNarrowTerminal = () => isVeryNarrow(props.width);
|
|
21
|
-
const recentChartData = createMemo(() => {
|
|
22
|
-
const cutoffDate = getDateDaysAgo(CHART_MAX_DAYS);
|
|
23
|
-
return props.data.chartData.filter(d => d.date >= cutoffDate);
|
|
24
|
-
});
|
|
25
|
-
const legendModelLimit = () => isVeryNarrowTerminal() ? 3 : 5;
|
|
26
|
-
const topModelsForLegend = () => props.data.topModels.slice(0, legendModelLimit()).map(m => m.modelId);
|
|
27
|
-
const maxModelNameWidth = () => isVeryNarrowTerminal() ? 20 : isNarrowTerminal() ? 30 : 50;
|
|
28
|
-
const sortedModels = createMemo(() => {
|
|
29
|
-
const models = [...props.data.topModels];
|
|
30
|
-
return models.sort((a, b) => {
|
|
31
|
-
let cmp = 0;
|
|
32
|
-
if (props.sortBy === "cost")
|
|
33
|
-
cmp = a.cost - b.cost;
|
|
34
|
-
else if (props.sortBy === "tokens")
|
|
35
|
-
cmp = a.totalTokens - b.totalTokens;
|
|
36
|
-
return props.sortDesc ? -cmp : cmp;
|
|
37
|
-
});
|
|
38
|
-
});
|
|
39
|
-
const totalForPercentage = createMemo(() => {
|
|
40
|
-
const models = props.data.topModels;
|
|
41
|
-
if (props.sortBy === "tokens") {
|
|
42
|
-
return models.reduce((sum, m) => sum + m.totalTokens, 0) || 1;
|
|
43
|
-
}
|
|
44
|
-
return models.reduce((sum, m) => sum + m.cost, 0) || 1;
|
|
45
|
-
});
|
|
46
|
-
const getPercentage = (model) => {
|
|
47
|
-
if (props.sortBy === "tokens") {
|
|
48
|
-
return (model.totalTokens / totalForPercentage()) * 100;
|
|
49
|
-
}
|
|
50
|
-
return (model.cost / totalForPercentage()) * 100;
|
|
51
|
-
};
|
|
52
|
-
const visibleModels = () => sortedModels().slice(props.scrollOffset(), props.scrollOffset() + itemsPerPage());
|
|
53
|
-
const totalModels = () => sortedModels().length;
|
|
54
|
-
const endIndex = () => Math.min(props.scrollOffset() + visibleModels().length, totalModels());
|
|
55
|
-
return (_jsxs("box", { flexDirection: "column", gap: 1, children: [_jsxs("box", { flexDirection: "column", children: [_jsx(BarChart, { data: recentChartData(), width: props.width - 2, height: chartHeight() }), _jsx(Legend, { models: topModelsForLegend(), width: props.width })] }), _jsxs("box", { flexDirection: "column", children: [_jsxs("box", { flexDirection: "row", justifyContent: "space-between", marginBottom: 0, children: [_jsx("text", { bold: true, children: isVeryNarrowTerminal() ? "Top Models" : `Models by ${props.sortBy === "tokens" ? "Tokens" : "Cost"}` }), _jsxs("box", { flexDirection: "row", children: [_jsx("text", { dim: true, children: isVeryNarrowTerminal() ? "" : "Total: " }), _jsx("text", { fg: "green", children: formatCost(props.data.totalCost) })] })] }), _jsx("box", { flexDirection: "column", children: _jsx(For, { each: visibleModels(), children: (model, i) => {
|
|
56
|
-
const isActive = createMemo(() => i() === props.selectedIndex());
|
|
57
|
-
return (_jsx(ModelRow, { modelId: model.modelId, tokens: {
|
|
58
|
-
input: model.inputTokens,
|
|
59
|
-
output: model.outputTokens,
|
|
60
|
-
cacheRead: model.cacheReadTokens,
|
|
61
|
-
cacheWrite: model.cacheWriteTokens,
|
|
62
|
-
}, percentage: getPercentage(model), isActive: isActive(), compact: isVeryNarrowTerminal(), maxNameWidth: maxModelNameWidth() }));
|
|
63
|
-
} }) }), _jsx(Show, { when: totalModels() > visibleModels().length, children: _jsx("text", { dim: true, children: `↓ ${props.scrollOffset() + 1}-${endIndex()} of ${totalModels()} models (↑↓ to scroll)` }) })] })] }));
|
|
64
|
-
}
|
|
65
|
-
//# sourceMappingURL=OverviewView.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"OverviewView.js","sourceRoot":"","sources":["../../../src/tui/components/OverviewView.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { TUIData } from "../hooks/useData.js";
|
|
2
|
-
import type { ColorPaletteName } from "../config/themes.js";
|
|
3
|
-
import type { SortType } from "../types/index.js";
|
|
4
|
-
interface StatsViewProps {
|
|
5
|
-
data: TUIData;
|
|
6
|
-
height: number;
|
|
7
|
-
colorPalette: ColorPaletteName;
|
|
8
|
-
width?: number;
|
|
9
|
-
selectedDate?: string | null;
|
|
10
|
-
sortBy?: SortType;
|
|
11
|
-
}
|
|
12
|
-
export declare function StatsView(props: StatsViewProps): any;
|
|
13
|
-
export {};
|
|
14
|
-
//# sourceMappingURL=StatsView.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StatsView.d.ts","sourceRoot":"","sources":["../../../src/tui/components/StatsView.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,QAAQ,EAAY,MAAM,mBAAmB,CAAC;AAO5D,UAAU,cAAc;IACtB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,gBAAgB,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,CAAC,EAAE,QAAQ,CAAC;CACnB;AAWD,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,OA4N9C"}
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "@opentui/solid/jsx-runtime";
|
|
2
|
-
import { For, Show, createMemo, createSignal } from "solid-js";
|
|
3
|
-
import { getPalette, getGradeColor } from "../config/themes.js";
|
|
4
|
-
import { getModelColor } from "../utils/colors.js";
|
|
5
|
-
import { formatTokens } from "../utils/format.js";
|
|
6
|
-
import { isNarrow } from "../utils/responsive.js";
|
|
7
|
-
import { DateBreakdownPanel } from "./DateBreakdownPanel.js";
|
|
8
|
-
const MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
|
|
9
|
-
const MONTHS_SHORT = ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"];
|
|
10
|
-
const DAYS = ["", "Mon", "", "Wed", "", "Fri", ""];
|
|
11
|
-
export function StatsView(props) {
|
|
12
|
-
const palette = () => getPalette(props.colorPalette);
|
|
13
|
-
const isNarrowTerminal = () => isNarrow(props.width);
|
|
14
|
-
const metric = () => props.sortBy ?? "tokens";
|
|
15
|
-
const cellWidth = 2;
|
|
16
|
-
const grid = createMemo(() => {
|
|
17
|
-
const contributions = props.data.contributions;
|
|
18
|
-
const baseGrid = props.data.contributionGrid;
|
|
19
|
-
const values = contributions.map(c => metric() === "tokens" ? c.tokens : c.cost);
|
|
20
|
-
const maxValue = Math.max(1, ...values);
|
|
21
|
-
const levelMap = new Map();
|
|
22
|
-
for (const c of contributions) {
|
|
23
|
-
const value = metric() === "tokens" ? c.tokens : c.cost;
|
|
24
|
-
const level = value === 0 ? 0 : Math.min(4, Math.ceil((value / maxValue) * 4));
|
|
25
|
-
levelMap.set(c.date, level);
|
|
26
|
-
}
|
|
27
|
-
return baseGrid.map(row => row.map(cell => ({
|
|
28
|
-
date: cell.date,
|
|
29
|
-
level: cell.date ? (levelMap.get(cell.date) ?? 0) : 0,
|
|
30
|
-
})));
|
|
31
|
-
});
|
|
32
|
-
const [clickedCell, setClickedCell] = createSignal(null);
|
|
33
|
-
const selectedBreakdown = createMemo(() => {
|
|
34
|
-
const date = clickedCell();
|
|
35
|
-
if (!date)
|
|
36
|
-
return null;
|
|
37
|
-
if (!props.data.dailyBreakdowns)
|
|
38
|
-
return null;
|
|
39
|
-
if (!(props.data.dailyBreakdowns instanceof Map))
|
|
40
|
-
return null;
|
|
41
|
-
return props.data.dailyBreakdowns.get(date) || null;
|
|
42
|
-
});
|
|
43
|
-
const monthPositions = createMemo(() => {
|
|
44
|
-
const sundayRow = grid()[0] || [];
|
|
45
|
-
if (sundayRow.length === 0)
|
|
46
|
-
return [];
|
|
47
|
-
const positions = [];
|
|
48
|
-
let lastMonth = -1;
|
|
49
|
-
const monthNames = isNarrowTerminal() ? MONTHS_SHORT : MONTHS;
|
|
50
|
-
for (let weekIdx = 0; weekIdx < sundayRow.length; weekIdx++) {
|
|
51
|
-
const cell = sundayRow[weekIdx];
|
|
52
|
-
if (!cell.date)
|
|
53
|
-
continue;
|
|
54
|
-
const month = new Date(cell.date + "T00:00:00").getMonth();
|
|
55
|
-
if (month !== lastMonth) {
|
|
56
|
-
positions.push({ month: monthNames[month], weekIndex: weekIdx });
|
|
57
|
-
lastMonth = month;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
return positions;
|
|
61
|
-
});
|
|
62
|
-
const totalWeeks = createMemo(() => (grid()[0] || []).length);
|
|
63
|
-
const monthLabelRow = createMemo(() => {
|
|
64
|
-
const weeks = totalWeeks();
|
|
65
|
-
const positions = monthPositions();
|
|
66
|
-
const chars = new Array(weeks * cellWidth).fill(" ");
|
|
67
|
-
for (const pos of positions) {
|
|
68
|
-
const startIdx = pos.weekIndex * cellWidth;
|
|
69
|
-
const monthChars = pos.month.split("");
|
|
70
|
-
for (let i = 0; i < monthChars.length && startIdx + i < chars.length; i++) {
|
|
71
|
-
chars[startIdx + i] = monthChars[i];
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
return chars.join("");
|
|
75
|
-
});
|
|
76
|
-
const dayLabelWidth = () => isNarrowTerminal() ? 2 : 4;
|
|
77
|
-
const isSelected = (cellDate) => cellDate && (clickedCell() === cellDate || props.selectedDate === cellDate);
|
|
78
|
-
const getCellColor = (level) => level === 0 ? "#666666" : getGradeColor(palette(), level);
|
|
79
|
-
return (_jsxs("box", { flexDirection: "column", gap: 1, children: [_jsxs("box", { flexDirection: "column", children: [_jsxs("box", { flexDirection: "row", children: [_jsx("text", { dim: true, children: " ".repeat(dayLabelWidth()) }), _jsx("text", { dim: true, children: monthLabelRow() })] }), _jsx("box", { onMouseDown: (e) => {
|
|
80
|
-
const labelW = dayLabelWidth();
|
|
81
|
-
const col = Math.floor((e.x - labelW) / cellWidth);
|
|
82
|
-
const row = e.y - 2;
|
|
83
|
-
const gridRows = grid().length;
|
|
84
|
-
if (row < 0 || row >= gridRows) {
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
if (col < 0) {
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
const rowData = grid()[row];
|
|
91
|
-
if (!rowData || col >= rowData.length) {
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
const cell = rowData[col];
|
|
95
|
-
if (!cell?.date) {
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
const newDate = clickedCell() === cell.date ? null : cell.date;
|
|
99
|
-
setClickedCell(newDate);
|
|
100
|
-
}, children: _jsx(For, { each: DAYS, children: (day, dayIndex) => (_jsxs("box", { flexDirection: "row", children: [_jsx("text", { dim: true, children: isNarrowTerminal() ? " " : day.padStart(3) + " " }), _jsx(For, { each: grid()[dayIndex()] || [], children: (cell) => (_jsx("text", { fg: isSelected(cell.date) ? "#ffffff" : getCellColor(cell.level), bg: isSelected(cell.date) ? getCellColor(cell.level) : undefined, children: isSelected(cell.date) ? "▓▓" : (cell.level === 0 ? "· " : "██") })) })] })) }) })] }), _jsxs("box", { flexDirection: "row", gap: 2, marginTop: 1, children: [_jsx("text", { dim: true, children: "Less" }), _jsx("box", { flexDirection: "row", gap: 0, children: _jsx(For, { each: [0, 1, 2, 3, 4], children: (level) => (_jsx("text", { fg: level === 0 ? "#666666" : getGradeColor(palette(), level), children: level === 0 ? "· " : "██" })) }) }), _jsx("text", { dim: true, children: "More" }), _jsxs(Show, { when: !isNarrowTerminal(), children: [_jsx("text", { dim: true, children: "|" }), _jsx("text", { dim: true, children: "Click on a day to see breakdown" })] })] }), _jsx(Show, { when: selectedBreakdown(), children: _jsx(DateBreakdownPanel, { breakdown: selectedBreakdown(), isNarrow: isNarrowTerminal() }) }), _jsxs(Show, { when: !selectedBreakdown(), children: [_jsx("box", { flexDirection: "column", marginTop: 1, children: _jsxs("box", { flexDirection: isNarrowTerminal() ? "column" : "row", gap: isNarrowTerminal() ? 0 : 4, children: [_jsxs("box", { flexDirection: "column", children: [_jsxs("box", { flexDirection: "row", gap: 1, children: [_jsx("text", { dim: true, children: isNarrowTerminal() ? "Model:" : "Favorite model:" }), _jsx("text", { fg: getModelColor(props.data.stats.favoriteModel), children: props.data.stats.favoriteModel })] }), _jsxs("box", { flexDirection: "row", gap: 1, children: [_jsx("text", { dim: true, children: "Sessions:" }), _jsx("text", { fg: "cyan", children: props.data.stats.sessions.toLocaleString() })] }), _jsxs("box", { flexDirection: "row", gap: 1, children: [_jsx("text", { dim: true, children: isNarrowTerminal() ? "Streak:" : "Current streak:" }), _jsx("text", { fg: "cyan", children: `${props.data.stats.currentStreak} days` })] }), _jsxs("box", { flexDirection: "row", gap: 1, children: [_jsx("text", { dim: true, children: isNarrowTerminal() ? "Active:" : "Active days:" }), _jsx("text", { fg: "cyan", children: `${props.data.stats.activeDays}/${props.data.stats.totalDays}` })] })] }), _jsxs("box", { flexDirection: "column", children: [_jsxs("box", { flexDirection: "row", gap: 1, children: [_jsx("text", { dim: true, children: isNarrowTerminal() ? "Tokens:" : "Total tokens:" }), _jsx("text", { fg: "cyan", children: formatTokens(props.data.stats.totalTokens) })] }), _jsxs("box", { flexDirection: "row", gap: 1, children: [_jsx("text", { dim: true, children: isNarrowTerminal() ? "Session:" : "Longest session:" }), _jsx("text", { fg: "cyan", children: props.data.stats.longestSession })] }), _jsxs("box", { flexDirection: "row", gap: 1, children: [_jsx("text", { dim: true, children: isNarrowTerminal() ? "Max streak:" : "Longest streak:" }), _jsx("text", { fg: "cyan", children: `${props.data.stats.longestStreak} days` })] }), _jsxs("box", { flexDirection: "row", gap: 1, children: [_jsx("text", { dim: true, children: isNarrowTerminal() ? "Peak:" : "Peak hour:" }), _jsx("text", { fg: "cyan", children: props.data.stats.peakHour })] })] })] }) }), _jsx(Show, { when: !isNarrowTerminal(), children: _jsx("box", { marginTop: 1, children: _jsx("text", { fg: "yellow", italic: true, children: `Your total spending is $${props.data.totalCost.toFixed(2)} on AI coding assistants!` }) }) }), _jsx(Show, { when: isNarrowTerminal(), children: _jsx("box", { marginTop: 1, children: _jsx("text", { fg: "yellow", italic: true, children: `Total: $${props.data.totalCost.toFixed(2)}` }) }) })] })] }));
|
|
101
|
-
}
|
|
102
|
-
//# sourceMappingURL=StatsView.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StatsView.js","sourceRoot":"","sources":["../../../src/tui/components/StatsView.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export interface TokenBreakdownData {
|
|
2
|
-
input: number;
|
|
3
|
-
output: number;
|
|
4
|
-
cacheRead: number;
|
|
5
|
-
cacheWrite: number;
|
|
6
|
-
}
|
|
7
|
-
interface TokenBreakdownProps {
|
|
8
|
-
tokens: TokenBreakdownData;
|
|
9
|
-
compact?: boolean;
|
|
10
|
-
indent?: number;
|
|
11
|
-
}
|
|
12
|
-
export declare function TokenBreakdown(props: TokenBreakdownProps): any;
|
|
13
|
-
export {};
|
|
14
|
-
//# sourceMappingURL=TokenBreakdown.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TokenBreakdown.d.ts","sourceRoot":"","sources":["../../../src/tui/components/TokenBreakdown.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,mBAAmB;IAC3B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,OA8BxD"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "@opentui/solid/jsx-runtime";
|
|
2
|
-
import { formatTokens, formatTokensCompact } from "../utils/format.js";
|
|
3
|
-
export function TokenBreakdown(props) {
|
|
4
|
-
const indentStr = () => " ".repeat(props.indent ?? 0);
|
|
5
|
-
if (props.compact) {
|
|
6
|
-
return (_jsxs("box", { flexDirection: "row", children: [_jsx("text", { fg: "#666666", children: indentStr() }), _jsx("text", { fg: "#AAAAAA", children: formatTokensCompact(props.tokens.input) }), _jsx("text", { fg: "#666666", children: "/" }), _jsx("text", { fg: "#AAAAAA", children: formatTokensCompact(props.tokens.output) }), _jsx("text", { fg: "#666666", children: "/" }), _jsx("text", { fg: "#AAAAAA", children: formatTokensCompact(props.tokens.cacheRead) }), _jsx("text", { fg: "#666666", children: "/" }), _jsx("text", { fg: "#AAAAAA", children: formatTokensCompact(props.tokens.cacheWrite) })] }));
|
|
7
|
-
}
|
|
8
|
-
return (_jsxs("box", { flexDirection: "row", children: [_jsx("text", { fg: "#666666", children: `${indentStr()}In: ` }), _jsx("text", { fg: "#AAAAAA", children: formatTokens(props.tokens.input) }), _jsx("text", { fg: "#666666", children: " · Out: " }), _jsx("text", { fg: "#AAAAAA", children: formatTokens(props.tokens.output) }), _jsx("text", { fg: "#666666", children: " · CR: " }), _jsx("text", { fg: "#AAAAAA", children: formatTokens(props.tokens.cacheRead) }), _jsx("text", { fg: "#666666", children: " · CW: " }), _jsx("text", { fg: "#AAAAAA", children: formatTokens(props.tokens.cacheWrite) })] }));
|
|
9
|
-
}
|
|
10
|
-
//# sourceMappingURL=TokenBreakdown.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TokenBreakdown.js","sourceRoot":"","sources":["../../../src/tui/components/TokenBreakdown.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAevE,MAAM,UAAU,cAAc,CAAC,KAA0B;IACvD,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;IAEtD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,CACL,eAAK,aAAa,EAAC,KAAK,aACtB,eAAM,EAAE,EAAC,SAAS,YAAE,SAAS,EAAE,GAAQ,EACvC,eAAM,EAAE,EAAC,SAAS,YAAE,mBAAmB,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAQ,EACnE,eAAM,EAAE,EAAC,SAAS,YAAE,GAAG,GAAQ,EAC/B,eAAM,EAAE,EAAC,SAAS,YAAE,mBAAmB,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,GAAQ,EACpE,eAAM,EAAE,EAAC,SAAS,YAAE,GAAG,GAAQ,EAC/B,eAAM,EAAE,EAAC,SAAS,YAAE,mBAAmB,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,GAAQ,EACvE,eAAM,EAAE,EAAC,SAAS,YAAE,GAAG,GAAQ,EAC/B,eAAM,EAAE,EAAC,SAAS,YAAE,mBAAmB,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,GAAQ,IACpE,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,eAAK,aAAa,EAAC,KAAK,aACtB,eAAM,EAAE,EAAC,SAAS,YAAE,GAAG,SAAS,EAAE,MAAM,GAAQ,EAChD,eAAM,EAAE,EAAC,SAAS,YAAE,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAQ,EAC5D,eAAM,EAAE,EAAC,SAAS,YAAE,UAAU,GAAQ,EACtC,eAAM,EAAE,EAAC,SAAS,YAAE,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,GAAQ,EAC7D,eAAM,EAAE,EAAC,SAAS,YAAE,SAAS,GAAQ,EACrC,eAAM,EAAE,EAAC,SAAS,YAAE,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,GAAQ,EAChE,eAAM,EAAE,EAAC,SAAS,YAAE,SAAS,GAAQ,EACrC,eAAM,EAAE,EAAC,SAAS,YAAE,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,GAAQ,IAC7D,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
export { Header } from "./Header.js";
|
|
2
|
-
export { Footer } from "./Footer.js";
|
|
3
|
-
export { OverviewView } from "./OverviewView.js";
|
|
4
|
-
export { ModelView } from "./ModelView.js";
|
|
5
|
-
export { DailyView } from "./DailyView.js";
|
|
6
|
-
export { StatsView } from "./StatsView.js";
|
|
7
|
-
export { BarChart } from "./BarChart.js";
|
|
8
|
-
export type { ChartDataPoint } from "./BarChart.js";
|
|
9
|
-
export { Legend } from "./Legend.js";
|
|
10
|
-
export { LoadingSpinner } from "./LoadingSpinner.js";
|
|
11
|
-
export { ModelRow } from "./ModelRow.js";
|
|
12
|
-
export { TokenBreakdown } from "./TokenBreakdown.js";
|
|
13
|
-
export type { TokenBreakdownData } from "./TokenBreakdown.js";
|
|
14
|
-
export { DateBreakdownPanel } from "./DateBreakdownPanel.js";
|
|
15
|
-
export type { DateBreakdownPanelProps } from "./DateBreakdownPanel.js";
|
|
16
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tui/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export { Header } from "./Header.js";
|
|
2
|
-
export { Footer } from "./Footer.js";
|
|
3
|
-
export { OverviewView } from "./OverviewView.js";
|
|
4
|
-
export { ModelView } from "./ModelView.js";
|
|
5
|
-
export { DailyView } from "./DailyView.js";
|
|
6
|
-
export { StatsView } from "./StatsView.js";
|
|
7
|
-
export { BarChart } from "./BarChart.js";
|
|
8
|
-
export { Legend } from "./Legend.js";
|
|
9
|
-
export { LoadingSpinner } from "./LoadingSpinner.js";
|
|
10
|
-
export { ModelRow } from "./ModelRow.js";
|
|
11
|
-
export { TokenBreakdown } from "./TokenBreakdown.js";
|
|
12
|
-
export { DateBreakdownPanel } from "./DateBreakdownPanel.js";
|
|
13
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tui/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { TUIData } from "../types/index.js";
|
|
2
|
-
export interface TokscaleSettings {
|
|
3
|
-
colorPalette: string;
|
|
4
|
-
autoRefreshEnabled?: boolean;
|
|
5
|
-
autoRefreshMs?: number;
|
|
6
|
-
includeUnusedModels?: boolean;
|
|
7
|
-
nativeTimeoutMs?: number;
|
|
8
|
-
}
|
|
9
|
-
export declare function loadSettings(): TokscaleSettings;
|
|
10
|
-
export declare function saveSettings(updates: Partial<TokscaleSettings>): void;
|
|
11
|
-
export declare function loadCachedData(enabledSources: Set<string>): TUIData | null;
|
|
12
|
-
export declare function saveCachedData(data: TUIData, enabledSources: Set<string>): void;
|
|
13
|
-
export declare function isCacheStale(enabledSources: Set<string>): boolean;
|
|
14
|
-
export declare function getCacheTimestamp(): number | null;
|
|
15
|
-
//# sourceMappingURL=settings.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/tui/config/settings.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAuB,MAAM,mBAAmB,CAAC;AAiBtE,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAyCD,wBAAgB,YAAY,IAAI,gBAAgB,CAa/C;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAUrE;AAeD,wBAAgB,cAAc,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,GAAG,IAAI,CAuB1E;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAmB/E;AAED,wBAAgB,YAAY,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAiBjE;AAED,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAUjD"}
|
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
import { homedir } from "os";
|
|
2
|
-
import { join } from "path";
|
|
3
|
-
import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
|
|
4
|
-
const CONFIG_DIR = join(homedir(), ".config", "tokscale");
|
|
5
|
-
const CACHE_DIR = join(homedir(), ".cache", "tokscale");
|
|
6
|
-
const CONFIG_FILE = join(CONFIG_DIR, "settings.json");
|
|
7
|
-
const LEGACY_CONFIG_FILE = join(CONFIG_DIR, "tui-settings.json");
|
|
8
|
-
const CACHE_FILE = join(CACHE_DIR, "tui-data-cache.json");
|
|
9
|
-
const CACHE_STALE_THRESHOLD_MS = 60 * 1000;
|
|
10
|
-
const MIN_AUTO_REFRESH_MS = 30000;
|
|
11
|
-
const MAX_AUTO_REFRESH_MS = 3600000;
|
|
12
|
-
const DEFAULT_AUTO_REFRESH_MS = 60000;
|
|
13
|
-
const DEFAULT_NATIVE_TIMEOUT_MS = 300_000; // 5 minutes
|
|
14
|
-
const MIN_NATIVE_TIMEOUT_MS = 5_000; // 5 seconds
|
|
15
|
-
const MAX_NATIVE_TIMEOUT_MS = 3_600_000; // 1 hour
|
|
16
|
-
function validateSettings(raw) {
|
|
17
|
-
const defaults = {
|
|
18
|
-
colorPalette: "blue",
|
|
19
|
-
autoRefreshEnabled: false,
|
|
20
|
-
autoRefreshMs: DEFAULT_AUTO_REFRESH_MS,
|
|
21
|
-
includeUnusedModels: false,
|
|
22
|
-
nativeTimeoutMs: DEFAULT_NATIVE_TIMEOUT_MS,
|
|
23
|
-
};
|
|
24
|
-
if (!raw || typeof raw !== "object")
|
|
25
|
-
return defaults;
|
|
26
|
-
const obj = raw;
|
|
27
|
-
const colorPalette = typeof obj.colorPalette === "string" ? obj.colorPalette : defaults.colorPalette;
|
|
28
|
-
const autoRefreshEnabled = typeof obj.autoRefreshEnabled === "boolean" ? obj.autoRefreshEnabled : defaults.autoRefreshEnabled;
|
|
29
|
-
let autoRefreshMs = defaults.autoRefreshMs;
|
|
30
|
-
if (typeof obj.autoRefreshMs === "number" && Number.isFinite(obj.autoRefreshMs)) {
|
|
31
|
-
autoRefreshMs = Math.min(MAX_AUTO_REFRESH_MS, Math.max(MIN_AUTO_REFRESH_MS, obj.autoRefreshMs));
|
|
32
|
-
}
|
|
33
|
-
const includeUnusedModels = typeof obj.includeUnusedModels === "boolean" ? obj.includeUnusedModels : defaults.includeUnusedModels;
|
|
34
|
-
let nativeTimeoutMs = defaults.nativeTimeoutMs;
|
|
35
|
-
if (typeof obj.nativeTimeoutMs === "number" && Number.isFinite(obj.nativeTimeoutMs)) {
|
|
36
|
-
nativeTimeoutMs = Math.min(MAX_NATIVE_TIMEOUT_MS, Math.max(MIN_NATIVE_TIMEOUT_MS, obj.nativeTimeoutMs));
|
|
37
|
-
}
|
|
38
|
-
return { colorPalette, autoRefreshEnabled, autoRefreshMs, includeUnusedModels, nativeTimeoutMs };
|
|
39
|
-
}
|
|
40
|
-
export function loadSettings() {
|
|
41
|
-
try {
|
|
42
|
-
if (existsSync(CONFIG_FILE)) {
|
|
43
|
-
const raw = JSON.parse(readFileSync(CONFIG_FILE, "utf-8"));
|
|
44
|
-
return validateSettings(raw);
|
|
45
|
-
}
|
|
46
|
-
if (existsSync(LEGACY_CONFIG_FILE)) {
|
|
47
|
-
const raw = JSON.parse(readFileSync(LEGACY_CONFIG_FILE, "utf-8"));
|
|
48
|
-
return validateSettings(raw);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
catch {
|
|
52
|
-
}
|
|
53
|
-
return { colorPalette: "blue", autoRefreshEnabled: false, autoRefreshMs: DEFAULT_AUTO_REFRESH_MS, includeUnusedModels: false, nativeTimeoutMs: DEFAULT_NATIVE_TIMEOUT_MS };
|
|
54
|
-
}
|
|
55
|
-
export function saveSettings(updates) {
|
|
56
|
-
try {
|
|
57
|
-
if (!existsSync(CONFIG_DIR)) {
|
|
58
|
-
mkdirSync(CONFIG_DIR, { recursive: true });
|
|
59
|
-
}
|
|
60
|
-
const current = loadSettings();
|
|
61
|
-
const merged = { ...current, ...updates };
|
|
62
|
-
writeFileSync(CONFIG_FILE, JSON.stringify(merged, null, 2));
|
|
63
|
-
}
|
|
64
|
-
catch {
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
function sourcesMatch(enabledSources, cachedSources) {
|
|
68
|
-
const cachedSet = new Set(cachedSources);
|
|
69
|
-
if (enabledSources.size !== cachedSet.size) {
|
|
70
|
-
return false;
|
|
71
|
-
}
|
|
72
|
-
for (const source of enabledSources) {
|
|
73
|
-
if (!cachedSet.has(source)) {
|
|
74
|
-
return false;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
return true;
|
|
78
|
-
}
|
|
79
|
-
export function loadCachedData(enabledSources) {
|
|
80
|
-
try {
|
|
81
|
-
if (!existsSync(CACHE_FILE)) {
|
|
82
|
-
return null;
|
|
83
|
-
}
|
|
84
|
-
const cached = JSON.parse(readFileSync(CACHE_FILE, "utf-8"));
|
|
85
|
-
if (!sourcesMatch(enabledSources, cached.enabledSources)) {
|
|
86
|
-
return null;
|
|
87
|
-
}
|
|
88
|
-
if (!cached.data.dailyBreakdowns || !Array.isArray(cached.data.dailyBreakdowns)) {
|
|
89
|
-
return null;
|
|
90
|
-
}
|
|
91
|
-
return {
|
|
92
|
-
...cached.data,
|
|
93
|
-
dailyBreakdowns: new Map(cached.data.dailyBreakdowns),
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
catch {
|
|
97
|
-
return null;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
export function saveCachedData(data, enabledSources) {
|
|
101
|
-
try {
|
|
102
|
-
if (!existsSync(CACHE_DIR)) {
|
|
103
|
-
mkdirSync(CACHE_DIR, { recursive: true });
|
|
104
|
-
}
|
|
105
|
-
const serializableBreakdowns = Array.from(data.dailyBreakdowns.entries());
|
|
106
|
-
const cached = {
|
|
107
|
-
timestamp: Date.now(),
|
|
108
|
-
enabledSources: Array.from(enabledSources),
|
|
109
|
-
data: {
|
|
110
|
-
...data,
|
|
111
|
-
dailyBreakdowns: serializableBreakdowns,
|
|
112
|
-
},
|
|
113
|
-
};
|
|
114
|
-
writeFileSync(CACHE_FILE, JSON.stringify(cached));
|
|
115
|
-
}
|
|
116
|
-
catch {
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
export function isCacheStale(enabledSources) {
|
|
120
|
-
try {
|
|
121
|
-
if (!existsSync(CACHE_FILE)) {
|
|
122
|
-
return true;
|
|
123
|
-
}
|
|
124
|
-
const cached = JSON.parse(readFileSync(CACHE_FILE, "utf-8"));
|
|
125
|
-
const cacheAge = Date.now() - cached.timestamp;
|
|
126
|
-
if (!sourcesMatch(enabledSources, cached.enabledSources)) {
|
|
127
|
-
return true;
|
|
128
|
-
}
|
|
129
|
-
return cacheAge > CACHE_STALE_THRESHOLD_MS;
|
|
130
|
-
}
|
|
131
|
-
catch {
|
|
132
|
-
return true;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
export function getCacheTimestamp() {
|
|
136
|
-
try {
|
|
137
|
-
if (!existsSync(CACHE_FILE)) {
|
|
138
|
-
return null;
|
|
139
|
-
}
|
|
140
|
-
const cached = JSON.parse(readFileSync(CACHE_FILE, "utf-8"));
|
|
141
|
-
return cached.timestamp;
|
|
142
|
-
}
|
|
143
|
-
catch {
|
|
144
|
-
return null;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
//# sourceMappingURL=settings.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/tui/config/settings.ts"],"names":[],"mappings":"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"}
|