codex-multi-auth 2.0.2 → 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.
Files changed (121) hide show
  1. package/README.md +17 -5
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +91 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/lib/account-policy.d.ts +22 -0
  6. package/dist/lib/account-policy.d.ts.map +1 -0
  7. package/dist/lib/account-policy.js +159 -0
  8. package/dist/lib/account-policy.js.map +1 -0
  9. package/dist/lib/accounts.d.ts.map +1 -1
  10. package/dist/lib/accounts.js +2 -1
  11. package/dist/lib/accounts.js.map +1 -1
  12. package/dist/lib/budget-guard.d.ts +39 -0
  13. package/dist/lib/budget-guard.d.ts.map +1 -0
  14. package/dist/lib/budget-guard.js +201 -0
  15. package/dist/lib/budget-guard.js.map +1 -0
  16. package/dist/lib/codex-manager/commands/account.d.ts +13 -0
  17. package/dist/lib/codex-manager/commands/account.d.ts.map +1 -0
  18. package/dist/lib/codex-manager/commands/account.js +156 -0
  19. package/dist/lib/codex-manager/commands/account.js.map +1 -0
  20. package/dist/lib/codex-manager/commands/bridge.d.ts +6 -0
  21. package/dist/lib/codex-manager/commands/bridge.d.ts.map +1 -0
  22. package/dist/lib/codex-manager/commands/bridge.js +100 -0
  23. package/dist/lib/codex-manager/commands/bridge.js.map +1 -0
  24. package/dist/lib/codex-manager/commands/budget.d.ts +12 -0
  25. package/dist/lib/codex-manager/commands/budget.d.ts.map +1 -0
  26. package/dist/lib/codex-manager/commands/budget.js +123 -0
  27. package/dist/lib/codex-manager/commands/budget.js.map +1 -0
  28. package/dist/lib/codex-manager/commands/integrations.d.ts +6 -0
  29. package/dist/lib/codex-manager/commands/integrations.d.ts.map +1 -0
  30. package/dist/lib/codex-manager/commands/integrations.js +78 -0
  31. package/dist/lib/codex-manager/commands/integrations.js.map +1 -0
  32. package/dist/lib/codex-manager/commands/models.d.ts +14 -0
  33. package/dist/lib/codex-manager/commands/models.d.ts.map +1 -0
  34. package/dist/lib/codex-manager/commands/models.js +74 -0
  35. package/dist/lib/codex-manager/commands/models.js.map +1 -0
  36. package/dist/lib/codex-manager/commands/monitor.d.ts +22 -0
  37. package/dist/lib/codex-manager/commands/monitor.d.ts.map +1 -0
  38. package/dist/lib/codex-manager/commands/monitor.js +94 -0
  39. package/dist/lib/codex-manager/commands/monitor.js.map +1 -0
  40. package/dist/lib/codex-manager/commands/rotation.d.ts +1 -0
  41. package/dist/lib/codex-manager/commands/rotation.d.ts.map +1 -1
  42. package/dist/lib/codex-manager/commands/rotation.js +293 -10
  43. package/dist/lib/codex-manager/commands/rotation.js.map +1 -1
  44. package/dist/lib/codex-manager/commands/usage.d.ts +13 -0
  45. package/dist/lib/codex-manager/commands/usage.d.ts.map +1 -0
  46. package/dist/lib/codex-manager/commands/usage.js +347 -0
  47. package/dist/lib/codex-manager/commands/usage.js.map +1 -0
  48. package/dist/lib/codex-manager/help.d.ts.map +1 -1
  49. package/dist/lib/codex-manager/help.js +8 -0
  50. package/dist/lib/codex-manager/help.js.map +1 -1
  51. package/dist/lib/codex-manager.d.ts.map +1 -1
  52. package/dist/lib/codex-manager.js +42 -2
  53. package/dist/lib/codex-manager.js.map +1 -1
  54. package/dist/lib/config.d.ts.map +1 -1
  55. package/dist/lib/config.js +2 -22
  56. package/dist/lib/config.js.map +1 -1
  57. package/dist/lib/constants.d.ts +1 -0
  58. package/dist/lib/constants.d.ts.map +1 -1
  59. package/dist/lib/constants.js +1 -0
  60. package/dist/lib/constants.js.map +1 -1
  61. package/dist/lib/env-parsing.d.ts +21 -0
  62. package/dist/lib/env-parsing.d.ts.map +1 -0
  63. package/dist/lib/env-parsing.js +34 -0
  64. package/dist/lib/env-parsing.js.map +1 -0
  65. package/dist/lib/index.d.ts +9 -0
  66. package/dist/lib/index.d.ts.map +1 -1
  67. package/dist/lib/index.js +9 -0
  68. package/dist/lib/index.js.map +1 -1
  69. package/dist/lib/integration-generators.d.ts +14 -0
  70. package/dist/lib/integration-generators.d.ts.map +1 -0
  71. package/dist/lib/integration-generators.js +93 -0
  72. package/dist/lib/integration-generators.js.map +1 -0
  73. package/dist/lib/local-bridge.d.ts +17 -0
  74. package/dist/lib/local-bridge.d.ts.map +1 -0
  75. package/dist/lib/local-bridge.js +249 -0
  76. package/dist/lib/local-bridge.js.map +1 -0
  77. package/dist/lib/local-client-tokens.d.ts +37 -0
  78. package/dist/lib/local-client-tokens.d.ts.map +1 -0
  79. package/dist/lib/local-client-tokens.js +200 -0
  80. package/dist/lib/local-client-tokens.js.map +1 -0
  81. package/dist/lib/model-capability-matrix.d.ts +38 -0
  82. package/dist/lib/model-capability-matrix.d.ts.map +1 -0
  83. package/dist/lib/model-capability-matrix.js +89 -0
  84. package/dist/lib/model-capability-matrix.js.map +1 -0
  85. package/dist/lib/policy/runtime-policy.d.ts +59 -0
  86. package/dist/lib/policy/runtime-policy.d.ts.map +1 -0
  87. package/dist/lib/policy/runtime-policy.js +156 -0
  88. package/dist/lib/policy/runtime-policy.js.map +1 -0
  89. package/dist/lib/proactive-refresh.js +4 -4
  90. package/dist/lib/proactive-refresh.js.map +1 -1
  91. package/dist/lib/refresh-lease.d.ts.map +1 -1
  92. package/dist/lib/refresh-lease.js +1 -10
  93. package/dist/lib/refresh-lease.js.map +1 -1
  94. package/dist/lib/routing-profiles.d.ts +36 -0
  95. package/dist/lib/routing-profiles.d.ts.map +1 -0
  96. package/dist/lib/routing-profiles.js +203 -0
  97. package/dist/lib/routing-profiles.js.map +1 -0
  98. package/dist/lib/runtime-rotation-proxy.d.ts.map +1 -1
  99. package/dist/lib/runtime-rotation-proxy.js +96 -6
  100. package/dist/lib/runtime-rotation-proxy.js.map +1 -1
  101. package/dist/lib/usage/index.d.ts +5 -0
  102. package/dist/lib/usage/index.d.ts.map +1 -0
  103. package/dist/lib/usage/index.js +5 -0
  104. package/dist/lib/usage/index.js.map +1 -0
  105. package/dist/lib/usage/ledger.d.ts +12 -0
  106. package/dist/lib/usage/ledger.d.ts.map +1 -0
  107. package/dist/lib/usage/ledger.js +493 -0
  108. package/dist/lib/usage/ledger.js.map +1 -0
  109. package/dist/lib/usage/pricing.d.ts +11 -0
  110. package/dist/lib/usage/pricing.d.ts.map +1 -0
  111. package/dist/lib/usage/pricing.js +67 -0
  112. package/dist/lib/usage/pricing.js.map +1 -0
  113. package/dist/lib/usage/redaction.d.ts +10 -0
  114. package/dist/lib/usage/redaction.d.ts.map +1 -0
  115. package/dist/lib/usage/redaction.js +129 -0
  116. package/dist/lib/usage/redaction.js.map +1 -0
  117. package/dist/lib/usage/types.d.ts +89 -0
  118. package/dist/lib/usage/types.d.ts.map +1 -0
  119. package/dist/lib/usage/types.js +2 -0
  120. package/dist/lib/usage/types.js.map +1 -0
  121. package/package.json +1 -1
