@praeviso/code-env-switch 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +57 -0
- package/README_zh.md +57 -0
- package/bin/cli/args.js +13 -0
- package/bin/cli/help.js +5 -0
- package/bin/cli/index.js +2 -1
- package/bin/commands/index.js +3 -1
- package/bin/commands/list.js +44 -2
- package/bin/commands/usage.js +41 -0
- package/bin/index.js +7 -0
- package/bin/statusline/debug.js +1 -0
- package/bin/statusline/format.js +6 -9
- package/bin/statusline/index.js +46 -8
- package/bin/statusline/input.js +9 -91
- package/bin/statusline/usage/claude.js +181 -0
- package/bin/statusline/usage/codex.js +177 -0
- package/bin/statusline/usage.js +20 -76
- package/bin/usage/index.js +647 -50
- package/bin/usage/pricing.js +303 -0
- package/code-env.example.json +55 -0
- package/package.json +1 -1
- package/src/cli/args.ts +14 -0
- package/src/cli/help.ts +5 -0
- package/src/cli/index.ts +7 -1
- package/src/commands/index.ts +1 -0
- package/src/commands/list.ts +74 -4
- package/src/commands/usage.ts +53 -0
- package/src/index.ts +11 -0
- package/src/statusline/debug.ts +1 -1
- package/src/statusline/format.ts +9 -10
- package/src/statusline/index.ts +74 -24
- package/src/statusline/input.ts +13 -154
- package/src/statusline/types.ts +6 -0
- package/src/statusline/usage/claude.ts +299 -0
- package/src/statusline/usage/codex.ts +258 -0
- package/src/statusline/usage.ts +24 -119
- package/src/types.ts +27 -0
- package/src/usage/index.ts +779 -44
- package/src/usage/pricing.ts +323 -0
- package/PLAN.md +0 -33
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getClaudeUsageTotalsFromInput = getClaudeUsageTotalsFromInput;
|
|
4
|
+
exports.getClaudeInputUsage = getClaudeInputUsage;
|
|
5
|
+
const utils_1 = require("../utils");
|
|
6
|
+
function resolveContextWindow(input) {
|
|
7
|
+
if ((0, utils_1.isRecord)(input.context_window)) {
|
|
8
|
+
return input.context_window;
|
|
9
|
+
}
|
|
10
|
+
if ((0, utils_1.isRecord)(input.contextWindow)) {
|
|
11
|
+
return input.contextWindow;
|
|
12
|
+
}
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
function resolveCurrentUsage(contextWindow) {
|
|
16
|
+
if ((0, utils_1.isRecord)(contextWindow.current_usage)) {
|
|
17
|
+
return contextWindow.current_usage;
|
|
18
|
+
}
|
|
19
|
+
if ((0, utils_1.isRecord)(contextWindow.currentUsage)) {
|
|
20
|
+
return contextWindow.currentUsage;
|
|
21
|
+
}
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
function parseClaudeUsageTotalsRecord(record) {
|
|
25
|
+
var _a, _b, _c, _d, _e;
|
|
26
|
+
const inputTokens = (_a = (0, utils_1.firstNumber)(record.inputTokens, record.input, record.input_tokens)) !== null && _a !== void 0 ? _a : null;
|
|
27
|
+
const outputTokens = (_b = (0, utils_1.firstNumber)(record.outputTokens, record.output, record.output_tokens)) !== null && _b !== void 0 ? _b : null;
|
|
28
|
+
const cacheRead = (_c = (0, utils_1.firstNumber)(record.cache_read_input_tokens, record.cacheReadInputTokens, record.cache_read, record.cacheRead)) !== null && _c !== void 0 ? _c : null;
|
|
29
|
+
const cacheWrite = (_d = (0, utils_1.firstNumber)(record.cache_creation_input_tokens, record.cacheCreationInputTokens, record.cache_write_input_tokens, record.cacheWriteInputTokens, record.cache_write, record.cacheWrite)) !== null && _d !== void 0 ? _d : null;
|
|
30
|
+
const totalTokens = (_e = (0, utils_1.firstNumber)(record.totalTokens, record.total, record.total_tokens)) !== null && _e !== void 0 ? _e : null;
|
|
31
|
+
let computedTotal = null;
|
|
32
|
+
if (inputTokens !== null ||
|
|
33
|
+
outputTokens !== null ||
|
|
34
|
+
cacheRead !== null ||
|
|
35
|
+
cacheWrite !== null) {
|
|
36
|
+
computedTotal =
|
|
37
|
+
(inputTokens || 0) +
|
|
38
|
+
(outputTokens || 0) +
|
|
39
|
+
(cacheRead || 0) +
|
|
40
|
+
(cacheWrite || 0);
|
|
41
|
+
}
|
|
42
|
+
const resolvedTotal = totalTokens !== null && totalTokens !== void 0 ? totalTokens : computedTotal;
|
|
43
|
+
if (inputTokens === null &&
|
|
44
|
+
outputTokens === null &&
|
|
45
|
+
cacheRead === null &&
|
|
46
|
+
cacheWrite === null &&
|
|
47
|
+
resolvedTotal === null) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
inputTokens,
|
|
52
|
+
outputTokens,
|
|
53
|
+
cacheReadTokens: cacheRead,
|
|
54
|
+
cacheWriteTokens: cacheWrite,
|
|
55
|
+
totalTokens: resolvedTotal,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function parseClaudeInputUsageRecord(record) {
|
|
59
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
60
|
+
const todayTokens = (_a = (0, utils_1.firstNumber)(record.todayTokens, record.today, record.today_tokens, record.daily, record.daily_tokens)) !== null && _a !== void 0 ? _a : null;
|
|
61
|
+
const totalTokens = (_b = (0, utils_1.firstNumber)(record.totalTokens, record.total, record.total_tokens)) !== null && _b !== void 0 ? _b : null;
|
|
62
|
+
const inputTokens = (_c = (0, utils_1.firstNumber)(record.inputTokens, record.input, record.input_tokens)) !== null && _c !== void 0 ? _c : null;
|
|
63
|
+
const outputTokens = (_d = (0, utils_1.firstNumber)(record.outputTokens, record.output, record.output_tokens)) !== null && _d !== void 0 ? _d : null;
|
|
64
|
+
const cacheRead = (_e = (0, utils_1.firstNumber)(record.cache_read_input_tokens, record.cacheReadInputTokens, record.cache_read, record.cacheRead)) !== null && _e !== void 0 ? _e : null;
|
|
65
|
+
const cacheWrite = (_f = (0, utils_1.firstNumber)(record.cache_creation_input_tokens, record.cacheCreationInputTokens, record.cache_write_input_tokens, record.cacheWriteInputTokens, record.cache_write, record.cacheWrite)) !== null && _f !== void 0 ? _f : null;
|
|
66
|
+
if (todayTokens === null &&
|
|
67
|
+
totalTokens === null &&
|
|
68
|
+
inputTokens === null &&
|
|
69
|
+
outputTokens === null &&
|
|
70
|
+
cacheRead === null &&
|
|
71
|
+
cacheWrite === null) {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
const hasCacheTokens = cacheRead !== null || cacheWrite !== null;
|
|
75
|
+
const computedTotal = hasCacheTokens
|
|
76
|
+
? (inputTokens || 0) +
|
|
77
|
+
(outputTokens || 0) +
|
|
78
|
+
(cacheRead || 0) +
|
|
79
|
+
(cacheWrite || 0)
|
|
80
|
+
: null;
|
|
81
|
+
const resolvedTodayTokens = hasCacheTokens
|
|
82
|
+
? (_g = todayTokens !== null && todayTokens !== void 0 ? todayTokens : totalTokens) !== null && _g !== void 0 ? _g : computedTotal
|
|
83
|
+
: todayTokens;
|
|
84
|
+
return {
|
|
85
|
+
todayTokens: resolvedTodayTokens,
|
|
86
|
+
totalTokens: totalTokens !== null && totalTokens !== void 0 ? totalTokens : null,
|
|
87
|
+
inputTokens,
|
|
88
|
+
outputTokens,
|
|
89
|
+
cacheReadTokens: cacheRead,
|
|
90
|
+
cacheWriteTokens: cacheWrite,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
function parseTotalsFromContextWindow(contextWindow) {
|
|
94
|
+
var _a, _b, _c, _d;
|
|
95
|
+
const inputTokens = (_a = (0, utils_1.firstNumber)(contextWindow.total_input_tokens, contextWindow.totalInputTokens)) !== null && _a !== void 0 ? _a : null;
|
|
96
|
+
const outputTokens = (_b = (0, utils_1.firstNumber)(contextWindow.total_output_tokens, contextWindow.totalOutputTokens)) !== null && _b !== void 0 ? _b : null;
|
|
97
|
+
if (inputTokens === null && outputTokens === null)
|
|
98
|
+
return null;
|
|
99
|
+
const currentUsage = resolveCurrentUsage(contextWindow);
|
|
100
|
+
const cacheRead = currentUsage
|
|
101
|
+
? (_c = (0, utils_1.firstNumber)(currentUsage.cache_read_input_tokens, currentUsage.cacheReadInputTokens)) !== null && _c !== void 0 ? _c : null
|
|
102
|
+
: null;
|
|
103
|
+
const cacheWrite = currentUsage
|
|
104
|
+
? (_d = (0, utils_1.firstNumber)(currentUsage.cache_creation_input_tokens, currentUsage.cacheCreationInputTokens)) !== null && _d !== void 0 ? _d : null
|
|
105
|
+
: null;
|
|
106
|
+
const totalTokens = (inputTokens || 0) +
|
|
107
|
+
(outputTokens || 0) +
|
|
108
|
+
(cacheRead || 0) +
|
|
109
|
+
(cacheWrite || 0);
|
|
110
|
+
return {
|
|
111
|
+
inputTokens,
|
|
112
|
+
outputTokens,
|
|
113
|
+
cacheReadTokens: cacheRead,
|
|
114
|
+
cacheWriteTokens: cacheWrite,
|
|
115
|
+
totalTokens,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
function getClaudeUsageTotalsFromInput(input) {
|
|
119
|
+
if (!input)
|
|
120
|
+
return null;
|
|
121
|
+
const contextWindow = resolveContextWindow(input);
|
|
122
|
+
if (contextWindow) {
|
|
123
|
+
const totals = parseTotalsFromContextWindow(contextWindow);
|
|
124
|
+
if (totals)
|
|
125
|
+
return totals;
|
|
126
|
+
}
|
|
127
|
+
if ((0, utils_1.isRecord)(input.usage)) {
|
|
128
|
+
return parseClaudeUsageTotalsRecord(input.usage);
|
|
129
|
+
}
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
function getClaudeInputUsage(input) {
|
|
133
|
+
var _a, _b, _c, _d;
|
|
134
|
+
if (!input)
|
|
135
|
+
return null;
|
|
136
|
+
if ((0, utils_1.isRecord)(input.usage)) {
|
|
137
|
+
const parsed = parseClaudeInputUsageRecord(input.usage);
|
|
138
|
+
if (parsed)
|
|
139
|
+
return parsed;
|
|
140
|
+
return input.usage;
|
|
141
|
+
}
|
|
142
|
+
const contextWindow = resolveContextWindow(input);
|
|
143
|
+
if (!contextWindow)
|
|
144
|
+
return null;
|
|
145
|
+
const totals = parseTotalsFromContextWindow(contextWindow);
|
|
146
|
+
if (totals) {
|
|
147
|
+
return {
|
|
148
|
+
todayTokens: null,
|
|
149
|
+
totalTokens: null,
|
|
150
|
+
inputTokens: totals.inputTokens,
|
|
151
|
+
outputTokens: totals.outputTokens,
|
|
152
|
+
cacheReadTokens: totals.cacheReadTokens,
|
|
153
|
+
cacheWriteTokens: totals.cacheWriteTokens,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
const currentUsage = resolveCurrentUsage(contextWindow);
|
|
157
|
+
if (!currentUsage)
|
|
158
|
+
return null;
|
|
159
|
+
const inputTokens = (_a = (0, utils_1.firstNumber)(currentUsage.input_tokens, currentUsage.inputTokens)) !== null && _a !== void 0 ? _a : null;
|
|
160
|
+
const outputTokens = (_b = (0, utils_1.firstNumber)(currentUsage.output_tokens, currentUsage.outputTokens)) !== null && _b !== void 0 ? _b : null;
|
|
161
|
+
const cacheRead = (_c = (0, utils_1.firstNumber)(currentUsage.cache_read_input_tokens, currentUsage.cacheReadInputTokens)) !== null && _c !== void 0 ? _c : null;
|
|
162
|
+
const cacheWrite = (_d = (0, utils_1.firstNumber)(currentUsage.cache_creation_input_tokens, currentUsage.cacheCreationInputTokens)) !== null && _d !== void 0 ? _d : null;
|
|
163
|
+
if (inputTokens === null &&
|
|
164
|
+
outputTokens === null &&
|
|
165
|
+
cacheRead === null &&
|
|
166
|
+
cacheWrite === null) {
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
const totalTokens = (inputTokens || 0) +
|
|
170
|
+
(outputTokens || 0) +
|
|
171
|
+
(cacheRead || 0) +
|
|
172
|
+
(cacheWrite || 0);
|
|
173
|
+
return {
|
|
174
|
+
todayTokens: totalTokens,
|
|
175
|
+
totalTokens: null,
|
|
176
|
+
inputTokens,
|
|
177
|
+
outputTokens,
|
|
178
|
+
cacheReadTokens: cacheRead,
|
|
179
|
+
cacheWriteTokens: cacheWrite,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getCodexUsageTotalsFromInput = getCodexUsageTotalsFromInput;
|
|
4
|
+
exports.getCodexInputUsage = getCodexInputUsage;
|
|
5
|
+
const utils_1 = require("../utils");
|
|
6
|
+
function resolveOutputTokens(record) {
|
|
7
|
+
var _a, _b;
|
|
8
|
+
const outputTokens = (_a = (0, utils_1.firstNumber)(record.outputTokens, record.output, record.output_tokens)) !== null && _a !== void 0 ? _a : null;
|
|
9
|
+
const reasoningTokens = (_b = (0, utils_1.firstNumber)(record.reasoning_output_tokens, record.reasoningOutputTokens, record.reasoning_output)) !== null && _b !== void 0 ? _b : null;
|
|
10
|
+
if (outputTokens !== null)
|
|
11
|
+
return outputTokens;
|
|
12
|
+
if (reasoningTokens !== null)
|
|
13
|
+
return reasoningTokens;
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
function splitInputTokens(record) {
|
|
17
|
+
var _a, _b;
|
|
18
|
+
const rawInput = (_a = (0, utils_1.firstNumber)(record.inputTokens, record.input, record.input_tokens)) !== null && _a !== void 0 ? _a : null;
|
|
19
|
+
const cacheRead = (_b = (0, utils_1.firstNumber)(record.cached_input_tokens, record.cachedInputTokens, record.cache_read_input_tokens, record.cacheReadInputTokens, record.cache_read, record.cacheRead)) !== null && _b !== void 0 ? _b : null;
|
|
20
|
+
if (rawInput === null) {
|
|
21
|
+
return { inputTokens: null, cacheReadTokens: cacheRead };
|
|
22
|
+
}
|
|
23
|
+
if (cacheRead === null) {
|
|
24
|
+
return { inputTokens: rawInput, cacheReadTokens: null };
|
|
25
|
+
}
|
|
26
|
+
const nonCachedInput = Math.max(0, rawInput - cacheRead);
|
|
27
|
+
return { inputTokens: nonCachedInput, cacheReadTokens: cacheRead };
|
|
28
|
+
}
|
|
29
|
+
function parseCodexUsageTotalsRecord(record) {
|
|
30
|
+
var _a, _b;
|
|
31
|
+
const split = splitInputTokens(record);
|
|
32
|
+
const inputTokens = split.inputTokens;
|
|
33
|
+
const outputTokens = resolveOutputTokens(record);
|
|
34
|
+
const cacheRead = split.cacheReadTokens;
|
|
35
|
+
const cacheWrite = (_a = (0, utils_1.firstNumber)(record.cache_creation_input_tokens, record.cacheCreationInputTokens, record.cache_write_input_tokens, record.cacheWriteInputTokens, record.cache_write, record.cacheWrite)) !== null && _a !== void 0 ? _a : null;
|
|
36
|
+
const totalTokens = (_b = (0, utils_1.firstNumber)(record.totalTokens, record.total, record.total_tokens)) !== null && _b !== void 0 ? _b : null;
|
|
37
|
+
let computedTotal = null;
|
|
38
|
+
if (inputTokens !== null ||
|
|
39
|
+
outputTokens !== null ||
|
|
40
|
+
cacheRead !== null ||
|
|
41
|
+
cacheWrite !== null) {
|
|
42
|
+
computedTotal =
|
|
43
|
+
(inputTokens || 0) +
|
|
44
|
+
(outputTokens || 0) +
|
|
45
|
+
(cacheRead || 0) +
|
|
46
|
+
(cacheWrite || 0);
|
|
47
|
+
}
|
|
48
|
+
const resolvedTotal = totalTokens !== null && totalTokens !== void 0 ? totalTokens : computedTotal;
|
|
49
|
+
if (inputTokens === null &&
|
|
50
|
+
outputTokens === null &&
|
|
51
|
+
cacheRead === null &&
|
|
52
|
+
cacheWrite === null &&
|
|
53
|
+
resolvedTotal === null) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
inputTokens,
|
|
58
|
+
outputTokens,
|
|
59
|
+
cacheReadTokens: cacheRead,
|
|
60
|
+
cacheWriteTokens: cacheWrite,
|
|
61
|
+
totalTokens: resolvedTotal,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function parseCodexInputUsageRecord(record) {
|
|
65
|
+
var _a, _b, _c, _d;
|
|
66
|
+
const todayTokens = (_a = (0, utils_1.firstNumber)(record.todayTokens, record.today, record.today_tokens, record.daily, record.daily_tokens)) !== null && _a !== void 0 ? _a : null;
|
|
67
|
+
const totalTokens = (_b = (0, utils_1.firstNumber)(record.totalTokens, record.total, record.total_tokens)) !== null && _b !== void 0 ? _b : null;
|
|
68
|
+
const split = splitInputTokens(record);
|
|
69
|
+
const inputTokens = split.inputTokens;
|
|
70
|
+
const outputTokens = resolveOutputTokens(record);
|
|
71
|
+
const cacheRead = split.cacheReadTokens;
|
|
72
|
+
const cacheWrite = (_c = (0, utils_1.firstNumber)(record.cache_creation_input_tokens, record.cacheCreationInputTokens, record.cache_write_input_tokens, record.cacheWriteInputTokens, record.cache_write, record.cacheWrite)) !== null && _c !== void 0 ? _c : null;
|
|
73
|
+
if (todayTokens === null &&
|
|
74
|
+
totalTokens === null &&
|
|
75
|
+
inputTokens === null &&
|
|
76
|
+
outputTokens === null &&
|
|
77
|
+
cacheRead === null &&
|
|
78
|
+
cacheWrite === null) {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
const hasCacheTokens = cacheRead !== null || cacheWrite !== null;
|
|
82
|
+
const computedTotal = hasCacheTokens
|
|
83
|
+
? (inputTokens || 0) +
|
|
84
|
+
(outputTokens || 0) +
|
|
85
|
+
(cacheRead || 0) +
|
|
86
|
+
(cacheWrite || 0)
|
|
87
|
+
: null;
|
|
88
|
+
const resolvedTodayTokens = hasCacheTokens
|
|
89
|
+
? (_d = todayTokens !== null && todayTokens !== void 0 ? todayTokens : totalTokens) !== null && _d !== void 0 ? _d : computedTotal
|
|
90
|
+
: todayTokens;
|
|
91
|
+
return {
|
|
92
|
+
todayTokens: resolvedTodayTokens,
|
|
93
|
+
totalTokens: totalTokens !== null && totalTokens !== void 0 ? totalTokens : null,
|
|
94
|
+
inputTokens,
|
|
95
|
+
outputTokens,
|
|
96
|
+
cacheReadTokens: cacheRead,
|
|
97
|
+
cacheWriteTokens: cacheWrite,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
function resolveNestedRecord(record, ...keys) {
|
|
101
|
+
for (const key of keys) {
|
|
102
|
+
if ((0, utils_1.isRecord)(record[key])) {
|
|
103
|
+
return record[key];
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
function getCodexUsageTotalsFromInput(input) {
|
|
109
|
+
if (!input)
|
|
110
|
+
return null;
|
|
111
|
+
const tokenUsage = input.token_usage;
|
|
112
|
+
if (typeof tokenUsage === "number") {
|
|
113
|
+
return {
|
|
114
|
+
inputTokens: null,
|
|
115
|
+
outputTokens: null,
|
|
116
|
+
cacheReadTokens: null,
|
|
117
|
+
cacheWriteTokens: null,
|
|
118
|
+
totalTokens: (0, utils_1.coerceNumber)(tokenUsage),
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
if ((0, utils_1.isRecord)(tokenUsage)) {
|
|
122
|
+
const totalUsage = resolveNestedRecord(tokenUsage, "total_token_usage", "totalTokenUsage");
|
|
123
|
+
if (totalUsage) {
|
|
124
|
+
const parsed = parseCodexUsageTotalsRecord(totalUsage);
|
|
125
|
+
if (parsed)
|
|
126
|
+
return parsed;
|
|
127
|
+
}
|
|
128
|
+
const parsed = parseCodexUsageTotalsRecord(tokenUsage);
|
|
129
|
+
if (parsed)
|
|
130
|
+
return parsed;
|
|
131
|
+
}
|
|
132
|
+
if ((0, utils_1.isRecord)(input.usage)) {
|
|
133
|
+
return parseCodexUsageTotalsRecord(input.usage);
|
|
134
|
+
}
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
function getCodexInputUsage(input) {
|
|
138
|
+
if (!input)
|
|
139
|
+
return null;
|
|
140
|
+
if ((0, utils_1.isRecord)(input.usage)) {
|
|
141
|
+
const parsed = parseCodexInputUsageRecord(input.usage);
|
|
142
|
+
if (parsed)
|
|
143
|
+
return parsed;
|
|
144
|
+
return input.usage;
|
|
145
|
+
}
|
|
146
|
+
const tokenUsage = input.token_usage;
|
|
147
|
+
if (tokenUsage !== null && tokenUsage !== undefined) {
|
|
148
|
+
if (typeof tokenUsage === "number") {
|
|
149
|
+
return {
|
|
150
|
+
todayTokens: null,
|
|
151
|
+
totalTokens: (0, utils_1.coerceNumber)(tokenUsage),
|
|
152
|
+
inputTokens: null,
|
|
153
|
+
outputTokens: null,
|
|
154
|
+
cacheReadTokens: null,
|
|
155
|
+
cacheWriteTokens: null,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
if ((0, utils_1.isRecord)(tokenUsage)) {
|
|
159
|
+
const totalUsage = resolveNestedRecord(tokenUsage, "total_token_usage", "totalTokenUsage");
|
|
160
|
+
if (totalUsage) {
|
|
161
|
+
const parsed = parseCodexInputUsageRecord(totalUsage);
|
|
162
|
+
if (parsed)
|
|
163
|
+
return parsed;
|
|
164
|
+
}
|
|
165
|
+
const lastUsage = resolveNestedRecord(tokenUsage, "last_token_usage", "lastTokenUsage");
|
|
166
|
+
if (lastUsage) {
|
|
167
|
+
const parsed = parseCodexInputUsageRecord(lastUsage);
|
|
168
|
+
if (parsed)
|
|
169
|
+
return parsed;
|
|
170
|
+
}
|
|
171
|
+
const parsed = parseCodexInputUsageRecord(tokenUsage);
|
|
172
|
+
if (parsed)
|
|
173
|
+
return parsed;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return null;
|
|
177
|
+
}
|
package/bin/statusline/usage.js
CHANGED
|
@@ -1,88 +1,25 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.parseUsageTotalsRecord = parseUsageTotalsRecord;
|
|
4
3
|
exports.getUsageTotalsFromInput = getUsageTotalsFromInput;
|
|
5
4
|
exports.normalizeInputUsage = normalizeInputUsage;
|
|
6
5
|
exports.resolveUsageFromRecords = resolveUsageFromRecords;
|
|
7
6
|
const type_1 = require("../profile/type");
|
|
8
7
|
const usage_1 = require("../usage");
|
|
9
8
|
const utils_1 = require("./utils");
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const outputTokens = (_b = (0, utils_1.firstNumber)(record.outputTokens, record.output, record.output_tokens)) !== null && _b !== void 0 ? _b : null;
|
|
14
|
-
const totalTokens = (_c = (0, utils_1.firstNumber)(record.totalTokens, record.total, record.total_tokens)) !== null && _c !== void 0 ? _c : null;
|
|
15
|
-
const cacheRead = (_d = (0, utils_1.firstNumber)(record.cache_read_input_tokens, record.cacheReadInputTokens, record.cache_read, record.cacheRead)) !== null && _d !== void 0 ? _d : null;
|
|
16
|
-
const cacheWrite = (_e = (0, utils_1.firstNumber)(record.cache_creation_input_tokens, record.cacheCreationInputTokens, record.cache_write_input_tokens, record.cacheWriteInputTokens, record.cache_write, record.cacheWrite)) !== null && _e !== void 0 ? _e : null;
|
|
17
|
-
let computedTotal = null;
|
|
18
|
-
if (inputTokens !== null ||
|
|
19
|
-
outputTokens !== null ||
|
|
20
|
-
cacheRead !== null ||
|
|
21
|
-
cacheWrite !== null) {
|
|
22
|
-
computedTotal =
|
|
23
|
-
(inputTokens || 0) +
|
|
24
|
-
(outputTokens || 0) +
|
|
25
|
-
(cacheRead || 0) +
|
|
26
|
-
(cacheWrite || 0);
|
|
27
|
-
}
|
|
28
|
-
const resolvedTotal = totalTokens !== null && totalTokens !== void 0 ? totalTokens : computedTotal;
|
|
29
|
-
if (inputTokens === null &&
|
|
30
|
-
outputTokens === null &&
|
|
31
|
-
resolvedTotal === null) {
|
|
32
|
-
return null;
|
|
33
|
-
}
|
|
34
|
-
return {
|
|
35
|
-
inputTokens,
|
|
36
|
-
outputTokens,
|
|
37
|
-
totalTokens: resolvedTotal,
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
function getUsageTotalsFromInput(input) {
|
|
41
|
-
var _a, _b;
|
|
9
|
+
const claude_1 = require("./usage/claude");
|
|
10
|
+
const codex_1 = require("./usage/codex");
|
|
11
|
+
function getUsageTotalsFromInput(input, type) {
|
|
42
12
|
if (!input)
|
|
43
13
|
return null;
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
? input.contextWindow
|
|
48
|
-
: null;
|
|
49
|
-
if (contextWindow) {
|
|
50
|
-
const totalInputTokens = (_a = (0, utils_1.firstNumber)(contextWindow.total_input_tokens, contextWindow.totalInputTokens)) !== null && _a !== void 0 ? _a : null;
|
|
51
|
-
const totalOutputTokens = (_b = (0, utils_1.firstNumber)(contextWindow.total_output_tokens, contextWindow.totalOutputTokens)) !== null && _b !== void 0 ? _b : null;
|
|
52
|
-
if (totalInputTokens !== null || totalOutputTokens !== null) {
|
|
53
|
-
return {
|
|
54
|
-
inputTokens: totalInputTokens,
|
|
55
|
-
outputTokens: totalOutputTokens,
|
|
56
|
-
totalTokens: (totalInputTokens || 0) + (totalOutputTokens || 0),
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
if (typeof input.token_usage === "number") {
|
|
61
|
-
return {
|
|
62
|
-
inputTokens: null,
|
|
63
|
-
outputTokens: null,
|
|
64
|
-
totalTokens: (0, utils_1.coerceNumber)(input.token_usage),
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
if ((0, utils_1.isRecord)(input.token_usage)) {
|
|
68
|
-
const tokenUsage = input.token_usage;
|
|
69
|
-
const totalUsage = ((0, utils_1.isRecord)(tokenUsage.total_token_usage)
|
|
70
|
-
? tokenUsage.total_token_usage
|
|
71
|
-
: null) ||
|
|
72
|
-
((0, utils_1.isRecord)(tokenUsage.totalTokenUsage)
|
|
73
|
-
? tokenUsage.totalTokenUsage
|
|
74
|
-
: null);
|
|
75
|
-
if (totalUsage) {
|
|
76
|
-
const parsed = parseUsageTotalsRecord(totalUsage);
|
|
77
|
-
if (parsed)
|
|
78
|
-
return parsed;
|
|
79
|
-
}
|
|
80
|
-
return parseUsageTotalsRecord(tokenUsage);
|
|
14
|
+
const normalized = (0, type_1.normalizeType)(type || "");
|
|
15
|
+
if (normalized === "codex") {
|
|
16
|
+
return (0, codex_1.getCodexUsageTotalsFromInput)(input);
|
|
81
17
|
}
|
|
82
|
-
if (
|
|
83
|
-
return
|
|
18
|
+
if (normalized === "claude") {
|
|
19
|
+
return (0, claude_1.getClaudeUsageTotalsFromInput)(input);
|
|
84
20
|
}
|
|
85
|
-
return
|
|
21
|
+
return ((0, codex_1.getCodexUsageTotalsFromInput)(input) ||
|
|
22
|
+
(0, claude_1.getClaudeUsageTotalsFromInput)(input));
|
|
86
23
|
}
|
|
87
24
|
function normalizeInputUsage(inputUsage) {
|
|
88
25
|
if (!inputUsage)
|
|
@@ -92,14 +29,19 @@ function normalizeInputUsage(inputUsage) {
|
|
|
92
29
|
totalTokens: (0, utils_1.coerceNumber)(inputUsage.totalTokens),
|
|
93
30
|
inputTokens: (0, utils_1.coerceNumber)(inputUsage.inputTokens),
|
|
94
31
|
outputTokens: (0, utils_1.coerceNumber)(inputUsage.outputTokens),
|
|
32
|
+
cacheReadTokens: (0, utils_1.coerceNumber)(inputUsage.cacheReadTokens),
|
|
33
|
+
cacheWriteTokens: (0, utils_1.coerceNumber)(inputUsage.cacheWriteTokens),
|
|
95
34
|
};
|
|
96
35
|
const hasUsage = usage.todayTokens !== null ||
|
|
97
36
|
usage.totalTokens !== null ||
|
|
98
37
|
usage.inputTokens !== null ||
|
|
99
|
-
usage.outputTokens !== null
|
|
38
|
+
usage.outputTokens !== null ||
|
|
39
|
+
usage.cacheReadTokens !== null ||
|
|
40
|
+
usage.cacheWriteTokens !== null;
|
|
100
41
|
return hasUsage ? usage : null;
|
|
101
42
|
}
|
|
102
43
|
function resolveUsageFromRecords(config, configPath, type, profileKey, profileName, syncUsage) {
|
|
44
|
+
var _a, _b, _c, _d;
|
|
103
45
|
try {
|
|
104
46
|
const normalized = (0, type_1.normalizeType)(type || "");
|
|
105
47
|
if (!normalized || (!profileKey && !profileName))
|
|
@@ -113,8 +55,10 @@ function resolveUsageFromRecords(config, configPath, type, profileKey, profileNa
|
|
|
113
55
|
return {
|
|
114
56
|
todayTokens: usage.today,
|
|
115
57
|
totalTokens: usage.total,
|
|
116
|
-
inputTokens: null,
|
|
117
|
-
outputTokens: null,
|
|
58
|
+
inputTokens: (_a = usage.todayInput) !== null && _a !== void 0 ? _a : null,
|
|
59
|
+
outputTokens: (_b = usage.todayOutput) !== null && _b !== void 0 ? _b : null,
|
|
60
|
+
cacheReadTokens: (_c = usage.todayCacheRead) !== null && _c !== void 0 ? _c : null,
|
|
61
|
+
cacheWriteTokens: (_d = usage.todayCacheWrite) !== null && _d !== void 0 ? _d : null,
|
|
118
62
|
};
|
|
119
63
|
}
|
|
120
64
|
catch {
|