@tokscale/cli 1.0.1 → 1.0.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.
- package/dist/cli.js +0 -0
- package/dist/native.d.ts.map +1 -1
- package/dist/native.js +192 -26
- package/dist/native.js.map +1 -1
- package/package.json +3 -3
- package/dist/claudecode.d.ts +0 -39
- package/dist/claudecode.d.ts.map +0 -1
- package/dist/claudecode.js +0 -375
- package/dist/claudecode.js.map +0 -1
- package/dist/gemini.d.ts +0 -36
- package/dist/gemini.d.ts.map +0 -1
- package/dist/gemini.js +0 -125
- package/dist/gemini.js.map +0 -1
- package/dist/opencode.d.ts +0 -40
- package/dist/opencode.d.ts.map +0 -1
- package/dist/opencode.js +0 -69
- package/dist/opencode.js.map +0 -1
- package/dist/test-selection.d.ts +0 -2
- package/dist/test-selection.d.ts.map +0 -1
- package/dist/test-selection.jsx +0 -32
- package/dist/test-selection.jsx.map +0 -1
- package/dist/tui/App.js +0 -167
- package/dist/tui/App.js.map +0 -1
- package/dist/tui/components/BarChart.js +0 -63
- package/dist/tui/components/BarChart.js.map +0 -1
- package/dist/tui/components/DailyView.js +0 -32
- package/dist/tui/components/DailyView.js.map +0 -1
- package/dist/tui/components/Footer.js +0 -15
- package/dist/tui/components/Footer.js.map +0 -1
- package/dist/tui/components/Header.js +0 -12
- package/dist/tui/components/Header.js.map +0 -1
- package/dist/tui/components/Legend.js +0 -9
- package/dist/tui/components/Legend.js.map +0 -1
- package/dist/tui/components/ModelListItem.d.ts +0 -11
- package/dist/tui/components/ModelListItem.d.ts.map +0 -1
- package/dist/tui/components/ModelListItem.js +0 -18
- package/dist/tui/components/ModelListItem.js.map +0 -1
- package/dist/tui/components/ModelListItem.jsx +0 -17
- package/dist/tui/components/ModelListItem.jsx.map +0 -1
- package/dist/tui/components/ModelView.js +0 -34
- package/dist/tui/components/ModelView.js.map +0 -1
- package/dist/tui/components/OverviewView.js +0 -24
- package/dist/tui/components/OverviewView.js.map +0 -1
- package/dist/tui/components/StatsView.js +0 -43
- package/dist/tui/components/StatsView.js.map +0 -1
- package/dist/tui/index.js +0 -8
- package/dist/tui/index.js.map +0 -1
package/dist/opencode.js
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OpenCode session data reader
|
|
3
|
-
*/
|
|
4
|
-
import * as fs from "node:fs";
|
|
5
|
-
import * as path from "node:path";
|
|
6
|
-
import * as os from "node:os";
|
|
7
|
-
export function getOpenCodeStoragePath() {
|
|
8
|
-
const dataHome = process.env.XDG_DATA_HOME || path.join(os.homedir(), ".local", "share");
|
|
9
|
-
return path.join(dataHome, "opencode", "storage");
|
|
10
|
-
}
|
|
11
|
-
export function readOpenCodeMessages() {
|
|
12
|
-
const storagePath = getOpenCodeStoragePath();
|
|
13
|
-
const messagePath = path.join(storagePath, "message");
|
|
14
|
-
if (!fs.existsSync(messagePath)) {
|
|
15
|
-
return [];
|
|
16
|
-
}
|
|
17
|
-
const messages = [];
|
|
18
|
-
const sessionDirs = fs
|
|
19
|
-
.readdirSync(messagePath)
|
|
20
|
-
.map((dir) => path.join(messagePath, dir))
|
|
21
|
-
.filter((dir) => fs.statSync(dir).isDirectory());
|
|
22
|
-
for (const sessionDir of sessionDirs) {
|
|
23
|
-
const files = fs.readdirSync(sessionDir).filter((f) => f.endsWith(".json"));
|
|
24
|
-
for (const file of files) {
|
|
25
|
-
try {
|
|
26
|
-
const content = fs.readFileSync(path.join(sessionDir, file), "utf-8");
|
|
27
|
-
const msg = JSON.parse(content);
|
|
28
|
-
if (msg.role === "assistant" && msg.tokens) {
|
|
29
|
-
messages.push(msg);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
catch {
|
|
33
|
-
// Skip malformed files
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
return messages;
|
|
38
|
-
}
|
|
39
|
-
export function aggregateOpenCodeByModel(messages) {
|
|
40
|
-
const summaries = new Map();
|
|
41
|
-
for (const msg of messages) {
|
|
42
|
-
if (!msg.modelID || !msg.tokens)
|
|
43
|
-
continue;
|
|
44
|
-
const key = `${msg.providerID}/${msg.modelID}`;
|
|
45
|
-
let summary = summaries.get(key);
|
|
46
|
-
if (!summary) {
|
|
47
|
-
summary = {
|
|
48
|
-
source: "opencode",
|
|
49
|
-
modelID: msg.modelID,
|
|
50
|
-
providerID: msg.providerID || "unknown",
|
|
51
|
-
messageCount: 0,
|
|
52
|
-
input: 0,
|
|
53
|
-
output: 0,
|
|
54
|
-
reasoning: 0,
|
|
55
|
-
cacheRead: 0,
|
|
56
|
-
cacheWrite: 0,
|
|
57
|
-
};
|
|
58
|
-
summaries.set(key, summary);
|
|
59
|
-
}
|
|
60
|
-
summary.messageCount++;
|
|
61
|
-
summary.input += msg.tokens.input;
|
|
62
|
-
summary.output += msg.tokens.output;
|
|
63
|
-
summary.reasoning += msg.tokens.reasoning || 0;
|
|
64
|
-
summary.cacheRead += msg.tokens.cache.read;
|
|
65
|
-
summary.cacheWrite += msg.tokens.cache.write;
|
|
66
|
-
}
|
|
67
|
-
return summaries;
|
|
68
|
-
}
|
|
69
|
-
//# sourceMappingURL=opencode.js.map
|
package/dist/opencode.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../src/opencode.ts"],"names":[],"mappings":"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"}
|
package/dist/test-selection.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"test-selection.d.ts","sourceRoot":"","sources":["../src/test-selection.tsx"],"names":[],"mappings":""}
|
package/dist/test-selection.jsx
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { createSignal, For, createMemo } from "solid-js";
|
|
2
|
-
import { render, useKeyboard } from "@opentui/solid";
|
|
3
|
-
function App() {
|
|
4
|
-
const [selectedIndex, setSelectedIndex] = createSignal(0);
|
|
5
|
-
const items = ["Item 0", "Item 1", "Item 2", "Item 3", "Item 4"];
|
|
6
|
-
useKeyboard((key) => {
|
|
7
|
-
if (key.name === "down") {
|
|
8
|
-
setSelectedIndex(Math.min(selectedIndex() + 1, items.length - 1));
|
|
9
|
-
}
|
|
10
|
-
if (key.name === "up") {
|
|
11
|
-
setSelectedIndex(Math.max(0, selectedIndex() - 1));
|
|
12
|
-
}
|
|
13
|
-
if (key.name === "q") {
|
|
14
|
-
process.exit(0);
|
|
15
|
-
}
|
|
16
|
-
});
|
|
17
|
-
return (<box flexDirection="column">
|
|
18
|
-
<text>Selected: {selectedIndex()}</text>
|
|
19
|
-
<For each={items}>
|
|
20
|
-
{(item, i) => {
|
|
21
|
-
const isActive = createMemo(() => i() === selectedIndex());
|
|
22
|
-
const rowBg = createMemo(() => isActive() ? "blue" : (i() % 2 === 0 ? "gray" : undefined));
|
|
23
|
-
return (<text bg={rowBg()} fg={isActive() ? "white" : undefined}>
|
|
24
|
-
{item} {isActive() ? "<-- SELECTED" : ""}
|
|
25
|
-
</text>);
|
|
26
|
-
}}
|
|
27
|
-
</For>
|
|
28
|
-
<text dim>Press up/down to move, q to quit</text>
|
|
29
|
-
</box>);
|
|
30
|
-
}
|
|
31
|
-
render(() => <App />);
|
|
32
|
-
//# sourceMappingURL=test-selection.jsx.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"test-selection.jsx","sourceRoot":"","sources":["../src/test-selection.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAErD,SAAS,GAAG;IACV,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEjE,WAAW,CAAC,CAAC,GAAG,EAAE,EAAE;QAClB,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACxB,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACtB,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,CAAC,GAAG,CAAC,aAAa,CAAC,QAAQ,CACzB;MAAA,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,EAAE,IAAI,CACvC;MAAA,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CACf;QAAA,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YACX,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,aAAa,EAAE,CAAC,CAAC;YAC3D,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;YAC3F,OAAO,CACL,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CACtD;cAAA,CAAC,IAAI,CAAE,CAAA,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAC1C;YAAA,EAAE,IAAI,CAAC,CACR,CAAC;QACJ,CAAC,CACH;MAAA,EAAE,GAAG,CACL;MAAA,CAAC,IAAI,CAAC,GAAG,CAAC,gCAAgC,EAAE,IAAI,CAClD;IAAA,EAAE,GAAG,CAAC,CACP,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,AAAD,EAAG,CAAC,CAAC"}
|
package/dist/tui/App.js
DELETED
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { useState, useEffect } from "react";
|
|
3
|
-
import { Box, Text, useInput, useApp, useStdout } from "ink";
|
|
4
|
-
import { Header } from "./components/Header.js";
|
|
5
|
-
import { Footer } from "./components/Footer.js";
|
|
6
|
-
import { ModelView } from "./components/ModelView.js";
|
|
7
|
-
import { DailyView } from "./components/DailyView.js";
|
|
8
|
-
import { StatsView } from "./components/StatsView.js";
|
|
9
|
-
import { OverviewView } from "./components/OverviewView.js";
|
|
10
|
-
import { useData } from "./hooks/useData.js";
|
|
11
|
-
function useStdoutDimensions() {
|
|
12
|
-
const { stdout } = useStdout();
|
|
13
|
-
const [dimensions, setDimensions] = useState([stdout.columns || 80, stdout.rows || 24]);
|
|
14
|
-
useEffect(() => {
|
|
15
|
-
const handler = () => setDimensions([stdout.columns || 80, stdout.rows || 24]);
|
|
16
|
-
stdout.on("resize", handler);
|
|
17
|
-
return () => { stdout.off("resize", handler); };
|
|
18
|
-
}, [stdout]);
|
|
19
|
-
return dimensions;
|
|
20
|
-
}
|
|
21
|
-
export function App() {
|
|
22
|
-
const { exit } = useApp();
|
|
23
|
-
const [columns, rows] = useStdoutDimensions();
|
|
24
|
-
const [state, setState] = useState({
|
|
25
|
-
activeTab: "overview",
|
|
26
|
-
enabledSources: new Set(["opencode", "claude", "codex", "cursor", "gemini"]),
|
|
27
|
-
sortBy: "cost",
|
|
28
|
-
sortDesc: true,
|
|
29
|
-
selectedIndex: 0,
|
|
30
|
-
scrollOffset: 0,
|
|
31
|
-
});
|
|
32
|
-
const { data, loading, error, refresh } = useData(state.enabledSources);
|
|
33
|
-
useInput((input, key) => {
|
|
34
|
-
if (input === "q") {
|
|
35
|
-
exit();
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
if (input === "r") {
|
|
39
|
-
refresh();
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
|
-
const cycleTab = (current) => {
|
|
43
|
-
const tabs = ["overview", "model", "daily", "stats"];
|
|
44
|
-
const idx = tabs.indexOf(current);
|
|
45
|
-
return tabs[(idx + 1) % tabs.length];
|
|
46
|
-
};
|
|
47
|
-
if (key.tab || input === "d") {
|
|
48
|
-
setState((s) => ({
|
|
49
|
-
...s,
|
|
50
|
-
activeTab: cycleTab(s.activeTab),
|
|
51
|
-
selectedIndex: 0,
|
|
52
|
-
scrollOffset: 0,
|
|
53
|
-
}));
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
if (input === "c") {
|
|
57
|
-
setState((s) => ({ ...s, sortBy: "cost", sortDesc: true }));
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
if (input === "n") {
|
|
61
|
-
setState((s) => ({ ...s, sortBy: "name", sortDesc: false }));
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
if (input === "t") {
|
|
65
|
-
setState((s) => ({ ...s, sortBy: "tokens", sortDesc: true }));
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
if (input === "1") {
|
|
69
|
-
setState((s) => {
|
|
70
|
-
const newSources = new Set(s.enabledSources);
|
|
71
|
-
if (newSources.has("opencode"))
|
|
72
|
-
newSources.delete("opencode");
|
|
73
|
-
else
|
|
74
|
-
newSources.add("opencode");
|
|
75
|
-
return { ...s, enabledSources: newSources };
|
|
76
|
-
});
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
if (input === "2") {
|
|
80
|
-
setState((s) => {
|
|
81
|
-
const newSources = new Set(s.enabledSources);
|
|
82
|
-
if (newSources.has("claude"))
|
|
83
|
-
newSources.delete("claude");
|
|
84
|
-
else
|
|
85
|
-
newSources.add("claude");
|
|
86
|
-
return { ...s, enabledSources: newSources };
|
|
87
|
-
});
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
if (input === "3") {
|
|
91
|
-
setState((s) => {
|
|
92
|
-
const newSources = new Set(s.enabledSources);
|
|
93
|
-
if (newSources.has("codex"))
|
|
94
|
-
newSources.delete("codex");
|
|
95
|
-
else
|
|
96
|
-
newSources.add("codex");
|
|
97
|
-
return { ...s, enabledSources: newSources };
|
|
98
|
-
});
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
101
|
-
if (input === "4") {
|
|
102
|
-
setState((s) => {
|
|
103
|
-
const newSources = new Set(s.enabledSources);
|
|
104
|
-
if (newSources.has("cursor"))
|
|
105
|
-
newSources.delete("cursor");
|
|
106
|
-
else
|
|
107
|
-
newSources.add("cursor");
|
|
108
|
-
return { ...s, enabledSources: newSources };
|
|
109
|
-
});
|
|
110
|
-
return;
|
|
111
|
-
}
|
|
112
|
-
if (input === "5") {
|
|
113
|
-
setState((s) => {
|
|
114
|
-
const newSources = new Set(s.enabledSources);
|
|
115
|
-
if (newSources.has("gemini"))
|
|
116
|
-
newSources.delete("gemini");
|
|
117
|
-
else
|
|
118
|
-
newSources.add("gemini");
|
|
119
|
-
return { ...s, enabledSources: newSources };
|
|
120
|
-
});
|
|
121
|
-
return;
|
|
122
|
-
}
|
|
123
|
-
if (key.upArrow) {
|
|
124
|
-
setState((s) => {
|
|
125
|
-
if (s.activeTab === "overview" && s.scrollOffset > 0) {
|
|
126
|
-
return { ...s, scrollOffset: s.scrollOffset - 1 };
|
|
127
|
-
}
|
|
128
|
-
return { ...s, selectedIndex: Math.max(0, s.selectedIndex - 1) };
|
|
129
|
-
});
|
|
130
|
-
return;
|
|
131
|
-
}
|
|
132
|
-
if (key.downArrow) {
|
|
133
|
-
setState((s) => {
|
|
134
|
-
if (s.activeTab === "overview") {
|
|
135
|
-
const chartH = Math.max(5, Math.floor(contentHeight * 0.35));
|
|
136
|
-
const listH = Math.max(4, contentHeight - chartH - 4);
|
|
137
|
-
const perPage = Math.max(1, Math.floor(listH / 2));
|
|
138
|
-
const maxOffset = Math.max(0, (data?.topModels.length ?? 0) - perPage);
|
|
139
|
-
return { ...s, scrollOffset: Math.min(maxOffset, s.scrollOffset + 1) };
|
|
140
|
-
}
|
|
141
|
-
return { ...s, selectedIndex: s.selectedIndex + 1 };
|
|
142
|
-
});
|
|
143
|
-
return;
|
|
144
|
-
}
|
|
145
|
-
if (input === "e" && data) {
|
|
146
|
-
import("node:fs").then((fs) => {
|
|
147
|
-
const exportData = {
|
|
148
|
-
exportedAt: new Date().toISOString(),
|
|
149
|
-
totalCost: data.totalCost,
|
|
150
|
-
modelCount: data.modelCount,
|
|
151
|
-
models: data.modelEntries,
|
|
152
|
-
daily: data.dailyEntries,
|
|
153
|
-
stats: data.stats,
|
|
154
|
-
};
|
|
155
|
-
const filename = `token-usage-export-${new Date().toISOString().split("T")[0]}.json`;
|
|
156
|
-
fs.writeFileSync(filename, JSON.stringify(exportData, null, 2));
|
|
157
|
-
});
|
|
158
|
-
return;
|
|
159
|
-
}
|
|
160
|
-
});
|
|
161
|
-
const contentHeight = Math.max(rows - 6, 12);
|
|
162
|
-
const overviewChartHeight = Math.max(5, Math.floor(contentHeight * 0.35));
|
|
163
|
-
const overviewListHeight = Math.max(4, contentHeight - overviewChartHeight - 4);
|
|
164
|
-
const overviewItemsPerPage = Math.max(1, Math.floor(overviewListHeight / 2));
|
|
165
|
-
return (_jsxs(Box, { flexDirection: "column", width: columns, height: rows, children: [_jsx(Header, { activeTab: state.activeTab }), _jsx(Box, { flexDirection: "column", flexGrow: 1, paddingX: 1, children: loading ? (_jsx(Box, { justifyContent: "center", alignItems: "center", flexGrow: 1, children: _jsx(Text, { color: "cyan", children: "Loading data..." }) })) : error ? (_jsx(Box, { justifyContent: "center", alignItems: "center", flexGrow: 1, children: _jsxs(Text, { color: "red", children: ["Error: ", error] }) })) : (_jsxs(_Fragment, { children: [state.activeTab === "overview" && (_jsx(OverviewView, { data: data, selectedIndex: state.selectedIndex, scrollOffset: state.scrollOffset, height: contentHeight, width: columns })), state.activeTab === "model" && (_jsx(ModelView, { data: data, sortBy: state.sortBy, sortDesc: state.sortDesc, selectedIndex: state.selectedIndex, height: contentHeight })), state.activeTab === "daily" && (_jsx(DailyView, { data: data, sortBy: state.sortBy, sortDesc: state.sortDesc, selectedIndex: state.selectedIndex, height: contentHeight })), state.activeTab === "stats" && (_jsx(StatsView, { data: data, height: contentHeight }))] })) }), _jsx(Footer, { enabledSources: state.enabledSources, sortBy: state.sortBy, totalCost: data?.totalCost ?? 0, modelCount: data?.modelCount ?? 0, activeTab: state.activeTab, scrollStart: state.scrollOffset, scrollEnd: Math.min(state.scrollOffset + overviewItemsPerPage, data?.topModels.length ?? 0), totalItems: data?.topModels.length })] }));
|
|
166
|
-
}
|
|
167
|
-
//# sourceMappingURL=App.js.map
|
package/dist/tui/App.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"App.js","sourceRoot":"","sources":["../../src/tui/App.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Box, Text } from "ink";
|
|
3
|
-
const BLOCKS = [" ", "▁", "▂", "▃", "▄", "▅", "▆", "▇", "█"];
|
|
4
|
-
function formatNumber(n) {
|
|
5
|
-
if (n >= 1_000_000_000)
|
|
6
|
-
return `${(n / 1_000_000_000).toFixed(1)}B`;
|
|
7
|
-
if (n >= 1_000_000)
|
|
8
|
-
return `${(n / 1_000_000).toFixed(1)}M`;
|
|
9
|
-
if (n >= 1_000)
|
|
10
|
-
return `${(n / 1_000).toFixed(0)}K`;
|
|
11
|
-
return n.toString();
|
|
12
|
-
}
|
|
13
|
-
function getDominantColor(models) {
|
|
14
|
-
if (models.length === 0)
|
|
15
|
-
return "white";
|
|
16
|
-
return models.reduce((max, m) => (m.tokens > max.tokens ? m : max), models[0]).color;
|
|
17
|
-
}
|
|
18
|
-
export function BarChart({ data, width, height }) {
|
|
19
|
-
if (data.length === 0)
|
|
20
|
-
return _jsx(Text, { dimColor: true, children: "No chart data" });
|
|
21
|
-
const safeHeight = Math.max(height, 1);
|
|
22
|
-
const maxTotal = Math.max(...data.map((d) => d.total), 1);
|
|
23
|
-
const chartWidth = Math.max(width - 8, 20);
|
|
24
|
-
const barWidth = Math.max(1, Math.floor(chartWidth / Math.min(data.length, 52)));
|
|
25
|
-
const visibleBars = Math.min(data.length, Math.floor(chartWidth / barWidth));
|
|
26
|
-
const visibleData = data.slice(-visibleBars);
|
|
27
|
-
const rows = [];
|
|
28
|
-
for (let row = safeHeight - 1; row >= 0; row--) {
|
|
29
|
-
const rowThreshold = ((row + 1) / safeHeight) * maxTotal;
|
|
30
|
-
const prevThreshold = (row / safeHeight) * maxTotal;
|
|
31
|
-
const thresholdDiff = rowThreshold - prevThreshold;
|
|
32
|
-
const barElements = visibleData.map((point, i) => {
|
|
33
|
-
if (point.total <= prevThreshold) {
|
|
34
|
-
return (_jsx(Text, { dimColor: true, children: " ".repeat(barWidth) }, i));
|
|
35
|
-
}
|
|
36
|
-
const color = getDominantColor(point.models);
|
|
37
|
-
if (point.total >= rowThreshold) {
|
|
38
|
-
return (_jsx(Text, { color: color, children: "█".repeat(barWidth) }, i));
|
|
39
|
-
}
|
|
40
|
-
const ratio = thresholdDiff > 0 ? (point.total - prevThreshold) / thresholdDiff : 1;
|
|
41
|
-
const blockIndex = Math.min(8, Math.max(1, Math.floor(ratio * 8)));
|
|
42
|
-
return (_jsx(Text, { color: color, children: BLOCKS[blockIndex].repeat(barWidth) }, i));
|
|
43
|
-
});
|
|
44
|
-
const yLabel = row === safeHeight - 1 ? formatNumber(maxTotal).padStart(6) : " ";
|
|
45
|
-
rows.push(_jsxs(Box, { children: [_jsxs(Text, { dimColor: true, children: [yLabel, "\u2502"] }), barElements] }, row));
|
|
46
|
-
}
|
|
47
|
-
const dateLabels = [];
|
|
48
|
-
if (visibleData.length > 0) {
|
|
49
|
-
const labelInterval = Math.max(1, Math.floor(visibleData.length / 3));
|
|
50
|
-
for (let i = 0; i < visibleData.length; i += labelInterval) {
|
|
51
|
-
const dateStr = visibleData[i].date;
|
|
52
|
-
const d = new Date(dateStr);
|
|
53
|
-
const label = isNaN(d.getTime())
|
|
54
|
-
? dateStr.slice(5)
|
|
55
|
-
: d.toLocaleDateString("en-US", { month: "short", day: "numeric" });
|
|
56
|
-
dateLabels.push(label);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
const axisWidth = Math.min(chartWidth, visibleBars * barWidth);
|
|
60
|
-
const labelPadding = dateLabels.length > 0 ? Math.floor(axisWidth / dateLabels.length) : 0;
|
|
61
|
-
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Tokens per Day" }), rows, _jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: " 0│" }), _jsx(Text, { dimColor: true, children: "─".repeat(axisWidth) })] }), dateLabels.length > 0 && (_jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: " " }), _jsx(Text, { dimColor: true, children: dateLabels.map((l) => l.padEnd(labelPadding)).join("") })] }))] }));
|
|
62
|
-
}
|
|
63
|
-
//# sourceMappingURL=BarChart.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BarChart.js","sourceRoot":"","sources":["../../../src/tui/components/BarChart.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { Box, Text } from "ink";
|
|
3
|
-
export function DailyView({ data, sortBy, sortDesc, selectedIndex, height }) {
|
|
4
|
-
if (!data)
|
|
5
|
-
return null;
|
|
6
|
-
const sortedEntries = [...data.dailyEntries].sort((a, b) => {
|
|
7
|
-
let cmp = 0;
|
|
8
|
-
if (sortBy === "cost")
|
|
9
|
-
cmp = a.cost - b.cost;
|
|
10
|
-
else if (sortBy === "tokens")
|
|
11
|
-
cmp = a.total - b.total;
|
|
12
|
-
else
|
|
13
|
-
cmp = a.date.localeCompare(b.date);
|
|
14
|
-
return sortDesc ? -cmp : cmp;
|
|
15
|
-
});
|
|
16
|
-
const visibleEntries = sortedEntries.slice(0, height - 3);
|
|
17
|
-
const formatNum = (n) => {
|
|
18
|
-
if (n >= 1_000_000_000)
|
|
19
|
-
return `${(n / 1_000_000_000).toFixed(1)}B`;
|
|
20
|
-
if (n >= 1_000_000)
|
|
21
|
-
return `${(n / 1_000_000).toFixed(1)}M`;
|
|
22
|
-
if (n >= 1_000)
|
|
23
|
-
return `${Math.floor(n / 1_000).toLocaleString()},${String(n % 1000).padStart(3, "0")}`;
|
|
24
|
-
return n.toLocaleString();
|
|
25
|
-
};
|
|
26
|
-
const formatCost = (cost) => `$${cost.toFixed(2)}`;
|
|
27
|
-
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { children: _jsxs(Text, { color: "cyan", bold: true, children: [" Date".padEnd(14), "Input".padStart(14), "Output".padStart(14), "Cache".padStart(14), "Total".padStart(16), "Cost".padStart(12)] }) }), _jsx(Box, { borderStyle: "single", borderTop: false, borderLeft: false, borderRight: false, borderBottom: true, borderColor: "gray" }), visibleEntries.map((entry, i) => {
|
|
28
|
-
const isSelected = i === selectedIndex;
|
|
29
|
-
return (_jsxs(Box, { children: [_jsxs(Text, { backgroundColor: isSelected ? "blue" : undefined, color: isSelected ? "white" : undefined, children: [entry.date.padEnd(14), formatNum(entry.input).padStart(14), formatNum(entry.output).padStart(14), formatNum(entry.cache).padStart(14), formatNum(entry.total).padStart(16)] }), _jsx(Text, { color: "green", backgroundColor: isSelected ? "blue" : undefined, children: formatCost(entry.cost).padStart(12) })] }, entry.date));
|
|
30
|
-
})] }));
|
|
31
|
-
}
|
|
32
|
-
//# sourceMappingURL=DailyView.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DailyView.js","sourceRoot":"","sources":["../../../src/tui/components/DailyView.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { Box, Text } from "ink";
|
|
3
|
-
export function Footer({ enabledSources, sortBy, totalCost, modelCount, activeTab, scrollStart, scrollEnd, totalItems, }) {
|
|
4
|
-
const formatCost = (cost) => {
|
|
5
|
-
if (cost >= 1000)
|
|
6
|
-
return `$${(cost / 1000).toFixed(1)}K`;
|
|
7
|
-
return `$${cost.toFixed(2)}`;
|
|
8
|
-
};
|
|
9
|
-
const showScrollInfo = activeTab === "overview" && totalItems && scrollStart !== undefined && scrollEnd !== undefined;
|
|
10
|
-
return (_jsxs(Box, { flexDirection: "column", paddingX: 1, children: [_jsxs(Box, { justifyContent: "space-between", children: [_jsxs(Box, { gap: 1, children: [_jsx(SourceBadge, { name: "1:OC", enabled: enabledSources.has("opencode") }), _jsx(SourceBadge, { name: "2:CC", enabled: enabledSources.has("claude") }), _jsx(SourceBadge, { name: "3:CX", enabled: enabledSources.has("codex") }), _jsx(SourceBadge, { name: "4:CR", enabled: enabledSources.has("cursor") }), _jsx(SourceBadge, { name: "5:GM", enabled: enabledSources.has("gemini") }), _jsx(Text, { dimColor: true, children: "|" }), _jsx(Text, { dimColor: true, children: "Sort:" }), _jsx(Text, { color: "white", children: sortBy === "cost" ? "Cost" : sortBy === "name" ? "Name" : "Tokens" }), showScrollInfo && (_jsxs(_Fragment, { children: [_jsx(Text, { dimColor: true, children: "|" }), _jsxs(Text, { dimColor: true, children: ["\u2193 ", scrollStart + 1, "-", scrollEnd, " of ", totalItems, " models"] })] }))] }), _jsxs(Box, { gap: 1, children: [_jsx(Text, { dimColor: true, children: "Total:" }), _jsx(Text, { color: "green", bold: true, children: formatCost(totalCost) }), _jsxs(Text, { dimColor: true, children: ["(", modelCount, ")"] })] })] }), _jsx(Box, { children: _jsx(Text, { dimColor: true, children: "\u2191\u2193 scroll \u2022 tab/d view \u2022 c/n/t sort \u2022 1-5 filter \u2022 r refresh \u2022 q quit" }) })] }));
|
|
11
|
-
}
|
|
12
|
-
function SourceBadge({ name, enabled }) {
|
|
13
|
-
return (_jsxs(Text, { color: enabled ? "green" : "gray", children: ["[", enabled ? "●" : "○", name, "]"] }));
|
|
14
|
-
}
|
|
15
|
-
//# sourceMappingURL=Footer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Footer.js","sourceRoot":"","sources":["../../../src/tui/components/Footer.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAchC,MAAM,UAAU,MAAM,CAAC,EACrB,cAAc,EACd,MAAM,EACN,SAAS,EACT,UAAU,EACV,SAAS,EACT,WAAW,EACX,SAAS,EACT,UAAU,GACE;IACZ,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,EAAE;QAClC,IAAI,IAAI,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;QACzD,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/B,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,SAAS,KAAK,UAAU,IAAI,UAAU,IAAI,WAAW,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,CAAC;IAEtH,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,aACrC,MAAC,GAAG,IAAC,cAAc,EAAC,eAAe,aACjC,MAAC,GAAG,IAAC,GAAG,EAAE,CAAC,aACT,KAAC,WAAW,IAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAE,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,GAAI,EACpE,KAAC,WAAW,IAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAE,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAI,EAClE,KAAC,WAAW,IAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAE,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,GAAI,EACjE,KAAC,WAAW,IAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAE,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAI,EAClE,KAAC,WAAW,IAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAE,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAI,EAClE,KAAC,IAAI,IAAC,QAAQ,wBAAS,EACvB,KAAC,IAAI,IAAC,QAAQ,4BAAa,EAC3B,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,YAAE,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,GAAQ,EAC9F,cAAc,IAAI,CACjB,8BACE,KAAC,IAAI,IAAC,QAAQ,wBAAS,EACvB,MAAC,IAAI,IAAC,QAAQ,8BAAI,WAAW,GAAG,CAAC,OAAG,SAAS,UAAM,UAAU,eAAe,IAC3E,CACJ,IACG,EACN,MAAC,GAAG,IAAC,GAAG,EAAE,CAAC,aACT,KAAC,IAAI,IAAC,QAAQ,6BAAc,EAC5B,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,EAAC,IAAI,kBAAE,UAAU,CAAC,SAAS,CAAC,GAAQ,EACvD,MAAC,IAAI,IAAC,QAAQ,wBAAG,UAAU,SAAS,IAChC,IACF,EACN,KAAC,GAAG,cACF,KAAC,IAAI,IAAC,QAAQ,+HAEP,GACH,IACF,CACP,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAsC;IACxE,OAAO,CACL,MAAC,IAAI,IAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,kBACnC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,SACtB,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Box, Text } from "ink";
|
|
3
|
-
export function Header({ activeTab }) {
|
|
4
|
-
return (_jsxs(Box, { paddingX: 1, paddingY: 0, justifyContent: "space-between", children: [_jsxs(Box, { gap: 2, children: [_jsx(Tab, { name: "Overview", active: activeTab === "overview" }), _jsx(Tab, { name: "Models", active: activeTab === "model" }), _jsx(Tab, { name: "Daily", active: activeTab === "daily" }), _jsx(Tab, { name: "Stats", active: activeTab === "stats" })] }), _jsx(Text, { color: "cyan", bold: true, children: "Token Usage Tracker" })] }));
|
|
5
|
-
}
|
|
6
|
-
function Tab({ name, active }) {
|
|
7
|
-
if (active) {
|
|
8
|
-
return (_jsx(Box, { children: _jsxs(Text, { backgroundColor: "cyan", color: "black", bold: true, children: [" ", name, " "] }) }));
|
|
9
|
-
}
|
|
10
|
-
return _jsx(Text, { dimColor: true, children: name });
|
|
11
|
-
}
|
|
12
|
-
//# sourceMappingURL=Header.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Header.js","sourceRoot":"","sources":["../../../src/tui/components/Header.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAOhC,MAAM,UAAU,MAAM,CAAC,EAAE,SAAS,EAAe;IAC/C,OAAO,CACL,MAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,cAAc,EAAC,eAAe,aAC3D,MAAC,GAAG,IAAC,GAAG,EAAE,CAAC,aACT,KAAC,GAAG,IAAC,IAAI,EAAC,UAAU,EAAC,MAAM,EAAE,SAAS,KAAK,UAAU,GAAI,EACzD,KAAC,GAAG,IAAC,IAAI,EAAC,QAAQ,EAAC,MAAM,EAAE,SAAS,KAAK,OAAO,GAAI,EACpD,KAAC,GAAG,IAAC,IAAI,EAAC,OAAO,EAAC,MAAM,EAAE,SAAS,KAAK,OAAO,GAAI,EACnD,KAAC,GAAG,IAAC,IAAI,EAAC,OAAO,EAAC,MAAM,EAAE,SAAS,KAAK,OAAO,GAAI,IAC/C,EACN,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,IAAI,0CAA2B,IAC9C,CACP,CAAC;AACJ,CAAC;AAED,SAAS,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAqC;IAC9D,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CACL,KAAC,GAAG,cACF,MAAC,IAAI,IAAC,eAAe,EAAC,MAAM,EAAC,KAAK,EAAC,OAAO,EAAC,IAAI,wBAAG,IAAI,SAAS,GAC3D,CACP,CAAC;IACJ,CAAC;IACD,OAAO,KAAC,IAAI,IAAC,QAAQ,kBAAE,IAAI,GAAQ,CAAC;AACtC,CAAC"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Box, Text } from "ink";
|
|
3
|
-
import { getModelColor } from "../utils/colors.js";
|
|
4
|
-
export function Legend({ models }) {
|
|
5
|
-
if (models.length === 0)
|
|
6
|
-
return null;
|
|
7
|
-
return (_jsx(Box, { gap: 1, flexWrap: "wrap", children: models.map((modelId, i) => (_jsxs(Box, { gap: 0, children: [_jsx(Text, { color: getModelColor(modelId), children: "\u25CF" }), _jsxs(Text, { children: [" ", modelId] }), i < models.length - 1 && _jsx(Text, { dimColor: true, children: " \u00B7" })] }, `${modelId}-${i}`))) }));
|
|
8
|
-
}
|
|
9
|
-
//# sourceMappingURL=Legend.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Legend.js","sourceRoot":"","sources":["../../../src/tui/components/Legend.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAMnD,MAAM,UAAU,MAAM,CAAC,EAAE,MAAM,EAAe;IAC5C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAErC,OAAO,CACL,KAAC,GAAG,IAAC,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAC,MAAM,YACzB,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAC1B,MAAC,GAAG,IAAyB,GAAG,EAAE,CAAC,aACjC,KAAC,IAAI,IAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,uBAAU,EAC7C,MAAC,IAAI,oBAAG,OAAO,IAAQ,EACtB,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,KAAC,IAAI,IAAC,QAAQ,+BAAW,KAH3C,GAAG,OAAO,IAAI,CAAC,EAAE,CAIrB,CACP,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { type Accessor } from "solid-js";
|
|
2
|
-
interface ModelListItemProps {
|
|
3
|
-
modelId: string;
|
|
4
|
-
percentage: number;
|
|
5
|
-
inputTokens: number;
|
|
6
|
-
outputTokens: number;
|
|
7
|
-
isSelected: Accessor<boolean>;
|
|
8
|
-
}
|
|
9
|
-
export declare function ModelListItem(props: ModelListItemProps): any;
|
|
10
|
-
export {};
|
|
11
|
-
//# sourceMappingURL=ModelListItem.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ModelListItem.d.ts","sourceRoot":"","sources":["../../../src/tui/components/ModelListItem.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAIrD,UAAU,kBAAkB;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;CAC/B;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,OAetD"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Box, Text } from "ink";
|
|
3
|
-
import { getModelColor } from "../utils/colors.js";
|
|
4
|
-
function formatTokens(n) {
|
|
5
|
-
if (n >= 1_000_000_000)
|
|
6
|
-
return `${(n / 1_000_000_000).toFixed(1)}B`;
|
|
7
|
-
if (n >= 1_000_000)
|
|
8
|
-
return `${(n / 1_000_000).toFixed(1)}M`;
|
|
9
|
-
if (n >= 1_000)
|
|
10
|
-
return `${(n / 1_000).toFixed(1)}K`;
|
|
11
|
-
return n.toString();
|
|
12
|
-
}
|
|
13
|
-
export function ModelListItem({ modelId, percentage, inputTokens, outputTokens, isSelected, }) {
|
|
14
|
-
const color = getModelColor(modelId);
|
|
15
|
-
const bgColor = isSelected ? "blue" : undefined;
|
|
16
|
-
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { backgroundColor: bgColor, children: [_jsx(Text, { color: color, children: "\u25CF" }), _jsxs(Text, { color: isSelected ? "white" : undefined, children: [" ", modelId, " "] }), _jsxs(Text, { dimColor: true, children: ["(", percentage.toFixed(1), "%)"] })] }), _jsxs(Text, { dimColor: true, children: [" ", "In: ", formatTokens(inputTokens), " \u00B7 Out: ", formatTokens(outputTokens)] })] }));
|
|
17
|
-
}
|
|
18
|
-
//# sourceMappingURL=ModelListItem.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ModelListItem.js","sourceRoot":"","sources":["../../../src/tui/components/ModelListItem.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAUnD,SAAS,YAAY,CAAC,CAAS;IAC7B,IAAI,CAAC,IAAI,aAAa;QAAE,OAAO,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACpE,IAAI,CAAC,IAAI,SAAS;QAAE,OAAO,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5D,IAAI,CAAC,IAAI,KAAK;QAAE,OAAO,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACpD,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAC5B,OAAO,EACP,UAAU,EACV,WAAW,EACX,YAAY,EACZ,UAAU,GACS;IACnB,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAEhD,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,MAAC,GAAG,IAAC,eAAe,EAAE,OAAO,aAC3B,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,uBAAU,EAC5B,MAAC,IAAI,IAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,kBAAI,OAAO,SAAS,EACjE,MAAC,IAAI,IAAC,QAAQ,wBAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,IAC5C,EACN,MAAC,IAAI,IAAC,QAAQ,mBACX,IAAI,UAAM,YAAY,CAAC,WAAW,CAAC,mBAAU,YAAY,CAAC,YAAY,CAAC,IACnE,IACH,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { createMemo } from "solid-js";
|
|
2
|
-
import { getModelColor } from "../utils/colors.js";
|
|
3
|
-
import { formatTokens } from "../utils/format.js";
|
|
4
|
-
export function ModelListItem(props) {
|
|
5
|
-
const color = () => getModelColor(props.modelId);
|
|
6
|
-
const isActive = createMemo(() => props.isSelected());
|
|
7
|
-
const bgColor = createMemo(() => isActive() ? "blue" : undefined);
|
|
8
|
-
return (<box flexDirection="column">
|
|
9
|
-
<box flexDirection="row" backgroundColor={bgColor()}>
|
|
10
|
-
<text fg={color()} bg={bgColor()}>●</text>
|
|
11
|
-
<text fg={isActive() ? "white" : undefined} bg={bgColor()}>{` ${props.modelId} `}</text>
|
|
12
|
-
<text dim bg={bgColor()}>{`(${props.percentage.toFixed(1)}%)`}</text>
|
|
13
|
-
</box>
|
|
14
|
-
<text dim>{` In: ${formatTokens(props.inputTokens)} · Out: ${formatTokens(props.outputTokens)}`}</text>
|
|
15
|
-
</box>);
|
|
16
|
-
}
|
|
17
|
-
//# sourceMappingURL=ModelListItem.jsx.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ModelListItem.jsx","sourceRoot":"","sources":["../../../src/tui/components/ModelListItem.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAiB,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAUlD,MAAM,UAAU,aAAa,CAAC,KAAyB;IACrD,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAElE,OAAO,CACL,CAAC,GAAG,CAAC,aAAa,CAAC,QAAQ,CACzB;MAAA,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,OAAO,EAAE,CAAC,CAClD;QAAA,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CACzC;QAAA,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE,IAAI,CACvF;QAAA,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,CACtE;MAAA,EAAE,GAAG,CACL;MAAA,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,YAAY,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,IAAI,CACzG;IAAA,EAAE,GAAG,CAAC,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { Box, Text } from "ink";
|
|
3
|
-
export function ModelView({ data, sortBy, sortDesc, selectedIndex, height }) {
|
|
4
|
-
if (!data)
|
|
5
|
-
return null;
|
|
6
|
-
const sortedEntries = [...data.modelEntries].sort((a, b) => {
|
|
7
|
-
let cmp = 0;
|
|
8
|
-
if (sortBy === "cost")
|
|
9
|
-
cmp = a.cost - b.cost;
|
|
10
|
-
else if (sortBy === "tokens")
|
|
11
|
-
cmp = a.total - b.total;
|
|
12
|
-
else
|
|
13
|
-
cmp = a.model.localeCompare(b.model);
|
|
14
|
-
return sortDesc ? -cmp : cmp;
|
|
15
|
-
});
|
|
16
|
-
const visibleEntries = sortedEntries.slice(0, height - 3);
|
|
17
|
-
const formatNum = (n) => {
|
|
18
|
-
if (n >= 1_000_000_000)
|
|
19
|
-
return `${(n / 1_000_000_000).toFixed(1)}B`;
|
|
20
|
-
if (n >= 1_000_000)
|
|
21
|
-
return `${(n / 1_000_000).toFixed(1)}M`;
|
|
22
|
-
if (n >= 1_000)
|
|
23
|
-
return `${(n / 1_000).toFixed(0)}K`;
|
|
24
|
-
return n.toLocaleString();
|
|
25
|
-
};
|
|
26
|
-
const formatCost = (cost) => `$${cost.toFixed(2)}`;
|
|
27
|
-
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { children: _jsxs(Text, { color: "cyan", bold: true, children: [" Source/Model".padEnd(24), "Input".padStart(12), "Output".padStart(12), "Cache".padStart(12), "Total".padStart(14), "Cost".padStart(12)] }) }), _jsx(Box, { borderStyle: "single", borderTop: false, borderLeft: false, borderRight: false, borderBottom: true, borderColor: "gray" }), visibleEntries.map((entry, i) => {
|
|
28
|
-
const isSelected = i === selectedIndex;
|
|
29
|
-
const sourceLabel = entry.source.charAt(0).toUpperCase() + entry.source.slice(1);
|
|
30
|
-
const displayName = `${sourceLabel} ${entry.model}`.slice(0, 22);
|
|
31
|
-
return (_jsxs(Box, { children: [_jsxs(Text, { backgroundColor: isSelected ? "blue" : undefined, color: isSelected ? "white" : undefined, children: [displayName.padEnd(24), formatNum(entry.input).padStart(12), formatNum(entry.output).padStart(12), formatNum(entry.cacheRead).padStart(12), formatNum(entry.total).padStart(14)] }), _jsx(Text, { color: "green", backgroundColor: isSelected ? "blue" : undefined, children: formatCost(entry.cost).padStart(12) })] }, `${entry.source}-${entry.model}`));
|
|
32
|
-
})] }));
|
|
33
|
-
}
|
|
34
|
-
//# 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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"}
|