codex-multi-auth 2.0.1 → 2.1.0
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 +22 -8
- package/config/README.md +4 -4
- package/config/codex-legacy.json +571 -571
- package/config/codex-modern.json +258 -258
- package/config/minimal-codex.json +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +91 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/account-policy.d.ts +22 -0
- package/dist/lib/account-policy.d.ts.map +1 -0
- package/dist/lib/account-policy.js +159 -0
- package/dist/lib/account-policy.js.map +1 -0
- package/dist/lib/accounts.d.ts.map +1 -1
- package/dist/lib/accounts.js +2 -1
- package/dist/lib/accounts.js.map +1 -1
- package/dist/lib/auth/device-auth.d.ts +46 -0
- package/dist/lib/auth/device-auth.d.ts.map +1 -0
- package/dist/lib/auth/device-auth.js +325 -0
- package/dist/lib/auth/device-auth.js.map +1 -0
- package/dist/lib/auth/index.d.ts +2 -0
- package/dist/lib/auth/index.d.ts.map +1 -1
- package/dist/lib/auth/index.js +1 -0
- package/dist/lib/auth/index.js.map +1 -1
- package/dist/lib/budget-guard.d.ts +39 -0
- package/dist/lib/budget-guard.d.ts.map +1 -0
- package/dist/lib/budget-guard.js +201 -0
- package/dist/lib/budget-guard.js.map +1 -0
- package/dist/lib/codex-manager/commands/account.d.ts +13 -0
- package/dist/lib/codex-manager/commands/account.d.ts.map +1 -0
- package/dist/lib/codex-manager/commands/account.js +156 -0
- package/dist/lib/codex-manager/commands/account.js.map +1 -0
- package/dist/lib/codex-manager/commands/bridge.d.ts +6 -0
- package/dist/lib/codex-manager/commands/bridge.d.ts.map +1 -0
- package/dist/lib/codex-manager/commands/bridge.js +100 -0
- package/dist/lib/codex-manager/commands/bridge.js.map +1 -0
- package/dist/lib/codex-manager/commands/budget.d.ts +12 -0
- package/dist/lib/codex-manager/commands/budget.d.ts.map +1 -0
- package/dist/lib/codex-manager/commands/budget.js +123 -0
- package/dist/lib/codex-manager/commands/budget.js.map +1 -0
- package/dist/lib/codex-manager/commands/integrations.d.ts +6 -0
- package/dist/lib/codex-manager/commands/integrations.d.ts.map +1 -0
- package/dist/lib/codex-manager/commands/integrations.js +78 -0
- package/dist/lib/codex-manager/commands/integrations.js.map +1 -0
- package/dist/lib/codex-manager/commands/models.d.ts +14 -0
- package/dist/lib/codex-manager/commands/models.d.ts.map +1 -0
- package/dist/lib/codex-manager/commands/models.js +74 -0
- package/dist/lib/codex-manager/commands/models.js.map +1 -0
- package/dist/lib/codex-manager/commands/monitor.d.ts +22 -0
- package/dist/lib/codex-manager/commands/monitor.d.ts.map +1 -0
- package/dist/lib/codex-manager/commands/monitor.js +94 -0
- package/dist/lib/codex-manager/commands/monitor.js.map +1 -0
- package/dist/lib/codex-manager/commands/rotation.d.ts +1 -0
- package/dist/lib/codex-manager/commands/rotation.d.ts.map +1 -1
- package/dist/lib/codex-manager/commands/rotation.js +293 -10
- package/dist/lib/codex-manager/commands/rotation.js.map +1 -1
- package/dist/lib/codex-manager/commands/usage.d.ts +13 -0
- package/dist/lib/codex-manager/commands/usage.d.ts.map +1 -0
- package/dist/lib/codex-manager/commands/usage.js +347 -0
- package/dist/lib/codex-manager/commands/usage.js.map +1 -0
- package/dist/lib/codex-manager/help.d.ts +1 -0
- package/dist/lib/codex-manager/help.d.ts.map +1 -1
- package/dist/lib/codex-manager/help.js +26 -1
- package/dist/lib/codex-manager/help.js.map +1 -1
- package/dist/lib/codex-manager.d.ts.map +1 -1
- package/dist/lib/codex-manager.js +64 -7
- package/dist/lib/codex-manager.js.map +1 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +2 -22
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/constants.d.ts +1 -0
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +1 -0
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/env-parsing.d.ts +21 -0
- package/dist/lib/env-parsing.d.ts.map +1 -0
- package/dist/lib/env-parsing.js +34 -0
- package/dist/lib/env-parsing.js.map +1 -0
- package/dist/lib/index.d.ts +9 -0
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +9 -0
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/integration-generators.d.ts +14 -0
- package/dist/lib/integration-generators.d.ts.map +1 -0
- package/dist/lib/integration-generators.js +93 -0
- package/dist/lib/integration-generators.js.map +1 -0
- package/dist/lib/local-bridge.d.ts +17 -0
- package/dist/lib/local-bridge.d.ts.map +1 -0
- package/dist/lib/local-bridge.js +249 -0
- package/dist/lib/local-bridge.js.map +1 -0
- package/dist/lib/local-client-tokens.d.ts +37 -0
- package/dist/lib/local-client-tokens.d.ts.map +1 -0
- package/dist/lib/local-client-tokens.js +200 -0
- package/dist/lib/local-client-tokens.js.map +1 -0
- package/dist/lib/model-capability-matrix.d.ts +38 -0
- package/dist/lib/model-capability-matrix.d.ts.map +1 -0
- package/dist/lib/model-capability-matrix.js +89 -0
- package/dist/lib/model-capability-matrix.js.map +1 -0
- package/dist/lib/policy/runtime-policy.d.ts +59 -0
- package/dist/lib/policy/runtime-policy.d.ts.map +1 -0
- package/dist/lib/policy/runtime-policy.js +156 -0
- package/dist/lib/policy/runtime-policy.js.map +1 -0
- package/dist/lib/proactive-refresh.js +4 -4
- package/dist/lib/proactive-refresh.js.map +1 -1
- package/dist/lib/refresh-lease.d.ts.map +1 -1
- package/dist/lib/refresh-lease.js +1 -10
- package/dist/lib/refresh-lease.js.map +1 -1
- package/dist/lib/routing-profiles.d.ts +36 -0
- package/dist/lib/routing-profiles.d.ts.map +1 -0
- package/dist/lib/routing-profiles.js +203 -0
- package/dist/lib/routing-profiles.js.map +1 -0
- package/dist/lib/runtime-rotation-proxy.d.ts.map +1 -1
- package/dist/lib/runtime-rotation-proxy.js +96 -6
- package/dist/lib/runtime-rotation-proxy.js.map +1 -1
- package/dist/lib/schemas.d.ts +3 -0
- package/dist/lib/schemas.d.ts.map +1 -1
- package/dist/lib/schemas.js +1 -0
- package/dist/lib/schemas.js.map +1 -1
- package/dist/lib/usage/index.d.ts +5 -0
- package/dist/lib/usage/index.d.ts.map +1 -0
- package/dist/lib/usage/index.js +5 -0
- package/dist/lib/usage/index.js.map +1 -0
- package/dist/lib/usage/ledger.d.ts +12 -0
- package/dist/lib/usage/ledger.d.ts.map +1 -0
- package/dist/lib/usage/ledger.js +493 -0
- package/dist/lib/usage/ledger.js.map +1 -0
- package/dist/lib/usage/pricing.d.ts +11 -0
- package/dist/lib/usage/pricing.d.ts.map +1 -0
- package/dist/lib/usage/pricing.js +67 -0
- package/dist/lib/usage/pricing.js.map +1 -0
- package/dist/lib/usage/redaction.d.ts +10 -0
- package/dist/lib/usage/redaction.d.ts.map +1 -0
- package/dist/lib/usage/redaction.js +129 -0
- package/dist/lib/usage/redaction.js.map +1 -0
- package/dist/lib/usage/types.d.ts +89 -0
- package/dist/lib/usage/types.d.ts.map +1 -0
- package/dist/lib/usage/types.js +2 -0
- package/dist/lib/usage/types.js.map +1 -0
- package/package.json +1 -1
- package/scripts/bench-format/codex-host.mjs +142 -142
- package/scripts/bench-format/models.mjs +23 -23
- package/scripts/benchmark-edit-formats.mjs +9 -9
- package/scripts/codex-app-router.js +121 -121
- package/scripts/codex.js +165 -165
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import { dirname, resolve } from "node:path";
|
|
3
|
+
import { sleep } from "../../utils.js";
|
|
4
|
+
import { readUsageLedgerRows, rotateUsageLedger, summarizeUsageRows, summarizeUsageLedger, } from "../../usage/index.js";
|
|
5
|
+
const VALID_GROUPS = new Set([
|
|
6
|
+
"model",
|
|
7
|
+
"account",
|
|
8
|
+
"project",
|
|
9
|
+
"outcome",
|
|
10
|
+
"day",
|
|
11
|
+
]);
|
|
12
|
+
const RETRYABLE_WRITE_CODES = new Set(["EBUSY", "EPERM"]);
|
|
13
|
+
function parsePositiveInteger(rawValue) {
|
|
14
|
+
if (!/^\d+$/.test(rawValue.trim()))
|
|
15
|
+
return null;
|
|
16
|
+
const parsed = Number.parseInt(rawValue, 10);
|
|
17
|
+
return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : null;
|
|
18
|
+
}
|
|
19
|
+
function parseSinceValue(value) {
|
|
20
|
+
const trimmed = value.trim();
|
|
21
|
+
const relative = /^(\d+)(m|h|d|w)$/i.exec(trimmed);
|
|
22
|
+
if (relative?.[1] && relative[2]) {
|
|
23
|
+
const amount = Number.parseInt(relative[1], 10);
|
|
24
|
+
const unit = relative[2].toLowerCase();
|
|
25
|
+
const multiplier = unit === "m"
|
|
26
|
+
? 60_000
|
|
27
|
+
: unit === "h"
|
|
28
|
+
? 3_600_000
|
|
29
|
+
: unit === "d"
|
|
30
|
+
? 86_400_000
|
|
31
|
+
: 604_800_000;
|
|
32
|
+
return Date.now() - amount * multiplier;
|
|
33
|
+
}
|
|
34
|
+
if (/^\d+$/.test(trimmed)) {
|
|
35
|
+
return Number.parseInt(trimmed, 10);
|
|
36
|
+
}
|
|
37
|
+
return trimmed;
|
|
38
|
+
}
|
|
39
|
+
function printUsageCommandHelp(logInfo) {
|
|
40
|
+
logInfo([
|
|
41
|
+
"Usage:",
|
|
42
|
+
" codex auth usage [--since <time|duration>] [--by <model|account|project|outcome|day>] [--json|--csv] [--out <path>]",
|
|
43
|
+
" codex auth usage rotate [--if-larger-than-bytes <bytes>] [--json]",
|
|
44
|
+
"",
|
|
45
|
+
"Options:",
|
|
46
|
+
" --since Filter rows by timestamp, ISO date, or relative duration like 24h, 7d, 2w",
|
|
47
|
+
" --by Group summary output (default: model)",
|
|
48
|
+
" --json, -j Print machine-readable JSON output",
|
|
49
|
+
" --csv Print or write CSV bucket output",
|
|
50
|
+
" --out Write output to a file path",
|
|
51
|
+
"",
|
|
52
|
+
"Notes:",
|
|
53
|
+
" - Usage rows contain local metadata only, not prompts, tokens, auth headers, raw emails, or raw account ids.",
|
|
54
|
+
].join("\n"));
|
|
55
|
+
}
|
|
56
|
+
function parseUsageArgs(args) {
|
|
57
|
+
const options = {
|
|
58
|
+
by: "model",
|
|
59
|
+
json: false,
|
|
60
|
+
csv: false,
|
|
61
|
+
};
|
|
62
|
+
for (let i = 0; i < args.length; i += 1) {
|
|
63
|
+
const arg = args[i];
|
|
64
|
+
if (!arg)
|
|
65
|
+
continue;
|
|
66
|
+
if (arg === "--json" || arg === "-j") {
|
|
67
|
+
options.json = true;
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
if (arg === "--csv") {
|
|
71
|
+
options.csv = true;
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (arg === "--since") {
|
|
75
|
+
const value = args[i + 1];
|
|
76
|
+
if (!value)
|
|
77
|
+
return { ok: false, message: "Missing value for --since" };
|
|
78
|
+
options.since = parseSinceValue(value);
|
|
79
|
+
i += 1;
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (arg.startsWith("--since=")) {
|
|
83
|
+
const value = arg.slice("--since=".length).trim();
|
|
84
|
+
if (!value)
|
|
85
|
+
return { ok: false, message: "Missing value for --since" };
|
|
86
|
+
options.since = parseSinceValue(value);
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
if (arg === "--by") {
|
|
90
|
+
const value = args[i + 1];
|
|
91
|
+
if (!value)
|
|
92
|
+
return { ok: false, message: "Missing value for --by" };
|
|
93
|
+
if (!VALID_GROUPS.has(value)) {
|
|
94
|
+
return { ok: false, message: `Unknown --by value: ${value}` };
|
|
95
|
+
}
|
|
96
|
+
options.by = value;
|
|
97
|
+
i += 1;
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (arg.startsWith("--by=")) {
|
|
101
|
+
const value = arg.slice("--by=".length).trim();
|
|
102
|
+
if (!VALID_GROUPS.has(value)) {
|
|
103
|
+
return { ok: false, message: `Unknown --by value: ${value}` };
|
|
104
|
+
}
|
|
105
|
+
options.by = value;
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (arg === "--out") {
|
|
109
|
+
const value = args[i + 1];
|
|
110
|
+
if (!value)
|
|
111
|
+
return { ok: false, message: "Missing value for --out" };
|
|
112
|
+
options.outPath = value;
|
|
113
|
+
i += 1;
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
if (arg.startsWith("--out=")) {
|
|
117
|
+
const value = arg.slice("--out=".length).trim();
|
|
118
|
+
if (!value)
|
|
119
|
+
return { ok: false, message: "Missing value for --out" };
|
|
120
|
+
options.outPath = value;
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
return { ok: false, message: `Unknown usage option: ${arg}` };
|
|
124
|
+
}
|
|
125
|
+
if (options.json && options.csv) {
|
|
126
|
+
return { ok: false, message: "Cannot combine --json and --csv" };
|
|
127
|
+
}
|
|
128
|
+
return { ok: true, options };
|
|
129
|
+
}
|
|
130
|
+
function parseRotateArgs(args) {
|
|
131
|
+
const options = { json: false };
|
|
132
|
+
for (let i = 0; i < args.length; i += 1) {
|
|
133
|
+
const arg = args[i];
|
|
134
|
+
if (!arg)
|
|
135
|
+
continue;
|
|
136
|
+
if (arg === "--json" || arg === "-j") {
|
|
137
|
+
options.json = true;
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
if (arg === "--if-larger-than-bytes") {
|
|
141
|
+
const value = args[i + 1];
|
|
142
|
+
if (!value) {
|
|
143
|
+
return {
|
|
144
|
+
ok: false,
|
|
145
|
+
message: "Missing value for --if-larger-than-bytes",
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
const parsed = parsePositiveInteger(value);
|
|
149
|
+
if (parsed === null) {
|
|
150
|
+
return {
|
|
151
|
+
ok: false,
|
|
152
|
+
message: "--if-larger-than-bytes must be a positive integer",
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
options.ifLargerThanBytes = parsed;
|
|
156
|
+
i += 1;
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
if (arg.startsWith("--if-larger-than-bytes=")) {
|
|
160
|
+
const parsed = parsePositiveInteger(arg.slice("--if-larger-than-bytes=".length));
|
|
161
|
+
if (parsed === null) {
|
|
162
|
+
return {
|
|
163
|
+
ok: false,
|
|
164
|
+
message: "--if-larger-than-bytes must be a positive integer",
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
options.ifLargerThanBytes = parsed;
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
return { ok: false, message: `Unknown usage rotate option: ${arg}` };
|
|
171
|
+
}
|
|
172
|
+
return { ok: true, options };
|
|
173
|
+
}
|
|
174
|
+
function formatCurrency(value) {
|
|
175
|
+
return `$${value.toFixed(6)}`;
|
|
176
|
+
}
|
|
177
|
+
function formatTextSummary(summary) {
|
|
178
|
+
const lines = [
|
|
179
|
+
`Usage summary by ${summary.by}`,
|
|
180
|
+
`Requests: ${summary.totals.requests} (${summary.totals.successes} success, ${summary.totals.failures} failed, ${summary.totals.blocked} blocked, ${summary.totals.cancelled} cancelled)`,
|
|
181
|
+
`Tokens: ${summary.totals.totalTokens} total (${summary.totals.inputTokens} input, ${summary.totals.outputTokens} output, ${summary.totals.cachedInputTokens} cached, ${summary.totals.reasoningTokens} reasoning)`,
|
|
182
|
+
`Estimated cost: ${formatCurrency(summary.totals.costUsd)}`,
|
|
183
|
+
];
|
|
184
|
+
if (summary.buckets.length === 0) {
|
|
185
|
+
lines.push("No usage rows found.");
|
|
186
|
+
return lines.join("\n");
|
|
187
|
+
}
|
|
188
|
+
lines.push("");
|
|
189
|
+
for (const bucket of summary.buckets) {
|
|
190
|
+
lines.push(`${bucket.key}: ${bucket.requests} request(s), ${bucket.totalTokens} token(s), ${formatCurrency(bucket.costUsd)}`);
|
|
191
|
+
}
|
|
192
|
+
return lines.join("\n");
|
|
193
|
+
}
|
|
194
|
+
function csvEscape(value) {
|
|
195
|
+
const text = String(value);
|
|
196
|
+
return /[",\r\n]/.test(text) ? `"${text.replace(/"/g, '""')}"` : text;
|
|
197
|
+
}
|
|
198
|
+
function bucketToCsvRow(bucket) {
|
|
199
|
+
return [
|
|
200
|
+
bucket.key,
|
|
201
|
+
bucket.requests,
|
|
202
|
+
bucket.successes,
|
|
203
|
+
bucket.failures,
|
|
204
|
+
bucket.blocked,
|
|
205
|
+
bucket.cancelled,
|
|
206
|
+
bucket.inputTokens,
|
|
207
|
+
bucket.outputTokens,
|
|
208
|
+
bucket.cachedInputTokens,
|
|
209
|
+
bucket.reasoningTokens,
|
|
210
|
+
bucket.totalTokens,
|
|
211
|
+
bucket.costUsd.toFixed(8),
|
|
212
|
+
]
|
|
213
|
+
.map(csvEscape)
|
|
214
|
+
.join(",");
|
|
215
|
+
}
|
|
216
|
+
function formatCsvSummary(summary) {
|
|
217
|
+
return [
|
|
218
|
+
"key,requests,successes,failures,blocked,cancelled,inputTokens,outputTokens,cachedInputTokens,reasoningTokens,totalTokens,costUsd",
|
|
219
|
+
...summary.buckets.map(bucketToCsvRow),
|
|
220
|
+
...(summary.buckets.length === 0 ? [bucketToCsvRow(summary.totals)] : []),
|
|
221
|
+
].join("\n");
|
|
222
|
+
}
|
|
223
|
+
function rowsToJsonPayload(summary, rows) {
|
|
224
|
+
return JSON.stringify({
|
|
225
|
+
command: "usage",
|
|
226
|
+
summary,
|
|
227
|
+
rows,
|
|
228
|
+
}, null, 2);
|
|
229
|
+
}
|
|
230
|
+
function isRetryableWriteError(error) {
|
|
231
|
+
const code = error?.code;
|
|
232
|
+
return typeof code === "string" && RETRYABLE_WRITE_CODES.has(code);
|
|
233
|
+
}
|
|
234
|
+
async function defaultWriteFile(path, contents) {
|
|
235
|
+
await fs.mkdir(dirname(path), { recursive: true });
|
|
236
|
+
const tempPath = `${path}.${process.pid}.${Date.now()}.${Math.random().toString(36).slice(2, 8)}.tmp`;
|
|
237
|
+
let moved = false;
|
|
238
|
+
try {
|
|
239
|
+
await fs.writeFile(tempPath, contents, "utf-8");
|
|
240
|
+
for (let attempt = 0; attempt < 5; attempt += 1) {
|
|
241
|
+
try {
|
|
242
|
+
await fs.rename(tempPath, path);
|
|
243
|
+
moved = true;
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
catch (error) {
|
|
247
|
+
if (!isRetryableWriteError(error) || attempt >= 4)
|
|
248
|
+
throw error;
|
|
249
|
+
await sleep(10 * 2 ** attempt);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
finally {
|
|
254
|
+
if (!moved) {
|
|
255
|
+
try {
|
|
256
|
+
await fs.unlink(tempPath);
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
// Best-effort temp cleanup.
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
export async function runUsageCommand(args, deps = {}) {
|
|
265
|
+
const logInfo = deps.logInfo ?? console.log;
|
|
266
|
+
const logError = deps.logError ?? console.error;
|
|
267
|
+
if (args.includes("--help") || args.includes("-h")) {
|
|
268
|
+
printUsageCommandHelp(logInfo);
|
|
269
|
+
return 0;
|
|
270
|
+
}
|
|
271
|
+
const [subcommand, ...rest] = args;
|
|
272
|
+
if (subcommand === "rotate") {
|
|
273
|
+
const parsed = parseRotateArgs(rest);
|
|
274
|
+
if (!parsed.ok) {
|
|
275
|
+
logError(parsed.message);
|
|
276
|
+
return 1;
|
|
277
|
+
}
|
|
278
|
+
let rotatedPath;
|
|
279
|
+
try {
|
|
280
|
+
rotatedPath = await (deps.rotateLedger ?? rotateUsageLedger)({
|
|
281
|
+
ifLargerThanBytes: parsed.options.ifLargerThanBytes,
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
catch (error) {
|
|
285
|
+
logError(`Failed to rotate usage ledger: ${error instanceof Error ? error.message : String(error)}`);
|
|
286
|
+
return 1;
|
|
287
|
+
}
|
|
288
|
+
if (parsed.options.json) {
|
|
289
|
+
logInfo(JSON.stringify({
|
|
290
|
+
command: "usage rotate",
|
|
291
|
+
rotated: rotatedPath !== null,
|
|
292
|
+
path: rotatedPath,
|
|
293
|
+
}));
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
logInfo(rotatedPath
|
|
297
|
+
? `Usage ledger rotated: ${rotatedPath}`
|
|
298
|
+
: "Usage ledger rotation skipped.");
|
|
299
|
+
}
|
|
300
|
+
return 0;
|
|
301
|
+
}
|
|
302
|
+
const parsed = parseUsageArgs(args);
|
|
303
|
+
if (!parsed.ok) {
|
|
304
|
+
logError(parsed.message);
|
|
305
|
+
printUsageCommandHelp(logInfo);
|
|
306
|
+
return 1;
|
|
307
|
+
}
|
|
308
|
+
const options = parsed.options;
|
|
309
|
+
const query = { since: options.since, by: options.by };
|
|
310
|
+
let summary;
|
|
311
|
+
let rows = [];
|
|
312
|
+
try {
|
|
313
|
+
if (options.json) {
|
|
314
|
+
rows = await (deps.readRows ?? readUsageLedgerRows)(query);
|
|
315
|
+
summary = (deps.summarizeRows ?? summarizeUsageRows)(rows, query);
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
summary = await (deps.summarizeUsage ?? summarizeUsageLedger)(query);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
catch (error) {
|
|
322
|
+
logError(`Failed to read usage ledger: ${error instanceof Error ? error.message : String(error)}`);
|
|
323
|
+
return 1;
|
|
324
|
+
}
|
|
325
|
+
const rendered = options.json
|
|
326
|
+
? rowsToJsonPayload(summary, rows)
|
|
327
|
+
: options.csv
|
|
328
|
+
? formatCsvSummary(summary)
|
|
329
|
+
: formatTextSummary(summary);
|
|
330
|
+
if (options.outPath) {
|
|
331
|
+
const outputPath = resolve(deps.getCwd?.() ?? process.cwd(), options.outPath);
|
|
332
|
+
try {
|
|
333
|
+
await (deps.writeFile ?? defaultWriteFile)(outputPath, `${rendered}\n`);
|
|
334
|
+
}
|
|
335
|
+
catch (error) {
|
|
336
|
+
logError(`Failed to write usage report: ${error instanceof Error ? error.message : String(error)}`);
|
|
337
|
+
return 1;
|
|
338
|
+
}
|
|
339
|
+
if (!options.json && !options.csv) {
|
|
340
|
+
logInfo(`Usage report written: ${outputPath}`);
|
|
341
|
+
}
|
|
342
|
+
return 0;
|
|
343
|
+
}
|
|
344
|
+
logInfo(rendered);
|
|
345
|
+
return 0;
|
|
346
|
+
}
|
|
347
|
+
//# sourceMappingURL=usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../../../lib/codex-manager/commands/usage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../../lib/codex-manager/help.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,IAAI,IAAI,
|
|
1
|
+
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../../lib/codex-manager/help.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,IAAI,IAAI,CA8CjC;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAC5B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,gBAAgB,CAAA;CAAE,GACvC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,mBAAmB,CAwCtE;AAED,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,MAAM,cAAc,GACvB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,cAAc,CAAA;CAAE,GACrC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnD,wBAAgB,cAAc,IAAI,IAAI,CAgBrC;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,cAAc,CAyD5D"}
|
|
@@ -3,7 +3,7 @@ export function printUsage() {
|
|
|
3
3
|
"Codex Multi-Auth CLI",
|
|
4
4
|
"",
|
|
5
5
|
"Start here:",
|
|
6
|
-
" codex auth login [--manual|--no-browser]",
|
|
6
|
+
" codex auth login [--device-auth|--manual|--no-browser]",
|
|
7
7
|
" codex auth status",
|
|
8
8
|
" codex auth check",
|
|
9
9
|
"",
|
|
@@ -12,6 +12,7 @@ export function printUsage() {
|
|
|
12
12
|
" codex auth switch <index>",
|
|
13
13
|
" codex auth best [--live] [--json] [--model <model>]",
|
|
14
14
|
" codex auth forecast [--live] [--json] [--model <model>]",
|
|
15
|
+
" codex auth account tag|untag|weight|pause|unpause|drain|undrain|note ...",
|
|
15
16
|
"",
|
|
16
17
|
"Repair:",
|
|
17
18
|
" codex auth verify-flagged [--dry-run] [--json] [--no-restore]",
|
|
@@ -20,7 +21,14 @@ export function printUsage() {
|
|
|
20
21
|
" codex auth doctor [--json] [--fix] [--dry-run]",
|
|
21
22
|
"",
|
|
22
23
|
"Diagnostics:",
|
|
24
|
+
" codex auth usage [--since <time|duration>] [--by <group>] [--json|--csv] [--out <path>]",
|
|
25
|
+
" codex auth budget limit|check|list ...",
|
|
26
|
+
" codex auth bridge token create|list|rotate|revoke",
|
|
27
|
+
" codex auth integrations [--kind <name>] [--base-url <url>] [--model <model>] [--json]",
|
|
28
|
+
" codex auth models [--json] [--model <model>]",
|
|
29
|
+
" codex auth monitor [--json]",
|
|
23
30
|
" codex auth rotation <enable|disable|status|bind-app|unbind-app>",
|
|
31
|
+
" codex auth rotation reset-rate-limits [--all | --account <idx>] [--dry-run] [--json]",
|
|
24
32
|
" codex auth why-selected [--now | --last] [--json]",
|
|
25
33
|
"",
|
|
26
34
|
"Advanced:",
|
|
@@ -38,10 +46,19 @@ export function printUsage() {
|
|
|
38
46
|
export function parseAuthLoginArgs(args) {
|
|
39
47
|
const options = {
|
|
40
48
|
manual: false,
|
|
49
|
+
deviceAuth: false,
|
|
41
50
|
};
|
|
51
|
+
const manualFlags = [];
|
|
42
52
|
for (const arg of args) {
|
|
43
53
|
if (arg === "--manual" || arg === "--no-browser") {
|
|
44
54
|
options.manual = true;
|
|
55
|
+
if (!manualFlags.includes(arg)) {
|
|
56
|
+
manualFlags.push(arg);
|
|
57
|
+
}
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
if (arg === "--device-auth") {
|
|
61
|
+
options.deviceAuth = true;
|
|
45
62
|
continue;
|
|
46
63
|
}
|
|
47
64
|
if (arg === "--help" || arg === "-h") {
|
|
@@ -53,6 +70,14 @@ export function parseAuthLoginArgs(args) {
|
|
|
53
70
|
message: `Unknown login option: ${arg}`,
|
|
54
71
|
};
|
|
55
72
|
}
|
|
73
|
+
if (options.deviceAuth && options.manual) {
|
|
74
|
+
const conflict = manualFlags.length > 0 ? manualFlags.join(" or ") : "--manual";
|
|
75
|
+
return {
|
|
76
|
+
ok: false,
|
|
77
|
+
reason: "error",
|
|
78
|
+
message: `Cannot combine --device-auth with ${conflict}`,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
56
81
|
return { ok: true, options };
|
|
57
82
|
}
|
|
58
83
|
export function printBestUsage() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../../lib/codex-manager/help.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU;IACzB,OAAO,CAAC,GAAG,CACV;QACC,sBAAsB;QACtB,EAAE;QACF,aAAa;QACb,
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../../lib/codex-manager/help.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-manager.d.ts","sourceRoot":"","sources":["../../lib/codex-manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"codex-manager.d.ts","sourceRoot":"","sources":["../../lib/codex-manager.ts"],"names":[],"mappings":"AA86CA,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQ3D;AA+vDD,wBAAsB,4BAA4B,IAAI,OAAO,CAAC,OAAO,CAAC,CAuGrE;AAuCD,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAwN7E"}
|
|
@@ -2,14 +2,22 @@ import { stdin as input, stdout as output } from "node:process";
|
|
|
2
2
|
import { createInterface } from "node:readline/promises";
|
|
3
3
|
import { extractAccountEmail, extractAccountId, formatAccountLabel, formatWaitTime, getAccountIdCandidates, resolveRequestAccountId, sanitizeEmail, selectBestAccountCandidate, shouldUpdateAccountIdFromToken, } from "./accounts.js";
|
|
4
4
|
import { createAuthorizationFlow, exchangeAuthorizationCode, parseAuthorizationInput, redactOAuthUrlForLog, REDIRECT_URI, } from "./auth/auth.js";
|
|
5
|
+
import { runDeviceAuthFlow } from "./auth/device-auth.js";
|
|
5
6
|
import { copyTextToClipboard, isBrowserLaunchSuppressed, openBrowserUrl, } from "./auth/browser.js";
|
|
6
7
|
import { startLocalOAuthServer } from "./auth/server.js";
|
|
7
8
|
import { promptAddAnotherAccount, promptLoginMode, } from "./cli.js";
|
|
8
9
|
import { loadCodexCliState } from "./codex-cli/state.js";
|
|
9
10
|
import { setCodexCliActiveSelection } from "./codex-cli/writer.js";
|
|
10
11
|
import { runBestCommand, } from "./codex-manager/commands/best.js";
|
|
12
|
+
import { runAccountCommand } from "./codex-manager/commands/account.js";
|
|
13
|
+
import { runBudgetCommand } from "./codex-manager/commands/budget.js";
|
|
14
|
+
import { runBridgeCommand } from "./codex-manager/commands/bridge.js";
|
|
11
15
|
import { runCheckCommand } from "./codex-manager/commands/check.js";
|
|
16
|
+
import { runIntegrationsCommand } from "./codex-manager/commands/integrations.js";
|
|
17
|
+
import { runModelsCommand } from "./codex-manager/commands/models.js";
|
|
18
|
+
import { runMonitorCommand } from "./codex-manager/commands/monitor.js";
|
|
12
19
|
import { runConfigExplainCommand } from "./codex-manager/commands/config-explain.js";
|
|
20
|
+
import { saveAccountsWithRetry } from "./codex-manager/forecast-report-shared.js";
|
|
13
21
|
import { runDebugBundleCommand } from "./codex-manager/commands/debug-bundle.js";
|
|
14
22
|
import { parseWhySelectedArgs, printWhySelectedUsage, runWhySelectedCommand, } from "./codex-manager/commands/why-selected.js";
|
|
15
23
|
import { parseVerifyArgs, printVerifyUsage, runVerifyCommand, } from "./codex-manager/commands/verify.js";
|
|
@@ -23,6 +31,7 @@ import { runRotationCommand } from "./codex-manager/commands/rotation.js";
|
|
|
23
31
|
import { runFeaturesCommand, runStatusCommand, } from "./codex-manager/commands/status.js";
|
|
24
32
|
import { loadPersistedRuntimeObservabilitySnapshot } from "./runtime/runtime-observability.js";
|
|
25
33
|
import { runSwitchCommand } from "./codex-manager/commands/switch.js";
|
|
34
|
+
import { runUsageCommand } from "./codex-manager/commands/usage.js";
|
|
26
35
|
import { parseAuthLoginArgs, printUsage } from "./codex-manager/help.js";
|
|
27
36
|
import { applyUiThemeFromDashboardSettings, configureUnifiedSettings, resolveMenuLayoutMode, } from "./codex-manager/settings-hub.js";
|
|
28
37
|
import { getCodexRuntimeRotationProxy, getPluginConfigExplainReport, loadPluginConfig, savePluginConfig, } from "./config.js";
|
|
@@ -1435,6 +1444,18 @@ async function runOAuthFlow(forceNewLogin, signInMode) {
|
|
|
1435
1444
|
}
|
|
1436
1445
|
return exchangeAuthorizationCode(code, pkce.verifier, REDIRECT_URI);
|
|
1437
1446
|
}
|
|
1447
|
+
async function runSignInFlow(forceNewLogin, signInMode, options = {}) {
|
|
1448
|
+
if (signInMode === "device") {
|
|
1449
|
+
// OpenAI owns the device-code account picker; there is no force-new-login
|
|
1450
|
+
// equivalent to pass through for this mode.
|
|
1451
|
+
// TODO: Thread a manager-level AbortSignal when login cancellation exists.
|
|
1452
|
+
return runDeviceAuthFlow({
|
|
1453
|
+
log: console.log,
|
|
1454
|
+
timeoutMs: options.timeoutMs,
|
|
1455
|
+
});
|
|
1456
|
+
}
|
|
1457
|
+
return runOAuthFlow(forceNewLogin, signInMode);
|
|
1458
|
+
}
|
|
1438
1459
|
async function persistAccountPool(results, replaceAll) {
|
|
1439
1460
|
if (results.length === 0)
|
|
1440
1461
|
return;
|
|
@@ -1713,7 +1734,7 @@ async function runHealthCheck(options = {}) {
|
|
|
1713
1734
|
await saveQuotaCache(workingQuotaCache);
|
|
1714
1735
|
}
|
|
1715
1736
|
if (changed) {
|
|
1716
|
-
await
|
|
1737
|
+
await saveAccountsWithRetry(storage, saveAccounts);
|
|
1717
1738
|
}
|
|
1718
1739
|
if (activeAccountRefreshed &&
|
|
1719
1740
|
activeIndex >= 0 &&
|
|
@@ -2173,9 +2194,11 @@ async function runAuthLogin(args) {
|
|
|
2173
2194
|
while (true) {
|
|
2174
2195
|
const latestNamedBackup = namedBackups[0] ?? null;
|
|
2175
2196
|
const preferManualMode = loginOptions.manual || isBrowserLaunchSuppressed();
|
|
2176
|
-
const signInMode =
|
|
2177
|
-
? "
|
|
2178
|
-
:
|
|
2197
|
+
const signInMode = loginOptions.deviceAuth
|
|
2198
|
+
? "device"
|
|
2199
|
+
: preferManualMode
|
|
2200
|
+
? "manual"
|
|
2201
|
+
: await promptOAuthSignInMode(latestNamedBackup, onboardingBackupDiscoveryWarning);
|
|
2179
2202
|
if (signInMode === "cancel") {
|
|
2180
2203
|
if (existingCount > 0) {
|
|
2181
2204
|
console.log(stylePromptText(UI_COPY.oauth.cancelledBackToMenu, "muted"));
|
|
@@ -2243,10 +2266,12 @@ async function runAuthLogin(args) {
|
|
|
2243
2266
|
}
|
|
2244
2267
|
continue loginFlow;
|
|
2245
2268
|
}
|
|
2246
|
-
if (signInMode !== "browser" &&
|
|
2269
|
+
if (signInMode !== "browser" &&
|
|
2270
|
+
signInMode !== "manual" &&
|
|
2271
|
+
signInMode !== "device") {
|
|
2247
2272
|
continue;
|
|
2248
2273
|
}
|
|
2249
|
-
const tokenResult = await
|
|
2274
|
+
const tokenResult = await runSignInFlow(forceNewLogin, signInMode);
|
|
2250
2275
|
if (tokenResult.type !== "success") {
|
|
2251
2276
|
if (isOAuthCancellation(tokenResult)) {
|
|
2252
2277
|
if (existingCount > 0) {
|
|
@@ -2345,7 +2370,7 @@ async function persistAndSyncSelectedAccount({ storage, targetIndex, parsed, swi
|
|
|
2345
2370
|
}
|
|
2346
2371
|
account.lastUsed = switchNow;
|
|
2347
2372
|
account.lastSwitchReason = switchReason;
|
|
2348
|
-
await
|
|
2373
|
+
await saveAccountsWithRetry(storage, saveAccounts);
|
|
2349
2374
|
const synced = await setCodexCliActiveSelection({
|
|
2350
2375
|
accountId: account.accountId,
|
|
2351
2376
|
email: account.email,
|
|
@@ -2568,6 +2593,34 @@ export async function runCodexMultiAuthCli(rawArgs) {
|
|
|
2568
2593
|
if (command === "best") {
|
|
2569
2594
|
return runBest(rest);
|
|
2570
2595
|
}
|
|
2596
|
+
if (command === "account") {
|
|
2597
|
+
return runAccountCommand(rest, {
|
|
2598
|
+
setStoragePath,
|
|
2599
|
+
loadAccounts,
|
|
2600
|
+
});
|
|
2601
|
+
}
|
|
2602
|
+
if (command === "budget") {
|
|
2603
|
+
return runBudgetCommand(rest);
|
|
2604
|
+
}
|
|
2605
|
+
if (command === "bridge") {
|
|
2606
|
+
return runBridgeCommand(rest);
|
|
2607
|
+
}
|
|
2608
|
+
if (command === "integrations") {
|
|
2609
|
+
return runIntegrationsCommand(rest);
|
|
2610
|
+
}
|
|
2611
|
+
if (command === "models") {
|
|
2612
|
+
return runModelsCommand(rest, {
|
|
2613
|
+
setStoragePath,
|
|
2614
|
+
loadAccounts,
|
|
2615
|
+
loadQuotaCache,
|
|
2616
|
+
});
|
|
2617
|
+
}
|
|
2618
|
+
if (command === "monitor") {
|
|
2619
|
+
return runMonitorCommand(rest, {
|
|
2620
|
+
setStoragePath,
|
|
2621
|
+
loadAccounts,
|
|
2622
|
+
});
|
|
2623
|
+
}
|
|
2571
2624
|
if (command === "report") {
|
|
2572
2625
|
return runReportCommand(rest, {
|
|
2573
2626
|
setStoragePath,
|
|
@@ -2584,6 +2637,9 @@ export async function runCodexMultiAuthCli(rawArgs) {
|
|
|
2584
2637
|
loadRuntimeObservabilitySnapshot: loadPersistedRuntimeObservabilitySnapshot,
|
|
2585
2638
|
});
|
|
2586
2639
|
}
|
|
2640
|
+
if (command === "usage") {
|
|
2641
|
+
return runUsageCommand(rest);
|
|
2642
|
+
}
|
|
2587
2643
|
if (command === "rotation") {
|
|
2588
2644
|
return runRotationCommand(rest, {
|
|
2589
2645
|
loadPluginConfig,
|
|
@@ -2592,6 +2648,7 @@ export async function runCodexMultiAuthCli(rawArgs) {
|
|
|
2592
2648
|
setStoragePath,
|
|
2593
2649
|
getStoragePath,
|
|
2594
2650
|
loadAccounts,
|
|
2651
|
+
saveAccounts,
|
|
2595
2652
|
resolveActiveIndex,
|
|
2596
2653
|
bindCodexApp: bindCodexAppRuntimeRotation,
|
|
2597
2654
|
unbindCodexApp: unbindCodexAppRuntimeRotation,
|