@@ -0,0 +1,493 @@
1
+ import { existsSync, promises as fs } from "node:fs";
2
+ import { basename, join } from "node:path";
3
+ import { getCodexMultiAuthDir } from "../runtime-paths.js";
4
+ import { logWarn } from "../logger.js";
5
+ import { isRecord, sleep } from "../utils.js";
6
+ import { normalizeUsageLedgerRow, usageRowToJsonLine, } from "./redaction.js";
7
+ const USAGE_DIR_NAME = "usage";
8
+ const USAGE_LEDGER_FILE_NAME = "usage-ledger.jsonl";
9
+ const RETRYABLE_FS_CODES = new Set(["EBUSY", "EPERM"]);
10
+ const LOCK_RETRYABLE_FS_CODES = new Set(["EACCES", "EBUSY", "EEXIST", "EPERM"]);
11
+ const LOCK_STALE_MS = 30_000;
12
+ const LOCK_MAX_WAIT_MS = 10_000;
13
+ let appendQueue = Promise.resolve();
14
+ const VALID_SOURCES = new Set([
15
+ "runtime-proxy",
16
+ "plugin-host",
17
+ "local-bridge",
18
+ "cli",
19
+ "unknown",
20
+ ]);
21
+ const VALID_OPERATIONS = new Set([
22
+ "responses",
23
+ "models",
24
+ "auth-refresh",
25
+ "diagnostic",
26
+ "unknown",
27
+ ]);
28
+ const VALID_OUTCOMES = new Set([
29
+ "success",
30
+ "failure",
31
+ "blocked",
32
+ "cancelled",
33
+ ]);
34
+ function isRetryableFsError(error) {
35
+ const code = error?.code;
36
+ return typeof code === "string" && RETRYABLE_FS_CODES.has(code);
37
+ }
38
+ function isRetryableLockError(error) {
39
+ const code = error?.code;
40
+ return typeof code === "string" && LOCK_RETRYABLE_FS_CODES.has(code);
41
+ }
42
+ function isMissingFileError(error) {
43
+ return error?.code === "ENOENT";
44
+ }
45
+ function normalizeTimestamp(value) {
46
+ if (value === undefined)
47
+ return null;
48
+ if (value instanceof Date) {
49
+ const time = value.getTime();
50
+ return Number.isFinite(time) ? time : null;
51
+ }
52
+ if (typeof value === "number") {
53
+ return Number.isFinite(value) ? value : null;
54
+ }
55
+ const parsed = Date.parse(value);
56
+ return Number.isFinite(parsed) ? parsed : null;
57
+ }
58
+ async function unlinkWithRetry(path) {
59
+ let lastError;
60
+ for (let attempt = 0; attempt < 5; attempt += 1) {
61
+ try {
62
+ await fs.unlink(path);
63
+ return;
64
+ }
65
+ catch (error) {
66
+ if (isMissingFileError(error))
67
+ return;
68
+ lastError = error;
69
+ if (!isRetryableFsError(error) || attempt >= 4) {
70
+ throw error;
71
+ }
72
+ await sleep(10 * 2 ** attempt);
73
+ }
74
+ }
75
+ throw lastError instanceof Error
76
+ ? lastError
77
+ : new Error("usage ledger lock cleanup retry exhausted");
78
+ }
79
+ async function removeStaleLockIfNeeded(lockPath) {
80
+ try {
81
+ const stat = await fs.stat(lockPath);
82
+ if (Date.now() - stat.mtimeMs < LOCK_STALE_MS) {
83
+ return false;
84
+ }
85
+ await unlinkWithRetry(lockPath);
86
+ return true;
87
+ }
88
+ catch (error) {
89
+ if (isMissingFileError(error))
90
+ return true;
91
+ throw error;
92
+ }
93
+ }
94
+ async function closeLockHandleWithRetry(handle) {
95
+ let lastError;
96
+ for (let attempt = 0; attempt < 5; attempt += 1) {
97
+ try {
98
+ await handle.close();
99
+ return;
100
+ }
101
+ catch (error) {
102
+ lastError = error;
103
+ if (!isRetryableLockError(error))
104
+ throw error;
105
+ await sleep(Math.min(250, 10 * 2 ** attempt));
106
+ }
107
+ }
108
+ throw lastError instanceof Error
109
+ ? lastError
110
+ : new Error("usage ledger lock handle close retry exhausted");
111
+ }
112
+ async function acquireAppendLock(lockPath) {
113
+ const started = Date.now();
114
+ let attempt = 0;
115
+ while (true) {
116
+ let handle = null;
117
+ try {
118
+ handle = await fs.open(lockPath, "wx", 0o600);
119
+ await handle.writeFile(JSON.stringify({ pid: process.pid, createdAt: Date.now() }) + "\n", "utf8");
120
+ const lockHandle = handle;
121
+ let released = false;
122
+ return async () => {
123
+ if (released)
124
+ return;
125
+ released = true;
126
+ let closeError;
127
+ try {
128
+ await closeLockHandleWithRetry(lockHandle);
129
+ }
130
+ catch (error) {
131
+ closeError = error;
132
+ }
133
+ await unlinkWithRetry(lockPath);
134
+ if (closeError)
135
+ throw closeError;
136
+ };
137
+ }
138
+ catch (error) {
139
+ if (handle) {
140
+ try {
141
+ await closeLockHandleWithRetry(handle);
142
+ }
143
+ catch {
144
+ // Best-effort cleanup after a failed lock metadata write.
145
+ }
146
+ await unlinkWithRetry(lockPath);
147
+ }
148
+ if (!isRetryableLockError(error)) {
149
+ throw error;
150
+ }
151
+ await removeStaleLockIfNeeded(lockPath);
152
+ if (Date.now() - started >= LOCK_MAX_WAIT_MS) {
153
+ throw new Error(`Timed out waiting for usage ledger lock: ${lockPath}`);
154
+ }
155
+ await sleep(Math.min(250, 10 * 2 ** Math.min(attempt, 5)));
156
+ attempt += 1;
157
+ }
158
+ }
159
+ }
160
+ async function appendFileWithRetry(path, line) {
161
+ const release = await acquireAppendLock(`${path}.lock`);
162
+ let lastError;
163
+ try {
164
+ for (let attempt = 0; attempt < 5; attempt += 1) {
165
+ try {
166
+ await fs.appendFile(path, line, { encoding: "utf8", mode: 0o600 });
167
+ return;
168
+ }
169
+ catch (error) {
170
+ lastError = error;
171
+ if (!isRetryableFsError(error) || attempt >= 4) {
172
+ throw error;
173
+ }
174
+ await sleep(10 * 2 ** attempt);
175
+ }
176
+ }
177
+ throw lastError instanceof Error
178
+ ? lastError
179
+ : new Error("usage ledger append retry exhausted");
180
+ }
181
+ finally {
182
+ await release();
183
+ }
184
+ }
185
+ async function runWithAppendQueue(task) {
186
+ const queued = appendQueue.catch(() => undefined).then(task);
187
+ appendQueue = queued.then(() => undefined, () => undefined);
188
+ return queued;
189
+ }
190
+ async function readFileWithRetry(path) {
191
+ let lastError;
192
+ for (let attempt = 0; attempt < 5; attempt += 1) {
193
+ try {
194
+ return await fs.readFile(path, "utf8");
195
+ }
196
+ catch (error) {
197
+ lastError = error;
198
+ if (!isRetryableFsError(error) || attempt >= 4) {
199
+ throw error;
200
+ }
201
+ await sleep(10 * 2 ** attempt);
202
+ }
203
+ }
204
+ throw lastError instanceof Error
205
+ ? lastError
206
+ : new Error("usage ledger read retry exhausted");
207
+ }
208
+ async function renameWithRetry(from, to) {
209
+ let lastError;
210
+ for (let attempt = 0; attempt < 5; attempt += 1) {
211
+ try {
212
+ await fs.rename(from, to);
213
+ return;
214
+ }
215
+ catch (error) {
216
+ lastError = error;
217
+ if (!isRetryableFsError(error) || attempt >= 4) {
218
+ throw error;
219
+ }
220
+ await sleep(10 * 2 ** attempt);
221
+ }
222
+ }
223
+ throw lastError instanceof Error
224
+ ? lastError
225
+ : new Error("usage ledger rotate retry exhausted");
226
+ }
227
+ export function getUsageLedgerPaths() {
228
+ const dir = join(getCodexMultiAuthDir(), USAGE_DIR_NAME);
229
+ return {
230
+ dir,
231
+ current: join(dir, USAGE_LEDGER_FILE_NAME),
232
+ };
233
+ }
234
+ export async function appendUsageLedgerRow(input) {
235
+ const row = normalizeUsageLedgerRow(input);
236
+ const { dir, current } = getUsageLedgerPaths();
237
+ const line = usageRowToJsonLine(row);
238
+ await runWithAppendQueue(async () => {
239
+ await fs.mkdir(dir, { recursive: true, mode: 0o700 });
240
+ await appendFileWithRetry(current, line);
241
+ });
242
+ return row;
243
+ }
244
+ function normalizeParsedUsageRow(value) {
245
+ if (!isRecord(value))
246
+ return null;
247
+ if (value.version !== 1)
248
+ return null;
249
+ if (typeof value.id !== "string" || value.id.trim().length === 0)
250
+ return null;
251
+ if (typeof value.createdAt !== "number" || !Number.isFinite(value.createdAt)) {
252
+ return null;
253
+ }
254
+ if (!isRecord(value.tokens))
255
+ return null;
256
+ const source = typeof value.source === "string" &&
257
+ VALID_SOURCES.has(value.source)
258
+ ? value.source
259
+ : "unknown";
260
+ const operation = typeof value.operation === "string" &&
261
+ VALID_OPERATIONS.has(value.operation)
262
+ ? value.operation
263
+ : "unknown";
264
+ const outcome = typeof value.outcome === "string" &&
265
+ VALID_OUTCOMES.has(value.outcome)
266
+ ? value.outcome
267
+ : "failure";
268
+ const tokens = {
269
+ inputTokens: typeof value.tokens.inputTokens === "number" &&
270
+ Number.isFinite(value.tokens.inputTokens)
271
+ ? Math.max(0, Math.trunc(value.tokens.inputTokens))
272
+ : 0,
273
+ outputTokens: typeof value.tokens.outputTokens === "number" &&
274
+ Number.isFinite(value.tokens.outputTokens)
275
+ ? Math.max(0, Math.trunc(value.tokens.outputTokens))
276
+ : 0,
277
+ cachedInputTokens: typeof value.tokens.cachedInputTokens === "number" &&
278
+ Number.isFinite(value.tokens.cachedInputTokens)
279
+ ? Math.max(0, Math.trunc(value.tokens.cachedInputTokens))
280
+ : 0,
281
+ reasoningTokens: typeof value.tokens.reasoningTokens === "number" &&
282
+ Number.isFinite(value.tokens.reasoningTokens)
283
+ ? Math.max(0, Math.trunc(value.tokens.reasoningTokens))
284
+ : 0,
285
+ totalTokens: typeof value.tokens.totalTokens === "number" &&
286
+ Number.isFinite(value.tokens.totalTokens)
287
+ ? Math.max(0, Math.trunc(value.tokens.totalTokens))
288
+ : 0,
289
+ };
290
+ const account = isRecord(value.account)
291
+ ? {
292
+ accountHash: typeof value.account.accountHash === "string" &&
293
+ value.account.accountHash.startsWith("sha256:")
294
+ ? value.account.accountHash
295
+ : undefined,
296
+ emailHash: typeof value.account.emailHash === "string" &&
297
+ value.account.emailHash.startsWith("sha256:")
298
+ ? value.account.emailHash
299
+ : undefined,
300
+ index: typeof value.account.index === "number" &&
301
+ Number.isInteger(value.account.index) &&
302
+ value.account.index >= 0
303
+ ? value.account.index
304
+ : undefined,
305
+ }
306
+ : null;
307
+ const normalizedAccount = account?.accountHash || account?.emailHash || account?.index !== undefined
308
+ ? account
309
+ : null;
310
+ return {
311
+ version: 1,
312
+ id: value.id,
313
+ createdAt: value.createdAt,
314
+ source,
315
+ operation,
316
+ outcome,
317
+ model: typeof value.model === "string" ? value.model : null,
318
+ projectKey: typeof value.projectKey === "string" ? value.projectKey : null,
319
+ account: normalizedAccount,
320
+ requestId: typeof value.requestId === "string" ? value.requestId : null,
321
+ statusCode: typeof value.statusCode === "number" &&
322
+ Number.isInteger(value.statusCode) &&
323
+ value.statusCode >= 100 &&
324
+ value.statusCode <= 599
325
+ ? value.statusCode
326
+ : null,
327
+ errorCode: typeof value.errorCode === "string" ? value.errorCode : null,
328
+ durationMs: typeof value.durationMs === "number" && Number.isFinite(value.durationMs)
329
+ ? Math.max(0, Math.trunc(value.durationMs))
330
+ : null,
331
+ tokens,
332
+ costUsd: typeof value.costUsd === "number" && Number.isFinite(value.costUsd)
333
+ ? Math.max(0, value.costUsd)
334
+ : null,
335
+ };
336
+ }
337
+ function parseJsonlRows(content, label) {
338
+ const rows = [];
339
+ for (const [index, line] of content.split(/\r?\n/).entries()) {
340
+ const trimmed = line.trim();
341
+ if (!trimmed)
342
+ continue;
343
+ try {
344
+ const parsed = JSON.parse(trimmed);
345
+ const row = normalizeParsedUsageRow(parsed);
346
+ if (row) {
347
+ rows.push(row);
348
+ }
349
+ }
350
+ catch (error) {
351
+ logWarn(`Skipped malformed usage ledger row in ${label}:${index + 1}: ${error instanceof Error ? error.message : String(error)}`);
352
+ }
353
+ }
354
+ return rows;
355
+ }
356
+ async function listLedgerFiles(includeArchives) {
357
+ const { dir, current } = getUsageLedgerPaths();
358
+ if (!includeArchives) {
359
+ return existsSync(current) ? [current] : [];
360
+ }
361
+ if (!existsSync(dir)) {
362
+ return [];
363
+ }
364
+ const entries = await fs.readdir(dir);
365
+ return entries
366
+ .filter((entry) => /^usage-ledger(?:\.\d{8}T\d{6}\d{3}Z)?\.jsonl$/.test(entry))
367
+ .sort()
368
+ .map((entry) => join(dir, entry));
369
+ }
370
+ function filterRows(rows, query) {
371
+ const since = normalizeTimestamp(query.since);
372
+ const until = normalizeTimestamp(query.until);
373
+ return rows.filter((row) => {
374
+ if (since !== null && row.createdAt < since)
375
+ return false;
376
+ if (until !== null && row.createdAt > until)
377
+ return false;
378
+ return true;
379
+ });
380
+ }
381
+ export async function readUsageLedgerRows(query = {}) {
382
+ const rows = [];
383
+ for (const file of await listLedgerFiles(query.includeArchives === true)) {
384
+ try {
385
+ rows.push(...parseJsonlRows(await readFileWithRetry(file), basename(file)));
386
+ }
387
+ catch (error) {
388
+ logWarn(`Failed to read usage ledger ${basename(file)}: ${error instanceof Error ? error.message : String(error)}`);
389
+ }
390
+ }
391
+ return filterRows(rows, query).sort((a, b) => a.createdAt - b.createdAt);
392
+ }
393
+ function createBucket(key) {
394
+ return {
395
+ key,
396
+ requests: 0,
397
+ successes: 0,
398
+ failures: 0,
399
+ blocked: 0,
400
+ cancelled: 0,
401
+ inputTokens: 0,
402
+ outputTokens: 0,
403
+ cachedInputTokens: 0,
404
+ reasoningTokens: 0,
405
+ totalTokens: 0,
406
+ costUsd: 0,
407
+ };
408
+ }
409
+ function getBucketKey(row, by) {
410
+ switch (by) {
411
+ case "account":
412
+ return row.account?.accountHash ?? row.account?.emailHash ?? "unknown";
413
+ case "project":
414
+ return row.projectKey ?? "global";
415
+ case "outcome":
416
+ return row.outcome;
417
+ case "day":
418
+ return new Date(row.createdAt).toISOString().slice(0, 10);
419
+ case "model":
420
+ return row.model ?? "unknown";
421
+ }
422
+ }
423
+ function addRowToBucket(bucket, row) {
424
+ bucket.requests += 1;
425
+ if (row.outcome === "success")
426
+ bucket.successes += 1;
427
+ if (row.outcome === "failure")
428
+ bucket.failures += 1;
429
+ if (row.outcome === "blocked")
430
+ bucket.blocked += 1;
431
+ if (row.outcome === "cancelled")
432
+ bucket.cancelled += 1;
433
+ bucket.inputTokens += row.tokens.inputTokens;
434
+ bucket.outputTokens += row.tokens.outputTokens;
435
+ bucket.cachedInputTokens += row.tokens.cachedInputTokens;
436
+ bucket.reasoningTokens += row.tokens.reasoningTokens;
437
+ bucket.totalTokens += row.tokens.totalTokens;
438
+ bucket.costUsd = Number((bucket.costUsd + (row.costUsd ?? 0)).toFixed(8));
439
+ }
440
+ export function summarizeUsageRows(rows, query = {}) {
441
+ const by = query.by ?? "model";
442
+ const filteredRows = filterRows(rows, query).sort((a, b) => a.createdAt - b.createdAt);
443
+ const totals = createBucket("total");
444
+ const buckets = new Map();
445
+ for (const row of filteredRows) {
446
+ addRowToBucket(totals, row);
447
+ const key = getBucketKey(row, by);
448
+ const bucket = buckets.get(key) ?? createBucket(key);
449
+ addRowToBucket(bucket, row);
450
+ buckets.set(key, bucket);
451
+ }
452
+ return {
453
+ since: normalizeTimestamp(query.since),
454
+ until: normalizeTimestamp(query.until),
455
+ by,
456
+ totals,
457
+ buckets: [...buckets.values()].sort((a, b) => a.key.localeCompare(b.key)),
458
+ };
459
+ }
460
+ export async function summarizeUsageLedger(query = {}) {
461
+ return summarizeUsageRows(await readUsageLedgerRows(query), query);
462
+ }
463
+ export async function rotateUsageLedger(options = {}) {
464
+ const { dir, current } = getUsageLedgerPaths();
465
+ return runWithAppendQueue(async () => {
466
+ await fs.mkdir(dir, { recursive: true, mode: 0o700 });
467
+ const release = await acquireAppendLock(`${current}.lock`);
468
+ try {
469
+ if (!existsSync(current)) {
470
+ return null;
471
+ }
472
+ const stat = await fs.stat(current);
473
+ if (typeof options.ifLargerThanBytes === "number" &&
474
+ stat.size <= options.ifLargerThanBytes) {
475
+ return null;
476
+ }
477
+ const stamp = new Date(options.now ?? Date.now())
478
+ .toISOString()
479
+ .replace(/[-:]/g, "")
480
+ .replace(".", "");
481
+ const rotated = join(dir, `usage-ledger.${stamp}.jsonl`);
482
+ await renameWithRetry(current, rotated);
483
+ return rotated;
484
+ }
485
+ finally {
486
+ await release();
487
+ }
488
+ });
489
+ }
490
+ export function resetUsageLedgerQueueForTests() {
491
+ appendQueue = Promise.resolve();
492
+ }
493
+ //# sourceMappingURL=ledger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger.js","sourceRoot":"","sources":["../../../lib/usage/ledger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { UsageTokenCounts } from "./types.js";
2
+ export interface UsageModelPricing {
3
+ inputUsdPerMillion: number;
4
+ outputUsdPerMillion: number;
5
+ cachedInputUsdPerMillion?: number;
6
+ reasoningUsdPerMillion?: number;
7
+ }
8
+ export declare function getUsageModelPricing(model: string | null | undefined): UsageModelPricing | null;
9
+ export declare function estimateUsageCostUsd(model: string | null | undefined, tokens: UsageTokenCounts): number | null;
10
+ export declare function listUsageModelPricing(): Record<string, UsageModelPricing>;
11
+ //# sourceMappingURL=pricing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../../lib/usage/pricing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,WAAW,iBAAiB;IACjC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,sBAAsB,CAAC,EAAE,MAAM,CAAC;CAChC;AA8CD,wBAAgB,oBAAoB,CACnC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC9B,iBAAiB,GAAG,IAAI,CAM1B;AAED,wBAAgB,oBAAoB,CACnC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAChC,MAAM,EAAE,gBAAgB,GACtB,MAAM,GAAG,IAAI,CAqBf;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAEzE"}
@@ -0,0 +1,67 @@
1
+ const MODEL_PRICING = {
2
+ "gpt-5-codex": {
3
+ inputUsdPerMillion: 1.25,
4
+ outputUsdPerMillion: 10,
5
+ cachedInputUsdPerMillion: 0.125,
6
+ reasoningUsdPerMillion: 10,
7
+ },
8
+ "gpt-5.1-codex": {
9
+ inputUsdPerMillion: 1.25,
10
+ outputUsdPerMillion: 10,
11
+ cachedInputUsdPerMillion: 0.125,
12
+ reasoningUsdPerMillion: 10,
13
+ },
14
+ "gpt-5.2": {
15
+ inputUsdPerMillion: 1.25,
16
+ outputUsdPerMillion: 10,
17
+ cachedInputUsdPerMillion: 0.125,
18
+ reasoningUsdPerMillion: 10,
19
+ },
20
+ "gpt-5.3-codex": {
21
+ inputUsdPerMillion: 1.25,
22
+ outputUsdPerMillion: 10,
23
+ cachedInputUsdPerMillion: 0.125,
24
+ reasoningUsdPerMillion: 10,
25
+ },
26
+ "gpt-5.4": {
27
+ inputUsdPerMillion: 2,
28
+ outputUsdPerMillion: 12,
29
+ cachedInputUsdPerMillion: 0.2,
30
+ reasoningUsdPerMillion: 12,
31
+ },
32
+ "gpt-5.5": {
33
+ inputUsdPerMillion: 2,
34
+ outputUsdPerMillion: 12,
35
+ cachedInputUsdPerMillion: 0.2,
36
+ reasoningUsdPerMillion: 12,
37
+ },
38
+ };
39
+ function normalizeModelName(model) {
40
+ const trimmed = model?.trim().toLowerCase();
41
+ return trimmed && trimmed.length > 0 ? trimmed : null;
42
+ }
43
+ export function getUsageModelPricing(model) {
44
+ const normalized = normalizeModelName(model);
45
+ if (!normalized) {
46
+ return null;
47
+ }
48
+ return MODEL_PRICING[normalized] ?? null;
49
+ }
50
+ export function estimateUsageCostUsd(model, tokens) {
51
+ const pricing = getUsageModelPricing(model);
52
+ if (!pricing) {
53
+ return null;
54
+ }
55
+ const billableInputTokens = Math.max(0, tokens.inputTokens - tokens.cachedInputTokens);
56
+ const input = (billableInputTokens / 1_000_000) * pricing.inputUsdPerMillion;
57
+ const output = (tokens.outputTokens / 1_000_000) * pricing.outputUsdPerMillion;
58
+ const cached = (tokens.cachedInputTokens / 1_000_000) *
59
+ (pricing.cachedInputUsdPerMillion ?? pricing.inputUsdPerMillion);
60
+ const reasoning = (tokens.reasoningTokens / 1_000_000) *
61
+ (pricing.reasoningUsdPerMillion ?? pricing.outputUsdPerMillion);
62
+ return Number((input + output + cached + reasoning).toFixed(8));
63
+ }
64
+ export function listUsageModelPricing() {
65
+ return structuredClone(MODEL_PRICING);
66
+ }
67
+ //# sourceMappingURL=pricing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing.js","sourceRoot":"","sources":["../../../lib/usage/pricing.ts"],"names":[],"mappings":"AASA,MAAM,aAAa,GAAsC;IACxD,aAAa,EAAE;QACd,kBAAkB,EAAE,IAAI;QACxB,mBAAmB,EAAE,EAAE;QACvB,wBAAwB,EAAE,KAAK;QAC/B,sBAAsB,EAAE,EAAE;KAC1B;IACD,eAAe,EAAE;QAChB,kBAAkB,EAAE,IAAI;QACxB,mBAAmB,EAAE,EAAE;QACvB,wBAAwB,EAAE,KAAK;QAC/B,sBAAsB,EAAE,EAAE;KAC1B;IACD,SAAS,EAAE;QACV,kBAAkB,EAAE,IAAI;QACxB,mBAAmB,EAAE,EAAE;QACvB,wBAAwB,EAAE,KAAK;QAC/B,sBAAsB,EAAE,EAAE;KAC1B;IACD,eAAe,EAAE;QAChB,kBAAkB,EAAE,IAAI;QACxB,mBAAmB,EAAE,EAAE;QACvB,wBAAwB,EAAE,KAAK;QAC/B,sBAAsB,EAAE,EAAE;KAC1B;IACD,SAAS,EAAE;QACV,kBAAkB,EAAE,CAAC;QACrB,mBAAmB,EAAE,EAAE;QACvB,wBAAwB,EAAE,GAAG;QAC7B,sBAAsB,EAAE,EAAE;KAC1B;IACD,SAAS,EAAE;QACV,kBAAkB,EAAE,CAAC;QACrB,mBAAmB,EAAE,EAAE;QACvB,wBAAwB,EAAE,GAAG;QAC7B,sBAAsB,EAAE,EAAE;KAC1B;CACD,CAAC;AAEF,SAAS,kBAAkB,CAAC,KAAgC;IAC3D,MAAM,OAAO,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5C,OAAO,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,oBAAoB,CACnC,KAAgC;IAEhC,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,CAAC,UAAU,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IACb,CAAC;IACD,OAAO,aAAa,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,oBAAoB,CACnC,KAAgC,EAChC,MAAwB;IAExB,MAAM,OAAO,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,CACnC,CAAC,EACD,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,iBAAiB,CAC7C,CAAC;IACF,MAAM,KAAK,GACV,CAAC,mBAAmB,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAChE,MAAM,MAAM,GACX,CAAC,MAAM,CAAC,YAAY,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,mBAAmB,CAAC;IACjE,MAAM,MAAM,GACX,CAAC,MAAM,CAAC,iBAAiB,GAAG,SAAS,CAAC;QACtC,CAAC,OAAO,CAAC,wBAAwB,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAClE,MAAM,SAAS,GACd,CAAC,MAAM,CAAC,eAAe,GAAG,SAAS,CAAC;QACpC,CAAC,OAAO,CAAC,sBAAsB,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACjE,OAAO,MAAM,CAAC,CAAC,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,qBAAqB;IACpC,OAAO,eAAe,CAAC,aAAa,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { UsageLedgerAccountRef, UsageLedgerAppendInput, UsageLedgerRow } from "./types.js";
2
+ export declare function hashUsageIdentifier(value: string): string;
3
+ export declare function createUsageAccountRef(input: {
4
+ accountId?: string | null;
5
+ email?: string | null;
6
+ accountIndex?: number | null;
7
+ }): UsageLedgerAccountRef | null;
8
+ export declare function normalizeUsageLedgerRow(input: UsageLedgerAppendInput): UsageLedgerRow;
9
+ export declare function usageRowToJsonLine(row: UsageLedgerRow): string;
10
+ //# sourceMappingURL=redaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redaction.d.ts","sourceRoot":"","sources":["../../../lib/usage/redaction.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,qBAAqB,EACrB,sBAAsB,EAGtB,cAAc,EAGd,MAAM,YAAY,CAAC;AA0EpB,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC5C,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B,GAAG,qBAAqB,GAAG,IAAI,CAkB/B;AAsBD,wBAAgB,uBAAuB,CACtC,KAAK,EAAE,sBAAsB,GAC3B,cAAc,CA0BhB;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,CAE9D"}