@praeviso/code-env-switch 0.1.3 → 0.1.5
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 +17 -0
- package/README_zh.md +17 -0
- package/bin/commands/list.js +44 -2
- package/bin/statusline/debug.js +42 -0
- package/bin/statusline/format.js +57 -0
- package/bin/statusline/git.js +96 -0
- package/bin/statusline/index.js +107 -558
- package/bin/statusline/input.js +167 -0
- package/bin/statusline/style.js +22 -0
- package/bin/statusline/types.js +2 -0
- package/bin/statusline/usage/claude.js +181 -0
- package/bin/statusline/usage/codex.js +168 -0
- package/bin/statusline/usage.js +67 -0
- package/bin/statusline/utils.js +35 -0
- package/bin/usage/index.js +396 -41
- package/bin/usage/pricing.js +303 -0
- package/code-env.example.json +55 -0
- package/package.json +1 -1
- package/src/commands/list.ts +74 -4
- package/src/statusline/debug.ts +40 -0
- package/src/statusline/format.ts +67 -0
- package/src/statusline/git.ts +82 -0
- package/src/statusline/index.ts +143 -764
- package/src/statusline/input.ts +159 -0
- package/src/statusline/style.ts +19 -0
- package/src/statusline/types.ts +111 -0
- package/src/statusline/usage/claude.ts +299 -0
- package/src/statusline/usage/codex.ts +263 -0
- package/src/statusline/usage.ts +80 -0
- package/src/statusline/utils.ts +27 -0
- package/src/types.ts +23 -0
- package/src/usage/index.ts +519 -35
- package/src/usage/pricing.ts +323 -0
- package/PLAN.md +0 -33
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.readStdinJson = readStdinJson;
|
|
4
|
+
exports.normalizeTypeValue = normalizeTypeValue;
|
|
5
|
+
exports.detectTypeFromEnv = detectTypeFromEnv;
|
|
6
|
+
exports.resolveEnvProfile = resolveEnvProfile;
|
|
7
|
+
exports.getModelFromInput = getModelFromInput;
|
|
8
|
+
exports.getModelProviderFromInput = getModelProviderFromInput;
|
|
9
|
+
exports.getInputProfile = getInputProfile;
|
|
10
|
+
exports.getInputUsage = getInputUsage;
|
|
11
|
+
exports.getSessionId = getSessionId;
|
|
12
|
+
exports.getContextUsedTokens = getContextUsedTokens;
|
|
13
|
+
exports.getContextLeftPercent = getContextLeftPercent;
|
|
14
|
+
exports.getWorkspaceDir = getWorkspaceDir;
|
|
15
|
+
exports.getGitStatusFromInput = getGitStatusFromInput;
|
|
16
|
+
const fs = require("fs");
|
|
17
|
+
const constants_1 = require("../constants");
|
|
18
|
+
const type_1 = require("../profile/type");
|
|
19
|
+
const utils_1 = require("./utils");
|
|
20
|
+
const claude_1 = require("./usage/claude");
|
|
21
|
+
const codex_1 = require("./usage/codex");
|
|
22
|
+
function readStdinJson() {
|
|
23
|
+
if (process.stdin.isTTY)
|
|
24
|
+
return null;
|
|
25
|
+
try {
|
|
26
|
+
const raw = fs.readFileSync(0, "utf8");
|
|
27
|
+
const trimmed = raw.trim();
|
|
28
|
+
if (!trimmed)
|
|
29
|
+
return null;
|
|
30
|
+
const parsed = JSON.parse(trimmed);
|
|
31
|
+
if (!(0, utils_1.isRecord)(parsed))
|
|
32
|
+
return null;
|
|
33
|
+
return parsed;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function normalizeTypeValue(value) {
|
|
40
|
+
if (!value)
|
|
41
|
+
return null;
|
|
42
|
+
const normalized = (0, type_1.normalizeType)(value);
|
|
43
|
+
if (normalized)
|
|
44
|
+
return normalized;
|
|
45
|
+
const trimmed = String(value).trim();
|
|
46
|
+
return trimmed ? trimmed : null;
|
|
47
|
+
}
|
|
48
|
+
function detectTypeFromEnv() {
|
|
49
|
+
const matches = constants_1.DEFAULT_PROFILE_TYPES.filter((type) => {
|
|
50
|
+
const suffix = type.toUpperCase();
|
|
51
|
+
return (process.env[`CODE_ENV_PROFILE_KEY_${suffix}`] ||
|
|
52
|
+
process.env[`CODE_ENV_PROFILE_NAME_${suffix}`]);
|
|
53
|
+
});
|
|
54
|
+
if (matches.length === 1)
|
|
55
|
+
return matches[0];
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
function resolveEnvProfile(type) {
|
|
59
|
+
const genericKey = process.env.CODE_ENV_PROFILE_KEY || null;
|
|
60
|
+
const genericName = process.env.CODE_ENV_PROFILE_NAME || null;
|
|
61
|
+
if (!type) {
|
|
62
|
+
return { key: genericKey, name: genericName };
|
|
63
|
+
}
|
|
64
|
+
const suffix = type.toUpperCase();
|
|
65
|
+
const key = process.env[`CODE_ENV_PROFILE_KEY_${suffix}`] || genericKey;
|
|
66
|
+
const name = process.env[`CODE_ENV_PROFILE_NAME_${suffix}`] || genericName;
|
|
67
|
+
return { key: key || null, name: name || null };
|
|
68
|
+
}
|
|
69
|
+
function getModelFromInput(input) {
|
|
70
|
+
if (!input)
|
|
71
|
+
return null;
|
|
72
|
+
const raw = input.model;
|
|
73
|
+
if (!raw)
|
|
74
|
+
return null;
|
|
75
|
+
if (typeof raw === "string")
|
|
76
|
+
return raw;
|
|
77
|
+
if ((0, utils_1.isRecord)(raw)) {
|
|
78
|
+
const displayName = raw.displayName || raw.display_name;
|
|
79
|
+
if (displayName)
|
|
80
|
+
return String(displayName);
|
|
81
|
+
if (raw.id)
|
|
82
|
+
return String(raw.id);
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
function getModelProviderFromInput(input) {
|
|
87
|
+
if (!input || !input.model_provider)
|
|
88
|
+
return null;
|
|
89
|
+
const provider = String(input.model_provider).trim();
|
|
90
|
+
return provider ? provider : null;
|
|
91
|
+
}
|
|
92
|
+
function getInputProfile(input) {
|
|
93
|
+
if (!input || !(0, utils_1.isRecord)(input.profile))
|
|
94
|
+
return null;
|
|
95
|
+
return input.profile;
|
|
96
|
+
}
|
|
97
|
+
function getInputUsage(input, type) {
|
|
98
|
+
if (!input)
|
|
99
|
+
return null;
|
|
100
|
+
const normalized = normalizeTypeValue(type);
|
|
101
|
+
if (normalized === "codex") {
|
|
102
|
+
return (0, codex_1.getCodexInputUsage)(input);
|
|
103
|
+
}
|
|
104
|
+
if (normalized === "claude") {
|
|
105
|
+
return (0, claude_1.getClaudeInputUsage)(input);
|
|
106
|
+
}
|
|
107
|
+
return (0, codex_1.getCodexInputUsage)(input) || (0, claude_1.getClaudeInputUsage)(input);
|
|
108
|
+
}
|
|
109
|
+
function getSessionId(input) {
|
|
110
|
+
if (!input)
|
|
111
|
+
return null;
|
|
112
|
+
return (0, utils_1.firstNonEmpty)(input.session_id, input.sessionId);
|
|
113
|
+
}
|
|
114
|
+
function getContextUsedTokens(input) {
|
|
115
|
+
if (!input)
|
|
116
|
+
return null;
|
|
117
|
+
return (0, utils_1.coerceNumber)(input.context_window_used_tokens);
|
|
118
|
+
}
|
|
119
|
+
function getContextLeftPercent(input, type) {
|
|
120
|
+
if (!input)
|
|
121
|
+
return null;
|
|
122
|
+
const raw = (0, utils_1.coerceNumber)(input.context_window_percent);
|
|
123
|
+
if (raw === null || raw < 0)
|
|
124
|
+
return null;
|
|
125
|
+
const percent = raw <= 1 ? raw * 100 : raw;
|
|
126
|
+
if (percent > 100)
|
|
127
|
+
return null;
|
|
128
|
+
const usedTokens = getContextUsedTokens(input);
|
|
129
|
+
const normalizedType = normalizeTypeValue(type);
|
|
130
|
+
const preferRemaining = normalizedType === "codex" ||
|
|
131
|
+
normalizedType === "claude" ||
|
|
132
|
+
usedTokens === null ||
|
|
133
|
+
(usedTokens <= 0 && percent >= 99);
|
|
134
|
+
const left = preferRemaining ? percent : 100 - percent;
|
|
135
|
+
return Math.max(0, Math.min(100, left));
|
|
136
|
+
}
|
|
137
|
+
function getWorkspaceDir(input) {
|
|
138
|
+
if (!input || !(0, utils_1.isRecord)(input.workspace))
|
|
139
|
+
return null;
|
|
140
|
+
const currentDir = input.workspace.current_dir;
|
|
141
|
+
if (currentDir) {
|
|
142
|
+
const trimmed = String(currentDir).trim();
|
|
143
|
+
if (trimmed)
|
|
144
|
+
return trimmed;
|
|
145
|
+
}
|
|
146
|
+
const projectDir = input.workspace.project_dir;
|
|
147
|
+
if (!projectDir)
|
|
148
|
+
return null;
|
|
149
|
+
const trimmed = String(projectDir).trim();
|
|
150
|
+
return trimmed ? trimmed : null;
|
|
151
|
+
}
|
|
152
|
+
function getGitStatusFromInput(input) {
|
|
153
|
+
if (!input || !input.git_branch)
|
|
154
|
+
return null;
|
|
155
|
+
const branch = String(input.git_branch).trim();
|
|
156
|
+
if (!branch)
|
|
157
|
+
return null;
|
|
158
|
+
return {
|
|
159
|
+
branch,
|
|
160
|
+
ahead: 0,
|
|
161
|
+
behind: 0,
|
|
162
|
+
staged: 0,
|
|
163
|
+
unstaged: 0,
|
|
164
|
+
untracked: 0,
|
|
165
|
+
conflicted: 0,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ICON_CWD = exports.ICON_REVIEW = exports.ICON_CONTEXT = exports.ICON_USAGE = exports.ICON_MODEL = exports.ICON_PROFILE = exports.ICON_GIT = void 0;
|
|
4
|
+
exports.colorize = colorize;
|
|
5
|
+
exports.dim = dim;
|
|
6
|
+
const COLOR_ENABLED = !process.env.NO_COLOR && process.env.TERM !== "dumb";
|
|
7
|
+
const ANSI_RESET = "\x1b[0m";
|
|
8
|
+
exports.ICON_GIT = "⎇";
|
|
9
|
+
exports.ICON_PROFILE = "👤";
|
|
10
|
+
exports.ICON_MODEL = "⚙";
|
|
11
|
+
exports.ICON_USAGE = "⚡";
|
|
12
|
+
exports.ICON_CONTEXT = "🧠";
|
|
13
|
+
exports.ICON_REVIEW = "📝";
|
|
14
|
+
exports.ICON_CWD = "📁";
|
|
15
|
+
function colorize(text, colorCode) {
|
|
16
|
+
if (!COLOR_ENABLED)
|
|
17
|
+
return text;
|
|
18
|
+
return `\x1b[${colorCode}m${text}${ANSI_RESET}`;
|
|
19
|
+
}
|
|
20
|
+
function dim(text) {
|
|
21
|
+
return colorize(text, "2");
|
|
22
|
+
}
|
|
@@ -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,168 @@
|
|
|
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 && reasoningTokens === null)
|
|
11
|
+
return null;
|
|
12
|
+
if (reasoningTokens === null)
|
|
13
|
+
return outputTokens;
|
|
14
|
+
return (outputTokens || 0) + reasoningTokens;
|
|
15
|
+
}
|
|
16
|
+
function parseCodexUsageTotalsRecord(record) {
|
|
17
|
+
var _a, _b, _c, _d;
|
|
18
|
+
const inputTokens = (_a = (0, utils_1.firstNumber)(record.inputTokens, record.input, record.input_tokens)) !== null && _a !== void 0 ? _a : null;
|
|
19
|
+
const outputTokens = resolveOutputTokens(record);
|
|
20
|
+
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;
|
|
21
|
+
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;
|
|
22
|
+
const totalTokens = (_d = (0, utils_1.firstNumber)(record.totalTokens, record.total, record.total_tokens)) !== null && _d !== void 0 ? _d : null;
|
|
23
|
+
let computedTotal = null;
|
|
24
|
+
if (inputTokens !== null ||
|
|
25
|
+
outputTokens !== null ||
|
|
26
|
+
cacheRead !== null ||
|
|
27
|
+
cacheWrite !== null) {
|
|
28
|
+
computedTotal =
|
|
29
|
+
(inputTokens || 0) +
|
|
30
|
+
(outputTokens || 0) +
|
|
31
|
+
(cacheRead || 0) +
|
|
32
|
+
(cacheWrite || 0);
|
|
33
|
+
}
|
|
34
|
+
const resolvedTotal = totalTokens !== null && totalTokens !== void 0 ? totalTokens : computedTotal;
|
|
35
|
+
if (inputTokens === null &&
|
|
36
|
+
outputTokens === null &&
|
|
37
|
+
cacheRead === null &&
|
|
38
|
+
cacheWrite === null &&
|
|
39
|
+
resolvedTotal === null) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
inputTokens,
|
|
44
|
+
outputTokens,
|
|
45
|
+
cacheReadTokens: cacheRead,
|
|
46
|
+
cacheWriteTokens: cacheWrite,
|
|
47
|
+
totalTokens: resolvedTotal,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function parseCodexInputUsageRecord(record) {
|
|
51
|
+
var _a, _b, _c, _d, _e, _f;
|
|
52
|
+
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;
|
|
53
|
+
const totalTokens = (_b = (0, utils_1.firstNumber)(record.totalTokens, record.total, record.total_tokens)) !== null && _b !== void 0 ? _b : null;
|
|
54
|
+
const inputTokens = (_c = (0, utils_1.firstNumber)(record.inputTokens, record.input, record.input_tokens)) !== null && _c !== void 0 ? _c : null;
|
|
55
|
+
const outputTokens = resolveOutputTokens(record);
|
|
56
|
+
const cacheRead = (_d = (0, utils_1.firstNumber)(record.cached_input_tokens, record.cachedInputTokens, record.cache_read_input_tokens, record.cacheReadInputTokens, record.cache_read, record.cacheRead)) !== null && _d !== void 0 ? _d : null;
|
|
57
|
+
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;
|
|
58
|
+
if (todayTokens === null &&
|
|
59
|
+
totalTokens === null &&
|
|
60
|
+
inputTokens === null &&
|
|
61
|
+
outputTokens === null &&
|
|
62
|
+
cacheRead === null &&
|
|
63
|
+
cacheWrite === null) {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
const hasCacheTokens = cacheRead !== null || cacheWrite !== null;
|
|
67
|
+
const computedTotal = hasCacheTokens
|
|
68
|
+
? (inputTokens || 0) +
|
|
69
|
+
(outputTokens || 0) +
|
|
70
|
+
(cacheRead || 0) +
|
|
71
|
+
(cacheWrite || 0)
|
|
72
|
+
: null;
|
|
73
|
+
const resolvedTodayTokens = hasCacheTokens
|
|
74
|
+
? (_f = todayTokens !== null && todayTokens !== void 0 ? todayTokens : totalTokens) !== null && _f !== void 0 ? _f : computedTotal
|
|
75
|
+
: todayTokens;
|
|
76
|
+
return {
|
|
77
|
+
todayTokens: resolvedTodayTokens,
|
|
78
|
+
totalTokens: totalTokens !== null && totalTokens !== void 0 ? totalTokens : null,
|
|
79
|
+
inputTokens,
|
|
80
|
+
outputTokens,
|
|
81
|
+
cacheReadTokens: cacheRead,
|
|
82
|
+
cacheWriteTokens: cacheWrite,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function resolveNestedRecord(record, ...keys) {
|
|
86
|
+
for (const key of keys) {
|
|
87
|
+
if ((0, utils_1.isRecord)(record[key])) {
|
|
88
|
+
return record[key];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
function getCodexUsageTotalsFromInput(input) {
|
|
94
|
+
if (!input)
|
|
95
|
+
return null;
|
|
96
|
+
const tokenUsage = input.token_usage;
|
|
97
|
+
if (typeof tokenUsage === "number") {
|
|
98
|
+
return {
|
|
99
|
+
inputTokens: null,
|
|
100
|
+
outputTokens: null,
|
|
101
|
+
cacheReadTokens: null,
|
|
102
|
+
cacheWriteTokens: null,
|
|
103
|
+
totalTokens: (0, utils_1.coerceNumber)(tokenUsage),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
if ((0, utils_1.isRecord)(tokenUsage)) {
|
|
107
|
+
const totalUsage = resolveNestedRecord(tokenUsage, "total_token_usage", "totalTokenUsage");
|
|
108
|
+
if (totalUsage) {
|
|
109
|
+
const parsed = parseCodexUsageTotalsRecord(totalUsage);
|
|
110
|
+
if (parsed)
|
|
111
|
+
return parsed;
|
|
112
|
+
}
|
|
113
|
+
const lastUsage = resolveNestedRecord(tokenUsage, "last_token_usage", "lastTokenUsage");
|
|
114
|
+
if (lastUsage) {
|
|
115
|
+
const parsed = parseCodexUsageTotalsRecord(lastUsage);
|
|
116
|
+
if (parsed)
|
|
117
|
+
return parsed;
|
|
118
|
+
}
|
|
119
|
+
const parsed = parseCodexUsageTotalsRecord(tokenUsage);
|
|
120
|
+
if (parsed)
|
|
121
|
+
return parsed;
|
|
122
|
+
}
|
|
123
|
+
if ((0, utils_1.isRecord)(input.usage)) {
|
|
124
|
+
return parseCodexUsageTotalsRecord(input.usage);
|
|
125
|
+
}
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
function getCodexInputUsage(input) {
|
|
129
|
+
if (!input)
|
|
130
|
+
return null;
|
|
131
|
+
if ((0, utils_1.isRecord)(input.usage)) {
|
|
132
|
+
const parsed = parseCodexInputUsageRecord(input.usage);
|
|
133
|
+
if (parsed)
|
|
134
|
+
return parsed;
|
|
135
|
+
return input.usage;
|
|
136
|
+
}
|
|
137
|
+
const tokenUsage = input.token_usage;
|
|
138
|
+
if (tokenUsage !== null && tokenUsage !== undefined) {
|
|
139
|
+
if (typeof tokenUsage === "number") {
|
|
140
|
+
return {
|
|
141
|
+
todayTokens: null,
|
|
142
|
+
totalTokens: (0, utils_1.coerceNumber)(tokenUsage),
|
|
143
|
+
inputTokens: null,
|
|
144
|
+
outputTokens: null,
|
|
145
|
+
cacheReadTokens: null,
|
|
146
|
+
cacheWriteTokens: null,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
if ((0, utils_1.isRecord)(tokenUsage)) {
|
|
150
|
+
const totalUsage = resolveNestedRecord(tokenUsage, "total_token_usage", "totalTokenUsage");
|
|
151
|
+
if (totalUsage) {
|
|
152
|
+
const parsed = parseCodexInputUsageRecord(totalUsage);
|
|
153
|
+
if (parsed)
|
|
154
|
+
return parsed;
|
|
155
|
+
}
|
|
156
|
+
const lastUsage = resolveNestedRecord(tokenUsage, "last_token_usage", "lastTokenUsage");
|
|
157
|
+
if (lastUsage) {
|
|
158
|
+
const parsed = parseCodexInputUsageRecord(lastUsage);
|
|
159
|
+
if (parsed)
|
|
160
|
+
return parsed;
|
|
161
|
+
}
|
|
162
|
+
const parsed = parseCodexInputUsageRecord(tokenUsage);
|
|
163
|
+
if (parsed)
|
|
164
|
+
return parsed;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getUsageTotalsFromInput = getUsageTotalsFromInput;
|
|
4
|
+
exports.normalizeInputUsage = normalizeInputUsage;
|
|
5
|
+
exports.resolveUsageFromRecords = resolveUsageFromRecords;
|
|
6
|
+
const type_1 = require("../profile/type");
|
|
7
|
+
const usage_1 = require("../usage");
|
|
8
|
+
const utils_1 = require("./utils");
|
|
9
|
+
const claude_1 = require("./usage/claude");
|
|
10
|
+
const codex_1 = require("./usage/codex");
|
|
11
|
+
function getUsageTotalsFromInput(input, type) {
|
|
12
|
+
if (!input)
|
|
13
|
+
return null;
|
|
14
|
+
const normalized = (0, type_1.normalizeType)(type || "");
|
|
15
|
+
if (normalized === "codex") {
|
|
16
|
+
return (0, codex_1.getCodexUsageTotalsFromInput)(input);
|
|
17
|
+
}
|
|
18
|
+
if (normalized === "claude") {
|
|
19
|
+
return (0, claude_1.getClaudeUsageTotalsFromInput)(input);
|
|
20
|
+
}
|
|
21
|
+
return ((0, codex_1.getCodexUsageTotalsFromInput)(input) ||
|
|
22
|
+
(0, claude_1.getClaudeUsageTotalsFromInput)(input));
|
|
23
|
+
}
|
|
24
|
+
function normalizeInputUsage(inputUsage) {
|
|
25
|
+
if (!inputUsage)
|
|
26
|
+
return null;
|
|
27
|
+
const usage = {
|
|
28
|
+
todayTokens: (0, utils_1.coerceNumber)(inputUsage.todayTokens),
|
|
29
|
+
totalTokens: (0, utils_1.coerceNumber)(inputUsage.totalTokens),
|
|
30
|
+
inputTokens: (0, utils_1.coerceNumber)(inputUsage.inputTokens),
|
|
31
|
+
outputTokens: (0, utils_1.coerceNumber)(inputUsage.outputTokens),
|
|
32
|
+
cacheReadTokens: (0, utils_1.coerceNumber)(inputUsage.cacheReadTokens),
|
|
33
|
+
cacheWriteTokens: (0, utils_1.coerceNumber)(inputUsage.cacheWriteTokens),
|
|
34
|
+
};
|
|
35
|
+
const hasUsage = usage.todayTokens !== null ||
|
|
36
|
+
usage.totalTokens !== null ||
|
|
37
|
+
usage.inputTokens !== null ||
|
|
38
|
+
usage.outputTokens !== null ||
|
|
39
|
+
usage.cacheReadTokens !== null ||
|
|
40
|
+
usage.cacheWriteTokens !== null;
|
|
41
|
+
return hasUsage ? usage : null;
|
|
42
|
+
}
|
|
43
|
+
function resolveUsageFromRecords(config, configPath, type, profileKey, profileName, syncUsage) {
|
|
44
|
+
var _a, _b, _c, _d;
|
|
45
|
+
try {
|
|
46
|
+
const normalized = (0, type_1.normalizeType)(type || "");
|
|
47
|
+
if (!normalized || (!profileKey && !profileName))
|
|
48
|
+
return null;
|
|
49
|
+
const totals = (0, usage_1.readUsageTotalsIndex)(config, configPath, syncUsage);
|
|
50
|
+
if (!totals)
|
|
51
|
+
return null;
|
|
52
|
+
const usage = (0, usage_1.resolveUsageTotalsForProfile)(totals, normalized, profileKey, profileName);
|
|
53
|
+
if (!usage)
|
|
54
|
+
return null;
|
|
55
|
+
return {
|
|
56
|
+
todayTokens: usage.today,
|
|
57
|
+
totalTokens: usage.total,
|
|
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,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isRecord = isRecord;
|
|
4
|
+
exports.firstNonEmpty = firstNonEmpty;
|
|
5
|
+
exports.coerceNumber = coerceNumber;
|
|
6
|
+
exports.firstNumber = firstNumber;
|
|
7
|
+
function isRecord(value) {
|
|
8
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
9
|
+
}
|
|
10
|
+
function firstNonEmpty(...values) {
|
|
11
|
+
for (const value of values) {
|
|
12
|
+
if (value === null || value === undefined)
|
|
13
|
+
continue;
|
|
14
|
+
const text = String(value).trim();
|
|
15
|
+
if (text)
|
|
16
|
+
return text;
|
|
17
|
+
}
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
function coerceNumber(value) {
|
|
21
|
+
if (value === null || value === undefined || value === "")
|
|
22
|
+
return null;
|
|
23
|
+
const num = Number(value);
|
|
24
|
+
if (!Number.isFinite(num))
|
|
25
|
+
return null;
|
|
26
|
+
return num;
|
|
27
|
+
}
|
|
28
|
+
function firstNumber(...values) {
|
|
29
|
+
for (const value of values) {
|
|
30
|
+
const num = coerceNumber(value);
|
|
31
|
+
if (num !== null)
|
|
32
|
+
return num;
|
|
33
|
+
}
|
|
34
|
+
return null;
|
|
35
|
+
}
|